пятница, 21 августа 2015 г.

8 узлов

Нам пишут, есть ли в Robot 8 узловые конечные элементы для оболочек? Уважаемая редакция Robot & Хобот отвечает, что такие конечные элементы есть, но не для всех пользователей. Вы не найдете их через пользовательский интерфейс. Увидеть и использовать их можно только через API. Много лет назад разработчики убрали эти конечные элементы из диалоговых окон и оставили только по причине обратной совместимости. Сегодня мы научимся основам работы с API Robot на примере доставания из мрачных глубин 8 узловых конечных элементов и назначения их оболочкам.

Будем использовать встроенный в Microsoft Excel редактор VBA. Вызовем его из открытой книги Excel сочетанием клавиш Alt+F11, зайдем в Tools – References и добавим ссылку на библиотеку Robot Object Model:
001NODES
Скопируйте текст программы в окно редактора, выберите в 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:
001
В этом макросе мы назначаем только необходимые параметры, без которых  не получится извлечь из темного угла 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 нажав кнопочку. Для этого перед в начале отроки попробуйте добавить символ ‘ .
Результат макроса:
002NODES
Как видим, API это не страшно и даже очень полезно.

14 комментариев:

  1. Уважаемая редакция Robot & Хобот! Большое спасибо за полезную информацию. Осталось разобраться, что же такое API? С чего нужно начать, с VBA?
    Romanich, а с помощью API можно упростить/оптимизировать/ускорить армирование балок и колонн?

    ОтветитьУдалить
    Ответы
    1. Мне кажется, что использование VBA самый легкий и быстрый путь. Если знаете C#, C++ и т.д. можно их использовать. А что именно вы хотите с армированием балок и колонн сделать?

      Удалить
    2. Romanich, хотелось бы быстро менять настройки, например, количество вертикальных рядов араматуры, горизонтальных рядов, упростить расстановку поперечной арматуры - иногда приходится вручную копировать в эксель, что бы правильно посчитать расстановку. В роботе, примерно 80 процентов настроек по армированию балок не трогаю, а вот к 20 процентам хотелось бы иметь быстрый доступ. Работаю по нормам BAEL.

      Удалить
    3. Насколько я помню, нет возможности залезть через API в фактическое армирование.

      Удалить
    4. Романыч, я наверное путаю красное с горячим. Я хотел бы иметь более быстрый доступ к настройкам, в виде, возможно, панели инструментов, с возможностью галками быстро выбрать нужную комбинацию.

      Удалить
  2. Для тех у кого от слов VBA, C#, C++ и т.д. волосы на голове дыбом встают, так же как у меня, есть штатный инструмент Revit который позволяет перегнать подобранную арматуру для балок и колонн из ROBOT.
    Останется только проставить выноски, образмерить и закомпоновать все на лист.
    P.S. ну разве это не круто ???

    ОтветитьУдалить
  3. Зачем нам 8 узловой конечный элемент?

    ОтветитьУдалить
    Ответы
    1. Нам он совершенно не нужен :)

      Удалить
    2. Если следовать теории МКЭ, то в 4х узловом пластинчато-оболочечном конечном элементе, перемещения меняются линейно от узла к узлу в рамках элемента, а напряжения (суть - первая производная от перемещений помноженная на модуль упругости) являются константными. Узловые значения напряжений получаются путем осреднения значений элементов которым принадлежит узел.

      При 8 узловом элементе перемещения меняются по квадратичному закону по элементу, а напряжения, соответственно, по линейному. Что приводит к более точному (в теории) распределению напряженно деформированного состояния.

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

      А вот нужно ли строителям-проектировщикам это не в теории, а на практике. Тут уже ответил Romanich

      Удалить
  4. Давеча пробовал узнать через API расчетную длину стального элемента - так и не нашел способ.

    P.S. Есть еще проблема с автоматической расчетной длинной - если рама стоит на фундаменте (оболочки), а не на опоре, то длина считается неправильно. Добавление пружинной опоры малой жесткости помогает, но только не для норм СНиП.

    ОтветитьУдалить
    Ответы
    1. Киньте тестовую модельку.

      Удалить
    2. https://www.dropbox.com/s/99slu9qrdoiz2oj/ABL_diff_supports.rtd?dl=0
      При переключении на нормы еврокода расчетные длины считаються корректно.

      Удалить
    3. Пару лет назад писал в ветке по Robot на Autodesk Discussion об этом. По Eurocode тоже пишет об ошибке: Ошибка при расчете расчетной длины (ось Y) для элементов ' 5 7 21 22 '. Принимается значение 1.0
      По СНиП принимается 100 )))

      Удалить
  5. Напишите о работе в UAE. Простому нашему инженеру реально там работать? Какие стоят задачи перед инженерами? Как выдают задания? Большое спасибо. Очень интересно.

    ОтветитьУдалить