Aller au contenu

Changer la couleur dans la définition d'un bloc


Messages recommandés

Posté(e)

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

Posté(e)

Salut

 

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) 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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.

Posté(e)

Salut,

 

J'utilise depuis assez longtemps un lisp nommé MB

pour "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.

Posté(e)

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é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

6) 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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))

))

)

Posté(e)

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 activeselectionset

pps : tu avais déjà la réponse pour rechercher la couleur d'un calque (collection/table layer/calque en français)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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.

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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 des

répertoire de recherche:

- Chemin de recherche de fichiers support

Par 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 temporaire

Par 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!

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 4 semaines après...
Posté(e)

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?

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é