找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 20384|回复: 11
打印 上一主题 下一主题

[资料] UG二次开发实例讲解(UG CAM在开发者请留下联系方式)

[复制链接]
跳转到指定楼层
1
发表于 2011-10-26 12:30:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
手把手教你做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 -> 20
2) 改变Push Button控件的标题,标识和回调函数的名字。

Label "Push Button" -> "Import"
Identifier "ACTION_1" -> "IMPORT"
callbacks "action_1_act_cb" -> import_cb

把"Creates Dialog"激活。

3)改变Label控件的标题和single select list 的标识。改变single select list可见项的个数。

Label Label -> Items List
Identifier "LIST_2" -> "ITEM_LIST"
Number 3 -> 6.


6. 保存对话框。

点击save图标,把对话框保存在E:\my_first_UG\application目录下, 文件名位first_dlg,生成三个文件。

(现在可以推出UG乐)。


7。建立一个vc的工程。

1)把\application下的*.c和*.h文件移动到E:\my_source目录下(文件可以改名字)。
2)建立一个新工程,选择Win32 DLL。
3)把c源文件和头文件加入到工程中。

8。设置vc的环境。

Project -> Settings -> C/C++ -> Category ....加上头文件。
Project -> Settings -> Link....

改变输出文件名,加入连接库文件(ug17之前的库名字不同)
Tools ->Options...->Directories

Include files 和 Libray files 加入UG UFopen的路径。
打开first_dlg.c文件,找到menu script样板的位置。
复制这个样板到一个空的文本文件。
把文件保存到E:\my_first_UG\startup目录下,文件名位first.men(注意后缀)。

找到 #ifdef MENUBAR_COMMENTED_OUT,

把他和他对应的 #endif 删掉。
找到#ifdef DISPLAY_FROM_USER_EXIT,
把他和他对应的#endif删掉。

找到 <enter a valid user exit here>, 把它改为ufusr。
现在可以编译连接,试一下了, 呵呵。
运行UG,点击菜单。啊!!怎么不行??秀大了,呵呵
打开first.men文件,把ACTIONS后面的名字改为libmy_first(DLL文件的名字)。
现在一个空架子已经打起来了。剩下的就是要加入自己的内容。
就上面的例子讲讲下面这些回调函数(看清华那本书搞得我头大)谢谢!

好吧,下面将一下这些回调函数的应用。

Apply_c,Ok_cb和cancel_cb分别是点击OK, APPLY和cancel按钮时,执行的动作,它们的应用在后面的例子中介绍。
constructor 和 Destructor本分别是对话框显示之前和退出之后执行的动作。

在对话框显示之前,可能需要进行很多操作,譬如说:设置对话框的选择方式,就是说在对话框打开后,用户可以选择什么物体,面,实体等。
在对话框消失之后,也需要进行一些操作,譬如说:释放申请的空间,把加亮的体恢复等。下面我就用例子介绍一下这些回调函数的应用。

添加回调函数。

首先进入UG,UIstyler,打开前面生成的对话框first_dlg.dlg,在相应的位置添加几个回调函数的名字(每一个都要回车或按Apply)。

cancel_cb
construct_cb
destruct_cb
ok_cb

为“Input an Item”田家一个回调函数input_cb。

保存后,退出。
时代码已经改变,要把相应的改变加到vc的工程中去,(推荐一个工具Araxis Merge)。
ZZZ斑竹辛苦了!
  小弟正要搞一个UG二次开发的项目,以后有问题还请多多指教了:)
   请问工具Araxis Merge哪里可以得到,可以简单说一下怎么用的吗,我VC还不太熟,谢谢
我的EMAIL:wgwang_sz@163.com
      QQ:43801603
   
打开first_dlg.c,找到construct_cb的位置,在其中添加以下代码。

