Нам пишут, есть ли в Robot 8 узловые конечные элементы для оболочек? Уважаемая редакция Robot & Хобот отвечает, что такие конечные элементы есть, но не для всех пользователей. Вы не найдете их через пользовательский интерфейс. Увидеть и использовать их можно только через API. Много лет назад разработчики убрали эти конечные элементы из диалоговых окон и оставили только по причине обратной совместимости. Сегодня мы научимся основам работы с API Robot на примере доставания из мрачных глубин 8 узловых конечных элементов и назначения их оболочкам.
Будем использовать встроенный в Microsoft Excel редактор VBA. Вызовем его из открытой книги Excel сочетанием клавиш Alt+F11, зайдем в Tools – References и добавим ссылку на библиотеку Robot Object Model:
Скопируйте текст программы в окно редактора, выберите в Robot оболочки и выполните команду Run.
Sub MeshParams()
Dim robApp As IRobotApplication
Set robApp = New RobotApplication
Dim PanelSel As RobotSelection
Set PanelSel = robApp.Project.Structure.Selections.Get(I_OT_PANEL)
Dim PanelCol As RobotObjObjectCollection
Set PanelCol = robApp.Project.Structure.Objects.GetMany(PanelSel)
Dim obj As IRobotObjObject
For I = 1 To PanelCol.Count
Set obj = PanelCol.Get(I)
obj.Mesh.Params.SurfaceParams.Method.Method = I_MMT_DELAUNAY
obj.Mesh.Params.SurfaceParams.FiniteElems.Type = I_MSFET_8NODE_QUADRIL
obj.Mesh.Params.SurfaceParams.Delaunay.RegularMesh = False
obj.Mesh.Params.SurfaceParams.Generation.Type = I_MGT_ELEMENT_SIZE
obj.Mesh.Params.SurfaceParams.Generation.ElementSize = 1
obj.Mesh.Generate
Next I
Set objParams = Nothing
Set robApp = Nothing
End Sub
Представленный макрос очень сырой, не содержит проверок, обработчика ошибок и пользовательского интерфейса, но он позволяет очень быстро получить желаемый результат.Давайте разберем, что происходит при исполнении данного макроса.
Получаем все выбранные нами оболочки в Robot:
Dim PanelSel As RobotSelection
Set PanelSel = robApp.Project.Structure.Selections.Get(I_OT_PANEL)
Даже если мы в модели размашисто выделим рамкой и зацепим стержни с узлами, все равно выбор сработает корректно, т.к. используется I_OT_PANEL.
Создаем коллекцию из выбранных оболочек:
Dim PanelCol As RobotObjObjectCollection
Set PanelCol = robApp.Project.Structure.Objects.GetMany(PanelSel)
Это нам необходимо, чтобы автоматически получить количество выбранных оболочек для запуска цикла перебора:
For I = 1 To PanelCol.Count
В этом цикле макрос обрабатывает каждую выбранную оболочку по очереди. Получаем i-ую оболочку и начинаем назначать ей свойства.
Set obj = PanelCol.Get(I)
Практически все свойства, доступные через пользовательский интерфейс, можно назначить через API:
В этом макросе мы назначаем только необходимые параметры, без которых не получится извлечь из темного угла 8 узловые элементы.
Назначаем метод Делоне. При желании можно использовать и метод Кунса (I_MMT_COONS)
obj.Mesh.Params.SurfaceParams.Method.Method = I_MMT_DELAUNAY
Выбираем нужный тип конечных элементов:
obj.Mesh.Params.SurfaceParams.FiniteElems.Type = I_MSFET_8NODE_QUADRIL
Снимаем флажок Регулярная сетка:
obj.Mesh.Params.SurfaceParams.Delaunay.RegularMesh = False
Устанавливаем размер конечного элемента в метрах:
obj.Mesh.Params.SurfaceParams.Generation.Type = I_MGT_ELEMENT_SIZE
obj.Mesh.Params.SurfaceParams.Generation.ElementSize = 0.5
Создаем сетку:
obj.Mesh.Generate
В принципе эту команду можно и не выполнять и создать сетку для всех оболочек в Robot нажав кнопочку. Для этого перед в начале отроки попробуйте добавить символ ‘ .
Результат макроса:
Как видим, API это не страшно и даже очень полезно.
Будем использовать встроенный в Microsoft Excel редактор VBA. Вызовем его из открытой книги Excel сочетанием клавиш Alt+F11, зайдем в Tools – References и добавим ссылку на библиотеку Robot Object Model:
Скопируйте текст программы в окно редактора, выберите в Robot оболочки и выполните команду Run.
Sub MeshParams()
Dim robApp As IRobotApplication
Set robApp = New RobotApplication
Dim PanelSel As RobotSelection
Set PanelSel = robApp.Project.Structure.Selections.Get(I_OT_PANEL)
Dim PanelCol As RobotObjObjectCollection
Set PanelCol = robApp.Project.Structure.Objects.GetMany(PanelSel)
Dim obj As IRobotObjObject
For I = 1 To PanelCol.Count
Set obj = PanelCol.Get(I)
obj.Mesh.Params.SurfaceParams.Method.Method = I_MMT_DELAUNAY
obj.Mesh.Params.SurfaceParams.FiniteElems.Type = I_MSFET_8NODE_QUADRIL
obj.Mesh.Params.SurfaceParams.Delaunay.RegularMesh = False
obj.Mesh.Params.SurfaceParams.Generation.Type = I_MGT_ELEMENT_SIZE
obj.Mesh.Params.SurfaceParams.Generation.ElementSize = 1
obj.Mesh.Generate
Next I
Set objParams = Nothing
Set robApp = Nothing
End Sub
Представленный макрос очень сырой, не содержит проверок, обработчика ошибок и пользовательского интерфейса, но он позволяет очень быстро получить желаемый результат.Давайте разберем, что происходит при исполнении данного макроса.
Получаем все выбранные нами оболочки в Robot:
Dim PanelSel As RobotSelection
Set PanelSel = robApp.Project.Structure.Selections.Get(I_OT_PANEL)
Даже если мы в модели размашисто выделим рамкой и зацепим стержни с узлами, все равно выбор сработает корректно, т.к. используется I_OT_PANEL.
Создаем коллекцию из выбранных оболочек:
Dim PanelCol As RobotObjObjectCollection
Set PanelCol = robApp.Project.Structure.Objects.GetMany(PanelSel)
Это нам необходимо, чтобы автоматически получить количество выбранных оболочек для запуска цикла перебора:
For I = 1 To PanelCol.Count
В этом цикле макрос обрабатывает каждую выбранную оболочку по очереди. Получаем i-ую оболочку и начинаем назначать ей свойства.
Set obj = PanelCol.Get(I)
Практически все свойства, доступные через пользовательский интерфейс, можно назначить через API:
В этом макросе мы назначаем только необходимые параметры, без которых не получится извлечь из темного угла 8 узловые элементы.
Назначаем метод Делоне. При желании можно использовать и метод Кунса (I_MMT_COONS)
obj.Mesh.Params.SurfaceParams.Method.Method = I_MMT_DELAUNAY
Выбираем нужный тип конечных элементов:
obj.Mesh.Params.SurfaceParams.FiniteElems.Type = I_MSFET_8NODE_QUADRIL
Снимаем флажок Регулярная сетка:
obj.Mesh.Params.SurfaceParams.Delaunay.RegularMesh = False
Устанавливаем размер конечного элемента в метрах:
obj.Mesh.Params.SurfaceParams.Generation.Type = I_MGT_ELEMENT_SIZE
obj.Mesh.Params.SurfaceParams.Generation.ElementSize = 0.5
Создаем сетку:
obj.Mesh.Generate
В принципе эту команду можно и не выполнять и создать сетку для всех оболочек в Robot нажав кнопочку. Для этого перед в начале отроки попробуйте добавить символ ‘ .
Результат макроса:
Как видим, API это не страшно и даже очень полезно.
Уважаемая редакция Robot & Хобот! Большое спасибо за полезную информацию. Осталось разобраться, что же такое API? С чего нужно начать, с VBA?
ОтветитьУдалитьRomanich, а с помощью API можно упростить/оптимизировать/ускорить армирование балок и колонн?
Мне кажется, что использование VBA самый легкий и быстрый путь. Если знаете C#, C++ и т.д. можно их использовать. А что именно вы хотите с армированием балок и колонн сделать?
УдалитьRomanich, хотелось бы быстро менять настройки, например, количество вертикальных рядов араматуры, горизонтальных рядов, упростить расстановку поперечной арматуры - иногда приходится вручную копировать в эксель, что бы правильно посчитать расстановку. В роботе, примерно 80 процентов настроек по армированию балок не трогаю, а вот к 20 процентам хотелось бы иметь быстрый доступ. Работаю по нормам BAEL.
УдалитьНасколько я помню, нет возможности залезть через API в фактическое армирование.
УдалитьРоманыч, я наверное путаю красное с горячим. Я хотел бы иметь более быстрый доступ к настройкам, в виде, возможно, панели инструментов, с возможностью галками быстро выбрать нужную комбинацию.
УдалитьДля тех у кого от слов VBA, C#, C++ и т.д. волосы на голове дыбом встают, так же как у меня, есть штатный инструмент Revit который позволяет перегнать подобранную арматуру для балок и колонн из ROBOT.
ОтветитьУдалитьОстанется только проставить выноски, образмерить и закомпоновать все на лист.
P.S. ну разве это не круто ???
Зачем нам 8 узловой конечный элемент?
ОтветитьУдалитьНам он совершенно не нужен :)
УдалитьЕсли следовать теории МКЭ, то в 4х узловом пластинчато-оболочечном конечном элементе, перемещения меняются линейно от узла к узлу в рамках элемента, а напряжения (суть - первая производная от перемещений помноженная на модуль упругости) являются константными. Узловые значения напряжений получаются путем осреднения значений элементов которым принадлежит узел.
УдалитьПри 8 узловом элементе перемещения меняются по квадратичному закону по элементу, а напряжения, соответственно, по линейному. Что приводит к более точному (в теории) распределению напряженно деформированного состояния.
Кроме того 8 узловые элементы более точно описывают криволинейные поверхности. Если эти поверхности сферические, конические или цилиндрические - то вообще без искажений. Для сложных сплайновых поверхностей - искажения описания формы существенно меньше (особенно при мелких сетках) чем для обычного линейного (4х узлового).
А вот нужно ли строителям-проектировщикам это не в теории, а на практике. Тут уже ответил Romanich
Давеча пробовал узнать через API расчетную длину стального элемента - так и не нашел способ.
ОтветитьУдалитьP.S. Есть еще проблема с автоматической расчетной длинной - если рама стоит на фундаменте (оболочки), а не на опоре, то длина считается неправильно. Добавление пружинной опоры малой жесткости помогает, но только не для норм СНиП.
Киньте тестовую модельку.
Удалитьhttps://www.dropbox.com/s/99slu9qrdoiz2oj/ABL_diff_supports.rtd?dl=0
УдалитьПри переключении на нормы еврокода расчетные длины считаються корректно.
Пару лет назад писал в ветке по Robot на Autodesk Discussion об этом. По Eurocode тоже пишет об ошибке: Ошибка при расчете расчетной длины (ось Y) для элементов ' 5 7 21 22 '. Принимается значение 1.0
УдалитьПо СНиП принимается 100 )))
Напишите о работе в UAE. Простому нашему инженеру реально там работать? Какие стоят задачи перед инженерами? Как выдают задания? Большое спасибо. Очень интересно.
ОтветитьУдалить