UG的二次开发有两套系统,一套叫Open,一套叫NXOpen。Open主要是造型方面的功能,NXOpen比较全面。Open原来支持的是C/C++,.net的NXOpen.UF命名空间支持。NXOpen支持C++和.net等。
Open系统,支持C的原来叫UFun,或者API,用的人最多。后来出现了Open C++。但是Open C++支持编辑等属性行为,不能创建。所以,一般是通过API创建特征,比如实体,通过C++的类查询和修改。
NXOpen系统,是完全面向对象的,所以可以创建和修改特征。当然,NXOpen几乎支持UG所有的功能。

 
Open
NXOpen
C
UFun(API);面向过程开发;主要支持造型功能
 
C++
Open C++类库;面向对象开发;部分支持造型功能,没有创建特征的功能等,需要使用UFun
通过NXOpen命名空间支持,需要包含相应头文件。
.net
通过NXOpen.UF命名空间包装了UFun来实现。
通过NXOpen命名空间支持,需要引用相应的程序集。

 
所以,目前开来,如果使用C/C++方式,可以使用Open C和C++结合的方式,利用C来创建特征,使用C++来管理。如果使用.net可以直接使用NXOpen。对于不熟悉NXOpen的人可以按照Open C的知识上手NXOpen.UF。
 
下面将通过各个例子说明上述系统的使用,因为.net平台是通用的,我只举了C#的例子,VB等也是一样的的。而java我不懂,见谅了。
 
一、Open C
1、遍历的例子
#include <uf_object_types.h>
#include <uf_part.h>
#include <uf_obj.h>
#include <uf_modl.h>
#include <string>
#include <sstream>
using std::string;
using std::stringstream;
 
//下面是程序片段
    UgSession session( true );
    try
    {
        /* TODO: Add your application code here */
         uf_list_p_t lpObj;
         UF_MODL_create_list(&lpObj);
 
         tag_t prt = UF_PART_ask_display_part();
         tag_t Next_tag=NULL_TAG;
         do
         {
              UF_OBJ_cycle_objs_in_part(prt,UF_solid_type,&Next_tag);
              if(Next_tag==NULL_TAG) break;
 
              int t,subtype;
            UF_OBJ_ask_type_and_subtype(Next_tag,&t,&subtype);
              if(subtype==UF_solid_body_subtype)
                   UF_MODL_put_list_item(lpObj,Next_tag);
         } while(1);
 
         logical is_open;
         UF_UI_is_listing_window_open(&is_open);
         if(!is_open) UF_UI_open_listing_window();
 
         int sum;
         UF_MODL_ask_list_count(lpObj,&sum);
         for (int i=0;i<sum;i++)
         {
              tag_t t;
              UF_MODL_ask_list_item(lpObj,i,&t);
 
              stringstream s;
              s<<(int)t;
              string str;
              str = s.str();
 
            UF_UI_write_listing_window(str.c_str());
              UF_UI_write_listing_window("/n");
         }
 
//       UF_UI_exit_listing_window();
         UF_MODL_delete_list(&lpObj);
    }
 
    /* Handle errors */
    catch ( const UgException &exception )
    {
        processException( exception );
}
 
2,创建block的例子
#include <uf.h>
#include <uf_ui.h>
#include <uf_exit.h>
#include <uf_modl.h>
//下面是程序片段
 
   /* Initialize the API environment */
    if( UF_CALL(UF_initialize()) )
    {
        /* Failed to initialize */
        return;
    }
   
    /* TODO: Add your application code here */
     double corner[3] ={0,0,0};
     char* edge[3] = {"10","5","20"};
     tag_t tag;
     UF_MODL_create_block(UF_NULLSIGN,NULL_TAG,corner,edge,&tag);
 
    /* Terminate the API environment */
UF_CALL(UF_terminate());
 
二、Open C++
1、遍历的例子
#include <ug_typed.hxx>
#include <ug_part.hxx>
#include <ug_body.hxx>
#include <ug_string.hxx>
using std::string;
//下面是程序片段
 
    UgSession session( true );
    try
    {
        /* TODO: Add your application code here */
         UgPart           *pWorkPart = UgSession::getWorkPart();
         UgTypedObject    *pObj;
 
         ostrstream buffer;
 
         for ( pObj = pWorkPart->iterateFirst ( );
              pObj;
              pObj = pWorkPart->iterateNext ( pObj ) )
         {
              std::string name = pObj->getName ( );
 
              UgBody *pBody = dynamic_cast<UgBody*>(pObj);
              if (pBody)
              {
                   buffer<<(int)pBody->getTag()<<"/n";
              }
         }
 
         UgInfoWindow::open();
         UgInfoWindow::write(string(buffer.str()));
         delete buffer.str();
    }
 
    /* Handle errors */
    catch ( const UgException &exception )
    {
        processException( exception );
}
 
