- 积分
- 35
- 注册时间
- 2004-10-14
- 仿真币
-
- 最后登录
- 1970-1-1
|
本帖最后由 姜虎东 于 2009-8-17 10:51 编辑
第一次提到的插入结果集的代码,是通过循环suppress所有其他的零件,然后针对当前选中零件插入结果集,最后再恢复零件的初始suppress状态。这个代码在求解之前运行没有一点问题,但是如果已经求解完成,再插入这个代码的时候就会要求重新求解,即使是Evaluate All Results都不行。
所以就有了下面这个改进的代码,想法是不管求解前还是求解后,运行这个代码不影响当前求解的状态。
这个代码的思路是,1)获得当前模型的Assembly,2)获得这个Assembly下的所有零件,3)如果零件的状态时suppressed的则略过,4)选定零件加入到SelectionManager中,SelectionManager只有当前这一个零件,5)添加结果集。
// improved code for insert-results
var branchObj =DS.Tree.FirstActiveBranch;
// Set up standard things
var project = branchObj.Project;
var model = branchObj.Model;
var environment = branchObj.Environment;
var protoGroup = branchObj.PrototypeGroup;
var asm=protoGroup.Assembly;
var answer=environment.AnswerSet
var id_TotalDisplacement = 25;
var id_EquivalentStress=1;
var id_MaximumPrincipalStress=2;
SM.Clear();
var Parts = asm.Parts(true);
for(var PartIdx=1; PartIdx <= Parts.Count; PartIdx++)
{
var Part = Parts.Item(PartIdx);
var proto=protoGroup.Prototypes.Item(PartIdx);
if(proto.Suppressed)
continue;
//这两行代码不是很懂,特别是BRep.Cells不知道什么意思。这两行代码是在
//DSMenuScript.js中的selectByForceAllBodies_CFXMeshLegacy函数中找到的,见后面的代码。
var allBodies = Part.BRep.Cells(3);
SM.ForceSelect(Part.id, allBodies.Item(1).Id);
var dItem=answer.AddResult(SM,id_TotalDisplacement);
dItem.Name="Total Deformation - "+proto.Name;
var sItem=answer.AddResult(SM,id_EquivalentStress);
sItem.Name="Equivalent Stress - "+proto.Name;
//加上这一句,保证每次选择的只有一个零件
SM.Clear();
}
DS.Script.fillTree();
// end of code
请参考在DSMenuScript.js中的函数
functionselectByForceAllBodies_CFXMeshLegacy(branch)
{
//This function requires nodependency on GUI, used with DS in hidden mode
//-- if modifing in the future be sure to retain this concept
var parts = branch.Assembly.Parts(true);
var PartIdx = 1;
var numParts = parts.Count;
for(PartIdx; PartIdx <= numParts; PartIdx++)
{
var part =parts.Item(PartIdx);
var ThisPartBRep = part.BRep;
var allBodies =ThisPartBRep.Cells(3);
var numBodies = 0;
numBodies =allBodies.Count;
var BodyIdx = 1;
for(BodyIdx;BodyIdx <= numBodies; BodyIdx++)
{
var Body =allBodies.Item(BodyIdx);
sm.ForceSelect(part.id,Body.Id);
}
}
}
接下来的代码是用来导出所有结果集(变形和应力)的最大最小值。
代码的思路是,1)创建一个文件,2)获得当前模型的结果集,3)扫描所有结果并把结果的名称,最大值和最小值写入文件。其中名称、最大值和最小值之间用;隔开,以便在EXCEL中打开时可以识别3列。
var branchObj = DS.Tree.FirstActiveBranch;
var project = branchObj.Project;
var model = branchObj.Model;
var environment = branchObj.Environment;
var protoGroup = branchObj.PrototypeGroup;
var answer=environment.AnswerSet
var strAns=answer.Structuralresults;
var i=0;
var itemValue=0;
var fs,f,wf;
//创建文件对象
fs=new ActiveXObject("Scripting.FileSystemObject");
//创建一个指定绝对路径的文件,注意有双斜杠
f=fs.CreateTextFile("d:\\tmpTest\\result.txt",true);
for (i=1;i<=strAns.Count;i++)
{
//一句话写入结果名称,最大值和最小值
f.WriteLine(strAns(i).Name+";"+strAns(i).Maximum+";"+strAns(i).Minimum);
}
//关闭文件
f.Close();
DS.Script.fillTree();
在workbench中可以导出选中的某一个结果最大最小值,但是多选后就不能导出,所以上面代码虽然简单,对于有很多零件的模型而且关心每个零件的最大最小值来说还是蛮有用的。
下次准备说一下关于图片的代码,来快速生成简单的分析报告。
[ 本帖最后由 whatinrain 于 2008-2-6 01:05 编辑 ] |
评分
-
1
查看全部评分
-
|