banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Mon 13 November 2017 10:38

yoann
Participant actif
Lieu: Grenoble
Date d'inscription: 19 Sep 2005
Messages: 120

[MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Salut,

Savez-vous si il est possible de renseigner des champs de données d'objet (OD) avec des infos géométriques des objets ?
Dans mon cas précis je souhaite renseigner le XY réel des objets dans mes champs XY en OD.
Idem pour les angles de mes blocs....

Je vois déjà Pat me dire "facile", tu exportes en SHP (en incluant la géométrie X1Y1), et tu réimportes tes SHP en faisant matcher les champs ...
Mais le problème avec l'import/export SHP c'est que je perds toutes les orientations de mes blocs...

En parlant d'orientation de symboles, quelle est la conversion entre une orientation classique d'AutoCAD (grades, sens horaire, angle de base nord 300g) et celle récupérée dans un SHP sous ArcGis ? Ca ne marche jamais, mes symboles sont jamais dans le bon sens...

Des idées ?

Merci d'avance, Yoz

Hors ligne

 

#2 Mon 13 November 2017 12:53

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4792

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Hello Yoann

Mais le MAPEXPORT en SHP des Objets Ponctuels de type Bloc/Symbole, inclus les Coords XY
et l'Angle (En Radians, je sais) qu'il faut rajouter manuellement  ! ... Donc je ne te suis pas bien !?

En plus comme tu le sais, lors du MAPEXPORT, tu peux ajouter "a la volee"  les champs reels/flottants: XY, XYZ, Angle/Rotation, Echelle/Scale, Attributs; ODs, etc ...

Ou alors desires tu avoir en OD (sur tes Blocs) des champs reels/flottants avec: le XY/XYZ, l'Angle/Rotation, le facteur d'Echelle X, etc ?
Ainsi tu es "autonome" !

Merci de tes precisions, GeoBye, Pat


(Autodesk Expert Elite Team)

Hors ligne

 

#3 Mon 13 November 2017 13:28

yoann
Participant actif
Lieu: Grenoble
Date d'inscription: 19 Sep 2005
Messages: 120

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Hello Pat,

En fait j'ai relevé des éléments en précision centimétrique. Ces éléments je dois les adapter graphiquement (déplacé/orienté) sur mon fond de plan actuel (PCI), mais conserver en attribut (OD) la position réelle exacte pour une utilisation future sur le PCRS.

Donc te top ca serait d'avoir en permanence le XY "réel" et le XY "graphique" stockés en OD et mis à jour en temps réel. I have a dream smile

Concernant l'orientation, je dois avoir des degrés décimaux en entrée dans ArcGis (donc dans mes shp). Une astuce bricolée à la mano, c'est de mettre mon dessin en degrés décimaux, sens anti-horaire, direction Est (0)..... et je recopie la valeur de la rotation graphique dans mon champ OD "angle"....

Je sais pas si c'est plus clair ???

A+

Hors ligne

 

#4 Mon 13 November 2017 13:34

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4792

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Hello

Donc si j'ai bien compris, il te faudrait 2 routines Lisp/VLisp qui transferent dans des champs ODs prealablement definis AVANT sur tes Blocs :

*** Routine du genre "ODMAJXYZ"
- 2/3 champs OD (XORG, YORG, ZORG) avec le XY/XYZ d'Origine et donc apres tu ne touches plus a ces champs ODs
Ce qui ne t'empechera pas de deplacer le Bloc ...

*** Routine du genre "ODMAJANGLEDEG"
- 1 champ OD ANGLEDEG qui est remis a jour chaque fois que tu relances la routine ...
Avec l'Angle/Rotation en Mode Math/Trigo : ZERO a l'Est, Sens Trigo (Anti-Horaire), Degres decimaux

Tu lances ces Routines quand tu veux ! ... Il suffit d'avoir les champs OD voulus reels/flottants definis sur tes Blocs !

J'ai plusieurs routines "plus ou moins" similaires que j'execute AVANT de faire un MAPEXPORT !
Par exemple Aire/Long sur mes Polylignes ...
( Ainsi j'ai en OD l'Aire/Long a un instant donne de la Polyligne, qui peut etre different de l'Aire/Long graphique d'AutoCAD )

GeoBye, Pat


(Autodesk Expert Elite Team)

Hors ligne

 

#5 Mon 13 November 2017 17:09

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4792

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Hello

Voir ci-apres une Routine Lisp/VLisp (A executer "quand" tu veux !?) qui transfere/copie les Coords du Point d'Insertion des Blocs selectionnes dans 3 champs OD specifiques d'une Table OD specifique ... Routine OK sur ACAD MAP 2015-2018 et sans doute aussi sur versions anterieures ...

Voir en debut de Routine la variable pour le Nom de la Table OD et les 3 variables pour les 3 Noms de champ OD XYZ (Reel/Flottant)

****** ATTENTION: AUCUNE Gestion d'Erreur ****** MERCI a Bruno & Gilles

Je l'utilise de temps en temps pour justement STOCKER les Coords XYZ de mes Blocs avant EVENTUEL deplacement ulterieur !

Si Bruno et/ou Gilles passent dans les Environs !?

J'espere que cela te sera UTIL et peut etre que tu veux la meme chose avec un champ OD de Rotation/Angle ??

GeoBye, Pat


<<< Debut Routine Lisp/VLisp >>>

;;
;; http://forums.autodesk.com/t5/visual-li … 73#M328535
;;
;; Routine de DEPART =  Z2_ODField_Height  par CADaStroumph  pour MAP & CIVIL
;; Recuperation du code DXF 38 des Polylignes (Elevation / Z) dans la variable: Z_PL
;; et affectation de Z_PL dans le champ/field OD "Height" de la Table "OD_Table"
;;
;; Adaptation par Patrice BRAUD pour avoir les Coords XYZ du Point d Insertion des Blocs (ATTENTION aux XREFs DWG)
;;
;; NOUVELLE Routine :  ODField__XYZ
;;
;; <<< Routine testee seulement dans le SCG et dans l'Onglet OBJET >>>
;;
;; ****** ATTENTION: AUCUNE Gestion d'Erreur ****** MERCI a Bruno & Gilles
;;
;; Alerte 1 : La Table OD et les 3 Champs OD NECESSAIRES doivent DEJA exister sur les Blocs selectionnes !
;; Alerte 2 : La Routine filtre simplement sur les Objets "INSERT" DONC on risque de selectionner les XREFs DWG !
;; Alerte 3 : Ne pas selectionner des Objets verrouilles !
;;
;; --- Interrogation Entite/Objet en Lisp : (entget (car (entsel)) '("*"))
;; Commande: (setq a '(1 2 3)) ---> (1 2 3)
;; Commande: (setq x (car a))  ---> 1    (setq y (cadr a)) ---> 2    (setq z (caddr a)) ---> 3
;;
;; Calque          - assoc  8 :  (8 . "R_ASS")
;; XYZ (Bloc)      - assoc 10 :  (10  639715.0  140210.0  0.0)
;; Rotation (Bloc) - assoc 50 :  (50 . 3.14159)  Pi  3.14 = 180 degres   (50 . 0.785398)  Pi/4 = 45 degres
;; ELEV            - assoc 38 :  (38 . 10.0)
;; Pol Ouverte     - assoc 70 :  (70 . 0)
;; Pol Fermee      - assoc 70 :  (70 . 1)
;;
;; ****** ATTENTION: AUCUNE Gestion d'Erreur ****** MERCI a Bruno & Gilles
;;

(vl-load-com)

(defun C:ODField__XYZ ( / js_pl n_pl ent dxf_ent   TABLE_OD  XOD  YOD  ZOD  PTXYZ  PX  PY  PZ)

;;; On va utiliser les champs OD reels/flottants :  XORG , YORG , ZORG  de la Table OD "TABLEXYZ" ...
(setq TABLE_OD "TABLEXYZ") ;;  <--- Votre Nom de table OD --->

;;; Veuillez modifier ci-dessous en fonction de VOS champs OD pour X Y Z
(setq XOD "XORG")
(setq YOD "YORG")
(setq ZOD "ZORG")   ;; --- SUPPRIMER Eventuellement ---

  (setq js_pl (ssget '((0 . "INSERT")     (100 . "AcDbEntity") (67 . 0) (410 . "Model") (100 . "INSERT")       )) )

  (cond
    (js_pl
      (repeat (setq n_pl (sslength js_pl))
        (setq ent (ssname js_pl (setq n_pl (1- n_pl))))
        (setq dxf_ent (entget ent))

;;; Par Patrice : Recuperation dans la liste PTXYZ des Coords du Point d Insertion XYZ
        (setq PTXYZ (assoc 10 dxf_ent) )
        (setq PX (cadr    PTXYZ) )
        (setq PY (caddr   PTXYZ) )
        (setq PZ (cadddr  PTXYZ) )   ;; --- SUPPRIMER Eventuellement ---

          (progn
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;; Affectation des 3 Champs OD par les Coords d Insertion XYZ du Bloc
;;;;;; dans le Champ OD  xxx  &  Record ZERO
            ( ade_odsetfield  ent  TABLE_OD  XOD  PX  0  PX )
            ( ade_odsetfield  ent  TABLE_OD  YOD  PY  0  PY )
            ( ade_odsetfield  ent  TABLE_OD  ZOD  PZ  0  PZ )   ;; --- SUPPRIMER Eventuellement ---
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          )
        )
      )
    )

(princ)
)

<<< Fin Routine >>>


(Autodesk Expert Elite Team)

Hors ligne

 

#6 Tue 14 November 2017 16:10

yoann
Participant actif
Lieu: Grenoble
Date d'inscription: 19 Sep 2005
Messages: 120

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Salut,

Merci Pat pour l'exemple de Lisp... et en effet si tu as la même chose pour traiter les angles en degrés smile

Concernant la routine sur les XYZ, si j'ai bien compris :

- Dans ma table existante, je rajoute 2 champs (Xréel/Yréel) qui correspondent aux XY réels levés (GPS).

- Je lance une première fois mon lisp pour remplir Xréel/Yréel, et après je ne touche plus à ces champs. Mais je peux continuer à déplacer mes blocs si besoin pour coller au cadastre par exemple

- Quand j'exporte en SHP, je rajoute donc les OD (j'aurai donc Xréel/Yréel) et j'ajoute manuellement X1Y1 correspondant à la position graphique (dessinée).

Et idem pour les angles (sauf que pour les angles je n'ai pas la notion d'angle réel, en gros je ne dois récupérer que l'OD angle en degrés.....

c'est bien ça ?

A+

Hors ligne

 

#7 Tue 14 November 2017 16:28

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4792

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Hello

1) YES et SVP tu supprimes dans la Routine LSP les 3 lignes correspondants a la Coord Z (dont tu n'as pas besoin !)
Voir les lignes (que j'ai modifiees) :   ;; --- SUPPRIMER Eventuellement ---

2) SVP (si possible) PAS de Nom de Table OD et Nom de Champ OD avec des Accents : XREEL et non pas XRéel
( SAUF si tu es vraiment oblige ! )

3) Pour le probleme d'Angle/Rotation des Blocs, j'imagine que tu as eventuellement besoin d'un Champ OD (Reel/Flottant) BLOCANGLE
qui est remis a jour par une Routine LSP quand tu la lances !? ... Et APRES tu fais un MAPEXPORT ...

MAIS a priori, tu as deja un contournement pour le probleme d'Angle/Rotation des Blocs !?

Si je me souviens bien, c la propriete AutoCAD nommee "ANGLE" ou "ROTATION" que tu dois exporter (lors du MAPEXPORT) mais le resultat obtenu est en RADIANS donc il faut convertir dans QGIS / ArcGIS / etc  : (ANGLERAD * 180.0) / 3.14159 )

GeoBye, Pat


(Autodesk Expert Elite Team)

Hors ligne

 

#8 Tue 14 November 2017 16:34

yoann
Participant actif
Lieu: Grenoble
Date d'inscription: 19 Sep 2005
Messages: 120

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

1) OK

2) OK, je sais bien pour les accents smile

3) Pour les angles, de quel contournement parles-tu ?

