Aller au contenu

Export TEXT/MTEXT/Attributs en Fichier Texte


Messages recommandés

Posté(e)

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/ATTDEF

Calque

Style

X

Y

Z

Code de justification: G, D, HG, HD, M, C, etc (Eventuellement)

Hauteur

Rotation

Contenu/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

Posté(e)

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

Posté(e)

 

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

Posté(e)

 

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

Posté(e)

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

Posté(e)
(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...

Posté(e)

 

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

Posté(e)

 

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

Posté(e)

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

Posté(e)

 

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

  • 5 ans après...
Posté(e)

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!

Posté(e)

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 "/"

Posté(e)

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

Posté(e)

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.

Posté(e)

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 "

Posté(e)

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 "

Posté(e)

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.

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité