lecrabe Posté(e) le 16 novembre 2007 Posté(e) le 16 novembre 2007 Hello Suggestion de développement : une routine (en Lisp seulement si possible) qui permettrait de sélectionner les TEXT/MTEXT/RTEXT/ATTDEF et qui exporte en fichier Texte Ascii avec les champs séparés par des ";" (point-virgule) et non pas "," (virgule - CSV) car il peut y avoir des "," dans certains champs de type adresse par exemple ... J'ai trouvé plusieurs routines sur le Web mais aucune qui corresponde à mes besoins, car je désire pouvoir traiter les objets de type TEXT/MTEXT/RTEXT/ATTDEF et obtenir un fichier texte avec tous les champs suivants:Code type du champ: TEXT/MTEXT/RTEXT/ATTDEFCalqueStyleXYZCode de justification: G, D, HG, HD, M, C, etc (Eventuellement)HauteurRotationContenu/valeur Le caractère séparateur (pour moi un ";" c parfait) pourrait faire l'objet d'une question ainsi tout le monde serait content :) Ce type de fichier Texte remonte directement dans Excel et après on peut toujours supprimer les colonnes inutiles :P Le Decapode "en forme ce matin" PS: Changement du titre du sujet car la routine traite aussi les Attributs et NON PAS les ATTDEFs comme au début ... :P [Edité le 16/11/2007 par lecrabe] Autodesk Expert Elite Team
(gile) Posté(e) le 16 novembre 2007 Posté(e) le 16 novembre 2007 Salut, J'ai ajouté une en-tête pour chaques colonnes, tu peux la supprimer si tu n'en veux pas. EDIT : Il est possible d'enregistrer le fichier en xls, csv ou txt. Dans le premier cas, inutile de spécifier le séparateur. (defun c:export-text (/ ss path sep file n elst typ jus vert ins) (and (princ "\nSélectionner les textes (ou Entrée pour \"Tout\")." ) (or (setq ss (ssget '((0 . "*TEXT,ATTDEF")))) (setq ss (ssget "_X" '((0 . "*TEXT,ATTDEF")))) ) (setq path (getfiled "Fichier d'exportation des textes" (getvar "DWGPREFIX") "*" 1 ) ) (or (and (= (strcase (vl-filename-extension path) T) ".xls") (setq sep "\t") ) (and (member (strcase (vl-filename-extension path) T) '(".txt" ".csv") ) (setq sep (getstring "\Entrez le séparateur: ")) ) ) (setq file (open path "w")) ;; En-tête =======================================;; (write-line (strcat "Type" sep "Calque" sep "Style" sep "X" sep "Y" sep "Z" sep "Justification" sep "Hauteur" sep "Rotation" sep "Valeur" ) file ) ;;================================================;; (repeat (setq n (sslength ss)) (setq elst (entget (ssname ss (setq n (1- n)))) typ (cdr (assoc 0 elst)) vert (cond ((= typ "TEXT") 73) ((= typ "ATTDEF") 74) ) ) (cond ((member typ '("TEXT" "ATTDEF")) (setq jus (cond ((= (cdr (assoc vert elst)) 3) "H") ((= (cdr (assoc vert elst)) 2) "M") ((= (cdr (assoc vert elst)) 1) "B") (T "") ) jus (cond ((= (cdr (assoc 72 elst)) 0) (strcat jus "G")) ((= (cdr (assoc 72 elst)) 1) (strcat jus "C")) ((= (cdr (assoc 72 elst)) 2) (strcat jus "D")) ((= (cdr (assoc 72 elst)) 3) (strcat jus "A")) ((= (cdr (assoc 72 elst)) 4) (strcat jus "M")) (T (strcat jus "P")) ) ins (if (= jus "G") (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 0) (trans (cdr (assoc 11 elst)) (cdr (assoc 210 elst)) 0) ) ) ) ((= typ "MTEXT") (setq jus (cond (( (( (T "B") ) jus (cond ((member (cdr (assoc 71 elst)) '(1 4 7)) (strcat jus "G")) ((member (cdr (assoc 71 elst)) '(2 5 8)) (strcat jus "C")) (T (strcat jus "D")) ) ins (cdr (assoc 10 elst)) ) ) (T (setq jus "G" ins (cdr (assoc 10 elst)) ) ) ) (write-line (strcat (cdr (assoc 0 elst)) sep (cdr (assoc 8 elst)) sep (cdr (assoc 7 elst)) sep (rtos (car ins)) sep (rtos (cadr ins)) sep (rtos (caddr ins)) sep jus sep (rtos (cdr (assoc 40 elst))) sep (angtos (cdr (assoc 50 elst))) sep (cdr (assoc 1 elst)) ) file ) ) (close file) ) (princ) ) [Edité le 16/11/2007 par (gile)] [Edité le 16/11/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 16 novembre 2007 Auteur Posté(e) le 16 novembre 2007 Hello Gilles C SUPER mais SVP j'aimerais bien avoir une question de Sélection pour chosir !?et non pas traitement automatique de tout le DWG :o et aussi une question simple pour choisir le nom de fichier Texte en sortie que l'on peut mettre automatiquement "à coté" du DWG (ce qui ne me gene pas du tout) :( Sinon comme d'hab, c TIP-TOP :) Le Decapode "pointilleux" Autodesk Expert Elite Team
lecrabe Posté(e) le 16 novembre 2007 Auteur Posté(e) le 16 novembre 2007 Rehello Gilles Désolé pour ma remarque/question DEBILE sur le choix du nom de fichier mais j'ai eu la main un peu lourde sur le RETURN et donc je n'ai rien vu ! :( Encore Merci et Bon Appétit, Le Decapode Autodesk Expert Elite Team
(gile) Posté(e) le 16 novembre 2007 Posté(e) le 16 novembre 2007 J'ai modifié le code :- on peut sélectionner les textes à l'écran ou faire Entrée, espace ou clic droit pour "Tout" ;- la boite de dialogue pour spécifier le fichier s'ouvre dans le répertoire du dessin courant. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 16 novembre 2007 Posté(e) le 16 novembre 2007 (or (setq ss (ssget '((0 . "*TEXT,ATTDEF"))))(setq ss (ssget "_X" '((0 . "*TEXT,ATTDEF")))))Alors ça !c'est super malin !chapeau au sous sol ! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
lecrabe Posté(e) le 16 novembre 2007 Auteur Posté(e) le 16 novembre 2007 Hello Gilles Superbe mais je suis fatigué ce matin quand je parlais de ATTDEF, ce n'est pas les ATTDEFs que je désire (Sorry, sorry) mais les attributs (remplis ou pas) qui sont sur les blocs (INSERT) ! :exclam: Je suis désolé de cette modif de derniere minute ! ;) Il n'est pas nécessaire de traiter les blocs imbriqués (et donc d'éventuels attributs au Nième niveau) , seuls les attributs de "1er niveau" d'un bloc sont à traiter ... Encore Pardon pour mon cahier des charges imprécis (par ma faute) :( Sinon la routine me semble "parfaite" :cool: Le Decapode Autodesk Expert Elite Team
lecrabe Posté(e) le 16 novembre 2007 Auteur Posté(e) le 16 novembre 2007 ReHello Et en plus je te propose de rajouter en 1ere position un champ dont le titre sera "COMPTEUR" et qui sera simplement un entier simple (1-N) qui est en fait la numérotation des lignes ... Ainsi cela évitera de rajouter (lors des Imports en Base de données) :- Si Access : un champ de type "NumAuto" sur un nouveau champ COMPTEUR- Si Oracle : une sequence sur un nouveau champ COMPTEUR Moult Mercis d'avance, Le Decapode Autodesk Expert Elite Team
(gile) Posté(e) le 16 novembre 2007 Posté(e) le 16 novembre 2007 Voilà, je pense que ça répond maintenant à ta demande (private : et pendant ce temps je ne fais pas la chasse aux PROXY dans les fichier Map...) (defun c:export-text (/ ss path sep file n elst lst typ jus vert ins) (and (princ "\nSélectionner les textes (ou Entrée pour \"Tout\")." ) (or (setq ss (ssget '((0 . "*TEXT,INSERT")))) (setq ss (ssget "_X" '((0 . "*TEXT,INSERT")))) ) (setq path (getfiled "Fichier d'exportation des textes" (getvar "DWGPREFIX") "*" 1 ) ) (or (and (= (strcase (vl-filename-extension path) T) ".xls") (setq sep "\t") ) (and (member (strcase (vl-filename-extension path) T) '(".txt" ".csv") ) (setq sep (getstring "\Entrez le séparateur: ")) ) ) (setq file (open path "w")) ;; En-tête =======================================;; (write-line (strcat "Compteur" sep "Type" sep "Calque" sep "Style" sep "X" sep "Y" sep "Z" sep "Justification" sep "Hauteur" sep "Rotation" sep "Valeur" ) file ) ;;================================================;; (repeat (setq n (sslength ss)) (setq elst (entget (ssname ss (setq n (1- n))))) (if (= (cdr (assoc 0 elst)) "INSERT") (if (and (= (cdr (assoc 66 elst)) 1) (setq att (entnext (cdr (assoc -1 elst)))) ) (while (= (cdr (assoc 0 (entget att))) "ATTRIB") (setq lst (cons (entget att) lst) att (entnext att) ) ) ) (setq lst (cons elst lst)) ) ) (mapcar (function (lambda (elst) (setq typ (cdr (assoc 0 elst)) vert (cond ((= typ "TEXT") 73) ((= typ "ATTRIB") 74) ) ) (cond ((member typ '("TEXT" "ATTRIB")) (setq jus (cond ((= (cdr (assoc vert elst)) 3) "H") ((= (cdr (assoc vert elst)) 2) "M") ((= (cdr (assoc vert elst)) 1) "B") (T "") ) jus (cond ((= (cdr (assoc 72 elst)) 0) (strcat jus "G")) ((= (cdr (assoc 72 elst)) 1) (strcat jus "C")) ((= (cdr (assoc 72 elst)) 2) (strcat jus "D")) ((= (cdr (assoc 72 elst)) 3) (strcat jus "A")) ((= (cdr (assoc 72 elst)) 4) (strcat jus "M")) (T (strcat jus "P")) ) ins (if (= jus "G") (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 0) (trans (cdr (assoc 11 elst)) (cdr (assoc 210 elst)) 0) ) ) ) ((= typ "MTEXT") (setq jus (cond ((< (cdr (assoc 71 elst)) 4) "H") ((< (cdr (assoc 71 elst)) 7) "M") (T "B") ) jus (cond ((member (cdr (assoc 71 elst)) '(1 4 7)) (strcat jus "G")) ((member (cdr (assoc 71 elst)) '(2 5 8)) (strcat jus "C")) (T (strcat jus "D")) ) ins (cdr (assoc 10 elst)) ) ) (T (setq jus "G" ins (cdr (assoc 10 elst)) ) ) ) (write-line (strcat (itoa (setq n (1+ n))) sep (cdr (assoc 0 elst)) sep (cdr (assoc 8 elst)) sep (cdr (assoc 7 elst)) sep (rtos (car ins)) sep (rtos (cadr ins)) sep (rtos (caddr ins)) sep jus sep (rtos (cdr (assoc 40 elst))) sep (angtos (cdr (assoc 50 elst))) sep (cdr (assoc 1 elst)) ) file ) ) ) lst ) (close file) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 16 novembre 2007 Auteur Posté(e) le 16 novembre 2007 Hello TIP-TOP, c parfait ! :) :D :cool: C opérationnel sur AutoCAD 2006 et 2008 :P Merci beaucoup, Bon WE, Le Decapode Autodesk Expert Elite Team
impress Posté(e) le 17 juin 2013 Posté(e) le 17 juin 2013 Bonjour. Le sujet commence a daté, mais j'essai quand meme. Je suis sur autocad2013, et lors du chargement de ce fichier lisp j'ai en réponse : Commande: (LOAD"C:\export-text.lsp"); erreur: La commande CHARGER n'a pas abouti: "C:\export-text.lsp" Puis lors d'un autre essai : Commande: (LOAD"C:/export-text.lsp"); erreur: structure incorrecte de la liste en entrée (l'un avec "/" et l'autre avec "\") Help please!
(gile) Posté(e) le 17 juin 2013 Posté(e) le 17 juin 2013 Salut, (load "C:\\export-text.lsp") Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
impress Posté(e) le 17 juin 2013 Posté(e) le 17 juin 2013 Salut!Merci pour votre disponibilité et votre réactivité!! J'ai essayé aussi... : Commande: (load "C:\\export-text.lsp"); erreur: structure incorrecte de la liste en entrée J'ai pas indiqué cet essai pensant qu "\\" était l'équivalent de "/"
bonuscad Posté(e) le 17 juin 2013 Posté(e) le 17 juin 2013 Salut,; erreur: structure incorrecte de la liste en entrée Tu as peut être loupé ton copié-collé du code dans ton fichier: une parenthèse manquante? Refais le contenu de ton fichier en prenant soin d'avoir tout bien sélectionné. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
impress Posté(e) le 17 juin 2013 Posté(e) le 17 juin 2013 Merci pour vos réponses. Je ne sais pas exactement ce qui c'est passé mais en retrouvant un fichier lisp d'une connaissance je l'ai chargé puis chargé ce donné ici et hop comme par magie ça fonctionne!!! Je met le code de celui que j'ai, au cas où ça interresserait quelqu'un, il permet d'exporter les texts dans un fichier text temporaire, qui s'ouvre et reste ouvert, listant chaque texte précédemment selectionné, et qui permet une modification de ceux-ci. La modification s'effectue (une fois faites sur les textes dans le le fichier ouvert) à la fermeture et l'enregistrement de celui-ci.Fichier fermé et enregistré, autocad demande une mise a jour, "O" indique "oui" et hop le tour est joué! Merci encore! (vmon)(defun c:et (/ ss ssl f i e x y tx) ;****************************************************************************************(princ "\n;*** editexte editeur de texte a partir d'autocad sur l'editeur du dos ****");**************************************************************************************** (princ "Choix jusqu'a 100 entites texte\n") (setq ss (ssget) ) (cond ( (not ss) (princ) ) ( (> (sslength ss) 100) (princ "Ne peut editer plus de 100 entities a la fois\n") (princ) ) (T (setq ssl (sslength ss) f (open "c:/test" "w") i 0 ) (princ "\nEcriture fichier...\n") (while (< i ssl) (setq e (entget (ssname ss i)) i (+ i 1) tx (cdr (assoc 1 e)) ) (princ tx f) (princ "\n" f) ) (close f) (princ "\n\n") (command "shell" "notepad c:/test") (if (setq f (open "c:/test" "r")) (progn (setq i 0 ) (initget 1 "o n") (setq reponse (getkword "\n MISE A JOUR (OUI ou NON (o/n))")) (if (= "o" reponse) (progn (princ "\nLecture et mise a jour...\n") (while (< i ssl) (setq e (entget (ssname ss i)) i (+ i 1) tx (read-line f) e (subst (cons 1 tx) (assoc 1 e) e) ) (entmod e) ) ) ) (close f) ) ) (princ) ) ))(princ "\nEditeur ET charge.\n")(princ)PS : Je ne saurai expliquer ce code. DSL.
salvanorigatore Posté(e) le 17 juin 2013 Posté(e) le 17 juin 2013 Bonjour,impress je ne comprends pas ce que fait ton programme ???Il m'ouvre bien une fenêtre avec écrit dedans "nil" autant de fois que de blocs sélectionnés (1 fois par ligne) ?!Alors j'ai essayé de mettre un texte à la place de "nil" et je dis oui lorsque il me propose une mise à jour mais rien ne se passe ?!Pourquoi ? Salvatore " Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "
salvanorigatore Posté(e) le 17 juin 2013 Posté(e) le 17 juin 2013 Bonjour, (load "C:\\export-text.lsp") Où est-ce que il faut insérer ce bout de code manquant ?:unsure:Pourrait-tu s'il te plait ton lisp complet ? Merci d'avance. :wub: Salvatore " Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "
impress Posté(e) le 17 juin 2013 Posté(e) le 17 juin 2013 Ce code ne permet de lister que les textes (TEXT)quand tu vois nil c'est que tu as selectionné un objet ou un trait. Le bout de code dont tu demande l'insertion n'est pas un bout de code mais une commande en reponse à ma question qui permet de charger un lisp.
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