TWaver3D 编辑器的使用(二)—— 定制模板module

news/2024/5/18 21:35:47 标签: module, function, 扩展, encoding, signal, object
      在TWaver3D编辑器的设计中,借助于ModuleManager实现了模块(module)的动态加载,这样用户可以自定义扩展3D模板,用于增加可编辑对象,提高编辑器能力。那么如何来扩展这些模板呢,让我来带领大家认识一下Editor的动态module应用机制。

      在TWaver3D产品包中,发布出两个模板模块,分别命名为room和equipment。

 


      这两个模块分别完成房间模型,设备模型的模板置入,Editor加载了这两个模块之后,就会出现下面的模型分组,用户可以从分组中拖拽出自己期望的模型对象到编辑场景中去,实现3D场景的可视化编辑。

 


      但是在实际应用的时候,用户需要用更多的模型模板来做场景编辑,例如新的设备,新的房型等,这时能不能由用户进行模型模板的扩展呢?
      例如客户需要向设备上添加一个信号灯对象,那么如何把这种模型模板添加到TWaver的3D编辑器中?
      首先,用户需要打开IDE环境,创建一个module文件。(以FlashBuilder为例)



      我们将之命名为Signal.mxml,
      然后,需要在开发工程中引入必要的开发包,TWaver提供3个必要的包,分别是TWaver.swc, TWaver3D.swc和 EditorLib.swc。


      这样我们就可以按照Editor的动态模块机制来进行自己的扩展了。
      下面我们就来开始自己扩展一个模块,用于向Editor中注入信号灯模型。
      第一要求实现EditorLib中定义的一个接口IResources。向我们生成的Signal.mxml文件头中添加implements=”module.IResources”

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx" layout="absolute" implements="module.IResources">

</mx:Module>

     IResources的定义如下:

public interface IResources{
//初始化函数。模块被加载后,自己需要执行的初始化动作
function init():void;
//模块名
function getName():String;

function getInfo():String;
//模型需要的贴图集合,以key-value的映射方式进行存储
function getImages():Object;
//模块中包含的全部的模型对象的描述
function getItems():Array;
//。
function exportClasses():Array;
}

    然后我们来做实现代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/mx" layout="absolute" width="400" height="300" implements="module.IResources">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import extentdata.SignalData;
import extentdata.XYData;

import module.ResourcesConsts;
import module.ResourcesItem;
[Embed(source="demo/images/signal.png")]
public static const SignalIcon:Class;
public function init():void
{
}
public function getName():String
{
return "信号灯资源包";
}
public function exportClasses():Array{
return [extentdata.SignalData];
}
public function getImages():Object
{
var classInfo:XML=describeType(Signal);
var imageMap:Object=new Object();
for each (var c:XML in classInfo..constant)
{
var name:String=c.@name;
imageMap[name]=Signal[name];
}
return imageMap;
}
public function getXYItems():Array
{
var array:Array=new Array();
var item:ResourcesItem=new ResourcesItem();
//用于在Editor的属性表中绑定模型对象的属性,可以无限增加
item.addModelProperty("width","直径");
item.addModelProperty("altitude","深度");
//指明信号灯对象默认的大小
item.length=15;
item.width=15;
item.height=15;
//填充的信号灯模型所属的分组名
item.category="信号灯";
//在模型模板分组中用来表示信号灯的图片
item.icon="SignalIcon";
//在模型模板分组中,信号灯对象的tooltip
item.tooltip="信号灯";
item.name = item.tooltip;
//用来表示模型对象的数据类型
item.clazz = extentdata.SignalData;
//需要通过Editor进行配置的client property,可以无限增加
item.addClientProperty("bid", "BID");
//声明模型对象在xy平面上进行操作
item.type=ResourcesConsts.TYPE_XY;
array.push(item);
return array;
}
public function getItems():Array
{
var array:Array=new Array();
array=array.concat(getXYItems());
return array;
}
]]>
</fx:Script>
</mx:Module>

      然后我们就可以在IDE下编译我们写的这个新module了,打包称为Signal.swf。接着把这个swf文件放在Editor.swf的同目录下,就可以直接加载了。


       加载成功之后,就会在模型模板库中看到新添加的信号灯对象。

     这时我们就可以直接在编辑器中使用信号灯,向原有模型中添加了信号灯对象了。


      让我们来看看添加信号等前后的不同:
