建立EAI方式与SAI方式之间的通信

原创 2002年04月15日 09:07:00
建立EAI方式与SAI方式之间的通信  
解决JAVA控制VRML场景的一个实际问题

侯光敏 (wearebug@etang.com)
2002 年 1 月

搞过java语言对vrml场景控制的人都知道,目前有两种方式对vrml场景进行控制,那就是EAI方式和SAI方式.EAI的全称是External Authoring Interface ,使用这种控制方式可以在applet中一目了然地输入各种参数来改变场景的内容,控制是非常灵活的.SAI方式,它不需要有applet的存在,只要为场景中的物体写相应的脚本代码即可,使用它可以实现许多VRML规范不能提供的复杂逻辑显示.两者可以说是各有所长,但是我在写一个控制VRML场景的程序时遇到了问题.

我在场景中放入了一组芯片模型,我想要达到的目的是,点击场景中的某芯片或某芯片的某管脚时,能在applet中显示芯片的内部结构图或者管脚的名称和电平状态,我必须要使用这些信息来改变相应的模型参数.但是单纯的SAI方式不能和applet通信,点击的结果不能被applet感知.而单纯的EAI方式也解决不了这个问题,因为要控制场景中的某个模型,必须先得到那个模型的名字.但在这种情况下模型的名称不可能被事先指定,它必须随着鼠标选择的变化而变化.要解决这个问题,必须在EAI方式控制和SAI控制之间建立起沟通信息的途径.

在查阅了VRML规范之后,我发现VRML规范中提供了一种供用户扩展的节点类型PROTO,由此我想出了解决这个问题的办法.其实这个办法很简单,就是用PROTO的各个自定义域来缓存需要通信的数据. 具体的做法是:在场景文件中定义一个名为Bridge的PROTO节点,为它增加一系列的域.在我这个具体问题中,我定义了SFString name,SFBool voltage两个域,还有SFSting型的pointA,pointB.然后为每个需要和applet通信的模型加入SAI方式的代码,单击事件(也可以是别的事件)触发一个过程,该过程把模型的名字写入Bridge的name域或pointA,pointB,把状态写入voltage域.

以下是VRML文件示例代码:


#the node that exchange data between SAI and EAI
PROTO Bridge  [ exposedField SFString   pointA "###   ^-- ^"
           exposedField SFString    pointB "###   ^ --^"
              exposedField SFString   name     "null"
              exposedField SFBool     voltage   FALSE

]{}  //
DEF se Bridge{}
.......
DEF leg17 Transform {
  translation 35.5 16.7 -203
  rotation 0.577 0.577 -0.577 -4.19
  children [
      DEF   leg17_touch TouchSensor {}
    Shape {
      appearance USE legcolor
    geometry USE leg17-FACES
    }
  ]
}

......
DEF leg17_S Script {   //芯片第十七号管脚的节点
    url "NodeScript.class"
    eventIn SFBool leg17
    field SFNode node USE leg17
    field SFNode select USE se
}
.....
ROUTE leg17_touch.isActive TO leg17_S.leg17
.....

以下是节点的脚本代码片断:


public class NodeScript extends Script
{
   private SFNode theSelected;
   private SFString selectedA,selectedB;
   Browser br;

   public void initialize()
   {
      theSelected=(SFNode)getField("select");
      br=getBrowser();
   }

   public void processEvent(Event e)
   {  ConstSFBool v=(ConstSFBool)e.getValue();
      Node selected=(Node)theSelected.getValue();
      //**获得交换节点的域
      selectedA=(SFString)selected.getExposedField("pointA");
      selectedB=(SFString)selected.getExposedField("pointB");
      //*/
      br.setDescription(e.getName());  //在浏览器底部显示节点名

    //在此有改动,不使用开关值,改用队列先进先出写值  2001/11/30
     if(v.getValue())
     { selectedB.setValue(selectedA.getValue());//b-->a
       selectedA.setValue(e.getName());         // newValue-->b
     }

   }
}

