Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Printemps des cartes 2024

#1 Mon 05 October 2020 12:27

A48
Participant occasionnel
Date d'inscription: 23 Feb 2017
Messages: 10

[MAP 2020] Operation mathematique dans un champ Classe d'Objet

Bonjour,

Pour l'intégration dans un SIG, je dois transformer un plan de récolement (réseau assainissement) en DWG en format SHAPE. Pour cela j'ai créé mes tables de données d'objet pour les canalisations et les regards. J'ai quelques notions de SIG et manipule un peu la partie SIG d'Autocad MAP. Toutefois, j'aimerai savoir s'il est possible dans d'obtenir le résultat directement d'une opération mathématique dans un champs.
C'est-à-dire que je dois saisir pour chaque regard l'altitude du tampon et l'altitude du fil d'eau, je souhaiterai que le champ "profondeur" se calcule automatiquement par la différence entre ces 2 altitudes.

Si quelqu'un pourrait m'aider cela me faciliterai grandement la tâche.

Merci d'avance, A48

Hors ligne

 

#2 Mon 05 October 2020 13:29

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

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Hello

Je suppose que tu as 3 champs OD (Object Data) de type Reel / Flottant dans une table OD sur TOUS tes Regards/Tampons !

Et tu souhaiterais avoir "automatiquement" : Profondeur = Alt_Tampon - Alt_FilEau

Ai je bien compris ?

LA SANTE, GeoBye, Pat ... En retraite depuis 5 jours ...


(Autodesk Expert Elite Team)

Hors ligne

 

#3 Mon 05 October 2020 13:54

A48
Participant occasionnel
Date d'inscription: 23 Feb 2017
Messages: 10

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Oui c'est tout à fait cela.
Je dois déjà saisir toutes les altitudes Tampon et Fil d'eau (qui ne sont renseignées sur le plan que par des textes) et s'il est possible de saisir en plus la différence ça serait cool !
Merci

Hors ligne

 

#4 Mon 05 October 2020 13:56

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

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Hello

Et donc si en plus tu avais une routine qui transfere le contenu d un texte selectionne du DWG dans la OD voulue,
cela t economiserait DU TEMPS et des Erreurs !?

Tu sais charger des routines Lisp et les lancer ??

Donc tu trouveras ci-joint une fabuleuse routine "Text_Sel2OD" de Bruno qui transfere le Contenu d un TEXT , MTEXT , ATTRIB, etc
dans un champ OD existant ... C TIP-TOP pour transferer du texte dans un champ OD !

Et pour ta 1ere demande, il faut que je farfouille dans mon stock de routines et eventuellement adapte / bricole un truc !
mais etant tres mauvais en Lisp, je suis tres lent !!

En esperant que Bruno ou Olivier ou autre Pro du Lisp et des ODs intervienne !?

LA SANTE, GeoBye, Pat ... En retraite depuis 5 jours ...


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

(Autodesk Expert Elite Team)

Hors ligne

 

#5 Mon 05 October 2020 14:30

A48
Participant occasionnel
Date d'inscription: 23 Feb 2017
Messages: 10

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Effectivement.

Je charge la routine Lisp .lsp sous AutoCAD avec la commande /Outils/Autolisp/Chargement d'une application/

Ou par la commande clavier :  APPLOAD  < Entree >

Merci

Hors ligne

 

#6 Mon 05 October 2020 15:01

A48
Participant occasionnel
Date d'inscription: 23 Feb 2017
Messages: 10

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Merci, c'est déjà plus facile à saisir pour les altitudes tampon et fil d'eau.

Hors ligne

 

#7 Mon 05 October 2020 16:14

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

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Bonjour,

Puisque que tu en es rendu à ce point: avoir le tampon et le fil d'eau, voici ce que tu peux faire pour la suite.

Tu utilise MQSELECT ou SEL_BY_OD que tu trouveras sur site avec une recherche,
ceci pour sélectionner tous les objet sur les quels tu a attribué ta table d'objet.

Ceci fait tu lances  ALL_OD2CSV  que je te met en pièce jointe.
Pour le choix des objets, tu tapes "P" pour récupérer la sélection précédente faire par mqselect ou sel_by_od
Cela va te créer un fichier .csv que tu vas ouvrir avec Excel.
Dans la feuille tu va rajouter une dernière colonne avec comme entête "profondeur"
puis dans la première cellule de cette colonne tu vas faire une formule pour avoir la différence entre tampon et le fil d'eau
Tu recopies ta formule vers le bas de ton document et tout le calcul est fait.
Tu sauvegarde ton fichier en conservant le type .csv
Dans AutoCAD MAP tu utilises CSV2OD (fichier joint également), et ta table avec les nouveaux champs sera importée.

