Aller au contenu

Petite amelioration SVP


Messages recommandés

Posté(e)

Hello

 

Comme vous le savez, je suis une "quiche" en Lisp/VLisp mais de temps en temps je fais des micro-micro adaptations / ameliorations sur des routines existantes ...

 

J'ai donc adapte la routine suivante et je ne sais absolument pas comment arrondir a 0/1/2/3 decimales le contenu de l'attribut qui est en fait l'altitude Z du point (pt) et donc du futur bloc insere sur le point !?

(setq ALTZ (caddr pt))

... marche bien mais je recois dans la tete au moins 10 decimales !!!

 

J'imagine qu'il faudrait faire appel a qq chose (fonction de base Lisp/VLisp ou fonction externe) pour avoir seulement N decimales mais je ne sais pas faire !

 

A votre bon coeur, Merci d'avance ...

 

Bye, le crabe

 


;;; 
;;; Routine pour dessiner un Bloc (avec UN attribut) sur des points graphiques
;;; Version 2.1 corrigee pour ne traiter que des Points et remplir UN attribut 
;;; 
;;; Commande:  P2B1
;;;
;;;--------------------------------------------------------------------;
;;; PNT2BLK.LSP (--> P2B1)  -  July 2001 - Original Routine 
;;; Place a block object in the location of selected point objects.
;;;--------------------------------------------------------------------;
;;; 
;;; Function: PNT2BLK --> P2B1   - Function to convert point objects to blocks
;;; Block must be already defined (or inserted) in the current drawing
;;; Block must have ONE attribute which will be populated with Z (Altitude) 
;;; 

(defun c:p2b1 ( / ss ct len e eb bname pt attdiahold echohold ALTZ )

;;; get command echo setting and store it
(setq echohold (getvar "CMDECHO"))

;;; set command echo off
(setvar "CMDECHO" 0)

;;; get attribute request setting and store it
(setq attdiahold (getvar "ATTDIA"))
(setvar "ATTDIA" 0)

;;; set attribute request ON
(setvar "ATTREQ" 1)

;;; get name of block to insert
(setq bname (getstring "\nBlock name: "))

;;; check that the block is defined in the current drawing
(if (tblsearch "block" bname)
(progn

;;; prompt for point selection
(princ "\nSelect point objects:")

;;; --- if point were selected ---

(if (setq ss (ssget '((0 . "POINT"))))

(progn

;;; walk through point objects
(setq len (sslength ss))
(setq ct 0)
(while (< ct len)

;;; for each point
(setq e (ssname ss ct))
(setq ct (+ ct 1))
(setq eb (entget e))

;;; get insert point
(setq pt (cdr (assoc 10 eb)))

;;; get attribute value : Z --> ALTZ
(setq ALTZ (caddr pt)) 

;;; insert the block
(command "_insert" bname pt "" "" "" ALTZ)

)
)
(princ "\nNo point  objects selected.")
)
)
(princ "\nInvalid, block not defined in drawing.")
)

;;; restore command echo setting to stored value
(setvar "CMDECHO" echohold)

;;; restore attribute request setting to stored value
(setvar "ATTDIA" attdiahold)

(princ)
) 

Autodesk Expert Elite Team

Posté(e)

Bonjour,

 

Il y a peut être plus judicieux mais j'avais l'habitude de combiner 2 fonctions

- RTOS qui permet de transformer un réel en chaine à l'arrondissant

- ATOF qui permet de transformer une chaine en réel.

 

Donc dans ton cas

(setq ALTZ (atof (rtos (caddr pt) 2 nb-arr))

 

ou nb-arr est le nombre de chiffre après la virgule que tu souhaite.

 

voila

Autodesk Expert Elite Member

Posté(e)

Hello

 

OK merci pour le coup de main : en fait je connaissais RTOS et j'avais completement oublie !

 

Donc voila >>>

 

;;; NB_ARR = number of decimals = 2 (default)

(setq NB_ARR 2)

(setq ALTZ (rtos (caddr pt) 2 NB_ARR ) )

 

A la place de >>>

(setq ALTZ (caddr pt) )

 

Et cela me donne satisfaction ...

 

Bye, lecrabe

Autodesk Expert Elite Team

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é