charlounet Posté(e) le 5 février 2016 Partager Posté(e) le 5 février 2016 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#post250078Mes 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 More sharing options...
lecrabe Posté(e) le 5 février 2016 Partager Posté(e) le 5 février 2016 Hello Tu parles de SIG ... N'aurais tu pas un AutoCAD MAP (ou AutoCAD CIVIL) par hazard ? Et non pas un AutoCAD "classic" ! Bye, lecrabe Autodesk Expert Elite Team Lien vers le commentaire Partager sur d’autres sites More sharing options...
charlounet Posté(e) le 5 février 2016 Auteur Partager Posté(e) le 5 février 2016 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 More sharing options...
lecrabe Posté(e) le 7 février 2016 Partager Posté(e) le 7 février 2016 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 More sharing options...
lili2006 Posté(e) le 7 février 2016 Partager Posté(e) le 7 février 2016 Bonjour à toutes et tous, charlounet, des DXF que j'envoie ensuite dans QGIS Peux tu développer un peu cette partie STP ? Merci d'avance, PS: CF ce post Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 8 février 2016 Partager Posté(e) le 8 février 2016 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 PatrickLe 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 More sharing options...
bonuscad Posté(e) le 8 février 2016 Partager Posté(e) le 8 février 2016 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 More sharing options...
charlounet Posté(e) le 9 février 2016 Auteur Partager Posté(e) le 9 février 2016 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: 67152Je 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 @+ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Patrick_35 Posté(e) le 9 février 2016 Partager Posté(e) le 9 février 2016 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 PatrickLe 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 More sharing options...
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant