青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

1。建立两个目录。
" [0 B* b$ ?' X$ R6 ^% T

4 h; g! R8 x/ s5 F* [1 u& M& w; H- Q6 o, m
   
建立第一个目录 E:\my_first_ug,在这个目录下建立两个新的目录:E:\my_first_UG\applicationE:\my_first_UG\startup
& y6 d* @  q' J0 K$ i0 E' \
1 \3 n& A+ H; d8 ~
8 O' n0 M6 z( B4 \; C9 W
  
建立第二个目录E:\my_source,用存放你的源代码。

2。设置环境变量。6 a( }4 K) s# K. f7 R* r9 t& o
# W8 X4 c, e, ?! F% ]% z
Windows中设置一个新的环境变量:UGII_USER_DIR=E:\my_first_UG

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

4。设计一个对话框。, m* [1 \) l! l4 N# U( q5 o

$ x1 F2 ]% s6 a9 `# t4 K' u7 C4 r& _
1
)在"Dialog Title"一栏填入:First Dialog,按Apply(每次输入完成后,都要按Apply,为避免啰嗦,以后不再提及)。
, Y+ ]9 S: H& I8 ?' j6 z4 q

4 T4 \4 n+ y3 y6 T. U" ?2
)在"Cue"一栏输入:%……%%¥¥##*%****—((,什么都行,呵呵。
4 P: D( M, h; B* [) E

8 G) i) ~" s9 _3
)在"Prefix Name"中,把CHANGE改为MY
8 A" l7 B( m1 M' w# ?
" ~& q# |9 j" K* A8 Z6 S0 L
4
)加入四个控件。StringPush ButtonLabelSingle Select List
+ y$ ~* ]  p- c2 y9 I; [7 J$ B- C2 [* o9 }$ R( n0 U

编辑对话框的各个控件。
2 p, m7 H0 r. c' z

* Z1 [6 S1 h1 I+ n6 B
! }! g6 d& x+ ^& ?1
)改变String控件的标题,标识和长度。
/ j0 k: ]: ~8 p' {

- f# l1 W. }# M" s! V' Q9 N' L
9 z: j9 Z* e4 P: s: KLabel “String” -> “Input an item”. ( r' L( [! j* Z6 B! g+ j
Identifier "STR_0" -> "ITEM"
& m+ o9 K8 Y% Y- i& MWidth in... 0 -> 20

2) 改变Push Button控件的标题,标识和回调函数的名字。
7 q, h  Q* T1 ~7 ~$ o+ Y2 ~4 @

& K9 h5 V5 j8 |/ ?$ b0 s" ^5 a/ g
( G0 J$ Q" l- c; v7 ^# XLabel "Push Button" -> "Import" 9 M0 b1 i; U9 ~' g
Identifier "ACTION_1" -> "IMPORT" 6 I+ L3 r. f' K& h1 Q
callbacks "action_1_act_cb" -> import_cb
  B3 C4 H5 k  i5 g9 t
# ]3 }+ K) A% l0 W' L5 F
"Creates Dialog"激活。
9 w- ?& R& g) ]( N
& v. H9 Q2 ~  m

3)改变Label控件的标题和single select list 的标识。改变single select list可见项的个数。5 B9 ?. L* l5 P8 K2 F& O3 s. t0 L
- P" ~- _# X# Q7 H, b) h7 k
6 B6 y5 N# G. Z" K
Label Label -> Items List , F( A- S; C$ r$ T+ C
Identifier "LIST_2" -> "ITEM_LIST" : ?3 x+ n- y1 b/ j
Number 3 -> 6.: P0 ]& I0 _" }; e+ c

: C; g/ I9 }3 W7 x- }* p% r6 W8 Q

6. 保存对话框。& U, ]% U. i+ r
* x5 ~2 @/ Y& r2 ]
点击save图标,把对话框保存在E:\my_first_UG\application目录下,4 e5 `7 @' B% A& D
文件名位first_dlg,生成三个文件。0 c1 w$ C; P. m/ q% {7 [
7 M, t+ F* V: j4 w& @0 T
(现在可以推出UG乐)。
/ R9 m' i8 V( a1 O9 P; b3 W. I  d
$ o3 p5 c% J3 `0 a
9 P" {2 z$ R. s# z" R9 k& P( ?

7。建立一个vc的工程。
4 `# Y- Y- Y' D8 X& W* I. Y0 q; a
* t" D3 Z/ @! A8 z3 |, ^0 U+ [4 O

3 L$ e; U4 i. K# I, a  Z1
)把\application下的*.c*.h文件移动到E:\my_source目录下(文件可以改名字)。2 o( U: R9 s2 @8 Q( Z
2 @3 _6 u) c1 g. Y! k( }: X$ _
2
)建立一个新工程,选择Win32 DLL
8 L; S, a6 w3 j7 _, p
0 @) _3 n2 S$ |; A% h
3
)把c源文件和头文件加入到工程中。: ?5 c& ?$ q7 ]0 ]1 d% u. F9 ^% q# z

" X7 A4 M7 r) ~# u  S8 C* y+ F

8。设置vc的环境。3 I9 w/ y2 Z1 n8 N- |
# q2 |; Z: x( \1 R/ W, y! _8 p

' @" @1 _, }6 ~' u8 i, @8 |Project -> Settings -> C/C++ -> Category ....
加上头文件。

Project -> Settings -> Link.... / H: `% c# E1 Q+ E
改变输出文件名,加入连接库文件(ug17之前的库名字不同)

Tools ->Options...->Directories 4 c3 d6 k8 P% _, A* E

# Z( Q, _# w8 p$ v1 ]! `/ W% ZInclude files
Libray files 加入UG UFopen的路径。

打开first_dlg.c文件,找到menu script样板的位置。
# Y' J) T5 h1 [, P1 \1 {
" l9 w+ Y$ C) s3 T  a* q  D$ I
复制这个样板到一个空的文本文件。
8 T; e- ]! K! u& T$ k# L' G+ I8 m

