Abaqus Python脚本按局部坐标系提取节点坐标结果异常咨询
Abaqus局部坐标系节点坐标提取错误解决方案
错误原因
你调用getTransformedField()得到的坐标值有误,是因为该方法仅对场量执行旋转变换,不会叠加局部坐标系相对全局坐标系的平移偏移量。节点坐标属于位置矢量,需要同时完成「平移到局部系原点」+「旋转对齐局部坐标轴」两步变换才能得到正确结果。
修正后的代码
import numpy as np odb = openOdb(path='.....................Job-1.odb') Setnodes = 'LocalnodesCoord.txt' NodesFile = open(Setnodes,'w') nodeset='NODESET-3' mySet = odb.rootAssembly.instances['PART-1-1'].nodeSets[nodeset] csys1=odb.rootAssembly.datumCsyses['CSYS-1'] # 提取变换参数:原点全局坐标、旋转矩阵 origin_g = np.array(csys1.origin) R = np.array([csys1.axis1, csys1.axis2, csys1.axis3]) lastFrame = odb.steps['Step-1'].frames[-1] coords=lastFrame.fieldOutputs['COORD'] mySetCoord = coords.getSubset(region=mySet).values for var in mySetCoord : # 全局坐标转局部坐标 coord_g = np.array(var.data) coord_l = R.dot(coord_g - origin_g) NodesFile.write(f"{var.nodeLabel},{coord_l[0]},{coord_l[1]},{coord_l[2]}\n") NodesFile.close() odb.close()
获取坐标变换矩阵的方法
你可以直接从局部坐标系对象中提取完整的变换参数,无需通过场输出间接推导:
- 局部坐标系原点在全局坐标系下的坐标:
csys1.origin,返回三个浮点数值的元组 - 局部坐标系的旋转矩阵:将
csys1.axis1(X轴方向矢量)、csys1.axis2(Y轴方向矢量)、csys1.axis3(Z轴方向矢量)按行拼接即可得到3×3旋转矩阵R - 若使用圆柱/球等曲线局部坐标系,你还需要额外将变换后的笛卡尔坐标转换为对应曲线坐标系的坐标值。
注意事项
- 确认你提取的局部坐标系层级和节点集所属层级匹配:如果局部坐标系是在Part模块下创建的,需要从
odb.rootAssembly.instances['PART-1-1'].datumCsyses路径下提取,不要从Assembly根路径提取,避免坐标系不匹配导致的结果错误。 - 若不需要包含变形后的坐标,你可以直接读取节点的初始坐标
node.coordinates,不需要从场输出中提取COORD场,运算效率更高。
内容的提问来源于stack exchange,提问作者Wahid Tarhouni
相关产品推荐
相关产品推荐