NOTE IMPORTANTE:
NE PAS DETRUIRE la 1er colonne (HANDLE)
Dans Excel il est probable qu'il faille configurer le séparateur décimal en point (virgule par défaut) pour pouvoir faire les formules sur les nombres, ceci pour être en corrélation avec AutoCAD qui utilise un point comme séparateur.


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

Hors ligne

 

#8 Tue 06 October 2020 10:16

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

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Hello

MERCI Bruno pour ton intervention et tes multiples routines !

Voir ici pour qq routines Lisp indispensables avec les ODs de MAP ou CIVIL !

https://georezo.net/forum/viewtopic.php?pid=160353

LA SANTE, GeoBye, Pat ... En retraite depuis 6 jours ...


(Autodesk Expert Elite Team)

Hors ligne

 

#9 Tue 06 October 2020 11:12

A48
Participant occasionnel
Date d'inscription: 23 Feb 2017
Messages: 10

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Merci pour ces routines dont j'utilise déjà certaines.
Par contre est-il possible de faire appliquer une formule mathématique dans le champ de ma table OD ?
Pour le moment comme je l'ai expliqué auparavant je transforme un plan DWG en format exploitable SIG mais par la suite nous devrons directement livrer des fichiers SHP exploitable sous un SIG.
Le but final est de limiter le nombre de transformations entre le levé sur site (via une codification) et le rendu.
MERCI

Hors ligne

 

#10 Tue 06 October 2020 11:22

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

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Hello

NON aucune operation mathematique ou autres sur les champs ODs !

C pourquoi Bruno t a propose son excellente routine Lisp (qui est en fait "copiee" sur ATTIN / ATTOUT des routines Express/Bonus qui traite les Attributs de Blocs) ... Elle permet des super magouilles, car tu exportes les ODs en CSV, tu "tripotes" dans Excel et tu re-injectes dans le DWG ...

Autre solution : une routine Lisp "directe" qui mettrait a jour un champ OD reel/flottant nomme par exemple PROFONDEUR
depuis 2 autres champs OD reels/flottants nommes par exemple : Z_TERRAIN & Z_FILDEAU !

LA SANTE, GeoBye, Pat ... En retraite depuis 6 jours ...


(Autodesk Expert Elite Team)

Hors ligne

 

#11 Tue 06 October 2020 15:24

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

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Patrice a écrit:

Autre solution : une routine Lisp "directe" qui mettrait a jour un champ OD reel/flottant nomme par exemple PROFONDEUR
depuis 2 autres champs OD reels/flottants nommes par exemple : Z_TERRAIN & Z_FILDEAU !

LA SANTE, GeoBye, Pat ... En retraite depuis 6 jours ...


C'est vrai que ça pourrait être une fonction intéressante à faire, je m'y colle.
Un embryon qui a l'air de fonctionner (après tests sommaires), c'est un premier jus.
Je me suis contenté des 4 opérateurs arithmétiques basiques, on pourrait aussi envisager de concaténer des chaines de caractères...

Code:

; str2lst
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur
;;
;; Exemples
;; (str2lst "a b c" " ") -> ("a" "b" "c")
;; (str2lst "1,2,3" ",") -> ("1" "2" "3")
(defun str2lst (str sep / pos)
    (if (setq pos (vl-string-search sep str))
        (cons
            (substr str 1 pos)
            (str2lst (substr str (+ (strlen sep) pos 1)) sep)
        )
        (list str)
    )
)
;; ListBox (gile)
;; Boite de dialogue permettant un ou plusieurs choix dans une liste
;;
;; Arguments
;; title : le titre de la boite de dialogue (chaîne)
;; msg ; message (chaîne), "" ou nil pour aucun
;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...)
;; flag : 0 = liste déroulante
;; 1 = liste choix unique
;; 2 = liste choix multipes
;;
;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2)
;;
;; Exemple d'utilisation
;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 1)
(defun ListBox (title msg keylab flag / tmp file dcl_id choice)
    (setq
        tmp (vl-filename-mktemp "tmp.dcl")
        file (open tmp "w")
    )
    (write-line
        (strcat "ListBox:dialog{label=\"" title "\";")
        file
    )
    (if (and msg (/= msg ""))
        (write-line (strcat ":text{label=\"" msg "\";}") file)
    )
    (write-line
        (cond
            ((= 0 flag) "spacer;:popup_list{key=\"lst\";")
            ((= 1 flag) "spacer;:list_box{key=\"lst\";")
            (T "spacer;:list_box{key=\"lst\";multiple_select=true;")
        )
        file
    )
    (write-line "}spacer;ok_cancel;}" file)
    (close file)
    (setq dcl_id (load_dialog tmp))
    (if (not (new_dialog "ListBox" dcl_id))
        (exit)
    )
    (start_list "lst")
    (mapcar 'add_list (mapcar 'cdr keylab))
    (end_list)
    (action_tile
        "accept"
        "(or (= (get_tile \"lst\") \"\")
            (if (= 2 flag)
                (progn
                    (foreach n (str2lst (get_tile \"lst\") \" \")
                        (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice))
                    )
                    (setq choice (reverse choice))
                )
                (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab)))
            )
        )
        (done_dialog)"
    )
    (start_dialog)
    (unload_dialog dcl_id)
    (vl-file-delete tmp)
    choice
)
(defun c:operate_OD ( / sel_tbl def_tbl l_field sel1_field sel2_field op_field sel3_field js n ent)
    (setq sel_tbl (listbox "Donnée d'objet" "Choisir la table de données d'objet" (mapcar 'cons (ade_odtablelist) (ade_odtablelist)) 1))
    (cond
        (sel_tbl
            (setq
                def_tbl (ade_odtabledefn sel_tbl)
                l_field (mapcar 'cdr (mapcar '(lambda (x) (assoc "ColName" x)) (cdaddr def_tbl)))
                sel1_field (listbox "Champ de donnée" "Choisir le 1er champ de donnée" (mapcar 'cons l_field l_field) 1)
                sel2_field (listbox "Champ de donnée" "Choisir le 2ème champ de donnée" (mapcar 'cons l_field l_field) 1)
            )
            (cond
                ((and
                    sel1_field
                    sel2_field
                    (member (cdr (assoc "ColType" (assoc (cons "ColName" sel1_field) (cdaddr def_tbl)))) '("Real" "Integer"))
                 )
                    (setq
                        op_field (listbox "Opérateur arithmétique" "Choisir l'opérande" '(("+ " . "+ ") ("- " . "- ") ("* " . "* ") ("/ " . "/ ")) 1)
                        sel3_field (listbox "Champ de donnée RESULTAT" "Choisir le 3éme champ de donnée à inscrire" (mapcar 'cons l_field l_field) 1)
                    )
                    (cond
                        ((and
                            op_field
                            sel3_field
                            (member (cdr (assoc "ColType" (assoc (cons "ColName" sel3_field) (cdaddr def_tbl)))) '("Real" "Integer"))
                         )
                            (setq js (ssget "_X"))
                            (cond
                                (js
                                    (repeat (setq n (sslength js))
                                        (if (member sel_tbl (ade_odgettables (setq ent (ssname js (setq n (1- n))))))
                                            (ade_odsetfield ent sel_tbl sel3_field 0
                                                (eval
                                                    (list
                                                        (read op_field)
                                                        (ade_odgetfield ent sel_tbl sel1_field 0)
                                                        (ade_odgetfield ent sel_tbl sel2_field 0)
                                                    )
                                                )
                                            )
                                        )
                                    )
                                )
                            )
                        )
                        (T (princ "\nLe champs résultat ne conviennent pas; doit être un réel ou entier"))
                    )
                )
                (T (princ "\nLes champs sources ne conviennent pas; doivent être des réels ou entiers"))
            )
        )
    )
    (prin1)
)

Hors ligne

 

#12 Tue 06 October 2020 18:06

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

Re: [MAP 2020] Operation mathematique dans un champ Classe d'Objet

Hello Bruno

Un seul mot : MAGNIFIQUE !

J ai simplement modifie la ligne :   (setq js (ssget "_X"))
en :   (setq js (ssget ))
Pour ne traiter que une selection classique ! ... Et non pas TOUT le DWG ...

MERCI, LA SANTE, GeoBye, Pat ... En retraite depuis 6 jours ...


(Autodesk Expert Elite Team)

Hors ligne

 

Pied de page des forums

Powered by FluxBB