@+

Hors ligne

 

#9 Tue 14 November 2017 17:02

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4792

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Hello "Vil Grenoblois"

En terme de contournement, tu racontes >>>
Une astuce bricolée à la mano, c'est de mettre mon dessin en degrés décimaux, sens anti-horaire, direction Est (0) ...
et je recopie la valeur de la rotation graphique dans mon champ OD "angle"... <<<

Q1) Cela signifie t-il que tu fais cette Manipulation Objet par Objet ??

Q2) As tu imperativement besoin d'une valeur en mode Math/Trigo donc en Degres Decimaux + ZERO a l'Est ??

GeoBye, Pat ("Vil Forezien")


(Autodesk Expert Elite Team)

Hors ligne

 

#10 Tue 14 November 2017 17:07

yoann
Participant actif
Lieu: Grenoble
Date d'inscription: 19 Sep 2005
Messages: 120

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Ola Vil Forezien !

Q1) Cela signifie t-il que tu fais cette Manipulation Objet par Objet ??
==> bah oui.... sad

Q2) As tu imperativement besoin d'une valeur en mode Math/Trigo donc en Degres Decimaux + ZERO a l'Est ??
==> c'est la seule façon pour que les angles récupérés soient corrects sous ArcGis ...

Hors ligne

 

#11 Wed 15 November 2017 10:51

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4792

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Hello

