Создание пользовательской утилиты для автоматического задания множества соединений между наборами узлов в препроцессоре Fidesys на основе Python API

Создайте модель крышки с множеством болтов, моделируемых балочными элементами по скрипту, приведенному ниже.

В модели также создаются наборы узлов, путем выбирания сущностей, которые являются для них исходными - "вершин" на краях линий (для болтов) и "кривых" сверху и снизу вокруг краев линий. Наборы узлов можно создать, используя "Режим"->"Множества", "Объект"->"Набор узлов", "Действие"->"Управление". Данные действия уже присутствуют в скрипте.

reset
create Cylinder height 0.05 radius 0.4 
webcut volume all with plane zplane offset 0.005 
webcut volume all with plane zplane offset -0.005 
webcut volume 2  with cylinder radius 0.39 axis z  
webcut volume 4 3 2  with cylinder radius 0.35 axis z 
delete volume 5 6 2  
create Cylinder height 0.05 radius 0.01 
move Volume 7 x 0.37 include_merged
Volume 7 copy rotate 10 about z repeat 36 
subtract volume 8 to 43 from volume 1 3 4  
create curve location on surface 32  center  location on surface 31  center
delete volume 7 4
Curve 309  copy rotate 10 about z repeat 35 
volume all size auto factor 1
mesh volume all
curve 309 to 344 interval 1
curve 309 to 344 scheme equal
mesh curve 309 to 344
create material 1 from 'Углеродистая сталь'
create material 2 from 'Резина'
block 1 add volume 1 3
block 1 name 'Фланцевое соединение'
block 3 add curve 309 to 344
block 3 name 'Болты'
block 'Фланцевое соединение' material 1 cs 1 element solid order 1
create beam properties 1
modify beam properties 1 type 'Ellipse'
modify beam properties 1 angle 0.0
modify beam properties 1 ey 0.0
modify beam properties 1 ez 0.0
modify beam properties 1 geom_a 0.02
modify beam properties 1 geom_b 0.02
modify beam properties 1 mesh_quality 6
modify beam properties 1 warping_dof off
block 'Болты' material 1 cs 1 element beam order 1
block 'Болты' beam properties 1
nodeset 1 add vertex 333 331 327 335 337 341 323 329 339 343 317 321 325 319 313 311 309 371 367 347 365 361 357 345 377 379 351 355 363 353 375 349 373 369 359 315 
nodeset 1 name 'Гайки'
nodeset 2 add vertex 328 334 340 326 332 320 336 338 330 342 344 322 318 324 316 312 314 310 360 362 356 350 370 372 346 368 378 380 352 376 374 366 354 348 364 358 
nodeset 2 name 'Шляпки'
nodeset 3 add curve 136 162 156 140 132 148 158 152 154 134 146 160 150 138 144 142 130 164 94 100 102 108 112 120 114 96 106 98 110 124 126 118 128 122 116 104  
nodeset 3 name 'Отв. верхней крышки'
nodeset 4 add curve 166 170 168 180 184 178 186 190 172 174 176 182 188 204 208 198 206 192 222 230 210 212 234 224 226 232 202 214 196 218 236 194 200 220 216 228  
nodeset 4 name 'Отв. нижней части'
create displacement  on surface 24  dof all fix
create pressure  on surface 177  magnitude 101000
analysis type static elasticity dim3
output nodalforce off energy off midresults on record3d on material off without_smoothing off fullperiodic off

Затем создайте текстовый файл с расширением .py со следующим содержанием:

import math    # Импорт математической библиотеки

bolt_up_nodeset=cubit.get_nodeset_nodes_inclusive(1) # Получение номеров узлов в первом наборе - гайки
bolt_down_nodeset=cubit.get_nodeset_nodes_inclusive(2) # Получение номеров узлов во втором наборе - шляпки болтов
holes_up_nodeset=cubit.get_nodeset_nodes_inclusive(3) # Получение номеров узлов в третьем наборе - отверстия возле гаек
holes_down_nodeset=cubit.get_nodeset_nodes_inclusive(4) # Получение номеров узлов в четвертом наборе - отверстия возле шляпок

# Радиус сферы поиска
r = 0.011

coupling_count=0 # Счетчик для связей, чтобы можно было правильно добавлять степени свободы к связям по степеням свободы

# Цикл, который проводит действия с узлами, номера которых получены из первого набора - гаек
for master_node in bolt_up_nodeset:
    (x_m,y_m,z_m)=cubit.get_nodal_coordinates(master_node) # Получение координат для узлов
    print("Ищем вокруг узла", master_node, "с координатами", x_m,y_m,z_m)
    slave_nodes_array=[]
    # Цикл, который проводит действия с узлами, номера которых получены их третьего набора - отверстий возле гаек
    for slave_node in holes_up_nodeset:    
        (x,y,z)=cubit.get_nodal_coordinates(slave_node)
        dist = math.pow((float(x)-float(x_m)), 2)+math.pow((float(y)-float(y_m)), 2)+math.pow((float(z)-float(z_m)), 2) # Проверка нахождения в сфере поиска радиусом  "r" от точек с координатами из файла соседних узлов
        if dist<=(r**2): # Если узлы лежат внутри сферы
           print("Узел",slave_node,"с координатами",x,y,z, "находится внутри сферы поиска") # Пишем в консоль что лежат 
           slave_nodes_array.append(slave_node)
    # Если в окрестности узла болта в нужном диапазоне есть один и более узлов (что мы проверяли выше), то создать связь с этими узлами
    if len(slave_nodes_array)>0:
       fidesys.cmd('create coupling master node '+str(master_node)+'  slave node' +str(slave_nodes_array)+'  dofs')
       coupling_count=coupling_count+1
       fidesys.cmd('modify coupling '+str(coupling_count)+' dof 1')
       fidesys.cmd('modify coupling '+str(coupling_count)+' dof 2')
       fidesys.cmd('modify coupling '+str(coupling_count)+' dof 3')		
	   
for master_node in bolt_down_nodeset:
    (x_m,y_m,z_m)=cubit.get_nodal_coordinates(master_node) # Получение координат для узлов
    print("Ищем вокруг узла", master_node, "с координатами", x_m,y_m,z_m)
    slave_nodes_array=[]
    for slave_node in holes_down_nodeset:    
        (x,y,z)=cubit.get_nodal_coordinates(slave_node)
        dist = math.pow((float(x)-float(x_m)), 2)+math.pow((float(y)-float(y_m)), 2)+math.pow((float(z)-float(z_m)), 2) # Проверка нахождения в сфере поиска радиусом  "r" от точек с координатами из файла соседних узлов
        if dist<=(r**2): # Если узлы лежат внутри сферы
           print("Узел",slave_node,"с координатами",x,y,z, "находится внутри сферы поиска") # Пишем в консоль что лежат 
           slave_nodes_array.append(slave_node)
    if len(slave_nodes_array)>0:
        fidesys.cmd('create coupling master node '+str(master_node)+'  slave node' +str(slave_nodes_array)+'  distance')
        coupling_count=coupling_count+1	

Затем откройте редактор журнала, в нем измените интерпретатор на Python ("Инструменты"-"Интерпретатор"-"Python") и откройте файл с ранее сохраненным скриптом и запустите нажатием зеленой кнопки "Плэй" ("Выполнить текущий файл").

После проделанных манипуляций в дереве в соединениях вы увидите 72 созданные связи, часть из которых по степеням свободы, а часть по расстоянию. Связи создавались, опираясь на узлы, расположенные внутри заранее созданных наборов узлов.