Solid помещения

Автор Тема: Solid помещения  (Прочитано 4416 раз)

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

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Solid помещения
« : 07-11-2018, 22:42:22 »
Получаю солид помещения
Код - C# [Выбрать]
  1. SpatialElementGeometryCalculator calculator = new SpatialElementGeometryCalculator(doc);
  2. SpatialElementGeometryResults results = calculator.CalculateSpatialElementGeometry(room);
  3. Solid roomSolid = results.GetGeometry();

Солид выдает ошибку :
Curve join produced more than one WIRE in PolyCurve

В чем может быть причина (вероятно, идет наложение/пересечение линий)?  Так как и метод room.GetBoundarySegments(options) c последующим получением линий и формированием из них CurveLoop дает ошибку =>The profile CurveLoops are not valid. Some possible reasons: the loop is not continuous; the loop contains a null curve; the loops is marked as closed but is in fact open, or vice versa. ;
----------------------------------------
Конечной целью является получение периметральных линий помещения на плане, именно для всех помещений проекта
Если рассматривать только активный вид то логика примерно такая:

Код - C# [Выбрать]
  1. Options options = app.Create.NewGeometryOptions();
  2. options.IncludeNonVisibleObjects = true;
  3. options.View = doc.ActiveView;
  4. var geom_elem = room.get_Geometry(options);
далее через  сравниваем doc.GetElement(e.GraphicsStyleId).Category с  OST_IOSRoomPerimeterLines
-------------------------------------------------



« Последнее редактирование: 07-11-2018, 23:46:33 от enot »

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Solid помещения
« Ответ #1 : 07-11-2018, 23:42:19 »
На модель бы посмотреть, конечно.

Предполагаемые причины описаны в SDK по методу SpatialElementGeometryCalculator.CanCalculateGeometry:
Цитировать
Return Value
It will return false if the room/space is not enclosed in 2d or has no location, or the height is too small.

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Solid помещения
« Ответ #2 : 08-11-2018, 00:07:18 »
Файл с проблемным помещением:

https://cloud.mail.ru/public/4sZfffhD

Линии curves дают ошибку в месте
CurveLoop loop_curve = CurveLoop.Create(curves);
Далее планирую выдавливание геометрии из CurveLoop
« Последнее редактирование: 17-11-2018, 13:38:21 от enot »

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Solid помещения
« Ответ #3 : 08-11-2018, 01:36:38 »
Так, ну смотрите, вот код (на Revit Python Shell), думаю, не проблема будет перевести при необходимости, который Вам нужен
Код - Python [Выбрать]
  1. room = selection[0] #нужно выбрать помещение
  2.  
  3. calculator = SpatialElementGeometryCalculator(doc)
  4. results = calculator.CalculateSpatialElementGeometry(room)
  5.  
  6. solid = results.GetGeometry()
  7.  
  8. plane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, room.get_BoundingBox(None).Min-XYZ.BasisZ)
  9.  
  10. extrAnalyzer = ExtrusionAnalyzer.Create(solid, plane, -1*XYZ.BasisZ)
  11.  
  12. face = extrAnalyzer.GetExtrusionBase()
  13.  
  14. print face.GetEdgesAsCurveLoops()# тут работаем как раз с CurveLoop-ом

НО. Оно не заработает, пока слегка не поправить модель. Я пробовал по-разному получать Solid, через get_Geometry, из свойства ClosedShell, даже пытался создавать FreeForm в семействе на основе этой геометрии и заново получать геометрию, нет, ExtrusionAnalyzer.Create вываливается с ошибкой. Пёс с ним, выбираем непосредственно из геометрии (не важно, get_Geometry или ClosedShell) solid, из него берем поверхность с нормалью -1*XYZ.BasisZ, окей, дальше берем границы - CurveLoop и тут внезапно оказывается, что он незамкнут, IsOpen() выдает true.

Как поправить файл:



Как понять, что нужно править именно в этом месте - не знаю, смотреть стены, ограничивающие помещения, но тут есть более очевидные кандидаты, на одной из стен висит предупреждение, у другой стоит запрет на соединение

Но №2: а какая задача? зачем
Далее планирую выдавливание геометрии из CurveLoop

