DenisHen Posté(e) le 23 octobre 2010 Posté(e) le 23 octobre 2010 Bonjours à tous, Voilà, j'essai d'activer tous les calques commençant par "le premier mot" correspondant à une chaine, je m'explique : Voici les noms de mes calques :0 Comble Charpente (Sap_08-23) Comble ...... Etage Mur_agglos_creux (AgCr) Etage Cloison_placostyl (ClPl) Etage Menuiserie (...) Rdc Mur_agglos_creux (AgCr) Rdc Cloison_placostyl (ClPl) Rdc Menuiserie.......(...) Je choisi mon niveau grace à un petit dcl qui me retourne le nom du niveau (ex "Rdc"),j'aimerai activer tous les calques "Rdc" et inactiver tous les autres.Sachant qu'il y aura toujours le nom du niveau en premier dans le nom du calque et qu'il sera toujours suivi d'un espace...J'ai déjà commencé mon lisp(defun c:LayerNivP (Niv / x_plan); active le niveau courant (command "-calque" "e" "0" ""); calque courant : 0 (command "-calque" "l" "*" ""); libère tous les calques (command "-calque" "ac" "*" ""); active tous les calques (setq x_plan (tblnext "layer" T)); rempli x_plan avec le liste des calques (c:MetreCAD_Niveau); DCL pour le choix du niveau (while (/= x_plan nil); début de listage des calques [surligneur] (if (= (read ((vl-string-position (x_plan " ")))) (command "-calque" "g" (cdr (assoc 2 x_plan)) "") (command "-calque" "l" (cdr (assoc 2 x_plan)) "")[/surligneur] ) ;_ Fin de if (setq x_plan (tblnext "layer")) ) ;_ Fin de while ) ;_ Fin de defun Je sais que je vais devoir utiliser "(vl-string-position (x_plan " "))" mais je ne trouve pas la commande lisp qui me donnerai la taille de la chaine "x_plan, ou l'équivalent de Mid$ en VB... Merci pour vos éventuelles réponses, Bon week-end à 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)
(gile) Posté(e) le 23 octobre 2010 Posté(e) le 23 octobre 2010 Salut, Regarde la fonction wcmath. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 23 octobre 2010 Posté(e) le 23 octobre 2010 Puisque tu utilises (command ...), utilises les options offertes par la commandes CALQUE : (command "_layer" "_off" "comble*" "" "") Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 23 octobre 2010 Auteur Posté(e) le 23 octobre 2010 Salut à tous, Merci mille fois (gile)... J'ai réussi à faire une ébauche :(defun c:LayerNivP (/ x_plan) (command "-calque" "e" "0" "") ; calque courant 0 (command "-calque" "l" "*" "") ; libère tous les calques ;(command "-calque" "ac" "*" ""); active tous les calques ;(setq x_plan (tblnext "layer" T)) ; liste des calques (princ x_plan) (setq x_plan (layerstate-getnames)) ; liste des calques (princ x_plan) (if (= (vlax-ldata-get "MetreCAD" "NivCour") "") ; vérifi le niveau courant (c:MetreCAD_Niveau) ; demande un niveau courant ) ;_ Fin de if (while (/= x_plan nil) (if (= (wcmatch x_plan Niv)) ; compare nom du calque avec niveau courant (command "-calque" "a" x_plan "") ; si niveau contenu dans nom du calque -> active le calque (command "-calque" "i" x_plan "") ; si niveau non contenu dans nom du calque -> inactive le calque ) ;_ Fin de if (setq x_plan (tblnext "layer") ; calque suivant ) ; loop ) ;_ Fin de if ) ;_ Fin de defun Mais je ne sais pas encore pourquoi cela ne fonctionne pas...Réponse d'AutoCAD :Commande: (c:LayerNivP) nilnilnil Mais bon... Je continu de chercher... 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)
Fraid Posté(e) le 23 octobre 2010 Posté(e) le 23 octobre 2010 Bonjour, Je ne suis pas un expert mais (c:MetreCAD_Niveau) me semble difficile a tester si tu nous donne pas la commande en question ? https://github.com/Fraiddd
DenisHen Posté(e) le 24 octobre 2010 Auteur Posté(e) le 24 octobre 2010 Salut, Mile excuses...Voici le lisp : ; Nom du fichier : MetreCAD_Niveau.lsp ; Créé par DenisH ; cadxp@phalenecad.fr (defun c:MetreCAD_Niveau (/ liste nbr Niv) (setvar "cmdecho" 0) ;Saisie du Niveau courant (setq liste (list "Rdc" "Comble" "Etage" "Charp" "Toit" "TP" "VS" "Ss" "Fond" ) ;_ Fin de list ) ;_ Fin de setq (setq dcl_id (load_dialog "MetreCAD_Niveau.dcl")) (if (not (new_dialog "pop_up" dcl_id)) (exit) ) ;_ Fin de if (start_list "nbr") (mapcar 'add_list liste) (end_list) (action_tile "accept" "(setq Niv (nth (atoi (get_tile \"nbr\")) liste)) (done_dialog))" ) ;_ Fin de action_tile (start_dialog) (unload_dialog dcl_id) (vlax-ldata-put "MetreCAD" "NivCour" Niv) (princ (strcat "Niveau choisi : " (vlax-ldata-get "MetreCAD" "NivCour"))) (c:MetreCtrl) ) ;_ Fin de defun ;|«Visual LISP© Format Options» (80 2 2 2 T "Fin de " 80 9 0 0 nil nil T nil T) ;*** NE PAS AJOUTER de texte au-dessous du commentaire! ***|; Et voici son dcl (merci à (gile)):pop_up:dialog{ label="MétréCAD :"; :boxed_column{ label="Choisissez un niveau"; :list_box{ label="Nom :"; key="nbr"; edit_width=70; } } ok_cancel; } Voilà et 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)
DenisHen Posté(e) le 24 octobre 2010 Auteur Posté(e) le 24 octobre 2010 Merci Fraid, J'avais oublié le retour d'argument de MetreCAD_Niveau... J'ai donc, maintenant :(defun c:LayerNivP (/ x_plan) (command "-calque" "e" "0" "") ; calque courant 0 (command "-calque" "l" "*" "") ; libère tous les calques ;(command "-calque" "ac" "*" ""); active tous les calques ;(setq x_plan (tblnext "layer" T)) ; liste des calques (princ x_plan) (setq x_plan (layerstate-getnames)) ; liste des calques (princ x_plan) (if (= (vlax-ldata-get "MetreCAD" "NivCour") "") ; vérifi le niveau courant (c:MetreCAD_Niveau) ; demande un niveau courant ) ;_ Fin de if [surligneur] (setq Niv (vlax-ldata-get "MetreCAD" "NivCour")) [/surligneur] (while (/= x_plan nil) (if (= (wcmatch x_plan Niv)) ; compare nom du calque avec niveau courant (command "-calque" "a" x_plan "") ; si niveau contenu dans nom du calque -> active le calque (command "-calque" "i" x_plan "") ; si niveau non contenu dans nom du calque -> inactive le calque ) ;_ Fin de if (setq x_plan (tblnext "layer") ; calque suivant ) ; loop ) ;_ Fin de if ) ;_ Fin de defun Merci encore, mais j'ai toujours le même problème... 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)
(gile) Posté(e) le 24 octobre 2010 Posté(e) le 24 octobre 2010 Salut, Il me semble déjà t'avoir fait ce genre de remarques, mais je réitère.Si tu veux de l'aide, pose des questions claires et précises et évite de poster des codes aussi brouillon que celui de la réponse 3...On ne peut pas sérieusement programmer en utilisant des extraits de codes (ou des fonctions natives) glanées ici ou là si on a pas compris leur fonctionnement. layerstate-getnames retourne la liste des noms des états de calques et pas la liste des calques. La variable Niv n'est jamais initialisée avant d'être utilisée dans l'expression :(= (wcmatch x_plan Niv)) qui retournera toujours T (si x_plan et Niv sont bien des chaînes) parce que la fonction = avec un seul opérande (argument) retourne toujours T. wcmatch permet l'utilisation de "caractères génériques" (ou expressions régulières) pour comparer une chaîne de caractère et un modèle (sinon autant utiliser =). Si tu veux vraiment utiliser wcmatch, lis l'aide et apprend à t'en servir.Sinon, je t'ai donné une solution sans wcmatch en utilisant directement les caractères génériques* pour le choix des calques avec la commande CALQUE (_LAYER). * dans la rubrique "Rechercher" de l'aide d'autoCAD, tu entres "caractères génériques". Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 24 octobre 2010 Auteur Posté(e) le 24 octobre 2010 Salut, Merci (gile), mais l'aide sur wcmatch est en anglais, et c'est ce que j'en avais compris... Mais tu m'a montré ma faute... Je vais reconstruire ma routine plus clairement... Merci encore... Je ne sais pas si tu te souviens, mais tu m'avais énormément aidé il y à 4/5 ans... Mais depuis, je n'ai pas retouché au lisp... 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)
(gile) Posté(e) le 24 octobre 2010 Posté(e) le 24 octobre 2010 Je te recommande de lire avec attention les sujets suivants :- Éléments de syntaxe AutoLISP- Arguments et variablesAinsi que d'utiliser l'éditeur Visual LISP et sa Console pour y évaluer des expressions jusqu'à bien comprendre les arguments requis et les valeurs retournées par les fonctions LISP. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 24 octobre 2010 Auteur Posté(e) le 24 octobre 2010 Salut, Merci encore (gile)... Je vais apprendre "par coeur" tes liens.. Je serai peut-être compétant après... 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