Aller au contenu

[RESOLU] Forcer la couleur d'une entité


Vincent P.

Messages recommandés

Bonjour,

 

Je cherche à forcer la couleur d’entités en "DuCalque".

J'ai retrouvé que le code DXF 62 correspond à la couleur de l’entité.

 

J'ai donc fait un premier code pour sélectionne toutes les entités du dessin qui ne sont pas en couleur "DuCalque"

(defun c:tst (/ ss n ent)
 (if (setq ss (ssget "_A" (list (cons -4 "!=") (cons 62 256))))
   (progn
     (setq n 0)
     (repeat	(sslength ss)
	(setq ent (entget (ssname ss n))
      	n (+ 1 n)
      	)
	(princ ent)
	(princ "\n")
)
     )
   )
 (princ "\n")
 (princ (sslength ss))
 (princ)
 )

 

Il fonctionne bien, il me ressort les listes DXF des entités qui ont une couleur forcées, et finit avec le nombre d'entités.

 

 

En suite, j'y vais étapes par étapes, j'ai voulu créer un deuxième code qui modifierais la couleur d'une entité.

J'aboutie à ce code :

(defun c:tst2 (/ ent)
 (setq ent (entget (car (entsel)))
ent (subst '(62 . 256) (assoc 62 ent) ent)
)
 (entmod ent)
 (entupd (car ent))
 (princ)
 )

Et ça, ça ne marche pas ..., AutoCad me sort une erreur :

; erreur: type d'argument incorrect: lentityp (-1 . <Nom d'entité: 1d374c0b9a0>)

Je pense que le problème viens de mon utilisation du ENTMOD , car la liste qui sort de SUBST est bonne (me semble bonne).

 

J'ai écrit mon tst2, constatant qu'il ne fonctionnais pas, j'ai relue la page ENTMOD de da-code.fr, et j'ai l'impression que je suit le même procédé que celui décrit. Et la ca fait 2 semaines que je réfléchie a ce qui me bloc, mais ça sort pas ...

S'il faut passer par du vl-, je risque de décrocher rapidement, donc j'aimerais réussir sans.

 

Le but final est donc de combiner les deux pour que toutes les entités du dessin qui ne sont pas en couleur "DuCalque" le devienne. Et biensur, je veut comprendre toutes les étapes de mon code, faire du copier-coller c'est pas très épanouissant.

 

La bise hummm gestes barrière,

 

Amicalement

Vincent P.

Lispeur débutant!
Autocad Map3D 2023
Covadis-Autopist 18.0C

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Je suis cité alors je prends la main pour la réponse :