+ d5 @" Y, v; R) E把文件保存到E:\my_first_UG\startup目录下,文件名位first.men(注意后缀)
. |3 @! n! y5 j2 Y
& u1 S+ U: p6 L( ?9 f' ^8 G! c

找到 #ifdef MENUBAR_COMMENTED_OUT
5 M3 D, i- ^& i4 f* ~4 I

9 T2 @8 |' |$ V: S1 @2 p% h9 \' M把他和他对应的 #endif 删掉。

找到#ifdef DISPLAY_FROM_USER_EXIT5 D9 ^* H/ f, S. c0 ^. G' B' F

4 d; @8 G* l" e$ |把他和他对应的#endif删掉。9 y# k5 g2 G) z- W  d! L$ [
0 {8 W: y5 c5 v* r( O& ^
找到 <enter a valid user exit here>$ g+ L7 P/ X) C9 ]; F/ J: n, E
把它改为ufusr

现在可以编译连接,试一下了,. w# P) g& O/ c3 }. O& g  z, g
呵呵。

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

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

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

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


4 s3 H9 i" z  w! C% k& ]

好吧,下面将一下这些回调函数的应用。/ J# ~* g; `; Q: B4 k
4 v9 e& P. F, o

2 |6 c6 C8 U6 J$ t7 eApply_c
Ok_cbcancel_cb分别是点击OK APPLYcancel按钮时,执行的动作,它们的应用在后面的例子中介绍。
4 [/ k! Q; P3 Z' {( x0 |* X. l
' i; x' q3 q7 J( t, b! T3 j) o
constructor
Destructor本分别是对话框显示之前和退出之后执行的动作。. g4 |# S! {) W" P) F

5 Y5 y9 O0 z5 q# r在对话框显示之前,可能需要进行很多操作,譬如说:设置对话框的选择方式,就是说在对话框打开后,用户可以选择什么物体,面,实体等。8 N- T5 k8 E5 {) E

3 \2 B/ ?- c! V: t7 e在对话框消失之后,也需要进行一些操作,譬如说:释放申请的空间,把加亮的体恢复等。下面我就用例子介绍一下这些回调函数的应用。


. z; F) F; Y+ I1 r% {* o3 O8 _) u添加回调函数。
& j  f+ {2 i% a- Q) o

% L4 E1 B- W( m( Q, m首先进入UGUIstyler,打开前面生成的对话框first_dlg.dlg,在相应的位置添加几个回调函数的名字(每一个都要回车或按Apply)。
, d1 F! l( l+ J" \5 E
1 N& ~7 z% J. A, ?# l
7 A7 K% x$ q6 C6 J
cancel_cb
6 q8 C0 L- Y4 p+ D3 ]( iconstruct_cb
/ E/ P+ R! L; p: |" ]7 s9 E. {destruct_cb
3 S3 @$ d  [# I# |( iok_cb * D- }/ h, ~- u2 s' t8 [! P9 Q+ T# s1 S
3 P7 V6 W+ s; V* S
为“Input an Item”田家一个回调函数input_cb# j5 r  H' D+ w- g1 g" ~
+ a+ Q1 T6 q. T
保存后,退出。
$ X7 f% D) ~1 f1 l1 @) d2 H

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

ZZZ斑竹辛苦了!+ x- a" D9 p9 b0 M

, H4 y/ F5 T; c4 [# Z  
小弟正要搞一个UG二次开发的项目,以后有问题还请多多指教了:)6 }0 y( f. g! t9 J. G) T

* F% C% V7 |( |* P7 f   
请问工具Araxis Merge哪里可以得到,可以简单说一下怎么用的吗,我VC还不太熟,谢谢: M# r- m' d4 V: S: I+ c

: ^0 l! @% H" k: Z6 }' O我的EMAILwgwang_sz@163.com
1 r6 P' Q7 v' X9 k4 {( b      QQ:43801603
  _. d' E+ P+ ^6 u" ~: g2 V9 x' Z   

打开first_dlg.c,找到construct_cb的位置,在其中添加以下代码。
" h8 R; w+ g0 B2 i3 p

* j$ `. }- I, _$ w  Y5 B
9 r; e( l. K) _+ |8 Sint MY_construct_cb ( int dialog_id,
! K& Q! J; }7 x( i             void * client_data, / P9 _) p3 P! J( I1 h8 j- v0 g
             UF_STYLER_item_value_type_p_t callback_data) ! J7 {, K5 L: j! Z& I
{
1 b# J% w3 e1 Y  k  J0 z
  int irc;
2 D  P+ h& F2 O3 Y0 U  UF_STYLER_item_value_type_t value; 0 @* E! E& ]& S$ y$ I3 x
  char string[133] = "Input a string here.";

0 @) d. {2 w" R
1 k0 A4 N9 t7 O% h     /* Make sure User Function is available. */ % h! _+ ?4 p, ~' M6 G" u
     if ( UF_initialize() != 0)
, Z5 D, O: c; R& x) ]          return ( UF_UI_CB_CONTINUE_DIALOG ); 7 |" V2 O- {* a/ n4 n- R$ c
, A; q  [0 B0 N
  value.item_id=MY_ITEM;
/ ?' q* m- H0 _; N  }  value.item_attr=UF_STYLER_VALUE;
1 e; h7 u, Y! j$ c$ V/ ^5 {; _! k* I  value.value.string = string; 4 W' D6 p* Q0 q, e. F% m$ P
  irc = UF_STYLER_set_value(dialog_id, &value); 8 S6 X; A6 `0 r  U9 V; A
  if(irc) - ?; V9 l! ]7 p4 I8 C. F7 v6 S( m
  {
8 t( q' N( d; s" I2 p" l2 G) h! Z    char message[132];
9 G4 L% M' p/ R* `
4 Y  F# @0 R! m. k  @3 _  u    UF_get_fail_message(irc, message); - z: C7 J2 v0 Z7 ]/ Z: G! }
  }
& ?7 N1 V% w+ T6 h! \- Q8 _; d, V' T
( u5 p! J- ~( w7 @! j: }' e. t
UF_terminate ();

找到input_cb的位置,假如下面的代码。8 j. I) L) [! H5 Z8 y
: l& [2 F0 n. @5 v" @" z4 a8 y0 |
! P. C" |- F# {* s6 p8 G1 ]
int MY_input_cb ( int dialog_id,
: H, h" O& G8 _) X4 J- J/ o             void * client_data,
% J- l, F* l/ r  {0 ^             UF_STYLER_item_value_type_p_t callback_data)
9 Y; Y% x2 F/ H: O$ r{
& t0 [" ?; V6 O6 \
  UF_STYLER_item_value_type_t value; + B8 g, M! U& Y2 }. ~! t. \5 i) C
  int irc; " X7 m% Y* R+ S4 f! G# ]
  char string[133];
& _$ L5 L. e8 C5 g9 u
" [6 q9 a5 U$ K1 Y/ ]1 B
     /* Make sure User Function is available. */
! D- X8 O- q5 c) t! H1 @. M3 G     if ( UF_initialize() != 0) 3 |" i' m, R+ K' z5 ^, A' T
          return ( UF_UI_CB_CONTINUE_DIALOG ); # Q0 ?: {4 i$ y7 @5 h

% q! Y, z! H5 Q) s/ D1 ~
   /* read your input */
% b) W7 r8 {! p. Y! Q+ k0 h8 Z    value.item_id=MY_ITEM;
# R) N9 c$ i4 Y  value.indicator=UF_STYLER_STRING_VALUE;
( X6 o3 M! t. b" O3 M  value.item_attr=UF_STYLER_VALUE;   i: m, f# g7 F/ Y+ W, S; X+ a2 ^
  UF_STYLER_ask_value(dialog_id, &value);
9 y" s; W, N4 R$ c
; o6 \( t  W. a  strcpy(string, value.value.string);
) h1 N9 ~8 j' i& P" V& B  UF_STYLER_free_value(&value); 0 Q2 ]$ Z4 c! [& n* J! ]2 \

( B; R! f/ z4 X; |) c% H1 x  /** add it to the single list */
/ p4 R& ~$ N* G+ ?& B: Q  value.item_id=MY_ITEM_LIST;
. D- D' q  ~' q2 O3 g  value.item_attr = UF_STYLER_LIST_INSERT; 6 \5 w' V% h+ a
  value.subitem_index = UF_STYLER_NO_SUB_INDEX; 4 o: V1 h9 J. M- v7 k
  value.indicator = UF_STYLER_STRING_VALUE; & `# ]- d) k: O/ {6 q5 Z. Z! s$ f% P
  value.value.string = string; 7 W* W( e0 t8 Q; e% @7 _1 H2 p5 \; a
  irc = UF_STYLER_set_value(dialog_id, &value);
0 p  ?6 p2 `5 N2 s, ~( ^, y  if(irc)
- T) [* \: N; ~8 j  {
& s* H1 ^9 F% Q- {2 K: y    char message[132];   l2 E3 u1 {) Y, \7 H

7 B' `! B& Q7 m7 o: Y    UF_get_fail_message(irc, message);
  ], k6 ]" d* m. x; J3 `! g6 o6 ]  }
     UF_terminate ();


' C/ s+ ^  b. C! [) Y+ a( Y
; y  X+ A9 M+ h) A7 M) o* g- ]

ok_cb假如下面的代码。
( E: p) z3 j9 {8 i
( g2 f' B1 \9 m% k4 n" z

, S; T! m2 m) ]' T* R int irc, i;   q% q. ~- k6 @! ]9 M
  UF_STYLER_item_value_type_t value;

  H' o- {. I0 e& C3 ]* I
$ b/ h! M0 C" J; c& M: i     /* Make sure User Function is available. */ 9 q9 M  G7 `0 l: _
     if ( UF_initialize() != 0) ! f- W" d9 L* }! J9 k- k
          return ( UF_UI_CB_CONTINUE_DIALOG ); + P* B& O3 G1 n' }. Q

) B, e6 Y7 j/ V. t
   UF_UI_open_listing_window();
& n4 v! i9 ?1 ?- W! C' B' v: N, R, j3 X6 u
  value.item_id=MY_ITEM_LIST;
: W9 _9 j4 s: b  value.indicator=UF_STYLER_STRING_PTR_VALUE; ' \  R7 @( U2 V# R/ @
  value.item_attr=UF_STYLER_SUBITEM_VALUES;
1 g. S4 N7 R; u. E" n  UF_STYLER_ask_value(dialog_id, &value);
. e. f7 S9 h8 A: m6 y2 S    for(i = 0; i < value.count; i++)
+ C, `/ c. _% G& E{
* s' b' h4 d( ^/ L* @    UF_UI_write_listing_window(value.value.strings);
  m3 j& x% H# D$ x: B" ^    UF_UI_write_listing_window("\n"); ! S7 c6 S/ r/ ]0 w
}
+ S5 Q3 p) |7 o6 \% M: B5 e  l$ `8 h+ u& C' p6 B
% H" V$ E6 w* ?
  UF_STYLER_free_value( &value );
4 t* u/ o, m1 S4 a+ N
     UF_terminate ();

至此,我们介绍了几个回调函数的简单使用方法,下面看一下运行结果。
- v+ w& I% V, _0 E% a; ?

. _% W& A! U: [. D刚打开对话框的结果。
( J- j8 x& ~8 P7 s
7 t- Q/ E' b' d

输入一个字符串,回车。它显示在下面的single list中。
; \1 Q% b9 Y+ v( _3 |/ h! ~, ]: s+ r; |, ]6 z( m
对不起,a minor change on code.
% Q3 m! f& E8 jint MY_ok_cb ( int dialog_id, 2 c4 [3 I- y3 C4 U$ `4 s( \
             void * client_data, # A0 T* O2 T$ P2 S' x
             UF_STYLER_item_value_type_p_t callback_data)
6 P1 }9 W- c4 F+ {- h% t{ 6 o* G0 ^, \( P5 C* ^3 g
  int irc, i; & ~# K7 k8 J8 @- [2 P
  UF_STYLER_item_value_type_t value;
  Y0 G5 P) y. J2 _+ r; \6 t6 j) z- \4 @

- N+ H! X1 E$ P8 N  ^0 t     /* Make sure User Function is available. */
' n+ D" o0 D( L' W' _     if ( UF_initialize() != 0)
5 W, N7 v. {, |4 D" Q* s          return ( UF_UI_CB_CONTINUE_DIALOG ); ( N' H1 z" i' t: H
" G( L1 `8 {9 g! ]$ G3 a
   UF_UI_open_listing_window();
" x* z9 s: \1 i0 B
: {% \2 m; g) O4 V! g  value.item_id=MY_ITEM_LIST; / d. {! l% ?, S  z$ w
  value.indicator=UF_STYLER_STRING_PTR_VALUE; - a* R9 H2 P* M9 I; T. D% w% C
  value.item_attr=UF_STYLER_SUBITEM_VALUES;
$ d' p5 |) j$ {3 O3 c) n4 z" k  irc = UF_STYLER_ask_value(dialog_id, &value); * c' m+ w+ _, f6 c
for(i = 0; i < value.count; i++) 5 q# o1 ?6 \" b8 q% c4 e
  { 7 k4 @. ?& Y9 ]) q- ]/ ]
    UF_UI_write_listing_window(value.value.strings); * J. H/ [# ^( w) Z9 b- [, l8 Q
    UF_UI_write_listing_window("\n"); ! A. B9 Z  p/ ^  D. {6 z8 D
  }
   + ]  T! y7 o; d+ }& R: o7 Z
  UF_STYLER_free_value( &value );
5 l  N( q5 B$ V8 h
点击Ok后,所有的字符串显示在list window 中。& l2 F( R; z! Y/ n: u: u( i

清华书中uistyler部分的程序去掉了原来的注释,使得简单的事变复杂了。
9 Y$ x4 G; ~* a

* y# r. f+ z# _% R# e% V4 o我没有在ug/NX下开发。在18版中,建立VC工程时可以选择UG APPLICATION WIZARD,那么后面的设置就可以变简单了。 Lcfq

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

to eastcamel
; j8 H* R+ F7 R" H- w9 s' u.men
可以执行很多类型的可执行程序,比如.exe.dll, .dlg .macro
+ y7 B- |. {- N* u6 [) [
2 u' A; X9 U3 w7 O; D
action
没必要一定是my_first.dll,这是他给你的一个例子,如果你用UISTyler生成了my_first.dlg,那么你就可以在action后写上my_first.dlg0 T! r- Y' i7 C/ b) I

" p0 {* S  N8 c: Q' L& y# k$ l$ y1 |  a8 Q
: {. J& a- b) ^- [. T% I& ?2 A$ H# [to visionphone 7 E7 ~2 G5 Q% Q
论坛是交流问题的地方,不是教学,
: e0 K& u" P7 h* {

; e' W8 A& i( q. U6 w# A1 C# M关于menuscript开发下拉菜单,包括菜单的级联在清华那一本书上已经很清楚了,还能找得出比他更清楚的资料吗?另外menuscript已经简单得不能再简单了,还能找得出比他更简单的编程方法吗?

现在在试一个把物体平移的功能.我看了UG/open 里面的函数帮助,也仔细研究了清华出的那本书,他里面是先将所选对象的坐标矩正进行正则化处理,然后为正则化矩正给出一个新的ID,最后创建一个零时坐标系.然后就用uf5943,uf5947两个函数进行平移了. ' z2 R1 d5 N% J
而现在我自己做的时候,也采用上面相同的步骤,但我调试时发现我选取的对象没有矩阵ID,当然也就得不到坐标系统矩阵.我后面采用获取工作坐标系的ID,然后获取其矩阵ID的方法,但调试后仍得不到平移结果. 8 @+ N) ?7 q; S5 K/ D, |* z: u. j% Y
请指教:下面是我的一段代码;
1 g* S+ H- ~2 o) Ai_ret=UF_CSYS_ask_wcs (&wcs_id );
9 D: K( m; ~( j7 D3 g2 D  UF_CSYS_ask_csys_info (wcs_id,&matrix_id,csys_origin);
0 o" _: c, Q( u4 h& L+ v  UF_CSYS_ask_matrix_values (matrix_id,matrix_values); * C2 U/ p+ n% z( w
  UF_MTX3_ortho_normalize(matrix_values);
# g4 Q3 H+ `: n  i_ret=UF_CSYS_create_matrix(matrix_values,&new_matrix_id); ; H9 e8 ~+ V. b& V
  i_ret=UF_CSYS_create_temp_csys(csys_origin,new_matrix_id,&temp_csys_id);
, S' m2 Y  v. q4 |5 O
( y: {9 z7 O. r) R4 j6 r4 S  FTN(uf5943) (Dxyz,D_target );
1 C  }% k, V$ }! A  i  FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp); 7 _; t% n7 @8 @
8 ^+ E% t0 k. A: z5 R6 S
程序的前后两段好像没有什么联系?DxyzD_target在哪赋值?

平移的例子
* {8 C4 L" x& N9 L+ ^- J( O
1 W5 t& I+ s% ]

5 z) h) {4 Q* q) K9 Q. O' bdouble matrix[16];
, M3 I1 t# o/ q  T. g1 i! H, J- T1 Q  int count=1, copyFlag=2, layer=2, curveFlag=2, rtState; 6 k! t! x& T8 L" I( H; ]

' i5 a' g3 a. l+ O: T  UF_MTX4_identity( matrix );
* Q( s% l/ r. g) V! s  UF_MTX4_edit_translation( matrix, vec ); 7 g6 P0 u+ t9 m. c

2 }* _9 o. j3 I& B1 n  FTN(uf5947)(matrix, &srcObj, &count, &copy;Flag, &layer, ' h# ?" q) G; Q  C* e& d
        &curveFlag, copyedObj, NULL, &rtState);
; c# E# e) Q5 j4 S4 g4 d& z! F$ s5 O2 I; a, M  n
  return rtState;

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


6 n- }5 C8 U! ?6 p, j找到文件UGII\menus\custom_dirs.dat添加用户路径; @8 L* R) w, l+ `6 O& \

8 [2 E' p" R% Y) F3 k1 k# Customer modifications can follow on here
3 Z6 T6 j5 H3 i6 n6 ^0 y3 y
你的starup所在位置路径比如e:\project_insession\standard_part
0 [8 l  N8 J, D  V

5 B& {$ v9 g) Q! |也可以在UGII\ugii_env.dat内把#UGII_USER_DIR=${HOME}改为UGII_USER_DIR=你的starup所在位置路径比如e:\project_insession\standard_part

在平移的问题中,Dxyz是一个Input量,它定义了对象在x,y,z方向上的平移值。
) k7 s; ?$ I; w* L/ h8 b  N9 N* ]# w

. `; F0 g. x& a- q; _% o% }double Dxyz[3]={50,80,0};
: {7 N% E+ ]9 M: a# S% C6 }
至于D_target,它是uf5943函数中的一个输出量,是uf5947函数中的一个输入矩阵值,其中就包含了Dxyz定义的平移量。
* k! @1 D* X2 k% F- l1 [; L! ^

, A8 b' `: E$ `! l, FFTN(uf5943) (Dxyz,D_target );
% p( I7 r: r$ L  B  FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp); ' }! e& v% n5 g4 Q; O; o# |$ \% K
后来我跟踪调试了resp的值,显示为0,表示成功了。但我用UG里面的工具检查一点的坐标,却一点变化也没有。1 v. Y3 Y3 k2 z% V

5 d# M2 D7 |+ _& m2 j后来我调试了ZZZ兄的一段代码,发现copy是成功的,但我定义为move,即把UF_MTX4_identity( matrix ); ! E+ w& U  p% J& x5 B
  UF_MTX4_edit_translation( matrix, vec );
& j+ R0 P. _3 h" x% K# B) U7 X9 ]- H9 S6 }
  FTN(uf5947)(matrix, &srcObj, &count, &copy;Flag, &layer, / k, C& |& P9 t; F6 j
        &curveFlag, copyedObj, NULL, &rtState);
, e4 y; x: M3 D! @/ i
中的&copy;Flag设定为1,你的rtState可以为0,但对象object却没执行什么操作。6 c5 \) q; A0 Y9 K  P
5 s  x8 V3 s9 o
现在我想把我的object进行move(这个对象包含了blend,hole,extrude等特征操作),请问ZZZ兄有什么高招?0 k6 g* f' X  h6 p

+ e$ w$ u; I0 b现在我调试的程序可以对point,curve等进行操作了,但带参数的就不行。
0 h& _% I  n: n* ^* @; C, E

/ p( W- K9 ]6 f6 Q, \$ l
/ c; _4 o" z5 p( G$ s3 {3 d

关于平移的问题,受斑竹的启发,我调试了下面两个函数,同样可以对Object进行平移操作(只能copy而不能进行move ).
: x+ d% n! l% ]5 c8 Idouble Dxyz[3]={50,80,0};
% ]. D* n) A# Q  O  v  double D_target[16]; # Y; r6 ~7 X) x  {4 M" v
tag_t copy_object_id;
2 d% I% I) y; Q* d  E! ^  FTN(uf5943) (Dxyz,D_target );
7 q0 @, T4 F% m  FTN(uf5947)(D_target,Object_selected,&one,&two,&zero,&two,&copy;_object_id,NULL,&resp).

现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.
+ w$ z# V: ^: v+ y, M( F' ]uf_list_p_t cmtag; 0 e  p- S% E9 a9 C
int ug_type,ug_subtype; : x+ U6 x+ O  l) |& X9 a% G
int N_features; 7 o* Y. ]% C/ D8 `
i_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype ); / y/ u9 C* G: f+ U5 h) `' ~$ Y
  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object );
