31/05/2020
Определение геометрического центра LWPOLYLINE, 2DPoly и 3DPoly
Detecting Geometric Center for LWPOLYLINE, 3DPoly and 2DPoly
К сожалению, нет прямого API для получения геометрического центра для трех видов полилиний. Кто-то может использовать топологические библиотеки, а кто-то предпочтет простейший из возможный способов – конвертирование AcDbPolyline, AcDb2Polyline, AcDb3dPolyline в область (AcDbRegion) без добавления его в чертеж, чтобы получить геометрический центр.
Код - C#: [Выделить]
- [CommandMethod("GCTR")]
- public static void GC() {
- var doc = AcCoreApp.DocumentManager.MdiActiveDocument;
- var db = doc.Database;
- var ed = doc.Editor;
- var tid = ObjectId.Null;
- Point2d centroid = Point2d.Origin;
- using(Transaction tr = db.TransactionManager.StartTransaction()) {
- try {
- TypedValue[] acTypValAr = {
- new TypedValue((int) DxfCode.Operator, "")
- };
- // Установим фильтр
- SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
- // Запрашиваем объекты чертежа
- PromptSelectionResult acSSPrompt;
- acSSPrompt = ed.GetSelection(acSelFtr);
- // Если статус == OK, объекты выбраны.
- if (acSSPrompt.Status == PromptStatus.OK) {
- SelectionSet acSSet = acSSPrompt.Value;
- foreach(SelectedObject so in acSSet) {
- var pline = tr.GetObject(so.ObjectId, OpenMode.ForRead) as Entity;
- // Конвертируем примитив в Region.
- using(DBObjectCollection segments = new DBObjectCollection()) {
- pline.Explode(segments);
- DBObjectCollection regions = Region.CreateFromCurves(segments);
- foreach(Region r in regions) {
- // Получаем центроид в плоскости XY МСК:
- Point3d origin = Point3d.Origin;
- Vector3d xAxis = Vector3d.XAxis;
- Vector3d yAxis = Vector3d.YAxis;
- centroid = r.AreaProperties(ref origin, ref xAxis, ref yAxis).Centroid;
- CenterMarkEntity(centroid);
- }
- }
- ed.WriteMessage($ "\nГеометрический центр {pline.GetRXClass().DxfName}:{centroid}");
- }
- tr.Commit();
- } else {
- Autodesk.AutoCAD.ApplicationServices.Core.Application.ShowAlertDialog("Ничего не выбрано");
- }
- } catch (Autodesk.AutoCAD.Runtime.Exception ex) {
- ed.WriteMessage(ex.ToString());
- }
- }
- }
- public static void CenterMarkEntity(Point2d p) {
- var doc = AcCoreApp.DocumentManager.MdiActiveDocument;
- var db = doc.Database;
- var ed = doc.Editor;
- using(Transaction t = db.TransactionManager.StartTransaction()) {
- short mode = (short) AcCoreApp.GetSystemVariable("PDMODE");
- if (mode == 0) {
- AcCoreApp.SetSystemVariable("PDMODE", 99);
- }
- var ms = t.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite) as BlockTableRecord;
- DBPoint dbPt = new DBPoint(new Point3d(p.X, p.Y, .0)) {
- ColorIndex = 3
- };
- ms.AppendEntity(dbPt);
- t.AddNewlyCreatedDBObject(dbPt, true);
- t.Commit();
- }
- }
Тестовый чертеж: SampleDrawing
Автор перевода: Александр Ривилис
Опубликовано 31.05.2020
Опубликовано 31.05.2020