找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 323|回复: 1

[每日一码] POLYLINE和ARC相互转换的ARX

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-2-23 22:46:51 | 显示全部楼层 |阅读模式
  1. static void AsdkConvertPolylineArc2Arc(void)
  2. {
  3.     ads采用name ename;
  4.     ads采用point pt;
  5.     int retval;
  6.     retval = acedEntSel(L"\nPick a LW polyline:", ename, pt);
  7.     if(retval != RTNORM)
  8.         return;
  9.     AcDbPolyline *pPoly;
  10.     AcDbObjectId id;
  11.     Acad::ErrorStatus es;
  12.     acdbGetObjectId(id, ename);
  13.     es = acdbOpenObject((AcDbObject*&)pPoly, id, AcDb::kForRead);
  14.     if (es != Acad::eOk)
  15.     {
  16.         acutPrintf(L"\nERROR: %s", acadErrorStatusText(es));
  17.         return;
  18.     }
  19.     if (pPoly->isA() != AcDbPolyline::desc())
  20.     {
  21.         acutPrintf(L"\nLW polyline not selected.");
  22.         pPoly->close();
  23.         return;
  24.     }
  25.     for (unsigned int i=0; i<pPoly->numVerts()-1; i++)
  26.     {
  27.         double bulge;
  28.         pPoly->getBulgeAt(i, bulge);
  29.         if (bulge == 0.0)  // line segment
  30.             continue;
  31.         AcGePoint2d startPt, endPt, centerPt, testPt;
  32.         pPoly->getPointAt(i, startPt);
  33.         pPoly->getPointAt(i+1, endPt);
  34.         AcGeCircArc2d geArc;
  35.         // easy AcDbPolyline method for creating an AcGeCircArc2d
  36.         pPoly->getArcSegAt(i, geArc);
  37.         double start = acutAngle(
  38.                                     asDblArray(geArc.center()),
  39.                                     asDblArray(startPt)
  40.                                 );
  41.         double end = acutAngle(
  42.                                 asDblArray(geArc.center()),
  43.                                 asDblArray(endPt)
  44.                               );
  45.         AcGePoint3d center = AcGePoint3d(
  46.                                             geArc.center().x,
  47.                                             geArc.center().y,
  48.                                             pPoly->elevation()
  49.                                         );
  50.         // if this polyline does not lie in WCS, get its ECS
  51.         // and tranform the center point back to WCS
  52.         if (pPoly->normal() != AcGeVector3d(0,0,1))
  53.         {
  54.             AcGeMatrix3d mat;
  55.             pPoly->getEcs(mat);
  56.             center = center.transformBy(mat);
  57.         }
  58.         AcDbArc* pArc;
  59.         // Check the direction of the arc. If it's clockwise
  60.         // (opposite the AutoCAD default)
  61.         // reverse the start and end points for the AcDbArc.
  62.         if (geArc.isClockWise())
  63.         {
  64.             pArc = new AcDbArc(
  65.                                 center,
  66.                                 pPoly->normal(),
  67.                                 geArc.radius(),
  68.                                 end,
  69.                                 start
  70.                               );
  71.         }
  72.         else
  73.         {
  74.             pArc = new AcDbArc(
  75.                                 center,
  76.                                 pPoly->normal(),
  77.                                 geArc.radius(),
  78.                                 start,
  79.                                 end
  80.                               );
  81.         }
  82.         AcCmColor yellow;
  83.         yellow.setColorIndex(2);
  84.         pArc->setColor(yellow);
  85.         //set entity properties such as layer, linetype, color
  86.         // User defined function to add entity to Model Space
  87.         // ...
  88.         postToModelSpace(pArc);
  89.         pArc->close();
  90.     }
  91.     pPoly->close();
  92. }
  93. static void postToModelSpace(AcDbEntity* pEntity)
  94. {
  95.     AcDbBlockTable *pBlockTable;
  96.     AcDbBlockTableRecord *pSpaceRecord;
  97.     AcDbDatabase *pDb
  98.             = acdbHostApplicationServices()->workingDatabase();
  99.     pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
  100.     pBlockTable->getAt
  101.                     (
  102.                         ACDB采用MODEL采用SPACE,
  103.                         pSpaceRecord,
  104.                         AcDb::kForWrite
  105.                     );
  106.     pSpaceRecord->appendAcDbEntity(pEntity);
  107.     pBlockTable->close();
  108.     pEntity->close();
  109.     pSpaceRecord->close();
  110. }
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-2-23 22:47:10 | 显示全部楼层
  1. Here is a sample code to perform a similar conversion using the AutoCAD .Net API :
  2. using Autodesk.AutoCAD.Geometry;
  3. Document doc = Application.DocumentManager.MdiActiveDocument;
  4. Editor ed = doc.Editor;
  5. Database db = doc.Database;
  6. PromptEntityOptions peo
  7.             = new PromptEntityOptions("Select a polyline : ");
  8. peo.SetRejectMessage("Not a polyline");
  9. peo.AddAllowedClass(
  10.     typeof(Autodesk.AutoCAD.DatabaseServices.Polyline), true);
  11. PromptEntityResult per = ed.GetEntity(peo);
  12. if (per.Status != PromptStatus.OK)
  13.     return;
  14. ObjectId plineId = per.ObjectId;
  15. using (Transaction tr = db.TransactionManager.StartTransaction())
  16. {
  17.     BlockTableRecord btr = tr.GetObject
  18.    (db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  19.     Autodesk.AutoCAD.DatabaseServices.Polyline pline =
  20.                 tr.GetObject(
  21.                                 plineId,
  22.                                 OpenMode.ForRead,
  23.                                 false
  24.                             )
  25.                 as Autodesk.AutoCAD.DatabaseServices.Polyline;
  26.     if (pline != null)
  27.     {
  28.         int segCount = pline.NumberOfVertices - 1;
  29.         for (int cnt = 0; cnt < segCount; cnt++)
  30.         {
  31.             Point3d vertexPt = pline.GetPoint3dAt(cnt);
  32.             SegmentType type = pline.GetSegmentType(cnt);
  33.             switch (type)
  34.             {
  35.                 case SegmentType.Arc:
  36.                 {
  37.                     CircularArc2d arc2d = pline.GetArcSegment2dAt(cnt);
  38.                     Interval arc2dInterval = arc2d.GetInterval();
  39.                     double startParam = arc2dInterval.LowerBound;
  40.                     double endParam = arc2dInterval.UpperBound;
  41.                     Point2d sp2d = arc2d.EvaluatePoint(startParam);
  42.                     Point2d ep2d = arc2d.EvaluatePoint(endParam);
  43.                     Point2d cp2d = arc2d.Center;
  44.                     double startAngle =
  45.                        (new Line2d(cp2d, sp2d)).Direction.Angle;
  46.                     double endAngle =
  47.                         (new Line2d(cp2d, ep2d)).Direction.Angle;
  48.                     Point3d cp3d = new Point3d(
  49.                                                 cp2d.X,
  50.                                                 cp2d.Y,
  51.                                                 pline.Elevation
  52.                                               );
  53.                     // if this polyline does not lie in WCS, get its ECS
  54.                     // and tranform the center point back to WCS
  55.                     if (pline.Normal != Vector3d.ZAxis)
  56.                     {
  57.                         Matrix3d ecsMatrix = pline.Ecs;
  58.                         cp3d = cp3d.TransformBy(ecsMatrix);
  59.                     }
  60.                     if (arc2d.IsClockWise)
  61.                     {
  62.                         Arc arc = new Arc(  cp3d,
  63.                                             pline.Normal,
  64.                                             arc2d.Radius,
  65.                                             endAngle,
  66.                                             startAngle
  67.                                           );
  68.                         arc.ColorIndex = 2;
  69.                         btr.AppendEntity(arc);
  70.                         tr.AddNewlyCreatedDBObject(arc, true);
  71.                     }
  72.                     else
  73.                     {
  74.                         Arc arc = new Arc(  cp3d,
  75.                                             pline.Normal,
  76.                                             arc2d.Radius,
  77.                                             startAngle,
  78.                                             endAngle
  79.                                          );
  80.                         arc.ColorIndex = 2;
  81.                         btr.AppendEntity(arc);
  82.                         tr.AddNewlyCreatedDBObject(arc, true);
  83.                     }
  84.                     break;
  85.                 }
  86.                 case SegmentType.Line:
  87.                 {
  88.                     LineSegment2d line2d
  89.                                 = pline.GetLineSegment2dAt(cnt);
  90.                     Interval line2dInterval = line2d.GetInterval();
  91.                     double startParam
  92.                                    = line2dInterval.LowerBound;
  93.                     double endParam
  94.                                    = line2dInterval.UpperBound;
  95.                     Point2d sp2d
  96.                             = line2d.EvaluatePoint(startParam);
  97.                     Point2d ep2d
  98.                             = line2d.EvaluatePoint(endParam);
  99.                     Point3d sp3d
  100.                     = new Point3d(sp2d.X, sp2d.Y, pline.Elevation);
  101.                     Point3d ep3d
  102.                     = new Point3d(ep2d.X, ep2d.Y, pline.Elevation);
  103.                     if (pline.Normal != Vector3d.ZAxis)
  104.                     {
  105.                         Matrix3d ecsMatrix = pline.Ecs;
  106.                         sp3d = sp3d.TransformBy(ecsMatrix);
  107.                         ep3d = ep3d.TransformBy(ecsMatrix);
  108.                     }
  109.                     Line line = new Line(sp3d, ep3d);
  110.                     line.ColorIndex = 2;
  111.                     btr.AppendEntity(line);
  112.                     tr.AddNewlyCreatedDBObject(line, true);
  113.                     break;
  114.                 }
  115.             }
  116.         }
  117.     }
  118.     tr.Commit();
  119. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 15:01 , Processed in 0.114432 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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