1) Voici donc la routine voulue ...

2) Tu la fais tourner sur TOUS les Blocs concernes -- Ayant la/les Bonne(s) Table(s) OD et le/les Bon(s) Champ(s) OD -- AVANT de faire le MAPEXPORT auquel tu ajouteras (entre autres champs) le bon Champ OD (MaJ par la Routine "ODField__ANGLEDEGRE") avec l'Angle de Rotation en DEGRES !

3) Tu pourras verifier avant de faire le MAPEXPORT que le Champ OD VOULU a la bonne valeur en DEGRES !!

GeoBye, Pat


<<< Debut Routine Lisp/VLisp >>>

;;
;; http://forums.autodesk.com/t5/visual-li … 73#M328535
;;
;; https://georezo.net/forum/viewtopic.php … 35#p301835
;;
;; Routine de DEPART =  Z2_ODField_Height  par CADaStroumph  pour MAP & CIVIL
;; Recuperation du code DXF 38 des Polylignes (Elevation / Z) dans la variable: Z_PL
;; et affectation de Z_PL dans le champ/field OD "Height" de la Table "OD_Table"
;;
;; Adaptation par Patrice BRAUD pour avoir l'angle (de Rotation) en Degres des Blocs (ATTENTION aux XREFs DWG)
;;
;; NOUVELLE Routine : ODField__ANGLEDEGRE
;;
;; <<< Routine testee seulement dans le SCG et dans l'Onglet OBJET >>>
;;
;; Alerte 1 : La Table OD et les x Champs OD NECESSAIRE(s) doivent DEJA exister sur les Blocs selectionnes !
;; Alerte 2 : La Routine filtre simplement sur les Objets "INSERT" DONC on risque de selectionner les XREFs DWG !
;; Alerte 3 : Ne pas selectionner des Objets verrouilles !
;;
;; ****** ATTENTION: AUCUNE Gestion d'Erreur ****** MERCI a Bruno & Gilles
;;
;; --- Interrogation Entite/Objet en Lisp : (entget (car (entsel)) '("*"))
;; Commande: (setq a '(1 2 3)) ---> (1 2 3)
;; Commande: (setq x (car a))  ---> 1    (setq y (cadr a)) ---> 2    (setq z (caddr a)) ---> 3
;;
;; Calque          - assoc  8 :  (8 . "R_ASS")
;; XYZ (Bloc)      - assoc 10 :  (10  639715.0  140210.0  0.0)
;; Rotation (Bloc) - assoc 50 :  (50 . 3.14159)  Pi  3.14 = 180 degres   (50 . 0.785398)  Pi/4 = 45 degres
;; ELEV            - assoc 38 :  (38 . 10.0)
;; Pol Ouverte     - assoc 70 :  (70 . 0)
;; Pol Fermee      - assoc 70 :  (70 . 1)
;;
;; ****** ATTENTION: AUCUNE Gestion d'Erreur ****** MERCI a Bruno & Gilles
;;

(vl-load-com)

(defun C:ODField__ANGLEDEGRE ( / js_pl n_pl ent dxf_ent  TABLE_OD  BANGLE ROTRADIANS  ROTDEGRES)

;;; On va utiliser des champs OD reels/flottants :  BANGLE  de la Table OD "TABLEXYZ" ...
(setq TABLE_OD "TEST")        ;;  <--- Votre Nom de Table OD --->

;;; Veuillez modifier ci-dessous en fonction de VOS champs OD pour X Y Z
(setq BANGLE "ANGLEDEGRE")    ;;  <--- Votre Nom de Champ OD (Reel/Flottant) --->


  (setq js_pl (ssget '((0 . "INSERT")     (100 . "AcDbEntity") (67 . 0) (410 . "Model") (100 . "INSERT")       )) )

  (cond
    (js_pl
      (repeat (setq n_pl (sslength js_pl))
        (setq ent (ssname js_pl (setq n_pl (1- n_pl))))
        (setq dxf_ent (entget ent))

;;; Recuperation de la ROTATION sur assoc 50 :  (50 . 3.14159)
        (setq ROTRADIANS (cdr (assoc 50 dxf_ent)) )

;;; Conversion des Radians en Degres ;;; (ANGLERAD * 180.0) / 3.14159 )
        (setq ROTDEGRES (/ (* ROTRADIANS 180.0) 3.14159) )

          (progn
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;; Affectation du Champ OD par la Rotation/Angle d Insertion en DEGRES
;;;;;; dans le Champ OD  xxx  &  Record ZERO
           ( ade_odsetfield  ent  TABLE_OD  BANGLE  ROTDEGRES  0  ROTDEGRES )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          )
        )
      )
    )

(princ)
)

<<< Fin Routine >>>


(Autodesk Expert Elite Team)

Hors ligne

 

#12 Wed 17 October 2018 17:01

yoann
Participant actif
Lieu: Grenoble
Date d'inscription: 19 Sep 2005
Messages: 120

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Hello,

Suite au (super) Lisp fourni par l'ami Pat qui marchait bien pour la récupération de l'orientation d'un bloc et l'injection de cette orientation en OD,
j'ai besoin maintenant de faire l'inverse (pas chiant le type smile )

J'ai importé des shp (provenant d'Arcgis) avec un champ OD:ORI (en degrés).
Je souhaite mettre à jour la rotation de mes blocs autocad à l'aide de ce champ OD:ORI.

Même problème de conversion d'angle que dans le précédent lisp :

- sous Arcgis : Degres Decimaux + ZERO a l'Est

- sous Autocad : grades, sens horaire, direction Nord 300g (par défaut mes blocs ont tous une rotation de 100g)

Merci pour votre aide smile

Yo

Hors ligne

 

#13 Thu 18 October 2018 09:33

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4792

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Hello

<<< Suite au (super) Lisp fourni par l'ami Pat ... >>>
Euh c gentil mais 95% du Lisp provient surtout de Bruno & un peu de Gilles ...

GeoBye, Pat


(Autodesk Expert Elite Team)

Hors ligne

 

#14 Thu 18 October 2018 09:46

bruno v.
Participant actif
Date d'inscription: 22 Mar 2010
Messages: 89

Re: [MAP 201X] Pour Blocs: Coords XY et Angles en DEGRES dans OD

Bonjour,

Alors très vite fait, pour pouvoir écrire le code j'ai utilise le code joint Properties2OD.lsp que j'ai appliqué à quelque blocs d'orientation différentes afin de me créer une OD.

J'ai remis tous les blocs à une orientation de zéro et j'ai appliqué le petit bout de code suivant pour retrouver l'orientation avec l'OD

Code:

((lambda ( / js n ent dxf_ent rot)
  (setq js (ssget '((0 . "INSERT"))))
  (cond
    (js
      (repeat (setq n (sslength js))
        (setq
          ent (ssname js (setq n (1- n)))
          dxf_ent (entget ent)
        )
        (if (member "TBL_AcDbBlockReference" (ade_odgettables ent))
          (progn
            (setq rot (ade_odgetfield ent "TBL_AcDbBlockReference" "ROTATION" 0))
            (entmod (subst (cons 50 rot) (assoc 50 dxf_ent) dxf_ent))
          )
        )
      )
    )
  )
  (prin1)
))

Pour ton cas il va falloir que tu adaptes le nom de la table et du champs fourni dans le code "TBL_AcDbBlockReference" et "ROTATION"

Autre remarque:
Dans le Lisp Properties2OD la rotation été stockée en temps que réel et valeur en radian.
Donc si ton champs n'est pas un réel, penser à le convertir (variable rot), exemple (setq rot (atof rot)) si c'est du caractère....
Ceci avant d'appliquer (entmod)

Autre chose: (entmod) ne travaille qu'en radian et dans le sens trigo origine à l'est, quelque soit ton choix de système d'angle.
Donc si ton champ est écrit en grade, il faut aussi le convertir en radians (avec l'origine à l'est) avant de le soumettre à (entmod)
Exemple: (setq rot (angtof rot 2))

Voilà si les conversions sont bonnes, cela devrait fonctionner...
Je te souhaite d'arriver à adapter ce petit bout de code à ton besoin.

Dernière modification par bruno v. (Thu 18 October 2018 10:16)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

Pied de page des forums

Powered by FluxBB