📄 mutiface-create-curve.grs
字号:
proc/face,num,pl,joincurve,refcur
entity/face(50) $$条状配光纹的曲面
entity/pl $$与条状配光纹曲面相交的平面
entity/pt $$参考点
entity/joincurve $$最终生成的曲线
entity/refcur $$参考实体
entity/intercurve(50) $$曲面face(i)与平面pl的相交曲线组
entity/uninter(100) $$曲面face(i)与平面pl的相交曲线组解组后的曲线
entity/result(100) $$对曲线组uninter(i)进行提取之后的曲线组
entity/referance $$参考点
entity/trypt(50) $$所有连接曲线起点和终点中坐标值未重合的点集
entity/startpt $$最终所有连接曲线的起点
entity/stref $$距离参考实体refcur最近的曲线uninter(indx)的起点
entity/endref $$距离参考实体refcur最近的曲线uninter(indx)的终点
entity/cur(100) $$最终得到的曲线组
number/a(200,3),b(7),dist(50),flag(100),c(3)
$$实体数组赋空值。
l10:
do/l20:,i,1,num
intercurve(i)=&nulent
$$求曲面face(1..num)与平面pl的所有相交曲线uninter(1..unnum)。
l20:
i=0
unnum=0
l30:
i=i+1
intercurve(i)=intsec/face(i),with,pl,toler,0.0005,iferr,err1:
$$判断曲线组intercurve(i)的曲线数量。
curnum=&gcount(intercurve(i))
if/curnum==1,jump/l40:
if/curnum<>1,jump/l50:
l40:
unnum=unnum+1
uninter(unnum)=&gent(intercurve(i),1)
blank/uninter(unnum)
jump/l80:
l50:
j=0
l60:
j=j+1
unnum=unnum+1
uninter(unnum)=&gent(intercurve(i),j)
blank/uninter(unnum)
l70:
if/j<curnum,jump/l60:
if/j==curnum,jump/l80:
l80:
ungrp/intercurve(i)
if/i<num,jump/l30:
if/i==num,jump/l90:
l90:
$$判断曲线组解组之后曲线的数量。
if/unnum==1,jump/l590:
if/unnum<>1,jump/l100:
$$若曲线数量unnum<>1,则执行以下程序。
$$计算曲线uninter(i)与参考实体的距离,寻找离参考实体最近的曲线uninter(indx)。
l100:
do/l110:,i,1,unnum
b(1..7)=reldst/refcur,uninter(i)
dist(i)=b(7)
l110:
i=1
compare=dist(1)
indx=1
l120:
i=i+1
drt=compare-dist(i)
ifthen/drt>0
compare=dist(i)
indx=i
else
jump/l130:
endif
l130:
if/i<unnum,jump/l120:
if/i==unnum,jump/l150:
l150:
$$将寻找到的曲线uninter(indx)放入曲线数组result(1)。
result(1)=uninter(indx)
$$给旗帜数组赋为0值。
do/l160:,i,1,unnum
flag(i)=0
$$提取曲线uninter(indx)的起点stref,寻找与stref相连接的所有曲线。
l160:
flag(indx)=1
$$提取曲线uninter(indx)的起点stref,并将它作为参考点。
c(1..3)=&spoint(uninter(indx))
stref=point/c(1..3)
referance=stref
n=1
l170:
$$设置judge值。
i=0
judge=0
l180:
i=i+1
$$判断曲线是否已被提取到曲线组result(i)。
if/flag(i)==0,jump/l190:
if/flag(i)<>0,jump/err2:
l190:
$$计算参考实体与曲线uninter(i)的距离。
b(1..7)=reldst/referance,uninter(i)
if/b(7)<0.01,jump/l200:
if/b(7)>=0.01,jump/l210:
l200:
$$若曲线uninter(i)与参考实体相联接,则旗帜数组相应位置设置为1,并将此曲线
$$提取到曲线组result(n),同时将此曲线设置为参考实体,修改judge值。
judge=1
flag(i)=1
n=n+1
result(n)=uninter(i)
referance=uninter(i)
jump/l220:
l210:
if/i<unnum,jump/l180:
if/i==unnum,jump/l220:
l220:
$$若judge==1,则继续循环查找连接的曲线;若judege<>1,则终止此循环。
if/judge==1,jump/l170:
if/judge<>1,jump/l230:
l230:
$$重新设置旗帜数组flag(i)为零。
do/l240:,i,1,unnum
flag(i)=0
l240:
$$提取曲线uninter(indx)的终点endref,并将它作为参考点。
flag(indx)=1
c(1..3)=&epoint(uninter(indx))
endref=point/c(1..3)
referance=endref
l250:
i=0
judge=0
l260:
i=i+1
$$判断曲线是否已被提取到曲线组result(i)。
if/flag(i)==0,jump/l270:
if/flag(i)<>0,jump/err3:
l270:
$$计算参考实体与曲线uninter(i)的距离。
b(1..7)=reldst/referance,uninter(i)
if/b(7)<0.01,jump/l280:
if/b(7)>=0.01,jump/l290:
l280:
$$若曲线uninter(i)与参考实体相联接,则旗帜数组相应位置设置为1,并将此曲线
$$提取到曲线组result(n),同时将此曲线设置为参考实体,修改judge值。
judge=1
flag(i)=1
n=n+1
result(n)=uninter(i)
referance=uninter(i)
jump/l300:
l290:
if/i<unnum,jump/l260:
if/i==unnum,jump/l300:
l300:
$$若judge==1,则继续循环查找连接的曲线;若judege<>1,则终止此循环。
if/judge==1,jump/l250:
if/judge<>1,jump/l310:
$$删除曲线uninter(indx)的起点和终点。
l310:
delete/stref,endref
l320:
$$判断连接的曲线的数量
if/n==1,jump/l580:
if/n<>1,jump/l330:
$$若连接的曲线数量大于1,则执行以下程序。
$$提取所有连接曲线起点和终点的三维坐标值。
l330:
i=0
l340:
i=i+1
x=2*i-1
y=2*i
a(x,1..3)=&spoint(result(i))
a(y,1..3)=&epoint(result(i))
l350:
if/i<n,jump/l340:
if/i==n,jump/l360:
$$提取所有连接曲线起点和终点中坐标值未重合的点trypt(i)。
l360:
i=0
m=0
l370:
sameptnum=0
i=i+1
j=0
xref=a(i,1)
yref=a(i,2)
zref=a(i,3)
l380:
j=j+1
tol1=absf(xref-a(j,1))
tol2=absf(yref-a(j,2))
tol3=absf(zref-a(j,3))
if/tol1<0.01 and tol2<0.01 and tol3<0.01,sameptnum=sameptnum+1
l390:
if/j<y,jump/l380:
if/j==y,jump/l400:
l400:
ifthen/sameptnum==1
m=m+1
trypt(m)=point/a(i,1..3)
else
jump/l410:
endif
l410:
if/i<y,jump/l370:
if/i==y,jump/l420:
$$寻找点集trypt(i)中距离参考点refcur最近的点trypt(indx)。
l420:
do/l430:,i,1,m
b(1..7)=reldst/trypt(i),refcur
dist(i)=b(7)
l430:
i=1
compare=dist(1)
indx=1
l440:
i=i+1
drt=compare-dist(i)
ifthen/drt>0
compare=dist(i)
indx=i
else
jump/l450:
endif
l450:
if/i<m,jump/l440:
if/i==m,jump/l460:
l460:
$$将点trypt(indx)设置为起始点。
startpt=trypt(indx)
$$删除点集trypt(i)中除trypt(indx)之外的所有点。
i=0
l470:
i=i+1
if/i<>indx,delete/trypt(i)
l480:
if/i<m,jump/l470:
if/i==m,jump/l490:
$$旗帜数组重新赋0。
l490:
do/l500:,i,1,n
flag(i)=0
l500:
$$将起始点设置为参考实体。
referance=startpt
m=0
l510:
judge=0
i=0
l520:
i=i+1
$$判断曲线result(i)是否被提取到曲线组cur(i)中。
if/flag(i)==0,jump/l530:
if/flag(i)<>0,jump/err4:
l530:
$$计算参考实体与曲线result(i)的距离。
b(1..7)=reldst/referance,result(i)
if/b(7)>0.01,jump/l550:
if/b(7)<=0.01,jump/l540:
l540:
$$若曲线result(i)与参考实体相联接,则旗帜数组相应位置设置为1,并将此曲线
$$提取到曲线组cur(m),同时将此曲线设置为参考实体,修改judge值。
judge=1
flag(i)=1
referance=result(i)
m=m+1
cur(m)=result(i)
jump/l560:
l550:
if/i<n,jump/l520:
if/i==n,jump/l560:
l560:
$$若judge==1,则继续循环查找连接的曲线;若judege<>1,则终止此循环。
if/judge==1,jump/l510:
if/judge<>1,jump/l570:
l570:
$$拟合曲线组cur(1..m)生成目标曲线。
joincurve=spline/approx,toler,0.0005,cur(1..m)
delete/startpt
delete/uninter(1..unnum)
jump/l600:
l580:
$$若连接的曲线数量等于1,则执行以下程序。
unblnk/result(1)
joincurve=result(1)
jump/l600:
$$若曲线数量unnum==1,则执行以下程序。
l590:
unblnk/uninter(1)
joincurve=uninter(1)
jump/l600:
l600:
jump/trm:
trm:
return
$$halt
err1:
if/i<num,jump/l30:
if/i==num,jump/l90:
err2:
if/i<unnum,jump/l180:
if/i==unnum,jump/l220:
err3:
if/i<unnum,jump/l260:
if/i==unnum,jump/l300:
err4:
if/i<n,jump/l520:
if/i==n,jump/l560:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -