UG二次开发

更新时间:2024-05-01 12:50:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1。建立两个目录。

/ J9 F Q! T9 \\9 r1 D1 t7 n& Q7 k! ^2 _$ O# q4 M6 J

建立第一个目录 E:\\my_first_UG,在这个目录下建立两个新的目录:E:\\my_first_UG\\application和E:\\my_first_UG\\startup。

建立第二个目录E:\\my_source,用存放你的源代码。

2。设置环境变量。

3 P& m; A: ~! M# _(

再Windows中设置一个新的环境变量:UGII_USER_DIR=E:\\my_first_UG。

3。打开UG,进入UIStyler应用(在Application菜单的最后)。 4。设计一个对话框。

1)在\一栏填入:First Dialog,按Apply(每次输入完成后,都要按Apply,为避免啰嗦,以后不再提及)。

2)在\一栏输入:%??%¥%¥¥##*%*(*(*—*—((,什么都行,呵呵。

% O* p+ \\2 V: a6 w* }/ l8 ~6 {. n$ f. s7 V) H I5 [' ; I+ o [2 D6 F, o* [/ Z* \\& X

5 i1 I# _+ ^, B# k3)在\中,把CHANGE改为MY。

4)加入四个控件。String,Push Button,Label和Single Select List

: }3 M4 |+ \\) Y, p ~! h& k

编辑对话框的各个控件。

K8 \\! l5 G3 m% h2 d1 U3 a) L

7 T0 z; H! S\f6 F2 l& N1)改变String控件的标题,标识和长度。

+ v) [) t: `) E O8 {

Label “String” -> “Input an item”. Identifier \ Width in... 0 -> 20

) E( T% d- r+ s. i\

2) 改变Push Button控件的标题,标识和回调函数的名字。

& n3 D1 e% S\h/ Q

# W. j; `7 z& m' V& ALabel \

Identifier \ callbacks \

把\激活。

0 X' `# n' g; X' r, J* \\2 [

3)改变Label控件的标题和single select list 的标识。改变single select list可见项的个数。

7 `7 s& g( P2 G/ W, V4

/ L# L% T1 H( Z1 Z6 S- ?% d# FLabel Label -> Items List

Identifier \ Number 3 -> 6.

}9 y5 v# C' j% C( e! i- C6 y8 w% |

6. 保存对话框。

9 t$ G d% P3 y0 a m4 B6 b# d P! F6 n( L, e6 p( c: N8 ~

6 U* ~0 H8 w, S j点击save图标,把对话框保存在E:\\my_first_UG\\application目录下,文件名位first_dlg,生成三个文件。

$ Y# d. v5 r7 G( V-

(现在可以推出UG乐)。

7。建立一个vc的工程。

) w4 b8 v2 k! [9 v- X6 u9 s! |& W, W# p, T5 m

5 U9 T* s2 o. a5 ?: P

1)把\\application下的*.c和*.h文件移动到E:\\my_source目录下(文件可以改名字)。

( ?: c\

. T$ B$ x1 y0 r6 T* ~& `1 O3 |2)建立一个新工程,选择Win32 DLL。

3)把c源文件和头文件加入到工程中。

8。设置vc的环境。

1 ]/ v4 \\. G6 v3 b; E) n

Project -> Settings -> C/C++ -> Category ....加上头文件。

Project -> Settings -> Link....

改变输出文件名,加入连接库文件(ug17之前的库名字不同)

Tools ->Options...->Directories

! Q( w: j& k! |' n( E7 V: E' K. @9 j6 {4 a\

Include files 和 Libray files 加入UG UFopen的路径。

打开first_dlg.c文件,找到menu script样板的位置。

复制这个样板到一个空的文本文件。

3 ]4 o- T% f\ }

把文件保存到E:\\my_first_UG\\startup目录下,文件名位first.men(注意后缀)。

找到 #ifdef MENUBAR_COMMENTED_OUT,

: X- L$ e! Q5 G# i8 n$ Q' G- Q) w* b\0 \\2 P6 N\

把他和他对应的 #endif 删掉。

找到#ifdef DISPLAY_FROM_USER_EXIT,

把他和他对应的#endif删掉。

# z E& i* k0 @3 | a% B X% J7 j& x! w* Y* ~ c* S$ f

找到 , 把它改为ufusr。

现在可以编译连接,试一下了,呵呵。

