Abaqus GUI程序开发指南 Python语言(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-13 05:46:55

点击下载

作者:贾利勇 富琛阳子 贺高 周正光

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Abaqus GUI程序开发指南 Python语言

Abaqus GUI程序开发指南 Python语言试读:

前言

Abaqus是目前国际上比较先进的大型通用有限元软件之一,它可以分析复杂的工程力学问题,其驾驭庞大求解规模的能力以及非线性力学分析功能均达到世界领先水平。Abaqus在欧洲、北美和亚洲许多国家得到了广泛的应用,其用户遍及航空、航天、船舶、机械、化工、冶金、土木、水利、材料、汽车、电器等各个工程和科研领域。

Abaqus强大的非线性求解器、清晰友好的用户界面以及开放的开发平台使得近年来其用户数量迅速增长,同时随着用户软件使用能力的提高,对Abaqus提出了更高的使用要求。借助Abaqus软件为用户提供的二次开发接口,越来越多的人开始学习和使用Abaqus的二次开发,研究适用于用户自己的算法、用户单元、材料本构模型以及用户自定义的GUI工具等。

Abaqus二次开发分为子程序开发和用户图形界面程序(Graphical User Interface,GUI)开发两类:子程序开发基于Fortran语言,用户可以根据实际需求编写材料本构关系(UMAT/VUMAT)、自定义单元UEL以及其他多种子程序(UVARM、DLOAD、USDFLD等);用户图形界面程序开发基于Python语言,用户可以根据需求对原有Abaqus/CAE界面程序进行扩展,开发专用的前后处理模块以及GUI工具等。

目前,国内针对基于Python语言的Abaqus二次开发方面的书籍只有曹金凤老师的《Python语言在Abaqus中的应用》一书,该书详细介绍了Python语言的基本语法、Abaqus脚本接口、参数化建模指令、脚本的高级处理功能等,并给出了很多前后处理脚本实例,为读者学习Abaqus脚本编写提供了很大的帮助。

本书侧重于基于Python语言的Abaqus图形界面程序开发,主要包含GUI插件工具(Plug-ins)开发以及自定义GUI应用程序(Customized Applications)开发,用户可以根据实际需求开发GUI插件工具或者自定义GUI应用程序,从而实现高效参数化建模、标准工具箱或者模块的建立,一方面可大大减少前后处理时间,另一方面可有效避免反复手动操作引入的建模错误,提高前后处理效率。本书共6章内容:第一章以简单的入门插件程序介绍了Python语言在Abaqus GUI插件程序开发中的应用;第二章与第三章简要介绍了Python语言的基本语法和Abaqus常用的内核指令,因为本书的侧重点不在这方面,所以有关Python基本语法和Abaqus常用内核指令方面的内容请参照Abaqus帮助文档或者曹金凤老师的《Python语言在Abaqus中的应用》一书;第四章主要介绍了Python中常用控件的使用方法以及实例;第五章主要介绍了基于Python语言的GUI插件程序开发过程以及多插件程序的管理,同时给出了完整的插件程序实例;第六章介绍了用户自定义GUI 应用程序的组成以及GUI 工具条、工具箱、菜单、模块的创建方法等,同样,在本章给出了自定义GUI应用程序的开发实例,并对实例做了详细的注释。读者对象

本书主要面向Abaqus软件的中级和高级用户。在开始学习Abaqus图形界面程序开发之前,读者应熟练掌握Abaqus有限元分析软件的基础知识,熟悉Abaqus/CAE的操作界面,了解Python语言的基本编码格式和语法规则。Python语言的基本语法以及Abaqus中常用的函数库可参照Abaqus帮助文档,本书中将不再赘述。

本书特色

本书从Abaqus的实际开发应用出发,结合作者的开发和应用实践,深入浅出地介绍了Abaqus用户图形界面程序开发的方法,文字通俗易懂,读者可轻松地掌握Abaqus GUI程序开发的编程技巧。

本书详细介绍了多种Python常用控件的使用方法和注意事项,帮助读者少走弯路。

本书中详细介绍了GUI插件程序以及自定义GUI应用程序的组成、开发过程和方法,给出了完整的GUI插件实例和GUI应用程序实例,并对实例代码做了详尽的注释,以方便读者理解。

为了方便读者学习,本书的配套程序源代码及CAE模型均可以从人民邮电出版社的异步社区下载,网址为:www.epubit.com.cn/book/details/4252。

本书中Python语言选用的是2.6.2版本,Abaqus软件采用的是6.10版本。

致谢

特别感谢中航工业第一飞机设计研究院结构设计研究所各位领导、同事多年来在工作以及生活中给予的关心和帮助。

特别感谢导师贺高研究员多年来在学习和工作中的悉心指导以及对本书的审校和修改。感谢师妹富琛阳子、师兄周正光对书稿的校对、修改以及在本书出版过程中所付出的努力。

特别感谢达索SIMULIA高级技术经理龚平博士,达索SIMULIA北京办事处张涛、焦中华、原中晋老师,中航信息技术中心许鸿杰老师,安托信息技术有限公司范艳杰老师,重庆大学赵友选老师多年来在Abaqus软件应用方面的支持与帮助。

在本书的编写过程中,作者还参考了一些其他关于Python以及Abaqus应用的书籍,同时大量参考了Abaqus 6.10帮助文档,感谢相关作者的辛勤劳动。

目前,国内尚没有一本系统介绍Abaqus GUI图形界面程序开发的书籍,可参考资料甚少,作者尽最大能力将内容介绍清楚,便于读者学习,但是鉴于水平有限,书中难免有错误及纰漏之处,敬请诸位专家和广大读者朋友批评指正,并欢迎通过以下联系方式与作者交流。

电子邮件:taishanbuzuo@163.com

微信:taishanbuzuo作者2014年端午于阎良第一章概述

工欲善其事,必先利其器。对于CAE分析工程师而言,一个好的软件平台就是一把利器,基于软件平台的二次开发就是让工具更加丰富、便捷和高效。Abaqus的二次开发一般分为子程序开发和用户图形界面程序(Graphical User Interface,GUI)开发两类,有很多初学者经常把两者混淆,分不清两者的区别。Abaqus子程序开发基于Fortran语言,用户可以根据实际需求编写材料本构关系(UMAT/VUMAT)、自定义单元UEL以及其他多种子程序(UVARM、DLOAD、USDFLD等等)。用户图形界面程序开发则是基于Python语言,主要是根据需求对原有Abaqus/CAE功能组件进行扩展,开发专用的前后处理模块以及GUI工具等。本书的内容仅针对基于Python语言的GUI程序开发。在本章中,将通过一个简单的插件实例介绍Abaqus GUI程序开发的概念、作用及意义。1.1 简单插件实例——创建带孔板有限元模型

熟悉Abaqus/CAE的人应该知道,当点击Plug-ins→Toolboxes→Examples菜单时,会弹出如图1.1所示工具条。

点击第一个按钮,弹出如图1.2所示窗口。图1.1 插件程序工具条图1.2 带孔板插件界面

这是Abaqus/CAE内嵌的一个简单插件程序(plug-in),在上述窗口中输入零件名、零件宽度、高度以及圆孔半径之后,点击“OK”,则会自动在Abaqus中生成带孔板的几何模型。

该程序仅能实现带孔板的几何创建,本节将以此为基础,在源程序的基础上稍加改进,使其可实现带孔板有限元分析模型的参数化建模。图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.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) #创建job1.2 Abaqus图形界面程序开发的意义

