|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
5 q5 K- R8 H6 f$ `& u
! |; p B$ F+ y0 |+ e( TNX二次开发源码分享:NXOpen C++创建UDO的过程
* [! e% }3 K1 S. t' p! d7 j$ z, C8 A# {/ e9 @% o0 P
0 W& x+ N! t. H; L5 W3 Q
UDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!4 V" o, v" [' P
5 q/ {: b4 n4 N" c6 x
" u4 e$ \, p, M+ Q; v0 @
+ O0 u5 x7 @2 A2 L) n3 L& W4 j#include <stdio.h>
5 ^0 Y7 g% h7 k. t" q#include <string.h>
& q9 C8 g/ ~8 |# B! \ t#include <stdarg.h>- u8 J; o& C' ^
#include <uf.h>
" _7 N8 a+ A# y2 C( T. q9 Q7 m- T#include <uf_ui.h>
- ] t( S0 ]) v" q0 X' c9 p#include <uf_exit.h>8 i0 @/ `0 T6 p' B
#include <uf_disp.h>% U0 i- F2 x9 Y7 A6 M% |' ?
- q1 @# n3 |! p% [: q" U6 F$ W7 Tstatic void ECHO(char *format, ...): j/ }7 z0 T1 A$ }) z
{$ \( \9 q: v; u/ f& P
char msg[UF_UI_MAX_STRING_LEN+1];
4 N/ v/ `6 @- V/ V9 U# C8 t& \ va_list args;' T% k6 u. ^2 d1 ]& l4 a# g
va_start(args, format);0 j5 A) J7 s6 n/ {7 F- {8 h
vsprintf(msg, format, args);
; a( L( z5 C& u0 U8 W" @ va_end(args);# M' z; w6 _% q% S
UF_UI_open_listing_window();" e9 l! T8 s, _; o
UF_UI_write_listing_window(msg);
; A- @! e- X) i& I7 U. Q! y: M UF_print_syslog(msg, FALSE);
$ T9 h& N* F: f6 b3 g* Y' p}
2 X+ K% g% J+ S5 l8 ~9 A" N* _1 ?$ U, J6 r3 p
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
% Y0 h- R, }# W9 _" s( p' A4 e- d, \# r0 I* ?8 {' f) d7 M
static int report_error( char *file, int line, char *call, int irc)
6 Z9 X% K" r5 L7 {{- E8 d9 g1 U( W* ?6 R) B2 }* s
if (irc)6 s/ N- F3 C" Q
{7 Z0 B7 a3 G6 |
char err[133];: K- L8 l* k- B8 \9 B: T
8 g; ]4 V. X" v4 E: }& K3 X* ^ UF_get_fail_message(irc, err);- o' ^& d o+ ~
ECHO("*** ERROR code %d at line %d in %s:\n",
1 Z e) A0 e2 c" z irc, line, file);
* ~0 P8 u& n# T/ h5 W ECHO("+++ %s\n", err);
2 L% N8 E$ e1 d7 N% Q, L ECHO("%s;\n", call);$ Q5 i ]4 \0 b, F3 H" b; N
}/ k9 O; ?1 l* P& A
5 l9 {$ ?, ~& \7 z; ?1 j7 N7 M return(irc);
4 y" ?9 a) _5 A7 o* s$ K( \}5 f6 v, T' j$ ^
* T6 \) y8 _+ ]5 _/ m) N$ J( q
#include <NXOpen/Session.hxx>
+ m9 P( U& D- p6 q J#include <NXOpen/Part.hxx>
" Z! d3 B& C' }2 P#include <NXOpen/ParTCollection.hxx> $ @& I, M$ g0 ^2 d: s
#include <NXOpen/Callback.hxx>
& T, o( W; H6 A) M" @6 H% |#include <NXOpen/NXException.hxx>. ?! e; H9 [" `' @9 d
#include <NXOpen/UI.hxx>
+ ?4 `7 |) s, b/ Z/ C#include <NXOpen/Selection.hxx>
( \5 A8 j6 c4 j b2 P% a#include <NXOpen/LogFile.hxx>
: A% h0 c; A8 k#include <NXOpen/NXObjectManager.hxx>+ N2 M- n" l+ I5 W7 C
#include <NXOpen/ListingWindow.hxx>
% n; o7 m. B/ O/ M* Y% X#include <NXOpen/View.hxx>" |) }1 [4 x3 b& [0 `6 Q# o
d. {# r _4 [4 \: `, b D
#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>
- t- [% F" K" E/ b( @#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>
( `7 B/ _' m2 L4 A+ L#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx>3 m1 f( Z4 L+ O9 U% }
#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>0 H' l# T' @+ l$ K. g7 h" N' L$ R
#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx>
0 T4 S3 I @2 {3 O) g#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>5 T& x; u" f; q8 ^3 o# a* }
#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>. C. K- a/ w. s3 W
#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>
6 y& B& B- S9 Z7 W4 u% Z: X6 u& t b9 o$ C3 a4 ?: ]5 ~* B
using namespace NXOpen;
1 G) i5 I# E, v& x! r0 Q" R3 A+ I% wusing namespace NXOpen::UserDefinedObjects;
5 F C3 H M9 c; `4 k: o
% n& n6 {1 _8 D2 d: l//static variables; r3 i2 K7 N6 E7 R! N- X5 }- O
static NXOpen::Session* theSession = NULL;
2 ]% X5 y% Z; [) `+ ystatic UI* theUI = NULL;6 t2 f. h4 u% I
static UserDefinedClass* myUDOclass = NULL;# W+ N; L& Y, f. ^* y2 B# V
/ l/ v: ~. I1 Y+ C) c0 r3 J3 L) m$ t
//------------------------------------------------------------------------------
2 H# t& k5 _4 H, r/ z5 e, r// Callback Name: myDisplayCB$ ]4 z( b$ U, T$ n# ^+ [& L2 Y
// This is a callback method associated with displaying a UDO.
, b) M0 `; w* w3 r0 U& G& X" h// This same callback is registered for display, select, fit, and attention point
4 s) B$ I- T% o) I$ L//------------------------------------------------------------------------------1 _* g9 H: E( u2 E4 x; u, r E
extern int myDisplayCB(UserDefinedDisplayEvent* displayEvent)0 ?( x$ K% M$ ^% H' \
{
3 \" N4 ?6 P9 w# s! _ try+ [. q+ F8 W3 M* n' Z+ c
{- h2 h6 P- Z f: o& M- u
// Get the doubles used to define the selected screen position for this UDO.1 c$ k3 W; d! o/ v# _, C
std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();( w3 X( Z0 V$ ^0 M) U
6 \ Y& f9 z8 q3 a
// Use the doubles to define points of a triangle
' x' H$ l' _+ o, d std::vector<Point3d> myPoints(4);
8 u% _6 ?9 M: n3 L# T! E& U/ N4 r
myPoints[0].X = myUDOdoubles[0] + 0;. I$ `$ Y6 {& H* U
myPoints[0].Y = myUDOdoubles[1] + 0;8 c1 x9 m1 c$ U5 U2 Q' n* b
myPoints[0].Z = myUDOdoubles[2] + 0;
( H+ z8 f; e8 ?( \% M& [
O/ w8 C# ?$ n) T1 r, w. o myPoints[1].X = myUDOdoubles[0] + 100;
: a7 |1 O# J& [. c u myPoints[1].Y = myUDOdoubles[1] + 0;
# x4 E* ^" P u2 L4 G myPoints[1].Z = myUDOdoubles[2] + 0;
! {1 {3 U$ ?8 N$ T
/ K: C% L M+ @9 R myPoints[2].X = myUDOdoubles[0] + 0;
: C4 c& y! F7 i- b" X. Q; _6 V myPoints[2].Y = myUDOdoubles[1] + 100;/ h1 I4 M) e/ B. n: M! a- J
myPoints[2].Z = myUDOdoubles[2] + 0;5 U, C& \# p4 [: j4 m
: _ _1 D( g" w3 I
myPoints[3].X = myUDOdoubles[0] + 0;. _0 `' L; J( F; ]2 z9 Z" {+ V
myPoints[3].Y = myUDOdoubles[1] + 0;3 I. r W. p. g- G- G& o
myPoints[3].Z = myUDOdoubles[2] + 0;
2 m( A& z8 Z# b/ l7 U# j8 R6 c$ `0 U& g3 L/ ~
// Display the triangle! {# P3 k3 D$ n* f+ d/ j
displayEvent->DisplayContext()->DisplayPolyline(myPoints);! i2 f8 i' m2 i1 ?
# n5 H) x* p u' K3 U
// Display the text next to the triangle/ `5 d: e9 U- D
Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]);2 @# ^5 ^( M& n
displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);+ X# m" [0 m3 ~( ^, \
$ x3 v: @3 m8 j) Q- u
// UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653
3 O% x' D; d9 k# C* b6 l( u // This demonstrates using UF_DISP_display_facets as a work around
7 t. B8 R' V1 u6 ]$ V, k double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };
. v7 h) l2 x1 D+ J7 `( e8 V* d double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],
6 j! \1 p8 n* g0 A* n3 V1 ~/ s myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],7 r2 p' C1 Z3 W/ V
myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };5 a/ ?( g" f2 x: I9 O
UF_DISP_facet_t facets[1] = { vertices, normals };( Z& T+ r V8 F' _8 @
void *context = displayEvent->DisplayContext()->GetHandle();% e0 K1 a% q& ?$ T. X" W
9 ~/ o2 f5 ~ s) R1 m5 }
UF_initialize();
/ W3 O& q( T+ q+ s& e2 K$ U7 ^ UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));
+ X. o' u4 q! q* `. A' E- Q0 Z UF_terminate();3 a8 n3 A: M. c4 c( k
! p* ]3 [; ^; W& B/ n% H& e }% i! E1 Z9 ?/ t8 G
catch (NXException ex)
3 \5 S( V: X& I2 _ {8 _/ ^0 }! {0 [) J: n4 z
ECHO("CaUGht exception: %s\n", ex.Message());( \# h0 l, O) T) n# n
}
1 W. V" I0 R5 ^ return 0;
0 A% M* J* }+ @3 @5 y3 s+ M b* {}- V! x7 W) v) E
//------------------------------------------------------------------------------& L; |- n: P& \6 D; n) `9 F
// Callback Name: myEditCB
t. ^7 t/ ~- J6 [// This is a callback method associated with editing a UDO.! y( C0 o, j) @) E! g
//------------------------------------------------------------------------------( K1 p/ X3 v, A( g& C0 X, m9 v
extern int myEditCB(UserDefinedEvent* editEvent)
) i8 A) {7 v. V0 A1 M{ v4 j! Y5 r4 [ g( M
try
8 N. ` R( W) E- v {
; _, R4 Z7 U F; K1 o // required for calls to legacy UF routines
5 T: D6 z" e* s& h // such as UF_DISP_add_item_to_display
/ j, [$ u4 d# m- d1 C UF_initialize();& P1 ] e: ~3 e, F8 ]- |
6 v: R; Y: k' _ E* O g" K View* myView = NULL;' d: T& n9 [$ w: e I% _
Point3d myCursor(0,0,0);
1 g3 Q r! G( ?
9 Q7 ?2 P* K N+ P // highlight the current udo we are about to edit
) y6 j7 `% O! Z: u" l // this is helpful if multiple udo's were on the selection
* Y0 U; i- J6 s/ }: v. x // list when the user decided to edit them
+ ?# s* d1 n- Z0 g6 N/ y' M editEvent->UserDefinedObject()->Highlight();/ s, j$ j% n" B' l) U
$ I- W; K4 K" G1 u
// ask the user to select a new origin for this UDO
" g2 d* B' U9 D* G1 x6 V8 X9 V Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);
0 ?+ F/ R4 {/ J/ H! e( ~+ U1 @ // we are done asking the user for input... unhighlight the udo
* |; A; { g% [7 l4 } editEvent->UserDefinedObject()->Unhighlight();% W" I& C" S" J, C
* z5 B2 Y; y L! T3 r0 @
// use the new screen position (if the user picked one)6 q9 r2 p$ U% A7 K/ U+ T
if( myResponse == Selection::DialogResponsePick )' @. o4 r- g# J
{# n! Y7 H& s7 l0 H) {9 {
std::vector<double> myUDOdoubles(3);6 g* y/ ]$ _( j( y
myUDOdoubles[0] = myCursor.X;; z6 _' {3 o6 x7 a) |; x
myUDOdoubles[1] = myCursor.Y;. k* B5 m: f, z2 I& L/ E
myUDOdoubles[2] = myCursor.Z; B3 L* }: q; w3 Z5 K. Z) S. r2 i
// store the newly selected origin with the udo% m/ o# q& `4 f
editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);( {! {5 Q' B' t6 h9 S
// add the udo to the display list manually
& B8 Y3 w& V1 Q: N) I, k& ? // this will force the udo display to regenerate& v m5 `5 \% b* T) {
// immediately and show the changes we just made
# u W# A7 k" d) P UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());4 G- Z; e6 Q, V
}
7 G) U& j- u3 g( G UF_terminate();: }$ C8 M+ p. X9 x9 t2 b
} catch (NXException ex)
$ U" b* q$ v% d2 l2 s) ^ {
& i" L9 M: ~9 k9 w. B; t ECHO("Caught exception: %s\n", ex.Message());" Y: z- M+ ?' O J$ a$ G- B1 D3 V2 i
} return 0;
' H7 k6 c6 ?2 A; Z+ e' y0 m4 h}
+ |9 D7 ]9 d' Z0 U, P- s//------------------------------------------------------------------------------
! K* D- e2 s, I- j( [6 _) U2 b5 v; [// Callback Name: myInfoCB+ r9 D0 B, x8 v- s: ^. E
// This is a callback method associated with querying information for a UDO.6 s2 Q+ U9 r7 }. `* X' N7 S
// The information is printed in the listing window.
+ A% k# P5 i, B+ G$ y//------------------------------------------------------------------------------# l( ~- g9 f' o! ?2 v, P
extern int myInfoCB(UserDefinedEvent* infoEvent)
5 M$ j" `$ @, O0 N1 k& ^" F, ?{7 K- c. O8 @6 @
try
: ?; B, F, P8 f3 }0 f, ]+ a* X, M {! Z+ O0 {2 b' p8 i& P# J
ListingWindow* theLW = theSession->ListingWindow();9 C @' D, `% l" `& e6 i
char msg[256];
- U0 }& P, y: ~' ? theLW->Open();* g, r) o) [! N0 j/ @2 r3 X% _
theLW->WriteLine(" ");1 M1 g$ W$ a" F; d
theLW->WriteLine("------------------------------------------------------------");
2 _. ]4 w+ |8 t, G6 ]& n& `8 v3 h theLW->WriteLine("Begin Custom Information");
0 R9 ^9 ~! v% }* H! Y( V theLW->WriteLine(" ");, c) e& {3 q* o% [+ R
sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );
% ~/ S+ s0 |; T* q- j1 r3 o- D, @ theLW->WriteLine(msg);
( p T- a2 ~' [ sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );
5 ^! ~, b ?% F a3 l theLW->WriteLine(msg);
$ l1 g* J0 B: j: W std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();
9 ~% v3 `* O2 H7 H sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );
' L$ `! L+ |: I. K theLW->WriteLine(msg);
2 A2 F7 W! t; T4 M! S sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );3 o4 c9 o% n2 _. ~- \2 e
theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] );
- I0 S7 u2 f3 `0 `6 c& W theLW->WriteLine(msg);
2 i# T5 q) t5 j9 \1 P5 A theLW->WriteLine(" ");& N, B6 t/ h. f3 ~
theLW->WriteLine("End Custom Information");
9 ~ m' d D0 n- j: ~ }
6 `9 f7 l" W* _. `, y+ \$ C catch (NXException ex) h, x$ ^( g9 ?* Z! f
{* P2 D8 Z0 b7 \3 {% y4 ]% z. g
ECHO("Caught exception: %s\n", ex.Message());" D W w% @" s8 j7 z2 t
}" c! s. M/ P* }% E2 u7 u( H
return 0;
* a0 ]+ w# n6 S5 u) V9 R# m1 n' S}
3 k \" F1 Z! b
[4 s( d8 G# H1 E" I& n7 Q, Z! d//------------------------------------------------------------------------------4 C! b1 _& u' M- J2 w$ q4 |. S
// initUDO' E$ `' P( H" P3 S. A
// Checks to see which (if any) of the application's static variables are
7 U3 V/ H$ ]+ e& b; `' U// uninitialized, and sets them accordingly. U7 F) a& B3 w* q5 H( ?
// Initializes the UDO class and registers all of its callback methods.; V8 g! M2 z' s
//------------------------------------------------------------------------------8 R( j) z F* b( Q
static int initUDO( bool alertUser)1 R; {# D4 M7 u$ f8 x. N
{
" B$ L# E e p( ?/ |$ H* v3 \ try
1 ]6 n2 X9 V2 `" G% h6 k. ^ {! o, c9 z3 G9 k+ C- R* e i
if (theSession == NULL)3 ?9 n) J' `" [, ~
{
( c2 A/ u ]3 B# \ [6 ]+ a- q% ? theSession = Session::GetSession();
, z. _" a: I& ^9 z l8 X! J }+ f% H3 G* }, H, v) c; ^( _" s1 E
if( theUI == NULL )
% L7 x& H9 B" m: q3 K" ^ {
G9 t6 p. o% z, j/ P: z+ ] D J theUI = UI::GetUI();
3 r/ O9 F) d+ v1 X/ I* z }
9 ~& ~2 A. X" y2 N# R8 L if (myUDOclass == NULL)
) ]; k( M4 P+ a, V y2 i2 N3 q8 g {
: t- F4 i; n# l. e7 H" } if (alertUser)6 s& c: U, C% N: U W
{" s# G5 H X/ @. @4 @8 P
ListingWindow*" w, t( [! J4 A# c7 O& f
theLW = theSession->ListingWindow();
. Z' i5 Y* n4 Z9 P theLW->Open();
) g! [4 }& G: i7 z theLW->WriteLine("Registering C++ UDO Class");
I. s3 d: b0 d, Z+ i. I) i }7 x5 f7 ~1 ~/ j: \
// Define your custom UDO class
" C3 q4 Z/ `) Q. B* W% U G7 x myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");
& q, R) G: }" K // Setup properties on the custom UDO class2 ~9 }# r) T$ S# v
myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);! W/ {* ?4 F( L& o* |4 @$ w) c" V
// Register callbacks for the UDO class
4 I: O0 R, l. X. G% K& F) n2 | myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));
* c1 t' G* A W myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));! Y4 c: v4 j9 g5 \& Z) J
myUDOclass->AddFitHandler(make_callback(&myDisplayCB));0 S' g9 a/ k9 _9 I; d6 j! @6 s. d
myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));* s6 f8 Z# j5 O- G/ ]/ n
myUDOclass->AddEditHandler(make_callback(&myEditCB));4 v0 ~, q& `+ F1 q- T% H4 R
myUDOclass->AddInformationHandler(make_callback(&myInfoCB));: j4 b/ Z. i/ @9 c1 A
// Add this class to the list of object types available for selection in NX.
! ]6 ]+ a/ Q; b0 A% S) S8 c // If you skip this step you won't be able to select UDO's of this class,
) W, }/ e9 T( p v2 @' @ // even though you registered a selection callback.
+ ]/ U4 b3 o! ^3 @ M theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);
$ E4 {8 h& x9 s3 `+ T0 b& B }* b/ m# W! w7 _9 Q8 D V& {# v$ W1 M# S
}+ V7 y! V* n' |
catch (NXException ex)0 O7 |- {( W7 V6 ~8 O
{
6 w6 U" q2 {$ I/ Z K1 S ECHO("Caught exception: %s\n", ex.Message());
' d1 k* O7 J$ r! ?6 L" }3 z2 O& R* a }$ _7 v: }- A2 U% { Y) G! Z, W2 R
return 0;
( N& i5 M# o- t; g1 Z* `}8 ]( K) |. Y) ~
3 b, d4 h" s9 t! L3 B9 f# U. P
//------------------------------------------------------------------------------, Z4 C" h5 U2 A: L/ \* ?) g0 Q7 c4 |
// ufusr (Explicit Activation)6 s$ p% m5 \& L6 u U
// This entry point is used to activate the application explicitly, as in1 x' l% ]+ }4 c
// "File->Execute UG/Open->NX Open..."6 {6 F4 l$ X6 M$ N# B$ k2 R
//------------------------------------------------------------------------------$ K3 \- c% }7 J% Y
extern void ufusr( char *parm, int *returnCode, int rlen )9 ~ H6 R ^6 D" I
{0 b0 F( ^! J. j( w* o" x: B* p5 R
try) l! J& c; M5 _, I
{& o/ L D6 A" C3 A+ d r) n v
// required for calls to legacy UF routines/ {( y6 q2 V9 D) T
// such as UF_DISP_add_item_to_display
) h+ f% \) D$ e% q; J UF_initialize();. F ?% y4 b9 W" F
7 R" H1 E4 c: C" i6 s7 l // initialize the UDO - if we didn't load this library at
* G0 Y: U+ M# v2 f // startup, here is our second chance to load it
- B$ D, ^4 {+ d$ Y. p, U3 u initUDO(true);, @! ]+ ?: q; B3 z8 m
$ @" l6 E9 f( E! D* Y9 `9 A
// if we don't have any parts open create one5 M3 ^1 t3 G( e$ z, j \( h
BasePart* myBasePart = theSession->Parts()->BaseDisplay();
, q9 g M3 l! W* E' W/ A3 w- R! C/ N3 J if( myBasePart == NULL)
3 Q( J# J4 B* K- | {- u" s, h: T! ?3 u8 u5 _
myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);
% j6 m# M- w a }
/ p) P% ]8 E7 m" I5 h2 x
& i% b( M" g0 }9 q: I1 W. R* I0 v View* myView = NULL;
, D2 ~( M/ a& {0 W: d- N Point3d myCursor(0,0,0);& i* h/ p0 _( m# d: K
0 {0 O$ w3 t9 y( x1 a5 D' [ // ask the user to select an origin for this UDO1 x b: d- D7 }( \
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);: Q) K4 E% m) _# k* b# q* v( g
if( myResponse == Selection::DialogResponsePick )
4 ]. A6 n7 c2 b" w% o {
1 P# z% }, T; t, J // The user selected a point - go ahead and create the udo
4 {; ]* J( Z5 l3 M UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();+ R- n6 \8 P# S6 Q
UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass); h4 a) u# O& m* A5 Q8 v
// set the color property of the udo - just for fun :)
0 [1 o4 Q/ F: X; f' @: v firstUDO->SetColor(36);
2 v: o8 K: h" L& I // store the origin selected by the user with the udo
" l2 B! @9 P6 C' T/ j% S std::vector<double> myUDOdoubles(3);
! u' b. S4 T) {1 y% U' _& f+ ^ myUDOdoubles[0] = myCursor.X;
/ B+ ~0 R f6 M myUDOdoubles[1] = myCursor.Y;
8 i3 b! O2 E3 W myUDOdoubles[2] = myCursor.Z;
% \8 I, O) P1 i e* u8 m) z& { firstUDO->SetDoubles(myUDOdoubles);/ H) |5 _' r$ [' t2 v# ]) R' j' s
// add the udo to the display list manually) T; m2 G1 v5 q3 t
// this will force the udo to display immediately7 b- O+ u3 Z* a4 V. a
UF_DISP_add_item_to_display(firstUDO->GetTag());: J$ g4 b) ?6 U; j* d0 z0 h r
}+ j$ ^% }! G# h3 t, v R$ S
UF_terminate();
+ m0 d% q% u/ B2 @( @; P, l# G }; W7 m( l9 y; y; i
catch (const NXOpen::NXException& ex)
8 `9 k' j3 H% ~2 i {8 W8 e; C- Z) c, k) Y. a Y
ECHO("Caught exception: %s\n", ex.Message());
7 r# L) ?6 `7 b7 w% ?: U2 Z! C5 V }& j+ i$ W4 I* W, d
}1 b; P% _" H! Z/ u
& Z4 W! R9 P5 m1 m4 C//------------------------------------------------------------------------------
* k. k7 ^( `6 e2 @% Y// ufsta
7 @9 [! h+ J0 C+ L* W// Entrypoint used when program is loaded automatically
2 r7 Z/ u3 u. x( U, ~! l3 Y2 l: z// as NX starts up. Note this application must be placed in a1 ~2 e ?" h/ g7 s
// special folder for NX to find and load it during startup.5 ?0 c1 [" z, |+ G9 j
// Refer to the NX Open documentation for more details on how
+ L, r) z# @" H5 p) L8 z6 k) b// NX finds and loads applications during startup. G; [) [; c0 z; @+ X
//------------------------------------------------------------------------------
$ c1 |) S2 |. textern void ufsta( char *param, int *returnCode, int rlen )
+ n4 y. l8 i0 F7 ~; H0 T{
! l4 Y. I* [& p. j/ `! Y9 A try
/ ? G8 a- W" r/ y3 v {
) ?; d5 k* [' L( v- f& L initUDO(false);; n$ T% k* {: L9 a: X- u
}
W4 u. O" ?: Q5 o0 d2 ]7 h catch (const NXOpen::NXException& ex)( K" r* X& X5 M% g
{3 O; U+ m8 D: ?; p9 {; n. `# D: J
ECHO("Caught exception: %s\n", ex.Message());3 B* ^( Y6 R' @5 n
}
/ P2 k+ L5 `8 Z% u9 l! u' ^. {}3 [0 k7 p, p) H. H) E8 s
2 L) E1 T: S/ {& `$ L//------------------------------------------------------------------------------. R" l! o5 `7 }# Y( E
// ufusr_ask_unload' n) n& I7 M0 w3 Y% a8 W& M
// Make sure you specify AtTermination for the unload option.. C+ o1 d5 `! n f7 @; B5 {+ ?: j
// If you unload the library before the NX Session Terminates
4 K2 B# c) K; k) H// bad things could happen when we try to execute a udo
6 v! C- p5 ] u s3 s// callback that no longer exists in the session.
6 o% o+ f+ P( ?- P//------------------------------------------------------------------------------# \; ^6 \& ?3 g$ G$ R3 C* e& U( J& y
extern int ufusr_ask_unload( void )
8 P' S, M( T# o8 o5 d{ z, ]3 P7 Y' Y
return (int)Session::LibraryUnloadOptionAtTermination;& @7 l( \: C. c; s& m+ K0 T
}
; {, L# G5 F) ?; d* ]
% {% v: N! _; | |
|