08/04/2016
Как получить границы области (Region)
Вопрос: Как средствами AutoCAD .NET API можно получить границы (контура) области (Region)?
Ответ: Для этой цели следует воспользоваться возможностями Brep .NET API. Пример получения граничных контуров ниже. Внешние контура красного цвета, внутренние - желтого.
Код - C#: [Выделить]
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.BoundaryRepresentation;
- using AcBr = Autodesk.AutoCAD.BoundaryRepresentation;
- #pragma warning disable 0618
- [assembly: CommandClass(typeof(Rivilis.RegionExtBoundary))]
- namespace Rivilis
- {
- public class RegionExtBoundary
- {
- [CommandMethod("REB", CommandFlags.Modal)]
- public void MyCommand()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- Editor ed = doc.Editor;
- ObjectId curSpaceId = doc.Database.CurrentSpaceId;
- PromptEntityOptions prEnt = new PromptEntityOptions("\nВыберите область: ");
- prEnt.SetRejectMessage("Это не область");
- prEnt.AddAllowedClass(typeof(Region), false);
- PromptEntityResult rsEnt = ed.GetEntity(prEnt);
- if (rsEnt.Status != PromptStatus.OK) return;
- using (Region reg = rsEnt.ObjectId.Open(OpenMode.ForRead) as Region)
- {
- using (BlockTableRecord btr = curSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord)
- {
- AcBr.Brep brep = new AcBr.Brep(reg);
- int iFaces = 0;
- foreach (AcBr.Face face in brep.Faces)
- {
- ed.WriteMessage("\nГрань №{0}.", iFaces++);
- int iLoop = 0;
- foreach (AcBr.BoundaryLoop loop in face.Loops)
- {
- ed.WriteMessage("\nКонтур №{0}. Тип контура = {1}", iLoop++,
- (loop.LoopType == LoopType.LoopExterior) ? "Внешний" : "Внутренний");
- int iVertex = 0;
- using (Point3dCollection pts = new Point3dCollection())
- {
- foreach (AcBr.Vertex vert in loop.Vertices)
- {
- ed.WriteMessage("\n\tВершина №{0} с координатами = {1}", iVertex++, vert.Point);
- pts.Add(vert.Point);
- }
- using (Polyline3d p3d = new Polyline3d(Poly3dType.SimplePoly, pts, true))
- {
- p3d.SetDatabaseDefaults();
- switch (loop.LoopType)
- {
- case LoopType.LoopExterior:
- p3d.ColorIndex = 1;
- break;
- case LoopType.LoopInterior:
- p3d.ColorIndex = 2;
- break;
- default:
- p3d.ColorIndex = 3;
- break;
- }
- btr.AppendEntity(p3d);
- }
- }
- }
- iLoop++;
- }
- }
- }
- }
- }
- }
Автор: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7020
Опубликовано 08.04.2016