UG NX二次开发-外部模式

Posted GimiGimmy

tags:

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

NX二次开发外部模式(.exe)制作设置

UG/Open API 函数能在两种不同的环境下运行,根据编译链接情况的不同,UG/Open API 二次开发程序又具有两种形式:
a、外部式(External):此时UG/Open API程序可以脱离UG环境,在操作系统下单独运行,或者作为UG的一个子进程独立运行。 特点:调用灵活,用途广泛。但是无法利用UG的交互界面。
b、内部式(Internal):此时UG/Open API程序在UG环境下运行,与程序相关的各种事务通过UG代理执行。这样做的一个好处是可执行程序更小,同时链接的速度也更快。另外,一旦程序被装入,它将驻留在内存中,下次使用时不需重新加载,这样也节省了时间。而且这种方式下用户可与计算机交互,开发的程序能与UG无缝集成。 特点:直接控制UG的行为。 和用户交互。
本文介绍外部模式的操作过程。

1 创建NXOpenTestApp工程

在NXOpenCPlusPlus解决方案中,添加一个新项目(NXOpenTestApp)。


点击“下一步”,在应用设置界面中,选择“exe”模型,将类名改为NXOpenTestApp”。


这样就创建完成了NXOpenTestApp项目

点击“生成解决方案”如果没有报错,就可以查到输出目录中有NXOpenTestApp.exe。

2 外部模式的代码介绍

2.1 头文件

在模板中加载的头文件包括以下几个:

  1. UF函数—是用于调用Ufun函数,是基于UGOpen C的
    //NXOpenTestApp
    // Mandatory UF Includes UF函数
    #include <uf.h>
    #include <uf_object_types.h>
  2. NXOpen C++头文件
    // Internal+External Includes内部模式和外部模式包括的NXOPENC++头文件
    #include <NXOpen/Annotations.hxx>
    #include <NXOpen/Assemblies_Component.hxx>
    #include <NXOpen/Assemblies_ComponentAssembly.hxx>
    #include <NXOpen/Body.hxx>
    #include <NXOpen/BodyCollection.hxx>
    #include <NXOpen/Face.hxx>
    #include <NXOpen/Line.hxx>
    #include <NXOpen/NXException.hxx>
    #include <NXOpen/NXObject.hxx>
    #include <NXOpen/Part.hxx>
    #include <NXOpen/PartCollection.hxx>
    #include <NXOpen/Session.hxx>
  3. 标准的C++库
    // Std C++ Includes 标准的C++库文件
    #include
    #include

using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr;

2.2 入口函数main(int argc, char* argv[])

在外部模式中,main()是入口函数,其两个参数为:

  1. int argc—是指参数的个数,第一个参数是exe的完整路径
  2. char *argv[]—是参数值,中间以空格分开。

2.3主要代码函数do_it()

在外部模式时,主要的功能代码是在回调do_it()函数完成的。

3 创建一个块特征示例

3.1 外部模式的实现步骤

创建块特征示例是经过以下步骤完成的:

  1. 打开.prt文件;
  2. 创建块特征;
  3. 更新模型;
  4. 保存模型;
  5. 关闭模型;

3.2 外部模式的参数说明

NXOpenTestApp.exe的参数包括以下几个:

  1. NXOpenTestApp.exe的全路径
  2. .prt文件的全路径
  3. 块定位点
  4. 块的长度值
  5. 块的宽度值
  6. 块的高度值

