iCAx开思工具箱

标题: 用NXOPEN做的Block打孔的例子 [打印本页]

作者: supergirl    时间: 2005-6-12 17:48
标题: 用NXOPEN做的Block打孔的例子
个人觉得NXOPEN是个好东东,所以NXOPEN出来后,就从UGOPEN移情别恋了,,虽然NXOPEN的功能还不是很全,但是我们从目前release的这些功能上看,NXOPEN是很强大的。
  
看了键盘的在cylinder上打孔的例子,他是用NXOPEN中的封装的老的UF的API来做的,这样觉得又回到了UGOPEN的老路,并没有体现真正的NXOPEN开发的思想。
  
所以在下献丑也做了一个打孔的例子,遗憾的是NX中目前不能做cylinder所以只能在BLOCK上打孔了,大家就将就看了。具体的程序在附件中,感兴趣者,可以下载来玩玩
  
创建C#的project的过程请详见 zhjb113的帖子,我就不罗嗦了。在我的例子中 生成block和生成hole是分别在两个button中实现的。
  
第一步:得到当前的UG 的session和work part
             UG都是运行在UG的session中的,所以要首先得到当前的UG session
             当然对UG进行的任何操作也是在一个work part中,所以也必须得到UG的 work part
  
            将UG的session和workpart定义为全局的一个变量,并在程序的main函数中得到当前的UGsession 和work part
  
    public class Form1 : System.Windows.Forms.Form
{
         
         // Cached NXOpen session
         private static NXOpen.Session theSession;
  
         // work part
         private static NXOpen.Part workpart;
  
            //main interface
         private static Form1 testform;
  …………
  
         public static void Main()  
  
         {
             //get UG Session
             theSession = Session.GetSession();
             //get work part
             workpart=theSession.Parts.Work;
              
             //show main interface
             testform = new Form1();
             testform.Show();
  
         }
  
      
作者: supergirl    时间: 2005-6-12 17:55
第二步: 创建block  
          个人觉得NXOPEN与用UGOPEN开发的最大的不同一点,就是feature的生成方式。在NXOPEN中采取了一种类似设计模式中工厂类(factory)的东东--builder来统一生成。
        所有生成feature用的数据(就是你在UI上需要输入的数据),都被放到了builder中,然后统一调用builder的commitfeature方法来得到feature。
        
       编辑feature也是同样的方法,在feature builder中设置所有需要修改的数据,然后调用commit feature得到 feature。唯一与生成feature不同的地方是
  
大家注意到在创建feature builder的时候,如果输入参数是null,则是commit出来的是新的feature,如果输入参数是一个已经存在的feature,则 commit出来的是对输入feature的edit
         private void button1_Click(object sender, System.EventArgs e)
         {
              
             //create block builder
             NXOpen.Features.BlockFeatureBuilder myblock;
             NXOpen.Features.Feature nullFeatures_Feature = null;
             myblock = workpart.Features.CreateBlockFeatureBuilder(nullFeatures_Feature) ;
              
             //set data for block builder
             Point3d ps = new Point3d(0.0, 0.0, 0.0);
             myblock.SetOriginAndLengths(ps, "100", "100", "100");
             NXOpen.Body nullBody = null;
             myblock.SetBooleanOperationAndTarget(NXOpen.Features.Feature.BooleanType.Create, nullBody );
              
             //create block feature
             feat_block = myblock.CommitFeature();
  
         }
作者: supergirl    时间: 2005-6-12 17:57
第三步:创建 hole
创建hole 与block 的方法类似,也是创建feature builder,往feature builder中塞好数据,然后commit出hole feature
   
        private void button2_Click(object sender, System.EventArgs e)
        {
            //create hole builder
            NXOpen.Features.Feature nullFeatures_Feature = null;
            NXOpen.Features.HoleFeatureBuilder  myhole;
            myhole = workpart.Features.CreateHoleFeatureBuilder(nullFeatures_Feature);
  
            //set data for hole builder
            myhole.SetDepthAndTipAngle( "50", "118" );
           &nbspoint3d refPoint1 = new Point3d( 40.8160633393798, 34.822104060988, 100.0);
            NXOpen.Face face1 = (NXOpen.Face)feat_block.FindObject("FACE 1");
            myhole.SetSimpleHole( refPoint1, false, face1, "25" );
            
            //create hole feature
            myhole.CreateHole();
            myhole.CommitFeature();
  
        }
作者: supergirl    时间: 2005-6-12 18:05
总结:
      大家可以对照深夜摔键盘与我的程序创建feature过程,来体会NXOPEN与UGOPEN的不同开发思路的区别。
     个人感觉UGOPEN是旧的C的思路上的API,而NXOPEN则是完全面向对象的。所有feature的创建模式都是大同小异的。无非是按这个方式 创建builder->设置bulder的参数->commit  就OK了
     
