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

CAD

开发平台:

Visual C++

  1. //      KMCAD40-FileSwitch-Converterfile4.cpp-1.0 
  2. // KmgConverter.cpp: implementation of the CKmgConverter class.
  3. //
  4. //////////////////////////////////////////////////////////////////////
  5. //Updata:
  6. //KMCAD40-FileSwitch-Converterfile4.cpp-1.2 -> 1.3. 
  7. #include "stdafx.h"
  8. #include "FileSwitch.h"
  9. #include "DwgConverter.h"
  10. #include "KmLayer.h"
  11. #include "showdef.h"
  12. #include "entdef.h"
  13. #include "KmEntity.h"
  14. #include "Block.h"
  15. #include "WordStyle.h"
  16. #include "KmgReader.h"
  17. #include "Reader.h"
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[]=__FILE__;
  21. #define new DEBUG_NEW
  22. #endif
  23. extern CStdioFile g_CensorialFile;
  24. extern int g_mode;
  25. void CDwgConverter::AddObject()
  26. {
  27. adenhd->entcolor=m_enthead.scolor;
  28. adenhd->entltscale=m_enthead.dscale;
  29. adenhd->lineweight=m_enthead.swidth;
  30. adHancpy(adenhd->entltypeobjhandle,m_enthead.hltype);
  31. adHancpy(adenhd->entlayerobjhandle,m_enthead.hlayer);
  32. //short adAddEntityToList(AD_DB_HANDLE handle, AD_VMADDR addlist, PAD_ENT_HDR adenhd, PAD_ENT aden);
  33. sReturnValue=adAddEntityToList(m_dwghandle,m_DataVassel,adenhd,aden);
  34. if(sReturnValue!=1)
  35. {
  36. _ERROR;
  37. _WRITE(str="实体添加失败");
  38. }
  39. }
  40. void CDwgConverter::ConverterEntity_AdLine(double x1,double y1,double z1,double x2,double y2,double z2)
  41. {
  42. adenhd->enttype=AD_ENT_LINE;
  43. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  44. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  45. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  46. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  47. aden->line.pt0[0]=x1;
  48. aden->line.pt0[1]=y1;
  49. aden->line.pt0[2]=z1;
  50. aden->line.pt1[0]=x2;
  51. aden->line.pt1[1]=y2;
  52. aden->line.pt1[2]=z2;
  53. AddObject();
  54. return ;
  55. }
  56. void CDwgConverter::ConverterEntity_AdCircle(double x1,double y1,double z1,double ra)
  57. {
  58. adenhd->enttype=AD_ENT_CIRCLE;
  59. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  60. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  61. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  62. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  63. aden->circle.pt0[0]=x1;
  64. aden->circle.pt0[1]=y1;
  65. aden->circle.pt0[2]=z1;
  66. aden->circle.radius=ra;
  67. AddObject();
  68. return ;
  69. }
  70. void CDwgConverter::ConverterEntity_AdArc(double x1,double y1,double z1,double radius,double ba,double ea)
  71. {
  72. adenhd->enttype=AD_ENT_ARC;
  73. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  74. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  75. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  76. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  77. aden->arc.pt0[0]=x1;
  78. aden->arc.pt0[1]=y1;
  79. aden->arc.pt0[2]=z1;
  80. aden->arc.radius=radius;
  81. aden->arc.stang=ba*PI/180;
  82. aden->arc.endang=ea*PI/180;
  83. AddObject();
  84. return;
  85. }
  86. void CDwgConverter::ConverterEntity_AdText(S_TEXT* text)
  87. {
  88. double height=text->m_nHeight;
  89. try
  90. {
  91. double width;
  92. double bottomoffset;
  93. text->m_nMode=DRAWTOCALC;
  94. if(m_pTextCalcShow)
  95. {
  96. m_pTextCalcShow->DrawText(*text,NULL,FALSE,NULL,&width,&height,&bottomoffset,0);
  97. }
  98. }
  99. catch(...)
  100. {
  101. }
  102. //1.生成文字样式
  103. CString strFontName=text->m_lpszFacename;
  104. CString strBigFontName;
  105. int pos=strFontName.Find(';');
  106. if(pos!=-1&&pos>=0&&pos<strFontName.GetLength())
  107. {
  108. try
  109. {
  110. strBigFontName=strFontName.Right(strFontName.GetLength()-pos-1);
  111. strFontName=strFontName.Left(pos);
  112. }
  113. catch(...)
  114. {
  115. }
  116. }
  117. BOOL bUseShx=TRUE;
  118. if(strFontName.Find('.')==-1)
  119. {
  120. bUseShx=FALSE;
  121. }
  122. AD_OBJHANDLE handle;
  123. double dWidth;
  124. try
  125. {
  126. //增加对宽度比例的设置
  127. dWidth=text->m_nWidth/text->m_nHeight;
  128. }
  129. catch(...)
  130. {
  131. dWidth=1.0;
  132. }
  133. // if(bUseShx)
  134. {
  135. m_lShapeIndex++;
  136. adSetDefaultShapefile(&adtb->shptb);
  137. CString strShapeName;
  138. strShapeName.Format("%ld",m_lShapeIndex);
  139. CString strName=ConverterTabEntName(strShapeName);
  140. strcpy(adtb->shptb.name,strName);
  141. adtb->shptb.height=0.0;
  142. adtb->shptb.width=dWidth;
  143. adtb->shptb.angle=0.0;
  144. adtb->shptb.flag2=0;
  145. adtb->shptb.lastshapeheight= 5 ;
  146. if(!strBigFontName.IsEmpty())
  147. {
  148. strcpy(adtb->shptb.bigfontname,strBigFontName);
  149. }
  150. if(!strFontName.IsEmpty())
  151. {
  152. strcpy(adtb->shptb.file,strFontName);
  153. }
  154. adGenerateObjhandle(m_dwghandle,adtb->shptb.objhandle);
  155. adHancpy(handle, adtb->shptb.objhandle);
  156. if (!adAddShapefile(m_dwghandle,&adtb->shptb))
  157. {
  158. return;
  159. }
  160. }
  161. //1.生成文字
  162. adenhd->enttype=AD_ENT_MTEXT;
  163. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  164. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  165. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  166. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  167. CString strTemp=text->m_czText;
  168. //对英文字符宽度取半
  169. CString strKmText;
  170. //设置中文宽度
  171. //设置字间距比例
  172. if(text->m_dSpace>PRECISION)
  173. {
  174. double dSpace=1.0+text->m_dSpace/text->m_nWidth;
  175. if(dSpace<0.75-PRECISION)
  176. {
  177. dSpace=0.75;
  178. }
  179. if(dSpace>4.0-PRECISION)
  180. {
  181. dSpace=4.0;
  182. }
  183. CString str;
  184. try
  185. {
  186. str.Format("{\T%.2f;",dSpace);
  187. }
  188. catch(...)
  189. {
  190. str="\T1;";
  191. }
  192. strKmText+=str;
  193. }
  194. BOOL bASCIIStart=FALSE;
  195. for(int i=0;i<strTemp.GetLength();i++)
  196. {
  197. if( strTemp[i]>=0 && strTemp[i]<=0x7f )//ASCII字符
  198. {
  199. if(bASCIIStart)
  200. {//继续添加ACSII字符
  201. if(strTemp[i]=='\' || strTemp[i]== '}' || strTemp[i]== '{' )
  202. {
  203. strKmText+='\';
  204. }
  205. strKmText+=strTemp[i];
  206. }
  207. else
  208. {//开始添加ACSII字符
  209. bASCIIStart=TRUE;
  210. CString str;
  211. if(!bUseShx)//<<added by hq,2003.4.21
  212. str.Format("{\W%.2f;",dWidth*1.05);
  213. else //>>
  214. str.Format("{\W%.2f;",dWidth*0.5);
  215. strKmText+=str;
  216. if(strTemp[i]=='\' || strTemp[i]== '}' || strTemp[i]== '{' )
  217. {
  218. strKmText+='\';
  219. }
  220. strKmText+=strTemp[i];
  221. }
  222. }
  223. else
  224. {
  225. if(bASCIIStart)
  226. {//结束添加ACSII字符
  227. bASCIIStart=FALSE;
  228. strKmText+="}";
  229. strKmText+=strTemp[i];
  230. }
  231. else
  232. {//继续添加非ACSII字符
  233. strKmText+=strTemp[i];
  234. }
  235. }
  236. }
  237. if(bASCIIStart)
  238. {
  239. strKmText+="}";
  240. }
  241. //<<added by hq,2003.4.28
  242. if(false == bASCIIStart)
  243. {
  244. CString str;
  245. if(!bUseShx)//非形文字
  246. {
  247. str.Format("{\W%.2f;",dWidth*1.05);
  248. strKmText.Insert(0, str);
  249. strKmText+="}";
  250. }
  251. }
  252. //>>
  253. adHancpy(aden->mtext.shapefileobjhandle,handle);
  254. if(!bUseShx)
  255. {
  256. //CString str;
  257. //str.Format("{\W%.2f;",dWidth);
  258. //strKmText="{\f"+strFontName+";"+strKmText+"}";
  259. //modified by hq,2003.4.28
  260. strKmText="{\F"+strFontName+";"+strKmText+"}";
  261. //strKmText=str+strKmText+"}";
  262. }
  263. if(text->m_dSpace>PRECISION)
  264. {
  265. strKmText+="}";
  266. }
  267. //{added by hq,2003.5.7
  268. strKmText.Replace("%%c","φ");
  269. //}
  270. if(strKmText.GetLength()<=255)
  271. {//小于等于255时使用文字数组
  272. try
  273. {
  274. memcpy(aden->mtext.textstr,strKmText,strKmText.GetLength());
  275. aden->mtext.textstr[strKmText.GetLength()]='';
  276. }
  277. catch(...)
  278. {
  279. }
  280. }
  281. else
  282. {//使用blob
  283. try
  284. {
  285. CString strTemp;
  286. AD_VMADDR blob=adCreateBlob();//样式替代大小应小于4096
  287. PAD_BLOB_CTRL bcptr=adStartBlobWrite(blob);
  288. if(bcptr==NULL){adDeleteBlob(blob);return;}
  289. int count=0;
  290. while(!strKmText.IsEmpty()&&count<20)
  291. {
  292. count++;
  293. if(strKmText.GetLength()>255)
  294. {
  295. strTemp=strKmText.Left(255);
  296. strKmText=strKmText.Right(strKmText.GetLength()-255);
  297. //extern  short  ADCDECL adWriteMtextBlock _((PAD_BLOB_CTRL bcptr,char *str));
  298. adWriteMtextBlock(bcptr,(char*)(LPCTSTR)strTemp);
  299. }
  300. else
  301. {
  302. //extern  short  ADCDECL adWriteMtextBlock _((PAD_BLOB_CTRL bcptr,char *str));
  303. adWriteMtextBlock(bcptr,(char*)(LPCTSTR)strKmText);
  304. strKmText.Empty();
  305. break;
  306. }
  307. }
  308. if(!adEndBlobWrite(bcptr)){adDeleteBlob(blob);return;}
  309. aden->mtext.ldblob=blob;
  310. }
  311. catch(...)
  312. {
  313. return;
  314. }
  315. }
  316. //aden->text.tdata.generationflag
  317. if(!bUseShx)
  318. {
  319. //modified by hq,2003.4.19
  320. //kmg2003->dwg不需要做字高调整.
  321. {
  322. aden->mtext.ht=text->m_nHeight;
  323. #if(0)
  324. //{
  325. try
  326. {
  327. aden->mtext.ht=text->m_nHeight/calculate_findTTFHightRate(text->m_lpszFacename);
  328. }
  329. catch(...)
  330. {
  331. aden->mtext.ht=text->m_nHeight;
  332. }
  333. //}
  334. #endif
  335. }
  336. }
  337. else
  338. {
  339. aden->mtext.ht=text->m_nHeight;
  340. }
  341. calculate_finddir(text->m_nEscapement,aden->mtext.xdir);
  342. KmPoint pt(text->m_Offset.x,text->m_Offset.y);
  343. //modified by hq,2003.4.19
  344. {
  345. //STEXT(kmg)的文字为左上角对齐;
  346. //aden->mtext(dwg)的文字缺省对齐为左上角对齐;
  347.         //但文字插入点的定义方,因此需要对文字插入点坐标校正:
  348. double dAjHtScale = 0;
  349. double dAjWidScale= 0;
  350. double dDeltaHt   = 0;
  351. double dDeltaWid  = 0;
  352. dAjHtScale  = calculate_findTTFHightRate(text->m_lpszFacename);
  353. dAjWidScale = calculate_findTTFWidthRate(text->m_lpszFacename);
  354. if(0 == dAjHtScale || 1 == dAjHtScale)
  355. dDeltaHt = 0;
  356. else
  357. dDeltaHt = 0.4 * (text->m_nHeight / dAjHtScale - text->m_nHeight);
  358. if(0 == dAjWidScale || 1 == dAjWidScale)
  359. dDeltaWid = 0;
  360. else
  361. dDeltaWid = 0.4 * (text->m_nWidth / dAjWidScale - text->m_nWidth);
  362. if(bUseShx)
  363. {
  364. //double dAngle=::deg_to_rad(text->m_nEscapement)+PI*0.5;
  365. double dAngle=::deg_to_rad(text->m_nEscapement);
  366. pt.x=pt.x+dDeltaHt*sin(dAngle);
  367. pt.y=pt.y-dDeltaHt*cos(dAngle);
  368. pt.x=pt.x+dDeltaWid*cos(dAngle);
  369. pt.y=pt.y+dDeltaWid*sin(dAngle);
  370. }
  371. else
  372. {
  373. //double dAngle=::deg_to_rad(text->m_nEscapement)+PI*0.5;
  374. double dAngle=::deg_to_rad(text->m_nEscapement);
  375. pt.x=pt.x+dDeltaHt*sin(dAngle);
  376. pt.y=pt.y-dDeltaHt*cos(dAngle);
  377. pt.x=pt.x+dDeltaWid*cos(dAngle);
  378. pt.y=pt.y+dDeltaWid*sin(dAngle);
  379. }
  380. }
  381. aden->mtext.pt0[0]=pt.x;
  382. aden->mtext.pt0[1]=pt.y;
  383. aden->mtext.pt0[2]=0;
  384. AddObject();
  385. /* //转换为AD_ENT_TEXT的例子。
  386. adenhd->enttype=AD_ENT_TEXT;
  387. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  388. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  389. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  390. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  391. //左上角转换为左下角
  392. KmMatrix matrix;//旋转矩阵
  393. matrix.r11 = cos(text->m_nOrientation*PI/180);
  394. matrix.r21 = sin(text->m_nOrientation*PI/180);
  395. matrix.r31 = 0.0;
  396. matrix.r12 = -sin(text->m_nOrientation*PI/180);   
  397. matrix.r22 = cos(text->m_nOrientation*PI/180);
  398. matrix.r32 = 0.0;
  399. matrix.r13 = text->m_Offset.x*(1.0 - cos(text->m_nOrientation*PI/180)) + text->m_Offset.y*sin(text->m_nOrientation*PI/180);
  400. matrix.r23 = text->m_Offset.y*(1.0 - cos(text->m_nOrientation*PI/180)) - text->m_Offset.x*sin(text->m_nOrientation*PI/180);
  401. matrix.r33 = 1.0;
  402. KmPoint pt(text->m_Offset.x+0,text->m_Offset.y-text->m_nHeight);
  403.     pt = matrix * pt;
  404. aden->text.pt0[0]=pt.x;
  405. aden->text.pt0[1]=pt.y;
  406. aden->text.pt0[2]=0;
  407. CString strKmText=text->m_czText;
  408. try
  409. {
  410. memcpy(aden->text.textstr,strKmText,255);
  411. }
  412. catch(...)
  413. {
  414. #ifdef _DEBUG
  415. int a=1;
  416. #endif
  417. }
  418. //aden->text.tdata.generationflag
  419. aden->text.tdata.height=text->m_nHeight;
  420. //aden->text.tdata.justification
  421. if(text->m_bItalic)aden->text.tdata.oblique=15*PI/180;
  422. aden->text.tdata.rotang=text->m_nOrientation*PI/180;
  423. //aden->text.tdata.secondtextloc
  424. adHancpy(aden->text.tdata.shapefileobjhandle,handle);
  425. //aden->text.tdata.vertalignment
  426. aden->text.tdata.widthfactor=text->m_nWidth/text->m_nHeight;
  427. AddObject();*/
  428. }
  429. CString CDwgConverter::ConverterTabEntName(CString strName)
  430. {
  431. CString strNumber;
  432. CString strTemp;
  433. for(int i=0;i<strName.GetLength();i++)
  434. {
  435. if((unsigned char)strName[i]>0x7f)//中文字符
  436. {
  437. strTemp+=strName[i];
  438. if((i+1)<strName.GetLength())
  439. {
  440. strTemp+=strName[i+1];
  441. }
  442. i++;
  443. continue;
  444. }
  445. if(!( (strName[i]>='0'&&strName[i]<='9')||
  446. (strName[i]>='a'&&strName[i]<='z')||
  447. (strName[i]>='A'&&strName[i]<='Z') ))
  448. {
  449. strNumber.Format("%3d",strName[i]);
  450. for(int j=0;j<strNumber.GetLength();j++)
  451. {
  452. if(strNumber[j]==' ')
  453. {
  454. strNumber.SetAt(j,'0');
  455. }
  456. }
  457. strTemp+=strNumber;
  458. }
  459. else
  460. {
  461. strTemp+=strName[i];
  462. }
  463. }
  464. if(strTemp.GetLength()>255)
  465. {
  466. strTemp=strTemp.Left(255);
  467. }
  468. return strTemp;
  469. }
  470. BOOL CDwgConverter::ConverterEntity_KmBlockdef(CString strName,CMatch2* match)
  471. {
  472. //使用OpenDwg创建块
  473. //第一步:构造AD_BLKH实体.
  474. adSetDefaultBlockheader(&adtb->blkh);
  475. adtb->blkh.flag=0;
  476. adtb->blkh.xrefindex = -1;
  477. adtb->blkh.purgedflag=0;
  478. adtb->blkh.xdblob=AD_VMNULL;
  479. adtb->blkh.xrefblkisoverlaid=0;
  480. adtb->blkh.numreactors=0L;
  481. adtb->blkh.reactorblob=AD_VMNULL;
  482. adtb->blkh.previewblob=AD_VMNULL;
  483. strName=ConverterTabEntName(strName);
  484. strcpy(adtb->blkh.name,(char*)(LPCTSTR)strName);
  485. adGenerateObjhandle(m_dwghandle,adtb->blkh.objhandle);
  486. //第二步:添加到数据库的块链表中.
  487. //short adAddBlockheader _((AD_DB_HANDLE,PAD_BLKH));
  488. if (!adAddBlockheader(m_dwghandle,&adtb->blkh))
  489. {
  490. _ERROR;
  491. return FALSE;
  492. }
  493. adHancpy(match->m_handle,adtb->blkh.objhandle);
  494. return TRUE;
  495. }
  496. void CDwgConverter::ConverterEntity_AdInsert(double x0,double y0,double z0,double xs,double ys,double zs,double ang,AD_OBJHANDLE handle)
  497. {
  498. adenhd->enttype=AD_ENT_INSERT;
  499. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  500. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  501. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  502. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  503. adHancpy(aden->insert.blockheaderobjhandle,handle);
  504. aden->insert.pt0[0]=x0;
  505. aden->insert.pt0[1]=y0;
  506. aden->insert.pt0[2]=z0;
  507. aden->insert.xscale=xs;
  508. aden->insert.yscale=ys;
  509. aden->insert.zscale=zs;
  510. aden->insert.rotang=ang*PI/180;
  511. AddObject();
  512. return ;
  513. }
  514. void CDwgConverter::ConverterEntity_AdSolid(short scolor,double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
  515. {
  516. short scolorbackup=m_enthead.scolor;
  517. m_enthead.scolor=scolor;
  518. adenhd->enttype=AD_ENT_SOLID;
  519. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  520. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  521. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  522. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  523. aden->solid.pt0[0]=x1;
  524. aden->solid.pt0[1]=y1;
  525. aden->solid.pt1[0]=x2;
  526. aden->solid.pt1[1]=y2;
  527. aden->solid.pt2[0]=x3;
  528. aden->solid.pt2[1]=y3;
  529. aden->solid.pt3[0]=x4;
  530. aden->solid.pt3[1]=y4;
  531. AddObject();
  532. m_enthead.scolor=scolorbackup;
  533. return ;
  534. }
  535. BOOL CDwgConverter::ConverterEntity_AdSimpleDim(KmDim* pDim,KmPoint p1,KmPoint p2,KmPoint p3,double dAngle,AD_OBJHANDLE hBlock,AD_OBJHANDLE hDimStyle,AD_VMADDR blob)
  536. {
  537. adenhd->enttype=AD_ENT_DIMENSION;
  538. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  539. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  540. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  541. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  542. aden->dim.dimflag |= AD_DIMTYPE_ROTATED;
  543. //the first extension line is specified by defpt2.  
  544. //The second extension line is specified by defpt3, 
  545. //and the dimension line is specified by dimlinedefpt.
  546. adHancpy(aden->dim.dimstyleobjhandle,hDimStyle);
  547. adenhd->xdblob=blob;
  548. aden->dim.dimrotang=dAngle;
  549. aden->dim.defpt2[0]=p1.x;
  550. aden->dim.defpt2[1]=p1.y;
  551. aden->dim.defpt2[2]=0.0;
  552. aden->dim.defpt3[0]=p2.x;
  553. aden->dim.defpt3[1]=p2.y;
  554. aden->dim.defpt3[2]=0.0;
  555. aden->dim.dimlinedefpt[0]=p3.x;
  556. aden->dim.dimlinedefpt[1]=p3.y;
  557. aden->dim.dimlinedefpt[2]=0.0;
  558. if(!ConverterEntity_AdDimHead(pDim))
  559. {
  560. return FALSE;
  561. }
  562. //#ifndef _DEBUG
  563. adHancpy(aden->dim.blockheaderobjhandle,hBlock);
  564. //#endif
  565. AddObject();
  566. return TRUE;
  567. }
  568. BOOL CDwgConverter::ConverterEntity_AdRadiusDim(KmDim* pDim,KmPoint p1,KmPoint p2,AD_OBJHANDLE hBlock,AD_OBJHANDLE hDimStyle,AD_VMADDR blob)
  569. {
  570. adenhd->enttype=AD_ENT_DIMENSION;
  571. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  572. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  573. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  574. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  575. aden->dim.dimflag |= AD_DIMTYPE_RADIUS;
  576. //dimlinedefpt 圆心
  577. //defpt4 圆上点
  578. adHancpy(aden->dim.dimstyleobjhandle,hDimStyle);
  579. adenhd->xdblob=blob;
  580. // aden->dim.dimrotang=dAngle;
  581. aden->dim.dimlinedefpt[0]=p1.x;
  582. aden->dim.dimlinedefpt[1]=p1.y;
  583. aden->dim.dimlinedefpt[2]=0.0;
  584. aden->dim.defpt4[0]=p2.x;
  585. aden->dim.defpt4[1]=p2.y;
  586. aden->dim.defpt4[2]=0.0;
  587. aden->dim.dimlinedefpt[2]=0.0;
  588. if(!ConverterEntity_AdDimHead(pDim))
  589. {
  590. return FALSE;
  591. }
  592. //#ifndef _DEBUG
  593. adHancpy(aden->dim.blockheaderobjhandle,hBlock);
  594. //#endif
  595. AddObject();
  596. return TRUE;
  597. }
  598. BOOL CDwgConverter::ConverterEntity_AdAngleDim(KmDim* pDim,KmPoint p1,KmPoint p2,KmPoint p3,KmPoint p4,KmPoint p5,AD_OBJHANDLE hBlock,AD_OBJHANDLE hDimStyle,AD_VMADDR blob)
  599. {
  600. adenhd->enttype=AD_ENT_DIMENSION;
  601. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  602. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  603. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  604. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  605. aden->dim.dimflag |= AD_DIMTYPE_ANGULAR;
  606. //defpt2 and defpt3 are the endpoints of the first extension line.
  607. //dimlinedefpt and defpt4 are the endpoints of the second extension line.  
  608. //arcdefpt specifies the dimension line arc.
  609. adHancpy(aden->dim.dimstyleobjhandle,hDimStyle);
  610. adenhd->xdblob=blob;
  611. // aden->dim.dimrotang=dAngle;
  612. aden->dim.defpt2[0]=p1.x;
  613. aden->dim.defpt2[1]=p1.y;
  614. aden->dim.defpt2[2]=0.0;
  615. aden->dim.defpt3[0]=p2.x;
  616. aden->dim.defpt3[1]=p2.y;
  617. aden->dim.defpt3[2]=0.0;
  618. aden->dim.dimlinedefpt[0]=p3.x;
  619. aden->dim.dimlinedefpt[1]=p3.y;
  620. aden->dim.dimlinedefpt[2]=0.0;
  621. aden->dim.defpt4[0]=p4.x;
  622. aden->dim.defpt4[1]=p4.y;
  623. aden->dim.defpt4[2]=0.0;
  624. aden->dim.arcdefpt[0]=p5.x;
  625. aden->dim.arcdefpt[1]=p5.y;
  626. aden->dim.arcdefpt[2]=0.0;
  627. if(!ConverterEntity_AdDimHead(pDim))
  628. {
  629. return FALSE;
  630. }
  631. //#ifndef _DEBUG
  632. adHancpy(aden->dim.blockheaderobjhandle,hBlock);
  633. //#endif
  634. AddObject();
  635. return TRUE;
  636. }
  637. BOOL CDwgConverter::ConverterEntity_AdDiameterDim(KmDim* pDim,KmPoint p1,KmPoint p2,AD_OBJHANDLE hBlock,AD_OBJHANDLE hDimStyle,AD_VMADDR blob)
  638. {
  639. adenhd->enttype=AD_ENT_DIMENSION;
  640. //void adSetEntityDefaults (AD_DB_HANDLE handle, PAD_ENT_HDR adenhd, PAD_ENT aden);
  641. adSetEntityDefaults(m_dwghandle,adenhd,aden);
  642. //void adGenerateObjhandle (AD_DB_HANDLE handle, unsigned char *newhandle);
  643. adGenerateObjhandle(m_dwghandle,adenhd->enthandle);
  644. aden->dim.dimflag |= AD_DIMTYPE_DIAMETER;
  645. //defpt4 is the point selected on the circle or arc being dimensioned.
  646. //dimlinedefpt is the point on the circle exactly across from the selection point.
  647. adHancpy(aden->dim.dimstyleobjhandle,hDimStyle);
  648. adenhd->xdblob=blob;
  649. // aden->dim.dimrotang=dAngle;
  650. aden->dim.defpt4[0]=p1.x;
  651. aden->dim.defpt4[1]=p1.y;
  652. aden->dim.defpt4[2]=0.0;
  653. aden->dim.dimlinedefpt[0]=p2.x;
  654. aden->dim.dimlinedefpt[1]=p2.y;
  655. aden->dim.dimlinedefpt[2]=0.0;
  656. if(!ConverterEntity_AdDimHead(pDim))
  657. {
  658. return FALSE;
  659. }
  660. //#ifndef _DEBUG
  661. adHancpy(aden->dim.blockheaderobjhandle,hBlock);
  662. //#endif
  663. AddObject();
  664. return TRUE;
  665. }
  666. BOOL CDwgConverter::ConverterEntity_AdDimHead(KmDim* pDim)
  667. {
  668. {
  669. aden->dim.dimtextrot=::deg_to_rad(pDim->GetTxtAng(pDim->GetTxtAngType()));
  670. aden->dim.dimflag|=AD_DIMTYPE_TEXTPOS;
  671. aden->dim.dimtextmidpt[0]=pDim->GetDimLinePos().x;
  672. aden->dim.dimtextmidpt[1]=pDim->GetDimLinePos().y;
  673. aden->dim.dimtextmidpt[2]=0.0;
  674. CString strTemp;
  675. if(pDim->GetIsMultiText())
  676. {
  677. if(pDim->GetMultiKmText())
  678. {
  679. if(!pDim->GetMultiKmText()->GetCString(strTemp))
  680. {
  681. strTemp=pDim->GetMultiText();
  682. }
  683. }
  684. else
  685. {
  686. strTemp=pDim->GetMultiText();
  687. }
  688. }
  689. else
  690. {
  691. strTemp=pDim->GetMultiText();
  692. //将上下标替换为AUTOCAD的上下标
  693. //KMCAD sx上标;下标;
  694. //AUTOCAD S上标^下标;
  695. try
  696. {
  697. CString strTemp2;
  698. CString strTemp3;
  699. int iPos=strTemp.Find("\sx");
  700. if(iPos>=0&&iPos<strTemp.GetLength())
  701. {
  702. iPos+=3;
  703. strTemp2=strTemp.Right(strTemp.GetLength()-iPos);
  704. int iPos2=strTemp2.Find(';');
  705. if(iPos2>=0&&iPos2<strTemp2.GetLength())
  706. {
  707. iPos2+=1;
  708. strTemp3=strTemp2.Right(strTemp2.GetLength()-iPos2);
  709. int iPos3=strTemp3.Find("\;");
  710. if(iPos3>=0&&iPos3<strTemp3.GetLength())
  711. {
  712. strTemp=strTemp.Left(iPos-3)+"\S"+strTemp2.Left(iPos2-1)+"^" 
  713. + strTemp3.Left(iPos3)+";"+strTemp3.Right(strTemp3.GetLength()-iPos3-2);
  714. }
  715. }
  716. }
  717. }
  718. catch(...)
  719. {
  720. }
  721. }
  722. strcpy(aden->dim.dimtext,strTemp);
  723. }
  724. return TRUE;
  725. }
  726. void CDwgConverter::GetAppHandle(AD_OBJHANDLE* objhandle)
  727. {
  728. // AD_APP adapp;
  729. // extern  short  ADCDECL adFindRegappByName _((AD_DB_HANDLE handle, char *name, AD_OBJHANDLE thehandle));
  730. adFindRegappByName(m_dwghandle,"ACAD",*objhandle);
  731. // extern  short  ADCDECL adStartRegappGet _((AD_DB_HANDLE handle));
  732. // extern  short  ADCDECL adGetRegapp _((AD_DB_HANDLE handle,PAD_APP adapp));
  733. // adSetDefaultRegapp(&adapp);
  734. // adHancpy(*objhandle,adapp.objhandle);
  735. }