官术网_书友最值得收藏!

1.1 簡單插件實例——創建帶孔板有限元模型

熟悉Abaqus/CAE的人應該知道,當點擊Plug-ins→Toolboxes→Examples菜單時,會彈出如圖1.1所示工具條。

點擊第一個按鈕,彈出如圖1.2所示窗口。

圖1.1 插件程序工具條

圖1.2 帶孔板插件界面

這是Abaqus/CAE內嵌的一個簡單插件程序(plug-in),在上述窗口中輸入零件名、零件寬度、高度以及圓孔半徑之后,點擊“OK”,則會自動在Abaqus中生成帶孔板的幾何模型。

該程序僅能實現帶孔板的幾何創建,本節將以此為基礎,在源程序的基礎上稍加改進,使其可實現帶孔板有限元分析模型的參數化建模。圖1.3為改寫之后的插件程序界面示意圖。下面將對該插件程序的構成進行詳細介紹。

圖1.3 修改后的插件示意圖

該插件程序共由4個文件組成。

(1)注冊文件createPlateWithhole_plugin.py

(2)圖形界面文件createPlateWithholeDB.py

(3)內核執行文件createPlateModul.py

(4)圖標文件planewithhole.png

其中圖標文件如圖1.4所示,圖標文件即為插件窗口中的示意圖,Abaqus支持bmp、 gif、 png、 xpm等多種格式的圖片,本實例中采用的是png格式圖片,其他3個組成文件將在后面分別介紹。

圖1.4 修改后的插件示意圖

上述文件均存放在隨書配套資源\chapter 1\createPlateWithhole文件夾內。將文件夾createPlateWithhole及內部文件復制到Abaqus工作目錄或者安裝目錄下的Abaqus_plugins文件夾下(沒有的話請自行創建該文件夾),例如:

安裝目錄D:\SIMULIA\6.10\Abaqus_plugins\createPlateWithhole

當前工作目錄D:\TEMP\Abaqus_plugins

重新啟動Abaqus/CAE主界面,在Plug-ins菜單下會出現名為“創建帶孔板”的功能子菜單,如圖1.5所示。

圖1.5 插件菜單

將圖1.3中所示的參數填寫完整并執行程序,可自動生成帶孔板拉伸的有限元模型,并可直接將其提交計算,模型如圖1.6所示。

圖1.6 由插件生成的帶孔板模型示意圖

提交計算后,可以得到圖1.7所示的應力云圖。

圖1.7 帶孔板應力云圖

1.1.1 注冊文件

本插件程序中的注冊文件命名為createPlateWithhole_plugin.py,其主要作用是注冊插件程序以及其中的關鍵字等。其程序源代碼如下。