2、通过模板搜索的例子
#include <ug_body.hxx>
#include <ug_iterator.hxx>
#include <ug_string.hxx>
//下面是程序片段
 
    UgSession session( true );
 
    try
    {
        /* TODO: Add your application code here */
         ostrstream buffer;
         // Construct an iterator for NX face objects
         UgIterator < UgBody > pObj;//workpart 可以通过其他方式指定
 
         //UgIterator < UgFace *> curFace;
         //// Loop through all faces
         //while ( !curFace.isFinished ( ) )
         //{
         //   // Get the name of the current face
         //   std::string faceName = (*(*curFace))->getName ( );
         //   curFace.findNext ( );
         //}
 
         // Loop through all faces
         while ( !pObj.isFinished ( ) )
         {
              // Get the name of the current face
              std::string faceName = (*pObj)->getName ( );
              buffer<<(int)(*pObj)->getTag()<<endl;
              pObj.findNext ( );
         }
        
         UgInfoWindow::open();
         UgInfoWindow::write( std::string( buffer.str() ));
         delete buffer.str();
        
    }
 
    /* Handle errors */
    catch ( const UgException &exception )
    {
        processException( exception );
}
 
 
三、NXOpen C++
1、创建block的例子
#include <NXOpen/Session.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/Features_BlockFeatureBuilder.hxx>
#include <NXOpen/Features_Block.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Features_FeatureCollection.hxx>
#include <NXOpen/UI.hxx>
#include <NXOpen/NXMessageBox.hxx>
using namespace NXOpen;
//下面是程序片段
 
     NXOpen::Session *theSession = NXOpen::Session::GetSession();
 
    try
    {
        /* TODO: Add your application code here */
         Part* thePart = theSession->Parts()->Work();
         NXOpen::Features::Feature* block = NULL;
         NXOpen::Features::BlockFeatureBuilder* theBuilder = thePart->Features()->CreateBlockFeatureBuilder(block);
 
         NXOpen::Point3d basePoint(100, 100, 100);
         theBuilder->SetOriginAndLengths(basePoint, "100", "200", "300");
 
         //              NXOpen.Body theBody = null;
         //              theBuilder.SetBooleanOperationAndTarget(NXOpen.Features.Feature.BooleanType.Create, theBody);
 
         theBuilder->Commit();
         //theBuilder->CommitFeature();
 
         NXOpen::UI::GetUI()->NXMessageBox()->Show("", NXMessageBox::DialogType::DialogTypeInformation, "OK!");
     //   UI->GetUI()->NXMessageBox.Show("", NXMessageBox.DialogType.Information, "OK!");
 
    }
 
    /* Handle errors */
    catch ( const UgException &exception )
    {
        processException( exception );
}
 
2、遍历特征的例子
#include <NXOpen/Session.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/Features_BlockFeatureBuilder.hxx>
#include <NXOpen/Features_Block.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Features_FeatureCollection.hxx>
#include <NXOpen/UI.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/ListingWindow.hxx>
using namespace NXOpen;
//下面是程序片段
 
     NXOpen::Session *theSession = NXOpen::Session::GetSession();
 
     try
     {
         /* TODO: Add your application code here */
         Part* thePart = theSession->Parts()->Work();
         theSession->ListingWindow()->Open();
 
         NXOpen::Features::FeatureCollection::iterator i;
         for (i=thePart->Features()->begin();i!=thePart->Features()->end();i++)
         {
              theSession->ListingWindow()->WriteLine((*i)->Name()+"--"+(*i)->GetJournalIdentifier());
         }
 
         NXOpen::UI::GetUI()->NXMessageBox()->Show("", NXMessageBox::DialogType::DialogTypeInformation, "OK!");
         //   UI->GetUI()->NXMessageBox.Show("", NXMessageBox.DialogType.Information, "OK!");
 
     }
 
    /* Handle errors */
    catch ( const UgException &exception )
    {
        processException( exception );
}
 
 
四、NXOpen C#
1、创建blcok的例子
using NXOpen;
using NXOpen.Utilities;
using NXOpen.UF;
using NXOpenUI;
//下面是程序片段
 
            Session theSession = Session.GetSession();
 
            try
            {
                Part thePart = theSession.Parts.Work;
                NXOpen.Features.Feature block = null;
                NXOpen.Features.BlockFeatureBuilder theBuilder = thePart.Features.CreateBlockFeatureBuilder(block);
 
                NXOpen.Point3d basePoint = new Point3d(100f, 100f, 100f);
                theBuilder.SetOriginAndLengths(basePoint, "100", "200", "300");
 
                theBuilder.Commit();
              //theBuilder.CommitFeature();
 
                UI.GetUI().NXMessageBox.Show("", NXMessageBox.DialogType.Information, "OK!");
            }
            catch(NXException ex)
            {
                UI.GetUI().NXMessageBox.Show("error!", NXMessageBox.DialogType.Error, ex.Message);
            }
 
