chris_mtp Posté(e) le 2 janvier 2009 Partager Posté(e) le 2 janvier 2009 Bonjour à tous et BONNE ANNEE 2009 Est il possible à partir du lisp ci-dessous en utilisant la fonction Getlayers que gile a programmé d'insérer à la suite sous forme de texte et dans 2 colonnes le noms des calques d'un dessin ? J'ai essayé moi même mais deux choses, Comment définir le nombre de textes et par conséquent de calques à insérer sous forme de texte ?Comment définir un point d'insertion pour que les noms des calques s'insérent les uns à la suite des autres ? (defun c:gel_fen () (foreach l (getlayers "Textes" nil) (setq ptb (getpoint "\nSpécifiez le point d'insertion: ")) (command "-reseau" l) ) (princ) ) ;;=========================================================;; ;; GETLAYERS (gile) 03/11/07 ;; Retourne la liste des calques cochés dans la boite de dialogue ;; ;; arguments ;; titre : le titre de la boite de dialogue ou nil (defaut = Choisir les calques) ;; lst : la liste des calques à pré-cochés ou nil (defun getlayers (titre lst / toggle_column tmp file lay layers len dcl_id) (defun toggle_column (lst) (apply 'strcat (mapcar (function (lambda (x) (strcat ":toggle{key=" (vl-prin1-to-string x) ";label=" (vl-prin1-to-string x) ";}" ) ) ) lst ) ) ) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (while (setq lay (tblnext "LAYER" (not lay))) (setq layers (cons (cdr (assoc 2 lay)) layers)) ) (setq layers (vl-sort layers '<) len (length layers) ) (write-line (strcat "GetLayers:dialog{label=" (cond (titre (vl-prin1-to-string titre)) ("\"Choisir les calques\"") ) ";:boxed_row{:column{" (cond ((< len 12) (toggle_column layers)) ((< len 24) (strcat (toggle_column (sublist layers 0 (/ len 2))) "}:column{" (toggle_column (sublist layers (/ len 2) nil)) ) ) (T (strcat (toggle_column (sublist layers 0 (/ len 3))) "}:column{" (toggle_column (sublist layers (/ len 3) (/ len 3))) "}:column{" (toggle_column (sublist layers (* (/ len 3) 2) nil)) ) ) ) "}}spacer;ok_cancel;}" ) file ) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "GetLayers" dcl_id)) (exit) ) (foreach n lst (set_tile n "1") ) (action_tile "accept" "(setq lst nil) (foreach n layers (if (= (get_tile n) \"1\") (setq lst (cons n lst)))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) lst ) Merci par avance de votre aide.John Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 2 janvier 2009 Partager Posté(e) le 2 janvier 2009 Salut, Je ne comprends pas bien ce que tu veux faire. Pour avoir le nombre de calques sélectionnés avec GetLayers, il faut d'abord récupérer la liste, puis utiliser la fonction length. (setq liste_de_calques (getlayers "Textes" nil))(setq nombre_de_calques (length liste_de_calque)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 2 janvier 2009 Auteur Partager Posté(e) le 2 janvier 2009 Oui l'entête du lisp peut paraître bizarre. En effet, il ne marche pas. Je veux tout simplement en sélectionnant dans la boite de dialogue insérer sous forme de texte le noms des calques présents dans un plan.Avant je rentrer les noms des calques à la main et si il y en a 80 ou 100 calques, je les rentre un à un aprés les avoir exporter sous excel d'où mon idée de réaliser ce petit lisp. Merci pour ton aide.John Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 3 janvier 2009 Auteur Partager Posté(e) le 3 janvier 2009 Voici en fait l'entête que j'ai pu réaliser mais seul hic (defun c:nom_calques (/ pti liste_de_calques nombre_de_calques txt) (setq liste_de_calques (getlayers "Textes" nil)) (setq nombre_de_calques (length liste_de_calque)) (setq pti (getpoint "\nSpécifiez le point haut d'insertion des textes: ")) (foreach label_nombre_de_calques (command "_text" "bg" pti "5" "100" txt) (princ) ) Après avoir coché dans la boîte de dialogue GetLayers, Comment insérer le nom des calques cochés sous forme de texte (ou label) à partir du point d'insertion sous forme de deux colonnes les uns à la suite des autres ? Comment utliliser la commande foreach ? Merci par avance de votre aide.John. Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 3 janvier 2009 Auteur Partager Posté(e) le 3 janvier 2009 J'ai beau cherché mais là je suis bloqué Comment puis je récupérer le nom des calques et surtout les insérer sous forme de colonnes ? John Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 3 janvier 2009 Partager Posté(e) le 3 janvier 2009 Salut, Pour une colonne, c'est assez simple, à partir du point spécifier, on peut deux fois la hauteur de texte courante à la coordonnée Y pour trouver le point d'insertion suivant. Pour deux colonnes, il faut calculer le décalage en X par rapport au premier point d'insertion en fonction du texte le plus long.On peut par exemple multiplier ce nombre de caractère par la hauteur de texte courante. On peut alors procéder avec deux boucles repeat sur chaque moitié de la liste en incrémentant un indice et le point d'insertion ;; liste des noms de calque (setq lst (getlayers "Textes" nil)) ;; point d'insertion du premier txte (setq pti (getpoint "\nSpécifiez le point haut d'insertion des textes: ")) ;; nombre d'éléments de la liste (setq nb (length lst)) ;; hauteur de texte courante (setq ts (getvar "TEXTSIZE")) ;; décalage en Y (setq ht (* 2 ts)) ;; décalage en X (setq lg (* (apply 'max (mapcar 'strlen lst)) ts)) ;; pt = point d'insertion des textes (setq pt pti) ;; première colonne (setq n 0) (repeat (/ nb 2) (command "_.text" pt "" "" (nth n lst)) (setq n (1+ n) pt (list (car pt) (- (cadr pt) ht)) ) ) ;; deuxième colonne (setq pt (list (+ (car pti) lg) (cadr pti))) (repeat (- nb (/ nb 2)) (command "_.text" pt "" "" (nth n lst)) (setq n (1+ n) pt (list (car pt) (- (cadr pt) ht)) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 3 janvier 2009 Auteur Partager Posté(e) le 3 janvier 2009 J'ai inséré la partie du code dans le lisp d'origine.Ca marche nickel mais les calques s'affichent dans l'ordre alphabétique inverse de celui proposé dans la boite de dialogue. Il traite les noms de calques de Z à A apparemment et non de A à Z.Existe il une solution ? En tout cas, merci de ton aide gile et de ce lisp assea détaillé.John. Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 3 janvier 2009 Partager Posté(e) le 3 janvier 2009 Regarde la fonction reverse (setq lst (reverse (getlayers "Textes" nil))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 3 janvier 2009 Auteur Partager Posté(e) le 3 janvier 2009 Nickel encore une question après c bon je pourrais modifier le lisp selon mes besoins. Comment faire pour utiliser la command find en lisp et remplacer un texte par un autre ?J'ai essayé avec (command "_find" "calques" "layers") mais ca ne marche pas et dans l'aide de VisualLisp, j'ai cherché mais pas trouvé. Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 3 janvier 2009 Partager Posté(e) le 3 janvier 2009 La commande RECHERCHER (_FIND) n'existe pas en ligne de commande. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 3 janvier 2009 Auteur Partager Posté(e) le 3 janvier 2009 On ne peut alors remplacer un texte par un autre à partir d'une simple commande lisp.J'ai bien regarder dans les différents sujets de cadxp mais je n'ai pas trouvé la commande. Existe t-elle ? Merci par avance.John Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 3 janvier 2009 Partager Posté(e) le 3 janvier 2009 Il n'y a pas de commande, mais on peut faire un LISP qui :- sélectionne les objets texte (et/ou mtexte)- lit la valeur de chaque texte sélectionné pour chercher le texte à remplacer- modifie l'objet si le texte correspond. S'agit-il de remplacer tout le texte ou une partie seulement ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 3 janvier 2009 Auteur Partager Posté(e) le 3 janvier 2009 C'est bon j'ai trouvé ma réponse sur une réponse d'un post antérieur avec un lisp associé http:// http://www.cadxp.com/XForum+print-fid-73-tid-20383.html?POSTNUKESID=b0babf4d3fb0e2a2db48ec29741f6961 Avec la commande repstring. Merci de ton aide gile.Bien cordialement.John Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 3 janvier 2009 Partager Posté(e) le 3 janvier 2009 Par rapport à la première demande, je te propose une autre méthode qui consiste à scinder la liste des calques en 2. Ceci permet de calculer le décalage de la deuxième colonne par rapport au plus long nom de la première ;; liste des noms de calque (setq lst1 (getlayers "Textes" nil nil)) ;; point d'insertion du premier texte (setq pti (getpoint "\nSpécifiez le point haut d'insertion des textes: ")) ;; scinder la liste en 2 (repeat (/ (length lst) 2) (setq lst2 (cons (car lst1) lst2) lst1 (cdr lst1) ) ) (setq lst1 (reverse lst1)) ;; hauteur de texte courante (setq ts (getvar "TEXTSIZE")) ;; décalage en Y (setq ht (* 2 ts)) ;; décalage en X (setq lg (* (apply 'max (mapcar 'strlen lst1)) ts)) ;; première colonne (setq pt pti) (foreach txt lst1 (command "_.text" pt "" "" txt) (setq pt (list (car pt) (- (cadr pt) ht))) ) ;; deuxième colonne (setq pt (list (+ (car pti) lg) (cadr pti))) (foreach txt lst2 (command "_.text" pt "" "" txt) (setq pt (list (car pt) (- (cadr pt) ht))) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 3 janvier 2009 Auteur Partager Posté(e) le 3 janvier 2009 J'ai testé le lisp que tu viens de poster mais il y des calques qui s'insérent deux fois.Un problème surement dans les variables lst1 et lst2. Je sais pas. Mais sinon j'ai déjà ajouté un décalage de +10 en Y pour la deuxième colonne. Et même si je change la variable textsize au maximum que je l'utilise, il n'y a pas de superposition des textes donc c'est bon. Une fois le noms des calques insérés, Après je peux modifier l'emplacement comme je veux.En tout cas, merci Cela va bien m'aider. John. Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 3 janvier 2009 Partager Posté(e) le 3 janvier 2009 J'ai testé le lisp que tu viens de poster mais il y des calques qui s'insérent deux fois.Un problème surement dans les variables lst1 et lst2. Je sais pas. Il faut que ces variables soient déclarées localement :(defun c:nom_calques (/ lst1 lst2 ...) ...) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 4 janvier 2009 Auteur Partager Posté(e) le 4 janvier 2009 J'ai rédéfini les variables de ton code mais toujours des textes superposés.De même, avec le code précedent, on dirait qu'il y a une variable qui bloque entre la première partie du lisp et la fonction Getlayers.Voici le code que j'ai pu assembler.En surligner les parties du code que j'ai modifié. J'ai essayé de modifier le décalage entre les colonnes mais aussi de changer la variable n par m mais nada. (defun c:llist_layer (/ lst1 pti pt nb ts ht lg m) ;; liste des noms de calque (setq lst1 (reverse (getlayers "Textes" nil))) ;; point d'insertion du premier texte (setq pti (getpoint "\nSpécifiez le point haut d'insertion des textes: ")) ;; nombre d'éléments de la liste (setq nb (length lst1)) ;; hauteur de texte courante (setq ts (getvar "TEXTSIZE")) ;; décalage en Y [surligneur] (setq ht (* 1.5 ts))[/surligneur] ;; décalage en X [surligneur] (setq lg (+ (* (apply 'max (mapcar 'strlen lst1)) ts) 90))[/surligneur] ;; pt = point d'insertion des textes (setq pt pti) ;; première colonne [surligneur] (setq m 0)[/surligneur] (repeat (/ nb 2) (command "_.text" pt "" "" (nth m lst1)) [surligneur] (setq m (1+ m)[/surligneur] pt (list (car pt) (- (cadr pt) ht)) ) ) ;; deuxième colonne (setq pt (list (+ (car pti) 70) (cadr pti))) (repeat (- nb (/ nb 2)) (command "_.text" pt "" "" (nth m lst1)) (setq m (1+ m) pt (list (car pt) (- (cadr pt) ht)) ) ) (prin1) ) (defun getlayers (titre lst / toggle_column tmp file lay layers len dcl_id) (defun toggle_column (lst) (apply 'strcat (mapcar (function (lambda (x) (strcat ":toggle{key=" (vl-prin1-to-string x) ";label=" (vl-prin1-to-string x) ";}" ) ) ) lst ) ) ) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (while (setq lay (tblnext "LAYER" (not lay))) (setq layers (cons (cdr (assoc 2 lay)) layers)) ) (setq layers (vl-sort layers '<) len (length layers) ) (write-line (strcat "GetLayers:dialog{label=" (cond (titre (vl-prin1-to-string titre)) ("\"Choisir les calques\"") ) ";:boxed_row{:column{" (cond ((< len 12) (toggle_column layers)) ((< len 24) (strcat (toggle_column (sublist layers 0 (/ len 2))) "}:column{" (toggle_column (sublist layers (/ len 2) nil)) ) ) (T (strcat (toggle_column (sublist layers 0 (/ len 3))) "}:column{" (toggle_column (sublist layers (/ len 3) (/ len 3))) "}:column{" (toggle_column (sublist layers (* (/ len 3) 2) nil)) ) ) ) "}}spacer;ok_cancel;}" ) file ) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "GetLayers" dcl_id)) (exit) ) (foreach n lst (set_tile n "1") ) (action_tile "accept" "(setq lst nil) (foreach n layers (if (= (get_tile n) \"1\") (setq lst (cons n lst)))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) lst )J'ai essayé de renommer les variables mais rien n'y fait.Les textes s'insérent tous aux mêmes endroits ou soit certains textes sont superposés.On dirait qu'il y a un problème sur le nombre calques sélectionnés dans la boite de dialogue Getlayers. Je sais pas ....Merci par avance de ton aide.John Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 4 janvier 2009 Auteur Partager Posté(e) le 4 janvier 2009 Gile,j'ai testé plusieurs fois le lisp que je t'ai mis avant en sélectionnant un nombre de calques différent. Avec 9 calques, ca marche bien.Au delà de 11 ca bug.Pourquoi ??? Merci de ton aide.John Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 4 janvier 2009 Partager Posté(e) le 4 janvier 2009 Salut, J'ai rédéfini les variables de ton code mais toujours des textes superposés. Tu n'utilises pas l'expression que je t'ai donnée, en faisant :(setq pt (list (+ (car pti) 70) (cadr pti)))tu ajoutes une constante (70) à la coordonnée X, le décalage sera donc toujours le même quelques soit la hauteur de texte et le nombre de caractères dans les noms de calques En faisant :(setq lg (* (apply 'max (mapcar 'strlen lst1)) ts))je récupère le nombre de caractères du nom de claque le plus long dans la première colonne et je le multiple par la hauteur de texte, lg sera toujours proportionnel. Essaye ça, avec la dernière version de getLayers (defun c:llist_layer (/ lst1 lst2 pti pt ts ht lg) ;; liste des noms de calque (setq lst1 (getlayers "Textes" nil nil)) ;; point d'insertion du premier texte (setq pti (getpoint "\nSpécifiez le point haut d'insertion des textes: " ) ) ;; scinder la liste en 2 (repeat (/ (length lst) 2) (setq lst2 (cons (car lst1) lst2) lst1 (cdr lst1) ) ) (setq lst1 (reverse lst1)) ;; hauteur de texte courante (setq ts (getvar "TEXTSIZE")) ;; décalage en Y (setq ht (* 2 ts)) ;; décalage en X (setq lg (* (apply 'max (mapcar 'strlen lst1)) ts)) ;; première colonne (setq pt pti) (foreach txt lst1 (command "_.text" pt "" "" txt) (setq pt (list (car pt) (- (cadr pt) ht))) ) ;; deuxième colonne (setq pt (list (+ (car pti) lg) (cadr pti))) (foreach txt lst2 (command "_.text" pt "" "" txt) (setq pt (list (car pt) (- (cadr pt) ht))) ) (princ) ) ;; GETLAYERS (gile) 02/12/07 ;; Retourne la liste des calques cochés dans la boite de dialogue ;; ;; arguments ;; titre : le titre de la boite de dialogue ou nil (defaut = Choisir les calques) ;; lst1 : la liste des calques pré-cochés ou nil ;; lst2 : la liste des calques non cochables (grisés) ou nil (defun getlayers (titre lst1 lst2 / toggle_column tmp file lay layers len dcl_id) (defun toggle_column (lst) (apply 'strcat (mapcar (function (lambda (x) (strcat ":toggle{key=" (vl-prin1-to-string x) ";label=" (vl-prin1-to-string x) ";}" ) ) ) lst ) ) ) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (while (setq lay (tblnext "LAYER" (not lay))) (setq layers (cons (cdr (assoc 2 lay)) layers)) ) (setq layers (vl-sort layers ' len (length layers) ) (write-line (strcat "GetLayers:dialog{label=" (cond (titre (vl-prin1-to-string titre)) ("\"Choisir les calques\"") ) ";:boxed_row{:column{" (cond (( (( (strcat (toggle_column (sublist layers 0 (/ len 2))) "}:column{" (toggle_column (sublist layers (/ len 2) nil)) ) ) (( (strcat (toggle_column (sublist layers 0 (/ len 3))) "}:column{" (toggle_column (sublist layers (/ len 3) (/ len 3))) "}:column{" (toggle_column (sublist layers (* (/ len 3) 2) nil)) ) ) (T (strcat (toggle_column (sublist layers 0 (/ len 4))) "}:column{" (toggle_column (sublist layers (/ len 4) (/ len 4))) "}:column{" (toggle_column (sublist layers (/ len 2) (/ len 4))) "}:column{" (toggle_column (sublist layers (* (/ len 4) 3) nil)) ) ) ) "}}spacer;ok_cancel;}" ) file ) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "GetLayers" dcl_id)) (exit) ) (foreach n lst1 (set_tile n "1") ) (foreach n lst2 (mode_tile n 1) ) (action_tile "accept" "(setq lst nil) (foreach n layers (if (= (get_tile n) \"1\") (setq lst (cons n lst)))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) lst ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 8 janvier 2009 Auteur Partager Posté(e) le 8 janvier 2009 Bonjour Gile, J'ai essayé ton lisp mais toujours ce problème de superposition de textes.J'ai essayé plusieurs manip mais toujours le même prob. Mais je pensais, ce n'est pas un problème de la variable TEXTSIZE car c'est la seule variable commun au décalage en X et en Y. On pourrait par exemple entrer une valeur de texte nous même.Quand on le répète 3 fois de suite, au bout de la 3eme ca marche par contre après plus.De plus, j'ai vu que dans la boîte de dialogue GetLayers, le nom du calque en bas de la 3eme colonne est le même que le premier de la 4eme colonne.Au moment du lancement du lisp, il dit "NOM du calque" redéfinition de la touche.Je sais pas si ce problème est spécifique à AutoCAD 2008 mais...... Sinon au lieu de compter le nombre de caractères du nom de calque le plus long, on ne peut pas insérer un décalage constant de 80 ou 90. Merci par avance de ton aide.John. Lien vers le commentaire Partager sur d’autres sites More sharing options...
bonuscad Posté(e) le 8 janvier 2009 Partager Posté(e) le 8 janvier 2009 J'ai essayé ton lisp mais toujours ce problème de superposition de textes Peut être simplement un problème d'accroche objet.Soit tu désactive ton accrochobj avant la routine, soit tu fais une modification mineure dans le lisp. (command "_.text" pt "" "" txt) en(command "_.text" "_none" pt "" "" txt) Ceci présent 2 fois dans le lisp de (gile) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 8 janvier 2009 Auteur Partager Posté(e) le 8 janvier 2009 BravoBien joué Bonuscad.Ca marche nickel même si je repète plusieurs fois le lisp. John. Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 8 janvier 2009 Auteur Partager Posté(e) le 8 janvier 2009 Par contre, j'ai eu une dernière question et après ce lisp sera complet.Comment récupérer la variable de la couleur du calque de manière à insérer le texte avec la couleur du calque correspondant ? Si c'est possible.Sinon c'est pas grave.Merci par avance.John. Lien vers le commentaire Partager sur d’autres sites More sharing options...
bonuscad Posté(e) le 8 janvier 2009 Partager Posté(e) le 8 janvier 2009 Je modifie rapidement le lisp de (gile), j'espère que ça ira ! (defun c:llist_layer (/ lst1 lst2 pti pt ts ht lg sv_col l_layers) ;; liste des noms de calque (setq lst1 (getlayers "Textes" nil nil)) ;; point d'insertion du premier texte (setq pti (getpoint "\nSpécifiez le point haut d'insertion des textes: " ) ) ;; scinder la liste en 2 (repeat (/ (length lst) 2) (setq lst2 (cons (car lst1) lst2) lst1 (cdr lst1) ) ) (setq lst1 (reverse lst1)) ;; hauteur de texte courante (setq ts (getvar "TEXTSIZE")) ;; décalage en Y (setq ht (* 2 ts)) ;; décalage en X (setq lg (* (apply 'max (mapcar 'strlen lst1)) ts)) ;; première colonne (setq pt pti) (setq sv_col (getvar "cecolor")) (foreach txt lst1 (setvar "Cecolor" (itoa (cdr (assoc txt l_layers)))) (command "_.text" "_none" pt "" "" txt) (setq pt (list (car pt) (- (cadr pt) ht))) ) ;; deuxième colonne (setq pt (list (+ (car pti) lg) (cadr pti))) (foreach txt lst2 (setvar "Cecolor" (itoa (cdr (assoc txt l_layers)))) (command "_.text" "_none" pt "" "" txt) (setq pt (list (car pt) (- (cadr pt) ht))) ) (setvar "cecolor" sv_col) (princ) ) ;; GETLAYERS (gile) 02/12/07 ;; Retourne la liste des calques cochés dans la boite de dialogue ;; ;; arguments ;; titre : le titre de la boite de dialogue ou nil (defaut = Choisir les calques) ;; lst1 : la liste des calques pré-cochés ou nil ;; lst2 : la liste des calques non cochables (grisés) ou nil (defun getlayers (titre lst1 lst2 / toggle_column tmp file lay layers len dcl_id) (defun sublist (lst start leng / n r) (if (or (not leng) (< (- (length lst) start) leng)) (setq leng (- (length lst) start)) ) (setq n (+ start leng)) (repeat leng (setq r (cons (nth (setq n (1- n)) lst) r)) ) ) (defun toggle_column (lst) (apply 'strcat (mapcar (function (lambda (x) (strcat ":toggle{key=" (vl-prin1-to-string x) ";label=" (vl-prin1-to-string x) ";}" ) ) ) lst ) ) ) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (while (setq lay (tblnext "LAYER" (not lay))) (setq layers (cons (cons (cdr (assoc 2 lay)) (cdr (assoc 62 lay))) layers)) ) (setq l_layers layers layers (vl-sort (mapcar 'car layers) '<) len (length layers) ) (write-line (strcat "GetLayers:dialog{label=" (cond (titre (vl-prin1-to-string titre)) ("\"Choisir les calques\"") ) ";:boxed_row{:column{" (cond ((< len 12) (toggle_column layers)) ((< len 24) (strcat (toggle_column (sublist layers 0 (/ len 2))) "}:column{" (toggle_column (sublist layers (/ len 2) nil)) ) ) ((< len 45) (strcat (toggle_column (sublist layers 0 (/ len 3))) "}:column{" (toggle_column (sublist layers (/ len 3) (/ len 3))) "}:column{" (toggle_column (sublist layers (* (/ len 3) 2) nil)) ) ) (T (strcat (toggle_column (sublist layers 0 (/ len 4))) "}:column{" (toggle_column (sublist layers (/ len 4) (/ len 4))) "}:column{" (toggle_column (sublist layers (/ len 2) (/ len 4))) "}:column{" (toggle_column (sublist layers (* (/ len 4) 3) nil)) ) ) ) "}}spacer;ok_cancel;}" ) file ) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "GetLayers" dcl_id)) (exit) ) (foreach n lst1 (set_tile n "1") ) (foreach n lst2 (mode_tile n 1) ) (action_tile "accept" "(setq lst nil) (foreach n layers (if (= (get_tile n) \"1\") (setq lst (cons n lst)))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) lst ) [Edité le 9/1/2009 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 8 janvier 2009 Auteur Partager Posté(e) le 8 janvier 2009 quand j'intégre le lisp dans autocad, il me retourne la commande Commande: llist_layer; erreur: type d'argument incorrect: consp "0" Je vais voir de mon côté si je peux trouver.Merci quand même.John Lien vers le commentaire Partager sur d’autres sites More sharing options...
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