iCAx开思工具箱

标题: 初次做的UG二次开发,请各位大哥指导 [打印本页]

作者: zwj149    时间: 2005-7-7 22:14
标题: 初次做的UG二次开发,请各位大哥指导
      我开始接触UG二次开发有好天了。因为要做个项目,加上自己有编程的基础,所以导师叫我去做个二次开发的课题。 我虽然有程序设计的基础,但是UG 和VC之间的接口还有点搞不明白。我有几个问题想向各位大哥请教,如果能得到深夜摔键盘兄的指导,那就更好了。
       我的问题是这样的:老师叫我开发个小程序,利用参数输入,生成模型。
于是我做了个垫片参数建模的小程序。在UG下做了如下的对话框:
      
内径:
外径:
厚度:
创建(按钮)
  
在输入如上参数的基础上点击创建按钮,就能生成垫圈了。我的程序如下:
首先预设置参数值。找到  construct_cb(创建函数),然后加入如下代码:
  
int CY_construct_cb ( int dialog_id,
              void * client_data,
              UF_STYLER_item_value_type_p_t callback_data)
{
      UF_STYLER_item_value_type_t data;
   /* Make sure User Function is available. */   
      if ( UF_initialize() != 0)  
           return ( UF_UI_CB_CONTINUE_DIALOG );
  
      /* ---- Enter your callback code here ----- */
   // UF_STYLER_item_value_type_t data;
     data.item_attr=UF_STYLER_VALUE;
    data.item_id=CY_RMIN;
    data.value.real=2;
    UF_STYLER_set_value(dialog_id,[$data)]
  
    data.item_id=CY_RMAX;
    data.value.real=3;
    UF_STYLER_set_value(dialog_id,[$data)]
  
    data.item_id=CY_HE;
    data.value.real=4;
   UF_STYLER_set_value(dialog_id,[$data)]
   
  
      UF_terminate ();
  
     /* Callback acknowledged, do not terminate dialog */
     return (UF_UI_CB_CONTINUE_DIALOG);  
     /* A return value of UF_UI_CB_EXIT_DIALOG will not be accepted    */
     /* for this callback type.  You must continue dialog construction.*/
  
}
  
上部分的程序是给对话框预设置值的,运行上叙程序后,我预想对话框的值如下:
  
内径:2
外径:3
厚度:4
  
在创建按钮的回调函数中输入如下代码:
  
int CY_creat_cb ( int dialog_id,
              void * client_data,
              UF_STYLER_item_value_type_p_t callback_data)
{
      
  
    UF_STYLER_item_value_type_t data;
    double rx,rd,he;                    //  为什么这个定义一定要放  tag_t cy1_tag, cy2_tag;
    int ret;                            //  前面呢
    tag_t cy1_tag, cy2_tag;
    double origin[3]={0,0,0};
    double d[3]={0,0,1};
      char dmin[256],dmax[256],hig[256];
    dmin[0]='\0';
    dmax[0]='\0';
    hig[0]='\0';
    //double rx,rd,he;
   
     /* Make sure User Function is available. */   
      if ( UF_initialize() != 0)  
           return ( UF_UI_CB_CONTINUE_DIALOG );
  
      /* ---- Enter your callback code here ----- */
   data.item_attr=UF_STYLER_VALUE;
    data.item_id=CY_RMIN;
    UF_STYLER_ask_value(dialog_id,[$data)]
    rx=data.value.real;
      
    data.item_id=CY_RMAX;
    UF_STYLER_ask_value(dialog_id,[$data)]
    rd=data.value.real;
     
    data.item_id=CY_HE;
    UF_STYLER_ask_value(dialog_id,[$data)]
    he=data.value.real;
  
    sprintf(dmin,"%f",rx);
    sprintf(dmax,"%f",rd);
    sprintf(hig,"%f",he);
  
    ret=UF_MODL_create_cyl1(UF_NULLSIGN,origin,hig,dmax,d,[$cy1_tag)]
    ret=UF_MODL_create_cyl1(UF_NEGATIVE,origin,hig,dmin,d,[$cy2_tag)]
  
      UF_terminate ();

     /* Callback acknowledged, do not terminate dialog */
     return (UF_UI_CB_CONTINUE_DIALOG);  
      
     /* or Callback acknowledged, terminate dialog.    */
     /* return ( UF_UI_CB_EXIT_DIALOG );               */
  
}
  
程序的运行:输入参数,点击创建,然后生成垫圈:
上面的程序通过编译与连接,生成了DLL。但是我在UG中调用对话框却出现了这样的问题,都是要点击两次,才会出现对话框。此时,对话框参数的预设置值并不是我在程序中设置的,而全部是零。我的程序是没问题的啊,这是怎么回事??是不是我的UG出什么问题了啊?? 还有我输入参数后点击创建,并没有生成我要的垫圈(我是在建模模块下进行的)。这又是怎么回事啊?请各位大哥指教,小弟感激不尽!!
  
这是一个学UG开发的好例子,短小精悍,五脏俱全。--zzz
作者: beishangjing    时间: 2005-7-7 22:39
太专业了
还是给你

作者: zwj149    时间: 2005-7-7 22:44
    只不过是个小小的入门的程序啊。它虽小,但却体现了二次开发的一个重要思想:参数化设计。
