Получить внешний контур для набора точек

Автор Тема: Получить внешний контур для набора точек  (Прочитано 18502 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
_boundary ведь будет определять контур по всему что есть в чертеже? Там кроме квартир еще много всего.
Никто не мешает обвести (программно) нужную квартиру заведомо большей рамкой (прямоугольником) и точку для boundary указать как раз в этом зазоре, между элементами квартиры и заведомо большей границей. Понятно , что из набора объектов полученного таким образом нужно будет убрать прямоугольник заведомо больших границ.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Выложи чертеж с этим Region.
Для тестов оставил только разбитые блоки стен. И регион который получается объединением полилиний стен.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Boxa.Shu,
Вокруг квартиры тоже могут быть "помехи".
Наверно можно попробовать копировать квартиру в пустое место на чертеже и вычислять контур.
Мне не очень нравится такой способ.
Попробую.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Вокруг квартиры тоже могут быть "помехи".
Вот прям клещами вытягивается из Вас информация и условия задачи меняются на глазах...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Для тестов оставил только разбитые блоки стен. И регион который получается объединением полилиний стен.
Вроде бы похоже на то, что тебе нужно:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.BoundaryRepresentation;
  8. using AcBr = Autodesk.AutoCAD.BoundaryRepresentation;
  9.  
  10. #pragma warning disable 0618
  11. // This line is not mandatory, but improves loading performances
  12. [assembly: CommandClass(typeof(Rivilis.RegionExtBoundary))]
  13.  
  14. namespace Rivilis
  15. {
  16.  
  17.   public class RegionExtBoundary
  18.   {
  19.     [CommandMethod("REB", CommandFlags.Modal)]
  20.     public void MyCommand()
  21.     {
  22.       Document doc = Application.DocumentManager.MdiActiveDocument;
  23.       if (doc == null) return;
  24.       Editor ed = doc.Editor;
  25.       ObjectId curSpaceId = doc.Database.CurrentSpaceId;
  26.       PromptEntityOptions prEnt = new PromptEntityOptions("\nВыберите область: ");
  27.       prEnt.SetRejectMessage("Это не область");
  28.       prEnt.AddAllowedClass(typeof(Region), false);
  29.       PromptEntityResult rsEnt = ed.GetEntity(prEnt);
  30.       if (rsEnt.Status != PromptStatus.OK) return;
  31.       using (Region reg = rsEnt.ObjectId.Open(OpenMode.ForRead) as Region)
  32.       {
  33.         AcBr.Brep brep = new AcBr.Brep(reg);
  34.         int iFaces = 0;
  35.         foreach (AcBr.Face face in brep.Faces)
  36.         {
  37.           iFaces++;
  38.           int iLoop = 0;
  39.           foreach (AcBr.BoundaryLoop loop in face.Loops)
  40.           {
  41.             Point3dCollection pts = new Point3dCollection();
  42.             ed.WriteMessage("\nКонтур №{0} Тип контура = {1}", iLoop,
  43.               (loop.LoopType == LoopType.LoopExterior) ? "Внешний" : "Внутренний");
  44.             int iVertex = 0;
  45.             foreach (AcBr.Vertex vert in loop.Vertices)
  46.             {
  47.               ed.WriteMessage("\n\tВершина №{0} CoorLoopType = {1}", iVertex, vert.Point);
  48.               if (loop.LoopType == LoopType.LoopExterior) {
  49.                 pts.Add(vert.Point);
  50.               }
  51.               iVertex++;
  52.             }
  53.             using (BlockTableRecord btr = curSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord)
  54.             {
  55.               using (Polyline3d p3d = new Polyline3d(Poly3dType.SimplePoly, pts, true))
  56.               {
  57.                 btr.AppendEntity(p3d);
  58.               }
  59.             }
  60.             iLoop++;
  61.           }
  62.         }
  63.       }
  64.     }
  65.   }
  66. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот так это выглядит:

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Александр Ривилис, Круто, спасибо. Подходит отлично.