BENJ90 Posté(e) le 15 avril 2006 Posté(e) le 15 avril 2006 Bonjour J'ai un souci sérieux. Je suis à la recherche d'une manip un truc pour faire une liste de toutes mes entités ( blocs ligne polyligne ....) par calque. une sorte de tableau m'indiquant que dans tel calque j'ai x blocs y ligne z texte.......Quelqu'un aurais t'il une solution en lisp vbs ou autre ?Cette fonction existé dans automap de pcvision ( listing entity) en arx mais elle n'existe plus ailleurs, du moins je la cherche. auriez vouz une idée.Merci de votre aide. Bon Week end de pâques.
(gile) Posté(e) le 15 avril 2006 Posté(e) le 15 avril 2006 Salut, Un premier jet pour enregistrer dans un fichier Excel, liste toutes les entités présentes dans le dessin et seulement elles. Nouvelle version (defun c:ListByLayer (/ ss n typ e_lst descr lay name file) (setq ss (ssget "_x")) (cond (ss (repeat (setq n (sslength ss)) (if (not (member (setq typ (cdr (assoc 0 (entget (ssname ss (setq n (1- n)))))) ) e_lst ) ) (setq e_lst (cons typ e_lst)) ) ) (setq e_lst (vl-sort e_lst ' descr (apply 'strcat (cons "LAYER\t" (mapcar '(lambda (x) (strcat x "\t")) e_lst) ) ) lay (tblnext "LAYER" T) ) (while lay (setq name (cdr (assoc 2 lay)) descr (strcat descr "\n" name "\t" (apply 'strcat (mapcar '(lambda (x / ss) (strcat (if (setq ss (ssget "_X" (list (cons 0 x) (cons 8 name)) ) ) (itoa (sslength ss)) "0" ) "\t" ) ) e_lst ) ) ) ) (setq lay (tblnext "LAYER")) ) (setq file (open (getfiled "Créez ou sélectionnez un fichier" "" "xls" 1) "w" ) ) (princ descr file) (close file) ) (T (alert "Aucune entité dans le dessin !")) ) (princ) ) [Edité le 15/4/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 15 avril 2006 Posté(e) le 15 avril 2006 Un autre ecrit rapidement. (à completer pour écrire le résultat dans un fichier) ((lambda ( / layer list_layers js n lst_ents typ_ent cmpt) (setq layer (tblnext "layer" t) cmpt 0) (while layer (if (zerop (boole 1 16 (cdr (assoc 70 layer)))) (setq list_layers (cons (cdr (assoc 2 layer)) list_layers)) ) (setq layer (tblnext "layer")) ) (cond (list_layers (textscr) (foreach e list_layers (setq js (ssget "_X" (list (cons 8 e)))) (setq n -1 lst_ents '()) (cond (js (repeat (sslength js) (setq typ_ent (cdr (assoc 0 (entget (ssname js (setq n (1+ n))))))) (if (not (member typ_ent lst_ents)) (setq lst_ents (cons typ_ent lst_ents)) ) ) (if lst_ents (progn (print (strcat "Le calque " e " contient: ")) (setq cmpt (1+ cmpt)) (foreach x lst_ents (if (>= cmpt 32) (progn (princ "\n<-- Tapez une touche pour la suite -->") (grread) (setq cmpt 0) ) (setq cmpt (1+ cmpt)) ) (princ "\n\t\t") (princ (itoa (sslength (ssget "_X" (list (cons 0 x) (cons 8 e)))))) (princ " ") (princ x) ) ) ) ) ) ) ) ) (prin1) )) [Edité le 15/4/2006 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bonuscad Posté(e) le 15 avril 2006 Posté(e) le 15 avril 2006 bien (gile) ta nouvelle version ;) Plus fiable. Par contre le temps de traitement peut finir par nous interroger :( Un simple sablier serait le bienvenu. Pour le temps de traitement j'ai essayé d'améliorer la mienne car je trouvais idiot de faire 2 fois un balayage de sélection. Donc j'ai remplacé:(if (not (member typ_ent lst_ents)) (setq lst_ents (cons typ_ent lst_ents))) par (if (not (member typ_ent lst_ents)) (progn (setq lst_ents (cons typ_ent lst_ents)) (eval (read (strcat "(setq nbr_" typ_ent " (cons 1 typ_ent))"))) ) (eval (read (strcat "(setq nbr_" typ_ent " (cons (1+ (car nbr_" typ_ent ")) typ_ent))")))) et:(princ (itoa (sslength (ssget "_X" (list (cons 0 x) (cons 8 e)))))) par:(princ (itoa (eval (read (strcat "(car nbr_" x ")"))))) Mais j'ai pas constaté une réelle amélioration, a part que j'ai fais un bon execice sur l'attribution de variable avec (eval) :mad: Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 16 avril 2006 Posté(e) le 16 avril 2006 Merci, Interéssant les attributions de variables. Dans le même genre, on peut écrire : (setq x (read (strcat "nbr_" typ_ent))) (if (not (member typ_ent lst_ents)) (progn (setq lst_ents (cons typ_ent lst_ents)) (set x (cons 1 typ_ent)) ) (set x (cons (1+ (car (eval x))) typ_ent)) ) À la place de : (if (not (member typ_ent lst_ents)) (progn (setq lst_ents (cons typ_ent lst_ents)) (eval (read (strcat "(setq nbr_" typ_ent " (cons 1 typ_ent))"))) ) (eval (read (strcat "(setq nbr_" typ_ent " (cons (1+ (car nbr_" typ_ent ")) typ_ent))"))) ) Salut, et bonnes vacances, pour moi en tout cas ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 16 avril 2006 Posté(e) le 16 avril 2006 Il m'est venu une illumination, sur la route des vacances.Plutot que les attributions de variables, une liste associative : (("LINE" . 6) ("POINT" . 5) ...) (if (setq nbr (assoc typ_ent lst_ent)) (setq lst_ent (subst (cons typ_ent (1+ (cdr nbr))) nbr lst_ent)) (setq lst_ent (cons (cons typ_ent 1) lst_ent)) ) et ensuite : (itoa (cdr (assoc typ_ent lst_ent))) C'est fait en aveugle, a verifier. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
BENJ90 Posté(e) le 18 avril 2006 Auteur Posté(e) le 18 avril 2006 Merci :) mais je suis un peu perdu, :( C'est bien du lisp. quand je le copie dans un fichier lsp vide, rien ne se passe. ( sur acadmap2005, Il faut taper quoi, dans l'invite de commande, Please? ( pas doué en lisp le benj90)La deuxieme marche mais écrit tous à la suite. dur dur :casstet: :angel: Je suis un peu perdu, en fin de compte j'écris quoi dans mon fichier lisp? ( je ne suis vraimant pas doué désolé).:yltype: Merci d'avance de me donner un petit coup de pouce.'Le Benj 90 est un peu perdu, snif snif' :(
(gile) Posté(e) le 18 avril 2006 Posté(e) le 18 avril 2006 Salut, Pour le premier LISP (qui copie tout dans un tableau Excel) apres avoir copier/coller le code dans le bloc note, tu l'enregistres sous le nom que tu veux avec l'extension .lsp, puis tu le charges dansAutoCAD et tu tapes listbylayer sur la ligne de commande, c'est ce qui est ecrit apres le (defunc: au debut du code. Pour le code de Bonuscad qui s'execute automatiquement (c'est une fonction lambda et pas un defun donc il suffit de copier/coller le code sur la ligne de commande) si tu veux relire tranquilement, tape F2 apres l'execution. Dans le dialogue suivant entre Bonus et moi il est surtout une question de "style". Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 18 avril 2006 Posté(e) le 18 avril 2006 Dans le dialogue suivant entre Bonus et moi il est surtout une question de "style". Au fait ton style "illuminé" fonctionne bien. Il est surtout beaucoup plus concis et lisible. ;) Le pire c"est que j'y avais pensé à ce genre de liste, mais j'ai du m'embrouiller avec ma méthode, je voulais utiliser (assoc) d'une autre façon :mad: Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
BENJ90 Posté(e) le 19 avril 2006 Auteur Posté(e) le 19 avril 2006 :D Merci mais la premiere est génial c'est juste ce qu'il ma fallait.Grand merci à vous deux, Je vais essayer de me mettre au lisp c'est géant ce que l'on peux faire avec. Encore Merci :) PS : Connaissez vous des sites interessants car je suis un peu perdu entre lisp ARX et dcl voir même ASP. Pour commencer à étudier c'est dur quand on est un peu perdu entre c'est différent type de programmation. Merci Beaucoup @+Un benj 90 tout content. :yltype:
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