Abaqus二次开发过程中,最常用的有两类进度条。
- 一类是创建于内核文件中.用于监控内核指令执行进程的进度条,通过milestone()函数实现。
- 另一类是传统的进度条AFXProgressBar,创建于图形界面文件中。下面分别介绍两类进度条的使用方法。
1.内核文件中使用milestone()函数创建进度条
1.1基本语法
- milestone(message,percent) #以百分比的形式显示进度
- milestone(message,object,done,total) #同时以数量和百分比显示进度
其中,message代表在提示区的提示消息,percent为百分比的整数部分,object为元素的计量单位,done表示动作已完成数量,total代表需要完成的动作总数。
1.2 实例展示
1.3 操作方法
任意打开一个模型文件:
运行脚本文件:
# -* - coding:UTF-8 -*-
p=mdb.models['Model-1'].parts['Part-1']
e=p.elements
N=len(e)
k=0
for e1 in e:
print e1.label
k=k+1
milestone('已完成打印百分比为',100*k/N)
对代码进行修改:
# -* - coding:UTF-8 -*-
p=mdb.models['Model-1'].parts['Part-1']
e=p.elements
N=len(e)
k=0
for e1 in e:
print e1.label
k=k+1
milestone('单元号打印进度:','个',k,N)
1.4 注意事项
milestone()函数适用于任何可计量的内核执行程序,使用方法简单快捷。
但是当同时使用两个milestone(函数时,会出现由于两个进度条叠加引起的闪烁,在编写程序时,应避免此类问题。
2.在图形界面中用AFXProgressBar创建进度条控件
该类型进度条控件无法在RSG对话框构造器中直接创建,需要用户自己编写GUI命令来实现。其创建方法如下。
2.1 基本语法
AFXProgressBar(p, tgt=None, sel=0, opts=FRAME_SUNKEN|FRAME_THICK,x=0,y=0,w=0, h=0,pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD)
其中 opts参数可以控制进度条的显示类型,AFXPROGRESSBAR_SCANNER代表扫描型,AFXPROGRESSBAR_ITERATOR代表迭代型,AFXPROGRESSBARPERCENTAGE表示百分比型。
2.2 实例展示
点击“开始读取”之后:
2.3 代码展示
界面文件【testProgressBarDB.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 testProgressBarDB(AFXDataDialog):
ID_START = AFXDataDialog.ID_LAST
def __init__(self, form):
AFXDataDialog.__init__(self, form, '测试进度条',
self.OK|self.CANCEL, DECOR_RESIZE|DIALOG_ACTIONS_SEPARATOR)
#主窗口
FXButton(self, '开始读取', None, self, self.ID_START)
#创建按钮
FXMAPFUNC(self, SEL_COMMAND, self.ID_START, testProgressBarDB.onDoSomething)
#消息映射
self.scannerDB = ScannerDB(self)
#定义执行函数
def onDoSomething(self, sender, sel, ptr):
self.scannerDB.create() #生成进度条
self.scannerDB.showModal(self)
getAFXApp().repaint()
files =[] #定义一个空列表
for i in range(1,10000):
files.append('file_%d.txt' % (i)) #往列表里添加元素
N=len(files) #获取列表的长度
self.scannerDB.setTotal(N) #调用setTotal函数设置进度条总进程数
for i in range( 1, N+1 ):
self.scannerDB.setProgress(i) #setProgress实时刷新进度条显示值
self.scannerDB.hide()
class ScannerDB(AFXDialog):
def __init__(self, owner):
AFXDialog.__init__(self, owner, '显示进度',
0, 0, DIALOG_ACTIONS_NONE) #创建对话框
self.scanner = AFXProgressBar(self, None, 0,
LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|
FRAME_SUNKEN|FRAME_THICK|AFXPROGRESSBAR_ITERATOR,
0, 0, 200, 22) #创建迭代型进度条
self.scanner2 = AFXProgressBar(self, None, 0,
LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|
FRAME_SUNKEN|FRAME_THICK|AFXPROGRESSBAR_PERCENTAGE,
0, 0, 200, 22) #创建百分比型进度条
'''
self.scanner3 = AFXProgressBar(self, None, 0,
LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|
FRAME_SUNKEN|FRAME_THICK|AFXPROGRESSBAR_SCANNER,
0, 0, 200, 22) #创建扫描型进度条
'''
def setTotal(self, total):
self.scanner.setTotal(total)
self.scanner2.setTotal(total)
#SCANNER型进度条无需设置
def setProgress(self, progress):
self.scanner.setProgress(progress)
self.scanner2.setProgress(progress)
#SCANNER型进度条无需设置
注册文件【testProgressBar_plugin.py】
# -* - coding:UTF-8 -*-
from abaqusGui import *
from abaqusConstants import ALL
import osutils, os
###########################################################################
# Class definition
###########################################################################
class testProgressBar_plugin(AFXForm):
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def __init__(self, owner):
# Construct the base class.
#
AFXForm.__init__(self, owner)
self.radioButtonGroups = {}
self.cmd = AFXGuiCommand(mode=self, method='',
objectName='', registerQuery=False)
pickedDefault = ''
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def getFirstDialog(self):
import testProgressBarDB
return testProgressBarDB.testProgressBarDB(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
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='Test ProgressBar',
object=testProgressBar_plugin(toolset),
messageId=AFXMode.ID_ACTIVATE,
icon=None,
kernelInitString='',
applicableModules=ALL,
version='N/A',
author='N/A',
description='N/A',
helpUrl='N/A'
)