【问题标题】:Write a for loop in Abaqus Macro (Python)在 Abaqus 宏 (Python) 中编写一个 for 循环
【发布时间】:2015-01-23 17:42:17
【问题描述】:

我使用 Abaqus 已经有一段时间了,但我对宏和 python 脚本不熟悉。很抱歉,如果已经问过这种问题,我确实在谷歌上搜索过,看看是否有类似的问题,但没有任何效果..

我的问题如下:

我在 Abaqus 中有一个模型,我用 2 个步骤进行了分析,并在其中创建了一条路径,我想为每个步骤的每一帧提取沿该路径的 Von Mises 应力值。 理想情况下,我希望将其保存到 Excel 或 .txt 文件中以便于进一步分析(例如在 Matlab 中)。

编辑:我解决了部分问题,我的宏工作,我的所有数据都正确保存在 XY 数据管理器中。

现在我想将所有“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)

【问题讨论】:

    标签: python macros path abaqus


    【解决方案1】:

    首先,你的函数VonMises只包含import语句,其他部分代码没有正确缩进,所以它们在函数之外。

    其次,函数永远不会被调用。如果您使用“文件 > 运行脚本”运行脚本,则应在文件末尾调用该函数。

    有两件事似乎是明显的错误,但也有一些其他不好的事情。

    另外,我看不出在文件顶部写import __name__ 的意义,因为我真的怀疑你有一个模块名称__name__; Abaqus 使用的 Python 环境可能也不行。

    还有一些其他方面可能会有所改进,但您应该先尝试修复错误。

    如果您收到来自 Abaqus 的实际错误消息(在窗口中或在 abaqus.rpy 文件中),将其发布在此处会很有帮助。

    【讨论】:

    • 感谢您的这些cmets。我现在没有 Abaqus 来给你确切的答案,但代码通常在循环开始处停止并且错误出现:“Error line ### in ?”此外,我将这些代码保留在 import __name__ 片段中,因为它已经在 abaqusMacros python 文件中。我不使用文件 > 运行脚本来运行该代码,我只是打开宏管理器并点击“运行”。我会尽力解决那些身份问题。。当然欢迎其他cmet或评论!
    • 当您能够再次运行 Abaqus 时,一定要发布实际错误。还有一个可能的问题,因为变量odbFile 似乎没有被声明。
    • 没错,我今天才开始研究宏和 python,所以我有点迷茫。我认为稍微调整宏会很容易失败。
    • 我认为只有stepsName 行缩进不正确。我敢打赌这不是真正的问题,而是当您粘贴到该站点时发生的事情。修复它使其他所有内容都成为vonMimises def 的一部分。当您调用宏时,该函数会从 gui 调用。
    • 如果可以的话,我明天试试这个。我会告诉你们进展如何,谢谢!
    【解决方案2】:

    知道了:

    我将使用上面发布的代码,在这里重复:

    # -*- 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)
    

    我刚刚在 Abaqus 上发现了“Excel Utilities”工具,这足以完成我想做的事情。

    感谢大家的意见。

    【讨论】:

      【解决方案3】:

      这是提取 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()
      

      【讨论】:

        猜你喜欢
        • 2022-06-15
        • 2015-11-01
        • 2019-06-21
        • 2014-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-01
        相关资源
        最近更新 更多