查看: 1651|回复: 0

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

[复制链接]

2477

主题

1280

回帖

8万

积分

管理员

PLM之家站长

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

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

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

×
/ S, R! D0 O+ K# R$ `" b

3 p& Y/ P8 u0 p8 a6 x) g* m8 U如何获取选择点映射到视图空间中?源码分享
- _/ W1 _: x: R" t* F. U# q* f
  b) u3 J# t% A7 J9 _" `& X/ i
  1. //------------------------------------------------------------------------------# B# i' [  Y& n5 v% m5 V
  2. // Select Screen Position and map to Modeling View Plane
    9 u9 S# K$ M) G3 l. ^$ p. D
  3. //------------------------------------------------------------------------------5 h7 K, m. R& L/ K0 |) V& i
  4. bool GtacPmi::SelectPmiPosition(NXOpen::Point3d &pos)2 @; I% O$ \8 {2 p$ i1 B
  5. {1 ~9 z2 F2 E! X
  6.     NXOpen::View* myView = NULL;
    / `2 |! Q3 x1 g2 o3 Z, a# ^
  7.     NXOpen::Point3d myCursor(0, 0, 0);
      g& ^# C1 T( w) d- Q% R! O

  8. 4 `+ m1 K6 J2 Q) ^
  9.     NXOpen::Selection::DialogResponse myResponse = m_ui->SelectionManager()->SelectScreenPosition("Select Screen Origin", &myView, &myCursor);( S' |& t5 J- }) y  R3 P
  10.     if (myResponse == NXOpen::Selection::DialogResponsePick)
    ! k: l' P$ c1 p" S. Y/ b4 i
  11.     {
    / k* U- s- R+ Q. ~# M
  12.         // obtain the current default annotation plane where PMIs are placed on
    ' P( v9 v2 Y; s: z7 D
  13.         NXOpen::Xform *xform1;+ I! d- y# J6 [9 D
  14.         xform1 = m_wpart->Annotations()->GetDefaultAnnotationPlane(NXOpen::Annotations::PmiDefaultPlaneModelView);
    " F6 W! l2 i, l9 J6 O; }
  15.         NXOpen::Matrix3x3 vmxDefaultPlane = xform1->Orientation();% h0 ~. D$ w9 Q! p$ b& ^$ J6 Y
  16.         NXOpen::Point3d ptDefaultPlane = xform1->Origin();
    ; }6 B; J; ~6 g
  17.         NXOpen::Vector3d vecDefaultPlane(vmxDefaultPlane.Zx, vmxDefaultPlane.Zy, vmxDefaultPlane.Zz);
    & j% u: r3 `/ c0 g

  18. . u* v& x0 M& i$ B9 \, N
  19.         // create the ray 'into the screen' at the selected cursor position
    " G( X; a) o& _7 p3 G# v) a. s, U
  20.         NXOpen::Matrix3x3 vmx = myView->Matrix();3 z- F' v$ h  M  f. S
  21.         NXOpen::Point3d p1(myCursor.X - vmx.Zx * 1000, myCursor.Y - vmx.Zy * 1000, myCursor.Z - vmx.Zz * 1000);! t+ r2 o2 _4 q' ?
  22.         NXOpen::Point3d p2(myCursor.X + vmx.Zx * 1000, myCursor.Y + vmx.Zy * 1000, myCursor.Z + vmx.Zz * 1000);
    3 _1 h. I2 S$ g! |1 k. H
  23.         NXOpen::Line *lineRay = m_wpart->Curves()->CreateLine(p1, p2);
    / N' F" y/ n: f+ Q. T# `: @8 Q
  24.         lineRay->SetName("Ray");
    ( ?1 \6 K. r/ c" j

  25. % p, i* C. l8 s6 b) Y% n
  26.         // create the plane from the view to intersect with the ray$ J1 @2 M" v0 \6 d* D
  27.         NXOpen::Plane *planeView = m_wpart->Planes()->CreatePlane(ptDefaultPlane, vecDefaultPlane, NXOpen::SmartObject::UpdateOptionWithinModeling);
    : {* J: e( W+ k0 r  a& F  E
  28.         planeView->SetVisibility(NXOpen::SmartObject::VisibilityOptionVisible);9 p, R. m1 u% D; Z. I2 P# y1 C
  29.         planeView->SetName("ViewPlane");1 G! Q* U7 l( U8 k- m) l5 R

  30. . [+ |. f- T7 T  s# k
  31.         // now create the intersection point
    : X( y( U7 l: y- |% @( s8 \# G
  32.         NXOpen::Point *pntInterSect = m_wpart->Points()->CreatePoint(planeView, lineRay, NULL, NULL, NXOpen::SmartObject::UpdateOptionWithinModeling);
    0 C6 Z: V! D2 a% c8 H. g: B
  33.         pntInterSect->SetVisibility(NXOpen::SmartObject::VisibilityOptionVisible);$ }% I: z% T5 E
  34.         pntInterSect->SeTColor(10);
    0 s7 T$ Z+ o8 S2 r; J
  35.         pntInterSect->SetName("Intersection");/ {% J  g, l; X4 n
  36. 4 ^* h6 n1 D* t
  37.         pos = pntInterSect->Coordinates();2 t) L5 y( u- B7 R
  38.         print("\nPMI Position:", pos);
    , p  K8 b$ Y4 v# N  M
  39. " M7 u& C4 f  k1 x* Z9 |4 d
  40.         // clean up - comment to see intermediate objects
    # v4 f/ E/ a; U% ~) P8 d$ F
  41.         NXOpen::Session::UndoMarkId markDel = m_session->SetUndoMark(NXOpen::Session::MarkVisibilityVisible, "Delete");
    9 E1 Z' s" c, L! s# I
  42.         int nErrs1 = m_session->UpdateManager()->AddToDeleteList(pntInterSect);
    6 z& d2 g* {! p! ]
  43.         int nErrs2 = m_session->UpdateManager()->AddToDeleteList(planeView);
    # W. E  ~. S4 a
  44.         int nErrs3 = m_session->UpdateManager()->AddToDeleteList(lineRay);
    9 T' A; }; U1 Q- q, m& U
  45.         int nErrs4 = m_session->UpdateManager()->DoUpdate(markDel);' ^9 }8 H! w8 \$ k
  46.         m_session->DeleteUndoMark(markDel, NULL);
    ) \3 c' ^4 \7 x# [. |  N- M
  47. : q" e; N! ]. f2 ]' c/ {
  48.         return true;1 a, q6 Z# T( N8 e3 p. G) ]
  49.     }; ~% r) w' u: Z% w- Z

  50. * v6 a4 t& @7 B$ q2 u3 \% y& [
  51.     return false;
    ) n7 B( s7 j5 h5 E: u& \& y
  52. }
复制代码

) B+ ^6 p5 M/ P2 g% u& R" _6 S/ T1 a  k6 f+ i( h9 [# j. I( @* q
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

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

本版积分规则

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