走進abaqus gui開發(4)--新建插件程序

前言

Python具有以下特點。Python語言是一種動態解釋型編程語言,其功能強大,簡單易學,支持面向對象編程((object-oriented programming),雖然由于其動態性致使程序解釋執行速度比編譯語言慢,但是隨著Python語言的不斷優化以及計算機硬件的迅猛發展,Python語言將會受到越來越多用戶的關注。Python具有開源、自由等特征。它的簡潔性和易用性使程序的開發過程變得簡單,特別適用于快速應用程序開發。以有效提高前后處理效率,節省建模及數據處理時間。

采用Python語言對 Abaqus進行二次開發具有以下優點。

(1)可以通過圖形交互界面,實現參數的統一管理。

(2)可以避免大量重復性的建模工作,避免人為建模錯誤。對于具有典型共有特征的模型可以建立標準的建模模板,實現完全參數化或者快速建模。

(3)可以通過執行內核指令實現Abaqus/CAE不具備的甚至是人工手動操作無法實現的復雜問題建模。

Abaqus 用戶圖形界面程序主要有兩種:簡單GUI插件程序和用戶自定義GUI應用程序。插件程序可以輔助完成一個或者幾個功能,自定義應用程序可集成多功能、多界面,將多個功能組件集成在統一的平臺內進行管理,適合大型應用程序開發。上述兩類圖形界面程序均可以輔助用戶提高有限元建模及數據處理效率。

上一期講到文件包里含有四個文件,注冊文件,圖形界面文件,內核執行文件,圖標文件。今天就針對核心部分的內核程序和圖形界面程序拆開講講,代碼里面的結構是什么樣,各個部分有什么作用。

1 圖形界面程序

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

1.1 類(class)的結構

如果對“類”比較陌生,咱舉一個例子,正如鎬頭?這類工具,首先定義它的屬性,再定義有很多種功能一樣。一個類(class)首先是定義一些參數屬性,再定義一些函數(具有相應的功能),一個類可以包含很多種函數。就如下面所示這樣。

class 解釋類是什么:    def __init__(self, 參數1,參數2,..., 參數n):        self.參數1 = 參數1        .......     def function1():# 函數1        #執行功能1        return sth    def function2():# 函數1        #執行功能2        return sth

1.2 引入相關的庫

abaqusConstants,abaqusGui,kernelAccess,這三個庫都是集成在abaqus中的,和 abaqus密切相關的庫。

from abaqusConstants import *
from abaqusGui import *
from kernelAccess import mdb, session
import os

1.3 規定相應的功能

先觀察案例中的插件程序界面里面有什么東西。

走進abaqus gui開發(4)--新建插件程序的圖1

首先是有一個大框把所有東西都裝起來,還有標題,再加上注意事項,畫面中間還有一些小的參數框和示意圖,最下面還有兩個按鈕。所以在這個部分就要先設計一個自己的對話框,在往對話框中填東西。就往最簡單的方向,先造一個夠用的小對話框。對話框里首先是底部按鈕,參數對話框,示意圖。分別講講這三個功能是如何用函數來實現的。

  • 按鈕用.getActionButton()來定義,

  • 參數對話框用AFXTextField(p=GroupBox_l, ncols=’, labelText='零件名:', tgt=form.partnameKw, sel=O)。值得注意,因為我們有四個參數,名字,寬度,高度,直徑,所以參數對話框就需要四個。

  • 示意圖用afxCreatePNGIcon()函數創建。詳細代碼如下:

# Class definition
# Class definitionclass createPlateWithholeDB(AFXDataDialog):    def __init__(self,form):        # Construct the base class.        # 創建對話框,該對話框有OK、CANCEL按鍵        AFXDataDialog.__init__(self, form, '帶孔板參數化建模程序',                             self.OK | self.CANCEL, DIALOG_ACTIONS_SEPARATOR)        # 定義OK按鈕        okBtn = self.getActionButton(self.ID_CLICKED_OK)        okBtn.setText('OK')        # 定義文本框        GroupBox_1 = FXGroupBox(p=self, text='參數', opts=FRAME_GROOVE)        AFXTextField(p=GroupBox_l, ncols=12, labelText='零件名:',                     tgt=form.partnameKw, sel=O)        AFXTextField(p=GroupBox_l, ncols=12, labelText='寬度(w):',                     tgt=form.widthKw, sel=0)        AFXTextField(p=GroupBox_l, 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)

2 內核文件

內核執行文件是插件程序的核心,其作用是驅動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(pointl=(0.0,0.0),
point2=(width, height))    
mdb.models['Model-1'].sketches['_profile_' ].CircleByCenterPerimeter(center=(width/2, 
height/2),                           pointl=(width/2+radius, height/2))    
mdb.models['Model-1'].Part(dimensionality=THREE_D, 
                              
                              name=partname,                               type=DEFORMABLE_BODY)    mdb.models['Mode1-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',                                                    prelntegrate=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'l.partDisplay.setValues(mesh=ON)session.viewports['Viewport: 1'l.partDisplay.meshOptions.setValues(    meshTechnique=ON)    session.viewports['Viewport: 1'l.partDisplay.geometryOptions.setValues(    referenceRepresentation=OFF)    #切換到mesh模塊    p= mdb.models['Model-1'l.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'l.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.instanceslpartname+'-1'].edges    edges1=el.findAt(((0.0, height/2,0.0),))    region = a.Set(edges=edgesl, name='Set-1')    mdb.models['Model-1'].DisplacementBC(name='BC-1',                                         createStepName='Step-',                                         region=region, u1=0.0,                                         amplitude-UNSET,                                         fixed=OFF,                                         distributionType=UNIFORM,                                         fieldName="",                                         localCsys=None)    #施加邊界條件    edgesl =e1.findAt((width, height/2,0.0),))    region = a.Set(edges=edgesl, name='Set-2')    mdb.models['Model-1'].Displacement    BC(name='BC-2', createStepName='Step-1',        region=region,       ul=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=O,            waitHours=O,            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)

內核文件代碼詳細地從畫圖,搭建模型,組合模型,網格繪制,邊界條件加載幾個方面介紹。

個人總結,難免有紕漏和錯誤,還請諸君指正。關于abaqus二次開發大家想了解哪些方面,多多參與留言哦。

古人言,故不積跬步,無以至千里;不積小流,無以成江海。學習一門技術也是這樣,只有持之以恒,才能不斷精進。 走進abaqus gui開發(4)--新建插件程序的圖2走進abaqus gui開發(4)--新建插件程序的圖3走進abaqus gui開發(4)--新建插件程序的圖4

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

8
5
9