–>

      添加完信号灯,就可以将图纸保存出来。在监控系统中,加载这个图纸,通过程序可以找到信号灯对象,然后根据采集到的数据,动态修改信号灯的颜色,就可以实现实时显示监控信息了。
      注:本文中用到的相关扩展文件可以在TWaver 3D产品下载包中获取,另外例子的完整代码可以从这里下载。
扩展module代码


http://www.niftyadmin.cn/n/1765858.html

相关文章

hdu 4419 线段树 扫描线 离散化 矩形面积

1 //离散化 扫描线 线段树2 //这个线段树跟平常不太一样的地方在于记录了区间两个信息&#xff0c;len[i]表示颜色为i的被覆盖的长度为len[i]&#xff0c; num[i]表示颜色i 『完全』覆盖了该区间几层。len[i]起传递儿子与父亲的关系&#xff0c;而num[i]不起传递作用&#xf…

TWaver网元动态转动效果

最近有客户提了一个网元动态旋转的需求&#xff0c;用TWaver实现起来还是很方便的&#xff0c;效果如下图所示&#xff1a; 主要实现功能&#xff1a; 1:网元动态旋转 2:网元选中效果&#xff0c;被选中网元快速转到最前端后停止旋转&#xff0c;取消选中自动重启旋转 3:根据鼠…

设备的3D化展示

现在收到的关于3D应用的需求主要集中在了4个方面&#xff0c;一是室外场景的再现&#xff0c;二是室内布局的呈现&#xff0c;三是单个设备对象的3D化呈现&#xff0c;四是空间交互。针对第三种需求&#xff0c;很多人都提出了设备打开动作&#xff0c;移出动作的需求&#xff…

小波分解及其Python实现方法

小波分解及其Python实现方法 摘要&#xff1a; 小波分解是一种信号处理方法&#xff0c;可以将信号分解为不同频率和时间分辨率的小波系数。在本文中&#xff0c;我们将详细介绍小波分解的原理和算法&#xff0c;并使用Python编程语言演示实现。我们将介绍小波函数的选择、离散…

替换TWaver中Tree展开合并图标

TWaver最大的优点之一是“ 灵活的定制功能”。光说不练不行&#xff0c;来个例子演练一下&#xff1a;定制Tree节点的标签。 默认Tree和Network上的标签显示的是网元的name属性&#xff0c;设置Styles.TREE_LABEL属性后&#xff0c;可以让Tree显示Styles.TREE_LABEL的值&#…

一个华为人写的忠告

一、“从小事做起&#xff0c;学会吃亏&#xff0c;与他人合作。   二、“心有多大&#xff0c;舞台就有多大。   三、“好好学习&#xff0c;天天向上"。   四、勇于实践&#xff0c;勇于犯错&#xff0c;善于反思。   五、要有方法、有套路&#xff0c;对问题系…

修改MySQL默认字符集

今天发现有库级字符集和表级字符集&#xff0c;实验了下发现&#xff0c;库级字符集是该库内表的默认字符集&#xff0c;当创建表时&#xff0c;如果未指定字符集&#xff0c;默认使用该表所属库的字符集。表也可使用不同于所属库的字符集。 MySQL对于字符集的指定可以细化到一…

oracle 10g WMSYS.WM_CONCAT 函數的用法

select t.rank, t.Name from t_menu_item t;10 CLARK10 KING10 MILLER20 ADAMS20 FORD20 JONES20 SCOTT20 SMITH30 ALLEN30 BLAKE30 JAMES30 MARTIN30 TURNER30 WARD-------------------------------- 我们通过 10g 所提供的 WMSYS.WM_CONCAT 函数即可以完成 行转列的效果selec…