Aller au contenu

Messages recommandés

Posté(e)

Bonjour, je rencontre un problème aujourd'hui car Autocad m'imprime les entités qui possède une couleur 255,255,0 en nuance de gris alors que je suis en monochrome....

 

Je cherche donc à sélectionner toutes les entités de mon dessin afin de les mettre en Jaune (couleur 2) (clef DXF 62) mais Autocad me renvoi la clef DXF 62 avec une valeur "2" quelque soit la couleur.... jaune ou 255.255.0!

 

Donc aucune différence dans les codes DXF pour ces deux couleurs...

 

Comment faire pour me faire un jeu de sélection en lisp ou Vlisp pour pouvoir ensuite tout passer en vraie couleur 2?

 

Merci

<IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG>

 

<a href=www.formu-lan.net>www.FormuLan.net

</a>

Posté(e)

Hello

 

La Selection Rapide te permet de recuperer TOUTEs les Entites

dont la couleur a ete forcee a 255,255,0 !?

 

Ou alors je n'ai pas bien compris ?

 

lecrabe

Autodesk Expert Elite Team

Posté(e)

Hello

 

La Selection Rapide te permet de recuperer TOUTEs les Entites

dont la couleur a ete forcee a 255,255,0 !?

 

Ou alors je n'ai pas bien compris ?

 

lecrabe

 

ouep ouep, je suis bien d'accord. Peut-on l'utiliser dans un lisp en ligne de commande?

 

(command "??????" ......)

 

Merci

<IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG>

 

<a href=www.formu-lan.net>www.FormuLan.net

</a>

Posté(e)

Salut,

 

Les couleurs AutoCAD sont définies avec 1, 2 ou 3 groupes DXF :

62 : couleurs de l'index (de 0 à 256)

420 : couleurs vraies, un entier entre 0 et 16777215

430 : carnet de couleurs

 

Si la couleur de l'entité a été spécifiée à l'aide de l'index, elle n'aura que le groupe 62.

