iCAx开思工具箱

标题: 手把手教你做UG二次开发。 [打印本页]

作者: zzz    时间: 2003-3-10 11:28
标题: 手把手教你做UG二次开发。
1。建立两个目录。
  
   建立第一个目录 E:\my_first_UG,在这个目录下建立两个新的目录:E:\my_first_UG\application和E:\my_first_UG\startup。
  
  建立第二个目录E:\my_source,用存放你的源代码。
作者: zzz    时间: 2003-3-10 11:30
2。设置环境变量。
  
再Windows中设置一个新的环境变量:UGII_USER_DIR=E:\my_first_UG。
作者: zzz    时间: 2003-3-10 11:32
3。打开UG,进入UIStyler应用(在Application菜单的最后)。
作者: zzz    时间: 2003-3-10 11:51
4。设计一个对话框。
  
1)在"Dialog Title"一栏填入:First Dialog,按Apply(每次输入完成后,都要按Apply,为避免啰嗦,以后不再提及)。
2)在"Cue"一栏输入:%……%¥%¥¥##*%*(*(*—*—((,什么都行,呵呵。
3)在"refix Name"中,把CHANGE改为MY。
4)加入四个控件。String,Push Button,Label和Single Select List
作者: zzz    时间: 2003-3-10 11:52
待续...
作者: zzz    时间: 2003-3-10 14:21
编辑对话框的各个控件。
  
1)改变String控件的标题,标识和长度。
  
Label           “String”  ->  “Input an item”.
Identifier     "STR_0" ->  "ITEM"
Width in...   0  ->  20
作者: zzz    时间: 2003-3-10 14:29
2) 改变Push Button控件的标题,标识和回调函数的名字。
  
Label          "ush Button"  -> "Import"
Identifier    "ACTION_1"   ->  "IMPORT"
callbacks     "action_1_act_cb"   -> import_cb
  
把"Creates Dialog"激活。
作者: zzz    时间: 2003-3-10 14:37
3)改变Label控件的标题和single select list 的标识。改变single select list可见项的个数。
  
Label    Label -> Items List
Identifier  "LIST_2"   ->  "ITEM_LIST"
Number    3   ->    6.
作者: zzz    时间: 2003-3-10 14:42
6. 保存对话框。
  
点击save图标,把对话框保存在E:\my_first_UG\application目录下, 文件名位first_dlg,生成三个文件。
  
(现在可以推出UG乐)。
作者: zzz    时间: 2003-3-10 14:54
7。建立一个vc的工程。
  
1)把\application下的*.c和*.h文件移动到E:\my_source目录下(文件可以改名字)。
2)建立一个新工程,选择Win32 DLL。
3)把c源文件和头文件加入到工程中。
作者: zzz    时间: 2003-3-10 15:19
8。设置vc的环境。
  
Project -> Settings -> C/C++ -> Category ....加上头文件。
作者: zzz    时间: 2003-3-10 15:25
Project -> Settings -> Link....
  
改变输出文件名,加入连接库文件(ug17之前的库名字不同)
作者: zzz    时间: 2003-3-10 15:30
Tools ->Options...->Directories
  
Include files 和 Libray files 加入UG UFopen的路径。
作者: zzz    时间: 2003-3-10 15:37
打开first_dlg.c文件,找到menu script样板的位置。
复制这个样板到一个空的文本文件。
把文件保存到E:\my_first_UG\startup目录下,文件名位first.men(注意后缀)。
作者: zzz    时间: 2003-3-10 15:41
找到  #ifdef MENUBAR_COMMENTED_OUT,
  
把他和他对应的 #endif 删掉。
作者: zzz    时间: 2003-3-10 15:46
找到#ifdef DISPLAY_FROM_USER_EXIT,  
把他和他对应的#endif删掉。
  
