Aller au contenu

donner une couleur à un bloc depuis un fichier txt


Messages recommandés

Posté(e)

Salut à tous.

 

Actuellement, je fais des mises à jour de bloc avec attributs avec les commande ATTIN et ATTOUT.

 

Est-il possible, en rentrant une valeur qui correspondrait à une couleur dans le fichier texte généré depuis AutoCAD, faire en sorte qqu'un ou plusieurs blocs prennent la couleur choisi lors de l'import ATTIN.

 

Par exemple, lors d'un export (ATTOUT), j'ai 10 lignes, soit dix blocs avec attributs. Ces attributs sont vides.

je remplis aux emplacement prévu, les valeurs que je souhaite (Nom prénom, Service, Direction, etc.)

 

DURANT Thierry Comptabilité Direction

DUPONT Michel etc etc

MAISON Magaly etc etc

PIERRE Olivier etc etc

etc,

etc.

 

Sachant qu'à la base tous les blocs sont orange, je souhaiterais que DURANT Thierry soit en bleu suite à l'import des données (ATTIN)

 

J'ai pensé à ajouté dans mon bloc, un attribut "Couleur" (Je peux mettre autre chose. "Couleur" est un exemple", je peux aussi bien mettre "Type de contrat".) Tous les blocs auront lors du premier export (ATTOUT) la couleur 20 (orange) par défaut. Par la suite, j'ouvre mon fichier text par le biais d'Excel (parce que c'est plus clair) puis je décide de changer la valeur 20 par la valeur 162 pour que DURANT Thierry soit en bleu suite à l'import des données (ATTIN)

 

C'est réalisable un truc comme c'est plutôt un truc de fou?

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Posté(e)

AutoCAD MAP fait ça automatiquement. Cela revient à appliquer une stylisation avec changement de la couleur en fonction d'une donnée attributaire. On peut même en sortir une légende.

 

Olivier

Support Technique Covadis

Posté(e)

Salut,

 

Je propose une solution avec un réacteur sur les fonctions LISP (ATTIN est défini en LISP).

 

Ça peut servir d'exemple pour ceux qui se lancent dans les réacteurs en LISP. C'est une utilisation classique d'un réacteur principal dont la fonction de rétro-appel (callback) en crée un autre si une condition est remplie (ici : c'est bien C:ATTIN qui vient d'être lancé). Les fonctions de rétro-appel de ce nouveau réacteur détruisent ce nouveau réacteur pour ne pas surcharger l'application et bien sûr effectuent les actions désirées (ici : modification de la couleur des attributs).

J'ai mis quelques commentaires en en-tête de chaque routine.

 

Le fichier doit être automatiquement chargé à l'ouverture de chaque document (acaddoc.lsp ou fichie MNL du même nom que le CUI) pour que le réacteur soit actif dans chaque document.

 

(vl-load-com)
(or *acdoc* (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))))

;; Réacteur principal : agit dès qu'un LISP est lancé
(setq *ColorAttributeReactor*
      (vlr-lisp-reactor
 nil
 '((:vlr-lispWillStart . ColorAttributeStart))
      )
)

;; Fonction de rétro-appel du réacteur principal
;; Si le LISP lancé est C:ATTIN un nouveau réacteur est créé qui agira si la commande ATTIN aboutit ou échoue
(defun ColorAttributeStart (rea lst /)
 (if (= (car lst) "(C:ATTIN)")
   (vlr-lisp-reactor
     nil
     '((:vlr-lispEnded . ColorAttributeEnded)
       (:vlr-lispCancelled . ColorAttributeCancelled)
     )
   )
 )
)

