⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mutiface-create-curve.grs

📁 UG二次开发很好的东西 需要的朋友可以下载来看看 很好用啊
💻 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 + -