/ J5 y4 }+ P2 I2 @4 e6 R+ i  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag ); " t; [8 n8 q8 w0 M
  i_ret=UF_MODL_ask_list_count(cmtag,&N_features);
1 V  \' q7 T# q- ^) \% O0 a
但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?
) w* X6 x/ t: F7 z) A: f0 F
  l9 n) |% s+ S, S
下面的这张图片是我在交互界面下进行Transform时出来的警告信息.

; |6 P6 A6 B. b9 w; `" q

Knight74 wrote:8 o6 H9 w9 Z/ N+ I( g3 I( A# \, p
现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.
2 J$ ]: ^8 v$ ^& Q) R# P, huf_list_p_t cmtag;
1 e; `0 l5 S% m' K( [int ug_type,ug_subtype;
8 D1 X' x/ c* ]6 D) l/ W3 yint N_features; * O: P3 n0 H3 y
i_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype ); # `  u# k! `# K
  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&
body_object ); 0 S- a/ J) u$ D7 L9 M% h
  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag ); ( x; ]; f8 D# r" ~* p  J8 Y
  i_ret=UF_MODL_ask_list_count(cmtag,&N_features); 3 ]2 C/ k1 p$ N+ @- ^6 E
但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?
* p/ ]" G0 @3 E5 h+ k# N* F$ d0 C下面的这张图片是我在交互界面下进行Transform时出来的警告信息.

