Aller au contenu

Remplacer des blocs par des points en conservant les XDATA


charlounet

Messages recommandés

Bonjour,

 

Je cherche un LISP qui remplit une fonction bien précise. J'ai fait le tour des principaux forums que je connais, mais je n'ai pas encore trouvé. Ce qui m'amène ici.

Auriez-vous sous la main un LISP qui transforme les blocs en points, tout en conservant les XDATA (c'est-à-dire que le point récupère les XDATA du bloc qu'il remplace) ?

J'ai trouvé un début de réponse ici, avec le LISP de David Bethel :

http://www.cadtutor.net/forum/showthread.php?37799-Convert-block-to-point&p=250078&viewfull=1#post250078

Mes connaissances en programmation se limitent à du langage style BASIC, j'avoue avoir du mal à modifier un tel code...

 

J'ai pensé un moment à remplacer tous les blocs (contenant des polylignes) par un bloc avec un point, mais ça me pose problème par la suite dans la manière dont je traite mes données, en vue d'une intégration dans un SIG.

 

Merci pour votre attention.

Lien vers le commentaire
Partager sur d’autres sites

Oui, je connais bien les fonctions spécifiques d'AutoCAD Map 3D avec les import/export SHP, la gestion des Object Data, et j'ai souvent utilisé le fameux LISP XD2OD qui circule dans les parages. Mais mon environnement de travail a changé et j'utilise désormais BricsCAD v13 pour créer des DXF que j'envoie ensuite dans QGIS. Je récupère ainsi mes XDATA dans la table attributaire (chose que je ne peux pas faire avec des Object Data). Tous les tracés sont correctement importés, sauf les blocs qui ne sont pas reconnus (ni en tant que points, ni en tant que tracés). D'où mon idée de les transformer en points avant de créer un DXF pour QGIS.

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

1) BRAVO : rares sont les gens qui connaissent et utilisent la routine XD2OD avec AutoCAD MAP (ou AutoCAD CIVIL) !

 

2) SVP tu utilises quelle version de QGIS exactement ?

SVP tu peux me confirmer que ton QGIS recupere parfaitement" les XDATAs sur :

- les points graphiques ?

- lignes, arcs, polylignes 2D ?

- les blocs ne sont jamais "reconnus"

 

Est ce que ton QGIS voit les differentes applications XDATA

OU BIEN voit il en vrac TOUS les XDATAs de toutes les applications XDATA ??

 

3) La routine que tu demandes m'interesse AUSSI ! ... Mais SVP je vais reformuler le CDC/CCTP :

 

A - A partir d'une selection AutoCAD classique ...

B - Poser une question : Traiter les XDATAs OU les Attributs ?

Ainsi si necessaire en 2 passes, on pourra avoir en XDATA : les XDATAs du Bloc ET les Attributs du Bloc !

C - Ne retenir dans la selection que les Blocs (statiques + dynamiques)

D - Creer un point graphique XYZ (sur le calque courant) avec en XDATA de type "string"

- soit les XDATAs du Bloc (En fait on copie les XDATAs existants)

- soit le contenu des N attributs dans des champs XDATA de type string

Contenu du string : "ATT___NomEtiquette___xxxxxxxx" - xxxxxx = vrai contenu de l'attribut

Ainsi on pourra modifier la routine suivant les besoins de contenu ...

E - On boucle sur le Bloc suivant ...

 

Merci d'avance aux Pros du Lisp/VLisp !

 

Bye, Bon Dimanche, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

Un exemple qui permet de transférer les xdatas d'un bloc sur un point.

Toutefois, il faut faire attention car le point créé à un nouvel identifiant par rapport au bloc, ce qui peut poser problème pour les xdatas (références à un identifiant qui n'existe plus par exemple).

Ne connaissant pas la structure des xdatas, difficile de faire mieux, comme de répondre à la demande de lecrabe de transférer les attributs dans les xdatas du point.

Un petit xdlist (des express) concernant les valeurs des attributs à transférer dans les xdatas permettait d'y voir plus clair.

 

(defun c:pbl(/ js n pt)
 (and (setq js (ssget '((0 . "insert"))))
   (progn
     (setq n 0)
     (while (setq pt (ssname js n))
(entmake (append '((0 . "POINT"))
		 (vl-remove-if '(lambda(x)(vl-position (car x) '(-1 0 2 5 41 42 43 44 45 70 71 100 270 330))) (entget pt '("*")))
	 )
)
(setq n (1+ n))
(entdel pt)
     )
   )
 )
 (princ)
)

 

@+

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

Ecrit rapidement pour répondre à la demande initiale de charlounet

 

((lambda ( / js n ent dxf_ent xd_list nw_dxf)
 (setq js (ssget "_X" (list (cons 0 "INSERT") (if (getvar "CTAB") (cons 410 (getvar "CTAB")) (cons 67 (- 1 (getvar "TILEMODE")))))))
 (cond
   (js
     (repeat (setq n (sslength js))
       (setq
         ent (ssname js (setq n (1- n)))
         xd_list (assoc -3 (setq dxf_ent (entget ent (list "*"))))
         nw_dxf
         (list
           (cons 10 (trans (cdr (assoc 10 dxf_ent)) ent 0))
           (cons 0 "POINT")
         )
       )
       (foreach i '(6 8 39 48 62 210)
         (if (assoc i dxf_ent)
           (setq nw_dxf (cons (cons i (cdr (assoc i dxf_ent))) nw_dxf))
         )
       )
       (entmake
         (append
           (reverse nw_dxf)
           (if xd_list (list xd_list) '())
         )
       )
       (entdel ent)
     )
   )
 )
 (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 à tous,

 

1) BRAVO : rares sont les gens qui connaissent et utilisent la routine XD2OD avec AutoCAD MAP (ou AutoCAD CIVIL) !

 

2) SVP tu utilises quelle version de QGIS exactement ?

SVP tu peux me confirmer que ton QGIS recupere parfaitement" les XDATAs sur :

- les points graphiques ?

- lignes, arcs, polylignes 2D ?

- les blocs ne sont jamais "reconnus"

 

Est ce que ton QGIS voit les differentes applications XDATA

OU BIEN voit il en vrac TOUS les XDATAs de toutes les applications XDATA ??

 

3) La routine que tu demandes m'interesse AUSSI ! ... Mais SVP je vais reformuler le CDC/CCTP :

 

A - A partir d'une selection AutoCAD classique ...

B - Poser une question : Traiter les XDATAs OU les Attributs ?

Ainsi si necessaire en 2 passes, on pourra avoir en XDATA : les XDATAs du Bloc ET les Attributs du Bloc !

C - Ne retenir dans la selection que les Blocs (statiques + dynamiques)

D - Creer un point graphique XYZ (sur le calque courant) avec en XDATA de type "string"

- soit les XDATAs du Bloc (En fait on copie les XDATAs existants)

- soit le contenu des N attributs dans des champs XDATA de type string

Contenu du string : "ATT___NomEtiquette___xxxxxxxx" - xxxxxx = vrai contenu de l'attribut

Ainsi on pourra modifier la routine suivant les besoins de contenu ...

E - On boucle sur le Bloc suivant ...

 

1) MERCI : tout le mérite revient néanmoins à la personne qui a écrit ce LISP !

 

2) J'utilise QGIS 2.10 et 2.12, seules les versions récentes prennent en compte les ExtendedEntity.

Je peux confirmer que QGIS récupère les XDATA sur les lignes, les polylignes (2D/3D) et les points. Arcs et splines : pas testé...

Quand aux applications XDATA, QGIS les voit toutes mais il met tout dans une seule colonne.

ATTENTION : les noms des applications n'apparaissent pas, mais les accolades sont présentes (ça aide un peu).

 

La première image-jointe montre ce qu'on obtient quand on importe un DXF avec des blocs :

Je n'ai jamais réussi à en tirer quelquechose. Ni les coordonnées, ni les XDATA. RIEN !

 

La seconde image-jointe est un aperçu des données dans la table lorsqu'on importe le DXF :

Ici, les accolades n'apparaissent pas car j'ai viré tous les codes 1002 dans le DXF (en mode ASCII).

Le tableau n'est pas modifiable sous cette forme, j'exporte en SHP en sélectionnant d'après certains calques, etc.

 

3) Merci d'avoir reformulé ma demande !

Pour ma part, les XDATA suffisent, il n'y a pas d'attribut sur mes blocs. Mais pour d'autres personnes/d'autres besoins, c'est une idée à retenir.

 

 

Peux tu développer un peu cette partie STP ?

 

Merci d'avance,

 

PS: CF ce post

 

Ah oui, c'est assez proche de ma méthode ! Je fais également "Couche"-> "Ajouter une couche"-> "Ajouter une couche vecteur..." et je récupère mes tracés (et mes XDATA). Je vais bientôt convertir certaines polylignes en polygones, si j'ai bien compris je vais avoir des surprises !?! Dans ce cas, on se croisera bientôt sur le sujet que tu m'as indiqué ;)

 

 

[...]

Un petit xdlist (des express) concernant les valeurs des attributs à transférer dans les xdatas permettait d'y voir plus clair.

[...]

 

XDLIST sur un bloc retourne ceci :

* Registered Application Name: TABLE_UE

* Code 1000, ASCII string: 2681

* Code 1000, ASCII string: Lithique

* Code 1000, ASCII string: 6439

* Code 1000, ASCII string: 20151001

* Code 1000, ASCII string: Geispolsheim

* Code 1000, ASCII string: 67152

Je n'ai qu'une seule application et tout est du "string". Comme je disais plus haut, j'ai viré tous les codes 1002 à partir du DXF car ils me gênent un peu par la suite...

 

Et surtout : un grand merci pour ton aide Patrick_35, merci également à bonuscad, grâce à vous mes blocs se transforment facilement en points et mes données sont intactes. J'ai testé les 2 solutions et tout me semble bon. Je vais les utiliser de manière intensive dans les prochains temps, si je note quelquechose de suspect je reviendrai vous embêter :D

 

@+

post-63609-0-67108900-1455005291_thumb.png

post-63609-0-54534000-1455005311_thumb.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

Pour répondre à la demande du crabounet

(defun c:pbl(/ dat dx1 dx2 def dxf js n pt rep txt lst_att lst_dxf)

 (defun lst_dxf(dxf)
   (vl-remove-if '(lambda(x)(vl-position (car x) '(-1 0 2 5 41 42 43 44 45 70 71 100 270 330))) dxf)
 )

 (defun lst_att(blo)
   (mapcar '(lambda(x) (cons 1000 (vla-get-textstring x))) (vlax-invoke (vlax-ename->vla-object blo) 'getattributes))
 )

 (or (setq def (getenv "Patrick_35_pbl"))
   (setq def "X")
 )
 (cond
   ((eq def "X")
     (setq txt "Xdatas")
   )
   ((eq def "A")
     (setq txt "Attributs")
   )
   (T
     (setq txt "Les deux")
   )
 )
 (initget "X A L")
 (or (setq rep (getkword (strcat "\nSouhaitez-vous trairer [Xdatas/Attributs/Les deux] <" txt "> : ")))
   (setq rep def)
 )
 (and (setq js (ssget '((0 . "insert"))))
   (progn
     (setq n 0)
     (while (setq pt (ssname js n))
(setq dx1 (entget pt)
      dx2 (entget pt '("*"))
      dat (cdr (assoc -3 dx2))
)
(cond
  ((eq rep "X")
    (setq dxf (lst_dxf dx2))
  )
  ((eq rep "A")
    (setq dxf (lst_dxf dx1))
    (and (eq (cdr (assoc 66 dx1)) 1)
      (setq dxf (append dxf (list (cons -3 (list (cons (if dat (caar dat) "Patrick_35") (append '((1002 . "{")) (lst_att pt) '((1002 . "}")))))))))
    )
  )
  (T
    (setq dxf (lst_dxf dx1))
    (if dat
      (setq dxf (append dxf (list (cons -3 (list (cons (caar dat) (append (reverse (cdr (reverse (cdar dat)))) (lst_att pt) '((1002 . "}")))))))))
      (setq dxf (append dxf (list (cons -3 (list (cons "Patrick_35" (append '((1002 . "{")) (lst_att pt) '((1002 . "}")))))))))
    )
  )
)
       (entmake (append '((0 . "POINT")) dxf))
       (entdel pt)
       (setq n (1+ n))
     )
   )
 )
 (setenv "Patrick_35_pbl" rep)
 (princ)
)

 

Juste une précision. Si on décide d'utiliser l'option attribut et qu'il n'y a pas de xdatas dans le bloc, le nom de l'application sera "Patrick_35". Donc à modifier au besoin.

 

@+

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

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é