Aller au contenu

Arrondir surfaces


Messages recommandés

Posté(e)

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

 

  • 2 semaines après...
Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
  • 1 mois après...
Posté(e)

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]

Posté(e)

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

Posté(e)

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)

)

Posté(e)

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]

Posté(e)

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

Posté(e)

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

Posté(e)

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)

 

Posté(e)

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

Posté(e)

ç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 ?

Posté(e)

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

Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité