shergy Posté(e) le 23 octobre 2009 Posté(e) le 23 octobre 2009 Bonjour à tous, Je suis actuellement en cours de développement de tableaux de surfaces automatisés pour le calcul de surfaces de logements.Pour réaliser les tableaux je n'ai pas de problèmes.Ma question est la suivante : y a-t-il un moyen pour arrondir les surfaces à 0.05 m² près ?Dans l'idéal je voudrais pouvoir appeler une commande, cliquer sur la ou les cellules à arrondir et c'est tout. Merci d'avance pour votre aide. Guillaume
3dbebert Posté(e) le 5 novembre 2009 Posté(e) le 5 novembre 2009 bonjour, essaie tout simplement de passer l'unité de ton dessin a 0.00
3dbebert Posté(e) le 5 novembre 2009 Posté(e) le 5 novembre 2009 re, je viens de regarder dans l'aide d'autocad: voila ce qu'il dise de faire: Pour arrondir des valeurs de cote Cliquez sur l' Format Style de cotes.Entrez COTSTYLE sur la ligne de commande. Dans le gestionnaire des styles de cote, sélectionnez le style que vous souhaitez modifier. Cliquez sur Modifier. Dans l'onglet Unités principales de la boîte de dialogue Modifiez le style de cote, entrez la valeur d'arrondi dans la zone Cotes linéaires. Cliquez sur OK. Cliquez sur Fermer pour quitter le gestionnaire des styles de cote. Barre d'outils : Cote ou styles Entrée de commande : COTSTYLE voila
Tramber Posté(e) le 5 novembre 2009 Posté(e) le 5 novembre 2009 Je suppose que tu utilises les champs AIRE d'un objet ?Alors là, la précision se règle. Sinon, tu as l'option FORMAT SUPPL2MENTAIRE de cellule dans les propriétés. Ca marche si tu en selectionne plusieurs à la fois. Un peu comme Excel. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
shergy Posté(e) le 28 décembre 2009 Auteur Posté(e) le 28 décembre 2009 Je sais changer le nombre de décimales.Ce que je veux c'est pouvoir arrondir la valeur d'une surface à 0.05m² près. Avoir 15.25m² au lieu de 15.23m² par exemple. [Edité le 29/12/2009 par shergy]
(gile) Posté(e) le 28 décembre 2009 Posté(e) le 28 décembre 2009 Ce que je veux c'est pouvoir arrondir la valeur d'une surface à 0.05m² près. Avoir 15.25m² au lieu de 15.23m² par exemple. Ça n'est pas possible avec des champs. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
shergy Posté(e) le 28 décembre 2009 Auteur Posté(e) le 28 décembre 2009 existe-t-il un lisp capable de faire ça ?
shergy Posté(e) le 28 décembre 2009 Auteur Posté(e) le 28 décembre 2009 j'ai trouvé ce code mais il ne propose pas d'arrondir les surfaces. Est-il possible de le modifier ? (vl-load-com)(defun c:Curve ( / js obj AcDoc Space nw_style pt htx rtx unit_key unit_draw dxf_cod n ename ll ur nw_obj lremov) (princ "\nSélectionnez un objet curviligne.") (while (null (setq js (ssget "_+.:E:S" (list '(0 . "*POLYLINE,ARC,CIRCLE,ELLIPSE,HATCH") (cons 67 (if (eq (getvar "CVPORT") 1) 1 0)) (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model")) '(-4 . " '(-4 . "&") '(70 . 120) '(-4 . "NOT>") ) ) ) ) (princ "\nCe n'est pas un objet curviligne valable pour cette fonction!") ) (initget 6) (setq htx (getdist (getvar "VIEWCTR") (strcat "\nSpécifiez la hauteur du champ <" (rtos (getvar "TEXTSIZE")) ">: "))) (if htx (setvar "TEXTSIZE" htx)) (if (not (setq rtx (getorient (getvar "VIEWCTR") "\nSpécifiez l'orientation du champ <0.0>: "))) (setq rtx 0.0)) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (cond ((null (tblsearch "LAYER" "Id-Surfaces")) (vlax-put (vla-add (vla-get-layers AcDoc) "Id-Surfaces") 'color 3) ) ) (cond ((null (tblsearch "STYLE" "arial")) (setq nw_style (vla-add (vla-get-textstyles AcDoc) "arial")) (mapcar '(lambda (pr val) (vlax-put nw_style pr val) ) (list 'FontFile 'Height 'ObliqueAngle 'Width 'TextGenerationFlag) (list "arial.shx" 0.0 (/ (* 15.0 pi) 180) 1.0 0.0) ) ) ) (if (or (eq (getvar "USERS5") "") (not (eq (substr (getvar "USERS5") 1 2) "qz"))) (progn (initget "KM ME CM MM") (if (not (setq unit_key (getkword "\nDessin réalisé en [KM/ME/CM/MM] : "))) (setq unit_key "ME") ) (cond ((eq unit_key "KM") (setq unit_draw 1000000) ) ((eq unit_key "ME") (setq unit_draw 1000 unit_key "M") ) ((eq unit_key "CM") (setq unit_draw 10) ) ((eq unit_key "MM") (setq unit_draw 1) ) ) (setvar "USERS5" (strcat "qz" (itoa unit_draw))) ) (progn (setq unit_draw (atoi (substr (getvar "USERS5") 3))) (cond ((eq unit_draw 1000000) (setq unit_key "KM") ) ((eq unit_draw 1000) (setq unit_key "M") ) ((eq unit_draw 10) (setq unit_key "CM") ) ((eq unit_draw 1) (setq unit_key "MM") ) ) ) ) (initget "Unique Multiple _Single Multiple") (if (eq (getkword "\nSélection filtrée [unique/Multiple]: ") "Single") (setq n -1) (setq dxf_cod (entget (ssname js 0)) js (ssget "_X" (foreach m (foreach n dxf_cod (if (not (member (car n) '(0 67 410 8 6 62 48 420 70))) (setq lremov (cons (car n) lremov)))) (setq dxf_cod (vl-remove (assoc m dxf_cod) dxf_cod)) ) ) n -1 ) ) (repeat (sslength js) (setq obj (ssname js (setq n (1+ n))) ename (vlax-ename->vla-object obj) ) (vla-GetBoundingBox ename 'll 'ur) (setq ll (safearray-value ll) ur (safearray-value ur) pt (mapcar '* (mapcar '+ ll ur) '(0.5 0.5 0.5)) nw_obj (vla-addMtext Space (vlax-3d-point pt) 0.0 (strcat "%<\\AcObjProp.16.2 Object(%<\\_ObjId " (itoa (vla-get-ObjectID ename)) ">%).Area \\f \"%lu2%pr2%ps[, " (strcase unit_key T) "²]\">%" ) ) ) (mapcar '(lambda (pr val) (vlax-put nw_obj pr val) ) (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation) (list 5 (getvar "TEXTSIZE") 5 pt "arial" "Id-Surfaces" rtx) ) ) (prin1))
(gile) Posté(e) le 28 décembre 2009 Posté(e) le 28 décembre 2009 Le LISP utilise un champ et, comme dit plus haut, il n'est pas possible d'arrondir la valeur d'un champ Aire à 0.05. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
shergy Posté(e) le 28 décembre 2009 Auteur Posté(e) le 28 décembre 2009 S'il n'est pas possible d'arrondir la valeur d'un champ, est-il possible de le faire avec un texte ? [Edité le 29/12/2009 par shergy]
shergy Posté(e) le 28 décembre 2009 Auteur Posté(e) le 28 décembre 2009 Gile,toi qui es un pro du lisp, tu n'aurais pas un petit bout de code permettant de résoudre ce problème ? Merci d'avance [Edité le 29/12/2009 par shergy]
(gile) Posté(e) le 28 décembre 2009 Posté(e) le 28 décembre 2009 Un petit truc vite fait (ne fonctionne qu'avec des textes ou mtextes ayant une valeur numérique) ;;; ROUND05 (gile) ;;; Arrondit la valeur des textes sélectionnés à 0.05 (defun c:round05 (/ nent elst txt val) (while (setq nent (nentsel)) (setq elst (entget (car nent))) (if (and (wcmatch (cdr (assoc 0 elst)) "*TEXT") (setq val (distof (cdr (assoc 1 elst)))) ) (progn (entmod (subst (cons 1 (rtos (round val 0.05) 2 2)) (assoc 1 elst) elst ) ) (if ( (entupd (car (last nent))) ) ) ) ) (princ) ) ;;; ROUND (gile) ;;; Arrondit à la valeur la plus proche en fonction de prec ;;; (round pi 0.01) -> 3.14 ;;; (round pi 1e-5) -> 3.14159 ;;; (round 5456.50 1.0) -> 5457.0 ;;; (round 5456.50 100.0) -> 5500.0 (defun round (num prec) (if (zerop (setq prec (abs prec))) num (* prec (fix ((if (minusp num) - +) (/ num prec) 0.5))) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 28 décembre 2009 Posté(e) le 28 décembre 2009 Un autre qui permet aussi la séletion de champs (ils seront transformés en mtextes (ou textes) simples. ;;; ROUND05 (gile) ;;; Arrondit la valeur des textes sélectionnés à 0.05 (defun c:round05 (/ nent elst txt val) (while (setq nent (nentsel)) (setq elst (entget (car nent))) (if (and (wcmatch (cdr (assoc 0 elst)) "*TEXT") (setq val (distof (cdr (assoc 1 elst)))) ) (progn (if (and (setq dict (cdr (assoc 360 (member '(102 . "{ACAD_XDICTIONARY") elst))) ) (dictsearch dict "ACAD_FIELD") ) (entdel dict) ) (entmod (subst (cons 1 (rtos (round val 0.05) 2 2)) (assoc 1 elst) elst ) ) (if ( (entupd (car (last nent))) ) ) ) ) (princ) ) ;;; ROUND (gile) ;;; Arrondit à la valeur la plus proche en fonction de prec ;;; (round pi 0.01) -> 3.14 ;;; (round pi 1e-5) -> 3.14159 ;;; (round 5456.50 1.0) -> 5457.0 ;;; (round 5456.50 100.0) -> 5500.0 (defun round (num prec) (if (zerop (setq prec (abs prec))) num (* prec (fix ((if (minusp num) - +) (/ num prec) 0.5)) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
shergy Posté(e) le 28 décembre 2009 Auteur Posté(e) le 28 décembre 2009 je n'arrive pas à sélectionner d'objet. Quand je clique sur un champ ou un texte il ne se passe rien...
(gile) Posté(e) le 28 décembre 2009 Posté(e) le 28 décembre 2009 http://img693.imageshack.us/img693/5053/round05.gif Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
shergy Posté(e) le 29 décembre 2009 Auteur Posté(e) le 29 décembre 2009 Est-il possible de modifier ce code pour que les surfaces données soient arrondies à 0.05m² près ? (defun c:SURF ( / sav_dim sav_lup sav_att zone ent_zone surf_x surf_t surf_1 position) (setvar "CMDECHO" 0) (setq sav_dim (getvar "DIMZIN")) (setq sav_lup (getvar "LUPREC")) (setq sav_att (getvar "ATTDIA")) (setvar "DIMZIN" 0) (setvar "ATTDIA" 0) (if (not precision) (progn (initget 4) (setq precision (getint (strcat "\nEntrer la précision désiré <" (itoa (getvar "LUPREC")) ">: " ) ) ) ) ) (if (not precision) (setq precision (getvar "LUPREC"))) (setvar "LUPREC" precision) (setq surf_t 0.0) (if (not unite) (progn (initget "KM² M² CM² MM²") (setq unite (getkword "\nEntre l'unité utilisé [KM²/M²/CM²/MM²] : ")) ) ) (if (not unite) (setq unite "M²")) (while (setq zone (getpoint "\nPointez dans la zone/: ")) (command "_.-boundary" zone "") (setq ent_zone (entlast)) (command "_area" "_ob" ent_zone) (setq surf_x (getvar "area")) (setq surf_t (+ surf_t (getvar "area"))) (entdel ent_zone) ); (if(<(strlen (rtos (rem surf_t (fix surf_t)) 2 precision)) 4); (setq surf_1 (strcat (rtos surf_t 2 precision) "0")) (setq surf_1 (rtos surf_t 2 precision )); ) (initget 9) (setq position (getpoint "\nPosition du bloc : ")) (command "_.-insert" "surface" position 1 1 0 "" (strcat surf_1 " " unite)) (command "_.eattedit" (entlast)) (setvar "DIMZIN" sav_dim) (setvar "LUPREC" sav_lup) (setvar "ATTDIA" sav_att) (princ)) ; ==== Création d'un tableau de surface ====(defun c:TAB ( / sav_dim sav_lup sav_att choix surf_total ht_htx bloc nb_bloc compte position type surface) (setvar "CMDECHO" 0) (cond ((tblsearch "BLOCK" "SURFACE") (setq sav_dim (getvar "DIMZIN")) (setq sav_lup (getvar "LUPREC")) (setq sav_att (getvar "ATTDIA")) (setvar "DIMZIN" 0) (setvar "LUPREC" precision) (setvar "ATTDIA" 0) (initget 7 "Tous Sélection") (setq choix (getkword "\nChoix du calcul avec Bloc [Tous/Sélection] : ")) (setq surf_total 0) (setq ht_txt (cdr (assoc 40 (entget (entnext (cdr (assoc -2 (tblsearch "BLOCK" "SURFACE")))))))) (if (= ht_txt nil) (setq ht_txt (getvar "textsize")) ) (if (= choix "Tous") (setq bloc (ssget "x" (list (cons 0 "INSERT") (cons 2 "SURFACE")))) (progn (princ "\nSélectionnez les blocs SURFACE : ") (setq bloc (ssget (list (cons 0 "INSERT") (cons 2 "SURFACE")))) ) ) (setq nb_bloc (sslength bloc)) (setq compte 0) (if (/= nb_bloc nil) (progn (initget 9) (setq position (getpoint "\nPosition du tableau ; ")) (repeat nb_bloc (if (= (cdr (assoc 2 (entget (ssname bloc compte)))) "surface") (progn (setq type (cdr (assoc 1 (entget (entnext (ssname bloc compte)))))) (setq surface (cdr (assoc 1 (entget (entnext (entnext (ssname bloc compte ))))))) (setq surf_total (+ surf_total (atof surface))) (command "_.-insert" "liste" position 1 1 0 type surface) (setq position (list (car position) (- (cadr position) (* 2.4 ht_txt)))) ) ) (setq compte (1+ compte)) ) (command "_.-insert" "liste" position 1 1 0 "TOTAL" (strcat (rtos surf_total 2 precision) " " unite)) ) ) (setvar "DIMZIN" sav_dim) (setvar "LUPREC" sav_lup) (setvar "ATTDIA" sav_att) ) (T (alert "\nUtiliser d'abord SURF pour définir les surfaces") ) ) (princ))(princ "\n==> SURF pour insérer la surface d'une zone / TAB pour créer une liste")(princ)
(gile) Posté(e) le 29 décembre 2009 Posté(e) le 29 décembre 2009 Salut, Ce que j'ai fait ne te conviens pas ? Pour modifier le code (pas testé)dans SURF, tu supprimes :(if (not precision) (progn (initget 4) (setq precision (getint (strcat "\nEntrer la précision désiré (itoa (getvar "LUPREC")) ">: " ) ) ) ) ) (if (not precision) (setq precision (getvar "LUPREC"))) (setvar "LUPREC" precision) et tu remplaces :(setq surf_1 (rtos surf_t 2 precision))par :(setq surf_1 (rtos (rond surf_t 0.05) 2 2)) et dans TAB, tu remplaces :(strcat (rtos surf_total 2 precision) " " unite)par :(strcat (rtos (round surf_total 0.05) 2 2) " " unite) Il faut que la routine round donnée plus haut soit chargée. PS : quand tu postes du code, mets le entre les balises bbcode "code" (le bouton #) il sera plus facile de le lire. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
shergy Posté(e) le 29 décembre 2009 Auteur Posté(e) le 29 décembre 2009 ça marche super.Encore une question. La surface donnée est celle de la polyligne sélectionnée, est-il possible de lier les deux, à savoir lorsque l'on étire le polyligne la surface change de manière dynamique ?
(gile) Posté(e) le 29 décembre 2009 Posté(e) le 29 décembre 2009 Ce que tu demandes est possible mais nécessite l'utilisation de réacteurs ce qui nécessite un travail non négligeable. J'avais fait TotalArea qui lie dynamiquement des attributs de bloc à la surface d'un ou plusieurs objets et permet de spécifier une unité d'affichage des surfaces différent de l'unité de dessin ainsi que le nombre de décimales affichées (mais pas d'arrondir à 0.05). Pour moi, ce LISP fixe la limite de ce que je m'autorise à distribuer gracieusement (j'essaye de gagner ma vie en faisant du développement sur mesure) comme je disais ici, je ne modifierai plus ce programme pour des besoins spécifiques, mais libre à chacun de le faire. Tu as de la chance, je suis dans un "bon jour". Je te donnes donc les modifications à apporter pour faire fonctionner TotalArea suivant tes besoins. Dans la routine c:AreaBox, remplace :(setenv "AreaPrec" (itoa (getvar "LUPREC")))par :(setenv "AreaPrec" (rtos (expt 10. (- (getvar "LUPREC"))))) Dans la routine TotalAreaBox, remplace :(setenv "AreaPrec" (itoa (getvar "LUPREC")))par :(setenv "AreaPrec" (rtos (expt 10. (- (getvar "LUPREC"))))) Dans la routine c:TotalArea, remplace :(rtos (/ tot (distof (getenv "areaConv"))) 2 (atoi (getenv "AreaPrec")) )par :(roundtostring (/ tot (distof (getenv "areaConv"))) (atof (getenv "AreaPrec")) ) Dans la routine c:AreaPrec, remplace :(setenv "AreaPrec" (itoa (getvar "LUPREC")))par :(setenv "AreaPrec" (rtos (expt 10. (- (getvar "LUPREC")))))et :(= 'INT (type (read r))) ( par : [code](= 'REAL (type (read r))) ( Dans la routine gc:TotalAreaUpd, remplace : [code](rtos (/ tot (distof (getenv "areaConv"))) 2 (atoi (getenv "AreaPrec")) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
shergy Posté(e) le 29 décembre 2009 Auteur Posté(e) le 29 décembre 2009 Je vais essayer ça tout de suite.Dans tous les cas je te remercie beaucoup pour ton aide. Bonnes fêtes de fin d'année.
shergy Posté(e) le 29 décembre 2009 Auteur Posté(e) le 29 décembre 2009 j'ai fais toutes les modifs et je tombe sur ce message :Erreur: type d'argument incorrect: stringp 0.01
shergy Posté(e) le 29 décembre 2009 Auteur Posté(e) le 29 décembre 2009 autant pour moi CA MARCHE !!!!! ENCORE MERCI
(gile) Posté(e) le 29 décembre 2009 Posté(e) le 29 décembre 2009 Il y avait effectivement une erreur :dans c:AreaBox et TotalAreaBox, il fallait mettre :(setenv "AreaPrec" (rtos (expt 10. (- (getvar "LUPREC")))))et pas :(setenv "AreaPrec" (expt 10. (- (getvar "LUPREC")))) Comme cette erreur n'est pas dans c:AreaPrec, tu as pu initialiser la variable (les 2 premiers ne servent qu'au premier lancement après installation sur un nouveau poste. PS : je corrige mon précédent message Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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