cyrkan Posté(e) le 2 mai 2008 Posté(e) le 2 mai 2008 Bonjour bonjour! Voici mon problème! Je cherche a faire fusionner des listes! Voici mon code:(defun c:test () ;(setq EP (ssget "X" (list (cons 8 "*busage*") (cons 8 "*pluvial*") (cons 8 "*fl1-p*") (cons 8 "*fls-p*") (cons 8 "*flt-p*") (cons 8 "*ep*")))) (setq EP1 (ssget "X" (list (cons 8 "*fl1-v*")))) (setq N1 (sslength EP1)) (setq EP2 (ssget "X" (list (cons 8 "*fl1-p*")))) (setq N2 (sslength EP2)) (setq EP (append EP1 EP2)) (setq N (sslength EP)) (princ (strcat "Il y a " (itoa (setq nombre (sslength EP))) " entités à changer de calque")) ) Comme vous pouvez le voir je cherche a faire une liste avec EP1 et EP2 et crée une liste appelé EP.
Patrick_35 Posté(e) le 2 mai 2008 Posté(e) le 2 mai 2008 Salut (setq EP (ssget "X" (list (cons 8 "*fl1-v*,*fl1-p*")))) @+ 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 2 mai 2008 Posté(e) le 2 mai 2008 Salut, la fonction ssget ne retourne pas une liste, mais un pointeur vers un jeu de sélection.la fonction append fonctionne uniquement avec avec des listes. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 2 mai 2008 Posté(e) le 2 mai 2008 Salut, Pour compléter la réponse de (gile), je dirais que la fonction la plus proche de (append) pour les listes est, pour les jeux de sélection, la fonction (ssadd); voir l'aide pour plus de renseignements. Le filtre proposé par Patrick_35 est quand même le plus simple (dans ton cas) NB: tout ce qui concerne les jeux de sélection, les noms des fonction commence par (ss....), et donc se manipule essentiellement avec celles-ci. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
cyrkan Posté(e) le 27 mai 2008 Auteur Posté(e) le 27 mai 2008 Bonjour, ce qui a été présenté plus avant marche bien...J'ai donc tenté l'ajout deux deux liste dans une seule; autrement dit la fusion de deux liste (ou plus) Voici le code choisit: (setq listeultime (append liste1 liste2 liste3)) (princ (strcat "Il y a " (itoa (setq nombre3 (sslength listeultime))) " entités dans liste ultime") vous vous doutez bien que si je vous consulte ca veut dire que mon code ne marche pas... (pour changer :mad: ) mon code retourne:type d'argument incorrect: listp Au passage une erreur de type listp est dut a quoi?? comme ca je pourrait trouver tout seul une autre fois!! Merci d'avance!! [Edité le 29/5/2008 par cyrkan] [Edité le 29/5/2008 par cyrkan]
cyrkan Posté(e) le 29 mai 2008 Auteur Posté(e) le 29 mai 2008 Je me permet de reposter car j'ai essayer une nouvelle méthode; et éditer le message précédent aurais été incompréhensible. j'ai essayer la technique du ssadd aprés 2 heures d'arrachage de cheveux...Voici le code: (defun c:tri () (setq liste1 (ssget "X" (list (cons 8 "*filtre1*,*filtre2*,*filtre3*")))) ;sélection de tout le dessin et création d'un liste contenant les élément filtre1 filtre2 filtre3 (princ (strcat "Il y a " (itoa (setq nombre (sslength liste1))) " entités à changer de calque")) (setq liste2 (ssget "X" (list (cons 8 "*filtre4*,*filtre5*,*filtre6*")))) (princ (strcat "Il y a " (itoa (setq nombre1 (sslength liste1))) " entités à changer de calque")) (setq liste3 (ssget "X" (list (cons 8 "*filtre7*,*filtre8*,*filtre9*")))) (princ (strcat "Il y a " (itoa (setq nombre2 (sslength liste1))) " entités à changer de calque")) (setq liste1 (entnext)) (setq listeultime (ssadd)) (ssadd liste1 listeultime) (setq liste2 (entnext liste1)) (ssadd liste2 listeultime) (setq liste3 (entnext liste2)) (ssadd liste3 listeultime) (princ (strcat "Il y a " (itoa (setq nombre3 (sslength listeultime))) " de liste dans liste ultime")) (command "chprop" listeultime "" "cal" "0" "") ) Et la ca ne fonctionne pas malgrés le faite que la fonction ssadd fonctionne bien elle!En effet la fonction ssadd me permet de renvoyé 3 dans le cas présent car elle a trois liste mais elle ne prend pas les élément qu'ils y avait dans la liste de départ... C'est ce qui me fait planter ma fonction. ce n'est pas qu'elle plante mais elle ne peut pas effectuer l'action (changer des polylignes de calques). PS: ma question reste valable pour le nom de l'erreur : "une erreur de type listp est dut a quoi??" Merci d'avance
(gile) Posté(e) le 30 mai 2008 Posté(e) le 30 mai 2008 Salut, Il me semble que tu confonds certaines fonctions, par exemple entnext ne retourne pas une entité contenue dans un jeu de sélection.Je ne saurais trop te recommander de voir cette page où les fonctions LISP sont documentées en français par catégories. Pour plus de clarté, commençons par employer les termes convenables. Une liste est une expression AutoLISP spécifique, un jeu de sélection est un type de donné tout à fait différent.Je pense que ton code serait plus lisible si les symboles utilisés comme variables reflétaient cette différence (ss1 ou jsel1 plutôt que liste1). Si une liste peut contenir différents types de données ou d'expressions LISP, une jeu de sélection est un ensemble d'entités. Les fonctions LISP pour le traitement des jeux de sélections commencent par ss* (ssget, ssadd, sslength, ssname...) Pour traiter les entités contenus dans un jeu de sélection, on fait généralement une boucle (avec repeat ou while) pour récupérer chaque entité avec la fonction ssname.Exemple :(setq jeusel1 (ssget "_X" (list (cons 8 "*filtre1*,*filtre2*,*filtre3*")))) (setq jeuselultime (ssadd)) ;; initialisation d'un compteur (setq compteur 0) ;; ajouter à jeuselultime les entités contenues dans jeusel1 (while (setq ent (ssname jeusel1 compteur)) (ssadd ent jeuselultime) (setq compteur (1+ compteur)) ) On peut aussi créer une liste d'entités à partir d'un ou plusieurs jeu de sélection, les fonctions pour traiter la liste seront alors différentes. (setq jeusel1 (ssget "_X" (list (cons 8 "*filtre1*,*filtre2*,*filtre3*")))) ;; initialisation d'un compteur (setq compteur 0) ;; ajouter à listeultime les entités contenues dans jeusel1 (while (setq ent (ssname jeusel1 compteur)) (setq listeultime (cons ent listeultime)) (setq compteur (1+ compteur)) ) PS : utilise les balises bbcode pour les codes que tu postes, ils seront plus lisibles et plus facile à copier. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
cyrkan Posté(e) le 14 juin 2008 Auteur Posté(e) le 14 juin 2008 Je suis aller voir quelqu'un qui ma bien et expliquer.J'ai donc obtenu la chose suivante.Je n'était pas loin de la solution! Cette fois si c'est ok! (defun c:tri () (setq jeutotal (ssadd)) ;création des jeux de selection en début de programme (setq jeusel1 (ssget "X" (list (cons 8 "*filtre1*,*filtre2*,*filtre3*")))) (princ (strcat "Il y a " (itoa (setq nombre (sslength jeusel1))) " entités à changer de calque")) (setq jeusel2 (ssget "X" (list (cons 8 "*filtre4*,*filtre5*,*filtre6*")))) (princ (strcat "Il y a " (itoa (setq nombre1 (sslength jeusel2))) " entités à changer de calque")) (setq jeusel3 (ssget "X" (list (cons 8 "*filtre7*,*filtre8*,*filtre9*")))) (princ (strcat "Il y a " (itoa (setq nombre2 (sslength jeusel3))) " entités à changer de calque")) (setq compteur 0) ;mise en place du compteur (repeat (sslength jeusel1) ;boucle en fonction d'une nombre d'entité (ssadd (ssname jeusel1 compteur) jeutotal) ;ajoute l'entité de jeusel1 a jeutotal (setq compteur (1+ compteur)) ;mise a jour du compteur ) (setq compteur 0) (repeat (sslength jeusel2) (ssadd (ssname jeusel2 compteur) jeutotal) (setq compteur (1+ compteur)) ) (setq compteur 0) (repeat (sslength jeusel3) (ssadd (ssname jeusel3 compteur) jeutotal) (setq compteur (1+ compteur)) ) (setq compteur2 0) ;initialisation compteur (repeat (sslength jeutotal) ;boucle en fontion du nombre d'entité contenu dans jeu total (setq nouvcal "0") ;calque d'arriver temporaire pas automatisé!!!!!!!! (setq ancdxf (assoc 8 (entget (ssname jeutotal compteur2)))) ;récupération de l'ancien calque (setq noudxf (cons 8 nouvcal)) ;récupération du nouveau calque (setq nouvelobj (subst noudxf ancdxf (entget (ssname jeutotal compteur2)))) ;substitution de l'ancien calque par le nouveau (print nouvelobj) ;donne toute les donné dans barre de commande (entmod nouvelobj) ;recalcule le tout ce qui permet de mettre a jour le changement de calque (setq compteur2 (1+ compteur2)) ;mise a jour du compteur ) ) ;fin defun Encore merci a tout le monde!!!
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