找到 <enter a valid user exit here>, 把它改为ufusr。
作者: zzz    时间: 2003-3-10 15:47
现在可以编译连接,试一下了, 呵呵。
作者: zzz    时间: 2003-3-10 15:54
运行UG,点击菜单。啊!!怎么不行??秀大了,呵呵。
作者: zzz    时间: 2003-3-10 15:58
打开first.men文件,把ACTIONS后面的名字改为libmy_first(DLL文件的名字)。
作者: zzz    时间: 2003-3-10 16:05
现在一个空架子已经打起来了。剩下的就是要加入自己的内容。
  
待续......
作者: taiga2001    时间: 2003-3-18 20:45
it is awfully helpful.continue pls!!
作者: taiga2001    时间: 2003-3-19 16:04
waiting中。。。。。。。。。
作者: visionphone    时间: 2003-3-24 10:06
I am waiting,too.
please help me !
thank you,very much!
作者: zzz    时间: 2003-3-24 14:25
不知你们还想了解什么?我愿向加上一个用按钮掉新对话框和一些基本的控件操作,但不可能每一个都介绍。
作者: taiga2001    时间: 2003-3-24 15:29
请讲一讲回调Callback编写、连接(把上边的例子做完好吗)。
作者: taiga2001    时间: 2003-3-24 15:35
::{就上面的例子讲讲下面这些回调函数(看清华那本书搞得我头大)谢谢!
作者: zzz    时间: 2003-3-24 20:29
好吧,下面将一下这些回调函数的应用。
  
Apply_c,Ok_cb和cancel_cb分别是点击OK, APPLY和cancel按钮时,执行的动作,它们的应用在后面的例子中介绍。
constructor 和 Destructor本分别是对话框显示之前和退出之后执行的动作。
  
在对话框显示之前,可能需要进行很多操作,譬如说:设置对话框的选择方式,就是说在对话框打开后,用户可以选择什么物体,面,实体等。
在对话框消失之后,也需要进行一些操作,譬如说:释放申请的空间,把加亮的体恢复等。下面我就用例子介绍一下这些回调函数的应用。
作者: zzz    时间: 2003-3-24 20:39
添加回调函数。
  
首先进入UG,UIstyler,打开前面生成的对话框first_dlg.dlg,在相应的位置添加几个回调函数的名字(每一个都要回车或按Apply)。
  
cancel_cb
construct_cb
destruct_cb
ok_cb
  
为“Input an Item”田家一个回调函数input_cb。
  
保存后,退出。
作者: zzz    时间: 2003-3-24 20:49
这时代码已经改变,要把相应的改变加到vc的工程中去,(推荐一个工具Araxis Merge)。
作者: wgwang    时间: 2003-3-24 21:03
ZZZ斑竹辛苦了!
  小弟正要搞一个UG二次开发的项目,以后有问题还请多多指教了:)
   请问工具Araxis Merge哪里可以得到,可以简单说一下怎么用的吗,我VC还不太熟,谢谢
我的EMAIL:wgwang_sz@163.com
      QQ:43801603
    
作者: zzz    时间: 2003-3-24 21:07
打开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 ();
作者: zzz    时间: 2003-3-24 21:19
找到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 ();
作者: taiga2001    时间: 2003-3-24 21:22
顶!学习中。。。。。。
作者: taiga2001    时间: 2003-3-24 21:31
zzz wrote:
这时代码已经改变,要把相应的改变加到vc的工程中去,(推荐一个工具Araxis Merge)。

  
是用UIstyler生成的template.c中的代码覆盖VC中的源代码吗?
作者: zzz    时间: 2003-3-24 21:32
再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 ();
作者: zzz    时间: 2003-3-24 21:34
taiga2001 wrote:
   
   
  是用UIstyler生成的template.c中的代码覆盖VC中的源代码吗?

  
不能覆盖,前面我们修改了一些地方,这些地方要保留(删掉if, endif, 改为ufusr等)。
作者: zzz    时间: 2003-3-24 21:41
至此,我们介绍了几个回调函数的简单使用方法,下面看一下运行结果。
  
刚打开对话框的结果。
作者: taiga2001    时间: 2003-3-24 21:41
i c. 3q!
作者: zzz    时间: 2003-3-24 21:44
输入一个字符串,回车。它显示在下面的single list中。
作者: zzz    时间: 2003-3-24 21:47
对不起,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 )]
  

作者: zzz    时间: 2003-3-24 21:51
点击Ok后,所有的字符串显示在list window 中。
作者: taiga2001    时间: 2003-3-24 21:55
wgwang wrote:
ZZZ斑竹辛苦了!  
    小弟正要搞一个UG二次开发的项目,以后有问题还请多多指教了:)  
     请问工具Araxis Merge哪里可以得到,可以简单说一下怎么用的吗,我VC还不太熟,谢谢  
  我的EMAIL:wgwang_sz@163.com  
        QQ:43801603  
      

  
Araxis Merge 99 Professional是一種將檔案、資料夾同時合併的應用程式。它可以依檔案的類型,命名的等級來合份並透過印表機輸出。它可以讓你從容的工作在幾個不同版本文件。利用顏色來區分出文件,讓你更簡單的比較出類似或不同的檔案。
    
https://asia.cnet.com/hk/download/pc/0,2000031702,11001446s,00.htm
作者: taiga2001    时间: 2003-3-24 22:00
tks for your excellent job! if any problem while i try, i will put it here.
作者: lcfq    时间: 2003-3-25 17:41
清华书中uistyler部分的程序去掉了原来的注释,使得简单的事变复杂了。
我没有在ug/NX下开发。在18版中,建立VC工程时可以选择UG APPLICATION WIZARD,那么后面的设置就可以变简单了。  lcfq
作者: taiga2001    时间: 2003-3-25 19:02
ug/NX建立VC工程时有Ungraphics NX AppWizard V1也很好用。
作者: taiga2001    时间: 2003-3-25 19:29
请问斑竹,apply_cb中代码是把ok_cb的代码拷贝过去吗?还有没有更简捷的办法?
作者: zzz    时间: 2003-3-25 20:28
taiga2001 wrote:
请问斑竹,apply_cb中代码是把ok_cb的代码拷贝过去吗?还有没有更简捷的办法?

如果你的OK和Apply执行的是同样的功能的话,那就是相同的代码啦。
作者: visionphone    时间: 2003-3-26 11:39
您好斑竹,我现在刚开始学UG及二次开发的,由于时间的原因我现在急需对他进行二次开发,小弟想问一下哪里能找到关于UG二次开发的书阿?清华那本UG/Open Api 书中讲的我没有看懂,可能由于版本的原因吧!还有那个什么MENUSCRIP那一章,我更不懂,还有能不能介绍一下关于用API单独开发的全过程阿!
您能给我发些建议吗?我得Email address:wyfeng_111@163.com
QQ:43726879
作者: darkhorse    时间: 2003-3-26 11:58
如果清华的那本书你都看不懂,如果MenuScipt你也看不懂,那就没必要看了。
作者: eastcamel    时间: 2003-3-26 12:01
请教版主,在.men中的action中为什么要my_first.dll,什么时候可用my_first.dlg?
作者: visionphone    时间: 2003-3-26 12:15
请问能不能介绍一下用menuscript开发下拉菜单,包括菜单的级联阿!谢谢!来信指教好吗?谢谢
辛苦啦!
作者: visionphone    时间: 2003-3-26 12:18
呵呵!不是没有看懂啦!只是觉得太简单,内容太少啦!想多了解一点嘛!
作者: darkhorse    时间: 2003-3-26 12:22
to eastcamel  
  .men可以执行很多类型的可执行程序,比如.exe,.dll, .dlg .macro等
action没必要一定是my_first.dll,这是他给你的一个例子,如果你用UISTyler生成了my_first.dlg,那么你就可以在action后写上my_first.dlg。
  
