Aller au contenu

Listing longueurs de segments de polyligne


essepe

Messages recommandés

Bonjour,

Je suis à la recherche d'une routine me permettant de créer un fichier txt listant les longueurs de chaque segment d'une polyligne (ou de plusieurs) sous la forme :

Polyligne n°1 long1 long2 long3 long4...

Polyligne n°2 long1 long2 long3 long4...

....

Les polylignes ayant été créées dans un ordre quelconque, je souhaiterai pouvoir écrire les données de la première que je pointerais, puis pointer la deuxième-> écriture, puis la troisième-> écriture,etc... puis fermeture du fichier après la dernière.

Je n'ai que de très faibles connaissances en lisp, aussi j'espère trouver ici une aide pour résoudre cette demande.

Merci par avance

:)

Lien vers le commentaire
Partager sur d’autres sites

Salut et bienvenue

 

Un petit truc vite fait :

(defun c:seglen2file (/ *error* filename file cnt pline param lst)
 
 (defun *error* (msg)
   (if (/= msg "Fonction annulée")
     (princ (strcat "\nErreur: " msg))
   )
   (if file
     (close file)
   )
   (if lst
     (mapcar (function (lambda (x) (redraw x 4))) lst)
   )
   (princ)
 )
 
 (if (setq filename (getfiled "Créer un fichier"
                              (strcat (getvar 'dwgprefix)
                                      (vl-filename-base (getvar 'dwgname))
                                      ".txt"
                              )
                              "txt"
                              1
                    )
     )
   (progn
     (setq file (open filename "w")
           cnt  1
     )
     (while (setq pline (car (entsel)))
       (if (wcmatch (cdr (assoc 0 (entget pline))) "*POLYLINE")
         (progn (setq param (fix (vlax-curve-getEndParam pline))
                      line  ""
                )
                (while (                   (setq
                    line (strcat
                           " "
                           (rtos
                             (- (vlax-curve-getDistAtParam pline param)
                                (vlax-curve-getDistAtParam pline
                                                           (setq param (1- param))
                                )
                             )
                           )
                           line
                         )
                  )
                )
                (write-line (strcat "Polyligne n°" (itoa cnt) line) file)
                (setq cnt (1+ cnt)
                      lst (cons pline lst)
                )
                (redraw pline 3)
         )
         (princ "\nL'objet sélectionné n'est pas une polyligne.")
       )
     )
     (close file)
     (mapcar (function (lambda (x) (redraw x 4))) lst)
   )
 )
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Merci lili2006,

 

J'ai corrigé la faute de frappe.

 

La routine *error* est une redéfinition "locale" (elle est placée à l'intérieur de la fonction principale et déclarée comme une variable locale) de la fonction *error* qui gère les erreurs dans les fonctions LISP.

Le fait de quitter un fonction LISP en cours avec la touche Echap est traité comme une erreur.

Il est donc parfois important de modifier localement cette fonction pour restaurer l'environnement initial au cas où l'utilisateur fasse Echap avant le fin de l'exécution du LISP.

 

Dans ce cas un fichier texte est ouvert en écriture, puis l'utilisateur sélectionne des polylignes une par une, s'il fait Echap pour sortir de la commande, l'instruction (close file) qui est placée après la boucle (while ...) ne sera pas exécutée. C'est là que la fonction *error* prend le relais et ferme le fichier.

 

PS : regarde les page 33 et 34 de ton polycop "Introduction à AutoLISP"

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

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

PS : regarde les page 33 et 34 de ton polycop "Introduction à AutoLISP"

 

Justement, c'est un peu pour cela que je te posais la question car elle est écrit ce cette façon sur le poly =>

 

;; Fonction de gestion des erreurs
(defun GPTF_err (msg)
 (if (/= msg "Fonction annulée")
   (princ (strcat "\nErreur: " msg))
 )
 (if file
   (close file)
 )
 (setq *error* m:err			             ; restauration de *error*
  m:err nil
 )

 (princ)
)

 

GPTF (de l'exemple de routine "GetPointToFile") apparait ici après le defun alors que ici tu as écris directement :

(defun *error* (msg) 

 

Je me demandais pourquoi !?

 

MAIS, je pense que la réponse est page 34, ;)

 

Merci de ta réponse,

 

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

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é