nen Posté(e) le 22 mars 2021 Posté(e) le 22 mars 2021 Bonjour le Forum :D , J’ai besoin de vos lumières ;) .J’aimerais savoir s’il est possible de créer une macro-commande pour créer un champ paramétré pour calculer des surfaces en m2 en sélectionnant des objets ? :blink: Est-il possible d’utiliser l’expression de champ dans mon image ci-joint pour créer une macro-commande ? J’ai cette macro-commande ci-dessous qui le fait très bien, malheureusement la valeur n’est pas dynamique si je modifie mon objet ma valeur ne s’adapte pas. :( ^C^C-style;Surface_Valeur;Arial;75;1;0;N;N;N;Aire;ob;\texte;st;Surface_Valeur;$M=$(getvar,lastpoint);0;$M=$(eval,$(rtos,$(/,$(getvar,area),10000),2,2) "m²");deplacer;d;;$M=$(getvar,lastpoint);\ Merci d’avance Meilleures salutations
(gile) Posté(e) le 22 mars 2021 Posté(e) le 22 mars 2021 Salut,Je pense que ce n'est pas possible avec Diesel, les expressions de champs liés à des objets utilisent un identifiant pour l'objet ciblé (ObjectId) qui n'est accessible que par programmation (Visual LISP, VBA, .NET ou ObjectARX). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
rebcao Posté(e) le 23 mars 2021 Posté(e) le 23 mars 2021 Bonjour, Etant donné que la commande CHAMPS, n'a pas de commande standard en ligne de commande, il est impossible de la "MACROter" ! 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 @)
nen Posté(e) le 23 mars 2021 Auteur Posté(e) le 23 mars 2021 Salut, Merci à vous deux pour votre message. En effet j’ai trouvé un lisp de Lee Mac "Area Label" à ce lien "http://www.lee-mac.com/arealabel.html" malheureusement quand on choisit en mode tableau (AT), on change le facteur de conversion (mm2 -> m2) mais la surface dans le tableau reste en mm2, le facteur fonctionne seulement en mode fichier texte (AF), je suppose qu’on ne peut pas car on perdrait la fonction dynamique où est-ce que le lisp date de 2011 et sur AutoCAD 2021 ne fonctionne plus correctement ? Merci Meilleures salutations Ci-dessous le code du lisp "Area Label" de Lee Mac ;;---------------------=={ Area Label }==---------------------;; ;; ;; ;; Allows the user to label picked areas or objects and ;; ;; either display the area in an AutoCAD Table (if available), ;; ;; optionally using fields to link area numbers and objects; ;; ;; or write it to file. ;; ;;------------------------------------------------------------;; ;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;; ;;------------------------------------------------------------;; ;; Version 1.9 - 29-10-2011 ;; ;;------------------------------------------------------------;; (defun c:AT nil (AreaLabel t)) ;; Areas to Table (defun c:AF nil (AreaLabel nil)) ;; Areas to File ;;------------------------------------------------------------;; (defun AreaLabel ( flag / *error* _startundo _endundo _centroid _text _open _select _getobjectid _isannotative acdoc acspc ap ar as cf cm el fd fl fo n of om p1 pf pt sf st t1 t2 tb th ts tx ucsxang ucszdir ) ;;------------------------------------------------------------;; ;; Adjustments ;; ;;------------------------------------------------------------;; (setq h1 "Area Table" ;; Heading t1 "Number" ;; Number Title t2 "Area" ;; Area Title pf "" ;; Number Prefix (optional, "" if none) sf "" ;; Number Suffix (optional, "" if none) ap "" ;; Area Prefix (optional, "" if none) as "" ;; Area Suffix (optional, "" if none) cf 1.0 ;; Area Conversion Factor (e.g. 1e-6 = mm2->m2) fd t ;; Use fields to link numbers/objects to table (t=yes, nil=no) fo "%lu6%qf1" ;; Area field formatting ) ;;------------------------------------------------------------;; (defun *error* ( msg ) (if cm (setvar 'CMDECHO cm)) (if el (progn (entdel el) (setq el nil))) (if acdoc (_EndUndo acdoc)) (if (and of (eq 'FILE (type of))) (close of)) (if (and Shell (not (vlax-object-released-p Shell))) (vlax-release-object Shell)) (if (null (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")) (princ (strcat "\n--> Error: " msg)) ) (princ) ) ;;------------------------------------------------------------;; (defun _StartUndo ( doc ) (_EndUndo doc) (vla-StartUndoMark doc) ) ;;------------------------------------------------------------;; (defun _EndUndo ( doc ) (if (= 8 (logand 8 (getvar 'UNDOCTL))) (vla-EndUndoMark doc) ) ) ;;------------------------------------------------------------;; (defun _centroid ( space objs / reg cen ) (setq reg (car (vlax-invoke space 'addregion objs)) cen (vlax-get reg 'centroid) ) (vla-delete reg) (trans cen 1 0) ) ;;------------------------------------------------------------;; (defun _text ( space point string height rotation / text ) (setq text (vla-addtext space string (vlax-3D-point point) height)) (vla-put-alignment text acalignmentmiddlecenter) (vla-put-textalignmentpoint text (vlax-3D-point point)) (vla-put-rotation text rotation) text ) ;;------------------------------------------------------------;; (defun _Open ( target / Shell result ) (if (setq Shell (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application")) (progn (setq result (and (or (eq 'INT (type target)) (setq target (findfile target))) (not (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke (list Shell 'Open target)) ) ) ) ) (vlax-release-object Shell) ) ) result ) ;;------------------------------------------------------------;; (defun _Select ( msg pred func init / e ) (setq pred (eval pred)) (while (progn (setvar 'ERRNO 0) (apply 'initget init) (setq e (func msg)) (cond ( (= 7 (getvar 'ERRNO)) (princ "\nMissed, try again.") ) ( (eq 'STR (type e)) nil ) ( (vl-consp e) (if (and pred (not (pred (setq e (car e))))) (princ "\nInvalid Object Selected.") ) ) ) ) ) e ) ;;------------------------------------------------------------;; (defun _GetObjectID ( doc obj ) (if (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE")) (vlax-invoke-method (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false) (itoa (vla-get-Objectid obj)) ) ) ;;------------------------------------------------------------;; (defun _isAnnotative ( style / object annotx ) (and (setq object (tblobjname "STYLE" style)) (setq annotx (cadr (assoc -3 (entget object '("AcadAnnotative"))))) (= 1 (cdr (assoc 1070 (reverse annotx)))) ) ) ;;------------------------------------------------------------;; (setq acdoc (vla-get-activedocument (vlax-get-acad-object)) acspc (vlax-get-property acdoc (if (= 1 (getvar 'CVPORT)) 'Paperspace 'Modelspace)) ucszdir (trans '(0. 0. 1.) 1 0 t) ucsxang (angle '(0. 0. 0.) (trans (getvar 'UCSXDIR) 0 ucszdir)) ) (_StartUndo acdoc) (setq cm (getvar 'CMDECHO)) (setvar 'CMDECHO 0) (setq om (eq "1" (cond ((getenv "LMAC_AreaLabel")) ((setenv "LMAC_AreaLabel" "0"))))) (setq ts (/ (getvar 'TEXTSIZE) (if (_isAnnotative (getvar 'TEXTSTYLE)) (cond ( (getvar 'CANNOSCALEVALUE) ) ( 1.0 )) 1.0 ) ) ) (cond ( (not (vlax-method-applicable-p acspc 'addtable)) (princ "\n--> Table Objects not Available in this Version.") ) ( (= 4 (logand 4 (cdr (assoc 70 (tblsearch "LAYER" (getvar 'CLAYER)))))) (princ "\n--> Current Layer Locked.") ) ( (not (setq *al:num (cond ( (getint (strcat "\nSpecify Starting Number <" (itoa (setq *al:num (1+ (cond ( *al:num ) ( 0 ))))) ">: " ) ) ) ( *al:num ) ) ) ) ) ( flag (setq th (* 2. (if (zerop (setq th (vla-gettextheight (setq st (vla-item (vla-item (vla-get-dictionaries acdoc) "ACAD_TABLESTYLE" ) (getvar 'CTABLESTYLE) ) ) acdatarow ) ) ) ts (/ th (if (_isAnnotative (vla-gettextstyle st acdatarow)) (cond ( (getvar 'CANNOSCALEVALUE) ) ( 1.0 )) 1.0 ) ) ) ) ) (if (cond ( (progn (initget "Add") (vl-consp (setq pt (getpoint "\nPick Point for Table <Add to Existing>: "))) ) (setq tb (vla-addtable acspc (vlax-3D-point (trans pt 1 0)) 2 2 th (* 0.8 th (max (strlen t1) (strlen t2))) ) ) (vla-put-direction tb (vlax-3D-point (getvar 'UCSXDIR))) (vla-settext tb 0 0 h1) (vla-settext tb 1 0 t1) (vla-settext tb 1 1 t2) (while (progn (if om (setq p1 (_Select (strcat "\nSelect Object [Pick] <Exit>: ") '(lambda ( x ) (and (vlax-property-available-p (vlax-ename->vla-object x) 'area) (not (eq "HATCH" (cdr (assoc 0 (entget x))))) (or (eq "REGION" (cdr (assoc 0 (entget x)))) (vlax-curve-isclosed x)) ) ) entsel '("Pick") ) ) (progn (initget "Object") (setq p1 (getpoint "\nPick Area [Object] <Exit>: "))) ) (cond ( (null p1) (vla-delete tb) ) ( (eq "Pick" p1) (setq om nil) t ) ( (eq "Object" p1) (setq om t) ) ( (eq 'ENAME (type p1)) (setq tx (cons (_text acspc (_centroid acspc (list (setq p1 (vlax-ename->vla-object p1)))) (strcat pf (itoa *al:num) sf) ts ucsxang ) tx ) ) (vla-insertrows tb (setq n 2) th 1) (vla-settext tb n 1 (if fd (strcat "%<\\AcObjProp Object(%<\\_ObjId " (_GetObjectID acdoc p1) ">%).Area \\f \"" fo "\">%" ) (strcat ap (rtos (* cf (vla-get-area p1)) 2) as) ) ) (vla-settext tb n 0 (if fd (strcat "%<\\AcObjProp Object(%<\\_ObjId " (_GetObjectID acdoc (car tx)) ">%).TextString>%" ) (strcat pf (itoa *al:num) sf) ) ) nil ) ( (vl-consp p1) (setq el (entlast)) (vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "_O" "_P" "" "_non" p1 "") (if (not (equal el (setq el (entlast)))) (progn (setq tx (cons (_text acspc (_centroid acspc (list (vlax-ename->vla-object el))) (strcat pf (itoa *al:num) sf) ts ucsxang ) tx ) ) (vla-insertrows tb (setq n 2) th 1) (vla-settext tb n 1 (strcat ap (rtos (* cf (vlax-curve-getarea el)) 2) as)) (vla-settext tb n 0 (if fd (strcat "%<\\AcObjProp Object(%<\\_ObjId " (_GetObjectID acdoc (car tx)) ">%).TextString>%" ) (strcat pf (itoa *al:num) sf) ) ) (redraw el 3) nil ) (vla-delete tb) ) ) ) ) ) (not (vlax-erased-p tb)) ) ( (and (setq tb (_Select "\nSelect Table to Add to: " '(lambda ( x ) (eq "ACAD_TABLE" (cdr (assoc 0 (entget x))))) entsel nil ) ) (< 1 (vla-get-columns (setq tb (vlax-ename->vla-object tb)))) ) (setq n (1- (vla-get-rows tb)) *al:num (1- *al:num)) ) ) (progn (while (if om (setq p1 (_Select (strcat "\nSelect Object [" (if tx "Undo/" "") "Pick] <Exit>: ") '(lambda ( x ) (and (vlax-property-available-p (vlax-ename->vla-object x) 'area) (not (eq "HATCH" (cdr (assoc 0 (entget x))))) (or (eq "REGION" (cdr (assoc 0 (entget x)))) (vlax-curve-isclosed x)) ) ) entsel (list (if tx "Undo Pick" "Pick")) ) ) (progn (initget (if tx "Undo Object" "Object")) (setq p1 (getpoint (strcat "\nPick Area [" (if tx "Undo/" "") "Object] <Exit>: "))) ) ) (cond ( (and tx (eq "Undo" p1)) (if el (progn (entdel el) (setq el nil))) (vla-deleterows tb n 1) (vla-delete (car tx)) (setq n (1- n) tx (cdr tx) *al:num (1- *al:num)) ) ( (eq "Undo" p1) (princ "\n--> Nothing to Undo.") ) ( (eq "Object" p1) (if el (progn (entdel el) (setq el nil))) (setq om t) ) ( (eq "Pick" p1) (setq om nil) ) ( (and om (eq 'ENAME (type p1))) (setq tx (cons (_text acspc (_centroid acspc (list (setq p1 (vlax-ename->vla-object p1)))) (strcat pf (itoa (setq *al:num (1+ *al:num))) sf) ts ucsxang ) tx ) ) (vla-insertrows tb (setq n (1+ n)) th 1) (vla-settext tb n 1 (if fd (strcat "%<\\AcObjProp Object(%<\\_ObjId " (_GetObjectID acdoc p1) ">%).Area \\f \"" fo "\">%" ) (strcat ap (rtos (* cf (vla-get-area p1)) 2) as) ) ) (vla-settext tb n 0 (if fd (strcat "%<\\AcObjProp Object(%<\\_ObjId " (_GetObjectID acdoc (car tx)) ">%).TextString>%" ) (strcat pf (itoa *al:num) sf) ) ) ) ( (vl-consp p1) (if el (progn (entdel el) (setq el nil))) (setq el (entlast)) (vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "_O" "_P" "" "_non" p1 "") (if (not (equal el (setq el (entlast)))) (progn (setq tx (cons (_text acspc (_centroid acspc (list (vlax-ename->vla-object el))) (strcat pf (itoa (setq *al:num (1+ *al:num))) sf) ts ucsxang ) tx ) ) (vla-insertrows tb (setq n (1+ n)) th 1) (vla-settext tb n 1 (strcat ap (rtos (* cf (vlax-curve-getarea el)) 2) as)) (vla-settext tb n 0 (if fd (strcat "%<\\AcObjProp Object(%<\\_ObjId " (_GetObjectID acdoc (car tx)) ">%).TextString>%" ) (strcat pf (itoa *al:num) sf) ) ) (redraw el 3) ) (princ "\n--> Error Retrieving Area.") ) ) ) ) (if el (progn (entdel el) (setq el nil))) ) ) ) ( (and (setq fl (getfiled "Create Output File" (cond ( *file* ) ( "" )) "txt;csv;xls" 1)) (setq of (open fl "w")) ) (setq *file* (vl-filename-directory fl) de (cdr (assoc (strcase (vl-filename-extension fl) t) '((".txt" . "\t") (".csv" . ",") (".xls" . "\t")))) *al:num (1- *al:num) ) (write-line h1 of) (write-line (strcat t1 de t2) of) (while (if om (setq p1 (_Select (strcat "\nSelect Object [Pick] <Exit>: ") '(lambda ( x ) (and (vlax-property-available-p (vlax-ename->vla-object x) 'area) (not (eq "HATCH" (cdr (assoc 0 (entget x))))) (or (eq "REGION" (cdr (assoc 0 (entget x)))) (vlax-curve-isclosed x)) ) ) entsel '("Pick") ) ) (progn (initget "Object") (setq p1 (getpoint (strcat "\nPick Area [Object] <Exit>: ")))) ) (cond ( (eq "Object" p1) (if el (progn (entdel el) (setq el nil))) (setq om t) ) ( (eq "Pick" p1) (setq om nil) ) ( (eq 'ENAME (type p1)) (_text acspc (_centroid acspc (list (setq p1 (vlax-ename->vla-object p1)))) (strcat pf (itoa (setq *al:num (1+ *al:num))) sf) ts ucsxang ) (write-line (strcat pf (itoa *al:num) sf de ap (rtos (* cf (vla-get-area p1)) 2) as) of) ) ( (vl-consp p1) (if el (progn (entdel el) (setq el nil))) (setq el (entlast)) (vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "_O" "_P" "" "_non" p1 "") (if (not (equal el (setq el (entlast)))) (progn (_text acspc (_centroid acspc (list (vlax-ename->vla-object el))) (strcat pf (itoa (setq *al:num (1+ *al:num))) sf) ts ucsxang ) (write-line (strcat pf (itoa *al:num) sf de ap (rtos (* cf (vlax-curve-getarea el)) 2) as) of) (redraw el 3) ) (princ "\n--> Error Retrieving Area.") ) ) ) ) (if el (progn (entdel el) (setq el nil))) (setq of (close of)) (_Open (findfile fl)) ) ) (setenv "LMAC_AreaLabel" (if om "1" "0")) (setvar 'CMDECHO cm) (_EndUndo acdoc) (princ) ) ;;------------------------------------------------------------;; (vl-load-com) (princ) (princ "\n:: AreaLabel.lsp | Version 1.9 | © Lee Mac 2011 www.lee-mac.com ::") (princ "\n:: Commands: \"AT\" for AutoCAD Table, \"AF\" for File ::") (princ) ;;------------------------------------------------------------;; ;; End of File ;; ;;------------------------------------------------------------;;
Luna Posté(e) le 23 mars 2021 Posté(e) le 23 mars 2021 Coucou, Si je comprends bien la démarche de LeeMac lors de la création de son programme, la partie "Adjustement" correspondant à la définition fixée des variables permet de jouer sur certains paramètres sans forcément de demander à l'utilisateur de les définir à chaque utilisation. De ce fait, la variable cf 1.0 ;; Area Conversion Factor (e.g. 1e-6 = mm2->m2) permet de définir le facteur (avec un exemple pour le passage de mm² en m², il faut un facteur de 1e-6). Ce facteur est appliqué strictement de la même manière, que se soit pour la création du fichier ou de la table...via : (strcat ap (rtos (* cf (vla-get-area p1)) 2) as) et (strcat ap (rtos (* cf (vlax-curve-getarea el)) 2) as) Je suppose donc qu'en modifiant la première ligne (dans la partie "Adjustement") sur le facteur correspondant cela devrait pouvoir régler le soucis. Cependant, c'est étrange que le programme répertorie les résultats avec une unité différentes selon la commande étant donnée que le facteur utilisé est identique...Cela peut éventuellement provenir de la valeur de la variable système INSUNITS (les unités métriques du dessins) qui va influer le résultat dans un cas et pas dans l'autre...Tu es bien à 4 pour INSUNITS ou bien à 6 ? Bisous, Luna
nen Posté(e) le 24 mars 2021 Auteur Posté(e) le 24 mars 2021 Bonjour, merci pour ton message et tes explications 🙂 la variable INSUNITS je suis sur 5, en fait tous mes paramètres et mon gabarit sont en système métrique en centimètres. c’est de la que vient le problème ?
Luna Posté(e) le 24 mars 2021 Posté(e) le 24 mars 2021 Je ne vois pas de code spécifique dédié à la définition de l'unité d'affichage donc selon moi, avec une facteur de conversion de 1.0 ("cf") les valeurs d'aires sont exprimées en fonction de l'unité métrique définie dans le dessin (INSUNITS). Mais bon après AutoCAD ne fait pas de "conversion" métrique lorsqu'on modifie le format en cours de route, il fonctionne en nombre d'unités sans tenir compte de l'unité définie (par exemple, une ligne de longueur 10 fera 10m si INSUNITS vaut 6 et 10mm si l'on change INSUNITS à 4). Autrement dit, il n'y a aucune raison que les valeurs inscrites dans la table diffère des valeurs inscrites dans le fichier ou même des valeurs récupérables via les propriétés de l'objet. J'ai lancé le programme sur une dessin simple et le résultat est identique, que se soit la table ou le fichier... Donc je ne saurais expliquer que ton fichier possède des résultats en m², la table affiche des résultats en mm² alors que les propriétés de l'objet devraient afficher l'aire en cm² >w< Désolée ^^"
nen Posté(e) le 24 mars 2021 Auteur Posté(e) le 24 mars 2021 Je remercie pour ton message et explications🙂. C'est dommage est effet que l'on arrive pas à automatiser avec une macro-commande ou AutoLisp😟. C'est embêtant de répéter la commande "champ" avec tous ses paramètres pour chaque locaux lors d'un projet par exemple. Pourquoi dans le champ "Expression de champ" il y a ce code ci-dessous, si on ne peut pas l'utiliser dans une macro-commande ou dans un AutoLisp, pourquoi l'afficher ? %<\AcObjProp.16.2 Object(%<\_ObjId 2294250187888>%).Area \f "%lu2%zs8%ct8[0.0001]">% Meilleures salutations
(gile) Posté(e) le 24 mars 2021 Posté(e) le 24 mars 2021 Je n'ai jamais dit qu'on n'y arrivait pas. J'ai juste dit que ce n'était pas possible avec une macro-commande. (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:areafield (/ obj pt) (if (and (setq obj (car (entsel))) (setq obj (vlax-ename->vla-object obj)) (vlax-property-available-p obj 'area) (setq pt (getpoint "\nPoint d'insertion: ")) ) (vla-addText (if (= (getvar 'cvport) 1) (vla-get-PaperSpace *acdoc*) (vla-get-ModelSpace *acdoc*) ) (strcat "%<\\AcObjProp.16.2 Object(%<\\_ObjId " (vla-GetObjectIdString *util* obj :vlax-false) ">%).Area \\f \"%lu2%zs8%ct8[0.0001]\">%" ) (vlax-3d-point (trans pt 1 0)) (getvar 'textsize) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
nen Posté(e) le 25 mars 2021 Auteur Posté(e) le 25 mars 2021 Super merci pour ton aide👍. Je me disais bien que le code de l’expression de champ devait servir à quelque chose😋. « Juste » deux petites chose pour le style de texte il le gère comment ? j’ai vu qu’il prenait bien le texte standard mais pour la taille il définit par lui-même une hauteur ? J’ai créé une macro commande « ^C^Careafield » et j’ai placé devant « * » pour créer des surfaces à la volées malheureusement ça bloque le programme il tourne en boucle. Est-ce qu’il y a une autre astuce ? Meilleures salutations
(gile) Posté(e) le 25 mars 2021 Posté(e) le 25 mars 2021 La routine LISP ne gère pas le style ou la hauteur de texte, elle utilise les paramètres courant des textes (TEXTSTYLE, TEXTSIZE). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
nen Posté(e) le 25 mars 2021 Auteur Posté(e) le 25 mars 2021 Merci pour ton message 👍 je connaissais pas ses deux variables🙂. Et pour « * » devant la macro commande « ^C^Careafield --> *^C^Careafield » malheureusement ça bloque le programme il tourne en boucle, je ne peux pas le faire à la Volée.🤔 Meilleures salutations
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant