青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

青华模具培训学院
查看: 6645|回复: 11

[分享] 手把手教你做UG二次开发

[复制链接]
发表于 2011-1-10 15:10 | 显示全部楼层 |阅读模式

1。建立两个目录。8 z! n; R9 P# o; q; J

' P$ \  ]( g7 K& x! z8 u. N" @. n& @% D9 t9 y* ?9 N
   
建立第一个目录 E:\my_first_ug,在这个目录下建立两个新的目录:E:\my_first_UG\applicationE:\my_first_UG\startup/ D. G4 y$ B' j- r' r% Y' w
8 L4 U( |, Q4 J' z8 h8 }" s- p

, i, M- j0 P- D: e! p1 _* t# {: p  
建立第二个目录E:\my_source,用存放你的源代码。

2。设置环境变量。. ]9 X- _  a7 c6 f

5 E% ^7 n/ ~8 }, L  j# w* GWindows中设置一个新的环境变量:UGII_USER_DIR=E:\my_first_UG

3。打开UG,进入UIStyler应用(在Application菜单的最后)。

4。设计一个对话框。$ V6 a8 ?5 _( Q, ]! Z) ?

, s; c4 _- F2 X0 j! W& E! B# f& ^& K; n
1
)在"Dialog Title"一栏填入:First Dialog,按Apply(每次输入完成后,都要按Apply,为避免啰嗦,以后不再提及)。
  e+ t6 m$ `3 Y( [, z" d
, `+ L( `' J* M. t! y0 t
2
)在"Cue"一栏输入:%……%%¥¥##*%****—((,什么都行,呵呵。
8 }0 B1 N: b- w- G% u  j2 q* j

; L5 u+ t. J; e. ]: W% h3
)在"Prefix Name"中,把CHANGE改为MY
% E) A8 g" I' |: S3 J+ P* C) S

7 s5 ?7 G  |# G$ o7 A% v  E& T4
)加入四个控件。StringPush ButtonLabelSingle Select List. Y) s% f( u% t

: }7 U, {: s- e3 K  r

编辑对话框的各个控件。+ I# w9 k" r1 u: H* a1 c' j
) O" p: N( z, M( s
' o& c6 y# l0 o7 Y0 f4 k* R) b5 F
1
)改变String控件的标题,标识和长度。. L. }* f. H2 G$ [1 w* M% H

1 s. Y0 x1 d: M  \) |; t" ?6 \- d; `: i$ r
Label “String” -> “Input an item”.
% o, N! t" \) ^* L* N4 c  qIdentifier "STR_0" -> "ITEM"
6 H. Q+ O) e5 ]9 c9 Y+ Q) BWidth in... 0 -> 20

2) 改变Push Button控件的标题,标识和回调函数的名字。
5 A( n% m6 }1 O) Z. Z' m1 Q
" g7 @; f- e6 w# h$ r" R6 r
4 [, Y0 r5 [4 g# R
Label "Push Button" -> "Import" - Z1 ^2 Y6 r- a; E8 W) {8 p' o) r7 V
Identifier "ACTION_1" -> "IMPORT"
4 ]+ S( x3 E) G# r# kcallbacks "action_1_act_cb" -> import_cb
/ |7 q  s% w+ M7 d* c9 s
  m% e' [4 }5 u% V' f# q
"Creates Dialog"激活。
/ h" f, {" U5 H1 _9 U! C8 V5 e8 |# q2 |0 Q; h2 j0 e

3)改变Label控件的标题和single select list 的标识。改变single select list可见项的个数。7 U. `% T3 D6 }9 I# ^
* s$ O  U8 O5 {

. X; b; y+ |* r8 g6 {Label Label -> Items List * f. b  _* A$ I  k, O
Identifier "LIST_2" -> "ITEM_LIST"
: ~9 F! O: i% |* V) g, FNumber 3 -> 6., H* r4 M7 |5 S; X' ]& e5 M! s% @% Y% ^
0 I- U' K% W, s! \/ w
+ b$ u+ {1 k2 J9 ^8 \5 F

6. 保存对话框。
/ P) e' S9 I: A. Q

* E4 ]9 q5 {! f! K2 T6 s& }6 S/ o点击save图标,把对话框保存在E:\my_first_UG\application目录下,
0 W! D: x$ Y8 z/ M. }1 C文件名位first_dlg,生成三个文件。# X  J5 M1 d/ e7 i
% z7 O2 z( c. A$ d) ~! Q) `( q
(现在可以推出UG乐)。* y- c; A! e. F! I/ G& B

, A& J8 r  F& H) z( ?% J0 O7 b, o1 u3 `- Y" F. G% X

7。建立一个vc的工程。0 _+ B$ I# i7 z, `2 \9 O4 u& `. J

3 X) N+ }( L( e+ w9 \2 Q. m( l1 C  ^" |0 F6 m
1
)把\application下的*.c*.h文件移动到E:\my_source目录下(文件可以改名字)。* ]1 |0 f' u: P; O4 U, p6 [! y

! l) {9 a: e7 [8 {. G. b2
)建立一个新工程,选择Win32 DLL) X7 W( x* r, T( [( \& r) C/ M8 k8 ]
* q! ~; n. a* B) S+ S/ T6 r
3
)把c源文件和头文件加入到工程中。
" _; `: k  k' i/ U- w& J; d7 Q$ E, d9 x

8。设置vc的环境。
' Z9 Y5 V/ F, Q; Z. j  u- s

1 g7 ?3 @- A% X8 V3 G4 q0 z3 L
3 \$ E, k. u4 D' {. MProject -> Settings -> C/C++ -> Category ....
加上头文件。

Project -> Settings -> Link....
5 N- Q6 Y$ @( d9 z改变输出文件名,加入连接库文件(ug17之前的库名字不同)

Tools ->Options...->Directories 9 T! j8 m( }" A1 H: g/ D& q

( s* G- J$ n+ W) P) |4 x' G$ @Include files
Libray files 加入UG UFopen的路径。

打开first_dlg.c文件,找到menu script样板的位置。
' U+ U( y. m9 `3 Q/ H1 A8 m$ R
9 S& `( x# N0 y: a1 a& w9 n
复制这个样板到一个空的文本文件。8 N* `2 b4 U' V

: L7 i7 f" H# }1 D* Q把文件保存到E:\my_first_UG\startup目录下,文件名位first.men(注意后缀)# f, q( j# |" f3 m) t: ?

2 y* C, j5 }' J+ \

找到 #ifdef MENUBAR_COMMENTED_OUT
& @' o9 X4 L6 u1 P( q3 j5 V
1 e2 u/ P+ P% @. q' i" Z9 J1 l
把他和他对应的 #endif 删掉。

找到#ifdef DISPLAY_FROM_USER_EXIT
; f: i$ x( O* {8 Q

2 c) E- a4 e0 M% U, L: z0 [2 Z4 J* P把他和他对应的#endif删掉。
$ t) q) N1 ~5 _% N  J4 n( ?$ I
9 E8 e0 \+ w) G9 `+ L
找到 <enter a valid user exit here>
2 h/ F6 D; ?4 z把它改为ufusr

现在可以编译连接,试一下了,: }0 P7 k8 [6 ^$ y2 y6 W% R* B0 ^
呵呵。

运行UG,点击菜单。啊!!怎么不行??秀大了,呵呵

打开first.men文件,把ACTIONS后面的名字改为libmy_first(DLL文件的名字)

现在一个空架子已经打起来了。剩下的就是要加入自己的内容。

就上面的例子讲讲下面这些回调函数(看清华那本书搞得我头大)谢谢!


+ p5 k/ F% y; Q

好吧,下面将一下这些回调函数的应用。# ]' ~0 a) q( z5 s
: X5 d, ~2 A3 z) L3 |+ G8 ~( s: R6 r# Q
4 v# p, P- a* Q% S2 {7 R
Apply_c
Ok_cbcancel_cb分别是点击OK APPLYcancel按钮时,执行的动作,它们的应用在后面的例子中介绍。
# O2 R' E# |! C: O: W3 S
. l# J4 w' V" u/ n
constructor
Destructor本分别是对话框显示之前和退出之后执行的动作。/ N7 C( J: |. c4 Z( B4 U2 o" R- y& A
) m$ R' i7 Q& u. x
在对话框显示之前,可能需要进行很多操作,譬如说:设置对话框的选择方式,就是说在对话框打开后,用户可以选择什么物体,面,实体等。
3 `, v- N0 m3 F8 u1 s0 B

