02 Aug Surface Subdivision in RhinoPython
This generates a subdivision based on any 4-corner surface and names the panels. It also creates tabs, should you want to unroll it for fabrication. The panels are, in addition, named for reference.
#script written by Adolfo Nadal
#import rhinoscriptcontext
import rhinoscriptsyntax as rss
#calculate the normal on the surface with a given scalefactor
def calcNormalWithSize(srf,uParam,vParam,size,ptBase):
ptNorm = rss.SurfaceNormal(srf,(uParam,vParam))
ptNorm = rss.VectorScale(ptNorm,size)
ptNorm = rss.VectorAdd(ptNorm,ptBase)
return ptNorm
#get surface from user: filter 8 for surfaces
srf = rss.GetObject(“Please select a surface”,8)
#get a series of subdivisions
divU = rss.GetInteger(“Please enter number of subdivisions in U direction”,5,2,100)
divV = rss.GetInteger(“Please enter number of subdivisions in V direction”,5,2,100)
#enter your desired tab size
tabSize = rss.GetReal(“Please enter tab size”,2,0.1,10)
#populate the surface with points
#-surface domain
domU = rss.SurfaceDomain(srf,0)
domV = rss.SurfaceDomain(srf,1)
print (domU)
print (domV)
#enter variables that contain surface domain
#max will be the second value, therefore [1]
domUMax = domU[1]
domUMin = domU[0]
domVMax = domV[1]
domVMin = domV[0]
#calculate the stepSize
stepU = (domUMax-domUMin)/divU
stepV = (domVMax-domVMin)/divV
rss.EnableRedraw(False)
counter = 0
#create points on surface
for i in range(divU+1):
for j in range(divV+1):
if((i>0)and(j>0)):
#-evaluate surface
uParam = i*stepU
vParam = j*stepV
pt1Coord = rss.EvaluateSurface(srf,uParam,vParam)
pt2Coord = rss.EvaluateSurface(srf,uParam-stepU,vParam)
pt3Coord = rss.EvaluateSurface(srf,uParam-stepU,vParam-stepV)
pt4Coord = rss.EvaluateSurface(srf,uParam,vParam-stepV)
#obtain middle points
ptMid12Coord = rss.EvaluateSurface(srf,uParam-stepU/2,vParam)
ptMid23Coord = rss.EvaluateSurface(srf,uParam-stepU,vParam-stepV/2)
ptMid34Coord = rss.EvaluateSurface(srf,uParam-stepU/2,vParam-stepV)
ptMid41Coord = rss.EvaluateSurface(srf,uParam,vParam-stepV/2)
#add the point on the surface
#pt = rss.AddPoint(ptCoord)
#add components to the surface
polyPt = (pt1Coord,pt2Coord,pt3Coord,pt4Coord,pt1Coord)
#poly = rss.AddPolyline(polyPt)
#Add segments ON the surface
crv1 = rss.AddInterpCrvOnSrf(srf,(pt1Coord,pt2Coord))
crv2 = rss.AddInterpCrvOnSrf(srf,(pt2Coord,pt3Coord))
crv3 = rss.AddInterpCrvOnSrf(srf,(pt3Coord,pt4Coord))
crv4 = rss.AddInterpCrvOnSrf(srf,(pt4Coord,pt1Coord))
#join curve segments into one and delete segments (true)
crvs = (crv1,crv2,crv3,crv4)
joinCrv = rss.JoinCurves(crvs,True)
#calculate normals!!!
#beware, vectors in rhino are by default 0-based (0,0,0)
#1st calculate normal
#2nd scale (if desired)
#3rd move (by adding)
ptN1Coord = calcNormalWithSize(srf,uParam,vParam,tabSize,pt1Coord)
ptMidN12Coord = calcNormalWithSize(srf,uParam-stepU/2,vParam,tabSize,ptMid12Coord)
ptMidN23Coord = calcNormalWithSize(srf,uParam-stepU,vParam-stepV/2,tabSize,ptMid23Coord)
ptMidN34Coord = calcNormalWithSize(srf,uParam-stepU/2,vParam-stepV,tabSize,ptMid34Coord)
ptMidN41Coord = calcNormalWithSize(srf,uParam,vParam-stepV/2,tabSize,ptMid41Coord)
#verify that it works
#rss.AddPoint(ptMidN12Coord)
#rss.AddPoint(ptMidN23Coord)
#rss.AddPoint(ptMidN41Coord)
#visualize normal
#rss.AddLine(pt1Coord,ptN1Coord)
#add tabs to the model
triaTab1Pts = (pt1Coord,pt2Coord,ptMidN12Coord)
triaTab2Pts = (pt2Coord,pt3Coord,ptMidN23Coord)
triaTab3Pts = (pt3Coord,pt4Coord,ptMidN34Coord)
triaTab4Pts = (pt4Coord,pt1Coord,ptMidN41Coord)
tab1Srf = rss.AddSrfPt(triaTab1Pts)
tab2Srf = rss.AddSrfPt(triaTab2Pts)
tab3Srf = rss.AddSrfPt(triaTab3Pts)
tab4Srf = rss.AddSrfPt(triaTab4Pts)
basePts = (pt1Coord,pt2Coord,pt3Coord,pt4Coord)
baseSrf = rss.AddSrfPt(basePts)
#join to create a single polysurface object
srfs = (tab1Srf,tab2Srf,tab3Srf,tab4Srf,baseSrf)
basePolySrf = rss.JoinSurfaces(srfs,True)
rss.ObjectColor(basePolySrf,(2*i*j,0,255-2*(i*j)))
ptCtCoord = rss.EvaluateSurface(srf,uParam-stepU/2,vParam-stepV/2)
rss.AddTextDot(counter,ptCtCoord)
counter = counter +1
#rss.AddPoint(ptN1Coord)
#create panels
rss.EnableRedraw(True)
No Comments