通过1.1节介绍的简单实例,相信大家对Abaqus软件的图形界面程序开发有了一定的认识。传统的采用手动建模过程中,需要反复切换模块、点击按钮、输入数据等,过程繁琐,耗时费力。通过对商业有限元软件的前后处理模块进行二次开发,可以有效提高前后处理效率,节省建模及数据处理时间。采用Python语言对Abaqus进行二次开发具有以下优点。(1)可以通过图形交互界面,实现参数的统一管理。(2)可以避免大量重复性的建模工作,避免人为建模错误。对于具有典型共有特征的模型可以建立标准的建模模板,实现完全参数化或者快速建模。(3)可以通过执行内核指令实现Abaqus/CAE不具备的甚至是人工手动操作无法实现的复杂问题建模。

Abaqus用户图形界面程序主要有两种:简单GUI插件程序和用户自定义GUI应用程序。插件程序可以辅助完成一个或者几个功能,自定义应用程序可集成多功能、多界面,将多个功能组件集成在统一的平台内进行管理,适合大型应用程序开发。上述两类图形界面程序均可以辅助用户提高有限元建模及数据处理效率。有关插件程序以及用户自定义应用程序的开发详见本书第五章和第六章内容。第二章Python语言基础

Python语言是一种动态解释型编程语言,其功能强大,简单易学,支持面向对象编程(object-oriented programming),虽然由于其动态性致使程序解释执行速度比编译语言慢,但是随着Python语言的不断优化以及计算机硬件的迅猛发展,Python语言将会受到越来越多用户的关注。Python具有开源、自由等特征。它的简洁性和易用性使程序的开发过程变得简单,特别适用于快速应用程序开发。

本章将简要介绍Python语言的特点、基本语法以及Python语言与Abaqus的关系。因本书的侧重点是基于Python语言的Abaqus GUI程序开发,故对Python语言的基本语法不做过多介绍,更加详细、全面的Python语言语法请参考专门的Python语言书籍。2.1 Python语言的特点

作为目前最流行的开源系统之一,Python拥有一个很大很活跃的开发团队,Python语言每年都以惊人的速度进行版本更新和开发改进。其简洁性和易用性以及高效的开发效率使得Python受到越来越多用户的青睐。Python语言都有哪些优点呢?1.面向对象

Python是一种面向对象的编程语言,它的类模块支持多态、操作符重载和多重继承等高级概念,并且以Python特有的简洁的语法和类型,OOP使用十分简单。2.简单高效

Python语言的代码简洁,易于阅读,相对于C、C++和Java等编译/静态类型语言,Python的开发效率提高了很多,Python的代码大小往往只有C++或者Java代码的1/5到1/3,大大减少了程序开发者编写、调试及维护代码的时间。另外,Python可立即执行,不需要其他语言所必需的编译和链接等中间步骤,具有快速调整的能力,在修改代码后能立即看到程序改变之后的效果。3.可移植性

绝大多数Python程序不需要做任何修改就可在所有主流计算机平台上运行。在Linux和Windows之间移植代码,只需要简单地在机器间复制代码即可。如今从PDA到超级计算机,到处可以见到Python程序的运行。4.免费

Python的使用和分发都是完全免费的,用户可以从Internet上免费获取Python系统的源代码。“免费”并不代表“无支持”,恰恰相反,Python有其专业的开发团队,对用户需求的响应和商业软件一样快。5.可混合编程

Python程序可以通过多种方式轻易地与其他语言编写的组件粘接在一起。例如Python的C语言API可以帮助Python程序灵活地调用C语言程序。6.动态性

Python语言中,直接赋值就可以创建一个新的变量,而不需要类似C语言一样的变量声明。

除了上述诸多的优点,Python语言也存在自身的缺点,在现有的实现方式上,与C和C++这类编译语言相比,Python的执行速度还不够快。目前Python的标准实现方式是将源代码的语句编译为字节码的形式,之后再将字节码解释出来,由于字节码是一种与平台无关的格式,因此字节码具有可移植性。然而,因为Python没有将代码编译成底层的二进制代码,一些Python程序将会比C语言这样的完全编译语言慢一些。不过,随着计算机硬件的发展,计算机处理速度越来越快,Python开发速度带来的效益往往比其执行速度带来的损失更为重要。2.2 Python与Abaqus

