(Demo3D 学习笔记)案例1:自创组件,可以一键自动连接场景中的其他相关组件

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() 函数的用法。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值