ADN Open CIS
Сообщество программистов Autodesk в СНГ

03/11/2015

Преобразование геометрических объектов в примитивы AutoCAD

Очень часто вы работаете с геометрическими объектами (экземплярами классов AcGeXXXX) для выполнения некоторых геометрических операций в 2D или в 3D. Для преобразования их в примитивы, которые могут быть добавлены в базу AutoCAD существует очень полезный метод в ObjectARX / AutoCAD .NET API.

Метод "acdbConvertGelibCurveToAcDbCurve", который выполняет эту функцию, был представлен в AutoCAD 2012. Эквивалентный метод в AutoCAD .NET API появился в AutoCAD 2013.

Эти примеры демонстрируют использование указанного метода в ObjectARX / AutoCAD .NET API :

Код - C++: [Выделить]
  1. // Этот пример использует "acdbConvertGelibCurveToAcDbCurve"
  2. // Могут быть интересны и другие методы:
  3. // AcDbCurve::getAcGeCurve()
  4. // AcDbCurve::setFromAcGeCurve()
  5.  
  6. static void AdskMyTest1_Ge2Db(void)
  7. {
  8.     AcGeEllipArc3d ellipticArc(AcGePoint3d::kOrigin,
  9.         AcGeVector3d::kXAxis,
  10.         AcGeVector3d::kYAxis,
  11.         2.0,
  12.         0.5);
  13.  
  14.     GetCurveObjectId(ellipticArc);
  15. }
  16.  
  17.  
  18. static AcDbObjectId GetCurveObjectId(AcGeCurve3d &geCurve3d)
  19. {
  20.     AcDbObjectId oid = AcDbObjectId::kNull;
  21.     Acad::ErrorStatus es = Acad::eOk;
  22.     AcDbCurve *pDbCurve = NULL;
  23.     es = acdbConvertGelibCurveToAcDbCurve(geCurve3d, pDbCurve);
  24.     if(es == Acad::eOk)
  25.     {
  26.     postToDb(pDbCurve, oid);
  27.     }
  28.     return oid;
  29. }
  30.  
  31.  
  32.  
  33.  static Acad::ErrorStatus postToDb(
  34.  AcDbEntity* pEnt, AcDbObjectId &oid)
  35. {
  36.     AcDbBlockTable* pBlockTable;
  37.     AcDbDatabase *pDb
  38.     = acdbHostApplicationServices()->workingDatabase();
  39.     pDb = ->getBlockTable(pBlockTable, AcDb::kForRead);
  40.     AcDbBlockTableRecord* pModelSpaceBTR = NULL;
  41.     pBlockTable->getAt(ACDB_MODEL_SPACE,
  42.     pModelSpaceBTR,
  43.     AcDb::kForWrite);
  44.  
  45.     Acad::ErrorStatus es;
  46.     es = pModelSpaceBTR->appendAcDbEntity(oid, pEnt);
  47.     pEnt->close();
  48.     pModelSpaceBTR->close();
  49.     pBlockTable->close();
  50.  
  51.     return es;
  52. }

 

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.Geometry;
  2.  
  3. [CommandMethod("ge2dbnet")]
  4. public void Ge2DbMethod()
  5. {
  6.      EllipticalArc3d arc1 =
  7.          new EllipticalArc3d(Point3d.Origin,
  8.      Vector3d.XAxis,
  9.      Vector3d.YAxis,
  10.      2.0, 0.5);
  11.  
  12.     GetCurveObjectId(arc1);
  13. }
  14.  
  15.  
  16. static ObjectId GetCurveObjectId(Curve3d geCurve3d)
  17. {
  18.     Document doc  = Application.DocumentManager.MdiActiveDocument;
  19.     Editor ed = doc.Editor;
  20.     Database db = doc.Database;
  21.     ObjectId oid = ObjectId.Null;
  22.     try
  23.     {
  24.         Curve dbCurve = Curve.CreateFromGeCurve(geCurve3d);
  25.         if (dbCurve != null)
  26.         {
  27.             using (Transaction tr =
  28.                 db.TransactionManager.StartTransaction())
  29.                 {
  30.                     BlockTable bt = tr.GetObject(db.BlockTableId,
  31.                         OpenMode.ForRead) as BlockTable;
  32.                 BlockTableRecord btr =
  33.                     tr.GetObject(db.CurrentSpaceId,
  34.                     OpenMode.ForWrite) as BlockTableRecord;
  35.                 btr.AppendEntity(dbCurve);
  36.                 tr.AddNewlyCreatedDBObject(dbCurve, true);
  37.                 tr.Commit();
  38.                 }
  39.          }
  40.     }
  41.     catch (System.Exception ex)
  42.     {
  43.         ed.WriteMessage(ex.Message);
  44.     }
  45.     return oid;
  46. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/04/converting-geometry-objects-to-database-entity.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=3182

Опубликовано 03.11.2015