Aller au contenu

DONNEES ATTRIBUTAIRES SUR POLYLIGNE


lili2006

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 63
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

  • 5 ans après...

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: XDINFO2POLY

Sé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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Bonjour

Je 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

Lien vers le commentaire
Partager sur d’autres sites

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

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é