Со ссылкой на мой предыдущий вопрос,
Более быстрый способ разделения лица с помощью Sketch в ABAQUS со сценариями,
Мне нужно выбрать несколько областей, созданных методом разделения, чтобы назначить элементы управления сеткой и задать края и, наконец, создать сетку областей соответственно.
Проблема в том, что, поскольку разделенные области параметризованы и имеют такое большое количество, определение функции для этой цели и запуск ее в цикле было единственным способом, который мне показался подходящим. Следовательно, я попытался определить функцию двумя разными способами, например:
Функция определена для выбора областей и запуска в цикле по всей длине тела. Здесь каждая небольшая область выбирается один раз, и одни и те же элементы управления сеткой применяются повторно, что приводит к длительному времени создания сетки.
def set_mesh_control_structured(x_left, x_right, y_top, y_bottom, element_type, mesh_technique, minimize_transition): p = mdb.models['Model-1'].parts['Part'] f = p.faces pickedRegions = f.findAt(((x_left + (x_right - x_left)/2, y_bottom (y_top - y_bottom)/2, 0.0), )) return p.setMeshControls(regions=pickedRegions, elemShape=element_type, technique=mesh_technique, minTransition=minimize_transition) # Executed within a 'for' loop like e.g.: for i in range((8 * total_blocks) + 6): set_mesh_control_structured(x_left, x_right + (i * block_length), y_coord[0], 0.0, QUAD, STRUCTURED, OFF)
Вторая функция пытается выбрать все регионы один за другим, а затем применить элементы управления сеткой в конце только один раз. Вот где проблема закрадывается. Предполагается, что аргументом для findAt() является кортеж кортежей, но он не работает, и ABAQUS выдает предупреждение об ошибке, говорящее, что "...in set_mesh_control_structured; pickRegions = f.findAt(regions_tuple); TypeError: arg1 (координаты)[0][0];найден кортеж с плавающей запятой".
def set_mesh_control_structured(range_arg, x_left, x_right, y_top, y_bottom, element_type, mesh_technique, minimize_transition): p = mdb.models['TDCB'].parts['Part_TDCB'] f = p.faces regions_tuple = () for i in range(range_arg): # Put x,y,z coords in one value incremental_picked_regions = (x_left + (i * (x_right - x_left)/2), y_bottom + (i * (y_top - y_bottom)/2), 0.0) # Abaqus wants each repeating unit as ((x,y,z),) incremental_picked_regions = ((incremental_picked_regions),) # Adding all the coordinates into 1 tuple regions_tuple += (incremental_picked_regions,) pickedRegions = f.findAt(regions_tuple) return p.setMeshControls(regions=pickedRegions, elemShape=element_type, technique=mesh_technique, minTransition=minimize_transition)
Может ли кто-нибудь сказать мне, что я делаю неправильно во втором определении функции, или есть ли лучший способ выбрать несколько регионов с целью настройки элементов управления сеткой и заполнения отдельно от findAt ()? Я знаю о getBoundingBox и Faces.index[#] и т. д., но я понятия не имею, как их использовать. Таким образом, MWE также будет высоко оценен.
Заранее большое спасибо.
getBoundingBox is for seeing the size of a box containing your face(s).
getByBoundingBox предназначен для выбора лиц внутри рамки. `getByBoundingBox принимает xMax=20, xMin=1, yMax=88 и т. д. в качестве входных данных - я действительно думаю, что это был бы лучший способ сделать это, но не уверен, не видя, что вы хотите. - person will   schedule 09.08.2016getByBoundingBox
, и это сработало отлично.. Спасибо за указатель.. - person Parvez Ahmed   schedule 10.08.2016