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\application和E:\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 s再Windows中设置一个新的环境变量: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)加入四个控件。String,Push Button,Label和Single 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. u5 \. 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_cb和cancel_cb分别是点击OK, APPLY和cancel按钮时,执行的动作,它们的应用在后面的例子中介绍。
5 ?5 _) g$ q% U7 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首先进入UG,UIstyler,打开前面生成的对话框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
我的EMAIL:wgwang_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& h1 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 L3 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程序的前后两段好像没有什么联系?Dxyz和D_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, ©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, ©Flag, &layer, 2 l) s- B+ s/ r' P- c& J
&curveFlag, copyedObj, NULL, &rtState); 3 Y9 I1 L5 l! }- _( `" m% l6 G
中的©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 _: g7 @* 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,©_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 Vint * 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. zint * 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% qconst 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 y3 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); 在UG中move 物体的第三中方法,通过移动特征来移动物体。
+ ~) \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 N4 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()着两个函数中DA1和DA2具体指的是什么??以前在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二次开发有声视频教程 |