请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
& T0 X$ A7 r: |NX二次开发源码分享:判断选择的面是否相切
" S+ J2 e8 j5 k. C3 Z1 J3 v
* L# b; K. G# B8 s: W8 U, \& O" `
4 T( M2 R" t! m8 R0 M) J9 S: d1 v2 g! D$ G! s
通常情况下,我们需要通过输入的面获取相关几何关系,如果两个面是否相切,目前并没有直接的方法去处理,如果通过自己去构造一套相切算法或者标准去处理,显然太浪费时间,而且结果是否适合,性能是否ok,都值得考量。) r) f- T5 u7 T! J
. x' @+ X9 G7 M$ @5 I
接下来我们来给大家借用目前强大的选择意图功能,来利用这个特性处理下,其实大部分几何关系都可以捕捉,掌握了这种技巧,其他的选择方式都可以以此类推的进行相关处理。 (1)先看看选择意图 Select Intention中的Selection Filter/ x3 V l2 p' {4 R% B o
选择意图主要是帮助用户在界面上进行相关对象的选取,比如选择范围,包含有整个装配范围,装配和工作部件范围,仅仅工作部件范围。选择过滤主要是针对当前选择器的选项进行相关类型的过滤,目的是帮助用户快速完成相关内容的选择。! w5 U+ N; ]& H1 u# T
譬如: 当您选择曲线类型时候,NX会提供曲线相关选择 - |" U8 D( l0 r7 |1 y
当您选择边对象时候,NX会提供边的相关选择方式 / G" X& j# W+ s; J `
当您选择曲面时候,NX会提供曲面的相关选择方式
+ h3 D8 }9 s# b, p( N8 S5 S3 F9 g8 r. c: @* L' E+ X O
; h o4 P" A% K- I9 c1 A
(2)选择相切面的效果,如果我们选中图示高亮部分的面,通过Tangent Faces,系统会自动获取所有和这个面相切的面,并进行高亮
$ X, q; V, g, P3 ?& H6 r5 U+ [ (3)代码中思路就简单了,输入的面获取很多相切面,只要要检查的面在获取的面中就够了吗? 显然还需要一个条件,就是两个面之间要有公共边,也就是说是相邻的。以下的集中测试结果,高亮的面是我们要判断之间是否相切的面。; L9 D2 h! D2 L! D5 Z
(4)这种方式是非常高可用的,如何通过选择的面快速获取Slot faces,获取Boss Faces等等都值得使用。传统的做法,可能去遍历所有的面,通过面的法相方向,边的关系等进行处理,如果合理使用现有的NX提供的方式,可见更加快捷方便。
$ _0 y# L& u' r- \+ r0 n3 h + a; {% X. a2 _: E; G3 S4 N
最后把这段代码提供上来,仅供参考! PLM之家NX二次开发板块,提供了很多源码分享,感兴趣可以常去看看哦!也欢迎大家发帖,提供好的案例分享。送人玫瑰,手有余香! : E/ f6 {3 m |$ g" \3 i# W
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; } } } 2 j0 ]0 w2 {- C; W/ ]
} UF_terminate(); return isTangent; }
9 `* q, G9 h& w
+ d) g2 Y8 b: R3 B* J3 ~
t& s' {/ w" {9 k2 d
5 f' a/ U! o' W! h" o$ g, s. IEND PLM之家plmhome F2 ~% ?+ i9 i( B: T8 ]
▲长按二维码“识别”关注 & O% A6 h" ~. r9 h0 v/ i8 e
" s6 L8 L$ n" t# @/ M- G[mw_shl_code=cpp,true]6 [5 B1 @) d8 c
7 o; X/ A0 @5 I" K# M4 D& F" o/ k# s) q2 z* l& Z
bool CheckDTS::isTangentFaces(Face *face1 , Face *face2)# j7 m* ~% y* A
{
2 l8 a( D0 K8 Q7 L' O+ ?/ N* E `' i1 T- U: D
bool isTangent = false;
# p0 h+ y" J& H& h int count = 0;
1 z3 h/ O" V) _6 y' i std::vector<Face *> boundaryFaces1(0);. z3 r- |9 I+ S! X& H+ D) U- S9 l( T+ p
FaceTangentRule *faceTangentRule1;2 a) I: ~& Z4 s5 ]+ V+ A& G! z
faceTangentRule1 = workPart->ScRuleFactory()->CreateRuleFaceTangent(face1, boundaryFaces1);
0 A/ O( D2 ~' L J ScCollector *scCollector1;
0 z$ T, k' n& Y. y/ h scCollector1 = workPart->ScCollectors()->CreateCollector();
0 Q7 P: H, Y( @ P& C$ A4 | std::vector<SelectionIntentRule *> rules1(1);' _/ v/ L2 ?% o+ K; E5 q
rules1[0] = faceTangentRule1;
) E1 S( J+ y4 S4 \1 \0 d8 e scCollector1->ReplaceRules(rules1, false);# x1 d+ I, J# M, ^
std::vector<TaggedObject *> theFaces = scCollector1->GetObjects();" L: x! u. J3 t: i; z5 D* d
delete faceTangentRule1;6 M% f8 I/ C' ]( n1 M/ L( U
1 [( |8 d7 A. d: L. s9 `
if (theFaces.empty())
! }' `1 \/ p U% _ {* H8 N. [; {9 g- r
isTangent = false;/ \. ` F" k9 D& Z
}
0 U0 |3 \" t0 ^% d else ]3 ?3 @( }. v" l
{
/ ]3 h8 z7 `7 p$ [4 m6 t for (int i =0 ; i < theFaces.size();i++)
, G7 k6 g8 g; t {# O. V: \/ x" i
if (face2 == theFaces.at(i))) T2 A: N$ V# f5 Y
{4 ]! } M0 s3 g0 G, ]6 C
isTangent = true;
W2 c+ Y B# R4 ] break;: d( S9 r/ ^' I9 L
}
7 p6 p) A9 v; ?8 F9 A( k5 b }
; _' H/ T/ M5 ]0 W+ z0 o. k p" Z/ W# W) d/ w' y
}
0 P$ H4 A: _' z( ]- `( ?# h 2 f. ]) `# v% \2 a% }8 v
return isTangent; R! p! C( r- k' }: I
" M- W* {8 Y6 z+ H8 P* w9 n}[/mw_shl_code]
, ]" U' z7 b8 D' F1 y& T% q# E8 b' @: E; ^! l
|