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

CAD

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "FileSwitch.h"
  3. #include "DwgReader.h"
  4. #include "Reader.h"
  5. #include "blockdeffunc.h"
  6. #include "blockdeffunc2.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. extern CStdioFile g_CensorialFile; //监察转换进度的文件
  13. extern int g_mode;
  14. //------------------多行文字转换为单行文字
  15. /* Pull the string out of the mtext entity. */
  16. short CDwgReader::preprocess_ExtractMTextString(PAD_MTEXT mtext, unsigned char **cptr)
  17. {
  18. unsigned short len;
  19. PAD_BLOB_CTRL bcptr;
  20. if (mtext->ldblob != NULL) 
  21. {
  22. bcptr = adStartBlobRead(mtext->ldblob);
  23. len = (unsigned short)adBlobSize(bcptr);
  24. *cptr = (unsigned char*)malloc(len + 1);
  25. if (*cptr == NULL) 
  26. {
  27. return(0);
  28. }
  29. adReadBlobBytes(bcptr, *cptr, len);
  30. (*cptr)[len] = 0;
  31. adEndBlobRead(bcptr);
  32. }
  33. else 
  34. {
  35. *cptr = (unsigned char*)malloc(strlen(mtext->textstr) + 1);
  36. if (*cptr == NULL) 
  37. {
  38. return(0);
  39. }
  40. strcpy((char *)*cptr, mtext->textstr);
  41. }
  42. return(1);
  43. }
  44. void CDwgReader::preprocess_AddWord(AD_DB_HANDLE dbh,PAD_MTEXT_WORD pWord,PAD_TDATA pTData,PAD_SHPTB pShp,PAD_BLOB_CTRL bcptr,int type,double height)
  45. {
  46. DOUBRECTFULL rect;
  47. double bottomy;
  48. adTextBoundingBox(dbh, (unsigned char*)pWord->text, pTData, 0, 
  49. pShp->file[0] ? pShp->file : NULL, 
  50. pShp->bigfontname[0] ? pShp->bigfontname : NULL, 
  51. 1, &rect, &bottomy);
  52. pWord->width = rect.pt1[0] - rect.pt0[0];
  53. pWord->type = type;
  54. pWord->height = height;
  55. adWriteBlobBytes(bcptr, pWord, sizeof(AD_MTEXT_WORD));
  56. }
  57. /* Build a word list out of the passed in mtext entity, pEnt.  Store 
  58. the word list in the passed in blob. */
  59. int CDwgReader::preprocess_BuildWordList(AD_DB_HANDLE dbh, PAD_ENT pEnt, AD_VMADDR blob)
  60. {
  61. int wordCount = 0;
  62. int charCount;
  63. AD_MTEXT_WORD word;
  64. unsigned char* cptr;
  65. unsigned char* origPtr;
  66. AD_TDATA tdata;
  67. PAD_BLOB_CTRL bcptr = adStartBlobWrite(blob);
  68. AD_SHPTB shp;
  69. int whiteCount;
  70. unsigned char code;
  71. unsigned char* tempPtr;
  72. unsigned char temp[100];
  73. double currHeight = pEnt->mtext.ht;
  74. int i;
  75. short sReturn=adSeekShapefile(dbh, pEnt->mtext.shapefileobjhandle, &shp);
  76. if(sReturn!=1)
  77. {
  78. _ERROR;
  79. return 0;
  80. }
  81. if(shp.bigfontname[0]==0&&shp.file[0]==0)
  82. {
  83. _ERROR;
  84. return 0;
  85. }
  86. if (preprocess_ExtractMTextString(&pEnt->mtext, &cptr))
  87. {
  88. origPtr = cptr;
  89. memset(&tdata, 0, sizeof(AD_TDATA));
  90. tdata.height = currHeight;
  91. tdata.widthfactor = 1.0; 
  92. adHancpy(tdata.shapefileobjhandle, pEnt->mtext.shapefileobjhandle);
  93. while (*cptr)
  94. {
  95. /* Skip whitespace. */
  96. whiteCount = 0;
  97. while (*cptr && *cptr < 0x21)
  98. {
  99. cptr++;
  100. whiteCount++;
  101. }
  102. if (whiteCount)
  103. {
  104. /* adTextBoundingBox doesn't work if you give it spaces. */
  105. memset(word.text, 'e', whiteCount); 
  106. word.text[whiteCount] = 0x00;
  107. preprocess_AddWord(dbh, &word, &tdata, &shp, bcptr, AD_BLANKSPACE, currHeight);
  108. wordCount++;
  109. }
  110. charCount = 0;
  111. while (*cptr && *cptr >= 0x21)
  112. {
  113. switch (*cptr)
  114. {
  115. case '\':
  116. code = toupper(*(cptr + 1));
  117. switch (code)
  118. {
  119. case 'F': /* Change of font--ignore. */
  120. case 'C': /* Change of color--ignore. */
  121. case 'T': /* Adjusts space between characters--ignore. */
  122. case 'Q': /* Changes obliquing angle--ignore. */
  123. case 'W': /* Changes the width factor--ignore. */
  124. case 'A': /* Changes alignment--ignore. */
  125. cptr += 2; /* Skip control code. */
  126. /* Ignore all control data, which is terminated by a semicolon. */
  127. while (*cptr && *cptr != ';')
  128. {
  129. cptr++;
  130. }
  131. if (*cptr == ';')
  132. {
  133. cptr++;
  134. }
  135. continue;
  136. break;
  137. case 'H': /* Change of height--not supported. */
  138. i = 0;
  139. while (*cptr && *cptr != ';')
  140. {
  141. temp[i++] = *cptr++;
  142. }
  143. if (*cptr == ';')
  144. {
  145. cptr++;
  146. temp[i] = 0;
  147. /* This will not work correctly unless an attribute stack is
  148. implemented.  Height is valid only within the { ... } body
  149. in which it is set. */
  150. //currHeight = atof(&temp[2]); /* Skip leading H. */
  151. //tdata.height = currHeight;
  152. }
  153. continue;
  154. break;
  155. case 'P': /* Paragraph break. */
  156. if (charCount)
  157. {
  158. word.text[charCount] = 0x00;
  159. preprocess_AddWord(dbh, &word, &tdata, &shp, bcptr, AD_WORD, currHeight);
  160. wordCount++;
  161. }
  162. word.type = AD_END_OF_PARAGRAPH;
  163. adWriteBlobBytes(bcptr, &word, sizeof(AD_MTEXT_WORD));
  164. wordCount++;
  165. cptr += 2;
  166. charCount = 0;
  167. continue;
  168. break;
  169. case 'O': /* Overline on/off */
  170. case 'L': /* Underline on/off */
  171. cptr += 2; 
  172. continue;
  173. break;
  174. case '\':
  175. case '{':
  176. case '}':  /* Use this character as is. */
  177. cptr++;
  178. break;
  179. case '~': /* Non-breaking space. */
  180. cptr++;
  181. *cptr = 0x20; /* Turn this into a regular space. */
  182. continue;
  183. break;
  184. case 'S': /* Stacked text. */
  185. cptr += 2; /* Skip S and process the rest as a normal string. */
  186.    /* Blank out the '^', '', or '#', which separates the top and bottom,  
  187. and blank out the trailing semicolon. */
  188. /* Note that this needs to be fixed for the case where you have 
  189. backslashes preceding the '#', '', or '^'. */
  190. tempPtr = cptr;
  191. while (*tempPtr && (*tempPtr != ';'))
  192. {
  193. if (*tempPtr == '^' || 
  194. *tempPtr == '\' ||
  195. *tempPtr == '#')
  196. {
  197. *tempPtr = ' ';
  198. }
  199. tempPtr++;
  200. }
  201. if (*tempPtr == ';')
  202. {
  203. *tempPtr = ' ';
  204. }
  205. continue;  
  206. break;
  207. default:
  208. break;
  209. }
  210. break;
  211. case '{':
  212. case '}':
  213. cptr++;
  214. continue;
  215. break;
  216. default:
  217. break;
  218. }
  219. word.text[charCount++] = *cptr++;
  220. }
  221. if (charCount)
  222. {
  223. word.text[charCount] = 0x00;
  224. preprocess_AddWord(dbh, &word, &tdata, &shp, bcptr, AD_WORD, currHeight);
  225. wordCount++;
  226. }
  227. }
  228. free(origPtr);
  229. }
  230. adEndBlobWrite(bcptr);
  231. return(wordCount);
  232. }
  233. /* Break the word list stored in "blob" into individual text entities, and 
  234. add the entities to entList. */
  235. void CDwgReader::preprocess_BreakParagraph(AD_DB_HANDLE dbh,PAD_ENT pEnt,AD_VMADDR blob,int wordCount,AD_VMADDR entList,PAD_ENT_HDR pHdr)
  236. {
  237. double        currPt[3];
  238. double        currLineWidth;
  239. int           firstOnLine;
  240. int           centered;
  241. PAD_BLOB_CTRL bcptr;
  242. AD_MTEXT_WORD word;
  243. AD_OBJHANDLE  saveH;
  244. int           j;
  245. AD_ENT        txtEnt;
  246. AD_ENT_HDR    hdr2;
  247. /* Set default values for text entity. */
  248. hdr2.enttype = AD_ENT_TEXT;
  249. adSetEntityDefaults(dbh, &hdr2, &txtEnt); /* Initialize txtEnt */
  250. pHdr->enttype = AD_ENT_TEXT;
  251. txtEnt.text.tdata.height = pEnt->mtext.ht;
  252. adHancpy(txtEnt.text.tdata.shapefileobjhandle, pEnt->mtext.shapefileobjhandle);
  253. memcpy(currPt, pEnt->mtext.pt0, 3 * sizeof(double));
  254. currPt[1] -= pEnt->mtext.ht;
  255. currLineWidth = 0.0;
  256. firstOnLine = 1;
  257. bcptr = adStartBlobRead(blob);
  258. if (wordCount == 1 && 
  259. (pEnt->mtext.attachpt == 2 ||  /* Top Center */ 
  260. pEnt->mtext.attachpt == 5 ||  /* Middle Center */
  261. pEnt->mtext.attachpt == 8))   /* Bottom Center */
  262. {
  263. centered = 1;
  264. }
  265. else
  266. {
  267. centered = 0;
  268. }
  269.  
  270. for (j = 0; j < wordCount; j++)
  271. {
  272. adReadBlobBytes(bcptr, &word, sizeof(AD_MTEXT_WORD));
  273. strcpy(txtEnt.text.textstr, word.text);
  274. txtEnt.text.tdata.height = word.height;
  275. if (word.type == AD_BLANKSPACE)
  276. {
  277. /* Update current position if not at the end of a line. */
  278. if (pEnt->mtext.boxwid == 0.0 ||
  279. (currLineWidth + word.width) < pEnt->mtext.boxwid)
  280. {
  281. currLineWidth += word.width;
  282. currPt[0] += word.width;
  283. }
  284. else
  285. {
  286. /* Newline, but whitespace does not wrap. */
  287. currLineWidth = 0.0;
  288. currPt[0] = pEnt->mtext.pt0[0];
  289. currPt[1] -= (pEnt->mtext.ht * 1.7);
  290. }
  291. }
  292. else if (word.type == AD_END_OF_PARAGRAPH)
  293. {
  294. currLineWidth = 0.0;
  295. currPt[0] = pEnt->mtext.pt0[0];
  296. currPt[1] -= (pEnt->mtext.ht * 1.7);
  297. }
  298. else if (word.type == AD_WORD)
  299. {
  300. if (firstOnLine)
  301. {
  302. /* Always fits. */
  303. currLineWidth += word.width;
  304. memcpy(txtEnt.text.pt0, currPt, 3 * sizeof(double));
  305. if (centered)
  306. {
  307. /* Special case of 1 word centered--adjust the text
  308. point to simulate centering. */
  309. txtEnt.text.pt0[0] = currPt[0] - (word.width / 2.0);
  310. if (pEnt->mtext.attachpt == 5)
  311. {
  312. /* Middle centered. */
  313. txtEnt.text.pt0[1] += (word.height / 2.0);
  314. }
  315. }
  316. currPt[0] += word.width;
  317. firstOnLine = 0;
  318. }
  319. else 
  320. {
  321. if (pEnt->mtext.boxwid == 0.0 ||
  322. (currLineWidth + word.width) < pEnt->mtext.boxwid)
  323. {
  324. memcpy(txtEnt.text.pt0, currPt, 3 * sizeof(double));
  325. currLineWidth += word.width;
  326. currPt[0] += word.width;
  327. }
  328. else
  329. {
  330. /* Go to next line. */
  331. currPt[0] = pEnt->mtext.pt0[0];
  332. currPt[1] -= (pEnt->mtext.ht * 1.7);
  333. currLineWidth = word.width;
  334. memcpy(txtEnt.text.pt0, currPt, 3 * sizeof(double));
  335. currPt[0] += word.width;
  336. }
  337. }
  338. adHancpy(saveH, pHdr->enthandle);
  339. if (j == 0)
  340. {
  341. pHdr->xdblob = NULL;
  342. pHdr->reactorblob = NULL;
  343. adReplaceEntity(dbh, entList, pHdr->enthandle, pHdr, &txtEnt);
  344. }
  345. else
  346. {
  347. adGenerateObjhandle(dbh, pHdr->enthandle);
  348. adAddEntityToListAfter(dbh, entList, pHdr, &txtEnt, saveH);
  349. }
  350. }
  351. }
  352. }
  353. /* Convert all mtext entities in the passed in database to text entities. */
  354. BOOL CDwgReader::preprocess_Convertmtext(AD_DB_HANDLE dbh,int mode)
  355. {
  356. if(mode!=2)
  357. {
  358. return TRUE;
  359. }
  360. short         res;
  361. AD_BLKH       blkh;
  362. AD_ENT        ent;
  363. AD_ENT_HDR    hdr;
  364. long          i;
  365. AD_VMADDR     blob;
  366. int           wordCount;
  367. adStartBlockheaderGet(dbh);
  368. for (i = 0; i < adNumBlockheaders(dbh); i++) 
  369. {
  370. if (adGetBlockheader(dbh, &blkh))
  371. {
  372. if (adStartEntityGet(blkh.entitylist)) 
  373. {
  374. do 
  375. {
  376. if (res = adGetEntity(blkh.entitylist, &hdr, &ent)) 
  377. {
  378. if (hdr.enttype == AD_ENT_MTEXT)
  379. {
  380. blob = adCreateBlob();
  381. wordCount = preprocess_BuildWordList(dbh, &ent, blob);
  382. preprocess_BreakParagraph(dbh, &ent, blob, wordCount, blkh.entitylist, &hdr);
  383. adDeleteBlob(blob);
  384. }
  385. }
  386. } while (res && hdr.enttype!=AD_ENT_ENDBLK);
  387. }
  388. }
  389. return TRUE;
  390. }
  391. BOOL CDwgReader::preprocess_Convertproxy(AD_DB_HANDLE handle,int mode)
  392. {
  393. BOOL flags;
  394. switch(mode)
  395. {
  396. case 1://代理实体转换为块
  397. flags=TRUE;
  398. break;
  399. case 2://代理实体转换为实体
  400. flags=FALSE;
  401. break;
  402. default://代理实体转换为实体
  403. flags=FALSE;
  404. break;
  405. }
  406. short         res;
  407. AD_BLKH       blkh;
  408. AD_ENT        ent;
  409. AD_ENT_HDR    hdr;
  410. AD_OBJHANDLE  *BlkHandles;
  411. long i, j,    nBlkHdrCnt;
  412. if(res = adStartBlockheaderGet(handle)) 
  413. {
  414. nBlkHdrCnt = adNumBlockheaders(handle);
  415. if(flags)
  416. {
  417. BlkHandles = (AD_OBJHANDLE*)malloc(sizeof(AD_OBJHANDLE)*nBlkHdrCnt);
  418. for(i=j=0; i<nBlkHdrCnt; i++) 
  419. {
  420. if(adGetBlockheader(handle, &blkh))
  421. {
  422. if(!blkh.purgedflag) 
  423. {
  424. adHancpy(BlkHandles[j++], blkh.objhandle);
  425. }
  426. }
  427. }
  428. nBlkHdrCnt = j;
  429. }
  430. for(i=0; i<nBlkHdrCnt; i++) 
  431. {
  432. if(flags) 
  433. {
  434. res = adSeekBlockheader(handle, BlkHandles[i], &blkh);
  435. }
  436. else 
  437. {
  438. res = adGetBlockheader(handle, &blkh);
  439. }
  440. if(res && (res = adStartEntityGet(blkh.entitylist))) 
  441. {
  442. do 
  443. {
  444. if(res = adGetEntity(blkh.entitylist, &hdr, &ent)) 
  445. {
  446. switch(hdr.enttype)
  447. {
  448. case AD_ENT_LINE://1
  449. case  AD_ENT_POINT://2
  450. case  AD_ENT_CIRCLE://3
  451. case  AD_ENT_SHAPE:/*4*/ 
  452. case  AD_ENT_ELLIPSE://5
  453. case  AD_ENT_SPLINE://
  454. case  AD_ENT_TEXT:/*7*/
  455. case  AD_ENT_ARC://8
  456. case  AD_ENT_TRACE://9转换为4根线 宽度线      
  457. case  AD_ENT_REGION:/*10*/
  458. case  AD_ENT_BODY:
  459. case  AD_ENT_SOLID3D:   
  460. case  AD_ENT_SOLID:/*11*/ 
  461. case  AD_ENT_BLOCK://12
  462. case  AD_ENT_ENDBLK://13
  463. case  AD_ENT_INSERT://14
  464. case  AD_ENT_ATTDEF:
  465. case  AD_ENT_ATTRIB:
  466. case  AD_ENT_POLYLINE://多段线开始标志
  467. case  AD_ENT_VERTEX://多段线顶点   
  468. case  AD_ENT_SEQEND://insert+attribs或polyline+vertexs的结束标志,前者不予考虑  以上三种实体配合起来实现了多段线的完整转换.    
  469. case  AD_ENT_LINE3D:
  470. case  AD_ENT_FACE3D:
  471. case  AD_ENT_DIMENSION:
  472. case  AD_ENT_VIEWPORT://公共部分不予处理
  473. case  AD_ENT_RAY:
  474. case  AD_ENT_XLINE:
  475. case  AD_ENT_MTEXT:
  476. case  AD_ENT_LEADER://完成但仍然可以进一步优化 样条
  477. case  AD_ENT_TOLERANCE:
  478. case  AD_ENT_MLINE://完成 平行线
  479. break;
  480. default:
  481. if(hdr.enttype!=adArcAlignedTextEnttype(handle))
  482. if(hdr.enttype!=adHatchEnttype(handle))
  483. if(hdr.enttype!=adImageEnttype(handle))
  484. if(hdr.enttype!=adLwplineEnttype(handle))
  485. if(hdr.enttype!=adOle2frameEnttype(handle))
  486. if(hdr.enttype!=adRtextEnttype(handle))
  487. if(hdr.enttype!=adWipeoutEnttype(handle))
  488. if(AD_IS_A_PROXYENT(hdr.enttype))
  489. {
  490. if(adExplodeProxyToList(handle, &hdr, &ent, blkh.entitylist, flags, hdr.enthandle)) 
  491. {
  492. adDeleteEntity(handle, blkh.entitylist, hdr.enthandle, AD_DELETE_BLOBS);
  493. }
  494. }
  495. break;
  496. }
  497. }
  498. } while (res && hdr.enttype!=AD_ENT_ENDBLK);
  499. }
  500. }
  501. }
  502. if(flags) 
  503. {
  504. free(BlkHandles);
  505. }
  506. return TRUE;
  507. }
  508. BOOL CDwgReader::preprocess_Convertxref(AD_DB_HANDLE dwghandle)
  509. {
  510. sReturnValue=adStartBlockheaderGet(dwghandle);
  511. if(sReturnValue!=1)
  512. {
  513. _ERROR;
  514. return FALSE;
  515. }
  516. //long adNumBlockheaders (AD_DB_HANDLE handle);
  517. for(long i=0; i<adNumBlockheaders(dwghandle);i++) // note --无0 -2 so we don't get the model and paperspace blocks
  518. {
  519. //short adGetBlockheader (AD_DB_HANDLE handle, PAD_BLKH adblkh);
  520. sReturnValue=adGetBlockheader(dwghandle,&adtb->blkh);
  521. if(sReturnValue!=1)
  522. {
  523. _ERROR;
  524. return FALSE;
  525. }
  526. if(adtb->blkh.purgedflag==1)
  527. {
  528. continue;
  529. }
  530. if((adtb->blkh.flag&AD_BLOCK_XREF)&&(!adtb->blkh.unloaded))
  531. {
  532. //short adStartEntityGet (AD_VMADDR list);
  533. sReturnValue=adStartEntityGet(adtb->blkh.entitylist);
  534. if(sReturnValue!=1)
  535. {
  536. _ERROR;
  537. return FALSE;
  538. }
  539. //short adGetEntity (AD_VMADDR list,PAD_ENT_HDR adenhd,PAD_ENT aden);
  540. if(adGetEntity(adtb->blkh.entitylist,adenhd,aden))
  541. {
  542. if(adenhd->enttype==AD_ENT_BLOCK)
  543. {
  544. if(aden->block.xrefpath[0]==0)
  545. {
  546. continue;
  547. }
  548. CString strTmpFile;
  549. char path[MAX_PATH];
  550. GetTempPath(MAX_PATH,path);
  551. strTmpFile.Format("%s",path);
  552. strTmpFile += "ConvXRef.kmg";
  553. AD_DB_HANDLE refhandle;
  554. //AD_DB_HANDLE adGetXrefDbHandle(AD_DB_HANDLE main, void *filename);
  555. refhandle=adGetXrefDbHandle(dwghandle,aden->block.xrefpath);
  556. try
  557. {
  558. adFileVersionLoaded(refhandle);
  559. }
  560. catch(...)
  561. {
  562. //无法读出数据来,只有转换为东方CAD的外部引用
  563. CString str=aden->block.xrefpath;
  564. if(str.Find('.')==-1)
  565. {
  566. str+=".kmg";
  567. }
  568. else
  569. {
  570. if(str.GetLength()<3)
  571. {
  572. continue;
  573. }
  574. str=str.Left(str.GetLength()-3)+"kmg";
  575. }
  576. if(str.Find('\')==-1)
  577. {
  578. {
  579. CString strPath;
  580. TCHAR szFileName[MAX_PATH]; 
  581. ::memcpy(szFileName,(char*)(LPCTSTR)m_pCommand->m_strSourceName,MAX_PATH);
  582. (*_tcsrchr(szFileName,'\'))=''; 
  583. strPath=szFileName;
  584. strPath+="\";
  585. strPath+=str;
  586. str=strPath;
  587. }
  588. }
  589. UINT id=m_pConverter->ConverterEnthead_Blockdefine(aden->block.xrefpath,aden->block.name2);
  590. m_pConverter->ConverterEnthead_XrefBlock(id,aden->block.base[0],aden->block.base[1],aden->block.base[2],str);
  591. m_ablock.Add(adtb->blkh.objhandle,id,1.0,FALSE);
  592. continue;
  593. }
  594. CProgressInfo* pProgress=new CProgressInfo; 
  595. CCommandInfo* pCommand=new CCommandInfo;  
  596. pCommand->m_strSourceName=aden->block.xrefpath;
  597. pCommand->m_strAimName=strTmpFile;
  598. pCommand->m_hmainfrm=m_pCommand->m_hmainfrm;
  599. CKmgConverter* pConverter=new CKmgConverter(pCommand); 
  600. CDwgReader* pReader=new CDwgReader(pProgress,pCommand,pConverter);
  601. BOOL bSucceed=pReader->BeginConvert();
  602. if(bSucceed)
  603. {
  604. bSucceed=pReader->Parse(refhandle);
  605. }
  606. if(bSucceed)
  607. {
  608. bSucceed=pReader->EndConvert();
  609. }
  610. delete pProgress; 
  611. delete pCommand;  
  612. delete pReader;       
  613. delete pConverter;    
  614. m_pConverter->ReActiveDataManager();
  615. CKmDataManager* pTempDB=new CKmDataManager;
  616. pTempDB->Init();
  617. BOOL bAllowReadOld=FALSE;
  618. bSucceed=pTempDB->LoadFile(strTmpFile,bAllowReadOld);
  619. if(bSucceed)
  620. {
  621. KmBlockDef* pTempDef=::CreateDBBlockDef(pTempDB,strTmpFile,"外部转换块");
  622. pTempDef->SetBasePt(KmPoint(aden->block.base[0],aden->block.base[1]));
  623. if(pTempDef)
  624. {
  625. UINT newid;
  626. if(::PrepareInsertExternalBlockDef(pTempDB,pTempDef,newid))
  627. {
  628. m_ablock.Add(adtb->blkh.objhandle,newid,1.0,FALSE);
  629. }
  630. }
  631. //?? delete pTempDef;
  632. }
  633. delete pTempDB;
  634. ::DeleteFile(strTmpFile);
  635. }
  636. }
  637. }
  638. }
  639. return TRUE;
  640. }