& g8 i/ }& X! y  |1 H在对话框消失之后,也需要进行一些操作,譬如说:释放申请的空间,把加亮的体恢复等。下面我就用例子介绍一下这些回调函数的应用。

9 t3 }* q+ r& T" i- |) _
添加回调函数。# p( [" t6 T0 b+ b
- P( z# T6 T- c) F5 W
首先进入UGUIstyler,打开前面生成的对话框first_dlg.dlg,在相应的位置添加几个回调函数的名字(每一个都要回车或按Apply)。
/ V6 x. O) F  I0 K

3 ~- x5 M/ h4 p. p$ s8 T1 e5 Z6 C
9 m4 m5 H# v' z# `cancel_cb
% ^* P4 K0 Y7 ?) Y2 h1 k4 ]construct_cb % Y8 T6 A6 w' r8 b
destruct_cb
8 c! Z) B. u' H4 l0 Ook_cb 4 E& d- F* p3 ~  a8 K' O! x8 \
& |2 \0 A1 w$ M) a+ j( w2 {0 Q
为“Input an Item”田家一个回调函数input_cb& I6 ]# j* n' i$ X, F5 o7 U

) F$ r4 I8 `2 q( l保存后,退出。
1 i" s( Z$ G+ ^& e5 ^5 s8 v

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

ZZZ斑竹辛苦了!
; u& [; d; A7 f( B* M6 H

, E" t) k# K, K  T  
小弟正要搞一个UG二次开发的项目,以后有问题还请多多指教了:)% H! a- M5 v" S6 ^

+ h/ M' R1 [) ~) n   
请问工具Araxis Merge哪里可以得到,可以简单说一下怎么用的吗,我VC还不太熟,谢谢
0 u$ j# J6 b1 m# Y

3 @; I( i; q& p9 h9 ?2 a我的EMAILwgwang_sz@163.com
% X" g! `- q' d! w/ p( Q# A      QQ:43801603
; k- U+ s5 l( h) D' @   

打开first_dlg.c,找到construct_cb的位置,在其中添加以下代码。
8 v* ?+ v5 V7 ]3 O' N* B7 W# L

$ z" g# J/ r1 ?# R1 z
" G$ W' \2 p. ]- Dint MY_construct_cb ( int dialog_id,
9 a+ {& h" A4 |/ K+ h  _  @( t             void * client_data,
" |; \$ p1 @6 z3 F6 g             UF_STYLER_item_value_type_p_t callback_data)
7 ]7 v3 B4 J4 m: V9 @{
* g; Z# [( q: Z6 f3 T3 m
  int irc;
( H" I3 K2 h/ y  UF_STYLER_item_value_type_t value;
; t9 H! w, S* ?  char string[133] = "Input a string here.";
# l1 R. Y$ x6 |- B* ~, N9 X
  P3 k. }. x5 o% o
     /* Make sure User Function is available. */
8 u" _4 k' K, |     if ( UF_initialize() != 0) % e, U: J: j9 a) F0 T
          return ( UF_UI_CB_CONTINUE_DIALOG ); , F) D! D" A2 P8 J+ `% E  z7 u
% N8 i6 R" P* g& w
  value.item_id=MY_ITEM; , G! R6 n- W; s$ [2 \
  value.item_attr=UF_STYLER_VALUE;
6 Y) z! I* m: s! O$ M# _  D) l  value.value.string = string; ; E# ]* O' |4 O% q
  irc = UF_STYLER_set_value(dialog_id, &value);
