Расчетная точка внутри помещения/пространстве

Автор Тема: Расчетная точка внутри помещения/пространстве  (Прочитано 4702 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
В семейства некоторых категорий можно добавить расчетную точку.

Есть ли способ определить в каком помещении/пространстве находится расчетная точка элемента (и соответственно сам элемент), не создавая при этом спецификацию (спецификация элементов определенной категории -> в нее также добавленный параметр пространства : номер пространства) ?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
День добрый!

Может, не совсем понимаю вопрос, но есть методы Room.IsPointInRoom и Space.IsPointInSpace. Оно?

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Добрый )
Не совсем, эти методы (если не ошибаюсь) определят только элемент, который ПОЛНОСТЬЮ находится в помещении. а если элемент частично находится в помещении , то метод этого не определит.
зато есть расчетная точка (Room Calculation Point ) - которая тянется от элемента в нужном направлении (в направлении помещения), тогда мы могли бы как то определить что именно эта его точка находится в помещении

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
В эти методы передается координата точки. Можете пример приложить, где будет эта "расчетная точка", попробуем поковырять.

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
ок. пример подготовлю...


Эта точка находится внутри семейства, так что если определяем какие то координаты , то они соотвественно будут координатами ВНУТРИ семейства, но не проекта... в этом я вижу сложность... то есть если бы например определить координаты этой точки в проекте --> то возможно есть метод который определит находится ли точка (зная координаты) в помещении/пространстве или нет.


(это в принципе не относится к вопросу , но пусть будет)
Недостаток в том, что расчетную точку нельзя добавить во все категории элементов о чем обсуждалось например тут:
https://knowledge.autodesk.com/ru/support/revit-products/troubleshooting/caas/sfdcarticles/sfdcarticles/RUS/Revit-Family-categories-don-t-have-a-Room-Calculation-Point-Parameter.html



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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Жду пример.

Пока проблемы не вижу, если точку можно определить из геометрии, пусть даже открыв семейство и получив её координату P в координатах семейства, то всегда можно у инстанса семейства получить t = GetTotalTransform() и перевести её в координаты проекта t.OfPoint(P)

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Файл:

https://yadi.sk/d/WM9F_sll3aKseA

нужно открыть файл ревит с названием "Сам файл"

в файле на разрезе можно увидеть, что расчетная точка находится в пространстве , но сам элемент вне пределов пространтства:






Отмечено как Решение enot 18-08-2018, 11:34:26

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Вот на Python Shell набросок, без проверок и прочего, например, геометрию желательно таки получать рекурсивно. Здесь чисто сам смысл, думаю, разберетесь:

Код - Python [Выбрать]
  1. elem = selection[0] #надо выделить семейство
  2.  
  3. opt = Options()
  4. opt.IncludeNonVisibleObjects = True
  5.  
  6. geomInstance = filter(lambda x: x.GetType().Name == "GeometryInstance", elem.get_Geometry(opt))[0]
  7.  
  8. instGeom = geomInstance.GetInstanceGeometry()
  9.  
  10. pointElem = filter(lambda x: x.GetType().Name == "Point" and doc.GetElement(x.GraphicsStyleId).GraphicsStyleCategory.Id == ElementId(BuiltInCategory.OST_IOSRoomCalculationPoint), instGeom)[0]
  11.  
  12. point = pointElem.Coord
  13.  
  14. col = FilteredElementCollector(doc)
  15.  
  16. spatialElems = col.OfClass(SpatialElement).ToElements()
  17.  
  18. spatialsWithPoint = filter(lambda x: (x.GetType().Name == "Room" and x.IsPointInRoom(point)) or (x.GetType().Name == "Space" and x.IsPointInSpace(point)), spatialElems)
  19.  
  20. lookup(spatialsWithPoint)

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Решение просто огонь  8)

Александр, не могли бы вы пояснить что означает :

Код - C# [Выбрать]
  1. doc.GetElement(x.GraphicsStyleId).GraphicsStyleCategory.Id

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Да, в общем, всё достаточно просто. В геометрии объекта могут быть разные Point-ы, это просто проверка, что это точка расчета площади, а не что-то ещё:





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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Понял.
1.) Кроме класса GeometryElement (Object) свойство GraphicsStyleId (--> а соотвественно можно от него получить  класс GraphicsStyle )  есть ли другие известные вам классы , которые тоже имеют этой свойство?
2.) я не понимаю что означает сам класс GraphicsStyle , для чего он нужен , если создается как новый класс...


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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
1. http://www.revitapidocs.com/2018.1/?query=GraphicsStyleId
2. именованная сущность графического стиля, например линии или поверхности, введение которой вполне обосновано и логично. А вот это я не понял
Цитировать
если создается как новый класс...

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
« Последнее редактирование: 23-08-2018, 15:30:53 от enot »