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

CAD

开发平台:

Visual C++

  1. //      KMCAD40-FileSwitch-DwgConverter.cpp-1.0 
  2. // DwgConverter.cpp: implementation of the CDwgConverter class.
  3. //
  4. //////////////////////////////////////////////////////////////////////
  5. #include "stdafx.h"
  6. #include "FileSwitch.h"
  7. #include "DwgConverter.h"
  8. #include "Reader.h"
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. extern CStdioFile g_CensorialFile; //监察转换进度的文件
  18. extern int g_mode;
  19. CDwgConverter::CDwgConverter(CCommandInfo* pCommand)
  20. {
  21. HWND hWnd=::GetDesktopWindow();
  22. if(hWnd)
  23. {
  24. CWnd* pWnd=CWnd::FromHandle(hWnd);
  25. if(pWnd)
  26. {
  27. m_pTextCalcShow = new CGLShow(pWnd);
  28. }
  29. else
  30. {
  31. m_pTextCalcShow = new CGLShow;
  32. }
  33. }
  34. else
  35. {
  36. m_pTextCalcShow = new CGLShow;
  37. }
  38. m_pCommand=pCommand;
  39. m_lShapeIndex=0;
  40. }
  41. CDwgConverter::~CDwgConverter()
  42. {
  43. delete m_pTextCalcShow;
  44. }
  45. BOOL CDwgConverter::BeginConverter()
  46. {
  47. m_lShapeIndex=0;
  48. CWinApp* pApp=::AfxGetApp();
  49. if(pApp==NULL)
  50. {
  51. return FALSE;
  52. }
  53. short sfilevar;
  54. CString filevar;
  55. CString strTemp=_T("ACAD2000");
  56. filevar = pApp->GetProfileString(_T("Kmg2Dwg"),_T("FileVar"),strTemp);
  57. filevar.MakeUpper();
  58.     if (filevar=="ACAD25")
  59. {
  60. sfilevar=AD_ACAD25;
  61. }
  62.     else if (filevar=="ACAD9") 
  63. {
  64. sfilevar=AD_ACAD9;
  65. }
  66.     else if (filevar=="ACAD10")
  67. {
  68. sfilevar=AD_ACAD10;
  69. }
  70.     else if (filevar=="ACAD11") 
  71. {
  72. sfilevar=AD_ACAD11;
  73. }
  74.     else if (filevar=="ACAD13") 
  75. {
  76. sfilevar=AD_ACAD13;
  77. }
  78.     else if (filevar=="ACAD14") 
  79. {
  80. sfilevar=AD_ACAD14;
  81. }
  82.     else
  83. {
  84. sfilevar=AD_ACAD2000;
  85. filevar="ACAD2000";
  86. }
  87. _WRITE(str.Format("tip:转换文件类型为%s版本的文件",filevar));
  88. pApp->WriteProfileString(_T("Kmg2Dwg"),_T("FileVar"),filevar);
  89. if(!allocateadptrs())
  90. {
  91. _WRITE(str="内存不足,无法启动转换服务");
  92. return FALSE;
  93. }
  94. //AD_DB_HANDLE adNewFile (AD_OBJHANDLE *stockobjhandle, PAD_CLASS classes, short numClasses, short version);
  95. if((m_dwghandle=adNewFile(NULL,NULL,0,sfilevar))==NULL) 
  96. {
  97. _ERROR;
  98. return FALSE;
  99. }
  100. SetModelDataVassel();
  101. /*
  102. adSetDefaultShapefile(&adtb->shptb);
  103. strcpy(adtb->shptb.name,"文字样式");
  104. adtb->shptb.height=0.2;
  105. double m_dtextposmodify=0.15;
  106. adtb->shptb.width=1.0/(1+2*m_dtextposmodify);
  107. adtb->shptb.angle=0.0;
  108. adtb->shptb.flag2=0;
  109. adtb->shptb.lastshapeheight= 5 ;
  110. strcpy(adtb->shptb.file,"SimSun.ttf");
  111. {
  112. adtb->shptb.xdblob=adCreateBlob();
  113. PAD_BLOB_CTRL  aa;
  114. aa=adStartBlobWrite(adtb->shptb.xdblob);
  115. //extern  short  ADCDECL adWriteExtendeddata _((PAD_BLOB_CTRL bcptr,PAD_XD adxd));
  116. adxd->xddxfnumber=1001;
  117. //extern  short  ADCDECL adStartRegappGet _((AD_DB_HANDLE handle));
  118. adStartRegappGet(m_dwghandle);
  119. //extern  short  ADCDECL adGetRegapp _((AD_DB_HANDLE handle,PAD_APP adapp));
  120. {
  121. AD_APP adapp;
  122. if(adGetRegapp(m_dwghandle,&adapp)!=-1)
  123. {
  124. adHancpy(adxd->xddata.xdappobjhandle,adapp.objhandle);
  125. }
  126. }
  127. //adxd->xddxfnumber=1001;
  128. adWriteExtendeddata(aa,adxd);
  129. adxd->xddxfnumber=1000;
  130. strcpy(adxd->xddata.xdstring,"SimSun");
  131. adWriteExtendeddata(aa,adxd);
  132. adxd->xddxfnumber=1071;
  133. adxd->xddata.xdlong=0x8602;
  134. adWriteExtendeddata(aa,adxd);
  135. adEndBlobWrite(aa);
  136. }
  137. adGenerateObjhandle(m_dwghandle,adtb->shptb.objhandle);
  138. adHancpy(m_Shape, adtb->shptb.objhandle);
  139. adAddShapefile(m_dwghandle,&adtb->shptb);
  140. */
  141. return TRUE;
  142. }
  143. void CDwgConverter::ConverterKmLegend(double x0,double y0,double dx,double dy)
  144. {
  145. //获得头指针,并设置AutoCAD的系统变量
  146. PAD_DWGHDR dwghd=adHeaderPointer(m_dwghandle);
  147. // dwghd->textsize = 5;
  148. // adHancpy(dwghd->curtextstyleobjhandle, m_Shape);
  149. dwghd->extmin[0] = x0 ;
  150. dwghd->extmin[1] = y0 ;
  151. dwghd->extmin[2] = 0.0 ;
  152. dwghd->extmax[0] = x0 + dx;
  153. dwghd->extmax[1] = y0 + dy;
  154. dwghd->extmax[2] = 0.0;
  155. dwghd->pextmin[0] = 0.0;
  156. dwghd->pextmin[1] = 0.0;
  157. dwghd->pextmin[2] = 0.0;
  158. dwghd->pextmax[0] = dx;
  159. dwghd->pextmax[1] = dy;
  160. dwghd->pextmax[2] = 0.0;
  161. dwghd->viewsize = dx>dy ? dx:dy;
  162. dwghd->viewctr[0] = x0 + dx * 0.5;
  163. dwghd->viewctr[1] = y0 + dy * 0.5;
  164. dwghd->plimmax[0] = dx;
  165. dwghd->plimmax[1] = dy;
  166. //获得当前的视口并修改
  167. //short adStartVportGet (AD_DB_HANDLE handle);
  168. if(adStartVportGet(m_dwghandle)!=0)
  169. {
  170. AD_VPORT vport;
  171. for (short i=0; i<(short)adNumVports(m_dwghandle); i++) 
  172. {
  173. if(i==0)
  174. {
  175. adGetVport(m_dwghandle,&vport);
  176. vport.center[0]=x0 + dx * 0.5;
  177. vport.center[1]=y0 + dy * 0.5;
  178. vport.viewheight=dy;
  179. try
  180. {
  181. vport.aspect=dx/dy;
  182. }
  183. catch(...)
  184. {
  185. vport.aspect=1.0;
  186. }
  187. }
  188. }
  189. if(i!=0)
  190. {
  191. adReplaceVport(m_dwghandle,&vport);
  192. }
  193. }
  194. dwghd->tilemode = 1;//设置为模型空间
  195. // extern  short  ADCDECL adAsciiCodePageToShort _((char *codepagestr,short *index));
  196. short ccodepage;
  197. if(adAsciiCodePageToShort("ANSI_936",&ccodepage )!=0)
  198. {
  199. dwghd->dwgcodepage = ccodepage;
  200. }
  201. else
  202. {
  203. dwghd->dwgcodepage = (short)0x001f;//31: "gb2312"
  204. }
  205. }
  206. BOOL CDwgConverter::EndConverter()
  207. {
  208. CWinApp* pApp=::AfxGetApp();
  209. if(pApp==NULL)
  210. {
  211. adCloseFile(m_dwghandle);
  212. freeadptrs();
  213. return FALSE;
  214. }
  215. short sfiletype=AD_DWG;
  216. CString filetype=m_pCommand->m_strAimName;
  217. if(filetype.GetLength()>=3)
  218. {
  219. filetype=filetype.Right(3);
  220. filetype.MakeLower();
  221. if(filetype=="dxf")
  222. {
  223. sfiletype=AD_DXF;
  224. }
  225. }
  226. /* CString strTemp=_T("DWG");
  227. filetype = pApp->GetProfileString(_T("Kmg2Dwg"),_T("FileType"),strTemp);
  228. filetype.MakeUpper();
  229. if(filetype=="DXF")
  230. {
  231. sfiletype=AD_DXF;
  232. }
  233. else 
  234. {
  235. sfiletype=AD_DWG;
  236. filetype=="DWG";
  237. }
  238. _WRITE(str.Format("tip:转换文件类型为%s文件",filetype));
  239. pApp->WriteProfileString(_T("Kmg2Dwg"),_T("FileType"),filetype);*/
  240. short sfilevar;
  241. CString filevar;
  242. CString strTemp=_T("ACAD2000");
  243. filevar = pApp->GetProfileString(_T("Kmg2Dwg"),_T("FileVar"),strTemp);
  244. filevar.MakeUpper();
  245.     if (filevar=="ACAD25")
  246. {
  247. sfilevar=AD_ACAD25;
  248. }
  249.     else if (filevar=="ACAD9") 
  250. {
  251. sfilevar=AD_ACAD9;
  252. }
  253.     else if (filevar=="ACAD10")
  254. {
  255. sfilevar=AD_ACAD10;
  256. }
  257.     else if (filevar=="ACAD11") 
  258. {
  259. sfilevar=AD_ACAD11;
  260. }
  261.     else if (filevar=="ACAD13") 
  262. {
  263. sfilevar=AD_ACAD13;
  264. }
  265.     else if (filevar=="ACAD14") 
  266. {
  267. sfilevar=AD_ACAD14;
  268. }
  269.     else
  270. {
  271. sfilevar=AD_ACAD2000;
  272. filevar="ACAD2000";
  273. }
  274. _WRITE(str.Format("tip:转换文件类型为%s版本的文件",filevar));
  275. pApp->WriteProfileString(_T("Kmg2Dwg"),_T("FileVar"),filevar);
  276. //short adSaveFile (AD_DB_HANDLE handle, void *name, char filetype, short version, short dxfnegz, short dxfdecprec, short dxfwritezeroes, char r12dxfvbls);
  277. sReturnValue=adSaveFile(m_dwghandle,(void*)(LPCTSTR)m_pCommand->m_strAimName,(char)sfiletype,sfilevar,0,6,1,1);
  278. adCloseFile(m_dwghandle);
  279. if(sReturnValue!=1)
  280. {
  281. _ERROR;
  282. freeadptrs();
  283. return FALSE;
  284. }
  285. freeadptrs();
  286. return TRUE;
  287. }
  288. BOOL CDwgConverter::allocateadptrs(void)
  289. {
  290. if((adhd=(PAD_DWGHDR)malloc(sizeof(AD_DWGHDR)))!=NULL) 
  291. {
  292. if((adenhd=(PAD_ENT_HDR)malloc(sizeof(AD_ENT_HDR)))!=NULL) 
  293. {
  294. if((aden=(PAD_ENT)malloc(sizeof(AD_ENT)))!=NULL) 
  295. {
  296. if((adtb=(PAD_TB)malloc(sizeof(AD_TB)))!=NULL) 
  297. {
  298. if((adxd=(PAD_XD)malloc(sizeof(AD_XD)))!=NULL) 
  299. {
  300. if((adobhd=(PAD_OBJ_HDR)malloc(sizeof(AD_OBJ_HDR)))!=NULL) 
  301. {
  302. if((adob=(PAD_OBJ)malloc(sizeof(AD_OBJ)))!=NULL) 
  303. {
  304. return TRUE;
  305. }
  306. free(adobhd);
  307. }
  308. free(adxd);
  309. }
  310. free(adtb);
  311. }
  312. free(aden);
  313. }
  314. free(adenhd);
  315. }
  316. free(adhd);
  317. }
  318. return FALSE;
  319. }
  320. void CDwgConverter::freeadptrs(void)
  321. {
  322. free(adxd);
  323. free(adtb);
  324. free(aden);
  325. free(adenhd);
  326. free(adhd);
  327. free(adobhd);
  328. free(adob);
  329. }
  330. void CDwgConverter::WriteEnthead(short scolor,short swidth,double dscale,AD_OBJHANDLE& hltype,AD_OBJHANDLE& hlayer)
  331. {
  332. m_enthead.scolor=scolor;
  333. m_enthead.swidth=swidth;
  334. m_enthead.dscale=dscale;
  335. adHancpy(m_enthead.hltype,hltype);
  336. adHancpy(m_enthead.hlayer,hlayer);
  337. }
  338. void CDwgConverter::SetBlockDataVassel(AD_OBJHANDLE handle)
  339. {
  340. //第三步:从数据库的块链表中取出AD_BLKH实体.(*请理解为值加入而非地址加入)
  341. adSeekBlockheader(m_dwghandle,handle,&adtb->blkh);
  342. m_DataVassel=adtb->blkh.entitylist;
  343. if(m_DataVassel==NULL)
  344. {
  345. SetModelDataVassel();
  346. }
  347. }
  348. void CDwgConverter::SetModelDataVassel()
  349. {
  350. AD_OBJHANDLE *ohptr=adShadowObjhandlePtr(m_dwghandle);
  351. m_DataVassel=adEntityList(m_dwghandle,ohptr[MSPACEBLKSHADOW]);
  352. }
  353. void CDwgConverter::AddEndBlkSign()
  354. {
  355. //第六步:构造AD_ENT_ENDBLK实体,并添加到AD_BLKH的实体链中.
  356. adenhd->enttype=AD_ENT_ENDBLK;
  357. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  358. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  359. AD_OBJHANDLE *ohptr=adShadowObjhandlePtr(m_dwghandle);
  360. //CONTINUOUSLTPSHADOW
  361. //extern  short  ADCDECL adStartLayerGet _((AD_DB_HANDLE handle));
  362. if(adStartLayerGet(m_dwghandle)!=1)
  363. {
  364. _ERROR;
  365. }
  366. //extern  short  ADCDECL adGetLayer _((AD_DB_HANDLE handle,PAD_LAY adlay));
  367. if(!adGetLayer(m_dwghandle,&adtb->lay))
  368. {
  369. _ERROR;
  370. }
  371. WriteEnthead(AD_COLOR_BYLAYER,-1,1.0,ohptr[BYLAYERLTPSHADOW],adtb->lay.objhandle);
  372. AddObject();
  373. SetModelDataVassel();
  374. }
  375. void CDwgConverter::AddBegBlkSign(double x0,double y0,double z0)
  376. {
  377. //第四步:构造AD_ENT_BLOCK实体.并添加到AD_BLKH的实体链中.
  378. //Short adAddEntityToList _((AD_DB_HANDLE,AD_VMADDR,PAD_ENT_HDR,PAD_ENT));
  379. adenhd->enttype=AD_ENT_BLOCK; 
  380. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  381. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  382. aden->block.base[0]=x0;
  383. aden->block.base[1]=y0;
  384. aden->block.base[2]=z0;
  385. AD_OBJHANDLE *ohptr=adShadowObjhandlePtr(m_dwghandle);
  386. //CONTINUOUSLTPSHADOW
  387. //extern  short  ADCDECL adStartLayerGet _((AD_DB_HANDLE handle));
  388. if(adStartLayerGet(m_dwghandle)!=1)
  389. {
  390. _ERROR;
  391. }
  392. //extern  short  ADCDECL adGetLayer _((AD_DB_HANDLE handle,PAD_LAY adlay));
  393. if(!adGetLayer(m_dwghandle,&adtb->lay))
  394. {
  395. _ERROR;
  396. }
  397. WriteEnthead(AD_COLOR_BYLAYER,-1,1.0,ohptr[BYLAYERLTPSHADOW],adtb->lay.objhandle);
  398. AddObject();
  399. //第五步:构造块定义中的实体并添加到块定义中.
  400. //第六步:构造AD_ENT_ENDBLK实体,并添加到AD_BLKH的实体链中.
  401. // 第五步在CKmgReader::processentity(pData,pObj)中
  402. // 第六步在函数void CDwgConverter::AddEndBlkSign()中
  403. }