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++: [Выделить]
- // Этот пример использует "acdbConvertGelibCurveToAcDbCurve"
- // Могут быть интересны и другие методы:
- // AcDbCurve::getAcGeCurve()
- // AcDbCurve::setFromAcGeCurve()
- static void AdskMyTest1_Ge2Db(void)
- {
- AcGeEllipArc3d ellipticArc(AcGePoint3d::kOrigin,
- AcGeVector3d::kXAxis,
- AcGeVector3d::kYAxis,
- 2.0,
- 0.5);
- GetCurveObjectId(ellipticArc);
- }
- static AcDbObjectId GetCurveObjectId(AcGeCurve3d &geCurve3d)
- {
- AcDbObjectId oid = AcDbObjectId::kNull;
- Acad::ErrorStatus es = Acad::eOk;
- AcDbCurve *pDbCurve = NULL;
- es = acdbConvertGelibCurveToAcDbCurve(geCurve3d, pDbCurve);
- if(es == Acad::eOk)
- {
- postToDb(pDbCurve, oid);
- }
- return oid;
- }
- static Acad::ErrorStatus postToDb(
- AcDbEntity* pEnt, AcDbObjectId &oid)
- {
- AcDbBlockTable* pBlockTable;
- AcDbDatabase *pDb
- = acdbHostApplicationServices()->workingDatabase();
- pDb = ->getBlockTable(pBlockTable, AcDb::kForRead);
- AcDbBlockTableRecord* pModelSpaceBTR = NULL;
- pBlockTable->getAt(ACDB_MODEL_SPACE,
- pModelSpaceBTR,
- AcDb::kForWrite);
- Acad::ErrorStatus es;
- es = pModelSpaceBTR->appendAcDbEntity(oid, pEnt);
- pEnt->close();
- pModelSpaceBTR->close();
- pBlockTable->close();
- return es;
- }
Код - C#: [Выделить]
- using Autodesk.AutoCAD.Geometry;
- [CommandMethod("ge2dbnet")]
- public void Ge2DbMethod()
- {
- EllipticalArc3d arc1 =
- new EllipticalArc3d(Point3d.Origin,
- Vector3d.XAxis,
- Vector3d.YAxis,
- 2.0, 0.5);
- GetCurveObjectId(arc1);
- }
- static ObjectId GetCurveObjectId(Curve3d geCurve3d)
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- ObjectId oid = ObjectId.Null;
- try
- {
- Curve dbCurve = Curve.CreateFromGeCurve(geCurve3d);
- if (dbCurve != null)
- {
- using (Transaction tr =
- db.TransactionManager.StartTransaction())
- {
- BlockTable bt = tr.GetObject(db.BlockTableId,
- OpenMode.ForRead) as BlockTable;
- BlockTableRecord btr =
- tr.GetObject(db.CurrentSpaceId,
- OpenMode.ForWrite) as BlockTableRecord;
- btr.AppendEntity(dbCurve);
- tr.AddNewlyCreatedDBObject(dbCurve, true);
- tr.Commit();
- }
- }
- }
- catch (System.Exception ex)
- {
- ed.WriteMessage(ex.Message);
- }
- return oid;
- }
Источник: 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