Vincent P. Posté(e) le 10 juin 2020 Posté(e) le 10 juin 2020 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, AmicalementVincent P. Lispeur éternel débutant! Autocad Map3D 2023 Covadis-Autopist 18.2
didier Posté(e) le 10 juin 2020 Posté(e) le 10 juin 2020 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 naturelSI 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 Éternel débutant... Mon site perso : Programmer dans AutoCAD
Luna Posté(e) le 10 juin 2020 Posté(e) le 10 juin 2020 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
Vincent P. Posté(e) le 10 juin 2020 Auteur Posté(e) le 10 juin 2020 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 éternel débutant! Autocad Map3D 2023 Covadis-Autopist 18.2
lecrabe Posté(e) le 10 juin 2020 Posté(e) le 10 juin 2020 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
(gile) Posté(e) le 10 juin 2020 Posté(e) le 10 juin 2020 Salut, Quand le groupe 62 n'existe pas, la valeur par défaut est ByLayer (256) il devrait donc suffire de supprimer les groupes 62; 420 et 430 (pas testé).(entmod (vl-remove-if '(lambda (x) (member (car x) '(62 420 430))) ent)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Luna Posté(e) le 11 juin 2020 Posté(e) le 11 juin 2020 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 :3Aprè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 1
Vincent P. Posté(e) le 11 juin 2020 Auteur Posté(e) le 11 juin 2020 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 reconnaissantVincent P. Lispeur éternel débutant! Autocad Map3D 2023 Covadis-Autopist 18.2
Luna Posté(e) le 11 juin 2020 Posté(e) le 11 juin 2020 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
Aleck_Ultimate Posté(e) le 11 juin 2020 Posté(e) le 11 juin 2020 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
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