|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
5 m+ }3 Z7 Y6 E B! \# W- E( {5 t+ E0 H8 `( ^% E' j
NX二次开发源码分享:NXOpen C++创建UDO的过程1 t, K6 H6 c- a3 c7 B2 n* [
) ]' `$ T: P- G6 g% t3 J
" l' x9 S0 \8 r J R3 s3 P2 qUDO的创建是NX二次开发中最高深的一部分内容,通过这个实例,你可以看到如何注册UDO的回调函数,如何创建UDO,定义UDO的编辑,UDO的信息显示等内容!
! O! j7 Q8 e( T, } x9 M# W( o; {4 X) w! Q1 ~
6 ]+ k# O8 E* X& _: V
3 y- h# n: K* v1 M: H
#include <stdio.h>" Z- g9 i$ U+ U# U0 ^3 U6 s4 R7 B
#include <string.h>. a( j) r: v# k# c; h
#include <stdarg.h>. E' x( I7 t* C9 t& o2 i6 y
#include <uf.h>
% l3 Q/ N8 ` ~: F! @9 F0 g#include <uf_ui.h>/ s! c7 G" g3 l5 M6 r) Y' K
#include <uf_exit.h>4 c4 m, K2 b: y2 E0 z& w
#include <uf_disp.h>; C$ N* Q3 Y% W; f) h) r
# F8 E; B- A( U4 k( Nstatic void ECHO(char *format, ...)
) M* ~; z6 d& A6 F{
, J" D5 f0 S. d H char msg[UF_UI_MAX_STRING_LEN+1];
' _* x" q# f, C5 R va_list args;
+ v( S) c6 m% S va_start(args, format);
. U4 d3 W; w4 M' p* C: R vsprintf(msg, format, args);
5 \0 o$ z8 ?. d( r. b va_end(args);7 g# d$ p' i" y* x; d( z
UF_UI_open_listing_window();
& I4 O2 E/ ?; v7 {& w5 m8 ] UF_UI_write_listing_window(msg);
# [' |5 I% R6 ~* h8 o2 Y UF_print_syslog(msg, FALSE);
. [, n# H! Q& N* L/ f/ @% G}* U/ c h) s% ^ \0 y5 q
: f& ?) y& [: ?# s j#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))( y" ?: J1 Q( V/ ~ L
7 X! i, _7 h! b m* {# w2 i2 ]
static int report_error( char *file, int line, char *call, int irc)
5 i J# f$ Z0 a; P( ~/ B w{: N4 _4 S6 e- ?) J; B M
if (irc)
G; t2 }* G- x* b: H {& L. T. y* W! \; u* S
char err[133];
& T9 V6 H. b7 W6 l* l9 A1 f" P9 u
) c* N* d8 x+ s- x7 Z) \ Q) i UF_get_fail_message(irc, err);* j/ P9 Q; g" C! f) V
ECHO("*** ERROR code %d at line %d in %s:\n",7 O; S0 X3 j/ c/ V1 [+ A: _
irc, line, file);
" J8 Z6 k' q% |+ X; R% {# B ECHO("+++ %s\n", err);* q! @0 d( I: q' y
ECHO("%s;\n", call);
3 Y S; R: K6 k+ G }' v9 G. q G0 @& ]& J, [- n
3 H+ n6 j6 L" O# U' H8 X# f& [
return(irc);$ d3 V4 r V4 D3 q/ Y, Y+ V, \
}1 e% A8 ~$ k4 `) g* {
4 X* l* T' {( T! K" F# i4 D$ N#include <NXOpen/Session.hxx>
+ D4 S' q2 I: a: |. w1 n#include <NXOpen/Part.hxx>
5 K' G+ b {* F0 G9 x* V3 U7 G#include <NXOpen/ParTCollection.hxx> 4 {4 O. r2 I1 R. c! \
#include <NXOpen/Callback.hxx>4 `& c: J6 R% [9 Q' P
#include <NXOpen/NXException.hxx>7 Z& R, t* v. r( Y* V+ f8 C6 ?
#include <NXOpen/UI.hxx>- ]6 s8 H; Z: A0 l4 D5 g/ J
#include <NXOpen/Selection.hxx>* k" ^& }! n0 E4 q" L1 M% g
#include <NXOpen/LogFile.hxx>
% X; w% O7 [* X5 K) c) `$ B#include <NXOpen/NXObjectManager.hxx>3 u9 Y, w1 ]5 ]% n
#include <NXOpen/ListingWindow.hxx>
. x% ^$ ]) A. @9 t#include <NXOpen/View.hxx>$ H" M2 ^* _7 j5 k; d9 o8 r4 W
: ]0 z: y3 I, f% u& d4 s1 o$ ]7 F#include <NXOpen/UserDefinedObjects_UserDefinedClass.hxx>& F. y) v Q3 D. M c# B! `* l8 D
#include <NXOpen/UserDefinedObjects_UserDefinedClassManager.hxx>% F5 `* Q( Q: ]4 f" s
#include <NXOpen/UserDefinedObjects_UserDefinedObject.hxx>6 d. T3 ]+ k, A" x9 h- i+ }
#include <NXOpen/UserDefinedObjects_UserDefinedObjectManager.hxx>; f* p4 O; K8 v# K C! s& q
#include <NXOpen/UserDefinedObjects_UserDefinedEvent.hxx>" E: }+ g) ]4 n* p/ a
#include <NXOpen/UserDefinedObjects_UserDefinedDisplayEvent.hxx>
4 m& N! ~" H, g4 {9 L% @#include <NXOpen/UserDefinedObjects_UserDefinedLinkEvent.hxx>5 g6 c' O$ s' ]! Y* ?- W3 o
#include <NXOpen/UserDefinedObjects_UserDefinedObjectDisplayContext.hxx>4 d* W K9 o3 U6 W, Y2 H
( G6 l/ i: w2 jusing namespace NXOpen;8 c& T- V! q. f/ Z2 J2 Q- J( H
using namespace NXOpen::UserDefinedObjects;9 m( A" s* G O- d
/ e: \8 R: Q/ |) u. z. V& C//static variables3 G" {$ {( V9 o
static NXOpen::Session* theSession = NULL;! `3 b8 Y" y! [
static UI* theUI = NULL;
# n' B- k% T. [- s+ tstatic UserDefinedClass* myUDOclass = NULL;
* h5 J' H! p* E( C' Y3 f) w
) d, D; c6 r2 e( k& g//------------------------------------------------------------------------------7 `9 }! Z8 y. ~$ c7 c# ]
// Callback Name: myDisplayCB, d8 ]2 D' _ J
// This is a callback method associated with displaying a UDO.
3 e$ e1 s! P! M$ o& \: b// This same callback is registered for display, select, fit, and attention point
" ]/ w, E; N# t, D3 O, l//------------------------------------------------------------------------------* ~# V+ ]0 L. a! b% t( | c# R
extern int myDisplayCB(UserDefinedDisplayEvent* displayEvent)
( l* F1 |! O3 O2 s: l% ~3 l" _{, S/ D" i# F' W0 C7 S
try, l/ a8 R& Q1 e4 G A* g
{% |& t* n5 ]/ i' @
// Get the doubles used to define the selected screen position for this UDO.9 H+ }* i3 y; g6 E
std::vector<double> myUDOdoubles = displayEvent->UserDefinedObject()->GetDoubles();
5 Z) t7 E. X; M: ^+ Q: R
) v& G; n. w, r3 m( {' N+ I" V // Use the doubles to define points of a triangle
: W3 r( P0 S# }& w0 W0 M std::vector<Point3d> myPoints(4);
: v1 Z! S( R( ^: O4 I6 f+ R
" W( N' x5 V- M* E myPoints[0].X = myUDOdoubles[0] + 0;. \* |( L4 Z/ \7 c" K, E6 \; a
myPoints[0].Y = myUDOdoubles[1] + 0;
# I+ ?2 p5 M4 N! D myPoints[0].Z = myUDOdoubles[2] + 0;
: U* E& \ _3 Z# B- U+ A% a8 n4 E. V/ V
myPoints[1].X = myUDOdoubles[0] + 100;
! \) P/ \. r* Z) T9 l2 n7 g3 v myPoints[1].Y = myUDOdoubles[1] + 0;5 F8 [4 } h! O: i( g' c; C4 W% ^( H
myPoints[1].Z = myUDOdoubles[2] + 0;( h1 b5 M7 u' E
6 D& Y/ @4 h, k) l6 `5 b' i+ H% N
myPoints[2].X = myUDOdoubles[0] + 0; `9 L- h" z$ H( c) B" x/ t
myPoints[2].Y = myUDOdoubles[1] + 100;: c/ c J9 K; a/ r' M! T8 o
myPoints[2].Z = myUDOdoubles[2] + 0;
- b- t. b! z; X9 T" h/ Y7 }6 T0 a3 B# J- o0 e; W3 `
myPoints[3].X = myUDOdoubles[0] + 0;
7 w% l, q x8 m+ W myPoints[3].Y = myUDOdoubles[1] + 0;
+ N& t) U0 h1 |6 g# {1 B# h myPoints[3].Z = myUDOdoubles[2] + 0;: j, T0 _1 S, c) b% j8 P# u
, P9 D! V, k3 c/ B6 {2 T; B
// Display the triangle
) I+ a- V6 M) w! d displayEvent->DisplayContext()->DisplayPolyline(myPoints);
( n& r9 x" }0 J& M# c
}, f" S; [- e9 W1 B/ U // Display the text next to the triangle# A- C. N" r+ _: e* Z: {
Point3d myPt = Point3d(myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2]);5 E( r3 {- s4 X8 G6 r5 E, _$ H
displayEvent->DisplayContext()->DisplayText("C++ UDO", myPt, UserDefinedObjectDisplayContext::TextRefBottomLeft);
4 q5 F# ]& d: a& {2 x- J9 W
2 v& { Z+ h7 }$ A* g // UserDefinedObjectDisplayContext::DisplayFacets fails - see PR 6731653
" m6 y6 c6 H" D; B( n P' o // This demonstrates using UF_DISP_display_facets as a work around H( a8 E$ p3 E' b+ a
double normals[9] = { 0,0,1, 0,0,1, 0,0,1 };
; w v* ~6 p6 z* w5 ? double vertices[9] = { myUDOdoubles[0], myUDOdoubles[1], myUDOdoubles[2],
& [' H. T2 V4 u myUDOdoubles[0] + 100, myUDOdoubles[1], myUDOdoubles[2],' b# j. P1 L: K, ]8 f. ?
myUDOdoubles[0], myUDOdoubles[1] + 100, myUDOdoubles[2] };3 t/ [- G' b2 W+ w [
UF_DISP_facet_t facets[1] = { vertices, normals };6 |" J! Q9 i; S' q0 U" M
void *context = displayEvent->DisplayContext()->GetHandle();
# R0 h. q7 \/ q4 ]; _! C; D6 B- L$ w a0 N# y$ G
UF_initialize();
( x7 o3 {/ `5 ~ k) N. p) ]2 K UF_CALL(UF_DISP_display_facets(facets, 3, 1, UF_DISP_TRIANGLE, context));
& w* C# Y3 j% H# S# u2 u UF_terminate();
& M2 Z9 c8 V6 {$ |3 j# @ A: z' s
}" n1 F& ]% J; H* E* x
catch (NXException ex)
. V/ N+ ~1 a+ b# e" D {
+ D& V" M! o2 }; y+ U; p ECHO("CaUGht exception: %s\n", ex.Message());1 C) z) }; `* H, o9 y" T) \
}
+ p+ f7 y8 ]; R! V/ v- O# O return 0;
0 `% ^, D" u$ ]/ a}
5 A5 Z$ _( |5 r9 P1 w2 J# W9 l. D//------------------------------------------------------------------------------
: G' Q+ a! c' U! Q) V; @2 T// Callback Name: myEditCB1 U* u) i! H& m8 P, F+ ]1 y
// This is a callback method associated with editing a UDO.
J2 r6 x( |. _* V( j//------------------------------------------------------------------------------# h) |& g" [9 ~/ o7 x q
extern int myEditCB(UserDefinedEvent* editEvent)& A" f0 i: U; a/ {) ]! C
{
; g& L- m+ L8 u try
* i/ Y+ `: B8 Q* G5 t {
: p7 | ~/ T+ V ^& a // required for calls to legacy UF routines* i7 G; v: F6 w- T: V% d0 H
// such as UF_DISP_add_item_to_display
& n7 ~( n6 F6 {" p7 T" o UF_initialize();) l% m4 q" K/ V" I# m# r% F/ }1 A' \
v8 Z. N% X* E1 _$ d
View* myView = NULL;
0 _" t$ }/ |; H% g# Y Point3d myCursor(0,0,0);
3 j% x7 `6 o) N% x! d! b6 u. X( k v6 ]9 T s( v- V/ y7 L5 N
// highlight the current udo we are about to edit
1 r+ { u1 I' Y // this is helpful if multiple udo's were on the selection: S* G: q# w9 }1 u# a/ C# g* k1 l
// list when the user decided to edit them8 g0 c6 ^8 R3 P9 S& k# h
editEvent->UserDefinedObject()->Highlight();( ^% ^- W1 A% b% x
6 c& k3 y+ C, P+ G
// ask the user to select a new origin for this UDO4 V& X7 Z8 V1 W* u( d5 n
Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select New Origin for C++ UDO", &myView, &myCursor);
2 H! B7 D- U2 C6 C) a) C) F8 [5 _ // we are done asking the user for input... unhighlight the udo
( W( E9 x8 A- _' i0 X5 M0 G) u B editEvent->UserDefinedObject()->Unhighlight();% @2 |& \7 O3 J+ u* a6 S
n. u- G2 c2 z# u; U/ m7 o5 M. a, P! p
// use the new screen position (if the user picked one)' W/ {5 s' |6 t. I
if( myResponse == Selection::DialogResponsePick ). _4 L0 ]- E( O3 Z( F
{# p8 v: E( b& m5 h* f) Q1 i6 Y
std::vector<double> myUDOdoubles(3);
. r2 ~4 U/ C5 |; u7 S) q myUDOdoubles[0] = myCursor.X;6 d8 | u' v0 Z s
myUDOdoubles[1] = myCursor.Y;" l0 A$ {4 u- |: r( ~/ v
myUDOdoubles[2] = myCursor.Z;
, @) ]; [, i! N+ |8 k" J // store the newly selected origin with the udo
, S$ u, ^0 i9 W/ E1 S5 i; K editEvent->UserDefinedObject()->SetDoubles(myUDOdoubles);
) ]$ u% e4 O9 r v# n9 m // add the udo to the display list manually
; K% r3 i7 M3 t // this will force the udo display to regenerate
* g- `' K3 F5 B5 V! W // immediately and show the changes we just made
9 g& m0 \3 f0 W1 y, v6 E+ i! Z UF_DISP_add_item_to_display(editEvent->UserDefinedObject()->GetTag());
& m) q0 x4 h0 C4 c }3 ~4 V/ y+ L5 b
UF_terminate();
4 P! ?3 R- S( L9 I C } catch (NXException ex)4 ?+ e6 i! N( h5 G
{
1 R% g8 l( G& [/ L# L j ECHO("Caught exception: %s\n", ex.Message());0 u3 l, I# M: z+ d3 W
} return 0;) u: W& b0 o2 @& n4 A
}( l7 q% r& A; `3 ^/ v7 @+ U6 |; u
//------------------------------------------------------------------------------. D% u0 B) z( }6 i3 t/ \. l: V
// Callback Name: myInfoCB
! p J# o5 r8 u+ C! Z% ~. O// This is a callback method associated with querying information for a UDO.
/ W9 m. \% R0 I8 I, W; L& b8 [// The information is printed in the listing window.3 a) Y: `1 l ?) G! T4 ~
//------------------------------------------------------------------------------
5 \2 ^' Y3 k1 W# x1 Wextern int myInfoCB(UserDefinedEvent* infoEvent). I% J0 R7 b: V: ^: ^% M8 Q
{9 f- ]4 q1 a/ o4 I m3 V
try3 Q4 f1 t- M0 R# [! e, Z3 k7 e- `
{8 d( C6 q* P% `9 W; @0 t2 @. C! H; u
ListingWindow* theLW = theSession->ListingWindow();; w2 ?( F. \ I& i$ k
char msg[256];. G6 w) v8 @) l) ?: A( J4 F
theLW->Open();, c! l8 S, X3 x$ L4 a4 p
theLW->WriteLine(" ");
( c! c. l. f$ d5 G" Q9 J* ~- D theLW->WriteLine("------------------------------------------------------------");3 [% {% j. T8 C2 Z6 E/ U! W& y! o: {" Z2 Q
theLW->WriteLine("Begin Custom Information");, V& k0 w1 }/ z5 f3 {4 x; t: U% U0 ]
theLW->WriteLine(" ");
/ u: m7 R7 `" O! F) a sprintf( msg, "UDO Class Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->ClassName().GetLocaleText() );
+ H9 a0 Y R/ w5 J8 N7 m theLW->WriteLine(msg);
1 z: W6 H( G- C+ z( l% Q sprintf( msg, "UDO Friendly Name: '%s'", infoEvent->UserDefinedObject()->UserDefinedClass()->FriendlyName().GetLocaleText() );2 S! K& M# d% i- P$ D) [* Y
theLW->WriteLine(msg);7 p& H2 A2 I* d
std::vector<double> myUDOdoubles = infoEvent->UserDefinedObject()->GetDoubles();/ x8 F8 o' p8 O% P6 q, l* @0 ^
sprintf( msg, "myUDOdoubles(0) = %f", myUDOdoubles[0] );
! F6 b" O( {. A6 q theLW->WriteLine(msg);+ }# `5 ]- M) W) R F3 B0 T) X% Q
sprintf( msg, "myUDOdoubles(1) = %f", myUDOdoubles[1] );$ W3 C, k0 n' ?/ e4 }3 Z
theLW->WriteLine(msg); sprintf( msg, "myUDOdoubles(2) = %f", myUDOdoubles[2] );
7 S f2 S: n' e* t# u theLW->WriteLine(msg);
, Y5 {/ Q8 I4 \1 I$ P6 P0 v theLW->WriteLine(" ");6 U1 N3 |& i5 Y/ t
theLW->WriteLine("End Custom Information");6 @2 ~% U* L/ s2 u1 g# C
}) H0 |% O- [3 X8 B
catch (NXException ex)% O( a7 k% {5 e1 |3 X
{# y5 o+ P, }$ k: N1 a# c
ECHO("Caught exception: %s\n", ex.Message());
# t& o m5 f7 ]+ g5 u7 r }1 Y" B1 K3 L1 [4 P; q
return 0;
3 `! D0 o. P9 N- t}, Z7 Q- ^( n$ m" y* V! ~8 F
9 _2 u8 w. X) `: U6 Y( u8 g6 K/ k
//------------------------------------------------------------------------------6 ?- N8 P) _+ j/ d3 A9 o
// initUDO
; ?* M, y! c1 Q1 T// Checks to see which (if any) of the application's static variables are
3 R5 d) i& h c x. {// uninitialized, and sets them accordingly.
$ h$ r1 o3 C+ u9 Q0 p. Y- P// Initializes the UDO class and registers all of its callback methods.8 K4 ]' {1 N8 [ m
//------------------------------------------------------------------------------0 M9 H+ \; R) \( ~
static int initUDO( bool alertUser)
/ X. R/ U, X" D' V{& X% C$ ]& S0 K
try
0 X5 L$ Z* S! p* d {
& U# J. S9 e& S# s if (theSession == NULL)1 u) F; }. t; d8 B/ o$ d$ H% p m
{
5 I9 M) G4 H9 u; }/ t' \ theSession = Session::GetSession();
+ W# I; ^9 G- O$ S. Y( M/ z* | }9 D$ @2 p6 n: W9 f& c O8 e, i
if( theUI == NULL )1 e! q) K3 N$ `3 P
{
4 f$ @! E' z% M6 u. o# ` theUI = UI::GetUI();
9 r0 X6 ]: D$ k }2 C5 t2 w" A+ U
if (myUDOclass == NULL). h @3 l, _: K$ N4 T. V' S/ f" q9 W
{
4 A" p9 z7 W& o! d if (alertUser)# M. l1 u, h' D' z, M# I" i
{
2 T' i0 N4 P0 }& R" s% A% l ListingWindow*
9 q: H1 t6 X9 Y2 \ theLW = theSession->ListingWindow();5 d! \# F% ~! n+ S! a4 c
theLW->Open();- N I( s+ s+ B2 w2 {2 J
theLW->WriteLine("Registering C++ UDO Class");8 a4 h" I" {+ {4 Y
}- [% o- \( S" y+ d4 h3 s
// Define your custom UDO class
* i6 g: P8 `3 i9 C myUDOclass = theSession->UserDefinedClassManager()->CreateUserDefinedObjectClass("Sample_Cpp_UDO", "Sample C++ UDO");! e9 H; g9 F" `% e5 Q
// Setup properties on the custom UDO class+ F1 ]. ^5 e1 ]9 _- {
myUDOclass->SetAllowQueryClassFromName(UserDefinedClass::AllowQueryClassOn);0 V7 |0 j. v- W) N! a
// Register callbacks for the UDO class( _5 D9 o, o2 t7 q8 |7 t
myUDOclass->AddDisplayHandler(make_callback(&myDisplayCB));
" w: f+ o! b9 V myUDOclass->AddAttentionPointHandler(make_callback(&myDisplayCB));
( S- h8 P7 u, h0 p myUDOclass->AddFitHandler(make_callback(&myDisplayCB));0 g$ {1 m( N! H; X/ I
myUDOclass->AddSelectionHandler(make_callback(&myDisplayCB));5 V3 f: f9 E" a
myUDOclass->AddEditHandler(make_callback(&myEditCB));
c$ x5 m* d8 f3 d) B, L+ s. E myUDOclass->AddInformationHandler(make_callback(&myInfoCB));
# V4 m! t; Y3 t // Add this class to the list of object types available for selection in NX.
4 f4 i. n; `4 p% [ // If you skip this step you won't be able to select UDO's of this class,
' O# U: T; i" i // even though you registered a selection callback.1 z5 R, G" y6 [9 S3 m
theUI->SelectionManager()->SetSelectionStatusOfUserDefinedClass(myUDOclass, true);: @9 |3 J* c3 E" d. }) ~. [+ O
}: l5 V# o1 `( v# z/ m" S2 o
}
$ C3 a/ Z' M& j catch (NXException ex)9 [5 j1 c4 r6 ~% s1 U9 a& ^( ]) p4 s
{
- Z2 {* ^" t7 N ECHO("Caught exception: %s\n", ex.Message());
( c x q1 u& \% D }+ n! M! Z0 x" E" }* _
return 0;
* G2 ~, k* n& e5 W}; v. D$ x O' J' ]2 a# @
3 d9 b, t! E) Y5 p& I! j
//------------------------------------------------------------------------------
+ |9 k7 e/ U6 ]+ M. A// ufusr (Explicit Activation)
- R6 E+ H @5 W3 i( M1 I0 G% Q5 B// This entry point is used to activate the application explicitly, as in
0 Q7 {- V4 \! C5 C& s: E1 a// "File->Execute UG/Open->NX Open..."/ h$ N1 `2 U R# t4 n4 F
//------------------------------------------------------------------------------
5 W2 U5 ? Z+ L: Textern void ufusr( char *parm, int *returnCode, int rlen ); I' M M& @+ D
{
% F- n+ w& h! T4 l. e. m( [# S try
) m: H2 I7 @. x5 k {
, S+ N. L" m& H# b' S0 U) h // required for calls to legacy UF routines
; ^) O1 T) C& }/ @ // such as UF_DISP_add_item_to_display2 A: F- |+ _" N7 U
UF_initialize();
9 ^6 R Q( y [6 v: X3 V
4 q {* i1 ]8 i% ]1 u // initialize the UDO - if we didn't load this library at/ h1 c+ ]- h/ N' I+ ~
// startup, here is our second chance to load it) C6 U& M4 t$ u; T: ]: k7 C3 d
initUDO(true);6 B- s$ w/ K3 M( Q" o
0 J/ p$ ?! n7 C' c
// if we don't have any parts open create one
9 y$ u2 q: {% P3 r! D BasePart* myBasePart = theSession->Parts()->BaseDisplay();4 b4 E% i8 o/ a( p+ {1 ?
if( myBasePart == NULL). T/ r6 r1 X+ L q" W4 I* k
{
( O9 v7 I2 l5 F9 q$ S myBasePart = theSession->Parts()->NewBaseDisplay("test_cpp_udo.prt", BasePart::UnitsMillimeters);0 p. K9 P# O9 A o6 a
}2 d& _5 E( u! B6 [- ] E% w
7 l1 j g. f8 q& B" J: x7 Y
View* myView = NULL;8 {/ \" y2 b, c9 N6 L
Point3d myCursor(0,0,0);
5 H, o4 j6 v( I2 @; y7 e
3 D. F* l' k- ]& ]; j8 ? // ask the user to select an origin for this UDO
- b9 M! }9 u6 H! X) x) j) [, Z' u Selection::DialogResponse myResponse = theUI->SelectionManager()->SelectScreenPosition("Select Origin of C++ UDO", &myView, &myCursor);& [) `- Z5 M3 k/ V( d0 e" k
if( myResponse == Selection::DialogResponsePick )5 O; e+ i5 F0 t% ?
{" \: [. ^! Y4 ~. q( X# R2 m4 t& J1 ?
// The user selected a point - go ahead and create the udo2 l1 D3 J* m1 H. ?/ s
UserDefinedObjectManager* myUDOmanager = myBasePart->UserDefinedObjectManager();/ k/ ^; Y) U+ x3 B' k
UserDefinedObject* firstUDO = myUDOmanager->CreateUserDefinedObject(myUDOclass);: u: L T) R6 G7 Q% r
// set the color property of the udo - just for fun :)- G3 f3 n# s8 j
firstUDO->SetColor(36);
- ], Y- A$ o) s. h. a // store the origin selected by the user with the udo
; a2 k7 Z- D/ S6 i; F- T6 H0 X std::vector<double> myUDOdoubles(3);% K9 j& {7 o( O5 d1 ]$ P3 n
myUDOdoubles[0] = myCursor.X;
) ^4 `6 d9 j' T0 B8 s" s myUDOdoubles[1] = myCursor.Y;
) i8 z# _- ~! S5 p/ Q myUDOdoubles[2] = myCursor.Z;! C: s( b6 d/ t
firstUDO->SetDoubles(myUDOdoubles);
2 ~6 _* J9 h! N; K, K // add the udo to the display list manually
3 W* X( e& u* ~/ D4 O // this will force the udo to display immediately# H T _. W( k$ {' P; j
UF_DISP_add_item_to_display(firstUDO->GetTag());8 h; ]" l9 d5 p+ ^
}
% }2 [4 _! u7 E: Z0 t, { UF_terminate();
: E. \7 d' u* V H }
' C! `. W5 J' u0 l, ?- n catch (const NXOpen::NXException& ex)) t: z2 j( c- s' Y' H: @$ D
{* {) ~0 O2 H5 ^! x
ECHO("Caught exception: %s\n", ex.Message());
$ U9 s: O. C# G" I5 s( P# S. d* \ }
" Z9 ?6 q8 _# y p' K( l4 K5 R( w}' Z- _+ O8 P1 G5 q9 ^! `. D$ r
! e* m; Y! }& ]- k' Z/ v
//------------------------------------------------------------------------------
' g1 \& O" x) U, r8 K6 {// ufsta% V9 T2 U: T9 l6 R2 t' i( O
// Entrypoint used when program is loaded automatically
9 i% s6 `) d. N0 p$ }/ ~ ^" u// as NX starts up. Note this application must be placed in a' ^# s! e$ q1 e
// special folder for NX to find and load it during startup.% j5 t$ I# }, L; G! |5 q- g2 {& `. Z
// Refer to the NX Open documentation for more details on how0 {* Z7 ^9 |9 ^0 f$ u: I a
// NX finds and loads applications during startup.
2 Y3 r E. j1 A7 R7 N8 Z, p5 @//------------------------------------------------------------------------------) d9 A$ E$ C) C$ G7 l# O$ `' Q
extern void ufsta( char *param, int *returnCode, int rlen )6 s$ r/ z- h( e! M* O
{
4 h" Y' f; O3 E try
, H0 W C+ M( n9 n( Y% }5 }- A {- N: g1 n- X' N9 S* j4 M
initUDO(false);, ?' |; Q! t3 l! z' i* P0 @
}
! ?, O% G# K8 P; h+ j( N5 C- V catch (const NXOpen::NXException& ex), N& N" L4 f( A- \! z4 ?7 N
{
1 ^* a/ A& w! ] ECHO("Caught exception: %s\n", ex.Message());. U+ T, M+ n% V- k7 r; J
}0 |3 b5 I# p: v7 V( \+ [6 k% |$ B0 D
}
6 t8 n3 q: f" I+ Y( _9 D! d' d- D# j6 u2 d1 [+ K
//------------------------------------------------------------------------------! a3 T) A5 {. ^1 d
// ufusr_ask_unload
7 N( C6 T- ?; ]; v9 w// Make sure you specify AtTermination for the unload option.
& l4 @; r t `8 {. E// If you unload the library before the NX Session Terminates
( ? N$ v5 \$ I2 ?// bad things could happen when we try to execute a udo
" X X0 k1 t/ W- k& T9 j// callback that no longer exists in the session.
t1 e2 o& T5 `( c* M5 z, x: D//------------------------------------------------------------------------------. S+ l! _* Z% S/ V* p
extern int ufusr_ask_unload( void )
/ B4 ?! @( j, x, s1 W* n{
2 M2 T% t9 g5 j( D! R; w return (int)Session::LibraryUnloadOptionAtTermination;* l4 i2 r: H! @1 K2 E
}
% c: d) z: ^- c! T
% g5 c1 X: O4 U2 X" ]$ C1 t |
|