作者: zwj149    时间: 2005-7-8 07:38
    我今天早上的发现: 当我从菜单加载对话框,不能实现功能之后,我今天早上试着从 :file->Execute UG/Open->user funtion . 然后打开我编译生成的DLL。你猜怎么着? 嘿嘿,成功加载对话框,并且能够实现垫圈的创建。这又怎样解释啊? 是不是我的菜单设置有问题啊????
  
   
作者: 深夜摔键盘    时间: 2005-7-8 08:11
应该是菜单的问题。你从菜单调用的对话框中的各参数都是0,很可能是你的dlg和你的dll没有挂上。
作者: zwj149    时间: 2005-7-8 08:20
   问题的解决:顺着这个思路,我在刷牙的时候,突然想:是不是对话框和DLL重名,结果一看,果然是这个问题。我在论坛上也看到了,在.men文件中一定要使用DLL的名字,我也是这样做的。但错就错在我把对话框和DLL取成同一名字了,当时只是想方便。结果出现了这样的问题,我想也许我的这个问题能对象我这样的初学者提供点帮助吧。
作者: 深夜摔键盘    时间: 2005-7-8 09:50
对话框和DLL重名不是实质性的原因,你得再仔细分析一下。
作者: zwj149    时间: 2005-7-8 12:11
   好象论坛上也有此类的帖子,是关于在菜单脚本中使用对话框名与DLL名的区别,对吗??
作者: cam-yp    时间: 2005-7-8 22:34
太麻烦了,生成一个垫圈要写这么多.....晕倒..这样写程序键盘也要敲坏了
用GRIP写吧,10几行就搞定你要的程序!
看来C++真麻烦...
这个程序就可以生成你想要的
ENTITY/C1,C2,C3
DATA/DMAX,4,DMIN,2,H,1
GPOS/'PLS SELECT A POINT...',XC,YC,ZC,RSP
JUMP/TRM:,TRM:,,,,RSP
PARAM/'PLS ENTER PARAMS...','外径',DMAX,'内径',DMIN,'高度',H,RSP
JUMP/TRM:,TRM:,,,,RSP
C1=SOLCYL/ORIGIN,XC,YC,ZC,HEIGHT,H,DIAMTR,DMAX
C2=SOLCYL/ORIGIN,XC,YC,ZC,HEIGHT,H,DIAMTR,DMIN
C3=SUBTRA/C1,WITH,C2
TRM:
HALT
作者: cam-yp    时间: 2005-7-8 22:51
把它COPY下来用GRIP编译连接就可以用了
作者: abrinism    时间: 2005-7-9 19:07
楼主只是在练习而已,
显然并非不知道grip更简单。
作者: dcomui    时间: 2005-7-9 20:46
厉害,厉害,佩服佩服。
作者: zwj149    时间: 2005-7-11 11:10
  这位大哥,GRIP是什么东东啊?是做UG二次开发的商业软件包吗?它有什么特点啊?我初次做UG开发,这些东西不是很清楚,用C++多了!就老想用它来做东西。
作者: rachol    时间: 2005-7-11 16:25

  
你给了11楼一耳刮子!
  
haha
作者: 深夜摔键盘    时间: 2005-7-11 16:56
呵呵。你就用你的C++吧。
起码GRIP能做到的事,它也能做到。GRIP做不到的,它还能做到。
作者: cam-yp    时间: 2005-7-11 21:50
我个人认为,GRIP易学易用,简单明了。。有些局限性。。。
作者: 守护一辈    时间: 2005-7-18 02:35
兄弟你那么强帮我用GRIP做个链轮好不?感激不尽哦!!!
作者: cam-yp    时间: 2005-7-19 21:42
我对链轮不怎么了解。。。
你发个图片我看一下。。。
不看图我不知道怎么下手。。。SORRY。。。
作者: niuzilianmeng    时间: 2005-7-21 00:16
靠,叫别人帮你做链轮?自己的题目交给别人完成,要不要我把设计报告也帮你打好??老师给你打个优++我都B4你!!!别丢学校的脸!!
GRIP的命令的确简单的多,局限性也的确不少,建议楼主先学GRIP再学C++也许难度会低些。
作者: juankee    时间: 2005-7-21 15:40
这个程序我用了一下,其他没错,就是颜色设置那儿有问题,被改后运行很正常啊!没出现上述问题,我估计是作者的API入口函数用UFUSR直接激活入口了
作者: pzytony    时间: 2005-7-22 21:44
顶到火算了
作者: gao264    时间: 2005-7-26 09:13
估计是入口函数的问题吧!
作者: yangdx    时间: 2005-8-15 15:52
搂主的那个问题应该是将ufusr()前的#注释掉了吧
作者: baojinli    时间: 2005-9-5 21:48
支持
作者: API09    时间: 2008-4-1 10:59
顶啊~~~俺也是刚接触UG二次开发的!!!
作者: huhuafeng    时间: 2008-4-2 20:20
UG二次开发怎么做呀!兄弟很想学习,可是不知从那学起
希望各位大哥多指点!
176488633@qq.com
作者: ★情有独钟★    时间: 2010-3-19 15:10





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