Aller au contenu

Luna

Membres
  • Compteur de contenus

    1 113
  • Inscription

  • Dernière visite

  • Jours gagnés

    42

Tout ce qui a été posté par Luna

  1. Le Profil_100 ne correspond-il pas au nom de la présentation ? Si c'est bien le cas, alors tu devrais plutôt avoir ceci en ligne de commande je pense : Commande: FILEDIA Entrez une nouvelle valeur pour FILEDIA <1>: 0 **** Variable système modifiée **** 1 des variables système gérées a été modifiée par rapport à la valeur préférée. Utilisez la commande MONITEURVARSYS pour afficher les modifications. Commande: Commande: -presentation Entrez l'option de présentation [Copier/EFfacer/Nouv/Gabarit/Renommer/Sauvenom/Etablir/?] <établir>: Gabarit Entrez le nom du fichier: P:\Autocad\Gabarit\A4h_gabarit.dwt Entrez le(s) nom(s) de la présentation ou [?]: Profil_100 Commande: Commande: FILEDIA Entrez une nouvelle valeur pour FILEDIA <0>: 1 Bisous, Luna
  2. Luna

    Orhtophoto - Autocad MAP

    Je ne connais pas AutoCAD MAP, mais sur AutoCAD il y a la commande GEOPOSITION qui permet d'avoir une orthophoto par rapport à un système de projection et normalement il y a l'outil "Capturer la zone". Il suffit ensuite de désactiver la carte globale et seule la zone capturée reste présente (sans avoir un .dwg trop lourd). Peut-être est-ce la même chose sur AutoCAD MAP ? Bisous, Luna
  3. Se serait avec plaisir de participer (de même que le challenge des cercles magiques) mais je manque cruellement de temps en ce moment. Donc je vais devoir passer malheureusement.. Bisous, Luna
  4. Coucou, Est-ce moi ou l'armée des bots a réussi à percer une brèche dans nos remparts ? Il y en a 3-4 qui n'arrêtent pas depuis quelques jours (en tout cas de manière visible de mon côté)... Bisous (et bon courage aux modos), Luna
  5. @VDH-Bruno vui la première écriture que j'avais testée c'était avec( (cons ((eval fun) ...) ...) Sauf que mon esprit n'a pas pu s'empêcher de penser à prévoir toujours un peu plus (encore et toujours) ^^" Du coup j'ai ensuite essayer de prévoir le coup avec les fonctions qui n'ont pas d'argument (et j'ai plus l'habitude de passer par (apply) dans ces cas là à cause de (ssget), lorsque j'ai travaillé sur ce principe à l'époque. Et du coup j'avais re-modifié une 3ème fois pour intégrer aussi les fonctions ayant un nombre variable d'arguments (avec val sous forme de liste). Bref, j'ai complexifié l'écriture de la fonction au fur et à mesure que j'écrivais mon message sur CADxp ^^" donc j'ai pas trop réfléchi à re-simplifier ensuite la façon d'y parvenir. Mais en théorie chat fonctionnait malgré tout >n< Bisous, Luna
  6. Coucou, Regarde avec quelque chose comme ceci : (defun foo (lst fun val pos) (cond ( (null lst) lst) ( (zerop pos) (append (list (apply fun (vl-remove nil (list (car lst) val)))) (cdr lst))) ( (cons (car lst) (foo (cdr lst) fun val (1- pos)))) ) ) Pour ton exemple tu peux utiliser (setq ListNb (foo ListNb '+ 1 2)) (0 0 1 0 0 0) ou bien (setq ListNb (foo ListNb '1+ nil 2)) (0 0 1 0 0 0) Sachant que le premier élément de la liste correspond à l'index 0 Bisous, Luna
  7. Coucou, Vui c'est un peu le problème, c'est qu'il est difficile de trouver une solution généralisée pour ce genre de soucis... La réponse de @VDH-Bruno semble parfaite pour ton cas, mais dans le cas où le premier élément est présent dans plusieurs chaînes de caractères, le tri sera moins efficient. Vu la structure, j'aurais fais le tri via un (str2lst) pour comparer chaque premier élément de la liste de retour, puis le second si équivalent, etc... Mais je reconnais que le jour où je met la main sur une fonction de tri généralisée capable de gérer n'importe quelle structure de chaîne de caractères pour la trier correctement d'un point de vue alphanumérique, chat sera du pain béni à mes yeux !! Bisous, Luna
  8. Coucou, Regarde ici : Bisous, Luna
  9. Luna

    Liste multiple en dcl

    Coucou, Je n'ai jamais dénigré tes connaissances et encore moins cherché à être malveillante dans mes propos ! Il en est sûrement de même avec @didier qui ne te visait pas en particulier. Tu es présent sur les forums, et tes messages montrent que tu as tout essayé avant de venir ici. Je reconnais que j'ai pu perdre patience pour ce cas précis (la journée n'avait malheureusement pas aidée pour m'apaiser) et j'en suis désolée. Si chat peut te rassurer, je n'ai pas vraiment eut de formation LISP non plus (juste une mise en bouche très succincte) donc j'ai aussi appris sur le tas depuis 4ans. Les cours de Gilles et Didier m'ont beaucoup aidé, et désormais j'utilise essentiellement l'aide AutoCAD et des .dwg pour apprendre et comprendre de nouvelles choses et continuer de progresser. A vrai dire, je suis presque sûre que toutes les personnes qui prennent le temps d'écrire dans ce forum de programmation n'ont pas eut de réelle formation. C'est un langage assez élitiste donc il n'y a pas de vraiment de formations, c'est beaucoup de formations autodidactes et de patience. Le plus dur n'est pas forcément de développer un programme, c'est d'en parler avec autrui. Aussi bien lorsqu'on est coincé (il est parfois difficile de voir la multitude de chemins amenant vers la solution quand on a arpenté un chemin pendant de nombreuses heures d'effort) que lorsqu'on doit le partager avec d'autres personnes (ni reconnaissance, ni retours, et bien souvent on a du mal à expliquer correctement pourquoi on l'a fait). Donc tout le monde doit faire des efforts, dans les deux sens. Car en tant que développeur, il faut savoir faire des efforts pour apprendre/comprendre de nouvelles choses, de nouvelles fonctionnalités toujours plus complexes et élaborées pour continuer de progresser sans cesse, mais il faut aussi savoir faire des efforts dans le sens inverse pour réussir à être concis, clair, relativement simple tout en restant précis pour les explications que l'on fourni à autrui. L'exercice n'est vraiment pas simple, et plus on progresse dans la complexité des développements et plus la distance entre les deux mondes est grande, rendant la gymnastique beaucoup plus...difficile. Bisous et bon courage pour la suite, Luna
  10. Fichier qui ne permet pas de répondre aux questions... Car je ne sais toujours pas comment associer un bloc bleu à un bloc rouge sans demander explicitement à l'utilisateur de cliquer dessus. Je ne comprends pas ton message explicatif ci-dessus, et il n'y a aucun exemple correspondant dans ton DWG (car si le champ de l'attribut rouge est "cassé", comment vérifier que sa valeur est équivalente à celle d'un bloc bleu ?) ! Bisous, Luna
  11. Coucou, Un .dwg d'exemple ne sera pas de trop ! Car en l'état actuel, je ne peux répondre à la demande car je manque d'infos... Bisous, Luna
  12. Luna

    Détecter conflit dans AutoCAD

    Coucou, Je remarque que tes cercles verts ont des valeurs différentes de 0 pour le Z (ou du moins différentes de l'élévation de tes polylignes) donc forcément le programme n'est pas en mesure de détecter des points d'intersections avec des objets qui ne sont pas sur le même plan. Essaye de repasser tes objets avec un Z=0 et le problème est résolu (idem pour l'élévation de tes polylignes) 😉 Si la propriété en Z doit être conservée, c'est un peu plus... "délicat" comme programme malheureusement (car il faut temporairement affecter des coordonnées Z=0 pour l'ensemble des objets, lancer le programme, puis ré-affecter les Z initiaux). Bisous, Luna
  13. Luna

    Détecter conflit dans AutoCAD

    Coucou, J'allais justement te proposer un programme basé sur l'exemple de LeeMac ^^" Essaye avec ceci pour voir si cela correspond à ton besoin : (defun c:Inter2Layers (/ LM:intersectionbetweensets LM:intersections Object2Layer layer1 layer2 ss ss1 ss2 lst tmp) (defun LM:intersectionsbetweensets ( ss1 ss2 / id1 id2 ob1 ob2 rtn ) (repeat (setq id1 (sslength ss1)) (setq ob1 (vlax-ename->vla-object (ssname ss1 (setq id1 (1- id1))))) (repeat (setq id2 (sslength ss2)) (setq ob2 (vlax-ename->vla-object (ssname ss2 (setq id2 (1- id2)))) rtn (cons (LM:intersections ob1 ob2 acextendnone) rtn) ) ) ) (apply 'append (reverse rtn)) ) (defun LM:intersections ( ob1 ob2 mod / lst rtn ) (if (and (vlax-method-applicable-p ob1 'intersectwith) (vlax-method-applicable-p ob2 'intersectwith) (setq lst (vlax-invoke ob1 'intersectwith ob2 mod)) ) (repeat (/ (length lst) 3) (setq rtn (cons (list (car lst) (cadr lst) (caddr lst)) rtn) lst (cdddr lst) ) ) ) (reverse rtn) ) (defun Object2Layer (msg / ent) (while (not (setq ent (entsel msg))) ) ) (setq param (list "Calque1" "Calque2")) ; Remplacer le nom des calques par défaut ici ! (setq mode 1) ; Définir la valeur de mode sur 0 (= entrer le nom des calques à la main) ou 1 (= sélectionner une entité pour récupérer son calque) (and (cond ( (= 0 mode) (and (or (not (= "" (setq layer1 (getstring T (strcat "\nSpécifier le nom du 1er calque <" (car param) "> : "))))) (setq layer1 (car param)) ) (or (not (= "" (setq layer2 (getstring T (strcat "\nSpécifier le nom du 2nd calque <" (cadr param) "> : "))))) (setq layer2 (cadr param)) ) ) ) ( (= 1 mode) (and (or (and (setq layer1 (entsel (strcat "\nSélectionner une entité du 1er calque <" (car param) "> : "))) (setq layer1 (cdr (assoc 8 (entget (car layer1))))) ) (setq layer1 (car param)) ) (or (and (setq layer2 (entsel (strcat "\nSélectionner une entité du 2nd calque <" (cadr param) "> : "))) (setq layer2 (cdr (assoc 8 (entget (car layer2))))) ) (setq layer2 (cadr param)) ) ) ) ) (null (sssetfirst)) (setq ss (ssadd)) (setq ss1 (ssget "_X" (list (cons 8 layer1) (cons 410 (getvar "CTAB"))))) (setq ss2 (ssget "_X" (list (cons 8 layer2) (cons 410 (getvar "CTAB"))))) (setq lst (LM:IntersectionsBetweenSets ss1 ss2)) (setq tmp (vl-remove nil (mapcar '(lambda (p) (entmakex (list '(0 . "POINT") (cons 10 p) '(62 . 1)))) lst))) (mapcar '(lambda (e) (ssadd e ss)) tmp) (sssetfirst nil ss) (princ (strcat "\nUn total de " (itoa (length tmp)) " / " (itoa (length lst)) " points d'intersections ont été créé avec succès, avec les calques :" "\n " layer1 " : " (itoa (sslength ss1)) " objets" "\n " layer2 " : " (itoa (sslength ss2)) " objets" ) ) ) (princ) ) Il y a seulement 2 lignes modifiables : (setq param (list "Calque1" "Calque2")) ; Remplacer le nom des calques par défaut ici ! (setq mode 1) ; Définir la valeur de mode sur 0 (= entrer le nom des calques à la main) ou 1 (= sélectionner une entité pour récupérer son calque) La première permet de définir le nom des calques 1 et 2 par défaut (donc ici les valeurs par défaut seront "Calque1" et "Calque2" mais tu peux modifier les noms si besoin). La seconde ligne permet de choisir le mode pour spécifier le nom des calques. Donc tu as 2 valeurs autorisées : Le programme te renvoie normalement le nombre de point créés avec succès ainsi que le nombre d'objets pris en compte pour chaque calque. S'il ne renvoie rien, c'est qu'il n'a pas pu créer de points. Les points créés sont sélectionnés à la fin du programme pour pouvoir les vérifier plus facilement, modifier leurs propriétés, etc... Bisous, Luna
  14. Coucou, Regarde du côté des champs dynamiques ! 😉 Une fois dans l'édition d'une cellule de ton tableau, il faut faire clic droit > Insérer un champ... (ou CTRL+H). Tu peux lier la propriété d'Aire de tes objets délimitant tes locaux pour l'insérer dans ta cellule. Il faudra faire chat pour chaque local à la mano cependant mais si tu modifies un objets délimitant tes locaux, l'aire sera automatiquement mise à jour dans ton tableau (après un REGEN) 😉 L'aide AutoCAD concernant les champs dynamiques concernant les propriétés d'objets : https://knowledge.autodesk.com/fr/support/autocad-lt/learn-explore/caas/CloudHelp/cloudhelp/2019/FRA/AutoCAD-LT/files/GUID-F613CBDA-5899-4419-9C23-2E0F6C76BB99-htm.html Bisous, Luna
  15. Luna

    Liste multiple en dcl

    En complément de ma réponse, puisqu'il existe des programmes existants pour faire ce que tu souhaites. En se basant par exemple sur la fonction originelle de (ListBox) de (gile) ci-dessous : ;; ListBox (gile) ;; Boite de dialogue permettant un ou plusieurs choix dans une liste ;; ;; Arguments ;; title : le titre de la boite de dialogue (chaîne) ;; msg ; message (chaîne), "" ou nil pour aucun ;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...) ;; flag : 0 = liste déroulante ;; 1 = liste choix unique ;; 2 = liste choix multipes ;; ;; Retour : la clé de l'option (flag = 0 ou 1) ou la liste des clés des options (flag = 2) ;; ;; Exemple d'utilisation ;; (listbox "Présentation" "Choisir une présentation" (mapcar 'cons (layoutlist) (layoutlist)) 1) (vl-load-com) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) (defun ListBox (title msg keylab flag / tmp file dcl_id choice) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ListBox:dialog{label=\"" title "\";") file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";") ((= 1 flag) "spacer;:list_box{key=\"lst\";width=32;") (T "spacer;:list_box{key=\"lst\";width=32;multiple_select=true;") ) file ) (write-line "}ok_cancel_err;}" file) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "ListBox" dcl_id)) (exit) ) (start_list "lst") (mapcar 'add_list (mapcar 'cdr keylab)) (end_list) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice)) ) (setq choice (reverse choice)) ) (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab))) ) ) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) choice ) On peut avoir l'exécution suivante pour répondre à ton besoin : (setq lst '("Choix A" "Choix B" "Choix C")) (setq ans (ListBox "1, 2 ou 3 choix" "Choisir : " (mapcar 'cons lst lst) 2)) Ce qui retourne par exemple ("Choix A" "Choix C") ; Si ces deux choix ont été sélectionnés ("Choix B") ; Si ce seul choix a été sélectionné nil ; Si aucun choix n'a été sélectionné Etant donné que tu bricoles des LISP existants pour faire tes propres LISP, je ne comprends pas bien la démarche de vouloir bricoler des LISP existants sans savoir comment ils fonctionnent au lieu d'essayer plutôt de chercher à comprendre comment il marche dans son intégrité pour l'utiliser tel quel... Bisous, Luna
  16. Luna

    Liste multiple en dcl

    Ok, première question : comment testes-tu la boîte de dialogue ? Dans mon message précédent, il me semble que je répond parfaitement à ta question avec cette ligne : command: (testbox4 '("1" "2" "3" "4")) ("1" "2" "3") ; si l'on a sélectionné "1", "2" et "3" Il te suffit de le mettre en pratique, c'est-à-dire : command: (willy95 '("Choix A" "Choix B" "Choix C")) ("Choix A" "Choix C") ; si l'on a sélectionné "Choix A" et "Choix C" Mais si ce n'est pas suffisant, essaye avec chat : (defun ListBoxWilly95 (lst / *error* str2lst filename file DCL_ID rslt) (defun *error* (msg) (if file (close file)) (if filename (vl-file-delete filename)) (princ msg) ) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) (setq filename (vl-filename-mktemp "Willy95.dcl") file (open filename "W") ) (write-line (strcat "ListBoxM:dialog {" " label = \"1, 2 ou 3 choix\" ;" " :list_box {" " label = \"Choisir :\" ;" " key = \"key\" ;" " multiple_select = true ;" " }" " ok_cancel ;" " }" ) file ) (close file) (setq DCL_ID (load_dialog filename)) (if (not (new_dialog "ListBoxM" DCL_ID)) (exit) ) (start_list "key") (mapcar 'add_list lst) (end_list) (action_tile "accept" "(foreach n (str2lst (get_tile \"key\") \" \") (setq rslt (cons (nth (atoi n) lst) rslt))) (done_dialog)") (action_tile "cancel" "(done_dialog)") (start_dialog) (unload_dialog DCL_ID) (vl-file-delete filename) (reverse rslt) ) C'est du tout cuit, inutile d'essayer de l'adapter ou quoi (la mise en page est plus agréable et logique à l'utilisation). Tu intègres juste dans ton programme la ligne (setq answer (ListBoxWilly95 '("Choix A" "Choix B" "Choix C"))) et tu auras ta liste de réponses multiples... Cependant, j'ai comme l'impression que tu t'attaques à un problème beaucoup trop complexe par rapport à tes connaissances actuelles. Bisous, Luna
  17. Yay !! Merci beaucoup ! ♥
  18. Coucou, J'ai une question qui va sûrement paraître complètement conne mais...j'ai beau chercher sur internet où trouver le fichier Julian.lsp associé aux ExpressTools et permettant de convertir les dates, impossible de trouver le moindre forum/site qui accepte d'en parler !! En gros mon problème c'est que j'ai un fichier LISP chargé au démarrage d'AutoCAD et j'aimerai utiliser la fonction (dtoj) définie dans le fichier Julian.lsp, mais évidemment AutoCAD me renvoie l'erreur ; erreur: no function definition: DTOJ probablement car le fichier Julian.lsp est chargé après le mien. Résultat j'aimerai trouver un moyen de charger le fichier Julian.lsp en premier, ou bien de simplement déclarer localement la fonction (dtoj) dans mon fichier pour éviter ce genre d'erreur à la con. Mais il semblerait que personne n'a eut besoin d'accéder à ce fameux fichier, donc je n'arrive pas à trouver de solution... Une idée de comment faire ? J'ai aussi essayer de chercher une formule mathématique sur la conversion d'une date en jour Julien mais mon cerveau n'est pas en mesure de comprendre les formules mathématiques pour le transposer en LISP ^^" S'il n'y a pas de solutions tant pis, je prendrais un cachet d'aspirine avant et après les exercices mathématiques 😉 Bisous, Luna
  19. Luna

    Reprojection

    Ah bah je suis curieuse de voir comment ta routine fonctionne @lecrabe ! 😉 J'ai essayé de programmer un petit truc rapide, mais les UCS génèrent des erreurs aléatoires avec mes tests et il commence à se faire tard, donc j'ai plus trop la tête pour corriger le soucis ^^" Profite bien des vacances alors :3 Bisous, Luna
  20. Luna

    Liste multiple en dcl

    Euh....j'ai pourtant simplifié au maximum... >w< Sinon dis-moi ce que tu désires comme allure de dialog_box et j'écris un programme tout fait. Il faudra ensuite que tu compares avec tes essais pour comprendre d'où vient tes erreurs mais je ne sais pas comment faire plus simple... Dis-moi ce que tu ne comprends pas dans mon code à la limite ^^" Un exercice intéressant que tu peux essayer de mettre en pratique, c'est d'ajouter un commentaire à chaque ligne du programme d'exemple. Si tu es en mesure de ne pas faire de faute de compréhension pour chacune des lignes, alors tu seras en mesure de comprendre comment l'incorporer à ton programme (ou le modifier selon ce que tu as besoin). Mais si tu n'arrives pas à comprendre certaines lignes, il faudrait se focaliser sur ces lignes pour que je puisse t'aider. En théorie, le programme ci-dessus n'a pas vraiment besoin d'être modifié, si ce n'est l'esthétique de la boîte de dialogue. Sinon, tu devrais l'intégrer dans sa globalité dans ton programme (mais tu n'apprendras pas grand chose) ! Car pour en revenir au multiple_select, il n'y a rien qui peut faire planter le programme et le retour initial d'un list_box c'est une chaîne de caractère avec la position de chaque élément sélectionné dans la liste. Donc si ton programme ne fonctionne pas avec le multiple_select, c'est sûrement qu'il ne fonctionne pas sans déjà ^^" J'ai repris les lignes de codes que tu m'as donné ci-dessus et je les ai incorporées à mon exemple comme ci-dessous (en corrigeant quelques erreurs obvious) : (defun willy95 (lst / *error* filename file DCL_ID rslt) (defun *error* (msg) (if file (close file)) (if filename (vl-file-delete filename)) (princ msg) ) (setq filename (vl-filename-mktemp "TestBox.dcl") file (open filename "W") ) (write-line (strcat "TestBox:dialog {" " label = \"1, 2 ou 3 Choix \" ;" " spacer ;" " :list_box {" " label = \"Choisir : \" ;" " key = \"key\" ;" " width = 1 ;" " height = 2 ;" " edit_width = 25 ;" " edit_height = 27 ;" " multiple_select = true ;" " }" " spacer ;" " ok_cancel ;" " }" ) file ) (close file) (setq DCL_ID (load_dialog filename)) (if (not (new_dialog "TestBox" DCL_ID)) (exit) ) (start_list "key") (mapcar 'add_list lst) (end_list) (action_tile "accept" "(setq rslt (mapcar '(lambda (n) (nth (atoi n) lst)) (str2lst (get_tile \"key\") \" \"))) (done_dialog)") (action_tile "Cancel" "(done_dialog)") (start_dialog) (unload_dialog DCL_ID) (vl-file-delete filename) rslt ) L'aperçu de ta boîte de dialogue donne ceci : C'est pas très esthétique pour une list_box car on ne peut voir qu'une seule ligne (mais on peut les dérouler donc on a accès aux 3). Si l'affichage ne correspond pas à ce que tu désires, c'est très certainement parce que tu as voulu mettre tous les attributs de width, height, edit_width, edit_height, ... sans savoir comment les utiliser ni à quoi chat correspond. Quand chat ne passe pas, l'idéal c'est de le faire pas à pas, tu en met aucun pour commencer et tu vois si chat te va bien. Puis si c'est pas bon, tu en essayes un, tu le fais varier, etc et tu essayes de comprendre qu'est-ce que chat impacte réellement. Et ainsi de suite, mais il ne faut pas bourrer le programme de tout et n'importe quoi. Idem avec les spacer, tu peux t'en passer et voir ce que chat donne déjà sans. En tout cas en l'état, la boîte de dialogue fonctionne très bien avec le multiple_select ! Bisous, Luna
  21. Luna

    Liste multiple en dcl

    Coucou, J'ai essayé de simplifier au max pour une list_box avec multiple_select = true : (defun TestBox4 (lst / *error* filename file DCL_ID rslt) (defun *error* (msg) (if file (close file)) (if filename (vl-file-delete filename)) (princ msg) ) (setq filename (vl-filename-mktemp "TestBox.dcl") file (open filename "W") ) (write-line (strcat "TestBox:dialog {" " label = \"DCL Test\" ;" " :list_box {" " label = \"message :\" ;" " key = \"key\" ;" " multiple_select = true ;" " }" " ok_cancel ;" " }" ) file ) (close file) (setq DCL_ID (load_dialog filename)) (if (not (new_dialog "TestBox" DCL_ID)) (exit) ) (start_list "key") (mapcar 'add_list lst) (end_list) (action_tile "accept" "(setq rslt (get_tile \"key\")) (done_dialog)") (action_tile "cancel" "(done_dialog)") (start_dialog) (unload_dialog DCL_ID) (vl-file-delete filename) rslt ) Donc par exemple on peut avoir command: (testbox4 '("1" "2" "3" "4")) "0 1 2" ; si l'on a sélectionné "1", "2" et "3" Donc pour retourner la liste des valeurs sélectionnées, on va plutôt remplacer (action_tile "accept" "(setq rslt (get_tile \"key\")) (done_dialog)") par (action_tile "key" " (foreach n (str2lst (get_tile \"key\") "\ \") (setq rslt (cons (nth (atoi n) lst) rslt)) ) (done_dialog) " ) avec du coup (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) Avec le changement ci dessus, en refaisant la même manip' on a : command: (testbox4 '("1" "2" "3" "4")) ("1" "2" "3") ; si l'on a sélectionné "1", "2" et "3" En espérant que cela te permettra de mieux comprendre 😉 Bisous, Luna
  22. Coucou, La modification de la couleur forcée d'un objet via la liste DXF est toujours un peu....délicat ^^" Car le code 420 doit être calculé et le code 62 reflète la valeur ACI la plus proche du code 420. Donc pour les TrueColor, je te conseille fortement de regarder le travail de LeeMac sur la question. Je pense que passer par le Visual LISP est un peu plus simple que la liste DXF. Ci-dessous un exemple en Visual LISP pour modifier la couleur d'un objet (setq color '(255 0 0)) ; liste de la forme ( R G B ) avec R, G et B des entiers compris entre 0 et 255 (setq ent (vlax-ename->VLA-Object ent)) ; ent correspondant au nom d'entité de l'objet initial (entité graphique, calque, ...) (setq true (vla-get-TrueColor ent)) ; Récupère le VLA-Object définissant la propriété TrueColor de l'objet 'ent' (apply 'vla-setRGB (cons true color)) ; Modifie les propriétés RGB du VLA-Object TrueColor de l'objet 'ent' avec les nouvelles valeurs (vla-put-TrueColor ent true) ; Réaffecte le VLA-Object TrueColor modifié à l'entité 'ent' Autrement, en passant par la liste DXF, regarde >>ici<< sur les fonctions de conversion des couleurs développées par LeeMac. C'est un peu plus..complexe mais cela fonctionne avec la liste DXF : (setq R 255 G 0 B 0) ; Défini la valeur des couleurs RGB séparemment (setq DXF420 (LM:RGB->True R G B)) ; Calcule l'entier du code DXF 420 correspondant à la couleur RGB (setq DXF62 (LM:RGB->ACI R G B)) ; Calcule la couleur ACI la plus proche du code DXF 420 (setq entlist (if (assoc 62 (entget ent)) (subst (cons 62 DXF62) (assoc 62 (entget ent)) (entget ent)) (append (entget ent) (list (cons 62 DXF62))) ) ) (setq entlist (if (assoc 420 entlist) (subst (cons 420 DXF420) (assoc 420 entlist) entlist) (append entlist (list (cons 420 DXF420))) ) ) (entmod entlist) PS: J'avais en effet oublié ce détails @VDH-Bruno concernant les listes DXF et (entmod), s'il y a des doublons, la dernière occurrence uniquement est interprétée ^^" Merci du rappel ! ♥ Bisous, Luna
  23. Vui pour moi c'est la meilleure solution, et celle qui devrait être privilégiée dans tous les cas ! 😉 Bisous, Luna
  24. Si tu veux choisir de l'afficher ou pas, je te conseile fortement de faire cela via un calque !! Tu mets tes textes sur un calque spécifique (autre que le calque d'insertion de tes chambres de tirage) et tu gères l'affichage via le gel/dégel 😉 Et si tu veux pouvoir le bouger, tu peux créer un paramètre de Point et associer une action Déplacer au texte. Du coup il te faudrait un paramètre par état de visibilité ^^" Bref, je pense que remplacer les attributs par des textes, gérer l'affichage par un calque spécifique et créer des paramètres de Point avec action Déplacer pour pouvoir les placer où tu veux reste la meilleure méthode et la plus "clean" d'un point de vue dessin. Bisous, Luna
  25. Luna

    Liste multiple en dcl

    Coucou, Regarde la fonction (ListBox) de (gile) ! 😉 Simple et efficace. Certes elle permet de gérer aussi les liste déroulante et la sélection unique mais tu auras un exemple de ce qu'il faut écrire. Bisous, Luna
×
×
  • 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é