- N2 k. @; r( N. x  k4 Z

) z( k, h  n- {9 z% m+ Q+ p$ B9 m, K

2 Q, P3 i8 K7 m( ]& pbody_object
一定要初始化为NULL_TAG.

Knight74 wrote:) R. c, C+ n5 Z2 N: d  }0 f; Y7 M
请问斑竹,知道计算两个object之间的距离函数吗?这个函数可以计算两个object之间的最短距离。
5 T) B) q4 c) |8 L2 [2 Q: P! s/ D% }另外,感谢斑竹上面的提醒。今天有时间我把第3中在UG中平移物体的方法写上去。是通过移动特征来移动物体。

求助
3 m- u- ~8 b2 M6 e, b2 T3 X" I! l; j9 I0 B, O7 Y' _: p
//-------------------[6] Chamfer 4 edges of block2-------------------
  m$ o4 C+ E7 z6 T; ]2 C9 S, ^' f# Duf_list_p_t edge_list1,edge_list2;
7 ~" A  w7 h. q# j7 l" `( @5 Gtag_t chamfer_id,edge;
# }6 Y! N+ }/ t$ P* Kdouble end_point[3] =  {0, 0,0};   
- U/ r2 o8 z8 `* Odouble direction_z[ 3 ]= {0, 0, 1};
& P) h3 f" G2 e8 }
int dir_edge;
+ F  x$ a$ [+ m2 _; Tchar * angle1="45.0"; ; Y9 U* R7 Z# }1 O
int subtype=1,*is_parallel=NULL;
* O8 m% E! ~: R+ U: I. c  h# {UF_MODL_create_list(&edge_list1);
+ |7 g0 U0 {. w0 v( R9 iUF_MODL_create_list(&edge_list2); + r) O' p% c% x0 L
UF_MODL_ask_feat_edges (block2, &edge_list1 );
* V& g+ x9 _6 U; J2 u' M2 BUF_MODL_ask_list_count(edge_list1,&num);
$ J0 N7 E0 X: y: Sfor (i=0; i<num; i++) 4 A/ m) q! T2 D6 i4 R3 C
{ " T' Q9 H# \: {" X! d
     UF_MODL_ask_list_item(edge_list1,i,&edge);   `: p6 n- w4 t& s8 r$ c

" r& t8 o9 E: S4 \( O6 d6 p
$ c1 U" Q* q; @  E7 J- v0 T1 K& o
   UF_MODL_get_curve_edge_direction (end_point,edge,&dir_edge ); $ X* w0 T- e0 G$ E/ ^6 ^
* {& q. O6 T  X
   UF_VEC3_is_parallel(dir_edge,direction_z,0.0001,&is_parallel); 0 B& r9 w4 q3 F  f5 }- g
     if(is_parallel)
* X4 k% I7 w1 x  ?) r3 V: d" W& G# y0 z$ ^! N! d
9 S5 B$ _: q% h
   UF_MODL_put_list_item(edge_list2,edge); ( C: O% M/ i$ L7 H  {
   } # O( z- e3 ~) `6 V: x* {
( u& J# w0 J/ r) Q
   UF_MODL_delete_list(&edge_list1);   
) v) f! R4 {5 Y5 d9 S  DUF_MODL_create_chamfer (subtype, "2", "2", angle1,edge_list2,&chamfer_id); * h4 T/ L2 h5 t
   UF_MODL_delete_list(&edge_list2); : F- R8 E5 L7 U
3 q, `( J' I% a7 N/ {0 E7 i2 v
编译错误:error C2664: 'UF_VEC3_is_parallel' : cannot convert parameter 1 from 'int' to 'const double []' 6 Z4 |: k) \: t
请问用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,
( V" [- n, a; v5 J4 k) g" eint * direction );
4 z" O% ~4 w$ ~/ K% t1 j  H+ E, A+ u
double * end_point Input : The input endpoint
+ `# ~; ^% ~5 Qtag_t curve_edge_eid Input : The input curve or edge
: T0 Q# u$ D! O5 H0 O" j
int * direction Output : Ouput direction   @! Y/ {/ Q' o0 [( |+ `
- S- j- @2 j* M1 Q  `: s2 n! _
extern void UF_VEC3_is_parallel (const double vec1[ 3 ], const double vec2[ 3 ],
0 n% O! }2 X. u& @double tolerance,
% i( U1 J; i5 z9 r6 f! ]int * is_parallel );
- L% g7 G9 y2 D% A  H5 v$ W
8 W, L; b- r3 E
const double vec1[ 3 ] Input 3D vector
; F* D# Y/ P9 |- Q2 |3 q& w1 Wconst double vec2[ 3 ] Input 3D vector
5 c* V/ q" i5 n* ~double tolerance Input tolerance 1 P# E0 u; T" T  ], |0 R$ ?
int * is_parallel Output = 0 Vectors are not parallel ! R# B+ m0 p6 |6 t( F2 \, ^- Z
= 1 Vectors are parallel
+ u$ q4 A4 b  y3 n2 V9 Q5 s& I
" ~6 `7 }- q6 ~( I0 d. r
整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?

taiga2001 wrote:
5 Z/ p9 d3 p) ]. E+ mextern int UF_MODL_get_curve_edge_direction (double * end_point, tag_t curve_edge_eid,
3 r" q6 r0 E, f: l$ R3 P" x3 z+ Sint * direction ); . L5 z4 i4 {+ N  n  O( j
   3 J4 x8 A. b/ \1 v! N
double * end_point Input : The input endpoint
# g  e( h( |; h" p! u+ x# Gtag_t curve_edge_eid Input : The input curve or edge
6 B' E  H! p5 Y  @, d' T" O
int * direction Output : Ouput direction
$ D$ y: f" G. P2 O1 T6 u   , h  |' N6 g0 {# j! f
extern void UF_VEC3_is_parallel (
const double vec1[ 3 ], const double vec2[ 3 ], * h( c. O- U: g+ Q$ E5 ?- x" ]- M
double tolerance,
" c7 u% o1 H$ Lint * is_parallel );
+ o! b) g$ @* Z. I2 T, `   * o5 m; w* ]" u4 C
const double vec1[ 3 ] Input 3D vector 9 y6 d" C# U' g3 y" \" q- ]9 o9 y
const double vec2[ 3 ] Input 3D vector , M5 m) G. D4 X& U7 K
double tolerance Input tolerance
4 L+ l- D! B7 V9 e8 v& Q/ Qint * is_parallel Output = 0 Vectors are not parallel
$ Y5 \1 P$ X/ a5 Z9 H$ r: ]. X$ f) ]= 1 Vectors are parallel + ~6 }3 w( b$ [9 ^) H. w% t# c
   5 n' K* ^; X7 W9 t, ~/ J
整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?

第一个函数只是用来判断一个点靠近一条曲线的起点还是终点。+ J7 a1 A4 Q* b( C# K0 P
: Y* o# I5 \0 j) |5 r
第二个函数要求输入两个矢量。% t' D+ A/ r3 h/ J+ `; U6 B6 X

/ ~4 _: }" r, q得到边的方向可以,先得到边的端点:用UF_MODL_ask_edge_verts()

-------------------[6] Chamfer 4 edges of block2-------------------
6 k5 V' f$ _5 Q3 ~5 j   
) a" J& {' k  v1 M  e2 O   uf_list_p_t edge_list1,edge_list2; ) d% y+ `$ L8 A- @, R
   tag_t chamfer_id,edge;
& O2 z7 m. v( w+ c3 _   double point1[ 3 ]; 5 s7 b- r% N* `! ]5 A
   double point2[ 3 ]; ; Q0 V! ^; K6 R" G7 b
   char * angle1="45.0";
* A$ t- q2 ?6 [, \3 {% a6 P2 _, S   int subtype=1; . @, G0 R! F- F; P  q* C6 n
   int vertex_count=NULL; 6 X( {/ `, H! A( I1 U3 O# u4 C
   UF_MODL_create_list(&edge_list1); : t, A0 z4 V, R* H9 T8 U7 J
   UF_MODL_create_list(&edge_list2);
) b' {9 Z4 ~% ]( ^
  E6 l% Y1 s) P- \2 a   UF_MODL_ask_feat_edges (block2, &edge_list1 ); 7 H' |: Y5 l7 Y2 h2 `
   UF_MODL_ask_list_count(edge_list1,&num); 8 f5 R+ g. D8 }, v
   for (i=0; i<num; i++) 3 |8 w+ l! Y6 q% ~* p- ]
   {
* Y& B6 j) B8 t     UF_MODL_ask_list_item(edge_list1,i,&edge); ; o6 d7 U! ~# T$ L/ O, H3 a
     UF_MODL_ask_edge_verts (edge,point1,point2,&vertex_count );
3 p  S5 C0 |4 P4 f& ]! X
+ g/ n$ a: x! g! g     if(fabs(point1[2]-point2[2])>1)
9 h4 X$ c2 g& f0 k$ h   UF_MODL_put_list_item(edge_list2,edge);
( ]1 u0 m! @7 Y! N. `# @5 E   }
* K# m. C& d  }  W, a" o' y" O5 ?& Q2 G  H
   UF_MODL_delete_list(&edge_list1);
1 D; E3 |" e1 J: w  T* h% {3 v" k; k  P
   UF_MODL_create_chamfer (subtype, "2", "2", angle1,edge_list2,&chamfer_id); 5 B5 V2 D# e9 P' T& R. Y
   UF_MODL_delete_list(&edge_list2);

UGmove 物体的第三中方法,通过移动特征来移动物体。7 ?7 H0 ]- ?9 N8 i7 e' s) J
: q+ _' F" B7 m% O5 l: Q
double real_data[2][12]={0,0,0,1,0,0,0,1,0,0,0,1,50,80,0,1,0,0,0,1,0,0,0,1}; / ]& A% i2 W# j: a& \% d+ Q5 G
  int mode=CSYS_TO_CSYS; 1 x# @; I8 O6 a3 I  O, ~8 c5 l
  int N_features;
  r5 m( V0 b6 ]$ K; |  char features_num[100];
& u6 z- u8 A/ u  uf_list_p_t cmtag;
# h3 {) t$ O* |5 j1 e, E  i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object ); 1 v; L" U1 d3 n, K; @
  i_ret=UF_MODL_ask_body_feats (body_object,&cmtag ); 9 }) Z+ h8 ^3 z: g
  i_ret=UF_MODL_ask_list_count(cmtag,&N_features); ' n9 A( m; X- }: Q& I9 }

8 P* F' ?  Q+ d7 D  i_ret=UF_MODL_move_feature(cmtag,mode,real_data);

斑竹,我下面的程序是希望通过一个点,一个方向创建一个datum axis,我用" x1 q6 s  f6 [/ r( ]
* A5 V8 c* |: @! u! X$ v
i_ret=UF_CURVE_ask_point_data (dpoint,Datumpoint);
) b! m+ z: |/ j4 oi_ret=UF_MODL_create_fixed_dplane(Datumpoint,direction,&dplane); 9 ~0 R3 _! M  ~5 `  Q9 F  E4 v
i_ret=UF_SO_create_dirr_plane(dpoint,UF_SO_update_after_modeling ,dplane,flip,&Tdirection); $ R  O' ~  I: u3 `
i_ret=UF_MODL_create_point_dirr_daxis (dpoint,Tdirection,&daxis_tag );
& [6 `( y! C, K& S5 ?) x/ }
上面这几个函数先生成了一个datum plane,然后我定义了该平面的方向,
! E7 I( E5 t, y+ F, |1 O最后通过点,方向生成datum axis,其中,dpoint,Tdirection,&daxis_tag 这三个参数都是tag_t类型的,调试的时候最后一个函数出错,说是"internal error!",请问斑竹是何原因呢?

镜射特征中螺纹是否可见是不是由thread.include_instances =UF_MODL_INCL_INSTANCES控制? ) H' ^8 Z& c- z/ h  G, W; `
为何镜射【mirror】特征中原来的螺纹不见了? 2 d2 H8 y. K. ^  r9 X' k4 h+ c
//----------------------- Create boss-----------------------
/ p7 d2 `8 c, m! \3 ~" S9 q4 G* a: i     UF_MODL_create_boss(location1,direction,diam_boss,h_boss,angle,trim_face,&boss_id); 3 g  W9 ^) o9 {$ I/ n& q
/ S; U7 Q: H0 U! a5 h
//------------------- Create a thread on boss--------------------- 3 i2 `* u7 @' L3 c5 V' b1 n

" d' d) w9 r* o  ?* l; r//Get boss faces to use as start face and cylinder face of the thread
! M' J( y4 X7 [( y5 _- f8 c   tag_t s_face,c_face,thread_id;
- h* Y1 ~# r- t1 ?$ K! B   uf_list_p_t list; / |% O* R# \5 m# @& }0 s/ z

" q* B( X8 S2 \  _5 Z9 s& ^
/ v2 o# V+ b1 B' @   UF_MODL_create_list(&list); 1 E! ~6 z  q0 ~( |# i) U
   UF_MODL_symb_thread_data_t thread;
% y' i1 C* O  g( C% H2 F6 Y     UF_MODL_ask_feat_faces(boss_id,&list); 6 U7 }" ~3 z% ^" `4 J5 a8 B$ w
     UF_MODL_ask_list_count(list,&num);
6 X- d4 b6 g* r' N0 N  M$ i% K4 \  for (i=0;i<num;i++)
5 @+ {4 z* d7 a9 k, ~+ X  { 8 `' }  T/ U8 J' o8 |
    UF_MODL_ask_list_item(list,i,&face);
, o  G0 N. n4 B, ~- A, p0 @  j1 n! v4 x/ g% w& X
    UF_MODL_ask_face_data(face,&type,point,dir,box, 9 ?' N# |1 c) O" D# Y* X
                                &radius,&rad,&sen);
$ f6 w; ]) Z: t& H; C' T& b    if ( (type == 22) && (fabs(dir[1]-1.0)< 10e-7) ) " [1 c) c% k/ h3 h; F& V
     s_face = face; //start face + c7 y* B8 t& _# d$ t" n! J5 ^. _
    if (type == 16)
3 v  G- a" h; M3 t& K& z
      c_face = face; //cylinder face
: @  z' C. p- _! b" Q+ ~* s  }
+ S9 g& Y9 V! ^2 f) V. C& y+ Q  U  UF_MODL_delete_list(&list);
, M4 v+ j8 Q$ l) ^$ p2 Z
5 s! M5 N; k; [2 L( Y) n
//create thread
7 I+ w! F' _5 y- w9 t- R1 Z   char thread_length[10];
: f% r+ E! l9 v, D% C   thread_length[0]='\0'; , _9 _# Z2 k1 y  w8 n) R
   sprintf(thread_length,"%f",0.5*atof(L.value.string)-hi-2.0);
3 X3 C! R1 u: W3 i7 a1 k$ m" K' r/ z( W- u3 @, Q  q& n
     thread.cyl_face = c_face;
& h: H% v, R4 Z. z4 {     thread.start_face = s_face; 7 L& d' [7 g1 c) ^5 |1 S2 f! v- \+ j
     thread.axis_direction[0]=0;
4 m- l, Y/ _0 O" N7 j$ n) W, Y  Z     thread.axis_direction[1]=-1; ; \( ^5 C7 x% o* X" m! h" e
     thread.axis_direction[2]=0;
; o* r, {' i9 b* W
     thread.include_instances =UF_MODL_INCL_INSTANCES;   i/ k; a& G/ ?: a' Q) ]
     thread.rotation=UF_MODL_RIGHT_HAND; 7 W* A( M. {7 F" g& W
     thread.length_flag= UF_MODL_FIXED_LENGTH; 1 E' H2 k, t$ U) o
     thread.tapered = UF_MODL_NON_TAPERED; - T  k7 K/ R/ w& H8 I
     thread.num_starts = 1;
' ~6 u7 C  S* Q+ L7 l& h     thread.length=thread_length;
, ]% O. A4 L% B# d     thread.form = "Metric";
6 W& u* s5 z3 \7 k3 w     thread.method = "CUT"; 0 i/ X8 Y9 \: H# a. z* F. K
     thread.callout =callout;
+ Z" {( m2 k" z! T     thread.major_dia = "10";
* {6 }, u0 h3 W3 P0 e; s     thread.minor_dia = "8.917"; ( R& x, m$ a' ]9 z* j. W
     thread.tapped_dia = "9.813";
, ?! [' B7 p1 y% z7 n     thread.pitch = "1.0";
' j' Y2 F) f7 j9 c3 q     thread.angle = "60"; 5 s6 |9 V+ d2 s
     UF_MODL_create_symb_thread(&thread, &thread_id); $ s" w) X9 h( x9 g7 u
//-----------------chamfer edge of the boss--------------------------
6 v2 |0 E0 F* a# g; \. _, F
4 O0 N0 @4 O9 {( b. J( u( m' O   uf_list_p_t boss_face_edge_list;
& ?7 K4 y- F( O9 a   tag_t chamfer_id,mirror_obj;     5 j6 x" {; L. y  D) ~9 f
     UF_MODL_ask_face_edges (s_face,&boss_face_edge_list);
9 e; r% H6 g% i/ j7 c: Q0 h
. }9 x4 t& q0 g) P% x% ?2 l7 y7 j2 N& {! g5 z% Q+ f
     UF_MODL_create_chamfer (1, ".5", ".5", "45",boss_face_edge_list,&chamfer_id);
% O# c) d/ O) f& ^7 W6 d% m0 h) Z- C8 ]7 t9 @
   UF_MODL_delete_list(&boss_face_edge_list);
, v: K. _5 ?* e: J! K    UF_MODL_ask_feat_body(chamfer_id,&mirror_obj);
2 `2 y' v+ j" G1 |3 N
  k! E6 {/ J  r* M* ?5 [
//////////////////////////////////////////////////////////////////////////////////////////// " d4 X( M8 Y9 b- v
   ///--------------------create mirror feature-------------------------------------
" `7 d5 z& q& Z7 V2 q4 @0 o3 @
7 B+ F, M- ~3 Q9 B
double ctr_point[3] = {0.0, 0.0, 0.0};
2 X8 _! m- X5 F5 j6 m/ f  double directiony[3] = {0.0, -1.0, 0.0};
  T* O7 f) T- x4 r7 H  tag_t mirror_tag,dplane, mirror_body;
2 ~# V% O( M; T: ?7 `: }. V
$ q5 p: @' H) K# `$ A; r: \$ p6 y2 n% |# B3 ]8 y' v" M
//Create Datum Plane
) [' n; [' _: y# m; G  UF_MODL_create_fixed_dplane(ctr_point, directiony, &dplane);
0 L* O1 ]3 I% s5 Q- L/ ~
" `3 u: C; N+ E
5 S8 j* n9 T8 G: R! I8 [8 R
// Create a mirrored body
# Q( b! S( B% s
9 V% h1 Z/ j; |; F) ~! rUF_MODL_create_mirror_body(mirror_obj,dplane,&mirror_tag);
/ k) b( i8 C0 \+ K, u1 g5 t2 k' k; F" Q/ v# t' Y6 P
UF_MODL_ask_feat_body(mirror_tag,&mirror_body);
* p# ~% n& z. ]1 J5 |, I8 g; x4 j( e, Z7 i# ^

! d) q2 `8 Z1 u3 x//---------------------unite-------------------------------
' }, ]2 {& }$ X( k2 i

9 g5 _/ [% N* H8 J" ?5 K, R2 X; a8 z& F3 {$ N% [
UF_MODL_unite_bodies(mirror_obj,mirror_body);$ `8 j. M: M& T7 L' c  ?8 U: g

' |1 F/ K7 s  a8 f) ^% ~

没办法,只好又加了一段,在mirror特征上作多一次螺纹!
0 R. N/ l4 o, _8 G4 t  w# l
) A! A! m4 \* @% C9 t$ g

* t! D( ]4 t6 Z, Y% X  t//------------------------create a thread feature on the mirror boss----------------   }+ E6 M. n  u3 M* j
- F* M: |- U1 R; n" G
    UF_MODL_create_list(&list); 0 [! G( e) }6 p# h6 S) F$ a1 T& F
     UF_MODL_ask_feat_faces(mirror_tag,&list);
0 h* \( B3 z1 _6 S& k     UF_MODL_ask_list_count(list,&num);
! _& B8 \% c* b+ M2 g- N  for (i=0;i<num;i++) / C: f' A7 F% {' z
  { ! O& T* F9 C! K0 d9 ~
    UF_MODL_ask_list_item(list,i,&face); ' h3 i6 n9 [! u' `0 Y, X/ _

- p, L. T: q+ }$ x! s. q" J$ D! u" @    UF_MODL_ask_face_data(face,&type,point,dir,box,
  t$ |: B  |  A  j& Q                                &radius,&rad,&sen);
7 Z: h  N6 a- h& G. m6 r- |% u2 t    if ( (type == 22) && (fabs(dir[1]+1.0)< 10e-7) && point[1]<-10 )
& [  y+ J" i& _6 p! i     s_face = face;//start face 2 C' z' ^9 z2 s) |; L7 [
    if (type == 16) 2 x& D2 S% H  C6 m
      c_face = face;//cylinder face % A& a6 ?; E. o% E2 V1 D5 d
  } * Y3 T3 [7 E; \5 |
  UF_MODL_delete_list(&list); 5 _! h2 p- v# n' N0 ]0 ?
; e" }. r: M5 s
     thread.cyl_face = c_face;
3 f/ W- D" G4 Y     thread.start_face = s_face; ( c+ w: s1 M8 X; B$ J
     thread.axis_direction[0]=0;
9 Q4 _9 l% i* a. V: l     thread.axis_direction[1]=1; ) k2 {6 h9 f; V) ]  g3 `  [  ]
     thread.axis_direction[2]=0; 7 @/ h+ i5 N; ^5 o: b
     thread.include_instances =UF_MODL_INCL_INSTANCES; 2 T; a% ^. W% N
     thread.rotation=UF_MODL_RIGHT_HAND; 5 `8 D2 c# k( g+ R
     thread.length_flag= UF_MODL_FIXED_LENGTH;
$ ~; ]" X) M# {! B9 G. q0 e" [) K     thread.tapered = UF_MODL_NON_TAPERED;
3 `; x2 E( P# p4 Q! P8 H) w$ v+ x     thread.num_starts = 1; : q  [7 x8 P/ F# _. n
     thread.length=thread_length;
. D* v: n1 j3 E4 }     thread.form = "Metric"; ! n4 k) ]( t; L3 ]
     thread.method = "CUT"; 5 P) b; C  a' V% c+ \7 R
     thread.callout =callout;