int MY_construct_cb ( int dialog_id,
             void * client_data,
             UF_STYLER_item_value_type_p_t callback_data)
{
  int irc;
  UF_STYLER_item_value_type_t value;
  char string[133] = "Input a string here.";
     /* Make sure User Function is available. */
     if ( UF_initialize() != 0)
          return ( UF_UI_CB_CONTINUE_DIALOG );

  value.item_id=MY_ITEM;
  value.item_attr=UF_STYLER_VALUE;
  value.value.string = string;
  irc = UF_STYLER_set_value(dialog_id, &value);
  if(irc)
  {
    char message[132];

    UF_get_fail_message(irc, message);
  }
UF_terminate ();
找到input_cb的位置,假如下面的代码。

int MY_input_cb ( int dialog_id,
             void * client_data,
             UF_STYLER_item_value_type_p_t callback_data)
{
  UF_STYLER_item_value_type_t value;
  int irc;
  char string[133];
     /* Make sure User Function is available. */
     if ( UF_initialize() != 0)
          return ( UF_UI_CB_CONTINUE_DIALOG );

   /* read your input */
    value.item_id=MY_ITEM;
  value.indicator=UF_STYLER_STRING_VALUE;
  value.item_attr=UF_STYLER_VALUE;
  UF_STYLER_ask_value(dialog_id, &value);

  strcpy(string, value.value.string);
  UF_STYLER_free_value(&value);

  /** add it to the single list */
  value.item_id=MY_ITEM_LIST;
  value.item_attr = UF_STYLER_LIST_INSERT;
  value.subitem_index = UF_STYLER_NO_SUB_INDEX;
  value.indicator = UF_STYLER_STRING_VALUE;
  value.value.string = string;
  irc = UF_STYLER_set_value(dialog_id, &value);
  if(irc)
  {
    char message[132];

    UF_get_fail_message(irc, message);
  }     UF_terminate ();


再ok_cb假如下面的代码。

int irc, i;
  UF_STYLER_item_value_type_t value;   
     /* Make sure User Function is available. */
     if ( UF_initialize() != 0)
          return ( UF_UI_CB_CONTINUE_DIALOG );

   UF_UI_open_listing_window();

  value.item_id=MY_ITEM_LIST;
  value.indicator=UF_STYLER_STRING_PTR_VALUE;
  value.item_attr=UF_STYLER_SUBITEM_VALUES;
  UF_STYLER_ask_value(dialog_id, &value);
    for(i = 0; i < value.count; i++)
{
    UF_UI_write_listing_window(value.value.strings);
    UF_UI_write_listing_window("\n");
}
   
  UF_STYLER_free_value( &value );

     UF_terminate ();
至此,我们介绍了几个回调函数的简单使用方法,下面看一下运行结果。

刚打开对话框的结果。

输入一个字符串,回车。它显示在下面的single list中。

对不起,a minor change on code.
int MY_ok_cb ( int dialog_id,
             void * client_data,
             UF_STYLER_item_value_type_p_t callback_data)
{
  int irc, i;
  UF_STYLER_item_value_type_t value;
   
     /* Make sure User Function is available. */
     if ( UF_initialize() != 0)
          return ( UF_UI_CB_CONTINUE_DIALOG );

   UF_UI_open_listing_window();

  value.item_id=MY_ITEM_LIST;
  value.indicator=UF_STYLER_STRING_PTR_VALUE;
  value.item_attr=UF_STYLER_SUBITEM_VALUES;
  irc = UF_STYLER_ask_value(dialog_id, &value);
for(i = 0; i < value.count; i++)
  {
    UF_UI_write_listing_window(value.value.strings);
    UF_UI_write_listing_window("\n");
  }
   
  UF_STYLER_free_value( &value );
点击Ok后,所有的字符串显示在list window 中。
清华书中uistyler部分的程序去掉了原来的注释,使得简单的事变复杂了。
我没有在ug/NX下开发。在18版中,建立VC工程时可以选择UG APPLICATION WIZARD,那么后面的设置就可以变简单了。 Lcfq
ug/NX建立VC工程时有Ungraphics NX AppWizard V1也很好用。
to eastcamel
.men可以执行很多类型的可执行程序,比如.exe,.dll, .dlg .macro等
action没必要一定是my_first.dll,这是他给你的一个例子,如果你用UISTyler生成了my_first.dlg,那么你就可以在action后写上my_first.dlg。

to visionphone
论坛是交流问题的地方,不是教学,
关于menuscript开发下拉菜单,包括菜单的级联在清华那一本书上已经很清楚了,还能找得出比他更清楚的资料吗?另外menuscript已经简单得不能再简单了,还能找得出比他更简单的编程方法吗?
现在在试一个把物体平移的功能.我看了UG/open 里面的函数帮助,也仔细研究了清华出的那本书,他里面是先将所选对象的坐标矩正进行正则化处理,然后为正则化矩正给出一个新的ID,最后创建一个零时坐标系.然后就用uf5943,uf5947两个函数进行平移了.
而现在我自己做的时候,也采用上面相同的步骤,但我调试时发现我选取的对象没有矩阵ID,当然也就得不到坐标系统矩阵.我后面采用获取工作坐标系的ID,然后获取其矩阵ID的方法,但调试后仍得不到平移结果.
请指教:下面是我的一段代码;
i_ret=UF_CSYS_ask_wcs (&wcs_id );
  UF_CSYS_ask_csys_info (wcs_id,&matrix_id,csys_origin);
  UF_CSYS_ask_matrix_values (matrix_id,matrix_values);
  UF_MTX3_ortho_normalize(matrix_values);
  i_ret=UF_CSYS_create_matrix(matrix_values,&new_matrix_id);
  i_ret=UF_CSYS_create_temp_csys(csys_origin,new_matrix_id,&temp_csys_id);

  FTN(uf5943) (Dxyz,D_target );
  FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp);

程序的前后两段好像没有什么联系?Dxyz和D_target在哪赋值?
平移的例子

double matrix[16];
  int count=1, copyFlag=2, layer=2, curveFlag=2, rtState;

  UF_MTX4_identity( matrix );
  UF_MTX4_edit_translation( matrix, vec );

  FTN(uf5947)(matrix, &srcObj, &count, &copy;Flag, &layer,
        &curveFlag, copyedObj, NULL, &rtState);

  return rtState;
我刚刚接触UG的二次开发,按以上过程试了一下(只是在创建工程时,选择的是UG/OPEN WIZAND V18),结果调试通过,只是运行时,马上出来对话框,菜单却找不着,恳请解答一下!

找到文件UGII\menus\custom_dirs.dat添加用户路径
# Customer modifications can follow on here
你的starup所在位置路径比如e:\project_insession\standard_part;

也可以在UGII\ugii_env.dat内把#UGII_USER_DIR=${HOME}改为UGII_USER_DIR=你的starup所在位置路径比如e:\project_insession\standard_part。
在平移的问题中,Dxyz是一个Input量,它定义了对象在x,y,z方向上的平移值。
double Dxyz[3]={50,80,0};
至于D_target,它是uf5943函数中的一个输出量,是uf5947函数中的一个输入矩阵值,其中就包含了Dxyz定义的平移量。
FTN(uf5943) (Dxyz,D_target );
  FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp);
后来我跟踪调试了resp的值,显示为0,表示成功了。但我用UG里面的工具检查一点的坐标,却一点变化也没有。
后来我调试了ZZZ兄的一段代码,发现copy是成功的,但我定义为move,即把UF_MTX4_identity( matrix );
  UF_MTX4_edit_translation( matrix, vec );

  FTN(uf5947)(matrix, &srcObj, &count, &copy;Flag, &layer,
        &curveFlag, copyedObj, NULL, &rtState);
中的&copy;Flag设定为1,你的rtState可以为0,但对象object却没执行什么操作。
现在我想把我的object进行move(这个对象包含了blend,hole,extrude等特征操作),请问ZZZ兄有什么高招?
现在我调试的程序可以对point,curve等进行操作了,但带参数的就不行。

关于平移的问题,受斑竹的启发,我调试了下面两个函数,同样可以对Object进行平移操作(只能copy而不能进行move ).
double Dxyz[3]={50,80,0};
  double D_target[16];
tag_t copy_object_id;
  FTN(uf5943) (Dxyz,D_target );
  FTN(uf5947)(D_target,Object_selected,&one,&two,&zero,&two,&copy;_object_id,NULL,&resp).
现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.
uf_list_p_t cmtag;
int ug_type,ug_subtype;
int N_features;
i_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype );
  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object );
  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag );
  i_ret=UF_MODL_ask_list_count(cmtag,&N_features);
