Изменение свойств экземпляра семейства, созданного через Python

Главная Форумы Задать вопрос Изменение свойств экземпляра семейства, созданного через Python

В этой теме 9 ответов, 2 участника, последнее обновление  Анатолий 3 мес., 3 нед. назад.

Просмотр 10 сообщений - с 1 по 10 (из 10 всего)
  • Автор
    Сообщения
  • #8608 Score: 0

    Александр
    Участник

    Здравствуйте! Пытаюсь сделать первые шаги (как в динамо, так и в пайтоне..). Методом тыка/копипаста создал код (вроде рабочий), получающий на входе 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]

     

     

     

    #8609 Score: 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]

    #8613 Score: 0

    Анатолий
    Участник
    31 pts

    Добрый день! ИваСерж в посте #7850 объясняет поведение питона. Вам необходимо разделить в коде необходимую длину на 304,8.

    #8618 Score: 0

    Александр
    Участник

    Понял, спасибо! Была мысль о единицах измерения, но с дюймами как-то не срослось с коэффициентом. В сторону футов посмотреть не  догадался!

    #8686 Score: 0

    Александр
    Участник

    обрый день! А не поможете ли реконструировать код из #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? Как добыть “XYZreferenceDirection" -"Вектор, определяющий направление экземпляра семейства”? или Lineposition?

    #8687 Score: 0

    Анатолий
    Участник
    31 pts

    Добрый день! Почему-то мне кажется ваша задача не такой и простой и напоминает как возился в свое время с раскладкой стропил по гранях крыши и которую, увы, не осилил, уже позже Legantmar помог кому-то с этой задачей немного другими методами и это было ответом и мне.
    Для полной картины желательно чтобы вы подробнее описали и показали рисунками что хотите сделать и для чего это нужно, возможно придут какие мысли, пока если честно, не особо понятно какой например, face, искать и по какому принципу.

    #8688 Score: 0

    Александр
    Участник

    Приветствую, Анатолий! Задача, по идее, не так сложна, но выполнение ее осложняется тем, что с динамо/пайтоном я пока знаком мало. Есть два загружаемых семейства, буронабивная свая и каркас.  Я методом тыка/копипаста сделал код, который из выбранного пользователем экземпляра сваи снимает значения параметров (диаметр/длина/точка вставки), и вставляет соответственно каркас, изменяя значения параметров экземпляра. Хотелось бы модернизировать, что бы вставлялся каркас по грани сваи – и вроде как, методы из сообщения выше позволяют сие.

    ..в принципе, до “Face” я вроде как добрался, теперь бы отсортировать из них нужную грань.. Ну и с XYZ referenceDirection / Line разобраться..

    #8689 Score: 0

    Анатолий
    Участник
    31 pts

    Если можно, расскажите еще по какому принципу каркас вставляется по грани сваи.
    Из мыслей:
    1) Возможно я бы попробовал все сделать одним семейством и также туда загрузить все принципы формирования каркаса, если нюансов не сильно много.
    2) Если работать по желаемому вами методу, можно было бы попробовать брать точку расположения семейства сваи (думаю, это будет ее центр) и в эту точку вставлять семейство каркаса в необходимом количестве со смещением (можно посчитать) на нужное расстояние каждого (на данный момент имею в виду вертикальную арматуру). Думаю, с горизонтальной круговой также не было бы больших проблем.

    #8690 Score: 0

    Александр
    Участник

    Так каркас и сделан – одним семейством. Вставить его в сваю – в принципе можно, но – и так слишком много параметров внутри, да и потом – армировать все сваи в проекте не нужно, достаточно по одной каждой марки/типоразмера.

    А по точке расположения сваи – все прекрасно вставляется через

    newobj = doc.Create.NewFamilyInstance(point.ToXyz(),famtype,ST)

    Просто хотелось попробовать вставить именно по грани сваи (вручную такая возможность же есть..), в этом случае каркас “привязывается” к свае.

     

    #8693 Score: 0

    Анатолий
    Участник
    31 pts

    К сожалению, для меня пока выбор необходимого метода- это танцы с бубнами.. Попробовал набросать скрипт, где вместо первого XYZ в методе стоит face и так далее, выпадает ошибка – “ожидаемый XYZ, получено face”. Думаю, что необходимо правильно подставить все XYZ,face,reference,fam и API поймет что имеется в виду. Дело для изучения, так сказать.
    Как некоторый вариант, я бы попробовал вставить новое семейство в существующее в точности с центральной точкой необходимой грани (так думаю – нижняя?) и на той же высоте, возможно прицепится.

Просмотр 10 сообщений - с 1 по 10 (из 10 всего)

Для ответа в этой теме необходимо авторизоваться.