有疑问或无法实现请留言或私信可以提供解答
背景介绍
本次采用java与NX连接来拉取数据,NX对java的支持采用的是RMI技术(远程方法调用).具体方式是设定一个接口,把这个接口复制两份一个放在服务端,一个放在客户端。当客户端调用本地接口的时候,本地的接口会自动去服务端拉取对应接口的数据。这里面需要注意的是,客户端和服务端接口的package地址必须完全一致,否则无法生效。NX提供了一个RMI调用的例子,代码比较完善可以直接使用。
准备工作
- 将NX提供的java示例搞出来,里面包含了大量java与NX交互的例子。先找到你NX安装地址,然后按照下面地址即可找到(...\UGOPEN\SampleNXOpenApplications\Java)。如果找不到可在NX安装目录下搜素java。
- 将NX提供的java jar包搞出来, 需要将NXOpen开头的jar加载到项目里。与NX的交互就通过这些接口来实现。先找到你NX安装地址,然后按照下面地址即可找到(...\NXBIN)。如果找不到可在NX安装目录下搜索NXOpen.jar
- NX绑定java环境,打开NX软件在左上角点击"文件"-->"执行"-->"替代java参数"。点击第一行后面的文件选择按钮选择java安装地址。地址指向到..\jre\bin\server目录。然后点击"文件"-->"执行"-->"为NX检查java",检验是否成功
- 将NX连接示例搞进项目里。找到 RemotingExample 文件夹。将里面的.java文件搞进项目里。并且把NXOpen开头的jar包一起弄进项目里。
- NXOpen接口文档地址:Open for Java Reference Guide
连接NX
修改NXClient.java 文件
do
{
try
{
//将原文件中的代码替换成下列代码。ip=安装NX软件的那台电脑的ip地址,端口=1089 这是官方默认值
Registry registry = LocateRegistry.getRegistry("xxx.xxx.xx.xx", 1089);
server = (NXRemoteServer)registry.lookup("rmi:// xxx.xxx.xx.xx /" + serverName);
}
catch ( NotBoundException e )
{
time += 1000;
if ( time > bindTimeout )
throw e;
Thread.sleep(1000);
}
catch ( ConnectException e )
{
time += 1000;
if ( time > bindTimeout )
throw e;
Thread.sleep(1000);
}
}
while(server == null);
修改NXRemoteServer.java文件
public void startServer() throws Exception
{
try{
System.out.println("Starting");
NXRemotableObject.RemotingProtocol remotingProtocol = NXRemotableObject.RemotingProtocol.create();
theSession = (Session)SessionFactory.get("Session", remotingProtocol);
theUFSession = (UFSession)SessionFactory.get("UFSession", remotingProtocol);
System.out.println("Got Session");
theSession.listingWindow().open();
theSession.listingWindow().writeLine("Binding Sessionsss");
//将下列两行代码替换掉原来的 Naming.rebind("//" + host + "/" + serverName, this);
//ip地址必须跟NXClient.java文件中的完全一致
Registry registry = LocateRegistry.createRegistry(1089);
registry.rebind("rmi:// xxx.xxx.xx.xx/" + serverName, this);
theSession.listingWindow().writeLine("Session bound");
System.out.println("ready");
}catch(Exception e){
e.printStackTrace();
theSession.listingWindow().writeLine(e.getMessage());
}
}
打包jar文件
把当前项目打包成jar文件。main方法指向到NXRemoteServerImpl文件中的main方法
执行jar文件
打开NX软件。左上角点击 文件-->执行-->NX open-->选择刚才的jar文件。
如果提示框中显示 Binding Sessionsss Session bound 表示服务端RMI已经开启。
执行客户端获取数据
在NXClient.java 文件中添加一个main函数。在函数中执行 NXRemoteServer server = lookupServer(); 这行代码。如果能正常获取server则表示获取数据成功。
通过NXOpen获取数据
需要用到的对象
- Session(为java封装的入口对象)
- UFSession(这套接口是C++的套壳,使Java能够调用C++接口。使用方式跟C++调用NX一致)
- Part(工件入口对象)
- Body(工件中的部件对象)
- Face(工件上的面对象)
- Edge(面上的边对象)
- VerticesData(边上的点数据)
- AskFaceData(面的基本信息,此对象非常重要。可以查看官方接口文档)
获取数据的简单示例
NXRemoteServer server = lookupServer();
Session theSession = server.session();
UFSession theUFSession = server.ufSession();
PartCollection.OpenData openBaseData1 = theSession.parts().openDisplay("图纸文件的绝对路径,此图纸必须跟NX在同一台电脑上,不支持网络地址");
Part workPart = theSession.parts().work();
PartCollection partCollection = theSession.parts();
TaggedObjectCollection.Iterator iterator = partCollection.iterator();
while(iterator.hasNext()){
TaggedObject taggedObject = (TaggedObject)iterator.next();
Part part = (Part)taggedObject;
BodyCollection bodyCollection = part.bodies();
TaggedObjectCollection.Iterator itrBody = bodyCollection.iterator();
while(itrBody.hasNext()){
Body body = (Body)itrBody.next();
//加载边
for (Edge edge : body.getEdges()) {}
//加载面
Face[] faces = body.getFaces();
for (Face face : faces) {
UFModeling.AskFaceData askFaceData = theUFSession.modeling().askFaceData(face.tag());
}
}
}
需要初步计算的数据(此部分不是太难,不再展开细说)
1.需要将获取的point edge face 数据建立关联关系。组装起来
2.找到每个Face的外轮廓边
3.找到每个Face内部边的内轮廓,内轮廓有多个
4.找到每个面的域范围,按照X,Y,Z轴来统计最大值,最小值,跨度
5.找到邻面,就是与外轮廓边相接的面
6,找到面的法向量,圆柱面和圆锥面 用中心轴向量来代替