* H, m0 D8 C' K3 G+ ~1 F2 O  if(irc) & `0 c; m. W( \- @: [' T  u
  {
' Q! J9 I, ]3 m, O& b  P    char message[132]; - q2 i* v2 ^' c3 G% r7 [0 M

- x+ E7 _- w  I- R- T    UF_get_fail_message(irc, message); 7 p( F0 d3 m: u* x
  }

' t. q; P  `$ ^. P1 C8 N; Q. V7 z2 N" a# Y& L% ]/ m# \
UF_terminate ();

找到input_cb的位置,假如下面的代码。# J- Z% O# K+ w& k

) |8 L4 ?. `  s/ R( l* n0 m& Y
% |7 H, }. e! S  x4 X0 uint MY_input_cb ( int dialog_id, 1 `+ p. c" }7 a; O: w/ S" u1 G( _
             void * client_data,
1 H. w& R$ B$ Z; X+ |: s7 ~; Q3 g  i7 \             UF_STYLER_item_value_type_p_t callback_data) ' ]0 D3 J7 b& D6 S2 B" Y2 F
{ : f, @3 Q+ D4 S7 A* s' U
  UF_STYLER_item_value_type_t value;
& f3 [$ P, X& p/ e6 z$ ~6 g  M0 d  int irc;
7 F  l/ ^+ z- M- i; Y; J3 T  char string[133];
8 V# ^0 @2 z& Q6 _7 J; X& m+ R
+ T1 `9 @* r  h  m8 A
     /* Make sure User Function is available. */
2 X5 Z) N- W# W: j* Q     if ( UF_initialize() != 0) 6 A, c- p) n( m5 O
          return ( UF_UI_CB_CONTINUE_DIALOG ); $ F7 g2 K8 t6 E$ q
: G2 X. h+ K/ E3 c1 P# ~
   /* read your input */
" E' _" I3 I$ ]    value.item_id=MY_ITEM; : @8 ?& v2 r1 v! B5 V
  value.indicator=UF_STYLER_STRING_VALUE;   K& s+ ]0 i3 x
  value.item_attr=UF_STYLER_VALUE;
" b) w! ?7 O% _& x7 P' b4 K$ i" X  UF_STYLER_ask_value(dialog_id, &value); 4 V" M5 ^# \2 M2 D3 X

5 F# l: K7 g; z) r, L" h# X  strcpy(string, value.value.string);
* f% Y* t' L- S. [/ ]8 w  UF_STYLER_free_value(&value); 1 w8 |6 O  [' C
  g, J0 x5 l/ d# [1 b0 |; v* A8 }
  /** add it to the single list */
, B) G/ [) B. h  value.item_id=MY_ITEM_LIST; 1 Q0 \6 e- x' n& B9 q
  value.item_attr = UF_STYLER_LIST_INSERT; / x7 F" v( a; M0 X& O. [
  value.subitem_index = UF_STYLER_NO_SUB_INDEX;
5 I* I9 z8 l2 C- L9 p" h  value.indicator = UF_STYLER_STRING_VALUE; 6 S3 ?( Z! Y, d
  value.value.string = string;
- o& D3 ~$ |/ a, m% ~  irc = UF_STYLER_set_value(dialog_id, &value); 1 m+ b) t8 F9 o0 M. t% @2 T( U5 M
  if(irc) 2 s, _: y+ f$ a9 }5 M  N
  {
/ a% f, {! l; B* r    char message[132]; $ `! X* ~* o9 M1 \& }& F( P4 N
6 m  P! B2 \" G' F; y8 l
    UF_get_fail_message(irc, message); 3 H' F/ B- l5 C
  }
     UF_terminate ();


8 N2 z( q, u7 D4 H$ ?0 _! d
& s+ H6 X  b/ Q7 j( \/ C% D' f

ok_cb假如下面的代码。3 m0 G( ~9 O- d1 u; U6 k. c6 |
: H' c' S5 m1 U3 v

, q- Y; r: }/ a( C int irc, i;
& F/ X+ }+ k% h( g0 D# \  UF_STYLER_item_value_type_t value;
6 a: {, l1 M9 Q# l" F0 Y

0 I$ g: b/ l1 `& A     /* Make sure User Function is available. */ * O# [& N) H8 T! _
     if ( UF_initialize() != 0)
- ], y1 H, n4 ^/ u" S* a% q          return ( UF_UI_CB_CONTINUE_DIALOG );
7 C0 d" ~4 {+ D8 `1 F  w3 x2 ]+ s
   UF_UI_open_listing_window(); ! P0 T2 M9 U+ `% l# v; m
7 r& a3 {7 H1 X1 Z- Q' L, w
  value.item_id=MY_ITEM_LIST; 2 G2 b3 t! b4 H: m) E  I6 G
  value.indicator=UF_STYLER_STRING_PTR_VALUE; * U1 i* N0 ^/ V: i( x& m( g' P
  value.item_attr=UF_STYLER_SUBITEM_VALUES;
" C/ F/ ]5 j) V3 K* _$ g  UF_STYLER_ask_value(dialog_id, &value);
0 f$ d, k; {5 F/ J) v    for(i = 0; i < value.count; i++) : Z, ~4 ]' \5 }- M
{ 4 `# O8 [0 D* i7 q" O
    UF_UI_write_listing_window(value.value.strings);
6 m: r- |9 y  `; S) J0 [" U! c    UF_UI_write_listing_window("\n"); 0 v& B5 ~2 ]- O4 O# u
} * O% a$ X" y; ^8 D; N

: ]: L% n7 e) V% y: ~( o
3 v$ V4 w. G& m& f  UF_STYLER_free_value( &value );
' i% O4 Q( Q- Y
     UF_terminate ();

至此,我们介绍了几个回调函数的简单使用方法,下面看一下运行结果。( ]8 c* M/ A; E* s0 R- s% ?

8 W6 ~$ C# [% {* V6 J  W刚打开对话框的结果。
0 M' S) x2 i+ J4 X, p! L
9 c2 I! T- L) U  ?5 v* j3 ?9 u% a

输入一个字符串,回车。它显示在下面的single list中。
; T3 A( L. F, F- L$ L- f) Z& H& [7 L6 m
对不起,a minor change on code.
! V# j) A- \, d2 W1 h: X3 wint MY_ok_cb ( int dialog_id,
  E5 T7 X2 O4 R- l6 Z6 @             void * client_data,
' g8 p. y6 H& p; a7 r" X( C             UF_STYLER_item_value_type_p_t callback_data)
1 F4 m' X+ m8 ]' \+ H5 J{ 3 @6 ?9 T) s" Y5 e: ~
  int irc, i;
, N/ \1 e1 Y5 o7 R4 I2 T  UF_STYLER_item_value_type_t value; ; i5 q3 {0 U$ `9 k; d

: t" b% @! M/ Z% e6 H
. n* m- V  E0 L) M- p  F     /* Make sure User Function is available. */
7 I0 p1 @5 O4 _( j9 P     if ( UF_initialize() != 0)
0 j2 {0 |5 E; u, N4 L          return ( UF_UI_CB_CONTINUE_DIALOG );
# ^0 W; @9 G2 Y  F9 [8 a6 n  g  C- W; w: w
   UF_UI_open_listing_window();
! e( c) `. i: q; r/ f, t
2 H9 U# [( q' e* T  value.item_id=MY_ITEM_LIST;
9 p8 c: a/ c" e7 p0 K& v1 b  value.indicator=UF_STYLER_STRING_PTR_VALUE; & |0 M* @5 u" i4 d
  value.item_attr=UF_STYLER_SUBITEM_VALUES; 0 y% |! ~$ h" C4 q0 u; G
  irc = UF_STYLER_ask_value(dialog_id, &value); 6 O# _! N% Z# ^7 [0 i. X
for(i = 0; i < value.count; i++)
4 g9 e! H& @4 L/ M; O9 F) Y  { , f" Y5 `0 Q. T) D7 i, b) B
    UF_UI_write_listing_window(value.value.strings);
( ~* u4 c; q; U( |4 y2 h    UF_UI_write_listing_window("\n"); ' K% j  t0 ]+ c0 [+ V
  }
   
0 p6 V- Y' o" y$ ~% z  UF_STYLER_free_value( &value );
: M3 W  a3 u5 `6 J/ Y, b7 l
点击Ok后,所有的字符串显示在list window 中。
7 j. B- l( `- O4 u

清华书中uistyler部分的程序去掉了原来的注释,使得简单的事变复杂了。& v; v  A* `) A  G7 ^7 E) Y& B

& h$ g* e# j4 ]我没有在ug/NX下开发。在18版中,建立VC工程时可以选择UG APPLICATION WIZARD,那么后面的设置就可以变简单了。 Lcfq

ug/NX建立VC工程时有Ungraphics NX AppWizard V1也很好用。

to eastcamel
  w  i) x+ W' K, L9 ?3 x.men
可以执行很多类型的可执行程序,比如.exe.dll, .dlg .macro
) j1 L, S' J. Q+ W/ {' ~3 B

7 k3 }, I9 B, V' H& ?$ waction
没必要一定是my_first.dll,这是他给你的一个例子,如果你用UISTyler生成了my_first.dlg,那么你就可以在action后写上my_first.dlg; v) Z' U/ ]) \3 M8 c6 A2 F* w* L

. n: e- G6 |. p% T4 ?7 }- E
$ T0 G; n# a8 s- X  f% Lto visionphone 3 `) b- R  x* U0 V) j  v+ Y8 y
论坛是交流问题的地方,不是教学,- U' ^7 C7 K( W: [6 A

+ K3 @) O# S9 G4 k, b; s关于menuscript开发下拉菜单,包括菜单的级联在清华那一本书上已经很清楚了,还能找得出比他更清楚的资料吗?另外menuscript已经简单得不能再简单了,还能找得出比他更简单的编程方法吗?

现在在试一个把物体平移的功能.我看了UG/open 里面的函数帮助,也仔细研究了清华出的那本书,他里面是先将所选对象的坐标矩正进行正则化处理,然后为正则化矩正给出一个新的ID,最后创建一个零时坐标系.然后就用uf5943,uf5947两个函数进行平移了.
2 Y. X. F* t0 U" g( r9 t2 v' P而现在我自己做的时候,也采用上面相同的步骤,但我调试时发现我选取的对象没有矩阵ID,当然也就得不到坐标系统矩阵.我后面采用获取工作坐标系的ID,然后获取其矩阵ID的方法,但调试后仍得不到平移结果.
1 e4 w4 ]+ ?' [( y6 k9 j8 R6 ]请指教:下面是我的一段代码; # u: O3 k1 D; J; W9 L
i_ret=UF_CSYS_ask_wcs (&wcs_id );
- N0 u, o4 V; e- ?  UF_CSYS_ask_csys_info (wcs_id,&matrix_id,csys_origin); 3 C6 t6 F7 C. J* p
  UF_CSYS_ask_matrix_values (matrix_id,matrix_values); & v" q9 S/ F* w
  UF_MTX3_ortho_normalize(matrix_values); 4 b% g4 P; M; x* D8 F1 ^# m* t
  i_ret=UF_CSYS_create_matrix(matrix_values,&new_matrix_id); 6 W' \% y& F% z2 C# l
  i_ret=UF_CSYS_create_temp_csys(csys_origin,new_matrix_id,&temp_csys_id); % M2 X. Y3 ~- V& M7 _! Q& C
4 g4 z/ U- n) r5 `% V
  FTN(uf5943) (Dxyz,D_target ); / u3 J$ U7 G1 G" P# \. T* g/ N
  FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp); 0 l; T3 O& T2 \1 w

! R* j# h, T: H& x+ x
程序的前后两段好像没有什么联系?DxyzD_target在哪赋值?

平移的例子5 x3 k0 S$ A$ O0 h+ C) [

( D2 B. z8 K5 [; y+ x& D+ ~! h7 d4 `; w1 I5 n9 w( f; h
double matrix[16];
7 y8 m# d+ L+ Y  int count=1, copyFlag=2, layer=2, curveFlag=2, rtState;
+ }) q7 n. Z" p: n" e+ N- ?# x* Z# y) Z
  UF_MTX4_identity( matrix );
: ^& Q3 s: K( n% g) }0 |8 _  UF_MTX4_edit_translation( matrix, vec ); 8 F" |2 _/ y6 p5 M' m
9 Y" A1 j7 }+ @& d- C- \
  FTN(uf5947)(matrix, &srcObj, &count, &copy;Flag, &layer, 0 e, z1 ^( {+ W1 t$ Y! {: q4 A
        &curveFlag, copyedObj, NULL, &rtState); 1 ]7 W$ B! Q1 k

4 K  g4 [' e, d; z: a  return rtState;

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

/ S2 `6 M% [" M  Q, }$ Y
找到文件UGII\menus\custom_dirs.dat添加用户路径  w5 w+ t/ z( m. ]/ k- D; Q* t
( n2 k+ \( G3 p  l0 X/ e
# Customer modifications can follow on here
3 T! w5 [; q( ?- k7 w& R
你的starup所在位置路径比如e:\project_insession\standard_part
/ c- x" j' g, v' L' a
# ]* S5 s" o9 C. N3 B
也可以在UGII\ugii_env.dat内把#UGII_USER_DIR=${HOME}改为UGII_USER_DIR=你的starup所在位置路径比如e:\project_insession\standard_part

在平移的问题中,Dxyz是一个Input量,它定义了对象在x,y,z方向上的平移值。. Z3 ~1 k- _& q3 ]- N, b
1 R0 v/ Q; q3 m; w7 l2 m% D* d
double Dxyz[3]={50,80,0}; : h3 V8 w2 y1 S% n( a* y9 W
至于D_target,它是uf5943函数中的一个输出量,是uf5947函数中的一个输入矩阵值,其中就包含了Dxyz定义的平移量。0 x# m" Z) @9 V, z2 D

; f' M/ A& c- i7 y; v2 }FTN(uf5943) (Dxyz,D_target ); 1 J# R6 g2 g6 l' {' M7 G
  FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp);
. p- M+ @7 q& j6 p7 g
后来我跟踪调试了resp的值,显示为0,表示成功了。但我用UG里面的工具检查一点的坐标,却一点变化也没有。! t% i0 B9 b3 o+ l

0 i/ ~3 X4 ?. g- H. B) S后来我调试了ZZZ兄的一段代码,发现copy是成功的,但我定义为move,即把UF_MTX4_identity( matrix ); ! I5 l! l2 k; W. o
  UF_MTX4_edit_translation( matrix, vec ); 6 Q# C2 j7 R% p9 ^
0 R2 M! J& z; J8 S3 M
  FTN(uf5947)(matrix, &srcObj, &count, &copy;Flag, &layer, ) Q4 {3 P) W# Z7 M
        &curveFlag, copyedObj, NULL, &rtState);
; p; S8 \# @3 t8 Q( o# i: y
中的&copy;Flag设定为1,你的rtState可以为0,但对象object却没执行什么操作。
9 q- R" K, P8 H7 V3 S4 h% h$ r$ L: D
& m: t% Z" Q7 u8 P
现在我想把我的object进行move(这个对象包含了blend,hole,extrude等特征操作),请问ZZZ兄有什么高招?- [8 y, e$ }/ S) F

) \5 O/ R, {1 ]' r现在我调试的程序可以对point,curve等进行操作了,但带参数的就不行。
( R4 y; }' }- v: k) k5 ~
  M1 Q  _% @1 }! Z* U
& c8 C2 |! v$ l- ?  K* [, n. u

关于平移的问题,受斑竹的启发,我调试了下面两个函数,同样可以对Object进行平移操作(只能copy而不能进行move ). 1 E* Q" Y, G+ X$ g) I
double Dxyz[3]={50,80,0};
: X2 b( \2 k! a9 Q! B, \  double D_target[16]; ! _) m" s" g" T: m) y* {/ b
tag_t copy_object_id;
8 F) X) {8 m/ `  FTN(uf5943) (Dxyz,D_target ); 3 F* v0 j0 K3 B' d( [; K* \
  FTN(uf5947)(D_target,Object_selected,&one,&two,&zero,&two,&copy;_object_id,NULL,&resp).

现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.
7 v- s2 @9 N9 S, o& wuf_list_p_t cmtag; , p5 L" n+ [4 v) d
int ug_type,ug_subtype; 8 M' [8 W9 X$ l3 H
int N_features; , J0 j% m$ k7 t' ]5 l
i_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype );
% w6 y9 _9 T0 L' R3 g  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object );
: ~$ L2 A3 m! P* W' Z' c  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag ); % Z9 _- m/ S7 J. X( f# v3 K" @2 g
  i_ret=UF_MODL_ask_list_count(cmtag,&N_features);
8 ?2 l9 {5 W* V' p; t/ h7 M; O- n* m9 e
但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?: F4 i  Q/ l( C4 {- G' f  h
2 C/ ]" d# S, e% M" v; }) J' I
下面的这张图片是我在交互界面下进行Transform时出来的警告信息.


& _8 P$ ?5 w7 n& F: u2 K

Knight74 wrote:
8 H( K) D/ ?& i$ h* N, A& Q现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作. 8 X/ U0 _2 e, `+ z
uf_list_p_t cmtag;
" T, _3 [  n# _  a; Yint ug_type,ug_subtype;
, U* V# b2 Z0 ^4 S3 P  h; wint N_features; : ^5 h0 T* k( y4 C0 b, f' {
i_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype );
) ^  a4 s6 d* a4 x) u& |* F  e  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&
body_object );
% F) v4 t0 a4 Y  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag );
' c( B3 E/ I/ X) j8 n7 H. q  i_ret=UF_MODL_ask_list_count(cmtag,&N_features);
7 Y/ z8 P, H5 z. m8 |% b
但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?
/ u7 w3 d1 @& n( A+ G下面的这张图片是我在交互界面下进行Transform时出来的警告信息.

+ W/ E" s$ o* v


' a0 j; ]7 V* o& p
- G- `6 _; {9 O/ q( p$ Mbody_object
一定要初始化为NULL_TAG.

Knight74 wrote:. T. x# i( Y- Y1 M/ n. |& D0 v' f
请问斑竹,知道计算两个object之间的距离函数吗?这个函数可以计算两个object之间的最短距离。/ C  @1 @+ x. ?! T! B: r6 K
另外,感谢斑竹上面的提醒。今天有时间我把第3中在UG中平移物体的方法写上去。是通过移动特征来移动物体。

求助 : I# J$ T1 j- |; R8 [& j% L

: ~, Q; T- F' O: q! K, s+ q" M, \3 O//-------------------[6] Chamfer 4 edges of block2------------------- 2 c9 c/ A6 W$ M1 D; W; e5 ]' _. v
uf_list_p_t edge_list1,edge_list2;
& _1 G% x$ ?; g! ^0 Z* {+ \5 p4 N; qtag_t chamfer_id,edge; , J3 @) G# M6 i  f& h4 N
double end_point[3] =  {0, 0,0};   
9 s0 E" H5 Q/ p0 Y+ _2 |7 P& idouble direction_z[ 3 ]= {0, 0, 1};
  p- e2 v% T: F0 D
int dir_edge;
+ W, c; _+ h9 [# D$ q) Nchar * angle1="45.0";
/ n6 P; B/ k& ~6 ]9 @. Rint subtype=1,*is_parallel=NULL; 4 s3 j4 A' R; {: x3 y, |
UF_MODL_create_list(&edge_list1); / w* R5 T  H  \/ U! c7 {, g
UF_MODL_create_list(&edge_list2);
8 Q1 f& P, O+ J" u7 g# G8 mUF_MODL_ask_feat_edges (block2, &edge_list1 );   i9 T& a- p+ e
UF_MODL_ask_list_count(edge_list1,&num); 9 _& M6 C1 ?8 |4 e/ G
for (i=0; i<num; i++)
# C* f4 h1 ^5 A6 f6 W{ : R9 n- N* Y) p  w
     UF_MODL_ask_list_item(edge_list1,i,&edge);
4 K1 h/ o6 m$ P6 @6 q- p! t3 ^
  h2 _) F, t3 [1 e+ `$ t
2 E& a0 Q9 X1 J9 f) z; K, |
   UF_MODL_get_curve_edge_direction (end_point,edge,&dir_edge );
, p1 D6 W6 w- ]. u- u$ u3 z. v3 h" t) V/ f5 o) }# A* r
   UF_VEC3_is_parallel(dir_edge,direction_z,0.0001,&is_parallel); 1 _: I5 A9 u4 N
     if(is_parallel) : i# L% j6 {+ F8 p! ]

0 C! g3 r9 U; f! I: _3 J! [4 b9 d; ]4 }; y
   UF_MODL_put_list_item(edge_list2,edge);
1 N9 ]- [* x3 E- y/ P# j* c* |   } 7 p% Y, u9 M3 b4 ~: s& ]

% Y# t; Z/ ~( Y. ~2 ]' j   UF_MODL_delete_list(&edge_list1);   1 `& R- [  f' r0 ~
UF_MODL_create_chamfer (subtype, "2", "2", angle1,edge_list2,&chamfer_id);
: T- Z! r0 T* X9 X   UF_MODL_delete_list(&edge_list2);
* H( v  I$ L% z( R3 {* |+ Y% c* U5 D3 p! Z$ A
编译错误:error C2664: 'UF_VEC3_is_parallel' : cannot convert parameter 1 from 'int' to 'const double []'
% X$ B2 u" |: T0 o) b  g2 o请问用UF_MODL_get_curve_edge_direction 得到的edge的方向dir_edge是何类型,是不是不能用它得到block边的方向?

extern int UF_MODL_get_curve_edge_direction (double * end_point, tag_t curve_edge_eid, ' h1 k, D6 t7 Y6 \6 M
int * direction );   H" c5 z) U, A( l+ u. n

& K) F7 w' g0 \0 |' zdouble * end_point Input : The input endpoint
9 q  w- M3 I: x1 n/ C& _tag_t curve_edge_eid Input : The input curve or edge
- g+ d+ t+ ?5 e2 b9 ]9 y
int * direction Output : Ouput direction ) g/ p) Y, X/ l% G/ |

& ^' |4 V! }9 Bextern void UF_VEC3_is_parallel (const double vec1[ 3 ], const double vec2[ 3 ], 2 o* U+ }) h! @, c6 U
double tolerance, 1 ]  }# v7 P9 a+ g+ u: T8 F2 m
int * is_parallel ); 5 {8 R9 X* V. ?$ K6 Q8 t
8 i1 [5 f/ m6 c
const double vec1[ 3 ] Input 3D vector
. F  N6 T. j& }4 d4 d! I) N3 Kconst double vec2[ 3 ] Input 3D vector # D- h- o, ^/ U% W) f2 ]" `: X6 z
double tolerance Input tolerance " a! P4 M8 L6 m" w  {; j8 }
int * is_parallel Output = 0 Vectors are not parallel ) W# G. B, t, @" B
= 1 Vectors are parallel " o/ c7 t' j5 U8 |5 O" `9 E
; x  a( Q5 q) d, g. n# n
整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?

taiga2001 wrote:
! e6 t2 B8 r7 W6 S" w- W7 ?2 Iextern int UF_MODL_get_curve_edge_direction (double * end_point, tag_t curve_edge_eid,   }: ?! L  I' [6 ?7 k# S& w- C; Z
int * direction ); 8 H+ \" {$ i1 q) a+ o
   6 h% Z( e, a# s4 N9 H; ^5 k# W
double * end_point Input : The input endpoint ; G  h$ H2 K: j) R& L2 M$ X3 ~
tag_t curve_edge_eid Input : The input curve or edge
1 h. K& I$ K8 U1 c3 Q* F. g+ D
int * direction Output : Ouput direction
1 w5 y/ P! s! m, @   
  g3 M  D) d8 x! k) X! Zextern void UF_VEC3_is_parallel (
const double vec1[ 3 ], const double vec2[ 3 ],
/ w* ~7 {/ }9 L( ]7 W. ]double tolerance,   M; ~2 w' Q$ o9 P) Y2 |/ _
int * is_parallel ); 2 o& a# l1 ?0 O- s" r$ Q
   - q( d. E7 Y! [& [. A6 X9 ^1 V% I' L
const double vec1[ 3 ] Input 3D vector , F8 v% u* h# _; ?1 M8 o" m; n  S
const double vec2[ 3 ] Input 3D vector ! ]+ q+ Q5 w9 ^+ [1 r
double tolerance Input tolerance
7 V) i$ m0 J4 K; o0 ~1 Lint * is_parallel Output = 0 Vectors are not parallel 5 `& `) Q* a+ j
= 1 Vectors are parallel
: _( H5 l( e! Z0 F+ d   
  W" ^/ e# U2 h& M
整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?

第一个函数只是用来判断一个点靠近一条曲线的起点还是终点。$ D) d; z0 K0 ~. D) J1 I
: v8 _( [( {9 e+ H8 a
第二个函数要求输入两个矢量。" i  O3 \, p; {% D* v
( |) C1 T6 u3 {) Q' z, W6 W
得到边的方向可以,先得到边的端点:用UF_MODL_ask_edge_verts()

-------------------[6] Chamfer 4 edges of block2------------------- 9 t9 n" C- x% x
   8 U* G- m9 H' G5 t0 B* [
   uf_list_p_t edge_list1,edge_list2;
) d: V+ z3 y& p- v' p+ m  c5 \) a5 e; m   tag_t chamfer_id,edge;
, @) ?  T9 n8 l3 V  t& M* O   double point1[ 3 ];
7 k) `$ `2 }) f. p1 Z   double point2[ 3 ];
  U* \9 Y" r0 q4 e, G) x   char * angle1="45.0"; 4 V2 H# e5 C2 |5 L  i2 F$ g
   int subtype=1; ! N( w3 s' n4 F! B
   int vertex_count=NULL;
$ w' V) a/ C" y# {/ a" O8 J   UF_MODL_create_list(&edge_list1);
1 S( W0 a8 c4 [' ^0 Q   UF_MODL_create_list(&edge_list2); . Z7 ~: j2 s; e' w/ e1 B
3 y* l- y" o, ^! A$ S
   UF_MODL_ask_feat_edges (block2, &edge_list1 );
1 E7 R# P% U, z   UF_MODL_ask_list_count(edge_list1,&num); ) I' X: V/ @7 P( h+ r
   for (i=0; i<num; i++) 9 b) M/ w& y2 T8 o2 V0 A' `9 R
   {
9 D( B/ U# q5 g* G  `# m, x/ f     UF_MODL_ask_list_item(edge_list1,i,&edge); ! o: F! W( H! U/ W: K
     UF_MODL_ask_edge_verts (edge,point1,point2,&vertex_count );   a! C6 [# G0 z" b8 l
7 E2 D% F: e9 a( I. `, C
     if(fabs(point1[2]-point2[2])>1)
& s8 H( R5 {# W$ i2 X   UF_MODL_put_list_item(edge_list2,edge);
  c" K3 u* R  S* o1 E2 i0 ]5 c& H* P   }
0 C/ k8 h! h" g  _1 S, r7 A! A, b
% c4 t1 Z/ X( q: |$ d0 r. N* \# n   UF_MODL_delete_list(&edge_list1); 2 Z$ `$ T) [2 N6 ?' u
0 D* p4 w6 t0 w7 B
   UF_MODL_create_chamfer (subtype, "2", "2", angle1,edge_list2,&chamfer_id); 6 D/ @0 n* ?- L7 j2 Q/ ?
   UF_MODL_delete_list(&edge_list2);

UGmove 物体的第三中方法,通过移动特征来移动物体。
/ [' a( j+ F" d8 m: ^& @

, Y& \. X. P* G' ]/ u: d. Gdouble 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};
9 T, c; d' Y; {6 q( f4 Q& `! T  int mode=CSYS_TO_CSYS; ! j' k4 C7 @) l% W' t
  int N_features; 8 P, W1 Y- f  X3 R" w
  char features_num[100];
- ]6 P) y$ n7 P) d& n, }  uf_list_p_t cmtag;
+ o8 w& n: M+ K) P* q  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object );
, j* F1 M, e, b* Y8 s  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag );
" [0 f+ |3 c4 U/ \' k  i_ret=UF_MODL_ask_list_count(cmtag,&N_features); . M1 N) h0 P: Z0 i: \7 O$ U

) q. A6 F' e  e$ U8 i& Q* ]9 ]7 K  i_ret=UF_MODL_move_feature(cmtag,mode,real_data);

斑竹,我下面的程序是希望通过一个点,一个方向创建一个datum axis,我用
  {2 {3 N% P& }8 k8 y
0 A; [2 `/ T) ?2 E9 {3 @* I
i_ret=UF_CURVE_ask_point_data (dpoint,Datumpoint); 6 t* S1 o, G: w/ P. O+ Y! V- T& i# \6 _
i_ret=UF_MODL_create_fixed_dplane(Datumpoint,direction,&dplane); ) ~9 |# z. L# V( o5 {8 s# ?
i_ret=UF_SO_create_dirr_plane(dpoint,UF_SO_update_after_modeling ,dplane,flip,&Tdirection); 4 b3 f. t5 Y1 L2 c+ ?6 x0 j
i_ret=UF_MODL_create_point_dirr_daxis (dpoint,Tdirection,&daxis_tag );
" D" ?8 j* |% o& l( v
上面这几个函数先生成了一个datum plane,然后我定义了该平面的方向,
. P7 X8 W8 {8 j3 S* N+ G0 f最后通过点,方向生成datum axis,其中,dpoint,Tdirection,&daxis_tag 这三个参数都是tag_t类型的,调试的时候最后一个函数出错,说是"internal error!",请问斑竹是何原因呢?

镜射特征中螺纹是否可见是不是由thread.include_instances =UF_MODL_INCL_INSTANCES控制? 5 r( R0 L& v' A; o
为何镜射【mirror】特征中原来的螺纹不见了? 2 X- |/ ]. Q. X! U' \$ {" M
//----------------------- Create boss----------------------- # u% K, Z' Z& h" J
     UF_MODL_create_boss(location1,direction,diam_boss,h_boss,angle,trim_face,&boss_id);
$ k5 \) v. Q, |0 Q; O! E: W  v7 Z8 N2 J( z: K4 |' |+ k; y2 D4 n
//------------------- Create a thread on boss--------------------- " F0 _2 n, G' W$ J) I$ f
& e3 u9 ?; G) f# e/ S* ^) U/ s
//Get boss faces to use as start face and cylinder face of the thread * T" n/ \# W3 Y
   tag_t s_face,c_face,thread_id; 2 H  B6 x' R- B0 |
   uf_list_p_t list; 9 M6 Z5 l# R4 u- p
, Q; }- P: S$ ]) h

. N& ^+ x8 E$ p: M5 F& m   UF_MODL_create_list(&list);
7 w  c& f$ Y. T2 d   UF_MODL_symb_thread_data_t thread; $ J* {+ l1 V) r- p" r1 r
     UF_MODL_ask_feat_faces(boss_id,&list); " y. C3 Q4 Y: W7 i% o/ n' N' }+ e
     UF_MODL_ask_list_count(list,&num); . t% D, t9 r8 B$ ^) F
  for (i=0;i<num;i++)
) t* e& R7 m9 }5 T  { * P. Y. f$ B% N2 E0 u2 H) y
    UF_MODL_ask_list_item(list,i,&face); # A3 W5 x5 U8 T8 I, g& W. e
" }. e7 V: y" L- F0 G1 e% o
    UF_MODL_ask_face_data(face,&type,point,dir,box, 0 c- d2 `/ y) P4 X+ i" k) \( K
                                &radius,&rad,&sen);
4 ]- q. G4 I) n    if ( (type == 22) && (fabs(dir[1]-1.0)< 10e-7) ) . W4 f3 R) @1 y6 H! u5 d
     s_face = face; //start face
4 |( Z# N0 r" Y: L' o0 T    if (type == 16)
; K% y, p) F2 F. B& ~* X
      c_face = face; //cylinder face
- ~# C/ ^5 B) @2 f/ K" A& m  } , A5 k+ o- N1 W7 V8 |3 ~
  UF_MODL_delete_list(&list); 9 d1 b1 {2 S7 I4 K  {

2 e( j! }+ b; U3 t& g
//create thread / Z* `0 G. C7 K6 B" k5 i
   char thread_length[10]; ' G. r, b( z5 F5 E$ c- G
   thread_length[0]='\0';
  C. a/ ~7 F8 Q5 _   sprintf(thread_length,"%f",0.5*atof(L.value.string)-hi-2.0);
: K  k7 d4 ^3 R+ w. t
- H5 n0 e- u: G, L* g* E, _6 X     thread.cyl_face = c_face;
" [, G# c$ y% Y7 b; Q( O, ^     thread.start_face = s_face; - M: T& Z; A4 ~% y# `
     thread.axis_direction[0]=0;
5 z: C9 j2 J! F. |# a9 F     thread.axis_direction[1]=-1;
  {1 r4 {% ~/ b1 U$ ?- h9 w     thread.axis_direction[2]=0; $ @, Z2 I9 ~# d" A
     thread.include_instances =UF_MODL_INCL_INSTANCES; # d) M- O* _% c
     thread.rotation=UF_MODL_RIGHT_HAND; . v8 _' H1 u' m+ G; h3 ?
     thread.length_flag= UF_MODL_FIXED_LENGTH;
. s. p5 q; C  ?) D0 ^     thread.tapered = UF_MODL_NON_TAPERED; 9 d4 R" ?; w" R4 g! h
     thread.num_starts = 1;
" Z7 X8 m* x( I6 N5 v) V6 T3 i     thread.length=thread_length; : J' }: z( T  l
     thread.form = "Metric";
3 ^7 ?; }8 V& d" O  S     thread.method = "CUT"; . Y  p6 ~6 u9 d/ P* |& j
     thread.callout =callout; 0 j4 Y- V  j; H8 @# \/ G
     thread.major_dia = "10";
4 r8 a6 ?, d: i  H4 v2 t5 E     thread.minor_dia = "8.917";
: n  c5 G8 t6 y, j! m3 ?- }9 K     thread.tapped_dia = "9.813";
* B8 x# e8 i/ F, n$ q' e% N. B; n     thread.pitch = "1.0";
4 v4 W$ z" u# {' Y  j6 H: `7 n     thread.angle = "60";
7 A% T* p. d) S* G  l     UF_MODL_create_symb_thread(&thread, &thread_id);
' Y' _( u# l7 n0 Z! _; n4 r
//-----------------chamfer edge of the boss--------------------------
2 b; T; S. s7 Z- m7 m* x7 o, }/ ], Q" i& p5 T" G) i, T
   uf_list_p_t boss_face_edge_list;
0 n; H6 J( j5 H+ Q   tag_t chamfer_id,mirror_obj;     
+ [/ D! {4 A7 i- G3 ~3 x2 G6 s1 j     UF_MODL_ask_face_edges (s_face,&boss_face_edge_list);
& o9 L$ A' t* E* H  P% t7 m1 P) S1 R  {" k

  Q5 V/ k. _- F9 k; s     UF_MODL_create_chamfer (1, ".5", ".5", "45",boss_face_edge_list,&chamfer_id); 7 Z# h* ]3 z! m! N. r
4 f+ r% s' q6 f/ b6 a3 i
   UF_MODL_delete_list(&boss_face_edge_list);
7 L, i/ @4 |& h3 O    UF_MODL_ask_feat_body(chamfer_id,&mirror_obj);
- `( o3 T# {+ V3 |: c4 B( Y* F5 g* ^7 l1 }- W/ A
//////////////////////////////////////////////////////////////////////////////////////////// & s6 `$ R. L' h# J$ g
   ///--------------------create mirror feature------------------------------------- - i2 e2 |' J- f+ Y3 E7 a1 w4 G
7 O+ h; r2 k0 X) w3 a
double ctr_point[3] = {0.0, 0.0, 0.0};
) f; z5 e' y: i9 u  double directiony[3] = {0.0, -1.0, 0.0};
, T  M( C2 r) W) W: C  tag_t mirror_tag,dplane, mirror_body; 2 |" R' d; C% Y8 d
% {$ x; K* ?7 d( C2 K
" \; U$ |; o# s2 ~
//Create Datum Plane
# ~: d5 P8 e$ ?6 _3 w* q( _  UF_MODL_create_fixed_dplane(ctr_point, directiony, &dplane); / l! Y5 a- M4 M# O! O
% r0 v! R' z+ ]
- {  Z. c. |) M2 s+ F
// Create a mirrored body
6 v* E) n2 B" E" S% P; }# f# k/ u5 ^
UF_MODL_create_mirror_body(mirror_obj,dplane,&mirror_tag); $ i; Z" M* Y( P
$ q' g+ l1 b2 |8 }" D
UF_MODL_ask_feat_body(mirror_tag,&mirror_body);
  h# M. J6 |- |
  d7 j/ e$ \- |1 i; r- p$ ?! N6 ^
# N7 U, [1 r8 H
//---------------------unite-------------------------------
  h% y. G* k/ ^' v% I' j4 `+ }  y. n

: p$ ~6 l- Q- L' ?+ e1 c
) \! W: C1 s+ c- \UF_MODL_unite_bodies(mirror_obj,mirror_body);% y" Y+ e! `0 c

, L( E0 t; g8 ^( b( s+ S

没办法,只好又加了一段,在mirror特征上作多一次螺纹!
* A) H) c6 ?) r% ?$ f! l0 ?  q

+ m% l5 k# N4 m3 N$ P# }5 r( v# e( o7 N5 }  x2 k1 ]) U
//------------------------create a thread feature on the mirror boss---------------- : [7 E& {& d+ U0 Y- F

% @! P+ i& r  |& ?0 u4 Y& x    UF_MODL_create_list(&list);
- k$ f9 N9 a7 S" ^7 k" O, P2 C     UF_MODL_ask_feat_faces(mirror_tag,&list); 2 K" l7 ^: x* q- h1 K, O# @
     UF_MODL_ask_list_count(list,&num);
9 R+ }- Q% q4 R# X0 H' M  for (i=0;i<num;i++) + B5 i" V, Q; a! K2 G7 p
  { / I- m9 m$ F+ r. H. k
    UF_MODL_ask_list_item(list,i,&face); 7 y- u$ _1 l3 x8 p/ k9 n

( u" s8 p/ W7 M$ L& y9 i    UF_MODL_ask_face_data(face,&type,point,dir,box, : N6 y5 @2 H! V7 H
                                &radius,&rad,&sen); 0 I; ^3 A# A1 ]/ N+ ~' C3 b
    if ( (type == 22) && (fabs(dir[1]+1.0)< 10e-7) && point[1]<-10 )
. N5 X, F* E$ o1 Z     s_face = face;//start face
* ~7 ?! h5 U/ f5 F. F    if (type == 16) $ g; T( }7 j! d6 E5 b0 Q/ I2 P
      c_face = face;//cylinder face
5 t+ g0 Q4 k1 l1 [3 ^& S9 h. h! c  }
) I! g; @, X+ O. ?  UF_MODL_delete_list(&list);
9 f. x- j9 E% P2 i0 X; s
- W# F% P/ a. ^, D1 Z1 P     thread.cyl_face = c_face;
* u% d& I% z% _! G8 P7 {$ _6 M) q     thread.start_face = s_face; ! C* e: @5 i& L3 z6 ?
     thread.axis_direction[0]=0;
- A; l2 D2 ]! Q     thread.axis_direction[1]=1; - Y7 C# d$ n6 x- m1 L/ W
     thread.axis_direction[2]=0;
# u1 J( M# M. B2 e& A# j. i     thread.include_instances =UF_MODL_INCL_INSTANCES;   H$ {1 ^) [. n5 F
     thread.rotation=UF_MODL_RIGHT_HAND; & w: g5 ?( L5 b+ p  [$ P
     thread.length_flag= UF_MODL_FIXED_LENGTH;
! n: A' L' v, O! _6 Q- c# B, q- N     thread.tapered = UF_MODL_NON_TAPERED; . z- U/ l. d3 ^/ p& O; O9 a
     thread.num_starts = 1; 2 A1 B& A4 {7 k5 s3 k: w
     thread.length=thread_length;
, Y3 t8 h' [0 t+ D) d" R     thread.form = "Metric";
' L0 N. T5 s( r  E0 u, K" J% z* x     thread.method = "CUT"; ' Q3 }4 t4 O9 Y6 v% \
     thread.callout =callout; * w: U1 o6 T- F- |# v
     thread.major_dia = "10";
( m5 f; M  n) W9 T4 `# f% w     thread.minor_dia = "8.917"; ) l( F/ t$ u/ m& n
     thread.tapped_dia = "9.813"; 5 M. F- G3 m! {
     thread.pitch = "1.0"; 0 W( S4 Z5 V* J5 }
     thread.angle = "60"; 1 O- m4 d; S# V( d
     UF_MODL_create_symb_thread(&thread, &thread_id);
- A! X/ P* S) t# P* r
斑竹你好.我现在已经明确的知道了我的part文件中两个实体对象的tag_t name.现在我想用UF_OBJ_cycle_by_name()这个函数来确定查询出来的tag_t是否和原来的一致,
) Q0 A. M3 _9 M* r" t" r: Htag_t name_tag=NULL_TAG;
, d( O/ E0 y8 U0 Z+ m  UF_OBJ_cycle_by_name (CM_name,&name_tag ); 9 [! N9 K# D  U( y$ T! F
  while(name_tag!=NULL_TAG)
# v) ^% _+ a" ~, |( A- o4 w  { & e3 u1 x* K7 h
    UF_OBJ_cycle_by_name(AM_name,&name_tag);
3 A1 e( Q* a: s8 k. u  }
4 x8 f$ [& o: k8 u- Y
当我给name_tag赋值时,函数返回也是为0,当我不赋值时,调试说我内存访问禁止.请问斑竹能否给点提示?谢谢.

我是一个刚开始学习ug二次开发的新手,马上机要进入课题,老板现在让我先看看UG/Open API 中的一些函数,由于是新手,在加上时间比较紧,囫囵吞找的看了一部分,有很多地方不是太明白,在这里先问几个让我很困惑的菜问题4 @+ Z4 k$ s. W% f
6 m0 v" T) T$ s0 |+ O5 X5 d
很想得到zzz的帮助::(谢了先:))
4 f5 Z2 q* J1 A  h9 ~0 _
, I& U# i8 {3 Z- o+ l& K# L1 H
他们是:( c2 d* p. t8 \+ f! a

  ]- c7 k! H4 ]0 q* l1
ufstr()ufusr()的区别;) }! q1 p# `4 |- t# O
( O1 r( G, I8 ?6 \4 ^
2
UF_UI_dismiss_dialog_area_2()对这个函数在看DOCUMENT时不是太理解
3 N9 T+ v& G* T% q4 |

+ X! G' S' I$ c4 q9 y不知道他和UF_UI_cancle_uf_dialog()的区别??
. ~" Z& J" N2 p6 G" c5 v  K2 H* G: h
$ ^! i6 [! ~; L- n
3
UF_UI_get_DA1_coords()7 h" t, B  B% @: _

" M5 z4 @, K  m: ^UF_UI_get_DA2_coords
()着两个函数中DA1DA2具体指的是什么??以前在UG Documentation Help看到过但是现在找不到了,应为是新手好急啊!!!

zzz:
; i" }! D* v- g' K/ l& B) s( l我用你前面讲的回调函数的例子时,编译工程自动生成一文件 EH.H,然后就是如下:2 [$ Y: x' t9 E8 A0 r% F
+ H/ z& X, k2 f$ h. `& a& W
e:\my_source\eh.h(33) : fatal error C1189: #error : "eh.h is only for C++!" ' P( s! y1 I0 {2 ]8 t+ L/ p2 {3 K
这是在MSDN查到的,可是不知到如何修改下面的错误?请赐教,不胜感激!
6 _* M6 C0 p, Y

0 F; b. ]: F. ^1 m* gFatal Error C1189
' T0 d& U* U! I8 T. q- N#error : user supplied error message
- _1 x2 C2 h$ u7 U+ q, @! fThis error message is generated when there is an #error directive in the program. For example:
2 E, Y% a9 w$ o. |* _9 P#undef _WIN32 4 ^2 V: A# w" j8 [' ?7 z1 {( E

/ [4 }$ o  [3 B1 ?#if !defined(_WIN32) ! f  n/ U0 ~" h! u
#error _WIN32 must be defined //error * g8 K; k6 j' G- j# J" A
#endif % P+ m3 t5 i3 m4 V& z0 }0 B" O

/ b' K0 w# c8 t4 |int main() {
3 Z, _. a: T0 G4 \* {   return 0; ! i& s  l7 o# I
} & o$ l' g6 d1 i) X' R
EH.H中是:* Y! p" Z, s# M$ L; j

6 M1 R: e5 x' T* x$ C$ p#ifndef __cplusplus
, t( J! F& H8 \. ~& G. ~& F" L#error "eh.h is only for C++" //
有错误
/ x' z+ q: o% j( n5 K- b, e

4 C( w( A4 k8 Q#endif 1 y% e( S2 d  i9 o# t) [; y
这又如何修改?

找到 #ifdef MENUBAR_COMMENTED_OUT
" \" B/ ~$ g& N$ z

& T% i& c/ C0 z  ?5 ^: M
把它及对应的 #endif 删掉。

我用的也是UG NX
  p' m, P+ e6 Z) a"lindy.men"
如下:) F' L. p$ v- |% a" R

* p; ?: S( M# M) OVERSION 120
: O# T6 g9 v9 _# Y8 h; t  EDIT UG_GATEWAY_MAIN_MENUBAR
* u, k% @8 U9 H. b, P* e9 j  BEFORE UG_HELP
: n- ^, f/ G9 f( e    CASCADE_BUTTON UISTYLER_DLG_CASCADE_BTN
, j/ C& S) b) H5 k6 f7 @- }  LABEL
启动对话9 z3 R0 R: B# e) ]  H" d$ x* Q+ S

( S4 e0 k! ~1 c, s5 }2 Y  END_OF_BEFORE
# r4 B' H$ b( B( Y2 z' M( I0 a. ^7 h& F/ s( ~  H
  MENU UISTYLER_DLG_CASCADE_BTN
3 w( ], t: d( ?1 |    BUTTON SEQUENCEPLAN_BTN , R: C( t* L1 [2 w5 k
    LABEL
应用菜单
1 W3 t# L, ~" i+ I" G7 C& C7 o

: K6 n% n  B* _' h    ACTIONS yulu.dlg & G) R4 K. X; f2 B  M1 v
  END_OF_MENU 1 y: c4 T  ^, A6 a3 S9 R, E
lindy.men
文件放在D:\Unigraphics NX\UGALLIANCE\SITE\startup目录下
0 n( e% P3 u2 B' \
; @7 V0 K& j) D' E# Q! `/ \
yulu.dlg
文件放在D:\Unigraphics NX\UGALLIANCE\SITE\application目录下  h* f2 `8 z: R
5 @; ?$ y1 `* C7 i0 c1 S1 ]
如果没有程序源代码,而只有*.dlg文件和*.men文件能否在UG环境下利用*.men文件产生的菜单项调出*.dlg对话框呢?(只是此时对话框的各项按钮无实际功能罢了)E:\\ug sec development\\ug二次开发有声视频教程

发表于 2011-1-10 16:38 | 显示全部楼层
谢谢分享!!!
回复 支持 反对

使用道具 举报

发表于 2011-1-22 14:21 | 显示全部楼层
谢谢分享!!!
回复 支持 反对

使用道具 举报

发表于 2011-1-28 00:16 | 显示全部楼层
下了,谢谢分享!!!
回复 支持 反对

使用道具 举报

发表于 2011-2-14 11:34 | 显示全部楼层
thank you ,good luck
回复 支持 反对

使用道具 举报

发表于 2011-4-5 20:23 | 显示全部楼层
支持楼主!!真有心!
回复 支持 反对

使用道具 举报

发表于 2011-4-24 22:03 | 显示全部楼层
谢谢楼主!
回复 支持 反对

使用道具 举报

发表于 2012-1-9 22:39 | 显示全部楼层
谢谢!!!
0 ^: \7 I# D& {7 C8 p2 G( _& F好好学习。
回复 支持 反对

使用道具 举报

发表于 2013-3-10 13:57 | 显示全部楼层
请问楼主,会不会在VC++中开发UG,比如说在VC++中编写通过三点画曲线程序,在UG点击开发好的对话框命令可以使这条曲线显示出来。
回复 支持 反对

使用道具 举报

发表于 2013-4-10 21:27 | 显示全部楼层
谢谢分享,感受良多,少走弯路
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|关于我们|sitemap|小黑屋|Archiver|手机版|UG网-UG技术论坛-青华数控模具培训学校 ( 粤ICP备15108561号 )

GMT+8, 2024-11-16 18:58 , Processed in 0.071374 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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