NX二次开发实验1
基于UGNX的二次开发方法及其实现
18科技咨询导报 Science and Technology Consulting Herald2007 NO.17Science and Technology Consulting Herald高 新 技 术1 引言UG (Unigraphics)软件起源于美国麦道飞机工业公司,从20世纪60年代起UG就一直代表着工程制造业CAD/CAM软件产品的最高水平。
20世纪90年代,UG进入中国市场,受到广大CAD/CAM用户的欢迎。
但是由于该软件大多是通用支撑软件,覆盖面较广,包含的内容也比较多,因此,用户引进UG软件后,需要进行不同程度的二次开发,以便使其在本企业中淋漓尽致地发挥作用。
2 UG/Open API二次开发工程的创建UG/Open API程序使用的是C或C++编程语言,基于Windows 2000操作系统的UG软件的开发可以在VC++6.0环境下进行。
因为编制UG/Open API程序牵涉到UG提供的头文件(*.h文件)、库文件(*.lib文件)和C语言编程环境,因此需要进行一定的设置。
在VC编译环境中创建一个UG的二次开发工程有3种方法,下面分别加以说明:(1)利用UG/Open AppWizard向导创建UG/Open API工程在¥{UGII_BASE_DIR}\ugopen目录下找到名为UgOpen_v19.awx和UgOpen_v19.hlp的文件,将其复制到VC工程向导目录,例如C:\ProgramFiles\Microsoft VisualStudio\Common\MSDev98\Template\目录下。
运行VC,利用如图1所示UnigraphicsNX AppWizard V1向导创建UG应用工程,在向导第二步中,指定UG/Open应用程序创建模式是内部(Internal)*.dll方式还是外部(External)*.exe方式,并指定语言类型是C++还是C。
如果选定内部方式采用C或C++语言,则在向导第三步中需要选择程序入口方式及卸载方式,然后向导自动生成工程模板。
NX8.5二次开发菜单脚本文件应用实例一
『084』NX8.5二次开发菜单脚本文件应用实例一! 作者:唐康林 QQ:125317589 E ‐mail:tangkl@2013‐3‐2最近太忙,工作比较累,这半个月瘦了六斤,没有时间把自己的一些想法写出来分享给大家,周四的时候,有一位叫“love”的朋友在问,在NX中,能否自己在工具栏上面做一个图标,然后点击这个图标,实现两个功能;即点击这个图标以后,当前NX打开的文档自动保存,并马上弹出指定的网页,网页可以是单机的,也可以是互联网某一个网站。
他原本的想法是不用二次开,能否直接在NX的菜单脚本文件.men来实现这个功能。
我告诉他我的能力只能实现其中的一个功能,我个人觉得,根据他的描述,没有必要整这么麻烦。
NX的菜单脚本文件是很丰富的,我今年1月份在家的时候,大概研究了三天,发现它很强大,但由于时间关系,我今天就不一一讲解我所知道的功能;如果后期有时间,我会再写一部分分享给大家,所以这个文章的标题我用的是实例一,后期再讲其它实例。
直接入主题,针对这位朋友的问题进行讲解。
时间关系我,我就不从头到尾说NX二次开发,什么是菜单脚本文件,如何挂菜单脚本文件。
菜单脚本文件里面一般语句类似下例这样:BUTTON TKL_JSYQ_TOOLLABEL 技术要求ACTIONS gg.dfa根据这位朋友的要求是希望在ACTIONS后面进行一个控制,而实际在NX里面点击菜单或者工具条,就能弹出一个网页。
情况一、点击后打开一个网站这种情况语句可以直接写成:ACTIONS "start "后面的网站网址根据你的需要进行换!情况二、点击菜单或者工具命令要求弹出的网站是本机的一般情况下,根据我的经验,存单机的网页,格式一般是.mht格式,而这种格式是用IE来打开;明白了这个过程原理以后,我们就可以在菜单脚本文件里面写成:ACTIONS "start iexplore D:\Program Files (x86)\UGS\NX8.5\TKLTOOLS\application\test20130302.mht"以上只是我自己电脑上的一个例子,等一下我会动画演示一下!语句的含义是,用指定程序打开电脑上指定的文件。
NX二次开发(非常有用)
#include<uf_ui.h>/*包含uc1601()函数原型的头文件*/
externvoidufusr(char*param,int*retcod,intparam_len)
{
/*获取UG/OPEN API的执行权限*/
if(UF_initialize()!=0)
return;
/*弹出消息窗口,显示“Hello,UG!”*/
uc1601("Hello,Uห้องสมุดไป่ตู้!",1);
/*释放UG/OPEN API的执行权限*/
UF_terminate();
}
三、实验步骤
1
为便于了解UG/Open API的使用,下面将创建一个简单的应用开发程序,其功能是在UG环境中显示一个消息对话框“Hello,UG!”。运行平台为WindowsXP,开发平台为Visual 和UG/NX4。
图1-7
图1-8
1
在UG界面中选择菜单File→Execute→NX Open,在系统弹出的一个文件选择对话框中选择应用程序“Hello UG.dll”。如图1-9、图1-10所示。
图1-9
图1-10
图1-11
2
应用开发程序框架还可以采用Win32 DLL向导创建。Win32 DLL向导创建Windows常规DLL,它只能导出C样式函数,不能导出C++类、成员函数和重载函数,同UG/OpenAppWizard向导创建工程项目一样不支持 MFC。利用Win32应用程序向导创建工程项目,包括两个步骤:新建项目和设置项目属性。
UGNX-vb二次开发
用进行UGNX二次开发山东理工大学.精密模具实验室C#二次开发步骤也如此,基本一个样。
站在开发而非用户需求的角度UG二次开发主要分为三个方面:菜单工具条的定制、对话框、dll或者exe程序。
咱们的主要用dll方式,因为需要交互操作。
1:菜单定制:打开D:\UGS\NX5.0\UGII\ugii_env.dat 搜索UGII_USER_DIR,添加一行如下图所示的文字UGII_USER_DIR=D:\UGS\NX5.0\NXCAPP 注意,前面不要有#号,这是注释的符号。
在UGS\NX5.0目录下建立一个目录NXCAPP,在NXCAPP下建立两个子目录startup和apllication1.创建目录并配置环境变量(1)自定义创建。
创建一个文件夹如D:\UG_OPEN, 在此文件夹下创建二级文件夹D:\UG_OPEN\APPLICATION和D:\UG_OPEN\STARTUP。
打开UG安装目录下的UGII中ugii_env.dat文件,修改UGII_USER_DIR下的路径,如UGII_USER_DIR=D:\UG_OPEN,并去掉前面的“#”。
(2)第三方创建。
找到UG安装目录下的UGALLIANCE下的VENDOR文件夹,查看其下是否存在Application和Startup文件夹,如果不存在则创建它们。
打开UG安装目录下的UGII中ugii_env.dat文件,将UGII_VENDOR_DIR前面的“#”去掉。
(3)系统自己创建。
找到UG安装目录下的UGALLIANCE下的SITE文件夹,查看其下是否存在Application和Startup文件夹,如果不存在则创建它们。
打开UG安装目录下的UGII中ugii_env.dat文件,将UGII_SITE_DIR前面的“#”去掉。
这三种方法的区别在于系统启动时加载的顺序不同,依次为site,vendor和用户自己定义的。
Application主要存放dlg文件,所谓dlg文件就是用UGNX的UIStyler编辑出来的对话框文件。
NX二次开发(非常有用)
1.2对话框设计
UIStyler可视化界面包括基本对话框、对象浏览器、属性编辑器、控件栏和控件编辑工具五部分。用户在控件栏中选择控件后放置在基本对话框中,通过对象浏览器查看在基本对话框中设置的控件对象信息、利用控件编辑工具调整控件布局,通过属性编辑器编辑对话框及指定控件的属性。
二、实验内容
分别使用UG/OpenAppWizard向导和Win32应用程序向导(DLL)的方法创建UG二次开发工程项目,并利用Visual Studio 2005集成环境来编辑、编译并运行下面简单UG二次开发程序:
#include<uf.h>/*包含UF_initialize()和UF_terminate()函数原型的头文件*/
图1-5编译链接项目
1.4调试程序
方法一:在程序编译之后,首先在程序中设置断点,点击主菜单“调试→启动”,如图1-6所示,启动NX系统。在NX系统中激活.dll程序,程序进入调试状态,F11是逐语句调试,F10是逐过程调试(注意,在调试程序之前,一定对项目属性的调试进行设置)。
图1-6调试程序
方法二:在程序编译、代码中设置断点后,启动UG NX4;回到Visual 集成开发环境,点击主菜单“工具→调试进程”,系统打开“进程”对话框,如图1-7所示,双击“可用进程”列表中“ugraf.exe”,系统打开“附加进程”对话框,如图1-8所示,选择要调试程序类型为“Native”,单击“确定”按钮,系统进入程序调试状态,按“F11”或“F10”进行逐语句或逐过程调试。
图1-14解决方案资源管理器图
步骤二:设置项目属性
选择项目菜单下的属性项,将显示如图1-15所示的UFSolution属性页。
图1-15项目属性页-常规
NX二次开发-装配篇详解(UFUNC,NXOPENC++,C#API介绍)【更新日期202。。。
NX⼆次开发-装配篇详解(UFUNC,NXOPENC++,C#API介绍)【更新⽇期202。
这篇⽂章的内容涉及⽐较多,我⼀次写不完,要分⼏次去更新。
相信很多⼈在刚开始学NX装配相关⼆次开发的时候,都会有点搞不清楚,什么是实例,什么是原型这些专业术语等等。
我在刚接触的时候,也是很懵逼的。
今天我整理了⼀下,做个装配篇特辑。
------------------------------------------------------------------------Assembly装配的常⽤术语在装配环境中总保持只有⼀个部件是当前活动的,它叫⼯作部件(workpart)。
⽤户创建的所有UF对象、表达式等都是在⼯作部件中创建。
此外,还有⼀个叫当前显⽰部件(displaypart)的概念。
在UG的某些应⽤(如Modeling)时,当前显⽰部件和⼯作部件可以不同。
装配图是⼀类特殊的Part,它本⾝由多个Part所组成。
装配图中的各个⼦图称为组件,组件本⾝也可以是装配图。
装配图中并不包含⼦图,⽽是⼦图的再现。
⼦图的所有再现都来⾃⼦图的原型,⼦图的每个再现都叫做⼦图的实例。
Prototype Tag:Part或Object在原本⽂件中的tag。
Instance Tag:⼦Part被装配到⽗档中作为Instance的tag,是指⽤户绝对装配次数。
Occurrence Tag:⼦Part或Object装配到主⽂档中作为Occurrence的tag。
它只是⼀种映像,当同⼀个⼦Part或Object在主⽂档中被装配多次,它们的Occurrence Tag是不同的,分别表明了装配的先后次序以及在主⽂档中不同的映像。
装配树的结构UG装配是以树型结构组织装配中的部件,⼀个部件⽂件中只能有⼀棵装配树,即只能存在⼀个装配根节点。
装配中的节点由部件原型、部件事件与部件实例3种对象进⾏描述。
部件事件(partoccurrence)是装配环境下对实际存在的部件模型(即部件原型)的⼀种引⽤,部件事件也可以理解为指向部件原型的指针。
NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))
NX⼆次开发-基于MFC界⾯的NX对Excel读写操作(OLE⽅式(COM组件))EXCAL操作(⼀)打开写⼊新建⼀个MFC项⽬点击下⼀步选择基于对话框直接点完成,进来后如下图先点项⽬,右键属性,更改为多字节。
先什么都不动,编译⼀下代码。
默认看能不能通过。
然后点项⽬,右键类向导。
弹出窗⼝如下点击添加类-类型库中的MFC类弹出如下我们切换到⽂件,点击添加。
此处添加要找到的⽂件就是你电脑上装的EXCAL.exe这个程序⽂件。
如果你不知道怎么找到的话,有⼀个⽅法,先去开始菜单找到你的EXCAL快捷⽅式,然后在点右键,打开⽂件所在的位置。
这样就找到了。
下⾯在回到MFC项⽬⾥⾯,我们选中这个⽂件。
添加进来之后,如图所⽰。
左侧为EXCAL给出的接⼝,我们来选择⼀些需要的添加进来。
我们就先添加这七个,后续有其他需求在添加其他的。
(先在左侧接⼝⾥选中⼀个,点中间的>就能添加到右侧⾥⽣成的类⾥,不想要就在点中间的<撤退回去。
)然后我们点完成,点确定。
就看到头⽂件⾃动添加进来了。
我们点击新增进来的EXCAL每个头⽂件,都把第⼀⾏的那句注释掉。
都注释完之后,我们在#include "stdafx.h"⾥添加EXCAL头⽂件,然后编译代码,出现如下报错问题。
这时我们双击这个错误,跳到对应的代码那⾥。
有问题的位置如下我们需要在DialogBox前⾯加上⼀个 _ 下划线。
再去编译就通过了。
别问我为什么,我答不上来,你照着搞就是了,别⼈就是这么搞的。
好的,到这⾥我们这个项⽬环境就算搭建完成了。
下⾯可以写代码了。
点击MFC那个对话框界⾯,双击确定。
在⾥⾯写代码。
代码如下:打开EXCAL,写⼊内容。
1//1.创建基本对象2 CApplication App; //创建应⽤程序实例3 CWorkbooks Books; //⼯作簿,多个Excel⽂件4 CWorkbook Book; //单个⼯作簿5 CWorksheets sheets;//多个sheet页⾯6 CWorksheet sheet; //单个sheet页⾯7 CRange range; //操作单元格8//2.打开指定Excel⽂件,如果不存在就创建9char path[MAX_PATH];10 GetCurrentDirectory(MAX_PATH, (TCHAR*)path);//获取当前路径11 CString strExcelFile = (TCHAR*)path;12 CString strdevName = _T("\\Test.xlsx"); //xls也⾏13 strExcelFile += strdevName;14 COleVariant15 covTrue((short)TRUE),16 covFalse((short)FALSE),17 covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);1819 LPDISPATCH lpdisp = NULL;20//1.创建Excel实例21if (!App.CreateDispatch(_T("Excel.Application"), NULL))22 {23 AfxMessageBox(_T("创建Excel实例失败"));24 exit(-1);25 }26else27 {28 AfxMessageBox(_T("创建成功"));29 }30 App.put_Visible(TRUE); //打开Excel31 App.put_UserControl(FALSE);32//2. 得到workbooks容器33 Books.AttachDispatch(App.get_Workbooks());34 Book.AttachDispatch(Books.Add(covOptional));35 sheets.AttachDispatch(Book.get_Worksheets());36 sheet.AttachDispatch(sheets.get_Item(COleVariant((short)1))); //获取sheet137 sheet.put_Name(_T("TestName")); //设置sheet1名字3839//3. 加载要合并的单元格40 range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")), COleVariant(_T("E2"))), TRUE);41 range.Merge(COleVariant((long)0)); //合并单元格4243//4. 设置表格内容44 range.AttachDispatch(sheet.get_Cells(), TRUE); //加载所有单元格45 range.put_Item(COleVariant((long)2), COleVariant((long)2), COleVariant(_T("电⽓⼯程及其⾃动化课程统计")));46 range.put_Item(COleVariant((long)3), COleVariant((long)2), COleVariant(_T("课程名称")));47 range.put_Item(COleVariant((long)3), COleVariant((long)3), COleVariant(_T("课时")));48 range.put_Item(COleVariant((long)3), COleVariant((long)4), COleVariant(_T("难度")));49 range.put_Item(COleVariant((long)3), COleVariant((long)5), COleVariant(_T("教学⽅式")));5051 range.put_Item(COleVariant((long)4), COleVariant((long)2), COleVariant(_T("电磁场")));52 range.put_Item(COleVariant((long)4), COleVariant((long)3), COleVariant(_T("30")));53 range.put_Item(COleVariant((long)4), COleVariant((long)4), COleVariant(_T("变态难")));54 range.put_Item(COleVariant((long)4), COleVariant((long)5), COleVariant(_T("⽼师讲课")));5556 range.put_Item(COleVariant((long)5), COleVariant((long)2), COleVariant(_T("电机学")));57 range.put_Item(COleVariant((long)5), COleVariant((long)3), COleVariant(_T("40")));58 range.put_Item(COleVariant((long)5), COleVariant((long)4), COleVariant(_T("难")));59 range.put_Item(COleVariant((long)5), COleVariant((long)5), COleVariant(_T("⽼师讲课加实验")));6061 range.put_Item(COleVariant((long)6), COleVariant((long)2), COleVariant(_T("PLC")));62 range.put_Item(COleVariant((long)6), COleVariant((long)3), COleVariant(_T("20")));63 range.put_Item(COleVariant((long)6), COleVariant((long)4), COleVariant(_T("普通")));64 range.put_Item(COleVariant((long)6), COleVariant((long)5), COleVariant(_T("⽼师讲课加实验")));656667 range.put_Item(COleVariant((long)7), COleVariant((long)2), COleVariant(_T("电⼒系统")));68 range.put_Item(COleVariant((long)7), COleVariant((long)3), COleVariant(_T("50")));69 range.put_Item(COleVariant((long)7), COleVariant((long)4), COleVariant(_T("难")));70 range.put_Item(COleVariant((long)7), COleVariant((long)5), COleVariant(_T("⽼师讲课加实验")));7172 range.AttachDispatch(sheet.get_UsedRange());//加载已使⽤的单元格73 range.put_WrapText(COleVariant((long)1)); //设置⽂本⾃动换⾏7475//5.设置对齐⽅式76//⽔平对齐:默认 1 居中 -4108,左= -4131,右=-415277//垂直对齐:默认 2 居中 -4108,左= -4160,右=-410778 range.put_VerticalAlignment(COleVariant((long)-4108));79 range.put_HorizontalAlignment(COleVariant((long)-4108));80//6.设置字体颜⾊81 CFont0 ft;82 ft.AttachDispatch(range.get_Font());83 ft.put_Name(COleVariant(_T("楷体"))); //字体84 ft.put_ColorIndex(COleVariant((long)1));//颜⾊ //⿊⾊85 ft.put_Size(COleVariant((long)12)); //⼤⼩8687 range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")), COleVariant(_T("E2"))), TRUE);88 ft.AttachDispatch(range.get_Font());89 ft.put_Name(COleVariant(_T("华⽂⾏楷")));90 ft.put_Bold(COleVariant((long)1));91 ft.put_ColorIndex(COleVariant((long)5)); //颜⾊92 ft.put_Size(COleVariant((long)18)); //⼤⼩93 Book.SaveCopyAs(COleVariant(strExcelFile)); //保存9495 Book.put_Saved(TRUE);96//8.释放资源97 range.ReleaseDispatch();98 sheet.ReleaseDispatch();99 sheets.ReleaseDispatch();100 Book.ReleaseDispatch();101 Books.ReleaseDispatch();102 App.ReleaseDispatch();编译后,我们点调试-开始执⾏。
NX二次开发资料
手把手教你做UG二次开发1。
建立两个目录。
建立第一个目录 E:\my_first_UG,在这个目录下建立两个新的目录:E:\my_first_UG\application和E:\my_first_UG\startup。
建立第二个目录E:\my_source,用存放你的源代码。
2。
设置环境变量。
再Windows中设置一个新的环境变量:UGII_USER_DIR=E:\my_first_UG。
3。
打开UG,进入UIStyler应用(在Application菜单的最后)。
4。
设计一个对话框。
1)在"Dialog Title"一栏填入:First Dialog,按Apply(每次输入完成后,都要按Apply,为避免啰嗦,以后不再提及)。
2)在"Cue"一栏输入:%……%¥%¥¥##*%*(*(*—*—((,什么都行,呵呵。
3)在"Prefix Name"中,把CHANGE改为MY。
4)加入四个控件。
String,Push Button,Label和Single Select List编辑对话框的各个控件。
1)改变String控件的标题,标识和长度。
Label “String” -> “Input an item”.Identifier "STR_0" -> "ITEM"Width in... 0 -> 202) 改变Push Button控件的标题,标识和回调函数的名字。
Label "Push Button" -> "Import"Identifier "ACTION_1" -> "IMPORT"callbacks "action_1_act_cb" -> import_cb把"Creates Dialog"激活。
NX二次开发(非常有用)
盐城工学院优集学院目录实验一熟悉Visual Studio 2005开发环境及UG二次开发工程项目创建的方法 (2)实验二 UIStyler、Menuscript创建用户界面、菜单和工具条.. 16实验三外部数据库访问 (24)实验四零件设计 (40)实验五工程图设计 (48)实验六装配设计 (61)实验一熟悉Visual Studio 2005开发环境及UG二次开发工程项目创建的方法一、实验目的1、了解和使用Visual Studio2005集成开发环境;2、熟悉Visual Studio2005环境的基本命令和功能键;3、掌握UG二次开发工程项目创建过程和方法;4、理解简单的UG二次开发程序结构。
二、实验内容分别使用UG/Open AppWizard向导和Win32应用程序向导(DLL)的方法创建UG 二次开发工程项目,并利用Visual Studio 2005集成环境来编辑、编译并运行下面简单UG二次开发程序:#include <uf.h> /* 包含UF_initialize()和UF_terminate()函数原型的头文件*/#include <uf_ui.h> /* 包含uc1601()函数原型的头文件*/extern void ufusr( char *param, int *retcod, int param_len ){/* 获取UG/OPEN API的执行权限 */if(UF_initialize()!=0)return;/* 弹出消息窗口,显示“Hello,UG!” */uc1601("Hello,UG!",1);/* 释放UG/OPEN API的执行权限*/UF_terminate();}三、实验步骤1利用UG/Open AppWizard向导为便于了解UG/Open API的使用,下面将创建一个简单的应用开发程序,其功能是在UG环境中显示一个消息对话框“Hello,UG!”。
NX二次开发-C++使用IDAPro反编译dll,追踪查看里面使用的UFUNAPI函数(三部曲1)
NX⼆次开发-C++使⽤IDAPro反编译dll,追踪查看⾥⾯使⽤的UFUNAPI函数(三部曲1)⼀年前我写过⼀个C#反编译dll查看代码系列今天写⼀下C++反编译dll查看代码系列也是准备的三部曲,这是三部曲1演⽰版本:NX9+VS2012操作步骤1.⾃⼰在VS⾥⽤NX开发向导写⼀份代码(简单例⼦)//NX9_NXOpenCPP_Wizard2// Mandatory UF Includes#include <uf.h>#include <uf_object_types.h>// Internal Includes#include <NXOpen/ListingWindow.hxx>#include <NXOpen/NXMessageBox.hxx>#include <NXOpen/UI.hxx>// Internal+External Includes#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>#include <uf.h>#include <uf_modl.h>#include <uf_obj.h>// Std C++ Includes#include <iostream>#include <sstream>using namespace NXOpen;using std::string;using std::exception;using std::stringstream;using std::endl;using std::cout;using std::cerr;//------------------------------------------------------------------------------// NXOpen c++ test class//------------------------------------------------------------------------------class MyClass{// class memberspublic:static Session *theSession;static UI *theUI;MyClass();~MyClass();void do_it();void print(const NXString &);void print(const string &);void print(const char*);private:Part *workPart, *displayPart;NXMessageBox *mb;ListingWindow *lw;LogFile *lf;};//------------------------------------------------------------------------------// Initialize static variables//------------------------------------------------------------------------------Session *(MyClass::theSession) = NULL;UI *(MyClass::theUI) = NULL;//------------------------------------------------------------------------------// Constructor//------------------------------------------------------------------------------MyClass::MyClass(){// Initialize the NX Open C++ API environmentMyClass::theSession = NXOpen::Session::GetSession();MyClass::theUI = UI::GetUI();mb = theUI->NXMessageBox();lw = theSession->ListingWindow();lf = theSession->LogFile();workPart = theSession->Parts()->Work();displayPart = theSession->Parts()->Display();}//------------------------------------------------------------------------------// Destructor//------------------------------------------------------------------------------MyClass::~MyClass(){}//------------------------------------------------------------------------------// Print string to listing window or stdout//------------------------------------------------------------------------------void MyClass::print(const NXString &msg){if(! lw->IsOpen() ) lw->Open();lw->WriteLine(msg);}void MyClass::print(const string &msg){if(! lw->IsOpen() ) lw->Open();lw->WriteLine(msg);}void MyClass::print(const char * msg){if(! lw->IsOpen() ) lw->Open();lw->WriteLine(msg);}void MyTest(){UF_initialize();//创建块UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔double Corner_pt[3] = { 0.0, 0.0, 0.0 };//设置原点char *Edge_Len[3] = { "100", "100", "100" };//设置长宽⾼tag_t BlkTag = NULL_TAG;UF_MODL_create_block1(Sign, Corner_pt, Edge_Len, &BlkTag); //特征找体tag_t body_tag = NULL_TAG;UF_MODL_ask_feat_body(BlkTag, &body_tag);//设置颜⾊UF_OBJ_set_color(body_tag, 186);UF_terminate();}//------------------------------------------------------------------------------// Do something//------------------------------------------------------------------------------void MyClass::do_it(){// TODO: add your code hereMyTest();}//------------------------------------------------------------------------------// Entry point(s) for unmanaged internal NXOpen C/C++ programs//------------------------------------------------------------------------------// Explicit Executionextern"C" DllExport void ufusr( char *parm, int *returnCode, int rlen ){try{// Create NXOpen C++ class instanceMyClass *theMyClass;theMyClass = new MyClass();theMyClass->do_it();delete theMyClass;}catch (const NXException& e1){UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());}catch (const exception& e2){UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());}catch (...){UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");}}//------------------------------------------------------------------------------// Unload Handler//------------------------------------------------------------------------------extern"C" DllExport int ufusr_ask_unload(){return (int)NXOpen::Session::LibraryUnloadOptionImmediately;}2.打开IDA Pro,选择上⾯代码编译⽣成的C++ dll开始反编译打开界⾯如下点击Exports我们可以查看到ufusr这个⼊⼝函数点击Import我们可以查看到当前这个dll⾥所调⽤的所有UFUN函数和NXOPEN⽅法,以及这个UFUN函数出⾃哪个.dll⾥下⾯我们开始根据逻辑流程去反编译代码我们都知道nx⼆次开发的dll都是由ufusr这个⼊⼝函数开始加载的我们先去函数窗⼝中找到ufusr_0这个函数,双击打开它,右侧弹出代码逻辑流程图下⾯开始解析介绍怎么看流程⿏标缩⼩拖动找到最上⾯的块,从ufusr开始看然后顺着箭头往下找,我们找到了try 找到了new,在往下我们就看到了MyClass::MyClass(void),是不是很熟悉,刚好这⾥和我们写的代码对应上了。
NXUG二次开发—UI—内部UI的使用
NXUG二次开发—UI—内部UI的使用NXUG二次开发是指在NXUG软件的基础上进行二次开发,以满足用户特定的需求。
在二次开发中,UI设计是一个非常重要的环节。
本文将介绍NXUG二次开发中内部UI的使用,包括如何使用内部UI来美化界面,提高用户体验等。
首先,内部UI是指在NXUG中已经预先设计好的界面元素,开发者可以直接调用这些界面元素来搭建自己的界面。
内部UI可以分为两类,一类是系统自带的内部UI,另一类是用户自定义的内部UI。
系统自带的内部UI是在NXUG软件中提供的,用户可以直接使用。
用户自定义的内部UI是指用户根据自己的需求在NXUG中设计的界面元素。
在利用内部UI进行界面设计时,我们可以通过以下几个方面来进行优化:1.界面风格的选择:在界面设计中,我们可以选择不同的界面风格来满足用户的需求。
比如,选择简约风格的UI,可以使界面简洁明了,给用户带来舒适的体验;选择扁平化风格的UI可以使界面看起来现代化,更符合时下的设计潮流。
2.颜色的搭配:在界面设计中,我们可以根据不同的功能模块选择不同的颜色搭配,以便用户能够更清晰地识别不同的功能。
同时,颜色的搭配也要遵循一定的原则,比如不同颜色之间的对比度要适中,色彩要和谐统一等。
3.字体的选择:在界面设计中,字体的选择也非常重要。
合适的字体可以使界面更加美观,同时也要注意字体大小和样式的选择,以便用户能够更方便地阅读信息。
4.布局的优化:在界面设计中,布局的优化也是至关重要的一环。
合理的布局可以使界面更加美观,同时也要考虑到用户的习惯和使用习惯,使界面更加易用。
通过上述的优化措施,我们可以使界面更加美观,提高用户体验,使用户更加喜欢使用我们的软件。
总结起来,NXUG二次开发中内部UI的使用是非常重要的,通过合理的界面设计和优化,可以提高用户体验,增加用户的粘性。
在使用内部UI时,我们可以根据不同的需求选择不同的界面风格、颜色搭配、字体和布局等。
通过这些优化措施,我们可以使界面更加美观,提高用户的使用体验,从而更好地满足用户的需求。
NX二次开发工程项目创建的方法
实验一熟悉Visual Studio 2005开发环境及
NX二次开发工程项目创建的方法
一、实验目的
1.了解和使用Visual Studio 2005集成开发环境;
2.熟悉Visual Studio2005环境的基本命令和功能键;
3.掌握NX二次开发工程项目创建过程和方法;
4.理解简单的NX二次开发程序结构。
二、实验设备
硬件:计算机
软件:NX/NX 5.0、Visual Studio 2005
三、实验内容
熟悉Visual Studio 2005开发环境,按照实验指导书中的步骤,创建二次开发的工程应用项目,并设置项目的属性。
四、实验注意事项
1、设置项目的属性时,一定要选择生成项目类型为DLL(动态链接);
2、加入UF的系统库为:libufun libnxopenint
五、实验要求
1、复习教材有关内容。
2、掌握NX二次开发程序项目的建立、程序调试步骤。
3、完成实验报告。
NX二次开发-基于C++QT界面对话框(非模态嵌套)与NX交互的开发
NX⼆次开发-基于C++QT界⾯对话框(⾮模态嵌套)与NX交互的开发他应该是⽹络上第⼀个写QT做NX⼆次开发的。
但他这个是模态对话框的,会堵塞前后台交互,体验不是很好。
⽽且他是拿Qt Creator做的。
QT界⾯做NX⼆次开发这个我半年前给公司做QT应⽤程序开发的时候,就已经开始在研究怎么把QT界⾯做到NX⾥,但之前的尝试都是模态对话框,⼀直没有研究出来⾮模态对话框。
直到今天我在B站看MFC⾮模态对话框视频的时候,突然⼀个细节设置给了我灵感。
在加上我之前做过PyQt界⾯做FreeCAD的开发基础。
今天搞定了这个问题。
我之前写过“MFC界⾯做NX⼆次开发”,“winform界⾯做NX⼆次开发”,今天写"C++ QT界⾯界⾯做NX⼆次开发"。
界⾯这些东西都是有共性的。
结合NX做开发,思路都是⼀样的。
其实会⼀种就够⽤了。
为什么写C++ QT,因为QT除了C++,还有python版本的PyQt,我觉得⽤PyQt+NXOpenPython也是可以做开发的。
后⾯有空去研究研究。
因为FreeCAD我也是拿PyQt去做的。
演⽰:版本 NX11+VS2013+Qt 5.6.3(64位)过程我不会写的太详细,因为⼯作量太多。
但我会把重要的部分写出来。
⾄于QT怎么安装,怎么搭建项⽬,⾃⼰百度吧,我这⾥不会写那些。
1.新建项⽬编译项⽬。
成功2.将exe项⽬设置成dll项⽬在编译⽣成,已经变为dll项⽬3.添加NX的库⽂件,头⽂件,⼊⼝函数等设置附加包含⽬录$(UGII_BASE_DIR)\ugopen设置附加库⽬录$(UGII_BASE_DIR)\ugopen设置附加依赖项libufun.liblibufun_cae.liblibufun_cam.liblibufun_die.liblibufun_vdac.liblibufun_weld.liblibnxopencpp.liblibnxopencpp_annotations.liblibnxopencpp_assemblies.liblibnxopencpp_bodydes.liblibnxopencpp_cae.liblibnxopencpp_cam.liblibnxopencpp_diagramming.liblibnxopencpp_diagramminglibraryauthor.liblibnxopencpp_die.liblibnxopencpp_display.liblibnxopencpp_drafting.liblibnxopencpp_drawings.liblibnxopencpp_facet.liblibnxopencpp_features.liblibnxopencpp_fields.liblibnxopencpp_formboard.liblibnxopencpp_gateway.liblibnxopencpp_geometricanalysis.liblibnxopencpp_geometricutilities.liblibnxopencpp_issue.liblibnxopencpp_layer.liblibnxopencpp_layout2d.liblibnxopencpp_markup.liblibnxopencpp_mechanicalrouting.liblibnxopencpp_mechatronics.liblibnxopencpp_mfg.liblibnxopencpp_modldirect.liblibnxopencpp_motion.liblibnxopencpp_openxml.liblibnxopencpp_optimization.liblibnxopencpp_options.liblibnxopencpp_partfamily.liblibnxopencpp_pdm.liblibnxopencpp_physmat.liblibnxopencpp_placement.liblibnxopencpp_plas.liblibnxopencpp_positioning.liblibnxopencpp_preferences.liblibnxopencpp_report.liblibnxopencpp_routing.liblibnxopencpp_shapesearch.liblibnxopencpp_sheetmetal.liblibnxopencpp_shipdesign.liblibnxopencpp_sim.liblibnxopencpp_tooling.liblibnxopencpp_userdefinedobjects.liblibnxopencpp_userdefinedtemplate.liblibnxopencpp_validate.liblibnxopencpp_visualreporting.liblibnxopencpp_weld.liblibugopenint.liblibugopenint_cae.liblibugopenint_cam.liblibnxopenuicpp.lib添加uf头⽂件添加ufusr⼊⼝函数extern"C" DllExport void ufusr(char *param, int *retcod, int param_len){if (UF_initialize()){/* Failed to initialize */return;}UF_terminate();}extern"C" DllExport int ufusr_ask_unload(){return (UF_UNLOAD_UG_TERMINATE);//return (UF_UNLOAD_IMMEDIATELY);//return UF_UNLOAD_SEL_DIALOG;}编译项⽬,成功4.将对话框添加到uf⼊⼝函数中,以⾮模态⽅式显⽰出来。
基于NX平台的二次开发习题解答
基于UG平台的二次开发习题解答工学院优集学院二○一○年二月基于NX平台的二次开发课程习题解答课程代码:22021021学时数:32适用专业:机械设计制造及其自动化第1章二次开发应用初步1、创建一个“Hello,你的”消息对话框。
要求:利用UG自带的向导创建二次开发工程项目;利用单按钮消息对话框(UC1601())创建“Hello”加你的。
源程序:extern"C"DllExport void ufusr( char *parm, int *returnCode, int rlen ){/* Initialize the API environment */int errorCode = UF_initialize();if ( 0 == errorCode ){/* TODO: Add your application code here */uc1601("Hello, 你的",1);/* Terminate the API environment */errorCode = UF_terminate();}/* Print out any error messages */PrintErrorMessage( errorCode );}第2章二次开发应用框架1、创建圆柱体要求:创建一个Win32项目,并设置工程项目的属性,使其能够编译UG 二次开发工程项目;创建基本体素特征圆柱体。
源程序:#include<stdio.h>#include<uf.h>#include<uf_defs.h>#include<uf_modl.h>static void do_ugopen_api(void){UF_FEATURE_SIGN sign = UF_NULLSIGN;double cyl_orig[3] = {0.0,0.0,0.0};char *cyl_height="100";char *cyl_diam="100";double direction[3]={-1,0,0};tag_t cyl_obj;UF_MODL_create_cyl1(sign, cyl_orig, cyl_height,cyl_diam,direction, &cyl_obj);}extern void ufusr( char *param, int *retcode, int rlen ){if((UF_initialize())!=0)return;do_ugopen_api ();UF_terminate();return;}extern int ufusr_ask_unload(void){return(UF_UNLOAD_IMMEDIATELY);}extern void ufusr_cleanup(void){return;}2、创建一个凸台要求:凸台高H为你的学号,下底面直径B _diam为高h的两倍,上底面直径T _diam与高h相等。
NX二次开发资料
NX二次开发资料N某UG二次开发手把手教你做UG二次开发1。
建立两个目录。
建立第一个目录E:\my_firt_UG,在这个目录下建立两个新的目录:E:\my_firt_UG\application和E:\my_firt_UG\tartup。
建立第二个目录E:\my_ource,用存放你的源代码。
2。
设置环境变量。
再Window中设置一个新的环境变量:UGII_USER_DIR=E:\my_firt_UG。
3。
打开UG,进入UIStyler应用(在Application菜单的最后)。
4。
设计一个对话框。
1)在"DialogTitle"一栏填入:FirtDialog,按Apply(每次输入完成后,都要按Apply,为避免啰嗦,以后不再提及)。
2)在"Cue"一栏输入:%%¥%¥¥##某%某(某(某—某—((,什么都行,呵呵。
3)在"Prefi某Name"中,把CHANGE改为MY。
4)加入四个控件。
String,PuhButton,Label和SingleSelectLit编辑对话框的各个控件。
1)改变String控件的标题,标识和长度。
Label“String”->“Inputanitem”.Identifier"STR_0"->"ITEM"Widthin...0->202)改变PuhButton控件的标题,标识和回调函数的名字。
Label"PuhButton"->"Import"Identifier"ACTION_1"->"IMPORT"callback"action_1_act_cb"->import_cb把"CreateDialog"激活。
NX二次开发-使用数学方法计算两个向量之间的夹角(计算顺逆判断锐角还是钝角)
NX⼆次开发-使⽤数学⽅法计算两个向量之间的夹⾓(计算顺逆判断锐⾓还是钝⾓)前两天有⽹友在QQ群⾥提了⼀个问题,关于求向量夹⾓的问题。
他是先求⾯的⽮量⽅向,然后⽤向量求⾓度,⾃⼰写的函数求⾓度。
他得到的是锐⾓后来群⾥⼤家推荐他⽤UF_VEC3_angle_between这个函数,结果测试还是锐⾓。
这个时候的我还在等待着他们讨论完问题的答案(因为我不会)......⼤致就是他想判断两个向量之间的夹⾓是锐⾓还是钝⾓举例的模型也有⼈说直接判断边更快,凹凸边。
⽤到的pk函数是PK_EDGE_ask_convexity PK_EDGE_convexity_convex_c :边缘是凸的。
PK_EDGE_convexity_concave_c :边缘是凹的。
锐⾓就是凹边,PK帮助上有讲的讨论了⼀会,群⾥⼀个⼥⽹友(我有两只猫)发了⽅法我不会数学计算两个向量之间的夹⾓,我只会⽤函数UF_VEC3_angle_between去计算在QQ群⾥,有个⼥⽹友在⾥⾯发了⼀下数学⽅法计算两个向量之间的夹⾓,我收藏记录⼀下。
这是她QQ群⾥发的代码#define _USE_MATH_DEFINES#include <math.h>/* 起始向量*/double x0 = 0, y0 = 0, z0 = 1;/* ⽬标向量*/double x1 = 0, y1 = 1, z1 = 0;/* 计算夹⾓*/double dot = x0*x1+y0*y1+z0*z1;double aDot = std::round(std::acos(dot) * 180 / M_PI)/* 计算顺逆*/double ss2 = (y0*z1-z0*y1) + (z0*x1-x0*z1) +(x0*y1-y0*x1);double(ss2 < 0)aDot = 360 - aDot;#define _USE_MATH_DEFINES#include <math.h>double getVecAngle(const double vec0[3], const double vec1[3]){/* 起始向量*/double x0, y0, z0;/* ⽬标向量*/double x1, y1, z1;double ret_val = 0.f;/* 向量单位化 */double magnitude = std::sqrt(vec0[0] * vec0[0] + vec0[1] * vec0[1] + vec0[2] * vec0[2]);if (std::fabs(magnitude) < 1e-6) {// 0向量没意义return ret_val;}x0 = vec0[0] / magnitude;y0 = vec0[1] / magnitude;z0 = vec0[2] / magnitude;magnitude = std::sqrt(vec1[0] * vec1[0] + vec1[1] * vec1[1] + vec1[2] * vec1[2]);if (std::fabs(magnitude) < 1e-6) {// 0向量没意义return ret_val;}x1 = vec1[0] / magnitude;y1 = vec1[1] / magnitude;z1 = vec1[2] / magnitude;ret_val = (((y0*z1 - z0*y1) + (z0*x1 - x0*z1) + (x0*y1 - y0*x1)) < 0.f) ? (std::round(std::acos(x0*x1 + y0*y1 + z0*z1) * 180 / M_PI)) : (360 - std::round(std::acos(x0*x1 + y0*y1 + z0*z1) * 180 / M_PI));return ret_val;}这是我的demo//NX9_NXOpenCPP_Wizard1#define _USE_MATH_DEFINES#include <stdio.h>#include <math.h>// Mandatory UF Includes#include <uf.h>#include <uf_object_types.h>// Internal Includes#include <NXOpen/ListingWindow.hxx>#include <NXOpen/NXMessageBox.hxx>#include <NXOpen/UI.hxx>// Internal+External Includes#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>#include <uf.h>#include <uf_ui.h>#include <uf_vec.h>#include <uf_curve.h>// Std C++ Includes#include <iostream>#include <sstream>using namespace NXOpen;using std::string;using std::exception;using std::stringstream;using std::endl;using std::cout;using std::cerr;//------------------------------------------------------------------------------// NXOpen c++ test class//------------------------------------------------------------------------------class MyClass{// class memberspublic:static Session *theSession;static UI *theUI;MyClass();~MyClass();void do_it();void print(const NXString &);void print(const string &);void print(const char*);private:Part *workPart, *displayPart;NXMessageBox *mb;ListingWindow *lw;LogFile *lf;};//------------------------------------------------------------------------------// Initialize static variables//------------------------------------------------------------------------------Session *(MyClass::theSession) = NULL;UI *(MyClass::theUI) = NULL;//------------------------------------------------------------------------------// Constructor//------------------------------------------------------------------------------MyClass::MyClass(){// Initialize the NX Open C++ API environmentMyClass::theSession = NXOpen::Session::GetSession(); MyClass::theUI = UI::GetUI();mb = theUI->NXMessageBox();lw = theSession->ListingWindow();lf = theSession->LogFile();workPart = theSession->Parts()->Work();displayPart = theSession->Parts()->Display();}//------------------------------------------------------------------------------// Destructor//------------------------------------------------------------------------------MyClass::~MyClass(){}//------------------------------------------------------------------------------// Print string to listing window or stdout//------------------------------------------------------------------------------void MyClass::print(const NXString &msg){if(! lw->IsOpen() ) lw->Open();lw->WriteLine(msg);}void MyClass::print(const string &msg){if(! lw->IsOpen() ) lw->Open();lw->WriteLine(msg);}void MyClass::print(const char * msg){if(! lw->IsOpen() ) lw->Open();lw->WriteLine(msg);}double round(double r){return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);}double getVecAngle(const double vec0[3], const double vec1[3]){/* 起始向量*/double x0, y0, z0;/* ⽬标向量*/double x1, y1, z1;double ret_val = 0.f;/* 向量单位化 */double magnitude = std::sqrt(vec0[0] * vec0[0] + vec0[1] * vec0[1] + vec0[2] * vec0[2]);if (std::fabs(magnitude) < 1e-6) {// 0向量没意义return ret_val;}x0 = vec0[0] / magnitude;y0 = vec0[1] / magnitude;z0 = vec0[2] / magnitude;magnitude = std::sqrt(vec1[0] * vec1[0] + vec1[1] * vec1[1] + vec1[2] * vec1[2]);if (std::fabs(magnitude) < 1e-6) {// 0向量没意义return ret_val;}x1 = vec1[0] / magnitude;y1 = vec1[1] / magnitude;z1 = vec1[2] / magnitude;ret_val = (((y0*z1 - z0*y1) + (z0*x1 - x0*z1) + (x0*y1 - y0*x1)) < 0.f) ? (std::acos(x0*x1 + y0*y1 + z0*z1) * 180 / M_PI) : (360 - std::acos(x0*x1 + y0*y1 + z0*z1) * 180 / M_PI); ///* 计算顺逆*/double ss2 = (y0*z1-z0*y1) + (z0*x1-x0*z1) +(x0*y1-y0*x1);if (ss2 < 0)ret_val = 360 - ret_val;return ret_val;}//------------------------------------------------------------------------------// Do something//------------------------------------------------------------------------------void MyClass::do_it(){// TODO: add your code hereUF_initialize();//创建直线1UF_CURVE_line_t LineCoords1;LineCoords1.start_point[0] = 0.0;LineCoords1.start_point[1] = 0.0;LineCoords1.start_point[2] = 0.0;LineCoords1.end_point[0] = 0.0;LineCoords1.end_point[1] = 100.0;LineCoords1.end_point[2] = 0.0;tag_t Line1Tag = NULL_TAG;UF_CURVE_create_line(&LineCoords1, &Line1Tag);//创建直线2UF_CURVE_line_t LineCoords2;LineCoords2.start_point[0] = 0.0;LineCoords2.start_point[1] = 0.0;LineCoords2.start_point[2] = 0.0;LineCoords2.end_point[0] = 110.0;LineCoords2.end_point[1] = 80.0;LineCoords2.end_point[2] = 0.0;tag_t Line2Tag = NULL_TAG;UF_CURVE_create_line(&LineCoords2, &Line2Tag);//直线1的向量⽅向,终点减起点double Vec1[3] = {LineCoords1.end_point[0]-LineCoords1.start_point[0], LineCoords1.end_point[1]-LineCoords1.start_point[1], LineCoords1.end_point[2]-LineCoords1.start_point[2]};//直线2的向量⽅向,终点减起点double Vec2[3] = {LineCoords2.end_point[0]-LineCoords2.start_point[0], LineCoords2.end_point[1]-LineCoords2.start_point[1], LineCoords2.end_point[2]-LineCoords2.start_point[2]};double ret_val = getVecAngle(Vec1, Vec2);//打印char msg[256];sprintf(msg, "%f",ret_val );uc1601(msg, 1);UF_terminate();}//------------------------------------------------------------------------------// Entry point(s) for unmanaged internal NXOpen C/C++ programs//------------------------------------------------------------------------------// Explicit Executionextern"C" DllExport void ufusr( char *parm, int *returnCode, int rlen ){try{// Create NXOpen C++ class instanceMyClass *theMyClass;theMyClass = new MyClass();theMyClass->do_it();delete theMyClass;}catch (const NXException& e1){UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());}catch (const exception& e2){UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());}catch (...){UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");}}//------------------------------------------------------------------------------// Unload Handler//------------------------------------------------------------------------------extern"C" DllExport int ufusr_ask_unload(){return (int)NXOpen::Session::LibraryUnloadOptionImmediately;}先说两个动画的区别我做了⼀个是锐⾓⼀个是钝⾓的这个函数就是输⼊两个向量,求向量夹⾓的double getVecAngle(const double vec0[3], const double vec1[3]){/* 起始向量*/double x0, y0, z0;/* ⽬标向量*/double x1, y1, z1;double ret_val = 0.f;/* 向量单位化 */double magnitude = std::sqrt(vec0[0] * vec0[0] + vec0[1] * vec0[1] + vec0[2] * vec0[2]);if (std::fabs(magnitude) < 1e-6) {// 0向量没意义return ret_val;}x0 = vec0[0] / magnitude;y0 = vec0[1] / magnitude;z0 = vec0[2] / magnitude;magnitude = std::sqrt(vec1[0] * vec1[0] + vec1[1] * vec1[1] + vec1[2] * vec1[2]);if (std::fabs(magnitude) < 1e-6) {// 0向量没意义return ret_val;}x1 = vec1[0] / magnitude;y1 = vec1[1] / magnitude;z1 = vec1[2] / magnitude;ret_val = (((y0*z1 - z0*y1) + (z0*x1 - x0*z1) + (x0*y1 - y0*x1)) < 0.f) ? (std::acos(x0*x1 + y0*y1 + z0*z1) * 180 / M_PI) : (360 - std::acos(x0*x1 + y0*y1 + z0*z1) * 180 / M_PI);///* 计算顺逆*/double ss2 = (y0*z1-z0*y1) + (z0*x1-x0*z1) +(x0*y1-y0*x1);if (ss2 < 0)ret_val = 360 - ret_val;return ret_val;}其中,这⾥⾯的这句判断,应该就是判断是锐⾓还是钝⾓的,以顺时针⽅向为例,如果夹⾓是⼩于90度的锐⾓,那么ss2就是⼩于0的,然后⽤360减去锐⾓的值,得到钝⾓///* 计算顺逆*/double ss2 = (y0*z1-z0*y1) + (z0*x1-x0*z1) +(x0*y1-y0*x1);if (ss2 < 0)ret_val = 360 - ret_val;对应的就是这个动画如果夹⾓是⼤于90度的钝⾓,那么ss2就是⼤于0的,直接输出钝⾓值对应就是下⾯这个动画判断顺时针⽅向是锐⾓还是钝⾓?如下图在她的代码⾥⽤到了round四舍五⼊值,我demo⾥没⽤。
NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))
NX⼆次开发-基于NX开发向导模板的NX对Excel读写操作(OLE⽅式(COM组件))版本NX11+VS2013+office2016⾸先我们通过NX开发向导创建了⼀个模板。
先把项⽬属性改成多字节。
下⾯我们把前⾯做的MFC项⽬⾥的⼏个EXCAL头⽂件和stdafx⼀块拷过来,加到NX的项⽬⾥。
在NX的CPP⾥加上#include "stdafx.h"头⽂件编译出现如下问题,把stdafx.h"头⽂件⾥的//#include "targetver.h"注释掉,在编译。
出现 warning C4003: “CreateDialogW”宏的实参不⾜,双击报错问题,跳转到对应代码位置。
把CreateDialog前加_下划线。
(不要问我为什么这么做,我解释不出来),反正你在编译就通过了。
同时也不当误⽤Block UI到这⾥这个操作EXCAL的项⽬搭建就完事了。
去⾃⼰定义的回调函数⾥,直接写操作EXCAL的代码就⾏了。
下⾯是打开EXCAL,读取内容的⼀个简单例⼦。
写在模板的do_it⾥1 LPDISPATCH lpDisp;2 COleVariant vResult;3 COleVariant4 covTrue((short)TRUE),5 covFalse((short)FALSE),6 covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);78if (!App.CreateDispatch("Excel.Application"))9 {10 uc1601("创建Excel实例失败", 1);11 }121314 App.put_Visible(TRUE); //使Excel可见15 App.put_UserControl(TRUE);16 App.put_DisplayAlerts(false);1718 Books.AttachDispatch(App.get_Workbooks());192021//打开EXCAL22 lpDisp = Books.Open("D:\\ABC.xlsx", covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,23 covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);24 Book.AttachDispatch(lpDisp);252627//得到Worksheets28 lpDisp = Book.get_Worksheets();29 sheets.AttachDispatch(lpDisp);3031//获得Sheet的数量32int count = sheets.get_Count();3334for (int k = 1; k <= count; k++)35 {36 _variant_t var = (long)k;37 sheet.AttachDispatch(sheets.get_Item(var));3839if (sheet.get_Name() == "DEF")40 {41 sheet.Activate();4243//获得活动的WorkSheet(⼯作表)44 sheet.AttachDispatch(Book.get_ActiveSheet(), TRUE);4546//获得使⽤的区域Range(区域)47 range.AttachDispatch(sheet.get_UsedRange(), TRUE);4849//获得使⽤的⾏数50long lgUsedRowNum = 0;51 range.AttachDispatch(range.get_Rows(), TRUE);52 lgUsedRowNum = range.get_Count();5354//获得使⽤的列数55long lgUsedColumnNum = 0;56 range.AttachDispatch(range.get_Columns(), TRUE);57 lgUsedColumnNum = range.get_Count();5859//读取Sheet名称60 CString strSheetName = sheet.get_Name();6162//得到全部Cells,此时,userRange是cells的集合63 range.AttachDispatch(sheet.get_Cells(), TRUE);646566//遍历整个Excel表格67double Date1;68 CString str1;69for (int j = 1; j <= lgUsedRowNum; j++)70 {71for (int i = 1; i <= lgUsedColumnNum; i++)72 {73 CString str;74 str.Format("%c%d", 65 + i - 1, j);75 lpDisp = range.get_Range(COleVariant(str), COleVariant(str)); 7677 CRange range;78 range.AttachDispatch(lpDisp);7980 VARIANT vl = range.get_Value2();818283if (vl.vt == VT_R8) //8字节的数字84 {8586 Date1 = vl.dblVal;87char msg[256];88 sprintf_s(msg, "%f", Date1);8990 uc1601(msg, 1);91 }9293if (vl.vt == VT_BSTR) //字符串94 {9596 str1 = vl.bstrVal;9798 uc1601(str1, 1);99100 }101 }102103 }104105 }106 }107108109110//释放对象,关闭EXCEL111//range.ReleaseDispatch();112//sheet.ReleaseDispatch();113//sheets.ReleaseDispatch();114//Book.Close(covOptional, covOptional, covOptional);115//Book.ReleaseDispatch();116//Books.Close();117//Books.ReleaseDispatch();118//App.Quit();119//App.ReleaseDispatch();。
NX二次开发-在NX程序中调用TC的搜索器
NX二次开发-在NX程序中调用TC的搜索器
一、概述
NX二次开发中,经常会有需要获取到TC中的一些数据集信息,尤其是搜索只能通过TC端搜索的内容。
本篇技巧将介绍如何实现这一需求。
二、功能说明
本篇以NX11(NX11.0.2.7),利用ID号,查找对象的名称为例。
简述如下:
a)在帮助文档中,存在“PdmSearchManger Class”类,类中有一个“NewPdmSearch()”方法,如图1所示。
图1
b)在帮助文档中,存在“PdmSearch Class”类,类中有一个“Advanced Method (entries, values)”方法,如图2所示。
图2
c)获取结果的方法:在“SearchResult Class”类中,有三种获取结果的方法(如图3),分别获取ID号,对象名称和对象的类型。
图3
d)参考代码如图4所示。
图4
e)TC中的对象和最终的输出结果如图5所示。
图5
三、总结
通过以上操作,就可调用TC中的搜索器,搜索到我们需要的部件信息。
方法中的参数通过增加搜索规则,缩小搜索范围。