Il se trouve que (par mesure d'économies?) si l'entité est couleur DUCALQUE la paire pointée commençant par 62 n'existe pas das la liste DXF de l'entité

Donc il faut faire une condition avec IF de ce style :

 

(setq ent (entget (car (entsel))))
(if (assoc 62 ent)
 (progn
(setq ent (subst '(62 . 256) (assoc 62 ent) ent))
(entmod ent)
(entupd (car ent))
)
 )

 

Ce qui signifie en langage naturel

SI il y a une paire pointée commençant par 62 la faire passer en DUCALQUE (256)

Sinon l'entité n'est pas traitée puisque s'il n'y a pas de paire pointée commençant par 62 elle est déjà DUCALQUE

 

Je te remercie de ta question et je vais apporter cette précision sur da-code.fr

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je remarque notamment que ton erreur ne provient pas de (entmod) car (entmod) s'attend à une liste comme argument, ce que tu as fait. En revanche (entupd) requiert le nom d'entité (d'où l'erreur "lentityp (-1 . <Nom d'entité: 1d374c0b9a0>)").

 

En effet le

(car ent)

renvoie bien

(-1 . <Nom d'entité: 1d374c0b9a0>)

donc essaye de remplacer

(entupd (car ent))

par

(entupd (cdar ent))

:3

 

Et par précaution peut-être faire

(entupd (cdr (assoc -1 ent)))

pour être sûre que même si la liste est dans le désordre (ce qui en théorie n'arrivera jamais) ça ne rate pas ^^

 

Du coup, j'en profite aussi pour une idée mais non testée : que se passe-t-il si on retire simplement la paire 62 de la liste (et ainsi se rapprocher de l'écriture native d'un objet ayant une couleur DuCalque) ?

 

Bisous (de loin),

Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Didier, et merci pour ta réponse.

 

Je ne m'était pas occupé de vérifier si la paire pointée 62 existait car mon but c'est de traité une liste créé par un SSGET qui vas justement filtré en fonction de cette paire pointée.

 

Et le code que tu me fournis ne fonctionne pas tout a fait.

Il fonctionne uniquement pour les "couleur de l'index", mais pas pour les "couleur vrais" (en RVB ou TLS). Or je reçoit pas mal de plans ou c'est justement du RVB qui est utilisé ...

 

Ça me fait penser la paire pointée 62 ne doit pas être la seul à régir la couleur dans ces cas ...

Et même en applicant ce code à une entité forcée en "Couleur de l'index", la couleur est bien changée, mais la commande se termine par une erreur.

 

Edit : Luna a solutionné mon l'erreur que provoquais la commande. Merci !

Lispeur débutant!
Autocad Map3D 2023
Covadis-Autopist 18.0C

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Je suis Nul en Lisp mais si je me souviens bien :

 

Code 62 pour les codes couleurs classiques (Valeur = 0 - 256)

256 = ByLayer - 0 = ByBlock

 

Code 420 (ou 430) pour le RGB

 

Code 430 (ou 420) pour les dictionnaires de couleur (DICT, Pantone, RAL)

 

Donc il faut vérifier la présence de ces 3 codes ?!

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

En effet j'ai testé rapidement et la suppression du code 62 n'est pas suffisant pour modifier la couleur de l'entité. En revanche, je ne me souviens pas avoir vu de code 420 et 430 (la couleur de mon objet test était "magenta").

Il faut donc bien forcer le code 62 avec la valeur 256 car en faisant ainsi, la fonction (entmod) reconnais la valeur et supprime le code 62 de la liste (et donc probablement un autre code lié à la couleur).

 

Edit : La suppression toute simple suggérée par (gile) ne semble pas non plus fonctionner avec les couleurs RGB et/ou DICT.

 

En revanche (gile) a raison sur le fait que, en fonction de la couleur de l'objet, il faut appliqué une méthode différente. Il faut donc dans un premier temps supprimer les codes 420 et 430 pour ensuite forcer le code 62 sur la valeur 256, autrement, la couleur ne sera pas modifiée...soit :

 

(defun c:tst (/ ss n ent)
 (if (setq ss (ssget "_A" '((-4 . "!=") (62 . 256))))
     (repeat (setq n (sslength ss))
               (setq ent (vl-remove-if '(lambda (x) (member (car x) '(420 430))) (entget (ssname ss (setq n (1- n))))))
               (entmod (subst '(62 . 256) (assoc 62 ent) ent))
     )
 )
 (princ (strcat "\nUn total de "
                (itoa (sslength ss))
                " objets ont été traités."
        )
 )
 (princ)
)

 

Du coup petite question Vincent P. : pourquoi utiliser un ssget "_A" et non "_X" (la méthode "_A" ne prend pas en compte les objets présents sur les calques gelés) car au vu de l'utilisation de cette commande, autant l'appliquer à la totalité du dessin et éviter d'oublier certains objets :3

Après, faut-il que cette commande ne soit effective que sur l'espace objet ou bien sur la totalité du dessin (espace objet + espace papier) ?

 

PS : je me permet une dernière remarque et après je m'arrête ;)

Je trouve cela plus simple de programmer étape par étape à l'aide de fonctions et non des commandes (le "c:" au niveau du defun) car tu peux utiliser facilement des arguments et faire appelle aux fonctions de manière plus simple du point de vue de l'écriture.

Pour moi une commande est le résultat final de tes recherches, la synthèse de ton travail dans le but d'une utilisation quotidienne, tandis que les recherches et sous-programmes sont des fonctions facilement modulables et faciles d'utilisation. Après ça reste ma façon de faire, il n'y a pas de "manière officielle" ou une seule vérité :3

 

Bisous (de loin),

Luna

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Merci a tous!

 

Le code qu'a posté Luna fait exactement ce que j’envisageais.

Pour le filtre _A ou _X sur le SSGET, effectivement le _X seras plus approprié.

Pour ce qui ai des éléments en espace papier, je n'ai pas d'a priori, je demanderais à mes collègues s'ils ont une préférence. Par contre il m'importe que ça ne change pas dans les blocs. Nous utilisons par exemple des couleurs forcées dans nos blocs-cartouche dans les présentation.

 

Enfin, pour l'application en commande, c'est surtout pour tester le code, je l’intègre ensuite dans une commande plus large.

 

Pour le moment, lorsque je lance ma "grosse" commande, j'ai une fenêtre qui s'ouvre (DCL), proposant grâce à des cases à cocher de :

- purger

- contrôler

- replacer le SCU en général

- détacher toutes les Xref

 

J'alimente cette fonction au fur et à mesure.

Les prochaines étapes, serons :

- Type de ligne en "DuCalque"

- Placer les hachures en arrières plan

- Transformer les Solides en Hachures

 

Merci à vous quatre pour votre aide!

 

 

Socialement distant, mais sincèrement reconnaissant

Vincent P.

Lispeur débutant!
Autocad Map3D 2023
Covadis-Autopist 18.0C

Lien vers le commentaire
Partager sur d’autres sites

Oki je vois :3

 

Par contre il m'importe que ça ne change pas dans les blocs. Nous utilisons par exemple des couleurs forcées dans nos blocs-cartouche dans les présentation.

Pour info les objets sélectionnés via (ssget) sont les objets "premiers" donc pour un bloc, le bloc sera sélectionné mais pas l'ensemble des sous-objets présents dans ce dernier donc pas d'inquiétude à ce niveau là.

 

Pour ce qui ai des éléments en espace papier, je n'ai pas d'a priori, je demanderais à mes collègues s'ils ont une préférence.

Si tu souhaites te limiter aux objets en espace objet, il suffit d'ajouter '(410 . "MODEL") à la liste de ton (ssget) pour limiter la sélection à l'espace objet.

 

Enfin, pour l'application en commande, c'est surtout pour tester le code, je l’intègre ensuite dans une commande plus large.

Vouih je comprend bien, mais une fonction aussi est testable dans AutoCAD, il faut juste penser à utiliser les parenthèses (comme tu le fais dans VLIDE ou l'éditeur que tu utilises). Mais comme je te le dit, si tu n'as pas d'intérêt à utiliser des arguments, il n'y a pas de différences notables entre les deux méthodes (une fonction ne peut pas être "rappelée" via ENTER par contre, il faut utiliser les flèches pour remonter l'historique ^^")

 

- Type de ligne en "DuCalque"

 

Si mes souvenirs sont bons, les types de lignes ont le même principe que la couleur, le code 6 n'est présent que s'il diffère de "DuCalque" donc cela devrait être plutôt simple :3

 

Bonne chance pour le reste ! ♥

 

Bisous (de loin),

Luna

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Je me dit que si un modo passe par là ce sujet aurais plus sa place dans "débuter en LISP" que dans "pour aller plus loin en LISP".

 

Je veut dire par là que ce qui s'y dit est beaucoup plus du genre "bon à savoir pour un débutant" que "trop compliqué pour être abordé sans une certaine expérience" et il me semblerait dommage qu'un débutant passe à côté par peur du forum "pour aller plus loin", ce qui est généralement mon cas.

 

Ou alors peut-être que je me prend trop la tête pour des détails comme on me le dit souvent au boulot.

Je suis dysorthographique alors lâchez-moi les basques avec ça, je fait déjà de mon mieux.
Membre d'Extinction Rebellion, car pour sauver le monde il n'est jamais trop tard, amour et rage !
Pour écrire un vraie point médian (e·x·e·m·p·l·e) [Alt + 0183] ou ajout d'un raccourci clavier personnalisé (ex. [AltGr + ;])

Utilisateur d'AutoCAD 2021 sous Windows 10

Lien vers le commentaire
Partager sur d’autres sites

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é