Slowhand91 Posté(e) le 3 mars 2010 Posté(e) le 3 mars 2010 Bonjour, Je cherche a réunir plusieurs fichiers dwg en un seul. A savoir chaque fichier représente un folio (en espace objet) d'un schéma electrique. Le but est d'obtenir un seul fichier (un carnet) composé de plusieurs onglets, chaque onglet repésentant le folio concerné. Si j'ai Folio01.dwg, Folio02.dwg ... Folioxx.dwg j'obtiendrai donc Carnet.dwg composé de x onglets 01,02...xx Sachant que les folios du schéma sont situés tous dans le même répertoire. Merci d'avance de vos idées. Philippe
Patrick_35 Posté(e) le 3 mars 2010 Posté(e) le 3 mars 2010 Salut Un lisp vite fait (defun c:grf(/ dirbox doc lay obj sel tot) (defun dirbox(txt / cdl rep) (if (setq cdl (vlax-create-object "Shell.Application")) (progn (and (setq rep (vlax-invoke cdl 'browseforfolder 0 txt 512 "")) (setq rep (vlax-get-property (vlax-get-property rep 'self) 'path)) ) (vlax-release-object cdl) ) ) rep ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object)) tot 1 ) (vla-startundomark doc) (and (setq rep (dirbox "Sélectionnez le répertoire pour grouper les folios")) (setq lst (vl-directory-files rep "*.dwg" 1)) (progn (setq rep (vl-string-translate "\\" "/" rep)) (or (eq (substr rep (strlen rep) 1) "/") (setq rep (strcat rep "/"))) (foreach ele (acad_strlsort lst) (setq lay (itoa tot)) (while (< (strlen lay) 3) (setq lay (strcat "0" lay)) ) (and (vl-catch-all-error-p (vl-catch-all-apply 'vla-add (list (vla-get-layouts doc) lay))) (ssget "x" (list (cons 410 lay))) (progn (vlax-map-collection (setq sel (vla-get-activeselectionset doc)) 'vla-delete) (vla-delete sel) ) ) (vla-put-activelayout doc (vla-item (vla-get-layouts doc) lay)) (setq obj (vla-insertblock (vla-get-paperspace doc) (vlax-3d-point '(0.0 0.0 0.0)) (findfile (strcat rep ele)) 1 1 1 0 ) ) (vl-catch-all-apply 'vla-explode (list obj)) (vla-delete obj) (setq tot (1+ tot)) ) (vla-purgeall doc) ) ) (vla-endundomark doc) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Raph_38 Posté(e) le 3 mars 2010 Posté(e) le 3 mars 2010 Marrant cette demande ... totalement l'opposé de celle que j'avais demandé :D Raph. Celui qui pose une question est bête 5 minutes, celui qui n'en pose pas l'est toute sa vie !
Slowhand91 Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 Merci Patrick, mais lors du chargement de ton lisp j'obtiens le message suivant: "erreur: structure incorrecte de la liste en entrée". Philippe
(gile) Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Salut, "erreur: structure incorrecte de la liste en entrée" Ce message signifie qu'il y a un problème d'appariement de parenthèses.Essaye de refaire un copier/coller du code en prenant soin de prendre tout le code et rien que le code. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Slowhand91 Posté(e) le 4 mars 2010 Auteur Posté(e) le 4 mars 2010 En effet, tout simplement un mauvais copier coller, merci beaucoup à vous 2 (Patrick et Gilles). La routine marche parfaitement bien. Je sais pas si cela est possible, mais peut on récupérer le nom des fichiers pour la création des onglets, à savoir 001.dwg donnerait l'onglet 001 et 052.dwg donnerait l'onglet 052 afin de pouvoir gérer les éventuels trous dans les fichiers. Merci encore et longue vie à ce magnifique site. Philippe
Patrick_35 Posté(e) le 4 mars 2010 Posté(e) le 4 mars 2010 Tu remplaces (setq lay (itoa tot)) (while (< (strlen lay) 3) (setq lay (strcat "0" lay)) ) par (setq lay (vl-filename-base ele)) et même supprimer ces lignes tot 1 (setq tot (1+ tot)) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Slowhand91 Posté(e) le 5 mars 2010 Auteur Posté(e) le 5 mars 2010 Parfait, cela correspond tout a fait a ce que je voulais. Merci beaucoup pour ce lisp !!!!!!! J'en profite pour vous poser une question a propos des onglets. J'aimerais pouvoir appliquer n'importe quelle commande à tous les onglets et non pas seulement à l'onglet actif. Par exemple, je selectionne les onglets que je veux modifier et je tape la commande "zoom etendue" et la commande s'effectue sur les onglets selectionnes.Ou alors, toujours en selectionnant les onglets que je veux modifier je tape la commande "effacer tout".Ou la commande "filter" afin d'appliquer un filtre, ect... Philippe
Patrick_35 Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 Salut (defun c:mcd(/ cde def doc lay pos rep) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (and (setq rep (getstring T "\nCommande à effectuer : ")) (/= rep "") (progn (setq def (vla-get-activelayout doc)) (if (setq pos (vl-string-search " " rep)) (progn (setq cde (list (substr rep 1 pos)) rep (substr rep (+ 2 pos)) ) (while (setq pos (vl-string-search " " rep)) (setq cde (cons (substr rep 1 pos) cde) rep (substr rep (+ 2 pos)) ) ) (setq cde (reverse (cons rep cde))) ) (setq cde (list rep)) ) (vlax-for lay (vla-get-layouts doc) (vla-put-activelayout doc lay) (eval (cons 'vl-cmdf cde)) ) (vla-put-activelayout doc def) ) ) (vla-endundomark doc) (princ) ) Exemple :commande : mcdCommande à effectuer : zoom et @+ [Edité le 5/3/2010 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Slowhand91 Posté(e) le 5 mars 2010 Auteur Posté(e) le 5 mars 2010 Merci Patrick ton lisp fonctionne bien, mais sur tout les onglets à la fois ! Il faudrait qu'il ne lance la commande que sur les onglets selectionnés. Merci encore de ta rapidité. Philippe
Patrick_35 Posté(e) le 5 mars 2010 Posté(e) le 5 mars 2010 J'ai modifié le lisp mcd, car j'avais une erreur Pour ce qui est des onglets, à moins d'avoir une dll par notre cher (gile) tu as la fonction (crpSelectedLayouts) qui le permet Je verrai un peu plus tard @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
hisham Posté(e) le 4 mai 2012 Posté(e) le 4 mai 2012 Bonjour, Je suis un débutant sur les routines lisp, et j'aimerais savoir comment utiliser la routine lisp proposée par Patrick_35 sous autocad et si possible aussi sous Intelliplus. Merci d'avance;
MONEYS Posté(e) le 3 février 2014 Posté(e) le 3 février 2014 Bonjour, j'ai personnalisé le lisp "grf" pour copier dans l'espace objet ("modelspace" au lieu de "paperspace") mais J'aurai besoin d'épurer le 1er lisp "grf" de ce topic, pour supprimer le code qui crée des onglets d'EP Qui serait capable d'éditer le lsp ? Merci pas mal... merci. Moi qui 'aime pas trop les programmes "fait maison", là je suis surpris ça marche[sEE.Ex V4.R1A & XELEC V7.20A] Dongle Perso... FORUM SEE ELECTRICAL EXPERT : http://seexp.free.fr/
Patrick_35 Posté(e) le 4 février 2014 Posté(e) le 4 février 2014 Bonjour, j'ai personnalisé le lisp "grf" pour copier dans l'espace objet ("modelspace" au lieu de "paperspace") mais J'aurai besoin d'épurer le 1er lisp "grf" de ce topic, pour supprimer le code qui crée des onglets d'EP Qui serait capable d'éditer le lsp ? MerciLe lisp modifié mais non testé et à affiner(defun c:grf(/ bg dirbox doc hd ele lst obj rep x y) (defun dirbox(txt / cdl rep) (if (setq cdl (vlax-create-object "Shell.Application")) (progn (and (setq rep (vlax-invoke cdl 'browseforfolder 0 txt 512 "")) (setq rep (vlax-get-property (vlax-get-property rep 'self) 'path)) ) (vlax-release-object cdl) ) ) rep ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (and (setq rep (dirbox "Sélectionnez le répertoire pour grouper les folios")) (setq lst (vl-directory-files rep "*.dwg" 1)) (progn (setq rep (vl-string-translate "\\" "/" rep) x 0.0 y 0.0 ) (or (eq (substr rep (strlen rep) 1) "/") (setq rep (strcat rep "/"))) (foreach ele (acad_strlsort lst) (setq obj (vla-insertblock (vla-get-modelspace doc) (vlax-3d-point (list x Y 0.0)) (findfile (strcat rep ele)) 1 1 1 0 ) ) (vla-getboundingbox obj 'bg 'hd) (setq bg (vlax-safearray->list bg) hd (vlax-safearray->list hd) ) (setq x (+ x (- (car hd) (car bg)) 10.0)) (vl-catch-all-apply 'vla-explode (list obj)) (vla-delete obj) ) (vla-purgeall doc) ) ) (vla-endundomark doc) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
MONEYS Posté(e) le 4 février 2014 Posté(e) le 4 février 2014 Un grand merci à toi Patrick_35 je vais tester ça ;) merci bien pas mal... merci. Moi qui 'aime pas trop les programmes "fait maison", là je suis surpris ça marche[sEE.Ex V4.R1A & XELEC V7.20A] Dongle Perso... FORUM SEE ELECTRICAL EXPERT : http://seexp.free.fr/
amario Posté(e) le 25 novembre 2014 Posté(e) le 25 novembre 2014 Bonjour, je suis nouveau dans le monde "LISP".Je suis en train d'utiliser ce routine que je trouve très utile. Une fois le lisp lancé (Autocad 2014) , il va créer plusieurs onglets vides dans mon fichier. L’objective de ce lisp n'est pas t-il de créer pour chaque fichier DWG une onglet avec le dessin? il est où l'erreur? merci en avance, M
NIICO Posté(e) le 21 août 2019 Posté(e) le 21 août 2019 Salut Un lisp vite fait (defun c:grf(/ dirbox doc lay obj sel tot) (defun dirbox(txt / cdl rep) (if (setq cdl (vlax-create-object "Shell.Application")) (progn (and (setq rep (vlax-invoke cdl 'browseforfolder 0 txt 512 "")) (setq rep (vlax-get-property (vlax-get-property rep 'self) 'path)) ) (vlax-release-object cdl) ) ) rep ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object)) tot 1 ) (vla-startundomark doc) (and (setq rep (dirbox "Sélectionnez le répertoire pour grouper les folios")) (setq lst (vl-directory-files rep "*.dwg" 1)) (progn (setq rep (vl-string-translate "\\" "/" rep)) (or (eq (substr rep (strlen rep) 1) "/") (setq rep (strcat rep "/"))) (foreach ele (acad_strlsort lst) (setq lay (itoa tot)) (while (< (strlen lay) 3) (setq lay (strcat "0" lay)) ) (and (vl-catch-all-error-p (vl-catch-all-apply 'vla-add (list (vla-get-layouts doc) lay))) (ssget "x" (list (cons 410 lay))) (progn (vlax-map-collection (setq sel (vla-get-activeselectionset doc)) 'vla-delete) (vla-delete sel) ) ) (vla-put-activelayout doc (vla-item (vla-get-layouts doc) lay)) (setq obj (vla-insertblock (vla-get-paperspace doc) (vlax-3d-point '(0.0 0.0 0.0)) (findfile (strcat rep ele)) 1 1 1 0 ) ) (vl-catch-all-apply 'vla-explode (list obj)) (vla-delete obj) (setq tot (1+ tot)) ) (vla-purgeall doc) ) ) (vla-endundomark doc) (princ) ) @+ Bonjour, Je pense être dans le même cas ...J'ai un DWG d'origine que j'utilise et j'aimerais assembler plusieurs DWG dans ce DWG d'origine.Directement dans l'espace papier. Est-ce possible ? Merci d'avance Bien à vousNIICO
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