Abaqus作为国际公认的大型通用非线性有限元软件之一,被广泛应用于机械制造、航空航天、汽车交通、船舶、土木工程、能源矿产、医疗卫生以及日用家电等诸多领域。随着Abaqus应用领域及用户的不断拓展,软件自身提供的功能往往不能满足一些特殊的使用要求。为了进一步满足不同用户在软件使用过程中不断产生的新需求,Abaqus软件为用户提供了开放的二次开发接口,包括基于FORTRAN语言的用户子程序接口和基于Python语言的脚本接口。前者主要是方便用户开发自定义材料模型、自定义单元、自定义输出变量以及复杂载荷等,其影响的是CAE分析过程中的求解环节;后者主要是方便用户根据自身的需求开发前后处理工具(GUI程序)或者辅助用户实现参数化的建模以及数据处理等工作,其影响的是CAE分析过程的前后处理环节。

Abaqus在继承Python原有库函数的基础上,进一步扩展了Python的库函数,通过调用这些库函数,可绕过Abaqus/CAE界面,直接操纵Abaqus的内核程序,实现快速前处理建模及后处理功能。

Abaqus脚本接口可以通过以下多种方式与Abaqus/CAE内核程序进行交互(如图2.1所示)。(1)图形用户界面(GUI):在自定义对话框中设置或选择参数,适用于复杂、系统、完整功能实现。本书第四、五、六章将详细讲述GUI 控件的使用方法以及GUI插件程序和GUI应用程序的开发。(2)主窗口下部命令交互界面(CLI):适用于单句或者多句简单指令执行。本书第二章及第三章中的简单实例多采用这种方式。(3)执行脚本文件(script):适用于相同指令重复执行的情况。本书第二章及第三章中的复杂实例以及GUI插件的内核执行文件均采用这种方式进行测试。图2.1 命令流与ABAQUS/CAE内核关系图

本书的第二章和第三章主要是通过CLI和script两种方式与Abaqus/CAE内核程序进行交互,后续章节主要采用GUI的形式与Abaqus/CAE内核程序进行交互。GUI界面的创建基于Abaqus GUI Toolkit ,它是Abaqus专为二次开发提供的GUI工具包,提供了大量的窗体控件,并给出了各个控件的组成部分以及创建该控件的方法。同时,GUI工具包也是FOX GUI Toolkit 的扩展,它允许用户修改和扩展Abaqus/ CAE的功能,以便更有效率地运用Abaqus解决问题。Abaqus脚本接口扩展了Python自身的对象模型,丰富了其函数库,使得Abaqus的二次开发更为快捷。

简单地讲,Abaqus软件通过提供Python语言的脚本接口可以实现以下功能。(1)参数化的建模。通过编写脚本实现模型的参数化建模,当某些参数发生变化时,只需要在脚本文件中对相应参数进行修改并重新执行脚本文件即可完成重新建模工作,可以避免因修改参数引起的大量手动重复操作。(2)参数学习。在参数化模型的基础上,通过改变某些特征参数,并以脚本的形式反复提交计算并输出结果,可以分析目标变量随着某些参数的变化历程,当达到指定的目标值时停止计算,输出最终的优化结果。(3)创建GUI插件程序。插件程序是Abaqus二次开发中较为简单的GUI 开发类型,用户可以借助RSG对话框构造器快速地创建GUI 图形界面。有关插件程序的开发内容详见本书第五章“插件程序开发指南”。(4)用户自定义GUI应用程序开发。用户自定义GUI 程序开发是Abaqus二次开发中一类高级的GUI开发方式,应用程序中可以集成多功能组件、多模块、多类GUI工具包,适合用于复杂的应用平台开发。有关自定义GUI应用程序的详细内容请参照本书第六章“用户自定义GUI应用程序开发指南”。2.3 Python的编码规则2.3.1 代码缩进

在一般的编程语言中,例如,C、C++、FORTRAN、VB以及Java等语言,代码的缩进是程序员个人主观的编程习惯,它可以辅助程序员清晰辨别代码块,快速阅读和理解代码,代码的缩进位置不会影响程序的执行。但是在Python语言中,代码的缩进是一种语法,Python依靠每行代码的缩进位置来判断代码的分块、区分代码块之间的层次关系,错误的缩进位置将会导致程序执行错误,通常在出现由于缩进位置导致的错误时系统会提示“IndentationError”。