to   visionphone  
论坛是交流问题的地方,不是教学,
关于menuscript开发下拉菜单,包括菜单的级联在清华那一本书上已经很清楚了,还能找得出比他更清楚的资料吗?另外menuscript已经简单得不能再简单了,还能找得出比他更简单的编程方法吗?
作者: darkhorse    时间: 2003-3-26 12:24
to visionphone  
内容全面的话,请看document,书籍仅是入门
作者: visionphone    时间: 2003-3-26 12:29
谢谢darkhorse
作者: eastcamel    时间: 2003-3-26 12:42
to darkhorse:
谢谢你的回答,你说的这点我知道,照道理执行.dll 和.dlg应该结果是一样的吧?可按照他的例子,我用.dlg可以调出对话框,但不能执行对话框里按键的动作,而用.dll就可以,所以想知道用.dlg应该注意什么?
作者: Knight74    时间: 2003-3-26 14:18
我现在在试一个把物体平移的功能.我看了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在哪赋值?
作者: zzz    时间: 2003-3-26 14:30
这里介绍的是入门的入门,是对开发过程的一个精炼。
我从98年开始,使用UG,二次开发,从没有看过什么书,uG的文档就是最好的书。特别是15版以前的文档,写得非常清楚。
  
UG二次开发的这套体系,至少是在10年前推出的,在我看来,当时是很先进的,现在也没有落后很多。里面使用了很多面向对象的思想,消息驱动等。如果你会面向对象编程,看UG的程序,应该是小菜一碟。
  
像上面提出的为什么使用.dll和.dlg不一样,我也不知道,既然是用.dll很好,为什么要用.dlg呢。
作者: zzz    时间: 2003-3-26 15:16
平移的例子
  
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, &copyFlag, &layer,
        [$curveFlag, copyedObj, NULL, &rtState)]
  
  return rtState;
作者: darkhorse    时间: 2003-3-26 17:46
虽然对zzz的水平很佩服,但没想到算是前辈了,我从2001年才开始接触UG17,
请多多指教.
  
to eastcamel  
我没仔细看清华的教程,大体了解了一下,没有我需要的东西也就没仔细看.
你说不能执行对话框里按键的动作这是是因为你没有定义对应按钮的执行函数
这与dll dlg没多大关系,你仔细看看按钮是否有对应的执行函数,执行函数中是否有
痕迹表明他是否执行.
  
不太了解你的意思,继续交流.
   
  
作者: mazhiguo    时间: 2003-3-26 20:40
我刚刚接触UG的二次开发,按以上过程试了一下(只是在创建工程时,选择的是UG/OPEN WIZAND V18),结果调试通过,只是运行时,马上出来对话框,菜单却找不着,恳请解答一下!
作者: taiga2001    时间: 2003-3-27 10:36
mazhiguo wrote:
我刚刚接触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。
作者: Knight74    时间: 2003-3-28 13:57
在平移的问题中,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等进行操作了,但带参数的就不行。
在此先谢谢ZZZ兄昨天的解答。
作者: zzz    时间: 2003-3-28 14:33
你先在交互环境中试一下,UGNX地移动好像是有些问题。
另外,tag的类型对了吗?
作者: eastcamel    时间: 2003-3-31 17:53
版主,继续啊,讲讲如何通过该对话框再调出一个对话框吧
作者: eastcamel    时间: 2003-3-31 19:16
c:\temp\first_dlg_template.c(639) : warning C4013: 'strcpy' undefined; assuming extern returning int
作者: eastcamel    时间: 2003-4-1 09:53
上面的问题不好意思,
  
