NX二次开发-UDO用户自定义对象(UFUN)【持续完善】
每当提起UDO总是会让我想起大专毕业那会失业找工作,后来有个宝贵机会去了软件公司上班,拿到了我人生中的第一个NX二次开发项目,一个关于测量汽车前后左右摄像头的项目。当时那个项目就用到了UDO,对于只看了两个月唐康林工程师二次开发视频教程就跑出来找工作的我,显然是不会UDO的,后来采用了将handle值写到部件属性里,然后每次打开工具对话框前先去部件属性里读,在给到对话框里。在然后项目没做完我就特么滚蛋了。
时隔差不多两年,以前技术底子太差,好多东西都不懂,直到最近我对UDO才有了一些认知了解,会用了一点点。但是依然很多东西搞不懂。技术这玩意就这样,也许我现在看不懂,可能两年后我就能看懂了。考验的是一个人对热爱的坚持程度!所以这个UDO内容我会持续完善的。做一个综合例子,等把UFUN得UDO搞明白了,后面我回去再研究一下NXOPEN的UDO,万变不离其宗,基本功能应该都是一样的。
下面这个本对UDO有一些介绍,另外可以去UGOPEN文件夹里看这三个文件。
也可以去UGOPEN\SampleNXOpenApplications里看西门子官方的一个UDO例子,但那个是用NXOPEN写得。
/*****************************************************************************
**
** UDOtest.cpp
**
** Description:
** Contains Unigraphics entry points for the application.
**
*****************************************************************************/
/* Include files */
#include <stdarg.h>
#include <strstream>
#include <iostream>
using std::ostrstream;
using std::endl;
using std::ends;
using std::cerr;
#include <uf.h>
#include <uf_ui_types.h>
#include <uf_ui.h>
#include <uf_exit.h> //头文件
#include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_udobj.h>
#include <uf_disp.h>
#include <uf_obj.h> static void ECHO(char *format, ...)
{
char msg[UF_UI_MAX_STRING_BUFSIZE];
va_list args;
va_start(args, format);
vsnprintf_s(msg, sizeof(msg), _TRUNCATE, format, args);
va_end(args);
UF_UI_open_listing_window();
UF_UI_write_listing_window(msg);
UF_print_syslog(msg, FALSE);
} #define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X))) static int report_error(char *file, int line, char *call, int irc)
{
if (irc)
{
char err[];
UF_get_fail_message(irc, err);
ECHO("*** ERROR code %d at line %d in %s:\n",
irc, line, file);
ECHO("+++ %s\n", err);
ECHO("%s;\n", call);
}
return(irc);
} //显示事件的回调函数
void registed_display_fun(tag_t udo, void* display_context)
{
uc1601("这是显示事件的回调", );
} //选择事件的回调函数
void registed_select_fun(tag_t udo, void* select_context)
{
uc1601("这是选择事件的回调", );
} //适合窗口事件的回调函数
void registed_fit_fun(tag_t udo, void* select_context)
{
uc1601("这是适合窗口的回调", );
//UF_UDOBJ_all_data_t all_data;
////查询UDO对象数据
//UF_UDOBJ_ask_udo_data(udo, &all_data);
////查询UDO类的名称
//char* class_name, *friendly_name;
//UF_UDOBJ_ask_class_data(all_data.class_id, &class_name, &friendly_name);//注意事项:friendly_name不能是中文,否则获取不到.
////释放
//UF_UDOBJ_free_udo_data(&all_data);
//uc1601(class_name, 1);
//uc1601(friendly_name, 1);
//UF_free(class_name);
//UF_free(friendly_name);
} //编辑事件的回调函数
void registed_edit_fun(tag_t udo)
{
uc1601("这是编辑的回调", );
} // 信息事件的回调函数
void registed_info_fun(tag_t udo)
{
uc1601("这是信息事件的回调", );
} // 删除事件的回调函数
void registed_delete_fun(tag_t udo, UF_UDOBJ_link_p_t deleted_obj)
{
uc1601("这是删除事件的回调", );
} // 更新事件的回调函数
void registed_update_fun(tag_t udo, UF_UDOBJ_link_p_t update_cause)
{
uc1601("这是更新事件的回调", );
} //当具有输入类标识符的UDO通过注意点计算事件时,注册注意点函数(方法)以进行调用
void registed_attn_fun(tag_t udo, void * display_context)
{
uc1601("这是注册注意点事件的回调", );
} //确定此UDO是否可出现的事件回调函数
void registed_occurrenceable_fun(tag_t udo, logical * is_occurrenceable)
{
uc1601("这是确定此UDO是否可出现的事件回调函数", );
} /*****************************************************************************
** Activation Methods
*****************************************************************************/
/* Explicit Activation
** This entry point is used to activate the application explicitly, as in
** "File->Execute UG/Open->User Function..." */
extern DllExport void ufusr(char *parm, int *returnCode, int rlen)
{
/* Initialize the API environment */
if (UF_CALL(UF_initialize()))
{
/* Failed to initialize */
return;
} /* TODO: Add your application code here */ UF_initialize(); uc1601("创建UDO", ); //创建UDOTestClass类
UF_UDOBJ_class_t class_id;
UF_UDOBJ_create_class("UDOTestClass", "MyUDOTest", &class_id); //将UDOTestClass类的显示名称加入到类选择对话框的类列表中
UF_UI_add_to_class_sel(class_id); //创建UDOTestClass类的对象
tag_t udo_tag = NULL_TAG;
UF_UDOBJ_create_udo(class_id, &udo_tag); //点构造器
char sCue[] = "点构造器";
UF_UI_POINT_base_method_t base_method = UF_UI_POINT_INFERRED;
tag_t tPoint = NULL_TAG;
double sBasePoint[] = { , , };
int iResponse;
UF_UI_point_construct(sCue, &base_method, &tPoint, sBasePoint, &iResponse);
//UFUN创建直线
UF_CURVE_line_t Line_coords;
Line_coords.start_point[] = sBasePoint[];
Line_coords.start_point[] = sBasePoint[];
Line_coords.start_point[] = sBasePoint[];
Line_coords.end_point[] = 100.0;
Line_coords.end_point[] = 100.0;
Line_coords.end_point[] = 100.0;
tag_t Line = NULL_TAG;
UF_CURVE_create_line(&Line_coords, &Line); //创建UDO特征
tag_t udo_feature_tag = NULL_TAG;
UF_UDOBJ_create_udo_feature_from_udo(udo_tag, &udo_feature_tag); //创建链接
//UF_UDOBJ_link_t link_defs[2];
//link_defs[0].link_type = 1;
//link_defs[0].assoc_ug_tag = Line;
//link_defs[0].object_status = 0;
//将UDOTestClass类对象和直线特征链接
//UF_UDOBJ_add_links(udo_tag, 1, link_defs); //创建自有链接
//将UDOTestClass类和对象以自有链接方式链接
UF_UDOBJ_add_owning_links(udo_tag, , &Line); //注册显示事件
UF_UDOBJ_register_display_cb(class_id, registed_display_fun); //注册选择事件
UF_UDOBJ_register_select_cb(class_id, registed_select_fun); //注册fit事件
UF_UDOBJ_register_fit_cb(class_id, registed_fit_fun); //注册编辑事件
UF_UDOBJ_register_edit_cb(class_id, registed_edit_fun); //注册信息事件
UF_UDOBJ_register_info_obj_cb(class_id, registed_info_fun); //注册删除事件
UF_UDOBJ_register_delete_cb(class_id, registed_delete_fun); //注册更新事件
UF_UDOBJ_register_update_cb(class_id, registed_update_fun); //当具有输入类标识符的UDO通过注意点计算事件时,注册注意点函数(方法)以进行调用
//UF_UDOBJ_register_attn_pt_cb(class_id, registed_attn_fun); //注册确定此UDO是否可出现的事件回调函数
//UF_UDOBJ_register_is_occurrenceable_cb(class_id, registed_occurrenceable_fun); /*
//查询功能是否为UDO功能
logical is_udo_feature;
UF_UDOBJ_is_udo_feature(udo_feature_tag, &is_udo_feature); //查询NX对象是否具有UDO拥有的链接
logical owned;
UF_UDOBJ_is_owned(Line, &owned); //查询NX对象是否具有UDO拥有的链接
logical owned1;
UF_UDOBJ_is_owned(Line, &owned1); //查询UDO是否引用指定的NX对象
logical linked;
UF_UDOBJ_is_obj_linked_to_udo(Line, &linked); //显式记录UDO功能以进行更新
UF_UDOBJ_log_udo_feature_for_update(udo_feature_tag); //将指定的UDO版本化为新类
UF_UDOBJ_version_udo(udo_tag, class_id); //如果在部件中找到给定类的UDO,则设置警告用户的行为,但未加载实现UDO方法的代码
UF_UDOBJ_set_user_warn_flag(class_id, true); //TRUE - 将警告用户,FALSE - 不会警告用户。请注意,如果未调用此例程,则默认值为FALSE。 //设置在给定类名的情况下查询类id的行为
//默认 模式为UF_UDOBJ_DONT_ALLOW_QUERY_CLASS_ID。这意味着如果使用UDO的类名调用 UF_UDOBJ_ask_class_id_of_name,将返回错误代码, 返回的类ID将为0.此机制用于帮助保护专有UDO的完整性。
//将查询设置为UF_UDOBJ_ALLOW_QUERY_CLASS_ID意味着给定一个类名, 您可以找到类ID。此机制用于跨多个共享库传递类ID
UF_UDOBJ_set_query_class_id(class_id, UF_UDOBJ_ALLOW_QUERY_CLASS_ID); //设置UDO类的拥有对象选择的行为
//在 默认的选择模式是UF_UDOBJ_DONT_ALLOW_SELECTION。这意味着无法单独选择拥有的对象。
//将拥有对象的选择设置为UF_UDOBJ_ALLOW_SELECTION意味着 如果拥有的对象和UDO都是可选择的,则选择拥有的对象将导致选择 拥有的NX对象并在交互式选择中激活Up One Level按钮 。如果UDO不可选择,则仍然可以选择 拥有的对象。
UF_UDOBJ_set_owned_object_selection(class_id, UF_UDOBJ_ALLOW_SELECTION); //通过使用UDO对象的输入标记替换UDO对象的现有标记来编辑UDO功能
UF_UDOBJ_edit_udo_of_udo_feature(udo_feature_tag, udo_tag); //编辑UDO的卷可转换数据区域
double volumes[] = { 1};
UF_UDOBJ_edit_volumes(udo_tag, volumes); //编辑UDO的自由格式字符串区域
char * strings[] = { "123" };
UF_UDOBJ_edit_strings(udo_tag, strings); //编辑UDO的链接记录
//UF_UDOBJ_edit_links //使用以下编辑功能编辑UDO的链接
UF_UDOBJ_edit_link(udo_tag, link_defs, Line); //编辑UDO的长度可转换数据区域
double length[] = { 1 };
UF_UDOBJ_edit_lengths(udo_tag, length); //编辑UDO的自由格式整数区域
int integers[] = { 1 };
UF_UDOBJ_edit_integers(udo_tag, integers); //编辑UDO的自由格式double型区域
double double1[] = { 1 };
UF_UDOBJ_edit_doubles(udo_tag, double1); //编辑UDO的可转换数据面积
double area[] = { 1 };
UF_UDOBJ_edit_areas(udo_tag, area); //从指定位置开始删除UDO的可转换卷区域, 并以要删除的指定卷数结束 。
//UF_UDOBJ_delete_volumes //从指定位置开始删除UDO的自由格式字符串区域, 并以要删除的指定数量的字符串结束 。
//UF_UDOBJ_delete_strings //删除UDO及其关联的NX 对象之间的拥有链接
UF_UDOBJ_delete_owning_link(udo_tag, Line); //删除UDO的链接
UF_UDOBJ_delete_link(udo_tag, link_defs); //从指定位置开始删除UDO的可转换长度区域, 并以指定的要删除长度数结束
//UF_UDOBJ_delete_lengths //从指定位置开始删除UDO的自由格式整数区域, 并以指定的要删除的整数数结束
//UF_UDOBJ_delete_integers //删除从指定位置开始的UDO的自由格式double型区域, 并以指定的double型要删除的数量结束 。
//UF_UDOBJ_delete_doubles //从指定位置删除UDO的可转换区域区域, 并以指定的要删除区域数结束
//UF_UDOBJ_delete_areas */ UF_terminate();
/* Terminate the API environment */
UF_CALL(UF_terminate());
}
/*****************************************************************************
** Utilities
*****************************************************************************/
/* Unload Handler
** This function specifies when to unload your application from Unigraphics.
** If your application registers a callback (from a MenuScript item or a
** User Defined Object for example), this function MUST return
** "UF_UNLOAD_UG_TERMINATE". */
extern int ufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
} Caesar卢尚宇
2019年11月22日
NX二次开发-UDO用户自定义对象(UFUN)【持续完善】的更多相关文章
- 【NX二次开发】获取对象边界包容盒的三个函数UF_MODL_ask_bounding_box
今天看到胡工对bounding_box的分享,我也来测试一番(原帖地址:https://www.ugapi.com/thread-10287.html) 获取对象的边界盒子的三个函数: 1 UF_MO ...
- 【NX二次开发】镜像对象
使用uf5946获取镜像矩阵注意:uf5946镜像这个函数,只能用#define UF_plane_type=46这种类型的数据作为镜像面,不能用#define UF_datum_plane_type ...
- NX二次开发-调系统命令UF_load_library[UFUN调DLL]
此函数可以调DLL,可以调宏,当然也可以调其他内部函数(知道哪个内部函数怎么用的前提下). #include <uf.h> void UFUN_API_Call_DLL(char* dll ...
- 【NX二次开发】多种变换
变换的种类: uf5942 矩阵乘积变换 uf5943 平移变换 uf5944 缩放变换 uf5945 旋转变换 uf5946 镜像变换 最后使用 uf5947 实现uf5942-uf5946的变换. ...
- 【NX二次开发】获取当前鼠标选择的对象 UF_UI_ask_global_sel_object_list
先选择多个对象object,然后使用此函数获取选择的对象的tag,最后就可以使用object的一些函数了. ufun例子: extern DllExport void ufusr(char *parm ...
- NX二次开发-UFUN拉伸函数UF_MODL_create_extruded
NX9+VS2012 //NX二次开发中常用拉伸函数为UF_MODL_create_extruded2,但是此函数不能拉伸片体, //想要拉伸片体用函数UF_MODL_create_extruded. ...
- NX二次开发-UFUN拉伸函数UF_MODL_create_extruded2
NX9+VS2012 //NX二次开发中常用拉伸函数为UF_MODL_create_extruded2,但是此函数不能拉伸片体, //想要拉伸片体用函数UF_MODL_create_extruded. ...
- NX二次开发-UFUN发射线函数UF_MODL_trace_a_ray的用法
今天是国庆节,放假休息懒得动,没有出去玩,在家研究一下发射线函数UF_MODL_trace_a_ray.小弟以前在软件公司混的时候,当时我做的那个项目就用到了UF_MODL_trace_a_ray,当 ...
- NX二次开发-UFUN将工程图转成CGM和PDF文件UF_CGM_export_cgm
文章转载自唐康林NX二次开发论坛,原文出处: http://www.nxopen.cn/thread-126-1-1.html 刚才有同学问到这个问题,如果是用NXOpen来做,直接录制一下就可以了: ...
随机推荐
- es5-class
1. 通过class定义类/实现类的继承2. 在类中通过constructor定义构造方法3. 通过new来创建类的实例4. 通过extends来实现类的继承5. 通过super调用父类的构造方法6. ...
- python入门学习一
本文用来记录学习python过程中所遇到的不同的或者记忆不清的一些定义. 注释 注释用# #此处是注释 n = 123 f = 456 不转义 Python中r‘ ’表示字符串默认不转义 print ...
- Fabric.js的使用
最近项目有一个绘制的功能,搜了一圈发现fabric.js口碑不错,但是文档稀缺,于是东看看西搜搜的把项目的需求都给实现了,想分享一下. 篇幅有点长,但看完后可以轻松驾驭fabric.我的项目是基于VU ...
- go导入包
go导入包 go有很多内置的函数,例如println,不需要引用即可使用.但是如果不借助go的标准库或者第三方库,我们能做的事情有限.在go中,使用关键字import在代码中导入一个包并使用. 修改我 ...
- java中文件下载的思路(参考:孤傲苍狼)
文件下载 文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载 文件下载功能的实现思路: 1.获取要下载的文件的绝对路径 2.获取要下载的文件 ...
- luoguP1290 欧几里德的游戏 [博弈论]
题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ...
- kubernetes(k8s)集群安全机制RBAC
1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...
- P1537 弹珠
P1537 弹珠 题目描述 玛莎和比尔各自有自己的弹珠收藏.他们想重新分配收藏品,使两人能平等拥有弹珠.如果所有的弹珠的价值相同,那么他们就可以平分.但不幸的是,有一些弹珠更大,或者更美丽,所以,玛莎 ...
- 从内部重启python脚本
我有一个基于python的GTK应用程序,可以加载几个模块.它是从(linux)终端运行的,如下所示: ./myscript.py --some-flag setting 用户可以从程序中下载(使用G ...
- 10-MySQL-Ubuntu-数据表中数据的查询(三)
数据的查询(select) (1)查询整个表的数据: select * from 表名; (2)查询给定条件的数据: select * from 表名 where 条件; (3)查询表中某些字段: ...