找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 5174|回复: 2

[分享] grip获得平面最外边缘

[复制链接]

51

主题

24

回帖

2258

积分

少尉

积分
2258
发表于 2015-11-21 14:27:06 | 显示全部楼层 |阅读模式
获得平面最外边缘 本身没什么了不起的 因为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:


2

主题

103

回帖

4631

积分

中尉

积分
4631
发表于 2015-11-21 16:04:21 | 显示全部楼层
很不错哦 支持下楼主

0

主题

26

回帖

238

积分

一级士官

积分
238
发表于 2015-11-23 21:49:14 | 显示全部楼层
支持楼主无私的分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

咨询QQ:1359218528|发帖须知!|Archiver|手机版|小黑屋|UG爱好者论坛 ( 京ICP备10217105号-2 )

GMT+8, 2024-12-23 02:21

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表