我试图优化某种材料的孔隙度分布。我想想象一下结果。我可以使用' visualize->材料'来可视化不同的材料。但他给每种材料都是随机颜色。我希望最不密集的材料是蓝色,最密集的材料是红色。因此与压力情节相同。
有没有办法在Abaqus中执行此操作?
如果在GUI中没有简单的方法可以做到这一点,我想知道是否可以使用脚本编写?我试图改变一种颜色,导致以下代码:
session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap=session.viewports['Viewport: 1'].colorMappings['Material']
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()
session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap = session.viewports['Viewport: 1'].colorMappings['Material']
cmap.updateOverrides(overrides={'IMPLANT_MATERIAL0':(True, '#FF0000',
'Default', '#FF0000')})
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()
session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap = session.viewports['Viewport: 1'].colorMappings['Material']
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()
答案 0 :(得分:1)
这可能不是完美的方法,但这有效。 限制:
- 您需要手动输入材料数量。
- 您的材料应根据密度排列(mat1,mat2-> density1
- 你应该把你的材料名称放在脚本中(在我的情况下是'Implant')
欢迎提出改进建议,这只是快速而又肮脏。
from math import floor
diminishing_factor = 10 #This factor diminishes the amount of colors to:
amount of materials/diminishing factor. This is necessary
#because apparently abaqus can only handle a limited amount of colors (+-50)
def create_color_lst(amount_of_mat):
color_lst=[]
total_length = 256*4-1 #0 telt ook dus -1
interval = floor(total_length/(amount_of_mat-1)) #*10 because we'll give
10 consequent materials the same color, because abaqus can't handle it
for i in range(0,amount_of_mat):
pos = int(floor(i/diminishing_factor))*diminishing_factor*interval
if pos<256: #Green is rising
col_pos=pos
code = (0,col_pos,255)
elif pos<512: #Blue is diminishing
col_pos=pos-255
code = (0,255,255-col_pos)
elif pos<768:
col_pos = pos - 511
code = (col_pos,255,0)
elif pos<1024:
col_pos = pos - 767
code = (255,255-col_pos,0)
else:
raise ValueError('Color position is too high: '+str(pos))
hex_code='#%02x%02x%02x' % code
color_lst.append(hex_code.upper())
return color_lst
def update_colors(color_lst):
session.viewports['Viewport: 1'].enableMultipleColors()
session.viewports['Viewport: 1'].setColor(initialColor='#BDBDBD')
cmap = session.viewports['Viewport: 1'].colorMappings['Material']
for i in range(0,amount_of_mat):
material = 'IMPLANT_MATERIAL'+str(i)
cmap.updateOverrides(overrides={material:(True, color_lst[i],
'Default', color_lst[i])})
if i%10==0:
print(i)
session.viewports['Viewport: 1'].setColor(colorMapping=cmap)
session.viewports['Viewport: 1'].disableMultipleColors()
amount_of_mat=494 #We can't get this you should always check this! (you
probably could but I'm to lazy to search it)
color_lst = create_color_lst(amount_of_mat) #Creates a list with strings
that contain the color names
update_colors(color_lst) #Updates the display (it's possible that you still
need to go to the display color dialog and press apply)
答案 1 :(得分:1)
如果您正在寻找压力情节可视化等内容,您必须编写自己的 #include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream filestore("customer.dat"); //store data in file
string data1; //store text
int data2; //store integers
cout<<"enter data or press ctrl+z to quit \n";
while(cin>>data1>>data2){
filestore<<data1<<endl;
filestore<<data2<<endl;
}
ifstream fileread("customer.dat");//read data from file
string info1;
int info2;
while(fileread>>info1>>info2){
cout<<info1<<" "<<info2<<endl;
}
return 0;
}
数据。通常更容易将数据直接输出到外部可视化工具,但在Abaqus中执行此操作是可能的(如果不是有点复杂的话)。
一般过程如下:
生成FieldOutput
个对象;语法是FieldOutput
,其中
FO = odbModel.steps.values()[-1].frames[-1].FieldOutput(name=data_name, description=data_description, type=SCALAR)
是一个已打开的odbModel
对象,Odb
或指定的步骤steps.values()[-1]
是您要输出的步骤,steps[...]
是您要在此步骤中输出的最后一帧(或您选择的框架),frames[-1]
和data_name
是字符串(对于压力等高线图,data_description
将等同于odb输出中的标签data_name
)S
是SCALAR
模块获取abaqusConstants
个对象及其相关元素rootAssembly.instance
和elementSet
,这些对象与sectionAssignment
的{{1}}有明确的链接section
它具有material
属性。
density
命令更新FieldOutput
对象;语法是addData
addData(position=CENTROID, instance=instance, labels=labels, data=data)
是来自CENTROID
模块的参数(假设您只想在元素质心处具有元素密度;如果您真的想要,也可以将它们粘贴在积分点上)abaqusConstants
是与元素集关联的实例(或更常见的是使用此材料分配的instance
)region
是一个可迭代的(labels
,list
)整数,用于指定要为其写入数据的关联实例的元素标签tuple
是data
s的可迭代迭代项,用于指定数据。在您的情况下,单个密度值意味着float
是一个长度为1的可迭代迭代,每个迭代包含一个密度值。 data
的长度必须等于data
的长度,因为labels
的每个成员与data
中相同位置的elementLabel
完全对应。 下面的示例脚本(警告:强烈建议您备份labels
,以防某些事情没有成功)
.odb
我不使用密度,但这里是一个模型的杨氏模量输出示例,其中两种材质分配给各种元素。