找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 19634|回复: 22
打印 上一主题 下一主题

一个圆柱上打孔的例子(NXopen for .net)

[复制链接]
跳转到指定楼层
1
发表于 2005-6-8 20:59:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
把以前学习NX3的.net开发中做的一个例子放出来,有兴趣的兄弟可以看看。后来放弃学习.net了,没那么多精力,另外觉得还是用C/C++心里踏实。所以有些东西也忘了,下面的过程,难免不详细,大家帮着补充补充吧。
  
这个程序很简单,就是一个圆柱上打了一个通孔,需要一点技巧的地方就是从圆柱上寻找孔的放置面了。我的方法有点笨,穷举了一遍圆柱上的特征面,筛选出特征平面。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2005-6-8 21:15:11 | 只看该作者
[1]新建一个VS.NET项目,选Visual C#项目中的类库,命名名为createHole。这样程序编译连接后输出一个DLL。
  
[2]项目建立完毕,在工程里添加引用,四个NX3提供的库文件,在ugii目录下的managed文件夹中。
  
NXOpen.dll
NXOpen.Utilities.dll
NXOpen.UF.dll
NXOpenUI.dll //如果需要就引用
  
[3]在生成的空壳子类里面添加一个名字为Main的静态成员函数,因为C#是纯面向对象的语言,不允许非对象的出现,但DLL又需要对外提供接口,所以这里需要一个static成员函数作为DLL的输出函数,可以被UG调用。(个人猜测)
完整代码如下:
//-----------------------------------------------------------------  
//一个C#类,类名是系统默认的,我没有改。  
//-----------------------------------------------------------------  
using System;  
using NXOpen;  
using NXOpen.UF;  
using NXOpen.Utilities;  
namespace createHole  
{  
  /// <summary>  
  /// Class1 的摘要说明。  
  /// </summary>  
  public class Class1  
  {  
    public Class1()  
    {  
      //  
      // TODO: 在此处添加构造函数逻辑  
      //  
    }  
  
    //-----------------------------------------  
    //这个类似于ufusr/ufsta,程序入口  
    //----------------------------------------  
    public static void Main(string[] args)  
    {   
  
    }  
  }  
}
  
如果你前两步做的没错误,那么完成这一步之后,就可以编译一下试试了,应该能通过。
3
发表于 2005-6-8 21:20:48 | 只看该作者
[4]初始化NX环境,创建一个新prt并保存。
  
首先要获取NX会话,就象OPEN C API中要初始化UG环境一样,在你调用OPEN C API之前必须得UF_initialize();但在C#中,是一些对象,好象这些对象担负着环境初始化的工作,还有一些其他的工作。
  
我把这个过程放到了C#类的构造函数里,幻想着只需要进行一次的环境初始化就不用再管它了,不知道这种想法对不对。
  
用过open c API的兄弟,应该在文档中看到UGS做的演示程序中看到通常有一个 do_ugopen_api 函数,这个函数在ufusr/ufsta中被调用,其目的大家也都知道。.net的开发中,也可以采用这样的方式。
  
下面在C#类中添加一个类成员函数,让它扮演 do_ugopen_api的角色。
程序修改如下:
//--------------------------------------------------------------------------------------
//添加了环境初始化,并加了一个演示OPEN .NET API的成员函数
//-------------------------------------------------------------------------------------
using System;
using NXOpen;
using NXOpen.UF;
using NXOpen.Utilities;
namespace createHole
{
  /// <summary>
  /// Class1 的摘要说明。
  /// </summary>
  public class Class1
  {
    //----------------------------------------------
    //两个对象,它们的作用是什么,未深研究
    //----------------------------------------------
    public static NXOpen.Session m_session;
    public static NXOpen.UF.UFSession m_openSession;
  
    public Class1()
    {
      //首先获取NX会话,这是必须的。
      m_session= NXOpen.Session.GetSession();
  
      //获取NXOPEN UF会话,好像类似于UF_initialize()的作用
      m_openSession  = NXOpen.UF.UFSession.GetUFSession();
    }
  
    public void ExcuteFun()
    {
      NXOpen.Tag UFPart;
      //生成一个新部件
      m_openSession.Part.New("d:\\1.prt",2, out UFPart);
  
      //保存prt
      m_openSession.Part.Save();
    }
    //-----------------------------------------
    //这个类似于ufusr/ufsta,程序入口
    //----------------------------------------
    public static void Main(string[] args)  
    {  
  
    }
  }
}
  
虽然程序还是空壳子,但现在可以再编译一下,检查检查有没有错误。
4
发表于 2005-6-8 22:04:41 | 只看该作者
[5]创建一个新prt,并保存。
这一步不干别的,就是想在D盘上,创建一个名位1.prt的文件,再保存起来。
  
关键问题是要搞清楚程序的执行过程。前面几步生成的代码,能编译,而且也是能运行的,只是运行时,啥也不干。因为Main函数还是个空壳,前面说过,NX是要从Main开始执行你的程序的。
  
修改成员函数ExcuteFun(),添加如下代码:
public void ExcuteFun()
{
   NXOpen.Tag UFPart;
   //生成一个新部件
   m_openSession.Part.New("d:\\1.prt",2, out UFPart);
  
   //保存prt
   m_openSession.Part.Save();
}
关于 ExcuteFun函数中的那些对象都是用来干啥的,我也不清楚。要是谁能够把类的层次总结一下,给大家说说就好了。
  
