找回密码
 注册
Simdroid-非首页
查看: 1858|回复: 36

[实例赏评] Workbench JScript---快速生成简单报告

[复制链接]
发表于 2008-3-8 02:48:35 | 显示全部楼层 |阅读模式 来自 加拿大
本帖最后由 姜虎东 于 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

查看全部评分

发表于 2008-3-8 05:26:16 | 显示全部楼层 来自 瑞典
Simdroid开发平台
又见whatinrain兄出手,又见精品。
回复 不支持

使用道具 举报

发表于 2008-3-23 17:40:49 | 显示全部楼层 来自 江苏南京
学习了,多谢
回复 不支持

使用道具 举报

发表于 2008-9-1 16:25:35 | 显示全部楼层 来自 广东深圳
可以不才<看不怎么懂!
回复 不支持

使用道具 举报

发表于 2008-9-12 22:27:02 | 显示全部楼层 来自 新疆乌鲁木齐
楼主水平真高,我们想你学习
回复 不支持

使用道具 举报

发表于 2008-9-14 12:53:46 | 显示全部楼层 来自 重庆永川区
楼主很强啊
回复 不支持

使用道具 举报

发表于 2008-9-19 17:26:20 | 显示全部楼层 来自 北京
开眼了。
回复 不支持

使用道具 举报

发表于 2008-11-9 22:46:20 | 显示全部楼层 来自 北京
受益匪浅!关于jscript的相关资料的确太少,希望以后能多见到这类东西!
回复 不支持

使用道具 举报

发表于 2008-11-27 11:21:12 | 显示全部楼层 来自 广东深圳
确实不错!
回复 不支持

使用道具 举报

发表于 2009-4-18 00:31:36 | 显示全部楼层 来自 北京
谢谢,很有用的东西
回复 不支持

使用道具 举报

发表于 2009-5-6 18:21:57 | 显示全部楼层 来自 湖北鄂州
楼主很牛啊 有没有联系方式之类的
小弟最近也在做workbench二次开发
想找楼主请教下啊
本人qq283022397
回复 不支持

使用道具 举报

发表于 2009-5-7 16:49:28 | 显示全部楼层 来自 陕西西安
好东西,我对这方面很感兴趣!希望斑竹指教
回复 不支持

使用道具 举报

发表于 2009-5-29 16:22:30 | 显示全部楼层 来自 湖南湘潭
精品!学习一下
回复 不支持

使用道具 举报

发表于 2009-7-17 11:06:12 | 显示全部楼层 来自 上海
不错,学习了。
回复 不支持

使用道具 举报

发表于 2009-8-4 21:57:35 | 显示全部楼层 来自 上海杨浦区
好东东,学习了
回复 不支持

使用道具 举报

发表于 2010-3-22 10:32:16 | 显示全部楼层 来自 韩国
只有图呵,没有其他内容
回复 不支持

使用道具 举报

发表于 2010-3-22 12:52:00 | 显示全部楼层 来自 北京海淀
谢谢whatinrain斑竹
回复 不支持

使用道具 举报

发表于 2010-6-26 16:18:14 | 显示全部楼层 来自 江苏扬州
原创就是要支持~~
回复 不支持

使用道具 举报

发表于 2010-10-6 13:31:12 | 显示全部楼层 来自 湖北武汉
牛人,小弟佩服
回复 不支持

使用道具 举报

发表于 2010-10-7 11:46:50 | 显示全部楼层 来自 陕西西安
很有用,牛人
1# whatinrain

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-20 09:44 , Processed in 0.057650 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表