2、遍历特征的例子
using NXOpen;
using NXOpen.Utilities;
using NXOpen.UF;
using NXOpenUI;
//下面是程序片段
 
            Session theSession = Session.GetSession();
            theSession.ListingWindow.Open();
 
            try
            {
                Part thePart = theSession.Parts.Work;
 
                foreach (NXOpen.Features.Feature c in thePart.Features)
                {
                    //NXOpen.Features.Block t = c as NXOpen.Features.Block;
                    //if(t!=null)
                    //{
                    //    theSession.ListingWindow.WriteLine(t.ToString());
                    //}
                    theSession.ListingWindow.WriteLine(c.Name+"--"+c.ToString());
                }
               
                UI.GetUI().NXMessageBox.Show("", NXMessageBox.DialogType.Information, "OK!");
            }
            catch (NXException ex)
            {
                UI.GetUI().NXMessageBox.Show("error!", NXMessageBox.DialogType.Error, ex.Message);
            }
 
五、NXOpen.UF
1、仿照Open C中的例1子实现
using NXOpen;
using NXOpen.Utilities;
using NXOpen.UF;
using NXOpenUI;
 
            NXOpen.UF.UFSession theUFSession = NXOpen.UF.UFSession.GetUFSession();
            try
            {
                double[] corner ={ 0, 0, 0 };
                string[] edge = { "10", "5", "20" };
                Tag tag;
 
                theUFSession.Modl.CreateBlock1(FeatureSigns.Nullsign, corner, edge, out tag);
            }
            catch (NXException ex)
            {
                UI.GetUI().NXMessageBox.Show("error!", NXMessageBox.DialogType.Error, ex.Message);
            }
2、仿照Open C中的例子2实现
 
using NXOpen;
using NXOpen.Utilities;
using NXOpen.UF;
using NXOpenUI;
 
            NXOpen.UF.UFSession theUFSession = NXOpen.UF.UFSession.GetUFSession();
 
            try
            {
                Tag[] list=null;
               
                Tag thePart = theUFSession.Part.AskDisplayPart();
 
                theUFSession.Modl.CreateList(out list);
 
                Tag Next_tag=Tag.Null;
                do
                {
                    theUFSession.Obj.CycleObjsInPart(thePart,70/* UF_solid_type*/,ref Next_tag);
 
                    if (Next_tag == Tag.Null) break;
 
                    int t, subType;
                    theUFSession.Obj.AskTypeAndSubtype(Next_tag,out t, out subType);
                    if (subType == 0/*UF_solid_body_subtype*/)
                        theUFSession.Modl.PutListItem(list, Next_tag);
 
 
                } while (true);
 
                bool isOpen;
                theUFSession.Ui.IsListingWindowOpen(out isOpen);
                if (!isOpen) theUFSession.Ui.OpenListingWindow();
 
                int sum;
                theUFSession.Modl.AskListCount(list,out sum);
                for (int i = 0; i < sum;i++ )
                {
                    Tag t;
                    theUFSession.Modl.AskListItem(list, i, out t);
                    theUFSession.Ui.WriteListingWindow(t.ToString());
                }
 
                /*Treat all the arguments with the"Output to be freed " annotation as an output parameter.
                 * The system takes care of freeing memory.*/
 
 
            }
            catch (NXException ex)
            {
                UI.GetUI().NXMessageBox.Show("error!", NXMessageBox.DialogType.Error, ex.Message);
            }