找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 167|回复: 0

[每日一码] ARX常用代码总结

[复制链接]

1

主题

0

回帖

33

积分

管理员

积分
33
发表于 2024-3-14 20:52:09 | 显示全部楼层 |阅读模式
  1. ////将图形加载显示到CAD===================  
  2. static AcDbObjectId LoadEntity(AcDbEntity* entity){  
  3.         AcDbBlockTable* pBlockTable;  
  4.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead);  
  5.         AcDbBlockTableRecord* pBlockTableRecord;  
  6.         pBlockTable->getAt(ACDB采用MODEL采用SPACE,pBlockTableRecord,AcDb::kForWrite);  
  7.         AcDbObjectId Id;  
  8.         pBlockTableRecord->appendAcDbEntity(Id,entity);  
  9.         pBlockTable->close();  
  10.         pBlockTableRecord->close();  
  11.         entity->close();  
  12.         return Id;  
  13. }  
  14. ////为图形添加标注  
  15. static void AddOrdinate(AcGePoint3d ptStart,AcGePoint3d ptEnd,  
  16.                                                 CString text)
  17. {  
  18.         AcDbOrdinateDimension* pDim = new   
  19.                 AcDbOrdinateDimension(true,ptStart,ptEnd,text);  
  20.         LoadEntity(pDim);  
  21. }  
  22. ////画线====================  
  23. static void TESTlineCmd()  
  24. {  
  25.         //acutPrintf(采用T("\nHello"));  
  26.         ads采用point inputStart;  
  27.         ads采用point inputEnd;  
  28.         AcGePoint3d ptStart;  
  29.         AcGePoint3d ptEnd;  
  30.         ////用户输入要画的坐标  
  31.         if(acedGetPoint(NULL,采用T("start point"),inputStart) != RTNORM){  
  32.                 return;  
  33.         }  
  34.         ptStart[X] = inputStart[X];  
  35.         ptStart[Y] = inputStart[Y];  
  36.         ptStart[Z] = inputStart[Z];  
  37.         if(acedGetPoint(NULL,采用T("end point"),inputEnd) != RTNORM){  
  38.                 return;  
  39.         }  
  40.         ptEnd[X] = inputEnd[X];  
  41.         ptEnd[Y] = inputEnd[Y];  
  42.         ptEnd[Z] = inputEnd[Z];  
  43.         AcDbLine* pLine = new AcDbLine(ptStart,ptEnd);  
  44.         pLine->setColorIndex(2);  
  45.         LoadEntity(pLine);  
  46.         AddOrdinate(ptStart,ptEnd,采用T("hi"));  
  47.         //AfxMessageBox(采用T("命令画了一条线"));  
  48. }  
  49. ////画圆形==========================  
  50. static void TESTcirclecmd(){  
  51.         ////垂直平面法向量  
  52.         AcGeVector3d vec(0,0,1);  
  53.         ////圆心  
  54.         AcGePoint3d ptCenter(100,100,100);  
  55.         AcDbCircle* pCircle = new AcDbCircle(ptCenter,vec,1000);  
  56.         LoadEntity(pCircle);  
  57. }  
  58. ////画圆弧================================  
  59. static void TESTarccmd(){  
  60.         AcGeVector3d vec(0,0,1);  
  61.         AcGePoint3d ptCenter(500,500,500);  
  62.         AcDbArc* pArc = new AcDbArc(ptCenter,vec,700,0,90);  
  63.         LoadEntity(pArc);  
  64. }  
  65. ////画多线段============================  
  66. static void TESTpolycmd(){  
  67.         ////构造多点数组  
  68.         AcGePoint2dArray points;  
  69.         AcGePoint2d pt1(1000, 1000);  
  70.         AcGePoint2d pt2(2000, 1800);  
  71.         AcGePoint2d pt3(500, 2000);  
  72.         AcGePoint2d pt4(3000, 5000);  
  73.         points.append(pt1);  
  74.         points.append(pt2);  
  75.         points.append(pt3);  
  76.         points.append(pt4);  
  77.         ////绘制多点线段  
  78.         AcDbPolyline* pl = new AcDbPolyline(points.length());  
  79.         for(int i = 0;i < points.length();i ++){  
  80.                 pl->addVertexAt(i,points.at(i),0,0.5,0.5);  
  81.         }  
  82.         LoadEntity(pl);  
  83. }  
  84. ////绘制POLY3d线段====================  
  85. static void TESTpoly3dcmd(){  
  86.         ////构造多点数组  
  87.         AcGePoint3dArray points;  
  88.         AcGePoint3d pt1(10, 10,10);  
  89.         AcGePoint3d pt2(20, 10,20);  
  90.         AcGePoint3d pt3(20, 20,30);  
  91.         points.append(pt1);  
  92.         points.append(pt2);  
  93.         points.append(pt3);  
  94.         ////绘制多点线段  
  95.         AcDb3dPolyline* pl = new AcDb3dPolyline(AcDb::Poly3dType::k3dSimplePoly,points);  
  96.         LoadEntity(pl);  
  97. }  
  98. ////绘制椭圆=========================  
  99. static void TESTellipsecmd(){  
  100.         ////椭圆焦点  
  101.         /* AcGePoint2d p1(400,400);
  102.         AcGePoint2d p2(800,400);*/  
  103.         ////中心点  
  104.         AcGePoint3d ptCenter(600,400,0);  
  105.         AcGeVector3d vecNormal(0,0,1);  
  106.         ////长轴  
  107.         AcGeVector3d majorAxis(1000,0,0);  
  108.         ////通过曲率确定短轴长度  
  109.         double ratio = 0.6;  
  110.         AcDbEllipse* ae = new AcDbEllipse(/*AcGePoint3d::kOrigin*/ptCenter,vecNormal,majorAxis,  
  111.                 ratio);  
  112.         LoadEntity(ae);  
  113. }  
  114. ////创建样条曲线================  
  115. static void TESTsplinecmd(){  
  116.         AcGePoint3d p1(0,0,0),p2(200,600,0),p3(1200,1600,0),  
  117.                 p4(2000,2000,0);  
  118.         AcGePoint3dArray points;  
  119.         points.append(p1);  
  120.         points.append(p2);  
  121.         points.append(p3);  
  122.         points.append(p4);  
  123.         AcDbSpline* as = new AcDbSpline(points);  
  124.         LoadEntity(as);  
  125. }  
  126. ////创建面域(把用直线创建的闭合图形,生成一个图形的对象)  
  127. static void TESTregioncmd(){  
  128.         ads采用name ss;  
  129.         ////提示用户选择对象  
  130.         int rt = acedSSGet(NULL,NULL,NULL,NULL,ss);  
  131.         AcDbObjectIdArray ids;  
  132.         if(rt == RTNORM){  
  133.                 long len;  
  134.                 ////获得对象个数  
  135.                 acedSSLength(ss,&len);  
  136.                 for(int i = 0;i < len;i ++){  
  137.                         ////先从对象中得到名字  
  138.                         ads采用name ent;  
  139.                         acedSSName(ss,i,ent);  
  140.                         ////再从名字中取出ID  
  141.                         AcDbObjectId objId;  
  142.                         acdbGetObjectId(objId,ent);  
  143.                         ids.append(objId);  
  144.                 }  
  145.         }  
  146.         acedSSFree(ss);  
  147.         ////得到objId数组之后,开始画区域  
  148.         CreateRegion(ids);  
  149. }  
  150. ////绘制面域  
  151. static AcDbObjectIdArray  CreateRegion(AcDbObjectIdArray ids){  
  152.         AcDbObjectIdArray regionIds;  
  153.         AcDbVoidPtrArray curves;  
  154.         AcDbVoidPtrArray regions;  
  155.         AcDbEntity* pEnt;  
  156.         AcDbRegion* pRegion;  
  157.         for(int i = 0;i < ids.length();i ++){  
  158.                 acdbOpenAcDbEntity(pEnt,ids.at(i),AcDb::kForRead);  
  159.                 if(pEnt->isKindOf(AcDbCurve::desc())){  
  160.                         curves.append(static采用cast<void*>(pEnt));  
  161.                 }  
  162.         }  
  163.         Acad::ErrorStatus es = AcDbRegion::createFromCurves(curves,regions);  
  164.         if(es == Acad::eOk){  
  165.                 for(int i = 0;i < regions.length();i ++){  
  166.                         pRegion = static采用cast<AcDbRegion*>(regions[i]);  
  167.                         pRegion->setDatabaseDefaults();  
  168.                         AcDbObjectId regionId = LoadEntity(pRegion);  
  169.                         regionIds.append(regionId);  
  170.                 }  
  171.                 CString tipStr ;  
  172.                 tipStr.Format(采用T("\n已成功创建面域:%d个"),regions.length());  
  173.                 acutPrintf(tipStr);  
  174.         }  
  175.         else{  
  176.                 for(int i = 0;i < regions.length();i ++){  
  177.                         delete (AcRxObject*)regions[i];  
  178.                 }  
  179.         }  
  180.         for(int i = 0;i < ids.length();i ++){  
  181.                 pEnt = static采用cast<AcDbEntity*>(curves[i]);  
  182.                 pEnt->close();  
  183.         }  
  184.         return regionIds;  
  185. }  
  186. //绘制文字===================  
  187. static void TESTtextcmd(){  
  188.         AcGePoint3d ptInsert(0,400,0);  
  189.         AcDbMText* pMText = new AcDbMText();  
  190.         ////设置多行文字特性  
  191.         pMText->setContents(采用T("hello!!"));  
  192.         pMText->setLocation(ptInsert);  
  193.         pMText->setTextHeight(1000);  
  194.         pMText->setWidth(1000);  
  195.         pMText->setAttachment(AcDbMText::kBottomLeft);  
  196.         LoadEntity(pMText);  
  197. }  
  198. [it618postdisplay>0]
  199. ////创建填充======================  
  200. static void TESThatchcmd(){  
  201.         ////提示用户选择填充边界  
  202.         ads采用name ss;  
  203.         int rt = acedSSGet(NULL,NULL,NULL,NULL,ss);  
  204.         AcDbObjectIdArray objIds;  
  205.         if(rt == RTNORM){  
  206.                 long len;  
  207.                 acedSSLength(ss,&len);  
  208.                 for(int i = 0;i < len;i ++){  
  209.                         ads采用name ent;  
  210.                         acedSSName(ss,i,ent);  
  211.                         AcDbObjectId objId;  
  212.                         acdbGetObjectId(objId,ent);  
  213.                         objIds.append(objId);  
  214.                 }  
  215.         }  
  216.         acedSSFree(ss);  
  217.         ////选择完毕,绘制填充  
  218.         Acad::ErrorStatus es;  
  219.         AcDbHatch* pHatch = new AcDbHatch();  
  220.         ////选择填充平面  
  221.         AcGeVector3d normal(0,0,1);  
  222.         pHatch->setNormal(normal);  
  223.         pHatch->setElevation(0);  
  224.         ////设置关联性  
  225.         pHatch->setAssociative(true);  
  226.         ////设置填充图案  
  227.         pHatch->setPattern(AcDbHatch::kPreDefined,采用T(/*"SOLID"*/"ANSI31"));  
  228.         ////设置填充角度  
  229.         pHatch->setPatternAngle(45);  
  230.         ////设置填充边界  
  231.         es=pHatch->appendLoop(AcDbHatch::kExternal,objIds);  
  232.         ////显示填充对象  
  233.         es=pHatch->evaluateHatch();  
  234.         LoadEntity(pHatch);  
  235. }  
  236. [/it618postdisplay]
  237. //获得一层的所有对象,变色===============  
  238. static void TESTgetlayerobjcmd(){  
  239.         AcDbLayerTable *pLayerTbl;  
  240.         acdbHostApplicationServices()->workingDatabase()->getSymbolTable(  
  241.                 pLayerTbl,AcDb::kForRead);  
  242.         if(!pLayerTbl->has(采用T("测试"))){  
  243.                 acutPrintf(采用T("\n当前图形未包含'测试'图层"));  
  244.                 pLayerTbl->close();  
  245.                 return;  
  246.         }  
  247.         AcDbObjectId layerId;  
  248.         pLayerTbl->getAt(采用T("测试"),layerId);  
  249.         pLayerTbl->close();  
  250.         ////获得当前数据库的块表  
  251.         AcDbBlockTable* pBlkTbl;  
  252.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(  
  253.                 pBlkTbl,AcDb::kForRead);  
  254.         ////获得模型空间的块表记录  
  255.         AcDbBlockTableRecord* pBlkTblRcd;  
  256.         pBlkTbl->getAt(ACDB采用MODEL采用SPACE,pBlkTblRcd,AcDb::kForRead);  
  257.         pBlkTbl->close();  
  258.         ////创建块表记录遍历器  
  259.         AcDbBlockTableRecordIterator* pIter;  
  260.         pBlkTblRcd->newIterator(pIter);  
  261.         AcDbEntity* pEnt;  
  262.         for(pIter->start();!pIter->done();pIter->step()){  
  263.                 pIter->getEntity(pEnt,AcDb::kForWrite);  
  264.                 if(pEnt->layerId() == layerId){  
  265.                         /*AcDbLine* pLine = AcDbLine::cast(pEnt);
  266.                         if(pLine != NULL){*/  
  267.                         pEnt->setColorIndex(1);  
  268.                         //}  
  269.                 }  
  270.                 pEnt->close();  
  271.         }  
  272.         delete pIter;  
  273.         pBlkTblRcd->close();  
  274. }   
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-29 21:10 , Processed in 0.142980 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表