0 [0 [( @6 h, M1 w6 F4 X,

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

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

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

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

5 y6 K1 Y- G: N, T* ~. i' G\

好吧,下面将一下这些回调函数的应用。

) ?6 w9 x# z: ~. T5 U |6 W2 h5 @; u( F

; A3 x- [) B; w

Apply_c,Ok_cb和cancel_cb分别是点击OK, APPLY和cancel按钮时,执行的动作,它们的应用在后面的例子中介绍。

) U9 t, x4 f' M6 R! S& m' ~

8 l$ Q8 D4 B$ [* b$ W: o& L: Fconstructor 和 Destructor本分别是对话框显示之前和退出之后执行的动作。

4 b' m& Y- ]* w0 `; J% B'

在对话框显示之前,可能需要进行很多操作,譬如说:设置对话框的选择方式,就是说在对话框打开后,用户可以选择什么物体,面,实体等。

5 I2 D2 u5 Y7 \\5 ?5 4 I6 N4 |$ |/ M) N\p8 V$ C/ I

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

$ t$ d9 n, c2 z' ]0

添加回调函数。

2 G5 @0 R4 v\[/ H9 ]/ ?#

首先进入UG,UIstyler,打开前面生成的对话框first_dlg.dlg,在相应的位置添加几个回调函数的名字(每一个都要回车或按Apply)。

. q5 z( L+ b+ p0 W

5 Q- o- Z2 ~& m+ p- ?cancel_cb

construct_cb destruct_cb ok_cb

% m3 d C/ t2 X/ ~4 L, k' ^

5 d# N1 O. z4 ~+ V为“Input an Item”田家一个回调函数input_cb。

/ _ J; U7 O% u% c. r; E/

保存后,退出。

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

ZZZ斑竹辛苦了!

, R; d$ J0 J& N: K% T- b% M+ e% O

小弟正要搞一个UG二次开发的项目,以后有问题还请多多指教了:)

h& a( o! y1 k& ^! C, l

请问工具Araxis Merge哪里可以得到,可以简单说一下怎么用的吗,我VC还不太熟,谢谢

我的EMAIL:wgwang_sz@163.com QQ:43801603

打开first_dlg.c,找到construct_cb的位置,在其中添加以下代码。

- j, ~. G0 E7 W n R\N0 e8 y+ s

int MY_construct_cb ( int dialog_id, void * client_data,

* R# |) H g8 n' ~/ g- |

) Q- ^# g7 E8 C L' C* k0 k UF_STYLER_item_value_type_p_t callback_data) {

1 a# @- O: ~3 W+ A+ i

int irc;

UF_STYLER_item_value_type_t value;

$ J6 B# p! x t: J\ char string[133] = \

\

/* Make sure User Function is available. */ if ( UF_initialize() != 0)

return ( UF_UI_CB_CONTINUE_DIALOG );

+ v# n9 q* l. h4 r; x! t9 e2 p. o# K\

value.item_id=MY_ITEM;

value.item_attr=UF_STYLER_VALUE; value.value.string = string;

0 C0 b\b9 n& D) _

irc = UF_STYLER_set_value(dialog_id, &value); if(irc) {

char message[132];

$ j, Q6 n9 M$ l; l3 v: f\

8 V2 A; ~; {/ k$ h/ L9 f UF_get_fail_message(irc, message); }

1 X) v\

1 j1 f% b. Y2 s& ?( v! y# {$ r

UF_terminate ();

找到input_cb的位置,假如下面的代码。

int MY_input_cb ( int dialog_id, void * client_data,

UF_STYLER_item_value_type_p_t callback_data) {

- L4 T0 e% ~. ]4 i7 J& A9 [5 E* J% F\/ x8 C\' Z$ U4 x: f4 B1 ^9 P& ?

UF_STYLER_item_value_type_t value;

+ Z; f- d5 d9 Z int irc;

( _( {) g+ n5 }( [! C% a

6 x7 K: y: D) r+ P- f. r+ ~5 q char string[133];

5 ]# v$ @ \\5 f) n- W& {

5 l5 }/ _+ q6 {+ `, l /* Make sure User Function is available. */ if ( UF_initialize() != 0)

/ v1 O* b& d; f; j9 G

return ( UF_UI_CB_CONTINUE_DIALOG );

$ |- Y! P2 |9 U8 o$ ~0 M8 S

, V: E: R8 a- S+ f6 `) ?8 {3 o6 @ /* read your input */

2 H% k! `8 W* ^$ I' N/ s value.item_id=MY_ITEM;

. X6 O# L7 }0 s- O value.indicator=UF_STYLER_STRING_VALUE; value.item_attr=UF_STYLER_VALUE;

' a7 G' n+ V4 V4 V UF_STYLER_ask_value(dialog_id, &value);

! n0 U% E) ^( w$ S$ ]/ }3 {

+ k, w$ j& Z) ^3 w5 [- h, o strcpy(string, value.value.string); UF_STYLER_free_value(&value);

/** add it to the single list */ value.item_id=MY_ITEM_LIST;

; A1 g3 [ ^; q9 |8 |, j8 K

value.item_attr = UF_STYLER_LIST_INSERT;

2 r- f& N! K! y. n/ f6 b1 P

value.subitem_index = UF_STYLER_NO_SUB_INDEX; value.indicator = UF_STYLER_STRING_VALUE; value.value.string = string;

irc = UF_STYLER_set_value(dialog_id, &value); if(irc)

9 X8 `, b) y- A' X1 j, ]- E& b8 a) Z# _+ R. c2 ~- m+ i$ I; k: p' Y& ?. h/ |) a% S7 z

{

char message[132];

/ ?, @/ S9 n2 G4 y* T0 f I

[% h+ A; O; x' X/ w, T UF_get_fail_message(irc, message); } UF_terminate ();

4 ~& D* a* `1 x. f$ h

再ok_cb假如下面的代码。

/ _5 [% `! A4 S; b

9 S0 o) U. r4 {- ^. r; M* Z! _) Iint irc, i;

3 X# W3 }% c4 k/ k5 l W( A. }7 p UF_STYLER_item_value_type_t value;

/* Make sure User Function is available. */ if ( UF_initialize() != 0)

5 a5 b4 \\$ Z! U6 J* u! P+ P6 v1 Y9 p% T* \\$ c- c) s$ I

- o( q, Q( q' I& z- u! C# l return ( UF_UI_CB_CONTINUE_DIALOG );

2 v8 ]1 g- b, M* f( o) ]; Y; E6 D

UF_UI_open_listing_window();

value.item_id=MY_ITEM_LIST;

\

/ q* m9 K' g0 H' @$ O, n value.indicator=UF_STYLER_STRING_PTR_VALUE; value.item_attr=UF_STYLER_SUBITEM_VALUES; UF_STYLER_ask_value(dialog_id, &value); for(i = 0; i < value.count; i++) {

, n+ Z0 `: P b4 L+ |, d! k8 @

UF_UI_write_listing_window(value.value.strings); UF_UI_write_listing_window(\ 6 M' R5 ^; ]/ n* D, i} 8 I1 q' `! u. K! h* y UF_STYLER_free_value( &value ); UF_terminate ();

至此,我们介绍了几个回调函数的简单使用方法,下面看一下运行结果。

/ i+ s- g7 M4 R; E$ M( ~% A) l: x$ z w6 ?. b$ k

刚打开对话框的结果。

输入一个字符串,回车。它显示在下面的single list中。

对不起,a minor change on code. int MY_ok_cb ( int dialog_id, void * client_data,

& s8 W6 y6 F, u( B0 K* n! f7 {\

UF_STYLER_item_value_type_p_t callback_data) {

9 {9 [3 l9 d% n* z( C

5 S/ V2 T* z9 d& \\9 Q# O int irc, i;

$ V4 B* V. a4 e UF_STYLER_item_value_type_t value;

/* Make sure User Function is available. */

, E1 G' U1 O7 G if ( UF_initialize() != 0)

! K7 r( u) R+ ^0 n8 }$ [' [/ u

return ( UF_UI_CB_CONTINUE_DIALOG );

8 l& v5 B/ r/ y\

7 D4 J O( _# l( _ UF_UI_open_listing_window();

4 T3 O2 t: y8 [2 @

1 z: m- K' m2 l value.item_id=MY_ITEM_LIST;

value.indicator=UF_STYLER_STRING_PTR_VALUE; value.item_attr=UF_STYLER_SUBITEM_VALUES; irc = UF_STYLER_ask_value(dialog_id, &value); for(i = 0; i < value.count; i++) {

/ K4 p4 l) J; L; u- p) q j

# Y. W4 j$ E, _1 ^% O\ UF_UI_write_listing_window(value.value.strings); UF_UI_write_listing_window(\ } 5 K. q: q9 k\ UF_STYLER_free_value( &value ); 点击Ok后,所有的字符串显示在list window 中。

( R' t& }5 M5 @7 R清华书中uistyler部分的程序去掉了原来的注释,使得简单的事变复杂了。

8 l! k. m# \\% s. @7 [; F/ `2 U

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

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

to eastcamel

.men可以执行很多类型的可执行程序,比如.exe,.dll, .dlg .macro等

( F) C1 o) c/ f& K) z3 H& J4 {+ O+ L% o

action没必要一定是my_first.dll,这是他给你的一个例子,如果你用UISTyler生成了my_first.dlg,那么你就可以在action后写上my_first.dlg。

1 G* m% P, K/ O1 ]$ I8 V: z5 p* b* Q2 o& t9 u0 c

; g8 p\to visionphone

论坛是交流问题的地方,不是教学,

7 y- x8 p) h; }1 h9 k e# a. `: r- u F9 A8

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

现在在试一个把物体平移的功能.我看了UG/open 里面的函数帮助,也仔细研究了清华出的那本书,他里面是先将所选对象的坐标矩正进行正则化处理,然后为正则化矩正给出一个新的ID,最后创建一个零时坐标系.然后就用uf5943,uf5947两个函数进行平移了.

而现在我自己做的时候,也采用上面相同的步骤,但我调试时发现我选取的对象没有矩阵ID,当然也就得不到坐标系统矩阵.我后面采用获取工作坐标系的ID,然后获取其矩阵ID的方法,但调试后仍得不到平移结果.

@( Z. N) N0 K8 1 Z; e, A!

, y q; Z1 x1 }6 K$ B3 d请指教:下面是我的一段代码;

i_ret=UF_CSYS_ask_wcs (&wcs_id );

UF_CSYS_ask_csys_info (wcs_id,&matrix_id,csys_origin); UF_CSYS_ask_matrix_values (matrix_id,matrix_values); UF_MTX3_ortho_normalize(matrix_values);

i_ret=UF_CSYS_create_matrix(matrix_values,&new_matrix_id);

i_ret=UF_CSYS_create_temp_csys(csys_origin,new_matrix_id,&temp_csys_id);

. x( _5 \\5 j2 @5 X1 Z- e) i; o1 h% M, M/ h# [( A! [

FTN(uf5943) (Dxyz,D_target );

FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp);

* W3 N1 P, u\, c( |1 y1 b. q$ Z# H6 t* {

程序的前后两段好像没有什么联系?Dxyz和D_target在哪赋值?

平移的例子

) l1 \\. g8 R; R: J, }% P; l8 U( ` O& R5 @5

\double matrix[16];

+ D' f' _) X+ h* y* Q' N

+ B3 a! f$ \\: i+ L8 R$ ~% i int count=1, copyFlag=2, layer=2, curveFlag=2, rtState;

+ W% ?; y5 S& d; t+ {% ]) ~

m! p2 H! v6 W U/ Z0 F2 b2 K0 W- J+ m UF_MTX4_identity( matrix );

UF_MTX4_edit_translation( matrix, vec );

FTN(uf5947)(matrix, &srcObj, &count, ©Flag, &layer,

) T6 A1 ?) A\ &curveFlag, copyedObj, NULL, &rtState);

return rtState;

. B' M1 h) t+ ~: D) W% h

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

找到文件UGII\\menus\\custom_dirs.dat添加用户路径

' z7 Y% H& e, q+ A# s* x& e: V7 l6 w! U9 e

- h5 ^! q& V2 }7 W# Customer modifications can follow on here

你的starup所在位置路径比如e:\\project_insession\\standard_part;

# U- r. h4 s4 E6 f*

也可以在UGII\%ugii_env.dat内把#UGII_USER_DIR=${HOME}改为UGII_USER_DIR=你的starup所在位置路径比如e:\\project_insession\\standard_part。

在平移的问题中,Dxyz是一个Input量,它定义了对象在x,y,z方向上的平移值。

double Dxyz[3]={50,80,0};

至于D_target,它是uf5943函数中的一个输出量,是uf5947函数中的一个输入矩阵值,其中就包含了Dxyz定义的平移量。

. C. @: h; I6 h0 T$ V1 ?6 {

FTN(uf5943) (Dxyz,D_target );

FTN(uf5947) (D_target,&temp_csys_id,&one,&one,&zero,&two,NULL,NULL,&resp);

- U# ]# {$ s# `0 后来我跟踪调试了resp的值,显示为0,表示成功了。但我用UG里面的工具检查一点的坐标,却一点变化也没有。

; L( c+ H+ b1 @$ _0 {4 E4

后来我调试了ZZZ兄的一段代码,发现copy是成功的,但我定义为move,即把UF_MTX4_identity( matrix ); UF_MTX4_edit_translation( matrix, vec );

9 v8 k7 d v- o( h! }

FTN(uf5947)(matrix, &srcObj, &count, ©Flag, &layer,

, p! f* @8 o: | &curveFlag, copyedObj, NULL, &rtState);

& z# }; C' y5 ^1 R' Q' }

n\x& `5 U6 E中的©Flag设定为1,你的rtState可以为0,但对象object却没执行什么操作。

现在我想把我的object进行move(这个对象包含了blend,hole,extrude等特征操作),请问ZZZ兄有什么高招?

& H0 `# b w8 h. \\2 c% t

现在我调试的程序可以对point,curve等进行操作了,但带参数的就不行。

, r1 d0 n+ ~; u5 m\

关于平移的问题,受斑竹的启发,我调试了下面两个函数,同样可以对Object进行平移操作(只能copy

而不能进行move ).

' K4 }( v9 u' j# [+ o\

double Dxyz[3]={50,80,0}; double D_target[16];

/ v. B! C. @1 ^tag_t copy_object_id;

\

4 R) ~2 ^4 n' \\) \\. t FTN(uf5943) (Dxyz,D_target );

FTN(uf5947)(D_target,Object_selected,&one,&two,&zero,&two,©_object_id,NULL,&resp).

现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作. uf_list_p_t cmtag; int ug_type,ug_subtype;

: h Q; R) h9 nint N_features;

9 n) a$ H6 J6 i3 Y! S m/ M/ T

) C: J5 m* h4 m% M1 Ki_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype ); i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object ); i_ret=UF_MODL_ask_body_feats (body_object,&cmtag );

. X( U$ f4 G- [2 e

i_ret=UF_MODL_ask_list_count(cmtag,&N_features);

但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?

& N1 }3 x/ k8 u4 }$ M ?$ 7 y: |, D. b' ?) R

下面的这张图片是我在交互界面下进行Transform时出来的警告信息.

Knight74 wrote:

9 W; W7 @2 z! f+ s现在我调试我的程序发现不能进行move 操作之后,和我的同学讨论了一下,他的意见是复杂的物体带有了

许多参数,如果要把带参数的整个Object进行move操作,之需要把根feature进行平移,而其他的特征会自动跟着平移.下面着段程序就是要获得根feature的操作.

! _' X4 A%uf_list_p_t cmtag;

\@ d) G- F8 @- ]

