查看: 3149|回复: 1

[二次开发源码] NX二次开发源码分享:判断选择的面是否相切

[复制链接]

2477

主题

1280

回帖

60

积分

管理员

PLM之家站长

积分
60
QQ
发表于 2019-9-15 08:38:30 | 显示全部楼层 |阅读模式

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

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

×
! p) W' ~8 o8 r+ x$ M
NX二次开发源码分享:判断选择的面是否相切; @! q# |2 a- x, n4 w

0 ^* P% J. l% s% ?
! x6 d6 ]6 b0 D
​
9 S. G9 J/ x; h: f; L% a
通常情况下,我们需要通过输入的面获取相关几何关系,如果两个面是否相切,目前并没有直接的方法去处理,如果通过自己去构造一套相切算法或者标准去处理,显然太浪费时间,而且结果是否适合,性能是否ok,都值得考量。; p8 ]# d/ d& \, W/ i1 x

! n. w, p* \0 p3 n$ Z8 i- ]
接下来我们来给大家借用目前强大的选择意图功能,来利用这个特性处理下,其实大部分几何关系都可以捕捉,掌握了这种技巧,其他的选择方式都可以以此类推的进行相关处理。
(1)先看看选择意图 Select Intention中的Selection Filter$ F% Z2 e7 ]- [4 Q' f+ K& }9 B
选择意图主要是帮助用户在界面上进行相关对象的选取,比如选择范围,包含有整个装配范围,装配和工作部件范围,仅仅工作部件范围。选择过滤主要是针对当前选择器的选项进行相关类型的过滤,目的是帮助用户快速完成相关内容的选择。
7 e3 q' R  H% f9 w1 P
譬如:
  • 当您选择曲线类型时候,NX会提供曲线相关选择
    , d2 Z. x( V2 f+ u, s8 M: O+ Y
3 ?& ]% d# l2 G2 n
                               
登录/注册后可看大图
  • 当您选择边对象时候,NX会提供边的相关选择方式
    5 s3 U. z; g1 y+ E' z* d( I, L

    8 q8 F, g4 U+ Z; }                               
    登录/注册后可看大图
  • 当您选择曲面时候,NX会提供曲面的相关选择方式

    : T/ }2 y# ^7 @* ~2 M0 X

    , |1 f& i9 F; a7 m0 H                               
    登录/注册后可看大图
    & x- W: k8 N; ^4 f' Y/ h

1 A/ h6 T6 ?/ n& z/ Z9 O& s
(2)选择相切面的效果,如果我们选中图示高亮部分的面,通过Tangent Faces,系统会自动获取所有和这个面相切的面,并进行高亮% `4 C- ?7 e4 \  ]- h2 J* z; o
' r9 |, O8 E9 A4 Y4 g! Z& q) s
                               
登录/注册后可看大图

2 T0 `  M! D& ^: V1 ]: k3 R                               
登录/注册后可看大图
(3)代码中思路就简单了,输入的面获取很多相切面,只要要检查的面在获取的面中就够了吗? 显然还需要一个条件,就是两个面之间要有公共边,也就是说是相邻的。以下的集中测试结果,高亮的面是我们要判断之间是否相切的面。
: M4 l- v/ h' V. X" L+ |( A$ {
5 U% A3 e# M4 N' t4 n* A3 _
                               
登录/注册后可看大图

3 Q' z% `, n6 Z7 B& s, L4 }9 Y                               
登录/注册后可看大图

; f! I, m6 E: f% [3 E                               
登录/注册后可看大图

# Q3 p) A1 N) Y0 X3 u8 l7 z6 {                               
登录/注册后可看大图

6 @" ~: p: O- b3 ]9 ?                               
登录/注册后可看大图
(4)这种方式是非常高可用的,如何通过选择的面快速获取Slot faces,获取Boss Faces等等都值得使用。传统的做法,可能去遍历所有的面,通过面的法相方向,边的关系等进行处理,如果合理使用现有的NX提供的方式,可见更加快捷方便。
' b3 t' H) |* w2 h* b

