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

CAD

开发平台:

Visual C++

  1. //      KMCAD40-FileSwitch-Processfile4.cpp-1.0 
  2. #include "stdafx.h"
  3. #include "DimStyle.h"
  4. #include "FileSwitch.h"
  5. #include "DwgReader.h"
  6. #include "KmSection.h"
  7. #include "DimCmn.h"
  8. #include "KmDim.h"
  9. #include "Vector.h"
  10. #include "Reader.h"
  11. #include <atlbase.h>
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char THIS_FILE[]=__FILE__;
  15. #define new DEBUG_NEW
  16. #endif
  17. extern CStdioFile g_CensorialFile; //监察转换进度的文件
  18. extern int g_mode;
  19. BOOL CDwgReader::processentity_dim(AD_DB_HANDLE dwghandle)
  20. {
  21. if(m_ddimconvmode==1)
  22. {
  23. return processentity_dim_blockref(dwghandle);
  24. }
  25. if(adHansame(aden->dim.dimstyleobjhandle,NULLOBJHANDLE))
  26. {
  27. adHancpy(aden->dim.dimstyleobjhandle,m_hFirstDimStyle);
  28. }
  29. // AD_DIMTYPE_XORDDIM (this ordinate dimension is in the X direction)
  30. // AD_DIMTYPE_TEXTPOS (indicates the dim text is at a user-defined location).
  31. //dimflag尺寸类型
  32. //调试使用 m_pConverter->ConverterEntiey_KmCircle(aden->dim.dimcloneinspt[0],aden->dim.dimcloneinspt[1],aden->dim.dimcloneinspt[2],1);
  33. //arcdefpt 尺寸坐标 
  34. //调试使用 m_pConverter->ConverterEntiey_KmCircle(aden->dim.arcdefpt[0],aden->dim.arcdefpt[1],aden->dim.arcdefpt[2],0.1);
  35. //defpt2 尺寸坐标
  36. //调试使用 m_pConverter->ConverterEntiey_KmCircle(aden->dim.defpt2[0],aden->dim.defpt2[1],aden->dim.defpt2[2],0.2);
  37. //defpt3 尺寸坐标
  38. //调试使用 m_pConverter->ConverterEntiey_KmCircle(aden->dim.defpt3[0],aden->dim.defpt3[1],aden->dim.defpt3[2],0.3);
  39. //defpt4 尺寸坐标
  40. //调试使用 m_pConverter->ConverterEntiey_KmCircle(aden->dim.defpt4[0],aden->dim.defpt4[1],aden->dim.defpt4[2],0.4);
  41. //Dimtextmidpt尺寸文字中点
  42. //调试使用 m_pConverter->ConverterEntiey_KmCircle(aden->dim.dimtextmidpt[0],aden->dim.dimtextmidpt[1],aden->dim.dimtextmidpt[2],0.5);
  43. //Dimlinedefpt尺寸文字定义点
  44. //调试使用 m_pConverter->ConverterEntiey_KmCircle(aden->dim.dimlinedefpt[0],aden->dim.dimlinedefpt[1],aden->dim.dimlinedefpt[2],0.6);
  45. //Dimrotang尺寸角度 
  46. //leaderlen 尺寸引出线长度
  47. //dimoblique 尺寸倾斜角度
  48. //dimtextrot 尺寸文字角度
  49. //dimtext 尺寸文字
  50. //Linespacingstyle行距风格 is either 1 (at least), or 2 (exact).
  51. //linespacingfactor 行距距离百分比0.25 to 4.0.
  52. switch(aden->dim.dimflag & '7')
  53. {
  54. case AD_DIMTYPE_ROTATED:
  55. if(!processentity_dim_rotated(dwghandle))//0
  56. {
  57. return processentity_dim_blockref(dwghandle);
  58. }
  59. break;
  60. case AD_DIMTYPE_ALIGNED:
  61. if(!processentity_dim_aligned(dwghandle))//1
  62. {
  63. return processentity_dim_blockref(dwghandle);
  64. }
  65. break;
  66. case AD_DIMTYPE_ANGULAR:
  67. if(!processentity_dim_angular(dwghandle))//2
  68. {
  69. return processentity_dim_blockref(dwghandle);
  70. }
  71. break;
  72. case AD_DIMTYPE_DIAMETER:
  73. if(!processentity_dim_diameter(dwghandle))//3
  74. {
  75. return processentity_dim_blockref(dwghandle);
  76. }
  77. break;
  78. case AD_DIMTYPE_RADIUS:
  79. if(!processentity_dim_radius(dwghandle))//4
  80. {
  81. return processentity_dim_blockref(dwghandle);
  82. }
  83. break;
  84. case AD_DIMTYPE_ANGULAR3PT:
  85. if(!processentity_dim_angular3pt(dwghandle))//5
  86. {
  87. return processentity_dim_blockref(dwghandle);
  88. }
  89. break;
  90. case AD_DIMTYPE_ORDINATE:
  91. if(!processentity_dim_ordinate(dwghandle))//6
  92. {
  93. return processentity_dim_blockref(dwghandle);
  94. }
  95. break;
  96. default:
  97. _WRITE(str="不可识别的尺寸类型");
  98. return processentity_dim_blockref(dwghandle);
  99. }
  100. return TRUE;
  101. }
  102. BOOL CDwgReader::processentity_dim_head(AD_DB_HANDLE dwghandle,KmObject* obj)
  103. {
  104. if(!obj->IsKindOf(RUNTIME_CLASS(KmDim)))
  105. {
  106. return FALSE;
  107. }
  108. UINT id;
  109. if(!m_adimstyle.Get(id,aden->dim.dimstyleobjhandle))
  110. {
  111. return FALSE;
  112. }
  113. CKmDataManager* pDataMgr=::GetActiveDataManager();
  114. if(!pDataMgr)
  115. {
  116. return FALSE;
  117. }
  118. CDimStyle* pDimStyle=pDataMgr->GetDimStyle(id);
  119. if(!pDimStyle)
  120. {
  121. return FALSE;
  122. }
  123. KmDim* pDim=(KmDim*)obj;
  124. if(!pDim->GetDSAMgr()->SetDsID(id,id))
  125. {
  126. return FALSE;
  127. }//注意id已经变化
  128. //转换样式替代
  129. if(adenhd->xdblob!=AD_VMNULL)
  130. {
  131. KmDimStlAcsMgr* pDimStlAccMgr=pDim->GetDSAMgr();
  132. {
  133. //BOOL ChangeWorkMode(DSAWorkMode nNewMode, DSAWorkMode &nOldMode); 
  134. DSAWorkMode old; 
  135. pDimStlAccMgr->ChangeWorkMode(DSA_WM_USER,old);
  136. /*{
  137. 尺寸样式代码的意思请参见资料DXF Reference Guide的第四十页
  138. }*/
  139. //样式替代格式
  140. //1002 {
  141. /*  1070 编码
  142. / ___________具体的样式替代*/
  143. /*  1070 编码
  144. / ___________具体的样式替代*/
  145. //1002 }
  146. BOOL bControlStart=FALSE;
  147. BOOL bControlCode=FALSE;
  148. int  dControlCode=0;
  149. PAD_BLOB_CTRL bcptr;
  150. bcptr=adStartBlobRead(adenhd->xdblob);
  151. while(adReadExtendeddata(bcptr,adxd)) 
  152. {
  153. if(adxd->xddxfnumber==1000) //adxd->xddata.xdstring;
  154. {
  155. if(bControlStart==TRUE)
  156. {
  157. if(bControlCode)
  158. {
  159. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  160. }
  161. else
  162. {
  163. TRACE("错误的blob数据");
  164. }
  165. }
  166. //else 忽略
  167. }
  168. else if(adxd->xddxfnumber==1001) //adxd->xddata.xdappobjhandle
  169. {
  170. if(bControlStart==TRUE)
  171. {
  172. if(bControlCode)
  173. {
  174. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  175. }
  176. else
  177. {
  178. TRACE("错误的blob数据");
  179. }
  180. }
  181. //else 忽略
  182. }
  183. else if(adxd->xddxfnumber==1003) //adxd->xddata.xdentlayerobjhandle
  184. {
  185. if(bControlStart==TRUE)
  186. {
  187. if(bControlCode)
  188. {
  189. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  190. }
  191. else
  192. {
  193. TRACE("错误的blob数据");
  194. }
  195. }
  196. //else 忽略
  197. }
  198. else if (adxd->xddxfnumber==1005) //adxd->xddata.xdhandle
  199. {
  200. if(bControlStart==TRUE)
  201. {
  202. if(bControlCode)
  203. {
  204. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  205. }
  206. else
  207. {
  208. TRACE("错误的blob数据");
  209. }
  210. }
  211. //else 忽略
  212. }
  213. else if (adxd->xddxfnumber==1010) //adxd->xddata.xd3dpt[0],adxd->xddata.xd3dpt[1],adxd->xddata.xd3dpt[2]
  214. {
  215. if(bControlStart==TRUE)
  216. {
  217. if(bControlCode)
  218. {
  219. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  220. }
  221. else
  222. {
  223. TRACE("错误的blob数据");
  224. }
  225. }
  226. //else 忽略
  227. }
  228. else if (adxd->xddxfnumber==1040) //adxd->xddata.xdreal
  229. {
  230. if(bControlStart==TRUE)
  231. {
  232. if(bControlCode)
  233. {
  234. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  235. }
  236. else
  237. {
  238. TRACE("错误的blob数据");
  239. }
  240. }
  241. //else 忽略
  242. }
  243. else if (adxd->xddxfnumber==1070) //adxd->xddata.xdint
  244. {
  245. if(bControlStart==TRUE)
  246. {
  247. if(bControlCode)
  248. {
  249. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  250. }
  251. else
  252. {
  253. dControlCode=adxd->xddata.xdint;
  254. bControlCode=TRUE;
  255. }
  256. }
  257. //else 忽略
  258. }
  259. else if (adxd->xddxfnumber==1071) //adxd->xddata.xdlong;
  260. {
  261. if(bControlStart==TRUE)
  262. {
  263. if(bControlCode)
  264. {
  265. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  266. }
  267. else
  268. {
  269. TRACE("错误的blob数据");
  270. }
  271. }
  272. //else 忽略
  273. }
  274. else if (adxd->xddxfnumber==1002) //adxd->xddata.xdcontrol   123 '{'   125 '}'
  275. {
  276. if(adxd->xddata.xdcontrol=='{')
  277. {
  278. if(bControlStart==TRUE)
  279. {
  280. TRACE("错误的blob数据");
  281. }
  282. else
  283. {
  284. bControlStart=TRUE;
  285. }
  286. }
  287. else if(adxd->xddata.xdcontrol=='}')
  288. {
  289. if(bControlStart==TRUE)
  290. {
  291. bControlStart=FALSE;
  292. }
  293. else
  294. {
  295. TRACE("错误的blob数据");
  296. }
  297. }
  298. }
  299. else if (adxd->xddxfnumber==1004)  //for (i=0; i<adxd->xdbindatalength; i++)/* binary data */exampleprintf("%.02X",((unsigned)adxd->xddata.xdbindata[i]) & 255);exampleprintf("n");
  300. {
  301. if(bControlStart==TRUE)
  302. {
  303. if(bControlCode)
  304. {
  305. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  306. }
  307. else
  308. {
  309. TRACE("错误的blob数据");
  310. }
  311. }
  312. //else 忽略
  313. }
  314. else if (adxd->xddxfnumber==1011) //adxd->xddata.xdworldpos
  315. {
  316. if(bControlStart==TRUE)
  317. {
  318. if(bControlCode)
  319. {
  320. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  321. }
  322. else
  323. {
  324. TRACE("错误的blob数据");
  325. }
  326. }
  327. //else 忽略
  328. }
  329. else if (adxd->xddxfnumber==1012) //adxd->xddata.xdworlddisp
  330. {
  331. if(bControlStart==TRUE)
  332. {
  333. if(bControlCode)
  334. {
  335. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  336. }
  337. else
  338. {
  339. TRACE("错误的blob数据");
  340. }
  341. }
  342. //else 忽略
  343. }
  344. else if (adxd->xddxfnumber==1013) //adxd->xddata.xdworlddir
  345. {
  346. if(bControlStart==TRUE)
  347. {
  348. if(bControlCode)
  349. {
  350. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  351. }
  352. else
  353. {
  354. TRACE("错误的blob数据");
  355. }
  356. }
  357. //else 忽略
  358. }
  359. else if (adxd->xddxfnumber==1041) //adxd->xddata.xddist
  360. {
  361. if(bControlStart==TRUE)
  362. {
  363. if(bControlCode)
  364. {
  365. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  366. }
  367. else
  368. {
  369. TRACE("错误的blob数据");
  370. }
  371. }
  372. //else 忽略
  373. }
  374. else if (adxd->xddxfnumber==1042) //adxd->xddata.xdscale
  375. {
  376. if(bControlStart==TRUE)
  377. {
  378. if(bControlCode)
  379. {
  380. processentity_dim_blob(dwghandle,pDimStlAccMgr,dControlCode,adxd->xddxfnumber);bControlCode=FALSE;
  381. }
  382. else
  383. {
  384. TRACE("错误的blob数据");
  385. }
  386. }
  387. //else 忽略
  388. }
  389. }
  390. adEndBlobRead(bcptr);
  391. }
  392. }
  393. return TRUE;
  394. }
  395. BOOL CDwgReader::processentity_dim_tail(AD_DB_HANDLE dwghandle,KmObject* obj)
  396. {
  397. if(!obj->IsKindOf(RUNTIME_CLASS(KmDim)))
  398. {
  399. return FALSE;
  400. }
  401. UINT id;
  402. if(!m_adimstyle.Get(id,aden->dim.dimstyleobjhandle))
  403. {
  404. return FALSE;
  405. }
  406. CKmDataManager* pDataMgr=::GetActiveDataManager();
  407. if(!pDataMgr)
  408. {
  409. return FALSE;
  410. }
  411. CDimStyle* pDimStyle=pDataMgr->GetDimStyle(id);
  412. if(!pDimStyle)
  413. {
  414. return FALSE;
  415. }
  416. KmDim* pDim=(KmDim*)obj;
  417. CString str=aden->dim.dimtext;
  418. if(!str.IsEmpty())
  419. {
  420. VARIANT var;
  421. memset(&var,0,sizeof(VARIANT)); 
  422. var=pDimStyle->GetDimStlVar(DIMTXSTY);
  423. CShape* pShape=m_ashape.Get((UINT)var.intVal);
  424. if(!pShape)
  425. {
  426. return FALSE;
  427. }
  428. double hight;
  429. if(!pDim->GetDSAMgr()->GetDsVar(DIMTXT,var))
  430. {//文字高度
  431. return FALSE;
  432. }
  433. hight=var.dblVal;
  434. //pDim->SetDimValType(VT_USER);
  435. KmText* pText;//"<>"表示尺寸的数值的问题由KmCAD解决
  436. pText=m_pConverter->ConverterEntiey_KmText(FALSE,aden->dim.dimtextmidpt[0],aden->dim.dimtextmidpt[1],aden->dim.dimtextmidpt[2],hight,aden->dim.dimtextrot*180/PI,pShape->m_dShapeWidth,1.0,pShape,str);
  437. if(pText==NULL)return FALSE;
  438. pDim->SetMultiKmText(pText);
  439. delete pText;
  440. }
  441. //AD_DIMTYPE_XORDDIM (this ordinate dimension is in the X direction)
  442. //AD_DIMTYPE_TEXTPOS (indicates the dim text is at a user-defined location).
  443. if(aden->dim.dimflag&AD_DIMTYPE_TEXTPOS)
  444. {
  445. pDim->SetDimTextPos(KmPoint(aden->dim.dimtextmidpt[0],aden->dim.dimtextmidpt[1]));
  446. pDim->SetTxtPosType(VT_USER);
  447. }
  448. if( fabs(aden->dim.dimtextrot)>0.0001 )//非零
  449. {
  450. pDim->SetTxtAngType(VT_USER);
  451. pDim->SetTxtAngOfUser(aden->dim.dimtextrot*180/PI);
  452. }
  453. //将组成尺寸的实体附加到尺寸上.
  454. double lscale;
  455. if(m_ablock.Get(id,aden->dim.blockheaderobjhandle))
  456. {
  457. KmBlockDef* pBlockDef=pDataMgr->GetBlockDef(id);
  458. if(!pBlockDef)return FALSE;
  459. KmObject* pObject=NULL;
  460. for(UINT index=0;index<pBlockDef->GetObjectNum();index++)
  461. {
  462. pBlockDef->GetObjectAt(index,pObject);
  463. if(!pObject)continue;
  464. KmObject* pCopy=(KmObject*)pObject->GetRuntimeClass()->CreateObject();
  465. pCopy->Copy(pObject);
  466. if(aden->dim.dimcloneinfopresent)
  467. {
  468. pCopy->Move(KmPoint(aden->dim.dimcloneinspt[0],aden->dim.dimcloneinspt[1]));
  469. }
  470. if(pDim->Add(pCopy)==NULL)
  471. {
  472. delete pCopy;
  473. }
  474. }
  475. pDim->EndAdd();
  476. }
  477. else
  478. {
  479. pDim->Refresh();
  480. }
  481. return TRUE;
  482. }
  483. BOOL CDwgReader::processentity_dim_blockref(AD_DB_HANDLE dwghandle)
  484. {
  485. UINT id;
  486. double lscale;
  487. m_ablock.Get(aden->dim.blockheaderobjhandle,id,lscale);
  488. int index=m_pConverter->ConverterEntiey_KmBlockref(aden->dim.dimcloneinspt[0],aden->dim.dimcloneinspt[1],aden->dim.dimcloneinspt[2],1,1,1,0,id,FALSE).dwEntIndex;
  489. _WRITE2(str.Format("尺寸%x%x%x%x%x%x%x%x转换为第%d号块引用",adenhd->enthandle[0],adenhd->enthandle[1],adenhd->enthandle[2],adenhd->enthandle[3],adenhd->enthandle[4],adenhd->enthandle[5],adenhd->enthandle[6],adenhd->enthandle[7],index));
  490. return TRUE;
  491. }
  492. void CDwgReader::processentity_dim_blob(AD_DB_HANDLE dwghandle,KmDimStlAcsMgr* &pDimStlAccMgr,int code,short datatype)
  493. {
  494. VARIANT var;
  495. memset(&var,0,sizeof(VARIANT)); 
  496. CString strTemp;
  497. strTemp.Format("%dt%dn",code,datatype);
  498. TRACE(strTemp);
  499. strTemp.Empty();
  500. switch(code)
  501. {
  502. case 3://DIMPOST
  503. if(datatype!=1000)
  504. {
  505. TRACE("错误的数据");
  506. break;
  507. }
  508. strTemp=adxd->xddata.xdstring;
  509. {
  510. VARIANT varTmp;
  511. memset(&varTmp,0,sizeof(VARIANT)); 
  512. CComBSTR bstrTmp = strTemp;
  513. varTmp.vt = VT_BSTR;
  514. varTmp.bstrVal = bstrTmp.Copy();
  515. pDimStlAccMgr->SetDsVar(DIMPOST,varTmp);
  516. }
  517. break;
  518. case 4://DIMAPOST
  519. if(datatype!=1000)
  520. {
  521. TRACE("错误的数据");
  522. break;
  523. }
  524. strTemp=adxd->xddata.xdstring;
  525. {
  526. VARIANT varTmp;
  527. memset(&varTmp,0,sizeof(VARIANT)); 
  528. CComBSTR bstrTmp = strTemp;
  529. varTmp.vt = VT_BSTR;
  530. varTmp.bstrVal = bstrTmp.Copy();
  531. pDimStlAccMgr->SetDsVar(DIMAPOST,varTmp);
  532. }
  533. break;
  534. case 5://DIMBLK
  535. if(datatype!=1000)
  536. {
  537. TRACE("错误的数据");
  538. break;
  539. }
  540. strTemp=adxd->xddata.xdstring;
  541. //wait....
  542. break;
  543. case 6://DIMBLK1
  544. if(datatype!=1000)
  545. {
  546. TRACE("错误的数据");
  547. break;
  548. }
  549. strTemp=adxd->xddata.xdstring;
  550. //wait....
  551. break;
  552. case 7://DIMBLK2
  553. if(datatype!=1000)
  554. {
  555. TRACE("错误的数据");
  556. break;
  557. }
  558. strTemp=adxd->xddata.xdstring;
  559. //wait....
  560. break;
  561. case 40://DIMSCALE
  562. if(datatype!=1040)//adxd->xddata.xdreal
  563. {
  564. TRACE("错误的数据");
  565. break;
  566. }
  567. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  568. pDimStlAccMgr->SetDsVar(DIMSCALE,var);
  569. break;
  570. case 41://DIMASZ
  571. if(datatype!=1040)
  572. {
  573. TRACE("错误的数据");
  574. break;
  575. }
  576. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  577. pDimStlAccMgr->SetDsVar(DIMASZ,var);
  578. break;
  579. case 42://DIMEXO
  580. if(datatype!=1040)
  581. {
  582. TRACE("错误的数据");
  583. break;
  584. }
  585. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  586. pDimStlAccMgr->SetDsVar(DIMEXO,var);
  587. break;
  588. case 43://DIMDLI
  589. if(datatype!=1040)
  590. {
  591. TRACE("错误的数据");
  592. break;
  593. }
  594. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  595. pDimStlAccMgr->SetDsVar(DIMDLI,var);
  596. break;
  597. case 44://DIMEXE
  598. if(datatype!=1040)
  599. {
  600. TRACE("错误的数据");
  601. break;
  602. }
  603. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  604. pDimStlAccMgr->SetDsVar(DIMEXE,var);
  605. break;
  606. case 45://DIMRND
  607. if(datatype!=1040)
  608. {
  609. TRACE("错误的数据");
  610. break;
  611. }
  612. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  613. pDimStlAccMgr->SetDsVar(DIMRND,var);
  614. break;
  615. case 46://DIMDLE
  616. if(datatype!=1040)
  617. {
  618. TRACE("错误的数据");
  619. break;
  620. }
  621. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  622. pDimStlAccMgr->SetDsVar(DIMDLE,var);
  623. break;
  624. case 47://DIMTP
  625. if(datatype!=1040)
  626. {
  627. TRACE("错误的数据");
  628. break;
  629. }
  630. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  631. pDimStlAccMgr->SetDsVar(DIMTP,var);
  632. break;
  633. case 48://DIMTM
  634. if(datatype!=1040)
  635. {
  636. TRACE("错误的数据");
  637. break;
  638. }
  639. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  640. pDimStlAccMgr->SetDsVar(DIMTM,var);
  641. break;
  642. case 140://DIMTXT
  643. if(datatype!=1040)
  644. {
  645. TRACE("错误的数据");
  646. break;
  647. }
  648. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  649. pDimStlAccMgr->SetDsVar(DIMTXT,var);
  650. break;
  651. case 141://DIMCEN
  652. if(datatype!=1040)
  653. {
  654. TRACE("错误的数据");
  655. break;
  656. }
  657. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  658. pDimStlAccMgr->SetDsVar(DIMCEN,var);
  659. break;
  660. case 142://DIMTSZ
  661. if(datatype!=1040)
  662. {
  663. TRACE("错误的数据");
  664. break;
  665. }
  666. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  667. pDimStlAccMgr->SetDsVar(DIMTSZ,var);
  668. break;
  669. case 143://DIMALTF
  670. if(datatype!=1040)
  671. {
  672. TRACE("错误的数据");
  673. break;
  674. }
  675. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  676. pDimStlAccMgr->SetDsVar(DIMALTF,var);
  677. break;
  678. case 144://DIMLFAC
  679. if(datatype!=1040)
  680. {
  681. TRACE("错误的数据");
  682. break;
  683. }
  684. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  685. pDimStlAccMgr->SetDsVar(DIMLFAC,var);
  686. break;
  687. case 145://DIMTVP
  688. if(datatype!=1040)
  689. {
  690. TRACE("错误的数据");
  691. break;
  692. }
  693. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  694. pDimStlAccMgr->SetDsVar(DIMTVP,var);
  695. break;
  696. case 146://DIMTFAC
  697. if(datatype!=1040)
  698. {
  699. TRACE("错误的数据");
  700. break;
  701. }
  702. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  703. pDimStlAccMgr->SetDsVar(DIMTFAC,var);
  704. break;
  705. case 147://DIMGAP
  706. if(datatype!=1040)
  707. {
  708. TRACE("错误的数据");
  709. break;
  710. }
  711. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  712. pDimStlAccMgr->SetDsVar(DIMGAP,var);
  713. break;
  714. case 148://DIMALTRND
  715. if(datatype!=1040)
  716. {
  717. TRACE("错误的数据");
  718. break;
  719. }
  720. var.vt=VT_R8;var.dblVal=adxd->xddata.xdreal;
  721. pDimStlAccMgr->SetDsVar(DIMALTRND,var);
  722. break;
  723. case 71://DIMTOL
  724. if(datatype!=1070)//adxd->xddata.xdint
  725. {
  726. TRACE("错误的数据");
  727. break;
  728. }
  729. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  730. pDimStlAccMgr->SetDsVar(DIMTOL,var);
  731. break;
  732. case 72://DIMLIM
  733. if(datatype!=1070)
  734. {
  735. TRACE("错误的数据");
  736. break;
  737. }
  738. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  739. pDimStlAccMgr->SetDsVar(DIMLIM,var);
  740. break;
  741. case 73://DIMTIH
  742. if(datatype!=1070)
  743. {
  744. TRACE("错误的数据");
  745. break;
  746. }
  747. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  748. pDimStlAccMgr->SetDsVar(DIMTIH,var);
  749. break;
  750. case 74://DIMTOH
  751. if(datatype!=1070)
  752. {
  753. TRACE("错误的数据");
  754. break;
  755. }
  756. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  757. pDimStlAccMgr->SetDsVar(DIMTOH,var);
  758. break;
  759. case 75://DIMSE1
  760. if(datatype!=1070)
  761. {
  762. TRACE("错误的数据");
  763. break;
  764. }
  765. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  766. pDimStlAccMgr->SetDsVar(DIMSE1,var);
  767. break;
  768. case 76://DIMSE2
  769. if(datatype!=1070)
  770. {
  771. TRACE("错误的数据");
  772. break;
  773. }
  774. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  775. pDimStlAccMgr->SetDsVar(DIMSE2,var);
  776. break;
  777. case 77://DIMTAD
  778. if(datatype!=1070)
  779. {
  780. TRACE("错误的数据");
  781. break;
  782. }
  783. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  784. pDimStlAccMgr->SetDsVar(DIMTAD,var);
  785. break;
  786. case 78://DIMZIN
  787. if(datatype!=1070)
  788. {
  789. TRACE("错误的数据");
  790. break;
  791. }
  792. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  793. pDimStlAccMgr->SetDsVar(DIMZIN,var);
  794. break;
  795. case 79://DIMAZIN
  796. if(datatype!=1070)
  797. {
  798. TRACE("错误的数据");
  799. break;
  800. }
  801. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  802. pDimStlAccMgr->SetDsVar(DIMAZIN,var);
  803. break;
  804. case 170://DIMALT  
  805. if(datatype!=1070)
  806. {
  807. TRACE("错误的数据");
  808. break;
  809. }
  810. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  811. pDimStlAccMgr->SetDsVar(DIMALT,var);
  812. break;
  813. case 171://DIMALTD
  814. if(datatype!=1070)
  815. {
  816. TRACE("错误的数据");
  817. break;
  818. }
  819. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  820. pDimStlAccMgr->SetDsVar(DIMALTD,var);
  821. break;
  822. case 172://DIMTOFL
  823. if(datatype!=1070)
  824. {
  825. TRACE("错误的数据");
  826. break;
  827. }
  828. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  829. pDimStlAccMgr->SetDsVar(DIMTOFL,var);
  830. break;
  831. case 173://DIMSAH
  832. if(datatype!=1070)
  833. {
  834. TRACE("错误的数据");
  835. break;
  836. }
  837. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  838. pDimStlAccMgr->SetDsVar(DIMSAH,var);
  839. break;
  840. case 174://DIMTIX
  841. if(datatype!=1070)
  842. {
  843. TRACE("错误的数据");
  844. break;
  845. }
  846. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  847. pDimStlAccMgr->SetDsVar(DIMTIX,var);
  848. break;
  849. case 175://DIMSOXD
  850. if(datatype!=1070)
  851. {
  852. TRACE("错误的数据");
  853. break;
  854. }
  855. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  856. pDimStlAccMgr->SetDsVar(DIMSOXD,var);
  857. break;
  858. case 176://DIMCLRD
  859. if(datatype!=1070)
  860. {
  861. TRACE("错误的数据");
  862. break;
  863. }
  864. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  865. {
  866. try
  867. {
  868. if(var.intVal==AD_COLOR_BYBLOCK)
  869. {
  870. var.intVal=COLOR_BYBLOCK;//随块
  871. }
  872. else if(var.intVal==AD_COLOR_BYLAYER)
  873. {
  874. var.intVal=COLOR_BYLAYER;
  875. }
  876. else
  877. {
  878. if(var.intVal>=0 && var.intVal<m_aColor.GetSize())
  879. {
  880. var.intVal=m_aColor[var.intVal];
  881. }
  882. else
  883. {
  884. TRACE("errordata");
  885. }
  886. }
  887. }
  888. catch(...)
  889. {
  890. _WRITE(str="非法的颜色码");
  891. }
  892. }
  893. pDimStlAccMgr->SetDsVar(DIMCLRD,var);
  894. break;
  895. case 177://DIMCLRE
  896. if(datatype!=1070)
  897. {
  898. TRACE("错误的数据");
  899. break;
  900. }
  901. var.vt=VT_INT;var.intVal=adxd->xddata.xdint;
  902. {
  903. try
  904. {
  905. if(var.intVal==AD_COLOR_BYBLOCK)
  906. {
  907. var.intVal=COLOR_BYBLOCK;//随块
  908. }
  909. else if(var.intVal==AD_COLOR_BYLAYER)
  910. {
  911. var.intVal=COLOR_BYLAYER;
  912. }
  913. else
  914. {
  915. if(var.intVal>=0 && var.intVal<m_aColor.GetSize())
  916. {
  917. var.intVal=m_aColor[var.intVal];
  918. }
  919. else
  920. {
  921. TRACE("errordata");
  922. }
  923. }
  924. }
  925. catch(...)
  926. {
  927. _WRITE(str="非法的颜色码");
  928. }
  929. }
  930. pDimStlAccMgr->SetDsVar(DIMCLRE,var);
  931. break;
  932. case 178://DIMCLRT
  933. if(datatype!=1070)
  934. {
  935. TRACE("错误的数据");
  936. break;
  937. }
  938. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  939. {
  940. try
  941. {
  942. if(var.intVal==AD_COLOR_BYBLOCK)
  943. {
  944. var.intVal=COLOR_BYBLOCK;//随块
  945. }
  946. else if(var.intVal==AD_COLOR_BYLAYER)
  947. {
  948. var.intVal=COLOR_BYLAYER;
  949. }
  950. else
  951. {
  952. if(var.intVal>=0 && var.intVal<m_aColor.GetSize())
  953. {
  954. var.intVal=m_aColor[var.intVal];
  955. }
  956. else
  957. {
  958. TRACE("errordata");
  959. }
  960. }
  961. }
  962. catch(...)
  963. {
  964. _WRITE(str="非法的颜色码");
  965. }
  966. }
  967. pDimStlAccMgr->SetDsVar(DIMCLRT,var);
  968. break;
  969. case 179://DIMADEC
  970. if(datatype!=1070)
  971. {
  972. TRACE("错误的数据");
  973. break;
  974. }
  975. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  976. pDimStlAccMgr->SetDsVar(DIMADEC,var);
  977. break;
  978. case 270://DIMUNIT
  979. if(datatype!=1070)
  980. {
  981. TRACE("错误的数据");
  982. break;
  983. }
  984. // var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  985. // pDimStlAccMgr->SetDsVar(DIMUNIT,var);  DIMUNIT是一个R13变量无需理会
  986. break;
  987. case 271://DIMDEC
  988. if(datatype!=1070)
  989. {
  990. TRACE("错误的数据");
  991. break;
  992. }
  993. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  994. pDimStlAccMgr->SetDsVar(DIMDEC,var);
  995. break;
  996. case 272://DIMTDEC
  997. if(datatype!=1070)
  998. {
  999. TRACE("错误的数据");
  1000. break;
  1001. }
  1002. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1003. pDimStlAccMgr->SetDsVar(DIMTDEC,var);
  1004. break;
  1005. case 273://DIMALTU
  1006. if(datatype!=1070)
  1007. {
  1008. TRACE("错误的数据");
  1009. break;
  1010. }
  1011. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1012. pDimStlAccMgr->SetDsVar(DIMALTU,var);
  1013. break;
  1014. case 274://DIMALTTD
  1015. if(datatype!=1070)
  1016. {
  1017. TRACE("错误的数据");
  1018. break;
  1019. }
  1020. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1021. pDimStlAccMgr->SetDsVar(DIMALTTD,var);
  1022. break;
  1023. case 275://DIMAUNIT
  1024. if(datatype!=1070)
  1025. {
  1026. TRACE("错误的数据");
  1027. break;
  1028. }
  1029. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1030. pDimStlAccMgr->SetDsVar(DIMAUNIT,var);
  1031. break;
  1032. case 276://DIMFRAC
  1033. if(datatype!=1070)
  1034. {
  1035. TRACE("错误的数据");
  1036. break;
  1037. }
  1038. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1039. pDimStlAccMgr->SetDsVar(DIMFRAC,var);
  1040. break;
  1041. case 277://DIMLUNIT
  1042. if(datatype!=1070)
  1043. {
  1044. TRACE("错误的数据");
  1045. break;
  1046. }
  1047. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1048. pDimStlAccMgr->SetDsVar(DIMLUNIT,var);
  1049. break;
  1050. case 278://DIMDSEP
  1051. if(datatype!=1070)
  1052. {
  1053. TRACE("错误的数据");
  1054. break;
  1055. }
  1056. var.vt=VT_I1;var.cVal=(char)adxd->xddata.xdint;
  1057. pDimStlAccMgr->SetDsVar(DIMDSEP,var);
  1058. break;
  1059. case 279://DIMTMOVE
  1060. if(datatype!=1070)
  1061. {
  1062. TRACE("错误的数据");
  1063. break;
  1064. }
  1065. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1066. pDimStlAccMgr->SetDsVar(DIMTMOVE,var);
  1067. break;
  1068. case 280://DIMJUST
  1069. if(datatype!=1070)
  1070. {
  1071. TRACE("错误的数据");
  1072. break;
  1073. }
  1074. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1075. pDimStlAccMgr->SetDsVar(DIMJUST,var);
  1076. break;
  1077. case 281://DIMSD1
  1078. if(datatype!=1070)
  1079. {
  1080. TRACE("错误的数据");
  1081. break;
  1082. }
  1083. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  1084. pDimStlAccMgr->SetDsVar(DIMSD1,var);
  1085. break;
  1086. case 282://DIMSD2
  1087. if(datatype!=1070)
  1088. {
  1089. TRACE("错误的数据");
  1090. break;
  1091. }
  1092. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  1093. pDimStlAccMgr->SetDsVar(DIMSD2,var);
  1094. break;
  1095. case 283://DIMTOLJ
  1096. if(datatype!=1070)
  1097. {
  1098. TRACE("错误的数据");
  1099. break;
  1100. }
  1101. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1102. pDimStlAccMgr->SetDsVar(DIMTOLJ,var);
  1103. break;
  1104. case 284://DIMTZIN
  1105. if(datatype!=1070)
  1106. {
  1107. TRACE("错误的数据");
  1108. break;
  1109. }
  1110. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1111. pDimStlAccMgr->SetDsVar(DIMTZIN,var);
  1112. break;
  1113. case 285://DIMALTZ
  1114. if(datatype!=1070)
  1115. {
  1116. TRACE("错误的数据");
  1117. break;
  1118. }
  1119. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1120. pDimStlAccMgr->SetDsVar(DIMALTZ,var);
  1121. break;
  1122. case 286://DIMALTTZ
  1123. if(datatype!=1070)
  1124. {
  1125. TRACE("错误的数据");
  1126. break;
  1127. }
  1128. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1129. pDimStlAccMgr->SetDsVar(DIMALTTZ,var);
  1130. break;
  1131. case 287://DIMFIT
  1132. //已失效,但为了保持 AutoCAD 2000 以前版本的脚本和 AutoLISP 例程的完整性,仍然保留了它。在 AutoCAD 2000 中它已被 DIMATFIT 和 DIMTMOVE 所替代。
  1133. /* if(datatype!=1070)
  1134. {
  1135. TRACE("错误的数据");
  1136. break;
  1137. }
  1138. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1139. pDimStlAccMgr->SetDsVar(DIMATFIT,var);*/
  1140. break;
  1141. case 288://DIMUPT
  1142. if(datatype!=1070)
  1143. {
  1144. TRACE("错误的数据");
  1145. break;
  1146. }
  1147. var.vt=VT_BOOL;var.boolVal=(VARIANT_BOOL)adxd->xddata.xdint;
  1148. pDimStlAccMgr->SetDsVar(DIMUPT,var);
  1149. break;
  1150. case 289://DIMATFIT
  1151. if(datatype!=1070)
  1152. {
  1153. TRACE("错误的数据");
  1154. break;
  1155. }
  1156. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1157. pDimStlAccMgr->SetDsVar(DIMATFIT,var);
  1158. break;
  1159. case 340://DIMTXSTY
  1160. if(datatype!=1005)
  1161. {
  1162. TRACE("错误的数据");
  1163. break;
  1164. }
  1165. {
  1166. AD_OBJHANDLE handle2;
  1167. adHancpy(handle2,adxd->xddata.xdhandle);
  1168. CMatch5* match;
  1169. if(m_ashape.Get(handle2,match))
  1170. {
  1171. var.vt=VT_INT;var.intVal=(int)match->m_shape->m_KmWordStyleID;
  1172. pDimStlAccMgr->SetDsVar(DIMTXSTY,var);
  1173. }
  1174. }
  1175. break;
  1176. case 341://DIMLDRBLK
  1177. if(datatype!=1005)
  1178. {
  1179. TRACE("错误的数据");
  1180. break;
  1181. }
  1182. //wait..
  1183. break;
  1184. case 342://DIMBLK
  1185. if(datatype!=1005)
  1186. {
  1187. TRACE("错误的数据");
  1188. break;
  1189. }
  1190. //wait..
  1191. break;
  1192. case 343://DIMBLK1
  1193. if(datatype!=1005)
  1194. {
  1195. TRACE("错误的数据");
  1196. break;
  1197. }
  1198. //wait..
  1199. break;
  1200. case 344://DIMBLK2
  1201. if(datatype!=1005)
  1202. {
  1203. TRACE("错误的数据");
  1204. break;
  1205. }
  1206. //wait..
  1207. break;
  1208. case 371://DIMLWD
  1209. if(datatype!=1070)
  1210. {
  1211. TRACE("错误的数据");
  1212. break;
  1213. }
  1214. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1215. {
  1216. if((unsigned short)var.intVal==AD_WEIGHT_DEFAULT)
  1217. {
  1218. var.intVal=m_ilinewidthdefault;
  1219. }
  1220. else if((unsigned short)var.intVal==AD_WEIGHT_BYBLOCK)
  1221. {
  1222. var.intVal=LWIDTH_BYBLOCK;
  1223. }
  1224. else if((unsigned short)var.intVal==AD_WEIGHT_BYLAYER)
  1225. {
  1226. var.intVal=LWIDTH_BYLAYER;
  1227. }
  1228. else
  1229. {
  1230. var.intVal=::GetLineWidthAsInt(double(abs(var.intVal))/100.0);
  1231. }
  1232. }
  1233. pDimStlAccMgr->SetDsVar(DIMLWD,var);
  1234. break;
  1235. case 372://DIMLWE
  1236. if(datatype!=1070)
  1237. {
  1238. TRACE("错误的数据");
  1239. break;
  1240. }
  1241. var.vt=VT_INT;var.intVal=(int)adxd->xddata.xdint;
  1242. if((unsigned short)var.intVal==AD_WEIGHT_DEFAULT)
  1243. {
  1244. var.intVal=m_ilinewidthdefault;
  1245. }
  1246. else if((unsigned short)var.intVal==AD_WEIGHT_BYBLOCK)
  1247. {
  1248. var.intVal=LWIDTH_BYBLOCK;
  1249. }
  1250. else if((unsigned short)var.intVal==AD_WEIGHT_BYLAYER)
  1251. {
  1252. var.intVal=LWIDTH_BYLAYER;
  1253. }
  1254. else
  1255. {
  1256. var.intVal=::GetLineWidthAsInt(double(abs(var.intVal))/100.0);
  1257. }
  1258. pDimStlAccMgr->SetDsVar(DIMLWE,var);
  1259. break;
  1260. default:
  1261. TRACE("没有处理的尺寸样式代码");
  1262. break;
  1263. }
  1264. }
  1265. BOOL CDwgReader::processentity_dim_rotated(AD_DB_HANDLE dwghandle)//0
  1266. {
  1267. KmSimpleDim* pSimpleDim=new KmSimpleDim;
  1268. //the first extension line is specified by defpt2.  
  1269. //The second extension line is specified by defpt3, 
  1270. //and the dimension line is specified by dimlinedefpt.
  1271. KmPoint p1(aden->dim.defpt2[0],aden->dim.defpt2[1]);
  1272. KmPoint p2(aden->dim.defpt3[0],aden->dim.defpt3[1]);
  1273. KmPoint p3(aden->dim.dimlinedefpt[0],aden->dim.dimlinedefpt[1]);
  1274. double ang[2];
  1275. ang[0]=CalcPrecValue(aden->dim.dimrotang*180/PI+90, 0.001);
  1276. ang[1]=0;
  1277. if(!processentity_dim_head(dwghandle,pSimpleDim))
  1278. {
  1279. delete pSimpleDim;
  1280. return FALSE;
  1281. }
  1282. pSimpleDim->GenerateDimNoTag(p3,ang,p1,p2,FALSE,FALSE);
  1283. if(!processentity_dim_tail(dwghandle,pSimpleDim))
  1284. {
  1285. delete pSimpleDim;
  1286. return FALSE;
  1287. }
  1288. m_pConverter->ConverterEntiey_KmObject(pSimpleDim);
  1289. return TRUE;
  1290. }
  1291. BOOL CDwgReader::processentity_dim_aligned(AD_DB_HANDLE dwghandle)
  1292. {
  1293. KmSimpleDim* pSimpleDim=new KmSimpleDim;
  1294. //the first extension line is specified by defpt2.  
  1295. //The second extension line is specified by defpt3, 
  1296. //and the dimension line is specified by dimlinedefpt.
  1297. KmPoint p1(aden->dim.defpt2[0],aden->dim.defpt2[1]);
  1298. KmPoint p2(aden->dim.defpt3[0],aden->dim.defpt3[1]);
  1299. KmPoint p3(aden->dim.dimlinedefpt[0],aden->dim.dimlinedefpt[1]);
  1300. double ang[2];
  1301. ang[0]=CalcPrecValue(GetVticAngKptBToKptE(p1,p2), 0.001);
  1302. ang[1]=0;
  1303. if(!processentity_dim_head(dwghandle,pSimpleDim))
  1304. {
  1305. delete pSimpleDim;
  1306. return FALSE;
  1307. }
  1308. pSimpleDim->GenerateDimNoTag(p3,ang,p1,p2,FALSE,FALSE);
  1309. if(!processentity_dim_tail(dwghandle,pSimpleDim))
  1310. {
  1311. delete pSimpleDim;
  1312. return FALSE;
  1313. }
  1314. m_pConverter->ConverterEntiey_KmObject(pSimpleDim);
  1315. return TRUE;
  1316. }
  1317. BOOL CDwgReader::processentity_dim_diameter(AD_DB_HANDLE dwghandle)
  1318. {
  1319. KmDiameterDim* pDiameterDim=new KmDiameterDim;
  1320. //生成无目标尺寸
  1321. //void GenerateDimNoTag(KmPoint kptCurPos, double dCurAng[], KmPoint kptTag1, KmPoint kptTag2);
  1322. //defpt4 is the point selected on the circle or arc being dimensioned.
  1323. //dimlinedefpt is the point on the circle exactly across from the selection point.
  1324. //dimtextmidpt 
  1325. KmPoint p1(aden->dim.defpt4[0],aden->dim.defpt4[1]);
  1326. KmPoint p2(aden->dim.dimlinedefpt[0],aden->dim.dimlinedefpt[1]);
  1327. KmPoint p3(aden->dim.dimtextmidpt[0],aden->dim.dimtextmidpt[1]);
  1328. double ang[2];
  1329. //ang[0]=GetVticAngKptBToKptE(p1,p2);
  1330. ang[0]=GetAngKptBToKptE(p1,p2);
  1331. ang[1]=0.0;
  1332. if(!processentity_dim_head(dwghandle,pDiameterDim))
  1333. {
  1334. delete pDiameterDim;
  1335. return FALSE;
  1336. }
  1337. {
  1338. KmPoint p4=::OrthPt2Ln(p3,p1,p2);
  1339. if(! ( fabs(p4.x-p3.x)<PRECISION && fabs(p4.y-p3.y)<PRECISION ) )
  1340. {
  1341. pDiameterDim->SetDLRelateTxt(FALSE);
  1342. }
  1343. }
  1344. CString strTemp;
  1345. {
  1346. VARIANT var;
  1347. memset(&var,0,sizeof(VARIANT)); 
  1348. pDiameterDim->GetDSAMgr()->GetDsVar(DIMPOST,var);
  1349. strTemp=var.bstrVal;
  1350. if(( strTemp.Find("<>")==0 ) )
  1351. {
  1352. strTemp="%%c"+strTemp;
  1353. }
  1354. else if(strTemp.Find("<>")==-1)
  1355. {
  1356. strTemp="%%c<>"+strTemp;
  1357. }
  1358. }
  1359. pDiameterDim->GenerateDimNoTag(p3,ang,p1,p2,FALSE,FALSE);
  1360. if(!processentity_dim_tail(dwghandle,pDiameterDim))
  1361. {
  1362. delete pDiameterDim;
  1363. return FALSE;
  1364. }
  1365. //如果没有前缀,自动增加%%c
  1366. {
  1367. VARIANT varTmp;
  1368. memset(&varTmp,0,sizeof(VARIANT)); 
  1369. VARIANT var;
  1370. memset(&var,0,sizeof(VARIANT)); 
  1371. pDiameterDim->GetDSAMgr()->GetDsVar(DIMPOST,var);
  1372. CString strTemp2=var.bstrVal;
  1373. if(strTemp2!=strTemp)
  1374. {
  1375. CComBSTR bstrTmp = strTemp;
  1376. varTmp.vt = VT_BSTR;
  1377. varTmp.bstrVal = bstrTmp.Copy();
  1378. pDiameterDim->GetDSAMgr()->SetDsVar(DIMPOST,varTmp);
  1379. }
  1380. }
  1381. m_pConverter->ConverterEntiey_KmObject(pDiameterDim);
  1382. return TRUE;
  1383. }
  1384. BOOL CDwgReader::processentity_dim_ordinate(AD_DB_HANDLE dwghandle)
  1385. {
  1386. //坐标标注,暂不支持
  1387. //defpt3 is the point which was selected.  
  1388. //defpt4 is the point indicating the endpoint of the leader.
  1389. return FALSE;
  1390. }
  1391. BOOL CDwgReader::processentity_dim_radius(AD_DB_HANDLE dwghandle)
  1392. {
  1393. KmRadiusDim* pRadiusDim=new KmRadiusDim;
  1394. //dimlinedefpt 圆心
  1395. //defpt4 圆上点
  1396. KmPoint p1(aden->dim.dimlinedefpt[0],aden->dim.dimlinedefpt[1]);
  1397. KmPoint p2(aden->dim.defpt4[0],aden->dim.defpt4[1]);
  1398. KmPoint p3;p3.x=2*p1.x-p2.x;p3.y=2*p1.y-p2.y;
  1399. KmPoint p4(aden->dim.dimtextmidpt[0],aden->dim.dimtextmidpt[1]);
  1400. double ang[2];
  1401. ang[0]=GetAngKptBToKptE(p1,p2);
  1402. ang[1]=0;
  1403. if(!processentity_dim_head(dwghandle,pRadiusDim))
  1404. {
  1405. delete pRadiusDim;
  1406. return FALSE;
  1407. }
  1408. {
  1409. KmPoint p5=::OrthPt2Ln(p4,p1,p2);
  1410. if(!( fabs(p5.x-p4.x)<PRECISION && fabs(p5.y-p4.y)<PRECISION ) )
  1411. {
  1412. pRadiusDim->SetDLRelateTxt(FALSE);
  1413. }
  1414. }
  1415. //如果没有前缀,自动增加R
  1416. CString strTemp;
  1417. {
  1418. VARIANT var;
  1419. memset(&var,0,sizeof(VARIANT)); 
  1420. pRadiusDim->GetDSAMgr()->GetDsVar(DIMPOST,var);
  1421. strTemp=var.bstrVal;
  1422. if(( strTemp.Find("<>")==0 ) )
  1423. {
  1424. strTemp="R"+strTemp;
  1425. }
  1426. else if( strTemp.Find("<>")==-1 )
  1427. {
  1428. strTemp="R<>"+strTemp;
  1429. }
  1430. }
  1431. pRadiusDim->GenerateDimNoTag(p4,ang,p2,p3,FALSE,FALSE);
  1432. if(!processentity_dim_tail(dwghandle,pRadiusDim))
  1433. {
  1434. delete pRadiusDim;
  1435. return FALSE;
  1436. }
  1437. {
  1438. VARIANT varTmp;
  1439. memset(&varTmp,0,sizeof(VARIANT)); 
  1440. VARIANT var;
  1441. memset(&var,0,sizeof(VARIANT)); 
  1442. pRadiusDim->GetDSAMgr()->GetDsVar(DIMPOST,var);
  1443. CString strTemp2=var.bstrVal;
  1444. if(strTemp2!=strTemp)
  1445. {
  1446. CComBSTR bstrTmp = strTemp;
  1447. varTmp.vt = VT_BSTR;
  1448. varTmp.bstrVal = bstrTmp.Copy();
  1449. pRadiusDim->GetDSAMgr()->SetDsVar(DIMPOST,varTmp);
  1450. }
  1451. }
  1452. m_pConverter->ConverterEntiey_KmObject(pRadiusDim);
  1453. return TRUE;
  1454. }
  1455. BOOL CDwgReader::processentity_dim_angular(AD_DB_HANDLE dwghandle)
  1456. {
  1457. KmVAngleDim* pVAngleDim=new KmVAngleDim;
  1458. //角度标注
  1459. //defpt2 and defpt3 are the endpoints of the first extension line.
  1460. //dimlinedefpt and defpt4 are the endpoints of the second extension line.  
  1461. //arcdefpt specifies the dimension line arc.
  1462. KmPoint p3(aden->dim.defpt2[0],aden->dim.defpt2[1]);
  1463. KmPoint p4(aden->dim.defpt3[0],aden->dim.defpt3[1]);
  1464. KmPoint p1(aden->dim.dimlinedefpt[0],aden->dim.dimlinedefpt[1]);
  1465. KmPoint p2(aden->dim.defpt4[0],aden->dim.defpt4[1]);
  1466. KmPoint p5(aden->dim.arcdefpt[0],aden->dim.arcdefpt[1]);
  1467. KmLine line1,line2;
  1468. line1.SetBegin(p1);
  1469. line1.SetEnd(p2);
  1470. line2.SetBegin(p3);
  1471. line2.SetEnd(p4);
  1472. double sx[3];
  1473. double sy[3];
  1474. if(sec_i_LL(&line1,&line2,sx,sy,3)!=1)
  1475. {
  1476. delete pVAngleDim;
  1477. return FALSE;
  1478. }
  1479. KmPoint p6(sx[0],sy[0]);
  1480. double ang[2];
  1481. if( ((p6.x-p1.x)*(p6.x-p1.x)+(p6.y-p1.y)*(p6.y-p1.y))>((p6.x-p2.x)*(p6.x-p2.x)+(p6.y-p2.y)*(p6.y-p2.y)))
  1482. {
  1483. ang[0]=GetAngKptBToKptE(p6,p1);
  1484. }
  1485. else
  1486. {
  1487. ang[0]=GetAngKptBToKptE(p6,p2);
  1488. p1=p2;
  1489. }
  1490. if( ((p6.x-p3.x)*(p6.x-p3.x)+(p6.y-p3.y)*(p6.y-p3.y))>((p6.x-p4.x)*(p6.x-p4.x)+(p6.y-p4.y)*(p6.y-p4.y)))
  1491. {
  1492. ang[1]=GetAngKptBToKptE(p6,p3);
  1493. }
  1494. else
  1495. {
  1496. ang[1]=GetAngKptBToKptE(p6,p4);
  1497. p3=p4;
  1498. }
  1499. pVAngleDim->SetVertex(p6);
  1500. double angmid=(ang[0]+ang[1])*0.5*PI/180;
  1501. double r=::sqrt( (p6.x-p1.x)*(p6.x-p1.x) + (p6.y-p1.y)*(p6.y-p1.y) );
  1502. KmPoint pt;
  1503. pt.x=p6.x+r*cos(angmid);
  1504. pt.y=p6.y+r*sin(angmid);
  1505. pVAngleDim->SetArcMid(pt);
  1506. if(!processentity_dim_head(dwghandle,pVAngleDim))
  1507. {
  1508. delete pVAngleDim;
  1509. return FALSE;
  1510. }
  1511. try
  1512. {
  1513. BOOL bHide1;
  1514. BOOL bHide2;
  1515. VARIANT var;
  1516. memset(&var,0,sizeof(VARIANT)); 
  1517. pVAngleDim->GetDSAMgr()->GetDsVar(DIMSD1,var);
  1518. bHide1=var.boolVal;
  1519. pVAngleDim->GetDSAMgr()->GetDsVar(DIMSD2,var);
  1520. bHide2=var.boolVal;
  1521. if(  (bHide1&&(!bHide2)) ||  (bHide2&&(!bHide1)) )
  1522. {//依据从起点 -> 控制点 -> 终点 逆时针旋转的原则处理
  1523. double dAngle=GetAngKptBToKptE(p6,p5);
  1524. if(Begin_Angle_End(dAngle,ang[0],ang[1],MESSAGE_CIRCLE_POSITIVE)=='n')
  1525. {
  1526. bHide1=!bHide1;
  1527. bHide2=!bHide2;
  1528. var.boolVal=bHide1;
  1529. pVAngleDim->GetDSAMgr()->SetDsVar(DIMSD1,var);
  1530. var.boolVal=bHide2;
  1531. pVAngleDim->GetDSAMgr()->SetDsVar(DIMSD2,var);
  1532. }
  1533. }
  1534. }
  1535. catch(...)
  1536. {
  1537. } pVAngleDim->GenerateDimNoTag(p5,ang,p1,p3,FALSE,FALSE);
  1538. if(!processentity_dim_tail(dwghandle,pVAngleDim))
  1539. {
  1540. delete pVAngleDim;
  1541. return FALSE;
  1542. }
  1543. m_pConverter->ConverterEntiey_KmObject(pVAngleDim);
  1544. return TRUE;
  1545. }
  1546. BOOL CDwgReader::processentity_dim_angular3pt(AD_DB_HANDLE dwghandle)
  1547. {
  1548. KmVAngleDim* pVAngleDim=new KmVAngleDim;
  1549. //角度标注
  1550. //defpt4 is the vertex of the angle.
  1551. //defpt2 is the endpoint of the first extension line.  
  1552. //defpt3 is the endpoint of the second extension line.  
  1553. //dimlinedefpt specifies the arc for the dimension line.
  1554. KmPoint p1(aden->dim.defpt4[0],aden->dim.defpt4[1]);
  1555. KmPoint p3(aden->dim.defpt2[0],aden->dim.defpt2[1]);
  1556. KmPoint p2(aden->dim.defpt3[0],aden->dim.defpt3[1]);
  1557. KmPoint p4(aden->dim.dimlinedefpt[0],aden->dim.dimlinedefpt[1]);
  1558. double ang[2];
  1559. ang[0]=GetAngKptBToKptE(p1,p2);
  1560. ang[1]=GetAngKptBToKptE(p1,p3);
  1561. pVAngleDim->SetVertex(p1);
  1562. double angmid=(ang[0]+ang[1])*0.5*PI/180;
  1563. double r=::sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) );
  1564. KmPoint pt;
  1565. pt.x=p1.x+r*cos(angmid);
  1566. pt.y=p1.y+r*sin(angmid);
  1567. pVAngleDim->SetArcMid(pt);
  1568. if(!processentity_dim_head(dwghandle,pVAngleDim))
  1569. {
  1570. delete pVAngleDim;
  1571. return FALSE;
  1572. }
  1573. try
  1574. {
  1575. BOOL bHide1;
  1576. BOOL bHide2;
  1577. VARIANT var;
  1578. memset(&var,0,sizeof(VARIANT)); 
  1579. pVAngleDim->GetDSAMgr()->GetDsVar(DIMSD1,var);
  1580. bHide1=var.boolVal;
  1581. pVAngleDim->GetDSAMgr()->GetDsVar(DIMSD2,var);
  1582. bHide2=var.boolVal;
  1583. if(  (bHide1&&(!bHide2)) ||  (bHide2&&(!bHide1)) )
  1584. {//依据从起点 -> 控制点 -> 终点 逆时针旋转的原则处理
  1585. double dAngle=GetAngKptBToKptE(p1,p4);
  1586. if(Begin_Angle_End(dAngle,ang[0],ang[1],MESSAGE_CIRCLE_POSITIVE)=='n')
  1587. {
  1588. bHide1=!bHide1;
  1589. bHide2=!bHide2;
  1590. var.boolVal=bHide1;
  1591. pVAngleDim->GetDSAMgr()->SetDsVar(DIMSD1,var);
  1592. var.boolVal=bHide2;
  1593. pVAngleDim->GetDSAMgr()->SetDsVar(DIMSD2,var);
  1594. }
  1595. }
  1596. }
  1597. catch(...)
  1598. {
  1599. }
  1600. pVAngleDim->GenerateDimNoTag(p4,ang,p2,p3,FALSE,FALSE);
  1601. if(!processentity_dim_tail(dwghandle,pVAngleDim))
  1602. {
  1603. delete pVAngleDim;
  1604. return FALSE;
  1605. }
  1606. m_pConverter->ConverterEntiey_KmObject(pVAngleDim);
  1607. return TRUE;
  1608. }