Изменение свойств экземпляра семейства, созданного через Python
Главная › Форумы › Задать вопрос › Изменение свойств экземпляра семейства, созданного через Python
Помечено: изменение семейств через Python, создание
- В этой теме 9 ответов, 2 участника, последнее обновление 5 лет, 11 месяцев назад сделано Анатолий.
-
АвторСообщения
-
АлександрУчастник
Здравствуйте! Пытаюсь сделать первые шаги (как в динамо, так и в пайтоне..). Методом тыка/копипаста создал код (вроде рабочий), получающий на входе Family Types, точку вставки и несколько числовых значений и создающий экземпляр семейства. Подскажите, пожалуйста, как для свежерожденного newobj получить/изменить свойства экземпляра? Ну то бишь, через пайтон сделать примерно то, что делает в динамо “Element.SetParameterByName”?
import clr
clr.AddReference(‘RevitAPI’)
from Autodesk.Revit.DB import *
clr.AddReference(“RevitNodes”)
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from Autodesk.Revit.DB.Structure import *
clr.AddReference(‘RevitAPIUI’)
from Autodesk.Revit.UI import *
clr.AddReference(‘RevitNodes’)
# импорт и работа с геометрией Dynamo
clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *
doc = DocumentManager.Instance.CurrentDBDocument
point = UnwrapElement(IN[0])
famtype = UnwrapElement(IN[1])
elementlist = list()
ST = StructuralType.NonStructural
TransactionManager.Instance.EnsureInTransaction(doc)
newobj = doc.Create.NewFamilyInstance(point.ToXyz(),famtype,ST)
newobj.ToDSType(True)
elementlist.append(newobj)
TransactionManager.Instance.TransactionTaskDone()
OUT = elementlist[0]АлександрУчастникПару строк добавил, получилось один из параметров созданного экземпляра семейства изменить. Но почему-то оный параметр, который должен был задаваться входным параметром в строке p.Set(IN[2]), принимает какие-то непредсказуемые значения. Попробовал задавать значение числом (p.Set(400.0) ) , – почему-то в модели получаю значение параметра Диаметр сваи = 121920..
import clr
clr.AddReference(‘RevitAPI’)
from Autodesk.Revit.DB import *
clr.AddReference(“RevitNodes”)
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from Autodesk.Revit.DB.Structure import *
clr.AddReference(‘RevitAPIUI’)
from Autodesk.Revit.UI import *
clr.AddReference(‘RevitNodes’)
# импорт и работа с геометрией Dynamo
clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *
doc = DocumentManager.Instance.CurrentDBDocument
point = UnwrapElement(IN[0])
famtype = UnwrapElement(IN[1])
elementlist = list()
ST = StructuralType.NonStructural
TransactionManager.Instance.EnsureInTransaction(doc)
newobj = doc.Create.NewFamilyInstance(point.ToXyz(),famtype,ST)
p=newobj.LookupParameter(“Диаметр сваи”)
p.Set(IN[2])
newobj.ToDSType(True)
elementlist.append(newobj)
TransactionManager.Instance.TransactionTaskDone()
OUT = elementlist[0]Добрый день! ИваСерж в посте #7850 объясняет поведение питона. Вам необходимо разделить в коде необходимую длину на 304,8.
АлександрУчастникПонял, спасибо! Была мысль о единицах измерения, но с дюймами как-то не срослось с коэффициентом. В сторону футов посмотреть не догадался!
АлександрУчастникобрый день! А не поможете ли реконструировать код из #8609, что бы разместить экземпляр семейства на грани другого экземпляра семейства? Вроде как подходят методы
NewFamilyInstance Method (Face, XYZ, XYZ, FamilySymbol)public FamilyInstance NewFamilyInstance( Face face, XYZ location, XYZ referenceDirection, FamilySymbol symbol )
NewFamilyInstance Method (Face, Line, FamilySymbol)
public FamilyInstance NewFamilyInstance( Face face, Line position, FamilySymbol symbol )
…Но как выдернуть и отсортировать нужную Face из выбранного пользователем экземпляра? Можно ли это сделать с помощью нода Element.ElementFaceReferences? Как добыть “
XYZ
referenceDirection" -"
Вектор, определяющий направление экземпляра семейства”? илиLine
/position?
Добрый день! Почему-то мне кажется ваша задача не такой и простой и напоминает как возился в свое время с раскладкой стропил по гранях крыши и которую, увы, не осилил, уже позже Legantmar помог кому-то с этой задачей немного другими методами и это было ответом и мне.
Для полной картины желательно чтобы вы подробнее описали и показали рисунками что хотите сделать и для чего это нужно, возможно придут какие мысли, пока если честно, не особо понятно какой например, face, искать и по какому принципу.АлександрУчастникПриветствую, Анатолий! Задача, по идее, не так сложна, но выполнение ее осложняется тем, что с динамо/пайтоном я пока знаком мало. Есть два загружаемых семейства, буронабивная свая и каркас. Я методом тыка/копипаста сделал код, который из выбранного пользователем экземпляра сваи снимает значения параметров (диаметр/длина/точка вставки), и вставляет соответственно каркас, изменяя значения параметров экземпляра. Хотелось бы модернизировать, что бы вставлялся каркас по грани сваи – и вроде как, методы из сообщения выше позволяют сие.
..в принципе, до “Face” я вроде как добрался, теперь бы отсортировать из них нужную грань.. Ну и с XYZ referenceDirection / Line разобраться..
Если можно, расскажите еще по какому принципу каркас вставляется по грани сваи.
Из мыслей:
1) Возможно я бы попробовал все сделать одним семейством и также туда загрузить все принципы формирования каркаса, если нюансов не сильно много.
2) Если работать по желаемому вами методу, можно было бы попробовать брать точку расположения семейства сваи (думаю, это будет ее центр) и в эту точку вставлять семейство каркаса в необходимом количестве со смещением (можно посчитать) на нужное расстояние каждого (на данный момент имею в виду вертикальную арматуру). Думаю, с горизонтальной круговой также не было бы больших проблем.АлександрУчастникТак каркас и сделан – одним семейством. Вставить его в сваю – в принципе можно, но – и так слишком много параметров внутри, да и потом – армировать все сваи в проекте не нужно, достаточно по одной каждой марки/типоразмера.
А по точке расположения сваи – все прекрасно вставляется через
newobj = doc.Create.NewFamilyInstance(point.ToXyz(),famtype,ST)
Просто хотелось попробовать вставить именно по грани сваи (вручную такая возможность же есть..), в этом случае каркас “привязывается” к свае.
К сожалению, для меня пока выбор необходимого метода- это танцы с бубнами.. Попробовал набросать скрипт, где вместо первого XYZ в методе стоит face и так далее, выпадает ошибка – “ожидаемый XYZ, получено face”. Думаю, что необходимо правильно подставить все XYZ,face,reference,fam и API поймет что имеется в виду. Дело для изучения, так сказать.
Как некоторый вариант, я бы попробовал вставить новое семейство в существующее в точности с центральной точкой необходимой грани (так думаю – нижняя?) и на той же высоте, возможно прицепится. -
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.