说明
本文介绍了使用UFun和NXOpen C++进行UG NX二次开发的环境配置,并提供几个例子介绍NX二次开发的特点,帮助新手更快地上手UG NX二次开发
准备工作
UG NX10.0,Visual Studio2015
配置环境变量
-
在...Siemens\NX10.0目录下新建一个文件夹,取名为MYPROGRAM,以保存自己以后写的程序。例如,我的是在E:\Program Files\Siemens\NX 10.0
UG目录下新建文件夹
在此文件夹下再次新建两个文件夹,分别为Startup和Application。Startup文件夹用来存放菜单文件,Application文件夹用来存放动态链接库文件
- 在Startup文件夹下新建一个文本文件,命名为menu.men,这里要注意更改扩展名为.men。使用记事本打开此文件,写入以下内容,保存
VERSION 170
EDIT UG_GATEWAY_MAIN_MENUBAR
AFTER UG_HELP
CASCADE_BUTTON MyTools
LABEL 我的工具
END_OF_AFTER
MENU MyTools
BUTTON button1
LABEL 按钮1
BITMAP select_edge
ACTIONS
END_OF_MENU
- 在...Siemens\NX10.0\UGII\menus目录下找到custom_dirs.dat文件,用记事本打开,在文件的末尾添加以下代码:
UGII_USER_DIR = E:\Program Files\Siemens\NX 10.0\MYPROGRAM
软件环境变量
-
在系统环境变量中新建环境变量,变量名是UGII_USER_DIR,值是
系统环境变量E:\Program Files\Siemens\NX 10.0\MYPROGRAM
经过此步后,打开UG,可在菜单下发现我们创建的菜单
菜单栏 -
在Startup文件夹下新建tool_bar.rtb文件,写入以下内容
TITLE MyTools
VERSION 170
DOCK TOP
BUTTON button1
经过此步后,打开UG,能够在顶部的选项卡上看到我们的按钮一
选项卡
-
在上面对按钮的定义中,由于没有为按钮注册功能,所以在点击按钮时会有未注册功能的提示。按钮图标也是选取的UG本身的图标,UG所有的图标都有对应的名字,想使用哪个图标,只需在BITMAP 后填上图标的名字即可显示。在UG界面中,按下Ctrl+1,进入自定义模式,此时,在想要的图标上点右键,选择更改图标,再点击图标名称,即可看到图标名字
查看图标名称
设置IDE
- 将E:\Program Files\Siemens\NX 10.0\UGOPEN\vs_files下有三个文件夹,分别是VB、VC、VC#,将这三个文件夹全部复制到VS的安装目录中,与VS安装目录下的VB、VC、VC#文件夹合并。
-
在VS的安装目录下,进入...VC\vcprojects目录下,以管理员身份使用记事本打开NX10_NXOpenCPP.vsz文件,将里面的VS版本号改为14.0
同理,分别把...VC\vcprojects下的NX10_Open.vsz、...VB\VBProjects下的NX10_VB.vsz、...VC#\CSharpProjects下的NX10_VCS.vsz文件中的VS版本号改为14.0
修改完成后,打开VS,新建项目,会出现NX二次开发的模板,以后进行二次开发时,直接使用模板创建项目
无界面模式开发
以在坐标原点创建直径为100的球为例
- 新建NXOpenCPP项目,出现向导界面,无特殊要求的话直接点击完成
- 在生成的cpp文件中添加头文件uf_modl_primitives.h,在do_it函数内添加如下代码
void MyClass::do_it()
{
// TODO: add your code here
UF_initialize();
double center[3] = { 0.0,0.0,0.0 };
char* diameter = "100";
tag_t sphere = NULL_TAG;
UF_MODL_create_sphere1(UF_NULLSIGN, center, diameter, &sphere);
UF_terminate();
}
点击生成->生成XXX(XXX为你的项目名),在项目的目录下能够得到生成的DLL文件,在建模状态下,可按下Ctrl+U,选中自己的DLL文件并打开,即可看到效果,现在我们把它加到按钮上
在UG安装目录下,找到我们之前创建的MYPROGRAM文件夹,打开里面的menu.men文件,把之前的进行修改
VERSION 170
EDIT UG_GATEWAY_MAIN_MENUBAR
AFTER UG_HELP
CASCADE_BUTTON MyTools
LABEL 我的工具
END_OF_AFTER
MENU MyTools
BUTTON create_sphere
LABEL 创建球
BITMAP sphere
ACTIONS NX10_NXOpenCPP_Wizard1.dll
END_OF_MENU
同时对rtb文件进行相应的修改
将生成的动态链接库文件复制到Application文件夹中
此时,打开UG,进入建模界面,可以看到我们做的按钮的图标和名字都已改变,点击按钮,将会在原点创建一个直径为100的球
有界面模式开发
UG二次开发的界面是使用UG自带的Block UI STyler进行设计的,在UG界面下,点击开发人员选项卡,最右侧就是Block UI STyler按钮,点击进入BlockUI设计界面
仍以创建球为例,这次我们做一个界面,允许用户选择球心和直径
我们需要两个控件,一个是点拾取器,一个是指定直径的控件,双击左侧Selection下的Specify Point,就会产生一个带点拾取器的对话框,再双击Numbers下的expression,得到一个尺寸输入器,在右侧的属性管理器中修改相关控件的Label,并对直径的值进行限定,得到如图结果
界面设计
点击属性框中的CodeGeneration,选择生成代码为C++,然后保存,系统会自动生成dlx文件、cpp文件和hpp文件
将生成的3个文件保存到代码目录下,在VS中删除原来创建球的代码,将生成的cpp和hpp文件添加到解决方案中,将dlx文件复制到MYPROGRAM\Application文件夹中。
在hpp中添加头文件uf_modl_primitives.h,在cpp文件中的apply_cb函数中写入以下代码:
int CreateSphere::apply_cb()
{
int errorCode = 0;
try
{
//---- Enter your callback code here -----
//从控件处获取参数
UF_initialize();
Point3d centerPoint = center->Point();
double diameter = expression0->Value();
//将参数转化
double centerP[3];
centerP[0] = centerPoint.X;
centerP[1] = centerPoint.Y;
centerP[2] = centerPoint.Z;
char diam[256];
sprintf(diam, "%lf", diameter);
tag_t sphere;
UF_MODL_create_sphere1(UF_NULLSIGN, centerP, diam, &sphere);
UF_terminate();
}
catch(exception& ex)
{
//---- Enter your exception handling code here -----
errorCode = 1;
CreateSphere::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
}
return errorCode;
}
将生成的dll文件复制到Application文件夹下,球的创建功能完成。打开UG,点击我们制作的按钮,将会弹出我们做的对话框,选择参数后,就能够生成球体。
Tips
- UG中的每一个特征、对象都有自己的编号,即tag,可以通过tag访问特征的参数,创建特征后往往返回的是tag,tag在UG二次开发中非常重要。在...Siemens\NX10.0\UGII目录下,有个文件为ugii_env_ug.dat,将它用记事本打开,在末尾填上
UGII_DISPLAY_DEBUG = 1
,保存并关闭,重启UG,在菜单->帮助的最后将会出现调试选项,继续选择调试->调试工具->走刀(Tranverse),点击后将会出现一个窗口,这时点击任何特征,能够看到这个特征的相关属性和tag值,方便我们进行开发。 - UG二次开发涉及到很多指针操作,在使用指针时一定要注意对指针申请空间,避免野指针的出现。
- 可使用NXOpen::NXObjectManager::Get(tag_t Tag)函数将UFun对象转换成NXOpen对象,注意使用dynamic_cast时,转换失败会返回空指针,注意检查
- 经常查UG提供的函数文档,弄清楚参数的作用
在学习UG二次开发的过程中,感谢学长、老师、和技术大神的帮助,他们让我少走了许多弯路,为我解决了不少麻烦,也感谢网络上网友们的热情奉献
网友评论