• NX二次开发-UDO用户自定义对象(UFUN)【持续完善】


    每当提起UDO总是会让我想起大专毕业那会失业找工作,后来有个宝贵机会去了软件公司上班,拿到了我人生中的第一个NX二次开发项目,一个关于测量汽车前后左右摄像头的项目。当时那个项目就用到了UDO,对于只看了两个月唐康林工程师二次开发视频教程就跑出来找工作的我,显然是不会UDO的,后来采用了将handle值写到部件属性里,然后每次打开工具对话框前先去部件属性里读,在给到对话框里。在然后项目没做完我就特么滚蛋了。

    时隔差不多两年,以前技术底子太差,好多东西都不懂,直到最近我对UDO才有了一些认知了解,会用了一点点。但是依然很多东西搞不懂。技术这玩意就这样,也许我现在看不懂,可能两年后我就能看懂了。考验的是一个人对热爱的坚持程度!所以这个UDO内容我会持续完善的。做一个综合例子,等把UFUN得UDO搞明白了,后面我回去再研究一下NXOPEN的UDO,万变不离其宗,基本功能应该都是一样的。

    下面这个本对UDO有一些介绍,另外可以去UGOPEN文件夹里看这三个文件。

    也可以去UGOPENSampleNXOpenApplications里看西门子官方的一个UDO例子,但那个是用NXOPEN写得。

     

      1 /*****************************************************************************
      2 **
      3 ** UDOtest.cpp
      4 **
      5 ** Description:
      6 **     Contains Unigraphics entry points for the application.
      7 **
      8 *****************************************************************************/
      9 /* Include files */
     10 #include <stdarg.h>
     11 #include <strstream>
     12 #include <iostream>
     13 using std::ostrstream;
     14 using std::endl;
     15 using std::ends;
     16 using std::cerr;
     17 #include <uf.h>
     18 #include <uf_ui_types.h>
     19 #include <uf_ui.h>
     20 #include <uf_exit.h>
     21 
     22 
     23 //头文件
     24 #include <uf.h>
     25 #include <uf_ui.h>
     26 #include <uf_modl.h>
     27 #include <uf_udobj.h>
     28 #include <uf_disp.h>
     29 #include <uf_obj.h>
     30 
     31 
     32 static void ECHO(char *format, ...)
     33 {
     34     char msg[UF_UI_MAX_STRING_BUFSIZE];
     35     va_list args;
     36     va_start(args, format);
     37     vsnprintf_s(msg, sizeof(msg), _TRUNCATE, format, args);
     38     va_end(args);
     39     UF_UI_open_listing_window();
     40     UF_UI_write_listing_window(msg);
     41     UF_print_syslog(msg, FALSE);
     42 }
     43 
     44 #define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
     45 
     46 static int report_error(char *file, int line, char *call, int irc)
     47 {
     48     if (irc)
     49     {
     50         char err[133];
     51         UF_get_fail_message(irc, err);
     52         ECHO("*** ERROR code %d at line %d in %s:
    ",
     53             irc, line, file);
     54         ECHO("+++ %s
    ", err);
     55         ECHO("%s;
    ", call);
     56     }
     57     return(irc);
     58 }
     59 
     60 
     61 //显示事件的回调函数
     62 void registed_display_fun(tag_t udo, void* display_context)
     63 {
     64     uc1601("这是显示事件的回调", 1);
     65 }
     66 
     67 //选择事件的回调函数
     68 void registed_select_fun(tag_t udo, void* select_context)
     69 {
     70     uc1601("这是选择事件的回调", 1);
     71 }
     72 
     73 //适合窗口事件的回调函数
     74 void registed_fit_fun(tag_t udo, void* select_context)
     75 {
     76     uc1601("这是适合窗口的回调", 1);
     77     //UF_UDOBJ_all_data_t all_data;
     78     ////查询UDO对象数据
     79     //UF_UDOBJ_ask_udo_data(udo, &all_data);
     80     ////查询UDO类的名称
     81     //char* class_name, *friendly_name;
     82     //UF_UDOBJ_ask_class_data(all_data.class_id, &class_name, &friendly_name);//注意事项:friendly_name不能是中文,否则获取不到.
     83     ////释放
     84     //UF_UDOBJ_free_udo_data(&all_data);
     85     //uc1601(class_name, 1);
     86     //uc1601(friendly_name, 1);
     87     //UF_free(class_name);
     88     //UF_free(friendly_name);
     89 }
     90 
     91 //编辑事件的回调函数
     92 void registed_edit_fun(tag_t udo)
     93 {
     94     uc1601("这是编辑的回调", 1);
     95 }
     96 
     97 // 信息事件的回调函数
     98 void registed_info_fun(tag_t udo)
     99 {
    100     uc1601("这是信息事件的回调", 1);
    101 }
    102 
    103 // 删除事件的回调函数
    104 void registed_delete_fun(tag_t udo, UF_UDOBJ_link_p_t deleted_obj)
    105 {
    106     uc1601("这是删除事件的回调", 1);
    107 }
    108 
    109 // 更新事件的回调函数
    110 void registed_update_fun(tag_t udo, UF_UDOBJ_link_p_t update_cause)
    111 {
    112     uc1601("这是更新事件的回调", 1);
    113 }
    114 
    115 //当具有输入类标识符的UDO通过注意点计算事件时,注册注意点函数(方法)以进行调用
    116 void registed_attn_fun(tag_t udo, void * display_context)
    117 {
    118     uc1601("这是注册注意点事件的回调", 1);
    119 }
    120 
    121 //确定此UDO是否可出现的事件回调函数
    122 void registed_occurrenceable_fun(tag_t udo, logical * is_occurrenceable)
    123 {
    124     uc1601("这是确定此UDO是否可出现的事件回调函数", 1);
    125 }
    126 
    127 /*****************************************************************************
    128 **  Activation Methods
    129 *****************************************************************************/
    130 /*  Explicit Activation
    131 **      This entry point is used to activate the application explicitly, as in
    132 **      "File->Execute UG/Open->User Function..." */
    133 extern DllExport void ufusr(char *parm, int *returnCode, int rlen)
    134 {
    135     /* Initialize the API environment */
    136     if (UF_CALL(UF_initialize()))
    137     {
    138         /* Failed to initialize */
    139         return;
    140     }
    141 
    142     /* TODO: Add your application code here */
    143 
    144     UF_initialize();
    145 
    146     uc1601("创建UDO", 1);
    147 
    148     //创建UDOTestClass类
    149     UF_UDOBJ_class_t class_id;
    150     UF_UDOBJ_create_class("UDOTestClass", "MyUDOTest", &class_id);
    151 
    152     //将UDOTestClass类的显示名称加入到类选择对话框的类列表中
    153     UF_UI_add_to_class_sel(class_id);
    154 
    155     //创建UDOTestClass类的对象
    156     tag_t udo_tag = NULL_TAG;
    157     UF_UDOBJ_create_udo(class_id, &udo_tag);
    158 
    159     //点构造器
    160     char sCue[] = "点构造器";
    161     UF_UI_POINT_base_method_t base_method = UF_UI_POINT_INFERRED;
    162     tag_t tPoint = NULL_TAG;
    163     double sBasePoint[] = { 0, 0, 0 };
    164     int iResponse;
    165     UF_UI_point_construct(sCue, &base_method, &tPoint, sBasePoint, &iResponse);
    166     //UFUN创建直线
    167     UF_CURVE_line_t Line_coords;
    168     Line_coords.start_point[0] = sBasePoint[0];
    169     Line_coords.start_point[1] = sBasePoint[1];
    170     Line_coords.start_point[2] = sBasePoint[2];
    171     Line_coords.end_point[0] = 100.0;
    172     Line_coords.end_point[1] = 100.0;
    173     Line_coords.end_point[2] = 100.0;
    174     tag_t Line = NULL_TAG;
    175     UF_CURVE_create_line(&Line_coords, &Line);
    176 
    177     //创建UDO特征
    178     tag_t udo_feature_tag = NULL_TAG;
    179     UF_UDOBJ_create_udo_feature_from_udo(udo_tag, &udo_feature_tag);
    180 
    181     //创建链接
    182     //UF_UDOBJ_link_t link_defs[2];
    183     //link_defs[0].link_type = 1;
    184     //link_defs[0].assoc_ug_tag = Line;
    185     //link_defs[0].object_status = 0;
    186     //将UDOTestClass类对象和直线特征链接
    187     //UF_UDOBJ_add_links(udo_tag, 1, link_defs);
    188 
    189     //创建自有链接
    190     //将UDOTestClass类和对象以自有链接方式链接
    191     UF_UDOBJ_add_owning_links(udo_tag, 1, &Line);
    192 
    193     //注册显示事件
    194     UF_UDOBJ_register_display_cb(class_id, registed_display_fun);
    195 
    196     //注册选择事件
    197     UF_UDOBJ_register_select_cb(class_id, registed_select_fun);
    198 
    199     //注册fit事件
    200     UF_UDOBJ_register_fit_cb(class_id, registed_fit_fun);
    201 
    202     //注册编辑事件
    203     UF_UDOBJ_register_edit_cb(class_id, registed_edit_fun);
    204 
    205     //注册信息事件
    206     UF_UDOBJ_register_info_obj_cb(class_id, registed_info_fun);
    207 
    208     //注册删除事件
    209     UF_UDOBJ_register_delete_cb(class_id, registed_delete_fun);
    210 
    211     //注册更新事件
    212     UF_UDOBJ_register_update_cb(class_id, registed_update_fun);
    213 
    214     //当具有输入类标识符的UDO通过注意点计算事件时,注册注意点函数(方法)以进行调用
    215     //UF_UDOBJ_register_attn_pt_cb(class_id, registed_attn_fun);
    216 
    217     //注册确定此UDO是否可出现的事件回调函数
    218     //UF_UDOBJ_register_is_occurrenceable_cb(class_id, registed_occurrenceable_fun);
    219 
    220 /*
    221     //查询功能是否为UDO功能
    222     logical is_udo_feature;
    223     UF_UDOBJ_is_udo_feature(udo_feature_tag, &is_udo_feature);
    224 
    225     //查询NX对象是否具有UDO拥有的链接
    226     logical owned;
    227     UF_UDOBJ_is_owned(Line, &owned);
    228 
    229     //查询NX对象是否具有UDO拥有的链接
    230     logical owned1;
    231     UF_UDOBJ_is_owned(Line, &owned1);
    232 
    233     //查询UDO是否引用指定的NX对象
    234     logical linked;
    235     UF_UDOBJ_is_obj_linked_to_udo(Line, &linked);
    236 
    237     //显式记录UDO功能以进行更新
    238     UF_UDOBJ_log_udo_feature_for_update(udo_feature_tag);
    239 
    240     //将指定的UDO版本化为新类
    241     UF_UDOBJ_version_udo(udo_tag, class_id);
    242 
    243     //如果在部件中找到给定类的UDO,则设置警告用户的行为,但未加载实现UDO方法的代码
    244     UF_UDOBJ_set_user_warn_flag(class_id, true); //TRUE - 将警告用户,FALSE - 不会警告用户。请注意,如果未调用此例程,则默认值为FALSE。
    245 
    246     //设置在给定类名的情况下查询类id的行为
    247     //默认 模式为UF_UDOBJ_DONT_ALLOW_QUERY_CLASS_ID。这意味着如果使用UDO的类名调用 UF_UDOBJ_ask_class_id_of_name,将返回错误代码, 返回的类ID将为0.此机制用于帮助保护专有UDO的完整性。
    248     //将查询设置为UF_UDOBJ_ALLOW_QUERY_CLASS_ID意味着给定一个类名, 您可以找到类ID。此机制用于跨多个共享库传递类ID 
    249     UF_UDOBJ_set_query_class_id(class_id, UF_UDOBJ_ALLOW_QUERY_CLASS_ID);
    250 
    251     //设置UDO类的拥有对象选择的行为
    252     //在 默认的选择模式是UF_UDOBJ_DONT_ALLOW_SELECTION。这意味着无法单独选择拥有的对象。
    253     //将拥有对象的选择设置为UF_UDOBJ_ALLOW_SELECTION意味着 如果拥有的对象和UDO都是可选择的,则选择拥有的对象将导致选择 拥有的NX对象并在交互式选择中激活Up One Level按钮 。如果UDO不可选择,则仍然可以选择 拥有的对象。
    254     UF_UDOBJ_set_owned_object_selection(class_id, UF_UDOBJ_ALLOW_SELECTION);
    255 
    256 
    257     //通过使用UDO对象的输入标记替换UDO对象的现有标记来编辑UDO功能
    258     UF_UDOBJ_edit_udo_of_udo_feature(udo_feature_tag, udo_tag);
    259 
    260     //编辑UDO的卷可转换数据区域
    261     double volumes[] = { 1};
    262     UF_UDOBJ_edit_volumes(udo_tag, volumes);
    263 
    264     //编辑UDO的自由格式字符串区域
    265     char * strings[] = { "123" };
    266     UF_UDOBJ_edit_strings(udo_tag, strings);
    267 
    268     //编辑UDO的链接记录
    269     //UF_UDOBJ_edit_links
    270 
    271     //使用以下编辑功能编辑UDO的链接
    272     UF_UDOBJ_edit_link(udo_tag, link_defs, Line);
    273 
    274     //编辑UDO的长度可转换数据区域
    275     double length[] = { 1 };
    276     UF_UDOBJ_edit_lengths(udo_tag, length);
    277 
    278     //编辑UDO的自由格式整数区域
    279     int integers[] = { 1 };
    280     UF_UDOBJ_edit_integers(udo_tag, integers);
    281 
    282     //编辑UDO的自由格式double型区域
    283     double double1[] = { 1 };
    284     UF_UDOBJ_edit_doubles(udo_tag, double1);
    285 
    286     //编辑UDO的可转换数据面积
    287     double area[] = { 1 };
    288     UF_UDOBJ_edit_areas(udo_tag, area);
    289 
    290     //从指定位置开始删除UDO的可转换卷区域, 并以要删除的指定卷数结束 。
    291     //UF_UDOBJ_delete_volumes
    292 
    293     //从指定位置开始删除UDO的自由格式字符串区域, 并以要删除的指定数量的字符串结束 。
    294     //UF_UDOBJ_delete_strings
    295 
    296     //删除UDO及其关联的NX 对象之间的拥有链接
    297     UF_UDOBJ_delete_owning_link(udo_tag, Line);
    298 
    299     //删除UDO的链接
    300     UF_UDOBJ_delete_link(udo_tag, link_defs);
    301 
    302     //从指定位置开始删除UDO的可转换长度区域, 并以指定的要删除长度数结束
    303     //UF_UDOBJ_delete_lengths
    304 
    305     //从指定位置开始删除UDO的自由格式整数区域, 并以指定的要删除的整数数结束
    306     //UF_UDOBJ_delete_integers 
    307 
    308     //删除从指定位置开始的UDO的自由格式double型区域, 并以指定的double型要删除的数量结束 。
    309     //UF_UDOBJ_delete_doubles
    310 
    311     //从指定位置删除UDO的可转换区域区域, 并以指定的要删除区域数结束
    312     //UF_UDOBJ_delete_areas 
    313 
    314 */
    315 
    316 
    317 
    318 
    319     UF_terminate();
    320     /* Terminate the API environment */
    321     UF_CALL(UF_terminate());
    322 }
    323 /*****************************************************************************
    324 **  Utilities
    325 *****************************************************************************/
    326 /* Unload Handler
    327 **     This function specifies when to unload your application from Unigraphics.
    328 **     If your application registers a callback (from a MenuScript item or a
    329 **     User Defined Object for example), this function MUST return
    330 **     "UF_UNLOAD_UG_TERMINATE". */
    331 extern int ufusr_ask_unload(void)
    332 {
    333     return(UF_UNLOAD_IMMEDIATELY);
    334 }
    335 
    336 Caesar卢尚宇
    337 2019年11月22日

  • 相关阅读:
    php 读取webservice接口
    Struts2_day01--课程安排_Struts2概述_入门
    Hibernate_day04--HQL多表查询_Hibernate检索策略
    Hibernate_day04--QBC查询
    Hibernate_day04--HQL查询
    Hibernate_day04--课程安排_Hibernate查询方式_对象导航查询_OID查询
    Hibernate_day03--Hibernate多对多操作
    Hibernate_day03--课程安排_表之间关系_一对多操作
    Hibernate_day02--Hibernate事务操作_api使用
    Hibernate_day02--Hibernate的一级缓存
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/11913906.html
Copyright © 2020-2023  润新知