Abaqus получить объект лица

Я пытаюсь получить нормаль каждой грани на поверхности (РЕДАКТИРОВАТЬ: поверхность извлекается из твердого тела, а не из оболочки). Однако я не могу получить объекты лица. Согласно справочному руководству по сценариям это должен быть синтаксис:

mdb.models[name].rootAssembly.instances[name].surfaces[name].faces[i]

Я пробовал это:

femur_instance.surfaces['IMPLANT_SHAFT'].faces[0]

но при попытке получить нормальное использование атрибута pointOn[1] это дало мне ошибку атрибута. Когда я смотрю на атрибуты, я получаю это:

['__class__', '__copy__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__lt__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_addToCache', '_cache', '_counter', '_id', '_p', '_scdId', 'getId', 'getText', 'name']

тип возвращаемого объекта: 'symbolicConstant'

Что я делаю не так?

РЕДАКТИРОВАТЬ: femur_instance было определено как odb.rootAssembly.instances['FEMUR_SHAFT_1'], вызвавшее ошибку, см. ответ.


person ThaNoob    schedule 04.04.2018    source источник
comment
Это лицо ракушки? Согласно документам, тогда (...).faces[0].pointOn[1] должен возвращать кортеж, представляющий нормаль на 1-й грани. Вы хотите сказать, что это не так? Если это твердое тело, тогда другое дело.   -  person Matt P    schedule 05.04.2018
comment
Я действительно не знаю определения оболочки, хотя это лицо детали. Это полная строка кода: odb.rootAssembly.instances['FEMUR_SHAFT_1'].surfaces['IMPLANT_SHAFT'].faces[0] Так что действительно, он не возвращает нормаль первого лица. Он возвращает объект 'symbolicConstant'.   -  person ThaNoob    schedule 05.04.2018
comment
Вероятно, вам следует знать, что такое твердое тело и оболочка. Я не объясняю это в своем ответе, но я пытаюсь указать вам направление, чтобы вы могли разобраться в этом.   -  person Matt P    schedule 05.04.2018
comment
Сейчас я считаю, что твердое тело — это объемная сетка, а оболочка — поверхностная сетка, это правильно?   -  person ThaNoob    schedule 06.04.2018


Ответы (1)


Вы имеете в виду два разных объекта в своем посте и в своем комментарии. Один объект Face в mdb, другой объект OdbSet в odb. Несмотря на то, что они называются одинаково, они не имеют одинакового значения, атрибутов или методов. Это источник сообщения об ошибке, которое вы упомянули.

Например, в своем исходном сообщении вы ссылаетесь на геометрический объект Face в файле mdb. Например:

`f = mdb.rootAssembly.instances[name].surfaces[name].faces[N]` 

где N ссылается на конкретный объект Face в массиве faces, и мы присваиваем его переменной f. Теперь у f есть несколько "членов" или атрибутов. Один из них f.pointOn. Посмотрите, как это использовать ниже.

Однако в своих комментариях вы ссылаетесь на объект OdbSet. Например:

`g = odb.rootAssembly.instances[name].surfaces[name].faces[N]`

В данном случае faces представляет собой набор символических констант, определяющих грань элемента на геометрической грани. Кажется, вы пытаетесь использовать g, но на самом деле вам следует использовать объект mdb Face f.


Использование объекта mdb Face: если ваша деталь представляет собой твердое тело (созданное с использованием континуальных элементов, таких как CPS4 в 2D или C3D8 в 3D), то:

((x,y,z),) = f.pointOn

Член pointOn представляет собой кортеж кортежей с плавающей запятой. На самом деле существует только один внутренний кортеж, и он содержит координаты точки на грани.

Если ваша часть представляет собой оболочку (созданную с использованием элементов оболочки, таких как S4), вместо этого вы получите:

((x,y,z),(a,b,c)) = f.pointOn

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

Однако у меня такое ощущение, что ваша деталь твердая, поэтому эта техника не вернет нормаль к поверхности.

person Matt P    schedule 05.04.2018
comment
Ладно, думаю, я понял. Этот способ получения нормального лица работает, только если у вас есть оболочка, которая на самом деле является пустой оболочкой (сетка поверхности, а не сетка объема). В моем случае это действительно твердое тело согласно этому определению. Хотя я действительно не понимаю, почему они делают различие, поскольку мы работаем с поверхностью этого твердого тела. Все равно есть что-то странное. Потому что эта строка кода: print(odb.rootAssembly.instances['FEMUR_SHAFT_1'].surfaces['IMPLANT_SHAFT'].faces[0].pointOn)возвращает ошибку атрибута. Судя по вашему ответу не должно. - person ThaNoob; 06.04.2018
comment
Нет, вы все еще путаете объекты odb и mdb. Итак, на самом деле, согласно моему ответу, объект odb возвращает символическую константу, которая не имеет члена pointOn, и поэтому вы получаете ошибку атрибута. - person Matt P; 06.04.2018
comment
Блин, так глупо. Я получаю это сейчас. Я некоторое время работал с Odb, поэтому я просто упустил из виду букву «М» в начале. Возможно ли, что в вашем ответе первым примером должно быть f=mdb.rootAssembly.instances[name].surfaces[name].faces[N] вместо odb? - person ThaNoob; 06.04.2018