但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?
下面的这张图片是我在交互界面下进行Transform时出来的警告信息.

Knight74 wrote:
现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.
uf_list_p_t cmtag;
int ug_type,ug_subtype;
int N_features;
i_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype );
  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object );
  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag );
  i_ret=UF_MODL_ask_list_count(cmtag,&N_features);
但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?
下面的这张图片是我在交互界面下进行Transform时出来的警告信息.



body_object一定要初始化为NULL_TAG.
Knight74 wrote:
请问斑竹,知道计算两个object之间的距离函数吗?这个函数可以计算两个object之间的最短距离。
另外,感谢斑竹上面的提醒。今天有时间我把第3中在UG中平移物体的方法写上去。是通过移动特征来移动物体。
求助
//-------------------[6] Chamfer 4 edges of block2-------------------
uf_list_p_t edge_list1,edge_list2;
tag_t chamfer_id,edge;
double end_point[3] =  {0, 0,0};   
double direction_z[ 3 ]= {0, 0, 1};
int dir_edge;
char * angle1="45.0";
int subtype=1,*is_parallel=NULL;
UF_MODL_create_list(&edge_list1);
UF_MODL_create_list(&edge_list2);
UF_MODL_ask_feat_edges (block2, &edge_list1 );
UF_MODL_ask_list_count(edge_list1,&num);
for (i=0; i<num; i++)
{
     UF_MODL_ask_list_item(edge_list1,i,&edge);
     


该贴已经同步到 huangjiuchao的微博
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
 楼主| 发表于 2011-10-26 12:32:09 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
3
发表于 2011-10-31 10:38:19 | 只看该作者

资料

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
4
发表于 2011-10-31 19:46:41 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
5
 楼主| 发表于 2011-11-1 09:57:32 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
6
发表于 2011-11-1 13:57:54 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
7
发表于 2011-11-1 13:58:55 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
8
发表于 2012-2-3 14:28:16 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
9
发表于 2012-4-16 23:03:11 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
10
发表于 2012-6-10 01:49:51 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-11-22 21:18 , Processed in 0.040883 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

快速回复 返回顶部 返回列表