Olivier Eckmann Posté(e) le 7 février 2013 Posté(e) le 7 février 2013 Bonsoir, Concernant les linéaires, l'identité visuel de l'objet se suffit à elle-même. Depuis très longtemps on sait distinguer une clôture d'un trottoir ou d'une cana sans avoir besoin d'écrire à côté ce que c'est sous forme de texte.Quand tu transformes du linéaire "DESSIN" en linéaire "SIG", en exportant, le calque, la couleur, le type de ligne et la largeur tu traites 90% des besoins.Cependant, je suis d'accord qu'il y a un manque d'automatisation pour traiter ce genre de besoin lorsque l'on essaie de rendre intelligent du dessin brut en le transformant en objet.Mais autant pour du surfacique, c'est facile de savoir si l'info est Dedans ou Dehors, autant pour du linéaire la recherche géographique "est assez près pour être considéré comme dessus" est beaucoup moins booléenne... Olivier
lili2006 Posté(e) le 7 février 2013 Auteur Posté(e) le 7 février 2013 Re, Merci Olivier pour ce complément d'infos. Bonne nuit, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
lili2006 Posté(e) le 12 février 2013 Auteur Posté(e) le 12 février 2013 Bonsoir à toutes et tous, Je manque cruellement de temps en ce moment mais pour ceux qui voudrait suivre un peu, vous pouvez également consulter ce post Merci Fabcad,;) Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
jcouaknine Posté(e) le 22 février 2018 Posté(e) le 22 février 2018 Bonjour à tous. Je relance ce "vieux post", avec potentiellement un nouveau besoin. J'ai un DWG impeccable (poly2d), et des blocs dynamiques contenant les infos que je souhaite transférer à mes polylignes.Le bloc dynamique pointe sur les poly2D, donc pas de soucis pour la distance de recherche.Mes besoins en dynamisme ont réels, car j'ai besoin de jouer sur la disposition/visibilité, ... de mes blocs d'habillage. Seulement voilà, la super-routine XdInfo2Poly d'Olivier me renvoie un message d'erreur:**************************Commande: XDINFO2POLYSélectionner une polyligne :Sélectionner un texte ou bloc (avec attribut) :Distance de recherche maxi : 1.5; erreur: type d'argument incorrect: lselsetp nil************************** Le problème provient bien du dynamisme du bloc.Lorsque le bloc est STATique, le lisp fonctionne à merveille. J'ai trouvé un lisp (UN-DYN.lsp par Gilles) qui permet de transformer un bloc DYNamique en bloc STATique, mais voilà que tous mes blocs portent désormais un nom différent. Ma question est: est-il possible d'utiliser tous les blocs STATiques (avec des noms différents) du calque d'un bloc sélectionné par le biais du lsp d'Olivier (XdInfo2Poly) ? Merci par avance pour vos regards sur le sujet.
Olivier Eckmann Posté(e) le 22 février 2018 Posté(e) le 22 février 2018 Bonjour, est-ce qu'il y a besoin de traiter aussi les blocs dynamiques en plus des blocs non dynamiques mais en ne transférant que les valeurs d'attributs, ou bien faut-il aussi "recopier" les valeurs du dynamisme (état de visibilité, paramètre Distance...) en XData? Olivier
jcouaknine Posté(e) le 22 février 2018 Posté(e) le 22 février 2018 Bonjour Olivier, OUI, il faudrait que je puisse intégrer les blocs dynamiques, et intégrer uniquement les valeurs d'attributs (les valeurs du dynamisme ne m'intéressent a priori pas du tout). Merci pour la réponse. Jean-Christophe.
Olivier Eckmann Posté(e) le 24 février 2018 Posté(e) le 24 février 2018 Bonjour Jean-Christophe, ci-joint le code modifié pour prendre en compte les blocs dynamiques (merci à LeeMac pour son code permettant de retrouver le nom réel du bloc dynamique ou statique) (defun LM:effectivename ( obj ) (vlax-get-property obj (if (vlax-property-available-p obj 'effectivename) 'effectivename 'name ) ) ) (defun C:XdInfo2Poly ( / oPoly oVlaPoly JeuPoly oInfo JeuInfo I lsInfos PT ss dDist dDistMin dDistMax ptPro lsXdata lsInfoPro sBlName) (vl-load-com) (if (not (tblsearch "APPID" "Txt2Lin")) (regapp "Txt2Lin")) (if (and (setq oPoly (car (entsel "\nSélectionner une polyligne : "))) (= "LWPOLYLINE" (cdr (assoc 0 (entget oPoly)))) (setq oInfo (car (entsel "\nSélectionner un texte ou bloc (avec attribut) : "))) (or (= "TEXT" (cdr (assoc 0 (entget oInfo)))) (and (= "INSERT" (cdr (assoc 0 (entget oInfo)))) (= 1 (cdr (assoc 66 (entget oInfo)))) (setq sBlName (LM:effectivename (vlax-ename->vla-object oInfo))) ) ) (setq sLayerInfo (cdr (assoc 8 (entget oInfo)))) (setq dDistMax (getreal "\nDistance de recherche maxi : ")) ) (progn (setq JeuPoly (ssget "x" (list (cons 0 "LWPOLYLINE") (cons 8 (cdr (assoc 8 (entget oPoly))))))) (if (= "TEXT" (cdr (assoc 0 (entget oInfo)))) (setq JeuInfo (ssget "x" (list (cons 0 "TEXT") (cons 8 sLayerInfo)))) (setq JeuInfo (ssget "x" (list (cons 0 "INSERT") (cons 8 sLayerInfo) (cons 2 (strcat sBlName ",`*U*"))))) ) (setq I 0) (setq lsInfos nil) (repeat (sslength JeuInfo) (setq lsInfo nil) (setq oInfo (ssname JeuInfo I)) (setq I (1+ I)) (setq PT (cdr (assoc 10 (entget oInfo)))) (if (= "TEXT" (cdr (assoc 0 (entget oInfo)))) (setq lsInfo (append lsInfo (list (cdr (assoc 1 (entget oInfo)))))) (progn (if (= sBlName (LM:effectivename (vlax-ename->vla-object oInfo))) (while (/= "SEQEND" (cdr (assoc 0 (entget (setq oInfo (entnext oInfo)))))) (setq lsInfo (append lsInfo (list (list (cdr (assoc 2 (entget oInfo))) (cdr (assoc 1 (entget oInfo))))))) ) ) ) ) (if lsInfo (progn (setq lsInfo (append (list PT) lsInfo)) (setq lsInfos (append lsInfos (list lsInfo))) ) ) ) (setq ss (ssadd)) (setq I 0) (repeat (sslength JeuPoly) (setq oPoly (ssname JeuPoly I)) (setq I (1+ I)) (setq oVlaPoly (vlax-ename->vla-object oPoly)) (setq dDistMin 100000000.0) (setq lsInfoPro nil) (foreach lsInfo lsInfos (setq ptPro (vlax-curve-getClosestPointTo oPoly (car lsInfo))) (setq dDist (distance (car lsInfo) ptPro)) (if (< dDist dDistMin) (setq lsInfoPro lsInfo dDistMin dDist) ) ) (if (< dDistMin dDistMax) (progn (setq lsXdata nil) (if (listp (car (setq lsInfo (cdr lsInfoPro)))) (progn (foreach sInfo lsInfo (setq lsXdata (append lsXdata (list (cons 1000 (car sInfo))))) (setq lsXdata (append lsXdata (list (cons 1000 (cadr sInfo))))) ) ) (progn (setq lsXdata (append lsXdata (list (cons 1000 "TEXT")))) (setq lsXdata (append lsXdata (list (cons 1000 (car lsInfo))))) ) ) (setq lsXdata (cons "Txt2Lin" lsXdata) ) (setq lsXdata (list (list -3 lsXdata)) ) (entmod (append (entget oPoly) lsXdata)) ) (ssadd oPoly ss) ) ) (if (> (sslength ss) 0) (sssetfirst nil ss)) ) ) ) Olivier
jcouaknine Posté(e) le 26 février 2018 Posté(e) le 26 février 2018 Bonjour, Merci Olivier pour la mise à jour qui permet bien de traiter les blocs dynamiques.Cela fonctionne très bien. Je vais continuer à peaufiner la méthode, car pour l'instant, j'ai encore du mal à automatiser (par script par exemple) XDATA to OBJECTDATA - objet par objet... Si quelqu'un a déjà réussi, je suis preneur de l'information. Bonne semaine à tous, jean-Christophe.
bonuscad Posté(e) le 26 février 2018 Posté(e) le 26 février 2018 j'ai encore du mal à automatiser (par script par exemple) XDATA to OBJECTDATA - objet par objet... Je l'ai déjà fais mais d'une manière très personnalisé, ce n'est pas une routine générique applicable sur n'importe quel dessin.Je pourrais peut être l'adapté à ton cas, mais il me faudrait un dessin (un extrait) comportant quelque entités à traiter de façon à la personnaliser à ton cas. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
jcouaknine Posté(e) le 26 février 2018 Posté(e) le 26 février 2018 Bonjour, ci-joint un extrait DWG sur lmequel le Lisp d'Olivier est bien passé. il faudrait que je puisse récupérer en OBJECTDATA (table de 1 à N records - jusqu'à 10) sur toutes les entités. A moins que je ne puisse exporter directement au format SHP par un MAPEXPORT (je ne sais pas où cocher XDATAs dans les options d'export, s'ils existent). Ci-joint un lien vers l'extrait de fichier: http://dl.free.fr/getfile.pl?file=/mdZ8ZrFR
bonuscad Posté(e) le 26 février 2018 Posté(e) le 26 février 2018 Sur l'extrait fourni, ça à l'air de fonctionner. Vérifier les résultats, je ne suis pas à l'abri de faire une boulette. A copier-coller directement en ligne de commande. ((lambda ( / js tbl n target_obj elist xd_list e_data data_lst tbldef tblstr fldnamelist fldtypelist fldnme fldtyp fld) (setq js (ssget "_X" '((0 . "LWPOLYLINE") (-3 ("Txt2Lin"))))) (cond (js (ade_oddefinetab (list (cons "Tablename" "ETIQ-STR") (cons "TableDesc" "") (cons "Columns" (mapcar '(lambda (x) (list (cons "ColName" (strcat "STRUCTURE" x)) (cons "ColDesc" "") (cons "ColType" "Character") (cons "DefaultVal" "") ) ) '("1" "2" "3" "4" "5" "6" "7" "8" "9" "10") ) ) ) ) (setq tbl "ETIQ-STR" n -1 tbldef (ade_odtabledefn tbl)) (repeat (sslength js) (setq target_obj (ssname js (setq n (1+ n))) elist (entget target_obj (list "Txt2Lin")) xd_list (cdr (assoc -3 elist)) e_data (mapcar 'cdr (cdr (car xd_list))) data_lst (mapcar '(lambda (x) (nth x e_data)) '(1 3 5 7 9 11 13 15 17 19)) tblstr (cdr (nth 2 tbldef)) fldnamelist () fldtypelist () ) (foreach fld tblstr (setq fldnme (cdr (nth 0 fld)) fldtyp (cdr (nth 2 fld)) fldnamelist (append fldnamelist (list fldnme)) fldtypelist (append fldtypelist (list fldtyp)) ) ) (ade_odaddrecord target_obj tbl) (mapcar '(lambda (x y) (ade_odsetfield target_obj tbl x 0 y)) fldnamelist data_lst ) ) ) ) )) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
jcouaknine Posté(e) le 26 février 2018 Posté(e) le 26 février 2018 Bonjour, Oui, cela fonctionne très bien a priori, pour la table txt2lin que j'ai récupérée depuis mes attributs de blocs dynamiques. Merci beaucoup, je vous tiens informé de ma mise en pratique. Jean-Christophe.
ehudry Posté(e) le 17 septembre 2019 Posté(e) le 17 septembre 2019 BonjourJe reviens sur ce post car je souhaiterais récupérer les attributs de blocs sur des polylignes afin d'avoir ces infos par la suite pour un export en shape. J'ai déjà transformer mes attributs de blocs en Xdatas à l'aide du lisp XdInfo2Poly. Je souhaiterais maintenant transformer ces Xdatas en OD, seulement je souhaiterais que le nom de champ soit celui de l'attribut de bloc qui est récupéré dans mon Xdatas et non "STRUCTURE1" par exemple comme ci-dessus. J'ai essayé de modifier un peu le code moi-même en remplaçant la ligne ("1" "2" "3" "4" "5" "6" "7" "8" "9" "10") par une autre expression afin de récupérer les "champs" xdatas 2, 4, 6, 8 ... Mais n'ayant aucune connaissance en LISP je n'ai pas réussi à obtenir quelque chose qui fonctionne. Je souhaiterais également savoir s'il est possible de ne créer comme OD de la polyligne que le nombre de d'attribut contenu dans les Xdatas de la polyligne. Cette routine LISP correspond exactement à ce dont j'ai besoin cependant afin d'exporter par la suite les différentes informations dans les bons champs sur mon SHP le nom des ODs doit correspondre à ce que j'attend. Merci d'avance pour vos réponses
Olivier Eckmann Posté(e) le 17 septembre 2019 Posté(e) le 17 septembre 2019 Bonjour, Le nom du champ peut être personnalisé au moment de l'export.Dans l'onglet données, après avoir choisi les OD à exporter, la 2ème colonne récupère par défaut le même nom que l'OD, mais on peut modifier et saisir ce que l'on veut.De plus si l'on souhaite modifier l'ordre des champs (par défaut ordre alphabétique), il faut enregistrer le profil, puis éditer le fichier .epf via le bloc note (ou mieux Notepad++) et remettre les champs dans l'ordre souhaité. Olivier
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