然后在Main中添加如下代码:
public static void Main(string[] args)  
{   
                 //将类对象化
   Class1 exampl1=new Class1();
   exampl1.ExcuteFun();
}
  
在Main函数中添加的代码很重要。Main作为NX执行用户DLL的入口,它是一个static成员函数,这个函数仅是名义上归属类Class1,它可以在没有对象存在的状态下就可以执行。C#是纯面向对象的语言,但有时也不得不在没有对象状态下做事,此时static型的成员函数就派上了用场。
  
而类成员函数ExcuteFun()就不同了,它隶属于对象,只有对象存在时才可以调用它。所以在Main函数中要将Class1对象化,然后执行exampl1.ExcuteFun();
  
///////////////////////////////////////////////////////
这一步完成后,编译连接,看看是否通过。然后就可以打开NX3,
从菜单:File | Excute |NX Open,找到所输出的createHole.dll,加载执行。
运行结果就是建了一个新prt,并保存在了D盘。
  
这时要注意一下,第二次再运行这个程序时,会出错。因为你的D盘上已经有了一个1.prt,可以把它删掉,再执行程序。
5
发表于 2005-6-8 22:14:54 | 只看该作者
[6] 创建一个圆柱体
参数:
高 =10mm
直径=5mm
轴向 = z向
底面的圆心是坐标原点;
  
修改ExcuteFun(),在创建prt和保存prt的代码之间,添加如下代码:
//---------------------------
//以下代码create一个圆柱
//--------------------------
double []origin={0,0,0};
string height="10";
string diam="5";
double []direction={0,0,1};
NXOpen.Tag  cyl_obj_id;
  
m_openSession.Modl.CreateCyl1(NXOpen.UF.FeatureSigns.Nullsign,origin,height,diam,direction,out cyl_obj_id);
  
////////////////////////////////////////////////////////////
  
基本上知道了一点m_openSession对象里都有哪些货色了吧。
  
再编译,只要操作正确,应该还没有问题的。这次再运行程序,就可以看到prt中创建了一个圆柱了。
6
发表于 2005-6-8 22:36:02 | 只看该作者
[7] 打一个简单的通孔
这个需要动动脑子。孔好象只能放置在平面上吧?我UG用的不熟,只是觉得只有在平面上才便于定位,曲面上就困难了。
  
要选圆柱两底面中的一个作为孔的放置平面,由于是通孔,还需要知道要打通的那个平面。所以从圆柱的所有特征面中找到它的两个底面。
  
方法:
1。使用m_openSession.Modl.AskFeatFaces来获取圆柱体上的所有特征面的Tag,它们存在C#的数组 obj_list中,C#的数组应该是变长的。
  
2。查询 obj_list中存储的对象的类型,一个也不放过,要写一个循环,在循环中m_openSession.Modl.AskFaceType,如果是平面类型就把它存起来。但我没查到NX OPEN .net中对平面类型是怎样定义的,就用了一个苯方法,圆柱上的特征曲面就仨,一张曲面,两个平面,我就穷举,只要有两个特征面的类型相同,那么它们肯定就是平面。
  
3。找到了两个特征平面的tag,就可以打孔了。
/////////////////////////////////////////////////////////////////////////
在ExcuteFun()中创建圆柱的代码的下面添加如下代码:
  
NXOpen.Tag []obj_list;
m_openSession.Modl.AskFeatFaces(cyl_obj_id,out obj_list);
int i=0,j=0;
int m=obj_list.GetLength(0);
int face_type1=0,face_type2;
NXOpen.Tag []filteredObj_list=new NXOpen.Tag[2];
for(i=0;i<m;i++)
{
        m_openSession.Modl.AskFaceType(obj_list,out face_type1);
  for(j=0;j<m;j++)
  {
    if(j!=i)
    {
      m_openSession.Modl.AskFaceType(obj_list[j],out face_type2);
      if(face_type1==face_type2)
      {
        filteredObj_list[0]=obj_list;
        filteredObj_list[1]=obj_list[j];
      }
    }
  }
}
NXOpen.Tag  feature_obj_id;
m_openSession.Modl.CreateSimpleHole(origin,direction,"1","5","120",filteredObj_list[0],filteredObj_list[1],out feature_obj_id);
  
//////////////////////////////////////////////
  
好了。编译,运行看看。
7
发表于 2005-6-8 22:38:14 | 只看该作者
这个DLL也可以在NX3下,由菜单调用的。
  
源代码文件在附件中:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
8
发表于 2005-6-9 17:57:59 | 只看该作者
写的代码风格好象C语言啊
9
发表于 2005-6-9 18:15:09 | 只看该作者
呵呵。
  
fourwood兄,C#风格应该是怎么个样子?我看UGS提供的例程大抵是这样的,觉得绕来饶去,用的还是C API的封装吧
10
发表于 2005-6-9 21:01:52 | 只看该作者
一般习惯写
double[] origin = { 0.0, 0.0, 0.0 };  
for( uint i = 0; i < obj_list.length; i++ )
之类的了。
我一直在学C#,不过用习惯了C++中STL方便,用C#总感觉不如人意
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-31 07:17 , Processed in 0.028280 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

快速回复 返回顶部 返回列表