Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

Je pensais y arriver tout seul (http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=30126#pid130778), mais ce n'est pas le cas.

 

J'ai bien regardé ce sujet qui est similaire : http://www.cadxp.com/sujetXForum-13160.htm, en vain.

 

Je récupère des informations sur des références de blocs dynamiques, et ma liste est constituée ainsi :

(
(calque visibilité épaisseur hauteur longueur)
(calque visibilité épaisseur hauteur longueur)
(calque visibilité épaisseur hauteur longueur)
)  

 

Calque et visibilité : texte

Epaisseur Hauteur Longueur : numérique

 

et je voudrais pouvoir les classer par calque+visibilité+épaisseur+hauteur :

(
calque[b]1[/b] visibilité[b]1[/b] épaisseur[b]1[/b] hauteur[b]1[/b] (longueur longueur longueur)
calque[b]1[/b] visibilité[b]1[/b] épaisseur[b]1[/b] hauteur[b]2[/b] (longueur longueur longueur)
calque[b]1[/b] visibilité[b]1[/b] épaisseur[b]2[/b] hauteur[b]1[/b] (longueur longueur longueur)
calque[b]1[/b] visibilité[b]1[/b] épaisseur[b]2[/b] hauteur[b]2[/b] (longueur longueur longueur)
)
etc 

 

Tout ceci afin de pouvoir faire une somme de longueur par calque+visibilité+épaisseur+hauteur.

 

Merci d'avance pour votre aide.

Autocad 2021 - Revit 2022 - Windows 10

Posté(e)

Ci joint liste pour tester

 

 

((CALQUE1 doublage 80.0 2700.0 975.96) (CALQUE1 doublage 80.0 2700.0 570.46) (CALQUE1 doublage 40.0 2700.0

5113.21) (CALQUE1 doublage 40.0 2700.0 600.693) (CALQUE1

doublage 40.0 2700.0 446.038) (CALQUE1 doublage 40.0

2700.0 445.902) (CALQUE1 doublage 40.0 2700.0 493.957) (CALQUE1

doublage 40.0 2700.0 634.6) (CALQUE1 doublage 40.0

2700.0 944.076) (CALQUE1 doublage 40.0 2700.0 943.948) (CALQUE1

doublage 40.0 2700.0 599.956) (CALQUE1 doublage 40.0

2700.0 599.956) (CALQUE1 cloison 80.0 2700.0 420.0) (CALQUE1

cloison 80.0 2700.0 420.0) (CALQUE1 cloison 80.0

2700.0 2660.0) (CALQUE1 cloison 80.0 2700.0 9656.33) (CALQUE1

cloison 80.0 2700.0 2642.2) (CALQUE1 cloison 80.0

2700.0 2642.2) (CALQUE1 cloison 80.0 2700.0 2142.2) (CALQUE1

doublage 60.0 2700.0 5250.0) (CALQUE1 cloison 60.0

2700.0 1509.59) (CALQUE1 doublage 40.0 2700.0 164.537) (CALQUE1

doublage 40.0 2700.0 889.955) (CALQUE1 cloison 80.0

2700.0 1852.25) (CALQUE1 cloison 80.0 2700.0 1921.08) (CALQUE1

doublage 40.0 2700.0 481.005) (CALQUE1 doublage 40.0

2700.0 651.055) (CALQUE1 doublage 40.0 2700.0 610.967) (CALQUE1

doublage 40.0 2700.0 611.053) (CALQUE1 doublage 60.0

2700.0 5189.7) (CALQUE1 doublage 40.0 2700.0 600.008) (CALQUE1

doublage 40.0 2700.0 136.781) (CALQUE1 doublage 40.0

2700.0 136.781) (CALQUE1 doublage 40.0 2700.0 184.765) (CALQUE1

doublage 40.0 2700.0 184.762) (CALQUE1 doublage 40.0

2700.0 680.024) (CALQUE1 cloison 80.0 2700.0 900.0) (CALQUE1

cloison 80.0 2700.0 6131.25) (CALQUE1 cloison 80.0

2700.0 1879.43) (CALQUE1 cloison 80.0 2700.0 4814.58) (CALQUE1

cloison 80.0 2700.0 6352.58) (CALQUE1 doublage 60.0

2700.0 12246.0) (CALQUE1 doublage 80.0 2700.0 6272.86) (CALQUE1

doublage 80.0 2700.0 605.915) (CALQUE1 doublage 80.0

2700.0 350.806) (CALQUE1 cloison 80.0 2700.0 3874.75) (CALQUE1

cloison 80.0 2700.0 1879.43) (CALQUE1 cloison 80.0

2700.0 1900.41) (CALQUE1 cloison 80.0 2700.0 8340.0) (CALQUE1

cloison 80.0 2700.0 9292.43) (CALQUE1 cloison 80.0

2700.0 4815.13) (CALQUE1 doublage 80.0 2700.0 3188.84) (CALQUE1

doublage 40.0 2700.0 2568.89) (CALQUE1 doublage 40.0

2700.0 5113.21) (CALQUE1 doublage 40.0 2700.0 7299.57) (CALQUE1

doublage 40.0 2700.0 5250.0) (CALQUE1 doublage 40.0

2700.0 7063.48) (CALQUE1 doublage 40.0 2700.0 2584.91) (CALQUE1

doublage 40.0 2700.0 2584.9) (CALQUE1 doublage 40.0

2700.0 6246.99) (CALQUE1 doublage 40.0 2700.0 9636.33) (CALQUE1

doublage 40.0 2700.0 1424.12) (CALQUE1 doublage 40.0

2700.0 1056.71) (CALQUE1 doublage 40.0 2700.0 2682.2) (CALQUE1

cloison 80.0 2700.0 1900.41) (CALQUE1 cloison 120.0

2700.0 2277.88) (CALQUE1 cloison 120.0 2700.0 1939.3) (CALQUE1

cloison 120.0 2700.0 2397.88) (CALQUE1 cloison 120.0

2700.0 2058.88))

Autocad 2021 - Revit 2022 - Windows 10

Posté(e)

Salut

 

(vl-sort lst '(lambda(a b)(if (= (nth 0 a) (nth 0 b))
		    (if (= (nth 1 a) (nth 1 b))
		      (if (= (nth 2 a) (nth 2 b))
			(if (= (nth 3 a) (nth 3 b))
			  (< (nth 4 a) (nth 4 b))
			  (< (nth 3 a) (nth 3 b))
			)
			(< (nth 2 a) (nth 2 b))
		      )
		      (< (nth 1 a) (nth 1 b))
		    )
		    (< (nth 0 a) (nth 0 b))
		  )
     )
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)
Salut

 

