手把手教你做UG二次开发.docx

上传人:b****7 文档编号:10382448 上传时间:2023-02-10 格式:DOCX 页数:27 大小:559.30KB
下载 相关 举报
手把手教你做UG二次开发.docx_第1页
第1页 / 共27页
手把手教你做UG二次开发.docx_第2页
第2页 / 共27页
手把手教你做UG二次开发.docx_第3页
第3页 / 共27页
手把手教你做UG二次开发.docx_第4页
第4页 / 共27页
手把手教你做UG二次开发.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

手把手教你做UG二次开发.docx

《手把手教你做UG二次开发.docx》由会员分享,可在线阅读,更多相关《手把手教你做UG二次开发.docx(27页珍藏版)》请在冰豆网上搜索。

手把手教你做UG二次开发.docx

手把手教你做UG二次开发

手把手教你做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)在"DialogTitle"一栏填入:

FirstDialog,按Apply(每次输入完成后,都要按Apply,为避免啰嗦,以后不再提及)。

2)在"Cue"一栏输入:

%……%¥%¥¥##*%*(*(*—*—((,什么都行,呵呵。

3)在"PrefixName"中,把CHANGE改为MY。

4)加入四个控件。

String,PushButton,Label和SingleSelectList

编辑对话框的各个控件。

1)改变String控件的标题,标识和长度。

Label“String”->“Inputanitem”.

Identifier"STR_0"->"ITEM"

Widthin...0->20

2)改变PushButton控件的标题,标识和回调函数的名字。

Label"PushButton"->"Import"

Identifier"ACTION_1"->"IMPORT"

callbacks"action_1_act_cb"->import_cb

把"CreatesDialog"激活。

3)改变Label控件的标题和singleselectlist的标识。

改变singleselectlist可见项的个数。

LabelLabel->ItemsList

Identifier"LIST_2"->"ITEM_LIST"

Number3->6.

 

 

6.保存对话框。

点击save图标,把对话框保存在E:

\my_first_UG\application目录下,文件名位first_dlg,生成三个文件。

(现在可以推出UG乐)。

7。

建立一个vc的工程。

1)把\application下的*.c和*.h文件移动到E:

\my_source目录下(文件可以改名字)。

2)建立一个新工程,选择Win32DLL。

3)把c源文件和头文件加入到工程中。

8。

设置vc的环境。

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

Project->Settings->Link....

改变输出文件名,加入连接库文件(ug17之前的库名字不同)

 

 

Tools->Options...->Directories

Includefiles和Librayfiles加入UGUFopen的路径。

 

打开first_dlg.c文件,找到menuscript样板的位置。

复制这个样板到一个空的文本文件。

把文件保存到E:

\my_first_UG\startup目录下,文件名位first.men(注意后缀)。

 

 

找到#ifdefMENUBAR_COMMENTED_OUT,

把他和他对应的#endif删掉。

 

找到#ifdefDISPLAY_FROM_USER_EXIT,

把他和他对应的#endif删掉。

找到,把它改为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

为“InputanItem”田家一个回调函数input_cb。

保存后,退出。

时代码已经改变,要把相应的改变加到vc的工程中去,(推荐一个工具AraxisMerge)。

ZZZ斑竹辛苦了!

  小弟正要搞一个UG二次开发的项目,以后有问题还请多多指教了:

   请问工具AraxisMerge哪里可以得到,可以简单说一下怎么用的吗,我VC还不太熟,谢谢

我的EMAIL:

wgwang_sz@

      QQ:

43801603

    

打开first_dlg.c,找到construct_cb的位置,在其中添加以下代码。

intMY_construct_cb(intdialog_id,

             void*client_data,

             UF_STYLER_item_value_type_p_tcallback_data)

{

  intirc;

  UF_STYLER_item_value_type_tvalue;

  charstring[133]="Inputastringhere.";

     /*MakesureUserFunctionisavailable.*/

     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)

  {

    charmessage[132];

    UF_get_fail_message(irc,message);

  }

UF_terminate();

找到input_cb的位置,假如下面的代码。

intMY_input_cb(intdialog_id,

             void*client_data,

             UF_STYLER_item_value_type_p_tcallback_data)

{

  UF_STYLER_item_value_type_tvalue;

  intirc;

  charstring[133];

     /*MakesureUserFunctionisavailable.*/

     if(UF_initialize()!

=0)

          return(UF_UI_CB_CONTINUE_DIALOG);

  /*readyourinput*/

    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);

  /**addittothesinglelist*/

  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)

  {

    charmessage[132];

    UF_get_fail_message(irc,message);

  }     UF_terminate();

再ok_cb假如下面的代码。

 intirc,i;

  UF_STYLER_item_value_type_tvalue;  

     /*MakesureUserFunctionisavailable.*/

     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

{

    UF_UI_write_listing_window(value.value.strings);

    UF_UI_write_listing_window("\n");

}

  

  UF_STYLER_free_value(&value);

     UF_terminate();

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

刚打开对话框的结果。

输入一个字符串,回车。

它显示在下面的singlelist中。

对不起,aminorchangeoncode.

intMY_ok_cb(intdialog_id,

             void*client_data,

             UF_STYLER_item_value_type_p_tcallback_data)

{

  intirc,i;

  UF_STYLER_item_value_type_tvalue;

  

     /*MakesureUserFunctionisavailable.*/

     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

  {

    UF_UI_write_listing_window(value.value.strings);

    UF_UI_write_listing_window("\n");

  }  

  UF_STYLER_free_value(&value);

点击Ok后,所有的字符串显示在listwindow中。

清华书中uistyler部分的程序去掉了原来的注释,使得简单的事变复杂了。

我没有在ug/NX下开发。

在18版中,建立VC工程时可以选择UGAPPLICATIONWIZARD,那么后面的设置就可以变简单了。

Lcfq

ug/NX建立VC工程时有UngraphicsNXAppWizardV1也很好用。

toeastcamel

.men可以执行很多类型的可执行程序,比如.exe,.dll,.dlg.macro等

action没必要一定是my_first.dll,这是他给你的一个例子,如果你用UISTyler生成了my_first.dlg,那么你就可以在action后写上my_first.dlg。

tovisionphone

论坛是交流问题的地方,不是教学,

关于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在哪赋值?

平移的例子

doublematrix[16];

  intcount=1,copyFlag=2,layer=2,curveFlag=2,rtState;

  UF_MTX4_identity(matrix);

  UF_MTX4_edit_translation(matrix,vec);

  FTN(uf5947)(matrix,&srcObj,&count,©Flag,&layer,

        &curveFlag,copyedObj,NULL,&rtState);

  returnrtState;

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

找到文件UGII\menus\custom_dirs.dat添加用户路径

#Customermodificationscanfollowonhere

你的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方向上的平移值。

doubleDxyz[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,©Flag,&layer,

        &curveFlag,copyedObj,NULL,&rtState);

中的©Flag设定为1,你的rtState可以为0,但对象object却没执行什么操作。

现在我想把我的object进行move(这个对象包含了blend,hole,extrude等特征操作),请问ZZZ兄有什么高招?

现在我调试的程序可以对point,curve等进行操作了,但带参数的就不行。

关于平移的问题,受斑竹的启发,我调试了下面两个函数,同样可以对Object进行平移操作(只能copy而不能进行move).

doubleDxyz[3]={50,80,0};

  doubleD_target[16];

tag_tcopy_object_id;

  FTN(uf5943)(Dxyz,D_target);

  FTN(uf5947)(D_target,Object_selected,&one,&two,&zero,&two,©_object_id,NULL,&resp).

现在我调试我的程序发现不能进行move操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.

uf_list_p_tcmtag;

intug_type,ug_subtype;

intN_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时出来的警告信息.

Knight74wrote:

现在我调试我的程序发现不能进行move操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.

uf_list_p_tcmtag;

intug_type,ug_subtype;

intN_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.

Knight74wrote:

请问斑竹,知道计算两个object之间的距离函数吗?

这个函数可以计算两个object之间的最短距离。

另外,感谢斑竹上面的提醒。

今天有时间我把第3中在UG中平移物体的方法写上去。

是通过移动特征来移动物体。

求助

//-------------------[6]Chamfer4edgesofblock2-------------------

uf_list_p_tedge_list1,edge_list2;

tag_tchamfer_id,edge;

doubleend_point[3]=  {0,0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1