青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

1。建立两个目录。
7 |% q" B8 A# j$ @: d4 B

) @, A6 M+ s  j& i8 J: B+ H! Z0 v! X4 Z( k/ h. E/ \2 z
   
建立第一个目录 E:\my_first_ug,在这个目录下建立两个新的目录:E:\my_first_UG\applicationE:\my_first_UG\startup( h: b6 r5 ~  s" ^# Q$ s9 T' F

6 ~5 {6 a8 X1 o9 B- X  Y+ t, J7 P
  
建立第二个目录E:\my_source,用存放你的源代码。

2。设置环境变量。. j& t' U2 b, c( w" O

3 _; U& Z4 z6 N: b" B- x6 sWindows中设置一个新的环境变量:UGII_USER_DIR=E:\my_first_UG

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

4。设计一个对话框。5 C) B7 e, n1 g+ J! R6 Z
) Z2 o8 l1 S4 u) A% x/ z
6 k# T9 f  \6 u* l
1
)在"Dialog Title"一栏填入:First Dialog,按Apply(每次输入完成后,都要按Apply,为避免啰嗦,以后不再提及)。
% P: t" A3 H! Z  ]- _
% L% g( N4 b2 b+ y0 U8 b
2
)在"Cue"一栏输入:%……%%¥¥##*%****—((,什么都行,呵呵。; m2 f  W/ C! D. C5 l" k% i, n+ h3 e

, b, |4 A5 e. d5 R+ ?. r3
)在"Prefix Name"中,把CHANGE改为MY% q4 E! J: O0 Y4 B
5 n% Z. a5 k5 e) n3 V! t
4
)加入四个控件。StringPush ButtonLabelSingle Select List1 P; `7 n, P5 C5 [( c
: m# l8 f; M8 x( t0 T

编辑对话框的各个控件。! r4 }! s: C5 Z7 v4 F3 X
- d) l! \9 H* h/ V4 {' Q' B
* G) U" N) o5 j5 }& d5 Y1 h9 U; d# {% x
1
)改变String控件的标题,标识和长度。- |) _1 k7 P( p& |

; s/ J7 C7 q& j0 k
; g, H2 B# i+ m2 s9 e3 GLabel “String” -> “Input an item”.
) o. e8 o9 `0 j+ G7 s  iIdentifier "STR_0" -> "ITEM" 0 n8 ~8 [3 ~4 d( V
Width in... 0 -> 20

2) 改变Push Button控件的标题,标识和回调函数的名字。
/ c! B; K1 x, F3 L% X
) [+ v# T) n$ w2 E# S* Z/ y/ C7 L

4 P2 {( Y6 J% k$ ]' fLabel "Push Button" -> "Import"
( k8 {. W% M. \Identifier "ACTION_1" -> "IMPORT"
' ^7 Y- U* v7 b. i' ]# Q" qcallbacks "action_1_act_cb" -> import_cb
" f( n4 H$ g& g+ `1 e  F2 w9 Q+ ^7 g0 [' k2 J4 K: @: X  v9 G
"Creates Dialog"激活。
( G, E+ W+ \* B+ m' c- a: ?$ ~" f2 \4 B4 c" ?

3)改变Label控件的标题和single select list 的标识。改变single select list可见项的个数。
; O$ j. W3 i2 k1 O9 i* G
, V( S8 W' J* w; ~8 c

) M2 B5 h' N' _; C9 H5 ^1 oLabel Label -> Items List
7 j# w% _# s' p6 D6 a3 }# e7 oIdentifier "LIST_2" -> "ITEM_LIST"
9 H. {* \! D+ D) J$ k+ bNumber 3 -> 6.
/ x$ [# c3 H+ S+ |; c8 n, e9 V; {1 u5 A

$ J# e2 O) H- t* S; @

6. 保存对话框。' \# T3 J1 h$ W
4 s/ \' R' Z1 }+ K" k1 c
点击save图标,把对话框保存在E:\my_first_UG\application目录下,+ ^0 [/ y! z9 \; V  D3 q( d( J
文件名位first_dlg,生成三个文件。5 ~" t. w, k. n& V

# D& u  \& B: H* W4 K$ f(现在可以推出UG乐)。' A0 o" B3 g9 C4 }' o
, H! N1 r8 [7 t* b) E, C

% x9 H  ]; u- h4 O# r

7。建立一个vc的工程。0 f: A6 ]$ B0 m! s3 X
2 e9 Z' W: r" m8 q
6 A, J. Z& w+ b) ?! B: T+ ]
1
)把\application下的*.c*.h文件移动到E:\my_source目录下(文件可以改名字)。4 o9 V' r) a  ~2 u2 q* p0 U

! w) k' p  M8 `  U2
)建立一个新工程,选择Win32 DLL
% _% `0 ^) u4 v% Z2 |" _4 u" M

. u) H: x7 Y  R3
)把c源文件和头文件加入到工程中。& V! P) g  Q- u% y, c* }1 f  Y
& s" B6 O( y0 u' J7 M

8。设置vc的环境。
, j0 H# t  T4 K0 E, p2 K. u
5 \. h  v; d8 `, z, p

* c5 s7 v* M, Y, xProject -> Settings -> C/C++ -> Category ....
加上头文件。

Project -> Settings -> Link....
) z( h1 k! X2 D% A/ u9 f0 c! m6 ?改变输出文件名,加入连接库文件(ug17之前的库名字不同)

Tools ->Options...->Directories 7 [* z; X+ @( {: n& i1 B
" @, z8 |, {' L: [+ x
Include files
Libray files 加入UG UFopen的路径。

打开first_dlg.c文件,找到menu script样板的位置。. W: g6 T9 M$ C0 k$ P" C
" Z. }6 A8 O/ Q6 o
复制这个样板到一个空的文本文件。: k' M5 a* M6 m. B$ D
4 j+ C- h8 F) j
把文件保存到E:\my_first_UG\startup目录下,文件名位first.men(注意后缀)
2 |) r! [2 s: {8 E7 E" D6 C) H. O
9 v7 l* h9 ^6 O9 v* ?

找到 #ifdef MENUBAR_COMMENTED_OUT
9 I/ p( ]9 I5 t# Z  p' u+ m
' l' T+ G2 S& w6 ^5 {; G; T8 h
把他和他对应的 #endif 删掉。

找到#ifdef DISPLAY_FROM_USER_EXIT% a" Z, S- Q0 z+ V

- D* l6 o  }& Y8 r! M把他和他对应的#endif删掉。( r' o! Q/ p+ _1 I

/ N" v  k! O4 R找到 <enter a valid user exit here>
( I4 B; E0 ]2 m1 }, {% `把它改为ufusr

现在可以编译连接,试一下了,, M* b0 T: M! {& l. l! R% @
呵呵。

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

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

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

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

2 e2 U7 p& ]8 i" L2 a7 a

好吧,下面将一下这些回调函数的应用。2 o3 o, j/ G- r( C8 u9 u
/ p# A/ j$ R$ q9 h( [, e2 |
/ U! z2 j4 ?( F! @
Apply_c
Ok_cbcancel_cb分别是点击OK APPLYcancel按钮时,执行的动作,它们的应用在后面的例子中介绍。
5 ?5 _) g$ q% U
7 a% l2 i, Y: P! Y. A. F; i1 J
constructor
Destructor本分别是对话框显示之前和退出之后执行的动作。' A! L" u) x9 h: {% v1 C. _  f9 J+ d
; k5 m6 U# p4 N
在对话框显示之前,可能需要进行很多操作,譬如说:设置对话框的选择方式,就是说在对话框打开后,用户可以选择什么物体,面,实体等。
1 t/ x- o7 k! Q, H' V, ^. R0 T8 [/ K

  k" y: j! c% K( V0 H在对话框消失之后,也需要进行一些操作,譬如说:释放申请的空间,把加亮的体恢复等。下面我就用例子介绍一下这些回调函数的应用。

! [) k! g( X( Z9 T' v% H
添加回调函数。/ h; E! I$ Y9 B8 |

0 d. x& H& j! ^/ u+ ?. [$ {. Q- W首先进入UGUIstyler,打开前面生成的对话框first_dlg.dlg,在相应的位置添加几个回调函数的名字(每一个都要回车或按Apply)。
3 g/ H2 H" S* @' M9 B

$ z' U, l3 B2 }+ V+ e" p
: K5 v. U+ i! Gcancel_cb # t/ }% M) T$ G8 O0 f8 Y) h  X9 L
construct_cb
3 N8 N& W9 c) m' F% c$ ydestruct_cb % i! v8 O% Y, A$ q
ok_cb
2 i9 x  M( h! q' O0 H& r: @& f) M: ]2 V/ @9 }, W0 n; V2 ^* S" v
为“Input an Item”田家一个回调函数input_cb
, f0 l. p5 T8 l. A5 t& r

% K2 F: N7 }8 ?9 E1 o: V- Y保存后,退出。
) G; t& g* e* y9 I) `+ H$ v

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

ZZZ斑竹辛苦了!
8 t3 @, Y2 E  u% H+ Z
( Q, d. u3 e7 C; U7 ~7 M  V
  
小弟正要搞一个UG二次开发的项目,以后有问题还请多多指教了:)9 U& T" M6 r0 |- l

% r( N1 g6 A/ B   
请问工具Araxis Merge哪里可以得到,可以简单说一下怎么用的吗,我VC还不太熟,谢谢
$ u7 c7 z  O' p8 ^
& }5 ?' Q1 Z( X
我的EMAILwgwang_sz@163.com
" P: u9 C! o% u; Z7 ^) h7 \      QQ:43801603
# b- z, w4 @9 D# L/ e0 K4 O   

打开first_dlg.c,找到construct_cb的位置,在其中添加以下代码。
* G0 T8 O+ t. X% w- ?5 m0 T& h
1 V" ?! |( r, i  {/ o* _* C

# H% |' q  ]( h: U+ {, e( [8 ]int MY_construct_cb ( int dialog_id,   V0 i8 Q; z1 L; M  u  n6 J/ W
             void * client_data,
# D  [0 o4 D' d: W8 l, e; E             UF_STYLER_item_value_type_p_t callback_data) 4 N, Z; m& h% G# t5 R
{ 8 b3 v" o* C2 [# a3 H5 A! J$ }
  int irc;
" y. x' s5 A3 t5 h  UF_STYLER_item_value_type_t value; 4 k4 u3 I: ]* _5 y* e* X1 b* w
  char string[133] = "Input a string here.";
9 j% m* }  z# F9 Z2 k; t

! e9 s1 n1 Z& W# D% G( ?* G     /* Make sure User Function is available. */ ; X6 C! U8 E% j
     if ( UF_initialize() != 0)
9 l+ X" t* ?- ~% g          return ( UF_UI_CB_CONTINUE_DIALOG );
" z+ @  [$ r! V. c+ _% J3 y9 E2 e" r% ]2 P
  value.item_id=MY_ITEM; ; T9 q  h$ f( ^, j$ [) N7 L
  value.item_attr=UF_STYLER_VALUE;
5 k9 i9 u0 C4 y* D$ F  value.value.string = string;
0 n! B# G  e& {  irc = UF_STYLER_set_value(dialog_id, &value); # U" h: ^0 I8 G
  if(irc) ' M! m. D; E0 l
  {   D: E3 ~6 W; z+ |
    char message[132];
" ^# M* k! g4 z- I" u( u# c1 ?9 V
3 a* k% y) |/ _9 B1 G6 N7 N    UF_get_fail_message(irc, message);
. P8 S/ u6 [8 ^: x8 ?; D5 e  }
2 X0 L5 f. N5 _: `: R6 n' s# {" L

' Q8 g- J  b7 b2 {( w! }) f" z5 z# w9 `UF_terminate ();

找到input_cb的位置,假如下面的代码。- r. m8 d+ @! P1 U1 q- ^

+ E& S2 c, X7 e4 c5 w4 j. h" c- q4 [* n* H. i
int MY_input_cb ( int dialog_id,
# q% R2 W+ D5 ], ?# `, u9 |8 L             void * client_data, " \2 @3 |4 s0 b. o
             UF_STYLER_item_value_type_p_t callback_data) ; d: _. q' s; F; e, z$ ^3 V( X; {2 ^
{
. Y) l4 h8 x$ c  b6 n- l8 h0 X
  UF_STYLER_item_value_type_t value; 2 V% ]! m' a# N5 {% }
  int irc;   |+ q! T  o9 {* y( M" ~' }
  char string[133];
5 G8 J5 p  S4 B' y

8 [9 y+ N' T) P; f% u/ C     /* Make sure User Function is available. */
% I8 Z0 W; |3 T# b# D0 {& m     if ( UF_initialize() != 0) 0 ~" D* _' V9 U# b7 i
          return ( UF_UI_CB_CONTINUE_DIALOG ); ; R. k# [4 U& o
% O7 e5 A3 ^& a7 e9 E$ V) e! M
   /* read your input */
" J: D' z4 I1 J( F0 B  h, c2 d    value.item_id=MY_ITEM;
$ U  \' j1 ^' U! T* q, e  value.indicator=UF_STYLER_STRING_VALUE;
% t8 L9 W% y" z' Q/ D+ Y4 _  value.item_attr=UF_STYLER_VALUE; ! c( d  C% `) Z3 A8 v, ^
  UF_STYLER_ask_value(dialog_id, &value);
7 o! V1 v  V4 C& H# ~
% Y% n, s4 Q5 h# F- u  strcpy(string, value.value.string);
, |8 C5 Z8 U: F, V# f  UF_STYLER_free_value(&value); . D5 V( C$ m2 j: i! s1 u
  P5 d9 v  ~8 v9 t8 T) V3 l5 y3 H
  /** add it to the single list */ - n  {6 ^) r' v8 U1 U
  value.item_id=MY_ITEM_LIST; , z+ P$ I' N" A* o" y
  value.item_attr = UF_STYLER_LIST_INSERT;
: f/ Z+ q4 X, U8 Q+ X) l  value.subitem_index = UF_STYLER_NO_SUB_INDEX; % N) q6 @/ k& W, E& t1 |
  value.indicator = UF_STYLER_STRING_VALUE; 1 f. t' r' D+ @5 T5 t0 M1 }
  value.value.string = string;
, ?9 G# Z& D* Q$ `( E4 e& s7 s0 D  irc = UF_STYLER_set_value(dialog_id, &value); & k' P+ O; c) u# Z* N  F
  if(irc) + t2 g( B, @7 n/ a" z6 T! F. ^( O/ k
  { " I3 L3 s: e8 Q& l  Y
    char message[132]; & l0 @, U2 b1 g# N0 |/ w9 G

3 c( V- J1 G# a9 ~    UF_get_fail_message(irc, message);
( \5 O; K3 l- [8 y  }
     UF_terminate ();


" w! C* L  w8 {3 Z
$ b6 A5 E; h3 U, \& p$ Y* B

ok_cb假如下面的代码。, w, v. o1 q- i; @4 Z
4 u+ B) {" @! z# J

. T) I! T% Q. T+ D' \ int irc, i;
7 u8 Y4 B0 L' v+ a* I  UF_STYLER_item_value_type_t value;

/ h3 q+ R  k2 S) F8 B4 x
; c: R; V" C4 F; h* X     /* Make sure User Function is available. */ % @) z  j3 Z. T8 \" a6 \5 b% ?
     if ( UF_initialize() != 0) : M/ ^" L0 |0 O4 b1 `" @
          return ( UF_UI_CB_CONTINUE_DIALOG );
3 y' {! X5 w) Z5 l3 T: L' W  q9 W: g! I1 ]) d; ?( L6 T
   UF_UI_open_listing_window();
2 I1 T% i) N7 a  W) {) y5 C3 K4 e
) D) W! T! C0 _  value.item_id=MY_ITEM_LIST; 0 J% G7 [' Z$ U/ r1 k) T: b$ D8 N# P
  value.indicator=UF_STYLER_STRING_PTR_VALUE; * `4 P" u/ C( m
  value.item_attr=UF_STYLER_SUBITEM_VALUES;
" d  }' K4 ?5 {4 F  UF_STYLER_ask_value(dialog_id, &value);
' o) s; U, J9 P1 b    for(i = 0; i < value.count; i++)
" J/ z7 Z% B, W8 T' U. a{ 9 f7 O6 K- r' |1 [$ g5 r6 }
    UF_UI_write_listing_window(value.value.strings);
$ F% G* f4 X; b" L    UF_UI_write_listing_window("\n");
4 P! I$ u7 I/ G% H}
, ^3 `/ B0 q: ?5 o4 G+ Z, G9 o/ V) v$ h0 G$ ^- E# w- y0 s5 |

: Q8 ]7 T8 t3 e& M8 f  UF_STYLER_free_value( &value );
: i* J% H+ m$ _
     UF_terminate ();

至此,我们介绍了几个回调函数的简单使用方法,下面看一下运行结果。( h9 {! N0 e  G) b6 T* |6 t
/ ]/ X3 J$ z& k9 R1 \
刚打开对话框的结果。
, {1 u! b) F8 K. h+ K( x, n: J9 g# v0 X3 z

输入一个字符串,回车。它显示在下面的single list中。
1 U; F! J- [6 Z; n+ e) M9 L4 Y, v* v0 O* Z# `
对不起,a minor change on code. 8 n, G) h9 u& v. B+ v% S
int MY_ok_cb ( int dialog_id, ( L" F* z+ w$ _7 z; z
             void * client_data, 9 Y; Q, o0 G( A9 i9 }; y
             UF_STYLER_item_value_type_p_t callback_data) # L9 I% x) m9 u6 y7 f% e0 u
{
( a& B: G  }/ X+ N0 Y  int irc, i;
! w6 I/ z1 J8 ^. R  UF_STYLER_item_value_type_t value; & J# I. D; s, j& T: k. [6 K  Q9 ^3 @

& p8 Q% V9 d! \; r& {; G. x* [' b6 o- V% C7 i' i
     /* Make sure User Function is available. */
7 B! S6 c. K! \! n3 F     if ( UF_initialize() != 0) 0 ]2 S, ]. g/ n2 c& I5 [
          return ( UF_UI_CB_CONTINUE_DIALOG );
* K* a: K. k. T4 e/ P6 n
; ?/ U# A  |5 g6 B8 a   UF_UI_open_listing_window(); 4 Y' W3 t! k' Z0 ~3 p4 n" c
+ ?$ C& }) H- ?( l* I- I
  value.item_id=MY_ITEM_LIST;
$ U& Y. b3 r4 [  value.indicator=UF_STYLER_STRING_PTR_VALUE; 0 d* D+ U: F, F! ]1 y9 U( e/ ~
  value.item_attr=UF_STYLER_SUBITEM_VALUES; , i* g" l, G. r3 m
  irc = UF_STYLER_ask_value(dialog_id, &value);
% V% d: k( A) ?. I- _
for(i = 0; i < value.count; i++)   d3 ~- l: Y% a, K, k- |& i; e
  { 4 v. Y+ F# f# j. X
    UF_UI_write_listing_window(value.value.strings); 5 s& j, \* }" _0 m9 ^
    UF_UI_write_listing_window("\n");
$ O$ k3 v6 v+ m" B' L  }
   
2 l4 c( K7 M6 W) q$ V  UF_STYLER_free_value( &value );
0 _( i5 q1 b$ L% S
点击Ok后,所有的字符串显示在list window 中。
7 X  J1 y* \6 O8 U5 X! S1 y

清华书中uistyler部分的程序去掉了原来的注释,使得简单的事变复杂了。
3 j* t" m3 u7 {; A  \/ g1 L
3 j+ G9 d% y' k/ |4 A
我没有在ug/NX下开发。在18版中,建立VC工程时可以选择UG APPLICATION WIZARD,那么后面的设置就可以变简单了。 Lcfq

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

to eastcamel
3 W1 m- q; Z9 T; x8 d+ m% ^& y6 L.men
可以执行很多类型的可执行程序,比如.exe.dll, .dlg .macro( q$ R4 l$ M2 y' o( k, b
: P6 o; x* L+ z, }! l) F
action
没必要一定是my_first.dll,这是他给你的一个例子,如果你用UISTyler生成了my_first.dlg,那么你就可以在action后写上my_first.dlg
2 P# m9 A, e, i. U& a' P. I* M3 ?+ ]
% [- |, u5 a+ @6 |
- \# x+ z4 q4 a5 e
to visionphone " T6 T$ d. G5 ^  Z( C. N( v
论坛是交流问题的地方,不是教学,
4 s- u) b% D" \' e

- l. S5 D, a- i7 h$ ^关于menuscript开发下拉菜单,包括菜单的级联在清华那一本书上已经很清楚了,还能找得出比他更清楚的资料吗?另外menuscript已经简单得不能再简单了,还能找得出比他更简单的编程方法吗?

现在在试一个把物体平移的功能.我看了UG/open 里面的函数帮助,也仔细研究了清华出的那本书,他里面是先将所选对象的坐标矩正进行正则化处理,然后为正则化矩正给出一个新的ID,最后创建一个零时坐标系.然后就用uf5943,uf5947两个函数进行平移了. ! n0 c2 E, R2 q4 C4 {
而现在我自己做的时候,也采用上面相同的步骤,但我调试时发现我选取的对象没有矩阵ID,当然也就得不到坐标系统矩阵.我后面采用获取工作坐标系的ID,然后获取其矩阵ID的方法,但调试后仍得不到平移结果.
/ Q- @& [6 F' A2 Z8 z1 h* n请指教:下面是我的一段代码;
( o) i" `- j) x2 i. _5 \i_ret=UF_CSYS_ask_wcs (&wcs_id ); 2 J) @% Q9 B4 B/ [, K3 A- G
  UF_CSYS_ask_csys_info (wcs_id,&matrix_id,csys_origin); 6 H) a  W! `. N; h
  UF_CSYS_ask_matrix_values (matrix_id,matrix_values);
; u+ {* c) F# P& g  UF_MTX3_ortho_normalize(matrix_values);
# j4 C4 ?2 l' f3 a' T4 S% B! K) v  i_ret=UF_CSYS_create_matrix(matrix_values,&new_matrix_id);
" D1 B  a* ]( }5 f' S  i_ret=UF_CSYS_create_temp_csys(csys_origin,new_matrix_id,&temp_csys_id); / K5 q) e3 y( _
8 }0 ~, N# ]8 d8 P5 ?
  FTN(uf5943) (Dxyz,D_target ); ( U+ X0 a( s! H8 F1 r2 q3 g* |; @
  FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp); 3 {/ B7 h2 V% ?3 Q

3 I" p2 @& H3 X9 U+ Q  A; k( l6 ?. H
程序的前后两段好像没有什么联系?DxyzD_target在哪赋值?

平移的例子4 \) m5 F+ c) c; s0 I" O
5 F; Q. Z6 P$ ~. s" y! s+ ?7 ^

2 h5 K0 [8 O8 i! h& Ydouble matrix[16];
8 O6 t) Z9 j! x4 t# k  I9 [/ ^# H( H  int count=1, copyFlag=2, layer=2, curveFlag=2, rtState;
# O  K( l2 g4 J8 {/ A8 Y+ e: ~7 R8 M" e4 t9 R
  UF_MTX4_identity( matrix ); 7 R# ]+ Q) F3 U2 U, ?0 M3 m
  UF_MTX4_edit_translation( matrix, vec );
4 ~4 H% h7 X; a! a( n3 m) j5 Y! O0 w/ M! M
  FTN(uf5947)(matrix, &srcObj, &count, &copy;Flag, &layer, : l5 v6 P$ b' U; S0 J
        &curveFlag, copyedObj, NULL, &rtState); , E/ M' J9 _" \/ o4 T: k

! M, u5 \' e( [, L( T8 X  return rtState;

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


3 g. _+ k- o4 R6 R, O% y找到文件UGII\menus\custom_dirs.dat添加用户路径
, e+ E  r7 D2 W3 j0 o% x  p3 M

1 D: y; V  \& x/ k, P# |' J( F# Customer modifications can follow on here
1 Y! }- e0 x3 |- o3 m; L& o
你的starup所在位置路径比如e:\project_insession\standard_part
& E. J- h; b2 P
  l+ y% b' |0 B/ \0 n
也可以在UGII\ugii_env.dat内把#UGII_USER_DIR=${HOME}改为UGII_USER_DIR=你的starup所在位置路径比如e:\project_insession\standard_part

在平移的问题中,Dxyz是一个Input量,它定义了对象在x,y,z方向上的平移值。3 f4 m: ]# C( w. v

3 T& N3 z  R' V' q4 ~% Tdouble Dxyz[3]={50,80,0}; 9 h0 @' y; V: o
至于D_target,它是uf5943函数中的一个输出量,是uf5947函数中的一个输入矩阵值,其中就包含了Dxyz定义的平移量。/ C* x6 z6 c  e6 _% g; K
( Q0 T& h- i6 H9 h$ V
FTN(uf5943) (Dxyz,D_target ); $ L/ `0 ?  n0 i9 m. f6 x5 n. q
  FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp);
* \7 k' q# s5 N; m5 V
后来我跟踪调试了resp的值,显示为0,表示成功了。但我用UG里面的工具检查一点的坐标,却一点变化也没有。3 d. N# g5 S3 V. X7 K

7 Z! E: R0 W" Q  n- y. b7 w4 G后来我调试了ZZZ兄的一段代码,发现copy是成功的,但我定义为move,即把UF_MTX4_identity( matrix ); $ ?- q1 C! N% @2 y1 O* C
  UF_MTX4_edit_translation( matrix, vec );
2 C4 {) E9 H/ s) o4 `; G! u
8 Q  T3 y( G5 j  FTN(uf5947)(matrix, &srcObj, &count, &copy;Flag, &layer, 2 l) s- B+ s/ r' P- c& J
        &curveFlag, copyedObj, NULL, &rtState); 3 Y9 I1 L5 l! }- _( `" m% l6 G
中的&copy;Flag设定为1,你的rtState可以为0,但对象object却没执行什么操作。
/ z/ L! n7 z) [! w' r% f

; |$ }' @( |% o/ A3 c现在我想把我的object进行move(这个对象包含了blend,hole,extrude等特征操作),请问ZZZ兄有什么高招?
$ K8 M: c! k" M& B; @: l9 _: g
7 @* o- {6 Q* y- Z3 _8 ~
现在我调试的程序可以对point,curve等进行操作了,但带参数的就不行。0 o5 l; O% b" u! c: I

* I# E9 j3 d- F8 ^3 z$ B$ \# ?+ p, i9 |" a' ?7 Q

关于平移的问题,受斑竹的启发,我调试了下面两个函数,同样可以对Object进行平移操作(只能copy而不能进行move ). ) B3 I! ^4 S) |
double Dxyz[3]={50,80,0};
7 w/ D& Y6 d- y* N5 }* @2 I5 g) R  double D_target[16];
  k4 J& C  ]+ u6 D+ E9 {tag_t copy_object_id;
0 b+ O$ }6 B! X8 U* }, Z  FTN(uf5943) (Dxyz,D_target ); 8 M% O0 h" j! ]2 J* F- y
  FTN(uf5947)(D_target,Object_selected,&one,&two,&zero,&two,&copy;_object_id,NULL,&resp).

现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.
5 ^4 b; W3 b! ?! ?. vuf_list_p_t cmtag;
- s$ a0 C3 [0 u8 l; V9 l5 F5 Nint ug_type,ug_subtype;
, Y! S9 W0 k2 H! l0 |int N_features;
0 w' {& @( R" o+ p6 j2 a' ^% ui_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype );
, g% t% m" M  h! [! @  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object ); - s9 G, n/ }+ e; X* {
  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag );
& N/ ]( g0 a- V3 `7 ~* V  i_ret=UF_MODL_ask_list_count(cmtag,&N_features);
1 e5 _3 {. d: r! q6 M; v
但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?
% L; P4 _0 ~( T, v$ e  ?

4 p9 R% L# D6 v下面的这张图片是我在交互界面下进行Transform时出来的警告信息.

) B; R( q6 j+ o. I8 |% \8 \  p

Knight74 wrote:
! ^0 e6 M: U$ ~& b现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.
; t8 E& o7 k8 D/ }' huf_list_p_t cmtag;
5 U+ E& c4 E! S- O$ z4 Uint ug_type,ug_subtype; 3 k; R0 a7 O6 q/ d% J$ E
int N_features; 3 f5 R$ H$ R( C# I( f8 L+ O
i_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype );
4 U. ]# L2 g/ G& T9 `  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&
body_object ); # F( y* C1 \( q# ?! u# S8 E5 P
  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag );
: v1 E; E: R8 v  i_ret=UF_MODL_ask_list_count(cmtag,&N_features); 8 K3 [6 Z* ~  m
但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?
8 _8 s: W# K8 W' G- V下面的这张图片是我在交互界面下进行Transform时出来的警告信息.


' L& l) ~9 a) G2 K2 U+ T8 S: M" Q


! p# q( ^6 Y9 D/ V& K1 N4 U+ Z' y  L- D) c; E! n/ Z
body_object
一定要初始化为NULL_TAG.

Knight74 wrote:; @- t" b* P: g2 h" ?0 i" O* B
请问斑竹,知道计算两个object之间的距离函数吗?这个函数可以计算两个object之间的最短距离。- H7 S! Z' b' o) H2 I
另外,感谢斑竹上面的提醒。今天有时间我把第3中在UG中平移物体的方法写上去。是通过移动特征来移动物体。

求助
- _& ?" K( k( H" f4 c7 T3 y6 ]& k0 ^4 @0 K0 j5 x: B6 z
//-------------------[6] Chamfer 4 edges of block2-------------------
( A. U4 G7 N0 f6 `, T% Luf_list_p_t edge_list1,edge_list2;
0 b% C% c- [1 n1 C1 G8 Stag_t chamfer_id,edge;
% h7 S  I$ P0 W' A  G. f0 Ddouble end_point[3] =  {0, 0,0};   
( [7 r$ p8 ~& p1 H0 A" Z4 qdouble direction_z[ 3 ]= {0, 0, 1};
& e: v! ~4 R" a4 d1 y6 _
int dir_edge; , c4 C6 |0 }: |4 |4 V2 l! ^' B
char * angle1="45.0"; % o) P7 M" U% r4 z& z
int subtype=1,*is_parallel=NULL;
& c, k3 S: M. y$ [UF_MODL_create_list(&edge_list1); / i4 F' p+ y" o6 Z( x* B1 }
UF_MODL_create_list(&edge_list2);
9 v- L1 |5 h) D0 TUF_MODL_ask_feat_edges (block2, &edge_list1 );
9 ]; r9 d( W8 KUF_MODL_ask_list_count(edge_list1,&num);   O/ u7 R$ P9 V8 K0 Q
for (i=0; i<num; i++) . Y+ E' D1 z# }; V, |6 Q& P, ?
{
) E* W3 ?1 j* c. H9 {     UF_MODL_ask_list_item(edge_list1,i,&edge);
6 A. [+ x2 t# a8 U- m7 u4 ^: n. V$ w# H( g# ^
2 D% \, [4 z2 y" @
   UF_MODL_get_curve_edge_direction (end_point,edge,&dir_edge );
/ s1 v0 c  B7 @2 S
. l/ @* ^. [' W( a   UF_VEC3_is_parallel(dir_edge,direction_z,0.0001,&is_parallel);
# O  n( l# x1 ?     if(is_parallel)
3 F" B7 N7 J3 b) n# k3 p" `/ N1 {6 N7 R1 s, z/ s0 J/ K, M
. i! @7 b; M3 o) n* y
   UF_MODL_put_list_item(edge_list2,edge);
6 j% {8 Y' q; E% D0 u   } : Z4 O0 N% T. |  E4 f7 ~' t) p) S
9 i  B4 b0 Y* T3 S
   UF_MODL_delete_list(&edge_list1);     [" J+ p( E! m5 B; \2 s; {- Q
UF_MODL_create_chamfer (subtype, "2", "2", angle1,edge_list2,&chamfer_id); & s7 \  X; L  k' s
   UF_MODL_delete_list(&edge_list2); 1 D4 q) A7 P& D
# U) l( C! B2 }" t
编译错误:error C2664: 'UF_VEC3_is_parallel' : cannot convert parameter 1 from 'int' to 'const double []'
, m# K6 J, N+ U+ p' R* m请问用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,
2 Y6 J7 U) L5 q7 r6 J* oint * direction );   i' a3 ?3 R8 d6 B8 N# x
  M: A8 x% d( y" J, R4 ?
double * end_point Input : The input endpoint + a0 x8 C" p" c" K% _! Q! }
tag_t curve_edge_eid Input : The input curve or edge
; ^* a: X$ h4 f* e4 ]1 V
int * direction Output : Ouput direction
6 `2 E$ _- o& ^, J1 P3 U: \2 d- r# T) `3 K& @6 o! I
extern void UF_VEC3_is_parallel (const double vec1[ 3 ], const double vec2[ 3 ], , e5 z' O, P5 k5 U( _8 v0 d+ z
double tolerance,
" V0 Y* n( ^. j7 tint * is_parallel ); " i; z$ ]. U# x" f
- K% `' b( p8 w0 j2 h: i0 m
const double vec1[ 3 ] Input 3D vector
3 W8 b; }$ w4 c/ K# {9 rconst double vec2[ 3 ] Input 3D vector
$ y1 b+ g0 r  `  b& W4 b0 G. u( _double tolerance Input tolerance ) M  B, a- [, H( M
int * is_parallel Output = 0 Vectors are not parallel
$ G8 e' X4 |# n5 w# \- F= 1 Vectors are parallel
) N# }* N" Q# z  T( Q* V' j( p; p2 R# K, x1 a3 P9 t
整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?

taiga2001 wrote: 4 V% X% g1 f, a$ r- a1 B
extern int UF_MODL_get_curve_edge_direction (double * end_point, tag_t curve_edge_eid, - Y' v  A8 a. i- j
int * direction ); 6 L% ~- y- a& j3 J5 y& H% H
   / ~+ r8 c. y* _/ M0 Y  e
double * end_point Input : The input endpoint
  A# F* F# S9 E& ztag_t curve_edge_eid Input : The input curve or edge
; F5 ^% U- ~$ S. z
int * direction Output : Ouput direction ) `( s3 Z: Q3 y& n
   
9 H" f5 F( A2 c2 i& wextern void UF_VEC3_is_parallel (
const double vec1[ 3 ], const double vec2[ 3 ], # F/ h# |( F! ?$ [4 E5 D& A; x" l$ H
double tolerance,
5 B5 i; ^  r: L6 o  Yint * is_parallel ); / q3 z" v( h8 q" n
   
3 h6 s5 I0 L7 h& \/ M9 e% q
const double vec1[ 3 ] Input 3D vector
5 ^7 c* u0 C4 ]- Gconst double vec2[ 3 ] Input 3D vector 1 H4 V/ g) D; C/ w
double tolerance Input tolerance
$ |! Q4 k0 R* P  V, Y( Yint * is_parallel Output = 0 Vectors are not parallel , ]+ @  F* J  v3 Y9 X7 j* N
= 1 Vectors are parallel
2 _5 p2 ~& l" X# m+ ]/ j   7 s+ H9 w" O7 l# z1 Z- Z& P
整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?

第一个函数只是用来判断一个点靠近一条曲线的起点还是终点。
2 n; Y, M4 K! m! G8 y
3 J7 V1 v; b# m7 r' ]! K/ r# @
第二个函数要求输入两个矢量。' R  s% `& y# ^0 v3 ]

% `9 U7 f* e* x) w得到边的方向可以,先得到边的端点:用UF_MODL_ask_edge_verts()

-------------------[6] Chamfer 4 edges of block2------------------- * W% e  ~& L& O5 l( e7 P: F0 h
   
; l8 L5 t1 v6 I   uf_list_p_t edge_list1,edge_list2;
7 {1 i3 o! z& k& G8 I3 G, o! L  U% v$ E   tag_t chamfer_id,edge; & C7 W- S; \+ n, ]% T
   double point1[ 3 ]; 4 \* j9 x5 p0 Q8 n  J
   double point2[ 3 ]; / ?% n' d* u5 v; @: D% o1 k4 ^( t
   char * angle1="45.0"; 6 Y1 C6 Y7 B5 v/ Y: l+ C8 k- h+ |
   int subtype=1; ( `1 F4 J0 D# d6 A# u* q" ]; j
   int vertex_count=NULL; - u$ R$ ~6 F; B
   UF_MODL_create_list(&edge_list1); * g9 c3 C- |/ h1 h$ @
   UF_MODL_create_list(&edge_list2); # x/ Y% w# k, {9 f

4 G+ h: I& J; U/ I# G/ E0 c* v. n   UF_MODL_ask_feat_edges (block2, &edge_list1 );
6 Y. `% F( B+ W" I0 _+ g+ R, h) r% x   UF_MODL_ask_list_count(edge_list1,&num); : y7 e5 Q* \0 h! M
   for (i=0; i<num; i++)
3 M3 v/ f2 x' n* c   { ' V! |) |- s+ g$ [; H
     UF_MODL_ask_list_item(edge_list1,i,&edge); 0 N  ]) s1 v0 S- O: x" a) w& n
     UF_MODL_ask_edge_verts (edge,point1,point2,&vertex_count );
9 k3 _% t& A' y# E
1 _( m* ^5 a+ h' O! Z7 w$ b5 ?     if(fabs(point1[2]-point2[2])>1) 9 G  P1 z6 s8 b; M) l
   UF_MODL_put_list_item(edge_list2,edge); 4 Y$ Y0 D; J1 ^4 p2 }' ?8 }9 b; F& E
   }
6 Z. N  Y* Q( A" R0 s
) C3 q) y9 R: K7 J5 M% o   UF_MODL_delete_list(&edge_list1); 2 E! x( l7 M0 k$ z
0 A' E  f3 q: v/ j
   UF_MODL_create_chamfer (subtype, "2", "2", angle1,edge_list2,&chamfer_id); . C7 D7 G' H2 V) @3 `
   UF_MODL_delete_list(&edge_list2);

UGmove 物体的第三中方法,通过移动特征来移动物体。
+ ~) \7 f) o. j: f6 s& H

+ i9 s+ |8 I) ]' ]( e. x# N$ ldouble 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};
, `- x+ s% Z  O" F( {" K  int mode=CSYS_TO_CSYS; # R3 h6 z' `# }* H; h* G8 n) B7 x# ~
  int N_features;
( D' e3 L: y# P9 o) b% {1 ?" C  char features_num[100];
( g3 R8 G) [! V- @1 d* H) y& i  uf_list_p_t cmtag; ) J) V" r1 [4 H  a: n0 I
  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object );
% [: s8 _2 A9 d$ i) t  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag ); & ]2 W( B' f6 q1 K$ B  Z
  i_ret=UF_MODL_ask_list_count(cmtag,&N_features);
) X# Y1 k' g: F! E8 z4 w: e- x6 n1 g& h2 L& F
  i_ret=UF_MODL_move_feature(cmtag,mode,real_data);

斑竹,我下面的程序是希望通过一个点,一个方向创建一个datum axis,我用
! y7 y7 x- Q2 U0 R

- n8 ]& Y4 |2 ii_ret=UF_CURVE_ask_point_data (dpoint,Datumpoint);
; c0 h, |' H/ _# V, ni_ret=UF_MODL_create_fixed_dplane(Datumpoint,direction,&dplane); ; \6 f5 s& G9 _% Y
i_ret=UF_SO_create_dirr_plane(dpoint,UF_SO_update_after_modeling ,dplane,flip,&Tdirection);
: @, O7 ^" `7 Y( z4 A' Qi_ret=UF_MODL_create_point_dirr_daxis (dpoint,Tdirection,&daxis_tag );
$ z" ^% M" _- B6 C
上面这几个函数先生成了一个datum plane,然后我定义了该平面的方向,
# y! N+ C5 F; j0 g; F/ k最后通过点,方向生成datum axis,其中,dpoint,Tdirection,&daxis_tag 这三个参数都是tag_t类型的,调试的时候最后一个函数出错,说是"internal error!",请问斑竹是何原因呢?

镜射特征中螺纹是否可见是不是由thread.include_instances =UF_MODL_INCL_INSTANCES控制?
* k% _, p9 @, k2 ~' P0 c为何镜射【mirror】特征中原来的螺纹不见了?
8 W6 {' d* x4 {7 u/ C# H7 }//----------------------- Create boss----------------------- ( Q5 Z9 U$ L* w. a& i/ a
     UF_MODL_create_boss(location1,direction,diam_boss,h_boss,angle,trim_face,&boss_id); ' V; }1 H3 j/ u- A5 i& G* b3 g( e
% \4 b9 j6 h! }$ A& t
//------------------- Create a thread on boss--------------------- ' G- b4 d9 ?3 d8 c6 d  g( B

4 @$ i3 o, h3 ~0 M2 U//Get boss faces to use as start face and cylinder face of the thread
7 w4 B" M7 ^$ [2 E   tag_t s_face,c_face,thread_id; : Y- ^: h  r" }' O. Z
   uf_list_p_t list;
' Y& q2 @+ Y' [6 g. k: @$ u* A* I/ f

3 l3 L! l6 B: r! H/ w   UF_MODL_create_list(&list);
# H  e, r$ o3 M* G   UF_MODL_symb_thread_data_t thread; 3 o9 k) ^9 G3 c) P# }
     UF_MODL_ask_feat_faces(boss_id,&list);
7 ~) _# ~/ [+ O, H5 B, P- @7 v     UF_MODL_ask_list_count(list,&num); 5 x/ u4 l) O1 r* f3 A8 Y
  for (i=0;i<num;i++) . I4 V- p! @4 f: d1 W
  { 7 l0 b  }# Y* R! j& V
    UF_MODL_ask_list_item(list,i,&face);
# u  ^$ D: X3 G
/ x) E6 \# z2 q1 N    UF_MODL_ask_face_data(face,&type,point,dir,box, - F7 l7 T4 p# ^/ ?3 T$ q  w
                                &radius,&rad,&sen); $ \( t/ [# p' V  l
    if ( (type == 22) && (fabs(dir[1]-1.0)< 10e-7) ) 2 v' M: V; n3 a$ \
     s_face = face; //start face . s: N% }8 B+ [% m9 d* i
    if (type == 16) 3 K8 X4 Q) k5 e9 e
      c_face = face; //cylinder face 6 f9 k- s! j2 C5 r
  }
! K2 E5 N7 O) o) F) e/ ~4 s0 w  UF_MODL_delete_list(&list);
' u2 r/ @+ t4 O' \- G/ Z0 ]' U
//create thread 4 a5 M% h0 W% `  Y( J' o7 {+ A
   char thread_length[10]; , @- M- h: q- o0 H, k: e9 e
   thread_length[0]='\0';
