查看: 1383|回复: 0

[资料分享] 如何获取选择点映射到视图空间中?源码分享

[复制链接]

4

主题

3

回帖

36

积分

管理员

积分
36
发表于 2023-7-15 12:08:47 | 显示全部楼层 |阅读模式

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

×

1 ^3 Y6 @; A5 u9 ^* v' A% d' W6 C( |# \4 V3 U& r
如何获取选择点映射到视图空间中?源码分享: A2 |& u6 @- K* r
8 j: M$ h2 Y; i4 E# M# G
  1. //------------------------------------------------------------------------------8 y  Z& \+ j3 J( Z% M' h
  2. // Select Screen Position and map to Modeling View Plane) F6 K7 a0 j+ L8 r7 ]/ T& _+ q( x
  3. //------------------------------------------------------------------------------
    % L" j9 E" {! V. d4 [6 P- k9 J& ]
  4. bool GtacPmi::SelectPmiPosition(NXOpen::Point3d &pos)2 h* m7 J2 V; T6 `6 ]% f
  5. {
    . ]! M2 t' ~' X, n
  6.     NXOpen::View* myView = NULL;" \. V+ t' D( O/ r5 `% H2 D
  7.     NXOpen::Point3d myCursor(0, 0, 0);+ o& a( c. N2 d# v7 b5 T
  8. ; \9 S1 s7 W! {/ i- \% D
  9.     NXOpen::Selection::DialogResponse myResponse = m_ui->SelectionManager()->SelectScreenPosition("Select Screen Origin", &myView, &myCursor);+ D* n0 r) y7 |4 Y7 @
  10.     if (myResponse == NXOpen::Selection::DialogResponsePick)* A. M3 V6 ^6 \
  11.     {0 x* X, N0 u$ O2 X4 o
  12.         // obtain the current default annotation plane where PMIs are placed on
    . K0 i8 e( y  M/ M/ M% O
  13.         NXOpen::Xform *xform1;$ q# B; m& ^; P4 z0 H; K# e5 a
  14.         xform1 = m_wpart->Annotations()->GetDefaultAnnotationPlane(NXOpen::Annotations::PmiDefaultPlaneModelView);- [4 p: e2 M3 d2 N" k8 |" b+ \
  15.         NXOpen::Matrix3x3 vmxDefaultPlane = xform1->Orientation();1 j7 N; ^- P. v) V( [' C
  16.         NXOpen::Point3d ptDefaultPlane = xform1->Origin();
    2 R* P! U$ q  ]# C
  17.         NXOpen::Vector3d vecDefaultPlane(vmxDefaultPlane.Zx, vmxDefaultPlane.Zy, vmxDefaultPlane.Zz);3 \6 R" l1 _, o* L" X( b

  18. 4 Y* X: J* K$ c# R$ l
  19.         // create the ray 'into the screen' at the selected cursor position
    - i' Q3 g+ J0 L
  20.         NXOpen::Matrix3x3 vmx = myView->Matrix();
    3 q* @; Y; Y1 u2 o& P* \  x9 ^* |6 `
  21.         NXOpen::Point3d p1(myCursor.X - vmx.Zx * 1000, myCursor.Y - vmx.Zy * 1000, myCursor.Z - vmx.Zz * 1000);+ D4 K  C7 b% x4 a( T/ u
  22.         NXOpen::Point3d p2(myCursor.X + vmx.Zx * 1000, myCursor.Y + vmx.Zy * 1000, myCursor.Z + vmx.Zz * 1000);
    ! m% W1 T4 o+ ^9 B/ S# C, |& I
  23.         NXOpen::Line *lineRay = m_wpart->Curves()->CreateLine(p1, p2);
    + u/ V6 O; e7 J  F! z. s$ ?
  24.         lineRay->SetName("Ray");6 h/ K# B( L  ~+ _+ u4 Q: K
  25. ! b! H% |3 ]/ u0 `/ l" h/ f
  26.         // create the plane from the view to intersect with the ray
    , Y8 p$ S9 L  T  R
  27.         NXOpen::Plane *planeView = m_wpart->Planes()->CreatePlane(ptDefaultPlane, vecDefaultPlane, NXOpen::SmartObject::UpdateOptionWithinModeling);2 i* n0 ~) J5 ?4 T) z2 p
  28.         planeView->SetVisibility(NXOpen::SmartObject::VisibilityOptionVisible);8 l& S; I0 K$ J* c
  29.         planeView->SetName("ViewPlane");* V! I9 O+ }1 ?- _0 Z" j* `

  30. - P# u8 {) z" J3 ?
  31.         // now create the intersection point
    & s% z# K; ^: [( V2 |
  32.         NXOpen::Point *pntInterSect = m_wpart->Points()->CreatePoint(planeView, lineRay, NULL, NULL, NXOpen::SmartObject::UpdateOptionWithinModeling);
    0 A- z5 S* L1 W% u
  33.         pntInterSect->SetVisibility(NXOpen::SmartObject::VisibilityOptionVisible);" O( d, y& e3 v- b" F
  34.         pntInterSect->SeTColor(10);
    - _( M- F; r$ @0 o& }
  35.         pntInterSect->SetName("Intersection");: ~: }3 l0 T/ \$ L' X! [

  36. 5 v* W, o2 w$ [( I
  37.         pos = pntInterSect->Coordinates();" ?6 I% ]9 B9 E& ], E& f2 l
  38.         print("\nPMI Position:", pos);
    , |9 `' N/ `7 F0 @: p) x8 Y) d

  39. $ D! o: g1 `* s! ]4 f+ ^% E
  40.         // clean up - comment to see intermediate objects
    $ P& m1 ~  M$ F( |+ K! i
  41.         NXOpen::Session::UndoMarkId markDel = m_session->SetUndoMark(NXOpen::Session::MarkVisibilityVisible, "Delete");
    1 z0 I. K7 _$ G- R9 Z
  42.         int nErrs1 = m_session->UpdateManager()->AddToDeleteList(pntInterSect);
    " X: B8 p6 ~4 G
  43.         int nErrs2 = m_session->UpdateManager()->AddToDeleteList(planeView);
    . z/ h8 I( X; I' `' @2 w
  44.         int nErrs3 = m_session->UpdateManager()->AddToDeleteList(lineRay);+ X6 |( L7 m3 j- l" v
  45.         int nErrs4 = m_session->UpdateManager()->DoUpdate(markDel);$ }5 X, R0 o6 Q6 w
  46.         m_session->DeleteUndoMark(markDel, NULL);
    8 {) `/ M5 T  z# [) W6 n
  47. % O1 G& G' V) }0 B- K! D
  48.         return true;% h" i3 K" m' x& z% L" l
  49.     }) i3 r3 c( O- L" v' C

  50. 7 b  r# r5 n) Y) a8 B6 g: p( Z
  51.     return false;& o. y1 Q; v7 m: U) T. F7 \$ U- f
  52. }
复制代码
8 l3 G( t$ @. W6 t
' @6 w9 K# W% h' G
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

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

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部