iCAx开思工具箱

标题: 一个圆柱上打孔的例子(NXopen for .net) [打印本页]

作者: 深夜摔键盘    时间: 2005-6-8 20:59
标题: 一个圆柱上打孔的例子(NXopen for .net)
把以前学习NX3的.net开发中做的一个例子放出来,有兴趣的兄弟可以看看。后来放弃学习.net了,没那么多精力,另外觉得还是用C/C++心里踏实。所以有些东西也忘了,下面的过程,难免不详细,大家帮着补充补充吧。
  
这个程序很简单,就是一个圆柱上打了一个通孔,需要一点技巧的地方就是从圆柱上寻找孔的放置面了。我的方法有点笨,穷举了一遍圆柱上的特征面,筛选出特征平面。
作者: 深夜摔键盘    时间: 2005-6-8 21:15
[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)  
    {   
  
    }  
  }  
}
  
如果你前两步做的没错误,那么完成这一步之后,就可以编译一下试试了,应该能通过。
作者: 深夜摔键盘    时间: 2005-6-8 21:20
[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)  
    {  
  
    }
  }
}
  
虽然程序还是空壳子,但现在可以再编译一下,检查检查有没有错误。
作者: 深夜摔键盘    时间: 2005-6-8 22:04
[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,可以把它删掉,再执行程序。
作者: 深夜摔键盘    时间: 2005-6-8 22:14
[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中创建了一个圆柱了。
作者: 深夜摔键盘    时间: 2005-6-8 22:36
[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);
  
//////////////////////////////////////////////
  
好了。编译,运行看看。
作者: 深夜摔键盘    时间: 2005-6-8 22:38
这个DLL也可以在NX3下,由菜单调用的。
  
源代码文件在附件中:
作者: fourwood    时间: 2005-6-9 17:57
写的代码风格好象C语言啊
作者: 深夜摔键盘    时间: 2005-6-9 18:15
呵呵。
  
fourwood兄,C#风格应该是怎么个样子?我看UGS提供的例程大抵是这样的,觉得绕来饶去,用的还是C API的封装吧
作者: fourwood    时间: 2005-6-9 21:01
一般习惯写
double[] origin = { 0.0, 0.0, 0.0 };  
for( uint i = 0; i < obj_list.length; i++ )
之类的了。
我一直在学C#,不过用习惯了C++中STL方便,用C#总感觉不如人意
作者: zhjb113    时间: 2005-6-11 19:52
你还是使用的UGOpen啊!
  
m_openSession.Modl只不过是把UGOpen换了一个名字而已,所以本质上还是UGopen,所以你的程序看起来很像C。用C# 试一下如何。
  
你还可以使用NX3提供的Journal功能直接生成代码。方法是,打开Journal,开始录制宏,然后进行操作,操作结束之后,停止录制宏,你会看到生成了一些VB的代码,这些代码就是对应的你的操作。你可以把这些代码翻译成C++,C#。由于某种原因,NX3 只能生成部分操作的代码。从NX4.0开始,Journal可以生成几乎所有的代码,并且可以直接生成C++的代码,目前好像还不能生成C#的代码,不过你可以很容易的将VB代码翻译成C#。
  
你可以看看我的创建Block的程序,是面向对象的方式,和你创建特征的方法是不一样的。
作者: supergirl    时间: 2005-6-11 20:21
楼上的,不用这么麻烦,在preference中将journal的语言选为C++
就可以直接生成C++的代码,直接拷去用就OK了!
  
还有楼主,用NXOPEN中的UGOPEN的老函数还不如直接用UGOPEN,要用就要用NXOPEN来开发。NX就是跑在NXOPEN上的。
作者: supergirl    时间: 2005-6-11 20:31
键盘老弟,恕我直言,你的开发思路是不对的。你对NXOPEN的理解也是片面的。
  
NXOpen.UF是对老的C的API的封装。但是NXOPEN是绝对不是。NXOPEN完全可以去掉NXOpen.UF这一部分,只是为了照顾以前喜欢用UGOPEN的人(比如键盘老弟,才保留的)
  
你可以试一下NX的journal功能,看看产生的代码是如何的,和你的这个思路是完全不同的。这才是NX内部,真正生成feature的思路。
  
个人一直比较看好NXOPEN,因为它简单,功能强大,而且很多代码系统都可以帮你生成。
  
当然它也有很多不足,一是还不能包括所有的NX的功能,二是它不能对UG的UI进行操作。
  
改天有时间用NXOPEN(而不是NXOPEN封装的老API)写一个和键盘老弟功能一样的例子,呵呵,不过我比较懒的。
作者: 深夜摔键盘    时间: 2005-6-11 22:00
张兄,supergirl说的对。这个例子是C,仅仅是用了C#的环境。原本是打算在NXOPEN FOR 。NET里做些东西的,但因为要用UG的曲面,在NXOPEN FOR .NET里没有找到曲面的类,那几天,就试着C#的环境做了这个例子之后再也没有用过.NET了。
  
期待supergirl抽点时间,做个纯NXOPEN的例子,让大家学习学习,这方面的资料太少了些。
  
另外,有些个人意见。许多没有封成DLL的科学计算的C/C++库,在C#中不好使用,觉得UGS要是以后不再更新OPEN C API,觉得挺不好,也觉得很没有理由这样做,按理说公布一个C接口,要比公布其他接口更方便吧,除非它象CATIA那样重新改写了一遍. 个人宁愿在NX4下学习JAVA的开发
作者: supergirl    时间: 2005-6-12 14:42
NX open 包括C,C++,C#,VB的接口,据说NX4要包括JAVA的
作者: boliang99    时间: 2005-6-14 21:29
没学过C#,看大家的贴子,感觉以后搞二次开发越来越容易了。应该这样啊,计算机充其量也不过是个工具,让我们去摸索半生,还不能搞出个象样的系统,那真不是滋味。
作者: dq_guoli    时间: 2005-6-22 11:18
to:Supergirl
你好,我是UGNX二次开发的初学者,我试了一下NX3提供的Journal功能,直接生成代码也是.vb格式的。在preference中怎样将journal的语言选为C++ 呢,我看了preference的相关选项,没有找到journal的语言选。请指点! 谢谢!!
作者: supergirl    时间: 2005-6-22 15:31
preference->user interface-> journal
  
前几天我给过一个C#的例子,有兴趣你可以看看,
等几天我会再给一个在。net上用NXOPEN开发的C++的例子
作者: amd    时间: 2005-6-22 17:15
supergirl wrote:
preference->user interface-> journal  
  
  前几天我给过一个C#的例子,有兴趣你可以看看,  
  等几天我会再给一个在。net上用NXOPEN开发的C++的例子

  
没找到阿?那里只有这个:
作者: supergirl    时间: 2005-6-22 18:24
呵呵,可能用的NX3的版本不同,不过VB的代码比CXX的简单易懂,偶一般都是看着VB的改的
作者: CHLICAX    时间: 2006-6-28 09:39
看不懂啊
作者: CHLICAX    时间: 2006-6-28 09:40
多多关照
作者: hello_test    时间: 2007-7-2 17:04
用Nx4的Journal不能生成对应的UI操作函数,不知道如果要实现如同需要UI操作的过程,如何编程实现呢?谢谢各位牛人啦!NxOpen类库下有没有类似的UI处理功能?




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3