1、模型描述
在场景中自创一个组件,通过该组件,可以一键自动连接场景中的各相关组件。
2、模型布局
首先将自定义组件(绿色)分别连接输送机(左),叉车,输送机(右)后(见左图),通过组件的自定义功能,一键完成输送机(左)连接叉车,再让叉车连接输送机(右)的最终效果(右图)。
3、解决方案
3.1、创建自定义组件
在场景中添加一个Box1,颜色为绿色,高度设置为较小值,使得此Box1呈现扁平状。
对Box1创建自定义属性如下:
定义好后,可以看到此组件的属性栏中只出现了A、B、C、PortA、PortB、PortC 属性(下图左),而 iConnect、iDisconnect 属性类型因为是脚本,故这2个属性实际显示在事件栏中(下图右)。
在自定义组件Box1 的 OnReset 事件中,编写代码如下:
function Box1_OnReset( sender : Demo3D.Visuals.BoxVisual )
{
var portA: CustomEnumeration = sender.PortA; //定义枚举变量
portA.AllowedValues=New ArrayList(["Start","End"]); //定义枚举变量的值
var portB: CustomEnumeration = sender.PortB;
portB.AllowedValues=New ArrayList(["Start","End"]);
var portC: CustomEnumeration = sender.PortC;
portC.AllowedValues=New ArrayList(["Start","End"]);
}
3.2、将自定义组件Box1 的A/B/C点分别进行连接
连接后,再到Box1的属性栏中赋值,其中 PortA="End",PortB="Start",PortC="Start"。
完成上述一系列操作的目的,在于我们接下来编写代码时,需要通过这些属性来引用各实体组件的端口。右下图很明显,A表示左边3个输送机,B表示叉车,C表示右边3个输送机,这样的话,我们可以在代码中通过 A.PortA 方式,就可以引用左边3个输送机 SR1.End、SR2.End、SR3.End 端口,其他类同。
3.3、编写代码
3.3.1、iConnect 事件(一键连接相关实体的端口连接)
在 Box1 的事件栏中找到 iConnect 事件,选择 New;
编写代码如下:
function Box1_iConnect( sender : Demo3D.Visuals.BoxVisual )
{
var a:VisualList=sender.A; //定义数组变量,取值为输送机 SR1/SR2/SR3
var b:VisualList=sender.B;
var c:VisualList=sender.C;
//针对左边每个输送机做循环
for(eachA:Visual in a){
//获取左边单个输送机的端口,因PortA="End",故获取到的是此输送机的输出端口
var aconn:Connector = eachA.FindConnector(sender.PortA.ToString()); //务必要用ToString函数转换为字符串
//针对每个叉车做循环(这里只有1个叉车)
for(eachB:Visual in b){
//获取叉车的端口,因PortB="Start",故获取到的是叉车的输入端口
var bconn:Connector = eachB.FindConnector(sender.PortB.ToString());
//输送机输出端口与叉车输入端口连接
aconn.ConnectTo(bconn,0,1,1);
}
}
//以下代码同上面类似
for(eachC:Visual in c){
var cconn:Connector = eachC.FindConnector(sender.PortC.ToString());
for(eachB:Visual in b){
var bconn:Connector;
if(sender.PortC.ToString()=="Start"){
bconn = eachB.FindConnector("End");
}
else{
bconn = eachB.FindConnector("Start");
}
cconn.ConnectTo(bconn,0,1);
}
}
}
3.3.2、iDisconnect 事件(一键断开相关实体的端口所有连接)
在 Box1 的事件栏中找到 iDisconnect 事件,选择 New,编写代码如下;
function Box1_iDisconnect( sender : Demo3D.Visuals.BoxVisual )
{
var a:VisualList=sender.A;
var b:VisualList=sender.B;
var c:VisualList=sender.C;
//对左边3个输送机做循环
for(eachA:Visual in a){
var aconn:Connector = eachA.FindConnector(sender.PortA.ToString());
aconn.DisconnectAll(); //断开此输送机的所有端口连接
}
for(eachB:Visual in b){
var bconn:Connector = eachB.FindConnector(sender.PortB.ToString());
bconn.DisconnectAll();
}
for(eachC:Visual in c){
var cconn:Connector = eachC.FindConnector(sender.PortC.ToString());
cconn.DisconnectAll();
}
}
3.4、最终效果
3.5、学习小结
3.5.1、创建组件的自定义属性时,类型为 Script 的属性实际是事件,显示在该组件的事件栏中;
3.5.2、枚举变量的定义及取值;
3.5.3、sender.FindConnecter(portName)函数用法,注意 portName 参数是字符串类型。如 portName 是其他类型值,需用 portName.ToString() 方式转换为字符串
3.5.4、端口连接:ConnectTo() 函数的用法,特别注意其中有个允许多端口连接的参数;
3.5.5、断开所有端口连接:DisconnectAll() 函数的用法。