CPoint3DCloudDoc.cpp
上传用户:yanweivga
上传日期:2008-02-19
资源大小:1056k
文件大小:11k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // CPoint3DCloudDoc.cpp : implementation of the CCPoint3DCloudDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "CPoint3DCloud.h"
  5. #include "CPoint3DCloudDoc.h"
  6. #include "CPoint3DCloudView.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CCPoint3DCloudDoc
  14. IMPLEMENT_DYNCREATE(CCPoint3DCloudDoc, CDocument)
  15. BEGIN_MESSAGE_MAP(CCPoint3DCloudDoc, CDocument)
  16. //{{AFX_MSG_MAP(CCPoint3DCloudDoc)
  17. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  18. //}}AFX_MSG_MAP
  19. ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail)
  20. ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail)
  21. END_MESSAGE_MAP()
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CCPoint3DCloudDoc construction/destruction
  24. CCPoint3DCloudDoc::CCPoint3DCloudDoc()
  25. {
  26. // TODO: add one-time construction code here
  27. }
  28. CCPoint3DCloudDoc::~CCPoint3DCloudDoc()
  29. {
  30. }
  31. BOOL CCPoint3DCloudDoc::OnNewDocument()
  32. {
  33. if (!CDocument::OnNewDocument())
  34. return FALSE;
  35. // TODO: add reinitialization code here
  36. // (SDI documents will reuse this document)
  37. return TRUE;
  38. }
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CCPoint3DCloudDoc serialization
  41. void CCPoint3DCloudDoc::Serialize(CArchive& ar)
  42. {
  43. if (ar.IsStoring())
  44. {
  45. // TODO: add storing code here
  46. }
  47. else
  48. {
  49. // TODO: add loading code here
  50. }
  51. }
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CCPoint3DCloudDoc diagnostics
  54. #ifdef _DEBUG
  55. void CCPoint3DCloudDoc::AssertValid() const
  56. {
  57. CDocument::AssertValid();
  58. }
  59. void CCPoint3DCloudDoc::Dump(CDumpContext& dc) const
  60. {
  61. CDocument::Dump(dc);
  62. }
  63. #endif //_DEBUG
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CCPoint3DCloudDoc commands
  66. void CCPoint3DCloudDoc::OnFileOpen() 
  67. {
  68. // TODO: Add your command handler code here
  69. CString m_strPathname;
  70. CString m_strFilename;
  71. CString m_strFileTitle;
  72. CString m_strFileext;//文件的扩展名
  73. LPTSTR lpszFilter = "ASCII Data Files(*.asc , *ASC)|*.asc|ASCII Data Files(*.txt , *TXT)|*.txt|All Files(*.*)|*.*||";
  74. CFileDialog p_dlg(true,".txt",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);
  75. if (p_dlg.DoModal() == IDOK)
  76. {
  77. m_strPathname = p_dlg.GetPathName();
  78. m_strFilename = p_dlg.GetFileName();
  79. m_strFileTitle = p_dlg.GetFileTitle();
  80. m_strFileext = p_dlg.GetFileExt();//文件扩展名对话框
  81. }
  82. else 
  83. return ;
  84. //m_strFileext.MakeUpper();//扩展名转化成大写字母
  85. m_strFileext.MakeLower();//2005.7.21//
  86. if (m_strFileext!="txt" && m_strFileext!="asc")
  87. {
  88. return ;
  89. }
  90. FILE *p_txt= fopen(m_strPathname,"r");
  91. if (p_txt == NULL)
  92. {
  93.    fclose(p_txt);
  94.    return ;
  95. }
  96. //////////////////////////////////////////////////////////////////////////
  97. //检索文件开头
  98. //   int nSize = sizeof('n');
  99.    TCHAR tHead ;
  100.    int nBegin = 0;
  101.    tHead = fgetc(p_txt);//   tHead = fgetc(p_txt);
  102.    switch(tHead)
  103.    {
  104. case EOF://
  105.    nBegin = 0;
  106.    break;
  107. case '!'://Catia
  108.    OnFileOpenCATIA(p_txt);
  109.    return;
  110.           // nBegin = 50;
  111.    break;
  112. case '#': //Geomagic    
  113. nBegin = 30;
  114.    break;
  115. // case 'n':
  116. // nBegin = 0;
  117. // break;
  118. default:
  119. nBegin = 0;
  120.      break;
  121.    }
  122.    fseek(p_txt , nBegin , SEEK_SET);
  123. //检索文件开头
  124. //////////////////////////////////////////////////////////////////////////
  125. //检索文件结尾 是否有字符串标志
  126. fseek(p_txt ,-14L , SEEK_END);
  127. TCHAR  tchar[14]=_T("");
  128. fgets(tchar , 13 , p_txt);
  129. tchar[13] = '';
  130. CString str = tchar;
  131. int nEndCloud = str.Find("cloud");
  132. int nEnd = -1;
  133. if (nEndCloud == -1)
  134. nEnd = EOF;
  135. else if (nEndCloud != 6)
  136. {
  137.    nEndCloud = nEndCloud - 20;
  138.    nEnd = fseek(p_txt ,nEndCloud , SEEK_END);
  139. }
  140. //检索文件结尾 是否有字符串标志
  141. //////////////////////////////////////////////////////////////////////////
  142. // 判定数据点格式是三个参数 还是六个参数
  143. fseek(p_txt , nBegin , SEEK_SET);
  144. TCHAR tchar1[128] = _T("");
  145. fgets(tchar1 , 127 , p_txt);
  146.     str = tchar1;
  147. int nLine = str.Find('n');
  148. int nNull = str.Find(' ') , nPos = 0;
  149. int sum = 2;
  150. while(nNull < nLine)
  151. {
  152. nPos = str.Find(' ' , nNull + 1);
  153.         if (nPos != -1)
  154. {
  155. nNull = nPos ;
  156. ++sum;
  157. }
  158. else
  159. break;
  160. }
  161. // 判定数据点格式是三个参数 还是六个参数
  162. //////////////////////////////////////////////////////////////////////////
  163. POINT3D prMax , prMin;
  164. prMax.x = -10000000.0;
  165. prMax.y = -10000000.0;
  166. prMax.z = -10000000.0;
  167. prMin.x = 10000000.0;
  168. prMin.y = 10000000.0;
  169. prMin.z = 10000000.0;
  170. //////////////////////////////////////////////////////////////////////////
  171.     fseek(p_txt , nBegin , SEEK_SET);
  172. AfxGetApp()->BeginWaitCursor(); // vector <POINT3D> m_prToothPointsVertexList;//2005.7.28添加//定义一个字符向量
  173. m_prToothPointsVertexList.clear();// POINT3D f_xyz;
  174. POINT7D f_xyz;
  175. POINT3D f_xyzw;
  176. switch(sum) 
  177. {
  178. case 3://
  179. while (fscanf(p_txt,"%f %f %f",&f_xyzw.x,&f_xyzw.y,&f_xyzw.z) != nEnd)
  180. {
  181.            f_xyz = f_xyzw;
  182.    prMax.x=max(prMax.x,f_xyz.x);
  183.    prMax.y=max(prMax.y,f_xyz.y);
  184.    prMax.z=max(prMax.z,f_xyz.z);
  185.    prMin.x=min(prMin.x,f_xyz.x);
  186.    prMin.y=min(prMin.y,f_xyz.y);
  187.    prMin.z=min(prMin.z,f_xyz.z);    
  188.    m_prToothPointsVertexList.push_back(f_xyz);    
  189. }
  190. break;
  191. default://
  192. while (fscanf(p_txt,"%f %f %f %f %f %f",&f_xyz.x,&f_xyz.y,&f_xyz.z,&f_xyz.nx,&f_xyz.ny,&f_xyz.nz) != nEnd)
  193. {
  194.    prMax.x=max(prMax.x,f_xyz.x);
  195.    prMax.y=max(prMax.y,f_xyz.y);
  196.    prMax.z=max(prMax.z,f_xyz.z);
  197.    prMin.x=min(prMin.x,f_xyz.x);
  198.    prMin.y=min(prMin.y,f_xyz.y);
  199.    prMin.z=min(prMin.z,f_xyz.z);    
  200.    m_prToothPointsVertexList.push_back(f_xyz);    
  201. }
  202. break;
  203. }
  204. fclose(p_txt);// vector <POINT3D>::iterator pItVector1,pItVector2;//为字符数组定义游标iterator
  205. //////////////////////////////////////////////////////////////////////////
  206. vector <POINT7D>::iterator pItVector1,pItVector2;
  207. pItVector1= m_prToothPointsVertexList.end()-1;//除了最后一个元素
  208. pItVector2= pItVector1-1;
  209. if (Distance(*pItVector1,*pItVector2)<0.003)
  210. {
  211. m_prToothPointsVertexList.erase(pItVector1);
  212. return ;
  213. }
  214. //////////////////////////////////////////////////////////////////////////
  215. prBoxCenter = (prMax+prMin) / 2;
  216. prBoxSize = (prMax-prMin) / 2;
  217. CCPoint3DCloudView *pView =(CCPoint3DCloudView*) GetView(RUNTIME_CLASS(CCPoint3DCloudView));
  218. m_nDocOpenGL = &(pView->m_nViewOpenGL);// double fmax = max(prBoxSize.x , prBoxSize.y);// fmax = max(prBoxSize.z , fmax);
  219. m_nDocOpenGL->SetBox(tagCVector(prBoxCenter.x , prBoxCenter.y ,prBoxCenter.z) , tagCVector(prBoxSize.x , prBoxSize.y , prBoxSize.z));
  220. AfxGetApp()->EndWaitCursor();
  221.     UpdateAllViews(NULL, 0, 0);
  222. }
  223. void CCPoint3DCloudDoc::OnDraw()
  224. {
  225. if (m_prToothPointsVertexList.empty())
  226. return;
  227. glColor3f(1.0 , 1.0  , 1.0 );// vector<POINT3D>::iterator pItPoint3d;
  228. vector<POINT7D>::iterator pItPoint3d;
  229. glBegin(GL_POINTS);
  230. for (pItPoint3d = m_prToothPointsVertexList.begin() ; 
  231. pItPoint3d != m_prToothPointsVertexList.end() ; ++pItPoint3d)
  232. if (pItPoint3d->w > 0)
  233.       glVertex3f(pItPoint3d->x , pItPoint3d->y ,pItPoint3d->z);
  234.     glEnd();
  235. }
  236. CView* CCPoint3DCloudDoc::GetView(CRuntimeClass *pViewClass)
  237. {
  238. POSITION pos = GetFirstViewPosition();
  239. while (pos != NULL ) 
  240. {
  241. CView* pView = GetNextView(pos);
  242. if (pView->IsKindOf(pViewClass))
  243. return pView;
  244. }
  245.     return NULL;
  246. }
  247. BOOL CCPoint3DCloudDoc::OnFileOpenCATIA(FILE *f_txt)
  248. {
  249. AfxGetApp()->BeginWaitCursor(); // vector <POINT3D> m_prToothPointsVertexList;//2005.7.28添加//定义一个字符向量
  250. m_prToothPointsVertexList.clear();
  251. fseek(f_txt , 0L , SEEK_SET);
  252. //////////////////////////////////////////////////////////////////////////
  253. //catia head
  254. TCHAR tchar[128] = _T("");
  255. CString str ;
  256. int i = 0;
  257. for (i = 0 ; i < 5 ; ++i)
  258. {
  259. memset(tchar , 128 , 0);
  260. fgets(tchar , 127 , f_txt);
  261. tchar[127] = '';
  262. }
  263. /////////////////////////////////////////////////////////////////////////
  264. //获取文件数据格式
  265. str = tchar;
  266.     int nFirstChar = str.Find(''') + 1;
  267.     int nEndChar = str.ReverseFind(''');
  268. int nChar = nEndChar - nFirstChar ;
  269. CString strchar = str.Mid(nFirstChar , nChar);
  270. nChar = (nChar + 1) / 5;
  271. CString *strXYZ = new CString[nChar];
  272. CString *strFormat = new CString[nChar];
  273. for ( i = 0 ; i < nChar ; ++i)
  274. {
  275. strXYZ[i] = strchar.Mid(i * 5 , 1);
  276. strFormat[i] = strchar.Mid(i * 5 + 3 , 1);
  277. }
  278. //获取文件数据格式
  279. //////////////////////////////////////////////////////////////////////////
  280. //点个数
  281. for (i = 0 ; i < 2 ; ++i)
  282. {
  283. memset(tchar , 128 , 0);
  284. fgets(tchar , 127 , f_txt);
  285. tchar[127] = '';
  286. str = tchar;  
  287.     nFirstChar = str.Find('=') + 1;
  288.   nEndChar = str.GetLength() - nFirstChar;
  289.     strchar = str.Mid(nFirstChar , nEndChar);
  290. int nPointSize = atoi(strchar);
  291. m_prToothPointsVertexList.resize(nPointSize);
  292. //
  293. memset(tchar , 128 , 0);
  294. fgets(tchar , 127 , f_txt);
  295. tchar[127] = '';
  296. //catia head
  297. //////////////////////////////////////////////////////////////////////////
  298. int *nXYZ = new int[nChar + 1];
  299.     int j = 0;
  300. POINT3D prMax , prMin;
  301. prMax.x = -10000000.0;
  302. prMax.y = -10000000.0;
  303. prMax.z = -10000000.0;
  304. prMin.x = 10000000.0;
  305. prMin.y = 10000000.0;
  306. prMin.z = 10000000.0;
  307. vector<POINT7D>::iterator pItPoint7D = m_prToothPointsVertexList.begin();
  308.     for (j = 0 ; j < nPointSize ; ++j , ++pItPoint7D)
  309. {
  310. memset(tchar , 128 , 0);
  311. fgets(tchar , 127 , f_txt);
  312. tchar[127] = '';
  313. str = tchar;
  314. for ( i = 0 ; i < nChar ; ++i)
  315. nXYZ[i] = str.Find(strXYZ[i]);
  316. nXYZ[i] = str.GetLength();
  317. for (i = 0 ; i < 3 ; ++i)
  318. {
  319. strchar = str.Mid(nXYZ[i] +1 , nXYZ[i + 1] - nXYZ[i] - 1);
  320. switch(i)
  321. {
  322. case 0:   
  323. pItPoint7D->x = atof(strchar);
  324. prMax.x=max(prMax.x,pItPoint7D->x); 
  325. prMin.x=min(prMin.x,pItPoint7D->x); 
  326. break;
  327. case 1:  
  328. pItPoint7D->y = atof(strchar);
  329. prMax.y=max(prMax.y,pItPoint7D->y);
  330. prMin.y=min(prMin.y,pItPoint7D->y);
  331. break;
  332. case 2:
  333. pItPoint7D->z = atof(strchar);   
  334. prMax.z=max(prMax.z,pItPoint7D->z); 
  335. prMin.z=min(prMin.z,pItPoint7D->z);
  336. break;
  337. }
  338. }
  339. }
  340. //////////////////////////////////////////////////////////////////////////
  341. delete [] strXYZ;
  342. delete []strFormat;
  343. delete []nXYZ;
  344. strXYZ = NULL;
  345. strFormat = NULL;
  346. nXYZ = NULL;
  347.     fclose(f_txt);
  348. prBoxCenter = (prMax+prMin) / 2;
  349. prBoxSize = (prMax-prMin) / 2;
  350. CCPoint3DCloudView *pView =(CCPoint3DCloudView*) GetView(RUNTIME_CLASS(CCPoint3DCloudView));
  351. m_nDocOpenGL = &(pView->m_nViewOpenGL);// double fmax = max(prBoxSize.x , prBoxSize.y);// fmax = max(prBoxSize.z , fmax);
  352. m_nDocOpenGL->SetBox(tagCVector(prBoxCenter.x , prBoxCenter.y ,prBoxCenter.z) , tagCVector(prBoxSize.x , prBoxSize.y , prBoxSize.z));
  353. AfxGetApp()->EndWaitCursor();
  354.     UpdateAllViews(NULL, 0, 0);
  355. return TRUE;
  356. }