DenisHen Posté(e) le 12 juin 2015 Posté(e) le 12 juin 2015 Bonjour à tous, Voilà, j'ai fait une macro qui demande à l'utilisateur de :1. cliquer un texte (une altitude), 2. cliquer un autre texte (une profondeur), 3. de cliquer un point (début de la future ligne de rappel), 4. de cliquer un autre point (fin de la ligne de rappel et insertion d'un Mtext qui comportera plusieurs de renseignements), 5. cliquer la direction du Mtext (orientation du MText).Cette macro peut placer ce Mtext avec, au plus complet :X=... Y=... Z=... Prof=... Zgs=...(ou Zgs est la génératrice supérieure, Zgs=Alti-Prof) Mais, à la première demande, j'aimerais laisser le choix pour, soit cliquer l'altitude, soit taper "C" pour "Configurer" le nombre de données comprises dans le MText. Car parfoit, on n'a pas besoin de l'X et de l'Y voir même du Z. Le MText sera donc :Z=... Prof=... Zgs=... Voir aussi, Prof=... Zgs=... La première demande à l'utilisateur se fait : (setq Txt_Alti (car (entsel "\nSélectionnez l'altitude :"))) Mais j'aimerai qu'elle soit plutôt comme ça :(setq Txt_Alti (car (ent??? "\nSélectionnez l'altitude ou taper C pour configurer l'étiquette :"))) Les questions de configurations seront simples :Indiquer l'X et l'Y ? <Oui>/Non : Indiquer le Z ? <Oui>/Non :Je placerai les différentes réponces avec "vlax-ldata" dans le dessin pour les réutiliser plus tard sans reconfigurer à chaque lancement de la macro. Je n'ai rien trouvé dans le formidable "Introduction à AutoLISP" de (gile). J'espère être assez claire... Merci d'avance, Denis Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
bonuscad Posté(e) le 12 juin 2015 Posté(e) le 12 juin 2015 Bonjourj'aimerais laisser le choix pour, soit cliquer l'altitude, soit taper "C" pour "Configurer" Je te suggère de faire une recherche sur le site avec entsel_getstringTu trouveras des propositions de (gile) ou moi même (qui date, mais qui doivent encore être fonctionnelles) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
DenisHen Posté(e) le 12 juin 2015 Auteur Posté(e) le 12 juin 2015 Bonjours bonuscad, Merci pour cette réponse, je vais de ce pas faire cette recherche... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
DenisHen Posté(e) le 12 juin 2015 Auteur Posté(e) le 12 juin 2015 Re, J'ai beau essayer, je n'arrive à rien, j'ai écris ça, qui est un mixe de l'ancienne macro et des conseils que j'ai trouvés dans le lien ci-dessus : (InitGet 128) (setq Rep (entsel "\nCliquer sur une altitude ou entrer 'C' pour configurer : ")) (cond ((= (type Rep) 'STR) (setq Config Rep)) ((= (type Rep) 'LIST) (progn (wcmatch (cdr (assoc 0 (setq elst (entget Rep)))) "*ALTI") (setq Alti (cdr (assoc 1 elst))) ) ;_ Fin de progn ) ; ) ;_ Fin de cond Quand je clique sur une Altitude (dans un calque "*ALTI"), AutoCAD me répond :Commande: (c:Rens_PTRL)Cliquer sur une altitude ou entrer 'C' pour configurer : ; erreur: type d'argument incorrect: lentityp (<Nom d'entité: 7ffffb10a00> (769527.0 6.88267e+006 0.0)); redéfinir après erreur Et quand je tape "C", il me répond :Commande: (c:Rens_PTRL)Cliquer sur une entité ou entrer 'C' pour configurer : C *Sélection non valable*Attend un point ou Dernier Cliquer sur une entité ou entrer 'C' pour configurer : *Annuler*; erreur: Fonction annulée J'avoue que j'atteind mes limites là. Je ne sais pas trop adapter "Entsel_Getstring" ni "GetEntStr" à mon besoin... Si quelqu'un a déjà une réponse, je suis preneur... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
zebulon_ Posté(e) le 12 juin 2015 Posté(e) le 12 juin 2015 Bonjour, la fonction (initget [bits] [chaine]) permet d'établir différentes options qui seront utilisées par la prochaine fonction getxxx, entsel, nentsel (sauf getstring, getenv et getvar). La fonction entsel que tu utilises fait donc partie de la liste des fonctions "sensibles" à initget. entsel ne gère que les mots clés entrés dans [chaine] car cette fonction ne prend en compte aucun bit de contrôle. (initget 128) est donc inutile avec entsel. (defun c:initsel ( / Txt_Alti) (while (/= (type Txt_Alti) 'LIST) (initget "Configurer") (if (not (setq Txt_Alti (entsel "\nSélectionner l'altitude ou [Configurer] <Configurer>"))) (setq Txt_Alti "Configurer") ) (if (= Txt_Alti "Configurer") (progn (alert "configurer ici") ) ) ) (setq Txt_Alti (car Txt_Alti)) ) Quant aux questions qui appellent des réponses oui/non, je te propose de regarder l'aide de getkword, qui fait partie des fonctions getxxx dont je parle ci-dessus et qu'on peut utiliser également avec initget AmicalementVincent 2 C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
GEGEMATIC Posté(e) le 12 juin 2015 Posté(e) le 12 juin 2015 salut,ton initget doit comprendre les mots clefgenre (initget "Undo Configurer")qui te permet d'avoir comme retour soit Undo soit ConfigurerGégé ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
DenisHen Posté(e) le 12 juin 2015 Auteur Posté(e) le 12 juin 2015 Merci à tous, Voilà, le code de Vincent fonctionne nikel, je l'ai donc adapté à mes besoins... Ce n'est qu'un début, mais j'ai maintenant ça : (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY" EtiqXY)) (setq EtiqZ (vlax-ldata-get "DenisH" "EtiqPTRL_Z" EtiqZ)) (while (/= (type Txt_Alti) 'LIST) (initget "Configurer") (if (not (setq Txt_Alti (entsel "\nSélectionner l'altitude ou [Configurer] <Configurer>"))) (setq Txt_Alti "Configurer") ) ;_ Fin de if (princ (strcat "\nTxt_Alti 1 =" Txt_Alti)) (if (= Txt_Alti "Configurer") (progn (if (/= EtiqXY "") (progn (initget 1 "Oui Non") (setq EtiqXY (getkword (strcat "\nÉcrire l'X et l'Y [Oui/Non] ? <" EtiqXY ">"))) (if (= EtiqXY "") (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY" EtiqXY)) ) ;_ Fin de if ) ;_ Fin de progn (progn (initget 1 "Oui Non") (setq EtiqXY (getkword (strcat "\nÉcrire l'X et l'Y [Oui/Non] ? <Oui>"))) (if (= EtiqXY "") (setq EtiqXY (vlax-ldata-put "DenisH" "EtiqPTRL_XY" EtiqXY)) ) ;_ Fin de if ) ;_ Fin de progn ) ;_ Fin de if ) ;_ Fin de progn ) ;_ Fin de if ) ;_ Fin de while Mais quand je clique une altitude, AutoCAD me répond :Sélectionner l'altitude ou [Configurer] <Configurer>; erreur: type d'argument incorrect: stringp (<Nom d'entité: 7ffffb10a40> (769527.0 6.88266e+006 0.0)) Et quand je confirme pour accéder à la configuration :Sélectionner l'altitude ou [Configurer] <Configurer> Txt_Alti 1 =Configurer; erreur: type d'argument incorrect: stringp nil Je pense que c'est mon "(if (/= EtiqXY "")" qui doit déconner... Bon, je vous dis à tous "Excellent week-end", je verrai ça lundi, si je ne bidouille pas ce week-end... Et encore merci... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
zebulon_ Posté(e) le 12 juin 2015 Posté(e) le 12 juin 2015 (princ (strcat "\nTxt_Alti 1 =" Txt_Alti)) arrivé là, pose-toi la question de ce qu'il y a dans Txt_Alti. Si ce n'est pas un texte, forcément, ça va planter la fonction strcat. Ensuite, plus loin, je n'ai pas trop essayé de comprendre, mais il y a une chose qui est certaine : quand on a une série de if, il est souvent plus simple et plus lisible d'utiliser (cond (test1 resultat1 ...) ...) En gros, c'est plus simple de faire une étude de cas plutôt qu'une série de if imbriqués et des progn à la pelle. Au niveau de la boucle while, on peut aussi rajouter une condition supplémentaire pour vérifier si l'utilisateur a cliqué sur le bon élément. Je pense qu'avec un or, ça devrait fonctionner. Par exemple, si je ne veux accepter que les lignes (defun c:initsel ( / Txt_Alti) (while (or (/= (type Txt_Alti) 'LIST) (/= (cdr (assoc 0 (entget (car Txt_Alti)))) "LINE")) (initget "Configurer") (if (not (setq Txt_Alti (entsel "\nSélectionner l'altitude ou [Configurer] <Configurer>"))) (setq Txt_Alti "Configurer") ) (if (= Txt_Alti "Configurer") (progn (alert "configurer ici") ) ) ) (setq Txt_Alti (car Txt_Alti)) ) or évalue les expressions de gauche à droite, en cherchant une expression non-nil. Si une telle expression est trouvée, or ne fait plus d'autres évaluations et retourne T. Si toutes les expressions sont nil, or retourne nil. Au départ, Txt_alti contient nil ; (/= (type nil) 'LIST) retourne T ; or s'arrête là et retourne T. Puis, mettons qu'on tape "C" au clavier ; (/= (type "Configurer") 'LIST) retourne T ; or s'arrête là et retourne T. Puis, mettons qu'on sélectionne un objet ; (/= (type '(<Nom d'entité: 7ffffb05e00> (2401.32 1472.43 0.0))) 'LIST) retourne nil ; on passe au deuxième élément du or qui ne retournera un deuxième nil que s'il s'agit d'une ligne. L'intérêt du or est justement qu'il ne fait plus d'autres évaluations dès qu'une expression non-nil est trouvée, ce qui nous permet d'utiliser dans la seconde partie du or des fonctions entget, assoc, cdr, car... qui ne fonctionnent bien que lorsqu'elles agissent sur une liste. On imagine bien que, si la deuxième partie du or était évaluée lorsque Txt_Alti contient "Configurer", cela provoquerait un plantage immédiat. La fonction and présente le même intérêt, puisqu'elle stoppe toute évaluation et retourne nil, si l'une des expression resulte en nil ; la fonction and retourne T uniquement lorsque toutes les expressions retournent T. par exemple :(and nil (car "A"))renvoie nil et ne plante pas le lisp (and T (car "A"))renvoie ; erreur: type d'argument incorrect: consp "A" ; et plante le lisp Dans le lisp plus haut, on a utilisé une boucle Tant que Condition ... ...Répéterqui fonctionne 0 fois ou n fois ; et là c'est le ou logique qui s'impose. Dans d'autre langages, il y a une boucle avec la condition d'arrêt à la fin (repeat until du Pascal par exemple, mais qui n'existe pas en lisp) Répéter ... ...Jusque Conditionqui fonctionne 1 fois ou n fois ; et là, je pense qu'on aurait plutôt utilisé le et logique Bonne bidouille ! AmicalementVincent 2 C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
DenisHen Posté(e) le 12 juin 2015 Auteur Posté(e) le 12 juin 2015 Re à tous, Merci à toi Vincent, et aux autres aussi, mais avec tous ces nil, T, If, Cond, Or ou encore And, en ajoutant à celà des parenthèses dans tous les sens... J'avoue que je m'y perd sérieusement. Je vais essayé d'expliquer ce dont j'ai besoin, j'ai commencé la programmation avec le Pascal (très peu), le Turbo Pascal, puis la Basic, le Turbo Basic et ensuite avec VB5, VB6 et VBA... Je suis donc très loin de la "logique" LiSP... Bien qu'elle reste assez "pure" et extrèmement efficace... Voici : (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY" EtiqXY)) (setq EtiqZ (vlax-ldata-get "DenisH" "EtiqPTRL_Z" EtiqZ)) (while (or (/= (type Txt_Alti) 'LIST) (/= (cdr (assoc 0 (entget (car Txt_Alti)))) "LINE")) (initget "Configurer") (if (not (setq Txt_Alti (entsel "\nSélectionner l'altitude ou [Configurer] <Configurer>"))) (setq Txt_Alti "Configurer") ) (Si Txt_Alti n'est pas une entité sélectionnée (Alors ((Si Txt_Alti = "Configuration" ET EtiqXY <> "") (si oui demander Oui ou Non et proposer l'ancienne réponse par défaut) (si non exiger une réponse, Oui OU Non) ) ((Si Txt_Alti = "Configuration" ET EtiqZ <> "") (si oui demander Oui ou Non et proposer l'ancienne réponse par défaut) (si non exiger une réponse, Oui OU Non) ) (Si non (setq Txt_Alti (car Txt_Alti)) ) Je ne vois pas trop comment m'en sortir sans If... Mais avec le LiSP, je ne m'en sors pas tellement... J'y verais peut-être plus clair lundi. Bien concentrer sur le problème... Bien qu'au boulo, ils ne voient pas l'intérêt des "programmations"... Ils ne comprennent pas le gain de temps et l'absence de sources d'erreur dûe à l'entrée de données manuellement. Je préfère pour ma part, utiliser les données brutes du terrain plutôt que de les resaisir à la main... Qui est, on le sait tous, une abération... Sur ce, bon week-end à tous et vive les BBQ... C'est la saison... Merci encore à tous, Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
zebulon_ Posté(e) le 14 juin 2015 Posté(e) le 14 juin 2015 Bonjour, (/= (cdr (assoc 0 (entget (car Txt_Alti)))) "LINE")a été pris comme exemple. Cela ne doit pas s'adapter à ton cas (bloc ou attribut ou texte ?) après ces lignes (if (not (setq Txt_Alti (entsel "\nSélectionner l'altitude ou [Configurer] <Configurer>"))) (setq Txt_Alti "Configurer") )Txt_Alti ne peut contenir que "Configurer" ou une liste renvoyée par entsel (Si Txt_Alti n'est pas une entité sélectionnée peut donc se dire (if (= Txt_Alti "Configurer") (progn ... )) Ainsi, (Si Txt_Alti = "Configuration" dans le alors devient inutile, puisqu'on en est déjà sûr ! Et il suffit de tester successivement EtiqXY et EtiqZ, avec des if puisque tu veux tester l'un ET l'autre ; cond n'est donc pas plus simple dans ce cas. Je me demandais aussi à quel endroit tu veux faire le vlax-ldata-put et je me demandais aussi si les vlax-ldata-get du début ne te renvoient pas un nil lors du premier lancement de ce lisp dans un nouveau fichier alors que, plus loin, tu compares avec <> "". Nil et "", c'est pas pareil ! Pour terminer(Si non (setq Txt_Alti (car Txt_Alti)) n'est pas placé judicieusement. Il faut attendre d'être sorti de la boucle while, dont on ne sort que lorsqu'on a sélectionné une entité (la bonne de préférence). Donc, à la sortie du while, on peut se contenter de (setq Txt_Alti (car Txt_Alti)) AmicalementVincent 2 C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
DenisHen Posté(e) le 15 juin 2015 Auteur Posté(e) le 15 juin 2015 Bonjour à tous, Voilà ce que j'ai "réussi" à faire : (if (= (vlax-ldata-get "DenisH" "EtiqPTRL_XY") nil) (vlax-ldata-put "DenisH" "EtiqPTRL_XY" "O") ) ;_ Fin de if (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY")) ; (if (= (vlax-ldata-get "DenisH" "EtiqPTRL_Z") nil) (vlax-ldata-put "DenisH" "EtiqPTRL_Z" "O") ) ;_ Fin de if (setq EtiqZ (vlax-ldata-get "DenisH" "EtiqPTRL_Z")) ; (while (/= (type Txt_Alti) 'LIST) (initget "Configurer") (if (not (setq Txt_Alti (entsel "\nSélectionner l'altitude ou [Configurer] <Configurer>"))) (setq Txt_Alti "Configurer") ) ;_ Fin de if (if (= Txt_Alti "Configurer") (progn (initget 1 "Oui Non") (setq EtiqXY (getkword (strcat "\nÉcrire l'X et l'Y [Oui/Non] ? <" EtiqXY ">"))) (if (/= EtiqXY "") (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY" EtiqXY)) ) ;_ Fin de if (initget 1 "Oui Non") (setq EtiqZ (getkword (strcat "\nÉcrire le Z [Oui/Non] ? <" EtiqZ ">"))) (if (/= EtiqZ "") (setq EtiqZ (vlax-ldata-get "DenisH" "EtiqPTRL_Z" EtiqZ)) ) ;_ Fin de if ) ;_ Fin de progn ) ;_ Fin de if ) ;_ Fin de while (setq Txt_Alti (car Txt_Alti)) Deux petites choses que je ne comprend pas, 1. lorsque je fais [Entrer] à la première question "Sélectionner l'altitude ou [Configurer] <Configurer>", Il passe bien à la suite, mais si je fais [Entrer] quand il me demande Oui/Non, je dois obligatoirement entrer une réponse, il n'accèpte pas "rien" pour ne pas changer la réponse par défaut. Ca devrait ce régler dans le (iniget. 2. si je sélectionne directement une altitude (un texte) il me répond :Sélectionner l'altitude ou [Configurer] <Configurer>; erreur: type d'argument incorrect: stringp <Nom d'entité: 7fffc967c10> Je pense que c'est le Txt_Alti que j'interprète mal... Mais je ne sais pas trop où... Zébulon : mes vlax-ldata- sont inclus dans le DWG. Merci encore à tous. Denis... PS : j'aimerais savoir s'il y a un moyen d'intéroger toutes les vlax-data d'un DWG. ReDenis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
zebulon_ Posté(e) le 15 juin 2015 Posté(e) le 15 juin 2015 mais si je fais [Entrer] quand il me demande Oui/Non, je dois obligatoirement entrer une réponse, il n'accèpte pas "rien" pour ne pas changer la réponse par défaut. il faut regarder l'aide de initget, notamment le tableau qui donne la signification des valeurs de bits. Si tu écris (initget 1 "Oui Non"), le bit 1, signifie "Interdit l'entrée nulle". Si tu veux accepter l'entrée nulle, il faut écrire (initget "Oui Non"). Le getkword qui suivra pourra donc renvoyer soit "Oui", "Non" ou nil (defun c:initsel ( / Txt_Alti) (if (not (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY"))) (setq EtiqXY "Oui") ) (while (/= (type Txt_Alti) 'LIST) (initget "Configurer") (if (not (setq Txt_Alti (entsel "\nSélectionner l'altitude ou [Configurer] <Configurer>"))) (setq Txt_Alti "Configurer") ) (if (= Txt_Alti "Configurer") (progn (initget "Oui Non") (setq EtiqXY (cond ((getkword (strcat "\nÉcrire l'X et l'Y [Oui/Non] ? <" EtiqXY ">"))) (EtiqXY) ) ) ) ) ) (vlax-ldata-put "DenisH" "EtiqPTRL_XY" EtiqXY) (setq Txt_Alti (car Txt_Alti)) ) si je sélectionne directement une altitude (un texte) il me répond :entsel n'est pas polyvalent à ce point ! Cette fonction permet de sélectionner une entité ou de taper des textes qu'on trouve dans la partie [chaine] de initget. On imagine bien qu'on ne peut pas prévoir toutes les altitudes dans cette chaine de caractères. Il me semble que la solution serait de rajouter une option dans initget : (initget "Saisie Configurer"), puis de faire un cond pour tester si l'utilisateur a tapé "Saisie" ou "Configurer". Dans le cas "Configurer", on fait ce qu'il y a ci-dessus, dans le cas "Saisie", on fait un getdist. A noter que getdist est sensible aux bits d'initget : 1 pas de nul, 2 pas de zéro, 4 pas de négatif. Un (initget 7) me semblerait pas mal, sauf si on peut avoir des données négatives ou nulles. Dans ce cas (initget 1). PS : j'aimerais savoir s'il y a un moyen d'intéroger toutes les vlax-data d'un DWG. (vlax-ldata-list dict) renvoie les valeurs stockées dans un dictionnaire. AmicalementVincent 2 C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
DenisHen Posté(e) le 15 juin 2015 Auteur Posté(e) le 15 juin 2015 Re, Bon, je pense que ça devient trop compliqué pour moi. J'ai donc fais deux "commandes", - une qui effectue la "Configuration" des étiquettes : DHConfEtiqPTRL - l'autre qui lance la commande pour inserer le Mtext : Rens_PTRL. J'ai donc maintenant pour configurer :(defun c:DHConfEtiqPTRL (/) (if (or (= (vlax-ldata-get "DenisH" "EtiqPTRL_XY") nil) (= (vlax-ldata-get "DenisH" "EtiqPTRL_XY") "") ) ;_ Fin de or (vlax-ldata-put "DenisH" "EtiqPTRL_XY" "O") ) ;_ Fin de if (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY")) ; (if (or (= (vlax-ldata-get "DenisH" "EtiqPTRL_Z") nil) (= (vlax-ldata-get "DenisH" "EtiqPTRL_Z") "") ) ;_ Fin de or (vlax-ldata-put "DenisH" "EtiqPTRL_Z" "O") ) ;_ Fin de if (setq EtiqZ (vlax-ldata-get "DenisH" "EtiqPTRL_Z")) ; (initget 1 "Oui Non") (setq EtiqXY (getkword "\nÉcrire l'X et l'Y [Oui/Non] ? ")) (initget 1 "Oui Non") (setq EtiqZ (getkword "\nÉcrire le Z [Oui/Non] ? ")) (vlax-ldata-put "DenisH" "EtiqPTRL_XY" (strcase EtiqXY)) (vlax-ldata-put "DenisH" "EtiqPTRL_Z" (strcase EtiqZ)) (princ (strcat "\n\nConfiguration actuelle : Étiquette XY = " (vlax-ldata-get "DenisH" "EtiqPTRL_XY") " Étiquette Z = " (vlax-ldata-get "DenisH" "EtiqPTRL_Z") ) ;_ Fin de strcat ) ;_ Fin de princ ) Et pour créer le MText :(defun c:Rens_PTRL (Calq / Txt_Alti Alti TxtProf Prof Zgs pt_ins Text ClaqCourant X Y pt_ins_Txt angl_Txt) (princ "\nInsertion d'étiquette X,Y,Z,Pf,Zgs depuis Alti et Prof") (setq old_osmd (getvar "osmode") old_abase (getvar "angbase") old_adir (getvar "angdir") old_aunits (getvar "aunits") old_osmode (getvar "osmode") ) ;_ Fin de setq (setvar "osmode" 1) (setvar "angbase" 0) (setvar "angdir" 0) (setvar "cmdecho" 0) (setvar "aunits" 0) (setvar "osmode" 1) ; (if (= (vlax-ldata-get "DenisH" "EtiqPTRL_XY") nil) (vlax-ldata-put "DenisH" "EtiqPTRL_XY" "OUI") ) ;_ Fin de if (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY")) ; (if (= (vlax-ldata-get "DenisH" "EtiqPTRL_Z") nil) (vlax-ldata-put "DenisH" "EtiqPTRL_Z" "OUI") ) ;_ Fin de if (setq EtiqZ (vlax-ldata-get "DenisH" "EtiqPTRL_Z")) ; ; (setq Txt_Alti (entsel "\nSélectionner l'altitude")) ;) (setq Txt_Alti (car Txt_Alti)) (wcmatch (cdr (assoc 0 (setq elst (entget Txt_Alti)))) "*ALTI") (setq Alti (cdr (assoc 1 elst))) (setq Txt_Prof (car (entsel "\nSélectionnez la profondeur :"))) (wcmatch (cdr (assoc 0 (setq elst (entget Txt_Prof)))) "*PROF") (setq Prof (cdr (assoc 1 elst))) (setq Zgs (rtos (- (atof Alti) (atof Prof)) 2 2)) (princ (strcat "\nZgs=" Zgs)) (setvar "osmode" 1) (setq pt_ins (getpoint "\nPoint du PTRL : ")) (setvar "osmode" 0) (setq CalqCourant (strcat Calq "_ETIQ")) (princ "\nCalque courant : ") (princ CalqCourant) (command "-calque" "e" CalqCourant "") (setq X (rtos (car pt_ins) 2 2)) (setq Y (rtos (cadr pt_ins) 2 2)) (setq pt_ins_Txt (getpoint "\nPoint d'insertion du texte : ")) (command "_.line" pt_ins pt_ins_Txt "") (setq angl_Txt (getangle pt_ins_Txt "\nOrientation du texte : ")) (setq angl_Txt (/ (* angl_Txt 180) pi)) (setq Ins (getstring "\nChoix de la justification du texte (HG, HD, BG, BD...) : ") ;_ Fin de getstring ) ;_ Fin de setq ;(princ "\Choix du point d'insertion : ") (if (= (vlax-ldata-get "DenisH" "EtiqPTRL_XY") "OUI") (setq Text (strcat "X=" X "\\PY=" Y "\\P")) (setq Text "") ) ;_ Fin de if (if (= (vlax-ldata-get "DenisH" "EtiqPTRL_Z") "OUI") (setq Text (strcat Text "Z=" Alti "\\P")) ) ;_ Fin de if (setq Text (strcat Text "Pf=" Prof "\\PZgs=" Zgs) ;_ Fin de strcat ) ;_ Fin de setq (command "textstyle" "Etiquette") (command "_.-MTEXT" pt_ins_Txt "R" angl_Txt "J" Ins pt_ins_Txt Text "") ;_ Fin de command ;_ Fin de command ;_ Fin de command ;(princ "\nEtiquette Ok") ;Réaffectation des variables AutoCAD (setvar "osmode" old_osmd) (setvar "angbase" old_abase) (setvar "angdir" old_adir) (setvar "aunits" old_aunits) (setvar "osmode" old_osmode) (princ) ) La commande "Rens_PTRL" se lance comme ça :^C^C(c:Rens_PTRL "DET_RES_CHA") Ou "DET_RES_CHA" équivaut au début du futur nom du calque qui sera "DET_RES_CHA" + _"ETIQ". Et merci encore à tous, Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
zebulon_ Posté(e) le 15 juin 2015 Posté(e) le 15 juin 2015 (= VARIABLE nil) peut aussi se dire (not VARIABLE) à quel moment on affecte la valeur "" à la ldata ? Si c'est un événement qui ne se produit jamais, cela ne sert à rien de le vérifier et le or semble inutile au début de DHConfEtiqPTRL Tantôt, tu affectes la valeur "O", tantôt la valeur "OUI". Il faudrait choisir, je dirais plutôt "OUI". Pour moi, l'algorithme serait : 1 je mets dans une variable le contenu du dictionnaire. Si c'est nil, j'initialise la variable avec la valeur par défaut, disons "Oui"2 je pose la question "Oui" "Non" que je stocke dans la même variable3 je mets le contenu de la variable dans le dictionnaire Donc, un vlax-ldata-get au début et un vlax-ldata-put à la fin. Entre les 2, c'est dans une variable. (defun c:DHConfEtiqPTRL (/ EtiqXY EtiqZ) (if (not (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY"))) (setq EtiqXY "Oui") ) (if (not (setq EtiqZ (vlax-ldata-get "DenisH" "EtiqPTRL_Z"))) (setq EtiqZ "Oui") ) (initget "Oui Non") (setq EtiqXY (cond ((getkword (strcat "\nÉcrire l'X et l'Y [Oui/Non] ? <" EtiqXY ">"))) (EtiqXY) ) ) (initget "Oui Non") (setq EtiqZ (cond ((getkword (strcat "\nÉcrire le Z [Oui/Non] ? <" EtiqZ ">"))) (EtiqZ) ) ) (princ (strcat "\n\nConfiguration actuelle : Étiquette XY = " EtiqXY " Étiquette Z = " EtiqZ ) ;_ Fin de strcat ) ;_ Fin de princ (vlax-ldata-put "DenisH" "EtiqPTRL_XY" EtiqXY) (vlax-ldata-put "DenisH" "EtiqPTRL_Z" EtiqZ) (princ) ) pour réutiliser les valeurs par défaut dans getkword, j'ai enlevé le strcat. Donc, je stocke "Oui" ou "Non". Mais dans l'autre programme on peut tout aussi bien écrire (= VARIABLE "Oui") AmicalementVincent 2 C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Patrick_35 Posté(e) le 15 juin 2015 Posté(e) le 15 juin 2015 Bonjour zebulon_(or (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY")) (setq EtiqXY "Oui") )Revient à faire(if (not (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY"))) (setq EtiqXY "Oui") ) @+ 1 Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
VDH-Bruno Posté(e) le 15 juin 2015 Posté(e) le 15 juin 2015 Bonjour zebulon_(or (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY")) (setq EtiqXY "Oui") )Revient à faire(if (not (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY"))) (setq EtiqXY "Oui") ) @+ Oui et pour mémoire il me semble que cela peut également s'établir en natif, avec l'argument optionnel [default-data] de la fonction vlax-ldata-get:(vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui") A+ 1 Apprendre => Prendre => Rendre
Patrick_35 Posté(e) le 15 juin 2015 Posté(e) le 15 juin 2015 Oui et pour mémoire il me semble que cela peut également s'établir en natif, avec l'argument optionnel [default-data] de la fonction vlax-ldata-get:(vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui") A+Ah oui, bien vu Merci Bruno @+ 1 Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
zebulon_ Posté(e) le 15 juin 2015 Posté(e) le 15 juin 2015 Ah oui, bien vu, bis. Comme quoi, il n'est jamais inutile de lire l'aide d'une commande. Quant au or, à la place du if, c'est ce que j'expliquais un peu plus haut.L'intérêt du or est justement qu'il ne fait plus d'autres évaluations dès qu'une expression non-nil est trouvée Le if présenterai un intérêt s'il y avait un sinon. Dans le même esprit que or, on peut aussi utiliser cond. AmicalementVincent 2 C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
VDH-Bruno Posté(e) le 15 juin 2015 Posté(e) le 15 juin 2015 Ah oui, bien vu Ah oui, bien vu, bis. En fait j'étais complétement passé à côté… :D Apprendre => Prendre => Rendre
DenisHen Posté(e) le 15 juin 2015 Auteur Posté(e) le 15 juin 2015 Bon, les enfants, ça suffit les bagarres ;-) ,alors on dit quoi, que veut dire exactement "(vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui")" ? On le place dans un (setq ? Que s’il n’y a rien dans "(vlax-ldata-get "DenisH" "EtiqPTRL_XY")" on lui affecte par défaut la valeur « Oui » ? Il n'y a pourtant pas de -put ? Cette valeur sera dans un (setq ? comme dans (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui")) où EtiqXY sera "Oui" si le vlax-ldata est vide ? Et quid de "(setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY" "Oui"))" si elle est vide… Un nil ? Un "" ? Un "Oui" ? Et si on part pour des "Oui" et "Non", Quelle est la vrai valeur de EtiqXY dans (initget "Oui Non") (setq EtiqXY (cond ((getkword (strcat "\nÉcrire l'X et l'Y [Oui/Non] ? <" EtiqXY ">"))) (EtiqXY) ) ) Je pense, d'après mes pauvres tests que c'est "Oui" ou "Non"... Je verais tous ça demain gentlemen, vous m'avez perdu avec toutes vos remarques ! ! ! ;-) Demain j'aurais quelques minutes de libre pour essayer tous ça... En tout cas, merci à tous... Et bonne soirée... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
DenisHen Posté(e) le 16 juin 2015 Auteur Posté(e) le 16 juin 2015 Re, Voici je que j'ai fais ce matin pour le LiSP de "Configuration" :(defun c:DHConfEtiqPTRL (/) (if (not (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY"))) (setq EtiqXY "Oui") ) ;_ Fin de if (if (not (setq EtiqZ (vlax-ldata-get "DenisH" "EtiqPTRL_Z"))) (setq EtiqZ "Oui") ) ;_ Fin de if (if (not (setq EtiqCalq (vlax-ldata-get "DenisH" "EtiqPTRL_Calq"))) (setq EtiqCalq "_ETIQ") ) ;_ Fin de if ; (initget 1 "Oui Non") (setq EtiqXY (cond ((getkword (strcat "\nÉcrire l'X et l'Y [Oui/Non] ? <" EtiqXY ">") ) ;_ Fin de getkword ) (EtiqXY) ) ;_ Fin de cond ) ;_ Fin de setq (initget 1 "Oui Non") (setq EtiqZ (cond ((getkword (strcat "\nÉcrire le Z [Oui/Non] ? <" EtiqZ ">")) ) (EtiqZ) ) ;_ Fin de cond ) ; (setq EtiqCalq (getstring (strcat "Quelle 'extention' du calque utiliser <" EtiqCalq "> ? ") ) ;_ Fin de getstring ) ;_ Fin de setq (if (= EtiqCalq "") (setq EtiqCalq "_ETIQ") ) ;_ Fin de if (vlax-ldata-put "DenisH" "EtiqPTRL_XY" EtiqXY) (vlax-ldata-put "DenisH" "EtiqPTRL_Z" EtiqZ) (vlax-ldata-put "DenisH" "EtiqPTRL_Calq" EtiqCalq) (princ (strcat "Configuration actuelle : Étiquette XY = " (vlax-ldata-get "DenisH" "EtiqPTRL_XY") " Étiquette Z = " (vlax-ldata-get "DenisH" "EtiqPTRL_Z") ) ;_ Fin de strcat ) ;_ Fin de princ (princ) ) Et pour le LiSP de création du Mtext :(defun c:Rens_PTRL (Calq / Txt_Alti Alti TxtProf Prof Zgs pt_ins Text ClaqCourant X Y pt_ins_Txt angl_Txt) (princ "\nInsertion d'étiquette X,Y,Z,Pf,Zgs depuis Alti et Prof") (setq old_osmd (getvar "osmode") old_abase (getvar "angbase") old_adir (getvar "angdir") old_aunits (getvar "aunits") old_osmode (getvar "osmode") ) ;_ Fin de setq (setvar "osmode" 1) (setvar "angbase" 0) (setvar "angdir" 0) (setvar "cmdecho" 0) (setvar "aunits" 0) (setvar "osmode" 1) ; (if (not (setq EtiqXY (vlax-ldata-get "DenisH" "EtiqPTRL_XY"))) (setq EtiqXY "Oui") ) ;_ Fin de if (if (not (setq EtiqZ (vlax-ldata-get "DenisH" "EtiqPTRL_Z"))) (setq EtiqZ "Oui") ) ;_ Fin de if (if (not (setq EtiqCalq (vlax-ldata-get "DenisH" "EtiqPTRL_Calq"))) (setq EtiqCalq "_ETIQ") ) ;_ Fin de if (setq Txt_Alti (entsel "\nSélectionner l'altitude")) ;) (setq Txt_Alti (car Txt_Alti)) (wcmatch (cdr (assoc 0 (setq elst (entget Txt_Alti)))) "*ALTI") (setq Alti (cdr (assoc 1 elst))) (setq Txt_Prof (car (entsel "\nSélectionnez la profondeur :"))) (wcmatch (cdr (assoc 0 (setq elst (entget Txt_Prof)))) "*PROF") (setq Prof (cdr (assoc 1 elst))) (setq Zgs (rtos (- (atof Alti) (atof Prof)) 2 2)) (princ (strcat "\nZgs=" Zgs)) (setvar "osmode" 1) (setq pt_ins (getpoint "\nPoint du PTRL : ")) (setvar "osmode" 0) (setq CalqCourant (strcat Calq (vlax-ldata-get "DenisH" "EtiqPTRL_Calq"))) (princ "\nCalque courant : ") (princ CalqCourant) (command "-calque" "e" CalqCourant "") (setq X (rtos (car pt_ins) 2 2)) (setq Y (rtos (cadr pt_ins) 2 2)) (setq pt_ins_Txt (getpoint "\nPoint d'insertion du texte : ")) (command "_.line" pt_ins pt_ins_Txt "") (setq angl_Txt (getangle pt_ins_Txt "\nOrientation du texte : ")) (setq angl_Txt (/ (* angl_Txt 180) pi)) (setq Ins (getstring "\nChoix de la justification du texte (HG, HD, BG, BD...) : ") ;_ Fin de getstring ) ;_ Fin de setq ;(princ "\Choix du point d'insertion : ") (if (= (vlax-ldata-get "DenisH" "EtiqPTRL_XY") "Oui") (setq Text (strcat "X=" X "\\PY=" Y "\\P")) (setq Text "") ) ;_ Fin de if (if (= (vlax-ldata-get "DenisH" "EtiqPTRL_Z") "Oui") (setq Text (strcat Text "Z=" Alti "\\P")) ) ;_ Fin de if (setq Text (strcat Text "Pf=" Prof "\\PZgs=" Zgs) ;_ Fin de strcat ) ;_ Fin de setq (command "textstyle" "Etiquette") (command "_.-MTEXT" pt_ins_Txt "R" angl_Txt "J" Ins pt_ins_Txt Text "") ;_ Fin de command ;_ Fin de command ;_ Fin de command ;(princ "\nEtiquette Ok") ;Réaffectation des variables AutoCAD (setvar "osmode" old_osmd) (setvar "angbase" old_abase) (setvar "angdir" old_adir) (setvar "aunits" old_aunits) (setvar "osmode" old_osmode) (princ) ) Par contre, dans le (setq EtiqCalq (getstring (strcat "Quelle 'extention' du calque utiliser <" EtiqCalq "> ? ") ) ;_ Fin de getstring ) ;_ Fin de setq A quoi est égal EtiqCalq si on ne répond rien à la question ? Et merci à tous pour tous ces conseils... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
zebulon_ Posté(e) le 16 juin 2015 Posté(e) le 16 juin 2015 Bonjour (wcmatch (cdr (assoc 0 (setq elst (entget Txt_Alti)))) "*ALTI") ça tombe dans le vide et ne sert à rien si ce n'est pas évalué par un if, or, cond ... A quoi est égal EtiqCalq si on ne répond rien à la question ? (getstring) suivi de <┘ renvoie "", donc dans EtiqCalq tu auras, non pas nil, mais une chaine vide "". A noter que getstring n'est pas sensible à initget. Elle peut aussi permettre de saisir une chaine qui contient des blancs. On sais que la barre d'espace est synonyme de <┘ et, si on écrit(setq a (getstring "Quel est votre nom ? ")) on ne pourra entrer que "Dupond" ou "Jean" mais pas "Jean Dupond", puisque la barre d'espace valide la saisie et fait sortir de la fonction.Pour contourner ce problème, la syntaxe est :(setq a (getstring T "Quel est votre nom")) et la chaine d'entrée pourra contenir des blancs et ne se terminera que par <┘ AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
DenisHen Posté(e) le 16 juin 2015 Auteur Posté(e) le 16 juin 2015 Bonjour Vincent, merci pour cette réponse, 1. je n'ai pas saisi, tu veut dire que je peut supprimer la ligne du (wcmatch ? 2. j'ai donc maintenant :(setq EtiqCalq (getstring T (strcat "Quelle 'extention' du calque utiliser <" EtiqCalq "> ? ") ) ;_ Fin de getstring ) ;_ Fin de setq (if (= EtiqCalq "") (setq EtiqCalq "_ETIQ") ) ;_ Fin de if Merci pour tes réponses... Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
zebulon_ Posté(e) le 16 juin 2015 Posté(e) le 16 juin 2015 (wcmatch chaine modèle) revoie T ou nil. Si on ne fait rien de cette information, cela ne sert à rien. On s'attendrait à (if (wcmatch chaine modèle) (faire ceci) (sinon faire cela)), ou un or, un cond, un while... une fonction quelconque qui évalue une donnée booléenne. En l'état actuel, si tu enlèves la ligne, ça ne marchera pas mieux ni moins bien. Tu gagneras un 1/4 de milliseconde peut être. Mais ton but est de vérifier SI ce qui a été saisi correspond à quelque chose de précis. On sent bien qu'il manque quelque chose. Quand au (getstring T ...), le T n'est intéressant que si tu veux autoriser des blancs " " dans EtiqCalq. A toi de voir. Au niveau de la logique, mettons qu'à un moment l'utilisateur a saisi "_TAG" à mettre dans la variable EtiqCalq. Si on relance DHConfEtiqPTRL une deuxième fois, le getstring affichera"Quelle 'extention' du calque utiliser <_TAG> ? ", et si l'utilisateur appuie sur <┘ EtiqCalq sera remis à "_ETIQ" par le if. Ce n'est pas ce que tu veux !Le promblème est que si tu fais :(setq EtiqCalq (getstring T (strcat "Quelle 'extention' du calque utiliser <" EtiqCalq "> ? ") ) ;_ Fin de getstring ) ;_ Fin de setqtu perds l'ancienne valeur de EtiqCalq. Si l'utilisateur tape une nouvelle valeur, ce n'est pas grave, mais s'il tape <┘, tu ne sauras plus où trouver l'ancienne valeur de cette variable. Deux solutions, il faut se mettre de côté l'ancienne valeur dans une autre variable ou ne pas écraser l'ancienne valeur en utilisant une nouvelle variable. (setq Temp (getstring (strcat "Quelle 'extention' du calque utiliser <" EtiqCalq "> ? ") ) ;_ Fin de getstring ) ;_ Fin de setq (if (/= Temp "") (setq EtiqCalq Temp) ) ;_ Fin de if Dans ce cas, EtiqCalc n'est changé que si l'utilisateur a vraiment saisi quelque chose. Dans le cas contraire, EtiqCalq reste inchangé. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
DenisHen Posté(e) le 16 juin 2015 Auteur Posté(e) le 16 juin 2015 Merci Vincent de prendre le temps d'une explication claire... Je comprend mieux maintenant. Merci encore, Denis... Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
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