(vl-sort lst '(lambda(a b)(if (= (nth 0 a) (nth 0 b))
		    (if (= (nth 1 a) (nth 1 b))
		      (if (= (nth 2 a) (nth 2 b))
			(if (= (nth 3 a) (nth 3 b))
			  (< (nth 4 a) (nth 4 b))
			  (< (nth 3 a) (nth 3 b))
			)
			(< (nth 2 a) (nth 2 b))
		      )
		      (< (nth 1 a) (nth 1 b))
		    )
		    (< (nth 0 a) (nth 0 b))
		  )
     )
)

 

@+

En relisant, je viens de voir que j'ai fais un niveau de trop, mais c'est plus compréhensif

 

Donc, le même mais pour 4 niveaux

(vl-sort lst '(lambda(a b)(if (= (car a) (car b))
		    (if (= (cadr a) (cadr b))
		      (if (= (caddr a) (caddr b))
			(< (cadddr a) (cadddr b))
			(< (caddr a) (caddr b))
		      )
		      (< (cadr a) (cadr b))
		    )
		    (< (car 0 a) (car 0 b))
		  )
     )
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci Patrick

 

Est-ce que vl-sort ne risque pas de me supprimer des doublons ?

 

Est-il possible de regrouper le dernier élément (longueur) des listes ?

 

 
(
calque[b]1[/b] visibilité[b]1[/b] épaisseur[b]1[/b] hauteur[b]1[/b] (longueur1 longueur2 longueur3)
calque[b]1[/b] visibilité[b]1[/b] épaisseur[b]1[/b] hauteur[b]2[/b] (longueur4 longueur5 longueur6)
calque[b]1[/b] visibilité[b]1[/b] épaisseur[b]2[/b] hauteur[b]1[/b] (longueur7 longueur8 longueur9)
calque[b]1[/b] visibilité[b]1[/b] épaisseur[b]2[/b] hauteur[b]2[/b] (longueur10 longueur11 longueur12)
) 

Autocad 2021 - Revit 2022 - Windows 10

Posté(e)

En HS sur ta demande.

 

Calque et visibilité : texte

Epaisseur Hauteur Longueur : numérique

 

((CALQUE1 doublage 80.0 2700.0 975.96) (CALQUE1 doublage 80.0 2700.0 570.46)....

 

Pourquoi tes atomes concernant le calque et la visibilité ne sont pas du type STR?

Si ton nom de calque comporte un espace, tu risque de créer une liste mal formatée.

 

(("CALQUE1" "doublage" 80.0 2700.0 975.96) ("CALQUE1" "doublage" 80.0 2700.0 570.46)....

serait mieux.

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

C'est peut être une string, je fais

 (setq calque (vlax-get-property (setq obj (vlax-ename->vla-object entite)) "layer"))

pour le récupérer.

 

En effet mes calques ont des espaces

Autocad 2021 - Revit 2022 - Windows 10

Posté(e)

Bon, j'ai quasi fini mon programme.

Mes données textes étaient bien de type str.

J'ai pu regrouper en reprenant un code de Tramber là : http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=13160#pid51865

Que j'ai modifié comme ça :

 

;REORGANISATION DE LA LISTE PAR calque+visibilite+epaisseur+hauteur - source tramber

(setq lsttri nil
     prem (car lst)
     lst (cdr lst)
)

(while lst; boucle sur la totalité -1

 (if (and
(=(car prem)(car(car lst)))
(=(cadr prem)(cadr(car lst)))
(=(caddr prem)(caddr(car lst)))
(=(cadddr prem)(cadddr(car lst)))
)
   (setq prem(append prem (list(cadddr(cdr (car lst))))))
   (setq lsttri(append lsttri(list prem))prem(car lst)))
 (setq lst(cdr lst))
 )
(setq lsttri(append lsttri(list prem)))

 

J'ai utilisé le tri de Patrick 35, mais sans vraiment comprendre la logique du code (lambda ?)

 

Merci, sujet résolu !

Autocad 2021 - Revit 2022 - Windows 10

Posté(e)

Salut

Est-ce que vl-sort ne risque pas de me supprimer des doublons ?

Oui, mais tout dépend comment tu as créé ta liste.

 

J'ai utilisé le tri de Patrick 35, mais sans vraiment comprendre la logique du code (lambda ?)

Lambda est utilisé pour définir une fonction anonyme

Ce qui suit indique l'ordre de trie

Par exemple

(setq a (nth 0 ma_liste))
(setq b (nth 1 ma_liste))

 

Si le premier élément de la liste a et égal au premier élément de la liste b, alors

(if (= (car a) (car b))

Si le second élément de la liste a et égal au second élément de la liste b, alors

(if (= (cadr a) (cadr b))

Si le troisième élément de la liste a et égal au troisième élément de la liste b, alors

(if (= (caddr a) (caddr b))

Trier sur le quatrième élément de la liste a&b (en indiquant le sens de trie avec < )

(< (cadddr a) (cadddr b))

Sinon, trier sur le troisième élément de la liste a&b (en indiquant le sens de trie avec < )

(< (caddr a) (caddr b))

Fin du if

)

Sinon, trier sur le second élément de la liste a&b (en indiquant le sens de trie avec < )

(< (cadr a) (cadr b))

Fin du if

)

Sinon, trier sur le premier élément de la liste a&b (en indiquant le sens de trie avec < )

(< (car 0 a) (car 0 b))

Fin du if

)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut,

 

La fonction vl-sort requiert deux arguments : la liste à trier et une fonction de comparaison.

Cette fonction peut être une fonction prédéfinie (), une fonction définie avec defun ou une fonction lambda qui doit retourner T ou nil. Les éléments comparés 2 par 2, si la fonction retourne T le premier élément est placé devant le second, sinon, l'inverse.

 

(vl-sort lst '

est équivalent à :
[code](defun compare (x1 x2) ((vl-sort lst 'compare)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci pour ce cours.

 

Je croyais que

 (< (car l1) (car l2)) 

était une comparaison qui renvoyait T ou nil, alors que c'est une action.

 

Pour la fonction "anonyme", je comprends mieux, c'est juste pour éviter de faire appel à une autre fonction defun.

 

citation extraite du message original:

Est-ce que vl-sort ne risque pas de me supprimer des doublons ?

 

 

Oui, mais tout dépend comment tu as créé ta liste.

 

Par contre, là ça m'inquiète...

J'avais vérifier, en créant 2 blocs identiques, donc même extraction de données, donc 2 fois le même élément (liste également) dans la liste principal.

(
("0" " "doublage" 80.0 2700.0 1150.0)
("0" " "doublage" 80.0 2700.0 1150.0)
)

Dans quel cas est-ce que je risquerais de perdre des données?

Autocad 2021 - Revit 2022 - Windows 10

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité