Написать цикл в Abaqus Macro (Python)
Я уже давно пользуюсь Abaqus, но я новичок в макросах и скриптах на python. Извините, если такой вопрос уже задавался, я выполнил поиск в Google, чтобы увидеть, была ли подобная проблема, но ничего не работает..
Моя проблема заключается в следующем:
У меня есть модель в Abaqus, я выполнил анализ с 2 шагами, и я создал в нем путь, и я хотел бы извлечь значение напряжения Фон Мизеса вдоль этого пути для каждого кадра каждого шага. В идеале я хотел бы сохранить его в файл Excel или.txt для более простого анализа (например, в Matlab).
Изменить: Я решил часть проблемы, мой макрос работает, и все мои данные правильно сохранены в диспетчере XY-Data.
Теперь я хотел бы сохранить все данные "Y" в Excel или текстовом файле, и я понятия не имею, как это сделать. Я буду продолжать копать, но если у кого-то есть идея, я возьму ее!
Вот код из файла abaqusMacros.py:
# -*- coding: mbcs -*-
# Do not delete the following import lines
from abaqus import *
from abaqusConstants import *
import __main__
def VonMises():
import section
import regionToolset
import displayGroupMdbToolset as dgm
import part
import material
import assembly
import step
import interaction
import load
import mesh
import optimization
import job
import sketch
import visualization
import xyPlot
import displayGroupOdbToolset as dgo
import connectorBehavior
odbFile = session.openOdb(name='C:/Temp/Job-1.odb')
stepsName = odbFile.steps.keys()
for stepId in range(len(stepsName)):
numberOfFrames = len(odbFile.steps.values()[stepId].frames)
for frameId in range(numberOfFrames):
session.viewports['Viewport: 1'].odbDisplay.setPrimaryVariable(
variableLabel='S', outputPosition=INTEGRATION_POINT, refinement=(
INVARIANT, 'Mises'))
session.viewports['Viewport: 1'].odbDisplay.setFrame(step=stepId, frame=frameId)
pth = session.paths['Path-1']
session.XYDataFromPath(name='Step_'+str(stepId)+'_'+str(frameId), path=pth, includeIntersections=False,
projectOntoMesh=False, pathStyle=PATH_POINTS, numIntervals=10,
projectionTolerance=0, shape=DEFORMED, labelType=TRUE_DISTANCE)
3 ответа
Прежде всего, ваша функция VonMises
содержит только операторы импорта, остальные части кода не имеют правильного отступа, поэтому они находятся за пределами функции.
Во-вторых, функция никогда не вызывается. Если вы запускаете ваш скрипт, используя "Файл> Выполнить скрипт", вам следует вызвать функцию в конце вашего файла.
Две вещи кажутся очевидными ошибками, но есть и другие плохие вещи.
Кроме того, я не вижу смысла писать import __name__
в верхней части вашего файла, потому что я действительно сомневаюсь, что у вас есть имя модуля __name__
; Среда Python, используемая Abaqus, вероятно, тоже этого не делает.
Есть и другие вещи, которые могут быть улучшены, но вы должны сначала попытаться исправить ошибки.
Если вы получили реальное сообщение об ошибке от Abaqus (либо в окне, либо в файле abaqus.rpy), было бы полезно, если бы вы разместили его здесь.
Вот как вы извлекаете XY-данные
from odbAccess import *
odb = session.odbs['C:/Job-Directory/Job-1.odb']
output = open('Result.dat', 'w')
for i in range (0,Number-of-XYData-to-extract):
xy1 = odb.userData.xyDataObjects['XYData-'+str(i)]
for x in range (0,len(xy1)):
output.write ( str(xy1[x]) + "\n" )
output.close()
Понял:
Я буду использовать код, размещенный выше, повторяется здесь:
# -*- coding: mbcs -*-
# Do not delete the following import lines
from abaqus import *
from abaqusConstants import *
import __main__
def VonMises():
import section
import regionToolset
import displayGroupMdbToolset as dgm
import part
import material
import assembly
import step
import interaction
import load
import mesh
import optimization
import job
import sketch
import visualization
import xyPlot
import displayGroupOdbToolset as dgo
import connectorBehavior
odbFile = session.openOdb(name='C:/Temp/Job-1.odb')
stepsName = odbFile.steps.keys()
for stepId in range(len(stepsName)):
numberOfFrames = len(odbFile.steps.values()[stepId].frames)
for frameId in range(numberOfFrames):
session.viewports['Viewport: 1'].odbDisplay.setPrimaryVariable(
variableLabel='S', outputPosition=INTEGRATION_POINT, refinement=(
INVARIANT, 'Mises'))
session.viewports['Viewport: 1'].odbDisplay.setFrame(step=stepId, frame=frameId)
pth = session.paths['Path-1']
session.XYDataFromPath(name='Step_'+str(stepId)+'_'+str(frameId), path=pth, includeIntersections=False,
projectOntoMesh=False, pathStyle=PATH_POINTS, numIntervals=10,
projectionTolerance=0, shape=DEFORMED, labelType=TRUE_DISTANCE)
И я только что обнаружил инструмент "Excel Utilities" на Abaqus, которого достаточно для того, что я хочу сделать.
Спасибо всем за ваш вклад.