0 G. h9 N! [2 K% S   sprintf(thread_length,"%f",0.5*atof(L.value.string)-hi-2.0);
! e5 R1 D. H( m% g8 |. [% T- w& {/ M4 X0 \
     thread.cyl_face = c_face; : k& Y! X& t1 z9 u, K2 o) D* `
     thread.start_face = s_face;
. @1 @6 i( v8 O     thread.axis_direction[0]=0;
# c/ S$ `& i5 p6 b% k     thread.axis_direction[1]=-1; ; J8 h, i: b, K( z/ C! c$ C
     thread.axis_direction[2]=0; ' e1 [; g+ {# u# X7 W
     thread.include_instances =UF_MODL_INCL_INSTANCES;
8 B6 }- M1 e' P8 S6 J     thread.rotation=UF_MODL_RIGHT_HAND;
. N5 I% B9 s* d     thread.length_flag= UF_MODL_FIXED_LENGTH; . O1 r2 F; ^7 ?* b% z
     thread.tapered = UF_MODL_NON_TAPERED;
. r, ~3 T  V3 Y) r3 A     thread.num_starts = 1; , n2 c( e* u: c# t' C5 A8 G  V" z" g. }
     thread.length=thread_length;
# u  M1 O" x, D' W. b! p% P; u' l     thread.form = "Metric";
+ B& ?+ ^  _4 e( B! l" _% o! p7 d4 X     thread.method = "CUT"; 6 ]+ O5 W2 N  r: Q5 H
     thread.callout =callout; 1 C$ V5 h  B) u' _/ v1 D
     thread.major_dia = "10";
/ G4 k2 ^, ^% A     thread.minor_dia = "8.917";
& m: ]/ d% p, s& U8 z6 D2 [     thread.tapped_dia = "9.813";
/ o8 g, D0 N- h) ?     thread.pitch = "1.0"; " q( C4 Z$ N4 v  P2 r
     thread.angle = "60";
5 K( y: C7 ]0 d     UF_MODL_create_symb_thread(&thread, &thread_id);
* D% W/ W: j3 D7 M/ V8 r( p
//-----------------chamfer edge of the boss--------------------------
! R" p/ W: _1 w! P, R4 O' Q3 i: X- ^- ?* m  J2 W4 `
   uf_list_p_t boss_face_edge_list; 8 h5 q+ R- ?4 i
   tag_t chamfer_id,mirror_obj;     $ ]/ |$ h* F) R& i# E
     UF_MODL_ask_face_edges (s_face,&boss_face_edge_list);
* D. g# X- `5 r7 C6 i8 `7 }$ L, E$ |5 @. P0 }* J; L

; C( u5 W3 D- g5 ?# P, w     UF_MODL_create_chamfer (1, ".5", ".5", "45",boss_face_edge_list,&chamfer_id);
; d/ s/ \% `( H1 \2 @5 o% `, k# Z4 }
   UF_MODL_delete_list(&boss_face_edge_list);
/ U3 H. h; h1 S" J& Z1 Y* `    UF_MODL_ask_feat_body(chamfer_id,&mirror_obj);
3 d5 o& t' P8 K/ R
/ s7 {6 l" u9 Q
//////////////////////////////////////////////////////////////////////////////////////////// / X' [$ S5 T& R/ w2 c2 S
   ///--------------------create mirror feature-------------------------------------
3 z# T* j, I8 ^# V8 u
! S  ^& q2 I8 j  |( [/ ^) ?- s
double ctr_point[3] = {0.0, 0.0, 0.0};
3 ^; w. a7 p9 u* U: c  double directiony[3] = {0.0, -1.0, 0.0};
$ g$ U& i# [! y8 g* G0 h* M  tag_t mirror_tag,dplane, mirror_body; & f% x) ]7 x6 f+ i( h
6 d* ]9 A- C8 e+ J6 g

, I1 _+ p6 a+ v- [( S
//Create Datum Plane
* t2 R+ }. j+ x* N. t1 b! E2 S) l2 S  UF_MODL_create_fixed_dplane(ctr_point, directiony, &dplane);
- @! P/ l( y# [& a$ l- ^  q, ?6 r# r7 o; \2 o
* z' Z7 u, v% ]
// Create a mirrored body 9 C: P! Q4 X0 [4 q& m! j, f$ }

7 G2 p* x- i6 b8 |UF_MODL_create_mirror_body(mirror_obj,dplane,&mirror_tag); & x6 j" K7 v* a. |+ p5 M" L

! I2 O8 c/ x6 Z/ l0 I* zUF_MODL_ask_feat_body(mirror_tag,&mirror_body);
1 ~  j4 V, g1 X6 \+ S5 u/ h. D5 E2 i. I) W

* Y1 R4 y" L7 @) U, w//---------------------unite-------------------------------
+ [2 t# z, C, W* ?  e
3 t+ a. R2 K7 {  |1 c; _
- [$ |; k( ]1 s9 e3 q( k
UF_MODL_unite_bodies(mirror_obj,mirror_body);, A( x6 a  i2 f1 Q! p# x7 v

( Z; ^0 [6 A3 Z

没办法,只好又加了一段,在mirror特征上作多一次螺纹!! a  D: X4 k1 p$ D- |% p( a

* S3 F/ s: H2 h% Y5 j$ t. F, L
9 U6 C2 q: }. u5 R//------------------------create a thread feature on the mirror boss---------------- & O* W6 [5 w& k
% V: a( G5 E  [4 k3 Z  |1 Q
    UF_MODL_create_list(&list);
, N$ K3 g0 W' {' g5 P: R, `8 ^6 `     UF_MODL_ask_feat_faces(mirror_tag,&list); % S5 y2 m1 r9 l2 j
     UF_MODL_ask_list_count(list,&num); 3 X5 f$ _3 {) u8 L: h
  for (i=0;i<num;i++)
# z) A9 q. @  a  { 3 C+ f$ p- B" z3 k! m
    UF_MODL_ask_list_item(list,i,&face);
% H$ g5 F0 M4 k: N! |' g. Z8 j( d5 Y# j
    UF_MODL_ask_face_data(face,&type,point,dir,box,
& A! P& b9 n4 m+ [; U  k                                &radius,&rad,&sen); ' W4 P! b8 i! _; D' c4 G) Z
    if ( (type == 22) && (fabs(dir[1]+1.0)< 10e-7) && point[1]<-10 ) ; C3 ~  c7 g, n- ?% {1 d
     s_face = face;//start face / t$ R, f! T6 H$ @
    if (type == 16)
0 v0 B" G9 q! L% N7 ?      c_face = face;//cylinder face 0 n  w  a: g2 x
  } + B8 I6 ~5 Y% y/ d& C7 o+ d2 Q
  UF_MODL_delete_list(&list); / X8 o% [% c7 \. L
4 Z  D7 N2 Z- A) o6 o1 O
     thread.cyl_face = c_face;
' r! y1 k4 H5 u8 T; w; w4 M$ o" C     thread.start_face = s_face;
" O9 v. Q$ ?6 b4 L6 G     thread.axis_direction[0]=0; " D  S, L; S( o
     thread.axis_direction[1]=1; . c# ?# M' @1 D3 u/ s' k
     thread.axis_direction[2]=0;   F- h( M& j: U
     thread.include_instances =UF_MODL_INCL_INSTANCES;
' }2 a8 J. P: ?: X( d     thread.rotation=UF_MODL_RIGHT_HAND;
* `* v; r/ o" K     thread.length_flag= UF_MODL_FIXED_LENGTH;
  r3 B$ d- D5 R; t! I- w8 X9 e. q     thread.tapered = UF_MODL_NON_TAPERED;
7 O, h, b5 x9 v2 x6 _2 g4 H: a     thread.num_starts = 1; 8 L, T/ R" p+ u! X6 M
     thread.length=thread_length;
; l0 k1 }7 U3 j, b4 F     thread.form = "Metric"; : P1 }+ s3 L6 x2 V" v1 i1 q
     thread.method = "CUT"; 0 O7 B0 A. ?7 P% f' p( m. a
     thread.callout =callout;
9 s' Z2 Z% c! t- R* Z& d+ w     thread.major_dia = "10"; 5 H( C! L) n7 n: [: z9 w- f. `
     thread.minor_dia = "8.917";
  C& o6 S1 H7 u. [1 v     thread.tapped_dia = "9.813";
4 Z) `+ b4 i. Z2 N) o( J1 E     thread.pitch = "1.0"; 1 x' `* {  X8 A' u* {
     thread.angle = "60"; 4 K) B& {9 h, b/ ]
     UF_MODL_create_symb_thread(&thread, &thread_id);
1 k+ T" g# r% F2 h# i
斑竹你好.我现在已经明确的知道了我的part文件中两个实体对象的tag_t name.现在我想用UF_OBJ_cycle_by_name()这个函数来确定查询出来的tag_t是否和原来的一致, 9 H  v3 [& T. U
tag_t name_tag=NULL_TAG; # R5 W3 J2 _( H6 ?8 F" p- P
  UF_OBJ_cycle_by_name (CM_name,&name_tag ); 5 m+ y. n, s4 Y& `5 ]  s+ q
  while(name_tag!=NULL_TAG)
2 b* R9 i! g7 J) T8 F4 @  j+ P8 g  { 7 u$ R/ k  Q  ]0 h3 _4 r: x% v
    UF_OBJ_cycle_by_name(AM_name,&name_tag);
, z2 D0 I% A; ^% k# f- t  }
  Z! f5 z5 x5 o) ^- {- Z* i
当我给name_tag赋值时,函数返回也是为0,当我不赋值时,调试说我内存访问禁止.请问斑竹能否给点提示?谢谢.

我是一个刚开始学习ug二次开发的新手,马上机要进入课题,老板现在让我先看看UG/Open API 中的一些函数,由于是新手,在加上时间比较紧,囫囵吞找的看了一部分,有很多地方不是太明白,在这里先问几个让我很困惑的菜问题
0 N6 |: F! l; @- N, {( q

* t" C2 O; e! B2 O5 I* p/ U很想得到zzz的帮助::(谢了先:)). [3 @( _; \) H

: m2 ~! n9 L5 F& D/ J8 u. _他们是:. c3 b1 u! ]. M7 R/ Q3 ]/ N
' P" {3 e" v1 h' ~
1
ufstr()ufusr()的区别;
  h7 t5 Y$ W/ E/ f$ R" O
# d! H. ~7 R$ Z& F. R9 z
2
UF_UI_dismiss_dialog_area_2()对这个函数在看DOCUMENT时不是太理解
) u+ m1 p( a9 U9 o  N
4 f3 T' P8 V0 ^# j
不知道他和UF_UI_cancle_uf_dialog()的区别??0 x& v* I" I1 p& L5 `

# a5 H) C2 t0 l3
UF_UI_get_DA1_coords()" |4 |% E9 o5 V1 P/ {( o+ M  z
  p5 j# x& [- r. T/ f
UF_UI_get_DA2_coords
()着两个函数中DA1DA2具体指的是什么??以前在UG Documentation Help看到过但是现在找不到了,应为是新手好急啊!!!

zzz: & f& t2 t' d% f+ Z  t  j8 i
我用你前面讲的回调函数的例子时,编译工程自动生成一文件 EH.H,然后就是如下:
) f$ D# U# n) H+ Q: J5 |

1 W, }1 g, n5 K4 Ze:\my_source\eh.h(33) : fatal error C1189: #error : "eh.h is only for C++!" 8 s9 Z+ M2 p- b! N7 O
这是在MSDN查到的,可是不知到如何修改下面的错误?请赐教,不胜感激!
. Q! O  |9 h+ L; `
: j  C! w- g( A- B; n$ N0 X# [
Fatal Error C1189
. \4 \0 W# M" X+ l( N: l0 l0 U7 E6 U#error : user supplied error message + f) T* s' h% e- W* G2 L- l
This error message is generated when there is an #error directive in the program. For example:
' |8 V- ?' u5 t2 ?: M#undef _WIN32
( h5 O  Y6 T" M5 N1 O6 Y9 y. ^% h7 v) T* _# O
#if !defined(_WIN32) . z9 U. r# `" j
#error _WIN32 must be defined //error ! M  [0 M$ a9 E" x2 d  e% c
#endif
$ A/ U( F( q7 B6 G; P/ T' N$ I7 I! X. q
int main() { . X# N( T* ]' c1 k4 A4 e7 D
   return 0; $ m* \8 P) _% n6 F! g
} ; `' c9 ^* e( ~( g5 Q2 J
EH.H中是:! V: L" ~# F8 k! M
2 X( c+ \- Q5 e% r* h' ]% {
#ifndef __cplusplus 6 t0 D6 R8 A* f& f0 V* _  F
#error "eh.h is only for C++" //
有错误# O& K$ y5 M! K  D0 H. ^
, r/ o# h% ~( }  r4 y
#endif
/ ]5 h- \, q: ]- m* s, p/ b
这又如何修改?

找到 #ifdef MENUBAR_COMMENTED_OUT* i" F( _; }+ A  I9 H7 b9 V8 G/ _/ f  `

( V- [' X% P( N- R
把它及对应的 #endif 删掉。

我用的也是UG NX
! W" R( l/ f/ C( t3 y* y"lindy.men"
如下:
5 x4 m. p9 j% R' ~; M

0 z$ G8 r% e. c% W" }VERSION 120 1 E# l) e! b$ q7 p6 i; o  _9 j
  EDIT UG_GATEWAY_MAIN_MENUBAR ( x2 U# r( W! J8 n6 H/ J
  BEFORE UG_HELP ) y/ n* C. _+ U9 S
    CASCADE_BUTTON UISTYLER_DLG_CASCADE_BTN
( n# r  C9 X( ~8 E  LABEL
启动对话
, ^4 n  l, L; x# J( [
: q3 c5 U" h6 F
  END_OF_BEFORE + ]$ J  C' d/ n" B2 I$ i

' T0 N4 v5 x- \7 Y- O* j0 d8 e* S  MENU UISTYLER_DLG_CASCADE_BTN
& u( v( u/ ~. G8 l5 C8 Z    BUTTON SEQUENCEPLAN_BTN , N" t3 z3 u( l/ v5 [$ j
    LABEL
应用菜单
- o6 H* B8 H* p
, n, I- J; @6 f7 w  J
    ACTIONS yulu.dlg
+ G! k: N4 P5 u$ n2 G  END_OF_MENU - Z" r* D- k( w
lindy.men
文件放在D:\Unigraphics NX\UGALLIANCE\SITE\startup目录下$ [' C) H  T1 z) e+ L) F

$ y) V0 }) g4 Z. P" w% M. q+ m6 nyulu.dlg
文件放在D:\Unigraphics NX\UGALLIANCE\SITE\application目录下
$ n! `" A1 `, e; X9 i' \9 c& Q
' j/ I% v. f# y! K9 [9 e
如果没有程序源代码,而只有*.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 | 显示全部楼层
谢谢!!!
, x; s& I, z+ p6 m/ q# Q9 m0 H. e好好学习。
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 12:09 , Processed in 0.211057 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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