NX二次开发-NXOpenC++部件操作

Posted 阿飞的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NX二次开发-NXOpenC++部件操作相关的知识,希望对你有一定的参考价值。

版本NX12+VS2015

 

  部件(Part)文件在某种程度上是一个数据库,包含了所有的零件几何信息,同时也包含了大量的非几何信息。

NXOpen API提供了PartCollection集合对象和Part类对象来实现对Session中部件文件的遍历和操作,

这些类对象的属性和成员函数可以实现NX图形界面下的所有对部件文件的访问和操作。

 ------------------------------------------------------------------------------------------------------

  • 部件文件遍历

  NX允许用户打开多个部件文件,同时可以通过NX主界面中Windows菜单项下的子菜单选择实现已打开部件文件的切换。

NXOpen API通过PartCollection来实现对所有部件文件的遍历。

  PartCollection是Session里面所有Part的集合,通过PartCollection的迭代器(iterator)遍历所有的Part。典型的遍历代码格式如下:

NX12+VS2015

#include <uf_defs.h> #include <NXOpen/Session.hxx> #include <NXOpen/Part.hxx> #include <NXOpen/PartCollection.hxx> #include <NXOpen/ListingWindow.hxx> using namespace NXOpen; extern "C" DllExport int ufusr_ask_unload() { return (int)NXOpen::Session::LibraryUnloadOptionImmediately; } extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen) { //通过Session的静态函数得到NX Session实例对象 Session *theSession = NXOpen::Session::GetSession(); //通过Parts属性得到PartCollection集合对象 PartCollection *partList = theSession->Parts(); //通过iterator迭代器遍历所有Part for (PartCollection::iterator itr = partList->begin(); itr != partList->end(); ++itr) { //转换 BasePart *processPart = *itr; //打印Part的名字 theSession->ListingWindow()->Open(); theSession->ListingWindow()->WriteLine(processPart->Name()); } } 阿飞 2021年6月7日

API说明

1.通过Session的静态函数得到NX Session实例对象

2.通过Parts属性得到PartCollection集合对象

 3.通过iterator迭代器遍历所有Part

 

 

演示

 ------------------------------------------------------------------------------------------------------

  • 显示部件和工作部件操作

  NX部件有两种不同的工作方式,工作部件(Work Part)和显示部件(Display Part)。

NX图形界面上显示的部件定义为显示部件,可以通过PartCollection对象的Display属性

得到当前NX的显示部件。工作部件只有一个,可以通过PartCollection的Work属性得到

当前NX的工作部件。当一个部件被定义为工作部件时,其他部件将被显示为灰色。在NX

交互模式下,只有工作部件才能进行修改编辑操作。

  通过PartCollection可以获取当前的工作部件和显示部件

NX12+VS2015


#include <uf_defs.h>

#include <NXOpen/Session.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/ListingWindow.hxx>

using namespace NXOpen;

extern "C" DllExport int ufusr_ask_unload()
{
    return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
}

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
    //通过Session的静态函数得到NX Session实例对象
    Session *theSession = NXOpen::Session::GetSession();

    //获得NX显示部件
    Part *displayPart(theSession->Parts()->Display());
    
    //获得NX工作部件
    Part *workPart(theSession->Parts()->Work());

    //打印
    char msg[256];
    sprintf(msg, "当前显示部件为:%s\\n当前工作部件为:%s", displayPart->Name().GetLocaleText(), workPart->Name().GetLocaleText());
    theSession->ListingWindow()->Open();
    theSession->ListingWindow()->WriteLine(msg);
}

阿飞
2021年6月7日

API说明

1.获得NX显示部件

 2.获得NX工作部件

 3.NXString转char*

演示

   设置新工作部件

 

 

  设置新显示部件

 

 

 ------------------------------------------------------------------------------------------------------

  • 创建新部件

  PartCollection集合类对象为开发人员提供了两种创建新Part的方式。最简单的方式

是调用函数NewDisplay直接创建一个".prt"部件,也可以创建一个FileNew类对象,设置创建新Part对象的所有参数,

创建一个新的Part对象。

创建一个新的".prt部件",并设置为显示部件

NX12+VS2015


#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Builder.hxx>
#include <NXOpen/FileNew.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/ListingWindow.hxx>

using namespace NXOpen;

extern "C" DllExport int ufusr_ask_unload()
{
    return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
}

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
    //通过Session的静态函数得到NX Session实例对象
    Session *theSession = NXOpen::Session::GetSession();

  //调用函数NewDisplay直接创建一个".prt"部件,并设置为显示部件 Part
*newPart = theSession->Parts()->NewDisplay("D:\\\\1\\\\2\\\\456.prt", Part::UnitsMillimeters); //打印当前prt名字 theSession->ListingWindow()->Open(); theSession->ListingWindow()->WriteLine(newPart->Name()); } 阿飞 2021年6月7日

API说明

