UG/NX二次开发自动编程系列之三获取图纸数据并初步处理

有疑问或无法实现请留言或私信可以提供解答

背景介绍

本次采用java与NX连接来拉取数据,NX对java的支持采用的是RMI技术(远程方法调用).具体方式是设定一个接口,把这个接口复制两份一个放在服务端,一个放在客户端。当客户端调用本地接口的时候,本地的接口会自动去服务端拉取对应接口的数据。这里面需要注意的是,客户端和服务端接口的package地址必须完全一致,否则无法生效。NX提供了一个RMI调用的例子,代码比较完善可以直接使用。

准备工作

  1. 将NX提供的java示例搞出来,里面包含了大量java与NX交互的例子。先找到你NX安装地址,然后按照下面地址即可找到(...\UGOPEN\SampleNXOpenApplications\Java)。如果找不到可在NX安装目录下搜素java。
  2. 将NX提供的java jar包搞出来, 需要将NXOpen开头的jar加载到项目里。与NX的交互就通过这些接口来实现。先找到你NX安装地址,然后按照下面地址即可找到(...\NXBIN)。如果找不到可在NX安装目录下搜索NXOpen.jar
  3. NX绑定java环境,打开NX软件在左上角点击"文件"-->"执行"-->"替代java参数"。点击第一行后面的文件选择按钮选择java安装地址。地址指向到..\jre\bin\server目录。然后点击"文件"-->"执行"-->"为NX检查java",检验是否成功
  4. 将NX连接示例搞进项目里。找到 RemotingExample 文件夹。将里面的.java文件搞进项目里。并且把NXOpen开头的jar包一起弄进项目里。
  5. 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获取数据

需要用到的对象

  1. Session(为java封装的入口对象)
  2. UFSession(这套接口是C++的套壳,使Java能够调用C++接口。使用方式跟C++调用NX一致)
  3. Part(工件入口对象)
  4. Body(工件中的部件对象)
  5. Face(工件上的面对象)
  6. Edge(面上的边对象)
  7. VerticesData(边上的点数据)
  8. 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,找到面的法向量,圆柱面和圆锥面 用中心轴向量来代替

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值