|
实现功能 :
将已经矢量化的线文件(高程字段名为“高程”,区别断层和等高线的是断层字段,断层字段为0则为等高线,不为0则为断层)
运行程序后 将等高线点以及高程值批量导出
代码如下:- if (IDYES != AfxMessageBox("请确认\n当前操作的线文件中存在1.高程,2.断层属性字段(必须)",MB_YESNO))
- return ;
- long logN,n ;
- _GetLinNum(curlin,&logN,&n) ;
- D_DOT *dat ;
- long len ;
- LIN_INFO inf_lin ;
- CATT_STRU *stru_lin ;
- char *att ;
- char pbuff[100] ;
- CString m_sduanceng ;
- CArray<dem_m,dem_m&> m_cadem ;
- CArray<duanlie_m,duanlie_m&> m_caduanlie ;
- m_cadem.RemoveAll() ;
- dem_m _vdem_m ;
- duanlie_m _vduanlie_m ;
- CString m_sgaocheng ;
- for (long i = 1 ; i <n; i++)
- {
- if (1 !=_GetLin(curlin,i,&dat,&len,&inf_lin))
- continue ;
- _GetLinAtt(curlin,i,&stru_lin,&att) ;
- if (1 != _CvtFldToString1(stru_lin,att,"断层",pbuff,100,NULL,NULL))
- {
- AfxMessageBox("没有断层字段") ;
- m_cadem.RemoveAll() ;
- m_caduanlie.RemoveAll() ;
- return ;
- }
- m_sduanceng = pbuff ;
- //如果断层 = 0 ;则xyz
- if ("0" == m_sduanceng)
- {
- if (1 != _CvtFldToString1(stru_lin,att,"高程",pbuff,100,NULL,NULL))
- {
- AfxMessageBox("没有高程字段") ;
- m_cadem.RemoveAll() ;
- m_caduanlie.RemoveAll() ;
- return ;
- }
- m_sgaocheng = pbuff ;
- for (long i=0; i <len; i++)
- {
- _vdem_m.x = dat[i].x ;
- _vdem_m.y = dat[i].y ;
- _vdem_m.z = atof(m_sgaocheng) ;
- m_cadem.Add(_vdem_m) ;
- }
- }
- else
- {
- //否则 xyzv
- if(1 != _CvtFldToString1(stru_lin,att,"高程",pbuff,100,NULL,NULL))
- {
- AfxMessageBox("没有高程字段") ;
- m_cadem.RemoveAll() ;
- m_caduanlie.RemoveAll() ;
- return ;
- }
- m_sgaocheng = pbuff ;
- for (long i=0; i <len; i++)
- {
- _vduanlie_m.x = dat[i].x ;
- _vduanlie_m.y = dat[i].y ;
- _vduanlie_m.z = atof(m_sgaocheng) ;
- _vduanlie_m.name = m_sduanceng ;
- m_caduanlie.Add(_vduanlie_m) ;
- }
- }
- }
- //获取当前文件操作的路径 将结果写在当前文件路径下
- //命名法则为 XX高程.txt XX断层.txt
- CString m_sroad,m_sflod,m_sfilename ;
- //_PRJGetName()
- short curlinno = _PRJGetCurNo(this->GetDocument()->m_Prj,LIN) ;
- m_sroad = _PRJGetItemName(this->GetDocument()->m_Prj,curlinno) ;
- _PRJGetItemName1(this->GetDocument()->m_Prj,curlinno,m_sfilename.GetBuffer(m_sfilename.GetLength())) ;
- m_sflod = m_sroad.Left(m_sroad.ReverseFind('\\')) ;
- CString m_sgcroad, m_sdcroad ;
- m_sgcroad = m_sflod + "\\高程.txt" ;
- m_sdcroad = m_sflod + "\\断层.txt" ;
- //生成文件
- CStdioFile File ;
- CString m_str ;
- File.Open(m_sgcroad,CFile::modeCreate|CFile::modeWrite) ;
- _StartClockCursor() ;
- for (i = 0 ; i <m_cadem.GetSize(); i++)
- {
- _GoingClockCursor() ;
- m_str.Format("%d,%f,%f,%f\n",i+1,m_cadem.GetAt(i).x,m_cadem.GetAt(i).y,m_cadem.GetAt(i).z) ;
- File.WriteString(m_str) ;
- }
- _EndClockCursor() ;
- File.Close() ;
- File.Open(m_sdcroad,CFile::modeCreate|CFile::modeWrite) ;
- _StartClockCursor() ;
- for (i = 0 ; i <m_caduanlie.GetSize(); i++)
- {
- _GoingClockCursor() ;
- m_str.Format("%ld,%f,%f,%f,%s\n",i+1,m_caduanlie.GetAt(i).x,m_caduanlie.GetAt(i).y,m_caduanlie.GetAt(i).z,m_caduanlie.GetAt(i).name) ;
- File.WriteString(m_str) ;
- }
- _EndClockCursor() ;
- File.Close() ;
- CString res ;
- res.Format("属性导出完成,高程.txt 断层.txt 生成在%s 文件夹下 ",m_sflod) ;
- if (IDYES == AfxMessageBox(res,MB_YESNO))
- {
- ShellExecuteA(this->m_hWnd,"open",m_sflod,NULL, NULL, SW_SHOWNORMAL) ;
- }
复制代码 --------------------------------------------------分割线---------------------------------------------------------------
用过mgt6程序的朋友是不是想起了线折点转换成excel里面的坐标类似的功能,大致原理如上。在此之前我没有研究过mgt6,可能是我用得不多吧,我想按xyz导出的时候还是有点小问题,要是能指定属性导出就好了。我的程序也不见得是很精彩的东西,我发于这里的目的其一:希望大家能有兴趣学习这种数据处理的工具,在现有软件不能解决实际生产中遇到的问题时,可以解决。其二:对于编程,我也是初学者,希望大家能多提意见,尤其是中肯的意见,我将虚心的接纳,继而能写出功能更加实用,更加稳健的程序。其三:我不希望看到帖子需要什么等级限制才可浏览,因为,我觉得这违背了我之前的目的与论坛管理者建立技术经验交流平台的目的。
大家多提意见,是对我发源码的最好支持。谢谢 |
评分
-
查看全部评分
|