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 头文件
在模板中加载的头文件包括以下几个:
- UF函数—是用于调用Ufun函数,是基于UGOpen C的
//NXOpenTestApp
// Mandatory UF Includes UF函数
#include <uf.h>
#include <uf_object_types.h> - 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> - 标准的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()是入口函数,其两个参数为:
- int argc—是指参数的个数,第一个参数是exe的完整路径
- char *argv[]—是参数值,中间以空格分开。
2.3主要代码函数do_it()
在外部模式时,主要的功能代码是在回调do_it()函数完成的。
3 创建一个块特征示例
3.1 外部模式的实现步骤
创建块特征示例是经过以下步骤完成的:
- 打开.prt文件;
- 创建块特征;
- 更新模型;
- 保存模型;
- 关闭模型;
3.2 外部模式的参数说明
NXOpenTestApp.exe的参数包括以下几个:
- NXOpenTestApp.exe的全路径
- .prt文件的全路径
- 块定位点
- 块的长度值
- 块的宽度值
- 块的高度值
3.3代码实现
-
声明全局变量
char *exeName;
char *partName;
char *pointCoord[3];
char *length;
char *width;
char *height; -
在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;
-
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测试外部模式
- 打开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来完成外部模式的调用。
-
在NXOpenTestApp.exe所在文件中创建一个NXOpenTestApp.bat文件
当然,可以在位置创建.bat文件,我这里是方便查找。 -
将参数写入到.bat文件中
-
以管理员身份运行NXOpenTestApp.bat
运行完成后,用NX1984查看生成的块特征模型。
结论
起始外部模式流程也是很简单的,关键还是内部的代码编写。如果有不明白的,可以查看https://download.csdn.net/download/yang19861007/74091102?spm=1001.2014.3001.5501有完整的录制视频;也可以私信联系博主。
以上是关于UG NX二次开发-外部模式的主要内容,如果未能解决你的问题,请参考以下文章
UG NX二次开发(C#)-外部模式-创建一个新的空模型文件
UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象
UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象