Aller au contenu

Messages recommandés

Posté(e)

Je cherche un moyen d'importer à partir d'un fichier texte Nom X Y Z Un point avec les attribut Nom et Z

 

Merci ;)

C'est au pied du mur que l'on voit le mieux le mur

Posté(e)

Salut,

 

Pour pouvoir te répondre précisément il faudrait que tu postes un extrait de ton fichier texte.

Le programme ne peut être fait qu'en fonction de la manière dont celui-ci est organisé (lignes, séparateurs ...).

 

En attendant je te propose un LISP que j'ai essayé de faire polyvalent (je ne suis pas de la partie). Le bloc à insérer doit exister dans la collection du dessin ou en tant que fichier dwg et avoir 2 attributs : nom ou matricule et altitude.

 

;;; TOPO (gile) 05/07/08
;;; Insère un bloc en fonction d'un fichier de points topo
;;; L'utilisateur spécifie le bloc (2 attributs), le fichier et le séparateur.

(defun c:topo (/ bloc file sep)
 (and
   (setq bloc (getblock nil))
   (setq file (getfiled "Choisir le fichier" "" "txt" 0))
   (setq sep (choosebox "Séparateur"
		 '(("," . "Virgule")
		   (";" . "Point-virgule")
		   (" " . "Espace")
		  )
      )
   )
   (FileToIns bloc file sep)
 )  
 (princ)
)

;;; FileToIns
;;; Lit un fichier texte contenant des points topo et insère
;;; un bloc par point avec les attributs nom (matricule) et altitude.
;;;
;;; Arguments
;;; bloc : le nom du bloc à insérer
;;; file : le fichier à lire
;;; sep : le séparateur de données dans le fichier