# _2 U3 T+ B( q) u; @0 t4 h
最后把这段代码提供上来,仅供参考!
PLM之家NX二次开发板块,提供了很多源码分享,感兴趣可以常去看看哦!也欢迎大家发帖,提供好的案例分享。送人玫瑰,手有余香!
) n( `4 V: X. t# {9 n
bool isTangentFaces(Face *face1 , Face *face2)
{
        UF_initialize();
        bool isTangent = false;
        int count = 0;
        int edgeCount = 0 ;
        std::vector<Face *> boundaryFaces1(0);
        FaceTangentRule *faceTangentRule1;
        ScCollector *scCollector1;
        std::vector<SelectionIntentRule *> rules1(1);
        uf_list_p_t sharedEdges = NULL;
        faceTangentRule1=workPart->ScRuleFactory()->CreateRuleFaceTangent(face1, boundaryFaces1);
        scCollector1 = workPart->ScCollectors()->CreateCollector();
        rules1[0] = faceTangentRule1;
        scCollector1->ReplaceRules(rules1, false);
        std::vector<TaggedObject *> theFaces = scCollector1->GetObjects();
        delete faceTangentRule1;
        if (theFaces.empty())
        {
                isTangent = false;
        }
        else
        {
                for (int i  =0 ; i < theFaces.size();i++)
                {
                        if (face2 == theFaces.at(i)) //checked face in the tangent faces list
                        {
                                UF_MODL_ask_shared_edges(face1->Tag(),face2->Tag(),&sharedEdges);
                                if (sharedEdges != NULL)  //confirm has shared edges
                                {
                                        UF_MODL_delete_list(&sharedEdges); //free the memory
                                        isTangent = true;
                                        break;
                                }
                        }
                }

$ t3 y# x; j& q2 u9 e% h% k% b4 X
        }
        UF_terminate();       
        return isTangent;
}

& T7 F# M, P5 e1 N; l
4 ?  u0 h0 H$ z
, Y9 q& W6 T. K+ Q2 Q& U+ `; |' c; Z" i+ f

( M) y+ y! S" }0 }0 _                               
登录/注册后可看大图
* J+ b) w' N. m) g
# n8 R! S4 }: E% ]2 u/ \5 s
                               
登录/注册后可看大图
END
PLM之家plmhome
2 t" _: v" r" Q' `4 }
                               
登录/注册后可看大图
/ K3 b2 t) z( _6 \9 S0 y2 s  q
▲长按二维码“识别”关注

! g. }4 L0 R$ z2 Y3 n' k- F1 \- b4 u  y0 i. t
[mw_shl_code=cpp,true]3 y6 n6 ?+ J8 k- C

7 G+ X! l8 @$ s- [- \$ f. u/ v
' x! l+ S7 i8 q  b9 A3 l3 j) n. rbool CheckDTS::isTangentFaces(Face *face1 , Face *face2)
% u- ~4 y: q% ?( P3 y  S{
) m6 H' ^  {; l$ u. R: d
# B/ k5 D1 r5 n        bool isTangent = false;
$ J) U7 c2 r, \; e+ ^5 S2 [4 R        int count = 0;  u# Q. f& R3 K1 T( F5 j
        std::vector<Face *> boundaryFaces1(0);
9 V" |6 q+ R% Y. B4 Q! u6 {        FaceTangentRule *faceTangentRule1;
, @7 T4 x2 M( }/ l( f5 }4 d. u        faceTangentRule1 = workPart->ScRuleFactory()->CreateRuleFaceTangent(face1, boundaryFaces1);
5 a( B" k( w  d8 A6 O& ]        ScCollector *scCollector1;+ ^8 x5 x  G/ C5 w4 w9 p5 j* w
        scCollector1 = workPart->ScCollectors()->CreateCollector();
+ g  V' K, W% z3 d1 T7 W9 s        std::vector<SelectionIntentRule *> rules1(1);
  x" S6 \  z+ P        rules1[0] = faceTangentRule1;
! J* E' M( `3 S" A) u2 o, U        scCollector1->ReplaceRules(rules1, false);
7 ~5 w/ X: j7 v7 b% r* t8 d$ r        std::vector<TaggedObject *> theFaces = scCollector1->GetObjects();( q0 w3 K+ X/ w) \
        delete faceTangentRule1;. C0 W$ D/ L8 _
        . Y8 A4 L5 f! l8 K! N" k
        if (theFaces.empty())9 K! D. [. P5 T1 ~% i0 Y7 h# ]
        {) u& H2 y7 s' u) d3 Z" M5 P
                isTangent = false;
. Z0 e3 B* i6 i        }
5 q5 l$ K! @% l" [. q2 K        else) k6 K. s* Z/ s$ f, S$ f" m/ F8 p4 C3 Y
        {
  L; O9 d( B* C0 K                for (int i  =0 ; i < theFaces.size();i++)
8 e1 O4 J0 w  |5 F                {8 M* X# u  S! c# u# @( I
                        if (face2 == theFaces.at(i))
. w4 ^% H8 X( l                        {
5 m, I* Y# e% Z                                isTangent = true;
; R9 r9 E/ e/ |2 Y( Z                                break;& Y# P; S  a' q8 q3 y
                        }
# L& z' b" [! s, b, a" x3 p. n                }0 h* \7 H2 m1 m: C: q, e9 n% x: z

$ ]; z/ f2 m. \0 \* ?        }
  ?) x/ A  o& [/ Y* F0 I8 p8 t        
5 O: a, B! P$ ^        return isTangent;5 }: Q7 Z; P  }/ v

6 V1 }! F8 ]$ E* q' ^) E% o  ?}[/mw_shl_code]$ U, U& p: N% b1 b* ^1 s' `

2 p. Y' j2 V- W5 g
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

1

主题

45

回帖

203

积分

培训VIP会员

积分
203
发表于 2019-12-24 19:06:37 | 显示全部楼层
学习了  谢谢 分享
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复 支持 反对

使用道具 举报

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

本版积分规则

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