Yess!!
I had already try the ToNurbsCurve() method, but i didn’t found th right syntax… but it’s Ok now:
import rhinoscriptsyntax as rs
import Rhino
from System.Collections.Generic import List
import scriptcontext as sc
import Rhino.Geometry as rg
def CreateSurface(edges):
MTOL = sc.doc.ModelAbsoluteTolerance
ATOL = sc.doc.ModelAngleToleranceRadians
curves=[]
for edge in edges:
curves.append(edge.ToNurbsCurve())
continuity = 3 # 0 = loose, 1 = position, 2 = tan, 3 = curvature
surface, err = rg.NurbsSurface.CreateNetworkSurface(curves, continuity, MTOL, MTOL, ATOL)
if err==0:
rc = sc.doc.Objects.AddSurface(surface)
sc.doc.Views.Redraw()
def EdgeFilter(edges,ptcontrol):
for edge in edges:
crv=edge.ToNurbsCurve()
if rs.IsPointOnCurve(crv,ptcontrol):
return edge
def PointInters (borders,breps,i):
j=0
a=(j+i)%len(borders)
b=(j+1+i)%len(borders)
c=(j+2+i)%len(borders)
inter1=rs.CurveCurveIntersection(borders[a],borders[b])
dist=[]
dist=rs.Distance(inter1[0][1],breps[a][3])
pt1=inter1[0][1]
if len(inter1)>1:
distcontrol=rs.Distance(inter1[1][1], breps[a][3])
if distcontrol<dist: pt1=inter1[1][1]
inter1=rs.CurveCurveIntersection(borders[a],borders[c])
dist=[]
dist=rs.Distance(inter1[0][1],breps[a][3])
pt2=inter1[0][1]
if len(inter1)>1:
distcontrol=rs.Distance(inter1[1][1], breps[a][3])
if distcontrol<dist: pt2=inter1[1][1]
return (pt1,pt2)
def FiletCorner():
#selection des surfaces a limiter
breps=[]
breps.append(rs.GetSurfaceObject('select surf1'))
if not breps[0]:
return
breps.append(rs.GetSurfaceObject('select surf2'))
if not breps[1]:
return
breps.append(rs.GetSurfaceObject('select surf3'))
if not breps[2]:
return
rs.EnableRedraw(False)
#dupliquer les borders
borders=[]
borders.append(rs.DuplicateSurfaceBorder(breps[0][0],1))
borders.append(rs.DuplicateSurfaceBorder(breps[1][0],1))
borders.append(rs.DuplicateSurfaceBorder(breps[2][0],1))
network=[]
edges=[]
for i in range(len(breps)):
pts=PointInters(borders,breps,i)
line=rs.AddLine(pts[0],pts[1])
midpt=rs.CurveMidPoint(line, segment_index=-1)
clpt=rs.PointClosestObject(midpt,breps[i])
direction=rs.VectorCreate(clpt[1],midpt)
rs.SelectObject(line)
rs.SelectObject(breps[i][0])
proj=rs.ProjectCurveToSurface(line, breps[i], direction)
network.append(proj)
rs.UnselectAllObjects()
plane=rs.PlaneFromPoints(rs.CurveStartPoint(line),rs.CurveEndPoint(line),rs.CurveMidPoint(proj))
cutter=rs.AddPlaneSurface(plane,rs.CurveLength(line),rs.CurveLength(line))
parts=rs.SplitBrep(breps[i][0],cutter,True)
rs.DeleteObject(cutter)
for part in parts:
if not rs.IsPointOnSurface(part,breps[i][3]):
rs.DeleteObject(part)
else:
surf=rs.coercebrep(part)
pass
edges.append(EdgeFilter(surf.Edges,clpt[1]))
rs.DeleteObject(proj)
rs.DeleteObject(line)
cap=CreateSurface(edges)
rs.DeleteObjects(borders)
rs.EnableRedraw(True)
if( __name__ == "__main__" ):
FiletCorner()