Lisp donnee d objet - Remplir XYZ
#1
Posté 14 janvier 2021 - 16:37
j'ai recuperer cette Lisp mais elle ne fonctionne pas
((lambda ( / js ent pt)
(setq js (ssget '((0 . "INSERT") (2 . "TE_BB,Te_Br,Te_E_B,Ad_Br,PEC_C,Cit_S,col,Co_ELS,Co_Br,Ad_Br_AB,Coude_8_ELS,Coude_16_EE,Coude_8_EE,Manch_ELS,Manch,Cd_Em_1/16") (8 . "EQ_SPE"))))
(repeat (setq n (sslength js))
(setq
ent (ssname js (setq n (1- n)))
pt (cdr (assoc 10 (entget ent)))
)
(ade_odsetfield ent "EQ_SPE" "Coord_X" 0 (car pt))
(ade_odsetfield ent "EQ_SPE" "Coord_Y" 0 (cadr pt))
(ade_odsetfield ent "EQ_SPE" "Altitude" 0 (caddr pt))
)
))
Y aurais t'il une âme charitable pour m'aider ?
#2
Posté 14 janvier 2021 - 16:59
Ton Lisp semble venir de notre "fameux" Bruno (Bonuscad) !?
Donc je te propose une bien meilleure version (toujours de Bruno Bonuscad)
Cette routine renseigne 2 champs OD par les Coords XY du point d'insertion du Bloc ...
La routine "Coord2OD_XY" a charger par la commande APPLOAD ...
SVP tu nous diras si cela te convient ?
ATTENTION : Les objets selectionnes n ayant pas la Table OD correspondante attachee sont forces en couleur = 11
ATTENTION 2 : la routine traite les Blocs et les Points !
LA SANTE, Bonne Annee, Bye, lecrabe
PS: j'ai la meme version qui remplit XYZ et non pas seulement XY si necessaire !?
;; ;; Routine: Coord2OD_XY by Bruno for Patrice ;; ;; Version 1.2 avec avec qq micro-micro-Modifs ... ;; ;; Version modifiee pour 2 Coords ONLY X & Y (et non pas X & Y & Z) ;; (vl-load-com) (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 deroulante ;; 1 = liste choix unique ;; 2 = liste choix multipes ;; ;; Retour : la cle de l'option (flag = 0 ou 1) ou la liste des cles des options (flag = 2) ;; ;; Exemple d'utilisation ;; (listbox "Presentation" "Choisir une presentation" (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 vl-position-multi (el l / n l_id l_n) (setq n 0 l_id (mapcar '(lambda (x) (equal x el)) l) ) (repeat (length l_id) (if (car l_id) (setq l_n (cons n l_n))) (setq n (1+ n) l_id (cdr l_id)) ) (reverse l_n) ) (defun c:Coord2OD_XY ( / l_tab tab_source list_field_source l_typ pos l_field tmp choice_fld js n_ok n_nook n_bad n ent dxf_ent pt_ins) (setvar "DIMZIN" 0) (princ "\nVariable System DIMZIN = 0 : pour ne pas supprimer les Zeros a droite ! ") (princ "\nCette routine transfere dans 3 Champs OD (Type Reel imperatif) les 3 Coords XYZ des Blocs / Points selectionnes ") (princ "\nLes objets selectionnes n ayant pas la Table OD correspondante attachee sont forces en couleur = 11 (Rose) ") (cond ( (or (numberp (vl-string-search "Map 3D" (vla-get-caption (vlax-get-acad-object)))) (numberp (vl-string-search "Civil 3D" (vla-get-caption (vlax-get-acad-object)))) ) (setq l_tab (ade_odtablelist)) (cond (l_tab (setq tab_source (listbox "TABLES" "Choix de la table SOURCE" (mapcar 'cons l_tab l_tab) 1)) (cond (tab_source (setq list_field_source (ade_odtabledefn tab_source) l_typ (mapcar 'cdr (mapcar 'caddr (cdaddr list_field_source))) pos (vl-position-multi "Real" l_typ) ) (cond (pos ;; (setq l_field (mapcar '(lambda (x) (nth x (cdaddr list_field_source))) pos) list_field_source nil tmp '("X" "Y" "Z")) (setq l_field (mapcar '(lambda (x) (nth x (cdaddr list_field_source))) pos) list_field_source nil tmp '("X" "Y" )) ;; (repeat 3 (repeat 2 (setq choice_fld (listbox "CHAMPS" (strcat "Choix du champ SOURCE pour la coordonnee " (car tmp) " de la table " tab_source) (mapcar 'cons (mapcar 'cdar l_field) (mapcar 'cdar l_field)) 1 ) ) (if choice_fld (setq list_field_source (cons (cons choice_fld (car tmp)) list_field_source) tmp (cdr tmp)) (exit) ) ) (princ "\nSelectionner des Insertions de Bloc ou Point : ") (setq js (ssget (list '(0 . "POINT,INSERT") (cons 410 (getvar "CTAB")))) n_ok 0 n_nook 0 n_bad 0) (cond (js (repeat (setq n (sslength js)) (setq ent (ssname js (setq n (1- n))) dxf_ent (entget ent)) (cond ( (and (member (cdr (assoc 0 dxf_ent)) '("POINT" "INSERT")) (if (cdr (assoc 2 dxf_ent)) (/= (logand (cdr (assoc 70 (tblsearch "BLOCK" (cdr (assoc 2 dxf_ent))))) 4) 4) T ) ) (setq pt_ins (if (eq (cdr (assoc 0 dxf_ent)) "INSERT") (trans (cdr (assoc 10 dxf_ent)) (cdr (assoc 210 dxf_ent)) 0) (cdr (assoc 10 dxf_ent)) ) ) (cond ((member tab_source (ade_odgettables ent)) (foreach el list_field_source (ade_odsetfield ent tab_source (car el) 0 (cond ((eq (cdr el) "X") (car pt_ins)) ((eq (cdr el) "Y") (cadr pt_ins)) ;; ((eq (cdr el) "Z") (caddr pt_ins)) ) ) ) (setq n_ok (1+ n_ok)) ) (T (entmod (if (assoc 62 dxf_ent) (subst '(62 . 11) (assoc 62 dxf_ent) dxf_ent) (append dxf_ent '((62 . 11))) ) ) (setq n_nook (1+ n_nook)) ) ) ) (T (setq n_bad (1+ n_bad))) ) ) (princ (strcat "\n" (itoa (sslength js)) " objets POINT ou BLOC selectionnes ")) (princ (strcat "\n" (itoa n_ok) " objets traites ")) (princ (strcat "\n" (itoa n_nook) " objets marques non-traites ")) (princ (strcat "\n" (itoa n_bad) " objets ignores ")) ) (T (princ "\nSelection vide ! ")) ) ) (T (princ "\nPas de Champs OD definis en Reel ! ")) ) ) (T (princ "\nAucune Table OD selectionnee ! ")) ) ) (T (princ "\nAucune table definie dans ce dessin ! ")) ) ) (T (princ "\nCette fonction requiert Map 3D ou Civil 3D ! ")) ) (prin1) )
#3
Posté 14 janvier 2021 - 17:04
Et voici la version qui remplit XYZ
car il me semble que tu veux remplir XYZ et non pas seulement XY !
Routine : Coord2OD
SVP tu nous diras si cela te convient ?
ATTENTION : Les objets selectionnes n ayant pas la Table OD correspondante attachee sont forces en couleur = 11
ATTENTION 2 : la routine traite les Blocs et les Points !
LA SANTE, Bonne Annee, Bye, lecrabe
;; ;; Routine: Coord2OD by Bruno for Patrice ;; ;; Version 1.2 avec avec qq micro-micro-Modifs ... ;; (vl-load-com) (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 deroulante ;; 1 = liste choix unique ;; 2 = liste choix multipes ;; ;; Retour : la cle de l'option (flag = 0 ou 1) ou la liste des cles des options (flag = 2) ;; ;; Exemple d'utilisation ;; (listbox "Presentation" "Choisir une presentation" (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 vl-position-multi (el l / n l_id l_n) (setq n 0 l_id (mapcar '(lambda (x) (equal x el)) l) ) (repeat (length l_id) (if (car l_id) (setq l_n (cons n l_n))) (setq n (1+ n) l_id (cdr l_id)) ) (reverse l_n) ) (defun c:Coord2OD ( / l_tab tab_source list_field_source l_typ pos l_field tmp choice_fld js n_ok n_nook n_bad n ent dxf_ent pt_ins) (setvar "DIMZIN" 0) (princ "\nVariable System DIMZIN = 0 : pour ne pas supprimer les Zeros a droite ! ") (princ "\nCette routine transfere dans 3 Champs OD (Type Reel imperatif) les 3 Coords XYZ des Blocs / Points selectionnes ") (princ "\nLes objets selectionnes n ayant pas la Table OD correspondante attachee sont forces en couleur = 11 (Rose) ") (cond ( (or (numberp (vl-string-search "Map 3D" (vla-get-caption (vlax-get-acad-object)))) (numberp (vl-string-search "Civil 3D" (vla-get-caption (vlax-get-acad-object)))) ) (setq l_tab (ade_odtablelist)) (cond (l_tab (setq tab_source (listbox "TABLES" "Choix de la table SOURCE" (mapcar 'cons l_tab l_tab) 1)) (cond (tab_source (setq list_field_source (ade_odtabledefn tab_source) l_typ (mapcar 'cdr (mapcar 'caddr (cdaddr list_field_source))) pos (vl-position-multi "Real" l_typ) ) (cond (pos (setq l_field (mapcar '(lambda (x) (nth x (cdaddr list_field_source))) pos) list_field_source nil tmp '("X" "Y" "Z")) (repeat 3 (setq choice_fld (listbox "CHAMPS" (strcat "Choix du champ SOURCE pour la coordonnee " (car tmp) " de la table " tab_source) (mapcar 'cons (mapcar 'cdar l_field) (mapcar 'cdar l_field)) 1 ) ) (if choice_fld (setq list_field_source (cons (cons choice_fld (car tmp)) list_field_source) tmp (cdr tmp)) (exit) ) ) (princ "\nSelectionner des Insertions de Bloc ou Point : ") (setq js (ssget (list '(0 . "POINT,INSERT") (cons 410 (getvar "CTAB")))) n_ok 0 n_nook 0 n_bad 0) (cond (js (repeat (setq n (sslength js)) (setq ent (ssname js (setq n (1- n))) dxf_ent (entget ent)) (cond ( (and (member (cdr (assoc 0 dxf_ent)) '("POINT" "INSERT")) (if (cdr (assoc 2 dxf_ent)) (/= (logand (cdr (assoc 70 (tblsearch "BLOCK" (cdr (assoc 2 dxf_ent))))) 4) 4) T ) ) (setq pt_ins (if (eq (cdr (assoc 0 dxf_ent)) "INSERT") (trans (cdr (assoc 10 dxf_ent)) (cdr (assoc 210 dxf_ent)) 0) (cdr (assoc 10 dxf_ent)) ) ) (cond ((member tab_source (ade_odgettables ent)) (foreach el list_field_source (ade_odsetfield ent tab_source (car el) 0 (cond ((eq (cdr el) "X") (car pt_ins)) ((eq (cdr el) "Y") (cadr pt_ins)) ((eq (cdr el) "Z") (caddr pt_ins)) ) ) ) (setq n_ok (1+ n_ok)) ) (T (entmod (if (assoc 62 dxf_ent) (subst '(62 . 11) (assoc 62 dxf_ent) dxf_ent) (append dxf_ent '((62 . 11))) ) ) (setq n_nook (1+ n_nook)) ) ) ) (T (setq n_bad (1+ n_bad))) ) ) (princ (strcat "\n" (itoa (sslength js)) " objets POINT ou BLOC selectionnes ")) (princ (strcat "\n" (itoa n_ok) " objets traites ")) (princ (strcat "\n" (itoa n_nook) " objets marques non-traites ")) (princ (strcat "\n" (itoa n_bad) " objets ignores ")) ) (T (princ "\nSelection vide ! ")) ) ) (T (princ "\nPas de Champs OD definis en Reel ! ")) ) ) (T (princ "\nAucune Table OD selectionnee ! ")) ) ) (T (princ "\nAucune table definie dans ce dessin ! ")) ) ) (T (princ "\nCette fonction requiert Map 3D ou Civil 3D ! ")) ) (prin1) )
#4
Posté 14 janvier 2021 - 17:07
bizarre
#5
Posté 14 janvier 2021 - 17:12
sepacap, le 14 janvier 2021 - 17:07 , dit :
bizarre
j'ai reussi a utiliser cette lisp
((lambda ( / js ent pt)
(setq js (ssget '((0 . "POINT") (8 . "PT_GEN_SUP"))))
(repeat (setq n (sslength js))
(setq
ent (ssname js (setq n (1- n)))
pt (cdr (assoc 10 (entget ent)))
)
(ade_odsetfield ent "PT_GEN_SUP" "Coord_x" 0 (car pt))
(ade_odsetfield ent "PT_GEN_SUP" "Coord_y" 0 (cadr pt))
(ade_odsetfield ent "PT_GEN_SUP" "ALTITUDE" 0 (caddr pt))
)
))
Cependant j'aimerais pouvoir changer la variable ALTITUDE avec la donnée altitude moins 1
Est ce possible ??
#6
Posté 14 janvier 2021 - 17:13
J ai deja utilise ces routines sur mes multiples MAP 20XX !
OK je vais les retester sur mon MAP 2021 et MAP 2016 ... Peut etre ai je mal copie / colle !?
LA SANTE, Bye, lecrabe
#7
Posté 14 janvier 2021 - 17:23
Je viens de retester la routine "Coord2OD" (donc XYZ)
sur mon MAP 2021 et sur mon MAP 2016 ...
Et bien entendu elle fonctionne parfaitement !!
Avec des Blocs ayant une table OD EXISTANTE
et au moins 3 champs OD de type flottant/reel EXISTANTS
pour y transferer les Coords XYZ !
LA SANTE, Bye, lecrabe
PS: Encore MERCI a Bruno Bonuscad pour toutes ses routines !!
#8
Posté 14 janvier 2021 - 17:27
sepacap, le 14 janvier 2021 - 17:12 , dit :
Je pense quand changeant cette ligne, ça devrait correspondre à ta demande:
(ade_odsetfield ent "PT_GEN_SUP" "ALTITUDE" 0 (caddr pt)) --------->>>> (ade_odsetfield ent "PT_GEN_SUP" "ALTITUDE" 0 (1- (caddr pt) ) )
#9
Posté 14 janvier 2021 - 17:28
Citation
(princ "\nCette routine transfere dans 3 Champs OD (Type Reel imperatif) les 3 Coords XYZ des Blocs / Points selectionnes ")
(princ "\nLes objets selectionnes n ayant pas la Table OD correspondante attachee sont forces en couleur = 11 (Rose) ")
(cond
(
(or
(numberp (vl-string-search "Map 3D" (vla-get-caption (vlax-get-acad-object))))
(numberp (vl-string-search "Civil 3D" (vla-get-caption (vlax-get-acad-object))))
)
Après avoir tester sur un MAP 3D 2016 j'ai le même résultat avec la condition qui bloque
#10
Posté 14 janvier 2021 - 17:30
SVP pourquoi cela marche chez moi depuis "toujours"
et encore aujourd'hui sur mon MAP 2016 et MAP 2021 !?
LA SANTE, Bye, lecrabe
PS: MERCI a Maitre Bruno Bonuscad pour la Modif "adequate" !
#11
Posté 15 janvier 2021 - 08:08
Maxime063, le 14 janvier 2021 - 17:28 , dit :
Afin d'éclaircir la situation, copie-colle l'instruction qui suit directement en ligne de commande et donne le retour, on sera peut être fixé sur le point noir...
(vla-get-caption (vlax-get-acad-object))
#13
Posté 15 janvier 2021 - 11:41
sepacap, le 15 janvier 2021 - 08:21 , dit :
Autodesk AutoCAD Map 3D 2020 -
Le retour est correct, alors je pense simplement aux fonctions (vl- qui ne sont pas chargés (étrange sous une version 2020)
Essayes de valider le chargement en tapant la commande (vl-load-com) en ligne de commande, puis de relancer le code.
J'ai l'impression que c'est (vl-string-search qui pose problème
#14
Posté 15 janvier 2021 - 12:00
YES c possible ! Donc j ai rajoute (VL-LOAD-COM) au debut des 2 routines !
LA SANTE, Bonne Annee, Bye, lecrabe
#15
Posté 22 janvier 2021 - 14:30
pour faire suite a mon dernier problème, j'ai réussi a créer mon annotation!
cependant, j'ai un soucis concernant mon attribut Zgs
je m'explique , je n'arrive pas a limiter la precision a deux chiffres après la virgule alors que ma donnée d'objet au quelle elle est raccrochée est bien a deux chiffres après la virgule
ci joint un extrait de plan
Fichier(s) joint(s)
-
Doc1.pdf (192,67 Ko)
Nombre de téléchargements : 5
#16
Posté 22 janvier 2021 - 14:57
Sans réfléchir et sans voir ton DOC, SVP la variable System
DIMZIN = 0
Et tu relances le Lisp de Bruno / Bonuscad ?!
La Santé, Bye, lecrabe
#18
Posté 22 janvier 2021 - 15:27
Si tu mets la variable LUPREC à 6, combien de décimales as-tu dans ta fenêtre de propriété?
Olivier
#20
Posté 22 janvier 2021 - 15:42
ALTITUDE@PT_GEN_SUP
à remplacer par
(rtos ALTITUDE@PT_GEN_SUP 2 2)
Olivier