1.调用函数NewDisplay直接创建一个".prt"部件,并设置为显示部件

演示

FileNew类继承自Builder类,用于辅助创建Part对象。开发人员可以通过

PartCollection对象的FileNew方法创建一个FileNew对象实例,设置创建新文件的模块、

模板文件名称、新部件文件名称等,最后调用Commit方法生成一个新的Part文件。

NX12+VS2015


#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Builder.hxx>
#include <NXOpen/FileNew.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/ListingWindow.hxx>

using namespace NXOpen;

extern "C" DllExport int ufusr_ask_unload()
{
    return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
}

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
    //通过Session的静态函数得到NX Session实例对象
    Session *theSession = NXOpen::Session::GetSession();

    //通过PartCollection对象创建FileNew实例
    FileNew *fileNew1 = theSession->Parts()->FileNew();

    //设置模板文件名称
    fileNew1->SetTemplateFileName("model-plain-1-mm-template.prt");

    //设置创建新Part进入的模块
    fileNew1->SetApplication(FileNewApplicationModeling);

    //设置新Part的单位
    fileNew1->SetUnits(Part::UnitsMillimeters);

    //设置新Part的路径名称
    fileNew1->SetNewFileName("D:\\\\1\\\\2\\\\123.prt");

    //设置是否使用空模板文件
    fileNew1->SetUseBlankTemplate(false);

    //是否将新创建的Part设置显示部件
    fileNew1->SetMakeDisplayedPart(true);

    //调用Commit方法创建新Part
    NXObject *nXObject1 = fileNew1->Commit();

    //销毁FileNew临时对象
    fileNew1->Destroy();

    //动态类型转换为Part类对象
    Part *newPart(dynamic_cast<Part*>(nXObject1));

    //打印当前prt名字
    theSession->ListingWindow()->Open();
    theSession->ListingWindow()->WriteLine(newPart->Name());
}

阿飞
2021年6月7日

API说明

1.通过PartCollection对象创建FileNew实例

 

2.公共成员函数继承自NXOpen::Buider

演示

 

 ------------------------------------------------------------------------------------------------------

  • 部件文件加载

  PartCollection集合对象提供了方法从系统中加载一个Part文件得到一个Part类对象

NX12+VS2015

#include <uf_defs.h> #include <NXOpen/NXException.hxx> #include <NXOpen/Session.hxx> #include <NXOpen/Builder.hxx> #include <NXOpen/FileNew.hxx> #include <NXOpen/NXObject.hxx> #include <NXOpen/Part.hxx> #include <NXOpen/PartCollection.hxx> #include <NXOpen/Session.hxx> #include <NXOpen/ListingWindow.hxx> using namespace NXOpen; extern "C" DllExport int ufusr_ask_unload() { return (int)NXOpen::Session::LibraryUnloadOptionImmediately; } extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen) { //通过Session的静态函数得到NX Session实例对象 Session *theSession = NXOpen::Session::GetSession(); //打开一个已存的Part文件,加载到NX Session中,不改变当前的显示部件 NXOpen::PartLoadStatus *loadStatus; theSession->Parts()->Open("D:\\\\1\\\\2\\\\model1.prt", &loadStatus); } 阿飞 2021年6月8日

API说明

1.打开一个已存的Part文件,加载到NX Session中,不改变当前的显示部件

演示

NX12+VS2015


#include <uf_defs.h>
#include <NXOpen/NXException.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/Builder.hxx>
#include <NXOpen/FileNew.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx>
#include <NXOpen/ListingWindow.hxx>

using namespace NXOpen;

extern "C" DllExport int ufusr_ask_unload()
{
    return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
}

extern "C" DllExport void ufusr(char *param, int *retCode, int paramLen)
{
    //通过Session的静态函数得到NX Session实例对象
    Session *theSession = NXOpen::Session::GetSession();

    //打来一个已存的Part文件,加载到NX Session中,并设置为当前的显示部件
    NXOpen::PartLoadStatus *loadStatus;//不能加载的Part文件及错误原因
    theSession->Parts()->OpenDisplay("D:\\\\1\\\\2\\\\model1.prt", &loadStatus);
}

阿飞
2021年6月8日

API说明

1.打来一个已存的Part文件,加载到NX Session中,并设置为当前的显示部件

演示

 

还没写完,明天继续更新内容~

 

阿飞

2021年6月8日

 

以上是关于NX二次开发-NXOpenC++部件操作的主要内容,如果未能解决你的问题,请参考以下文章

UG NX二次开发(C#)-曲线-用AssociativeLineBuilder创建智能直线

UG NX二次开发(C#)-曲线-用AssociativeLineBuilder创建智能直线

NX二次开发NX对象类型及基本操作

NX1984+VS2017开发环境配置(C++)

NX二次开发:Checkmate例子根据dfa文件检查模型数据

UG NX二次开发(C#)-Part-根据模型名称获取part的对象