查看: 1420|回复: 0

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

[复制链接]

4

主题

3

回帖

44

积分

管理员

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

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

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

×
% p7 O# S7 k5 w3 w% i: y
: ^& Y. ?5 m/ l) p+ K. s! I9 v
如何获取选择点映射到视图空间中?源码分享
$ o* q1 P7 x# G: J* t5 |) H& ]9 f* Y! c! h( v5 ~0 n. o
  1. //------------------------------------------------------------------------------
    ' X' l' ]0 W$ K* `7 m) K
  2. // Select Screen Position and map to Modeling View Plane
    0 K. J) R, r8 O
  3. //------------------------------------------------------------------------------
    7 E$ j. I! O( f
  4. bool GtacPmi::SelectPmiPosition(NXOpen::Point3d &pos)6 H  d- y1 |# E, F* T
  5. {" ^  R0 X1 k8 m+ ]8 \. W4 Z
  6.     NXOpen::View* myView = NULL;8 N% w4 x" F) |5 z: K$ O. n
  7.     NXOpen::Point3d myCursor(0, 0, 0);
    8 H) w# P+ Z8 D7 r* j
  8. ) N2 O6 U6 z1 ]* }. i
  9.     NXOpen::Selection::DialogResponse myResponse = m_ui->SelectionManager()->SelectScreenPosition("Select Screen Origin", &myView, &myCursor);
      M9 G, k' E  P: e
  10.     if (myResponse == NXOpen::Selection::DialogResponsePick)3 r) u) i$ t( e( c& Q8 [
  11.     {
    4 `) _0 k$ n5 H6 F" y
  12.         // obtain the current default annotation plane where PMIs are placed on6 I% n/ n6 n! M6 _0 a
  13.         NXOpen::Xform *xform1;/ a( d, D- B1 f
  14.         xform1 = m_wpart->Annotations()->GetDefaultAnnotationPlane(NXOpen::Annotations::PmiDefaultPlaneModelView);
    0 v6 D  J( n, H' N
  15.         NXOpen::Matrix3x3 vmxDefaultPlane = xform1->Orientation();9 ~! C& Z8 o& L& X& @6 F  O1 R4 B
  16.         NXOpen::Point3d ptDefaultPlane = xform1->Origin();6 T; P2 j5 m. Y! H
  17.         NXOpen::Vector3d vecDefaultPlane(vmxDefaultPlane.Zx, vmxDefaultPlane.Zy, vmxDefaultPlane.Zz);
    ) J: p+ y/ c7 _% I3 _3 B
  18. . D( m. K  u# H" C& Z0 T# W8 D, Z+ B
  19.         // create the ray 'into the screen' at the selected cursor position
      E" ~' t8 P& `$ z5 M- x5 W
  20.         NXOpen::Matrix3x3 vmx = myView->Matrix();
    " v& D4 p1 F5 Z& t' Y
  21.         NXOpen::Point3d p1(myCursor.X - vmx.Zx * 1000, myCursor.Y - vmx.Zy * 1000, myCursor.Z - vmx.Zz * 1000);
    9 n% g* C0 B% h/ G0 e& Y$ e
  22.         NXOpen::Point3d p2(myCursor.X + vmx.Zx * 1000, myCursor.Y + vmx.Zy * 1000, myCursor.Z + vmx.Zz * 1000);
    ) q0 o5 p7 z. r
  23.         NXOpen::Line *lineRay = m_wpart->Curves()->CreateLine(p1, p2);
    ! `6 f9 W" J2 G; o" f; R  K+ x- ~
  24.         lineRay->SetName("Ray");$ B$ y6 u/ j/ x# B
  25. 9 ]& c2 H& J7 p, r3 m* e
  26.         // create the plane from the view to intersect with the ray
    , ~, B. h6 _' |  j+ w
  27.         NXOpen::Plane *planeView = m_wpart->Planes()->CreatePlane(ptDefaultPlane, vecDefaultPlane, NXOpen::SmartObject::UpdateOptionWithinModeling);
    + V  v3 Z" ^. N+ P2 \' E
  28.         planeView->SetVisibility(NXOpen::SmartObject::VisibilityOptionVisible);9 l& t" K$ g; `5 ?: V( n
  29.         planeView->SetName("ViewPlane");
    # i% q7 T9 \) }% g
  30. ( ^# G$ Z4 n; u3 S  k
  31.         // now create the intersection point
    1 r% |, L' U, |
  32.         NXOpen::Point *pntInterSect = m_wpart->Points()->CreatePoint(planeView, lineRay, NULL, NULL, NXOpen::SmartObject::UpdateOptionWithinModeling);
    9 t4 s/ a: h! K
  33.         pntInterSect->SetVisibility(NXOpen::SmartObject::VisibilityOptionVisible);2 u$ M) i; k. X3 L9 T2 ?1 X. q
  34.         pntInterSect->SeTColor(10);
    ! j8 N" ]! s9 F8 S
  35.         pntInterSect->SetName("Intersection");0 l5 @, ?; D/ M- u) i8 _

  36. . s" B% E: Y8 Y* f# c
  37.         pos = pntInterSect->Coordinates();" L/ G1 l( ^# e0 f' q. ]3 B5 f
  38.         print("\nPMI Position:", pos);% [9 X2 R. {/ [
  39. / t2 d+ X( f$ S: L% z) d% m
  40.         // clean up - comment to see intermediate objects
    ! ~- C7 L1 a( k" u0 R
  41.         NXOpen::Session::UndoMarkId markDel = m_session->SetUndoMark(NXOpen::Session::MarkVisibilityVisible, "Delete");. [9 r' e- S* W! ^4 a, E- }8 J
  42.         int nErrs1 = m_session->UpdateManager()->AddToDeleteList(pntInterSect);
    3 q4 ]3 C+ H4 b$ d/ ]
  43.         int nErrs2 = m_session->UpdateManager()->AddToDeleteList(planeView);0 A& s( X+ d" _* d3 ^$ b$ Z
  44.         int nErrs3 = m_session->UpdateManager()->AddToDeleteList(lineRay);
    & }, ]  ?, p) u4 s
  45.         int nErrs4 = m_session->UpdateManager()->DoUpdate(markDel);
    7 k1 G4 ^  q; A5 x  H8 H6 F- D
  46.         m_session->DeleteUndoMark(markDel, NULL);( P7 |6 _4 x: U  \' d1 A$ j

  47. 9 Z9 ?. R" j6 ]: c
  48.         return true;
    3 Y  |9 S$ `; f, l2 q* ~
  49.     }; a' k; m: p8 H+ Q

  50. 9 w$ e7 d* f7 q( w" F' x
  51.     return false;
    9 g. a% X" _0 Q  B7 j- ^, ]9 d
  52. }
复制代码

8 g7 W3 O/ T5 h2 f; o6 n0 V& K4 R  k! O) C* c4 J; k
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

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

本版积分规则

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