pingoo666 Posté(e) le 14 février 2012 Posté(e) le 14 février 2012 Bonjour, J'ai un soucis que je n'arrive pas a résoudre. Je travaille avec des xrefs et assez souvent la couleur ou le type de ligne de d'un calque de l'xref change. Par exemple on imagine que les bordures qui étaient en bleu passent en rouge dans l'xref, et je vousrait que ce soit la même chose dans le fichier de présentation. jusqu'a présent pour modifier ces propriétés dans mon dessins, c'est soit on détache on rattache, soit VISRETAIN, ce qui est un peu lourd, surtout que j'ai souvent des états de visibilité assez alambiqués. J'aimerais donc écrire un lisp permettant de récupérer les données de calque de l'xref et de les utiliser dans mon dessin et c'est sur la partie "récupération des données de l'xref" que je bloque. une idée ? Merci d'avance !
bryce Posté(e) le 14 février 2012 Posté(e) le 14 février 2012 Bonjour, Voici une solution possible: enregistrer un état de calques, réinitialiser les propriétés des calques des xrefs (en mettant VISRETAIN à 0 et en déchargeant/rechargeant la xref, astuce piquée à (gile) dans son lisp XCOL), puis restaurer VISRETAIN et l'état de calques. ;;; XSYNCPROPS ;;; Bryce, février 2012 ;;; Synchronise les propriétés des calques (couleur, type de ligne, épaisseur, transparence, style de tracé) ;;; des XRefs sélectionnées avec les propriétés définies dans le fichier externe, tout en conservant leur état ;;; dans le dessin hôte (actif ou non, gelé ou non, verrouillé ou non, tracé ou non, gelé ou non dans les nouvelles fenêtres). ;;; Nécessite AutoCAD 2008 minimum. (defun XSyncProps (/ *error* acdoc blocks b lst ss ent xrefname vr) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) blocks (vla-get-Blocks acdoc) ) (vla-StartUndoMark acdoc) (setq vr (getvar "VISRETAIN")) (defun *error* (msg) (and msg (or (member (strcase msg) '("FUNCTION CANCELLED" "QUIT / EXIT ABORT" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON")) (princ (strcat "\nErreur : " msg)) ) ) (if ss (vla-delete ss)) (layerstate-delete "xsyncprops") (setvar "VISRETAIN" vr) (vla-EndUndoMark acdoc) (princ) ) (princ "\nSélectionnez les Xrefs à synchroniser <liste>: ") (if (setq ss (ssget '((0 . "INSERT")))) (progn (setq ss (vla-get-activeselectionset acdoc)) (vlax-for ent ss (if (= (vla-get-isxref (vla-item blocks (setq xrefname (vla-get-name ent)))) :vlax-true) (or (member xrefname lst) (setq lst (cons xrefname lst)) ) ) ) );progn if ss (progn (vlax-for b blocks (if (= (vla-get-IsXref B) :vlax-true) (setq lst (cons (vla-get-Name B) lst)) ) ) (setq lst (ListBox "Xref sync" "Choix des Xrefs à synchroniser" (mapcar 'cons lst lst) 2)) );progn if listbox ) (if lst (progn (layerstate-save "xsyncprops" 31 nil) (setvar "VISRETAIN" 0) (foreach xrefname lst (setq b (vla-item blocks xrefname)) (vla-unload B) (vla-reload B) );foreach xrefname (setvar "VISRETAIN" vr) (layerstate-restore "xsyncprops" nil) (vla-regen acdoc acActiveViewport) );progn );if lst (*error* nil) );xsyncprops (defun c:XSP (/) (xsyncprops) ) (defun c:XSYNCPROPS (/) (xsyncprops) ) ;~~~~~~~ SOUS-FONCTIONS ~~~~~~~~~~~ ;; str2lst (gile) ;; Transforme un chaine avec séparateur en liste de chaines (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) ;; ListBox (gile) ;; Boite de dialogue permettant un ou plusieurs choix dans une liste (defun ListBox (title msg keylab flag / tmp file dcl_id choice) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ListBox:dialog{label=\"" title "\";") file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";") ((= 1 flag) "spacer;:list_box{key=\"lst\";") (T "spacer;:list_box{key=\"lst\";multiple_select=true;") ) file ) (write-line "}spacer;ok_cancel;}" file) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "ListBox" dcl_id)) (exit) ) (start_list "lst") (mapcar 'add_list (mapcar 'cdr keylab)) (end_list) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice))) (setq choice (reverse choice))) (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab))))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) choice ) ;~~~~~~~ FIN SOUS-FONCTIONS ~~~~~~~~~~~ (princ "\nCommande à utiliser: XSYNCPROPS ou XSP") (princ) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
pingoo666 Posté(e) le 15 février 2012 Auteur Posté(e) le 15 février 2012 Bonjour, merci pour ta réponse. Le seul soucis c'est que mes paramètres de visibilité sont gérés dans les fenetres et la ca pète tout...
krunch Posté(e) le 15 février 2012 Posté(e) le 15 février 2012 Salut Pour la récupération des propriétés de calques d'une XRef il y a une fonction ici : http://www.lee-mac.com/resetxreflayers.html, si ça peut t'aider ..
bryce Posté(e) le 15 février 2012 Posté(e) le 15 février 2012 (modifié) Nouvelle version qui ne devrait rien péter dans tes fenêtres... :P ;;; XSYNCPROPS ;;; Bryce, février 2012 ;;; Synchronise les propriétés des calques (couleur, type de ligne, épaisseur) des XRefs sélectionnées ;;; avec les propriétés définies dans le fichier externe, tout en conservant leur état dans le dessin hôte ;;; (actif ou non, gelé ou non, verrouillé ou non, tracé ou non, gelé ou non dans les nouvelles fenêtres). (defun XSyncProps (/ *error* acdoc blocks layers lay b lst ss ent xrefname xfile xdoc xlayname xlinetype) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) blocks (vla-get-blocks acdoc) layers (vla-get-layers acdoc) ) (vla-StartUndoMark acdoc) (defun *error* (msg) (and msg (or (member (strcase msg) '("FUNCTION CANCELLED" "QUIT / EXIT ABORT" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON")) (princ (strcat "\nErreur : " msg)) ) ) (if ss (vla-delete ss)) (if (cadr xdoc) (vlax-release-object (car xdoc))) (setq xdoc nil) (vla-EndUndoMark acdoc) (princ) ) (princ "\nSélectionnez les Xrefs à synchroniser <liste>: ") (if (setq ss (ssget '((0 . "INSERT")))) (progn (setq ss (vla-get-activeselectionset acdoc)) (vlax-for ent ss (if (= (vla-get-isxref (vla-item blocks (setq xrefname (vla-get-name ent)))) :vlax-true) (or (member xrefname lst) (setq lst (cons xrefname lst)) ) ) ) );progn if ss (progn (vlax-for b blocks (if (= (vla-get-IsXref B) :vlax-true) (setq lst (cons (vla-get-Name B) lst)) ) ) (setq lst (ListBox "Xref sync" "Choix des Xrefs à synchroniser" (mapcar 'cons lst lst) 2)) );progn if listbox ) (if lst (progn (foreach xrefname lst (setq b (vla-item blocks xrefname) xfile (vla-get-path B)) (or (findfile xfile) (setq xfile (strcat (vl-filename-base xfile) ".dwg")) ) (if (car (setq xdoc (GetDocument xfile))) (progn (vla-reload B) (vlax-for xlay (vla-get-layers (car xdoc)) (if (/= "0" (setq xlayname (vla-get-name xlay))) (progn (setq lay (vla-item layers (strcat xrefname "|" xlayname))) (if (/= "CONTINUOUS" (strcase (setq xlinetype (vla-get-linetype xlay)))) (setq xlinetype (strcat xrefname "|" xlinetype)) ) (vla-put-color lay (vla-get-color xlay)) (vla-put-linetype lay xlinetype) (vla-put-lineweight lay (vla-get-lineweight xlay)) ) ) ) (if (cadr xdoc) (vlax-release-object (car xdoc))) (setq xdoc nil) (princ (strcat "\nXRef synchronisée : " xfile "\n" )) );progn (princ (strcat "\nFichier non trouvé : " xfile "\n" )) );if xdoc );foreach xrefname (vla-regen acdoc acActiveViewport) );progn );if lst (*error* nil) );xsyncprops (defun c:XSP (/) (xsyncprops) ) (defun c:XSYNCPROPS (/) (xsyncprops) ) ;~~~~~~~ SOUS-FONCTIONS ~~~~~~~~~~~ ;; str2lst (gile) ;; Transforme un chaine avec séparateur en liste de chaines (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) ;; ListBox (gile) ;; Boite de dialogue permettant un ou plusieurs choix dans une liste (defun ListBox (title msg keylab flag / tmp file dcl_id choice) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ListBox:dialog{label=\"" title "\";") file ) (if (and msg (/= msg "")) (write-line (strcat ":text{label=\"" msg "\";}") file) ) (write-line (cond ((= 0 flag) "spacer;:popup_list{key=\"lst\";") ((= 1 flag) "spacer;:list_box{key=\"lst\";") (T "spacer;:list_box{key=\"lst\";multiple_select=true;") ) file ) (write-line "}spacer;ok_cancel;}" file) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "ListBox" dcl_id)) (exit) ) (start_list "lst") (mapcar 'add_list (mapcar 'cdr keylab)) (end_list) (action_tile "accept" "(or (= (get_tile \"lst\") \"\") (if (= 2 flag) (progn (foreach n (str2lst (get_tile \"lst\") \" \") (setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice))) (setq choice (reverse choice))) (setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab))))) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) choice ) ;; getDocument (gile) ;; Accéder à un dessin ouvert ou fermé ;; Retourne un liste dont le premier terme est le document (vla-object) ;; le deuxième T si le document est du type IAxDb nil s'il est du type IAcad (defun getDocument (fileName / document release AxDb) (if (setq filename (findfile filename)) (progn (vlax-for doc (vla-get-Documents (vlax-get-acad-object)) (if (= (strcase (vla-get-FullName doc)) (strcase fileName)) (setq document doc) ) ) (if (not document) (progn (setq document (vlax-create-object (if (< (setq release (atoi (getvar "ACADVER"))) 16) "ObjectDBX.AxDbDocument" (strcat "ObjectDBX.AxDbDocument." (itoa release)) ) ) AxDb T ) (vla-open document filename) ) ) ) ) (list document AxDb) ) ;~~~~~~~ FIN SOUS-FONCTIONS ~~~~~~~~~~~ (princ "\nCommande à utiliser: XSYNCPROPS ou XSP") (princ) Toutefois le lisp de Lee Mac signalé par krunch est sans aucun doute plus abouti vu son auteur... Modifié le 16 février 2012 par bryce Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
pingoo666 Posté(e) le 16 février 2012 Auteur Posté(e) le 16 février 2012 Merci a tous les deux. Je verrai ca demain mais ces deux fonction ont l'air prometteuses ! J'ai reussi a faire ce que je voualis mais on passe par un visretain et autant d'états de calques que de fenetres ce qui n'est pas très élégant, les solutions proposées ici sont moins "gadget"
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