;; Fonction de rétro-appel si la commande ATTIN aboutit
;; Le nouveau réacteur est supprimé.
;; Le fichier texte créé par ATTOUT est lu et s'il contient une colonne COULEUR, la couleur
;; de tous les attributs de chaque bloc est modifiée en fonction de la valeur dans cette colonne
(defun ColorAttributeEnded (rea lst / filename file line lst index blk)
 (vlr-remove rea)
 (if (findfile
(setq filename (strcat (getvar 'dwgprefix)
		       (vl-filename-base (getvar 'dwgname))
		       ".txt"
	       )
)
     )
   (progn
     (setq file (open filename "r")
    line (read-line file)
    lst	 (str2lst line "\t")
     )
     (if (setq index (vl-position "COULEUR" (mapcar 'strcase lst)))
(while (setq line (read-line file))
  (setq lst (str2lst line "\t"))
  (if (setq blk (HandleToObject (substr (car lst) 2)))
    (progn
      (foreach att (vlax-invoke blk 'GetAttributes)
	(vl-catch-all-apply
	  '(lambda ()
	     (vla-put-color att (atoi (nth index lst)))
	   )
	)
      )
      (vla-update blk)
    )
  )
)
     )
     (close file)
   )
 )
)

;; Fonction de rétro-appel si la commande ATTIN échoue
;; Le nouveau réacteur est supprimé.
(defun ColorAttributeCancelled (rea lst)
 (vlr-remove rea)
)

;; HandleToObject (gile)
;; Retourne l'objet (vla-object) correspondant au Handle ou nil
;; si le Handle n'est pas valide.
(defun HandleToObject (handle / obj)
 (vl-catch-all-apply
   (function (lambda () (setq obj (vla-HandleToObject *acdoc* handle))))
 )
 obj
)

;; str2lst
;; Transforme un chaine avec séparateur en liste de chaines
(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)
 )
)

;; supprimer le réacteur principal (commenté)
;;(vlr-remove *ColorAttributeReactor*)

(princ "\nColorAttributeReactor activé")
(princ)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Là je suis sur le cul.

La grande classe Gile :)

 

Toutefois, je n'arrive pas à le faire fonctionner.

 

J'ai bien fais un fichier acaddoc.lsp, je l'ai bien mis dans les chemins de support des options, j'i ajouté une colonne "Couleur" dans mon bloc, synchronisé. J'ai quitté AutoCAD, j'ai relancé AutoCAD, j'ai rempli la valeur de la colonne avec "20" pour le orange, j'ai fait un ATTOUT, j'ai ouvert mon fichier texte, j'ai modifier la valeur "20" par "10" (Rouge), j'ai enregistré le fichier, depuis AotoCAD j'ai fais un ATTIN en sélectionnant mon fichier mais rien ne se passe. Par contre la valeur de la colonne "Couleur" est bien changée. J'ai essayé de faire la même chose mais à la place de mettre un chiffre comme valeur dzns la colonne "Couleur", j'ai mis le nom de la couleur. Et ce dans les deux sens; ATTOUT puis ATTIN et il ne se passe toujours rien. J'ai lus le lisp entièrement mais je n'ai rien vu qui puisse m'éclairer.

Où est-ce que j'ai loupé quelque chose?

 

 

[Edité le 11/8/2010 par Steven]

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Posté(e)

Oupss !...

 

J'avais fait les tests avec un attribut invisible (étiquette = ATT2) qui contenait le numéro de la couleur et j'ai oublié de remplacer ATT2 par COULEUR dans le code.

 

J'ai corrigé le code ci dessus. Tu peux soit rajouter une colonne COULEUR dans le fichier .txt soit utiliser un attribut invisible (étiquette = COULEUR) et la colonne sera créée avec ATTOUT.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Il y a vraiment un truc qui doit m'échapper.

J'ai pris en compte les modiffication du code que tu y a apporté.

J'ai rédéfini mon bloc en y ajoutant un attribut invisible "COULEUR"

 

http://www.easy-upload.net/fichiers/D%C3%A9finition_attribut.2010812115946.png

 

J'ai entré la valeur 20 (orange) dans tous les blocs du mêmes nom insérés dans le dessin.

 

http://www.easy-upload.net/fichiers/Modif_attributs.2010812115032.png

 

J'ai fais un ATTOUT, dans la colonne "COULEUR", j'ai modifier la valeur de 2 blocs. je les ai mis à 10 (rouge) pour voir la modif. J'enregistre mon fichier texte, je rtourne sur AutoCAD et lance la commande ATTIN, je sélectionne mon fichier mais tous les blocs gardent la même couleur (20). Je vérifie les atributs des 2 blocs que j'ai modifier depuis mon fichier texte et le valeur dans la colonne "COULEUR" et la valeur est bien à 10 (rouge).

 

http://www.easy-upload.net/fichiers/Modif_attributs2.2010812115630.png

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Posté(e)

Je ne sais vraiment pas où est-ce que je merde.

 

J'ai essayé plusieurs solution et toujours rien.

Dans la définition de mes attributs, je les ai mis dans la couleur DUBLOC. Rien.

Je leur ai forcé la couleur de base (20). Rien.

Je les ai remis dans la couleur du bloc et j'ai modifier la valeur dans l'éditeur d'attributs étendu sur la ligne COULEUR;. Ren.

Je n'ai rien mis. Rien

J'ai demandé à ce que le colonne COULEUR dans le fichier texte soit en format TEXTE. Rien

J'ai demandé à ce que le colonne COULEUR dans le fichier texte soir en format STANDARD. Rien

 

Il y a un truc que je ne dois pas faire correctement mais je n'arrive vraiment pas à le cibler.

 

 

[Edité le 12/8/2010 par Steven]

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Posté(e)

Salut,

 

Comme tu as pu t'en apercevoir, j'ai du mal à répondre pendant les heures "ouvrables", je travaille en atelier ces jour-ci.

 

Je n'arrive pas à m'expliquer pourquoi ça ne fonctionne pas chez toi.

J'ai fait des tests sur AutoCAD 2007 et 2010 avec des blocs sans attribut COULEUR et en rajoutant une colonne dans le fichier .txt créé par ATTOUT et aussi avec des blocs avec un attribut COULEUR, et, dans tous les cas, ça fonctionne.

 

La seule chose que je vois serait que le fichier ne soit pas chargé dans le dessin.

 

Essaye d'entrer : !*ColorAttributeReactor* à la ligne de commande, si le fichier est chargé, tu auras : # comme retour, sinon : nil.

 

Tu dis utiliser un fichier acaddoc.lsp, je rappelle qu'à l'ouverture de chaque nouveau document AutoCAD cherche un fichier acaddoc.lsp dans les chemins de recherche et charge le premier trouvé, donc s'il y en a plusieurs seul le premier sera chargé (la recherche commence par le répertoire du dessin et continue avec les fichiers spécifiés dans les Options dans l'ordre dans lequel ils sont).

Essaye plutôt de mettre le code dans un fichier MNL du même nom qu'un CUI chargé, le fichier AutoCAD.mnl par exemple (dans LOCALROOTPREFIX\Support).

 

J'ai modifié le code pour qu'il affiche : "ColorAttributeReactor activé" sur la ligne de commande à l'ouverture de chaque nouveau document.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Alors,

J'ai mis le acaddoc.lsp dans le répertoire du fichier dwg concerné vu qu'il n'y en aura pas d'autre.

J'ai entré !*ColorAttributeReactor* dans la ligne de commande et ça fonctionne, j'ai bien # comme retour. Par contre je n'arrive toujours pas à faire fonctionner la couleur dans le bloc. J'ai copier le code dans un fichier mnl du même nom qu'un cui chargé et je n'arrive toujours pas à faire jouer la couleur des attributs de mon bloc.

Je laisse tomber pour le moment vu que je suis maintenant en vacances. je verrai donc ça à mon retour.

Merci quand même de ton aide ;)

 

[Edité le 13/8/2010 par Steven]

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

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é