不过版主,我编译时还有问题,如下:
C:\TEMP\first_dlg_template.c(511) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char ** '
C:\TEMP\first_dlg_template.c(511) : warning C4024: 'UF_UI_write_listing_window' : different types for formal and actual parameter 1
我看了一下,应该是在MY_import_cb中value.value.string = string与
MY_ok_cb中UF_UI_write_listing_window(value.value.strings)引用的参数不一致引起的,结果程序执行时按OK,信息窗口输出内容不对,改成UF_UI_write_listing_window(value.value.string编译时不出错,但执行也不对,望指点!
作者: zzz    时间: 2003-4-1 11:14
对不起,这是显示的问题,strings后面应该是带有下标的。建议你去加强一下c语言。
作者: Knight74    时间: 2003-4-1 19:01
关于平移的问题,受斑竹的启发,我调试了下面两个函数,同样可以对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).
作者: Knight74    时间: 2003-4-1 19:10
现在我调试我的程序发现不能进行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时出来的警告信息.
作者: zzz    时间: 2003-4-2 09:12
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    时间: 2003-4-3 10:24
请问斑竹,知道计算两个object之间的距离函数吗?这个函数可以计算两个object之间的最短距离。
另外,感谢斑竹上面的提醒。今天有时间我把第3中在UG中平移物体的方法写上去。是通过移动特征来移动物体。
作者: salary    时间: 2003-4-3 14:35
Knight74 wrote:
请问斑竹,知道计算两个object之间的距离函数吗?这个函数可以计算两个object之间的最短距离。  
  另外,感谢斑竹上面的提醒。今天有时间我把第3中在UG中平移物体的方法写上去。是通过移动特征来移动物体。

  
UF_MODL_ask_minimum_dist()
作者: Knight74    时间: 2003-4-3 19:07
感谢,谢谢salary的提醒的提醒。
作者: taiga2001    时间: 2003-4-4 13:56
求助::{
//-------------------[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)]
      
    UF_MODL_get_curve_edge_direction (end_point,edge,[$dir_edge )]
  
    UF_VEC3_is_parallel(dir_edge,direction_z,0.0001,[$is_parallel)]
      if(is_parallel)
   
    UF_MODL_put_list_item(edge_list2,edge);
    }
  
    UF_MODL_delete_list([$edge_list1)]   
  UF_MODL_create_chamfer (subtype, "2", "2", angle1,edge_list2,[$chamfer_id)]
    UF_MODL_delete_list([$edge_list2)]
  
编译错误:error C2664: 'UF_VEC3_is_parallel' : cannot convert parameter 1 from 'int' to 'const double []'
请问用UF_MODL_get_curve_edge_direction 得到的edge的方向dir_edge是何类型,是不是不能用它得到block边的方向?

作者: zzz    时间: 2003-4-4 14:20
帮助写得很清楚啊。
作者: taiga2001    时间: 2003-4-4 14:28
extern int UF_MODL_get_curve_edge_direction (double * end_point, tag_t curve_edge_eid,  
int * direction );
  
double *  end_point Input : The input endpoint  
tag_t  curve_edge_eid Input : The input curve or edge  
int *  direction Output : Ouput direction   
  
extern void UF_VEC3_is_parallel (const double vec1[ 3 ], const double vec2[ 3 ],  
double tolerance,  
int * is_parallel );
  
const double  vec1[ 3 ] Input 3D vector   
const double  vec2[ 3 ] Input 3D vector  
double  tolerance Input tolerance  
int *  is_parallel Output = 0 Vectors are not parallel
= 1 Vectors are parallel  
  
整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?
作者: taiga2001    时间: 2003-4-4 19:28
any help?
作者: 玲玲零零    时间: 2003-4-5 11:39
ZZZ有一手,这里一下子热闹了许多,学UG开发的多了许多
作者: zzz    时间: 2003-4-5 15:21
taiga2001 wrote:
extern int UF_MODL_get_curve_edge_direction (double * end_point, tag_t curve_edge_eid,   
  int * direction );  
  
  double *  end_point Input : The input endpoint   
  tag_t  curve_edge_eid Input : The input curve or edge   
  int *  direction Output : Ouput direction    
  
  extern void UF_VEC3_is_parallel (const double vec1[ 3 ], const double vec2[ 3 ],   
  double tolerance,   
  int * is_parallel );  
  
  const double  vec1[ 3 ] Input 3D vector    
  const double  vec2[ 3 ] Input 3D vector   
  double  tolerance Input tolerance   
  int *  is_parallel Output = 0 Vectors are not parallel  
  = 1 Vectors are parallel   
  
  整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?

  