例如,下列代码中根据缩进位置的不同一共划分了三级代码块,含有相同缩进位置的代码行归属于同一级代码块。 x=3 if x: y=5 if y>x: print '三级代码块' print '二级代码块' print '一级代码块'

提示

Python语言中的if语句在结尾处没有end if等结束语,这一点与其他语言有较大差异,其代码分块完全依赖于每行的缩进位置。2.3.2 代码注释

代码注释是一个完整程序所不可缺少的一部分,它可以辅助程序员或者其他阅读程序的人理解程序的意义,一般越复杂的程序,其注释行就越多。

在Python语言中,如果只是对某一行进行注释,则在行首使用“#”开头即可,只要“#”不是出现在字符串常量中,Python会忽略“#”之后的所有文字。例如:【实例2.1】注释方法 p = mdb.models[‘Model-1’].parts[‘Part-1’] e=p.elements #指向零件'Part-1'的所有单元2.3.3 分隔符及续行符

在Python语言中,一般是通过换行来识别语句的结束,也可以在每一条语句的结尾用分号来标识。例如,下面两条赋值语句都是正确的。【实例2.2】分隔符 a=5 b=6;

但是,如果在一行中有多条语句时,分号是不可以省略的,例如: a=1; b=2; c=3

另外,如果单个语句太长时,可以使用续行符“\”将多行进行连接,例如:【实例2.3】续行符 e=mdb.models['Model-1'].parts['Part-1'].elements #单行模式 e = mdb.models['Model-1'].\ parts['Part-1'] .\ elements #续行模式2.4 内置对象类型

Python语言中提供了强大的对象类型作为语言的组成部分,内置对象使得程序编写更加容易,并且内置对象往往比自己定制的数据结构更有效率。Python语言中主要有如表2.1所示几类对象类型。表2.1 Python内置对象类型2.4.1 数字

Python语言中的数字类型包括整型、浮点型、复数型等,与一般的C、C++等语言没有太大的区别,以下是几类数字类型的内置对象定义方法。【实例2.4】定义数字类型 >>>a=5+5 #定义整形数据 >>>a 10 >>>b=5**35 #长整型数据 >>> b 2910383045673370361328125L >>> c=3.14 >>> c 3.14 >>>n=(5+4j)+(5+8j) #定义复数类型数据 >>>n (10+12j) >>>type(n) #查询数据类型

符号>>>表示代码在Abaqus GUI命令行交互窗口或者Abaqus PDE命令输入窗口中输入代码,符号>>>不是代码的组成部分。2.4.2 字符串

字符串型数据一般用单引号或者双引号包络,并且单引号以及双引号必须成对出现。另外,当字符串内部包含有单引号或者双引号时,需要通过转义符“\”实现,例如: >>>Str='what's up with him' #语法错误 >>>Str='what\'s up with him' #正确格式 >>>Str="what\'s up with him" #正确格式

有关转义字符“\”的使用方法读者可以参考其他Python语言的语法书,此处不再赘述。除了转义字符之外,字符串还支持格式化的替代表达,可以用一个变量或者表达式替代字符串中的部分字符,操作符为“%”。

格式化操作符“%”的使用方法如下。(1)在“%”操作符的左侧放置一个需要进行格式化的字符串,这个字符串带有一个或者多个嵌入的转换目标,都以“%”开头(例如,%、%f、%s等)。(2)在“%”操作符的右侧放置一个(或多个,多个时需要嵌入到一个元组中)对象,这些对象将会插入到左侧想让Python进行格式化替代的字符串对应位置上去。

以下是格式化操作符的使用实例。【实例2.5】格式化表达 >>> str='%s, apple' % 'orange' >>> str 'orange, apple' >>> n=8 >>> str='%i apples' % n >>> str '8 apples' >>> 'pi=%f, g=%f' % (3.14, 9.18) 'pi=3.140000, g=9.180000'