" \. |8 ~, ]5 x7 x. o/ S     thread.major_dia = "10";
6 a/ g- ]# X& }" U( `; x- M     thread.minor_dia = "8.917"; 3 S1 ]. N9 J  b( ~$ Q0 F6 \2 P9 j6 l
     thread.tapped_dia = "9.813";
" ]4 U0 n. D, z     thread.pitch = "1.0";
! ^2 R7 V( ^& `4 B# W9 M     thread.angle = "60";
9 S9 K3 {( N4 s$ l0 x0 q     UF_MODL_create_symb_thread(&thread, &thread_id);* ^& e# X6 Q5 @. P1 M
斑竹你好.我现在已经明确的知道了我的part文件中两个实体对象的tag_t name.现在我想用UF_OBJ_cycle_by_name()这个函数来确定查询出来的tag_t是否和原来的一致, - l' a5 ]2 c% F* T  N2 z. V
tag_t name_tag=NULL_TAG;
" F8 q& ~+ ]1 S0 B0 W" r) M+ \  UF_OBJ_cycle_by_name (CM_name,&name_tag ); 1 U7 n9 K# U3 Z9 l
  while(name_tag!=NULL_TAG) ; q, h) T" p4 V+ Z& i) k% f+ r% `" L
  {
: x' Q8 g* p* m# X6 h: s2 [' o    UF_OBJ_cycle_by_name(AM_name,&name_tag); ; j4 e7 h) v+ c/ A
  } ' \/ r! D1 d2 L) l, z
当我给name_tag赋值时,函数返回也是为0,当我不赋值时,调试说我内存访问禁止.请问斑竹能否给点提示?谢谢.

我是一个刚开始学习ug二次开发的新手,马上机要进入课题,老板现在让我先看看UG/Open API 中的一些函数,由于是新手,在加上时间比较紧,囫囵吞找的看了一部分,有很多地方不是太明白,在这里先问几个让我很困惑的菜问题
) b& S& G: a) h, }- z4 U# d, W

3 v: y& o4 a  F7 P# e" B5 u很想得到zzz的帮助::(谢了先:))
& c3 Z+ S2 h( t7 b  q. c* m  ~

) B$ W: R! h( i他们是:
' |5 W0 k0 j+ y9 g" S6 O
, ^4 d9 i& s- u. m$ g3 x; S( A" r
1
ufstr()ufusr()的区别;
; p; E* g8 x. j/ q% I! H5 Y

( u& Q3 Q, g* p5 L5 O' J8 g1 B' i2
UF_UI_dismiss_dialog_area_2()对这个函数在看DOCUMENT时不是太理解, o" L3 G# U# U' J6 }& W: D) F. I; d4 O
7 g( l; c* \: g. I  ]8 J6 P0 m
不知道他和UF_UI_cancle_uf_dialog()的区别??5 |7 z: r( y$ W" r3 ]  a

, Y6 {: M% I0 r  P6 z1 M6 f3
UF_UI_get_DA1_coords()' W- a- V; p/ [

' @/ b3 e& ]0 T- |6 p' bUF_UI_get_DA2_coords
()着两个函数中DA1DA2具体指的是什么??以前在UG Documentation Help看到过但是现在找不到了,应为是新手好急啊!!!

zzz:
- D6 j+ ~8 w. H1 T我用你前面讲的回调函数的例子时,编译工程自动生成一文件 EH.H,然后就是如下:; J" }- S8 u: d) g

! g! n) f  R. j1 Je:\my_source\eh.h(33) : fatal error C1189: #error : "eh.h is only for C++!" 5 \3 m. d1 r* J7 G$ @$ O2 X) ^
这是在MSDN查到的,可是不知到如何修改下面的错误?请赐教,不胜感激!
% o* c3 _& ?- }8 B" H4 R. d$ b

- I) B7 G- P: u4 nFatal Error C1189
. |# l5 t; s3 d+ o' b+ `! L#error : user supplied error message 8 \# n' X' F! \- \
This error message is generated when there is an #error directive in the program. For example: 6 j; h# G8 z2 t7 g, t% i4 b2 {
#undef _WIN32 9 m1 N6 L7 T' h# ~# l& R: d% E

% U9 k& t3 }$ l' x+ X9 v% N#if !defined(_WIN32)
  T6 l9 h/ W: ^) _$ O$ ^  ~#error _WIN32 must be defined //error
) U% n' Y) X  b#endif 7 ~! J4 _' [" b# D# H5 B

) C2 @% u9 y$ x) i# w( F; Xint main() {
- G- Z; |& u# S7 S   return 0;
- A' {: R4 w9 i/ h! J# N} * M6 V' ~' s4 d1 |; {/ r6 b
EH.H中是:
+ o9 f$ L( V( N/ O* x  @. y
- A# k+ a# \8 }/ L8 ~( H# ?/ M4 ?
#ifndef __cplusplus ; G# ?9 _2 D8 ]
#error "eh.h is only for C++" //
有错误/ ~$ [8 R6 _8 \3 I& r1 h3 X" X
, H: T, Y, ^6 V8 M$ V
#endif * ~$ ~1 |! Y+ F7 h
这又如何修改?

找到 #ifdef MENUBAR_COMMENTED_OUT6 F% J2 d$ x( ^3 t( ]4 F. b  b4 E

. ]$ P  Y, N" I5 o
把它及对应的 #endif 删掉。

我用的也是UG NX 2 d/ x: b8 |; }7 ^% ^
"lindy.men"
如下:$ H  y9 f) O# E+ a, A0 b& M

