Aller au contenu

Comment exploiter les MARQUEURS DE POSTION


rebcao

Messages recommandés

Bonjour à Toutes et à Tous,

 

Comment peut-on exploiter (EXPORTER) les données LATITUDE - LONGITUDE présentes dans les PROPIETETES de l'objet ?

 

SI on essaye en LISP visiblement rien ? c'est sans des XDATAS?

 

Même dans l'EXTRACTION DE DONNES il n'y aucune trace de ces données !!!

 

(voir fichier joint)

 

Je vous remercie, Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

 

Bon si je comprend bien la demande, tu souhaites exporter (fichier .csv, tableau AutoCAD, ... ?) les positions géographiques d'un ensemble de Marqueurs de position en associant les coordonnées géographiques au nom du marqueur, c'est bien cela ?

Ne pouvant pas vraiment répondre sur le forum AutoDesk, et en reprenant les points de la discussion, le LISP ne permet pas de récupérer les valeurs de longitude et latitude de l'objet de manière directe (que se soit la liste DXF obtenue via (entget) ou les propriétés de l'objet via (getpropertyvalue)...) donc le Visual Lisp semble la solution la plus adéquat.

 

En passant par (vlax-dump-object), on retrouve bien les propriétés que l'on cherche "Latitude" et "Longitude" sous format string.

Donc ces propriétés peuvent facilement être récupérable via

(setq name (vlax-ename->vla-object (car (entsel))))
(setq lon (vla-get-Longitude name))
(setq lat (vla-get-Latitude name))

 

Ensuite on peut exploiter ces données soit en passant par la liste DXF de l'objet et le code 1 pour associer le nom du marqueur aux coordonnées (attention, la liste DXF de l'objet POSITIONMARKER possède 2 listes pointées au code 1, et celle qui nous intéresse est la seconde donc penser à faire (cdr (assoc 1 (reverse (entget name)))) pour avoir la bonne valeur), soit via la même fonction (vla-get-Textstring name) et ensuite exporter cela sous le format souhaité.

Faut-il donc exporter ces valeurs dans un champ ou bien un fichier .csv ?

 

A savoir qu'il n'y a pas forcément besoin de programmation pour définir un champ directement dans AutoCAD car avec un champ objet, on peut récupérer les propriétés Latitude, ou Longitude directement et semble s'écrire de la manière :

%<\AcObjProp Object(%<\_ObjId 3227242304>%).Latitude>%

Ainsi, le problème se pose plutôt dans l'obtention de cet ObjId afin de lier le bon marqueur avec le bon champ. Pour ce point, je manque de réponses car je m'y suis déjà pencher mais je n'ai pas vraiment eu le temps de fouiller correctement donc les adeptes de Visual LISP devraient pouvoir le savoir (je doute que cette ID soit facilement récupérable en LISP vanilla, s'il est récupérable).

Le champ peut ainsi être contenu dans n'importe quel objet affichant un texte (MTEXT, TEXT, ATTRIBUT, ...) permettant d'être à jour en cas de modifications et la récupération de l'ObjectID n'est nécessaire que dans le cas d'un traitement de plusieurs Marqueurs pour éviter la liaison des données à la mano qui est tout à fait faisable également en insérant un champ "Latitude" et "Longitude" en sélectionnant le marqueur lié. :3

 

Cela correspond bien à ta demande, ou bien me suis-je égarée ?

 

Bisous, Luna

Modifié par Luna
Lien vers le commentaire
Partager sur d’autres sites

Il y a également moyen de récupérer ces propriétés en fouillant un peu plus les listes DXF mais le code est un peu plus long si jamais il y a besoin de passer par du LISP vanilla :

(setq name (car (entsel)))
(setq coor (cdr (assoc 304 (entget (cdr (assoc -2 (entget (cdr (assoc 360 (reverse (entget (cdr (assoc 330 (entget name))))))))))))))
(setq lat (substr coor 1 (vl-string-position (ascii "\\") coor)))
(setq lon (substr coor (+ 2 (vl-string-position (ascii "P") coor))))

 

Voili voilou, c'est tout ce que j'ai pu trouvé...

 

Bisous, Luna

Lien vers le commentaire
Partager sur d’autres sites

En réponse à rebcao

Super Merci le Retraité :visage_souriant_avec_des_yeux_en_forme_de_cœur:

 

ça marche, exactement ce qu'il me fallait...

 

