jerome.s Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 Bonsoir, je suis entrain de créer un petit lisp pour mon apprentissage.je saisis une alti tampon avec getrealje saisis une alti radier avec getrealil me retourne le delta tampon - radier.j'insère ensuite un bloc reportant les 3 valeursmon problème viens du fait qu'il me retourne des résultats avec 15 décimales alors que je n'en souhaite que 2.je suppose un paramétrage de variable mais laquelle. cordialement.
(gile) Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 Salut, Les valeurs des attributs de blocs sont des données de type chaîne (STR), tu vas donc avoir à convertir des nombres réels retournés par getreal en chaînes. La fonction rtos (RealTOString) permet cette conversion et aussi de spécifier le format du nombre et le nombre de décimales. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
jerome.s Posté(e) le 10 octobre 2009 Auteur Posté(e) le 10 octobre 2009 si je comprends bien, cela s'écrit donc :(rtos nom_de_variable 2 2)
(gile) Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 Exact ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
jerome.s Posté(e) le 10 octobre 2009 Auteur Posté(e) le 10 octobre 2009 re, voici donc mon code je souhaite comprendre pourquoi cette commande rtos ne fonctionne pas : (defun c:cotregep () (setq tampon (getreal "Cote Tampon ?")) (setq radier (getreal "Cote Fil d'eau ?")) (setq delta (- tampon radier)) (rtos delta 2 2) (command "inserer" "cote_ep" pause 1 1 0 tampon radier delta) ) merci
(gile) Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 Pour que ça fonctionne, il faut que ATTREQ soit à 1, ATTDIA à 0 et que les attributs ne soit pas prédéfinis. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
didier Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 coucou je me permets de conseiller de mettre la variable DIMZIN à 1sinon tu auras des affichages pourris en cas de valeurs entièrespar exemple si valeur vaut 5(rtos valeur 2 2) renvoie "5"avec dimzin à 1, tu auras "5.00" amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
jerome.s Posté(e) le 10 octobre 2009 Auteur Posté(e) le 10 octobre 2009 Re, voici mo code mis à jour : (defun c:cotregep () (setvar "ATTREQ" 1) (setvar "ATTDIA" 0) (setq tampon (getreal "Cote Tampon ?")) (setq radier (getreal "Cote Fil d'eau ?")) (setq delta (- tampon radier)) (rtos delta 2 2) (command "inserer" "cote_ep" pause 1 1 0 tampon radier delta) ) et voila le dessin que cela me fait : http://img176.imageshack.us/img176/4171/regep.jpg
(gile) Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 La fonction command accepte les argument numériques indifféremment sous forme de nombres ou de chaînes. Tes variables tampon, radier et delta sont des nombres réels, soit tu convertis les variables :(setq tampon (rtos tampon 2 2) radier (rtos radier 2 2) delta (rtos delta 2 2))avant de les passer à command :(command "_.insert" "cote_ep" pause 1 1 0 tampon radier delta) soit tu les convertis dans l'expression command, un exemple :(defun c:cotregep (/ req dia dim tampon radier delta) ;; stocker les valeurs initiales des variables (setq req (getvar "ATTREQ") dia (getvar "ATTDIA") dim (getvar "DIMZIN") ) ; modifier les valeurs des variables (setvar "ATTREQ" 1) (setvar "ATTDIA" 0) (setvar "DIMZIN" 1) (setq tampon (getreal "Cote Tampon ?")) (setq radier (getreal "Cote Fil d'eau ?")) (setq delta (- tampon radier)) (command "_.insert" "cote_ep" pause 1 1 0 (rtos tampon 2 2) (rtos radier 2 2) (rtos delta 2 2) ) ;; restaurer les valeurs initiales des variables (setvar "ATTREQ" req) (setvar "ATTDIA" dia) (setvar "DIMZIN" dim) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 Bonsoir à toutes et tous, Désolé d'intervenir dans ce post mais j'ai une question, Pourquoi avoir écrit => (setvar "ATTREQ" req) (setvar "ATTDIA" dia) (setvar "DIMZIN" dim) pour remettre ces variables à leur état initial, plutôt que => (setvar "ATTREQ" 0) (setvar "ATTDIA" 1) (setvar "DIMZIN" 1) , par exemple,... Merci d'avance, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
didier Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 coucou en faisant ainsi tu fais une " image" de l'état des lieux de la machineil est tout à fait imaginable que celui qui lance le programmea des variables qui ne ressemblent pas aux tiennes. on ne sait pas où tournent nos programmes ... amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
jerome.s Posté(e) le 10 octobre 2009 Auteur Posté(e) le 10 octobre 2009 un grand merci vous je viens de comprendre pourquoi je n'arrivais à obtenir le résultats voulu.Dans mon code, je donnais aux attributs les valeurs de tampon radier et delta puis les fonctions rtos de ces valeurs . Cela ne pouvait donc pas marcher. Merci beaucoup. [Edité le 10/10/2009 par jerome.s]
lili2006 Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 Re, Merci de ta réponse Didier, Cela veut dire que "req" après "ATTREQ" remet cette variable comme elle était avant le lancement de la routine , Alors, pour "SHORTCUTMENU", on mettrait quoi, par exemple ? Ce que je veux dire, c'est comment peut-on savoir ce qu'il faut mettre pour réinitialiser la valeur de la variable au départ ? Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 Avant de changer la valeur de la variable système, on conserve sa valeur initiale dans une variable, puis on ré-attribue cette valeur à la variable système à la fin de la routine.(defun toto (/scm) (setq scm (getvar "SHORTCUTMENU")) ; stocker la valeur initiale (setvar "SHORTCUTMENU" 0) ; modifier la valeur ;; ;; ici le corps de la routine ;; (setvar "SHORTCUTMENU" scm) ; restaurer la valeur (princ) ) Pour plus de sécurité, s'il y a un risque d'erreur (ou que l'utilisateur fasse Echap) dans le corps de la routine, on peut redéfinir localement la fonction*error* pour assurer la restauration de l'environnement initial. (defun toto (/*error* scm) ;; redéfinition de *error* (defun *error* (msg) (princ (strcat "\nErreur: " msg)) (setvar "SHORTCUTMENU" scm) ; restaurer la valeur (princ) ) (setq scm (getvar "SHORTCUTMENU")) ; stocker la valeur initiale (setvar "SHORTCUTMENU" 0) ; modifier la valeur ;; ;; ici le corps de la routine ;; (setvar "SHORTCUTMENU" scm) ; restaurer la valeur (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 Re, Salut Gilles, Merci de ta réponse, il me semblait bien que tu m'avais déjà parlé de cette fonction "error". Mais pourquoi écris-tu "redéfinition de *error*" ? Elle est donc déjà définie par défaut ?Et si oui, quel rôle ? Merci encore, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
(gile) Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 La fonction*error* par défaut affiche un message qui est une description de l'erreur AutoLISP qui a provoqué son lancement.Ce message est l'argument fournit par AutoCAD à la fonction *error* : Commande: (/ 2 0); erreur: division par zéro AutoLISP fournit cette fonction pour pouvoir la redéfinir localement : (defun div (x y / *error*) (defun *error* (msg) (princ (strcat "\nErreur dans la fonction div: " msg)) (princ) ) (/ x (float y))) Commande: (div 2 0)Erreur dans la fonction div: division par zéro Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lili2006 Posté(e) le 10 octobre 2009 Posté(e) le 10 octobre 2009 Re, Merci Gilles, Je n'avais pas trouvé dans ton doc la fonction*error* par défaut , ou bien j'ai mal compris,.. Merci encore, Civil 3D 2025 - COVADIS_18.3b https://www.linkedin...3%ABt-95313341/
jerome.s Posté(e) le 11 octobre 2009 Auteur Posté(e) le 11 octobre 2009 Bonjour, pour continuer dans mon apprentissage, je ne comprends pas comment faire pour obtenir les coordonnées du point d'insertion du bloc que je viens d'insérer. d'après ce que j'ai sous les yeux je pensais que la commande était :((entget (ssname (ssget "D") 10))) où 10 rappelait la paire pointée des coordonnées du point d'insertion mais apparement l'ordinateur ne veut pas le comprendre. Je dois dire que je suis un peu paummé dans ces histoires de paires pointées et autres listes. Pourtant il va bien falloir que ça rentre, je ne désespère pas. Cordialement.
Tramber Posté(e) le 11 octobre 2009 Posté(e) le 11 octobre 2009 (ssget "D") n'existe pas.Tu ne parles à AutoCAD avec ses raccourcis et autres options que via l'instruction (command. Bon. Je selectionne le dernier objet créé avec (entlast) et je parcours sa définition DXF avec (entget (entlast)) J'obtiens une liste. Easy maintenant de parcourir cette liste. Assoc trouve la (première) paire pointée dont le premier élément est 10. (assoc 10(entget (entlast))) Enfin j'extraie l'info en enlevant le 10. (cdr(assoc 10(entget (entlast)))) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
didier Posté(e) le 11 octobre 2009 Posté(e) le 11 octobre 2009 bonjour à Toutes et à Tous, je ne comprends pas pourquoi tu veux obtenir le point d'insertiondu bloc que tu viens de créerpuisque justement c'est toi qui l'a imposé, mais c'est anecdotique.oops je viens de relire et tu as fais un "PAUSE" dans le processus d'insertion... pour te répondre, je te conseille de définir ton point d'insertion avant de créer ton blocde cette façon si tu souhaites le déplacer ultérieurement tu as déjà le point d'insertion en mémoire. par exemple : (setq tampon (getreal "Cote Tampon ?") radier (getreal "Cote Fil d'eau ?") delta (- tampon radier) pins (getpoint "\Point d'insertion ?\n") ) (command "_.insert" "cote_ep" pins 1 1 0 (rtos tampon 2 2) (rtos radier 2 2) (rtos delta 2 2) ) (command "_move" (entlast) "" pins pause ) par ailleurs je viens contredire Tramber je demande le pardon pour mon insolence le ssget pour sélectionner le dernier objet est (setq jeusel (ssget "L")) et çà fontionne mais contrairement aux anciennes versionsce n'est pas le dernier objet crée visible à l'affichage(qu'est ce qu'elle était bien cette possibilité disparue !!!)mais le dernier objet créé tout simplement[surligneur] et là, je te rejoins pour utiliser (entlast) [/surligneur] . amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
jerome.s Posté(e) le 11 octobre 2009 Auteur Posté(e) le 11 octobre 2009 Salut didier, en fait je pensais à l'intérieur de moi-même, tracer une ligne entre le point d'insertion et mon symbole de regard. Mes pensées m'ont conduis à récupérer ces coordonnées dans la base de donnée du bloc de l'isoler de le stocker. Ensuite j'utilise ton code pour récupérer le deuxième point qui le point d'insertion du bloc regard. Cordialement.
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