int ug_type,ug_subtype; int N_features;

]% y, R- R( W/ q8 K/ a+ D U

i_ret=UF_OBJ_ask_type_and_subtype (*Object_selected,&ug_type,&ug_subtype ); i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object ); i_ret=UF_MODL_ask_body_feats (body_object,&cmtag ); i_ret=UF_MODL_ask_list_count(cmtag,&N_features);

\Z0 w C1 {' \\& r% T\

但进行调试时候.老是cmtag的值为空,请问斑竹对这几个函数熟悉不?

5 f, e) ~: n! c6 |) m: S* ?9 k

下面的这张图片是我在交互界面下进行Transform时出来的警告信息.

; W: ~$ o. T9 t3 e' d

. @* n- y- N6 ~1 _3 b$ I9 ^

body_object一定要初始化为NULL_TAG.

Knight74 wrote:

\ q0 N0 r2 p) d请问斑竹,知道计算两个object之间的距离函数吗?这个函数可以计算两个object之间的最短距离。 另外,感谢斑竹上面的提醒。今天有时间我把第3中在UG中平移物体的方法写上去。是通过移动特征来移动物体。

求助

$ t+ I) b6 ^8 M& d. k0 E5 u4 H' E! K. K% e3 \\

//-------------------[6] Chamfer 4 edges of block2------------------- uf_list_p_t edge_list1,edge_list2; tag_t chamfer_id,edge;