#文件名createPlateWithhole_plugin.py #中文編碼

    # -* - coding:UTF-8-*-
    from abaqusGui import*
    from abaqusConstants import ALL
    import osutils, os
    ####################################################################
    # Class definition
    ####################################################################
    class createPlateWithhole_plugin(AFXForm):
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        def__init__(self, owner):
            # Construct the base class.
            #
            AFXForm.__init__(self, owner)
            self.radioButtonGroups={}
            self.cmd=AFXGuiCommand(mode=self, method='createPlateFunction',
              objectName='createPlateModul', registerQuery=False)
            pickedDefault=''
            self.partnameKw=AFXStringKeyword(self.cmd, 'partname',
              True, 'part-1')
            self.widthKw=AFXFloatKeyword(self.cmd, 'width', True,100)
            self.heightKw=AFXFloatKeyword(self.cmd, 'height', True,100)
            self.radiusKw=AFXFloatKeyword(self.cmd, 'radius', True,5)
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        def getFirstDialog(self):
            import createPlateWithholeDB
            return createPlateWithholeDB.createPlateWithholeDB(self)
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        def doCustomChecks(self):
            # Try to set the appropriate radio button on. If the user did
            # not specify any buttons to be on, do nothing.
            #
            for kw1, kw2, d in self.radioButtonGroups.values():
              try:
                  value=d[kw1.getValue()]
                  kw2.setValue(value)
              except:
                  pass
            #對輸入數據格式進行檢查,不滿足要求時提示警告
            if self.widthKw.getValue()<=0:
              showAFXErrorDialog(getAFXApp().getAFXMainWindow(),
                  '寬度必須為正數’)
              return False
            elif self.heightKw.getValue()<=0:
                showAFXErrorDialog(getAFXApp().getAFXMainWindow(),
                    '高度必須為正數’)
                return False
            elif self.radiusKw.getValue()<=0:
                showAFXErrorDialog(getAFXApp().getAFXMainWindow(),
                    '孔半徑必須是正數.')
                return False
            else:
                return True
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        def okToCancel(self):
            # No need to close the dialog when a file operation (such
            # as New or Open) or model change is executed.
            #
            return False
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      # Register the plug-in
      #
      thisPath=os.path.abspath(__file__)             #指定路徑
      thisDir=os.path.dirname(thisPath)
      toolset=getAFXApp().getAFXMainWindow().getPluginToolset()
      toolset.registerGuiMenuButton(
        buttonText=’創建帶孔板’,
        object=createPlateWithhole_plugin(toolset),
        messageId=AFXMode.ID_ACTIVATE,
        icon=None,                              #指定圖標為空
        kernelInitString='import createPlateModul',       #內核初始化指令
        applicableModules=ALL,                    #指定使用模塊,默認為全部
        version='1.0',                             #軟件版本
        author='jly',                              #軟件作者
        description='N/A',                         #軟件描述
        helpUrl='N/A'                            #幫助文檔路徑指定
      )

提示

以上代碼是本書中出現的第一段代碼,需要提醒讀者注意的是,在Python語言中,代碼的縮進是一種語法,Python依靠每行代碼的縮進位置來判斷代碼的分塊、區分代碼塊之間的層次關系,錯誤的縮進位置將會導致程序執行錯誤,讀者應對此予以特別注意,有關Python編碼規則的內容請參照本書2.3節內容。

編寫代碼時建議使用UltraEdit或者Notepad++等文本編輯軟件,本書在編寫過程中采用的是Notepad++軟件(免費),該軟件支持Python等多種語言的語法著色。

1.1.2 圖形界面文件

圖形界面文件的主要作用是定義各類窗體、控件,關聯控件的執行命令及對象。通過定義文本框、單復選按鈕、表格等各類控件,用戶可以方便地將所需參數集成到統一的圖形界面下,形成友好的輸入輸出界面。本插件程序中的圖形界面文件命名為createPlateWithholeDB.py,其程序源代碼如下。

        # -* - coding:UTF-8-*-
        from abaqusConstants import*
        from abaqusGui import*
        from kernelAccess import mdb, session
        import os
        thisPath=os.path.abspath(__file__)  #設置當前路徑
        thisDir=os.path.dirname(thisPath)
        #########################################################################
        # Class definition
        #########################################################################
        class createPlateWithholeDB(AFXDataDialog):
            #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            def__init__(self, form):
                # Construct the base class.
                #
                AFXDataDialog.__init__(self, form, ’帶孔板參數化建模程序’,
                  self.OK|self.CANCEL, DIALOG_ACTIONS_SEPARATOR)
                #創建對話框,該對話框有OK、CANCEL按鍵
                okBtn=self.getActionButton(self.ID_CLICKED_OK)
                okBtn.setText('OK')
                #定義OK按鈕
                GroupBox_1=FXGroupBox(p=self, text=’參數’, opts=FRAME_GROOVE)
                AFXTextField(p=GroupBox_1, ncols=12, labelText=’零件名:',
                  tgt=form.partnameKw, sel=0)
                #定義文本框
                AFXTextField(p=GroupBox_1, ncols=12, labelText=’寬度(w):',
                  tgt=form.widthKw, sel=0)
                AFXTextField(p=GroupBox_1, ncols=12, labelText=’高度(h):',
                  tgt=form.heightKw, sel=0)
                AFXTextField(p=GroupBox_1, ncols=12, labelText=’半徑(r):',
                  tgt=form.radiusKw, sel=0)
                GroupBox_3=FXGroupBox(p=self, text=’示意圖’, opts=FRAME_GROOVE)
              fileName=os.path.join(thisDir, r'planewithhole.png')
              #指定示意圖圖標
              icon=afxCreatePNGIcon(fileName)
              #創建圖標
              FXLabel(p=GroupBox_3, text='', ic=icon)
              #定義示意圖標簽

1.1.3 內核執行文件

內核執行文件是插件程序的核心,其作用是驅動Abaqus/CAE執行內部命令,完成CAE建模以及數據處理等功能。本插件程序中的內核執行文件命名為createPlateModul.py,其程序源代碼如下。

        # -* - coding:UTF-8-*-
        from abaqus import*
        from abaqusConstants import*
        def createPlateFunction(partname, width, height, radius): #參數調用
            mdb.models['Model-1'].ConstrainedSketch(name='__profile__' , sheetSize=200.0)
            mdb.models['Model-1'].sketches['__profile__'].rectangle(point1=(0.0,0.0),
                point2=(width, height))
            mdb.models['Model-1'].sketches['__profile__'].CircleByCenterPerimeter(center=(
                width/2, height/2), point1=(width/2+radius, height/2))
            mdb.models['Model-1'].Part(dimensionality=THREE_D, name=partname, type=
                DEFORMABLE_BODY)
            mdb.models['Model-1'].parts[partname].BaseShell(sketch=
                mdb.models['Model-1'].sketches['__profile__'])
            p=mdb.models['Model-1'].parts[partname]
            session.viewports['Viewport:1'].setValues(displayedObject=p)
            del mdb.models['Model-1'].sketches['__profile__']
            #創建幾何
            mdb.models['Model-1'].Material(name='AL')
            mdb.models['Model-1'].materials['AL'].Elastic(table=((70000.0,0.3), ))
            mdb.models['Model-1'].HomogeneousShellSection(name='al', preIntegrate=OFF,
                material='AL', thicknessType=UNIFORM, thickness=1.0, thicknessField='',
                idealization=NO_IDEALIZATION, poissonDefinition=DEFAULT,
                thicknessModulus=None, temperature=GRADIENT, useDensity=OFF,
                integrationRule=SIMPSON, numIntPts=5)
            f=p.faces
            faces=f.getSequenceFromMask(mask=('[#1]', ), )
            region=p.Set(faces=faces, name='Set-2')
            p.SectionAssignment(region=region, sectionName='al', offset=0.0,
                offsetType=MIDDLE_SURFACE, offsetField='',
      thicknessAssignment=FROM_SECTION)
  #建立材料并賦予屬性
  session.viewports['Viewport:1'].partDisplay.setValues(mesh=ON)
  session.viewports['Viewport:1'].partDisplay.meshOptions.setValues(
      meshTechnique=ON)
  session.viewports['Viewport:1'].partDisplay.geometryOptions.setValues(
      referenceRepresentation=OFF)
  #切換到mesh模塊
  p=mdb.models['Model-1'].parts[partname]
  p.seedPart(size=4.0, deviationFactor=0.1, minSizeFactor=0.1)
  f=p.faces
  pickedRegions=f.findAt(((width/2,0.0,0.0), ))
  p.setMeshControls(regions=pickedRegions, elemShape=QUAD, algorithm=MEDIAL_AXIS)
  #設定網格劃分格式
  p.generateMesh()
  #網格劃分
  a=mdb.models['Model-1'].rootAssembly
  session.viewports['Viewport:1'].setValues(displayedObject=a)
  #切換到裝配模塊
  a=mdb.models['Model-1'].rootAssembly
  a.DatumCsysByDefault(CARTESIAN)
  p=mdb.models['Model-1'].parts[partname]
  a.Instance(name=partname+'-1', part=p, dependent=ON)
  #創建裝配實例
  mdb.models['Model-1'].StaticStep(name='Step-1', previous='Initial', nlgeom=ON)
  session.viewports['Viewport:1'].assemblyDisplay.setValues(step='Step-1')
  #創建分析步
  session.viewports['Viewport:1'].view.setValues(nearPlane=335.564,
      farPlane=385.546, width=212.48, height=142.547, viewOffsetX=13.3712,
      viewOffsetY=-7.13345)
  a=mdb.models['Model-1'].rootAssembly
  e1=a.instances[partname+'-1'].edges
  edges1=e1.findAt(((0.0, height/2,0.0), ))
  region=a.Set(edges=edges1, name='Set-1')
  mdb.models['Model-1'].DisplacementBC(name='BC-1', createStepName='Step-1',
      region=region, u1=0.0, u2=0.0, u3=0.0, ur1=0.0, ur2=0.0, ur3=0.0,
      amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='',
      localCsys=None)
  #施加邊界條件
  edges1=e1.findAt(((width, height/2,0.0), ))
  region=a.Set(edges=edges1, name='Set-2')
  mdb.models['Model-1'].DisplacementBC(name='BC-2', createStepName='Step-1',
      region=region, u1=2.0, u2=UNSET, u3=UNSET, ur1=UNSET, ur2=UNSET, ur3=UNSET,
              amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='',
              localCsys=None)
          #施加位移載荷
          mdb.Job(name='Job-hole', model='Model-1', description='', type=ANALYSIS,
              atTime=None, waitMinutes=0, waitHours=0, queue=None, memory=50,
              memoryUnits=PERCENTAGE, getMemoryFromAnalysis=True,
              explicitPrecision=SINGLE, nodalOutputPrecision=SINGLE, echoPrint=OFF,
              modelPrint=OFF, contactPrint=OFF, historyPrint=OFF, userSubroutine='',
              scratch='', multiprocessingMode=DEFAULT, numCpus=1)
          #創建job
主站蜘蛛池模板: 板桥市| 镇原县| 遂昌县| 疏附县| 木里| 东至县| 赤壁市| 丹阳市| 洞头县| 星座| 台江县| 酒泉市| 旬阳县| 阳西县| 封丘县| 古交市| 滦平县| 玉溪市| 赤壁市| 时尚| 汝城县| 临江市| 雷波县| 新邵县| 论坛| 上高县| 瑞丽市| 义乌市| 白玉县| 张家川| 大同市| 垦利县| 舟曲县| 夏津县| 遂宁市| 霍林郭勒市| 阳东县| 布拖县| 石嘴山市| 乌兰察布市| 湖南省|