aaa1.cpp
上传用户:szhjsaaa
上传日期:2014-09-18
资源大小:2546k
文件大小:21k
源码类别:

CAD

开发平台:

Visual C++

  1. // aaa1.cpp : Initialization functions
  2. #include "StdAfx.h"
  3. #include "StdArx.h"
  4. #include "resource.h"
  5. #include <afxdllx.h>
  6. #include "math.h"
  7. //#include <aced.h>
  8. //#include <rxregsvc.h>
  9. HINSTANCE _hdllInstance =NULL ;
  10. // This command registers an ARX command.
  11. void AddCommand(const char* cmdGroup, const char* cmdInt, const char* cmdLoc,
  12. const int cmdFlags, const AcRxFunctionPtr cmdProc, const int idLocal = -1);
  13. // NOTE: DO NOT edit the following lines.
  14. //{{AFX_ARX_MSG
  15. void InitApplication();
  16. void UnloadApplication();
  17. //}}AFX_ARX_MSG
  18. // NOTE: DO NOT edit the following lines.
  19. //{{AFX_ARX_ADDIN_FUNCS
  20. //}}AFX_ARX_ADDIN_FUNCS
  21. void DrawFunction();
  22. ////////////////////////////////////////////////////////////////////////////
  23. //
  24. // Define the sole extension module object.
  25. AC_IMPLEMENT_EXTENSION_MODULE(Aaa1DLL);
  26. // Now you can use the CAcModuleRecourceOverride class in
  27. // your application to switch to the correct resource instance.
  28. // Please see the ObjectARX Documentation for more details
  29. /////////////////////////////////////////////////////////////////////////////
  30. // DLL Entry Point
  31. extern "C"
  32. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
  33. {
  34. if (dwReason == DLL_PROCESS_ATTACH)
  35. {
  36.         _hdllInstance = hInstance;
  37. // Extension DLL one time initialization
  38. Aaa1DLL.AttachInstance(hInstance);
  39. InitAcUiDLL();
  40. } else if (dwReason == DLL_PROCESS_DETACH) {
  41. // Terminate the library before destructors are called
  42. Aaa1DLL.DetachInstance();
  43. }
  44. return TRUE;    // ok
  45. }
  46. /////////////////////////////////////////////////////////////////////////////
  47. // ObjectARX EntryPoint
  48. extern "C" AcRx::AppRetCode 
  49. acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
  50. {
  51. switch (msg) {
  52. case AcRx::kInitAppMsg:
  53. // Comment out the following line if your
  54. // application should be locked into memory
  55. acrxDynamicLinker->unlockApplication(pkt);
  56. acrxDynamicLinker->registerAppMDIAware(pkt);
  57. InitApplication();
  58. break;
  59. case AcRx::kUnloadAppMsg:
  60. UnloadApplication();
  61. break;
  62. }
  63. return AcRx::kRetOK;
  64. }
  65. // Init this application. Register your
  66. // commands, reactors...
  67. void InitApplication()
  68. {
  69. // NOTE: DO NOT edit the following lines.
  70. //{{AFX_ARX_INIT
  71. //}}AFX_ARX_INIT
  72. // TODO: add your initialization functions
  73. acedRegCmds->addCommand("HELLOWORLD_COMMANDS",
  74. "Draw","Draw",ACRX_CMD_TRANSPARENT,DrawFunction);
  75. acutPrintf("可以执行命令:draw");
  76. }
  77. // Unload this application. Unregister all objects
  78. // registered in InitApplication.
  79. void UnloadApplication()
  80. {
  81. // NOTE: DO NOT edit the following lines.
  82. //{{AFX_ARX_EXIT
  83. //}}AFX_ARX_EXIT
  84. // TODO: clean up your application
  85. acedRegCmds->removeGroup("HELLOWORLD_COMMANDS");
  86. }
  87. // This functions registers an ARX command.
  88. // It can be used to read the localized command name
  89. // from a string table stored in the resources.
  90. void AddCommand(const char* cmdGroup, const char* cmdInt, const char* cmdLoc,
  91. const int cmdFlags, const AcRxFunctionPtr cmdProc, const int idLocal)
  92. {
  93. char cmdLocRes[65];
  94. // If idLocal is not -1, it's treated as an ID for
  95. // a string stored in the resources.
  96. if (idLocal != -1) {
  97. // Load strings from the string table and register the command.
  98. ::LoadString(_hdllInstance, idLocal, cmdLocRes, 64);
  99. acedRegCmds->addCommand(cmdGroup, cmdInt, cmdLocRes, cmdFlags, cmdProc);
  100. } else
  101. // idLocal is -1, so the 'hard coded'
  102. // localized function name is used.
  103. acedRegCmds->addCommand(cmdGroup, cmdInt, cmdLoc, cmdFlags, cmdProc);
  104. }
  105. #define copypt(d,s) d[X]=s[X];d[Y]=s[Y];d[Z]=s[Z];
  106. ads_point ncspt[3];//声明建立新坐标系的三个点变量
  107. double pi=3.14159265358979;
  108. int count=0;
  109. struct myread
  110. {
  111. double onlyid;    //控制点号
  112. double nameind;   //巷道名称索引号
  113. double x;
  114. double y;
  115. double z;
  116. float  ld;        //点至左邦的距离
  117. float  rd;        //点至右邦的距离
  118. float  bd;        //点至底板的距离
  119. int    ptype;     //巷道类型
  120. }buffer[50];//存放测量原始数据
  121. struct mytag        //建立巷道属性表结构
  122. {
  123. double nameind;        //索引号
  124.     char name[50];   //巷道名称
  125.     float enddist;
  126. float endhigh;
  127. float twidth;
  128. float bwidth;
  129. float wallhigh;
  130. int   tunneltype;//巷道类型
  131. }temtag;            //temtag结构存放巷道属性值
  132. //计算三点的圆心坐标放入cp点,cp[Z]=axdot[i+1][Z]-axdot[i][Z]存放两相邻点之间的高差
  133. void calcp(ads_point pt1,ads_point pt2,ads_point pt3,ads_point cp1)
  134. {
  135. double A1,A2,B1,B2,C1,C2;
  136. A1=pt1[X]-pt2[X];
  137. A2=pt3[X]-pt2[X];
  138. B1=pt1[Y]-pt2[Y];
  139. B2=pt3[Y]-pt2[Y];
  140. C1=(pt1[X]*pt1[X]+pt1[Y]*pt1[Y]-pt2[X]*pt2[X]-pt2[Y]*pt2[Y])/2;
  141.     C2=(pt3[X]*pt3[X]+pt3[Y]*pt3[Y]-pt2[X]*pt2[X]-pt2[Y]*pt2[Y])/2;
  142. cp1[Y]=(C2-A2*C1/A1)/(B2-A2*B1/A1);
  143. cp1[X]=(C1-B1*cp1[Y])/A1;
  144. // cp1[X]=(C1-B1*(C2-A2*C1/A1)/(B2-A2*B1/A1))/A1;
  145. cp1[Z]=pt1[Z];
  146. // R1=sqrt((cp1[X]-pt1[X])*(cp1[X]-pt1[X])+(cp1[Y]-pt1[Y])*(cp1[Y]-pt1[Y]));
  147. return;
  148. }//end calcp
  149. double ang(ads_point cp2,ads_point pt4)
  150. {
  151. double or;//方位角变量
  152. int rc2=0;
  153. double e,f,g;
  154. e=pt4[Y]-cp2[Y];
  155. f=pt4[X]-cp2[X];
  156. g=atan(e/f);
  157. if(g<0)
  158. g=-atan(e/f);
  159. if(e>0)
  160. {
  161. if(f>0)
  162. rc2=1;
  163. if(f<0)
  164. rc2=2;
  165. }
  166. if(e<0)
  167. {
  168. if(f<0)
  169. rc2=3;
  170. if(f>0)
  171. rc2=4;
  172. }
  173. switch(rc2)
  174. {
  175. case 0:
  176.     break;
  177.     case 1:
  178.     or=g;
  179.         break;
  180.         case 2:
  181. or=pi-g;
  182.         break;
  183. case 3:
  184. or=pi+g;
  185.         break;
  186. case 4:
  187. or=2*pi-g;
  188. break;
  189. }
  190.     if(e==0)
  191. {
  192. if(f>0)
  193. or=0.0;
  194. if(f<0)
  195. or=pi;
  196. }
  197. if(f==0)
  198. {
  199. if(e>0)
  200. or=pi/2;
  201. if(e<0)
  202. or=pi+pi/2;
  203. }
  204. return or;
  205. }//end ang()
  206. //标记巷道名称
  207. void lable(ads_point pt1,ads_point pt2,char tagtex[50])
  208. {
  209. ads_point tempt={5.0,2.50,0};                 //文本标注的左下基点
  210. ads_point pt3;
  211. pt3[X]=pt1[X]-(pt2[Y]-pt1[Y]);
  212. pt3[Y]=pt1[Y]+(pt2[X]-pt1[X]);
  213. pt3[Z]=pt1[Z];
  214. //三点法建立新坐标系    
  215.     acedCommand(RTSTR,"ucs",RTSTR,"n",RTSTR,"3",RT3DPOINT,pt1,
  216.             RT3DPOINT,pt2,RT3DPOINT,pt3,RTNONE);
  217. //在新坐标系中标注文本  
  218. acedCommand(RTSTR,"text",RTSTR,"j",RTSTR,"bl",RT3DPOINT,tempt,
  219.        RTSTR,"2",RTANG,0.0,RTSTR,tagtex,RTNONE);
  220. //恢复到世界坐标系
  221.     acedCommand(RTSTR,"ucs",RTSTR,"w",RTNONE);
  222.     
  223. }//end lable
  224. // 计算巷道中轴线点坐标,建立巷道图层,画三维巷道
  225. void rbcirc()
  226. {
  227. int i=0,j=0;
  228. int rc=0,rc1=0;
  229. ads_name ent1,ent2;
  230. //把测点坐标转换成巷道中轴线ads_point点坐标
  231. ads_point *axdot=new ads_point[count+1];
  232.     double a,b,ex,ey,c,l,d1,d2,elx,ely,etx,ety,ez;
  233. float d;
  234. for(i=0;i<count-1;i++)
  235. {
  236. a=buffer[i+1].x-buffer[i].x;
  237.     b=buffer[i+1].y-buffer[i].y;
  238.     c=sqrt(a*a+b*b);
  239.     d=(buffer[i].ld-buffer[i].rd)/2;
  240.     ex=b*d/c;
  241.     ey=a*d/c;
  242.     axdot[i][X]=buffer[i].x-ex;
  243.     axdot[i][Y]=buffer[i].y+ey;
  244.     axdot[i][Z]=buffer[i].z-buffer[i].bd;
  245. }
  246.         //计算最后一个导线点的中轴点
  247.             a=buffer[count-2].x-buffer[count-1].x;
  248.     b=buffer[count-2].y-buffer[count-1].y;
  249.     c=sqrt(a*a+b*b);
  250.     d=(buffer[count-1].rd-buffer[count-1].ld)/2;
  251.     ex=b*d/c;
  252.     ey=a*d/c;
  253.     axdot[count-1][X]=buffer[count-1].x-ex;
  254.     axdot[count-1][Y]=buffer[count-1].y+ey;
  255.     axdot[count-1][Z]=buffer[count-1].z-buffer[count-1].bd;
  256.       //计算巷道掌头的中轴点
  257.             a=axdot[count-1][X]-axdot[count-2][X];
  258.     b=axdot[count-1][Y]-axdot[count-2][Y];
  259.     c=sqrt(a*a+b*b);
  260. l=temtag.enddist;
  261.    
  262. axdot[count][X]=axdot[count-1][X]+a*l/c;
  263.     axdot[count][Y]=axdot[count-1][Y]+b*l/c;
  264.     axdot[count][Z]=temtag.endhigh;
  265. for(i=0;i<count;i++)
  266.         acutPrintf(" %lf, %lf, %fn",axdot[i][X],axdot[i][Y],axdot[i][Z]);
  267.      //对标注文本基线的两个端点赋值
  268.       int k=0;
  269.   k=int(count/2)-1;
  270.   copypt(ncspt[0], axdot[k]);
  271.           copypt(ncspt[1], axdot[k+1]);
  272.       
  273. //计算巷道断面的四个特征点三维坐标
  274. ads_point dm[4];
  275.             a=axdot[1][X]-axdot[0][X];
  276.     b=axdot[1][Y]-axdot[0][Y];
  277.     c=sqrt(a*a+b*b);
  278.     d1=temtag.twidth/2;//巷道上宽的一半
  279. d2=temtag.bwidth/2;//巷道下宽的一半
  280.             ez=temtag.wallhigh;//巷道的净高或拱形巷的墙高
  281.     elx=b*d2/c;
  282.     ely=a*d2/c;
  283.             
  284. etx=b*d1/c;
  285.     ety=a*d1/c;
  286. dm[0][X]=axdot[0][X]+etx;
  287. dm[0][Y]=axdot[0][Y]-ety;
  288.             dm[0][Z]=axdot[0][Z]+ez;
  289.             
  290. dm[1][X]=axdot[0][X]+elx;
  291. dm[1][Y]=axdot[0][Y]-ely;
  292.             dm[1][Z]=axdot[0][Z];
  293.             
  294. dm[2][X]=axdot[0][X]-elx;
  295. dm[2][Y]=axdot[0][Y]+ely;
  296.             dm[2][Z]=axdot[0][Z];
  297. dm[3][X]=axdot[0][X]-etx;
  298. dm[3][Y]=axdot[0][Y]+ety;
  299.             dm[3][Z]=axdot[0][Z]+ez;
  300. acutPrintf(" 角点坐标n n");
  301. for(i=0;i<4;i++)
  302.         acutPrintf(" %lf, %lf, %fn",dm[i][X],dm[i][Y],dm[i][Z]);
  303. //计算拱形巷道断面弧线点
  304.             ads_point ac[11];//拱形线上定义十一个三维中间点
  305. a=dm[0][X]-dm[3][X];
  306.     b=dm[0][Y]-dm[3][Y];
  307.    
  308.             float r;
  309.             r=temtag.twidth/2;//给拱形上圆半径赋值
  310.             for(i=0;i<11;i++)
  311. {
  312.     ac[i][X]=dm[3][X]+(i+1)*a/12;
  313.                 ac[i][Y]=dm[3][Y]+(i+1)*b/12;
  314.     ac[i][Z]=dm[3][Z]+sqrt(r*r-(6-(i+1))*(6-(i+1))*r*r/36);
  315. }
  316.             acutPrintf("拱线点坐标n");
  317. for(i=0;i<11;i++)
  318.         acutPrintf("%lf, %lf, %fn",ac[i][X],ac[i][Y],ac[i][Z]);
  319. rc=temtag.tunneltype;
  320. switch(rc)
  321. {
  322. case 701:
  323. acedCommand(RTSTR,"3DPOLY",RT3DPOINT,dm[3],
  324.        RT3DPOINT,ac[0],RT3DPOINT,ac[1],
  325.            RT3DPOINT,ac[2],RT3DPOINT,ac[3],
  326.            RT3DPOINT,ac[4],RT3DPOINT,ac[5],
  327.        RT3DPOINT,ac[6],RT3DPOINT,ac[7],
  328.        RT3DPOINT,ac[8],RT3DPOINT,ac[9],
  329.        RT3DPOINT,ac[10],RT3DPOINT,dm[0],
  330.        RT3DPOINT,dm[1],RT3DPOINT,dm[2],
  331.        RT3DPOINT,dm[3],RTSTR,"",RTNONE);
  332. break;
  333. case 702:
  334.         acedCommand(RTSTR,"3DPOLY",RT3DPOINT,dm[3],
  335.            RT3DPOINT,dm[0],RT3DPOINT,dm[1],
  336.        RT3DPOINT,dm[2],RT3DPOINT,dm[3],
  337.            RTSTR,"",RTNONE);
  338.      break;
  339. case 703:
  340.    
  341.   acedCommand(RTSTR,"circle",RT3DPOINT,axdot[0],RTREAL,temtag.twidth,RTNONE);
  342.    
  343.         break;
  344. }
  345.    //获得拉伸断面的实体
  346.     if(ads_entlast(ent1) != RTNORM)
  347. {
  348.   ads_fail("nFaile creat last entry.");
  349.   return; 
  350.  }
  351.   
  352.  
  353.         ads_point cp;
  354. double or1=0.0,or2=0.0,or3,or12;
  355. double R=0.0,h;
  356. ads_point mdpt[6];           //声明一个六个点的数组存放圆弧中间插值点的坐标
  357. for(i=0;i<count;i++)
  358. {
  359.         rc1=buffer[i].ptype;
  360. //绘制巷道三维轴线
  361. switch(rc1)
  362. {
  363. case 1:
  364. acedCommand(RTSTR,"3DPOLY",RT3DPOINT,axdot[i],RT3DPOINT,axdot[i+1],RTNONE);
  365. break;
  366. case 2:
  367. calcp(axdot[i],axdot[i+1],axdot[i+2],cp);//计算三点的圆心坐标放入cp点,cp[Z]=axdot[i+1][Z]-axdot[i][Z]
  368.  acutPrintf("下面是cp值n"); 
  369. acutPrintf("%lf,%lf,%lfn",cp[X],cp[Y],cp[Z]);
  370. R=sqrt((cp[X]-axdot[i][X])*(cp[X]-axdot[i][X])+(cp[Y]-axdot[i][Y])*(cp[Y]-axdot[i][Y]));
  371. or1=ang(cp,axdot[i]);         //计算起点与圆心的方位角
  372. or2=ang(cp,axdot[i+1]);       //计算终点与圆心的方位角
  373. or12=or2-or1;                 //计算起点与终点的方位角差值
  374. //判断or12值的取向
  375. if(or12>pi)
  376. or12=or12-2*pi;
  377. if(or12<-pi)
  378. or12=2*pi+or12;
  379. h=axdot[i+1][Z]-axdot[i][Z];
  380. for(j=0;j<5;j++)
  381. {
  382. or3=or1+(j+1)*or12/6;
  383. mdpt[j][X]=cp[X]+R*cos(or3);
  384.                 mdpt[j][Y]=cp[Y]+R*sin(or3);
  385. mdpt[j][Z]=axdot[i][Z]+(j+1)*h/6;
  386. }
  387. acutPrintf("下面是mdpt值n"); 
  388.             for(j=0;j<5;j++)
  389. acutPrintf("%lf, %lf, %lfn",mdpt[j][X],mdpt[j][Y],mdpt[j][Z]);
  390. //画出axdot[i]到axdot[i+1]之间的弧线
  391. acedCommand(RTSTR,"3DPOLY",RT3DPOINT,axdot[i],
  392.                 RT3DPOINT,mdpt[0],RT3DPOINT,mdpt[1],
  393.                     RT3DPOINT,mdpt[2],RT3DPOINT,mdpt[3],
  394.                     RT3DPOINT,mdpt[4],RT3DPOINT,axdot[i+1],
  395.                 RTNONE);
  396. break;
  397. case 3:
  398.         or1=ang(cp,axdot[i]);         //计算起点与圆心的方位角,结果放入or1内。
  399. or2=ang(cp,axdot[i+1]);       //计算终点与圆心的方位角,结果放入or2内。
  400. or12=or2-or1;                 //计算起点与终点的方位角差值
  401. //判断or12值的取向
  402. if(or12>pi)
  403. or12=or12-2*pi;
  404. if(or12<-pi)
  405. or12=2*pi+or12;
  406. h=axdot[i+1][Z]-axdot[i][Z];
  407. for(j=0;j<5;j++)
  408. {
  409. or3=or1+(j+1)*or12/6;
  410. mdpt[j][X]=cp[X]+R*cos(or3);
  411.                 mdpt[j][Y]=cp[Y]+R*sin(or3);
  412. mdpt[j][Z]=axdot[i][Z]+(j+1)*h/6;
  413. }
  414. //画出axdot[i]到axdot[i+1]之间的弧线
  415. acedCommand(RTSTR,"3DPOLY",RT3DPOINT,axdot[i],
  416.                 RT3DPOINT,mdpt[0],RT3DPOINT,mdpt[1],
  417.                     RT3DPOINT,mdpt[2],RT3DPOINT,mdpt[3],
  418.                     RT3DPOINT,mdpt[4],RT3DPOINT,axdot[i+1],
  419.                 RTNONE);
  420. break;
  421.             
  422. //画煤仓标注基线
  423. case 4:
  424. acedCommand(RTSTR,"3DPOLY",RT3DPOINT,axdot[i],RT3DPOINT,axdot[i+1],RTNONE);
  425. break;
  426. }//switch
  427.       }//for
  428. acedCommand(RTSTR,"",RTNONE);
  429.   
  430. //获得拉伸路径实体
  431.     if(ads_entlast(ent2) != RTNORM)
  432. {
  433.    ads_fail("nFaile creat last entry.");
  434.    return;
  435.  }
  436.     //把煤仓分成圆柱和圆椎
  437.     if(rc==703)
  438. {
  439. //画柱部分
  440. double hh;
  441. hh=buffer[count-1].z-buffer[0].z;
  442. acedCommand(RTSTR,"EXTRUDE",RTENAME,ent1,RTSTR,"",RTREAL,hh,RTANG,0.0,RTNONE);
  443.         //画圆锥部分
  444.    hh=temtag.endhigh-buffer[count-1].z;
  445.   
  446.           acedCommand(RTSTR,"cone",RT3DPOINT,axdot[count-1],RTREAL,temtag.twidth,
  447.           RTREAL,hh,RTNONE);
  448. }
  449. else
  450.      //下面是巷道的拉伸命令
  451.      acedCommand(RTSTR,"EXTRUDE",RTENAME,ent1,RTSTR,"",RTSTR,"P",RTENAME,ent2,RTNONE);
  452.    
  453. return;
  454. }
  455. void createNewLayer(char* lyrname, Adesk::UInt16 clr, AcDbObjectId ltypeId, Adesk::Boolean current)
  456. {
  457. // We need to check if the layer name exists
  458. // If the layer name exists, apply the color
  459. // linetype id and whither to make it current
  460. // or not. In order to be current it cannot be
  461. // frozen, so we need to check for this also.
  462. // If the layer name does not exist we just create
  463. // a new layer with the properties contained in the arguments
  464. AcDbLayerTable *pLyrTable;
  465. AcDbLayerTableRecord *pLyrTblRecord;
  466. AcDbObjectId recId;
  467. AcCmColor color;
  468. color.setColorIndex(clr); // set color to parameter clr
  469. AcDbDatabase *pCurDb = NULL;
  470. pCurDb = acdbHostApplicationServices()->workingDatabase();
  471. pCurDb->getLayerTable(pLyrTable, AcDb::kForRead);
  472. // Check to see if the layer name exists
  473. if(pLyrTable->has(lyrname))
  474. {
  475. pLyrTable->getAt(lyrname, pLyrTblRecord, AcDb::kForWrite, Adesk::kFalse);
  476. // pLyrTblRecord now points at the layer table record
  477. // which was opened for write
  478. pLyrTblRecord->setIsFrozen(Adesk::kFalse);
  479. pLyrTblRecord->setColor(color);
  480. pLyrTblRecord->setLinetypeObjectId(ltypeId);
  481. }
  482. else
  483. {
  484. // Note how we can change the open mode
  485. // of the layer table from AcDb::kForRead
  486. // to AcDb::kForWrite
  487. pLyrTable->upgradeOpen();
  488. pLyrTblRecord = new AcDbLayerTableRecord;
  489. pLyrTblRecord->setName(lyrname);
  490. pLyrTblRecord->setColor(color);
  491. pLyrTblRecord->setLinetypeObjectId(ltypeId);
  492. pLyrTable->add(pLyrTblRecord);
  493. }
  494. // Get the layer Table ObjectId
  495. recId = pLyrTblRecord->objectId();
  496. pLyrTblRecord->close();
  497. pLyrTable->close();
  498. // Set the layer current if current
  499. // is equal to Adesk::kTrue
  500. // pCurDb is point to the current
  501. // drawing database
  502. // The database AcDbDatabase has a number of
  503. // query and edit functions for the header variables
  504. if(current)
  505. {
  506. pCurDb->setClayer(recId);
  507. }
  508. }
  509. // This is command ' DrawFunction()'
  510. void DrawFunction()
  511. {
  512.      
  513. const char* title = "打开数据文件";           //设置对话框标题
  514. const char* default1 = "D:/wzy/";   //设置文件默认路径
  515. struct resbuf *fname;
  516.     char* pFILENAME;                 //声明指向文件的指针
  517. fname = acutNewRb(RTSTR);        //为指针设置内存空间
  518.     //获得打开文件的对话框
  519. if(acedGetFileD(title,default1,"mdb",0,fname)==RTNORM)
  520. {
  521. pFILENAME=fname->resval.rstring;
  522.      CString FILENAME=pFILENAME;            //把文件路径字符串付值给FILENAME变量
  523. int Indx=0;
  524.      char attQuery[256];
  525.      sprintf(attQuery,"SELECT * FROM 巷道属性表");//设置SQL查寻语句
  526.     
  527. CDaoDatabase db;                    //声明一个数据库对象
  528.        //按指定路径打开数据库
  529. db.Open(FILENAME,FALSE,FALSE,_T(""));
  530. CDaoRecordset pt_rs(&db);//记录集与数据库连接
  531. CDaoRecordset att_rs(&db);//记录集与数据库连接
  532.         if (att_rs.IsOpen()) att_rs.Close();
  533. att_rs.Open(dbOpenDynaset,attQuery,0);//动态打开记录集
  534. //读取属性表数据
  535. int iRecords =att_rs.GetRecordCount();//统计记录个数
  536.         if (!att_rs.IsBOF()) att_rs.MoveFirst();//把指针移到开始处
  537.         
  538. while (!att_rs.IsEOF()) 
  539. {
  540.             COleVariant vNameInd =att_rs.GetFieldValue("NameIndex");
  541.             COleVariant vTunName =att_rs.GetFieldValue("Name");
  542. COleVariant vEndDist = att_rs.GetFieldValue("EndDist");
  543.             COleVariant vEndHigh = att_rs.GetFieldValue("EndHigh");
  544.             COleVariant vTopWidth = att_rs.GetFieldValue("TopWith");
  545.             COleVariant vButWidth = att_rs.GetFieldValue("ButtomWith");
  546.             COleVariant vWallHigh = att_rs.GetFieldValue("WallHigh");
  547.             COleVariant vTunType = att_rs.GetFieldValue("Tunneltype");
  548. //程序结构变量提取属性数据库字段值
  549. temtag.nameind=vNameInd.lVal;   //巷道名称索引号
  550. // strcpy(temtag.name,vTunName.bstrVal);//巷道名称字符串
  551. sprintf(temtag.name,"%s",vTunName.bstrVal);
  552. temtag.enddist=vEndDist.fltVal;   //点至掌头的距离
  553. temtag.endhigh=vEndHigh.fltVal;   //掌头底板高程或煤仓底部高程
  554. temtag.twidth=vTopWidth.fltVal;   //巷道断面上宽或煤仓半径
  555. temtag.bwidth=vButWidth.fltVal;   //巷道断面下宽
  556. temtag.wallhigh=vWallHigh.fltVal; //拱形指墙高,非拱形指净高
  557. temtag.tunneltype=vTunType.intVal;//巷道断面类型:701-拱形;703-圆形;702-其它
  558.             char ptQuery[256];
  559. // CString strSQL;
  560. // strSQL="SELECT * FROM 巷道控制点数据 WHERE NameIndex=temtag.nameind";
  561.             sprintf(ptQuery,"SELECT * FROM 巷道控制点数据 WHERE NameIndex=%lf",temtag.nameind);
  562.              if (pt_rs.IsOpen()) pt_rs.Close();
  563.      pt_rs.Open(dbOpenDynaset,ptQuery);
  564.              //读取巷道控制点坐标表数据
  565.      int iPtRecords =pt_rs.GetRecordCount();
  566.              if (!pt_rs.IsEOF()) pt_rs.MoveFirst();
  567.              
  568.  Indx=0;//点记录集索引号清为零
  569.                  
  570.  while (!pt_rs.IsEOF()) 
  571.  {
  572.  COleVariant vOnlyID = pt_rs.GetFieldValue("OnlyID");//点唯一编号
  573.                      COleVariant vX = pt_rs.GetFieldValue("X");//测点X坐标
  574.              COleVariant vY = pt_rs.GetFieldValue("Y");//测点Y坐标
  575.                      COleVariant vZ = pt_rs.GetFieldValue("Z");//测点高程
  576.                      COleVariant vLD = pt_rs.GetFieldValue("LD");//测点至左邦距离
  577.                      COleVariant vRD = pt_rs.GetFieldValue("RD");//测点至右邦距离
  578.                      COleVariant vBD = pt_rs.GetFieldValue("BD");//测点至巷道底板值
  579.                      COleVariant vPType = pt_rs.GetFieldValue("PType");//1-直线点,2-曲线起点,3-曲线中间点
  580.          //程序结构变量提取巷道坐标数据库字段值
  581.  buffer[Indx].onlyid=vOnlyID.dblVal;
  582.                  buffer[Indx].x=vX.dblVal;
  583.                  buffer[Indx].y=vY.dblVal;
  584.      buffer[Indx].z=vZ.dblVal;
  585.                   buffer[Indx].ld=vLD.fltVal;
  586.                      buffer[Indx].rd=vRD.fltVal;
  587.      buffer[Indx].bd=vBD.fltVal;
  588.                   buffer[Indx].ptype=vPType.intVal;
  589.  Indx++;
  590.                      
  591.  pt_rs.MoveNext();//指到下一条点集记录
  592.  }//内循环结束(while)
  593.  count=Indx;//记录巷道控制点数
  594.                  pt_rs.Close();//关闭点记录集
  595.  //                   for(i=0;i<Indx;i++)
  596. // printf("%lf,%lf,%lf,%lfn",buffer[Indx].onlyid,buffer[Indx].x,buffer[Indx].y,buffer[Indx].z);
  597.  
  598. char lyrTunnel[50]="巷道";
  599. char lyrName[50]="名称";
  600. int col; // Color value
  601. AcDbObjectId ltypeId; // We need the object id of the linetype
  602. // for layer creation
  603.     AcDbDatabase *pCurDb = NULL;
  604. AcDbLinetypeTable *pltTable;
  605. pCurDb = acdbHostApplicationServices()->workingDatabase();
  606.     pCurDb->getLinetypeTable(pltTable, AcDb::kForRead);
  607. pltTable->getAt("CONTINUOUS", ltypeId);
  608. pltTable->close();
  609.     col=6;//巷道层颜色值
  610.     createNewLayer(lyrTunnel, col, ltypeId, Adesk::kTrue);//建立巷道图层
  611.     rbcirc();//计算巷中道轴线坐标绘制巷道
  612.    
  613.     col=4;//文本层颜色值
  614.     createNewLayer(lyrName, col, ltypeId, Adesk::kTrue);//建立文本图层
  615.     lable(ncspt[0],ncspt[1],temtag.name);//标注刚刚绘出的巷道名称
  616.                  
  617.  att_rs.MoveNext();//指到下一条属性集记录
  618. }//外循环结束
  619.                
  620. att_rs.Close();//关闭属性记录集
  621.         db.Close();
  622. }//end if
  623.    return;
  624. }