LUDWIG Posté(e) le 5 novembre 2010 Posté(e) le 5 novembre 2010 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é : texteEpaisseur 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
LUDWIG Posté(e) le 5 novembre 2010 Auteur Posté(e) le 5 novembre 2010 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
Patrick_35 Posté(e) le 5 novembre 2010 Posté(e) le 5 novembre 2010 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Patrick_35 Posté(e) le 5 novembre 2010 Posté(e) le 5 novembre 2010 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
LUDWIG Posté(e) le 5 novembre 2010 Auteur Posté(e) le 5 novembre 2010 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
bonuscad Posté(e) le 5 novembre 2010 Posté(e) le 5 novembre 2010 En HS sur ta demande. Calque et visibilité : texteEpaisseur 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
LUDWIG Posté(e) le 5 novembre 2010 Auteur Posté(e) le 5 novembre 2010 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
LUDWIG Posté(e) le 7 novembre 2010 Auteur Posté(e) le 7 novembre 2010 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#pid51865Que 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
Patrick_35 Posté(e) le 9 novembre 2010 Posté(e) le 9 novembre 2010 SalutEst-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 anonymeCe qui suit indique l'ordre de triePar 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 9 novembre 2010 Posté(e) le 9 novembre 2010 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
LUDWIG Posté(e) le 12 novembre 2010 Auteur Posté(e) le 12 novembre 2010 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant