x_all Posté(e) le 26 août 2013 Posté(e) le 26 août 2013 bonjour j'ai fait un petit bout de code pour aidre nos plombier dans la conception cotation des réseaux gravitairele programme pose simplement un texte sur les sommets de la polyligne indiquant le fil d'eau au point.Ces textes temporaires sont détruits quand on en à plus besoin. J'ai donc créer un calque pour les poser, et une fonction pour détruire ce calque. Le problème, c'est que l'utilisateur à la touche échappe facile et qu'il lui arrive de sortir avant que la fonction soit finie. le calque ZFE se retrouve donc courant, et je ne peux plus le détruire... J'ai résolu le pb avec le scu (je ne suis pas sur que mon test soit orthodoxe, mais ça a l'air de marcher) mais pour le calque, je rame... ;;; aide à la conception des réseaux gravitaires, ;;;deux fonctions définies: ;;;zfe pose un texte avec la valeur du fil d'eau en fonction de la pente donnée dans le calque "zfe" ;;;zde efface ces valeurs et détruit le calque (defun c:zfe (/ haut num dist pente pt pt2 inc) ;;; fonction pour poser un texte au point pt et stoker ce pt dans pt2 (defun Posetxt (num pt haut /) (entmake (list (cons 0 "TEXT") (cons 100 "AcDbEntity") (cons 100 "AcDbText") (cons 1 (rtos num)) (cons 10 (trans (cdr pt) 1 0)) (cons 11 (trans (cdr pt) 1 0)) (cons 8 "zfe") (cons 40 haut) ) ) (setq pt2 pt) (princ) ) ;;;mise en mémoire du calque courant et passer zfe en calque courant (setq cc (getvar "clayer")) (if (not (tblsearch "LAYER" "zfe")) (entmakex (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 "zfe") '(70 . 0) '(62 . 32) ) ) ) (setvar "clayer" "zfe") ;;;mise en mémoire du scu courant et passer scu g (if (not (tblsearch "ucs" "scu_init")) (progn (command "_ucs" "_save" "scu_init") (command "_ucs" "_world") ) ) ;;;question et initialisations (or (setq num (getreal "\nfil d'eau de départ départ <0>: ")) (setq num 0.0) ) (or (setq haut (getdist "\nHauteur du texte <0.3>: ")) (setq haut 0.3) ) (princ "\nAttention pente négative pour descendre dans le sens de construction de la polyligne" ) (or (setq pente (getreal "\npente ? <-0.02>: ")) (setq pente -0.02) ) (setq inc 0) (setq dist 0.0) ;;;parcour de l'axe et calculs (and (setq ObjLwHaut (entsel "\nSélectionner l'AXE : ")) (setq ObjLwHaut (entget (car ObjLwHaut))) (eq (cdr (assoc 0 ObjLwHaut)) "LWPOLYLINE") (progn (foreach pt (vl-remove-if-not '(lambda (x) (eq (car x) 10)) ObjLwHaut ) (if (= inc 0) (progn (Posetxt num pt haut) (setq inc 1) ) (progn (setq dist (distance pt pt2)) (setq num (+ num (* dist pente))) (Posetxt num pt haut) ) ) ) ) ) ; Restoration du calque et du scu (setvar "clayer" cc) (command "_ucs" "_restore" "scu_init") (command "_ucs" "_delete" "scu_init") (princ) ) ;------------------------------------------------------- ; Fonction pour détruire le calque des textes temporaires (defun c:zde () (command "_.Laydel" "_n" "zfe" "" "_Y") ) une idée? quelques trucs sur autocad
Patrick_35 Posté(e) le 26 août 2013 Posté(e) le 26 août 2013 Salut Tu créés ton calque (si besoin) lors de la création du texte, pas avant. Pour ton problème de SCU, regarde la fonction lisp TRANS @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
alala Posté(e) le 26 août 2013 Posté(e) le 26 août 2013 Bonjour, un sujet en relation : http://cadxp.com/topic/35020-fonction-error/ Donc dans ton cas il peu être possible de faire ceci : (defun *error* (errmsg) (setvar "osmode" accro) (setvar "cmdecho" echo) (if cc (setvar "clayer" cc) ) (if errmsg (print errmsg) ) (princ) ) Personnellement dans un premier temps je passerai le changement de calque dans la fonction Posetxt de manière à ce qu'il soit le plus rapide possible et presque invisible pour l'utilisateur final. (defun Posetxt (num pt haut /) (setq cc (getvar "clayer")) (setvar "clayer" "zfe") (entmake (list (cons 0 "TEXT") (cons 100 "AcDbEntity") (cons 100 "AcDbText") (cons 1 (rtos num)) (cons 10 (trans (cdr pt) 1 0)) (cons 11 (trans (cdr pt) 1 0)) (cons 8 "zfe") (cons 40 haut) ) ) (setq pt2 pt) (setvar "clayer" cc) (princ) ) @+ C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
x_all Posté(e) le 26 août 2013 Auteur Posté(e) le 26 août 2013 effectivement, créer le calque juste après les entrées utilisateurs résout le pb... merci :) quelques trucs sur autocad
VDH-Bruno Posté(e) le 26 août 2013 Posté(e) le 26 août 2013 Bonjour, Le problème, c'est que l'utilisateur à la touche échappe facile et qu'il lui arrive de sortir avant que la fonction soit finie. le calque ZFE se retrouve donc courant, et je ne peux plus le détruire... ......une idée? Pas besoin de rendre le calque ZFE courant, les lignes suivantes ne servent à rien :(setq cc (getvar "clayer")) (setvar "clayer" "zfe") (setvar "clayer" cc) Car ta fonction Posetxt est définie avec un entmake dans lequel tu spécifie de façon explicite le calque de destination dans la création de ton entité (cons 8 "zfe"). D’ailleurs c’est l’intérêt (ou différence) d’écrire avec entmake (on gère une liste DXF) par rapport à un command (on gère les variables AutoCAD). A+ Apprendre => Prendre => Rendre
x_all Posté(e) le 26 août 2013 Auteur Posté(e) le 26 août 2013 ^^ j'en suis à assembler des lignes de codes piquée ici ou la en essayant de bien comprendre leurs fonctions. Mais beaucoup de subtilités m’échappent encore... merci de ces précisions, je corrige ... ------------edit... Quoi que...créer le calque me permettais d'y attribuer une couleur...à moins de forcer la couleur dans le Entmake...ça a rien de dérangeant pour des textes temporaires, mais j'ai un petit scrupule à ne pas utiliser la couleur du calque... quelques trucs sur autocad
VDH-Bruno Posté(e) le 26 août 2013 Posté(e) le 26 août 2013 Re,Quoi que...créer le calque me permettais d'y attribuer une couleur...à moins de forcer la couleur dans le Entmake...Je ne sais pas vraiment à qui tu réponds.. Dans le doute si c’est à moi, c’est que l’on ne s’est pas compris, ou que je n’ai certainement pas suffisamment développé ma réponse.Je ne pense pas avoir suggérer de ne pas créer le calque au départ de ta routine… ça a rien de dérangeant pour des textes temporaires, mais j'ai un petit scrupule à ne pas utiliser la couleur du calque...Précédemment je faisais seulement remarquer que tu n’avais pas besoin de rendre ton calque courant comme avec command puisque tu utilisais entmake et que tu spécifiais le calque de destination au moyen du code dxf 8. Comme tu ne spécifie pas de code dxf 62 à la création de ton texte, tu utilises la couleur par défaut (celle qui est spécifié dans le contrôle des couleurs si ce n’est pas la couleur DuCalque). Par sécurité tu peux forcer sur DuCalque en ajoutant le code suivant (cons 62 256) dans la définition de ton entité texte avec la fonction entmake Le problème, c'est que l'utilisateur à la touche échappe facile et qu'il lui arrive de sortir avant que la fonction soit finie. le calque ZFE se retrouve donc courant, et je ne peux plus le détruire... Sur ce dernier point, tu peux aisément introduire une vérif du type:(defun c:zde () (if (= "zfe" (getvar "clayer")) (setvar "clayer" "0") ) (command "_.Laydel" "_n" "zfe" "" "_Y") ) A+ Apprendre => Prendre => Rendre
x_all Posté(e) le 26 août 2013 Auteur Posté(e) le 26 août 2013 effectivement, c'est à toi que je te répondais, et effectivement j'avais pas tout compris... j'ai lu quelque par que lors d'un entmake si le calque était pas définit, il était créé, et j'ai fait le raccourci...mais du coup je comprend mieux... Ptin c'est subtil et susceptible un langage de programmation... je suis pas hyper doué pour les langues, mais quand c'est des 'langages machine' aucune chance d'avoir un interlocuteur vaguement compréhensif ou indulgent pour mes fautes de grammaires... je rame... mais c'est intéressant.. quelques trucs sur autocad
Patrick_35 Posté(e) le 26 août 2013 Posté(e) le 26 août 2013 Ptin c'est subtil et susceptible un langage de programmation... je suis pas hyper doué pour les langues, mais quand c'est des 'langages machine' aucune chance d'avoir un interlocuteur vaguement compréhensif ou indulgent pour mes fautes de grammaires... je rame... mais c'est intéressant..C'est comme la langue française.Quand tu regardes un contrat d'assurance par exemple, ce n'est pas pour autant que tu as remarqué tel ou tel article, même si tu l'as lu. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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