Si elle a été définie avec les couleurs vraies (RVB) elle aura les groupes 420 et 62 (où le groupe 62 correspond à la couleur de l'index la plus proche de la couleur vraie).

Si elle a été définie avec un carnet de couleur, elle aura les trois groupes 430, 420 et 62.

 

La valeur pour groupe 420 est un entier calculé à partir des valeur Rouge Vert Bleu (chacune étant un entier entre 0 et 255) comme la somme des valeurs de Rouge décalée de 16 bits vers la gauche, de Vert décalée de 8 bits vers la gauche aussi et de Bleu.

 

(setq TrueColor (+ (lsh Rouge 16) (lsh Vert 8) Bleu))

ou

(setq Truecolor (+ (* Rouge (expt 2 16)) (* Vert (expt 2 8)) Bleu))

ou encore

(setq Truecolor (+ (* Rouge 256 256) (* Vert 256) Bleu))

 

Pour le Jaune (255,255,0) on obtient une valeur TrueColor de 16776960,

une entité définie avec la couleur de l'index Jaune (2) aura seulement le groupe (62 . 2)

une entité définie avec la couleur vraie 255,255,0 aura les groupes (62 . 2) et (420 . 16776960)

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

Posté(e)

Hello

 

Ici tu obtiens dans SEL tous les objets dont la couleur est forcee a JAUNE (Code Couleur = 2)

 

(setq sel (ssget "_X" '((62 . 2))))

 

lecrabe

 

OOPS : le Grand Maitre Gilles a parle ... et si j'ai bien compris alors

(setq sel (ssget "_X" '( (420 . 16776960) )))

devrait faire l'affaire !?

Autodesk Expert Elite Team

Posté(e)

Arf.... oui c'est compliqué mais je pense que tu as fait mouche.... Donc en gros moi j'ai le groupe 420 en trop dans mon entget.... On peut l'enlever pour que l'entité devienne couleur 2 à partir de l'index?

<IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG>

 

<a href=www.formu-lan.net>www.FormuLan.net

</a>

Posté(e)

Je ne comprends pas ce que tu cherches à faire.

 

(ssget "_X" '((62 . 2)))

sélectionnera toutes les entités dont la couleur est soit de l'index 2 soit en couleur vraie proche de jaune, donc y compris 255,255,0 qui est exactement la couleur jaune.

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

Posté(e)

Hello Gilles

 

*** Q1 ***

Le groupe 420 est present SEULEMENT si on a utilise le mode 16 milions de couleurs !

Ai je bien compris ?

 

*** Q2 ***

Donc si on a joue avec le mode 16M, alors le groupe 62 indique la couleur traditionnelles la plus proche ?

 

Merci d'avance, lecrabe

Autodesk Expert Elite Team

Posté(e)

C'est exactement ça.

Et si on a utilisé le mode "Carnet de couleurs" le groupe 420 prend la valeur de la couleur RGB correspondant et le groupe 62 celui de la couleur de l'index la plus proche.

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

Posté(e)

Merci bcp pour vos réponses, je vais m'expliquer.

 

J'ai transformé des plans inventor en autocad. Le problème c'est que Inventor utilise les vraies couleurs.

Donc dans autocad je me retrouve avec des calques utilisant les vraies couleurs. Mais lorsque j'imprime mon plan en monochrome, eh bien je me retrouve quand même avec des traits en nuance de gris....

 

Donc maintenant je cherche à remplacer les vraies couleurs par celle de l'index d'autocad. Et ce par macro...Et avec mes quelques connaissances, je pensais qu'il fallait modifier les groupes (et notamment le 62). Sauf que pas de chances, que ce soit la vraies couleurs ou celle de l'index, le groupe 62 a 2 comme valeur....

 

Merci encore.

<IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG>

 

<a href=www.formu-lan.net>www.FormuLan.net

</a>

Posté(e)

Hello

 

Donc (si j'ai bien compris), il te faudrait un progr Lisp/VLisp

qui aille chercher tous les objets avec une couleur forcee en mode 16M

 

puis ce prog "bousille/efface" le mode 16M et donc le fameux groupe 420

pour ne laisser que le groupe 62 (celui des 256 couleurs de base) ...

 

ainsi le mode "Niveaux de Gris / Grayscale" au trace, fonctionnera ???

 

lecrabe (decodeur de besoins)

 

PS: et si j'ai raison, alors il nous faut un Pro du Lisp/VLisp, par exemple :

Gilles, Bruno, Patrick, VDH, Bryce, etc

En esperant n'avoir oublie personne d'important !?

Autodesk Expert Elite Team

Posté(e)

C'est exactement ça lecrabe! A la différence près que justement le grayscale ne fonctionnera pas. Je n'aurai que des traits noir sur mon dessin!!

<IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG>

 

<a href=www.formu-lan.net>www.FormuLan.net

</a>

Posté(e)

Bonjour,

 

Donc maintenant je cherche à remplacer les vraies couleurs par celle de l'index d'autocad. Et ce par macro..

 

En suivant les explications donnée par (gile) :

Si la couleur de l'entité a été spécifiée à l'aide de l'index, elle n'aura que le groupe 62.

Si elle a été définie avec les couleurs vraies (RVB) elle aura les groupes 420 et 62 (où le groupe 62 correspond à la couleur de l'index la plus proche de la couleur vraie).

Si elle a été définie avec un carnet de couleur, elle aura les trois groupes 430, 420 et 62.

 

Pour réaliser la macro que tu veux faire c.a.d. n’avoir que les couleurs de l’index de définit (pour les entités de dessin dont la couleur n’est pas celle du calque), il suffit de supprimer les codes DXF 420 et 430 de la définition de l’entité si ils sont présent, comme ceci par exemple :

(entmod (vl-remove-if '(lambda (x) (or (= (car x) 420) (= (car x) 430))) (entget (car (entsel)))))

 

Pour généraliser à l’ensemble du dessin, tu peux utiliser la fonction ssmap expliqué dans ce sujet:

(defun	ssmap (fun ss / n)
  (if (= 'PICKSET (type ss))		; si ss est bien un jeu de sélection,			
    (repeat (setq n (sslength ss))	; répéter autant de fois qu'il y a d'entité,			
      (apply fun (list (ssname ss (setq n (1- n))))); appliquer la fonction a chaque entité		
    )
  )
)

 

Et donc rapidement ta macro pourrait ressembler à cela :

(defun c:index ()
 (ssmap '(lambda (x)
    (entmod (vl-remove-if
	      '(lambda (x) (or (= (car x) 420) (= (car x) 430)))
	      (entget x)
	    )
    )
  )
 (ssget "_X")
 )
 (princ)
)

 

A tester en espérant avoir répondu à ton besoin

A+

Apprendre => Prendre => Rendre

Posté(e)

Ah cool, ça fonctionne! J'ai mis le temps à comprendre que le mode pas à pas ne fonctionne pas avec la fonction Lambda mais j'ai réussi.

 

Merci VDH-Bruno Merci tout le monde.

 

Voici ma macro pour les curieux

 

(setq js2 (ssget "_X" '((62 . 2))))
(sslength js2)
(setq x 0)
(while (/= x (sslength js2))

(setq name (entget (ssname js2 x)))
(entmod (vl-remove-if '(lambda (x) (or (= (car x) 420) (= (car x) 430))) name))
   
(setq x (+ x 1))
)

<IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG>

 

<a href=www.formu-lan.net>www.FormuLan.net

</a>

Posté(e)

Salut

 

Avec un peu de retard et pour proposer une variante

(and (ssget "_X" '((-4 . ">=")(420 . 0)))
    (vlax-map-collection (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
		  '(lambda(x) (vlax-put x 'color (vlax-get x 'color)))
    )
 (vla-delete sel)
)

 

Bruno, tu peux simplifier

(entmod (vl-remove-if '(lambda (x) (or (= (car x) 420) (= (car x) 430))) (entget (car (entsel)))))

par

(entmod (vl-remove-if '(lambda (x) (member (car x) '(420 430)) (entget (car (entsel)))))

 

@+

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)

Hello Bryce / Patrick (ou autre Pro du Lisp/VLisp)

 

SVP pourrais tu m'expliquer ton filtre

( (-4 . ">=") (420 . 0) )

 

Merci d'avance, lecrabe

Autodesk Expert Elite Team

Posté(e)

Hello Bryce / Patrick (ou autre Pro du Lisp/VLisp)

 

SVP pourrais tu m'expliquer ton filtre

( (-4 . ">=") (420 . 0) )

 

Merci d'avance, lecrabe

Pour le code dxf 420, des valeurs supérieur ou égal à 0

 

Extrait de l'aide

Relational Tests

 

 

Unless otherwise specified, an equivalency is implied for each item in the filter-list. For numeric groups (integers, reals, points, and vectors), you can specify other relations by including a special -4 group code that specifies a relational operator. The value of a -4 group is a string indicating the test operator to be applied to the next group in the filter-list.

 

The following selects all circles with a radius (group code 40) greater than or equal to 2.0:

 

(ssget "X" '((0 . "CIRCLE") (-4 . ">=") (40 . 2.0)))

The possible relational operators are shown in the following table:

 

Relational operators for selection set filter lists

 

Operator

Description

 

"*"

Anything goes (always true)

 

"="

Equals

 

"!="

Not equal to

 

"/="

Not equal to

 

"<>"

Not equal to

 

"<"

Less than

 

"<="

Less than or equal to

 

">"

Greater than

 

">="

Greater than or equal to

 

"&"

Bitwise AND (integer groups only)

 

"&="

Bitwise masked equals (integer groups only)

 

 

The use of relational operators depends on the kind of group you are testing:

 

All relational operators except for the bitwise operators ("&" and "&=") are valid for both real- and integer-valued groups.

The bitwise operators "&" and "&=" are valid only for integer-valued groups. The bitwise AND, "&", is true if ((integer_group & filter) /= 0)—that is, if any of the bits set in the mask are also set in the integer group. The bitwise masked equals, "&=", is true if ((integer_group & filter) = filter)—that is, if all bits set in the mask are also set in the integer_group (other bits might be set in the integer_group but are not checked).

For point groups, the X, Y, and Z tests can be combined into a single string, with each operator separated by commas (for example, ">,>,*"). If an operator is omitted from the string (for example, "=,<>" leaves out the Z test), then the “anything goes” operator, "*", is assumed.

Direction vectors (group type 210) can be compared only with the operators "*", "=", and "!=" (or one of the equivalent “not equal” strings).

You cannot use the relational operators with string groups; use wild-card tests instead.

 

@+

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)
Bruno, tu peux simplifier

(entmod (vl-remove-if '(lambda (x) (or (= (car x) 420) (= (car x) 430))) (entget (car (entsel)))))

 

par

(entmod (vl-remove-if '(lambda (x) (member (car x) '(420 430)) (entget (car (entsel)))))

 

Oui Patrick_35 c’est juste je t’en remercie, effectivement j’ai été peu rigoureux sur ce coup d’ailleurs en lisant également Byce je m’aperçois que j’aurais pu soigner un peu plus ma sélection, au passage je conseil à Arcasdk de s’en inspirer pour gagner en efficacité dans sa macro.

 

Et pour être complet je remercie également (gile) pour les explications concernant le calcul de la valeur de TrueColor que je ne connaissais pas.

 

A+

Apprendre => Prendre => Rendre

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é