vannes Posté(e) le 28 mai 2013 Posté(e) le 28 mai 2013 Bonjour J'aurai besoin d'une aide, je ne m'en sors pas avec mon code. Je ne suis pas vraiment à l'aise avec les commandes visualLISP.Je souhaite définir la couleur d'un bloc par rapport à la couleur du calque dans lequel il est inséré.Pourquoi: pour créer une palette d'outils d'insertion de bloc où l'icône représentative sera en couleur correspondant au calque d'insertion. J'ai commencé mon code comme ceci: (vl-load-com) (setq I 1) (vlax-for BLOC (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (or (= (vla-get-IsLayout BLOC) :vlax-true) (= (vla-get-IsXref BLOC) :vlax-true) (setq BLOCNAME (vla-get-name BLOC)) ) (vlax-for OBJET BLOC (vla-put-Color OBJET "5") ) (if (/= BLOCNAME nil) (princ (strcat "\n" BLOCNAME " redéfini; Nombre: " (rtos I 2 0)))) (setq I (+ 1 I)) ) (command "regen") Déjà,dans un premier temps je veux forcé à la couleur (par exemple avec la couleur 5) tout en récupérant le nom du bloc. Cependant, je n'y arrive pas. Ensuite, si j'arrive à faire cela je n'ai plus qu'à récupérer le calque dans lequel le bloc est inséré et ensuite de récupérer la couleur du calque en question. Cela je compte le faire en Lisp, là où je suis plus à l'aise. Je suis preneur de tout autre solution! Merci d'avance
Patrick_35 Posté(e) le 28 mai 2013 Posté(e) le 28 mai 2013 Salut 1) Créer un jeu de sélection de tous les blocs présent dans le dessin.2) Parcourir le jeu de sélection3) Récupérer le nom du calque d'insertion du bloc4) Récupérer la couleur du calque dans la table des calques5) Forcer la couleur du bloc (defun c:vannes(/ doc ent sel) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (and (ssget "x" (list (cons 0 "insert"))) (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (vla-put-color ent (vla-get-color (vla-item (vla-get-layers doc) (vla-get-layer ent)))) ) (vla-delete sel) ) (vla-endundomark doc) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
vannes Posté(e) le 28 mai 2013 Auteur Posté(e) le 28 mai 2013 Merci pour cette réponse si rapide.J'ai testé, cela fonctionne.Cependant, je me suis mal expliqué.Ce que je souhaite c'est changer la "définition" du bloc. Donc, avoir le bloc défini avec la couleur dans lequel il est inséré. (Le bloc est inséré une seule fois et donc dans un seul calque).Pour que l'image de l'outils dans une palette ai une couleur, il faut que le bloc soit défini avec cette couleur.
kallain Posté(e) le 28 mai 2013 Posté(e) le 28 mai 2013 Salut, J'utilise depuis assez longtemps un lisp nommé MBpour "modif bloc" qui permet de changer la couleur, le type de ligne,le calque d'origine des entités en plus (je crois). Ce lisp écrit par le célèbre "Bonuscad" doit être trouvé sur le site. Alain.
Patrick_35 Posté(e) le 28 mai 2013 Posté(e) le 28 mai 2013 Ok, je refais de Cahier Des Charges 1) Créer un jeu de sélection de tous les blocs présent dans le dessin.2) Parcourir le jeu de sélection3) Récupérer le nom du calque d'insertion du bloc4) Récupérer la couleur du calque dans la table des calques5) Récupérer le bloc dans la table des blocs6) Parcourir le bloc pour changer la couleur des objets que le compose Tu as tous les éléments pour y parvenir, je te laisse chercher un peu.Cependant, une question est de savoir si tu as des attributs, car dans ce cas, le lisp n'est pas encore fini. ps : le plus simple est de tout définir en ducalque. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
vannes Posté(e) le 28 mai 2013 Auteur Posté(e) le 28 mai 2013 Un petit peu d'aide Patrick! 1) Créer un jeu de sélection de tous les blocs présent dans le dessin. 2) Parcourir le jeu de sélection 3) Récupérer le nom du calque d'insertion du bloc 4) Récupérer la couleur du calque dans la table des calques 5) Récupérer le bloc dans la table des blocs :angry: 6) Parcourir le bloc pour changer la couleur des objets que le compose Je sèche sur le point 5. Je ne maîrise pas suffisament le Visual Lisp pour y arriver.J'ai pourtant cherché! Pourrais-tu me donner la structure à utiliser pour récupérer le bloc dans la table des blocs. (j'y arrive en lisp mais pas en visuallisp Voici mon code: efun C:VannesBlocCouleurDuCalque (/ BLOCNAME) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (setq SELECTION (ssget "X" (list (cons 0 "INSERT")))) (if (/= SELECTION nil) (progn (setq NUMBERENTITE (sslength SELECTION)) (setq I 0) (repeat NUMBERENTITE (setq ENTITE (ssname SELECTION I)) (setq ENTITELISTE (entget ENTITE)) (setq BLOCNAME (cdr (assoc 2 ENTITELISTE))) (setq CALQUE (cdr (assoc 8 ENTITELISTE))) (setq CALQUECARACTERISTIQUE (tblsearch "LAYER" CALQUE)) (setq COULEUR (cdr (assoc 62 CALQUECARACTERISTIQUE)));;; (setq BLOCCARACTERISTIQUE (tblsearch "BLOCK" BLOCNAME));;; (setq BLOCCARACTERISTIQUE (vlax-ename->vla-object BLOCCARACTERISTIQUE));;; (setq BLOCCARACTERISTIQUE (vla-item (vla-get-Blocks doc) BLOCNAME))) (vlax-for OBJET BLOCCARACTERISTIQUE (vla-put-Color OBJET COULEUR) ) (princ (strcat "\n" BLOCNAME " redéfini; Nombre: " (rtos I 2 0))) (command "regen") ) (setq I (+ 1 I)) )) )
Patrick_35 Posté(e) le 28 mai 2013 Posté(e) le 28 mai 2013 Comme on est dans le vlisp, on y reste ;) --> (vla-item Ma_collection Nom) vla-item reviens à faire un tblsearch en autolisp Ma_Collection = (vla-get-blocks doc), soit la table des blocks Nom = le nom du bloc (vlax-for ele (vla-item (vla-get-blocks doc) (vla-get-name ent)) ... ) ps : dommage de mélanger le vlisp/autolisp car en plus tu convertis des codes dxf en vlisp. Regarde bien le 1er lisp avec activeselectionsetpps : tu avais déjà la réponse pour rechercher la couleur d'un calque (collection/table layer/calque en français) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
vannes Posté(e) le 28 mai 2013 Auteur Posté(e) le 28 mai 2013 Je n'y arrive vraiment pas! Je ne comprend pas la fonction "vlax-for"Et mon code bloque ici: (vlax-for BLOCCARACTERISTIQUE (vla-item (vla-get-blocks doc) BLOCNAME)(vlax-for OBJET BLOCCARACTERISTIQUE(vla-put-Color OBJET COULEUR))) Je suis désolé mais j'ai vraiment du mal avec le VLISP.
Patrick_35 Posté(e) le 28 mai 2013 Posté(e) le 28 mai 2013 Je n'y arrive vraiment pas! Je ne comprend pas la fonction "vlax-for"Et mon code bloque ici: (vlax-for BLOCCARACTERISTIQUE (vla-item (vla-get-blocks doc) BLOCNAME)(vlax-for OBJET BLOCCARACTERISTIQUE(vla-put-Color OBJET COULEUR))) Je suis désolé mais j'ai vraiment du mal avec le VLISP.vlax-for permet de parcourir une collection.Donc, si je fais ma boucle sur ma définition de bloc, je vois les éléments qui composent mon bloc Pour voir les objets de mon bloc(vlax-for BLOCCARACTERISTIQUE (vla-item (vla-get-blocks doc) BLOCNAME) (terpri)(princ BLOCCARACTERISTIQUE) ) Pour voir les caractéristique du premier objet de mon bloc(vlax-dump-object (vla-item (vla-item (vla-get-blocks doc) BLOCNAME) 0) T) Je suis désolé mais j'ai vraiment du mal avec le VLISP.Ce n'est pas grave, on a tous commencé :P Il faut juste comprendre la logique d'Autocad qui n'est pas toujours évidente.La preuve, je viens de passer sur une version 2014 et on a maintenant un répertoire pour valider les lisps qui nous sont utiles.Pourquoi pas, une sécurité en plus.Je pensais trouver la valeur dans les préferences d'autocad,eh bien non. C'est la variable TRUSTEDPATHS qui gère cela. Va comprendre. :blink: @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
lecrabe Posté(e) le 28 mai 2013 Posté(e) le 28 mai 2013 Hello P35 SVP voir mon 2eme Msg du 02 Avril 2014 17h53 : http://cadxp.com/index.php?/topic/37335-acad-2014-qq-nouveautes-de-securite-trusted-vars-secureload/ Voir aussi : OPTIONS / 1er Onglet "Fichiers" / Emplacements approuves / ... lecrabe Autodesk Expert Elite Team
Patrick_35 Posté(e) le 28 mai 2013 Posté(e) le 28 mai 2013 Merci Lecrabe, mais c'était dans mon prog d'install des lisps.Un exécutable qui fait tout ce qu'il faut, ajouter le chemin s'il n'existe pas, routines communes, etc...Le truc simple pour un utilisateur lambda.Il faut juste maintenant valider le chemin d'install des lisps une 1er fois. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
vannes Posté(e) le 29 mai 2013 Auteur Posté(e) le 29 mai 2013 Merci Patrick Dès que je peux m'y remettre j'applique tes consignes.Par contre, je me posais la question justement comment par un lisp on pouvait ajouter desrépertoire de recherche:- Chemin de recherche de fichiers supportPar exemple Et définir:- Fichier de personnalisation d'entreprise- Emplacement des icones personnalisées- Emplacement du fichier d'enregistrement automatique- Emplacement du fichier gabarit- Emplacement des fichiers de palettes d'outils- Emplacement du fichier de dessin temporairePar exemple Tout cela pour éviter au changement de version ou à un changement de PC de devoir le faire par la commande OPTION. Sachant que lorsque l'on travaille dans une structure avec plusieurs postes ce peut être très laborieux!
Patrick_35 Posté(e) le 29 mai 2013 Posté(e) le 29 mai 2013 Tu regardes ici(vlax-dump-object (vla-get-files (vla-get-preferences (vlax-get-acad-object)))) Un exemple pour ajouter ou pas un répertoire dans les supports(setq Mon_Dossier "c:\\toto\\Mes_lisps" pref (vla-get-files (vla-get-preferences (vlax-get-acad-object))) ) (or (vl-string-search (strcase Mon_Dossier) (strcase (vla-get-supportpath pref))) (vla-put-supportpath pref (strcat Mon_Dossier ";" (vla-get-supportpath pref))) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
vannes Posté(e) le 20 juin 2013 Auteur Posté(e) le 20 juin 2013 Patrick, Voici mon code: (vl-load-com)(setq doc (vla-get-activedocument (vlax-get-acad-object)))(vla-startundomark doc)(setq LISTEBLOC nil) (setq SELECTION (ssget "X" (list (cons 0 "INSERT") (cons 8 "T-*,R-*"))))(if (/= SELECTION nil) (progn (setq NUMBERENTITE (sslength SELECTION)) (setq I 0) (setq J 1) (repeat NUMBERENTITE (setq ENTITE (ssname SELECTION I)) (setq ENTITELISTE (entget ENTITE)) (setq BLOCNAME (cdr (assoc 2 ENTITELISTE))) (setq CALQUE (cdr (assoc 8 ENTITELISTE))) (setq CALQUECARACTERISTIQUE (tblsearch "LAYER" CALQUE)) (setq COULEUR (cdr (assoc 62 CALQUECARACTERISTIQUE))) (if (not (member BLOCNAME LISTEBLOC)) (progn (setq BLOCCARACTERISTIQUE (vla-item (vla-get-blocks doc) BLOCNAME)) (vlax-for OBJET BLOCCARACTERISTIQUE (vla-put-Color OBJET COULEUR) ) (princ (strcat "\n" BLOCNAME " redéfini; Nombre: " (rtos J 2 0))) (setq J (+ 1 J)) (setq LISTEBLOC (cons BLOCNAME LISTEBLOC)) ) ) (setq I (+ 1 I)) ) ))(command "regen")(princ)) Je te remercie, gràce à ton aide j'ai tout de même fini par y arriver.Par contre une dernière question, est il possible de réaliser ce lisp uniquement en autolisp sans passer par du VisualLisp et si oui comment?
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