第一个函数只是用来判断一个点靠近一条曲线的起点还是终点。
第二个函数要求输入两个矢量。
得到边的方向可以,先得到边的端点:用UF_MODL_ask_edge_verts()
作者: taiga2001    时间: 2003-4-5 15:39
Thanks for zzz's answer. i've fixed it up.
  
//-------------------[6] Chamfer 4 edges of block2-------------------
   
    uf_list_p_t  edge_list1,edge_list2;
    tag_t  chamfer_id,edge;
    double point1[ 3 ];  
    double point2[ 3 ];
    char * angle1="45.0";
    int subtype=1;
    int  vertex_count=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)]
      UF_MODL_ask_edge_verts (edge,point1,point2,[$vertex_count )]
  
      if(fabs(point1[2]-point2[2])>1)   
    UF_MODL_put_list_item(edge_list2,edge);
    }
  
    UF_MODL_delete_list([$edge_list1)]   
  
    UF_MODL_create_chamfer (subtype, "2", "2", angle1,edge_list2,[$chamfer_id)]
    UF_MODL_delete_list([$edge_list2)]

作者: Knight74    时间: 2003-4-8 08:51
向斑竹,各位同志请教,有谁对UF_MODL_create_point_dirr_daxis (
tag_t point,  
tag_t direction,  
tag_t * daxis_tag ),函数熟悉,我现在只知道double direciton[3],我怎样才能得到tag_t 的direciton呢?
作者: zzz    时间: 2003-4-8 10:26
再uf_so.h里面,smart object.
作者: Knight74    时间: 2003-4-8 12:30
感谢斑竹的大力支持!另外再向斑竹讨教一个问题.我已经知道了一个point的tag_t,用哪个函数,通过调用该tag_t能够得到这个point的坐标呢?
再次感谢.
作者: zzz    时间: 2003-4-8 15:49
uf_eval.h或uf_curve.h
作者: Knight74    时间: 2003-4-9 08:42
谢谢斑竹的解答,昨天真的是看帮助看昏了,很简单的一个函数UF_CURVE_ask_point_data(),我找了很久都没想起来。后来我看我自己写的程序有个生成点的函数,UF_CURVE_create_point(),我想既然能够创建点,那反过来也一定可以的。现在总算要完成任务了。谢谢斑竹和各位的提示。感谢。
作者: Knight74    时间: 2003-4-9 08:43
在UG中move 物体的第三中方法,通过移动特征来移动物体。
double real_data[2][12]={0,0,0,1,0,0,0,1,0,0,0,1,50,80,0,1,0,0,0,1,0,0,0,1};
  int mode=CSYS_TO_CSYS;
  int N_features;
  char features_num[100];
  uf_list_p_t cmtag;
  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)]
  
  i_ret=UF_MODL_move_feature(cmtag,mode,real_data);
