fabcad Posté(e) le 18 septembre 2007 Posté(e) le 18 septembre 2007 Bonjour Amis développeurs, Je souhaiterais envoyer des objets qui ont une couleur forcée dans des calques du nom de la couleur. Exemple : Objets de couleur 1 dans calque 1Objets de couleur 2 dans calque 2Objets de couleur 3 dans calque 3Objets de couleur 4 dans calque 4Objets de couleur 5 dans calque 5Objets de couleur 6 dans calque 6Objets de couleur 7 dans calque 7Objets de couleur 8 dans calque 8Objets de couleur 9 dans calque 9Objets de couleur 10 dans calque 10Objets de couleur 11 dans calque 11etc. Merci pour vos suggestions.
Bred Posté(e) le 18 septembre 2007 Posté(e) le 18 septembre 2007 Salut,restons simple... (pourquoi en visual ?...)(defun c:ent-lay-col (/ sel) (setq sel (car (entsel "\n Choix de l'objet :"))) (if (assoc 62 (entget sel)) (entmod (subst (cons 8 (strcat "Calque " (rtos (cdr (assoc 62 (entget sel)))))) (assoc 8 (entget sel)) (entget sel))) (princ "\n Couleur DuCalque") ) ) [Edité le 18/9/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
fabcad Posté(e) le 18 septembre 2007 Auteur Posté(e) le 18 septembre 2007 merci pour ta réponse,Je maitrise l'autolisp et je suis novice en visual lisp. Je voulais voir la différence de langage.
(gile) Posté(e) le 18 septembre 2007 Posté(e) le 18 septembre 2007 Salut, Et pourquoi pas en visual ? ;) Comme c'est le forum Visual LISP, je suppose que fabcad veut se familiariser avec ce langage.En l'état, le LISP place les objets de couleur 1 sur le "Calque1", de couleur 2 sur le "Calque2" etc... si les noms de calques sont d'un autre type, modifier la ligne surlignée.Si un objet avait une couleur dont il n'existe pas de calque équivalent le calque est crééCette version devrait fonction sur les versions d'AutoCAD de 2002 à 2007 au moins. La gestion des couleurs ayant changé en 2004 avec l'arrivée des couleurs vraies la propriété Color devrait disparaître au profit de TrueColor dans une version future (2008 ?).Pour la gestion des 'TrueColor' voir ce sujet (defun c:col2lay (/) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) layers (vla-get-Layers acdoc) ) (if (ssget) (vlax-for obj (vla-get-ActiveSelectionSet acdoc) ; parcourrir le jeu de sélection (setq col (vla-get-Color obj)) ;couleur de l'objet (if (and (/= col 256) ; couleur DuCalque (/= col 0) ; couleur DuBloc ) (progn ;; si le calque du numéro de la couleur n'existe pas... (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list layers [surligneur](setq lay (strcat "Calque" (itoa col))) ; à adapter[/surligneur] ) ) ) ;; ... le créer (vla-put-color (vla-add (vla-get-Layers acdoc) lay) col ) ) (vla-put-Layer obj lay) ; mettre l'objet sur le calque (vla-put-color obj 256) ; mettre la couleur de l'objet en DuCalque ) ) ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 18 septembre 2007 Posté(e) le 18 septembre 2007 Et pourquoi pas en visual ?... parceque je trouve que lorsqu'il faut créer de nouveaux calque, rien n'est plus performant que les entmake/entmode.... et puis il y a la longueur du code.... :cool: mais, bon, il est vrais que je passe tous en vl maintenant... par exemple je me suis crées des routines en vl pour les calques : ;;;; Routine Test Existence ou créés Calque (defun test_exist_calque (nom Couleur) (if (not (tblobjname "LAYER" nom)) (vla-add (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) nom)) (vla-put-Color (vlax-ename->vla-object (tblobjname "LAYER" nom)) Couleur) ) ;;; Routine changement calque de l'objet ; (defun chang_Calque (Ob Calq) (if (not (tblobjname "LAYER" Calq)) (vla-add (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) Calq)) (vla-put-Lock (vlax-ename->vla-object (tblobjname "LAYER" Calq)) :vlax-false) ;déverouille calque (vla-put-layer (vlax-ename->vla-object Ob) Calq) ) ... ce que fait entmake et entmod tous seul !.. [Edité le 18/9/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 18 septembre 2007 Posté(e) le 18 septembre 2007 C'était une boutade Bred. Pour moi, tout est bon : ent... vla... ou command* du moment que c'est du LISP !!! *les dernières routines que j'ai publiées ici utilisent largement command qui est parfois beaucoup plus commode. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 18 septembre 2007 Posté(e) le 18 septembre 2007 C'était une boutade Bred.Je l'avais pris comme ça !Mon explication était surtout pour fabcad. D'ailleur, au vu des routines vl que j'ai mis ci-dessus, je me demande si te proposition, (gile) ne planterais pas si le calque existe, mais est verrouillé... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
fabcad Posté(e) le 18 septembre 2007 Auteur Posté(e) le 18 septembre 2007 Merci pour vos lignes de code, Je dois maintenant les analyser... A+
(gile) Posté(e) le 18 septembre 2007 Posté(e) le 18 septembre 2007 je me demande si te proposition, (gile) ne planterais pas si le calque existe, mais est verrouillé... tout à fait exact Bred. Déverrouiller tous les calques et stocker les objets calques initialemant verrouillés dans une listedans une liste, à ajouter après (setq layers (vla-get-Layers acdoc))(vlax-for Layers (if (= :vlax-true (vla-get-lock c) ) (progn (vla-put-lock c :vlax-false) (setq l_lst (cons c l_lst)) ) ) ) pour restaurer lauers états initiaux, à la fin de la routine : (if l_lst (mapcar '(lambda (x) (vla-put-lock x :vlax-true) ) l_lst ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 18 septembre 2007 Posté(e) le 18 septembre 2007 Et pourquoi pas en visual ? ;) Pour être plus rapide ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 18 septembre 2007 Posté(e) le 18 septembre 2007 Pour être plus rapide Si par rapport à command, il n'y a pas photo, il semblerait que par rapport à entmake ou entmod ce soit moins évident au vu de quelques tests que j'ai fait et de discussion lues sur des forums anglo saxons. Deux exemples contradictoires. Créer une polyligne : (setq pts '((0.0 0.0) (1.0 0.0) (1.0 1.0) (0.0 1.0))) (defun test1 (pts) (setq pl (entmakex (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) ) (mapcar '(lambda (pt) (cons 10 pt)) pts) ) ) ) (entdel pl) ) (defun test2 (pts / pl) (vl-load-com) (setq pl (vlax-invoke (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object) ) ) 'addLightWeightPolyline (apply 'append pts) ) ) (vla-delete pl) ) (benchmark '((test1 pts) (test2 pts)))Benchmarking ................Elapsed milliseconds / relative speed for 8192 iteration(s): (TEST1 PTS).....1109 / 1.94 (TEST2 PTS).....2157 / 1.00 Changer un objet de calque (les calques "Calque1" et "Calque2" existent dans le dessin), l'objet sélectionné est sur le calque1. (setq ent (car (entsel)) obj (vlax-ename->vla-object ent) ) (defun test3 (ent / elst) (setq elst (entget ent)) (entmod (subst '(8 . "Calque2") (assoc 8 elst) elst)) (entmod (subst '(8 . "Calque1") (assoc 8 elst) elst)) ) (defun test4 (obj) (vla-put-Layer obj "Calque2") (vla-put-Layer obj "Calque1") ) (benchmark '((test3 ent) (test4 obj)))Benchmarking .................Elapsed milliseconds / relative speed for 16384 iteration(s): (TEST4 OBJ).....1891 / 2.26 (TEST3 ENT).....4265 / 1.00 [Edité le 18/9/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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