3.3代码实现

  1. 声明全局变量
    char *exeName;
    char *partName;
    char *pointCoord[3];
    char *length;
    char *width;
    char *height;

  2. 在main()读取参数
    int main(int argc, char* argv[])

    try

    exeName = argv[0];
    partName = argv[1];
    pointCoord[0] = argv[2];
    pointCoord[1] = argv[3];
    pointCoord[2] = argv[4];

     length = argv[5];
     width = argv[6];
     height = argv[7];
     
     // Create NXOpen C++ class instance
     NXOpenTestApp *theNXOpenTestApp;
     theNXOpenTestApp = new NXOpenTestApp();
     theNXOpenTestApp->do_it();
     delete theNXOpenTestApp;
    


    catch (const NXException& e1)

    cerr << "NXException: " << e1.ErrorCode() << endl;
    cerr << e1.Message() << endl;

    catch (const exception& e2)

    cerr << "Exception: " << e2.what() << endl;

    catch (…)

    cerr << "Unknown Exception: " << endl;

  3. do_it()函数
    //打开模型文件
    void NXOpenTestApp::do_it()

    // TODO: add your code here
    //打开prt文件
    NXOpen::Session *theSession = NXOpen::Session::GetSession();
    NXOpen::Part *workPart(theSession->Parts()->Work());
    NXOpen::Part *displayPart(theSession->Parts()->Display());
    // ----------------------------------------------
    // Menu: 文件(F)->打开(O)…
    // ----------------------------------------------
    NXOpen::BasePart *basePart1;
    NXOpen::PartLoadStatus *partLoadStatus1;
    basePart1 = theSession->Parts()->OpenActiveDisplay(partName, NXOpen::DisplayPartOptionAllowAdditional, &partLoadStatus1);

    workPart = theSession->Parts()->Work(); // empty
    displayPart = theSession->Parts()->Display(); // empty
    delete partLoadStatus1;
    // ----------------------------------------------
    // Menu: 插入(S)->设计特征(E)->块(K)…
    // ----------------------------------------------
    NXOpen::Session::UndoMarkId markId1;
    markId1 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityVisible, NXOpen::NXString("\\350\\265\\267\\347\\202\\271", NXOpen::NXString::UTF8));

    NXOpen::Features::Feature *nullNXOpen_Features_Feature(NULL);
    NXOpen::Features::BlockFeatureBuilder *blockFeatureBuilder1;
    blockFeatureBuilder1 = workPart->Features()->CreateBlockFeatureBuilder(nullNXOpen_Features_Feature);

    blockFeatureBuilder1->BooleanOption()->SetType(NXOpen::GeometricUtilities::BooleanOperation::BooleanTypeCreate);

    std::vector<NXOpen::Body *> targetBodies1(1);
    NXOpen::Body *nullNXOpen_Body(NULL);
    targetBodies1[0] = nullNXOpen_Body;
    blockFeatureBuilder1->BooleanOption()->SetTargetBodies(targetBodies1);

    blockFeatureBuilder1->BooleanOption()->SetType(NXOpen::GeometricUtilities::BooleanOperation::BooleanTypeCreate);

    std::vector<NXOpen::Body *> targetBodies2(1);
    targetBodies2[0] = nullNXOpen_Body;
    blockFeatureBuilder1->BooleanOption()->SetTargetBodies(targetBodies2);

    theSession->SetUndoMarkName(markId1, NXOpen::NXString("\\345\\235\\227 \\345\\257\\271\\350\\257\\235\\346\\241\\206", NXOpen::NXString::UTF8));

    NXOpen::Point3d coordinates1(0.0, 0.0, 0.0);
    NXOpen::Point *point1;
    point1 = workPart->Points()->CreatePoint(coordinates1);

    blockFeatureBuilder1->SetOriginPoint(point1);

    NXOpen::Unit *unit1(dynamic_cast<NXOpen::Unit *>(workPart->UnitCollection()->FindObject(“MilliMeter”)));
    NXOpen::Expression *expression1;
    expression1 = workPart->Expressions()->CreateSystemExpressionWithUnits(“0”, unit1);

    NXOpen::Session::UndoMarkId markId2;
    markId2 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, NXOpen::NXString("\\345\\235\\227", NXOpen::NXString::UTF8));

    theSession->DeleteUndoMark(markId2, NULL);

    NXOpen::Session::UndoMarkId markId3;
    markId3 = theSession->SetUndoMark(NXOpen::Session::MarkVisibilityInvisible, NXOpen::NXString("\\345\\235\\227", NXOpen::NXString::UTF8));

    blockFeatureBuilder1->SetType(NXOpen::Features::BlockFeatureBuilder::TypesOriginAndEdgeLengths);

    blockFeatureBuilder1->SetOriginPoint(point1);

    NXOpen::Point3d originPoint1(atof(pointCoord[0]), atof(pointCoord[1]), atof(pointCoord[2]));
    blockFeatureBuilder1->SetOriginAndLengths(originPoint1, length, width, height);

    blockFeatureBuilder1->SetBooleanOperationAndTarget(NXOpen::Features::Feature::BooleanTypeCreate, nullNXOpen_Body);

    NXOpen::Features::Feature *feature1;
    feature1 = blockFeatureBuilder1->CommitFeature();

    theSession->DeleteUndoMark(markId3, NULL);

    theSession->SetUndoMarkName(markId1, NXOpen::NXString("\\345\\235\\227", NXOpen::NXString::UTF8));

    blockFeatureBuilder1->Destroy();

    workPart->MeasureManager()->SetPartTransientModification();

    workPart->Expressions()->Delete(expression1);

    workPart->MeasureManager()->ClearPartTransientModification();

    // ----------------------------------------------
    // Menu: 文件(F)->保存(S)
    // ----------------------------------------------
    NXOpen::PartSaveStatus *partSaveStatus1;
    partSaveStatus1 = workPart->Save(NXOpen::BasePart::SaveComponentsTrue, NXOpen::BasePart::CloseAfterSaveFalse);

    delete partSaveStatus1;
    // ----------------------------------------------
    // Menu: 文件(F)->关闭©->保存并关闭(S)
    // ----------------------------------------------
    NXOpen::PartSaveStatus *partSaveStatus2;
    partSaveStatus2 = workPart->Save(NXOpen::BasePart::SaveComponentsTrue, NXOpen::BasePart::CloseAfterSaveTrue);

    ##3.4 生成解决方案
    点击“生成解决方案”生成NXOpenTestApp.exe。

