Aller au contenu

Extraction des coordonnées de polylignes


Karmelie

Messages recommandés

Bonjour

 

Je veux extraire vers excel des données d'un dessin qui se compose de lignes, polylignes et de blocs avec attributs.

 

J'ai besoin de connaître le nombre et la longueur des lignes et des polylignes par calque ainsi que le nombre de blocs par calque et les valeurs d'attributs. Jusqu'ici, pas de problème, avec des tris dans excel, j'y arrive.

 

L'extraction devrait également comprendre la position des éléments. Pour les lignes je demande "départ X et départ Y" et pour les blocs je demande "Position X et Position Y". Pour les polylignes, j'aurais voulu avoir les coordonnées X et Y du premier sommet mais il n'y a rien à cet effet.

 

Alors comment faire pour extraire la position des polylignes?

 

Merci à l'avance,

Karmélie

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Avec _DATAEXTRACTION , il me semblait que tu avais les proprietes : X1 et Y1 (et Z1 si necessaire) ?

et aussi X2 et Y2 (et Z2 si necessaire) ?

 

Desole je n'ai pas d'AutoCAD sous la main ...

SVP peux tu verifier si cela existe et correspond a tes besoins ??

 

lecrabe

 

PS: car avec un AutoCAD MAP (ou un CIVIL) lors des requetes sur le groupe de dessins de MAP, j'ai acces a ces proprietes geometriques (c fort pratique d'ailleurs) ...

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Lecrabe,

 

Malheureusement ça ne fonctionne pas. J'ai activé toutes les possibilités et je n'ai toujours pas de coordonnées pour les polylignes.

 

P.S. Au cas où on me le proposerait: je ne veux pas dégrouper les polylignes.

 

Merci pour la piste.

 

Karmélie

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Bonuscad,

 

Si j'ai bien compris, avec ce lisp, je choisi un calque et j'ai les coordonnées de chacun des sommets de chacun des plines choisis. C'est donc à la fois trop et pas assez pointu.

 

J'ai besoin de connaître le calque, la longueur et la localisation de chacun des plines, pour tous les calques d'une sélection ou pour tout le dessin, comme on peut le faire dans _DATAEXTRACTION. Dans _DATAEXTRACTION j'extrais également les lignes et les blocs avec les informations tel que mentionné dans le message #1.

 

Il pourrait m'être utile, mais pour autre chose.

 

Merci tout de même :)

 

Karmélie

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Sorry, en effet _DATAEXTRACTION ne permet pas d'extraire les X1/Y1/Z1 & X2/Y2/Z2 des Polylignes

contrairement aux requetes en mode Rapport de MAP ...

 

Sinon ton besoin est ponctuel sur UN DWG en particulier

ou bien c un besoin regulier ?

 

lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Autre proposition qui pourrait approcher ta demande à la différence que le tableau est fait dans Autocad:

mult-info_po2cell.lsp

 

Je ne peux pas me permettre une tableau dans le dessin car un des dessins que j'ai à analyer a près de 25000 entités.

 

C'est approchant, mais il manque encore le calque du pline. Ce n'est pas vraiment important mais je ne comprends pas la numérotation donnée au pline...

 

Karmélie

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Si je comprends bien un "mixe" entre la 1ere et 2eme proposition ferait l'affaire.

Alors voici (rajout du calque et indexation des sommets différente)

 

