- Messages : 106
- Karma: 3
- Remerciements reçus 2
- Accueil
- Forum
- RhinoShack Forums
- Support et assistance
- Rhino Script
- Probleme dans mon script
trier un array
- onlyforpeace
- Auteur du sujet
- Hors Ligne
- Expert Boarder
-
Réduire
Plus d'informations
il y a 6 ans 2 semaines #55
par onlyforpeace
trier un array a été créé par onlyforpeace
bonjour,
y at'il moyen de trier simplement un array dans l'ordre croissant,
si j'entre plusieurs valeurs dans un tableau, j'aimerais retrier ces valeurs dans l'ordre croissant., en faite, j'ai besoin de recuperer les deux surfaces les plus petites de chaques polysurfaces d'un ensemble de polysurfaces.
y at'il moyen de trier simplement un array dans l'ordre croissant,
si j'entre plusieurs valeurs dans un tableau, j'aimerais retrier ces valeurs dans l'ordre croissant., en faite, j'ai besoin de recuperer les deux surfaces les plus petites de chaques polysurfaces d'un ensemble de polysurfaces.
Connexion pour participer à la conversation.
- Jennifer
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 23
- Karma: 2
- Remerciements reçus 4
il y a 6 ans 1 semaine #56
par Jennifer
Réponse de Jennifer sur le sujet trier un array
Bonjour
je ne comprend pas bien la manipe que tu recherche...
je ne comprend pas bien la manipe que tu recherche...

Connexion pour participer à la conversation.
- onlyforpeace
- Auteur du sujet
- Hors Ligne
- Expert Boarder
-
Réduire
Plus d'informations
- Messages : 106
- Karma: 3
- Remerciements reçus 2
il y a 6 ans 1 semaine #57
par onlyforpeace
Réponse de onlyforpeace sur le sujet trier un array
en fait j'ai beaucoup de solid à 6 faces dans un fichier, et j'aimerais pour chaque solid recuperer le centre de surface des deux plus petites surfaces, pour tirer une ligne entre les deux centres de surfaces...
donc dans mon script je fais:
for each polysurface
arrsurface = explose polysurface
et là j'aimerais trier "arrsurface" pour que arrsurface(0) soit la plus petite, et arrsurface(1) la deuxième plus petite...
voili voila...
donc dans mon script je fais:
for each polysurface
arrsurface = explose polysurface
et là j'aimerais trier "arrsurface" pour que arrsurface(0) soit la plus petite, et arrsurface(1) la deuxième plus petite...
voili voila...
Connexion pour participer à la conversation.
- Jennifer
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 23
- Karma: 2
- Remerciements reçus 4
- SwissRhino
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 81
- Karma: 2
- Remerciements reçus 11
il y a 5 ans 10 mois #101
par SwissRhino
Réponse de SwissRhino sur le sujet trier un array
Ceci est une des raisons pourquoi j’ai abandonné VBScript en faveur de Python. VBScript est tellement limitée et les outils pour travailler avec des tableaux sont pour horribles, voire inexistants. Ce qui devrait être une tâche simple devient donc compliquée. En fait, vous aurez à créer une fonction de « sorting » pour trier deux tableaux d’une façon synchrone.
python est beaucoup plus compacte:
--Mitch
Option Explicit
'Script by Mitch
'Version 15 June, 2015
Call Test()
Sub Test()
Dim obj,srfs,i
obj = Rhino.GetObject("Select a polysurface", 16)
srfs = Rhino.ExplodePolysurfaces(obj, False)
Dim area,areas(),ub,report,sortedSrfs
ub = Ubound(srfs)
report = "Original values:" & vbNewline
ReDim areas(ub)
For i=0 To ub
Call Rhino.ObjectName(srfs(i), "Surface_" & Cstr(i))
area = Rhino.SurfaceArea(srfs(i))
areas(i) = area(0)
report = report & (Rhino.ObjectName(srfs(i)) & " Area=" & Cstr(areas(i))) & vbNewLine
Next
'sort surfaces by area values
sortedSrfs = KVSort(srfs, areas)
report = report & vbNewLine & "Sorted values:" & vbNewline
For i=0 To ub
area = Rhino.SurfaceArea(sortedSrfs(i))
report = report & (Rhino.ObjectName(sortedSrfs(i)) & " Area=" & Cstr(area(0))) & vbNewLine
Next
Call Rhino.DeleteObjects(srfs)
Call Rhino.TextOut(report)
End Sub
Function KVSort(ByVal arrK, ByVal arrV)
'"Gnome" sort - sorts Keys (objects - arrK) by Values (numbers - arrV)
' by default lowest value will be first in output array
Dim arrVTemp,arrKTemp,i,j
i = 1 : j = 2
Do While i <= Ubound(arrV)
If arrV(i - 1) <= arrV(i) Then 'For highest value first, change to >=
i = j : j = j + 1
Else
arrVTemp = arrV(i): arrKTemp = arrK(i)
arrV(i) = arrV(i - 1): arrK(i) = arrK(i - 1)
arrV(i - 1) = arrVTemp : arrK(i - 1) = arrKTemp
i = i - 1
If i = 0 Then
i = j : j = j + 1
End If
End If
Loop
KVSort = arrK 'output is array of sorted keys
End Function
python est beaucoup plus compacte:
import rhinoscriptsyntax as rs
obj=rs.GetObject("Select a polysurface", 16)
srfs=rs.ExplodePolysurfaces(obj)
face_areas=[]
report="Original areas \n"
for i, srfID in enumerate(srfs):
rs.ObjectName(srfID,"Surface_{}".format(i))
name=rs.ObjectName(srfID)
area=rs.SurfaceArea(srfID)
face_areas.append((area[0],name,srfID))
report+="{} area={}\n".format(name,area[0])
#face_areas is now a list of triples of (area, name and object ID)
#sort by the first element (area)
face_areas.sort()
report+="\nSorted areas \n"
for elem in face_areas:
report+="{} area={}\n".format(elem[1],elem[0])
rs.DeleteObjects(srfs)
rs.MessageBox(report)
--Mitch
Connexion pour participer à la conversation.
Temps de génération de la page : 0.177 secondes