( ^# G' j4 K/ p/ Y8 UVERSION 120 ' T  h' G; H4 t% D, g& p8 [3 E5 V
  EDIT UG_GATEWAY_MAIN_MENUBAR ( L! o" Z. w$ P4 R( b1 h, _$ m) ^
  BEFORE UG_HELP 3 Z. T& }5 \9 _0 {/ c
    CASCADE_BUTTON UISTYLER_DLG_CASCADE_BTN
% u" T# H# d# X. a  LABEL
启动对话
3 k" O6 _& |2 X

6 }- l9 Y5 g; ]  END_OF_BEFORE
* f) ?& I1 M" B# f% y- D
8 C5 U2 T' }6 \  MENU UISTYLER_DLG_CASCADE_BTN
; c- M% }* ]; G4 E    BUTTON SEQUENCEPLAN_BTN
) }. V. L" ?1 w2 \+ v- e8 o    LABEL
应用菜单
# H/ Z0 \8 N6 P* O  I- }
; C9 [$ s% ?- b  f& w9 B/ ~
    ACTIONS yulu.dlg
5 ]# U  H: \1 ^) P2 D/ A4 J  END_OF_MENU ) F1 @% ?- E7 k6 J; l# I- d
lindy.men
文件放在D:\Unigraphics NX\UGALLIANCE\SITE\startup目录下
  F2 [5 T1 V, D9 s7 T" c6 {8 e: ^) O

2 C' d/ Z8 P9 u- G' }yulu.dlg
文件放在D:\Unigraphics NX\UGALLIANCE\SITE\application目录下
6 P- u" a, H  h& w' p

, J5 h2 g! t3 l8 x0 t如果没有程序源代码,而只有*.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 | 显示全部楼层
谢谢!!!4 ?3 U( P" k# m. r: _* M8 f. ?& Y8 y
好好学习。
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 06:35 , Processed in 0.068883 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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