doua Posté(e) le 24 avril 2006 Posté(e) le 24 avril 2006 bonjour à tous, bon voilà j'ai une routine lisp et je veux l'adapter à mes besoins.. * j'ai travaillée mes plans dans un seul fichier (*.dwg)qui regroupe pleusieurs calques.le calque "cartouche" doit apparaitre dans tous mes calques ok ! * alors maintenant j'ai trouvée un programme qui explose tous les calques en prennant le nom du fichier plus le nom du calque (exemple : KAM8400 - 007) jusqu'ici c'est impécable ! * mais la seule contrainte c'est que quand j'accéde à mon fichier je ne vois rien il faut que j'active manuellement mon calque exemple : 007 pour afficher le contenu de ce dernier aprés je fait encore "purger " ! *et puis le calque "cartouche" il le met lui aussi dans un fihier à part alors que ce dernier doit apparaitre dans tous mes plans exploser en .dwg voilà le programme que j'ai trouvée : (Defun EL_listlayer ( / tmp ll) (setq tmp (tblnext "LAYER" t) ll (list (cdr (assoc 2 tmp))) ) (while (setq tmp (tblnext "LAYER")) (setq ll (cons (cdr (assoc 2 tmp)) ll)) ) ll ) ;;---fin-----------------------------------------------------EL_listlayer-------- ;;---Début---------------------------------------------------C:EXPLODELAYER------ ;; << crée des wblocs avec les layers d'un dessin >> ;; << >>;; ;------------------------------------------------------------------------------- (Defun C:EXPLODELAYER ( / llay nomfich nomdir) (command "_undo" "_m") (setq llay (EL_listlayer) nomfich (getvar "dwgname") nomdir (getvar "dwgprefix") nomfich (substr nomfich 1 (- (strlen nomfich) 4)) ) (mapcar '(lambda (lname / sel) (setq sel (ssget "x" (list (cons 8 lname)))) (if sel (command "_wblock" (strcat nomdir nomfich "-" lname) "" (list 0 0) sel "") ) ) llay ) (command "_undo" "_b") (princ) ) s'il vous plait, encore un service que je vous demande, ;) * j'aimerais comprendre la signification de ces lignes : (Defun ..... ( / llay nomfich nomdir)defun c'est pour commencer une nouvelle fonction mais ce qui est ecrit entre ( ) pourquoi on le met ? (setq ll (cons (cdr (assoc 2 tmp)) ll)) (mapcar '(lambda (lname / sel) (setq sel (ssget "x" (list (cons 8 lname)))) (if sel (command "_wblock" (strcat nomdir nomfich "-" lname) "" (list 0 0) sel "") ) ) llay merci de votre aide amicalement doua
(gile) Posté(e) le 24 avril 2006 Posté(e) le 24 avril 2006 Salut, Tu poses beaucoup de questions dans un seul message ! Je vais déjà essayer de répondre d'abord à la première. citation extraite du message original: (Defun ..... ( / llay nomfich nomdir) defun c'est pour commencer une nouvelle fonction mais ce qui est ecrit entre ( ) pourquoi on le met ? Defun (DEfine FUNction) c'est pour définir une fonction, cette fonction peut nécessiter des arguments et il est aussi possible de déclarer les variables locales utilisées dans la fonction. Il faut de toute façon mettre une liste d'arguments après un (defun... même si celle-ci est vide. les arguments sont écrits directement après la parathèse ouvrante, les variables locales après le slash (/) : (defun fonction () ...)ou(defun fonction (arg1 arg2 ...) ...)ou(defun fonction (/ var1 var2 ...) ...)ou encore(defun fonction (arg1 arg2 ... / var1 var2 ...) ...) pour plus d'explications sur la déclaration des variables locales tu peux aller voir ici ou encore là Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 24 avril 2006 Posté(e) le 24 avril 2006 Re, Deuxième question. (setq ll (cons (cdr (assoc 2 tmp)) ll)) tmp contient la liste associative (ou liste de paires pointées) retournée pa la fonction tblnext pour la table des calques, cette liste est du type : ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous")) (assoc 2 tmp) retourne (2 . "0") une paire pointée. (cdr (assoc 2 tmp)) retourne "0" (cons (cdr (assoc 2 tmp)) ll) ajoute "0" au début de la liste ll (while (setq tmp (tblnext "LAYER")) (setq ll (cons (cdr (assoc 2 tmp)) ll)) )Boucle tant qu'il existe des calques dans le dessin et ajoute pour chacun le nom de ce calque à la liste ll. La première fonction aurait pu être définie de manière plus concise : (Defun EL_listlayer (/ tmp ll) (setq tmp (tblnext "LAYER" t)) (while tmp (setq ll (cons (cdr (assoc 2 tmp)) ll) tmp (tblnext "LAYER")) ) ll ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 24 avril 2006 Posté(e) le 24 avril 2006 Re re, Troisième question: (mapcar '(lambda (lname / sel) (setq sel (ssget "x" (list (cons 8 lname)))) (if sel (command "_wblock" (strcat nomdir nomfich "-" lname) "" (list 0 0) sel "" ) ) ) llay ) La fonction mapcar fait passer tous les membres d'une (ou de plusieurs) liste comme arguments d'une fonction. Dans le cas présent, une fonction lambda (qui, à la différence d'une fonction defun, n'a pas de nom et n'est pas enregistrée) est appliquée à tous les membres de llay (la liste des noms de calques). L'argument (b]lname[/b] et la variable localesel sont déclarés comme explique dans la réponse 1 pour defun. L'argument est utilisé ici dans le filtre de sélection de tous les objets dudit calque :(setq sel (ssget "x" (list (cons 8 lname))))et pour le nom du fichier :(strcat nomdir nomfich "-" lname) S'il y a des entités sur le calque (sel n'est pas nil) un wbloc est créé avec ces entités. En espérant avoir répondu suffisamment clairement à tes questions. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 24 avril 2006 Posté(e) le 24 avril 2006 J'ai un peu modifier le code que tu as trouvé (il y a d'autres ici) pour que les objets du calque "cartouche" soient dans tous les fichiers. J'ai surligé [surligneur]les ajouts[/surligneur] (Defun EL_listlayer (/ tmp ll) (setq tmp (tblnext "LAYER" t) ll (list (cdr (assoc 2 tmp))) ) (while (setq tmp (tblnext "LAYER")) (setq ll (cons (cdr (assoc 2 tmp)) ll)) ) ll ) ;;---fin-----------------------------------------------------EL_listlayer-- ------ ;;---Début---------------------------------------------------C:EXPLODELAYER ------ ;; > ;; > ;;-------------------------------------------------------------------------- ----- (Defun C:EXPLODELAYER (/ old_echo llay nomfich nomdir) (command "_undo" "_m") [surligneur](setq old_echo (getvar "cmdecho")) (setvar "cmdecho" 0)[/surligneur] (setq llay (EL_listlayer) nomfich (getvar "dwgname") nomdir (getvar "dwgprefix") nomfich (substr nomfich 1 (- (strlen nomfich) 4)) ) (mapcar '(lambda (lname / sel [surligneur]cart sel2 n[/surligneur]) (setq sel (ssget "x" (list (cons 8 lname)))) (if sel [surligneur](progn (setq cart (ssget "_X" '((8 . "cartouche")))) (command "_copy" cart "" "" "") (setq sel2 (ssget "_P")) (repeat (setq n (sslength sel2)) (ssadd (ssname sel2 (setq n (1- n))) sel) )[/surligneur] (command "_wblock" (strcat nomdir nomfich "-" lname) "" (list 0 0) sel "" ) [surligneur])[/surligneur] ) ) [surligneur](vl-remove "cartouche"[/surligneur] llay[surligneur])[/surligneur] ) (command "_undo" "_b") [surligneur](setvar "cmdecho" old_echo)[/surligneur] (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
doua Posté(e) le 24 avril 2006 Auteur Posté(e) le 24 avril 2006 salut gile , merci infinement pour ton aide précieuse , et ta réponse rapide ! on fait gile pour : je m'excuse pour mes questions Tu poses beaucoup de questions dans un seul message ! vraiment je m'excuse !! ok merci encors gile !! ;) amicalement doua
(gile) Posté(e) le 24 avril 2006 Posté(e) le 24 avril 2006 vraiment je m'excuse !! Ne t'excuses pas ;) Je disais juste çà parce que je n'étais pas sûr de pouvoir répondre à toutes les questions en un seul message. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
doua Posté(e) le 25 avril 2006 Auteur Posté(e) le 25 avril 2006 bonjour gile, on fait j'ai tester le programme que tu m'as modifier et il me donne toutjour (explodelayer commande inconnu !) je sais pas pourquoi ? et en plus j'ai pris les trois autres programmes qui ce trouve dans le lien que tu m'a donné etj'arrive pas à les exécutés ! pourtant je fait le nom "X"qui suit toujour la fnction (defun X()et ça marche pas ..?! :casstet: voilà un copie des programme : celui de bonuscad : (defun expl () ((lambda ( / def_lay nam_lay js) (setq def_lay (tblnext "LAYER" T)) (setq nam_lay (cdr (assoc 2 def_lay))) (cond ((setq js (ssget "_X" (list (cons 8 nam_lay)))) (command "_.-wblock" (strcat (getvar "dwgname") "$" nam_lay) "" "*0.0,0.0,0.0" js "") ) ) (while (setq def_lay (tblnext "LAYER")) (setq nam_lay (cdr (assoc 2 def_lay))) (cond ((setq js (ssget "_X" (list (cons 8 nam_lay)))) (command "_.-wblock" (strcat (getvar "dwgname") "$" nam_lay) "" "*0.0,0.0,0.0" js "") ) ) ) (prin1) )) celui de fabcad : (defun c:layers-to-wblocs (/ first unplan i lg-list-layers fichier js layer rep-cou lesplan) (setvar "filedia" 0) (setvar "cmddia" 0) (setvar "cmdecho" 0) (command "-calque" "ACtif" "*" "Libérer" "*" "Déverrouiller" "*" "") (setq rep-cou (getvar "DWGPREFIX")) (setq first T) (while (setq unplan (tblnext "layer" first)) (setq first nil) (setq lesplan (append lesplan (list (cdr (assoc 2 unplan))))) );fin while (setq lg-list-layers (length lesplan)) (setq i 0) (while (< i lg-list-layers) (setq layer (nth i lesplan)) (setq filtre (list (cons 8 layer))) (setq js (ssget "X" filtre)) (setq fichier (strcat rep-cou layer)) (command "-wbloc" fichier "" "0,0" js "") (setq i (+ i 1)) );fin while (princ) (setvar "filedia" 1) (setvar "cmddia" 1) (setvar "cmdecho" 1) );fin defun celui de toi gile : (defun c:lay2wbl (/ echo lay_ss lay_name lay_lst ent_ss) (setq echo (getvar "cmdecho")) (setvar "cmdecho" 0) (prompt "\nSelectionnez les calques.") (setq lay_ss (ssget)) (repeat (setq ct (sslength lay_ss)) (setq lay_name (cdr (assoc 8 (entget (ssname lay_ss (setq ct (1- ct)))))) ) (if (not (member lay_name lay_lst)) (setq lay_lst (cons lay_name lay_lst)) ) ) (mapcar '(lambda (x) (command "_.-layer" "_unlock" x "") (cond ((setq ent_ss (ssget "_X" (list (cons 8 x)))) (if (not (findfile (strcat (getvar "dwgname") "$" x ".dwg"))) (command "_.-wblock" (strcat (getvar "dwgname") "$" x) "" "*0.0,0.0,0.0" ent_ss "" ) ) ) ) ) lay_lst ) (setvar "cmdecho" echo) (princ) ) merci à vous tous "gile,bonuscad,fabcad ..." et tous les membre de ce fabuleux forum qui nous donne vraiment un grand coup de main !!
(gile) Posté(e) le 25 avril 2006 Posté(e) le 25 avril 2006 on fait j'ai tester le programme que tu m'as modifier et il me donne toutjour(explodelayer commande inconnu !) je sais pas pourquoi ? Moi non plus ! Chez moi çà marche. Pour le code de bonuscad çà ne peut pas marcher si tu rajoutes (defun expl () au début du code. C'est une fonction lambda (sans nom, voir explications plus haut) soit tu la copies telle quelle sur la ligne de commande soit tu la transforme en fonction defun, dans ce cas il faut mettre defun à la place de lambda au début du code, suivi de c:nom_de_la_fonction et il faut aussi supprimer une paranthèse ouvrante au début et une fermante à la fin. EDIT : Je viens d'essayer tous les codes ils fonctionnent (à condition de supprimer (defun expl () au début du code de bonus) Petite précision : si le début du code est (defun c:nom_de_la_fonction ... il faut taper nom_de_la_fonctionsi c'est (defun nom_de_la_fonction ... il faut taper (nom_de_la_fonction) [Edité le 25/4/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 25 avril 2006 Posté(e) le 25 avril 2006 Salut on fait j'ai tester le programme que tu m'as modifier et il me donne toutjour(explodelayer commande inconnu !) je sais pas pourquoi ? Tu charges bien le lisp ? Avec _appload, ou avec un (load"...."), ou en autoload, ou encore avec un drag&drop ! @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
doua Posté(e) le 25 avril 2006 Auteur Posté(e) le 25 avril 2006 RE , je ne sais vraiment pas l'erreur que je fait pour que ça ne marche pas chez moi?? :casstet: voilà ce que je fait : 1) prog : j'ai remplacer lambda par defun (defun c: eclatfol (/def_lay nam_lay js) aprés je charge le programme par "appload", et je donne le nom de la fonction "eclatfol"il me donne commande inconnu tapez f1......etc 2)&3)prog : (defun c: layers-to-wblocs (/ first unplan i lg-list-layers fichier js layer rep-cou lesplan) (defun c: lay2wbl (/ echo lay_ss lay_name lay_lst ent_ss) je suit les mêmes démarche il me donne toujour que le nom de la fonction est inconnu !!! vraiment bizzzzzzaaar ! :casstet: en fait j'ai l'autocad 2004 ça cause pas de problème... non ..?? je ne comprend pas !! :( vraiment je suis désoler de vous dérranger avec moi !! encors merci à vous !
(gile) Posté(e) le 25 avril 2006 Posté(e) le 25 avril 2006 Re Attention, il ne faut pas d'espace entre c: et eclatfol ! Quand tu fais _appload, as-tu bien Nom_de_fichier.lsp correctement chargé(s) en bas de la fenêtre ? http://img288.imageshack.us/img288/129/laytest9zx.png Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
doua Posté(e) le 25 avril 2006 Auteur Posté(e) le 25 avril 2006 Attention, il ne faut pas d'espace entre c: et eclatfol ! non j'ai vérifier j'ai pas d'espace !Quand tu fais _appload, as-tu bien Nom_de_fichier.lsp correctement chargé(s) en bas de la fenêtre ? oui il me met tout à fait en bas de la boite au dialogue "eclatfol.lsp correctement chargé(s" bizzar bizzar !!!
(gile) Posté(e) le 25 avril 2006 Posté(e) le 25 avril 2006 Et avec d'autres LISP copiés dans CADxp, as-tu le même problème ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
doua Posté(e) le 26 avril 2006 Auteur Posté(e) le 26 avril 2006 :) salut gile , oui j'ai plein d'autre fichier lisp, il y'a d'entre eux ceux que j'ai copier de cadxp,ça marche trés bien !! on fait gile, j'ai remarquée aujourd'hui ça : quand j'ai charger mon fichier il m'a donné ceci : (Defun c:ecl ( / def_lay nam_lay js) etc... le message qui me sort dans ma ligne de commande quand je charge mon fichier c'est : Commande: _appload eclatfol.lsp correctement chargé(s) Commande: ; erreur: caractère lu incorrect (octal): 0 Commande: c'est quoi cette erreur !!ça me rend folle vraiment !!
(gile) Posté(e) le 26 avril 2006 Posté(e) le 26 avril 2006 Salut, Il y a peut-être une problème au moment du copier/coller, s'il manque la moindre paranthèse le LISP ne peut fonctionner. Tupeux essayer ceci : copie le LISP, colle le dans un nouveau fichier de l'éditeur VisualLISP (menuOutils) et fait "Formater dans la fenêtre d'édition (image ici). Si les paranthèses ne sont pas apariées tu auras un message d'erreur. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
doua Posté(e) le 28 avril 2006 Auteur Posté(e) le 28 avril 2006 salut gil ! je m'excuse je t'ai pas répondu ,mais vraiment j'avais un problème sur mon poste plus problème de connéxion ! en fait pour le programme tu avais raison j'ai pas bien copie coller il me manquée une ) ! le programme qui a marché pour moi c'est : (defun c:layers (/ first unplan i lg-list-layers fichier js layer rep-cou lesplan) (setvar "filedia" 0) (setvar "cmddia" 0) (setvar "cmdecho" 0) (command "-calque" "ACtif" "*" "Libérer" "*" "Déverrouiller" "*" "") (setq rep-cou (getvar "DWGNAME")) (substr rep-cou 1 9) (setq first T) (while (setq unplan (tblnext "layer" first)) (setq first nil) (setq lesplan (append lesplan (list (cdr (assoc 2 unplan))))) );fin while (setq lg-list-layers (length lesplan)) (setq i 0) (while (< i lg-list-layers) (setq layer (nth i lesplan)) (setq filtre (list (cons 8 layer))) (setq js (ssget "X" filtre)) (setq fich (substr rep-cou 1 9)) (setq fichier (strcat fich layer)) [u] ;;(command "-inserer" "*cart_AIC.dwg" "0,0" "" "")[/u] ;;(command "-inserer" "*cart_AIC.dwg" "0,0" "" "" "-wbloc" fichier "" "0,0" js "") (setq i (+ i 1)) );fin while (princ) (setvar "filedia" 1) (setvar "cmddia" 1) (setvar "cmdecho" 1) );fin defun le seul souci que j'ai c'est que la cartouche il l'a prend comme un calque à part alors que moi je veux que cette dernière apparait dans tous mes calque eclater en dwg bon j'ai essayée avec une commande autocad ;;(command "-inserer" "*cart_AIC.dwg" "0,0" "" "")mais....! amicalement doua
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