+ E& V R: `4 u! N7 a0 X/ A\

8 C4 R% d2 j4 V, e8 s4 _double end_point[3] = {0, 0,0}; double direction_z[ 3 ]= {0, 0, 1}; int dir_edge;

char * angle1=\

int subtype=1,*is_parallel=NULL;

1 g( W$ D1 {9 n1 Y& l6 W( ~8 A

UF_MODL_create_list(&edge_list1); UF_MODL_create_list(&edge_list2);

UF_MODL_ask_feat_edges (block2, &edge_list1 ); UF_MODL_ask_list_count(edge_list1,&num);

6 M/ w# l& n\! Y9 d3 ]; |% H: }8 ^

for (i=0; i

UF_MODL_ask_list_item(edge_list1,i,&edge);

6 b% w% T$ F\, [0 |% K% B x) l7 G* B3 H* C( r; e+ a

3 e2 ^; N% ]: y1 b. f

9 n% w' f' X# V; a: s UF_MODL_get_curve_edge_direction (end_point,edge,&dir_edge );

UF_VEC3_is_parallel(dir_edge,direction_z,0.0001,&is_parallel); if(is_parallel)

+ s+ J( d4 q- U' x1 c$ ~: F/ ?/ C4 K% R6 K

UF_MODL_put_list_item(edge_list2,edge); }

* h/ r$ k6 c Q0 L/ \\2 l

3 L# F' r) T& O. c* @: X, d UF_MODL_delete_list(&edge_list1);

4 ^\$ ]# H! QUF_MODL_create_chamfer (subtype, \ UF_MODL_delete_list(&edge_list2);

9 ~) z. _; n4 m, N

编译错误:error C2664: 'UF_VEC3_is_parallel' : cannot convert parameter 1 from 'int' to 'const double []' 请问用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, int * direction );

double * end_point Input : The input endpoint

1 R, h W e. m7 T6 u- q0 D; L; a0 J( X. B) t, t$ K6 e8 ~9 m5 K. L- O i7 a l# h6 G; F

3 k4 g\tag_t curve_edge_eid Input : The input curve or edge int * direction Output : Ouput direction

extern void UF_VEC3_is_parallel (const double vec1[ 3 ], const double vec2[ 3 ], double tolerance, int * is_parallel );

const double vec1[ 3 ] Input 3D vector const double vec2[ 3 ] Input 3D vector double tolerance Input tolerance

- k& {' R/ @6 a& S5 d8 P& }, s4 O/ [/ I5 m0 P/ Y9 ^7 ?( R\/ B( d/ b8 y: _# L1 O6 g

int * is_parallel Output = 0 Vectors are not parallel

= 1 Vectors are parallel

\0 r2 i$ a/ H/ o9 Y# _, x. ]% r& p: x: Z. x) p

整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?

taiga2001 wrote:

/ w; {' Q/ ]8 x, t9 m! A

( U6 o' z/ p; bextern int UF_MODL_get_curve_edge_direction (double * end_point, tag_t curve_edge_eid, int * direction );

N, i1 S) _7 Odouble * end_point Input : The input endpoint tag_t curve_edge_eid Input : The input curve or edge int * direction Output : Ouput direction

extern void UF_VEC3_is_parallel (const double vec1[ 3 ], const double vec2[ 3 ], double tolerance,

6 v( T* ]- z\% H5 S4 A6 h+ A' W\! P%u7 I1 e. W# L5 q2 J

int * is_parallel );

H( V& l/ Q9 ], d3 q* x

$ I T$ z( V5 v+ n4 X+ G, c- ^const double vec1[ 3 ] Input 3D vector

const double vec2[ 3 ] Input 3D vector double tolerance Input tolerance

int * is_parallel Output = 0 Vectors are not parallel

\= 1 Vectors are parallel

0 {) ^8 O4 ~; K整型指针变量,取出后在UF_VEC3_is_parallel()]中如何用?得到block边的方向是否有别的函数?

第一个函数只是用来判断一个点靠近一条曲线的起点还是终点。

2 Y o6 x% H)

第二个函数要求输入两个矢量。

得到边的方向可以,先得到边的端点:用UF_MODL_ask_edge_verts()

-------------------[6] Chamfer 4 edges of block2-------------------

9 t; ]\1 _% A7 V; V$ j( h\

uf_list_p_t edge_list1,edge_list2; tag_t chamfer_id,edge; double point1[ 3 ]; double point2[ 3 ]; char * angle1=\

' \\3 X) h' O$ i/ ~9 a' m; e- f. X( V. |. Q1 W9 C; [1 \\* z }( T# K8 w* I% [0 m% ]5 u4 `$ k$ D) O