У Вас вроде и так уже есть готовый Solid

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Solid помещения
« Ответ #4 : 08-11-2018, 07:25:34 »
Александр, по первому вопросу:
Если получаем линии через GetBoundarySegments линии по периметру помещения => переводим их в линии модели, чтобы посмотреть
Далее , есть линия, которая находится как раз в месте  начало и конец которой находится на первом и втором ,приложенных вами, скринах (начало и конец получается в точках с синими кружочками). Получается линия малой длины.
Иногда при черчении линии (например делаем профиль выдавливания в семействе) ревит выдает ошибку : "Элемент на экране выглядит маленьким" => возможно, в этом кроется причина? (интересно, какой предел длины, при которой такая ошибка возникает)
Тогда мы попадаем под ,описанное в первом посте, исключение
the loop contains a null curve; ( в этом случае вопрос будет в введении проверки на исключение таких null curve (в моем понимании линия малой длины ?) из curveloop (но при исключении таких линий curveloop может оказаться незамкнутым)

По второму вопросу : Полученный периметральный curveloop я масштабирую и затем выдавливаю, получаю новый солид
« Последнее редактирование: 08-11-2018, 08:09:10 от enot »

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Solid помещения
« Ответ #5 : 08-11-2018, 11:15:33 »
IsOpen() выдает true
curveloop ( от Face-ов солида помещения) у которых IsOpen = False


curveloop у которых IsOpen = True


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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Solid помещения
« Ответ #6 : 08-11-2018, 11:22:03 »
Насчет линий малой длины - нельзя создать ModelCurve/DetailCurve для линий короче Application.ShortCurveTolerance.

Вообще, конечно, плохо то, что Revit не выдает по этому помещению никаких предупреждений, получает Solid, даже по нему можно создать в семействе FreeForm

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Solid помещения
« Ответ #7 : 08-11-2018, 11:28:40 »
значит дело не в линиях малой длины, так как
Curve.Length> Application.ShortCurveTolerance  пропустил все линии, входящих в CurveLoop у которого  IsOpen = True

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Solid помещения
« Ответ #8 : 08-11-2018, 11:45:21 »
А причину со следствием не перепутали?) solid помещения уже необычен тем, что у некоторых его поверхностей ребра не образуют замкнутых контуров, т.е. какая-то проблем идет из глубин модели, как её строили. Кстати, она изначально из Revit, или результат экспорта из другого формата?

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Solid помещения
« Ответ #9 : 08-11-2018, 11:53:50 »
изначально из Revit
Модель из Ревит

у некоторых его поверхностей ребра не образуют замкнутых контуров
Тут не понял. Как можно построить поверхность Face из незамкнутых линий

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Solid помещения
« Ответ #10 : 08-11-2018, 11:57:47 »
Попробуйте метод GetRoomBoundaryAsCurveLoopArray

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Solid помещения
« Ответ #11 : 08-11-2018, 12:24:56 »
Попробуйте метод GetRoomBoundaryAsCurveLoopArray
using Autodesk.Revit.DB.IFC.ExporterIFCUtils;

ExporterIFCUtils просит библиотеку (RevitApI и RevitUI уже подгружены)

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Solid помещения
« Ответ #12 : 08-11-2018, 12:27:01 »
Попробуйте метод GetRoomBoundaryAsCurveLoopArray
using Autodesk.Revit.DB.IFC.ExporterIFCUtils;

ExporterIFCUtils просит библиотеку (RevitApI и RevitUI уже подгружены)
Подключите "C:\Program Files\Autodesk\Revit 2018\RevitAPIIFC.dll"

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Solid помещения
« Ответ #13 : 08-11-2018, 12:32:10 »
Подключите "C:\Program Files\Autodesk\Revit 2018\RevitAPIIFC.dll"
Получилось. Спасибо
Метод хорош, но грабли с CurveLoop те же

Пробуя получить Offset для CurveLoop
Код - C# [Выбрать]
  1. CurveLoop offset_curve = CurveLoop.CreateViaOffset(sourceLoop, offset,  sourceLoop.GetPlane().Normal)
используя (скорее следовало бы там продолжить этот вопрос...)
http://adn-cis.org/forum/index.php?topic=8848.0

Получаем (некоторые линии смещаются не наружу  , а внутрь ) ошибку Curve loop couldn't be properly trimmed.



В чем может быть причина...


« Последнее редактирование: 08-11-2018, 13:55:52 от enot »