    以前在UGOPEN上做开发总感觉创建一个东东很容易,要编辑它还是比较困难(除非用表达式来编辑或者是它提供了编辑的方法),在NXOPEN中可以轻松的对一个feature进行创建和编辑的。
作者: zhjb113    时间: 2005-6-12 18:09
好!帖!啊!
作者: supergirl    时间: 2005-6-12 18:10
补充:Jounal 与NXOPEN
NX还提供了一个很好的工具journal (在NX菜单的tool下)来支持NXOPEN,它可以录制你的操作过程自动生成NXOPEN的代码(目前可以生成VB,C++和JAVA的)。
  
所以做NXOPEN开发最简单的一个方法就是,录一段程序,然后拷贝到自己的project中,稍微改一改,就OK了,对我等懒人来说,还是非常省事情的。
  
其实我以上的代码就是我录的一段journal的改写,下面也贴出来了(是VB的,很简单),大家有兴趣,可以对照一下。
作者: supergirl    时间: 2005-6-12 18:10
Module NXJournal
Sub Main
  
Dim theSession As Session = Session.GetSession()
' ----------------------------------------------
'   Menu: Insert->Design Feature->Block...
' ----------------------------------------------
Dim nullFeatures_Feature As Features.Feature = Nothing
  
Dim features_BlockFeatureBuilder1 As Features.BlockFeatureBuilder
features_BlockFeatureBuilder1 = theSession.Parts.Work.Features.CreateBlockFeatureBuilder(nullFeatures_Feature)
  
Dim point3d1 As Point3d = New Point3d(0.0, 0.0, 0.0)
features_BlockFeatureBuilder1.SetOriginAndLengths(point3d1, "100", "100", "100")
  
Dim nullBody As Body = Nothing
  
features_BlockFeatureBuilder1.SetBooleanOperationAndTarget(Features.Feature.BooleanType.Create, nullBody)
  
Dim features_Feature1 As Features.Feature
features_Feature1 = features_BlockFeatureBuilder1.CommitFeature()
  
' ----------------------------------------------
'   Menu: Insert->Design Feature->Hole...
' ----------------------------------------------
Dim features_HoleFeatureBuilder1 As Features.HoleFeatureBuilder
features_HoleFeatureBuilder1 = theSession.Parts.Work.Features.CreateHoleFeatureBuilder(nullFeatures_Feature)
  
features_HoleFeatureBuilder1.SetDepthAndTipAngle("50", "118")
  
Dim point3d2 As Point3d = New Point3d(52.9603562236931, 26.0351147684603, 100.0)
Dim iSurface1 As ISurface = CType(features_Feature1.FindObject("FACE 1"), ISurface)
  
features_HoleFeatureBuilder1.SetSimpleHole(point3d2, False, iSurface1, "25")
  
features_HoleFeatureBuilder1.CreateHole()
  
features_HoleFeatureBuilder1.ShowPositioningDimensions()
  
' ----------------------------------------------
'   Dialog Begin Positioning
' ----------------------------------------------
  
features_HoleFeatureBuilder1.ApplyDimensions()
  
features_HoleFeatureBuilder1.HidePositioningDimensions()
  
Dim features_Feature2 As Features.Feature
features_Feature2 = features_HoleFeatureBuilder1.CommitFeature()
  
' ----------------------------------------------
'   Menu: Tools->Journal->Stop
' ----------------------------------------------
  
End Sub
End Module
作者: zhjb113    时间: 2005-6-12 18:12
做沙发,学习,人生一大快事
作者: 深夜摔键盘    时间: 2005-6-12 23:00

作者: ffhi    时间: 2007-7-11 17:16
  请问在VC6.0中应如何设置才能运用NXOpen C++?
  我用Journal录了一段程序,建立了一个WIN32 DLL工程,参照以前用UG OPEN C时的设置,也添加了libufun.lib libugopenint.lib libopenpp.lib libvmathpp.lib libnxopencpp.lib libnxopenuicpp.lib libopenintpp.lib。但一编译就出错,主要错误是:error C2027: use of undefined type 'Session'。
  请问如何处理?
作者: hzengchai    时间: 2010-8-20 12:05
thank you!!!!!!
作者: xjun100    时间: 2010-8-23 00:09
能不能给我发个你的源码啊,没有贡献下不了哦,xjun100@163.com
作者: CUI821228    时间: 2010-8-23 15:09
谢谢楼主分享!!




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