3.5 用CMD测试外部模式

  1. 打开cmd
    Win+R

输入的参数为:
D:\\ProjectRelated\\test\\NXOpenCPlusPlus\\x64\\Release\\NXOpenTestApp.exe D:\\ProjectRelated\\test\\NXOpenCPlusPlus\\x64\\Release\\empty.prt 100 100 100 1000 2000 3000

按“Enter”键,运行程序,直至结束。

3.6 查看生成的模型

用NX1984打开empty.prt文件,如下图所示,说明创建成功。

1.3.3.7 用批处理命令调用外部程序
除了CMD方法调用外部程序外,还可以采用批处理文件.bat来完成外部模式的调用。

  1. 在NXOpenTestApp.exe所在文件中创建一个NXOpenTestApp.bat文件
    当然,可以在位置创建.bat文件,我这里是方便查找。

  2. 将参数写入到.bat文件中

  3. 以管理员身份运行NXOpenTestApp.bat
    运行完成后,用NX1984查看生成的块特征模型。

结论

起始外部模式流程也是很简单的,关键还是内部的代码编写。如果有不明白的,可以查看https://download.csdn.net/download/yang19861007/74091102?spm=1001.2014.3001.5501有完整的录制视频;也可以私信联系博主。

以上是关于UG NX二次开发-外部模式的主要内容,如果未能解决你的问题,请参考以下文章

UG NX二次开发(C#)-外部模式-导出dwg格式的文件

UG NX二次开发(C#)-外部模式-创建一个新的空模型文件

UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象

UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象

UG NX二次开发(C++)-环境设置-内部模式(插件)制作设置

UG NX二次开发(C#)-装配-删除阵列矩阵