|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
4 m: o: m( @$ a' w; S4 y; [( r# F* _! G0 }' @) K
NX二次开发源码分享:NXOpen C++创建UDO的过程
4 Z: A- o$ p- W# X2 A4 a! K' \# G9 x/ F+ Y
3 e( T' J' I# u( A% K. k
UDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!
8 ~4 x; a, x; T2 o( ~
. i4 J, H F, x4 H- g, O# l* j
+ s* l) A# O/ D1 h! r5 k3 P
/ y+ }: b, w6 ?& n/ q4 R#include <stdio.h>
3 D) D [8 r" b7 v/ E1 U( b [- B#include <string.h>4 l2 k5 t5 M7 Q& h
#include <stdarg.h>
+ e9 y6 u/ r# h1 i#include <uf.h>
8 K4 b: [5 t% N; Y; u#include <uf_ui.h>& ^0 H" q' i8 i8 y9 q. r y6 A
#include <uf_exit.h>; ^! ?. U0 @ d' q) e
#include <uf_disp.h>3 Y- s4 Y$ x Z( F0 ^5 Q, L' g
! \' g9 I2 O0 ostatic void ECHO(char *format, ...)
% d% k0 O( d3 _, |8 D' B{
# o3 z8 r) _! _" q# A N. }1 r3 X char msg[UF_UI_MAX_STRING_LEN+1];
o7 p/ I9 G) V6 U8 C va_list args;. c3 X) k% O$ u! N9 N
va_start(args, format);
. }9 l8 p. p9 a7 ~3 e( ? vsprintf(msg, format, args);
2 I* C8 t- s$ ~: f) h va_end(args);
# w/ f) D7 @: K! T Y UF_UI_open_listing_window();" `# t; P( b# W0 W$ ~+ S
UF_UI_write_listing_window(msg);! z! F( b% L6 X1 i' W% \# O% U B& z
UF_print_syslog(msg, FALSE);" T6 I& k2 Z/ f: I* j0 }) [
}+ E- I& h# X) j/ e& s+ o7 O
$ h9 n3 ]! c1 \) u#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
5 E# b$ J ?! {+ |0 L! P: z. n' ~0 S
static int report_error( char *file, int line, char *call, int irc)
: \6 k* q4 n1 s+ z# n; _{
: W, v! y( o! p/ ~ if (irc)
3 R1 V' m* I! B { b5 s5 m0 U- e
char err[133];
/ g K/ i) J- L5 u, g! l5 }' y) W7 J9 \; [
UF_get_fail_message(irc, err);
# Q, O+ V4 Q( T8 v; d1 [7 L' L ECHO("*** ERROR code %d at line %d in %s:\n",; `0 B+ e+ X/ B0 [% m& o, B0 P
irc, line, file);
5 b( z$ i9 f) o9 _! C3 B* C y ECHO("+++ %s\n", err);$ l7 ]. u, D' h
ECHO("%s;\n", call);- I. ~! [1 s) J% T) K7 P0 y
}
. U1 \; ^# d$ e2 j8 v! I6 s& B. U( ^- O, T+ S$ L0 K
return(irc);2 `% }; g. p0 p& }8 p# z& \
}
, ^9 C# e( z9 I, M' X* b( T+ d7 }& _" M( A: R1 l
#include <NXOpen/Session.hxx>
0 e' j, P. A$ Y M) g+ Q6 V#include <NXOpen/Part.hxx>
t2 n+ I1 c; L D! h- `$ u7 y#include <NXOpen/ParTCollection.hxx> ' Q( t# O1 W6 W9 {$ _/ \& l
#include <NXOpen/Callback.hxx>
# ~- c; H( H# g* m" u4 \#include <NXOpen/NXException.hxx>
2 p$ o8 @$ T: N#include <NXOpen/UI.hxx>' j4 _' ?1 ^& e# U( n' S0 B
#include <NXOpen/Selection.hxx>
& U# W; k: k6 [ T; l; q8 `- B2 @#include <NXOpen/LogFile.hxx>
6 m' w8 t8 U" p5 G#include <NXOpen/NXObjectManager.hxx>% _4 A" e s7 }7 _
#include <NXOpen/ListingWindow.hxx>
: R; Z8 f( M, ?8 w, w, g* Q; Y#include <NXOpen/View.hxx>
0 {- ~: T6 I3 b j( q- d |' Z, w( w9 D& c2 @1 r
#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>8 T5 w k. W7 {& f
#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>
& B* e/ M' b' U8 q/ f# y$ X#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx>
' O; h/ X) m d3 O) t0 Q: a! H#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>
) f4 C9 H- K* ]#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx>2 C- n1 Y. O9 g) }4 t+ ?) n7 E# F
#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>5 Z2 r1 H5 V8 j u3 B+ C7 c) g
#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>
) s) h& b8 o' b0 _0 K#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>4 g: r h J9 F$ G r; w
' @2 F& x: K' q$ ]3 eusing namespace NXOpen;
( ^$ ^2 R5 i) U# Susing namespace NXOpen::UserDefinedObjects;( m( B0 j( ]- x9 J
, w' i) k \2 P: a
//static variables
* J7 _0 v1 |9 F% o2 a1 fstatic NXOpen::Session* theSession = NULL;; z; ]& F' @5 g) V* \1 X, |
static UI* theUI = NULL;/ `$ U, G# H, V; U
static UserDefinedClass* myUDOclass = NULL;
- W+ {/ Q# r0 E9 Y! z
- ]8 r8 R N) p- v$ O, B//------------------------------------------------------------------------------
# T3 r0 M+ _: k9 `( D" s+ K// Callback Name: myDisplayCB
. j0 y T4 o, }( ]" d5 ~// This is a callback method associated with displaying a UDO.
- P* o6 j3 h" O; I8 t. {" t// This same callback is registered for display, select, fit, and attention point# u, s1 b+ U( w3 z$ q% ^( s$ F
//------------------------------------------------------------------------------
% [- y, p4 M" @9 sextern int myDisplayCB(UserDefinedDisplayEvent* displayEvent). L6 {3 N; x& ?, j5 P+ Z q
{& B0 M% ^. Q/ m5 _( n3 j2 L. ?
try1 b+ i: q" q9 E3 z7 ^
{
& j4 t. h2 @" e. Z8 z$ i // Get the doubles used to define the selected screen position for this UDO.
) N5 W" M& w+ M$ i" G$ d6 _ std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();
. H3 K w/ S$ P H0 U. w$ c" l: `' o Z
// Use the doubles to define points of a triangle2 }5 w& z0 e- g% ^. D: X
std::vector<Point3d> myPoints(4);
% q9 s2 ?0 R Q3 L
* o% R: X. C, `# O7 X* L( \' Q8 F5 Z myPoints[0].X = myUDOdoubles[0] + 0;; z8 k, y) C4 _& B
myPoints[0].Y = myUDOdoubles[1] + 0;. W/ G5 f5 J! B a4 z
myPoints[0].Z = myUDOdoubles[2] + 0;
4 K+ g4 G1 Q1 O! y1 d' p
* k: _& R- D3 Q0 L# l% \ myPoints[1].X = myUDOdoubles[0] + 100;/ b% o. ~1 _5 Z( E: @8 u
myPoints[1].Y = myUDOdoubles[1] + 0;* b | j. L( X8 h9 z1 |6 V
myPoints[1].Z = myUDOdoubles[2] + 0;" Y+ P$ t( o6 A. O {% Z
) [# v* I# V6 z+ n0 e
myPoints[2].X = myUDOdoubles[0] + 0;
" B! L5 V, t5 L6 _ myPoints[2].Y = myUDOdoubles[1] + 100;
& H2 O) r! }, o6 d6 _, F myPoints[2].Z = myUDOdoubles[2] + 0;4 ]; H! A; |- i9 p- x% ~
6 w# X6 m4 [7 h9 @, M) K1 q$ H2 q5 U) ~
myPoints[3].X = myUDOdoubles[0] + 0;3 B( o5 V6 X" }' I3 i- e1 M7 ^
myPoints[3].Y = myUDOdoubles[1] + 0;! R6 |" `2 N4 h- F6 D- p) E
myPoints[3].Z = myUDOdoubles[2] + 0;8 i: J |. k) A. k
( n2 G) `5 a5 q1 R: H // Display the triangle
8 s1 A2 Q6 k7 ~5 z. ] displayEvent->DisplayContext()->DisplayPolyline(myPoints);
4 y) x d: z, f( e* P# ~, f& t4 T |8 g
// Display the text next to the triangle
5 j0 C! @* R& J Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]); y# V Z5 a+ T6 u( Z/ G( e( d( a
displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);4 s' q. u O- Z. I1 m3 n* ]: \
; x) S1 }* t5 E( j% v- K
// UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653+ |' @, o. D' y# h; v2 n0 M5 p" \
// This demonstrates using UF_DISP_display_facets as a work around) T% Z7 h: r- G! u" N7 Y( U
double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };
( i5 m( V4 g0 V/ M0 F$ R double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],0 x' `& o, q0 c: _6 _ K
myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],
1 q( S3 d+ ^9 D d myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };
6 U' ~; L' G/ r0 q( E/ I3 q UF_DISP_facet_t facets[1] = { vertices, normals };% B" }9 @7 `* |- Q) u
void *context = displayEvent->DisplayContext()->GetHandle();/ f2 q5 M$ ]4 c- ]
1 ^% G% j" s/ x- ]1 O
UF_initialize();) H" `! b) k' @: V8 ?# I
UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));
# _) `# j9 \2 v `8 V7 f UF_terminate(); F4 T' Q1 n% x
& l% N) d3 f7 Y2 u6 v }
; S! S! N( _6 W2 r catch (NXException ex); w& U3 ^9 M/ W" {1 {4 H
{
) J# v) v2 X: h# C ECHO("CaUGht exception: %s\n", ex.Message());
2 E% o1 |+ p& s) g. `9 t: X! e" u }$ _3 C2 H. w- b1 n; D6 [
return 0;5 a" t1 z( x2 r' E6 C- N
}
" o8 G9 N# T- D* V9 \2 L* U//------------------------------------------------------------------------------
' e+ @( {" t* ?# R9 q- X// Callback Name: myEditCB, Z! X$ S# W& Q/ [+ L9 D5 X
// This is a callback method associated with editing a UDO.
; _7 `" V! ]" G1 }2 {//------------------------------------------------------------------------------
# S1 W7 V' |2 ~# b- ]extern int myEditCB(UserDefinedEvent* editEvent)
% r, A B7 w: a( B{
. S! W r) V. L- y- V6 X6 I try
! h: Z6 F! y- O+ y _+ K# W, A {. i+ B( ?+ U) \8 ]9 Y) R- @
// required for calls to legacy UF routines: ~. Q. x5 V- i7 a3 S. _$ s% N
// such as UF_DISP_add_item_to_display
- S" q; b5 L0 B. c7 J+ {# a% w UF_initialize();
* i6 K* O- q7 s5 P0 P3 \, R$ S9 \0 W5 w2 _
View* myView = NULL;' C4 W" W# t. d
Point3d myCursor(0,0,0);
- p1 f4 a+ B9 [5 I% i7 P) q1 N* |, O+ e K
// highlight the current udo we are about to edit( {+ d2 M6 J4 n }5 S" y
// this is helpful if multiple udo's were on the selection3 s% s+ ]& l6 I. W
// list when the user decided to edit them5 G! Y+ p. W) ]! @+ @
editEvent->UserDefinedObject()->Highlight();
a! s. o9 y6 w2 {! w% c2 R5 x0 ~5 x( t
// ask the user to select a new origin for this UDO; |) H" X) A" {1 U# J
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);7 C3 P5 h% J6 v1 e& F4 z
// we are done asking the user for input... unhighlight the udo( c; J T. ?( ~8 }# w) S: K
editEvent->UserDefinedObject()->Unhighlight();
! }, H& [4 q- \% ^: G" j6 M; d# z) \9 A v- [
// use the new screen position (if the user picked one)
6 Y5 p1 k) W+ s6 r. H if( myResponse == Selection::DialogResponsePick )
0 h2 | v, K2 n d3 s {
% g2 g0 {8 q4 }! v std::vector<double> myUDOdoubles(3);
+ X& \0 Z% @% ]6 s5 } myUDOdoubles[0] = myCursor.X;
/ Q; a! _& {( |( n4 w5 A5 F9 ~- U. ] myUDOdoubles[1] = myCursor.Y;
9 t1 Z" T. |( @5 O0 U. B7 k6 ?, m myUDOdoubles[2] = myCursor.Z;5 |- D) v6 w, k5 J2 j7 I4 ^
// store the newly selected origin with the udo, V' }1 P9 {, t+ ^
editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);
1 E" N+ |) ?4 i; @+ k$ U // add the udo to the display list manually
7 y4 L& ?, ?3 o& T1 q, @ // this will force the udo display to regenerate
8 Z7 M9 t1 u. ~8 o* G% p3 p9 t // immediately and show the changes we just made
6 }) h6 r3 ^$ ~+ \0 l. i3 k# u UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());
6 w C# n) |# d& u9 J/ Z5 `% o }2 d( p/ T# I, M, e4 Z6 H# p5 Y4 |
UF_terminate();
3 K, ^* j& g) D& D4 }* `" p) _ } catch (NXException ex)5 f. N( S8 q4 p. m
{
9 E* ]0 y+ g- H: t ECHO("Caught exception: %s\n", ex.Message());& B" z: ?3 f9 ~8 a) @4 d$ X
} return 0;" ], J u5 ?% j9 f) g4 b$ V
}
8 E {( k7 i3 ]$ l' W# [' i//------------------------------------------------------------------------------0 w7 J4 z! I# U% r) a# R
// Callback Name: myInfoCB
" n& s2 U) N* d// This is a callback method associated with querying information for a UDO." ], w( M G/ [4 @0 m7 ]1 ^6 e
// The information is printed in the listing window.' {- Q: q% Q1 {5 f
//------------------------------------------------------------------------------
, q( k, Y7 R0 a/ ~" w. k& I- B, }extern int myInfoCB(UserDefinedEvent* infoEvent)
' T; T. i8 K& O: W( [{/ q# f* n3 |0 m4 f: ?
try. Y8 ]4 O3 b5 T7 I6 t
{( T1 r/ r! A; k- r3 C( K* o) b
ListingWindow* theLW = theSession->ListingWindow();
+ @5 h2 L- c2 T) ]$ q( ^ char msg[256];
) ~3 w6 d7 G$ b0 o1 ]8 z* k) N' L- j5 X theLW->Open();
, a b0 k; B* a: W* G, C theLW->WriteLine(" ");
' I! p3 q6 y Q2 ?! e6 U8 U theLW->WriteLine("------------------------------------------------------------");
; P) ^. F! y! V( a" J( X1 B theLW->WriteLine("Begin Custom Information");
/ W* g+ n+ a& K" t$ ~+ C theLW->WriteLine(" ");
( _- u3 j9 F6 c( ^# D sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );
. n! V( c' G+ r4 c* J8 k theLW->WriteLine(msg);, X2 C7 G& b, m3 i2 `" I) k5 J
sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );
* K" r* }/ i) e3 X& D* R0 V' [/ r theLW->WriteLine(msg);) Z. g! ^! E; @' C6 t
std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();, w0 Y$ x) O! P2 b, ^( F6 x
sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );/ W7 X) t/ O7 `* O/ l4 X/ Q* |4 L
theLW->WriteLine(msg);
- ^7 z! w, h. f4 w' a sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );, @ [; Z+ h0 A) s4 Y" C
theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] );
# a( I1 l1 V* T) n theLW->WriteLine(msg); z5 u, Z4 W' y: T+ h
theLW->WriteLine(" ");0 {) E* v$ n- X! K
theLW->WriteLine("End Custom Information");
V( H/ z0 b+ R }" u. L- h7 F# d. I6 D: k
catch (NXException ex)4 h- v1 U0 a. P* h, {5 m/ k& y
{' i5 |/ L5 ]) p$ \
ECHO("Caught exception: %s\n", ex.Message());
8 B" ^! a* V( K" O4 F# M }4 @) j8 \- G! ?" i$ t
return 0;
' Q% I1 E7 m. V5 T" V/ {/ K: m2 {}
, K; I6 `. m# t2 y" }6 f6 M! x4 ^+ }/ Y u% U
//------------------------------------------------------------------------------
' o; W5 v! r- q1 y( P// initUDO
8 Y3 b: F" y7 H9 v: P// Checks to see which (if any) of the application's static variables are8 z; l- F7 u: K# O! N: N, d- P! T
// uninitialized, and sets them accordingly.
+ i! g( m9 W& [3 D// Initializes the UDO class and registers all of its callback methods.& `8 i* i: u" m) X9 i- i8 w! Y# t) s
//------------------------------------------------------------------------------/ A4 B& w7 `' b8 x J
static int initUDO( bool alertUser)( X# p0 O) l+ o# t$ Z" ^5 P, A& X1 h
{
' `' ]+ V7 _3 B# ]5 ^. {& U/ ~ try
- K; |0 m5 T8 P7 _ {
) ]% B) E: L5 k: M$ ~ if (theSession == NULL)
& W2 X) E- J) \5 H6 R# g6 `" C { b- e6 f E2 g6 @) K# E
theSession = Session::GetSession();% L2 ?! a/ P2 I" T, ?. z
}
4 w6 y' i& n' a if( theUI == NULL )5 ^6 H8 j0 e" e$ K& D' B: f
{- v& |" s' ], E5 v' w# ~% V
theUI = UI::GetUI();: Q1 m6 V. ^- o
}
( W$ }& C n+ H7 r if (myUDOclass == NULL)* D% V* v# ]; i" R1 p
{
) k7 v0 h' L( V7 [1 i if (alertUser)
# }& G" `& `4 D" A {
" R3 _5 `0 F3 B ListingWindow*7 i/ e* N* t4 t. z
theLW = theSession->ListingWindow();" q; I3 }, b+ u+ { ], t
theLW->Open();# D- E& r q- O, J* N" `1 I% m4 {
theLW->WriteLine("Registering C++ UDO Class");
8 d+ ^. |- H2 R7 }- ? }1 e8 r+ L' k+ M. s1 ^2 W: ~2 U
// Define your custom UDO class8 w- _& |6 g& h8 \. Q, u: I
myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");
( x: i& x6 [1 M3 [' J8 B0 Q4 n // Setup properties on the custom UDO class) L, \6 O. v3 z; R# A) G. \
myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);
6 T- s6 _- F, K9 p- J G, y // Register callbacks for the UDO class
5 ]* X' L3 J5 b* Q: K myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));
) y! m/ [% @" n. e myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));! R# ]1 g% ?- S% l7 l& n+ e4 F
myUDOclass->AddFitHandler(make_callback(&myDisplayCB));8 c8 K$ f! v2 k' h
myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));2 Z/ E. h( X- a$ h
myUDOclass->AddEditHandler(make_callback(&myEditCB));
* F* M( u. G9 o myUDOclass->AddInformationHandler(make_callback(&myInfoCB));9 w6 ?* U! |& ~- g5 s
// Add this class to the list of object types available for selection in NX.! [8 l2 h/ a3 y7 e
// If you skip this step you won't be able to select UDO's of this class,( m, y8 K; @4 o! ~! F& p( ~
// even though you registered a selection callback.
/ c$ a8 ?; Y' {/ ]8 a theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);
9 a7 c1 K# O& j# t( w }
; |) a. J! z7 ^( |4 P. j" t7 { }: w! ?* x1 F2 G& X3 I8 b8 {
catch (NXException ex)
; ^* K% P. S8 ^$ a! h6 b {
0 o+ T6 D6 Q* U2 M: i2 w7 g0 r ECHO("Caught exception: %s\n", ex.Message());. j( @6 b0 [4 O3 X9 Z5 g+ p
}% p% t. ]3 P% Y N* O
return 0;
. r k J* j T6 d% u- a9 d}
8 \3 }. e$ @: v
" K0 R3 E4 l* C d! q! i! H//------------------------------------------------------------------------------+ B( _. u# \, z, m; _6 u1 L
// ufusr (Explicit Activation)1 @) Y( B; K* d2 a* S* G b& g
// This entry point is used to activate the application explicitly, as in
$ K l! X1 g, `, S; y7 t// "File->Execute UG/Open->NX Open..."/ s |% D* A4 |% u
//------------------------------------------------------------------------------
" i3 m) A( ^7 oextern void ufusr( char *parm, int *returnCode, int rlen )
3 d* b* Y$ k4 C B1 ~# g+ E6 A{! q. i% U8 T5 _
try& i. J. { O4 f
{
9 i2 c9 J" L1 f$ Z // required for calls to legacy UF routines
' ~/ ~+ _* ]0 T- ], E; f // such as UF_DISP_add_item_to_display" Z' V! Y) U h- e2 Q2 H
UF_initialize();
6 ]/ I7 `' C# O8 |
) q/ b. _* S) f9 J- x, b: J // initialize the UDO - if we didn't load this library at4 t1 Z X4 ?& r* n3 Y
// startup, here is our second chance to load it
6 s% S/ N6 h) }7 T initUDO(true);# L' Y4 F0 q: H- q* o
o2 v' O |2 i' U1 o; T2 W# I2 T
// if we don't have any parts open create one
1 e) ]" g, S& p# a# j BasePart* myBasePart = theSession->Parts()->BaseDisplay();
- N3 |4 P' ]0 E: J `, Y if( myBasePart == NULL)- ?8 ~ ^- |, p, W n3 N& B1 ?
{9 ]! b* A; f, ~- B' Q; g* b
myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);& ]7 o* D; S1 {! ]+ p
}
* i3 H0 W" o! q! J
+ I8 z$ _9 y/ `& N' h5 }) \( g Z View* myView = NULL;1 g1 y8 n! }, o2 {
Point3d myCursor(0,0,0);
+ _- n, i+ H, V. Q% c: y6 I+ M& V# j% Q: ~6 d i/ n
// ask the user to select an origin for this UDO$ Z! C% `6 V, g& ]$ ^: }3 y
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);
+ E4 Q3 W8 b3 P1 ^1 } if( myResponse == Selection::DialogResponsePick )1 S0 l( S& s: P! a' a" y
{8 S1 {* M3 F+ q- |5 `7 {
// The user selected a point - go ahead and create the udo
) T+ h& @( C* D% C UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();/ y# ?8 \/ S) n+ L, d# f- f
UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass);: ^* Q$ m7 a4 }$ j
// set the color property of the udo - just for fun :)
" A- [% x+ _+ n S$ r2 _( L firstUDO->SetColor(36);
b0 j8 j. t& H* N8 F, z: |4 a // store the origin selected by the user with the udo% T3 ]# ?4 B7 w6 }
std::vector<double> myUDOdoubles(3);& T" b0 Q* U2 Z/ V' p
myUDOdoubles[0] = myCursor.X;
( F* ~+ Z' L9 Q7 A/ t/ j myUDOdoubles[1] = myCursor.Y;
5 y* \* |4 z% o" W9 b myUDOdoubles[2] = myCursor.Z;
% ~, q4 h3 y$ A5 X' A firstUDO->SetDoubles(myUDOdoubles);8 }1 g6 L9 X# h2 i+ b) W' v' ^
// add the udo to the display list manually
# t. w; g& a3 l5 m7 A // this will force the udo to display immediately, o% ^$ y% s5 U* D6 B+ L
UF_DISP_add_item_to_display(firstUDO->GetTag());8 W) G7 \3 {+ H
}/ l& f r; b) m, r( B: [
UF_terminate();" x8 a6 e& R' G! s8 N
}
8 `: d( ?5 A# Y2 l. f9 {7 c catch (const NXOpen::NXException& ex); _2 V+ l4 q. D/ j5 F3 \" Q2 @9 S
{" S) @7 r* p0 {, d8 K
ECHO("Caught exception: %s\n", ex.Message());5 a2 h# ^. S# w; U/ V C4 `! P
}/ m& l! K& n6 u E, X
}
" O5 i" M7 T7 T$ \7 j6 g4 l2 N W! U9 x: a+ v; Q: ^
//------------------------------------------------------------------------------
% }' H! {* [' H5 X// ufsta
" n6 ~9 |0 W* X: a9 n; R// Entrypoint used when program is loaded automatically! s7 f% o9 K& |
// as NX starts up. Note this application must be placed in a0 q2 S: v% W1 l
// special folder for NX to find and load it during startup.
2 }7 u3 K6 }9 E// Refer to the NX Open documentation for more details on how& M ~& F& t2 S; @! ~
// NX finds and loads applications during startup.% a; u9 v% u4 M. k" F: u
//------------------------------------------------------------------------------
( O8 {" C; {3 e; X1 s: V# Mextern void ufsta( char *param, int *returnCode, int rlen )7 f. ?0 D) ^1 B. {
{
7 ^0 P* n9 _ A6 k! K0 ] try4 B* x2 F9 ^+ q4 `+ j ~+ S
{$ g$ v5 f- g. U7 v4 R- w. x
initUDO(false);
0 N6 y2 _ ^% L }
4 W9 V1 y4 }7 o3 f' g6 i, L; E catch (const NXOpen::NXException& ex)# Z( V3 E) x2 K5 o% K9 ]
{
" H I( c5 {6 A5 {; L1 N I ECHO("Caught exception: %s\n", ex.Message());: z! f, Q+ O6 I( O+ S! ]
}
0 y2 A* Z+ w- P y: I2 S" H}0 K5 c) z7 U& @2 o
5 i; u) K1 R% y//------------------------------------------------------------------------------9 e$ }) L! }4 @9 u' o
// ufusr_ask_unload* I3 v/ j5 V" o9 Y( K4 v
// Make sure you specify AtTermination for the unload option.& ]- J" a) O J# h- `5 x
// If you unload the library before the NX Session Terminates
8 @$ \4 ]$ f6 E2 A7 }3 Y// bad things could happen when we try to execute a udo/ h, y5 |. M. W$ R z( F0 r0 x
// callback that no longer exists in the session.
: q; |, m. R9 B. ^! v//------------------------------------------------------------------------------
6 ~6 Y s; ~7 Hextern int ufusr_ask_unload( void )
8 p- M3 v+ z7 G; p, f{
- {& h( k2 E/ ^' N& c return (int)Session::LibraryUnloadOptionAtTermination;; ~1 i8 U5 X: y8 W2 \* ^0 N
}
$ G6 L1 p! Z% I( e4 P/ n, M3 D8 e( C2 {) D W8 e, u! }
|
|