然后在EAI方式的代码中为applet加入一个线程,它无限循环的读Bridge节点的各个域值然后显示出来,完成了数据从SAI向EAI的传递,就这么简单.以下是示例代码:


public class displayPanel extends Panel implements Runnable
{  public static Label label1 = new Label();
   public static Label label2 = new Label();
   Browser br;
   .......
     public void run()
   {
    while(true) //循环监听点击情况
      { swich=VrmlObject.getSwichName(br);
        voltage=VrmlObject.getSwichVoltage(br);
        displayPanel.label1.setText(VrmlObject.getNodeA(br));//VrmlObject类封装了对节点的访问
        displayPanel.label2.setText(VrmlObject.getNodeB(br));
      }
  }
}

使用这种方式,你可以扩充Bridge的域来缓存各种VRML规范所规定的数据类型.

关于作者
侯光敏:天津理工学院计算机科学与工程系大四学生,正在研究用java和vrml实现多用户协同的虚拟实验室的项目.欢迎和我联系:wearebug@etang.com

建立EAI方式与SAI方式之间的通信

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";...
  • java169
  • java169
  • 2008年05月23日 02:45
  • 177

[操作系统原理] 进程之间8种通信方式

 1无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 2.高级管道(popen):将另一个程序当...
  • u010013164
  • u010013164
  • 2014年05月14日 22:24
  • 2721

4种进程间通信方式详解

进程间通信有4种方式,以下从简单到复杂的方式出场: 1.管道(pipe)     管道是一种具有两个端点的通信通道,一个管道实际上就是只存在在内存中的文件,对这个文件操作需要两个已经打开文件进行,...
  • u014673901
  • u014673901
  • 2016年04月07日 21:09
  • 13544

进程间8种通信方式详解

1 无名管道通信无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。2 高级管道通信高级管道(popen):...
  • violet_echo_0908
  • violet_echo_0908
  • 2016年04月20日 15:34
  • 29044

线程之间的通信方式

前言 说到线程之间通信方式:依据我的理解 主要是有两种吧 1.是通过共享变量,线程之间通过该变量进行协作通信; 2.通过队列(本质上也是线程间共享同一块内存)来实现消费者和生产者的模式来进行通...
  • Leonardo9029
  • Leonardo9029
  • 2016年04月29日 13:11
  • 18050

一般硬件通信的分类方式

我们知道硬件通讯主要就是两个设备之间的交流,这里就做下简单的介绍。 而通信可以分为并行通信和串行通信 并行通信,在同一时刻发送多位数据(可以是多根线)。优点是发送速度快;缺点是传输距离短 资源占用多...
  • faihung
  • faihung
  • 2017年03月04日 12:25
  • 949

JAVA系统之间通信方式总结

据我所知,目前对于Java系统之间通信方式有如下几种: 同步:RMI,Hessian,Burlap,Http invoker 异步:JMS,AMQP RMI: 1.java的远程方法调...
  • BigWatermelon11
  • BigWatermelon11
  • 2017年08月14日 15:24
  • 1000

线程间的通信、同步方式与进程间通信方式

线程间的通信、同步方式与进程间通信方式 字数1771 阅读3355 评论0 喜欢6 1、线程间的通信方式 使用全局变量 主要由于多个线程可能更改全局变量,因此全局变量最好声明为...
  • liu5320102
  • liu5320102
  • 2016年02月29日 12:33
  • 1370

进程间、线程间通信方式小结

之前一直对进程间和线程间的通信方式搞混,今天对它们总结一下。 一、进程间的通信方式 # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。...
  • Alexlee1986
  • Alexlee1986
  • 2014年03月14日 10:40
  • 52785

Service与Activity之间通信的几种方式

转载请注明地址http://blog.csdn.net/xiaanming/article/details/9750689 在Android中,Activity主要负责前台页面的展示,Service...
  • dj0379
  • dj0379
  • 2016年06月05日 14:55
  • 2792
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建立EAI方式与SAI方式之间的通信
举报原因:
原因补充:

(最多只允许输入30个字)