作者: Knight74    时间: 2003-4-9 19:31
斑竹,我下面的程序是希望通过一个点,一个方向创建一个datum axis,我用
i_ret=UF_CURVE_ask_point_data (dpoint,Datumpoint);
i_ret=UF_MODL_create_fixed_dplane(Datumpoint,direction,[$dplane)]
i_ret=UF_SO_create_dirr_plane(dpoint,UF_SO_update_after_modeling ,dplane,flip,[$Tdirection)]
i_ret=UF_MODL_create_point_dirr_daxis (dpoint,Tdirection,[$daxis_tag )]
上面这几个函数先生成了一个datum plane,然后我定义了该平面的方向,
最后通过点,方向生成datum axis,其中,dpoint,Tdirection,&daxis_tag 这三个参数都是tag_t类型的,调试的时候最后一个函数出错,说是"internal error!",请问斑竹是何原因呢?
作者: zzz    时间: 2003-4-9 20:39
自己看一下log file吧。估计是你用的这个函数UF_SO_create_dirr_plane有问题。
作者: zzz    时间: 2003-4-9 20:46
看UF_MODL_create_point_dirr_daxis的帮助中说了,如果用smart object,它的update option 必须设为UF_SO_update_within_modeling。
作者: Knight74    时间: 2003-4-10 19:11
谢谢了,我也找到这个问题了.谢谢斑竹了哟.敢问斑竹的email多少呢?今后咱们可以交流交流.有什么好的资料也可以共享一下.我的是e_i_wang@163.com
作者: zzz    时间: 2003-4-11 08:50
我的资料里面有啊。
作者: taiga2001    时间: 2003-4-13 20:04
求助::{
镜射特征中螺纹是否可见是不是由thread.include_instances =UF_MODL_INCL_INSTANCES控制?
为何镜射【mirror】特征中原来的螺纹不见了?

//----------------------- Create  boss-----------------------
      UF_MODL_create_boss(location1,direction,diam_boss,h_boss,angle,trim_face,[$boss_id)]
  
//------------------- Create a thread on boss---------------------
  
//Get boss faces to use as start face and cylinder face of the thread
    tag_t s_face,c_face,thread_id;
    uf_list_p_t  list;
      
    UF_MODL_create_list([$list)]
    UF_MODL_symb_thread_data_t thread;
      UF_MODL_ask_feat_faces(boss_id,[$list)]
      UF_MODL_ask_list_count(list,[$num)]
   for (i=0;i<num;i++)
   {
     UF_MODL_ask_list_item(list,i,[$face)]
  
     UF_MODL_ask_face_data(face,&type,point,dir,box,
                                 [$radius,&rad,&sen)]
     if ( (type == 22) && (fabs(dir[1]-1.0)< 10e-7) )  
      s_face = face; //start face
     if (type == 16)  
       c_face = face; //cylinder face   
   }
   UF_MODL_delete_list([$list)]
  
//create thread
    char thread_length[10];
    thread_length[0]='\0';
    sprintf(thread_length,"%f",0.5*atof(L.value.string)-hi-2.0);
  
      thread.cyl_face = c_face;
      thread.start_face = s_face;
      thread.axis_direction[0]=0;
      thread.axis_direction[1]=-1;
      thread.axis_direction[2]=0;
      thread.include_instances =UF_MODL_INCL_INSTANCES;
      thread.rotation=UF_MODL_RIGHT_HAND;
      thread.length_flag= UF_MODL_FIXED_LENGTH;
      thread.tapered = UF_MODL_NON_TAPERED;
      thread.num_starts = 1;
      thread.length=thread_length;
      thread.form = "Metric";
      thread.method = "CUT";
      thread.callout =callout;
      thread.major_dia = "10";
      thread.minor_dia = "8.917";
      thread.tapped_dia = "9.813";
      thread.pitch = "1.0";
      thread.angle = "60";
      UF_MODL_create_symb_thread([$thread, &thread_id)]
//-----------------chamfer edge of the boss--------------------------
  
    uf_list_p_t  boss_face_edge_list;
    tag_t chamfer_id,mirror_obj;     
      UF_MODL_ask_face_edges (s_face,[$boss_face_edge_list)]
        
      UF_MODL_create_chamfer (1, ".5", ".5", "45",boss_face_edge_list,[$chamfer_id)]
  
    UF_MODL_delete_list([$boss_face_edge_list)]
     UF_MODL_ask_feat_body(chamfer_id,[$mirror_obj)]
  
////////////////////////////////////////////////////////////////////////////////////////////
    ///--------------------create mirror feature-------------------------------------
   
double ctr_point[3] = {0.0, 0.0, 0.0};
   double directiony[3] = {0.0, -1.0, 0.0};
   tag_t mirror_tag,dplane, mirror_body;
   
//Create Datum Plane   
   UF_MODL_create_fixed_dplane(ctr_point, directiony, [$dplane)]
      
// Create a mirrored body   
  
UF_MODL_create_mirror_body(mirror_obj,dplane,[$mirror_tag)]
  
UF_MODL_ask_feat_body(mirror_tag,[$mirror_body)]
  

//---------------------unite-------------------------------

  
UF_MODL_unite_bodies(mirror_obj,mirror_body);
作者: taiga2001    时间: 2003-4-15 14:24
没办法,只好又加了一段,在mirror特征上作多一次螺纹!
  
//------------------------create a thread feature on the mirror boss----------------
  
     UF_MODL_create_list([$list)]
      UF_MODL_ask_feat_faces(mirror_tag,[$list)]
      UF_MODL_ask_list_count(list,[$num)]
   for (i=0;i<num;i++)
   {
     UF_MODL_ask_list_item(list,i,[$face)]
  
     UF_MODL_ask_face_data(face,&type,point,dir,box,
                                 [$radius,&rad,&sen)]
     if ( (type == 22) && (fabs(dir[1]+1.0)< 10e-7) && point[1]<-10 )  
      s_face = face;//start face
     if (type == 16)  
       c_face = face;//cylinder face
   }
   UF_MODL_delete_list([$list)]
  
      thread.cyl_face = c_face;
      thread.start_face = s_face;
      thread.axis_direction[0]=0;
      thread.axis_direction[1]=1;
      thread.axis_direction[2]=0;
      thread.include_instances =UF_MODL_INCL_INSTANCES;
      thread.rotation=UF_MODL_RIGHT_HAND;
      thread.length_flag= UF_MODL_FIXED_LENGTH;
      thread.tapered = UF_MODL_NON_TAPERED;
      thread.num_starts = 1;
      thread.length=thread_length;
      thread.form = "Metric";
      thread.method = "CUT";
      thread.callout =callout;
      thread.major_dia = "10";
      thread.minor_dia = "8.917";
      thread.tapped_dia = "9.813";
      thread.pitch = "1.0";
      thread.angle = "60";
      UF_MODL_create_symb_thread([$thread, &thread_id)]
作者: taiga2001    时间: 2003-4-15 14:29
::{【求助】如图:过点p作圆弧arc1的切线,是否有对应函数?有没有什么办法实现?斑竹帮帮忙!
作者: Knight74    时间: 2003-4-16 08:15
斑竹你好.我现在已经明确的知道了我的part文件中两个实体对象的tag_t 和name.现在我想用UF_OBJ_cycle_by_name()这个函数来确定查询出来的tag_t是否和原来的一致,
tag_t name_tag=NULL_TAG;
  UF_OBJ_cycle_by_name (CM_name,[$name_tag )]
  while(name_tag!=NULL_TAG)
  {
    UF_OBJ_cycle_by_name(AM_name,[$name_tag)]
  }
当我给name_tag赋值时,函数返回也是为0,当我不赋值时,调试说我内存访问禁止.请问斑竹能否给点提示?谢谢.
作者: zzz    时间: 2003-4-16 09:52
那就是不存在吧。
作者: blitheboy    时间: 2003-4-16 17:43
觉得zzz很强!是我学习的楷模:)
我是一个刚开始学习ug二次开发的新手,马上机要进入课题,老板现在让我先看看UG/Open API 中的一些函数,由于是新手,在加上时间比较紧,囫囵吞找的看了一部分,有很多地方不是太明白,在这里先问几个让我很困惑的菜问题
很想得到zzz的帮助::(谢了先:))
他们是:
1、ufstr()和ufusr()的区别;
2、UF_UI_dismiss_dialog_area_2()对这个函数在看DOCUMENT时不是太理解
不知道他和UF_UI_cancle_uf_dialog()的区别??
3、UF_UI_get_DA1_coords()
UF_UI_get_DA2_coords()着两个函数中DA1和DA2具体指的是什么??以前在UG Documentation Help看到过但是现在找不到了,应为是新手好急啊!!!
作者: taiga2001    时间: 2003-5-2 19:24
最近这里好像没动静啊。。。。。。顶一下!
作者: tsingtsang    时间: 2003-5-4 14:55
把你做的最复杂的东东,贴出来
  
让大家看看,如何?




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3