|
获得平面最外边缘 本身没什么了不起的 因为uf函数可以获得 曲面边缘
但是我这个是纯grip哦 (grip很多函数没有)
虽然我自己用c++做代码 但我经常 用grip做程序 就是因为没函数 才可以 练思路 练算法
$$ 获得平面最外边缘
$$ 梅雷QQ1821117007原创
$$ 原理
$$ 线选择一个平面F
$$ 创建点pt,要求点pt和平面F是同一个平面点一定在平面外
$$ 利用相对最小距离函数,r(1..7)= RELDST/F,pt
$$ r(1..3)这个点一定在平面的最外边缘
$$ 循环平面F上的所有边缘,如果点r(1..3)和边缘距离为0
$$ 那么这个边缘一定是最外边缘
$$ 因为在提取UG面上的线时,我们可以把线看成n个封闭的区域
$$ 因为封闭的区域线是按顺序首位相连的
$$ 又因为我们已经得到了一条最外边缘了
$$ 那么我们就往2个方向计算,最后就可以获得最外边缘了
Gripsw / Declrv
Entity / F $$面
Entity / ll(10000) $$最外边缘
Number / A $$最外边缘数量
Entity / Pt(2),ln(10000)
Number / Resp,P(9),r(7),i,j,k,n,ys(2),numw(4,3),nnn
$$判断是Ug否打开部件
Ifthen/&Actprt==1
Messg/'请先打开一个部件!'
Halt
Endif
ys(1)=&entclr $$获得系统颜色
ifthen/ys(1)>100
ys(2)=ys(1)-5
else
ys(2)=ys(1)+5
endif
&entclr=ys(2) $$设置系统颜色
L10:
Mask/22
Ident/'梅雷提示!请选择目标面',F,Resp
Jump/L10:,End:,,,Resp
$$ 创建点pt,要求点pt和平面F是同一个平面点一定在平面外
P(1..3)=Sposf(F,0,0) $$获得面上的点
P(4..6)=Sposf(F,1,1)
P(7)=P(4)-P(1) $$计算点到点方向
P(8)=P(5)-P(2)
P(9)=P(6)-P(3)
P(1..3)=Unitf(P(7..9)) $$获得点到点的正确方向
P(7..9)=SCALVF(20,P(1..3)) $$向量数乘 x20
P(1)=P(4)+P(7) $$计算点位
P(2)=P(5)+P(8)
P(3)=P(6)+P(9)
pt(1)=point/p(1..3)
$$ 利用相对最小距离函数,r(1..7)= RELDST/F,pt
$$ r(1..3)这个点一定在平面的最外边缘
r(1..7)= RELDST/F,pt(1)
delete/pt(1)
pt(2)=point/r(1..3)
$$循环平面F上的所有边缘开始计算边缘
ln=soledg/f,cnt,n ,iferr,Err2:
ifthen/n==1
a=1
&color(ln(1))=ys(1)
jump/ttt:
endif
nnn=0
do/loop:,i,1,n
r(1..7)= RELDST/pt(2),ln(i)
ifthen/r(7)==0
nnn=i
jump/loopb:
endif
loop:
loopb:
ifthen/nnn<1
messg/'无效的表面,因为不能分析点距.'
jump/end:
endif
$$print/'平面F上第'+istr(nnn)+'个边缘一定是最外边缘'
$$-
&color(ln(nnn))=ys(1)
ifthen/ n>nnn
Do/Loop9:,I,nnn,n
ifthen/i>nnn
numw(1,1..3)=cposf(ln(i-1),0)
numw(2,1..3)=cposf(ln(i-1),1)
numw(3,1..3)=cposf(ln(i),0)
numw(4,1..3)=cposf(ln(i),1)
IFthen/numw(1,1..3)==numw(3,1..3) or $
numw(1,1..3)==numw(4,1..3) or $
numw(2,1..3)==numw(3,1..3) or $
numw(2,1..3)==numw(4,1..3)
&color(ln(i))=ys(1)
else
jump/Loop10:
endif
endif
Loop9:
Loop10:
endif
$$-
ifthen/ nnn>1
Do/Loop11:,I,1,nnn
ifthen/i>1
j=nnn-i+1
numw(1,1..3)=cposf(ln(j+1),0)
numw(2,1..3)=cposf(ln(j+1),1)
numw(3,1..3)=cposf(ln(j),0)
numw(4,1..3)=cposf(ln(j),1)
IFthen/numw(1,1..3)==numw(3,1..3) or $
numw(1,1..3)==numw(4,1..3) or $
numw(2,1..3)==numw(3,1..3) or $
numw(2,1..3)==numw(4,1..3)
&color(ln(j))=ys(1)
else
jump/Loop12:
endif
endif
Loop11:
Loop12:
endif
$$-
$$删除内边缘
a=0
do/loop22:,i,1,n
k=&color(ln(i))
ifthen/k==ys(1)
numw(1,1..3)=cposf(ln(i),0)
numw(2,1..3)=cposf(ln(i),1)
ifthen/numw(1,1..3)==numw(2,1..3)$$过滤相切的整圆
delete/ln(i) $$删除多余曲线
else
a=a+1
ll(a)=ln(i)
endif
else
delete/ln(i) $$删除多余曲线
endif
loop22:
TTT:
delete/pt(2)
$$-
$$==================================================
$$-
messg/'最外边缘曲线数量:'+ISTR(A)
jump/L10:
end:
&entclr=ys(1)
Halt
Err2:
DELETE/pt(1)
Messg/'无效的表面,因为不能提取边缘.'
jump/End:
|
|