RhinoShack-login   RhinoShack-login   Rhino 3d help   RhinoShack-login

 

trier un array

Plus d'informations
il y a 2 ans 8 mois #55 par onlyforpeace
onlyforpeace a créé le sujet : trier un array
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.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 8 mois #56 par Jennifer
Jennifer a répondu au sujet : trier un array
Bonjour
je ne comprend pas bien la manipe que tu recherche... :(

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 8 mois #57 par onlyforpeace
onlyforpeace a répondu au 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...

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 6 mois - il y a 2 ans 6 mois #100 par Jennifer
Jennifer a répondu au sujet : trier un array
Hello
As tu trouvé une solution?
Dernière édition: il y a 2 ans 6 mois par Jennifer.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 6 mois #101 par SwissRhino
SwissRhino a répondu au 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.
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 ou Créer un compte pour participer à la conversation.

Modérateurs: SwissRhinoJenniferlocaJoao
Temps de génération de la page : 0.202 secondes
Propulsé par Kunena

Powered by


 









3d design training








cadlantique.com









swissrhino.com