YES!!!
thank you for your time, my script is ok now…
i found all i need…
i have to search for write on a layout but for the moment it’s ok!
for analyse tubes and named:
# coding: utf-8
import rhinoscriptsyntax as rs
def TriTube(Tubes):
Tubes.sort(key = lambda Tube : rs.SurfaceVolume(Tube)[0])
Tubes.reverse()
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))
def main():
Tubes=rs.GetObjects("selectionne l'ensemble des tubes",rs.filter.polysurface)
Tubes2=[]
chk_red=False
chk=False
for Tube in Tubes:
if rs.IsPolysurfaceClosed(Tube):
Tubes2.append(Tube)
else:
chk_red=True
rs.ObjectColor( Tube, (250,0,0))
Tubes=Tubes2
if chk_red:
Cont_script=rs.MessageBox('les Tubes rouges ne sont pas fermées, on continue?',4,title='ATTENTION')
if Cont_script==7:
return
for Tube in Tubes:
chk_name=rs.ObjectName(Tube)
if chk_name!=None and chk==False:
Cont_script=rs.MessageBox('au moins un tube à déjà un nom, on renomme et on continue?',4,title='ATTENTION')
chk=True
if Cont_script==7:
return
rs.ObjectName(Tube,'')
if Tubes:
PrefixTube=rs.GetString("une lettre de nommage?")
if PrefixTube:
Tubes=TriTube(Tubes)
for Tube in Tubes:
MUserTex(Tube)
TubesNom=[]
n=1
for Tube in Tubes:
# rs.SelectObject(Tube)
NewName=PrefixTube+'.'+str(n)
print rs.ObjectName(Tube)
if rs.ObjectName(Tube)==None:
rs.ObjectName(Tube,NewName)
print rs.ObjectName(Tube)
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)
items=Tubes
for item in items:
# rs.SelectObject(item)
if rs.ObjectName(item)==None:
if rs.GetUserText(item,'Lg')==Chk_Lg:
if rs.GetUserText(item,'Section')==Chk_Sect:
if rs.GetUserText(item,'Angle1')==Chk_A1:
if rs.GetUserText(item,'Angle2')==Chk_A2:
rs.ObjectName(item,NewName)
TubesNom.append(item)
# rs.UnselectObject(item)
n+=1
# rs.UnselectAllObjects()
rs.SelectObjects(TubesNom)
if __name__ =="__main__":
main()
and for write the BOM:
# coding: utf-8
import rhinoscriptsyntax as rs
from collections import Counter
def ExtractName(str):
if '.' in str:
pos=str.index('.')
temp=str.split('.')
return temp[0]
else:
return str[0]
def main():
Tubes=rs.GetObjects("selectionne l'ensemble des tubes",rs.filter.polysurface)
TubeCounter = Counter()
lstcount=[]
lstname=[]
lstlen=[]
#recupère le nom, les quantité,les longueurs à mettre dans une liste
for tube in Tubes:
Name=rs.ObjectName(tube)
Lg = rs.GetUserText(tube, 'Lg')
data = (Lg,Name)
TubeCounter.update([data])
for item, count in TubeCounter.iteritems():
lstcount.append(count)
lstname.append(item[1])
lstlen.append(int(item[0]))
print lstcount
print lstname
print lstlen
#tri les listes par longueurs
lsttotal=[]
for i in range (0,len(lstcount)):
lsttotal.append((lstcount[i],lstname[i],lstlen[i]))
lst_sort=sorted(lsttotal,key=lambda s:s[2],reverse=True)
sorted_lstlen=[]
sorted_lstname=[]
sorted_lstcount=[]
for item in lst_sort:
sorted_lstlen.append(item[2])
sorted_lstname.append(item[1])
sorted_lstcount.append(item[0])
text=''
# récupères toutes les données par tubes et les ajoute en chaine de textes
for i in range(0,len(sorted_lstlen)):
select_by_name=rs.ObjectsByName(sorted_lstname[i])
rs.SelectObject(select_by_name[0])
Name=rs.ObjectName(select_by_name[0])
Lg = rs.GetUserText(select_by_name[0], 'Lg')
Section = rs.GetUserText(select_by_name[0], 'Section')
Angle1 = rs.GetUserText(select_by_name[0], 'Angle1')
Angle2 = rs.GetUserText(select_by_name[0], 'Angle2')
text=text+Name+' : '+str(lstcount[i])+' x '+' Lg='+Lg+'mm Angle= '+Angle1+'°/'+Angle2+'°\n'
rs.UnselectAllObjects()
print text
#Ajout un Calque
LayerName=ExtractName(Name)
text='STRUCTURE '+LayerName+' ' + Section +'\n' + text
rs.AddLayer('NOMENCLATURE')
rs.AddLayer(LayerName,(0,0,0),parent='NOMENCLATURE')
rs.CurrentLayer(LayerName)
rs.AddText(text,(0,0,0),5)
if __name__ =="__main__":
main()