STR METAL Test.3dm (791.1 KB)
it’s a few part of the assembly,
and the script…
the end doesn’t run:
# coding: utf-8
import rhinoscriptsyntax as rs
def TriTube(Tubes):
Tubes.sort(key = lambda Tube : rs.SurfaceVolume(Tube)[0])
return Tubes
def TriSurf (Surfs):
Surfs=sorted([(rs.SurfaceArea(Surf)[0],Surf) for Surf in Surfs])
return [item[1] for item in Surfs]
def TriEdge (ArrEdge):
ArrEdge=sorted([(rs.CurveLength(Edge),Edge) for Edge in ArrEdge])
return [item[1] for item in ArrEdge]
def VectNormSurf(Surf):
UDom=rs.SurfaceDomain(Surf,0)
VDom=rs.SurfaceDomain(Surf,1)
NormSurf=rs.SurfaceNormal(Surf,((UDom[1]-UDom[0])/2,(VDom[1]-VDom[0])/2))
return NormSurf
def MUserTex(Tube):
Surfs=rs.ExplodePolysurfaces(Tube)
Surfs=TriSurf(Surfs)
ArrEdge=rs.DuplicateEdgeCurves(Surfs[len(Surfs)-1], select=False)
ArrEdge=TriEdge(ArrEdge)
NormSurf=VectNormSurf(Surfs[len(Surfs)-1])
Origine=rs.CurveStartPoint(ArrEdge[len(ArrEdge)-1])
XVect=rs.CurveEndPoint(ArrEdge[len(ArrEdge)-1])-rs.CurveStartPoint(ArrEdge[len(ArrEdge)-1])
Plane=rs.PlaneFromNormal(Origine,NormSurf,XVect)
#rs.AddPlaneSurface(Plane, 500,500)
BBox=rs.BoundingBox(Tube,Plane)
Lg=rs.Distance(BBox[0],BBox[1])
AngleE=[0,0]
#definition coupe ou pas
VolBox=rs.Distance(BBox[0],BBox[1])*rs.Distance(BBox[0],BBox[3])*rs.Distance(BBox[0],BBox[4])
VolTube=rs.SurfaceVolume(Tube)
if round(VolBox,2)<>round(VolTube[0],2):
SurfAppui=None
#vecteur Petite surface
for aa in range (0,2):
NormSurfE=VectNormSurf(Surfs[aa])
#vecteur grande surface
if SurfAppui!=None:
NormSurf=VectNormSurf(SurfAppui)
AngleETemp=rs.VectorAngle(NormSurf,NormSurfE)
AngleE[aa]=-(AngleETemp-90)
else:
for bb in range(2,6):
NormSurf=VectNormSurf(Surfs[bb])
AngleETemp=rs.VectorAngle(NormSurf,NormSurfE)
if int(round(AngleETemp))!=90:
SurfAppui=Surfs[bb]
AngleE[aa]=-(AngleETemp-90)
break
rs.DeleteObjects(ArrEdge)
rs.DeleteObjects(Surfs)
Lgretenu=int(round(Lg))
htTube=int(round(rs.Distance(BBox[3],BBox[0])))
largTube=int(round(rs.Distance(BBox[4],BBox[0])))
Sectionretenu=str(htTube)+'x'+str(largTube)
Angle1=int(round(AngleE[0]))
Angle2=int(round(AngleE[1]))
print 'longueur', Lgretenu
print 'Section', htTube,'x',largTube
print 'angle 1=',Angle1,'°'
print 'angle 2=',Angle2,'°'
rs.SetUserText(Tube,'Lg',str(Lgretenu))
rs.SetUserText(Tube,'Section',Sectionretenu)
rs.SetUserText(Tube,'Angle1',str(Angle1))
rs.SetUserText(Tube,'Angle2',str(Angle2))
Tubes=rs.GetObjects("selectionne l'ensemble des tubes",rs.filter.polysurface)
Tubes2=[]
for Tube in Tubes:
if rs.IsPolysurfaceClosed(Tube):
Tubes2.append(Tube)
else:
rs.ObjectColor( Tube, (250,0,0))
Tubes=Tubes2
if Tubes:
PrefixTube=rs.GetString("une lettre de nommage?")
if PrefixTube:
Tubes=TriTube(Tubes)
for Tube in Tubes:
MUserTex(Tube)
TubesNom=[]
n=1
TubesLenght=len(Tubes)
while len(TubesNom)<TubesLenght or n<200:
NewName=PrefixTube+str(n)
for Tube in Tubes:
if rs.ObjectName(Tube)==None:
rs.ObjectName(Tube,NewName)
Chk_Lg=rs.GetUserText(Tube,'Lg')
Chk_Sect=rs.GetUserText(Tube,'Section')
Chk_A1=rs.GetUserText(Tube,'Angle1')
Chk_A2=rs.GetUserText(Tube,'Angle2')
TubesNom.append(Tube)
Tubes.remove(Tube)
for i in range (0,len(Tubes)-1):
if rs.ObjectName(Tubes[i])==None:
if rs.GetUserText(Tubes[i],'Lg')==Chk_Lg:
if rs.GetUserText(Tubes[i],'Section')==Chk_Sect:
if rs.GetUserText(Tubes[i],'Angle1')==Chk_A1:
if rs.GetUserText(Tubes[i],'Angle2')==Chk_A2:
rs.ObjectName(Tubes[i],NewName)
TubesNom.append(Tubes[i])
n+=1