Le Saint-Nicolas va t'amener le Chocolat et le Père Fouettard te donnera la fessée...

 

Par contre j'ai essayé de récupérer la valeur de POSITION... Et il me donne ça : #<variant 8197 ...>

 

Je pensais obtenir la liste du point : (775478.0 6.26975e+06 0.0) comme dans la liste de CHAMPS...

 

; ObjectName (RO) = "AcDbGeoPositionMarker"

; OwnerID (RO) = 43

; PlotStyleName = "ByLayer"

; Position = (775440.0 6.26973e+06 0.0)

; Radius = 1.0

; Rotation = 2.35619

 

Christian

 

Le visual LISP est quelque peu particulier et les listes ne sont pas réellement sous forme de liste comme en vanilla, mais sous forme de #<safearray...> et les valeurs quelconques sous forme de #<variant...> mais mes compétences en Visual sont très limitées (car inexistantes :3 ). Personnellement, la propriété de position n'a pas vraiment besoin de Visual LISP pour être récupérée, puisqu'elle est directement lisible via la liste DXF (entget name) associée au code DXF 10 sous forme de liste donc plus rapidement exploitable pour un programme basé sur le langage vanilla.

 

Autrement, pour répondre à cette question précisément il faudrait écrire ceci :

(vlax-safearray->list (vlax-variant-value (vla-get-position name)))

Et là tu retrouves ta liste de coordonnées comme souhaitée. (ici name correspond au nom VLA-Object du marqueur, donc après la conversion (vlax-ename->vla-object (car (entsel))) !)

 

Chat commence à devenir compliqué si les sujets s'étendent sur plusieurs forums à la fois ^^"

 

Bisous,Luna

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Avec Visual LISP, il y a souvent moyen d'accéder directement à une liste LISP en utilisant : (vlax-get object 'Property) à la place de : (vla-getProperty object). Voir ce sujet.

Exemple :

(vlax-get name 'Position)

 

On peut aussi utiliser la bibliothèque AutomationHelpers en bas de cette page.

Exemple :

(gc:VariantToLispData (vla-get-position name))

 

En ce qui concerne les champs, on obtient l'ObjectId sous forme de chaîne (string) avec la fonction vla-GetObjectIdString.

Exemple:

(vl-load-com)
(or *acad* (setq *acad* (vlax-get-acad-object)))
(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
(or *util* (setq *util* (vla-get-Utility *acdoc*)))

(defun c:GEOPOS (/ ent obj pt ms id)
 (and
   (setq ent (car (entsel)))
   (setq obj (vlax-ename->vla-object ent))
   (= (vla-get-ObjectName obj) "AcDbGeoPositionMarker")
   (setq pt (getpoint "\nPoint d'insertion: "))
   (setq ms (vla-get-Modelspace (vla-get-ActiveDocument (vlax-get-acad-object))))
   (setq id (vla-GetObjectIdString *util* obj :vlax-false))
   (vla-AddMText
     (vla-get-Modelspace *acdoc*)
     (vlax-3d-point (trans pt 1 0))
     0.
     (strcat
"Latitude : "
"%<\\AcObjProp Object(%<\\_ObjId "
id
">%).Latitude>%"
"\\PLongitude : "
"%<\\AcObjProp Object(%<\\_ObjId "
id
">%).Longitude>%"
      )
   )
 )
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à Toutes et à Tous,

 

Tout d'abord je vous demande d'excuser cette réponse tardive, et je tiens à remercier le "Jeune Retraité" Le TouLouLou, qui a fait le relais de vos réponses sur le Forum AUTODESK ! En effet, CADXP n'a envoyé aucune notification de vos réponses.

 

Merci à Luna et à Gilles pour toutes ces précisions.

 

Luna, en ce qui concerne les CHAMPS, cette commande ne permet pas une modification aisée ! Je parle de la commande standard INSERER un CHAMP... sans bien sur, encore une fois utiliser un PROGRAMME qui contourne les défauts de la commande CHAMPS...

 

Mais une fois de plus les développeurs AUTODESK ont été particulièrement inspirés lorsqu'ils ont inventé cet objet : MARQUEUR DE POSITION !!!!! Une sorte de LIGNE DE REPERE avec un TEXTE MULT aux PROPRIETES (style de texte) FORCEEES !!!

 

Merci.

 

Christian

Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...

cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)

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é