查看: 1482|回复: 0

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

[复制链接]

4

主题

3

回帖

48

积分

管理员

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

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

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

×
! m5 g/ \+ f3 f

  r6 P7 o  J) ?, a9 x如何获取选择点映射到视图空间中?源码分享
& W; ^' f* t' E1 c% B0 j) W
6 V4 k( o3 f( f0 y% Z
  1. //------------------------------------------------------------------------------1 x3 e) {. B% K3 x+ y
  2. // Select Screen Position and map to Modeling View Plane
    ; P0 m. x) m% r1 N) E7 R% ?
  3. //------------------------------------------------------------------------------; V8 a- K: H6 w
  4. bool GtacPmi::SelectPmiPosition(NXOpen::Point3d &pos)
    5 c& M) b1 C0 o: x7 u
  5. {
    - P4 e; f* ~8 }7 g& Q
  6.     NXOpen::View* myView = NULL;  g6 z: ^9 ?  o
  7.     NXOpen::Point3d myCursor(0, 0, 0);" L3 n3 f+ J' z; T

  8. 3 Z% A. |# M1 J- u4 W- g
  9.     NXOpen::Selection::DialogResponse myResponse = m_ui->SelectionManager()->SelectScreenPosition("Select Screen Origin", &myView, &myCursor);8 |6 Q* M2 `, ?3 ~% e
  10.     if (myResponse == NXOpen::Selection::DialogResponsePick)  q$ V" J! h4 V
  11.     {* L% y2 x( t- }8 k! f+ \, e
  12.         // obtain the current default annotation plane where PMIs are placed on+ b$ \& l' s( s
  13.         NXOpen::Xform *xform1;
    0 h4 c# a6 t8 ~+ Q8 i9 I; O: E
  14.         xform1 = m_wpart->Annotations()->GetDefaultAnnotationPlane(NXOpen::Annotations::PmiDefaultPlaneModelView);, r! b5 Q7 b# g+ Y& M+ x
  15.         NXOpen::Matrix3x3 vmxDefaultPlane = xform1->Orientation();
      ~5 Y3 n0 ~/ c& o1 S, L
  16.         NXOpen::Point3d ptDefaultPlane = xform1->Origin();3 y: P& ^  ]7 R
  17.         NXOpen::Vector3d vecDefaultPlane(vmxDefaultPlane.Zx, vmxDefaultPlane.Zy, vmxDefaultPlane.Zz);
    / v6 e" G  [4 h
  18. 3 G/ f0 }, R( F3 |% T  H
  19.         // create the ray 'into the screen' at the selected cursor position( G: q, Y% v4 j/ Z8 {, B
  20.         NXOpen::Matrix3x3 vmx = myView->Matrix();% o/ m9 g- X/ f" _/ U
  21.         NXOpen::Point3d p1(myCursor.X - vmx.Zx * 1000, myCursor.Y - vmx.Zy * 1000, myCursor.Z - vmx.Zz * 1000);+ A* E% ]: g% r/ A6 D5 S9 s/ E
  22.         NXOpen::Point3d p2(myCursor.X + vmx.Zx * 1000, myCursor.Y + vmx.Zy * 1000, myCursor.Z + vmx.Zz * 1000);
    3 M. U7 L3 o" ?" ^# `
  23.         NXOpen::Line *lineRay = m_wpart->Curves()->CreateLine(p1, p2);
    * w/ d+ k" ?  C4 h4 s' t8 J* f
  24.         lineRay->SetName("Ray");& ?- M7 V' _* x
  25. + A) _& i! S; }  E) \# f
  26.         // create the plane from the view to intersect with the ray
    - Q3 R% W; G& Y! |/ [3 t) B. Q* F
  27.         NXOpen::Plane *planeView = m_wpart->Planes()->CreatePlane(ptDefaultPlane, vecDefaultPlane, NXOpen::SmartObject::UpdateOptionWithinModeling);4 W% x7 f. k2 Y  {+ f& F6 u7 w( I
  28.         planeView->SetVisibility(NXOpen::SmartObject::VisibilityOptionVisible);3 n4 G% C7 e( s: X* N# W
  29.         planeView->SetName("ViewPlane");, U. e. m& y% v4 Z# [  |9 O
  30. 7 g$ h9 i9 k* R# z3 l' F7 J
  31.         // now create the intersection point$ c$ b, q5 ^  \6 n6 F, R% L
  32.         NXOpen::Point *pntInterSect = m_wpart->Points()->CreatePoint(planeView, lineRay, NULL, NULL, NXOpen::SmartObject::UpdateOptionWithinModeling);
    % Y% R$ Z# G% V# S9 }7 C* r' k
  33.         pntInterSect->SetVisibility(NXOpen::SmartObject::VisibilityOptionVisible);5 k$ X' [' `# d. H) c- g
  34.         pntInterSect->SeTColor(10);* Q0 m5 z. S. g* M: E8 a9 ]
  35.         pntInterSect->SetName("Intersection");" S# B7 A% Q; t3 ]! k" H

  36. 2 J: U. i3 W  U( n1 g! N
  37.         pos = pntInterSect->Coordinates();
      R" F  a! C1 |
  38.         print("\nPMI Position:", pos);
    / f1 B& {3 ?5 T; S, L8 W

  39. " |- ?! H& y" `. _6 s! j- }
  40.         // clean up - comment to see intermediate objects4 T0 k( X  o9 l) l. i# r1 X7 I
  41.         NXOpen::Session::UndoMarkId markDel = m_session->SetUndoMark(NXOpen::Session::MarkVisibilityVisible, "Delete");. o7 J7 c' x7 @
  42.         int nErrs1 = m_session->UpdateManager()->AddToDeleteList(pntInterSect);
    9 N. Q% h1 O2 o" p7 V# K
  43.         int nErrs2 = m_session->UpdateManager()->AddToDeleteList(planeView);) N; l. T/ q% p, Q* z) B
  44.         int nErrs3 = m_session->UpdateManager()->AddToDeleteList(lineRay);. W' ?, T$ G+ m# X& \8 Q
  45.         int nErrs4 = m_session->UpdateManager()->DoUpdate(markDel);( `) K+ b) B0 y1 s( `
  46.         m_session->DeleteUndoMark(markDel, NULL);
    ! J  k6 r; A2 D9 ~0 ?+ d

  47. ! O; d7 V* ?5 N$ F/ Z4 l
  48.         return true;
    7 E$ P8 b, \5 B- i7 l
  49.     }
    1 j9 R/ Y( I0 k, e' o% t. n
  50. 6 g& u" f7 m! e, h
  51.     return false;
    2 w: ?9 [) J; h
  52. }
复制代码

+ t2 O5 h6 {  c0 v6 l
$ |% B- A4 ^1 S4 t) j
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

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

本版积分规则

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