Aller au contenu

Distances vers un fichier texte


abe49

Messages recommandés

Bonjour à tous,

 

Etant novice sur le site, j'espère que mon post ne sera pas redondant avec un ancien sujet.

J'ai besoin pour implémenter des données dans un logiciel de modélisation hydraulique d'extraire des longueurs hydrauliques à partir de fichiers AutoCAD.

Pour ce faire, j'ai tenté la fonction _DATAEXTRACTION, mais le résultat n'est pas satisfaisant (pas de cohérence entre l'ordre de sélection des polylignes et le fichier xls).

Aussi, j'ai entrepris de créer un LISP (il faut bien se lancer un jour ; merci pour le fascicule de M. Gilles Chanteau), qui me permettrait de mesurer des distances et d'enregistrer au fur et à mesure les résultats dans un fichier texte. Toutefois, mon niveau proche du néant ne me permet de comprendre où est mon erreur dans mon code.

Pourriez-vous m'éclairer ?

Voici mon code :

;; DIST (gerald)
;; Envoie vers excel la distance entre 2 points.

(defun c:lg (/ p1 p2 file)
 (while (setq p1 (getpoint "\nSpécifiez le premier point : "))
 (setq p2 (getpoint "\nSpécifiez le second point : "))
 (setq dist (distance p1 p2))
 )
 (setq file (open "c:\\Distances.txt" "w"))
 (write-line (dist) file)
 (close file)
)

 

A bientôt,

Gérald

Lien vers le commentaire
Partager sur d’autres sites

Bonjour, et bienvenu.

 

Qu'est-ce qui ne fonctionne pas dans ton code ?

 

Je pense que ton fichier "Distance.txt" ne contient que la dernière distance. Il me semble que l'overture en mode append résoudrait ce problème.

(setq file (open "c:\\Distances.txt" "a"))

 

Et dans ton fichier txt, te ne veux pas y placer aussi le nom de la section (ex:Pt4->Pt5 Dist=XXX.XX) avant la distance ?

 

Mais tu devrais avoir d'autres réponses de membres plus calés en Lisp que moi...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Essai ceci :

;; DIST (gerald)
;; Envoie vers excel la distance entre 2 points.

(defun c:lg (/ p1 dist NomFich)
 (while (setq p1 (getpoint "\nSpécifiez le premier point : "))
   (setq dist (getdist p1 "\nSpécifiez le second point : "))
 ) ;_ Fin de while
 (setq NomFich (strcat (getvar "dwgprefix") (getvar "dwgname")))
 (setq NomFich (substr NomFich 1 (- (strlen NomFich) 4)))
 (setq NomFich (strcat NomFich ".txt"))
 (setq NomFich (open NomFich "a"))
 (write-line (rtos dist 2 2) NomFich)
 (close NomFich)
 (princ)
) ;_ Fin de defun

 

Ton fichier sera au même endroit que ton DWG

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour DenisH,

 

Si je ne mets pas la séquence d'enregistrement dans le Lisp, effectivement, seule la dernière mesure apparaît dans la barre de commande d'AutoCAD.

Si après j'ajoute la séquence d'enregistrement, AutoCAD m'indique "; erreur" + la dernière mesure et le fichier txt est vide.

 

Tu as raison pour le mode d'ouverture, le "a" semble plus adapté (testé mais ne change rien pour l'instant, j'ai dû faire une bêtise plus grosse que moi).

 

Ta suggestion d'ajouter un nom par ligne est judicieuse. C'est un Lisp pour débuter et qu'il faudra que j'essaie d'améliorer. La prochaine étape étant d'extraire la pente du TN sur le parcours hydraulique superficiel (pour l'instant, je l'extrait par le listing d'étiquette de covadis).

 

Merci.

Gérald

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

J'ai corrigé 2/3 petites choses

(defun c:lg (/ p1 p2 file)
 (setq file (open "c:\\Distances.txt" "w"))
 (while (setq p1 (getpoint "\nSpécifiez le premier point : "))
   (setq p2 (getpoint p1 "\nSpécifiez le second point : "))
   (setq dist (distance p1 p2))
   (write-line (rtos dist) file)
 )
 (close file)
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Pour le cas où tu voudrais ajouter le nom d'un tronçon, tu peux tester ça :

;; DIST (gerald)
;; Envoie vers excel la distance entre 2 points.

(defun c:lg (/ p1 dist NomFich)
 (setq NomFich (strcat (getvar "dwgprefix") (getvar "dwgname")))
 (setq NomFich (substr NomFich 1 (- (strlen NomFich) 4)))
 (setq NomFich (strcat NomFich ".csv"))
 (setq NomFich (open NomFich "a"))
 (while (setq Tronc (getstring "\nSaisir le nom du tronçon :"))
   (setq p1 (getpoint "\nSpécifiez le premier point : "))
   (setq dist (getdist p1 "\nSpécifiez le second point : "))
   (write-line (strcat Tronc ";" (rtos dist 2 2)) NomFich)
   (close NomFich)
 ) ;_ Fin de while
 (princ)
) ;_ Fin de defun

 

Ce fichier sera un CSV pour une ouverture plus facile dans Excel.

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

J'ai fais une petite modif, voici un code que j'ai testé :

;; DIST (gerald)
;; Écrit dans un CSV les tronçons et leur distance.

(defun c:lg (/ p1 dist Tronc Nom NomFich)
 (setq Nom (strcat (getvar "dwgprefix") (getvar "dwgname")))
 (setq Nom (substr Nom 1 (- (strlen Nom) 4)))
 (setq Nom (strcat Nom ".csv"))
 (while (setq Tronc (getstring "\nSaisir le nom du tronçon :"))
   (setq p1 (getpoint "\nSpécifiez le premier point : "))
   (setq dist (getdist p1 "\nSpécifiez le second point : "))
   (setq NomFich (open Nom "a"))
   (write-line (strcat Tronc ";" (rtos dist 2 2)) NomFich)
   (close NomFich)
 ) ;_ Fin de while
 (princ)
) ;_ Fin de defun

  • Upvote 1

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Je ne viens pas te répondre mais te questionner car je manque d'éléments pour t'aider efficacement.

De quelles distances parle-t'on ?

Comment sont elles mesurées dans AutoCAD ?

  • est-ce par exemple, entre deux blocs avec attributs ?
  • ou bien des longueurs de polylignes ?
  • sous quel format doit-on livrer les résultats ?
  • le fichier de résultat est-il un xls, un cvs, un txt, autre chose ?

Si le problème est bien posé il sera bien traité pour l’instant je ne sais pas quoi faire.

 

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour DenisH, Patrick35 et Didier,

 

Tout d'abord merci à vous trois pour vos réponse.

 

Patrick35, tes corrections de mon code fonctionnent comme je le souhaitais. :) Merci.

 

DenisH, tes corrections fonctionnent également, à part l'entrée des noms de bassin versant qui ne sont pas enregistrés dans le fichier texte. Mais, pour l'instant, avoir juste les distances me convient. Merci à toi aussi pour ton aide.

 

Didier, en fait j'utilise Mike Urban pour la modélisation du fonctionnement en temps réelle de réseaux EP. Pour faire court, mon modèle est constitué de bassins versants (autant que d'entrée dans le réseau, e.g. avaloirs, branchement...), pour lesquels je dois déterminer, par exemple, la pente et la longueur hydraulique (le parcours de la goutte d'eau sur le bassin versant). Aussi, la fonction DIST d'AutoCAD me convient parfaitement (je n'ai pas besoin de conserver de traces de la mesure). Une fois mon fichier texte obtenu, je l'ouvre avec excel et je copie-colle le contenu dans la base de données Mike Urban (.mdb). J'espère avoir répondu à tes interrogations.

 

Gérald.

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

C'est curieux, chez moi, ça fonctionne...

 

Voici ce que ça donne dans mon CSV :

AB;13.28

BC;14.29

CD;11.43

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

bonsoir monsieurs.

 

Tout d'abord merci à vous:

 

si vous permettez , je suis en train de découvrir le langage lisp;

 

je me demande si quelqu'un peut apporter quelque modification sur ce lisp DIST (gerald).

 

;; DIST (gerald)

;; Écrit dans un CSV les tronçons et leur distance.

 

(defun c:lg (/ p1 dist Tronc Nom NomFich)

(setq Nom (strcat (getvar "dwgprefix") (getvar "dwgname")))

(setq Nom (substr Nom 1 (- (strlen Nom) 4)))

(setq Nom (strcat Nom ".csv"))

(while (setq Tronc (getstring "\nSaisir le nom du tronçon :"))

(setq p1 (getpoint "\nSpécifiez le premier point : "))

(setq dist (getdist p1 "\nSpécifiez le second point : "))

(setq NomFich (open Nom "a"))

(write-line (strcat Tronc ";" (rtos dist 2 2)) NomFich)

(close NomFich)

) ;_ Fin de while

(princ)

) ;_ Fin de defun

 

pour qu'il propose de sélectionner un texte comme nom de tronçon (nom de tronçon écrit sur le dessin ) et de pouvoir saisir le nom du tronçon le cas échéant(s'il n'est pas écrit sur le dessin).

et de changer la couleur de de ce texte (nom de tronçon sur le dessin) après chaque opération pour identifier les tronçons déjà sélectionnées.

 

le résultat sur le fichier CSV reste le même.

 

un grand merci a tous le monde.

 

merci beaucoup.

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Est-ce que :

Tu veux que quelqu'un te fasse ce que tu demandes ?

Tu veux te former au langage et devenir autonome ?

 

Réponse 1 : nous le dire et on va te faire ça.

Réponse 2 : un peu de pub pour mon site en signature.

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Si j'ai bien compris, la routine ci-dessous devrait satisfaire la demande.

 

(defun c:lg (/ filename txt elst name p1 dist lst file)
 (setq filename (strcat (getvar 'dwgprefix) (vl-filename-base (getvar 'dwgname)) ".csv"))
 (vl-catch-all-apply
   '(lambda ()
      (while
 (and
   (or
     (and (setq txt (car (entsel "\nSélectonnez le texte du tronçon : ")))
	  (setq elst (entget txt))
	  (wcmatch (cdr (assoc 0 elst)) "*TEXT")
	  (setq name (cdr (assoc 1 elst)))
     )
     (/= (vl-string-trim
	   " \t\n"
	   (setq name (getstring "\nSaisir le nom du tronçon :"))
	 )
	 ""
     )
   )
   (setq p1 (getpoint "\nSpécifiez le premier point : "))
   (setq dist (getdist p1 "\nSpécifiez le second point : "))
 )
  (if elst
    (entmod (if	(assoc 62 elst)
	      (subst '(62 . 3) (assoc 62 elst) elst)
	      (append elst '((62 . 3)))
	    )
    )
  )
  (setq	elst nil
	lst  (cons (strcat name ";" (rtos dist 2 2)) lst)
  )
      )
    )
 )
 (setq file (open filename "w"))
 (foreach str (reverse lst)
   (write-line str file)
 )
 (close file)
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

y a t'il un possibilité d'introduire dans le code un facteur qui permet de changer l'affichage des distances sur le fichier de sortie (multiplier le resultat par 0.01 ou 0.1 par exemple).

 

J'ai du mal à comprendre, tu veux écrire le texte de la distance en plus gros, ou tu veux multiplier la distance par une constante ?

 

Cas n°1 : n'oublie pas que ton fichier de sortie est un CSV, il n'y a donc pas de mise en forme possible...

 

Cas n°2 : Je pense que c'est ici, change cette sélection :

(cons (strcat name ";" (rtos dist 2 2)) lst)

Par ça

(cons (strcat name ";" (rtos (* dist 0.01) 2 2)) lst)

Où 0.01 est le coef, tu peux mettre autre chose...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

  • 10 mois après...

salut tout le monde.

y a t'il la possibilité de modifier le code pour ajouter la distance calculé comme suffixe au nom de tronçon sur le dessin (concaténer le nom et la distance).

Par exemple si le nom de tronçon est Tr1 et la distance 3,54 , le résultat a afficher sur le dessin est Tr1_3,54

et merci d'avance a tous.

Lien vers le commentaire
Partager sur d’autres sites

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é