请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
6 ~7 |* ~- g7 S7 V1 {7 O- Y
NX二次开发源码分享:判断选择的面是否相切4 s6 a+ T5 s4 n/ {
, _( Z; d" A2 d& D' s: C! f
% m) _ k& u. }; d- V- P
8 w8 L7 y K j: ~( u/ ~1 n
通常情况下,我们需要通过输入的面获取相关几何关系,如果两个面是否相切,目前并没有直接的方法去处理,如果通过自己去构造一套相切算法或者标准去处理,显然太浪费时间,而且结果是否适合,性能是否ok,都值得考量。
- h$ y$ _. F* T1 U - P" S. a k# [- `' Q: O
接下来我们来给大家借用目前强大的选择意图功能,来利用这个特性处理下,其实大部分几何关系都可以捕捉,掌握了这种技巧,其他的选择方式都可以以此类推的进行相关处理。 (1)先看看选择意图 Select Intention中的Selection Filter/ W. K. F7 e5 u2 f
选择意图主要是帮助用户在界面上进行相关对象的选取,比如选择范围,包含有整个装配范围,装配和工作部件范围,仅仅工作部件范围。选择过滤主要是针对当前选择器的选项进行相关类型的过滤,目的是帮助用户快速完成相关内容的选择。" q/ k0 @+ r" ?2 v6 Q' w3 c
譬如: 当您选择曲线类型时候,NX会提供曲线相关选择 0 {& I/ x/ L' v5 Y6 r) W; @
当您选择边对象时候,NX会提供边的相关选择方式
8 K& E7 e% Q3 E. R% @7 H$ l当您选择曲面时候,NX会提供曲面的相关选择方式
0 P4 ~. o d0 E) t3 B; L
: t( u, Y8 Z: h9 u5 Y; h
/ `; q1 b* P/ e. b# _(2)选择相切面的效果,如果我们选中图示高亮部分的面,通过Tangent Faces,系统会自动获取所有和这个面相切的面,并进行高亮
, B& Z+ A' n; m, _, p* l (3)代码中思路就简单了,输入的面获取很多相切面,只要要检查的面在获取的面中就够了吗? 显然还需要一个条件,就是两个面之间要有公共边,也就是说是相邻的。以下的集中测试结果,高亮的面是我们要判断之间是否相切的面。
' K* z" ]8 U* T$ E4 | (4)这种方式是非常高可用的,如何通过选择的面快速获取Slot faces,获取Boss Faces等等都值得使用。传统的做法,可能去遍历所有的面,通过面的法相方向,边的关系等进行处理,如果合理使用现有的NX提供的方式,可见更加快捷方便。9 i& W3 U9 Y* |" S! Q# X8 \9 f' H% o
& W, M; K# Z/ W最后把这段代码提供上来,仅供参考! PLM之家NX二次开发板块,提供了很多源码分享,感兴趣可以常去看看哦!也欢迎大家发帖,提供好的案例分享。送人玫瑰,手有余香!
6 ^" J* K) p! dbool 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; } } } , o& D& ]& O. ~# `/ y! |- g
} UF_terminate(); return isTangent; }
5 h4 u" b( g* E$ `) [' r* ]6 ]0 a# ]: E8 X' x: q2 u
, J0 `5 M: ~( @' k l, C
) W/ |) T! X! d4 U2 G; n
END PLM之家plmhome 2 D1 Q1 w& }9 i& g) W
▲长按二维码“识别”关注
9 H% s1 g# ^8 i, L; u* L- S2 y- s2 E4 l( f
[mw_shl_code=cpp,true]
0 m# P# s; @, u- i$ Y4 V3 Y! Q9 r5 O
1 {7 J$ v% f) P0 j7 y, C$ T# xbool CheckDTS::isTangentFaces(Face *face1 , Face *face2)6 X$ V- q+ U7 R' q, V+ }
{
. j/ w" P/ p1 ]" D% i
" r3 t5 y+ [0 b. j bool isTangent = false;& A2 `& a+ k& I
int count = 0;
6 d; E% D3 e7 p5 a3 M& ~4 n std::vector<Face *> boundaryFaces1(0);
! n- { a& m: ^1 `6 f FaceTangentRule *faceTangentRule1;2 C: [( v4 }, a
faceTangentRule1 = workPart->ScRuleFactory()->CreateRuleFaceTangent(face1, boundaryFaces1);" T- B1 D1 \5 g6 j
ScCollector *scCollector1;/ X, @# r, D9 M! e9 o+ d; J }
scCollector1 = workPart->ScCollectors()->CreateCollector(); y% E( J' d& \9 n
std::vector<SelectionIntentRule *> rules1(1);! B4 J: h% T3 O# I$ V& c# G$ X
rules1[0] = faceTangentRule1;
7 h1 e7 K5 v, D6 G; M, M scCollector1->ReplaceRules(rules1, false);2 Y& g. B/ Z" _
std::vector<TaggedObject *> theFaces = scCollector1->GetObjects();
0 o! f% O! |/ |% S& W! ^ delete faceTangentRule1;
4 M: ]0 w! U; G+ v . @1 u' |& S' I6 | F2 T t
if (theFaces.empty())3 i6 R% c% ^6 y4 F! s9 V- W
{2 T- m" \* t" E2 P+ [: V" Y$ ?
isTangent = false;. A T+ r) q% B, m, M6 B
}! Z$ [ F& x, S6 t" N2 k1 y8 |
else/ J8 d$ T- r; I u' l# B
{3 H, Z7 l1 E. \' P
for (int i =0 ; i < theFaces.size();i++)
# Z9 g. l2 X* P3 c& n% y' y {$ Z" \ w3 F! s/ v5 x/ B8 O' b
if (face2 == theFaces.at(i))
7 [3 e+ {; q' @ {
" F% j7 M* q. _5 f( Y+ s" i isTangent = true;
) @) y- ]* m' I break;6 J" q- u8 ?. ?$ c. b n9 O
}
5 n+ P1 x; n; C: U }) ]/ V, J" Q$ | Z- d" E* m
& D5 f5 h: U( V: t$ s7 H, u } K. e1 i$ L) c% W! I! }
$ w2 j3 m3 A) A* u
return isTangent;
; e0 u" f$ u( k! d' n3 |
R' I* N8 ]. ]' K; O' ~}[/mw_shl_code]
! x3 ]; x, g! j% V7 Z. ?* v0 D
! }' i q' a; _: w |