表2.2所示的是Python语言中的字符串格式化代码,其中大部分与C语言相似,另外,表中一些格式化代码为同一类型的格式化提供了不同的格式选择,例如,%e、%f都可以表示浮点型数据,但是显示格式分别为指数型和浮点型,另外虽然%e和%E都是科学计数法的形式,但是有大小写的区分。表2.2 字符串格式化代码

除了单引号和双引号字符串之外,Python中还有一种特殊的三重引号内的字符串常量格式,也被称作块字符串,这是一种对编写多行文本数据来说很便捷的语法。这种字符串以三重引号“'''”开头,并紧跟任意行数的文本,最后以同样的三重引号“'''”作为结尾。【实例2.6】三重引号的用法 >>> str='''abc ...def ...ghi ...xyz''' >>> str 'abc\ndef\nghi\nxyz'

可以看出,上述定义的字符串中包含四行,Python会把三重引号内部的文本收集到一起形成一个单独的多行字符串,并在代码换行处嵌入了换行字符“\n”。三重引号字符串在程序需要输入多行文本的时候是很有用的,例如嵌入多行注释信息,另外也可以通过三重引号来废除多行代码,使其无效,当需要再次使用该部分代码时,只需要将三重引号去掉即可,这样就避免了每行行首都需要添加“#”注释带来的不便。例如:【实例2.7】使用三重引号注释以及废除代码 '''以下几行代码的主要作用是创建菜单栏 并在菜单栏添加子菜单''' menu = AFXMenuPane(self) AFXMenuTitle(self, '主菜单', None, menu) AFXMenuCommand(self, menu, '子菜单一', afxCreatePNGIcon(r"icon\icon1.PNG"), myForm1(self), AFXMode.ID_ACTIVATE) AFXMenuCommand(self, menu, '子菜单二', afxCreatePNGIcon(r"icon\icon2.PNG"), myForm2(self), AFXMode.ID_ACTIVATE) ''' subMenu = AFXMenuPane(self) AFXMenuCascade(self, menu, '子菜单三', None, subMenu) AFXMenuCommand(self, subMenu, '子项目1', None, self, AFXMode.ID_ACTIVATE) AFXMenuCommand(self, subMenu, '子项目2', None, self, AFXMode.ID_ACTIVATE) '''

另外,在使用Python读取文本时,经常需要按照一定的规则将每一行数据拆分成一系列子字符串,这种情况下通常需要使用split()函数来实现对一个长字符串的切分。【实例2.8】split()分割字符串 >>> A="a b c d e f" >>>B=A.split() #以空格键对字符串进行分割 >>> B ['a', 'b', 'c', 'd', 'e', 'f']

上述情况下,字符串内部两个非空字符间的空格数量对分割结果没有影响,例如: >>>A="abcde f" >>> B ['a', 'b', 'c', 'd', 'e', 'f']

另外,当字符串中有具有分隔特征的符号时,例如逗号或者分号等,可以使用这些分隔符号对字符串进行分割。但是需要注意的是,当使用特定的分隔符进行分割时,空字符不会被忽略。 >>> A="a;b; c; d; e ;f" >>>B=A.split(";") #用分号进行切分 >>> B ['a', 'b', ' c', ' d', ' e ', 'f'] >>>A="a,b,c,d,e, f" >>>B=A.split(",") #用逗号进行切分 >>> B ['a','b','c','d','e',' f'] #空字符未忽略2.4.3 元组

元组型数据(tuple)由一系列元素组成,且对每个元素的数据类型不做限制,可以使用字符串、整型、浮点型的混合。元组在建立时,以小括号包括逗号(,)进行间隔,并且可以是多维数据。元组中的元素一旦确定是不允许修改的。【实例2.9】元组的定义及使用 >>> one=('A') >>> type(one)

注意上述代码中,小括号内没有逗号,所定义的类型为字符串型。 >>> one=('A',) >>> type(one)

小括号内添加逗号,所定义类型便成为元组型。 >>>pets=(("dog",2),("cat",3),("hamster",5)) #创建多维元组 >>> len(pets) 3 #其长度是按照第一维数据计算 >>>pets[2][0] #调用元组中的某一个数据 'hamster'

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载