- 积分
- 35
- 注册时间
- 2004-10-14
- 仿真币
-
- 最后登录
- 1970-1-1
|
本帖最后由 姜虎东 于 2009-8-17 10:52 编辑
写报告或许是整个分析过程中最没有成就感的部分, 所以就想怎么样尽可能的敷衍了是。我指的报告是有图片描述的分析结果的powerpoint。显然生成图片和插入到pp中并对其位置是件无聊且麻烦事。虽然Workbench有自带的生产报告器,但生成的报告比较复杂,定制的话需要理解CSS,XML等标记语言。所以在这里用JScript来做快速简单报告。
具体的步骤是,1,对每个结果集插入figure(不是image,image插入后不能调整图片的角度);2,对每个figure调整角度,缩小或放大;3,保存图片到指定目录;4,生成ppt。
其中1,3,4都可以半自动完成,2必须手动一个一个调整,在用Workbench自带的生产报告器也要有这个步骤的,而且是要花点时间的,。
好了,开始第一步,插入结果集的figure,假设在这之前已经有结果集存在了,可以参考以前说的来快速插入结果集。
这个代码其实重要的就一句ansSet(i).AddFigure();, 其他的都是循环,因为假设有多个model在当前project中,每个model下有多个environment,每个environment下有个结果集。这个代码应该不难,所以不多说了。
var branchObj = DS.Tree.FirstActiveBranch;
var project = branchObj.Project;
var model = branchObj.Model;
var environment = branchObj.Environment;
var protoGroup = branchObj.PrototypeGroup;
// Loop thru the Models if more than 1
for (var modelCount = 1; modelCount <= project.Models.Count; modelCount++)
{
// Loop thru the Environments if more than 1
for (var environCount = 1; environCount <= project.Models(modelCount).Environments.Count; environCount++)
{
var ansSet = project.Models(modelCount).Environments(environCount).AnswerSet.Structuralresults;
for (var i=1; i<=ansSet.Count;i++)
{
ansSet(i).AddFigure();
}
}
}
DS.Script.fillTree();
因为调试的时候要不停地插入删除,所以又写了一段代码专门用来删除figure的。有点奇怪的是,如果是分两次插入的figure,删除的时候只删除了其中一次插入的,在运行此代码才能删除第二次的,不知道是为什么。
var branchObj = DS.Tree.FirstActiveBranch;
var project = branchObj.Project;
var model = branchObj.Model;
var environment = branchObj.Environment;
var protoGroup = branchObj.PrototypeGroup;
var dsScript = DS.Script;
// Loop thru the Models if more than 1
for (var modelCount = 1; modelCount <= project.Models.Count; modelCount++)
{
// Loop thru the Models if more than 1
for (var environCount = 1; environCount <= project.Models(modelCount).Environments.Count; environCount++)
{
var ansSet = project.Models(modelCount).Environments(environCount).AnswerSet.Structuralresults;
//在多个结果集中循环
for (var i=1; i<=ansSet.Count;i++)
{
//每个结果集下可能有多个figure
for (var j=1; j<=ansSet(i).Figures.Count;j++)
{
var dsFigure=ansSet(i).Figures(j);
//选中当前figure
dsScript.changeActiveObject(dsFigure.ID);
//删除
DS.Tree.DeleteItems();
}
}
}
}
DS.Script.fillTree();
第二步,调整图片的视角角度,这个应该不能统一设定吧,象应力集中的地方,每个零件肯定是不同部位不同角度方向的。也可以用代码DS.Graphics.View来调整,调整的参数有如下。如果这样调整视角角度就能满足要求的话,那报告就可以生成的更快了。
var eFront = 0;
var eBack = 1;
var eRight = 2;
var eLeft = 3;
var eTop = 4;
var eBottom = 5;
var eIso = 6;
var eFit = 7;
var eLookAt = 8;
var currIndex = 0;
第三步,保存图片。循环每个model,循环每个environment,循环每个结果集及每个figure,激活选中的figure,延迟一段时间(这是很关键的),保存图片。
var branchObj = DS.Tree.FirstActiveBranch;
var project = branchObj.Project;
var model = branchObj.Model;
var environment = branchObj.Environment;
var protoGroup = branchObj.PrototypeGroup;
var image = DS.Graphics.ImageCaptureControl;
var dsScript = DS.Script;
var fileName;
//.png也可以,.bmp不知道可不可以
var extName=".jpg";
//注意是双斜杠的, 目录可以自己修改
var imgFold="d:\\pictemp\\";
// Loop thru the Models if more than 1
for (var modelCount = 1; modelCount <= project.Models.Count; modelCount++)
{
// Loop thru the Models if more than 1
for (var environCount = 1; environCount <= project.Models(modelCount).Environments.Count; environCount++)
{
var ansSet = project.Models(modelCount).Environments(environCount).AnswerSet.Structuralresults;
for (var i=1; i<=ansSet.Count;i++)
{
for (var j=1; j<=ansSet(i).Figures.Count;j++)
{
var dsFigure=ansSet(i).Figures(j);
dsFigure.Name=ansSet(i).Name+"-"+j.toString(10);
//激活选中的figure
dsScript.changeActiveObject(dsFigure.ID);
//延迟一段时间,简单用了个双循环实现,因为不知道时间延迟的函数,
//workbench要把激活的figure显示在当前图画区,并截取图片。所以运行此代码时不要切换到其他窗口。
for (var m=1;m<1000;m++)
{for (var n=1;n<300;n++)
{var o=m+n;}
}
//为什么文件名取这么长呢,后面有用
fileName=imgFold+project.Models(modelCount).Name+"-"+envSet.Name+"-"+dsFigure.Name+extName;
//保存文件。为了这个函数找了2个星期,:L
image.Write(0, fileName)
}
}
}
}
DS.Script.fillTree();
这一步运行后,可以到指定的目录去看看是否有了图片,是否图片跟设定的figure都相同。
最后一步,生成ppt。这一步其实跟workbench没有多大关系了,而且用到的是PowerPoint.Application对象和FileSystemObject对象。
var branchObj = DS.Tree.FirstActiveBranch;
var project = branchObj.Project;
//生成FileSystemObject对象
var fso = new ActiveXObject("Scripting.FileSystemObject");
//指定图片所在目录
var reportSubFolderPath = "d:\\pictemp\\";
var oPPT, oPres;
try
{
//创建PowerPoint.Application对象
oPPT = new ActiveXObject(" PowerPoint.Application");
}
catch(e)
{
//如果不行显示出错信息
WBScript.Out("Something Wrong",true);
}
//添加一页
oPres = oPPT.Presentations.Add(true);
oPres.Slides.Add(oPres.Slides.Count + 1, 1);
var objTitle = oPres.Slides(1);
//把project名称显示在第一页
objTitle.Shapes(1).TextFrame.TextRange.Text = project.Name;
//获得指定目录对象。这说的可真别扭,意思是你给定了一个目录字符串,根据FileSystemObject对象来生成这个目录的对
//象,这样的话,可以通过这个对象来访问这个目录下的文件,以及这个目录的属性。
var reportSubFolder = fso.GetFolder(reportSubFolderPath);
//获取这个目录下的所有文件并一个一个读取
for(var enumFiles = new Enumerator(reportSubFolder.Files); !enumFiles.atEnd(); enumFiles.moveNext())
{
var sourceSubFile = enumFiles.item();
var ext = "";
var ps = sourceSubFile.Name.indexOf(".");
//获得后缀名
ext = sourceSubFile.Name.substring(ps+1);
if ( ext != "jpg") continue;
//增加一页
oPres.Slides.Add(oPres.Slides.Count + 1, 11);
//把文件名当作图片描述来显示,文件名去掉了后缀
oPres.Slides(oPres.Slides.Count).Shapes(1).TextFrame.TextRange.Text = sourceSubFile.Name.substring(0,ps);
//添加图片啦,图片要指出绝对路径
oPres.Slides(oPres.Slides.Count).Shapes.AddPicture (reportSubFolderPath + sourceSubFile.Name, false, true, 110, 135, 512,386);
}
//显示ppt
oPPT.Visible = true;
一共分了四次讲workbench JScript,也只是把我知道的报告了一下。如果下次找到其他好玩的JScript应用,会继续和大家分享。打完收工。
[ 本帖最后由 whatinrain 于 2008-3-8 02:49 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
评分
-
1
查看全部评分
-
|