Aller au contenu

zebulon_

Membres
  • Compteur de contenus

    1 489
  • Inscription

  • Dernière visite

  • Jours gagnés

    19

Tout ce qui a été posté par zebulon_

  1. Tu n'es pas le premier... ou encore Ok je m'arrête. Désolé, c'est sans doute à cause d'une déshydratation due à la canicule :D Bon, vais aller soigner ma déshydratation ! Amicalement Vincent
  2. Bonjour, (defun c:Fle (/ LONG LARG EPAIS pt_Deb pt_Fin pt_Fl) (setq LONG (vlax-ldata-get "DenisH" "LONG" 3.0)) (setq LARG (vlax-ldata-get "DenisH" "LARG" 2.0)) (setq EPAIS (vlax-ldata-get "DenisH" "EPAIS" 0.1)) (prompt (strcat "\nLongueur : " (rtos LONG 2 3) ", lArgeur : " (rtos LARG 2 3) ", Epaisseur : " (rtos Epais))) (while (/= (type pt_Deb) 'LIST) (initget 1 "Longueur lArgeur Epaisseur") (setq pt_Deb (getpoint "\nPointe de la flèche ou [Longueur/lArgeur/Epaisseur] <Longueur> : ")) (cond ((= pt_Deb "Longueur") (initget 7) (setq LONG (getdist "\nLongueur : ")) ) ((= pt_Deb "lArgeur") (initget 7) (setq LARG (getdist "\nlArgeur : ")) ) ((= pt_Deb "Epaisseur") (initget 7) (setq EPAIS (getdist "\nEpaisseur : ")) ) ) ) (initget 1) (setq pt_Fin (getpoint pt_Deb "\nPied de la flèche : ")) (setq pt_Fl (polar pt_Deb (angle pt_Deb pt_Fin) Long)) (command "_.pline" "_non" pt_Deb "_w" 0 Larg "_non" pt_Fl "_w" Epais Epais "_non" pt_Fin "" ) ;_ Fin de command (command "_.pline" "_non" pt_Deb "_w" 0 0 "") (vlax-ldata-put "DenisH" "LONG" LONG) (vlax-ldata-put "DenisH" "LARG" LARG) (vlax-ldata-put "DenisH" "EPAIS" EPAIS) (princ) ) ;_ Fin de defun Pour revenir sur notre discussion récente concernant la possibilité de demander plusieurs choses à l'utilisateur : ci-dessus un lisp qui permet de paramétrer en cours d'utilisation. Un peu comme la commande raccord qui permet de rentrer la valeur du rayon en cours de commande. Je trouve cette manière de faire plus souple d'utilisation : on paramètre par défaut les valeurs qui nous semblent les plus standards et on les modifie en cours de route si besoin. Par ailleurs, (command "_.pline" "_non" pt_Deb "_w" 0 0 "") je suppose que c'est juste pour remettre l'épaisseur de polyligne à 0. On peut aussi, plus simplement, modifier la variable PLINEWID. (setvar "PLINEWID" 0) Encore mieux, ce serait de sauvegarder la valeur de PLINEWID dans une variable au début du lisp et remettre cette valeur à la fin. (setq PLW (getvar "PLINEWID")) ... ... (setvar "PLINEWID" PLW) du coup, on laisse les choses comme on les a trouvé au départ. Compte tenu que je rentre les valeurs de longueur, largeur et épaisseur par un getdist, je peux brider cette fonction avec un initget (pas de vide, de nul, de négatif...), ce qui supprime un certain nombre de vérifications a posteriori. Amicalement Vincent
  3. Je suis curieux de voir cela ! Amicalement Vincent
  4. Une idée de sujet de projet pour tes étudiants : avec Autocad, commment faire une hachure courbe qui suit une courbe ? :D Sans rire, l'aide d'AutoCAD à propos des motifs de hachures nous apprend que Ils ont le sens de l'humour, je trouve ! Mettre la main sur un éditeur de texte : ça, c'est à la portée de tout le monde, mais pour le reste, créer un .pat pour AutoCAD demande vraiment plus qu'un peu d'expérience et vraiment beaucoup de patience. Cela fait longtemps qu'on devrait pouvoir faire des hachures à partir d'un modèle graphique dans la commande de hachurage d'Autocad, sans avoir à passer par des tools et des bricolages divers et variés. Dans un .pat, on décrit un objet graphique par des lignes de texte ! C'est à peu près aussi débile que les .dcl, dans le même genre. Amicalement Vincent
  5. ça marche assez bien avec un réseau polaire, avec la même méthode RESEAU + DELIM. Il faut tout de même faire attention à DELIM parce que la polyligne de contour ne peut contenir que des segments droits. (c'est valable pour toute la famille des commandes DELIM : DELIMIMAGE etc...) J'ai réalisé la "part de gâteau" en utilisant le même bloc et en trichant sur les facteurs d'échelle en Y. Le bloc le plus proche du centre a un facteur Y=1, puis il augmente de 1 à 2% à chaque fois pour épouser au mieux la forme de la portion comprise entre 2 rayons. Après, on fait un réseau polaire puis un delim. Cela se raccorde pas trop mal, il faut déjà faire un zoom assez proche pour voir que ce n'est pas 100% Amicalement Vincent Pavés.zip
  6. Les plus grands font 10x10, les plus petits 7x7. Pour faire le réseau, j'ai copié le bloc d'origine en bas à gauche de ma zone à remplir. Je l'ai décalé de 0.75 vers la gauche pour commencer sur un demi module. Puis j'ai fait un réseau de 5 colonnes espacées de 1.50m et de 91 rangées de 0.22 (je suis parti d'une longueur de route de 20m). Enfin j'ai fait un DELIM en sélectionnant le contour de 6x20m Sur mon fichier, tu peux faire un DELIM Supprimer pour voir le réseau complet. Si on regarde cette image ici, on dirait que c'est possible dans un virage. Mais là, il faudrait réfléchir à la meilleure manière de faire. (réseau circulaire + bloc adapté en forme de "part de gâteau", ou un truc de ce genre) Amicalement Vincent
  7. Bonjour, le bloc que j'ai fourni correspond à un appareil en arc de cercle et à un module de 1.50m qui s'adapte assez bien à une chaussée de 6m. Sinon, si ce n'est pas 1.50m, il suffit de jouer un peu sur le facteur d'échelle du bloc. Ci-joint une chaussée de 6m avec le même bloc un peu modifié (il était plus grand que nécessaire), dessinée avec la méthode RESEAU + DELIM. L'image fournie par Bonuscad correspond à un appareil en queue de paon. Il faudrait mettre la main sur une image du même genre pour un appareil en arc de cercle. Peut-être que quelqu'un a ça en magasin ? J'espère aussi que la chaussée à dessiner est rectiligne, parce que s'il y a une virage, cela dépasse mes compétences ! Amicalement Vincent Pavés.zip
  8. avec un bloc ou une image, pour rejoindre le propos de Bonuscad Amicalement Vincent
  9. pour ceux qui n'ont pas les express tools, on peut aussi faire un réseau rectangulaire avec le bloc et ensuite rajouter un DELIM sur ce réseau pour afficher uniquement la zone qui nous intéresse. Sur le principe, express tools fait un réseau et met tous les éléments dans un groupe. Puis, fait un DELIM du groupe (je ne sais pas trop comment... :huh: ). Compte tenu qu'avec les versions récentes, il existe des objets de type réseau, on peut faire un DELIM directement sur le réseau rectangulaire, sans passer par un groupe. Donc, sans les express tools, on fait la même chose en 2 commandes : RESEAU + DELIM. DELIM permettant également de changer facilement un contour pour un autre Amicalement Vincent
  10. Bonjour, autre piste : utiliser SUPERHATCH des expresstools. Le plan joint vous donne un bloc qui se répète joliment. C'est sans aucun doute plus simple à réaliser qu'un .pat qui devient très vite très compliqué... Amicalement Vincent Pavés.zip
  11. Bonjour, parce que getstring ne renvoie pas nil mais "" après un <┘, donc on a du mal à utiliser directement des fonctions booléennes comme ici : (cond ((getkword (strcat msg " [Oui/Non] <" rep ">: "))) (rep) ) Amicalement Vincent
  12. Bonjour, On peut savoir ce qu'il y a en jeu ? :D Je pense que tu as gagné, de peux... J'ai le manuel (les 2 premières pages ci-jointes) et il est daté de mars 1999. De mémoire, dans le bureau d'études dans lequel je bossais à l'époque, on avait une HP650C qui a été remplacée par une HP1050C et c'était vers fin 1998, début 1999. Je m'en souviens, parce que c'est là que j'ai démissionné ! Haaa, maintenant qu'on a un nouveau traceur, tu pars... pfff... Amicalement Vincent DN_1050_1055sm.pdf
  13. on peut aussi mettre le résultat de (ssget) dans une variable pour l'exploiter avec toutes les fonctions qui commencent par (ss...). ss comme selection set ou jeu de sélection. Outre ssget, il y a ssadd, ssdel, sslength, ssmemb, ssname. Amicalement Vincent
  14. (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 setq tu 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é. Amicalement Vincent
  15. 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 ... (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 <┘ Amicalement Vincent
  16. 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. 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. Amicalement Vincent
  17. (= 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 variable 3 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") Amicalement Vincent
  18. 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)) ) 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). (vlax-ldata-list dict) renvoie les valeurs stockées dans un dictionnaire. Amicalement Vincent
  19. 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)) Amicalement Vincent
  20. 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éter qui 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 Condition qui fonctionne 1 fois ou n fois ; et là, je pense qu'on aurait plutôt utilisé le et logique Bonne bidouille ! Amicalement Vincent
  21. 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 Amicalement Vincent
  22. C'est déroutant parce que tout est tellement imbriqué qu'on se dit, peut être à tort, qu'avec ce style de programmation, il faut que les choses soient bien pensées d'entrée. Il me semble difficile d'écrire un bout, de voir ce que ça donne en regardant ce qu'il y a dans la variable, et de continuer si ça correspond à ce à quoi on s'attend, et ainsi de suite. D'où mon exemple du café :D qui n'est sans doute pas la métaphore la plus géniale pour illustrer mon propos. Sinon, j'écris des lignes de code depuis 1987 et j'ai commencé avec le Turbo Pascal. Autocad et lisp sont venus plus tard à la sortie de la version 12 en 1992. Avant, j'utilisais Microstation V2.0, V3.0, V4.0 qui étaient tellement mieux fichus qu'Autocad R12, mais notre client de l'époque voulait du dwg... et le dwgtranslator de microstation n'était pas génial. Donc, exit microstation et bienvenue à Autocad R12. C'était comme revenir à l'âge de pierre. En plus, quand on connait un logiciel, il est forcément mille fois mieux que celui qu'on ne connait pas. Je veux dire qu'on n'est pas spécialement objectif... Mais il faut quand même reconnaitre que le microstation de l'époque qui tournait sous DOS avait déjà un look windows, alors qu'autocad R12, c'était du MS-DOS... Je suis allé vers Autocad à reculons, mais j'ai bien dû m'y est faire, puis je me suis investi dans le lisp. Aujourd'hui, cela me parait impensable de changer pour autre chose... Mais, s'il le faut... Amicalement Vincent
  23. Super intéressant ! Je dois reconnaitre que cela ne correspond pas à ma culture. Ce n'est pas comme ça que j'ai appris à parler programmation. C'est dingue, c'est écrit avec la même langue, mais cela me parait totalement étranger ! J'ai aussi du mal avec la récursivité, ça explique sans doute. J'aime programmer comme faire du café : je mets le filtre, je mets le café, je mets l'eau (on peut mettre l'eau quand on veut mais pas le café avant le filtre !). En gros, une chose après l'autre... et les variables m'aident bien dans cette démarche, surtout quand il s'agit de débuguer. Je vais donc décortiquer ce code pour essayer d'en comprendre le fonctionnement. Merci Amicalement Vincent
  24. Bonjour, 2 choses pour compléter : il existe une fonction "fossile" (acad_colordlg numcouleur [drapeau]) qui ne gère que les couleurs ACI, la couleur 0 pour dubloc et la couleur 256 pour ducalque (j'allais écrire duplan... :P). Quant à l'argument facultatif [drapeau], si celui-ci est nil, les boutons ducalque et dubloc sont désactivés. L'argument facultatif [drapeau] peut aussi s'utiliser avec la version "moderne" acad_truecolordlg : (acad_truecolordlg '(420 . 15814158) nil) avec la même conséquence. Une idée de code : (defun c:chcol (/ ss e CC TC ACI NUMCOL I) (if (not (setq ss (cadr (ssgetfirst)))) (setq ss (ssget)) ) (if ss (progn ;; initialise avec la couleur du premier élément de ss (setq e (ssname ss 0)) (setq CC (assoc 430 (entget e))) (setq TC (assoc 420 (entget e))) (setq ACI (assoc 62 (entget e))) (cond (CC (setq NUMCOL CC)) (TC (setq NUMCOL TC)) (ACI (setq NUMCOL ACI)) (T (setq NUMCOL '(62 . 256))) ;; couleur ducalque ) (setq NUMCOL (acad_truecolordlg NUMCOL)) (setq I 0) (repeat (sslength ss) (setq e (ssname ss I)) (setq I (1+ I)) (entmod (append (entget e) NUMCOL)) ) ) ) (princ) ) Amicalement Vincent
  25. Bonjour, pour ouvrir la boite de dialogue des couleurs vraies (j'ai choisi la couleur de départ de façon aléatoire) (acad_truecolordlg '(420 . 15814158)) qui renvoie une liste qui peut contenir 3 éléments : si c'est une couleur ACI, la liste a cette allure ((62 . 18)) si c'est une couleur vrai, la liste est ((62 . 133) (420 . 3589577)) si c'est un carnet de couleur, la liste est ((62 . 7) (420 . 15921387) (430 . "PANTONE f + h Cotton$PANTONE 11-0602 TCX")) ça tombe bien, cette liste correspond aux codes dxf qu'on trouve dans les entités : ACI ((-1 . <Nom d'entité: 7ffffb06050>) (0 . "LINE") (330 . <Nom d'entité: 7ffffb03ec0>) (5 . "7D") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 1) (100 . "AcDbLine") (10 179.215 38.7096 0.0) (11 318.781 136.502 0.0) (210 0.0 0.0 1.0)) couleurs vraies ((-1 . <Nom d'entité: 7ffffb06050>) (0 . "LINE") (330 . <Nom d'entité: 7ffffb03ec0>) (5 . "7D") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 40) (420 . 15575826) (100 . "AcDbLine") (10 179.215 38.7096 0.0) (11 318.781 136.502 0.0) (210 0.0 0.0 1.0)) Carnet ((-1 . <Nom d'entité: 7ffffb06050>) (0 . "LINE") (330 . <Nom d'entité: 7ffffb03ec0>) (5 . "7D") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 7) (420 . 15789796) (430 . "PANTONE f + h Cotton$PANTONE 11-4300 TCX") (100 . "AcDbLine") (10 179.215 38.7096 0.0) (11 318.781 136.502 0.0) (210 0.0 0.0 1.0)) qu'il suffit de modifier avec ce que nous renvoie la fonction acad_truecolordlg Amicalement Vincent
×
×
  • 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é