cyrkan Posté(e) le 16 août 2008 Posté(e) le 16 août 2008 Bonjour... J'ai travailler pendant les vacances et je suis arriver a la conclusion que je n'arriverais pas adapter une boite de dialogue à mon lisp pour le moment. J'ai donc décider d'en faire une version capable d'être utilisé par la ligne de commande. Ainsi j'ai donc créer le lisp suivant. ce lisp reprend une version générale qui fonctionne bien... Mais la je me heurte à un nombre d'argument trop important! J'utilise beaucoup le fonction if en cascade (c'est a dire que j'imbrique des if dans des if....).J'ai aussi régler un problème d'argument trop important dans les if en utilisant la fonction progn. Donc voici mon lisp a l'heure qu'il est. Je rappel que j'ai un problème d'argument trop important.Ma question serais, comment contourné ce problème. Commentaire sur le code: le premier bloc sert à lancé la procédure en posant la question du calque de départ puis de même pour le calque d'arriver avec la seconde question. Ensuite je lance les différents filtres. puis dans un second temps je tris le résultat des filtres. (defun c:tri () (setq varfiltre (getstring "\nquel est le type d'élément à trier? EU, EP, ELec: ")) ;récupération du paramètre objet à filtrer (setq nouvcal (getstring "\nquel est le calque d'arrivé? EU, EP, Elec: ")) ;récupération du paramètre du calque d'arrivé (filtre varfiltre nouvcal ) ;lancement général du filtre avec les deux paramètres (deplacemententite) (setq recom (getstring "\nrelancer la fonction filtre? Oui Non")) (if (= recom "*o*") ( "tri" ) ( nil ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun filtre() (if ;lancement du if pour déterminé quel filtre appliquer en fonction de la variable varfiltre (= varfiltre "EU") ;si varfiltre = eu alors faire ce qui suit (progn (setq jeutotal (ssadd)) (setq jeusel1 (ssget "X" (list (cons 8 "*eau usées*,*fl1-v*,*flt-v*,*fls-v*,*res-usée*,*EU*")))) (princ (strcat "Il y a " (itoa (setq nombre (sslength jeusel1))) " 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 )) ;sinon (si varfiltre n'est pas égale à eu faire ce qui suit) (filtre2) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun filtre2() ;lancement d'un nouveau if par filtre (if(= varfiltre "EP") (progn (setq jeutotal (ssadd)) (setq jeusel1 (ssget "X" (list (cons 8 "*busage*,*pluvial*,*fl1-p*,*fls-p*,*flt-p*,*ep*")))) (princ (strcat "Il y a " (itoa (setq nombre (sslength jeusel1))) " 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 )) (filtre3) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun filtre3() ;lancement d'un nouveau if par filtre2 (if(= varfiltre "ELec") (progn (setq jeutotal (ssadd)) (setq jeusel1 (ssget "X" (list (cons 8 "*elec*,*edf*,*fo1*,*fos*,*fot*")))) (princ (strcat "Il y a " (itoa (setq nombre (sslength jeusel1))) " 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 )) (nil) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun deplacemententite() (setq compteur2 0) ;initialisation compteur (repeat (sslength jeutotal) ;boucle en fontion du nombre d'entité contenu dans jeu total (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 ) ) Voici la version du cas générale qui ma servis de point de départ! A noter que cette version marche! (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 Voila, en espérant qu'une âme charitable passerais par la afin de m'apporter un éclaircissement. [Edité le 16/8/2008 par cyrkan]
Serge Posté(e) le 16 août 2008 Posté(e) le 16 août 2008 cyrkan Dans l'éditeur de VisualLisp, déroule le menu View -> Toolbars -> ToolsDans le toolbars Tools, clique la 3e icône (symbolisant une fenêtre et un crochet bleu). Clique dessus.Cela ouvre une fenêtre . Tu peux voir ou et pourquoi tu as des erreurs. Serge [Edité le 16/8/2008 par Serge]
cyrkan Posté(e) le 17 août 2008 Auteur Posté(e) le 17 août 2008 géniale!!! Je ne connaissait pas!!!! Merci beaucoup! Je retravaille dessus et je vous tiens au courant!! PS: j'ai vérifié mon projet...Il y avait deux erreurs que j'ai corrigé j'ai relancé ue vérification qui na rien donné (en gros tout ok). Mais une fois lancé mon lisp donne toujours une erreur en me disans que le nombre d'argument est trop important... [Edité le 17/8/2008 par cyrkan]
sechanbask Posté(e) le 17 août 2008 Posté(e) le 17 août 2008 Bonjour, j'ai du mal à comprendre le lisp mais je voudrais savoir qu'elle est le but de ce lisp qui te tient tant à coeur ? Peux-tu m'éclairer ? ATEGIE - Bureau d'Études Fluideshttp://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.pngExécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffragewww.ategie.fr
bonuscad Posté(e) le 18 août 2008 Posté(e) le 18 août 2008 Je n'ai pas fais une exécution de ton code, mais rien quand regardant rapidement, je pense comprendre d'où vient l'erreur: Mais la je me heurte à un nombre d'argument trop important! Dans ta fonction principale (defun c:tri ()....), tu fais appel à (filtre varfiltre nouvcal ) ;lancement général du filtre avec les deux paramètres Or ta fonction (defun filtre ()) est définie sans arguments, d'où l'erreur.Elle devrait être définie sous la forme(defun filtre (arg1 arg2 / var1 var2 .... varN).....) arg1 et arg2 étant les arguments soumis à la fonction. Voilà, pour la remarque qui m'a sauté au yeux, mais il y a peut être d'autres erreurs..... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
cyrkan Posté(e) le 21 août 2008 Auteur Posté(e) le 21 août 2008 Je vais voir ca ce soir... J'éditerais ce message pour donné ce que j'ai fait et le résultat! PS: je rappel que ce lisp a pour but de trier rapidement un plan à son arriver au bureau d'étude de l'endroit ou je travail. il est adapté à mon entreprise et à la façon dont trie les bureau d'études avec lesquels ont travail. c'est a dire que les filtre nominatif ont pour paramètres les noms des calques rencontrer dans les plans que l'on recoit régulièrement.Les filtre du lisp au dessus n'est pas complet c'est juste une version d'essai.En gros le trieur prend les éléments dans les calques et les mets dans les notres. ====================================================== Edit: Mouarf, je ne métrise pas l'annonce des paramètres dans les fonctions... je n'est donc pas obtenus de bon résultat... Quelqu'un a un tuto sur ce sujet?? [Edité le 25/8/2008 par cyrkan]
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