Aller au contenu

Couleur en fonction des cotes


Messages recommandés

Posté(e)

J'aimerai savoir si il existe une solution pour associer les couleur des cotes en fonction de leur longueur.

 

Mes cotes sont très répétitive et font toujours des longueurs fixe, j'aimerai que la cote 1.50m s'affiche en bleu, 2.00m en vert, 2.50m en rouge etc...

 

Est-ce possible ?

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Posté(e)

Bonjour,

 

Oui, c'est possible :

(defun c:DIMCOLOR (/ ss i d l c)
 (if (setq ss (ssget '((0 . "DIMENSION"))))
   (progn
     (setq i 0)
     (repeat (sslength ss)
(setq d (entget (ssname ss i)))
(setq l (cdr (assoc 42 d)))
(cond
 	;;Debut des conditions : Ajouter des conditions a la suite
 	;;l : longueur a evaluer ()
 	;;c : couleur {(1~255) 256=bylayer}
 	;; {1:rouge 2:jaune 3:vert 4:cyan 5:bleu 6:magenta 7:blanc}
 	((equal l 1500.0 0.000001) (setq c 1))
 	((equal l 2000.0 0.000001) (setq c 2))
 	((equal l 2500.0 0.000001) (setq c 3))

 	;;SI aucune condition n'est rempli : couleur ByLayer
 	(t (setq c 256))
 	;;Fin des conditions
)
(entmod (append d (list (cons 62 c))))
(setq i (1+ i))
     )
   )
 )
 (princ)
)

 

 

Je suis débutant en lisp alors, c'est vraiment du bricolage ... rolleyes.gif

Quelqu'un de plus expérimenter te donnera peut-être quelque chose de plus simple, concis et compréhensible.

D'ailleurs au passage, si cette personne pouvais me dire ce qui est simplifiable, ca serait sympa tongue.gif

 

Ju du Japon

Posté(e)

Merci, débutant mais bien plus balèze que moi.

 

J’essaie ça de suite.

 

EDIT : Bon ba ça ne fonctionne pas, ça me demande de choisir des objets...

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Posté(e)

Bonjour à tous,

Si ton plan est en mètre, modifie

((equal l 1500.0 0.000001) (setq c 1))

((equal l 2000.0 0.000001) (setq c 2))

((equal l 2500.0 0.000001) (setq c 3))

par

((equal l 1.500 0.000001) (setq c 1))

((equal l 2.000 0.000001) (setq c 2))

((equal l 2.500 0.000001) (setq c 3))

 

Olivier

Posté(e)

A ba oui merci.

 

EDIT : Pas mieux. Je parle des cote dans la présentation hein.

 

EDIT2 : En fait ça change bien la couleur dans les propriété mais pas à l'écra.

 

EDIT 3 : C'est bon il fallait que je modifie mon style de cote, merci.

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Posté(e)

Bonsoir,

 

J'avais tester avec le style de cote standard, ça marche bien.

 

Je viens de réessayer avec un style perso, ça ne marche pas, même problème que toi. Je suis allé voir dans le style, et la couleur est réglée sur Ducalque. J'ai change ça en DuBloc, et le problème est réglé.

 

Ju du Japon

Posté(e)

Bonjour,

 

Je suis débutant en lisp alors, c'est vraiment du bricolage ...

C’est plutôt très bon et prometteur pour des débuts en lisp, sauf que commencer par la programmation des cotations, c’est pas forcément ce qu’il y a de plus simple pour débuter en lisp pur si tu veux écrire un code robuste.

 

Pour t’en convaincre re-teste ton code sur un style de cote dont les couleurs (ligne d’attache, ligne de cote, et texte) ne sont pas dépendant DuCalque

 

En pur Lisp, il faudra donc passer par une réécriture des styles de cotes pour forcer les couleurs (Référence DXF-> Section ENTITIES-> DIMENSION-> Réécriture des styles de cotes) en jouant avec les codes 176, 177, 178 dans les données étendues de l’application A-C-A-D(les tirets sont pour éviter de voir écrit AutoCAD automatiquement :unsure: )

 

 

Quelqu'un de plus expérimenter te donnera peut-être quelque chose de plus simple, concis et compréhensible.

Tu vois pas forcément si tu restes en AutoLisp, à moins de préférer le VLisp et le paramétrage des propriétées DimensionLineColor, ExtensionLineColor, TextColor.

 

 

D'ailleurs au passage, si cette personne pouvais me dire ce qui est simplifiable, ca serait sympa

 

Ceci :

(setq d (entget (ssname ss i)))
 (setq l (cdr (assoc 42 d)))
 (cond ;;Debut des conditions : Ajouter des conditions a la suite
       ;;l : longueur a evaluer ()
       ;;c : couleur {(1~255) 256=bylayer}
       ;; {1:rouge 2:jaune 3:vert 4:cyan 5:bleu 6:magenta 7:blanc}
       ((equal l 1500.0 0.000001) (setq c 1))
       ((equal l 2000.0 0.000001) (setq c 2))
       ((equal l 2500.0 0.000001) (setq c 3))
       ;;SI aucune condition n'est rempli : couleur ByLayer
       (t (setq c 256))
       ;;Fin des conditions
 )

 

Peux se "factoriser" comme cela :

(setq d (entget (ssname ss i))
       l (cdr (assoc 42 d))
       c (cond ((equal l 1500.0 1e-6) 1)
               ((equal l 2000.0 1e-6) 2)
               ((equal l 2500.0 1e-6) 3)
               (256)
         )
 )

 

 

Et ici même si cela fonction très bien :

(entmod (append d (list (cons 62 c))))

 

Dans la definition dxf de ton entité tu crées deux fois le code 62 dans le cas où la valeur existe déjà, la fonction entmod filtrant les entrées par la queue de liste dans ce sens cela se passe bien (encore faut-il l’avoir à l’esprit). Avec le dxf, suivant "les recommandations d'Autodesk", il faut être sensé programmer indépendamment de l’ordre des élément de la liste dxf, donc habituellement on teste la présence du code dans la liste si oui on le substitue dans la définition DXF avec subst, sinon on l’ajoute avec append :

(entmod (if (setq dxf62 (assoc 62 d))
         (subst (cons 62 c) dxf62 d)
         (append d (list (cons 62 c)))
       )
)

 

Sinon tu peux éventuellement éviter une sélection utilisateur en remplaçant

(setq ss (ssget '((0 . "DIMENSION"))))

Par

(ssget "_X" '((0 . "DIMENSION")))

 

 

A titre d'exemple une variante possible en VLisp :

;; VDH-Bruno - la cote 1.50m en bleu, 2.00m en vert, 2.50m en rouge 
(defun c:DIMCOLOR ()
 (vl-load-com)
 (if (ssget "_X" '((0 . "DIMENSION")))
   (vla-delete
     (vlax-map-collection
       (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))
       '(lambda (o / l c)
          (setq l (vla-get-Measurement o)
                c (cond ((equal l 1.5 1e-6) 1)
                        ((equal l 2.0 1e-6) 2)
                        ((equal l 2.5 1e-6) 3)
                        (256)
                  )
          )
          (foreach p '(DimensionLineColor ExtensionLineColor TextColor) (vlax-put o p c))
        )
     )
   )
 )
 (princ)
)

 

Cordialement Bruno

Apprendre => Prendre => Rendre

Posté(e)

Merci Bruno pour ces explications.

 

Quand je dis bricolage, c'est que j'ai utiliser un lisp qui me sert a modifier le texte de cote que quelqu'un du forum m'avais confectionne. J'ai simplement patauge pour en changer le fonctionnement (oui, je m'embrouille encore pas mal dans les variables/listes a passer au fonctions, sachant que je suis au japon et j'ai toute l'aide de vlide en japonais mellow.gif) ...

 

 

Donc, j'ai pas vraiment tout écrit tout seul ... unsure.gif

 

Ju du Japon

Posté(e)

Re,

 

Merci Bruno pour ces explications.

Quand je dis bricolage, c'est que j'ai utiliser un lisp qui me sert a modifier le texte de cote que quelqu'un du forum m'avais confectionne. J'ai simplement patauge pour en changer le fonctionnement (oui, je m'embrouille encore pas mal dans les variables/listes a passer aux fonctions,

Quand je dis que c’est prometteur c’est parce que tu es arrivé à l’adapter et que cela fonctionne après que ce soit pour un style de cote spécifique (celles dont la définition des couleurs n’est pas forcé), c’est un peu secondaire. Pour ce qui est de mes explications sur les données étendues, tu peux faire l’impasse dessus dans un premier temps cela te parlera plus tard si tu persiste dans cette voie.

 

sachant que je suis au japon et j'ai toute l'aide de vlide en japonais

Tu as de la chance, l’aide au développement n’est plus traduite pour les versions française depuis la R14 (environ 15 ans), et pour moi l’anglais me parle presque autant que le japonais, tu vois il y a de l’espoir ;)

 

Donc, j'ai pas vraiment tout écrit tout seul ...

Moi non plus au début, pour la petite histoire j’ai été utilisateur de Lisp avant d'en écrire, j’ai commencé par modifié les noms des commandes Lisp, puis à repérer et à changer les invites des commandes lisp, puis j’ai pris de l’assurance et j’ai voulu personnaliser certains programmes à mon environnement de travail pour gagner un clic ou deux et là ça a commencé à être la galère à se compliquer franchement (à ce taper la tête contre les mur) et devenir très chronophage pour une réussite rarement satisfaisante et un enrichissement personnel quasi nulle.

 

Puis j’ai compris que la méthode n’était pas bonne et que le temps investie serai bien plus profitable dans la durée, en révisant à la baisse mes objectifs pour me consacrer à un véritable apprentissage du Lisp..

 

Bonne continuation,

Apprendre => Prendre => Rendre

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

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