(vl-load-com)
(defun c:mult-info_po2CSV ( / js file_name cle f_open key_sep str_sep oldim lst_lay-seg lst_id-seg lst_pt lst_length lst_alpha lst_rad nb id
                             n obj ename pr dist_start dist_end pt_start pt_end seg_len seg_bulge rad alpha)
 (princ "\nSélectionner les polylignes optimisées.")
 (while (null (setq js (ssget '((0 . "LWPOLYLINE")))))
   (princ "\nSélection vide, ou ce ne sont pas des LWPOLYLINE!")
 )
 (command "_.ddunits"
   (while (not (zerop (getvar "cmdactive")))
     (command pause)
   )
 )
 (setq file_name (getfiled "Nom du fichier a créer ?: " (strcat (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 3)) "csv") "csv" 37))
 (if (null file_name) (exit))
 (if (findfile file_name)
   (progn
     (prompt "\nFichier éxiste déjà!")
     (initget "Ajoute Remplace annUler _Add Replace Undo")
     (setq cle
       (getkword "\nDonnées dans fichier? [Ajouter/Remplacer/annUler] <R>: ")
     )
     (cond
       ((eq cle "Add")
         (setq cle "a")
       )
       ((or (eq cle "Replace") (eq cle ()))
         (setq cle "w")
       )
       (T (exit))
     )
     (setq f_open (open file_name cle))
   )
   (setq f_open (open file_name "w"))
 )
 (initget "Espace Virgule Point-virgule Tabulation _SPace Comma SEmicolon Tabulation")
 (setq key_sep (getkword "\nSéparateur [Espace/Virgule/Point-virgule/Tabulation]? <Point-virgule>: "))
 (cond
   ((eq key_sep "SPpace") (setq str_sep " "))
   ((eq key_sep "Comma") (setq str_sep ","))
   ((eq key_sep "Tabulation") (setq str_sep "\t"))
   (T (setq str_sep ";"))
 )
 (setq oldim (getvar "dimzin"))
 (setvar "dimzin" 0)
 (setq
   lst_lay-seg '()
   lst_id-seg '()
   lst_pt '()
   lst_length '()
   lst_alpha '()
   lst_rad '()
   nb 0
   id 0
 )
 (repeat (setq n (sslength js))
   (setq
     obj (ssname js (setq n (1- n)))
     ename (vlax-ename->vla-object obj)
     pr -1
     id (1+ id)
     nb 1
   )
   (repeat (fix (vlax-curve-getEndParam ename))
     (setq
       dist_start (vlax-curve-GetDistAtParam ename (setq pr (1+ pr)))
       dist_end (vlax-curve-GetDistAtParam ename (1+ pr))
       pt_start (vlax-curve-GetPointAtParam ename pr)
       pt_end (vlax-curve-GetPointAtParam ename (1+ pr))
       seg_len (- dist_end dist_start)
       seg_bulge (vla-GetBulge ename pr)
       rad (if (zerop seg_bulge) 0.0 (/ seg_len (* 4.0 (atan seg_bulge))))
       alpha (if (zerop seg_bulge) (angle pt_start pt_end) 0.0)
       lst_lay-seg (cons (cdr (assoc 8 (entget obj))) lst_lay-seg)
       lst_id-seg (cons (strcat "P" (itoa id) "-" (itoa nb)) lst_id-seg)
       lst_pt (cons pt_start lst_pt)
       lst_length (cons seg_len lst_length)
       lst_rad (cons (abs rad) lst_rad)
       lst_alpha (cons alpha lst_alpha)
       nb (1+ nb)
     )
   )
   (if (eq (vla-get-closed ename) :vlax-false)
     (setq lst_id-seg (cons (strcat "P" (itoa id) "-" (itoa nb)) lst_id-seg))
     (setq lst_id-seg (cons (strcat "P" (itoa id) "-" (itoa (- nb (fix (vlax-curve-getEndParam ename))))) lst_id-seg))
   )
   (setq
     lst_pt (cons pt_end lst_pt) lst_lay-seg (cons (cdr (assoc 8 (entget obj))) lst_lay-seg)
     lst_length (cons 0.0 lst_length) lst_rad (cons 0.0 lst_rad) lst_alpha (cons 0.0 lst_alpha)
     nb (1+ nb)
   )
 )
 ;(write-line (strcat "Sommaire de " (itoa (sslength js)) " LWPOLYLINES") f_open)
 (foreach n
   (reverse
     (mapcar'list
       (append (mapcar '(lambda (x) (strcat x str_sep)) lst_lay-seg) (list (strcat "Calque" str_sep)))
       (append (mapcar '(lambda (x) (strcat x str_sep)) lst_id-seg) (list (strcat "N°" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) (mapcar 'car lst_pt)) (list (strcat "Coordonnées X" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) (mapcar 'cadr lst_pt)) (list (strcat "Coordonnées Y" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) lst_length) (list (strcat "Longueurs" str_sep)))
       (append (mapcar '(lambda (x) (strcat (angtos x) str_sep)) lst_alpha) (list (strcat "Angles" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) lst_rad) (list (strcat "Rayons" str_sep)))
     )
   )
   (write-line (apply 'strcat n) f_open)
 )
 (close f_open)
 (setvar "dimzin" oldim)
 (prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Banuscad,

 

C'est très près de ce que j'ai besoin, mais il y a encore trop d'informations. Est-ce possible de n'avoir qu'une seule coordonnées pour le positionnement du pline (Premier segment par exemple) ainsi qu'une seule longueur (la longueur totale du pline). Un des fichier que je dois analyser a plus de 15000 plines qui ont parfois jusqu'à 50 segments. Ça me fait un fichier excel vraiment trop volumimeux!

 

Merci

 

Karmélie

Lien vers le commentaire
Partager sur d’autres sites

La même en allégée...

 

(vl-load-com)
(defun c:mult-info_po2CSV ( / js file_name cle f_open key_sep str_sep oldim lst_lay-seg lst_id-seg lst_pt lst_length lst_width id
                             n obj ename pr dist_start dist_end pt_start pt_end seg_len seg_bulge rad alpha)
 (princ "\nSélectionner les polylignes optimisées.")
 (while (null (setq js (ssget '((0 . "LWPOLYLINE")))))
   (princ "\nSélection vide, ou ce ne sont pas des LWPOLYLINE!")
 )
 (command "_.ddunits"
   (while (not (zerop (getvar "cmdactive")))
     (command pause)
   )
 )
 (setq file_name (getfiled "Nom du fichier a créer ?: " (strcat (substr (getvar "dwgname") 1 (- (strlen (getvar "dwgname")) 3)) "csv") "csv" 37))
 (if (null file_name) (exit))
 (if (findfile file_name)
   (progn
     (prompt "\nFichier éxiste déjà!")
     (initget "Ajoute Remplace annUler _Add Replace Undo")
     (setq cle
       (getkword "\nDonnées dans fichier? [Ajouter/Remplacer/annUler] <R>: ")
     )
     (cond
       ((eq cle "Add")
         (setq cle "a")
       )
       ((or (eq cle "Replace") (eq cle ()))
         (setq cle "w")
       )
       (T (exit))
     )
     (setq f_open (open file_name cle))
   )
   (setq f_open (open file_name "w"))
 )
 (initget "Espace Virgule Point-virgule Tabulation _SPace Comma SEmicolon Tabulation")
 (setq key_sep (getkword "\nSéparateur [Espace/Virgule/Point-virgule/Tabulation]? <Point-virgule>: "))
 (cond
   ((eq key_sep "SPpace") (setq str_sep " "))
   ((eq key_sep "Comma") (setq str_sep ","))
   ((eq key_sep "Tabulation") (setq str_sep "\t"))
   (T (setq str_sep ";"))
 )
 (setq oldim (getvar "dimzin"))
 (setvar "dimzin" 0)
 (setq
   lst_lay-seg '()
   lst_id-seg '()
   lst_pt '()
   lst_length '()
   lst_width '()
   id 0
 )
 (repeat (setq n (sslength js))
   (setq
     obj (ssname js (setq n (1- n)))
     ename (vlax-ename->vla-object obj)
     id (1+ id)
     pt_start (vlax-curve-GetPointAtParam ename (vlax-curve-getStartParam ename))
     seg_len (vlax-curve-GetDistAtParam ename (vlax-curve-getEndParam ename))
     lst_lay-seg (cons (cdr (assoc 8 (entget obj))) lst_lay-seg)
     lst_id-seg (cons (strcat "P" (itoa id)) lst_id-seg)
     lst_pt (cons pt_start lst_pt)
     lst_length (cons seg_len lst_length)
     lst_width (cons (cdr (assoc 43 (entget obj))) lst_width)
   )
 )
 (foreach n
   (reverse
     (mapcar'list
       (append (mapcar '(lambda (x) (strcat x str_sep)) lst_lay-seg) (list (strcat "Calque" str_sep)))
       (append (mapcar '(lambda (x) (strcat x str_sep)) lst_id-seg) (list (strcat "N°" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) (mapcar 'car lst_pt)) (list (strcat "Coordonnées X" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) (mapcar 'cadr lst_pt)) (list (strcat "Coordonnées Y" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) lst_length) (list (strcat "Longueurs" str_sep)))
       (append (mapcar '(lambda (x) (strcat (rtos x) str_sep)) lst_width) (list (strcat "Largeur globale" str_sep)))
     )
   )
   (write-line (apply 'strcat n) f_open)
 )
 (close f_open)
 (setvar "dimzin" oldim)
 (prin1)
)

Modifié par bonuscad

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Bonuscad,

 

Je suis presque gènée, mais serait-il possible d'ajouter la "largeur globale" du pline. Ce n'est pas l'épaisseur assignée au calque mais bien la "largeur globale" assignée au pline.

 

Merci à l'avance...

 

Karmélie

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Bonuscad,

 

Merci encore, mais j'ai parfois le message "Erreur: Type d'argument incorrect: numbertp:nil". Et le fichier .csv est vide.

 

Puisque l'erreur n'est pas systématique, j'ai cherché et trouvé le pourquoi de cette erreur: C'est lorsqu'il y a une polyligne dont l'épaisseur n'est pas constante.

 

Peut-être pourriez-vous inscrire "variable" pour ces polylignes ou "0" si le format numérique doit être consersé?

 

Karmélie

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Karmelie,

 

j'ai cherché et trouvé le pourquoi de cette erreur: C'est lorsqu'il y a une polyligne dont l'épaisseur n'est pas constante.

C'est bien d'avoir cherché :)

Effectivement j'avais "zappé" que le code DXF 43 était absent dans ces cas là.

 

Il suffit de modifier cette ligne:

      lst_width (cons (cdr (assoc 43 (entget obj))) lst_width)

en

      lst_width (cons (if (assoc 43 (entget obj)) (cdr (assoc 43 (entget obj))) -1.0) lst_width)

 

J'ai mis -1.0 pour identifier les polylignes à largeur variable (et ainsi laissé 0.0 pour celles qui sont effectivement à zéro), mais rien ne t'empêche de mettre 0.0 si tu en as envie. (conserver le format numérique est plus simple pour moi)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

  • 9 ans après...

Bonjour,

Je ne sais pas si je peux toujours relancer le sujet puisque j'ai presque 10 ans de retard, mais j'ai à peu près le même problème que Karmélie. Je souhaite extraire en csv ou en txt les Z et les longueurs de plusieurs polylignes dans un calque, afin de les intégrer dans un code Python. 

Les liens plus haut ne sont malheureusement plus d'actualité. J'aimerai savoir où faut-il intégrer les commandes énoncés ?

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

dans un .lsp (fichier txt renommé)

apres Si tu fais du python je conseil le VBA sur autocad vu que la syntaxe y ressemble tu sera pas perdu ^^

coordinnees des points : LISTE_POINT = obj.coordinates

Z = Obj.elevation (pour polyligne2D)

sinon ce sera dans la liste de points

obj.length pour la longueur des polylignes

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

As-tu bien un AutoCAD et non AutoCAD LT ?
Si oui, alors il suffit de lire le sujet suivant concernant le chargement de codes LISP.

En lisant rapidement le code ci-dessus, je dirais que la liste des informations extraites ne correspond pas à ce que tu désires (il manque par exemple l'élévation des polylignes). Je te propose 2 solutions :
 - Réécrire un programme sur la même base pour extraire TES infos souhaitées

 - Utiliser l'outil d'Extraction de données d'AutoCAD (commande EXTRACTDONNEES ou bien le menu Outils -> Extraction de données) et suivre les indications pour extraire les propriétés de tes polylignes (Calque, Longueur, Elevation).

Bisous,
Luna

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é