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

CAD

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "FileSwitch.h"
  3. #include "DwgReader.h"
  4. #include "KmSection.h"
  5. #include "Reader.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. extern CStdioFile g_CensorialFile; //监察转换进度的文件
  12. extern int g_mode;
  13. //////////////////////////////////////////////////////////////////////
  14. // 第一部分 转换框架
  15. // 实现DWG文件向KMG文件转换的流程.
  16. //////////////////////////////////////////////////////////////////////
  17. // 第一步 构造DWG文件分析器.
  18. // 第二步 打开文件分析器,使之处于开始转换状态.
  19. // 第三步 分析文件并调用转换器转换.
  20. // 第四步 关闭文件分析器,使之处于结束转换状态.
  21. // 第五步 析构DWG文件分析器.
  22. //////////////////////////////////////////////////////////////////////
  23. void CDwgReader::fn_loadometer(short spercent)
  24. {
  25. }
  26. //CString CDwgReader::m_strACADpath="";//AutoCAD文件搜索路径
  27. //第一步 构造文件分析器.
  28. CDwgReader::CDwgReader(CProgressInfo* pProgress,CCommandInfo* pCommand,CKmgConverter* pConverter)
  29. {//记录进度类指针,控制类指针,转换类指针.
  30. m_pProgress = pProgress; 
  31. m_pCommand = pCommand;  
  32. m_pConverter = pConverter;
  33. m_iCurPlotStyleTable = -1;
  34. m_iModelPlotStyleTable = -1;
  35. m_strDimStyleFullName = "";
  36. adHanclear(m_hFirstDimStyle);
  37. #ifdef _BAOJI_
  38. m_dTotalTxtHeight = 0.0;
  39. m_dwTextcount = 0;
  40. #endif
  41. }
  42. //第二步 打开文件分析器,使之处于开始转换状态.
  43. BOOL CDwgReader::BeginConvert()
  44. {
  45. _WRITE(str="ttDWG图形文件转换为KMG图形文件转换信息记录n");
  46. if(!allocateadptrs())
  47. {
  48. _WRITE(str="内存不足,无法启动转换服务");
  49. return FALSE;
  50. }
  51. _WRITE(str="成功启动转换服务,等待接受任务中...");
  52. return TRUE;
  53. }
  54. BOOL CDwgReader::allocateadptrs(void)
  55. {
  56. if((adhd=(PAD_DWGHDR)malloc(sizeof(AD_DWGHDR)))!=NULL) 
  57. {
  58. if((adenhd=(PAD_ENT_HDR)malloc(sizeof(AD_ENT_HDR)))!=NULL) 
  59. {
  60. if((aden=(PAD_ENT)malloc(sizeof(AD_ENT)))!=NULL) 
  61. {
  62. if((adtb=(PAD_TB)malloc(sizeof(AD_TB)))!=NULL) 
  63. {
  64. if((adxd=(PAD_XD)malloc(sizeof(AD_XD)))!=NULL) 
  65. {
  66. if((adobhd=(PAD_OBJ_HDR)malloc(sizeof(AD_OBJ_HDR)))!=NULL) 
  67. {
  68. if((adob=(PAD_OBJ)malloc(sizeof(AD_OBJ)))!=NULL) 
  69. {
  70. return TRUE;
  71. }
  72. free(adobhd);
  73. }
  74. free(adxd);
  75. }
  76. free(adtb);
  77. }
  78. free(aden);
  79. }
  80. free(adenhd);
  81. }
  82. free(adhd);
  83. }
  84. return FALSE;
  85. }
  86. void CDwgReader::freeadptrs(void)
  87. {
  88. free(adxd);
  89. free(adtb);
  90. free(aden);
  91. free(adenhd);
  92. free(adhd);
  93. free(adobhd);
  94. free(adob);
  95. try
  96. {
  97. for(int i=0;i<m_aPlotStyleTable.GetSize();i++)
  98. {
  99. //extern  short  ADCDECL adFreePlotStyleTable _((ADPLOTSTYLETABLE *pTable));
  100. sReturnValue=adFreePlotStyleTable(m_aPlotStyleTable[i]);
  101. if(sReturnValue!=1)
  102. {
  103. _WRITE2(str="释放打印样式错误!");
  104. }
  105. }
  106. }
  107. catch(...)
  108. {
  109. }
  110. m_aPlotStyleTable.RemoveAll();
  111. }
  112. //第四步 关闭文件分析器,使之处于结束转换状态.
  113. BOOL CDwgReader::EndConvert()
  114. {
  115. freeadptrs();
  116. _WRITE(str="转换服务被关闭");
  117. return TRUE;
  118. }
  119. //第三步 分析文件并调用转换器转换
  120. BOOL CDwgReader::Parse() //分析文件的主函数
  121. {
  122. _WRITE(str="n接收到新任务...");
  123. _WRITE(str.Format("DWG文件路径:%s",m_pCommand->m_strSourceName));
  124. _WRITE(str.Format("KMG文件路径:%s",m_pCommand->m_strAimName));
  125. // adSetAd2CriticalErrorFn(fn_critical);
  126. m_pProgress->SetProgressInfoAbsolute(0.01,"初始化...");
  127. TCHAR szFileName[MAX_PATH];
  128. HMODULE hModule=::GetModuleHandle("fileswitch.dll");
  129. ::GetModuleFileName(hModule,szFileName,MAX_PATH);
  130. (*_tcsrchr(szFileName,'\'))=''; 
  131. _tcscat(szFileName,_T("\support\init.dat")); 
  132. //short adInitAd2 _((const char * initfilepath, short *initerror));
  133. if(!adInitAd2(szFileName,&sReturnValue))
  134. {
  135. _WRITE(str="初始化失败,无法启动转换服务");
  136. _ERROR;
  137. return FALSE;
  138. }
  139. m_pProgress->SetProgressInfoAbsolute(0.02,"初始化...");
  140. //void adAcceptR14BetaFiles();
  141. adAcceptR14BetaFiles();
  142. //void adConvertPlinesOnLoad (short convert);
  143. adConvertPlinesOnLoad(1);
  144. //void adSetupDwgRead _((void));
  145. adSetupDwgRead();
  146. //void adSetupDxfRead _((void));
  147. adSetupDxfRead();
  148. CString ext=m_pCommand->m_strSourceName.Right(3);
  149. ext.MakeLower();
  150. if(ext=="dwg")
  151. {
  152. try
  153. {
  154. //软件包BUG 可能死循环
  155. sReturnValue=adDwgSmellsBad((char *)(LPCTSTR(m_pCommand->m_strSourceName)));
  156. if (sReturnValue==-1)
  157. {
  158. _ERROR;
  159. }
  160. else if(sReturnValue==0)
  161. {
  162. }
  163. else
  164. {
  165. _WRITE(str="文件格式不正确,可能已经被破坏");
  166. _ERROR;
  167. }
  168. }
  169. catch(...)
  170. {
  171. _WRITE(str="打开文件错误");
  172. _ERROR;
  173. try
  174. {
  175. //void adCloseAd2();
  176. adCloseAd2();
  177. }
  178. catch(...)
  179. {
  180. }
  181. return FALSE;
  182. }
  183. }
  184. //_WRITE(str="tip:转换百分率回调函数没有设置");
  185. //void adSetAd2LoadometerFn (void (*loadometer)(short errorno));
  186. adSetAd2LoadometerFn(fn_loadometer);
  187. try
  188. {
  189. TCHAR szFileName[MAX_PATH];
  190. ::memmove(szFileName,(char *)(LPCTSTR(m_pCommand->m_strSourceName)),m_pCommand->m_strSourceName.GetLength());
  191. szFileName[m_pCommand->m_strSourceName.GetLength()]='';
  192. (*_tcsrchr(szFileName,'\'))=''; 
  193. _tcscat(szFileName,_T("\")); 
  194. m_strAddPath=szFileName;
  195. }
  196. catch(...){}
  197. AD_DB_HANDLE dwghandle; //AutoCAD文件句柄.
  198. //AD_DB_HANDLE adLoadFile (void *fn, char preloadstrat, short addA2kObjs);
  199. try
  200. {
  201. dwghandle=adLoadFile( (char *)(LPCTSTR(m_pCommand->m_strSourceName)),AD_PRELOAD_ALL,1);
  202. }
  203. catch(...)
  204. {
  205. _WRITE(str="打开文件错误");
  206. _ERROR;
  207. try
  208. {
  209. //void adCloseAd2();
  210. adCloseAd2();
  211. }
  212. catch(...)
  213. {
  214. }
  215. return FALSE;
  216. }
  217. if(dwghandle==NULL)
  218. {
  219. _WRITE(str="打开文件错误");
  220. _ERROR;
  221. //void adCloseAd2();
  222. adCloseAd2();
  223. return FALSE;
  224. }
  225. m_pProgress->SetProgressInfoAbsolute(0.30,"分析数据...");
  226. if(!m_pConverter->BeginConverter())
  227. {
  228. _WRITE(str="转换服务启动失败");
  229. //extern  short  ADCDECL adCloseFile _((AD_DB_HANDLE handle));
  230. adCloseFile(dwghandle);
  231. //void adCloseAd2();
  232. adCloseAd2();
  233. return FALSE;
  234. }
  235. m_aColor.RemoveAll();
  236. // m_alwidth.RemoveAll();
  237. m_altype.ReInit();
  238. m_alayer.ReInit();
  239. m_ablock.ReInit();
  240. m_apaper.ReInit();
  241. m_amltype.ReInit();
  242. m_ashape.ReInit();
  243. m_adimstyle.ReInit();
  244. m_aplot.ReInit();
  245. adHanclear(m_hFirstDimStyle);
  246. try
  247. {
  248. for(int i=0;i<m_aPlotStyleTable.GetSize();i++)
  249. {
  250. //extern  short  ADCDECL adFreePlotStyleTable _((ADPLOTSTYLETABLE *pTable));
  251. sReturnValue=adFreePlotStyleTable(m_aPlotStyleTable[i]);
  252. if(sReturnValue!=1)
  253. {
  254. _WRITE2(str="释放打印样式错误!");
  255. }
  256. }
  257. }
  258. catch(...)
  259. {
  260. }
  261. m_aPlotStyleTable.RemoveAll();
  262. BOOL bProcessed;
  263. if(!(bProcessed=processfile(dwghandle)))
  264. {
  265. m_aColor.RemoveAll();
  266. // m_alwidth.RemoveAll();
  267. m_altype.ReInit();
  268. m_alayer.ReInit();
  269. m_ablock.ReInit();
  270. m_apaper.ReInit();
  271. m_amltype.ReInit();
  272. m_ashape.ReInit();
  273. m_adimstyle.ReInit();
  274. m_aplot.ReInit();
  275. try
  276. {
  277. for(int i=0;i<m_aPlotStyleTable.GetSize();i++)
  278. {
  279. //extern  short  ADCDECL adFreePlotStyleTable _((ADPLOTSTYLETABLE *pTable));
  280. sReturnValue=adFreePlotStyleTable(m_aPlotStyleTable[i]);
  281. if(sReturnValue!=1)
  282. {
  283. _WRITE2(str="释放打印样式错误!");
  284. }
  285. }
  286. }
  287. catch(...)
  288. {
  289. }
  290. m_aPlotStyleTable.RemoveAll();
  291. _WRITE(str="转换失败");
  292. if(!m_pConverter->EndConverter())
  293. {
  294. _WRITE(str="转换服务关闭失败");
  295. //extern  short  ADCDECL adCloseFile _((AD_DB_HANDLE handle));
  296. adCloseFile(dwghandle);
  297. //void adCloseAd2();
  298. adCloseAd2();
  299. return FALSE;
  300. }
  301. //extern  short  ADCDECL adCloseFile _((AD_DB_HANDLE handle));
  302. adCloseFile(dwghandle);
  303. //void adCloseAd2();
  304. adCloseAd2();
  305. return FALSE;
  306. }
  307. m_aColor.RemoveAll();
  308. // m_alwidth.RemoveAll();
  309. m_altype.ReInit();
  310. m_alayer.ReInit();
  311. m_ablock.ReInit();
  312. m_apaper.ReInit();
  313. m_amltype.ReInit();
  314. m_ashape.ReInit();
  315. m_adimstyle.ReInit();
  316. m_aplot.ReInit();
  317. try
  318. {
  319. for(int i=0;i<m_aPlotStyleTable.GetSize();i++)
  320. {
  321. //extern  short  ADCDECL adFreePlotStyleTable _((ADPLOTSTYLETABLE *pTable));
  322. sReturnValue=adFreePlotStyleTable(m_aPlotStyleTable[i]);
  323. if(sReturnValue!=1)
  324. {
  325. _WRITE2(str="释放打印样式错误!");
  326. }
  327. }
  328. }
  329. catch(...)
  330. {
  331. }
  332. m_aPlotStyleTable.RemoveAll();
  333. m_pProgress->SetProgressInfoAbsolute(0.99,"分析完成...");
  334. if(!m_pConverter->EndConverter())
  335. {
  336. _WRITE(str="转换服务关闭失败");
  337. //extern  short  ADCDECL adCloseFile _((AD_DB_HANDLE handle));
  338. adCloseFile(dwghandle);
  339. //void adCloseAd2();
  340. adCloseAd2();
  341. return FALSE;
  342. }
  343. try
  344. {
  345. //short adCloseFile (AD_DB_HANDLE handle);
  346. if(adCloseFile(dwghandle)!=1)
  347. {
  348. _WRITE(str="关闭AutoCAD文件失败");
  349. _ERROR;
  350. //void adCloseAd2();
  351. adCloseAd2();
  352. //return FALSE;  //说明:无法关闭opendwg打开的文件时,不认为转换失败.
  353. }
  354. //void adCloseAd2();
  355. adCloseAd2();
  356. }
  357. catch(...)
  358. {
  359. _WRITE(str="关闭AutoCAD文件失败");
  360. }
  361. _WRITE(str="n任务处理结束,等待接受新任务中...n");
  362. return bProcessed;
  363. }
  364. BOOL CDwgReader::Parse(AD_DB_HANDLE dwghandle)
  365. {
  366. if(!m_pConverter->BeginConverter())
  367. {
  368. _WRITE(str="转换服务启动失败");
  369. return FALSE;
  370. }
  371. BOOL bProcessed;
  372. bProcessed=processfile(dwghandle,FALSE);
  373. if(!m_pConverter->EndConverter())
  374. {
  375. _WRITE(str="转换服务关闭失败");
  376. bProcessed=FALSE;
  377. }
  378. m_aColor.RemoveAll();
  379. // m_alwidth.RemoveAll();
  380. m_altype.ReInit();
  381. m_alayer.ReInit();
  382. m_ablock.ReInit();
  383. m_apaper.ReInit();
  384. m_amltype.ReInit();
  385. m_ashape.ReInit();
  386. m_adimstyle.ReInit();
  387. m_aplot.ReInit();
  388. try
  389. {
  390. //short adCloseFile (AD_DB_HANDLE handle);
  391. if(adCloseFile(dwghandle)!=1)
  392. {
  393. _WRITE(str="关闭AutoCAD文件失败");
  394. _ERROR;
  395. }
  396. }
  397. catch(...)
  398. {
  399. _WRITE(str="关闭AutoCAD文件失败");
  400. }
  401. _WRITE(str="n任务处理结束,等待接受新任务中...n");
  402. return bProcessed;
  403. }
  404. //第五步 析构文件分析器.
  405. CDwgReader::~CDwgReader()
  406. {
  407. }