(defun FileToIns (bloc file sep / acDoc Space str mat alt ins)
 (vl-load-com)
 (setq	AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space (if (= (getvar "CVPORT") 1)
	(vla-get-PaperSpace AcDoc)
	(vla-get-ModelSpace AcDoc)
      )
file  (open file "r")
 )
 (while (setq str (read-line file))
   (setq str (vl-string-right-trim sep str)
  mat (substr str 1 (vl-string-position (ascii sep) str))
  str (substr str
	      (+ 2 (vl-string-position (ascii sep) str))
      )
  alt (rtos
	(atof
	  (substr str
		  (+ 2 (vl-string-position (ascii sep) str 1 T))
	  )
	)
      )
  ins nil
   [surligneur]ins (cons (atof alt) ins) [/surligneur]
  str (substr str
	      1
	      (vl-string-position (ascii sep) str 1 T)
      )
  ins
      (cons
	(atof
	  (substr str
		  (+ 2 (vl-string-position (ascii sep) str 1 T))
	  )
	)
	ins
      )
  str (substr str
	      1
	      (vl-string-position (ascii sep) str 1 T)
      )
  ins (cons (atof str) ins)
  ref (vla-InsertBlock
	Space
	(vlax-3d-point ins)
	bloc
	1.0
	1.0
	1.0
	0.0
      )
   )
   (mapcar '(lambda (x y) (vla-put-TextString x y))
    (vlax-invoke ref 'GetAttributes)
    (list mat alt)
   )
 )
 (close file)
)

;; ChooseBox (gile)
;; Boite de dialogue permettant de choisir une option
;;
;; Arguments
;; title : le titre de la boite de dialogue (chaîne)
;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...)
;;
;; Retour : la clé de l'option choisie (chaîne)
;;
;; Exemple d'utilisation
;; (choosebox "Type de fichier" '(("lin" . "Type de ligne") ("pat" . "Motif de hachure")))

(defun ChooseBox (title keylab / tmp file dcl_id choice)
 (setq	tmp  (vl-filename-mktemp "tmp.dcl")
file (open tmp "w")
 )
 (write-line
   (strcat "ChooseBox:dialog{label=\""
    title
    "\";:radio_column{key=\"choice\";"
   )
   file
 )
 (mapcar
   (function
     (lambda (p)
(write-line
  (strcat ":radio_button{key=\""
	  (car p)
	  "\";label=\""
	  (cdr p)
	  "\";}"
  )
  file
)
     )
   )
   keylab
 )
 (write-line "}spacer;ok_cancel;}" file)
 (close file)
 (setq dcl_id (load_dialog tmp))
 (if (not (new_dialog "ChooseBox" dcl_id))
   (exit)
 )
 (set_tile "choice" (caar keylab))
 (action_tile
   "accept"
   "(setq choice (get_tile \"choice\")) (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 choice
)

;;; Getblock (gile) 03/11/07
;;; Retourne le nom du bloc entré ou choisi par l'utilisateur 
;;; dans une liste déroulante de la boite de dialogue ou depuis la boite
;;; de dialogue standard d'AutoCAD
;;; Argument : le titre (string) ou nil (défaut : "Choisir un bloc")

(defun getblock	(titre / bloc n lst tmp file what_next dcl_id nom)
 (while (setq bloc (tblnext "BLOCK" (not bloc)))
   (setq lst (cons (cdr (assoc 2 bloc)) lst)
   )
 )
 (setq	lst  (acad_strlsort
       (vl-remove-if
	 (function (lambda (n) (= (substr n 1 1) "*")))
	 lst
       )
     )
tmp  (vl-filename-mktemp "Tmp.dcl")
file (open tmp "w")
 )
 (write-line
   (strcat
     "getblock:dialog{label="
     (cond (titre (vl-prin1-to-string titre))
    ("\"Choisir un bloc\"")
     )
     ";initial_focus=\"bl\";:boxed_column{
     :row{:text{label=\"Sélectionner\";alignment=left;}
     :button{label=\">>\";key=\"sel\";alignment=right;fixed_width=true;}}
     spacer;
     :column{:button{label=\"Parcourir...\";key=\"wbl\";
     alignment=right;fixed_width=true;}}
     :column{:text{label=\"Nom :\";alignment=left;}}
     :edit_box{key=\"tp\";edit_width=25;}
     :popup_list{key=\"bl\";edit_width=25;}spacer;}
     spacer;
     ok_cancel;}"
   )
   file
 )
 (close file)
 (setq dcl_id (load_dialog tmp))
 (setq what_next 2)
 (while (>= what_next 2)
   (if	(not (new_dialog "getblock" dcl_id))
     (exit)
   )
   (start_list "bl")
   (mapcar 'add_list lst)
   (end_list)
   (if	(setq n	(vl-position
	  (strcase (getvar "INSNAME"))
	  (mapcar 'strcase lst)
	)
)
     (setq nom (nth n lst))
     (setq nom	(car lst)
    n	0
     )
   )
   (set_tile "bl" (itoa n))
   (action_tile "sel" "(done_dialog 5)")
   (action_tile "bl" "(setq nom (nth (atoi $value) lst))")
   (action_tile "wbl" "(done_dialog 3)")
   (action_tile "tp" "(setq nom $value) (done_dialog 4)")
   (action_tile
     "accept"
     "(setq nom (nth (atoi (get_tile \"bl\")) lst)) (done_dialog 1)"
   )
   (setq what_next (start_dialog))
   (cond
     ((= what_next 3)
      (if (setq nom (getfiled "Sélectionner un fichier" "" "dwg" 0))
 (setq what_next 1)
 (setq what_next 2)
      )
     )
     ((= what_next 4)
      (cond
 ((not (read nom))
  (setq what_next 2)
 )
 ((tblsearch "BLOCK" nom)
  (setq what_next 1)
 )
 ((findfile (setq nom (strcat nom ".dwg")))
  (setq what_next 1)
 )
 (T
  (alert (strcat "Le fichier \"" nom "\" est introuvable."))
  (setq	nom nil
	what_next 2
  )
 )
      )
     )
     ((= what_next 5)
      (if (and	(setq ent (car (entsel)))
	(= "INSERT" (cdr (assoc 0 (entget ent))))
   )
 (setq nom	 (cdr (assoc 2 (entget ent)))
       what_next 1
 )
 (setq what_next 2)
      )
     )
     ((= what_next 0)
      (setq nom nil)
     )
   )
 )
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 nom
) 

[Edité le 6/7/2008 par (gile)]

 

[Edité le 20/8/2008 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

(gile), as-tu les éléments qu'il faut pour tester ?

 

J'avoue avoir la flegmme de me créer le fichier et le bloc,...

 

Créer un bloc contenant 2 atribut et un point (ou un cercle minuscule pour éviter la gestion de PDSIZE) c'est vraiment très rapide...

Quant au fichier, je n'en ai pas. comme je disais, ce n'est pas ma partie (la topographie) mais j'imagine que ça doit ressembler à ça:

 

matricule1 x1 y1 z1

matricule2 x2 y2 z2

matricule3 x3 y3 z3

etc...

 

avec le séparateur qui peut être une virgule, un point-virgule ou un espace, mais tu as sûrement plus souvent que moi eu affaire avec ce type de fichier...

 

[Edité le 6/7/2008 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Voici le fichier texte généré par le programme d'export de l'outil topo

 

1A 913794.270 229570.634 777.711

1B 913792.367 229569.916 777.817

2B 913214.821 229171.904 779.274

2A 913216.221 229175.466 779.242

3A 911525.049 227206.477 784.321

3B 911523.015 227203.799 784.325

4A 910630.887 226353.765 788.148

4B 910631.233 226352.561 787.165

5A 910831.994 226412.707 787.048

5B 910832.896 226411.786 787.090

6A 910762.877 226329.543 786.998

6B 910764.005 226329.737 786.960

7 912651.795 228382.936 782.551

8A 914906.809 230837.942 775.203

8B 914909.038 230838.910 775.167

 

C'est au pied du mur que l'on voit le mieux le mur

Posté(e)

Salut,

 

Le LISP proposé plus haut devrait fonctionner, il suffit de:

- créer un bloc à ta convenance contenant 2 attributs : nom et altitude (dans cet ordre)

- charger et lancer le LISP (si besoin, voir ici)

- choisir le bloc dans la première boite de dialogue

- choisir le fichier dans la seconde

- spécifier le séparateur (Espace) dans la troisième

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour,

 

Ca fonctionne. Ce lisp va me permettre de travailler directement, sans intermédiaire.

 

Merci à tous :)

C'est au pied du mur que l'on voit le mieux le mur

  • 1 mois après...
Posté(e)

Salut

 

Merci à tous, je n'avais pas encore cette routine (gile) elle fonctionne super!

Juste pour faire une petite variante au cas ou, quelle modif pour insérer sans le Z? Biensur si cela ne prend pas trop de temps.

 

Et encore merci!!

Posté(e)

quelle modif pour insérer sans le Z?

 

Si tu veux dire insérer en 2d (Z = 0), il suffit de supprimer la ligne :

[surligneur]ins (cons (atof alt) ins) [/surligneur]

ou de mettre un point virgule devant :

[surligneur]; ins (cons (atof alt) ins) [/surligneur]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

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

Bonjour,

Je viens de voir ce post et j'ai essayé le lisp avec le bloc contenant 1 point et 2 attributs: nom et altitude

 

J'ai une erreur du type :

 

TOPO ; erreur: type d'argument incorrect: numberp: nil

 

Ou est ce que c'est vide?? :casstet:

"Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."

J-C Van Damme

  • 2 mois après...
Posté(e)

bonjour

 

 

j'ai le meme pbm que jalana message d'erreur "Utilisation: (acad_strlsort )

; erreur: type d'argument incorrect: numberp: nil"

j'ai cree un bloc avec un seul attribut et mon fichier texte c'est bien ca..

NOM x y

1 595703.74692 126945.13091

3 595726.00000 126956.00000

3 595672.17154 127011.64556

5 595647.15966 127021.40909

2 595676.33500 126978.10234

3 595655.96057 126957.91642

2 595678.75167 126958.64124

4 595657.92924 126943.71491

5 595659.62022 126930.83844

 

je n'arrive toujours pas a inserer mes points.

salutation

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é