Legantmar
@legantmar
активность: 8 месяцев, 3 недели назадОтветы в темах
-
АвторСообщения
-
добавлю своих пару копеек (сделал ранее, но не успел доделать)
Видео
Скачать скриптэто конечно уже треш, но в одну строку ))
from operator import itemgetter OUT = zip(*sorted(zip([("").join([i for i in p if i.isalpha()]) for p in [i.split(".")[0] for i in IN[0]]], [int(("").join([i for i in p if i.isdigit()])) for p in [i.split(".")[0] for i in IN[0]]], [int(i.split(".")[1]) for i in IN[0]], IN[0]), key=itemgetter(0,1,2)))[3]
p.s. не зависит от количества букв в префиксе и сортирует по алфавиту
update: для тех, кто хочет разобраться в коде выше, переписал в нормальном виде с комментариями
Совет:
из-за использования записи вида:
from Autodesk.Revit.DB import *
и
from DSCore import *
может возникать конфликт для элементов с одинаковыми именами, например Color (ошибка AttributeError: ‘type’ object has no attribute ‘ByARGB’)
т.к. есть Autodesk.Revit.DB.Color – это цвет Revit
и есть DSCore.Color – это цвет Dynamo и они не равнозначны.В этом случае можно использовать следующие приемы:
1) либо в теле кода указывать элементы с полными путями, типа colorRevit = Autodesk.Revit.DB.Color(0xFF, 0x00, 0x00 )
2) либо предварительно импортировать элемент как import Autodesk.Revit.DB.Color as rColor
и тогда таже строчка colorRevit = rColor(0xFF, 0x00, 0x00 ) – цвет ревитаp.s. такие же ошибки могут быть и при
from Autodesk.Revit.DB import * # импорт из Revit API
и
from Revit.Elements import * # импорт из RevitNodes
и др.
С одной стороны вы упрощаете дальнейшее использование элементов (не таская длинные полные пути), но с другой нужно помнить о том, что имя вашего элемента может быть одновременно в нескольких библиотеках.
Special thanks for Dimitar Venkov.
Скачать скрипт
p.s. стены должны быть параллельны друг другу и лежать в плоскости X или Y, кому нужны размеры для стен расположенных под углом к оси X (или Y), скажите.Для новичков несколько пояснений по библиотекам в шаблоне.
# Подключение библиотеки Revit API для работы с элементами Revit'a clr.AddReference('RevitAPI') # RevitAPI.dll лежит как правило здесь C:\Program Files\Autodesk\Revit 2017 import Autodesk from Autodesk.Revit.DB import * # импорт всех элементов, если к примеру нужны только стены, то * заменяется на Wall
import sys pyt_path = r'C:\Program Files (x86)\IronPython 2.7\Lib' # добавление пути к директории IronPython для использования его библиотек sys.path.append(pyt_path)
# Использование библиотеки ProtoGeometry для геометрических фигур (точки, линии, окружности, дуги, кривые и пр.) clr.AddReference('ProtoGeometry') # ProtoGeometry.dll лежит здесь C:\Program Files\Dynamo\Dynamo Core\1.3 from Autodesk.DesignScript.Geometry import *
# Использование библиотеки DSCoreNodes (основные ноды расположенные на вкладке библиотеки слева в разделе Core) clr.AddReference("DSCoreNodes") # DSCoreNodes.dll лежит здесь C:\Program Files\Dynamo\Dynamo Core\1.3 import DSCore clr.ImportExtensions(DSCore) from DSCore import *
# Упрощенные ноды для работы с объектами Revit clr.AddReference("RevitNodes") # RevitNodes.dll лежит здесь C:\Program Files\Dynamo\Dynamo Revit\1.3\Revit_2017 import Revit clr.ImportExtensions(Revit.Elements) from Revit.Elements import * clr.ImportExtensions(Revit.GeometryConversion) # позволяет конвертировать величины clr.ImportExtensions(Revit.GeometryReferences)
# Для использования транзакций и работе с документом (doc) clr.AddReference("RevitServices") # RevitServices.dll лежит здесь C:\Program Files\Dynamo\Dynamo Revit\1.3\Revit_2017 import RevitServices from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager doc = DocumentManager.Instance.CurrentDBDocument uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument uiapp=DocumentManager.Instance.CurrentUIApplication app = uiapp.Application
# Для работы с Excel из питона (если вы не используете сторонние пакеты) clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c') from Microsoft.Office.Interop import Excel System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo("en-US") from System.Runtime.InteropServices import Marshal
# в некоторых случаях, при "глубоком погружении" в Revit API, нужны системные массивы System Array import System from System import Array from System.Collections.Generic import *
# Прочие библиотеки import math # работа с математическими функциями (cos, sin, pi и пр.) import random # генерация случайных чисел import re # работа с регулярными выражениями
но лучше их записывать как:
from math import *
в этом случае не нужно будет таскать приставку math.pi, а можно сразу использовать piДля того чтобы не писать постоянно UnwrapElement() рекомендую использовать в шаблоне функцию:
Если вы не знаете сколько будете подавать на вход элементов 1 или несколько, то рекомендую использовать вот эту запись:
p.s. Вам не обязательно записывать все библиотеки в вашем скрипте, используйте только те, что вы используете для вашего скрипта.
Ниже состав некоторых часто используемых библиотек:
ProtogeometryDSCoreNodes
RevitNodesRevit Nodes продолжение
прошло много времени с создания первой “версии” шаблончика и пора представить шаблончик v.0.2
внутри можно найти несколько полезных, часто используемых команд и почти исчерпывающий список подключаемых библиотек
можно использовать как есть, но для конкретных задач лучше удалять неиспользуемые библиотеки
Пару слов для понимания (пригодится другим)
ВАРИАНТ 1
OUT = UnwrapElement(IN[0]).Location.Curve.ToProtoType().StartPoint # Получение точки через преобразование к линии динамо
В этой строчке разворачивается входной элемент UnwrapElement(IN[0]) (для доступа к основным свойствам).
Через команду Location получаем расположение элемента (для протяженных элементов, таких как стены, трубы и пр. это будет линия (curve), для элементов типа колонна это будет точка)
ToProtoType() – преобразуем в элемент динамо (в данном случае преобразовали линию ревита в линию динамо)
и дальше по аналогии с одноименным нодом находим стартовую точку StartPoint.
Можем получить, например, координату X, с помощью записи OUT = UnwrapElement(IN[0]).Location.Curve.ToProtoType().StartPoint.X – значение в мм.!!ВАРИАНТ 2
OUT = UnwrapElement(IN[0]).Location.Curve.GetEndPoint(0) # Получение XYZ не путать с точкой при этом не нужны никакие библиотеки (revitapi подхватывается “на подсознательном уровне динамо”)
Если нужно получить координату X, то запись будет вида OUT = UnwrapElement(IN[0]).Location.Curve.GetEndPoint(0).X
Обращаю внимание, что размер будет в футах!! и для перевода в мм нужно умножить на 304,8
Т.е. окончательная запись будет: OUT = UnwrapElement(IN[0]).Location.Curve.GetEndPoint(0).X *304.8Приведенные выше варианты равнозначны (на форуме можно найти применение обоих).
p.s. до недавнего времени я пользовался первым вариантом, т.к. все команды перекликаются с одноименными нодами динамо, что интуитивно понятнее, но если “уходить от динамо”, то использовать нужно второй вариант.
еще раз в дополнении к http://dynamobim.ru/forums/topic/tips-and-trics-советы-и-приемы/page/4/#post-5082
if else в генераторе
пример:lst = [1,2,3,4,5,6] collection = ["ok" if d == 3 else 0 for d in lst]
>> [0, 0, ‘ok’, 0, 0, 0]
Артем добавил в раздел скачать
http://dynamobim.ru/cmdownloads/авторазмер-между-стенами-и-осями-2018/Для тех кому интересно, рассказываю (правильную табуляцию смотрите в коде по ссылке выше).
1) если вы импортируете библиотеку ProtoGeometry как:
clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *
то далее у вас будут конфликты с Reference (типа invalid number of references )
решение:
clr.AddReference(‘ProtoGeometry’)
import Autodesk.DesignScript.Geometry as ge # (чтобы различать библиотеки)
и далее в скрипте использовать, например, line= ge.Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()2) Немного по другому стали доставаться эти самые референсы
для осей (grids):
for grid in grids:
for obj in grid.get_Geometry(opt):
if isinstance(obj, Line):
gline = obj
Ref.Append(gline.Reference)для стен (wall) внешние плоскости:
for element in walls:
a = HostObjectUtils.GetSideFaces(element, ShellLayerType.Exterior)
for i in a:
Ref.Append(i)
b = HostObjectUtils.GetSideFaces(element, ShellLayerType.Interior)
for i in b:
Ref.Append(i)
спасибо за помощь kulkul
txt, почти правильно
т.к. существуют:
FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements()
FilteredElementCollector(doc).OfClass(Wall).ToElements()
такие записи идентичны, например, на выходе ты получишь элементы стен расположенных в проектеНо верхнюю строчку можно переписать и так:
FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsElementType().ToElements()
тогда получишь только типы элементов в файле без элементов размещенных в проекте.Подробнее здесь
Путем нехитрых манипуляций можно получать BuiltIn по имени категорииЕсли речь идет про имена материалов разных слоев, то вот так:
import clr clr.AddReference('RevitAPI') from Autodesk.Revit.DB import * clr.AddReference("RevitServices") import RevitServices from RevitServices.Persistence import DocumentManager doc = DocumentManager.Instance.CurrentDBDocument str = UnwrapElement(IN[0]).WallType.GetCompoundStructure() num = str.LayerCount layersName = [] for i in range(num): layersName.append(doc.GetElement(str.GetMaterialId(i)).Name) OUT = layersName
Код можно немного сократить (но не забыть про подключаемые библиотеки)
str = UnwrapElement(IN[0]).WallType.GetCompoundStructure()
OUT = [doc.GetElement(str.GetMaterialId(i)).Name for i in range(str.LayerCount)] -
АвторСообщения