Получить проемы из внешней границы стены

Автор Тема: Получить проемы из внешней границы стены  (Прочитано 2968 раз)

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

Оффлайн user32Автор темы

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Здравствуйте, возник очередной затык.
Проблема следующая, есть стена, у которой профиль был отредактирован, например вот так


так же например вставлены двери. Мне необходимо получить отверстия из профиля. Т.е. из того что было откорректировано, мне нужно условно достроить стену до первоначального состояние и получить профиль того что было отредактировано.
Ниже скрин, что я имею ввиду, необходимо получить то, что выделено красным.
Думал сделать вычитание между двумя солидами методом ExecuteBooleanOperation. Но не получается найти исходный объект стены до команды редактирования профиля, возможно ли его как то получить?
Или необходимо построить на этом месте какой то новый объект, а после этого уже делать вычитание?
Или может я вообще не в ту сторону смотрю и это как то по другому можно сделать?
Заранее спасибо.



Отмечено как Решение user32 22-03-2021, 10:39:38

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
С созданием новых объектов, наверное, вариант, но слишком много попутных нюансов возникает, когда вдруг стена StackedWall, например, плюс, вроде как обещали завести трапецевидные в поперечном сечении стенки.

Можно попробовать пойти твоим путём, почему бы и нет. Отредактированный профиль получаем методом ExporterIFCUtils.GetElevationProfile (проверив, что он вообще существует методом HasElevationProfile), там просто опознать отверстия не на краю, такие как окна. Думаю, ты уже с этим определился, просто отмечу для истории.

Теперь непосредственно к твоему вопросу. Можно попробовать сделать вот что:
1) Получаем геометрию стены, в Options устанавливаем IncludeNonVisibleObjects - показать невидимые объекты
2) Фильтруем в полученной геометрии стены Solid-ы c нулевым объемом, каждый такой Solid будет содержать одну поверхность
3) Фильтруем поверхности. Нам нужны такие, которые лежат в плоскости стены.

Итого тут ты получишь список из нескольких параллельных поверхностей, берешь любую, желательно ближайшую к плоскости профиля GetElevationProfile, дальше с ней работаешь.

Proof of concept, немножко говнокода для Iron Python Shell:
Код - Python [Выбрать]
  1. opt = Options()
  2. opt.IncludeNonVisibleObjects = True
  3.  
  4. faces = s0.get_Geometry(opt).Cast[Solid]().Where(lambda x: x.Volume < 0.001).Select(lambda x: x.Faces.get_Item(0)).Where(lambda x: x.ComputeNormal(UV.Zero).CrossProduct(s0.Orientation).IsAlmostEqualTo(XYZ.Zero)).ToList()
  5.  
  6. print faces.Count
  7.  
  8. def DrawFace(face):
  9.         cl = face.GetEdgesAsCurveLoops().Single()
  10.        
  11.         if not(cl.HasPlane()):
  12.                 return
  13.         p = cl.GetPlane()
  14.         print p.Normal
  15.        
  16.         sp = SketchPlane.Create(doc, p)
  17.        
  18.         for c in cl:
  19.                 doc.Create.NewModelCurve(c, sp)
  20.  
  21.  
  22.  
  23. tx = Transaction(doc, "test")
  24. tx.Start()
  25.  
  26. for f in faces:
  27.         DrawFace(f)
  28.  
  29. tx.Commit()