相信大家经常遇到改输入的问题,本来开开心心订好了若干个温度/载荷/换热等Amp幅值表,算都算完了发现输入要改(都是热工计算小组的锅),于是又开始了苦逼的复制粘贴之旅。
这时候你肯定会想到为啥不直接Marco宏一下。没错,我也是这么想的,然后我打开rpy档一看,(其中--为保密内容)
mdb.models['G5_G9_Temp'].amplitudes['HTC1'].setValues(timeSpan=TOTAL,
smooth=SOLVER_DEFAULT, data=((0.0, --), (7815.6, --), (9000.0,
--), (11790.0, --), (--, --), (--, --), ……
他mua的,这……什么鬼排版,怀念我的matlab,excel数据往里一粘就好。matlab会自动把换行识别为下一行,空格识别为下一列,直接data=[ctrl+v]就ojbk。
当然python库xlrd可以解决这个问题,但是时间紧任务重,还是决定用熟悉的工具来解决这个问题。当前痛点就是,怎么生成(x,y),(x,y),(x,y)这样格式的二维数组。
kiao,这不是用excel加工一下就行了吗,
假设我的源数据是这样的
然后我就用=""&""&""这样搞不就行了
="("&A2&","&B2&")"
然后再把这些()输出成用逗号连接的txt就行了,这matlab里面几行代码搞定的事。当然加括号这个过程你也可以直接在matlab里搞定,但我想着数据这么规整,直接在excel加好了还省我的事是吧。
clc
clear
[~,~,RAW]=xlsread('D:我的文档研务工况.xlsx',3);% 我的加括号数据放在第三个工作表的对应格子了
for i=2:24 % 遍历列 除了第一列时间列
fid=fopen(['D:我的文档研务matlab生成',char(RAW(1,i)),'.txt'],'w');
for j=3:3020 % 遍历行 除了两行标题
fprintf(fid,'%s',char(RAW(j,i)));
if j==3020 % 这个if主要是为了去掉最后一个逗号
else
fprintf(fid,'%s',',');
end
end
fclose(fid);
end
当然这个代码是我实际用的,具体的根据个人来修改就行
然后跑一下就可以得到一系列txt,注意你的标题行不要有不能作为文件名的字符 + / 什么的
里面的内容我就不展示了,反正都是(t,x),(t,x)这样的
之后修改你abaqus里面的marco就行,在setValues指令前面加上读取txt,在后面加上关闭txt,然后把所有幅值表过一遍就行。
f = open('xxxxxxxxxx.txt')
fulltxt = f.read()
mdb.models['G5_G9_Temp'].amplitudes['xxxxxxxxxx'].setValues(timeSpan=TOTAL,
smooth=SOLVER_DEFAULT, data=tuple(eval(fulltxt)))
f.close
当然你也可以改成循环形式的 我就随便写写意思意思
for AmpName in ['xxx','xxx','xxx','xx'这些都是你的幅值表名]
f = open('绝对路径目录'+AmpName+'.txt'这个是你用来找幅值表地址)
fulltxt = f.read()
mdb.models['YourModels'].amplitudes[AmpName].setValues(timeSpan=TOTAL,
smooth=SOLVER_DEFAULT, data=tuple(eval(fulltxt)))
f.close
可能有点曲线救国了,对python熟练的同学使用xlrd就行,我还是比较习惯于matlab的语法,于是借了一下道。
然后如果要更新数据,操作就是:用热工小组更新excel表-用matlab更新txt-用marco更新幅值表 就ok了
最后说一句,matlab才是最好用的语言(雾)