trier un array

il y a 3 ans 7 mois #55 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.

Connexion pour participer à la conversation.

il y a 3 ans 7 mois #56 par Jennifer
Bonjour
je ne comprend pas bien la manipe que tu recherche... :(

Connexion pour participer à la conversation.

il y a 3 ans 7 mois #57 par onlyforpeace
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 pour participer à la conversation.

il y a 3 ans 4 mois - il y a 3 ans 4 mois #100 par Jennifer
Hello
As tu trouvé une solution?

Connexion pour participer à la conversation.

il y a 3 ans 4 mois #101 par SwissRhino
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 pour participer à la conversation.

Modérateurs: SwissRhinoJenniferJoao
Temps de génération de la page : 0.147 secondes
Propulsé par Kunena

Powered by


3d design training



cadlantique.com


swissrhino.com