Processfile.cpp
上传用户:hell82222
上传日期:2013-12-19
资源大小:1872k
文件大小:68k
源码类别:

CAD

开发平台:

Visual C++

  1. //      KMCAD40-FileSwitch-Processfile.cpp-1.0 
  2. //----------------------------------------
  3. //KMCAD40-FileSwitch-Processfile.cpp-1.0 -> 1.1
  4. #include "stdafx.h"
  5. #include "FileSwitch.h"
  6. #include "DwgReader.h"
  7. #include "KmSection.h"
  8. #include "propertyList.h"
  9. #include "SpaceConvDlg.h"
  10. #include "Reader.h"
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. BOOL CDwgReader::CallSpaceConvDlg(HWND hWnd,CStringArray &m_strSpaceNames,CStringArray &m_strSpaceFiles,int &iCur)
  17. {
  18. AFX_MANAGE_STATE(AfxGetStaticModuleState())
  19. HINSTANCE hPreInstResource=AfxGetResourceHandle();
  20. AfxSetResourceHandle(::GetModuleHandle(NULL) );
  21. if(m_strSpaceNames.GetSize()!=m_strSpaceFiles.GetSize())
  22. {
  23. AfxSetResourceHandle(hPreInstResource);
  24. return FALSE;
  25. }
  26. CWnd* pWnd=CWnd::FromHandle(hWnd);
  27. CSpaceConvDlg dlg(pWnd);
  28. for(int i=0;i<m_strSpaceNames.GetSize();i++)
  29. {
  30. dlg.m_strSpaceNames.Add(m_strSpaceNames[i]);
  31. dlg.m_strSpaceFiles.Add(m_strSpaceFiles[i]);
  32. }
  33. if(dlg.DoModal()==IDOK)
  34. {
  35. if(m_strSpaceFiles.GetSize()!=dlg.m_strSpaceFiles.GetSize())
  36. {
  37. AfxSetResourceHandle(hPreInstResource);
  38. return FALSE;
  39. }
  40. for(i=0;i<m_strSpaceFiles.GetSize();i++)
  41. {
  42. m_strSpaceFiles[i]=dlg.m_strSpaceFiles[i];
  43. }
  44. iCur=dlg.m_iCur;
  45. AfxSetResourceHandle(hPreInstResource);
  46. return TRUE;
  47. }
  48. AfxSetResourceHandle(hPreInstResource);
  49. return FALSE;
  50. }
  51. extern CStdioFile g_CensorialFile; //监察转换进度的文件
  52. extern int g_mode;
  53. extern CTypedPtrMap<CMapStringToPtr, CString, void*> g_afont;
  54. BOOL CDwgReader::processfile(AD_DB_HANDLE dwghandle,BOOL bPaper)
  55. {
  56. m_pProgress->SetProgressInfoAbsolute(0.31,"分析文件头...");
  57. if(!processheader(dwghandle))
  58. {
  59. _WRITE(str="转换Header节失败");
  60. return FALSE;
  61. }
  62. m_pProgress->SetProgressInfoAbsolute(0.32,"分析系统变量...");
  63. if(!processsysvar(dwghandle))
  64. {
  65. _WRITE(str="转换系统变量失败");
  66. return FALSE;
  67. }
  68. m_pProgress->SetProgressInfoAbsolute(0.33,"分析代码页...");
  69. if(!processcodepage(dwghandle))
  70. {
  71. _WRITE(str="代码页失败");
  72. return FALSE;
  73. }
  74. m_pProgress->SetProgressInfoAbsolute(0.34,"分析颜色...");
  75. if(!processcolor(dwghandle))
  76. {
  77. _WRITE(str="转换颜色失败");
  78. return FALSE;
  79. }
  80. m_pProgress->SetProgressInfoAbsolute(0.35,"分析线宽...");
  81. if(!processlinewidth(dwghandle))
  82. {
  83. _WRITE(str="转换线宽失败");
  84. return FALSE;
  85. }
  86. if(!processobject(dwghandle))
  87. {
  88. _WRITE(str="转换OBJECT时失败");
  89. return FALSE;
  90. }
  91. m_pProgress->SetProgressInfoAbsolute(0.37,"分析代理实体...");
  92. if(!preprocess_Convertproxy(dwghandle,m_dproxyconvmode))
  93. {
  94. _WRITE(str="预处理代理实体失败");
  95. return FALSE;
  96. }
  97. //多行文字转换为单行文字尚不成熟
  98. // if(!preprocess_Convertmtext(dwghandle,m_dmtextconvmode))
  99. // {
  100. // _WRITE(str="预处理多行文字失败");
  101. // return FALSE;
  102. // }
  103. m_pProgress->SetProgressInfoAbsolute(0.38,"分析外部引用...");
  104. //外部参照暂不考虑
  105. if(!preprocess_Convertxref(dwghandle))
  106. {
  107. _WRITE(str="预处理外部引用失败");
  108. }
  109. m_pProgress->SetProgressInfoAbsolute(0.39,"分析线形...");
  110. if(!processlinetype(dwghandle))
  111. {
  112. _WRITE(str="转换线形失败");
  113. return FALSE;
  114. }
  115. if(!processplotstyle(dwghandle))
  116. {
  117. _WRITE(str="转换打印样式失败");
  118. return FALSE;
  119. }
  120. m_pProgress->SetProgressInfoAbsolute(0.40,"分析层...");
  121. m_iCurPlotStyleTable=m_iModelPlotStyleTable;
  122. if(!processlayer(dwghandle)) //层有线型属性,需要放到线型后面.
  123. {
  124. _WRITE(str="转换层失败");
  125. return FALSE;
  126. }
  127. m_pProgress->SetProgressInfoAbsolute(0.41,"分析线形比例...");
  128. if(!processlinescale(dwghandle))
  129. {
  130. _WRITE(str="转换线形比例失败");
  131. return FALSE;
  132. }
  133. m_pProgress->SetProgressInfoAbsolute(0.42,"分析形文件...");
  134. if(!processshapefile(dwghandle))
  135. {
  136. _WRITE(str="转换形文件时失败");
  137. return FALSE;
  138. }
  139. m_pProgress->SetProgressInfoAbsolute(0.36,"分析尺寸样式...");
  140. if(!processdimstyle(dwghandle))
  141. {
  142. _WRITE(str="转换尺寸样式失败");
  143. }
  144. m_pProgress->SetProgressInfoAbsolute(0.43,"分析块定义...");
  145. if(!processblockdefine(dwghandle)) //转换块定义.
  146. {
  147. _WRITE(str="转换块定义失败");
  148. return FALSE;
  149. }
  150. //块中实体的打印样式按模型空间转换
  151. m_iCurPlotStyleTable=m_iModelPlotStyleTable;
  152. if(!processblockdefineobjs(dwghandle)) //清理空的块定义,将块定义的基点坐标重算.
  153. {
  154. _WRITE(str="转换块定义中的实体失败");
  155. return FALSE;
  156. }
  157. if(!processnouseblock(dwghandle))
  158. {
  159. _WRITE(str="清理无效块定义失败");
  160. return FALSE;
  161. }
  162. m_pProgress->SetProgressInfoAbsolute(0.60,"分析模型空间...");
  163. //模型空间实体的打印样式按模型空间转换
  164. m_iCurPlotStyleTable=m_iModelPlotStyleTable;
  165. BOOL bSelected=FALSE;
  166. CStringArray strSpaceNames;
  167. CStringArray strSpaceFiles;
  168. {
  169. strSpaceNames.Add("模型空间");
  170. strSpaceFiles.Add(m_pCommand->m_strAimName);
  171. }
  172. {
  173. CMatch3* match;
  174. CFileFind filefind;
  175. POSITION pos=m_apaper.GetHeadPosition();
  176. while(pos!=NULL)
  177. {
  178. match=m_apaper.GetNext(pos);
  179. //short adSeekBlockheader (AD_DB_HANDLE handle, AD_OBJHANDLE thehandle, PAD_BLKH adblkh);
  180. sReturnValue=adSeekBlockheader(dwghandle,match->m_handle,&adtb->blkh);
  181. if(sReturnValue!=1)
  182. {
  183. _ERROR;
  184. return FALSE;
  185. }
  186. int index2=1;
  187. CString strfilename=m_pCommand->m_strAimName;
  188. CString strfileext=strfilename.Right(4);
  189. strfilename=strfilename.Left(strfilename.GetLength()-4);
  190. strfilename+="_"+match->m_layeroutname;
  191. CString strfilename2=strfilename+strfileext;
  192. int index=1;
  193. CString strTemp;
  194. while(filefind.FindFile((LPCTSTR)strfilename2))
  195. {
  196. strTemp.Format("#%d",index);
  197. strfilename2=strfilename+strTemp+strfileext;
  198. index++;
  199. }
  200. strSpaceNames.Add(match->m_layeroutname);
  201. strSpaceFiles.Add(strfilename2);
  202. }
  203. }
  204. extern CFileSwitchApp theApp;
  205. //《《《《《注册表 ――――――――――检查是否需要选择空间
  206. if(theApp.GetProfileInt("FileConv","SelectSpace",0))
  207. {
  208. //》》》》》注册表 ――――――――――申明不需要选择空间
  209. theApp.WriteProfileInt("FileConv","SelectSpace",0);
  210. //》》》》》注册表 ――――――――――申明选择的空间为空
  211. theApp.WriteProfileString("FileConv","SpaceFileName","");
  212. //。。。转换。。。
  213. {
  214. int iCur=-1;
  215. if(CallSpaceConvDlg(m_pCommand->m_hmainfrm,strSpaceNames,strSpaceFiles,iCur))
  216. {
  217. bSelected=TRUE;
  218. iCur--;
  219. if(iCur>=0&&iCur<strSpaceFiles.GetSize())
  220. {
  221. //》》》》》注册表 ――――――――――选择的空间
  222. theApp.WriteProfileString("FileConv","SpaceFileName",strSpaceFiles[iCur]);
  223. }
  224. }
  225. }
  226. }
  227. if(!bSelected)
  228. {
  229. //》》》》》注册表 ――――――――――申明选择的空间为空
  230. theApp.WriteProfileString("FileConv","SpaceFileName","");
  231. if(!processmodalentity(dwghandle,NULL,NULL))
  232. {
  233. _WRITE(str="转换模型空间的实体失败");
  234. return FALSE;
  235. }
  236. if(bPaper)
  237. {
  238. m_pProgress->SetProgressInfoAbsolute(0.80,"分析纸区空间...");
  239. if(!processpaperentity(dwghandle,NULL,NULL))
  240. {
  241. _WRITE(str="转换纸区空间的实体失败");
  242. return FALSE;
  243. }
  244. }
  245. }
  246. else
  247. {
  248. if(!processmodalentity(dwghandle,&strSpaceNames,&strSpaceFiles))
  249. {
  250. _WRITE(str="转换模型空间的实体失败");
  251. return FALSE;
  252. }
  253. if(bPaper)
  254. {
  255. m_pProgress->SetProgressInfoAbsolute(0.80,"分析纸区空间...");
  256. if(!processpaperentity(dwghandle,&strSpaceNames,&strSpaceFiles))
  257. {
  258. _WRITE(str="转换纸区空间的实体失败");
  259. return FALSE;
  260. }
  261. }
  262. }
  263. return TRUE;
  264. BOOL CDwgReader::processheader(AD_DB_HANDLE dwghandle)
  265. {
  266. PAD_DWGHDR adhd;
  267. //PAD_DWGHDR adHeaderPointer(AD_DB_HANDLE handle);
  268. adhd=adHeaderPointer(dwghandle);
  269. if(adhd==NULL)
  270. {
  271. _WRITE("没有文件头.");
  272. return TRUE;
  273. }
  274. double dltscale = adhd->ltscale;
  275. if(dltscale<=PRECISION)
  276. {
  277. dltscale = 1.0 ;
  278. }
  279. VARIANT var;
  280. memset(&var,0,sizeof(VARIANT)); 
  281. var.vt = VT_R8;
  282. var.dblVal = dltscale;
  283. m_pConverter->ConverterDbVar(LTSCALE,var);
  284. //默认线宽存放于注册表中.
  285. return TRUE;
  286. }
  287. BOOL CDwgReader::processsysvar(AD_DB_HANDLE dwghandle)
  288. {
  289. /* _WRITE(str="tip:样条做近似处理,如需严格转换请设置转换模式为样条转换为折线以得到控制点");
  290. _WRITE(str="tip:平行线的两端的连接弧没有处理");
  291. _WRITE(str="tip:线形中嵌入的形和文字没处理");
  292. _WRITE(str="tip:模型空间和纸区空间的实体颜色随块处理为使用系统颜色");
  293. _WRITE(str="tip:打印风格没有转换");
  294. _WRITE(str="tip:Header节没有转换");
  295. _WRITE(str="tip:没有生成面域,请将AutoCAD的系统变量fillmode设置为0则显示效果相同");
  296. _WRITE(str="tip:部分三维对象没有处理,如三维视口,Acis实体没有处理");
  297. _WRITE(str="tip:视口裁减操作功能有限,不支持多边形视口");
  298. _WRITE(str="tip:文字的字体没有转换,颠倒反向垂直都没有处理,斜体没有处理");
  299. _WRITE(str="tip:文字的转义字符转换有偏差");
  300. _WRITE(str="tip:块定义中的属性定义Attdef将被忽略,而在块引用后紧跟的块属性实体被转换到了与块引用同级的数据容器中");
  301. _WRITE(str="tip:外部文字暂不予处理");
  302. */
  303. m_dlinespacemodify=0.5;//行距校正系数  
  304. m_dtoltextwidthf=1.0;//形位公差的字宽//调整带框字符的宽度已修复宽度误差
  305. m_dtoltextspacef=1.0;//形位公差的字间距
  306. {
  307. PAD_DWGHDR dwghd;
  308. dwghd=adHeaderPointer(dwghandle);
  309. if(dwghd)
  310. {
  311. m_pConverter->m_dSysDimScale=dwghd->dimscale;
  312. }
  313. }
  314. CWinApp* pApp=::AfxGetApp();
  315. if(!pApp)
  316. {
  317. return FALSE;
  318. }
  319. CString strTemp;
  320. m_icolorbyback = pApp->GetProfileInt(_T("Dwg2Kmg"), _T("ColorByBack"), (int)RGB(255,255,255));
  321. _WRITE(str.Format("tip:颜色随底色转换为R(%d)G(%d)B(%d)",GetRValue(DWORD(m_icolorbyback)),GetBValue(DWORD(m_icolorbyback)),GetGValue(DWORD(m_icolorbyback))));
  322. pApp->WriteProfileInt(_T("Dwg2Kmg"), _T("ColorByBack"), m_icolorbyback);//用于保证保存了数据
  323. m_ilinewidthdefault = pApp->GetProfileInt(_T("Dwg2Kmg"), _T("DefaultLineWidth"), 25);
  324. _WRITE(str.Format("tip:缺省线宽转换为%d",m_ilinewidthdefault));
  325. pApp->WriteProfileInt(_T("Dwg2Kmg"), _T("DefaultLineWidth"), m_ilinewidthdefault);//用于保证保存了数据
  326. strTemp = pApp->GetProfileString(_T("Dwg2Kmg"), _T("PointRadius"), "0.001");
  327. m_dpointtocircleradius = ::atof(LPCTSTR(strTemp));
  328. _WRITE(str.Format("tip:点转换为圆时的半径为%f",m_dpointtocircleradius));
  329. if(m_dpointtocircleradius<=0)
  330. {
  331. m_dpointtocircleradius = 0.001;
  332. strTemp.Format("%lf",m_dpointtocircleradius);
  333. }
  334. pApp->WriteProfileString(_T("Dwg2Kmg"), _T("PointRadius"), strTemp);
  335. strTemp = pApp->GetProfileString(_T("Dwg2Kmg"), _T("Constructionlinelength"), "1000");
  336. m_dconstrulinelength = ::atof(LPCTSTR(strTemp));
  337. _WRITE(str.Format("tip:结构线转换为长度为%f的线段",m_dconstrulinelength));
  338. if(m_dconstrulinelength<1000)
  339. {
  340. m_dconstrulinelength = 1000;
  341. strTemp.Format("%lf",m_dconstrulinelength);
  342. }
  343. pApp->WriteProfileString(_T("Dwg2Kmg"), _T("Constructionlinelength"), strTemp);
  344. m_ddimconvmode = pApp->GetProfileInt(_T("Dwg2Kmg"), _T("DimConvMode"), 2);
  345. switch(m_ddimconvmode)
  346. {
  347. case 1:
  348. _WRITE(str="tip:尺寸转换为块,不可以再进行编辑");
  349. break;
  350. case 2:
  351. _WRITE(str="tip:尺寸转换为无目标尺寸,可以编辑");
  352. break;
  353. default:
  354. m_ddimconvmode=1;
  355. _WRITE(str="tip:尺寸转换为块,不可以再进行编辑");
  356. break;
  357. }
  358. pApp->WriteProfileInt(_T("Dwg2Kmg"), _T("DimConvMode"), m_ddimconvmode);//用于保证保存了数据
  359. // m_dmtextconvmode = pApp->GetProfileInt(_T("Dwg2Kmg"), _T("MtextConvMode"), 1);
  360. // switch(m_dmtextconvmode)
  361. // {
  362. // case 1:
  363. // _WRITE(str="tip:多行文字转换为KM文字");
  364. // break;
  365. // case 2:
  366. // _WRITE(str="tip:多行文字转换为单行文字");
  367. // break;
  368. // default:
  369. // _WRITE(str="tip:多行文字转换为KM文字");
  370. // m_dmtextconvmode=1;
  371. // break;
  372. //
  373. // }
  374. // pApp->WriteProfileInt(_T("Dwg2Kmg"), _T("MtextConvMode"), m_dmtextconvmode);//用于保证保存了数据
  375. m_dproxyconvmode = pApp->GetProfileInt(_T("Dwg2Kmg"), _T("ProxyConvMode"), 1);
  376. switch(m_dproxyconvmode)
  377. {
  378. case 1:
  379. _WRITE(str="tip:代理实体转换为块");
  380. break;
  381. case 2:
  382. _WRITE(str="tip:代理实体转换为实体");
  383. break;
  384. default:
  385. _WRITE(str="tip:代理实体转换为块");
  386. m_dproxyconvmode=1;
  387. break;
  388. }
  389. pApp->WriteProfileInt(_T("Dwg2Kmg"), _T("ProxyConvMode"), m_dproxyconvmode);//用于保证保存了数据
  390. m_dsplineconvmode = pApp->GetProfileInt(_T("Dwg2Kmg"), _T("SplineConvMode"), 1);
  391. switch(m_dsplineconvmode)
  392. {
  393. case 1:
  394. _WRITE(str="tip:样条转换为样条");
  395. break;
  396. case 2:
  397. _WRITE(str="tip:样条转换为折线");
  398. break;
  399. default:
  400. _WRITE(str="tip:样条转换为样条");
  401. m_dsplineconvmode=1;
  402. break;
  403. }
  404. pApp->WriteProfileInt(_T("Dwg2Kmg"), _T("SplineConvMode"), m_dsplineconvmode);//用于保证保存了数据
  405. m_dviewcutconvmode = pApp->GetProfileInt(_T("Dwg2Kmg"), _T("ViewCutConvMode"), 2);
  406. switch(m_dviewcutconvmode)
  407. {
  408. case 1:
  409. _WRITE(str="tip:视口裁减方式为与视口相交的均保留");
  410. break;
  411. case 2:
  412. _WRITE(str="tip:视口裁减方式为视口裁减(有些实体不支持)");
  413. break;
  414. case 3:
  415. _WRITE(str="tip:不裁减");
  416. break;
  417. default:
  418. _WRITE(str="tip:样条转换为样条");
  419. m_dviewcutconvmode=1;
  420. break;
  421. }
  422. pApp->WriteProfileInt(_T("Dwg2Kmg"), _T("ViewCutConvMode"), m_dviewcutconvmode);//用于保证保存了数据
  423. //默认为不转换打印样式。
  424. m_dplotstyleconvmode = pApp->GetProfileInt(_T("Dwg2Kmg"), _T("PlotStyleConvMode"), 2);
  425. switch(m_dplotstyleconvmode)
  426. {
  427. case 1:
  428. _WRITE(str="tip:转换打印样式");
  429. break;
  430. case 2:
  431. _WRITE(str="tip:不转换打印样式");
  432. break;
  433. default:
  434. _WRITE(str="tip:转换打印样式");
  435. m_dplotstyleconvmode=2;
  436. break;
  437. }
  438. pApp->WriteProfileInt(_T("Dwg2Kmg"), _T("PlotStyleConvMode"), m_dplotstyleconvmode);//用于保证保存了数据
  439. m_ddimstyleconvmode = pApp->GetProfileInt(_T("Dwg2Kmg"), _T("DimStyleConvMode"), 1);
  440. switch(m_ddimstyleconvmode)
  441. {
  442. case 1:
  443. _WRITE(str="tip:转换打印样式");
  444. break;
  445. case 2:
  446. _WRITE(str="tip:不转换打印样式");
  447. break;
  448. default:
  449. _WRITE(str="tip:转换打印样式");
  450. m_ddimstyleconvmode=1;
  451. break;
  452. }
  453. pApp->WriteProfileInt(_T("Dwg2Kmg"), _T("DimStyleConvMode"), m_ddimstyleconvmode);//用于保证保存了数据
  454. strTemp = pApp->GetProfileString(_T("Dwg2Kmg"), _T("ACADpath"), "C:\Program Files\Autodesk AutoCAD\support;C:\Program Files\Autodesk AutoCAD\fonts;C:\Program Files\Autodesk AutoCAD\help;C:\Program Files\Autodesk AutoCAD\express;");
  455. m_strACADpath = strTemp;
  456. pApp->WriteProfileString(_T("Dwg2Kmg"), _T("ACADpath"), (LPCTSTR)m_strACADpath);
  457. strTemp = pApp->GetProfileString(_T("Dwg2Kmg"), _T("DimStyleFullName"), "");
  458. m_strDimStyleFullName = strTemp;
  459. pApp->WriteProfileString(_T("Dwg2Kmg"), _T("DimStyleFullName"), (LPCTSTR)m_strDimStyleFullName);
  460. //测试方法:
  461. // CFont fonttext;fonttext.CreateFont(1000,0,0,0,0,FALSE,FALSE,0,DEFAULT_CHARSET,0,0,0,0,"幼圆");
  462. // CWnd* pDesktop=CWnd::FromHandle(::GetDesktopWindow());
  463. // CDC* pDC=pDesktop->GetDC();
  464. // pDC->SelectObject(&fonttext);
  465. // CFont* fontold=pDC->SelectObject(&fonttext);
  466. // OUTLINETEXTMETRIC out;
  467. // UINT a=pDC->GetOutlineTextMetrics(1,NULL);
  468. // pDC->GetOutlineTextMetrics(a,&out);
  469. //字体 测试字高 基线上  基线下  发音 扩展 行间距 字模正方形 ACAD发音
  470. // uTH=tm.tmHeight+tm.tmExternalLeading;
  471. // uHight=tm.tmHeight-tm.tmInternalLeading-tm.tmDescent;
  472. // uTop=tm.tmExternalLeading+tm.tmInternalLeading;
  473. // if(uTH!=uHight)
  474. // {
  475. // m_Text.m_nHeight*=TEXT_ADJUST*uTH/uHight;
  476. // m_Text.m_Offset.x-=m_Text.m_nHeight*uTop/uTH*sin(m_Text.m_nEscapement*PI/180);
  477. // m_Text.m_Offset.y+=m_Text.m_nHeight*uTop/uTH*cos(m_Text.m_nEscapement*PI/180);
  478. // }
  479. double a;
  480. //华文彩云 1000= 782+ 218; 35 0 139 1000 695
  481. {
  482. a= (1000.0 -35.0)* (782.0 -35.0) / ( 695.0 * TEXT_ADJUST * ( 1000.0 + 0.0 ) );
  483. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文彩云"), strTemp);
  484. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STCaiyun"), strTemp);
  485. }
  486. //方正舒体 1000= 866+ 134; 48 4 138 256 566
  487. {
  488. a= (1000.0-48.0) * (866.0 -48.0) / ( 566.0 * TEXT_ADJUST * ( 1000.0 + 4.0 ) );
  489. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("方正舒体"), strTemp);
  490. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("FZShuTi"), strTemp);
  491. }
  492. //方正姚体 1000 876 125 114 7 131 256 665
  493. {
  494. a= (1000.0-114.0) * (876.0 -114.0) / ( 665.0 * TEXT_ADJUST * ( 1000.0 + 7.0 ) );
  495. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("方正姚体"), strTemp);
  496. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("FZYaoTi"), strTemp);
  497. }
  498. //仿宋_GB2312 1000= 859+ 141; 0 141 141 256 722
  499. {
  500. a= 1000.0 * (859.0 -0.0) / ( 722.0 * TEXT_ADJUST * ( 1000.0 + 141.0 ) );
  501. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("仿宋_GB2312"), strTemp);
  502. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("FangSong_GB2312"), strTemp);
  503. }
  504. //字体 测试字高 基线上  基线下  发音 扩展 行间距 字模正方形 ACAD发音
  505. //黑体 1000= 859+ 141; 0 141 141 256 692
  506. {
  507. //a=(高度 -发音 )* (线上-发音) ) / (ACAD  * TEXT_ADJUST * (高度+扩展))
  508. a= 1000.0 * (859.0 -0.0) / ( 692.0 * TEXT_ADJUST * ( 1000.0 + 141.0 ) );
  509. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("黑体"), strTemp);
  510. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("SimHei"), strTemp);
  511. }
  512. //华文细黑 1000= 807+ 193; 73 276 133 1000 693
  513. {
  514. a= (1000.0-73.0) * (807.0 -73.0) / ( 693.0 * TEXT_ADJUST * ( 1000.0 + 276.0 ) );
  515. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文细黑"), strTemp);
  516. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STXihei"), strTemp);
  517. }
  518. //华文新魏 1000= 768+ 232; 17 19 142 1000 693
  519. {
  520. a= (1000.0-17.0) * (768.0 -17.0) / ( 693.0 * TEXT_ADJUST * ( 1000.0 + 19.0 ) );
  521. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文新魏"), strTemp);
  522. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STXinwei"), strTemp);
  523. }
  524. //华文行楷 1000= 725+ 275; 48 39 137 1000 612
  525. {
  526. a= (1000.0 -48.0)* (725.0 -48.0) / ( 612.0 * TEXT_ADJUST * ( 1000.0 + 39.0 ) );
  527. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文行楷"), strTemp);
  528. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STXingkai"), strTemp);
  529. }
  530. //华文中宋 1000= 802+ 198; 120 165 127 1000 630
  531. {
  532. a= (1000.0-120.0) * (802.0 -120.0) / ( 630.0 * TEXT_ADJUST * ( 1000.0 + 165.0 ) );
  533. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文中宋"), strTemp);
  534. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STZhongsong"), strTemp);
  535. }
  536. //楷体_GB2312 1000= 859+ 141; 0 141 141 256 722
  537. {
  538. a= 1000.0 * (859.0 -0.0) / ( 722.0 * TEXT_ADJUST * ( 1000.0 + 141.0 ) );
  539. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("楷体_GB2312"), strTemp);
  540. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("KaiTi"), strTemp);
  541. }
  542. //隶书 1000= 859+ 141; 0 141 141 256 705
  543. {
  544. a= 1000.0 * (859.0 -0.0) / ( 705.0 * TEXT_ADJUST * ( 1000.0 + 141.0 ) );
  545. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("隶书"), strTemp);
  546. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("LiSu"), strTemp);
  547. }
  548. //宋体 1000= 859+ 141; 0 141 141 256 705
  549. {
  550. a= 1000.0 * (859.0 -0.0) / ( 705.0 * TEXT_ADJUST * ( 1000.0 + 141.0 ) );
  551. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("宋体"), strTemp);
  552. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("SimSun"), strTemp);
  553. }
  554. //新宋体 1000= 859+ 141; 0 141 141 256 700
  555. {
  556. a= 1000.0 * (859.0 -0.0) / ( 700.0 * TEXT_ADJUST * ( 1000.0 + 141.0 ) );
  557. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("新宋体"), strTemp);
  558. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("NSimSun"), strTemp);
  559. }
  560. //幼圆 1000= 859+ 141; 0 102 141 256 700
  561. {
  562. a= 1000.0 * (859.0 -0.0) / ( 700.0 * TEXT_ADJUST * ( 1000.0 + 102.0 ) );
  563. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("幼圆"), strTemp);
  564. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("YouYuan"), strTemp);
  565. }
  566. //华文仿宋 1000= 768+ 232; 107 162 * * 822-232
  567. {
  568. //a=(高度 -发音 )* (线上-发音) ) / (ACAD  * TEXT_ADJUST * (高度+扩展))
  569. a= (1000.0-107.0) * (768.0 -107.0) / (590.0 * TEXT_ADJUST * ( 1000.0 + 162.0 ) );
  570. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文仿宋"), strTemp);
  571. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STFangsong"), strTemp);
  572. }
  573. //华文楷体 1000= 768+ 232; 107 162 * * 822-232
  574. {
  575. a= (1000.0-107.0) * (768.0 -107.0) / (590.0 * TEXT_ADJUST * ( 1000.0 + 162.0 ) );
  576. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文楷体"), strTemp);
  577. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STKaiti"), strTemp);
  578. }
  579. //华文琥珀 1000= 774+ 226; 30 2 * * 888-226
  580. {
  581. a= (1000.0-30.0) * (774.0 -30.0) / (662.0 * TEXT_ADJUST * ( 1000.0 + 2.0 ) );
  582. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文琥珀"), strTemp);
  583. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STHupo"), strTemp);
  584. }
  585. //华文宋体 1000= 768+ 232; 107 162 * * 821-232
  586. {
  587. a= (1000.0-107.0) * (768.0 -107.0) / (589.0 * TEXT_ADJUST * ( 1000.0 + 162.0 ) );
  588. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文宋体"), strTemp);
  589. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STSong"), strTemp);
  590. }
  591. //华文隶书 1000= 744+ 256; 11 47 * * 865-256
  592. {
  593. a= (1000.0-11.0) * (768.0 -11.0) / (609.0 * TEXT_ADJUST * ( 1000.0 + 47.0 ) );
  594. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("华文隶书"), strTemp);
  595. strTemp.Format("%lf",a);pApp->WriteProfileString(_T("DwgFontHightRate"), _T("STLiti"), strTemp);
  596. }
  597. return TRUE;
  598. }
  599. BOOL CDwgReader::processcolor(AD_DB_HANDLE dwghandle)
  600. {
  601. short ACI[240]=
  602. { 255,255,206,206,156,156,123,123,74 ,74 , //顶峰
  603. 255,255,206,206,156,156,123,123,74 ,74 ,
  604. 255,255,206,206,156,156,123,123,74 ,74 ,
  605. 255,255,206,206,156,156,123,123,74 ,74 ,
  606. 255,255,206,206,156,156,123,123,74 ,74 ,
  607. 189,255,156,206,115,156,90 ,123,57 ,74 ,
  608. 123,222,99 ,181,74 ,132,57 ,107,33 ,66 ,
  609. 57 ,189,49 ,156,33 ,115,24 ,90 ,16 ,57 ,
  610. 0  ,156,0  ,123,0  ,90 ,0  ,74 ,0  ,41 ,
  611. 0  ,123,0  ,99 ,0  ,74 ,0  ,57 ,0  ,33 ,
  612. 0  ,123,0  ,99 ,0  ,74 ,0  ,57 ,0  ,33 ,
  613. 0  ,123,0  ,99 ,0  ,74 ,0  ,57 ,0  ,33 ,
  614. 0  ,123,0  ,99 ,0  ,74 ,0  ,57 ,0  ,33 ,//低谷
  615. 0  ,123,0  ,99 ,0  ,74 ,0  ,57 ,0  ,33 ,
  616. 0  ,123,0  ,99 ,0  ,74 ,0  ,57 ,0  ,33 ,
  617. 0  ,123,0  ,99 ,0  ,74 ,0  ,57 ,0  ,33 ,
  618. 0  ,156,0  ,123,0  ,90 ,0  ,74 ,0  ,41 ,
  619. 57 ,189,49 ,156,33 ,115,24 ,90 ,16 ,57 ,
  620. 123,222,99 ,181,74 ,132,57 ,107,33 ,66 ,
  621. 189,255,156,206,115,156,90 ,123,57 ,74 ,
  622. 255,255,206,206,156,156,123,123,74 ,74 ,
  623. 255,255,206,206,156,156,123,123,74 ,74 ,
  624. 255,255,206,206,156,156,123,123,74 ,74 ,
  625. 255,255,206,206,156,156,123,123,74 ,74 
  626. };
  627. try
  628. {
  629. m_aColor.SetSize(256);
  630. }
  631. catch(CMemoryException* e)
  632. {
  633. TCHAR szCause[255];
  634. e->GetErrorMessage(szCause, 255);
  635. _WRITE(str=szCause);
  636. return FALSE;
  637. }
  638. catch(...)
  639. {
  640. _WRITE(str="颜色转换时发生未知错误");
  641. return FALSE;
  642. }
  643. m_aColor[1]=(int)RGB(255,0,0);
  644. m_aColor[2]=(int)RGB(255,255,0);
  645. m_aColor[3]=(int)RGB(0,255,0);
  646. m_aColor[4]=(int)RGB(0,255,255);
  647. m_aColor[5]=(int)RGB(0,0,255);
  648. m_aColor[6]=(int)RGB(255,0,255);
  649. m_aColor[7]=m_icolorbyback;//黑/白缺省颜色是 7,白色或黑色(由背景色决定)。所有其他颜色必须由 ACI 编号指定(8 到 255)。
  650. m_aColor[8]=(int)RGB(132,130,132);
  651. m_aColor[9]=(int)RGB(198,195,198);
  652. int i;
  653. for(i=10;i<90;i++)
  654. {
  655. m_aColor[i]=(int)RGB(ACI[i-10],ACI[/*i-10+160*/i+150],ACI[/*i-10+320-240*/i+70]);
  656. }
  657. for(i=90;i<170;i++)
  658. {
  659. m_aColor[i]=(int)RGB(ACI[i-10],ACI[/*i-10+160-240*/i-90],ACI[/*i-10+320-240*/i+70]);
  660. }
  661. for(i=170;i<250;i++)
  662. {
  663. m_aColor[i]=(int)RGB(ACI[i-10],ACI[/*i-10+160-240*/i-90],ACI[/*i-10+320-240-240*/i-170]);
  664. }
  665. m_aColor[250]=(int)RGB(49,48,49);
  666. m_aColor[251]=(int)RGB(90,89,90);
  667. m_aColor[252]=(int)RGB(132,134,132);
  668. m_aColor[253]=(int)RGB(173,174,173);
  669. m_aColor[254]=(int)RGB(214,215,214);
  670. m_aColor[255]=(int)RGB(255,255,255);
  671. return TRUE;
  672. }
  673. BOOL CDwgReader::processlinewidth(AD_DB_HANDLE dwghandle)
  674. {
  675. //_WRITE(str="tip:线宽为0转换为绝对细实线");
  676. // m_alwidth.SetSize(4);
  677. // m_alwidth[0]=ABS_THIN_WIDTH;
  678. // m_alwidth[1]=LWIDTH_BYLAYER;
  679. // m_alwidth[2]=LWIDTH_BYBLOCK;//? 
  680. // m_alwidth[3]=m_ilinewidthdefault;
  681. return TRUE;
  682. }
  683. //函数功能:
  684. // 分析AutoCAD的线型数据,转换为KmCAD的线型数据,并记录到线型匹配链表中.
  685. //函数说明:
  686. // 使用以下函数遍历AutoCAD线型数据:
  687. // adStartLinetypeGet:开始获得AutoCAD线型数据.
  688. // adNumLinetypes:获得AutoCAD线型类型总数.
  689. // adGetLinetype:获得指定AutoCAD线型的线型数据.
  690. //输入参数:
  691. // AD_DB_HANDLE dwghandle:AutoCAD文件句柄.
  692. BOOL CDwgReader::processlinetype(AD_DB_HANDLE dwghandle)
  693. {
  694. _WRITE(str="_________开始转换线形");
  695. //short adStartLinetypeGet (AD_DB_HANDLE handle);
  696. sReturnValue=adStartLinetypeGet(dwghandle);
  697. if(sReturnValue!=1)
  698. {
  699. _ERROR;
  700. return FALSE;
  701. }
  702. //long adNumLinetypes (AD_DB_HANDLE handle);
  703. for(long i=0;i<adNumLinetypes(dwghandle);i++) 
  704. {
  705. //short adGetLinetype (AD_DB_HANDLE handle, PAD_LTYPE adltype);
  706. sReturnValue=adGetLinetype(dwghandle,&adtb->ltype);
  707. if(sReturnValue!=1)
  708. {
  709. _ERROR;
  710. return FALSE;
  711. }
  712. if(adtb->ltype.purgedflag==1)
  713. {
  714. continue;
  715. }
  716. int ikmhandle;
  717. double dkmlinescale;
  718. CString strName;
  719. strName=adtb->ltype.name;
  720. if(strName=="Continuous") 
  721. {
  722. ikmhandle=SOLID_LINE;
  723. dkmlinescale=1.0;
  724. }
  725. else if(strName=="ByLayer")
  726. {
  727. ikmhandle=LTYPE_BYLAYER;
  728. dkmlinescale=-1.0;//函数processentity_enthead中会修正
  729. }
  730. else if(strName=="ByBlock")
  731. {
  732. ikmhandle=LTYPE_BYBLOCK;
  733. dkmlinescale=1.0;
  734. }
  735. else if(strName=="BORDER")
  736. {//{11,6, {5,2,5,2,1,2}},//DDASH_DOT_LINE,11//双画单点线
  737. ikmhandle=DDASH_DOT_LINE;
  738. dkmlinescale=2.8;
  739. dkmlinescale=((double)5)/((double)12.7);
  740. }
  741. else if(strName=="BORDER2")
  742. {//{11,6, {5,2,5,2,1,2}},//DDASH_DOT_LINE,11//双画单点线
  743. ikmhandle=DDASH_DOT_LINE;
  744. dkmlinescale=1.4;
  745. dkmlinescale=((double)5)/((double)6.35);
  746. }
  747. else if(strName=="BORDERX2")
  748. {//{11,6, {5,2,5,2,1,2}},//DDASH_DOT_LINE,11//双画单点线
  749. ikmhandle=DDASH_DOT_LINE;
  750. dkmlinescale=5.6;
  751. dkmlinescale=((double)5)/((double)25.4);
  752. }
  753. else if(strName=="CENTER")
  754. {//{8, 4, {10,2,3,2}},//LONGDASH_SHORTDASH_LINE,8//长画短画线
  755. ikmhandle=LONGDASH_SHORTDASH_LINE;
  756. dkmlinescale=3.2;
  757. dkmlinescale=((double)10)/((double)31.75);
  758. }
  759. else if(strName=="CENTER2")
  760. {//{8, 4, {10,2,3,2}},//LONGDASH_SHORTDASH_LINE,8//长画短画线
  761. ikmhandle=LONGDASH_SHORTDASH_LINE;
  762. dkmlinescale=1.6;
  763. dkmlinescale=((double)10)/((double)19.05);
  764. }
  765. else if(strName=="CENTERX2")
  766. {//{8, 4, {10,2,3,2}},//LONGDASH_SHORTDASH_LINE,8//长画短画线
  767. ikmhandle=LONGDASH_SHORTDASH_LINE;
  768. dkmlinescale=6.4;
  769. dkmlinescale=((double)10)/((double)63.5);
  770. }
  771. else if(strName=="DASHDOT")
  772. {//{10, 4, {5,2,1,2}},//SHORTDASH_DOT_LINE,10//画点线
  773. ikmhandle=SHORTDASH_DOT_LINE;
  774. dkmlinescale=2.8;
  775. dkmlinescale=((double)5)/((double)12.7);
  776. }
  777. else if(strName=="DASHDOT2")
  778. {//{10, 4, {5,2,1,2}},//SHORTDASH_DOT_LINE,10//画点线
  779. ikmhandle=SHORTDASH_DOT_LINE;
  780. dkmlinescale=1.4;
  781. dkmlinescale=((double)5)/((double)6.35);
  782. }
  783. else if(strName=="DASHDOTX2")
  784. {//{10, 4, {5,2,1,2}},//SHORTDASH_DOT_LINE,10//画点线
  785. ikmhandle=SHORTDASH_DOT_LINE;
  786. dkmlinescale=5.6;
  787. dkmlinescale=((double)5)/((double)25.4);
  788. }
  789. else if(strName=="DASHED")
  790. {//{2, 2, {5,2}},//DASHED_LINE,2//虚线
  791. ikmhandle=DASHED_LINE;
  792. dkmlinescale=2.8;
  793. dkmlinescale=((double)5)/((double)12.7);
  794. }
  795. else if(strName=="DASHED2")
  796. {//{2, 2, {5,2}},//DASHED_LINE,2//虚线
  797. ikmhandle=DASHED_LINE;
  798. dkmlinescale=1.4;
  799. dkmlinescale=((double)5)/((double)6.35);
  800. }
  801. else if(strName=="DASHEDX2")
  802. {//{2, 2, {5,2}},//DASHED_LINE,2//虚线
  803. ikmhandle=DASHED_LINE;
  804. dkmlinescale=5.6;
  805. dkmlinescale=((double)5)/((double)25.4);
  806. }
  807. else if(strName=="HIDDEN")
  808. {//{2, 2, {5,2}},//DASHED_LINE,2//虚线
  809. ikmhandle=DASHED_LINE;
  810. dkmlinescale=2.8;
  811. dkmlinescale=((double)5)/((double)6.35);
  812. }
  813. else if(strName=="HIDDEN2")
  814. {//{2, 2, {5,2}},//DASHED_LINE,2//虚线
  815. ikmhandle=DASHED_LINE;
  816. dkmlinescale=1.4;
  817. dkmlinescale=((double)5)/((double)3.175);
  818. }
  819. else if(strName=="HIDDENX2")
  820. {//{2, 2, {5,2}},//DASHED_LINE,2//虚线
  821. ikmhandle=DASHED_LINE;
  822. dkmlinescale=5.6;
  823. dkmlinescale=((double)5)/((double)12.7);
  824. }
  825. else if(strName=="DIVIDE")
  826. {//{12,6, {5,2,1,2,1,2}},//SDASH_DDOT_LINE,12//画双点划线
  827. ikmhandle=SDASH_DDOT_LINE;
  828. dkmlinescale=2.8;
  829. dkmlinescale=((double)5)/((double)12.7);
  830. }
  831. else if(strName=="DIVIDE2")
  832. {//{12,6, {5,2,1,2,1,2}},//SDASH_DDOT_LINE,12//画双点划线
  833. ikmhandle=SDASH_DDOT_LINE;
  834. dkmlinescale=1.4;
  835. dkmlinescale=((double)5)/((double)6.35);
  836. }
  837. else if(strName=="DIVIDEX2")
  838. {//{12,6, {5,2,1,2,1,2}},//SDASH_DDOT_LINE,12//画双点划线
  839. ikmhandle=SDASH_DDOT_LINE;
  840. dkmlinescale=5.6;
  841. dkmlinescale=((double)5)/((double)25.4);
  842. }
  843. else if(strName=="PHANTOM")
  844. {//{9, 6, {10,2,3,2,3,2}},//LONGDASH_DSHORTDASH_LINE,9//长画双短画线
  845. ikmhandle=LONGDASH_DSHORTDASH_LINE;
  846. dkmlinescale=((double)10)/((double)31.75);
  847. }
  848. else if(strName=="PHANTOM2")
  849. {//{9, 6, {10,2,3,2,3,2}},//LONGDASH_DSHORTDASH_LINE,9//长画双短画线
  850. ikmhandle=LONGDASH_DSHORTDASH_LINE;
  851. dkmlinescale=((double)10)/((double)15.875);
  852. }
  853. else if(strName=="PHANTOMX2")
  854. {//{9, 6, {10,2,3,2,3,2}},//LONGDASH_DSHORTDASH_LINE,9//长画双短画线
  855. ikmhandle=LONGDASH_DSHORTDASH_LINE;
  856. dkmlinescale=((double)10)/((double)63.5);
  857. }
  858. else if(strName=="DOT")
  859. {
  860. ikmhandle=DOT_LINE;
  861. dkmlinescale=2.8;
  862. }
  863. else if(strName=="DOT2")
  864. {
  865. ikmhandle=DOT_LINE;
  866. //dkmlinescale=1.4;
  867. dkmlinescale=5.6;
  868. }
  869. else if(strName=="DOTX2")
  870. {
  871. ikmhandle=DOT_LINE;
  872. //dkmlinescale=5.6;
  873. dkmlinescale=1.4;
  874. }
  875. else if(strName=="ACAD_ISO02W100")
  876. {//{2, 2, {5,2}},//DASHED_LINE,2//虚线
  877. ikmhandle=DASHED_LINE;
  878. dkmlinescale=2;
  879. dkmlinescale=((double)5)/((double)12);
  880. }
  881. else if(strName=="ACAD_ISO03W100")
  882. {//{6, 2, {5,7}},//DASH_SPACE_LINE,6//间隔画线
  883. ikmhandle=DASH_SPACE_LINE;
  884. dkmlinescale=2.5;
  885. dkmlinescale=((double)5)/((double)12);
  886. }
  887. else if(strName=="ACAD_ISO04W100")
  888. {//{3, 4, {10, 2, 1, 2}},//POINT_LINE,3//点划线
  889. ikmhandle=POINT_LINE;
  890. dkmlinescale=2;
  891. dkmlinescale=((double)10)/((double)24);
  892. }
  893. else if(strName=="ACAD_ISO05W100")
  894. {//{12,6, {5,2,1,2,1,2}},//SDASH_DDOT_LINE,12//画双点划线
  895. ikmhandle=SDASH_DDOT_LINE;
  896. dkmlinescale=2;
  897. dkmlinescale=((double)5)/((double)24);
  898. }
  899. else if(strName=="ACAD_ISO06W100")
  900. {//{14,8, {5,2,1,2,1,2,1,2}}, //SDASH_TRIDOT_LINE,14//画三点线
  901. ikmhandle=SDASH_TRIDOT_LINE;
  902. dkmlinescale=2;
  903. dkmlinescale=((double)5)/((double)24);
  904. }
  905. else if(strName=="ACAD_ISO07W100")
  906. {//{7, 2, {2,2}},//DOT_LINE,7//点线
  907. ikmhandle=DOT_LINE;
  908. dkmlinescale=1.5;
  909. }
  910. else if(strName=="ACAD_ISO08W100")
  911. {//{10, 4, {5,2,1,2}},//SHORTDASH_DOT_LINE,10//画点线
  912. ikmhandle=SHORTDASH_DOT_LINE;
  913. dkmlinescale=4;
  914. dkmlinescale=((double)5)/((double)24);
  915. }
  916. else if(strName=="ACAD_ISO09W100")
  917. {//{9, 6, {10,2,3,2,3,2}},//LONGDASH_DSHORTDASH_LINE,9//长画双短画线
  918. ikmhandle=LONGDASH_DSHORTDASH_LINE;
  919. dkmlinescale=2;
  920. dkmlinescale=((double)10)/((double)24);
  921. }
  922. else if(strName=="ACAD_ISO10W100")
  923. {//{10, 4, {5,2,1,2}},//SHORTDASH_DOT_LINE,10//画点线
  924. ikmhandle=SHORTDASH_DOT_LINE;
  925. dkmlinescale=2;
  926. dkmlinescale=((double)5)/((double)12);
  927. }
  928. else if(strName=="ACAD_ISO11W100")
  929. {//{11,6, {5,2,5,2,1,2}},//DDASH_DOT_LINE,11//双画单点线
  930. ikmhandle=DDASH_DOT_LINE;
  931. dkmlinescale=2;
  932. dkmlinescale=((double)5)/((double)12);
  933. }
  934. else if(strName=="ACAD_ISO12W100")
  935. {//{12,6, {5,2,1,2,1,2}},//SDASH_DDOT_LINE,12//画双点划线
  936. ikmhandle=SDASH_DDOT_LINE;
  937. dkmlinescale=2;
  938. dkmlinescale=((double)5)/((double)12);
  939. }
  940. else if(strName=="ACAD_ISO13W100")
  941. {//{13,8, {5,2,5,2,1,2,1,2}},//DDASH_DDOT_LINE,13//双画双点线
  942. ikmhandle=DDASH_DDOT_LINE;
  943. dkmlinescale=2;
  944. dkmlinescale=((double)5)/((double)12);
  945. }
  946. else if(strName=="ACAD_ISO14W100")
  947. {//{5, 8, {10,2,1,2,1,2,1,2}},//DASH_TRIDOT_LINE,5//三点画线
  948. ikmhandle=DASH_TRIDOT_LINE;
  949. dkmlinescale=1.2;
  950. dkmlinescale=((double)10)/((double)12);
  951. }
  952. else if(strName=="ACAD_ISO15W100")
  953. {//{15,10,{5,2,5,2,1,2,1,2,1,2}},//DDASH_TRIDOT_LINE
  954. ikmhandle=DDASH_TRIDOT_LINE;
  955. dkmlinescale=2;
  956. dkmlinescale=((double)5)/((double)12);
  957. }
  958. else if(adtb->ltype.numlinetypesegs==0)
  959. {
  960. ikmhandle=SOLID_LINE;
  961. dkmlinescale=1.0;
  962. }
  963. else
  964. {
  965. int iBlankNum=0;
  966. int iDotNum=0;
  967. for(short i=0;i<adtb->ltype.numlinetypesegs;i++)
  968. {
  969. if(adtb->ltype.segdata[i].val<0)
  970. {
  971. iBlankNum++;
  972. continue;
  973. }
  974. if(adtb->ltype.segdata[i].val<1)
  975. {
  976. iDotNum++;
  977. continue;
  978. }
  979. }
  980. if(iBlankNum==0)
  981. {
  982. ikmhandle=SOLID_LINE;
  983. dkmlinescale=1.0;
  984. }
  985. else
  986. {
  987. //adtb->ltype.numlinetypesegs!=0
  988. dkmlinescale=(adtb->ltype.numlinetypesegs/adtb->ltype.patternlength);
  989. switch(iDotNum)
  990. {
  991. case 0:
  992. ikmhandle=DASHED_LINE;
  993. break;
  994. case 1:
  995. if(iBlankNum<3)
  996. {
  997. ikmhandle=SHORTDASH_DOT_LINE;
  998. }
  999. else
  1000. {
  1001. ikmhandle=DDASH_DOT_LINE;
  1002. }
  1003. break;
  1004. case 2:
  1005. if(iBlankNum<5)
  1006. {
  1007. ikmhandle=SDASH_DDOT_LINE;
  1008. }
  1009. else
  1010. {
  1011. ikmhandle=DDASH_DDOT_LINE;
  1012. }
  1013. break;
  1014. default:
  1015. if(iBlankNum<7)
  1016. {
  1017. ikmhandle=SDASH_TRIDOT_LINE;
  1018. }
  1019. else
  1020. {
  1021. ikmhandle=DDASH_TRIDOT_LINE;
  1022. }
  1023. break;
  1024. }
  1025. }
  1026. }
  1027. m_altype.Add(adtb->ltype.objhandle,ikmhandle,dkmlinescale,(short)i);
  1028. _WRITE(str.Format("线形:%s描述:%s转换为%d线形比例:%f",adtb->ltype.name,adtb->ltype.text,ikmhandle,dkmlinescale));
  1029. }
  1030. _WRITE(str="_________结束转换线形");
  1031. return TRUE;
  1032. }
  1033. BOOL CDwgReader::processplotstyle(AD_DB_HANDLE dwghandle)
  1034. {
  1035. return TRUE;
  1036. }
  1037. //函数功能:
  1038. // 分析AutoCAD的层数据,转换为KmCAD的层数据,并记录到层匹配链表中.
  1039. //函数说明:
  1040. // 使用以下函数遍历AutoCAD线型数据:
  1041. // adStartLayerGet:开始获得AutoCAD层的数据.
  1042. // adNumLayers:获得AutoCAD层的数目.
  1043. // GetLayer:获得AutoCAD的指定层的数据.
  1044. // 使用以下辅助函数分析AutoCAD的层的数据.
  1045. // adGetLayerState:分析AutoCAD层的状态.
  1046. //输入参数:
  1047. // AD_DB_HANDLE dwghandle:AutoCAD文件句柄.
  1048. BOOL CDwgReader::processlayer(AD_DB_HANDLE dwghandle)
  1049. {
  1050. _WRITE(str="_________开始转换层");
  1051. //short adStartLayerGet (AD_DB_HANDLE handle);
  1052. sReturnValue=adStartLayerGet(dwghandle);
  1053. if(sReturnValue!=1)
  1054. {
  1055. _ERROR;
  1056. return FALSE;
  1057. }
  1058. //long adNumLayers (AD_DB_HANDLE handle);
  1059. for(long i=0;i<adNumLayers(dwghandle);i++) 
  1060. {
  1061. //short adGetLayer (AD_DB_HANDLE handle, PAD_LAY adlay);
  1062. sReturnValue=adGetLayer(dwghandle,&adtb->lay);
  1063. if(sReturnValue!=1)
  1064. {
  1065. _ERROR;
  1066. return FALSE;
  1067. }
  1068. if(adtb->lay.purgedflag==1)
  1069. {
  1070. continue;
  1071. }
  1072. char on,frozen,vpfrozen,locked;
  1073. //short adGetLayerState (AD_DB_HANDLE handle, AD_OBJHANDLE layhandle, char *on, char *frozen, char *vpfrozen, char *locked);
  1074. sReturnValue=adGetLayerState(dwghandle,adtb->lay.objhandle,&on,&frozen,&vpfrozen,&locked);
  1075. if(sReturnValue!=1)
  1076. {
  1077. _ERROR;
  1078. return FALSE;
  1079. }
  1080. BOOL bon,bfrozen;
  1081. if(on==1)
  1082. {
  1083. bon=TRUE;
  1084. }
  1085. else
  1086. {
  1087. bon=FALSE;
  1088. }
  1089. if(frozen==1)
  1090. {
  1091. bfrozen=TRUE;
  1092. }
  1093. else
  1094. {
  1095. bfrozen=FALSE;
  1096. }
  1097. short color=adtb->lay.color;
  1098. if(!bon)
  1099. {
  1100. color=~color+1;
  1101. }
  1102. short width=adtb->lay.lineweight;
  1103. {
  1104. if((unsigned short)width==AD_WEIGHT_DEFAULT)
  1105. {
  1106. width=m_ilinewidthdefault;
  1107. }
  1108. else if((unsigned short)width==AD_WEIGHT_BYBLOCK)
  1109. {
  1110. width=LWIDTH_BYBLOCK;
  1111. }
  1112. else if((unsigned short)width==AD_WEIGHT_BYLAYER)
  1113. {
  1114. width=LWIDTH_BYLAYER;
  1115. }
  1116. else
  1117. {
  1118. width=::GetLineWidthAsInt(double(abs(width))/100.0);
  1119. }
  1120. }
  1121. int itype;double lscale;
  1122. m_altype.Get(adtb->lay.linetypeobjhandle,itype,lscale);
  1123. int icolor=0;
  1124. if(color>=0&&color<m_aColor.GetSize())
  1125. {
  1126. icolor=m_aColor[color];
  1127. }
  1128. int iwidth=(int)width;
  1129. if(m_dplotstyleconvmode==1)
  1130. {
  1131. UsePlotStyle(adtb->lay.color,iwidth,icolor,itype,lscale,adtb->lay.plotstyleobjhandle,0);
  1132. }
  1133. UINT dwKmID=m_pConverter->ConverterEnthead_Layer(bon,bfrozen,adtb->lay.name,icolor,iwidth,itype);
  1134. m_alayer.Add(adtb->lay.objhandle,dwKmID,lscale,FALSE);
  1135. _WRITE(str.Format("层:%s转换为%u",adtb->lay.name,dwKmID));
  1136. }
  1137. m_pConverter->SaveLayerStatus();
  1138. _WRITE(str="_________结束转换层");
  1139. return TRUE;
  1140. }
  1141. //函数功能:
  1142. // 分析AutoCAD的块数据,转换为KmCAD的块数据,并记录到块匹配链表中.
  1143. //函数说明:
  1144. // 块实体中的第一个实体是AD_ENT_BLOCK,记录了块定义的信息,最后一个实体是AD_ENT_ENDBLK标志块的结束.
  1145. // 使用以下函数遍历AutoCAD块定义:
  1146. // adStartBlockheaderGet:开始获得AutoCAD中的块的数据.
  1147. // adGetBlockheader:获得AutoCAD块的数据头.
  1148. // 使用以下函数遍历AutoCAD块中的实体的定义:
  1149. // adStartEntityGet:开始获得AutoCAD块中的实体的数据.
  1150. // adGetEntity:获得AutoCAD块中指定实体的数据.
  1151. //输入参数:
  1152. // AD_DB_HANDLE dwghandle:AutoCAD文件句柄.
  1153. BOOL CDwgReader::processblockdefine(AD_DB_HANDLE dwghandle)
  1154. {
  1155. _WRITE(str="_________开始转换块定义");
  1156. //short adStartBlockheaderGet (AD_DB_HANDLE handle);
  1157. sReturnValue=adStartBlockheaderGet(dwghandle);
  1158. if(sReturnValue!=1)
  1159. {
  1160. _ERROR;
  1161. return FALSE;
  1162. }
  1163. BOOL bRef;
  1164. //long adNumBlockheaders (AD_DB_HANDLE handle);
  1165. for(long i=0; i<adNumBlockheaders(dwghandle);i++) // note --无0 -2 so we don't get the model and paperspace blocks
  1166. {
  1167. bRef=FALSE;
  1168. //short adGetBlockheader (AD_DB_HANDLE handle, PAD_BLKH adblkh);
  1169. sReturnValue=adGetBlockheader(dwghandle,&adtb->blkh);
  1170. if(sReturnValue!=1)
  1171. {
  1172. _ERROR;
  1173. return FALSE;
  1174. }
  1175. if(adtb->blkh.purgedflag==1)
  1176. {
  1177. continue;
  1178. }
  1179. CString strName(adtb->blkh.name);
  1180. strName.MakeLower();
  1181. if(strName=="*model_space")
  1182. {
  1183. continue;
  1184. }
  1185. if(strName=="*paper_space")
  1186. {
  1187. continue;
  1188. }
  1189. if(m_apaper.IsInList(adtb->blkh.objhandle))
  1190. {
  1191. continue;
  1192. }
  1193. if(adtb->blkh.flag&AD_BLOCK_XREF)
  1194. {
  1195. continue;
  1196. }
  1197. UINT dwKmID=m_pConverter->ConverterEnthead_Blockdefine(adtb->blkh.name,adtb->blkh.description);
  1198. _WRITE(str.Format("块:%s描述:%s转换为块%u",adtb->blkh.name,adtb->blkh.description,dwKmID));
  1199. m_ablock.Add(adtb->blkh.objhandle,dwKmID,1.0,bRef);
  1200. }
  1201. _WRITE(str="_________结束转换块定义");
  1202. return TRUE;
  1203. }
  1204. BOOL CDwgReader::processlinescale(AD_DB_HANDLE dwghandle)
  1205. {
  1206. return TRUE;
  1207. }
  1208. BOOL CDwgReader::processobject(AD_DB_HANDLE dwghandle)
  1209. {
  1210. _WRITE(str="_________开始转换物体");
  1211. //short adStartObjectGet (AD_DB_HANDLE handle);
  1212. sReturnValue=adStartObjectGet(dwghandle);
  1213. if(sReturnValue!=1)
  1214. {
  1215. _ERROR;
  1216. return FALSE;
  1217. }
  1218. //short adGetObject(AD_DB_HANDLE handle, PAD_OBJ_HDR adobhd, PAD_OBJ adob);
  1219. while(adGetObject(dwghandle,adobhd,adob))
  1220. {
  1221. //#define AD_OBJ_CLASS      34
  1222. //#define AD_OBJ_PROXY     100
  1223. //#define AD_OBJ_XRECORD   101
  1224. switch(adobhd->objtype)
  1225. {
  1226. case AD_OBJ_DICTIONARY:
  1227. {
  1228. PAD_BLOB_CTRL bcptr;
  1229. AD_DICITEM dicitem;
  1230. if(adob->dic.numdicitems>0L) 
  1231. {
  1232. bcptr=adStartBlobRead(adob->dic.itemblob);
  1233. for(int i=0; i<adob->dic.numdicitems; i++) 
  1234. {
  1235. adReadDicItem(bcptr,&dicitem);
  1236. }
  1237. adEndBlobRead(bcptr);
  1238. }
  1239. }
  1240. break;
  1241. case AD_OBJ_MLINESTYLE:
  1242. processobject_mlinestyle(dwghandle);
  1243. break;
  1244. case AD_OBJ_GROUP:
  1245. break;
  1246. default:// others are proxys 
  1247. if(adobhd->objtype==adObjectptrObjtype(dwghandle))
  1248. {
  1249. _WRITE(str="Objptr没有处理");
  1250. }
  1251. else if(adobhd->objtype==adPlaceholderObjtype(dwghandle))
  1252. {
  1253. _WRITE(str="Placehold没有处理");
  1254. }
  1255. else if(adobhd->objtype==adSortentstableObjtype(dwghandle))
  1256. {
  1257. _WRITE(str="Sortents没有处理");
  1258. }
  1259. else if(adobhd->objtype==adSpatialindexObjtype(dwghandle))
  1260. {
  1261. _WRITE(str="Spaindex没有处理");
  1262. }
  1263. else if(adobhd->objtype==adVbaProjectObjtype(dwghandle))
  1264. {
  1265. _WRITE(str="VbaProj没有处理");
  1266. }
  1267. else if(adobhd->objtype==adWipeoutVariablesObjtype(dwghandle))
  1268. {
  1269. _WRITE(str="WipeoutVar没有处理");
  1270. }
  1271. else if(adobhd->objtype==adLayoutObjtype(dwghandle))
  1272. {
  1273. processobject_layout(dwghandle);
  1274. }
  1275. else if(adobhd->objtype==adLayerindexObjtype(dwghandle))
  1276. {
  1277. _WRITE(str="LayerIndex没有处理");
  1278. }
  1279. else if(adobhd->objtype==adDictionarywdfltObjtype(dwghandle))
  1280. {
  1281. _WRITE(str="Dicwdflt没有处理");
  1282. {
  1283. PAD_BLOB_CTRL bcptr;
  1284. AD_DICITEM dicitem;
  1285. if(adob->dictionarywdflt.numitems>0L) 
  1286. {
  1287. bcptr=adStartBlobRead(adob->dictionarywdflt.itemblob);
  1288. for(int i=0; i<adob->dictionarywdflt.numitems; i++) 
  1289. {
  1290. adReadDicItem(bcptr,&dicitem);
  1291. m_aplot.Add(dicitem.itemhandle,dicitem.str);
  1292. }
  1293. adEndBlobRead(bcptr);
  1294. }
  1295. }
  1296. }
  1297. //short adXrecordObjtype(AD_DB_HANDLE handle);
  1298. else if(adobhd->objtype==adXrecordObjtype(dwghandle))
  1299. {
  1300. _WRITE(str="Xrecord没有处理");
  1301. }
  1302. //short adIdbufferObjtype(AD_DB_HANDLE handle);
  1303. else if(adobhd->objtype==adIdbufferObjtype(dwghandle))
  1304. {
  1305. _WRITE(str="Idbuffer没有处理");
  1306. }
  1307. else if (adobhd->objtype==adDictionaryvarObjtype(dwghandle))
  1308. {
  1309. _WRITE(str="DictionaryvarObjtype没有处理");
  1310. }
  1311. else if (adobhd->objtype==adImagedefreactorObjtype(dwghandle))
  1312. {
  1313. _WRITE(str="IMAGEDEFReactor没有处理");
  1314. }
  1315. else if (adobhd->objtype==adImagedefObjtype(dwghandle))
  1316. {
  1317. _WRITE(str="IMAGEDEFObjtype没有处理");
  1318. }
  1319. else if (adobhd->objtype==adRastervariablesObjtype(dwghandle))
  1320. {
  1321. _WRITE(str="RASTERVARIABLES没有处理");
  1322. }
  1323. else if (adobhd->objtype==adSpatialfilterObjtype(dwghandle))
  1324. {
  1325. _WRITE(str="SPATIAL_FILTER OBJECT没有处理");
  1326. }
  1327. else if (AD_IS_A_GENERIC_PROXYOBJ(adobhd->objtype))
  1328. {
  1329. _WRITE(str="GENERIC PROXY OBJECT没有处理");
  1330. }
  1331. else
  1332. {
  1333. _WRITE(str="未知类型的OBJECT没有处理");
  1334. }
  1335. /*  AD_DIC        dic;
  1336.   AD_DICTIONARYVAR  dictionaryvar;
  1337.   AD_GRP        grp;
  1338.   AD_IDBUFFER   idbuffer;
  1339.   AD_IMAGEDEF   imagedef;
  1340.   AD_IMAGEDEFREACTOR imagedefreactor;
  1341.   AD_MLSTYLE    mlstyle;
  1342.   AD_PROXYOBJ   proxyobj;
  1343.   AD_RASTERVARIABLES rastervariables;
  1344.   AD_SORTENTSTABLE sortentstable;
  1345.   AD_SPATIALFILTER   spatialfilter;
  1346.   AD_XRECORD    xrecord;
  1347.   AD_OBJECTPTR  objectptr;
  1348.   AD_LAYERINDEX layerindex;
  1349.   AD_SPATIALINDEX spatialindex;
  1350.   AD_PLOTSETTINGS plotsettings;
  1351.   AD_DICTIONARYWDFLT dictionarywdflt;
  1352.   AD_PLACEHOLDER placeholder;
  1353.   AD_LAYOUT layout;
  1354.   AD_VBAPROJECT vbaproject;
  1355.   AD_WIPEOUTVARIABLES wipeoutvariables;
  1356. AD_DIMASSOC dimassoc;
  1357. */
  1358. break;
  1359. }
  1360.     }
  1361. _WRITE(str="_________结束转换物体");
  1362. return TRUE;
  1363. }
  1364. BOOL CDwgReader::processblockdefineobjs(AD_DB_HANDLE dwghandle,BOOL bref)
  1365. {
  1366. _WRITE(str="_________开始转换块定义中的实体");
  1367. sReturnValue=adStartBlockheaderGet(dwghandle);
  1368. if(sReturnValue!=1)
  1369. {
  1370. _ERROR;
  1371. return FALSE;
  1372. }
  1373. //long adNumBlockheaders (AD_DB_HANDLE handle);
  1374. for(long i=0; i<adNumBlockheaders(dwghandle);i++) // note --无0 -2 so we don't get the model and paperspace blocks
  1375. {
  1376. //short adGetBlockheader (AD_DB_HANDLE handle, PAD_BLKH adblkh);
  1377. sReturnValue=adGetBlockheader(dwghandle,&adtb->blkh);
  1378. if(sReturnValue!=1)
  1379. {
  1380. _ERROR;
  1381. return FALSE;
  1382. }
  1383. if(adtb->blkh.purgedflag==1)
  1384. {
  1385. continue;
  1386. }
  1387. CString strName(adtb->blkh.name);
  1388. strName.MakeLower();
  1389. if(strName=="*model_space")
  1390. {
  1391. continue;
  1392. }
  1393. //if(strName=="*paper_space")
  1394. //{
  1395. // continue;
  1396. //}
  1397. if(m_apaper.IsInList(adtb->blkh.objhandle))
  1398. {
  1399. continue;
  1400. }
  1401. UINT id;
  1402. if(!m_ablock.Get(id,adtb->blkh.objhandle))
  1403. {
  1404. continue;
  1405. }
  1406. if(!m_pConverter->SetDataVessel(DATAVESSEL_BLOCKDEF,id))
  1407. {
  1408. _WRITE(str.Format("无法找到第%d号块定义",id));
  1409. return FALSE;
  1410. }
  1411. if((!(adtb->blkh.xrefindex==-1||adtb->blkh.xrefindex==0))
  1412. &&(!adtb->blkh.unloaded))
  1413. {
  1414. continue;
  1415. /*if(bref)
  1416. {
  1417. continue;
  1418. }
  1419. //short adStartEntityGet (AD_VMADDR list);
  1420. sReturnValue=adStartEntityGet(adtb->blkh.entitylist);
  1421. if(sReturnValue!=1)
  1422. {
  1423. _ERROR;
  1424. return FALSE;
  1425. }
  1426. if(adGetEntity(adtb->blkh.entitylist,adenhd,aden))
  1427. {
  1428. if(adenhd->enttype==AD_ENT_BLOCK)
  1429. {
  1430. AD_DB_HANDLE refhandle;
  1431. AD_OBJHANDLE handle;
  1432. AD_BLKH blkh;
  1433. //AD_DB_HANDLE adGetXrefDbHandle(AD_DB_HANDLE main, void *filename);
  1434. //refhandle=adGetXrefDbHandle(dwghandle,aden->block.xrefpath);
  1435. //if(refhandle[0]==0&&refhandle[1]==0&&refhandle[2]==0&&refhandle[3]==0&&refhandle[4]==0&&refhandle[5]==0&&refhandle[6]==0&&refhandle[7]==0)
  1436. //{
  1437. // continue;
  1438. //}
  1439. //short adGetBlockHandle (AD_DB_HANDLE handle, AD_OBJHANDLE handle, short type);
  1440. sReturnValue=adGetBlockHandle(refhandle,handle,AD_MODELSPACE_HANDLE);
  1441. if(sReturnValue!=1)
  1442. {
  1443. _ERROR;
  1444. continue;
  1445. }
  1446. //short adSeekBlockheader (AD_DB_HANDLE handle, AD_OBJHANDLE thehandle, PAD_BLKH adblkh);
  1447. sReturnValue=adSeekBlockheader(refhandle,handle,&blkh);
  1448. if(sReturnValue!=1)
  1449. {
  1450. _ERROR;
  1451. continue;
  1452. }
  1453. //short adStartEntityGet (AD_VMADDR list);
  1454. sReturnValue=adStartEntityGet(blkh.entitylist);
  1455. if(sReturnValue!=1)
  1456. {
  1457. _ERROR;
  1458. continue;
  1459. }
  1460. //short adGetEntity (AD_VMADDR list,PAD_ENT_HDR adenhd,PAD_ENT aden);
  1461. while(adGetEntity(blkh.entitylist,adenhd,aden))
  1462. {
  1463. if(adenhd->enttype==AD_ENT_ENDBLK)
  1464. {
  1465. break;
  1466. }
  1467. if(adenhd->enttype==AD_ENT_POLYLINE)
  1468. {
  1469. if(!processentity_polyline(dwghandle,adtb->blkh.entitylist))
  1470. {
  1471. _WRITE("转换多段线时发生错误");
  1472. }
  1473. }
  1474. if(!processentity(refhandle))
  1475. {
  1476. _WRITE(str.Format("转换模型空间的实体%x%x%x%x%x%x%x%x失败",adenhd->enthandle[0],adenhd->enthandle[1],adenhd->enthandle[2],adenhd->enthandle[3],adenhd->enthandle[4],adenhd->enthandle[5],adenhd->enthandle[6],adenhd->enthandle[7]));
  1477. continue;
  1478. }
  1479. }
  1480. }
  1481. }
  1482. continue;*/
  1483. }
  1484. //short adStartEntityGet (AD_VMADDR list);
  1485. sReturnValue=adStartEntityGet(adtb->blkh.entitylist);
  1486. if(sReturnValue!=1)
  1487. {
  1488. _ERROR;
  1489. return FALSE;
  1490. }
  1491. //short adGetEntity (AD_VMADDR list,PAD_ENT_HDR adenhd,PAD_ENT aden);
  1492. while(adGetEntity(adtb->blkh.entitylist,adenhd,aden))
  1493. {
  1494. if(adenhd->enttype==AD_ENT_ENDBLK)
  1495. {
  1496. break;
  1497. }
  1498. if(adenhd->enttype==AD_ENT_POLYLINE)
  1499. {
  1500. if(!processentity_polyline(dwghandle,adtb->blkh.entitylist))
  1501. {
  1502. _WRITE("转换多段线时发生错误");
  1503. }
  1504. }
  1505. if(!processentity(dwghandle))
  1506. {
  1507. _WRITE(str.Format("转换块定义中的实体%x%x%x%x%x%x%x%x失败",adenhd->enthandle[0],adenhd->enthandle[1],adenhd->enthandle[2],adenhd->enthandle[3],adenhd->enthandle[4],adenhd->enthandle[5],adenhd->enthandle[6],adenhd->enthandle[7]));
  1508. continue;
  1509. }
  1510. }
  1511. }
  1512. _WRITE(str="_________结束转换块定义中的实体");
  1513. return TRUE;
  1514. }
  1515. BOOL CDwgReader::processmodalentity(AD_DB_HANDLE dwghandle,CStringArray *pstrSpaceNames,CStringArray *pstrSpaceFiles)
  1516. {
  1517. _WRITE(str="_________开始转换模型空间的实体");
  1518. AD_OBJHANDLE handle;
  1519. //short adGetBlockHandle (AD_DB_HANDLE handle, AD_OBJHANDLE handle, short type);
  1520. sReturnValue=adGetBlockHandle(dwghandle,handle,AD_MODELSPACE_HANDLE);
  1521. if(sReturnValue!=1)
  1522. {
  1523. _ERROR;
  1524. return FALSE;
  1525. }
  1526. if(!m_pConverter->SetDataVessel(DATAVESSEL_MODELSPACE,0))
  1527. {
  1528. return FALSE;
  1529. }
  1530. //AD_VMADDR adEntityList (AD_DB_HANDLE handle, AD_OBJHANDLE whichblk);
  1531. adtb->blkh.entitylist=adEntityList(dwghandle,handle);
  1532. //short adStartEntityGet (AD_VMADDR list);
  1533. sReturnValue=adStartEntityGet(adtb->blkh.entitylist);
  1534. if(sReturnValue!=1)
  1535. {
  1536. _ERROR;
  1537. return FALSE;
  1538. }
  1539. //short adGetEntity (AD_VMADDR list,PAD_ENT_HDR adenhd,PAD_ENT aden);
  1540. while(adGetEntity(adtb->blkh.entitylist,adenhd,aden))
  1541. {
  1542. if(adenhd->enttype==AD_ENT_ENDBLK)
  1543. {
  1544. break;
  1545. }
  1546. if(adenhd->enttype==AD_ENT_POLYLINE)
  1547. {
  1548. if(!processentity_polyline(dwghandle,adtb->blkh.entitylist))
  1549. {
  1550. _WRITE("转换多段线时发生错误");
  1551. }
  1552. }
  1553. if(!processentity(dwghandle))
  1554. {
  1555. _WRITE(str.Format("转换模型空间的实体%x%x%x%x%x%x%x%x失败",adenhd->enthandle[0],adenhd->enthandle[1],adenhd->enthandle[2],adenhd->enthandle[3],adenhd->enthandle[4],adenhd->enthandle[5],adenhd->enthandle[6],adenhd->enthandle[7]));
  1556. continue;
  1557. }
  1558. }
  1559. CString strFileNameT=m_pCommand->m_strAimName;
  1560. //CStringArray *pstrSpaceNames,CStringArray *pstrSpaceFiles
  1561. if(pstrSpaceNames&&pstrSpaceFiles)
  1562. {
  1563. for(int i=0;i<pstrSpaceNames->GetSize();i++)
  1564. {
  1565. if(pstrSpaceNames->GetAt(i)=="模型空间")
  1566. {
  1567. if(i<pstrSpaceFiles->GetSize())
  1568. {
  1569. strFileNameT=pstrSpaceFiles->GetAt(i);
  1570. }
  1571. }
  1572. }
  1573. }
  1574. UINT utDimStyleReplace=(UINT)(-1);
  1575. if(!m_strDimStyleFullName.IsEmpty())
  1576. {
  1577. UINT utID=0;
  1578. if(m_adimstyle.Get(utID,m_hFirstDimStyle))
  1579. {
  1580. utDimStyleReplace=utID;
  1581. }
  1582. }
  1583. if(!m_pConverter->SaveAndReinitDataBase(utDimStyleReplace,strFileNameT))
  1584. {
  1585. _WRITE(str="保存模型空间文件时失败");
  1586. return FALSE;
  1587. }
  1588. _WRITE(str="_________结束转换模型空间中的实体");
  1589. return TRUE;
  1590. }
  1591. BOOL CDwgReader::processpaperentity(AD_DB_HANDLE dwghandle,CStringArray *pstrSpaceNames,CStringArray *pstrSpaceFiles)
  1592. {
  1593. _WRITE(str="_________开始转换纸区空间中的实体");
  1594. CMatch3* match;
  1595. CFileFind filefind;
  1596. POSITION pos=m_apaper.GetHeadPosition();
  1597. while(pos!=NULL)
  1598. {
  1599. match=m_apaper.GetNext(pos);
  1600. m_iCurPlotStyleTable=match->m_iplotsheet;
  1601. //short adSeekBlockheader (AD_DB_HANDLE handle, AD_OBJHANDLE thehandle, PAD_BLKH adblkh);
  1602. sReturnValue=adSeekBlockheader(dwghandle,match->m_handle,&adtb->blkh);
  1603. if(sReturnValue!=1)
  1604. {
  1605. _ERROR;
  1606. return FALSE;
  1607. }
  1608. if(!m_pConverter->SetDataVessel(DATAVESSEL_DATABASE,0))
  1609. {
  1610. return FALSE;
  1611. }
  1612. //short adStartEntityGet (AD_VMADDR list);
  1613. sReturnValue=adStartEntityGet(adtb->blkh.entitylist);
  1614. if(sReturnValue!=1)
  1615. {
  1616. _ERROR;
  1617. return FALSE;
  1618. }
  1619. BOOL bhaveviewportorentity=FALSE;
  1620. //short adGetEntity (AD_VMADDR list,PAD_ENT_HDR adenhd,PAD_ENT aden);
  1621. BOOL bFirst=TRUE;
  1622. while(adGetEntity(adtb->blkh.entitylist,adenhd,aden))
  1623. {
  1624. if(adenhd->enttype==AD_ENT_ENDBLK)
  1625. {
  1626. break;
  1627. }
  1628. if(adenhd->enttype==AD_ENT_VIEWPORT)
  1629. {
  1630. if(bFirst)
  1631. {
  1632. bFirst=FALSE;
  1633. continue;
  1634. }
  1635. if(!processentity_viewport(dwghandle))
  1636. {
  1637. _WRITE(str="转换一个视口失败");
  1638. }
  1639. else
  1640. {
  1641. bhaveviewportorentity=TRUE;
  1642. }
  1643. }
  1644. if(adenhd->enttype!=AD_ENT_BLOCK)
  1645. {
  1646. if(adenhd->enttype!=AD_ENT_VIEWPORT)
  1647. {
  1648. bhaveviewportorentity=TRUE;
  1649. }
  1650. }
  1651. if(adenhd->enttype==AD_ENT_POLYLINE)
  1652. {
  1653. if(!processentity_polyline(dwghandle,adtb->blkh.entitylist))
  1654. {
  1655. _WRITE("转换多段线时发生错误");
  1656. }
  1657. }
  1658. if(!processentity(dwghandle))
  1659. {
  1660. _WRITE(str.Format("转换块定义中的实体%x%x%x%x%x%x%x%x失败",adenhd->enthandle[0],adenhd->enthandle[1],adenhd->enthandle[2],adenhd->enthandle[3],adenhd->enthandle[4],adenhd->enthandle[5],adenhd->enthandle[6],adenhd->enthandle[7]));
  1661. continue;
  1662. }
  1663. }
  1664. if(!bhaveviewportorentity)
  1665. {
  1666. continue;
  1667. }
  1668. int index2=1;
  1669. CString strfilename=m_pCommand->m_strAimName;
  1670. CString strfileext=strfilename.Right(4);
  1671. strfilename=strfilename.Left(strfilename.GetLength()-4);
  1672. strfilename+="_"+match->m_layeroutname;
  1673. CString strfilename2=strfilename+strfileext;
  1674. int index=1;
  1675. CString strTemp;
  1676. while(filefind.FindFile((LPCTSTR)strfilename2))
  1677. {
  1678. strTemp.Format("#%d",index);
  1679. strfilename2=strfilename+strTemp+strfileext;
  1680. index++;
  1681. }
  1682. CString strFileNameT=strfilename2;
  1683. //CStringArray *pstrSpaceNames,CStringArray *pstrSpaceFiles
  1684. if(pstrSpaceNames&&pstrSpaceFiles)
  1685. {
  1686. for(int i=0;i<pstrSpaceNames->GetSize();i++)
  1687. {
  1688. if(pstrSpaceNames->GetAt(i)==match->m_layeroutname)
  1689. {
  1690. if(i<pstrSpaceFiles->GetSize())
  1691. {
  1692. strFileNameT=pstrSpaceFiles->GetAt(i);
  1693. }
  1694. }
  1695. }
  1696. }
  1697. UINT utDimStyleReplace=(UINT)(-1);
  1698. if(!m_strDimStyleFullName.IsEmpty())
  1699. {
  1700. UINT utID=0;
  1701. if(m_adimstyle.Get(utID,m_hFirstDimStyle))
  1702. {
  1703. utDimStyleReplace=utID;
  1704. }
  1705. }
  1706. if(!m_pConverter->SaveAndReinitDataBase(utDimStyleReplace,strFileNameT,FALSE))
  1707. {
  1708. _WRITE(str="保存纸区空间文件时失败");
  1709. filefind.Close();
  1710. return FALSE;
  1711. }
  1712. }
  1713. _WRITE(str="_________结束转换纸区空间中的实体");
  1714. filefind.Close();
  1715. return TRUE;
  1716. }
  1717. //注意 OpenDwg将文字样式与形混为一起.
  1718. BOOL CDwgReader::processshapefile(AD_DB_HANDLE dwghandle)
  1719. {
  1720. calculate_findfonts(&g_afont);
  1721. #ifdef _DEBUG
  1722. // for(int index=0;index<m_afont.GetCount();index++)
  1723. // {
  1724. // m_afont.GetStartPosition();
  1725. // m_afont.GetNextAssoc(.HashKey()
  1726. // }
  1727. #endif
  1728. _WRITE(str="_________开始转换形文件");
  1729. //short adStartShapefileGet (AD_DB_HANDLE handle);
  1730. sReturnValue=adStartShapefileGet(dwghandle);
  1731. if(sReturnValue!=1)
  1732. {
  1733. _ERROR;
  1734. return FALSE;
  1735. }
  1736. //long adNumShapefiles (AD_DB_HANDLE handle);
  1737. for(long i=0;i<adNumShapefiles(dwghandle);i++)
  1738. {
  1739. BOOL bUseSHX=FALSE;
  1740. //short adGetShapefile (AD_DB_HANDLE handle, PAD_SHPTB adshptb);
  1741. sReturnValue=adGetShapefile(dwghandle,&adtb->shptb);
  1742. if(adtb->shptb.flag&AD_SHAPEFILE_SHAPES)//形,不是形字体
  1743. {
  1744. continue;
  1745. }
  1746. if(sReturnValue!=1)
  1747. {
  1748. _ERROR;
  1749. return FALSE;
  1750. }
  1751. if(adtb->shptb.purgedflag==1)
  1752. {
  1753. continue;
  1754. }
  1755. //========================================================
  1756. //new shape
  1757. //========================================================
  1758. //1.读出扩展数据.
  1759. CString strTempFontName;
  1760. CShape* shape=new CShape;
  1761. if(adtb->shptb.xdblob!=AD_VMNULL)
  1762. {
  1763. PAD_BLOB_CTRL bcptr;
  1764. bcptr=adStartBlobRead(adtb->shptb.xdblob);
  1765. while(adReadExtendeddata(bcptr,adxd)) 
  1766. {
  1767. if(adxd->xddxfnumber==1000)
  1768. {
  1769. strTempFontName=adxd->xddata.xdstring;//ttf字体的名称
  1770. }
  1771. else if (adxd->xddxfnumber==1071)
  1772. {
  1773. shape->m_lShapeCapacity=adxd->xddata.xdlong;
  1774. }
  1775. }
  1776. adEndBlobRead(bcptr);
  1777. }
  1778. shape->m_strShapename=adtb->shptb.name;
  1779. //2.分析文件名
  1780. {
  1781. CString strfilename=adtb->shptb.file;
  1782. //2.1 文件名为空,数据在扩展数据中.
  1783. if(strfilename.IsEmpty())
  1784. {
  1785. bUseSHX=FALSE;
  1786. }
  1787. else if(strfilename.Find('.')!=-1)
  1788. {//2.2 有扩展名,则依扩展名判断
  1789. if(strfilename.GetLength()<=4)
  1790. {
  1791. bUseSHX=FALSE;
  1792. }
  1793. else
  1794. {
  1795. CString strExt=strfilename.Right(4);
  1796. strExt.MakeLower();
  1797. if(strExt==".shx")
  1798. {
  1799. bUseSHX=TRUE;
  1800. }
  1801. else
  1802. {
  1803. bUseSHX=FALSE;
  1804. }
  1805. }
  1806. }
  1807. else
  1808. {//2.3 没有扩展名则智能判断.
  1809. //strfilename.MakeLower();
  1810. try
  1811. {
  1812. void* pv = NULL;
  1813. if (g_afont.Lookup(strfilename, pv)) // found it
  1814. {
  1815. bUseSHX=FALSE;
  1816. }
  1817. else
  1818. {
  1819. strfilename+=".shx";
  1820. bUseSHX=TRUE;
  1821. }
  1822. // CFont fonttext;
  1823. // if(fonttext.CreateFont(1000,0,0,0,0,FALSE,FALSE,0,DEFAULT_CHARSET,0,0,0,0,strfilename))
  1824. // {
  1825. // bUseSHX=FALSE;
  1826. // }
  1827. // else
  1828. // {
  1829. // strfilename+=".shx";
  1830. // bUseSHX=TRUE;
  1831. // }
  1832. }
  1833. catch(...)
  1834. {
  1835. strfilename+=".shx";
  1836. bUseSHX=TRUE;
  1837. }
  1838. }
  1839. if(bUseSHX)
  1840. {
  1841. if(!strfilename.IsEmpty())
  1842. {
  1843. calculate_DefaultExamineFile(strfilename,"fonts");
  1844. }
  1845. shape->m_strShapefilename=strfilename;
  1846. strfilename=adtb->shptb.bigfontname;
  1847. if(strfilename.IsEmpty())
  1848. {
  1849. //没有大字体.
  1850. }
  1851. else if(strfilename.GetLength()<4)//文字样式的形文件名都有后缀,只有txt出外,因此认为没有后缀则后缀为shx
  1852. {
  1853. strfilename+=".shx";
  1854. }
  1855. else
  1856. {
  1857. CString strExt=strfilename.Right(4);
  1858. strExt.MakeLower();
  1859. if(strExt!=".shx")
  1860. {
  1861. strfilename+=".shx";
  1862. }
  1863. }
  1864. if(!strfilename.IsEmpty())
  1865. {
  1866. calculate_DefaultExamineFile(strfilename,"fonts");
  1867. }
  1868. shape->m_strBigFontfilename=strfilename;
  1869. shape->m_bUseSHX=TRUE;
  1870. }
  1871. else
  1872. {
  1873. //解读字体文件,分析出字体名称.
  1874. if((!strfilename.IsEmpty())&&(strfilename.Find('.')!=-1))
  1875. {
  1876. if(strfilename.Find('\')==-1)
  1877. {
  1878. TCHAR szDirName[MAX_PATH];
  1879. if(::GetWindowsDirectory(szDirName,MAX_PATH))
  1880. {
  1881. CString strTemp=strfilename;
  1882. CString strDirName=szDirName;
  1883. strTemp=strDirName+"\Fonts\"+strTemp;
  1884. if(calculate_findfontname(strfilename,strTemp,strTemp))
  1885. {
  1886. if(!strTemp.IsEmpty())
  1887. {
  1888. strfilename=strTemp;
  1889. }
  1890. }
  1891. else if(!strTempFontName.IsEmpty())
  1892. {
  1893. strfilename=strTempFontName;
  1894. }
  1895. }
  1896. }
  1897. shape->m_strShapefilename=strfilename;
  1898. shape->m_strBigFontfilename.Empty();
  1899. shape->m_bUseSHX=FALSE;
  1900. }
  1901. else if(strTempFontName.IsEmpty())
  1902. {
  1903. shape->m_strShapefilename="txt.shx";
  1904. shape->m_strBigFontfilename="bzdft.shx";
  1905. shape->m_bUseSHX=TRUE;
  1906. }
  1907. }
  1908. }
  1909. if(shape->m_strShapefilename.IsEmpty())
  1910. {
  1911. shape->m_strShapefilename=strTempFontName;
  1912. }
  1913. shape->m_utShapeflag1=adtb->shptb.flag;
  1914. shape->m_utShapeflag2=adtb->shptb.flag2;
  1915. shape->m_dShapeAngle=adtb->shptb.angle*180/PI;
  1916. shape->m_dShapeHeight=adtb->shptb.height;
  1917. shape->m_dShapeWidth=adtb->shptb.width;
  1918. m_ashape.Add(adtb->shptb.objhandle,shape);
  1919. }
  1920. _WRITE(str="_________结束转换形文件");
  1921. return TRUE;
  1922. }
  1923. BOOL CDwgReader::processcodepage(AD_DB_HANDLE dwghandle)
  1924. {
  1925. PAD_DWGHDR dwghd;
  1926. dwghd=adHeaderPointer(dwghandle);
  1927. if(!dwghd)
  1928. {
  1929. _WRITE("文件头错误");
  1930. return TRUE;
  1931. }
  1932. m_pConverter->m_sCodePage=dwghd->dwgcodepage;
  1933. // unsigned short ch;
  1934. // short ch2;
  1935. // for(unsigned short index=0;index<0xffff;index++)
  1936. // {
  1937. // adUnicodeToCodePageChar(index,m_pConverter->m_sCodePage,&ch2);//936表示是中文
  1938. // _WRITE(str.Format("%xdt%xd",index,ch2));
  1939. // }
  1940. return TRUE;
  1941. }
  1942. BOOL CDwgReader::processdimstyle(AD_DB_HANDLE dwghandle)
  1943. {
  1944. BOOL bLoadedDimStyle=FALSE;
  1945. CDimStyle cdimstyle;
  1946. if(!m_strDimStyleFullName.IsEmpty())
  1947. {
  1948. CFileFind filefind;
  1949. if(filefind.FindFile(m_strDimStyleFullName))
  1950. {
  1951. if(cdimstyle.Load((LPCTSTR)m_strDimStyleFullName))
  1952. {
  1953. bLoadedDimStyle=TRUE;
  1954. }
  1955. }
  1956. }
  1957. //short adStartDimstyleGet (AD_DB_HANDLE handle);
  1958. sReturnValue=adStartDimstyleGet(dwghandle);
  1959. if(sReturnValue!=1)
  1960. {
  1961. _ERROR;
  1962. return FALSE;
  1963. }
  1964. //long adNumDimstyles(AD_DB_HANDLE handle);
  1965. for(short i=0; i<(short)adNumDimstyles(dwghandle); i++) 
  1966. {
  1967. //short adGetDimstyle (AD_DB_HANDLE handle, PAD_DIMSTYLE addimst);
  1968. sReturnValue=adGetDimstyle(dwghandle,&adtb->dimst);
  1969. if(sReturnValue!=1)
  1970. {
  1971. _ERROR;
  1972. continue;
  1973. }
  1974. if(i==0)
  1975. {
  1976. adHancpy(m_hFirstDimStyle,adtb->dimst.objhandle);
  1977. }
  1978. if(!adtb->dimst.purgedflag) 
  1979. {
  1980. //{调整尺寸样式
  1981. BOOL  bAdjusted=FALSE;
  1982. //文字高度调整
  1983. double dTextHeight=1.0;
  1984. //箭头大小调整
  1985. double dArrowSize=1.0;
  1986. //尺寸数值调整
  1987. double dDimValueRate=1.0;
  1988. //文字样式调整
  1989. UINT utWordStyle=((UINT)-1);
  1990. if(m_ddimstyleconvmode==2)
  1991. {
  1992. CShape* pShape=new CShape;
  1993. if(m_ashape.GetHead())
  1994. {
  1995. (*pShape)=(*m_ashape.GetHead());
  1996. }
  1997. {
  1998. sReturnValue=adStartBlockheaderGet(dwghandle);
  1999. if(sReturnValue!=1)
  2000. {
  2001. delete pShape;
  2002. _ERROR;
  2003. return FALSE;
  2004. }
  2005. AD_TB adtbtemp;
  2006. //遍历所有空间的所有的尺寸
  2007. //long adNumBlockheaders (AD_DB_HANDLE handle);
  2008. for(long j=0; j<adNumBlockheaders(dwghandle);j++) // note --无0 -2 so we don't get the model and paperspace blocks
  2009. {
  2010. //short adGetBlockheader (AD_DB_HANDLE handle, PAD_BLKH adblkh);
  2011. sReturnValue=adGetBlockheader(dwghandle,&adtbtemp.blkh);
  2012. if(sReturnValue!=1)
  2013. {
  2014. delete pShape;
  2015. _ERROR;
  2016. return FALSE;
  2017. }
  2018. if(adtbtemp.blkh.purgedflag==1)
  2019. {
  2020. continue;
  2021. }
  2022. //short adStartEntityGet (AD_VMADDR list);
  2023. sReturnValue=adStartEntityGet(adtbtemp.blkh.entitylist);
  2024. if(sReturnValue!=1)
  2025. {
  2026. delete pShape;
  2027. _ERROR;
  2028. return FALSE;
  2029. }
  2030. //short adGetEntity (AD_VMADDR list,PAD_ENT_HDR adenhd,PAD_ENT aden);
  2031. while(adGetEntity(adtbtemp.blkh.entitylist,adenhd,aden))
  2032. {
  2033. if(adenhd->enttype==AD_ENT_ENDBLK)
  2034. {
  2035. break;
  2036. }
  2037. if(adenhd->enttype==AD_ENT_DIMENSION)
  2038. {
  2039. BOOL bFirst=TRUE;
  2040. if(bFirst||((aden->dim.dimflag & '7')==AD_DIMTYPE_ROTATED))
  2041. {
  2042. if(!adHansame(aden->dim.blockheaderobjhandle,NULLOBJHANDLE))
  2043. {
  2044. if( adHansame(aden->dim.dimstyleobjhandle,adtb->dimst.objhandle)||adHansame(aden->dim.dimstyleobjhandle,NULLOBJHANDLE))
  2045. {
  2046. AD_BLKH adblkhtemp;
  2047. AD_ENT_HDR adenhdtemp;
  2048. AD_ENT adentemp;
  2049. sReturnValue=adSeekBlockheader(dwghandle,aden->dim.blockheaderobjhandle,&adblkhtemp);
  2050. if(sReturnValue!=1)
  2051. {
  2052. delete pShape;
  2053. _ERROR;
  2054. return FALSE;
  2055. }
  2056. //short adStartEntityGet (AD_VMADDR list);
  2057. sReturnValue=adStartEntityGet(adblkhtemp.entitylist);
  2058. if(sReturnValue!=1)
  2059. {
  2060. delete pShape;
  2061. _ERROR;
  2062. return FALSE;
  2063. }
  2064. BOOL bAdjustTexted=FALSE;
  2065. BOOL bAdjustArrowed=FALSE;
  2066. //{计算出调整系数
  2067. while(adGetEntity(adblkhtemp.entitylist,&adenhdtemp,&adentemp))
  2068. {
  2069. if(adenhdtemp.enttype==AD_ENT_ENDBLK)
  2070. {
  2071. break;
  2072. }
  2073. //文字高度调整
  2074. //尺寸数值调整
  2075. if((!bAdjustTexted)&&adenhdtemp.enttype==AD_ENT_TEXT)
  2076. {
  2077. {
  2078. CMatch5* pMatch;
  2079. if(m_ashape.Get(adentemp.text.tdata.shapefileobjhandle,pMatch))
  2080. {
  2081. (*pShape)=(*pMatch->m_shape);
  2082. }
  2083. pShape->m_strShapename="dim";
  2084. //pShape->m_strShapefilename=;
  2085. //pShape->m_strBigFontfilename=;
  2086. //pShape->m_lShapeCapacity=;
  2087. //pShape->m_utShapeflag1=;
  2088. //pShape->m_utShapeflag2=;
  2089. //pShape->m_dShapeAngle=;
  2090. //pShape->m_dShapeHeight=;
  2091. pShape->m_dShapeWidth=adentemp.text.tdata.widthfactor;
  2092. //pShape->m_bUseSHX=;
  2093. //pShape->m_KmWordStyleID=;
  2094. }
  2095. dTextHeight=adentemp.text.tdata.height;
  2096. if((aden->dim.dimflag & '7')==AD_DIMTYPE_ROTATED)
  2097. {
  2098. dDimValueRate=::atof(adentemp.text.textstr);
  2099. KmPoint p1(aden->dim.defpt2[0],aden->dim.defpt2[1]);
  2100. KmPoint p2(aden->dim.defpt3[0],aden->dim.defpt3[1]);
  2101. double dAngle=::standard(::rad_to_deg(aden->dim.dimrotang));
  2102. if(dAngle<45||(dAngle>135&&dAngle<225)||dAngle>315)
  2103. {//水平
  2104. try
  2105. {
  2106. dDimValueRate=fabs(dDimValueRate/(p1.x-p2.x));
  2107. }
  2108. catch(...)
  2109. {
  2110. }
  2111. }
  2112. else
  2113. {//垂直
  2114. try
  2115. {
  2116. dDimValueRate=fabs(dDimValueRate/(p1.y-p2.y));
  2117. }
  2118. catch(...)
  2119. {
  2120. }
  2121. }
  2122. bAdjustTexted=TRUE;
  2123. if(bAdjustArrowed)
  2124. {
  2125. break;
  2126. }
  2127. }
  2128. else
  2129. {
  2130. bFirst=FALSE;
  2131. }
  2132. }
  2133. if((!bAdjustTexted)&&adenhdtemp.enttype==AD_ENT_MTEXT)
  2134. {
  2135. {
  2136. CMatch5* pMatch;
  2137. if(m_ashape.Get(adentemp.mtext.shapefileobjhandle,pMatch))
  2138. {
  2139. (*pShape)=(*pMatch->m_shape);
  2140. }
  2141. pShape->m_strShapename="dim";
  2142. //pShape->m_strShapefilename=;
  2143. //pShape->m_strBigFontfilename=;
  2144. //pShape->m_lShapeCapacity=;
  2145. //pShape->m_utShapeflag1=;
  2146. //pShape->m_utShapeflag2=;
  2147. //pShape->m_dShapeAngle=;
  2148. //pShape->m_dShapeHeight=;
  2149. //pShape->m_dShapeWidth=adentemp.mtext.;
  2150. //pShape->m_bUseSHX=;
  2151. //pShape->m_KmWordStyleID=;
  2152. }
  2153. dTextHeight=adentemp.mtext.ht;
  2154. if((aden->dim.dimflag & '7')==AD_DIMTYPE_ROTATED)
  2155. {
  2156. if(adentemp.mtext.ldblob==AD_VMNULL)
  2157. {
  2158. dDimValueRate=::atof(adentemp.mtext.textstr);
  2159. }
  2160. else
  2161. {
  2162. continue;
  2163. }
  2164. KmPoint p1(aden->dim.defpt2[0],aden->dim.defpt2[1]);
  2165. KmPoint p2(aden->dim.defpt3[0],aden->dim.defpt3[1]);
  2166. double dAngle=::standard(::rad_to_deg(aden->dim.dimrotang));
  2167. if(dAngle<45||(dAngle>135&&dAngle<225)||dAngle>315)
  2168. {//水平
  2169. try
  2170. {
  2171. dDimValueRate=fabs(dDimValueRate/(p1.x-p2.x));
  2172. }
  2173. catch(...)
  2174. {
  2175. }
  2176. }
  2177. else
  2178. {//垂直
  2179. try
  2180. {
  2181. dDimValueRate=fabs(dDimValueRate/(p1.y-p2.y));
  2182. }
  2183. catch(...)
  2184. {
  2185. }
  2186. }
  2187. bAdjustTexted=TRUE;
  2188. if(bAdjustArrowed)
  2189. {
  2190. break;
  2191. }
  2192. }
  2193. else
  2194. {
  2195. bFirst=FALSE;
  2196. }
  2197. }
  2198. if((!bAdjustArrowed)&&adenhdtemp.enttype==AD_ENT_SOLID)
  2199. {
  2200. double dDistancePower2_bottom= (adentemp.solid.pt2[0]-adentemp.solid.pt0[0])*
  2201. (adentemp.solid.pt2[0]-adentemp.solid.pt0[0])+
  2202. (adentemp.solid.pt2[1]-adentemp.solid.pt0[1])*
  2203. (adentemp.solid.pt2[1]-adentemp.solid.pt0[1]);
  2204. double dDistancePower2_length= (adentemp.solid.pt1[0]-adentemp.solid.pt0[0])*
  2205. (adentemp.solid.pt1[0]-adentemp.solid.pt0[0])+
  2206. (adentemp.solid.pt1[1]-adentemp.solid.pt0[1])*
  2207. (adentemp.solid.pt1[1]-adentemp.solid.pt0[1]);
  2208. dArrowSize=sqrt(fabs(dDistancePower2_length-dDistancePower2_bottom/4));
  2209. bAdjustArrowed=TRUE;
  2210. if(bAdjustTexted)
  2211. {
  2212. break;
  2213. }
  2214. }
  2215. //箭头大小调整
  2216. }
  2217. //}
  2218. if(bAdjustTexted&&bAdjustArrowed)
  2219. {
  2220. bAdjusted=TRUE;
  2221. break;
  2222. }
  2223. }
  2224. }
  2225. }
  2226. }
  2227. }
  2228. if(bAdjusted)
  2229. {
  2230. break;
  2231. }
  2232. }
  2233. }
  2234. AD_OBJHANDLE objhandle;
  2235. adHancpy(objhandle,NULLOBJHANDLE);
  2236. m_ashape.Add(objhandle,pShape);
  2237. utWordStyle=pShape->m_KmWordStyleID;
  2238. }
  2239. if(bLoadedDimStyle)
  2240. {
  2241. /* CMatch5* match;
  2242. if(m_ashape.Get(adtb->dimst.shapefileobjhandle,match))
  2243. {
  2244. VARIANT var;
  2245. memset(&var,0,sizeof(VARIANT)); 
  2246. var.vt=VT_INT;var.intVal=match->m_shape->m_KmWordStyleID;
  2247. cdimstyle.SetDimStlVar(DIMTXSTY,var);
  2248. }*/
  2249. UINT id=m_pConverter->ConverterEnthead_Dimstyle(cdimstyle,bAdjusted,dTextHeight,dArrowSize,dDimValueRate,utWordStyle);
  2250. m_adimstyle.Add(adtb->dimst.objhandle,id,1.0,FALSE);
  2251. }
  2252. else
  2253. {
  2254. UINT id=m_pConverter->ConverterEnthead_Dimstyle(&adtb->dimst,m_aColor,m_ilinewidthdefault,m_ashape,bAdjusted,dTextHeight,dArrowSize,dDimValueRate,utWordStyle);
  2255. m_adimstyle.Add(adtb->dimst.objhandle,id,1.0,FALSE);
  2256. }
  2257. }
  2258. }
  2259. return TRUE;
  2260. }
  2261. BOOL CDwgReader::processnouseblock(AD_DB_HANDLE dwghandle)
  2262. {
  2263. return TRUE;
  2264. CMatch2* match;
  2265. POSITION pos=m_ablock.GetHeadPosition();
  2266. while(pos!=NULL)
  2267. {
  2268. match=m_ablock.GetNext(pos);
  2269. if(!m_pConverter->CheckNoUseBlock(match->m_id))
  2270. {
  2271. match->m_bUseful=FALSE;
  2272. }
  2273. }
  2274. return TRUE;
  2275. }