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

CAD

开发平台:

Visual C++

  1. // KmgConverter.cpp: implementation of the CKmgConverter class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "FileSwitch.h"
  6. #include "KmgConverter.h"
  7. #include "KmLayer.h"
  8. #include "showdef.h"
  9. #include "entdef.h"
  10. #include "KmEntity.h"
  11. #include "Block.h"
  12. #include "WordStyle.h"
  13. #include "DwgReader.h"
  14. #include "Reader.h"
  15. #include "UnicodeCharMapWideChar.h"
  16. #ifdef _DEBUG
  17. #undef THIS_FILE
  18. static char THIS_FILE[]=__FILE__;
  19. #define new DEBUG_NEW
  20. #endif
  21. extern CStdioFile g_CensorialFile; //监察转换进度的文件
  22. extern int g_mode;
  23. extern CTypedPtrMap<CMapStringToPtr, CString, void*> g_afont;
  24. extern double calculate_findTTFHightRate(CString strFontName);
  25. extern CUnicodeCharMapWideChar g_UnicodeCharMapWideChar;
  26. #define ACADTEXTSPACE 1
  27. KMOBJECTID CKmgConverter::ConverterEntiey_KmSText(CString strText,double x0,double y0,double z0,PAD_TDATA style,CShape* shape)
  28. {
  29. KmText* pText=new KmText;
  30. // 1.使用文本编辑实体中的方法向文本中添加字符
  31. // b.构造并以(字符+字样式)初始化字符或字符串(在此讨论转义字符)
  32. UINT wsID=0;
  33. CWordStyle ws(WORDS_STANDARD);
  34. // b1.字体名称wsFontName 采用默认字体,暂不考虑
  35. if(shape->m_bUseSHX){if(shape->m_strBigFontfilename.IsEmpty())shape->m_strBigFontfilename="bzdft.shx";ws.SetFontName(shape->m_strShapefilename + ';' + shape->m_strBigFontfilename );}
  36. else{ws.SetFontName( shape->m_strShapefilename);style->height*=calculate_findTTFHightRate(ws.GetFontName());}
  37. // b2.高wsfHeight
  38. ws.SetHeight(style->height);
  39. // b3.宽高比例wsfWFactor
  40. ws.SetWFactor(style->widthfactor);
  41. // b4.字间距因子,为字间距与字宽的比例 采用默认间距
  42. ws.SetPFactor(ACADTEXTSPACE);
  43. // b5.方向,0,1,2,3分别表示0,90,180,270度
  44. // b6.字体效果SetEffect
  45. //if(style->generationflag&AD_TEXT_GEN_BACKWARD)//反向{//ws.SetEffect(WS_EFFECT_YMIRROR,TRUE);}if(style->generationflag&AD_TEXT_GEN_UPSIDEDOWN)//颠倒{//ws.SetEffect(WS_EFFECT_XMIRROR,TRUE);}
  46. if(style->oblique!=0){ws.SetEffect(WS_EFFECT_ITALIC,TRUE);}
  47. wsID=pText->AddWordStyle(&ws);
  48. if(wsID){if(pText->SetCurWSID(wsID)==-1){_WRITE(str="设置字样式失败");}}else{_WRITE(str="设置字样式失败");}
  49. // c.将字符或字符串添加到文本编辑器中
  50. if(!ConverterEntiey_KmString(pText,strText,wsID))
  51. {
  52. delete pText;
  53. KMOBJECTID id;
  54. return id;
  55. }
  56. // 2.设置文本的其他属性
  57. // a.对齐方式
  58. // switch(style->justification){case AD_TEXT_JUST_LEFT:case AD_TEXT_JUST_CENTER:case AD_TEXT_JUST_RIGHT:case AD_TEXT_JUST_ALIGNED:case AD_TEXT_JUST_MIDDLE:case AD_TEXT_JUST_FIT:break;}
  59. // switch(style->vertalignment){case AD_TEXT_VALIGN_BASELINE:case AD_TEXT_VALIGN_BOTTOM:case AD_TEXT_VALIGN_MIDDLE:case AD_TEXT_VALIGN_TOP:break;}
  60. // e.角度SetAngle
  61. if( (style->generationflag&AD_TEXT_GEN_BACKWARD)&&(style->generationflag&AD_TEXT_GEN_UPSIDEDOWN) ){y0-=1.5*style->height;pText->SetOrient(180+style->rotang*180/PI);}
  62. else{pText->SetOrient(style->rotang*180/PI);}
  63. pText->ReadjustText();
  64. // 3.设置文本的放置点(左上角)
  65. pText->SetTopLeft(KmPoint(x0,y0));
  66. return AddObject(pText);
  67. }
  68. KMOBJECTID CKmgConverter::ConverterEntiey_KmText(CString strEnter,double x0,double y0,double z0,double angle,double texthight,double widthhight,double spacehight,char flag,double height,double width,CShape* shape,double maxWidth)
  69. {
  70. KmText* pText=new KmText;
  71. // 1.使用文本编辑实体中的方法向文本中添加字符
  72. // b.构造并以(字符+字样式)初始化字符或字符串(在此讨论转义字符)
  73. UINT wsID=0;
  74. CWordStyle ws(WORDS_STANDARD);
  75. // b1.字体名称wsFontName 采用默认字体,暂不考虑
  76. if(shape->m_bUseSHX){if(shape->m_strBigFontfilename.IsEmpty())shape->m_strBigFontfilename="bzdft.shx";ws.SetFontName(shape->m_strShapefilename + ';' + shape->m_strBigFontfilename );}
  77. else{ws.SetFontName( shape->m_strShapefilename);texthight*=calculate_findTTFHightRate(ws.GetFontName());}
  78. // b2.高wsfHeight
  79. ws.SetHeight(texthight);
  80. // b3.宽高比例wsfWFactor =字宽/字高
  81. ws.SetWFactor(widthhight);
  82. // b4.字间距因子  =(字宽+字间距)/字宽
  83. ws.SetPFactor(ACADTEXTSPACE);//认为DWG中字宽+字间距=字高*(DWG宽度比例,适当调整) 
  84. // b5.方向,0,1,2,3分别表示0,90,180,270度
  85. // b6.字体效果SetEffect
  86. wsID=pText->AddWordStyle(&ws);
  87. if(wsID){if(pText->SetCurWSID(wsID)==-1){_WRITE(str="设置字样式失败");}}
  88. else{_WRITE(str="设置字样式失败");}
  89. // c.将字符或字符串添加到文本编辑器中
  90. CUIntArray aWSIDs;
  91. if(!ConverterEntiey_KmMString(pText,strEnter,wsID,aWSIDs))
  92. {
  93. delete pText;
  94. KMOBJECTID id;
  95. return id;
  96. }
  97. // 2.设置文本的其他属性
  98. // a.对齐方式
  99. pText->SetRowAlign(KT_ALIGN_BOTTOM); //列对齐方式
  100. switch(flag)
  101. {
  102. case AD_MTEXT_ATTACH_TOPLEFT:
  103. pText->SetColAlign(KT_ALIGN_LEFT); //行对齐方式
  104. break;
  105. case AD_MTEXT_ATTACH_TOPCENTER:
  106. pText->SetColAlign(KT_ALIGN_MIDDLE); //行对齐方式
  107. break;
  108. case AD_MTEXT_ATTACH_TOPRIGHT:
  109. pText->SetColAlign(KT_ALIGN_RIGHT); //行对齐方式
  110. break;
  111. case AD_MTEXT_ATTACH_MIDDLELEFT:
  112. pText->SetColAlign(KT_ALIGN_LEFT); //行对齐方式
  113. break;
  114. case AD_MTEXT_ATTACH_MIDDLECENTER:
  115. pText->SetColAlign(KT_ALIGN_MIDDLE); //行对齐方式
  116. break;
  117. case AD_MTEXT_ATTACH_MIDDLERIGHT:
  118. pText->SetColAlign(KT_ALIGN_RIGHT); //行对齐方式
  119. break;
  120. case AD_MTEXT_ATTACH_BOTTOMLEFT:
  121. pText->SetColAlign(KT_ALIGN_LEFT); //行对齐方式
  122. break;
  123. case AD_MTEXT_ATTACH_BOTTOMCENTER:
  124. pText->SetColAlign(KT_ALIGN_MIDDLE); //行对齐方式
  125. break;
  126. case AD_MTEXT_ATTACH_BOTTOMRIGHT:
  127. pText->SetColAlign(KT_ALIGN_RIGHT); //行对齐方式
  128. break;
  129. }
  130. // b.行间距SetLinePitch 单倍行距等
  131. pText->SetLinePitch(1+spacehight/texthight);
  132. // e.角度SetAngle
  133. pText->SetOrient(angle*180/PI);
  134. // f.矩形和文本之间的关系SetRelevance //采用默认设置
  135. // g.重新调整文本
  136. pText->ReadjustText();
  137. // 3.设置文本的放置点(左上角)
  138. pText->SetTopLeft(KmPoint(x0,y0));
  139. if(maxWidth>PRECISION)
  140. {
  141. double dAddAutoReturnWidth=1.1;
  142. CWinApp* pApp=::AfxGetApp();
  143. if(pApp)
  144. {
  145. CString str=pApp->GetProfileString(_T("Dwg2Kmg"),_T("AddAutoReturnWidth"),"1.1");
  146. dAddAutoReturnWidth=::atof(str);
  147. if(dAddAutoReturnWidth>100||dAddAutoReturnWidth<0.1)
  148. {
  149. dAddAutoReturnWidth=dAddAutoReturnWidth;
  150. }
  151. }
  152. {
  153. CWordStyle* pWordStyle;
  154. if(!m_mapFont.IsEmpty())
  155. {
  156. for(int i=0;i<((KmText*)pText)->GetWordStyleNum();i++)
  157. {
  158. pWordStyle=((KmText*)pText)->GetNoNWordStyle(i);
  159. if(pWordStyle)
  160. {
  161. Calculate_ChangeFont(pWordStyle);
  162. }
  163. }
  164. }
  165. }
  166. pText->AutoReturn(maxWidth*dAddAutoReturnWidth);//自动换行,增大宽度百分之四十
  167. }
  168. return AddObject(pText);
  169. }
  170. KmText*    CKmgConverter::ConverterEntiey_KmText(BOOL btol,double x0,double y0,double z0,double texthight,double angle,double width,double space,CShape* shape,CString strEnter)
  171. {
  172. KmText* pText=new KmText;
  173. // 1.使用文本编辑实体中的方法向文本中添加字符
  174. // b.构造并以(字符+字样式)初始化字符或字符串(在此讨论转义字符)
  175. UINT wsID=0;
  176. CWordStyle ws(WORDS_STANDARD);
  177. // b1.字体名称wsFontName 采用默认字体,暂不考虑
  178. if(shape->m_bUseSHX){if(shape->m_strBigFontfilename.IsEmpty())shape->m_strBigFontfilename="bzdft.shx";ws.SetFontName(shape->m_strShapefilename + ';' + shape->m_strBigFontfilename );}
  179. else{ws.SetFontName( shape->m_strShapefilename);texthight*=calculate_findTTFHightRate(ws.GetFontName());}
  180. // b2.高wsfHeight
  181. ws.SetHeight(texthight);
  182. // b3.宽高比例wsfWFactor
  183. ws.SetWFactor(width);
  184. // b4.字间距因子  =(字宽+字间距)/字宽
  185. ws.SetPFactor(space);
  186. // b5.方向,0,1,2,3分别表示0,90,180,270度
  187. // b6.字体效果SetEffect
  188. wsID=pText->AddWordStyle(&ws);
  189. if(wsID){if(pText->SetCurWSID(wsID)==-1){_WRITE(str="设置字样式失败");}}
  190. else{_WRITE(str="设置字样式失败");}
  191. // c.将字符或字符串添加到文本编辑器中
  192. if(btol)
  193. {
  194. if(!ConverterEntiey_KmTString(pText,strEnter,wsID))
  195. {
  196. delete pText;
  197. return NULL;
  198. }
  199. }
  200. else
  201. {
  202. CUIntArray aWSIDs;
  203. if(!ConverterEntiey_KmMString(pText,strEnter,wsID,aWSIDs))
  204. {
  205. delete pText;
  206. return NULL;
  207. }
  208. }
  209. // 2.设置文本的其他属性
  210. // a.对齐方式
  211. // b.行间距SetLinePitch 单倍行距等
  212. pText->SetLinePitch(1.0);  //※保证两个形位公差紧密相连接
  213. // e.角度SetAngle
  214. pText->SetOrient(angle*180/PI);
  215. // f.矩形和文本之间的关系SetRelevance //采用默认设置
  216. // g.重新调整文本
  217. pText->ReadjustText();
  218. // 3.设置文本的放置点(左上角)
  219. pText->SetTopLeft(KmPoint(x0,y0));
  220. return pText;
  221. }
  222. KMOBJECTID CKmgConverter::ConverterEntiey_KmText(BOOL btol,CString strEnter,double x0,double y0,double z0,double texthight,double angle,double width,double space,CShape* shape)
  223. {
  224. KmText* pText=ConverterEntiey_KmText(btol,x0,y0,z0,texthight,angle,width,space,shape,strEnter);
  225. if(pText==NULL)
  226. {
  227. KMOBJECTID id;
  228. return id;
  229. }
  230. return AddObject(pText);
  231. }
  232. #define ADDCHAR(x,y)  
  233. if(pText&&x>=0&&x<=0x7f&&x!=' ') 
  234. CWordStyle * pws=pText->GetWordStyle(curws); 
  235. if(pws) 
  236. CString strFontName=pws->GetFontName(); 
  237. strFontName.MakeLower(); 
  238. if(strFontName.Find(".shx")!=-1) 
  239. CWordStyle * pws2=new CWordStyle; 
  240. *pws2=*pws; 
  241. pws2->SetWFactor(pws2->GetWFactor()/CFACTOR); 
  242. UINT ut=pText->AddWordStyle(pws2); 
  243. strNew+=(char)x;aWSIDs.Add(ut);index+=y; 
  244. delete pws2; 
  245. else 
  246. strNew+=(char)x;aWSIDs.Add(curws);index+=y; 
  247. else 
  248. ASSERT(FALSE); 
  249. strNew+=(char)x;aWSIDs.Add(curws);index+=y; 
  250. else 
  251. strNew+=(char)x;aWSIDs.Add(curws);index+=y; 
  252. }
  253. BOOL CKmgConverter::ConverterEntiey_KmString(KmText* pText,CString strText,UINT baseWS)
  254. {
  255. #ifdef _BAOJI_
  256. calculate_convert_ii(strText);
  257. #endif
  258. //单行文字
  259. // Unicode字符 %%nnn %%% %%c 格式控制符
  260. // 代码页无关 多字节交换
  261. //单行文字 是 是 是 是 是(dpc+ou) 否
  262. CUIntArray aWSIDs;
  263. CString strNew;
  264. UINT curws=baseWS;
  265. for(int index=0;index<strText.GetLength();)
  266. {
  267. switch(strText[index])
  268. {
  269. case 0x25://'%'
  270. if((index+2)<strText.GetLength())
  271. {
  272. if(strText[index+1]==0x25)//'%'
  273. {
  274. switch(strText[index+2])
  275. {
  276. //{xlf: 为单行文本增加对%%c %%d %%p %%% 的讨论
  277. case 'c':
  278. case 'C':
  279. case 'd':
  280. case 'D':
  281. case 'p':
  282. case 'P':
  283. case '%':
  284. ADDCHAR('%',0);
  285. ADDCHAR('%',0);
  286. ADDCHAR(strText[index+2],3);
  287. goto nextcode;
  288. break;
  289. case 0x6F://'o'
  290. case 0x4f://'O'
  291. index+=3;
  292. goto nextcode;
  293. break;
  294. case 0x75://'u'
  295. case 0x55://'U'
  296. index+=3;
  297. goto nextcode;
  298. break;
  299. //xlf}
  300. default:
  301. if(strText[index+2]>=0x30&&strText[index+2]<=0x39)//'0'-'9'
  302. {
  303. if((index+3)<strText.GetLength())
  304. {
  305. if(strText[index+3]>=0x30&&strText[index+3]<=0x39)
  306. {
  307. if((index+4)<strText.GetLength())
  308. {
  309. if(strText[index+4]>=0x30&&strText[index+4]<=0x39)
  310. {
  311. ADDCHAR((strText[index+2]-0x30)*100+(strText[index+3]-0x30)*10+(strText[index+4]-0x30),5);
  312. goto nextcode;
  313. break;
  314. }
  315. else
  316. {
  317. ADDCHAR((strText[index+2]-0x30)*10+(strText[index+3]-0x30),4);
  318. goto nextcode;
  319. break;
  320. }
  321. }
  322. else
  323. {
  324. ADDCHAR((strText[index+2]-0x30)*10+(strText[index+3]-0x30),4);
  325. goto nextcode;
  326. break;
  327. }
  328. }
  329. else
  330. {
  331. ADDCHAR(strText[index+2]-0x30,3);
  332. goto nextcode;
  333. break;
  334. }
  335. }
  336. else
  337. {
  338. ADDCHAR(strText[index+2]-0x30,3);
  339. goto nextcode;
  340. break;
  341. }
  342. }
  343. break;
  344. }
  345. }
  346. }
  347. ADDCHAR(strText[index],1);
  348. ADDCHAR('%',0);
  349. ADDCHAR('%',0);
  350. goto nextcode;
  351. break;
  352. case 0x5c://'\' 
  353. if((index+2)<strText.GetLength())
  354. {
  355. if(strText[index+2]==0x2b)//'+'
  356. {
  357. if(strText[index+1]==0x6d||strText[index+1]==0x4d)//'m''M'
  358. {
  359. if((index+2+5)<strText.GetLength())
  360. {
  361. if((strText[index+4]>=0x30&&strText[index+4]<=0x39)//'0'-'9'
  362. ||(strText[index+4]>=0x61&&strText[index+4]<=0x66)//'A'-'F'
  363. ||(strText[index+4]>=0x41&&strText[index+4]<=0x46))//'a'-'f'
  364. if((strText[index+5]>=0x30&&strText[index+5]<=0x39)//'0'-'9'
  365. ||(strText[index+5]>=0x61&&strText[index+5]<=0x66)//'A'-'F'
  366. ||(strText[index+5]>=0x41&&strText[index+5]<=0x46))//'a'-'f'
  367. if((strText[index+6]>=0x30&&strText[index+6]<=0x39)//'0'-'9'
  368. ||(strText[index+6]>=0x61&&strText[index+6]<=0x66)//'A'-'F'
  369. ||(strText[index+6]>=0x41&&strText[index+6]<=0x46))//'a'-'f'
  370. if((strText[index+7]>=0x30&&strText[index+7]<=0x39)//'0'-'9'
  371. ||(strText[index+7]>=0x61&&strText[index+7]<=0x66)//'A'-'F'
  372. ||(strText[index+7]>=0x41&&strText[index+7]<=0x46))//'a'-'f'
  373. {
  374. char ch;
  375. if(strText[index+4]>=0x61)
  376. {
  377. ch=strText[index+4]-0x61+10;
  378. }
  379. else if(strText[index+4]>=0x41)
  380. {
  381. ch=strText[index+4]-0x41+10;
  382. }
  383. else
  384. {
  385. ch=strText[index+4]-0x30;
  386. }
  387. if(strText[index+5]>=0x61)
  388. {
  389. ADDCHAR(ch*16+strText[index+5]-0x61+10,0);
  390. }
  391. else if(strText[index+5]>=0x41)
  392. {
  393. ADDCHAR(ch*16+strText[index+5]-0x41+10,0);
  394. }
  395. else
  396. {
  397. ADDCHAR(ch*16+strText[index+5]-0x30,0);
  398. }
  399. if(strText[index+6]>=0x61)
  400. {
  401. ch=strText[index+6]-0x61+10;
  402. }
  403. else if(strText[index+6]>=0x41)
  404. {
  405. ch=strText[index+6]-0x41+10;
  406. }
  407. else
  408. {
  409. ch=strText[index+6]-0x30;
  410. }
  411. if(strText[index+7]>=0x61)
  412. {
  413. ADDCHAR(ch*16+strText[index+7]-0x61+10,8);
  414. }
  415. else if(strText[index+7]>=0x41)
  416. {
  417. ADDCHAR(ch*16+strText[index+7]-0x41+10,8);
  418. }
  419. else
  420. {
  421. ADDCHAR(ch*16+strText[index+7]-0x30,8);
  422. }
  423. goto nextcode;
  424. break;
  425. }
  426. }
  427. }
  428. else if(strText[index+1]==0x75||strText[index+1]==0x55)//'u''U'
  429. {
  430. if((index+2+4)<strText.GetLength())
  431. {
  432. if((strText[index+3]>=0x30&&strText[index+3]<=0x39)//'0'-'9'
  433. ||(strText[index+3]>=0x61&&strText[index+3]<=0x66)//'A'-'F'
  434. ||(strText[index+3]>=0x41&&strText[index+3]<=0x46))//'a'-'f'
  435. if((strText[index+4]>=0x30&&strText[index+4]<=0x39)//'0'-'9'
  436. ||(strText[index+4]>=0x61&&strText[index+4]<=0x66)//'A'-'F'
  437. ||(strText[index+4]>=0x41&&strText[index+4]<=0x46))//'a'-'f'
  438. if((strText[index+5]>=0x30&&strText[index+5]<=0x39)//'0'-'9'
  439. ||(strText[index+5]>=0x61&&strText[index+5]<=0x66)//'A'-'F'
  440. ||(strText[index+5]>=0x41&&strText[index+5]<=0x46))//'a'-'f'
  441. if((strText[index+6]>=0x30&&strText[index+6]<=0x39)//'0'-'9'
  442. ||(strText[index+6]>=0x61&&strText[index+6]<=0x66)//'A'-'F'
  443. ||(strText[index+6]>=0x41&&strText[index+6]<=0x46))//'a'-'f'
  444. {
  445. unsigned short ch;
  446. if(strText[index+3]>=0x61)
  447. {
  448. ch=strText[index+3]-0x61+10;
  449. }
  450. else if(strText[index+3]>=0x41)
  451. {
  452. ch=strText[index+3]-0x41+10;
  453. }
  454. else
  455. {
  456. ch=strText[index+3]-0x30;
  457. }
  458. if(strText[index+4]>=0x61)
  459. {
  460. ch=ch*16+strText[index+4]-0x61+10;
  461. }
  462. else if(strText[index+4]>=0x41)
  463. {
  464. ch=ch*16+strText[index+4]-0x41+10;
  465. }
  466. else
  467. {
  468. ch=ch*16+strText[index+4]-0x30;
  469. }
  470. if(strText[index+5]>=0x61)
  471. {
  472. ch=ch*16+strText[index+5]-0x61+10;
  473. }
  474. else if(strText[index+5]>=0x41)
  475. {
  476. ch=ch*16+strText[index+5]-0x41+10;
  477. }
  478. else
  479. {
  480. ch=ch*16+strText[index+5]-0x30;
  481. }
  482. if(strText[index+6]>=0x61)
  483. {
  484. ch=ch*16+strText[index+6]-0x61+10;
  485. }
  486. else if(strText[index+6]>=0x41)
  487. {
  488. ch=ch*16+strText[index+6]-0x41+10;
  489. }
  490. else
  491. {
  492. ch=ch*16+strText[index+6]-0x30;
  493. }
  494. switch(ch)
  495. {
  496. case 0x00b0://°
  497. {
  498. //CWordStyle ws;
  499. //ws=*pText->GetWordStyle(curws);
  500. //if(ws.GetFontName().Find("shx")!=-1)
  501. {
  502. ADDCHAR('%',7);
  503. ADDCHAR('%',0);
  504. ADDCHAR('d',0);
  505. goto nextcode;//°
  506. }
  507. }
  508. break;
  509. case 0x00B1:
  510. {
  511. //CWordStyle ws;
  512. //ws=*pText->GetWordStyle(curws);
  513. //if(ws.GetFontName().Find("shx")!=-1)
  514. {
  515. ADDCHAR('%',7);
  516. ADDCHAR('%',0);
  517. ADDCHAR('p',0);
  518. goto nextcode;//°
  519. }
  520. }
  521. break;
  522. case 0x2205:
  523. {
  524. //CWordStyle ws;
  525. //ws=*pText->GetWordStyle(curws);
  526. //if(ws.GetFontName().Find("shx")!=-1)
  527. {
  528. ADDCHAR('%',7);
  529. ADDCHAR('%',0);
  530. ADDCHAR('c',0);
  531. goto nextcode;//°
  532. }
  533. }
  534. }
  535. CString strWide;
  536. if(g_UnicodeCharMapWideChar.GetWideChar(ch,strWide))
  537. {
  538. for(UINT i=0;i<strWide.GetLength();i++)
  539. {
  540. if(i==0)
  541. {
  542. ADDCHAR(strWide.GetAt(i),7);
  543. }
  544. else
  545. {
  546. ADDCHAR(strWide.GetAt(i),0);
  547. }
  548. }
  549. goto nextcode;
  550. }
  551. short ch2;
  552. short sReturnValue=adUnicodeToCodePageChar(ch,m_sCodePage,&ch2);//936表示是中文
  553. if(sReturnValue!=1)
  554. {
  555. _WRITE(str="无法进行Unicode转换");
  556. _ERROR;
  557. {
  558. BYTE chs[3];
  559. chs[0]=ch&0xff;
  560. chs[1]=ch>>8;
  561. chs[2]=0;
  562. //WC_NO_BEST_FIT_CHARS Any Unicode characters that do not translate directly to multibyte equivalents will be translated to the default character (see lpDefaultChar parameter). In other words, if translating from Unicode to multibyte and back to Unicode again does not yield the exact same Unicode character, the default character is used.This flag may be used by itself or in combination with the other dwFlag options.
  563. //WC_COMPOSITECHECK Convert composite characters to precomposed characters. 
  564. //WC_DISCARDNS Discard nonspacing characters during conversion. 
  565. //WC_SEPCHARS Generate separate characters during conversion. This is the default conversion behavior. 
  566. //WC_DEFAULTCHAR Replace exceptions with the default character during conversion. 
  567. UINT nBytesNeeded = ::WideCharToMultiByte(
  568. GetACP(), 
  569. 0,
  570. (LPWSTR)chs, 
  571. 1,
  572. NULL, 
  573. 0,
  574. 0, 
  575. NULL);
  576. if (nBytesNeeded != 0)
  577. {
  578. BYTE* pDestination=new BYTE[nBytesNeeded+2];
  579. ::memset(pDestination,0,nBytesNeeded+2);
  580. nBytesNeeded = ::WideCharToMultiByte(
  581. GetACP(), 
  582. 0,
  583. (LPWSTR)chs, 
  584. 1,
  585. (LPSTR)pDestination, 
  586. nBytesNeeded,
  587. 0, 
  588. NULL);
  589. if(nBytesNeeded!=0)
  590. {
  591. for(UINT i=0;i<nBytesNeeded;i++)
  592. {
  593. if(i==0)
  594. {
  595. ADDCHAR(pDestination[i],7);
  596. }
  597. else
  598. {
  599. ADDCHAR(pDestination[i],0);
  600. }
  601. }
  602. delete pDestination;
  603. goto nextcode;
  604. }
  605. delete pDestination;
  606. }
  607. }
  608. ch2=ch;
  609. }
  610. short ch3=ch2;
  611. ch3=ch3>>8;
  612. ch2=ch2&0x00ff;
  613. if(ch3!=0)
  614. {
  615. if(ch2!=0)
  616. {
  617. ADDCHAR(ch3,7);
  618. ADDCHAR(ch2,0);
  619. }
  620. else
  621. {
  622. ADDCHAR(ch3,7);
  623. }
  624. }
  625. else
  626. {
  627. if(ch2!=0)
  628. {
  629. ADDCHAR(ch2,7);
  630. }
  631. }
  632. goto nextcode;
  633. break;
  634. }
  635. }
  636. }
  637. }
  638. }
  639. break;
  640. default:
  641. break;
  642. }
  643. if((unsigned char)strText[index]>0x7f)//中文字符
  644. {
  645. if((index+1)<strText.GetLength())
  646. {
  647. if( (strText[index]==TCHAR(0xa1)&&strText[index+1]==TCHAR(0xe3))||//°
  648. (strText[index]==TCHAR(0xa1)&&strText[index+1]==TCHAR(0xc0))||//±
  649. (strText[index]==TCHAR(0xa6)&&strText[index+1]==TCHAR(0xb5)) )//Φ
  650. {
  651. //CWordStyle ws;
  652. //ws=*pText->GetWordStyle(curws);
  653. //if(ws.GetFontName().Find("shx")!=-1)
  654. {
  655. if(strText[index+1]==TCHAR(0xe3))
  656. {
  657. ADDCHAR('%',2);
  658. ADDCHAR('%',0);
  659. ADDCHAR('d',0);
  660. goto nextcode;
  661. }
  662. if(strText[index+1]==TCHAR(0xc0))
  663. {
  664. ADDCHAR('%',2);
  665. ADDCHAR('%',0);
  666. ADDCHAR('p',0);
  667. goto nextcode;
  668. }
  669. if(strText[index+1]==TCHAR(0xb5))
  670. {
  671. ADDCHAR('%',2);
  672. ADDCHAR('%',0);
  673. ADDCHAR('c',0);
  674. goto nextcode;
  675. }
  676. }
  677. }
  678. ADDCHAR(strText[index],0);
  679. ADDCHAR(strText[index+1],2);
  680. goto nextcode;
  681. }
  682. }
  683. ADDCHAR(strText[index],1);
  684. nextcode:
  685. continue;
  686. }
  687. if(strNew.GetLength()>0)
  688. {
  689. pText->SetNewCString(strNew,&aWSIDs);
  690. return TRUE;
  691. }
  692. return FALSE;
  693. }
  694. BOOL CKmgConverter::ConverterEntiey_KmMString(KmText* pText,CString& strText,UINT baseWS,CUIntArray& aWSIDs,BOOL btol,BOOL bdim)
  695. {
  696. #ifdef _BAOJI_
  697. calculate_convert_ii(strText);
  698. #endif
  699. //预处理strText为W增加;
  700. if(strText.Find("\w")!=-1||strText.Find("\W")!=-1)
  701. {
  702. CString strTemp;
  703. for(int p=0;p+1<strText.GetLength();p++)
  704. {
  705. if(strText[p]=='\'&&(strText[p+1]=='W'||strText[p+1]=='w'))
  706. {
  707. strTemp+=strText[p];
  708. p++;
  709. strTemp+=strText[p];
  710. if(p+1<strText.GetLength())
  711. {
  712. BOOL bDot=FALSE;
  713. if(strText[p+1]=='+'||strText[p+1]=='-'||(strText[p+1]>='0'&&strText[p+1]<='9'))
  714. {
  715. p++;
  716. strTemp+=strText[p];
  717. }
  718. else if(strText[p+1]=='.')
  719. {
  720. bDot=TRUE;
  721. p++;
  722. strTemp+=strText[p];
  723. }
  724. else
  725. {
  726. continue;
  727. }
  728. for(;p+1<strText.GetLength();p++)
  729. {
  730. if(strText[p+1]=='.')
  731. {
  732. if(bDot)
  733. {
  734. strTemp+=';';
  735. break;
  736. }
  737. else
  738. {
  739. bDot=TRUE;
  740. strTemp+=strText[p+1];//p++
  741. }
  742. }
  743. else if(strText[p+1]>='0'&&strText[p+1]<='9')
  744. {
  745. strTemp+=strText[p+1];//p++
  746. }
  747. else if(strText[p+1]>='x')
  748. {
  749. p++;
  750. strTemp+=';';
  751. break;
  752. }
  753. else if(strText[p+1]==';')
  754. {
  755. break;
  756. }
  757. else
  758. {
  759. strTemp+=';';
  760. break;
  761. }
  762. }
  763. }
  764. }
  765. else
  766. {
  767. strTemp+=strText[p];
  768. }
  769. }
  770. if(p<strText.GetLength())
  771. {
  772. strTemp+=strText[p];
  773. }
  774. strText=strTemp;
  775. }
  776. aWSIDs.RemoveAll();
  777. CString strNew;
  778. UINT curws=baseWS;
  779. CList<UINT,UINT> lWSIDs;
  780. for(int index=0;index<strText.GetLength();)
  781. {
  782. switch(strText[index])
  783. {
  784. case 0x7b:
  785. if(btol)
  786. {
  787. char symbl;
  788. int index2=index;
  789. if(calculate_findtolchars(strText,index2,symbl))
  790. {
  791. if(symbl==0x6e||symbl==0x4e)
  792. {
  793. ADDCHAR(0xa6,0);
  794. ADDCHAR(0xb5,0);//直径符号
  795. }
  796. else
  797. {
  798. ADDCHAR(symbl,0);
  799. }
  800. index=index2;
  801. goto nextcode;
  802. }
  803. else
  804. {
  805. ADDCHAR(0x7b,1);
  806. goto nextcode;
  807. }
  808. }
  809. else if(bdim==TRUE)
  810. {
  811. index++;
  812. goto nextcode;
  813. }
  814. else
  815. {
  816. lWSIDs.AddTail(curws);
  817. index++;
  818. goto nextcode;
  819. }
  820. break;
  821. case 0x7d://'}'
  822. if(btol)
  823. {
  824. ADDCHAR(0x7d,1);
  825. goto nextcode;
  826. }
  827. else if(bdim)
  828. {
  829. index++;
  830. goto nextcode;
  831. }
  832. else
  833. {
  834. if(lWSIDs.GetTailPosition()!=NULL)
  835. {
  836. curws=lWSIDs.RemoveTail();
  837. }
  838. else
  839. {
  840. _WRITE(str="多行文字中发现不匹配的}符号");
  841. }
  842. index++;
  843. goto nextcode;
  844. }
  845. break;
  846. case 0x5c://'\' 
  847. if((index+2)<strText.GetLength())
  848. {
  849. if(strText[index+2]==0x2b)//'+'
  850. {
  851. if(strText[index+1]==0x6d||strText[index+1]==0x4d)//'m''M'
  852. {
  853. if((index+2+5)<strText.GetLength())
  854. {
  855. if((strText[index+4]>=0x30&&strText[index+4]<=0x39)//'0'-'9'
  856. ||(strText[index+4]>=0x61&&strText[index+4]<=0x66)//'A'-'F'
  857. ||(strText[index+4]>=0x41&&strText[index+4]<=0x46))//'a'-'f'
  858. if((strText[index+5]>=0x30&&strText[index+5]<=0x39)//'0'-'9'
  859. ||(strText[index+5]>=0x61&&strText[index+5]<=0x66)//'A'-'F'
  860. ||(strText[index+5]>=0x41&&strText[index+5]<=0x46))//'a'-'f'
  861. if((strText[index+6]>=0x30&&strText[index+6]<=0x39)//'0'-'9'
  862. ||(strText[index+6]>=0x61&&strText[index+6]<=0x66)//'A'-'F'
  863. ||(strText[index+6]>=0x41&&strText[index+6]<=0x46))//'a'-'f'
  864. if((strText[index+7]>=0x30&&strText[index+7]<=0x39)//'0'-'9'
  865. ||(strText[index+7]>=0x61&&strText[index+7]<=0x66)//'A'-'F'
  866. ||(strText[index+7]>=0x41&&strText[index+7]<=0x46))//'a'-'f'
  867. {
  868. char ch;
  869. if(strText[index+4]>=0x61)
  870. {
  871. ch=strText[index+4]-0x61+10;
  872. }
  873. else if(strText[index+4]>=0x41)
  874. {
  875. ch=strText[index+4]-0x41+10;
  876. }
  877. else
  878. {
  879. ch=strText[index+4]-0x30;
  880. }
  881. if(strText[index+5]>=0x61)
  882. {
  883. ADDCHAR(ch*16+strText[index+5]-0x61+10,0);
  884. }
  885. else if(strText[index+5]>=0x41)
  886. {
  887. ADDCHAR(ch*16+strText[index+5]-0x41+10,0);
  888. }
  889. else
  890. {
  891. ADDCHAR(ch*16+strText[index+5]-0x30,0);
  892. }
  893. if(strText[index+6]>=0x61)
  894. {
  895. ch=strText[index+6]-0x61+10;
  896. }
  897. else if(strText[index+6]>=0x41)
  898. {
  899. ch=strText[index+6]-0x41+10;
  900. }
  901. else
  902. {
  903. ch=strText[index+6]-0x30;
  904. }
  905. if(strText[index+7]>=0x61)
  906. {
  907. ADDCHAR(ch*16+strText[index+7]-0x61+10,8);
  908. }
  909. else if(strText[index+7]>=0x41)
  910. {
  911. ADDCHAR(ch*16+strText[index+7]-0x41+10,8);
  912. }
  913. else
  914. {
  915. ADDCHAR(ch*16+strText[index+7]-0x30,8);
  916. }
  917. goto nextcode;
  918. break;
  919. }
  920. }
  921. }
  922. else if(strText[index+1]==0x75||strText[index+1]==0x55)//'u''U'
  923. {
  924. if((index+2+4)<strText.GetLength())
  925. {
  926. if((strText[index+3]>=0x30&&strText[index+3]<=0x39)//'0'-'9'
  927. ||(strText[index+3]>=0x61&&strText[index+3]<=0x66)//'A'-'F'
  928. ||(strText[index+3]>=0x41&&strText[index+3]<=0x46))//'a'-'f'
  929. if((strText[index+4]>=0x30&&strText[index+4]<=0x39)//'0'-'9'
  930. ||(strText[index+4]>=0x61&&strText[index+4]<=0x66)//'A'-'F'
  931. ||(strText[index+4]>=0x41&&strText[index+4]<=0x46))//'a'-'f'
  932. if((strText[index+5]>=0x30&&strText[index+5]<=0x39)//'0'-'9'
  933. ||(strText[index+5]>=0x61&&strText[index+5]<=0x66)//'A'-'F'
  934. ||(strText[index+5]>=0x41&&strText[index+5]<=0x46))//'a'-'f'
  935. if((strText[index+6]>=0x30&&strText[index+6]<=0x39)//'0'-'9'
  936. ||(strText[index+6]>=0x61&&strText[index+6]<=0x66)//'A'-'F'
  937. ||(strText[index+6]>=0x41&&strText[index+6]<=0x46))//'a'-'f'
  938. {
  939. unsigned short ch;
  940. if(strText[index+3]>=0x61)
  941. {
  942. ch=strText[index+3]-0x61+10;
  943. }
  944. else if(strText[index+3]>=0x41)
  945. {
  946. ch=strText[index+3]-0x41+10;
  947. }
  948. else
  949. {
  950. ch=strText[index+3]-0x30;
  951. }
  952. if(strText[index+4]>=0x61)
  953. {
  954. ch=ch*16+strText[index+4]-0x61+10;
  955. }
  956. else if(strText[index+4]>=0x41)
  957. {
  958. ch=ch*16+strText[index+4]-0x41+10;
  959. }
  960. else
  961. {
  962. ch=ch*16+strText[index+4]-0x30;
  963. }
  964. if(strText[index+5]>=0x61)
  965. {
  966. ch=ch*16+strText[index+5]-0x61+10;
  967. }
  968. else if(strText[index+5]>=0x41)
  969. {
  970. ch=ch*16+strText[index+5]-0x41+10;
  971. }
  972. else
  973. {
  974. ch=ch*16+strText[index+5]-0x30;
  975. }
  976. if(strText[index+6]>=0x61)
  977. {
  978. ch=ch*16+strText[index+6]-0x61+10;
  979. }
  980. else if(strText[index+6]>=0x41)
  981. {
  982. ch=ch*16+strText[index+6]-0x41+10;
  983. }
  984. else
  985. {
  986. ch=ch*16+strText[index+6]-0x30;
  987. }
  988. switch(ch)
  989. {
  990. case 0x00b0://°
  991. {
  992. //CWordStyle ws;
  993. //ws=*pText->GetWordStyle(curws);
  994. //if(ws.GetFontName().Find("shx")!=-1)
  995. {
  996. ADDCHAR('%',7);
  997. ADDCHAR('%',0);
  998. ADDCHAR('d',0);
  999. goto nextcode;//°
  1000. }
  1001. }
  1002. break;
  1003. case 0x00B1:
  1004. {
  1005. //CWordStyle ws;
  1006. //ws=*pText->GetWordStyle(curws);
  1007. //if(ws.GetFontName().Find("shx")!=-1)
  1008. {
  1009. ADDCHAR('%',7);
  1010. ADDCHAR('%',0);
  1011. ADDCHAR('p',0);
  1012. goto nextcode;//°
  1013. }
  1014. }
  1015. break;
  1016. case 0x2205:
  1017. {
  1018. //CWordStyle ws;
  1019. //ws=*pText->GetWordStyle(curws);
  1020. //if(ws.GetFontName().Find("shx")!=-1)
  1021. {
  1022. ADDCHAR('%',7);
  1023. ADDCHAR('%',0);
  1024. ADDCHAR('c',0);
  1025. goto nextcode;//°
  1026. }
  1027. }
  1028. }
  1029. CString strWide;
  1030. if(g_UnicodeCharMapWideChar.GetWideChar(ch,strWide))
  1031. {
  1032. for(UINT i=0;i<strWide.GetLength();i++)
  1033. {
  1034. if(i==0)
  1035. {
  1036. ADDCHAR(strWide.GetAt(i),7);
  1037. }
  1038. else
  1039. {
  1040. ADDCHAR(strWide.GetAt(i),0);
  1041. }
  1042. }
  1043. goto nextcode;
  1044. }
  1045. short ch2;
  1046. short sReturnValue=adUnicodeToCodePageChar(ch,m_sCodePage,&ch2);//936表示是中文
  1047. if(sReturnValue!=1)
  1048. {
  1049. _WRITE(str="无法进行Unicode转换");
  1050. _ERROR;
  1051. {
  1052. BYTE chs[3];
  1053. chs[0]=ch&0xff;
  1054. chs[1]=ch>>8;
  1055. chs[2]=0;
  1056. //WC_NO_BEST_FIT_CHARS Any Unicode characters that do not translate directly to multibyte equivalents will be translated to the default character (see lpDefaultChar parameter). In other words, if translating from Unicode to multibyte and back to Unicode again does not yield the exact same Unicode character, the default character is used.This flag may be used by itself or in combination with the other dwFlag options.
  1057. //WC_COMPOSITECHECK Convert composite characters to precomposed characters. 
  1058. //WC_DISCARDNS Discard nonspacing characters during conversion. 
  1059. //WC_SEPCHARS Generate separate characters during conversion. This is the default conversion behavior. 
  1060. //WC_DEFAULTCHAR Replace exceptions with the default character during conversion. 
  1061. UINT nBytesNeeded = ::WideCharToMultiByte(
  1062. GetACP(), 
  1063. 0,
  1064. (LPWSTR)chs, 
  1065. 1,
  1066. NULL, 
  1067. 0,
  1068. 0, 
  1069. NULL);
  1070. if (nBytesNeeded != 0)
  1071. {
  1072. BYTE* pDestination=new BYTE[nBytesNeeded+2];
  1073. ::memset(pDestination,0,nBytesNeeded+2);
  1074. nBytesNeeded = ::WideCharToMultiByte(
  1075. GetACP(), 
  1076. 0,
  1077. (LPWSTR)chs, 
  1078. 1,
  1079. (LPSTR)pDestination, 
  1080. nBytesNeeded,
  1081. 0, 
  1082. NULL);
  1083. if(nBytesNeeded!=0)
  1084. {
  1085. for(UINT i=0;i<nBytesNeeded;i++)
  1086. {
  1087. if(i==0)
  1088. {
  1089. ADDCHAR(pDestination[i],7);
  1090. }
  1091. else
  1092. {
  1093. ADDCHAR(pDestination[i],0);
  1094. }
  1095. }
  1096. delete pDestination;
  1097. goto nextcode;
  1098. }
  1099. delete pDestination;
  1100. }
  1101. }
  1102. ch2=ch;
  1103. }
  1104. short ch3=ch2;
  1105. ch3=ch3>>8;
  1106. ch2=ch2&0x00ff;
  1107. if(ch3!=0)
  1108. {
  1109. if(ch2!=0)
  1110. {
  1111. ADDCHAR(ch3,7);
  1112. ADDCHAR(ch2,0);
  1113. }
  1114. else
  1115. {
  1116. ADDCHAR(ch3,7);
  1117. }
  1118. }
  1119. else
  1120. {
  1121. if(ch2!=0)
  1122. {
  1123. ADDCHAR(ch2,7);
  1124. }
  1125. }
  1126. goto nextcode;
  1127. break;
  1128. }
  1129. }
  1130. }
  1131. }
  1132. }
  1133. if((index+1)<strText.GetLength())
  1134. {
  1135. switch(strText[index+1])
  1136. {
  1137. case 0x6f://'o'
  1138. case 0x4f://'O'
  1139. case 0x6c://'l'
  1140. case 0x4c://'L'
  1141. index+=2;
  1142. goto nextcode;
  1143. break;
  1144. case 0x7e://'~'
  1145. ADDCHAR(0x20,2);//' '
  1146. goto nextcode;
  1147. break;
  1148. case 0x5c://''
  1149. case 0x7b://'{'
  1150. case 0x7d://'}'
  1151. ADDCHAR(strText[index+1],2);
  1152. goto nextcode;
  1153. break;
  1154. case 0x63://'c'
  1155. case 0x43://'C'
  1156. case 0x66://'f'
  1157. case 0x46://'F'
  1158. case 0x68://'h'
  1159. case 0x48://'H'
  1160. case 0x74://'t'
  1161. case 0x54://'T'
  1162. case 0x71://'q'
  1163. case 0x51://'Q'
  1164. case 0x61://'a'
  1165. case 0x41://'A'
  1166. case 0x77://'w'
  1167. case 0x57://'W'
  1168. case 0x73://'s'
  1169. case 0x53://'S'
  1170. {
  1171. CString strTemp;
  1172. for(int l=index+2;l<strText.GetLength();l++)
  1173. {
  1174. if(strText[l]==0x3b||strText[l]=='\'||l==strText.GetLength()-1)//';'
  1175. {
  1176. if(l==strText.GetLength()-1)
  1177. {
  1178. strTemp+=strText[l];
  1179. }
  1180. if(bdim)
  1181. {
  1182. if(strText[l]=='\')
  1183. index=l;
  1184. else
  1185. index=l+1;
  1186. goto nextcode;
  1187. }
  1188. switch(strText[index+1])
  1189. {
  1190. case 0x43://'C'
  1191. case 0x63://'C'
  1192. //没有处理颜色变为strTemp
  1193. if(strText[l]=='\')
  1194. index=l;
  1195. else
  1196. index=l+1;
  1197. goto nextcode;
  1198. break;
  1199. case 0x46://'F'
  1200. case 0x66://'F'
  1201. {
  1202. double temp1;
  1203. double temp2;
  1204. CWordStyle ws;
  1205. ws=*pText->GetWordStyle(curws);
  1206. if(calculate_findfont(strTemp))
  1207. {
  1208. if(strTemp=="??")
  1209. {
  1210. if(strText[l]=='\')
  1211. index=l;
  1212. else
  1213. index=l+1;
  1214. goto nextcode;
  1215. }
  1216. if(strTemp=="??.shx")
  1217. {
  1218. if(strText[l]=='\')
  1219. index=l;
  1220. else
  1221. index=l+1;
  1222. goto nextcode;
  1223. }
  1224. ws.SetFontName ( strTemp );
  1225. if((temp1=calculate_findTTFHightRate(ws.GetFontName()))==1.0)
  1226. {
  1227. if((temp2=calculate_findTTFHightRate(strTemp))!=1.0)
  1228. {
  1229. ws.SetHeight(ws.GetHeight()*temp2);
  1230. }
  1231. }
  1232. else
  1233. {
  1234. if((temp2=calculate_findTTFHightRate(strTemp))==1.0)
  1235. {
  1236. ws.SetHeight(ws.GetHeight()/temp1);
  1237. }
  1238. else
  1239. {
  1240. ws.SetHeight(ws.GetHeight()/temp1*temp2);
  1241. }
  1242. }
  1243. if((temp1=calculate_findTTFWidthRate(ws.GetFontName()))==1.0)
  1244. {
  1245. if((temp2=calculate_findTTFWidthRate(strTemp))!=1.0)
  1246. {
  1247. ws.SetWFactor(ws.GetWFactor()*temp2);
  1248. }
  1249. }
  1250. else
  1251. {
  1252. if((temp2=calculate_findTTFWidthRate(strTemp))==1.0)
  1253. {
  1254. ws.SetWFactor(ws.GetWFactor()/temp1);
  1255. }
  1256. else
  1257. {
  1258. ws.SetWFactor(ws.GetWFactor()/temp1*temp2);
  1259. }
  1260. }
  1261. curws=pText->AddWordStyle(&ws);
  1262. }
  1263. }
  1264. if(strText[l]=='\')
  1265. index=l;
  1266. else
  1267. index=l+1;
  1268. goto nextcode;
  1269. break;
  1270. case 0x41://'A'
  1271. case 0x61://'A'
  1272. //没有对齐方式改变变为strTemp
  1273. if(strText[l]=='\')
  1274. index=l;
  1275. else
  1276. index=l+1;
  1277. goto nextcode;
  1278. break;
  1279. case 0x48://'H'
  1280. case 0x68://'H'
  1281. {
  1282. CWordStyle ws;
  1283. ws=*pText->GetWordStyle(curws);
  1284. double hight=atof(strTemp);
  1285. if((strText[l-1]==0x78)||(strText[l-1]==0x58))//'X''x'
  1286. {
  1287. ws.SetHeight(hight*ws.GetHeight());
  1288. }
  1289. else
  1290. {
  1291. double temp1;
  1292. if((temp1=calculate_findTTFHightRate(ws.GetFontName()))!=1.0)
  1293. {
  1294. hight*=temp1;
  1295. }
  1296. ws.SetHeight(hight);
  1297. }
  1298. curws=pText->AddWordStyle(&ws);
  1299. }
  1300. if(strText[l]=='\')
  1301. index=l;
  1302. else
  1303. index=l+1;
  1304. goto nextcode;
  1305. break;
  1306. case 0x54://'T'
  1307. case 0x74://'T'
  1308. {
  1309. double space=atof(strTemp);
  1310. CWordStyle ws;
  1311. ws=*pText->GetWordStyle(curws);
  1312. if(ws.GetHeight()*ws.GetWFactor()!=0)
  1313. {
  1314. ws.SetPFactor(space);
  1315. curws=pText->AddWordStyle(&ws);
  1316. }
  1317. }
  1318. if(strText[l]=='\')
  1319. index=l;
  1320. else
  1321. index=l+1;
  1322. goto nextcode;
  1323. break;
  1324. case 0x51://'Q'
  1325. case 0x71://'Q'
  1326. {
  1327. double angle=atof(strTemp);
  1328. CWordStyle ws;
  1329. ws=*pText->GetWordStyle(curws);
  1330. ws.SetEffect(WS_EFFECT_ITALIC,TRUE);
  1331. if(angle!=0)
  1332. {
  1333. ws.SetEffect(WS_EFFECT_ITALIC,TRUE);
  1334. }
  1335. else
  1336. {
  1337. ws.SetEffect(WS_EFFECT_ITALIC,FALSE);
  1338. }
  1339. curws=pText->AddWordStyle(&ws);
  1340. }
  1341. if(strText[l]=='\')
  1342. index=l;
  1343. else
  1344. index=l+1;
  1345. goto nextcode;
  1346. break;
  1347. case 0x57://'W'
  1348. case 0x77://'W'
  1349. {
  1350. double width=atof(strTemp);
  1351. CWordStyle ws;
  1352. ws=*pText->GetWordStyle(curws);
  1353. ws.SetWFactor(width);
  1354. curws=pText->AddWordStyle(&ws);
  1355. }
  1356. if(strText[l]=='\')
  1357. index=l;
  1358. else
  1359. index=l+1;
  1360. goto nextcode;
  1361. break;
  1362. case 0x53://'S'
  1363. case 0x73://'S'
  1364. {
  1365. if(calculate_findpilechars(strTemp))
  1366. {
  1367. CWordStyle ws;
  1368. ws=*pText->GetWordStyle(curws);
  1369. ws.SetHeight(ws.GetHeight()*2.04081633);
  1370. curws=pText->AddWordStyle(&ws);
  1371. for(int j=0;j<strTemp.GetLength();j++)
  1372. {
  1373. ADDCHAR(strTemp[j],0);
  1374. }
  1375. }
  1376. }
  1377. if(strText[l]=='\')
  1378. index=l;
  1379. else
  1380. index=l+1;
  1381. goto nextcode;
  1382. break;
  1383. }
  1384. break;
  1385. }
  1386. strTemp+=strText[l];
  1387. }
  1388. }
  1389. break;
  1390. case 0x70://'P'
  1391. case 0x50://'p'
  1392. ADDCHAR(0x0d,2);//东方CAD中的回车
  1393. goto nextcode;
  1394. break;
  1395. }
  1396. }
  1397. break;
  1398. case 0x3b://';'
  1399. if(btol)
  1400. {
  1401. //形位公差中忽略;号
  1402. goto nextcode;
  1403. }
  1404. else
  1405. {
  1406. ADDCHAR(strText[index],1);
  1407. goto nextcode;
  1408. }
  1409. break;
  1410. default:
  1411. break;
  1412. }
  1413. if((unsigned char)strText[index]>0x7f)//中文字符
  1414. {
  1415. if((index+1)<strText.GetLength())
  1416. {
  1417. if( (strText[index]==TCHAR(0xa1)&&strText[index+1]==TCHAR(0xe3))||//°
  1418. (strText[index]==TCHAR(0xa1)&&strText[index+1]==TCHAR(0xc0))||//±
  1419. (strText[index]==TCHAR(0xa6)&&strText[index+1]==TCHAR(0xb5)) )//Φ
  1420. {
  1421. //CWordStyle ws;
  1422. //ws=*pText->GetWordStyle(curws);
  1423. //if(ws.GetFontName().Find("shx")!=-1)
  1424. {
  1425. if(strText[index+1]==TCHAR(0xe3))
  1426. {
  1427. ADDCHAR('%',2);
  1428. ADDCHAR('%',0);
  1429. ADDCHAR('d',0);
  1430. goto nextcode;
  1431. }
  1432. if(strText[index+1]==TCHAR(0xc0))
  1433. {
  1434. ADDCHAR('%',2);
  1435. ADDCHAR('%',0);
  1436. ADDCHAR('p',0);
  1437. goto nextcode;
  1438. }
  1439. if(strText[index+1]==TCHAR(0xb5))
  1440. {
  1441. ADDCHAR('%',2);
  1442. ADDCHAR('%',0);
  1443. ADDCHAR('c',0);
  1444. goto nextcode;
  1445. }
  1446. }
  1447. }
  1448. ADDCHAR(strText[index],0);
  1449. ADDCHAR(strText[index+1],2);
  1450. goto nextcode;
  1451. }
  1452. }
  1453. ADDCHAR(strText[index],1);
  1454. nextcode:
  1455. continue;
  1456. }
  1457. if(btol)
  1458. {
  1459. strText=strNew;
  1460. }
  1461. else if(bdim)
  1462. {
  1463. strText=strNew;
  1464. }
  1465. else
  1466. {
  1467. if(strNew.GetLength()>0)
  1468. {
  1469. pText->SetNewCString(strNew,&aWSIDs);
  1470. return TRUE;
  1471. }
  1472. else
  1473. {
  1474. return FALSE;
  1475. }
  1476. }
  1477. return TRUE;
  1478. }
  1479. BOOL CKmgConverter::calculate_findfont(CString& strFont)
  1480. {
  1481. if(strFont.GetLength()==0){return FALSE;}
  1482. int firstpos=strFont.Find('|');
  1483. if(firstpos!=-1){strFont=strFont.Left(firstpos);}
  1484. if(strFont.GetLength()==0){return FALSE;}
  1485. firstpos=strFont.Find('.');
  1486. if(firstpos==-1)
  1487. {//还要讨论是否是形文字。
  1488. try
  1489. {
  1490. void* pv = NULL;
  1491. if (g_afont.Lookup(strFont, pv)) // found it
  1492. {
  1493. return TRUE;
  1494. }
  1495. else
  1496. {
  1497. strFont+=".shx";
  1498. return TRUE;
  1499. }
  1500. // CFont fonttext;
  1501. // if(fonttext.CreateFont(1000,0,0,0,0,FALSE,FALSE,0,DEFAULT_CHARSET,0,0,0,0,strFont))
  1502. // {
  1503. // return TRUE;
  1504. // }
  1505. // else
  1506. // {
  1507. // strFont+=".shx";
  1508. // return TRUE;
  1509. // }
  1510. }
  1511. catch(...)
  1512. {
  1513. strFont+=".shx";
  1514. return TRUE;
  1515. }
  1516. return TRUE;
  1517. }
  1518. CString strExt=strFont.Right(strFont.GetLength()-1-firstpos);
  1519. strExt.MakeLower();
  1520. if(strExt=="ttf")
  1521. {
  1522. TCHAR szDirName[MAX_PATH];
  1523. if(::GetWindowsDirectory(szDirName,MAX_PATH))
  1524. {
  1525. CString strTemp=strFont;
  1526. CString strDirName=szDirName;
  1527. strTemp=strDirName+"\Fonts\"+strTemp;
  1528. if(CReader::calculate_findfontname(strFont,strTemp,strTemp))
  1529. {
  1530. strFont=strTemp;
  1531. }
  1532. }
  1533. }
  1534. else
  1535. {
  1536. CReader::calculate_DefaultExamineFile(strFont,"fonts");
  1537. }
  1538. return TRUE;
  1539. }
  1540. BOOL CKmgConverter::ConverterEntiey_KmMString(CString& strText)
  1541. {
  1542. CUIntArray aWSIDs;
  1543. return ConverterEntiey_KmMString(NULL,strText,m_pDataManager->GetCurWSID(),aWSIDs,FALSE,TRUE);
  1544. }
  1545. BOOL CKmgConverter::calculate_findpilechars(CString& strText)
  1546. {
  1547. CString strFirst;
  1548. CString strSecond;
  1549. for(int i=0;i<strText.GetLength();i++)
  1550. {
  1551. if((strText[i]=='/')||(strText[i]=='#'))
  1552. {
  1553. //分式fs;B;C;;
  1554. strSecond+="\fs;"+strFirst+';';
  1555. i++;
  1556. for(;i<strText.GetLength();i++)
  1557. {
  1558. strSecond+=strText[i];
  1559. }
  1560. strSecond+=";\;";
  1561. strText.Empty();
  1562. strText=strSecond;
  1563. return TRUE;
  1564. }
  1565. else if(strText[i]=='^')
  1566. {
  1567. //上下标sxA;B;
  1568. strSecond+="\sx"+strFirst+';';
  1569. i++;
  1570. for(;i<strText.GetLength();i++)
  1571. {
  1572. strSecond+=strText[i];
  1573. }
  1574. strSecond+="\;";
  1575. strText.Empty();
  1576. strText=strSecond;
  1577. return TRUE;
  1578. }
  1579. else
  1580. {
  1581. strFirst+=strText[i];
  1582. }
  1583. }
  1584. return FALSE;
  1585. }
  1586. BOOL CKmgConverter::ConverterEntiey_KmTString(KmText* pText,CString strEnter,UINT baseWS)
  1587. {
  1588. #ifdef _BAOJI_
  1589. calculate_convert_ii(strEnter);
  1590. #endif
  1591. #ifdef _DEBUG
  1592. TRACE(strEnter);
  1593. for(int s=0;s<strEnter.GetLength();s++)
  1594. {
  1595. CString strrr;
  1596. strrr.Format("%d%cn",strEnter[s],strEnter[s]);
  1597. TRACE(strrr);
  1598. }
  1599. #endif
  1600. CString strNew;
  1601. CUIntArray aWSIDs;
  1602. CUIntArray aWSIDs2;
  1603. UINT curws=baseWS;
  1604. int i;
  1605. CStringArray strArray;
  1606. while((i = strEnter.Find(0x0a)) != -1)
  1607. {
  1608. strArray.Add(strEnter.Left(i));
  1609. strEnter=strEnter.Right(strEnter.GetLength() - i - 1);
  1610. }
  1611. strArray.Add(strEnter);
  1612. for(int k = 0; k < strArray.GetSize(); k++)
  1613. {
  1614. curws=baseWS;
  1615. char symbl;
  1616. CString strTemp=strArray[k];
  1617. if(strTemp.GetLength()==0)
  1618. {
  1619. continue;
  1620. }
  1621. if(strTemp[0]!=0x7b)//'{'是高度和基准
  1622. {//按带框字符转换 (注意 即便是带框字符也存在着%%v的问题 故要转换为连续方框)
  1623. int index=0;
  1624. ADDCHAR(0x5c,1);//'\'
  1625. ADDCHAR(0x66,1);//'f'
  1626. ADDCHAR(0x6b,1);//'k'
  1627. ConverterEntiey_KmMString(pText,strTemp,baseWS,aWSIDs2,TRUE);
  1628. for(int l=0;l<strTemp.GetLength();l++)
  1629. {
  1630. if(l<strTemp.GetLength()-2)
  1631. {
  1632. if(strTemp[l]==0x25&&strTemp[l+1]==0x25&&strTemp[l+2]==0x76)//%%v
  1633. {
  1634. ADDCHAR(0x5c,1);//'\'
  1635. ADDCHAR(0x3b,1);//';'
  1636. ADDCHAR(0x5c,1);//'\'
  1637. ADDCHAR(0x66,1);//'f'
  1638. ADDCHAR(0x6b,1);//'k'
  1639. l+=2;
  1640. continue;
  1641. }
  1642. }
  1643. if(aWSIDs2.GetSize()>l)
  1644. {
  1645. curws=aWSIDs2[l];
  1646. ADDCHAR(strTemp[l],1);
  1647. }
  1648. else
  1649. {
  1650. curws=baseWS;
  1651. ADDCHAR(strTemp[l],1);
  1652. }
  1653. }
  1654. ADDCHAR(0x5c,1);//'\'
  1655. ADDCHAR(0x3b,1);//';'
  1656. ADDCHAR(0x0d,1);//东方CAD中的硬回车符号
  1657. continue;//注意该行已经转换完成
  1658. }
  1659. int begin=0; 
  1660. if(!calculate_findtolchars(strTemp,begin,symbl))
  1661. {
  1662. int index=0;
  1663. ADDCHAR(0x5c,1);//'\'
  1664. ADDCHAR(0x66,1);//'f'
  1665. ADDCHAR(0x6b,1);//'k'
  1666. ConverterEntiey_KmMString(pText,strTemp,baseWS,aWSIDs2,TRUE);
  1667. for(int l=0;l<strTemp.GetLength();l++)
  1668. {
  1669. if(l<strTemp.GetLength()-2)
  1670. {
  1671. if(strTemp[l]==0x25&&strTemp[l+1]==0x25&&strTemp[l+2]==0x76)//%%v
  1672. {
  1673. ADDCHAR(0x5c,1);//'\'
  1674. ADDCHAR(0x3b,1);//';'
  1675. ADDCHAR(0x5c,1);//'\'
  1676. ADDCHAR(0x66,1);//'f'
  1677. ADDCHAR(0x6b,1);//'k'
  1678. l+=2;
  1679. continue;
  1680. }
  1681. }
  1682. if(aWSIDs2.GetSize()>l)
  1683. {
  1684. curws=aWSIDs2[l];
  1685. ADDCHAR(strTemp[l],1);
  1686. }
  1687. else
  1688. {
  1689. curws=baseWS;
  1690. ADDCHAR(strTemp[l],1);
  1691. }
  1692. }
  1693. ADDCHAR(0x5c,1);//'\'
  1694. ADDCHAR(0x3b,1);//';'
  1695. ADDCHAR(0x0d,1);//东方CAD中的硬回车符号
  1696. continue;//注意该行已经转换完成
  1697. }
  1698. {
  1699. int sqnum=0;
  1700. int index=0;
  1701. ADDCHAR(0x5c,1);//'\'
  1702. ADDCHAR(0x67,1);//'g'
  1703. ADDCHAR(0x63,1);//'c'
  1704. ADDCHAR(symbl,1);
  1705. CString strTemp2;
  1706. for(int l=begin;l<strTemp.GetLength();)
  1707. {
  1708. if(l<strTemp.GetLength()-2)
  1709. {
  1710. if(strTemp[l]==0x25&&strTemp[l+1]==0x25&&strTemp[l+2]==0x76)//%%v
  1711. {
  1712. ConverterEntiey_KmMString(pText,strTemp2,baseWS,aWSIDs2,TRUE);
  1713. for(int m=0;m<strTemp2.GetLength();m++)
  1714. {
  1715. if(aWSIDs2.GetSize()>m)
  1716. {
  1717. curws=aWSIDs2[m];
  1718. ADDCHAR(strTemp2[m],1);
  1719. }
  1720. else
  1721. {
  1722. curws=baseWS;
  1723. ADDCHAR(strTemp2[m],1);
  1724. }
  1725. }
  1726. sqnum++;
  1727. if(sqnum>1&&sqnum<=6)//第一个%%v略过
  1728. {
  1729. ADDCHAR(0x3b,1);//';'
  1730. }
  1731. l+=3;
  1732. strTemp2.Empty();
  1733. continue;
  1734. }
  1735. }
  1736. strTemp2+=strTemp[l];
  1737. l++;
  1738. }
  1739. {
  1740. ConverterEntiey_KmMString(pText,strTemp2,baseWS,aWSIDs2,TRUE);
  1741. for(int m=0;m<strTemp2.GetLength();m++)
  1742. {
  1743. if(aWSIDs2.GetSize()>m)
  1744. {
  1745. curws=aWSIDs2[m];
  1746. ADDCHAR(strTemp2[m],1);
  1747. }
  1748. else
  1749. {
  1750. curws=baseWS;
  1751. ADDCHAR(strTemp2[m],1);
  1752. }
  1753. }
  1754. sqnum++;
  1755. if(sqnum>1&&sqnum<=6)
  1756. {
  1757. ADDCHAR(0x3b,1);//';'
  1758. }
  1759. }
  1760. if(sqnum==0||sqnum==1)
  1761. {
  1762. sqnum=2;
  1763. }
  1764. for(l=sqnum;l<=6;l++)
  1765. {
  1766. strNew+=0x3b;//';'
  1767. }
  1768. ADDCHAR(0x5c,0);
  1769. ADDCHAR(0x3b,0);
  1770. ADDCHAR(0x0d,0);//东方CAD中的硬回车符号
  1771. }
  1772. }
  1773. aWSIDs.RemoveAll();
  1774. aWSIDs.Add(baseWS);
  1775. if(strNew.GetLength()>0)
  1776. {
  1777. pText->SetNewCString(strNew,&aWSIDs);
  1778. return TRUE;
  1779. }
  1780. return FALSE;
  1781. }
  1782. BOOL CKmgConverter::calculate_findtolchars(CString strText,int &i,char &symbl)
  1783. {
  1784. for(int j=i;j<strText.GetLength();j++)
  1785. {
  1786. if(strText[j]==0x7d)//'}'
  1787. {
  1788. symbl=strText[j-1];
  1789. i=j+1;
  1790. symbl=calculate_findtoltype(symbl);
  1791. return TRUE;
  1792. }
  1793. }
  1794. return FALSE;
  1795. }
  1796. char CKmgConverter::calculate_findtoltype(char symbl)
  1797. {
  1798. char symbltemp=symbl; //转换为大写
  1799. if(symbl>=0x61||symbl<=0x7A)//>='a' <='z'
  1800. {
  1801. symbl-=0x20;
  1802. }
  1803. switch(symbl)
  1804. {
  1805. case 'A'://1
  1806. return 'i';
  1807. case 'B'://2
  1808. return 'h';
  1809. case 'C'://3
  1810. return 'b';
  1811. case 'D'://4
  1812. return 'f';
  1813. case 'E'://5
  1814. return 'c';
  1815. case 'F'://6
  1816. return 'g';
  1817. case 'G'://7
  1818. return 'p';
  1819. case 'H'://8
  1820. return 'm';
  1821. case 'I'://9
  1822. return 'k';
  1823. case 'J'://10
  1824. return 'l';
  1825. case 'K'://11
  1826. return 'e';
  1827. case 'R'://12
  1828. return 'j';
  1829. case 'T'://13
  1830. return 'n';
  1831. case 'U'://14
  1832. return 'a';
  1833. default:
  1834. break;
  1835. }
  1836. return symbltemp;
  1837. }