int subtype=1;

: T6 L5 b& D% p, O* W

int vertex_count=NULL;

UF_MODL_create_list(&edge_list1);

) L* \\) ^+ x( i7 I. n. U

UF_MODL_create_list(&edge_list2);

UF_MODL_ask_feat_edges (block2, &edge_list1 ); UF_MODL_ask_list_count(edge_list1,&num); for (i=0; i

UF_MODL_ask_list_item(edge_list1,i,&edge);

\& n\4 R: z$ z% Y! O V X1 ^. b* s\

UF_MODL_ask_edge_verts (edge,point1,point2,&vertex_count );

if(fabs(point1[2]-point2[2])>1)

0 V7 d' S& c2 y) c. | UF_MODL_put_list_item(edge_list2,edge); }

UF_MODL_delete_list(&edge_list1);

1 ~\! q% ~/ e5 z U* U. M( S* k8 [( U* C+ ^6 n' w) g

UF_MODL_create_chamfer (subtype, \ UF_MODL_delete_list(&edge_list2);

在UG中move 物体的第三中方法,通过移动特征来移动物体。

2 H c' w' q b5 f5 X' B N# V3 k0 O- \\; D* ?( n

5 J8 s* H5 Y\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}; int mode=CSYS_TO_CSYS; int N_features;

! |9 u5 ^5 F3 \\& `, X; {9 D0 X

! N8 q& ^# k7 L( V( R9 K\ char features_num[100]; uf_list_p_t cmtag;

3 Z, L0 v. O# M

i_ret=UF_MODL_ask_object (ug_type,ug_subtype,&body_object ); i_ret=UF_MODL_ask_body_feats (body_object,&cmtag ); i_ret=UF_MODL_ask_list_count(cmtag,&N_features);

! F9 D* z, N, n' O9 c: j# Q# ?, R3 K- d' u1 ?! j( b6 J

i_ret=UF_MODL_move_feature(cmtag,mode,real_data);

斑竹,我下面的程序是希望通过一个点,一个方向创建一个datum axis,我用

$ X( b) U\

7 D- V- h6 H\i_ret=UF_CURVE_ask_point_data (dpoint,Datumpoint);

i_ret=UF_MODL_create_fixed_dplane(Datumpoint,direction,&dplane);

i_ret=UF_SO_create_dirr_plane(dpoint,UF_SO_update_after_modeling ,dplane,flip,&Tdirection); i_ret=UF_MODL_create_point_dirr_daxis (dpoint,Tdirection,&daxis_tag ); 上面这几个函数先生成了一个datum plane,然后我定义了该平面的方向,

最后通过点,方向生成datum axis,其中,dpoint,Tdirection,&daxis_tag 这三个参数都是tag_t类型的,调试的时候最后一个函数出错,说是\请问斑竹是何原因呢?

镜射特征中螺纹是否可见是不是由thread.include_instances =UF_MODL_INCL_INSTANCES控制?

a\ L4 o) l+ g;

( Z0 a; a- \\. M( @: E- o/ o/ x为何镜射【mirror】特征中原来的螺纹不见了?

//----------------------- Create boss-----------------------

UF_MODL_create_boss(location1,direction,diam_boss,h_boss,angle,trim_face,&boss_id);

! U1 `5 r' N) h) }1 a0 k }% ]% e) k% g

6 a2 A! \\* S3 @. v3 @+ p* b//------------------- Create a thread on boss---------------------

- w4 p$ b\5 K' h' V

//Get boss faces to use as start face and cylinder face of the thread tag_t s_face,c_face,thread_id; uf_list_p_t list;

0 m1 ? l' Q+ f\0 [: [. p' E1 I4 H* o# y- m [7 d5 o# {5 M

: K8 {# [' K6 D# v# M' v, ^4 b9 m+ k3 C\ UF_MODL_create_list(&list);

4 r9 l1 |7 W* Y1 P# D. P' s UF_MODL_symb_thread_data_t thread;

UF_MODL_ask_feat_faces(boss_id,&list); UF_MODL_ask_list_count(list,&num); for (i=0;i

# S; |5 O6 n! {: R2 X9 J H$ ?; a& K( d# _, C0 `8 G( i, B x

8 k* P( I5 r4 a! K UF_MODL_ask_list_item(list,i,&face);

i: \\( f; y; n& ? F

' X8 x7 a\ UF_MODL_ask_face_data(face,&type,point,dir,box, &radius,&rad,&sen);

0 ?; P& b. y4 D8 ^, k

if ( (type == 22) && (fabs(dir[1]-1.0)< 10e-7) ) s_face = face; //start face if (type == 16)

! w# `3 k2 d) x% t) a- S

c_face = face; //cylinder face }

# ~6 N f5 ~& F- B v) ^+ |

, U3 @; B# S- m! d) A1 L3 n UF_MODL_delete_list(&list);

$ l8 M' r4 O# ^! N, q

//create thread

; i7 ]7 M& K% ?( z& Z\

) y6 w. v! a1 f) I8 i Z! u char thread_length[10]; thread_length[0]='\\0';

sprintf(thread_length,\

thread.cyl_face = c_face; thread.start_face = s_face; thread.axis_direction[0]=0;

\N( P% b

thread.axis_direction[1]=-1; thread.axis_direction[2]=0;

m% l, U3 W% `

- A7 |! O% k3 y/ J8 |2 `

& f; C$ _* x7 ]' d0 T( w9 R$ O thread.include_instances =UF_MODL_INCL_INSTANCES; thread.rotation=UF_MODL_RIGHT_HAND;

4 c& ^3 s: L9 Y5 n1 [0 M1 S8 `

) ]5 \\4 K& W8 B ]3 X thread.length_flag= UF_MODL_FIXED_LENGTH; thread.tapered = UF_MODL_NON_TAPERED; thread.num_starts = 1; thread.length=thread_length; thread.form = \

3 @2 ~# L2 G7 ]# t1 n6 z6 c/ B, n, w

thread.method = \ thread.callout =callout;

9 e% Z8 W' d) ^, C+ |( K' a$ r+ Q

thread.major_dia = \

3 W8 r) O: ~* e A( J' v9 f

thread.minor_dia = \ thread.tapped_dia = \ thread.pitch = \ thread.angle = \

UF_MODL_create_symb_thread(&thread, &thread_id); //-----------------chamfer edge of the boss--------------------------

4 s\

uf_list_p_t boss_face_edge_list; tag_t chamfer_id,mirror_obj;

UF_MODL_ask_face_edges (s_face,&boss_face_edge_list);

$ Y+ j+ \\: x6 Q; j( ~

4 C, W! L- [& d. K9 l UF_MODL_create_chamfer (1, \

UF_MODL_delete_list(&boss_face_edge_list); UF_MODL_ask_feat_body(chamfer_id,&mirror_obj);

////////////////////////////////////////////////////////////////////////////////////////////

R9 o; D. R* V ///--------------------create mirror feature-------------------------------------

double ctr_point[3] = {0.0, 0.0, 0.0};

5 v @3 I. Y* H* }; [3 P$ e9 R5 D% `3

double directiony[3] = {0.0, -1.0, 0.0}; tag_t mirror_tag,dplane, mirror_body;

9 q) W1 V! o3 i8 Y% ^1 r7 g% `9 m0 y. P( m

+ G: I2 [6 N `3 G/ O+ P//Create Datum Plane

UF_MODL_create_fixed_dplane(ctr_point, directiony, &dplane);

& D& V. P: K& e( z8 U

) f: @* n+ m8 B\// Create a mirrored body

: M% E/ G% V3 m y

UF_MODL_create_mirror_body(mirror_obj,dplane,&mirror_tag);

% {+ A# t+ J$ h- h/ f

UF_MODL_ask_feat_body(mirror_tag,&mirror_body);

+ y; B* D- D* H U% c

/ A9 D, h7 X: H! U U! B4 q) v6 d( D7 X: O\//---------------------unite-------------------------------

UF_MODL_unite_bodies(mirror_obj,mirror_body);

9 M3 \\! n3 N9 _# C. H, ]8 o\

没办法,只好又加了一段,在mirror特征上作多一次螺纹!

7 j/ _: Q. b+ a4 l x; n; d' J/ t( G( Z& K\

//------------------------create a thread feature on the mirror boss----------------

UF_MODL_create_list(&list);

- b: d1 G. ^/ o0 D& b0 j

% a' C7 [& J: V: { UF_MODL_ask_feat_faces(mirror_tag,&list); UF_MODL_ask_list_count(list,&num); for (i=0;i

! @6 S8 H5 L; g' x9 t9 N

UF_MODL_ask_list_item(list,i,&face);

UF_MODL_ask_face_data(face,&type,point,dir,box, &radius,&rad,&sen);

! t1 J8 X* m9 B) a if ( (type == 22) && (fabs(dir[1]+1.0)< 10e-7) && point[1]<-10 )

* Z* i: B. ]9 p- ~ s_face = face;//start face if (type == 16)

0 K- x) }% ~1 V$ n3 @( bG0 \\+ M* L% o, ^& }

c_face = face;//cylinder face }

~( D: X- w+ g* H9 ^: \\

UF_MODL_delete_list(&list);

thread.cyl_face = c_face; thread.start_face = s_face; thread.axis_direction[0]=0; thread.axis_direction[1]=1;

/ } @8 m, j5 x) a) z\

thread.axis_direction[2]=0;

thread.include_instances =UF_MODL_INCL_INSTANCES; thread.rotation=UF_MODL_RIGHT_HAND; thread.length_flag= UF_MODL_FIXED_LENGTH; thread.tapered = UF_MODL_NON_TAPERED; thread.num_starts = 1;

5 G# v a [/ e& s$ A9 Q- R3 U; B; N2 f, q. V# N

thread.length=thread_length; thread.form = \

2 M& m& o4 X. {, t/ B

thread.method = \ thread.callout =callout;

) z& `7 t* V7 \\ thread.major_dia = \ thread.minor_dia = \

\

thread.tapped_dia = \ thread.pitch = \ thread.angle = \

& q6 D3 H. ? p. P8 d\ UF_MODL_create_symb_thread(&thread, &thread_id);

斑竹你好.我现在已经明确的知道了我的part文件中两个实体对象的tag_t 和name.现在我想用UF_OBJ_cycle_by_name()这个函数来确定查询出来的tag_t是否和原来的一致, tag_t name_tag=NULL_TAG;

UF_OBJ_cycle_by_name (CM_name,&name_tag );

# ^- R& V( g: B while(name_tag!=NULL_TAG) {

2 Q/ X$ h& e6 _8 `' e

D3 T! M3 C& w; \\/ H UF_OBJ_cycle_by_name(AM_name,&name_tag);

}

当我给name_tag赋值时,函数返回也是为0,当我不赋值时,调试说我内存访问禁止.请问斑竹能否给点提示?谢谢.

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

, F8 w$ U( L, E3 ~\3 a\ y+ F\) P, ]7 J4 m3 k

1 T& U5 Z, i& t& J4 X( ]很想得到zzz的帮助::(谢了先:))

$ E! r. m1 _4 p$ f* r# B6

他们是:

6 @8 E5 j' {0 S$ F

1、ufstr()和ufusr()的区别;

\

2、UF_UI_dismiss_dialog_area_2()对这个函数在看DOCUMENT时不是太理解

1 v* q) L$ T\A- \\2 t) L& @; K

. R2 w, q' R0 v不知道他和UF_UI_cancle_uf_dialog()的区别??

/ @\

4 D0 b! b5 A7 k! D7 3、UF_UI_get_DA1_coords()

UF_UI_get_DA2_coords()着两个函数中DA1和DA2具体指的是什么??以前在UG Documentation Help看到过但是现在找不到了,应为是新手好急啊!!!

zzz:

2 n+ e8 z0 Q0 Q Q, G

8 b0 i$ n0 H7 v. 我用你前面讲的回调函数的例子时,编译工程自动生成一文件 EH.H,然后就是如下:

e:\\my_source\\eh.h(33) : fatal error C1189: #error : \ 这是在MSDN查到的,可是不知到如何修改下面的错误?请赐教,不胜感激!

0 L! ~: a, g/ H6 F5 x1 Q5 s5 ^8 K. k* E! z$ {. r8 S

7 P/ R( ]. D\Fatal Error C1189

#error : user supplied error message

0 g+ y( G- C4 FThis error message is generated when there is an #error directive in the program. For example: #undef _WIN32

0 W& f* m( N7 V; V( B

1 r+ Z8 m9 ~8 Z8 X+ B#if !defined(_WIN32)

2 i O. T0 I+ P\#error _WIN32 must be defined //error #endif

/ H3 I' m, m, Y# D O4 q% n

int main() { return 0; }

在EH.H中是:

#ifndef __cplusplus

' B' ^) p* b$ W# s; R! f& ^ h8 W/ P, {\d0 F+ W# \\\% a4 z9 W; L9 F' @*

#error \有错误

; o9 I, x5 }5 ^# w+ m

$ E! s: @* |! I$ S, g; x' }#endif

这又如何修改?

找到 #ifdef MENUBAR_COMMENTED_OUT,

把它及对应的 #endif 删掉。 我用的也是UG NX \如下:

, g1 F0 C0 Q4 ^) J$ i\1 i6 E g9 ]* ]6 y& U: T' y7 A

VERSION 120

EDIT UG_GATEWAY_MAIN_MENUBAR BEFORE UG_HELP

) H% @2 L; l9 H# G/ s v\

8 i4 V) Q8 |( K) w' Y% U- p CASCADE_BUTTON UISTYLER_DLG_CASCADE_BTN LABEL 启动对话

C\`3 ~* \\\M

END_OF_BEFORE

- B. ^! P( r) U( I+ _5 u+ Y( j! ?8 j\ MENU UISTYLER_DLG_CASCADE_BTN BUTTON SEQUENCEPLAN_BTN LABEL 应用菜单

ACTIONS yulu.dlg END_OF_MENU

) d# Z1 [, t) P2 `: y+ H( F48 f; H6 V: m! i2 |6 b, ( [( n% j8 ~- x7 K+ F; s0 k# j9 ^

lindy.men文件放在D:\\Unigraphics NX\\UGALLIANCE\\SITE\\startup目录下

: F z* V, r, \\5 t8 d% e/ A. _1 |# m' B* t( B0 pyulu.dlg文件放在D:\\Unigraphics NX\\UGALLIANCE\\SITE\\application目录下

如果没有程序源代码,而只有*.dlg文件和*.men文件能否在UG环境下利用*.men文件产生的菜单项调出*.dlg对话框呢?(只是此时对话框的各项按钮无实际功能罢了)E:\%ug sec development\%ug二次开发有声视频教程

本文来源:https://www.bwwdw.com/article/s3qg.html

Top