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

Создайте файл с набором координат в формате .csv (в примере coords.csv).

0.0,0.0,0.0
0.1,0.1,0.0

Затем создайте простую модель двух будущих оболочек с сеткой.

reset
brick x 0.1 y 0.1 z 0.01
delete volume 1  keep_lower_geometry 
delete Surface 4 5 6 3  
surface 1 2  size auto factor 4
mesh surface 1 2 
block 1 add surface 2 1 
create sphere radius 0.01 #вспомогательная сфера для визуального контроля

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

import csv     # Импорт библиотеки для работы с csv-файлами
import math  # Импорт математической библиотеки для упрощения вычислений

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

# Перенумерация узлов, начиная с 1 для удобства работы с номерами
fidesys.cmd('renumber Node all start_id 1 uniqueids ')

# Чтение файла с координатами будущих соединений
file = open('C:/Users/quazz/Documents/CAE-Fidesys-5.1/coords.csv','r')    # Открыть файл из любого каталога
data=csv.reader(file, delimiter = ",")                           # Создаем переменную с данными из файла

node_coordinates=[]    #Создаем пустой массив для заполнения координатами

# Считывание данных из CSV файла в массив координат
for row in data:
    node_coordinates.append(row)
print(node_coordinates)
file.close()

nodes_before_creating = cubit.get_node_count() # Для удобства отсчетов создаем переменную с числом узлов до начала процедур поиска

# Создаем цикл для перебора массивов по счетчику с именем "node"
for node in range(len(node_coordinates)):   
    for_bond_nodes=[]                                   # Массив для будущих интерфейсных узлов
    print(node_coordinates[node][0]+' '+node_coordinates[node][1]+' '+node_coordinates[node][2])
    (cx,cy,cz)=(node_coordinates[node][0],node_coordinates[node][1],node_coordinates[node][2])    # Координаты обрабатываемого узла из списка по файлу
    # Перебираем узлы в модели
    for master_node in range(1,nodes_before_creating+1): 
        (x,y,z)=cubit.get_nodal_coordinates(master_node) # Получение координат для узлов модели
        dist = math.pow((float(x)-float(cx)), 2)+math.pow((float(y)-float(cy)), 2)+math.pow((float(z)-float(cz)), 2) # Проверка нахождения в сфере поиска радиусом  "r" от точек с координатами из файла соседних узлов
        # Если узлы лежат внутри сферы 
        if dist<=(r**2): 
            print("Точка с этими координатами находится внутри сферы поиска") # Пишем в консоль что лежат 
            for_bond_nodes.append(master_node) # Записываем номера узлов для задания их в поле главных сущностей
    # Если в окрестности точки с координатами из файла есть близлежащие узлы в сфере поиска, то
    if len(for_bond_nodes)>0: 
        print('for_bond_nodes',for_bond_nodes)
        fidesys.cmd('create node location ' + str(node_coordinates[node][0]+' '+node_coordinates[node][1]+' '+node_coordinates[node][2])) # Создаем узел в рассмотренных координатах
        fidesys.cmd('create coupling master node '+str(for_bond_nodes)+'slave node '+str(cubit.get_node_count())+' dofs all') # Создание связей соседних узлов с созданным

nodes_after_creating = cubit.get_node_count() # Для удобства отсчетов создаем переменную с числом узлов после завершения процедур поиска

fidesys.cmd('block '+str(cubit.get_next_block_id())+' add node '+str(nodes_before_creating+1)+' to '+str(nodes_after_creating)) # Добавление в блок узлов, созданных по данным из файла
fidesys.cmd('block '+str(cubit.get_next_block_id()-1)+' name \'Bond_nodes\'') # Создание имени для интерфейсных узлов
fidesys.cmd('block '+str(cubit.get_next_block_id()-1)+' element point') # Задание блоку категории "точка"

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

В результате вы увидите созданную связь через интерфейсный узел, а также заметите, что для точки, в окрестности которой не было узлов в нужном диапазоне, связь создана не была.