JPhil
Membres-
Compteur de contenus
207 -
Inscription
-
Dernière visite
-
Jours gagnés
6
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par JPhil
-
@Little Bear Tu parles de taches répétitives dans ton premier post, commence par là. Commence par les lister, et voir celle qui te paraît la plus simple à programmer. Ca peut être "renommer un calque", "changer la couleur d'un calque", "déplacer certains blocs dans un autre calque" ..... Bref, on attend la suite 😉
-
Sympa de répondre à soi même en donnant la réponse 🥳 Ta réponse pourra servir à d'autres 😉
-
Bonjour et bienvenue. Pour commencer rien ne vaut les tutos : - Intoduction à AutoLISP de (gile) >>> ici <<< - Apprendre Autolisp pour AutoCAD en français de didier >>> ici <<< Faire simple au début puis augmenter le niveau petit à petit.
-
On rencontre donc le même problème. Je suis surpris qu'AutoCAD accepte des doublons, alors que dans toutes les autres parties il refuse (nom de calque par exemple). De ce que j'ai pu comprendre, AutoCAD va chercher les palettes sur notre ordi plutôt que sur le serveur. Même si tu arrives à partager depuis un serveur faut penser à le verrouiller car sinon n'importe qui peut faire n'importe quoi avec les palettes. Bref c'est un peu compliqué.
-
Lier un calque à une échelle d'annotation.
JPhil a répondu à un(e) sujet de MathieuS dans AutoCAD 2016
Pour ma part je ne vois pas trop où est le problème (ou besoin). 2 calques : "Cote-010-C" et "Cote-100-C" 2 fmult dans un onglet de présentation Tu rentres dans la première fenêtre, et tu gèles le premier calque "Cote-010-C". Un texte en dessous de cette fmult avec comme mention "1/100". Tu rentres dans la deuxième fenêtre, et tu gèles le deuxième calque "Cote-100-C". Un texte en dessous de cette fmult avec comme mention "1/10". Après, soit tu travailles directement dans l'espace objet et tu verras les deux calques (je te conseille 2 couleurs différentes) ou sinon tu travailles directement dans les fenêtres (en pensant à bien verrouiller les fenêtres juste avant!). Des fois, faut savoir faire simple 😉 -
Lier un calque à une échelle d'annotation.
JPhil a répondu à un(e) sujet de MathieuS dans AutoCAD 2016
En nom de calque j'évite le "Cote 1:10". Mieux vaut mettre "Cote_1-10" voir "Cote_01-010" si tu utilises du lisp ou même du Diesel. -
Dans mon service nous sommes que 4 et on ne met pas à jour tous les 4 matins les palettes, donc en mode manuel ça passe, mais je vais suivre le sujet. Est-ce qu'en mettant "l'emplacement des fichiers de palettes d'outils" sur un serveur pourrait être la solution ? Un peu dans le même esprit que de faire pointer les lips sur un serveur pour que tout le monde soit à jour. Par contre, je trouve qu'AutoCAD est très light sur la gestion des palettes, car il ne trie pas dans l'ordre alphabétique et se permet de garder des doublons triplons ... La seule solution trouvée est de faire clic droit sur la palette pour avoir avoir le menu "Personnaliser les palettes", puis de renommer la palette qui se trouve dans la colonne "Groupe de palettes", puis de supprimer les doublons dans la colonne "Palettes", puis enfin de renommer la palette avec son nom d'origine. Si y'a moyen de faire le ménage plus rapidement je suis preneur, surtout sur plusieurs postes.
-
mise à jour liste des variables systèmes AutoCAD 2022 et AutoCAD LT 2022
JPhil a répondu à un(e) sujet de rebcao dans AutoCAD 2020-2024
Quand je lis ça, j'ai envie de créer un lisp (TotocadEvolution) qui va lire un à un nos lisp et nous dire celui là c'est bon, celui-ci ça va merder à cause de telle variable système qui se trouve à telle ligne .... par rapport à la version de TotoCAD en cours. Vous pensez que c'est une bonne idée, ou plutôt du temps perdu 🥳 -
Mise à jour Attributs Blocs
JPhil a répondu à un(e) sujet de PhilBat dans ObjectARX/DBX, C++, .NET, RealDWG
En C# je ne sais pas, mais en lisp tu peux copier les valeurs des attributs d'un bloc vers un autre. Il faut juste vérifier que dans le nouveau bloc, il y ait le même nombre et le même ordre d'attribut. ;;;================================================================= ;;; ;;; CAT.LSP V2.01 ;;; ;;; Copier des attributs ;;; ;;; Copyright (C) Patrick_35 ;;; ;;;================================================================= (defun c:CAT(/ att bl doc ent s sel *errcat*) ;========================================================================= ; Gestion des erreurs ;========================================================================= (defun *errcat* (msg) (or (member (strcase msg) '("FUNCTION CANCELLED" ""QUIT / EXIT ABORT"" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON")) (princ (strcat "\nErreur : " msg)) ) (vla-endundomark doc) (setq *error* s) (princ) ) (vl-load-com) (setq s *error* *error* *errcat* doc (vla-get-activedocument (vlax-get-acad-object)) ) (vla-startundomark doc) (and (setq ent (entsel "\nSélectionnez le bloc d'origine : ")) (setq ent (vlax-ename->vla-object (car ent))) (eq (vla-get-objectname ent) "AcDbBlockReference") (eq (vla-get-hasattributes ent) :vlax-true) (princ "\nSélectionnez les blocs destinataires") (ssget (list (cons 0 "insert") (cons 66 1))) (progn (setq att (vlax-invoke ent 'getattributes)) (vlax-for bl (setq sel (vla-get-activeselectionset doc)) (mapcar '(lambda(a b)(vla-put-textstring a (vla-get-textstring b))) (vlax-invoke bl 'getattributes) att) ) (princ (strcat "\n" (itoa (vla-get-count sel)) " bloc(s) modifié(s).")) (vla-delete sel) ) ) (vla-endundomark doc) (setq *error* s) (princ) ) (setq nom_lisp "CAT") (if (/= app nil) (if (= (strcase (substr app (1+ (- (strlen app) (strlen nom_lisp))) (strlen nom_lisp))) nom_lisp) (princ (strcat "..." nom_lisp " chargé.")) (princ (strcat "\n" nom_lisp ".LSP Chargé.....Tapez " nom_lisp " pour l'éxecuter."))) (princ (strcat "\n" nom_lisp ".LSP Chargé......Tapez " nom_lisp " pour l'éxecuter."))) (setq nom_lisp nil) (princ) -
Publication de plusieurs folios en PDF avec noms de signet automatique...
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Merci Luna. Sur une bonne trentaine (pour ne pas dire plus) de fichiers de test, je ne l'ai vu qu'une seule fois, tout comme le fait d'avoir deux mtext au lieu d'un seul, donc c'est aussi une des raisons pour ne pas trop l'intégrer. Flemme ? Moi ? Nooooooonnnnn 😇 -
Publication de plusieurs folios en PDF avec noms de signet automatique...
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Merci Luna 😊 Si ça peut donner des idées à certains, alors tant mieux. Laisser le fichier DSD peut permettre de comprendre pourquoi un ou plusieurs folios et/ou signets ne sortent pas correctement. Mais je confirme que le fichier est réécrit à chaque fois qu'on lance la commande. Je suppose que la commande pour supprimer le fichier DSD serait : (vl-file-delete fil) Il serait intéressant de tester si le fichier PDF possède bien le nombre de page requis, si oui on efface le fichier DSD, si non on le laisse. Mais là c'est peut-être un peu too much. Le formatage du texte avec le "\\pxq[]" je le traite dès le début du traitement du texte, donc normalement c'est bon. Dans mes tests j'ai eu ça dans les propriétés "\pxi-3,I4,t4;- LEGENDE -" alors qu'à l'écran le texte affiché est "- LEGENDE -". Dans le fichier d'impression DSD, on retrouve "\pxi-3,I4,t4;- LEGENDE -", mais bien évidement au moment de l'impression AutoCAD passe outre car il y'a le caractère "\" qui fait partie de la liste des caractères incorrects dans les noms de feuilles "<>/\\":?*|". J'avoue ne pas avoir fait la démarche jusqu'au bout ... hum hum ... , et donc le plus simple étant de modifier le texte directement afin de ne plus avoir le problème. Et puis ça permet de dire au projeteur que ce n'est pas la faute au programme si le projeteur fait du n'importe quoi. Si le programme peut lui apporter un peu plus de rigueur je pense que ça ne peut pas lui faire du mal 😉 -> Sauf erreur, je ne vois pas le lien du post de @GEGEMATIC issu du programme STRIPMTEXT Pour la partie écriture très répétitive, je voulais me rapprocher de ce qu'on fait actuellement [en mode manuel]. J'ai commencé par laisser en majuscule, mais ça faisait un peu mastoc, puis j'ai mis uniquement la première lettre en majuscule, c'était mieux mais ça manquait d'accents .... bref à ce jour je dirais qu'on doit renommer les signets pour moins de 5% (Ex. renommer "-" en "/", quelques accents qui peuvent manquer [dans le fichier lisp] ...) comparé à avant où on devait le faire en 100% manuel et ce à chaque fois qu'on publiait 😞 -
A partir d'un carnet de folios, le programme lance la commande publier avec des noms de signet automatique (dont le nom provient d'un texte au niveau cartouche suivi du numéro de folio) après vous avoir demandé où enregistrer votre fichier PDF. Sur un cartouche type A3, je cherche un mtext en haut à droite dans la zone cartouche, en me basant sur le point d'insertion du bloc cartouche mais aussi en tenant compte de son échelle en X et Y. Par défaut, dans mon utilisation, le texte est en majuscule avec ou sans accents. Dans le traitement, alors que le texte est déjà en majuscule, je le rebascule en majuscule afin de supprimer les accents. Ex "FRANCOIS A L'HÔTEL" devient "FRANCOIS A L'HOTEL" J'applique le programme Nompropre puis j'apporte un traitement sur une partie du texte. Ex "Au Clair De La Lune" devient "Au Clair de la Lune" ou "Francois A L'Hotel" devient "François à l'Hôtel". Les noms de signet (dans le PDF) seront "Au Clair de la Lune - Folio 1" ; "François à l'Hôtel - Folio 2" et ainsi de suite. Dans le cas où il n'y a pas de mtext et/ou de bloc cartouche, le nom du signet sera simplement "Folio 3". Dans le cas où le mtext contient une justification "invisible", le nom du signet va apparaître dans le fichier DSD mais le folio sera absent du PDF. Dans le cas où il y aurait plusieurs mtext dans la zone cartouche, un seul sera pris en compte. Visible dans le nom du signet à la sortie. Au niveau temps pour un fichier qui contient environ 40 folios, il faut compter un peu moins de 4 minutes pour la création du fichier d'impression (temppub.dsd) puis moins de 3 minutes pour obtenir le PDF finalisé. (defun LSTPUB () (progn (vl-load-com) ;;; Verrouiller toutes les fenêtres des présentations (setq doc (vla-get-activedocument (vlax-get-acad-object)) n 0 ) ; fin setq (vla-startundomark doc) (if (ssget "_x" (list (cons 0 "VIEWPORT"))) (progn (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (and (eq (vla-get-displaylocked ent) :vlax-false) (setq n (1+ n)) (vla-put-displaylocked ent :vlax-true) ) ; fin and ) ; fin vlax (vla-delete sel) ) ; fin progn ) ; fin if (vla-endundomark doc) (princ) ;;; Fin de verrouillage des fenêtres des présentations (setq lstf nil) (setq lstlay nil) (setq pdgname "PDG") ; voir lisp "GEFPAGING" (setq pdg 0) ;;; Listing de tous les onglets or "Model" et pdgname (vlax-for layout (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (if (/= (vla-get-name layout) "Model") (progn (if (= (vla-get-name layout) pdgname) (setq pdg 1) ) ; fin if (if (/= (vla-get-name layout) pdgname) (setq lstlay (vl-list* (vla-get-name layout) lstlay)) ) ; fin if ) ; fin progn ) ; fin if layout "Model" ) ; fin vlax ;;; Fin listing de tous les onglets or "Model" et pdgname ;;; Test longueur des noms d'onglets (setq strlenmin 1000) (setq strlenmax 0) (setq strlenopt 1) (foreach x lstlay (if (< (strlen x) strlenmin) (setq strlenmin (strlen x)) ) ; fin if (if (> (strlen x) strlenmax) (setq strlenmax (strlen x)) ) ; fin if ) ; fin foreach (if (= strlenmin strlenmax) (progn (setq strlenopt 0) (setq lstlaytmp lstlay) ) ; fin progn ) ; fin if ;;; Fin test longueur des noms d'onglets ;;; Rajout 0 (if (= strlenopt 1) (progn (setq xpre nil) (setq xsuf nil) (setq x1 nil) (setq lstlaytmp nil) (foreach x lstlay (if (= (strlen x) strlenmin) (progn (setq xpre (substr x 1 (- (strlen x) (- strlenmax strlenmin)))) (setq xsuf (substr x (+ 1 (- (strlen x) (- strlenmax strlenmin))))) (setq x1 (strcat xpre "0" xsuf)) ) ; fin progn ) ; fin if (if (= (strlen x) strlenmax) (setq x1 x) ) ; fin if (setq lstlaytmp (vl-list* x1 lstlaytmp)) ) ; fin foreach ) ; fin progn if strlenopt ) ; fin if strlenopt ;;; Fin de rajout 0 ;;; Tri en ordre croissant (setq lstlay (vl-sort lstlaytmp '<)) ;;; Fin tri en ordre croissant ;;; Suppression du 0 (if (= strlenopt 1) (progn (setq xpre nil) (setq xsuf nil) (setq x1 nil) (setq lstlaytmp nil) (foreach x lstlay (if (= (substr x (- (strlen x) (- strlenmax strlenmin)) 1) "0") (progn (setq xpre (substr x 1 (- (strlen x) (+ (- strlenmax strlenmin) 1)))) (setq xsuf (substr x (+ 1 (- (strlen x) (- strlenmax strlenmin))))) (setq x1 (strcat xpre xsuf)) ) ; fin progn ) ; fin if (if (/= (substr x (- (strlen x) (- strlenmax strlenmin)) 1) "0") (setq x1 x) ) ; fin if (setq lstlaytmp (vl-list* x1 lstlaytmp)) ) ; fin foreach lstlay ) ; fin progn if strlenopt ) ; fin if strlenopt (setq lstlay lstlaytmp) ;;; Fin de suppression du 0 (setq lstlay (reverse lstlay)) ;;; Ajout PDG (if (= pdg 1) (setq lstlay (cons pdgname lstlay)) ) ; fin if ;;; Fin ajout PDG ;;; Liste Layout Name (setq lstlayoutname nil) (setq lstlayoutname (reverse lstlay)) (princ) ;;; Fin de liste Layout Name ;;; traitement (foreach folioname lstlay (progn (command "ctab" folioname) ; nom de la présentation (command "_pspace") ; Mode espace papier (command "_.zoom" "_extents") ; Zoom ;;; Recherche du bloc cartouche (setq nombloc "Cartouche horizontal") (setq ss (ssget "x" (list '(0 . "INSERT") (cons 2 nombloc) (cons 410 folioname)))) (if ss ; test si nombloc est présent (progn (setq bloc (ssname ss 0)) ;;; Récupère info position et échelle du cartouche (setq positionX (getpropertyvalue bloc "Position/X")) (setq positionY (getpropertyvalue bloc "Position/Y")) (setq scaleX (getpropertyvalue bloc "ScaleFactors/X")) (setq scaleY (getpropertyvalue bloc "ScaleFactors/Y")) ;;; Points du cadre de recherche du texte (setq ptX1 105) ; point X en bas à gauche zone cartouche à capturer en 0,0,0 (setq ptX2 204.5) ; point X en haut à droite zone cartouche à capturer en 0,0,0 (setq ptY1 8) ; point Y en bas à gauche zone cartouche à capturer en 0,0,0 (setq ptY2 24) ; point Y en haut à droite zone cartouche à capturer en 0,0,0 ;;; Ajustement des points de recherche par rapport au bloc acrtouche (setq txtpositionX1 (+ (* ptX1 scaleX) positionX)) (setq txtpositionX2 (+ (* ptX2 scaleX) positionX)) (setq txtpositionY1 (+ (* ptY1 scaleY) positionY)) (setq txtpositionY2 (+ (* ptY2 scaleY) positionY)) (setq e (list txtpositionX1 txtpositionY1)) (setq d (list txtpositionX2 txtpositionY2)) ;;; Capture du texte (setq jsel (ssget "_C" e d '((0 . "*TEXT")))) ;;; quand ssget est vide (if jsel ; test si sélection est non vide (setq folioinfo (cdr (assoc 1 (entget (ssname jsel 0))))) (setq folioinfo "Xxxx") ; si mtext non présent mettre "Xxxx" ) ; fin if jsel ) ; fin progn if ss (setq folioinfo "Xxxx") ; si bloc cartouche non présent mettre "Xxxx" ) ; fin if ss ;;; *************************************** ;;; Début du traitement du contenu du texte ;;; *************************************** ;;; Suppression du format mtext (if (vl-string-search "\pxq" folioinfo) (Progn (setq pos (vl-string-search "\pxq" folioinfo)) (setq tempstr (substr folioinfo (1+ pos) 5)) (setq folioinfo (vl-string-subst "" tempstr folioinfo pos)) (setq folioinfo (vl-string-subst "" "\\" folioinfo)) ) ; fin du progn pxq ) ; fin du if pxq ;;; Fin de suppression du format mtext ;;; Remplacement des caractères (if (wcmatch folioinfo "*\\P*") (while (wcmatch folioinfo "*\\P*") (setq folioinfo (vl-string-subst " - " "\\P" folioinfo)) ) ) (if (wcmatch folioinfo "*/*") (while (wcmatch folioinfo "*/*") (setq folioinfo (vl-string-subst "-" "/" folioinfo)) ) ) (if (wcmatch folioinfo "* *") (while (wcmatch folioinfo "* *") (setq folioinfo (vl-string-subst " " " " folioinfo)) ) ) (if (wcmatch folioinfo "*- -*") (while (wcmatch folioinfo "*- -*") (setq folioinfo (vl-string-subst "-" "- -" folioinfo)) ) ) (if (wcmatch folioinfo "*--*") (while (wcmatch folioinfo "*--*") (setq folioinfo (vl-string-subst "-" "--" folioinfo)) ) ) (if (wcmatch folioinfo "*- (*") (while (wcmatch folioinfo "*- (*") (setq folioinfo (vl-string-subst "(" "- (" folioinfo)) ) ) (if (wcmatch folioinfo "*) -*") (while (wcmatch folioinfo "*) -*") (setq folioinfo (vl-string-subst ")" ") -" folioinfo)) ) ) (if (or (= (substr folioinfo 1 1) " ") (= (substr folioinfo 1 1) "-")) (while (or (= (substr folioinfo 1 1) " ") (= (substr folioinfo 1 1) "-")) (setq folioinfo (substr folioinfo 2)) ) ) (if (or (= (substr folioinfo (strlen folioinfo) 1) " ") (= (substr folioinfo (strlen folioinfo) 1) "-")) (while (or (= (substr folioinfo (strlen folioinfo) 1) " ") (= (substr folioinfo (strlen folioinfo) 1) "-")) (setq folioinfo (substr folioinfo 1 (- (strlen folioinfo) 1))) ) ) ;;; Fin de remplacement des caractères ;;; Passage en NomPropre (setq folioinfo (strcase folioinfo)) (setq folioinfo (Nompropre folioinfo)) ;;; Fin de passage en NomPropre ;;; Remplacement des caractères de/des/du/le/la/les/d'/l'/et (if (wcmatch folioinfo "* De *") (while (wcmatch folioinfo "* De *") (setq folioinfo (vl-string-subst " de " " De " folioinfo)) ) ) (if (wcmatch folioinfo "*-De-*") (while (wcmatch folioinfo "*-De-*") (setq folioinfo (vl-string-subst "-de-" "-De-" folioinfo)) ) ) (if (wcmatch folioinfo "* Des *") (while (wcmatch folioinfo "* Des *") (setq folioinfo (vl-string-subst " des " " Des " folioinfo)) ) ) (if (wcmatch folioinfo "*-Des-*") (while (wcmatch folioinfo "*-Des-*") (setq folioinfo (vl-string-subst "-des-" "-Des-" folioinfo)) ) ) (if (wcmatch folioinfo "* Du *") (while (wcmatch folioinfo "* Du *") (setq folioinfo (vl-string-subst " du " " Du " folioinfo)) ) ) (if (wcmatch folioinfo "*-Du-*") (while (wcmatch folioinfo "*-Du-*") (setq folioinfo (vl-string-subst "-du-" "-Du-" folioinfo)) ) ) (if (wcmatch folioinfo "* Le *") (while (wcmatch folioinfo "* Le *") (setq folioinfo (vl-string-subst " le " " Le " folioinfo)) ) ) (if (wcmatch folioinfo "*-Le-*") (while (wcmatch folioinfo "*-Le-*") (setq folioinfo (vl-string-subst "-le-" "-Le-" folioinfo)) ) ) (if (wcmatch folioinfo "* Les *") (while (wcmatch folioinfo "* Les *") (setq folioinfo (vl-string-subst " les " " Les " folioinfo)) ) ) (if (wcmatch folioinfo "*-Les-*") (while (wcmatch folioinfo "*-Les-*") (setq folioinfo (vl-string-subst "-les-" "-Les-" folioinfo)) ) ) (if (wcmatch folioinfo "* La *") (while (wcmatch folioinfo "* La *") (setq folioinfo (vl-string-subst " la " " La " folioinfo)) ) ) (if (wcmatch folioinfo "*-La-*") (while (wcmatch folioinfo "*-La-*") (setq folioinfo (vl-string-subst "-la-" "-La-" folioinfo)) ) ) (if (wcmatch folioinfo "*D'*") (while (wcmatch folioinfo "*D'*") (setq folioinfo (vl-string-subst "d'" "D'" folioinfo)) ) ) (if (wcmatch folioinfo "*L'*") (while (wcmatch folioinfo "*L'*") (setq folioinfo (vl-string-subst "l'" "L'" folioinfo)) ) ) (if (wcmatch folioinfo "* Et *") (while (wcmatch folioinfo "* Et *") (setq folioinfo (vl-string-subst " et " " Et " folioinfo)) ) ) (if (wcmatch folioinfo "*-Et-*") (while (wcmatch folioinfo "*-Et-*") (setq folioinfo (vl-string-subst "-et-" "-Et-" folioinfo)) ) ) ;;; Fin remplacement des caractères de/des/du/le/la/les/d'/l'/et ;;; Remplacement des caractères accentués (if (wcmatch folioinfo "* A *") (while (wcmatch folioinfo "* A *") (setq folioinfo (vl-string-subst " à " " A " folioinfo)) ) ) (if (wcmatch folioinfo "*-A-*") (while (wcmatch folioinfo "*-A-*") (setq folioinfo (vl-string-subst "-à-" "-A-" folioinfo)) ) ) (if (wcmatch folioinfo "*Legende*") (while (wcmatch folioinfo "*Legende*") (setq folioinfo (vl-string-subst "Légende" "Legende" folioinfo)) ) ) (if (wcmatch folioinfo "*Arriere*") (while (wcmatch folioinfo "*Arriere*") (setq folioinfo (vl-string-subst "Arrière" "Arriere" folioinfo)) ) ) ;;; Exemple avec certains mots (if (wcmatch folioinfo "*Francois*") (while (wcmatch folioinfo "*Francois*") (setq folioinfo (vl-string-subst "François" "Francois" folioinfo)) ) ) (if (wcmatch folioinfo "*Hotel*") (while (wcmatch folioinfo "*Hotel*") (setq folioinfo (vl-string-subst "Hôtel" "Hotel" folioinfo)) ) ) (if (wcmatch folioinfo "*Musee*") (while (wcmatch folioinfo "*Musee*") (setq folioinfo (vl-string-subst "Musée" "Musee" folioinfo)) ) ) ;;; Fin remplacement des caractères accentués ;;; Ajout du nom de folio (if (vl-string-position (ascii "-") folioname) (setq folioname (substr folioname 1 (vl-string-position (ascii "-") folioname))) ) ; Fin du if ascii "-" (setq folioname (vl-string-subst "olio" "olio " folioname)) (setq folioname (vl-string-subst "olio " "olio" folioname)) (if (wcmatch folioname "* 0*") (while (wcmatch folioname "* 0*") (setq folioname (vl-string-subst " " " 0" folioname)) ) ) (if (= folioinfo "Xxxx") ; "Xxxx" si mtext et/ou bloc cartouche non présent prendre uniquement le nom du folio (setq folioinfo folioname) (setq folioinfo (strcat folioinfo " - " folioname)) ) ;;; Fin d'ajout du nom de folio ;;; ************************************* ;;; Fin du traitement du contenu du texte ;;; ************************************* (setq lstf (cons folioinfo lstf)) (princ) ) ; fin progn ) ; fin foreach folioname lstlay ;;; Liste Sheet Name (setq lstsheetname nil) (setq lstsheetname lstf) (princ) ;;; Fin de liste Sheet Name ;;; ********************* ;;; Traitement pour D-S-D ;;; ********************* ;;; nth 0 = folio 1 (setq lst nil) (setq nbtab nil) (setq nbtab0 0) (setq dwgname nil) (setq pagesetup nil) (setq nbtab (- (length (layoutlist)) 1)) (setq dwgname (strcat (getvar "DWGPREFIX") (getvar "DWGNAME"))) (setq pagesetup "") (while (<= nbtab0 nbtab) (setq lstsheetname0 (nth nbtab0 lstsheetname)) (setq lstlayoutname0 (nth nbtab0 lstlayoutname)) (setq lst0 (list lstsheetname0 dwgname lstlayoutname0 pagesetup dwgname)) (setq lst (cons lst0 lst)) (setq nbtab0 (+ nbtab0 1)) ) ; fin while (setq typ nil) (setq typ 6) (setq dwf nil) (setq dwf (strcat PubPath (substr (getvar "DWGNAME") 1 (- (strlen (getvar "DWGNAME")) 4)) ".pdf")) (setq out nil) (setq out (strcat (getvar "DWGPREFIX"))) (setq vf nil) (setq vf "TRUE") ;;; **************************** ;;; Fin de traitement pour D-S-D ;;; **************************** ) ; fin progn ) ; fin defun ;;===========================================================================;; ;; MKDSD IS A UTILITY WHICH WILL CONSTRUCT A DRAWING SET DESCRIPTION FILE ;; ;; (*.DSD) FOR CONFIGURATION OF THE "PUBLISH" COMMAND ;; ;; ;; ;; ARGUMENTS: LST -> A LIST - OR LIST OF LISTS - COMPRISED OF: ;; ;; 1) SHEET NAME (STR); USUALLY THE NAME OF THE DRAWING ;; ;; 2) FULL DRAWING PATH (STR), INCLUDING FILE NAME ;; ;; 3) LAYOUT NAME (STR) ;; ;; 4) PAGE SETUP (STR); NOTE - EMPTY STRING IF PAPERSPACE ;; ;; 5) SHEET PATH (STR); TYPICALLY THE SAME AS DRAWING PATH ;; ;; TYP -> AN INTEGER, INDICATING THE TYPE OF OUTPUT: ;; ;; 0 - DWF, SINGLE SHEETS ;; ;; 1 - DWF, MULTI-SHEET ;; ;; 2 - PRINTER SPECIFIED IN PAGE SETUP ;; ;; 3 - DWFX, SINGLE SHEETS ;; ;; 4 - DWFX, MULTI-SHEET ;; ;; 5 - PDF, SINGLE SHEET ;; ;; 6 - PDF, MULTI-SHEET ;; ;; DWF -> OUTPUT (STR) - FULL PATH/NAME FOR MULTI-SHEET FILE ;; ;; OUT -> OUTPUT (STR) - PATH ONLY FOR SINGLE SHEET FILES ;; ;; (NAMES TAKEN FROM INDIVIDUAL SHEET ;; ;; NAMES, PER LST ARGUMENT, ABOVE) ;; ;; VF -> BOOLEAN - INDICATES WHETHER TO OPEN GENERATED FILE ;; ;;===========================================================================;; (defun mkdsd (lst typ dwf out vf / D-S-D FIL FLDSD I S X Y) (setq d-s-d (open (setq fil (strcat PubPath "temppub.dsd")) "w")) (setq filp fil) ; FLDSD CONSTRUCTS STRINGS BASED ON THE LST ARGUMENT, ; TO BE WRITTEN INTO THE DSD. (defun fldsd (strlst / ) (mapcar '(lambda (s) (write-line s d-s-d)) (append (mapcar '(lambda (x y) (vl-string-subst x "\|/" y)) strlst (list "[DWF6Sheet:\|/]" "DWG=\|/" "Layout=\|/" "Setup=\|/" "OriginalSheetPath=\|/" ); list ); mapcar (list "Has Plot Port=0" "Has3DDWF=0") ); append ); mapcar ); fin defun fldsd (mapcar '(lambda (i) (write-line i d-s-d)) (list "[DWF6Version]" "Ver=1" "[DWF6MinorVersion]" "MinorVer=1" ); list ); mapcar (if (listp (car lst)) (mapcar 'fldsd lst) (fldsd lst) ); if (mapcar '(lambda (i) (write-line i d-s-d)) (list "[Target]" (strcat "Type=" (itoa typ)) (strcat "DWF=" dwf) (strcat "OUT=" out) "PWD=" "[MRU block template]" "MRU=0" "[MRU Local]" "MRU=0" "[MRU Sheet List]" "MRU=0" "[AutoCAD Block Data]" "IncludeBlockInfo=0" "BlockTmplFilePath=" "[SheetSet Properties]" "IsSheetSet=FALSE" "IsHomogeneous=FALSE" "SheetSet Name=" "NoOfCopies=1" "PlotStampOn=FALSE" (strcat "ViewFile=" (if vf "TRUE" "FALSE")) "JobID=0" "SelectionSetName=" (strcat "AcadProfile=" (getvar "cprofile")) "CategoryName=" "LogFilePath=" "IncludeLayer=FALSE" "LineMerge=FALSE" "CurrentPrecision=" "PromptForDwfName=FALSE" "PwdProtectPublishedDWF=FALSE" "PromptForPwd=FALSE" "RepublishingMarkups=FALSE" "PublishSheetSetMetadata=FALSE" "PublishSheetMetadata=FALSE" "3DDWFOptions=0 1" ); list ); mapcar (close d-s-d) fil ); fin defun mkdsd (defun Nompropre (str / lst flag) (apply 'strcat (mapcar '(lambda (x) (setq x (strcase (substr str 1 1) flag) str (substr str 2) flag (not (wcmatch x "`-, ,'")) ) x ) (repeat (strlen str) (setq lst (cons T lst))) ) ) ) ; fin defun Nompropre (defun GETDIR( / cdl rep) (setq cdl (vlax-create-object "Shell.Application") rep (vlax-invoke cdl 'browseforfolder 0 "Sélectionnez la branche de répertoires à traiter" 512 "")) (vlax-release-object cdl) (setq PubPath (strcat (vlax-get-property (vlax-get-property rep 'self) 'path) "\\")) ) ; fin defun GETDIR (defun c:GEFPUB() (progn (GETDIR) (LSTPUB) (mkdsd lst typ dwf out vf) ;;; sauvegarde état boite de dialogue (setq oldFD (getvar "FILEDIA")) ;;; boite de dialogue désactivée (setvar "FILEDIA" 0) ;;; publication avec le fichier dsd (command "-publish" filp) ;;; restauration boite de dialogue (setvar "FILEDIA" oldFD) ) ; fin progn GEFPUB ) ; fin defun GEFPUB Remarques : - J'hésite à supprimer le fichier DSD à la fin. Bonne ou mauvaise idée ? - Est-il possible de supprimer toutes les justifications étranges d'un mtext ? - J'ai tenté de jouer sur la longueur des noms de présentations. Ex "Folio 1" avec "Folio 10" qui fonctionne plutôt bien, mais ne fonctionne plus si on a "Folio1-10" avec "Folio10-10" ou "Folio 1" avec "Folio 100" J'ai pas insisté et j'ai fait au plus simple avec le programme "GEFPAGING" disponible >>> ici <<< Rappel du programme "GEFPAGING" En attente de vos remarques et/ou optimisations 🙂
-
[LISP/Diesel ou Full Lisp] Renommer des onglets et des folios dans un cartouche automatiquement
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Mise à jour du programme qui gère plus de 100 folios et le fait qu'il n'y ait pas de bloc cartouche dans une présentation. J'ai ajouté la question sur le fait d'afficher les "0" dans le champ folio du cartouche. Vous avez le choix entre "FOLIO 001/100" ou "FOLIO 1/100". Avec cette mise à jour il faut compter un peu moins de 2 minutes pour 40 folios. ;; Renumber Layouts - Lee Mac ;; Sequentially numbers all Paperspace layouts, with an optional prefix & suffix. ;; Optional Page de Garde include (defun RL ( / int lst lyn ord pre sed suf ) ;; Ask for a Page de Garde (initget "Yes No") (setq pdgtab 0) (if (= (getkword "\nY'a t'il une Page de Garde ? [Yes/No] <No>: ") "Yes") (setq pdgtab -1) ) (initget "Yes No") (setq savezeros 0) (if (= (getkword "\nFaire apparaitre des 0 du style 001/100 ? [Yes/No] <No>: ") "Yes") (setq savezeros -1) ) (setq padzeros nil) ;; Count all tabs with or without Page de Garde (setq nbtab (itoa (+ pdgtab (length (layoutlist))))) ;; Prefix & suffix (setq pdgname "PDG" pre "Folio" suf (strcat "-" nbtab) lyn (list (strcase pre)) ) ;; Obtain list of layout objects, current names, and sort index (vlax-for lyt (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (if (= :vlax-false (vla-get-modeltype lyt)) (setq lst (cons lyt lst) lyn (cons (strcase (vla-get-name lyt)) lyn) ord (cons (vla-get-taborder lyt) ord) ) ) ) ;; Construct a unique seed for temporary renaming (setq sed "%") (while (vl-some '(lambda ( x ) (wcmatch x (strcat "*" sed "*"))) lyn) (setq sed (strcat sed "%")) ) ;; Temporarily rename layouts to ensure no duplicate keys when renumbering (setq int (+ 0 pdgtab)) (foreach lyt lst (vla-put-name lyt (strcat sed (itoa (setq int (1+ int))))) ) ;; Rename layouts in tab order, with prefix & suffix (setq int (+ 0 pdgtab)) (foreach idx (vl-sort-i ord '<) (progn (setq int (1+ int)) (setq padzeros (itoa int)) (while (< (strlen padzeros) (strlen nbtab)) (setq padzeros (strcat "0" padzeros)) ) (vla-put-name (nth idx lst) (strcat pre padzeros suf)) ;; Rename the first layout PDG if the answer of Page de Garde is Yes (if (= int 0) (vla-put-name (nth idx lst) pdgname) ) ) ) (princ) ) (defun PAGING( / nombloc attpage attnumpage adoc numtabs atts id lay_field) (progn ; Paramètres (setq nombloc "Cartouche horizontal") ; nom du bloc cartouche (setq attpage "NUM_F") ; étiquette de l'attribut numéro de page (setq lstlay nil) ; Fin paramètres (vlax-for layout (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (if (/= (vla-get-name layout) "Model") (setq lstlay (vl-list* (vla-get-name layout) lstlay)) ) ) (foreach folioname lstlay (progn (command "ctab" folioname) ;;; Mode espace papier (command "_pspace") ;;; Zoom (command "_.zoom" "_extents") (setq ss (ssget "x" (list '(0 . "INSERT") (cons 2 nombloc) (cons 410 folioname)))) (if ss (progn (setq x (sslength ss)) (foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS (setq x (- x 1)) )) 'getattributes) (if (= attpage (strcase (vla-get-tagstring att))) (progn (setq folionamenew folioname) (if (wcmatch folionamenew "*olio*") (setq folionamenew (vl-string-subst "OLIO " "olio" folionamenew)) ) (if (= savezeros 0) (if (wcmatch folionamenew "* 0*") (while (wcmatch folionamenew "* 0*") (setq folionamenew (vl-string-subst " " " 0" folionamenew)) ) ) ) (if (wcmatch folionamenew "*-*") (setq folionamenew (vl-string-subst "/" "-" folionamenew)) ) (vla-put-textstring att folionamenew) ) ) ; end if ) ; foreach ) ; fin progn if ss ) ; fin if ss ) ; progn ) ; foreach folioname lstlay (princ) ) ) ; fin defun PAGING (defun c:GEFPAGING() (vl-load-com) (princ) (RL) (PAGING) ) -
[LISP/Diesel ou Full Lisp] Renommer des onglets et des folios dans un cartouche automatiquement
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Mise à jour en full lisp 🙂 Le programme est une compilation de deux lisp "Renumber Layouts" et "Paging" adapté à mon besoin. Il renomme tous les onglets en "FolioXX-YY" ainsi que l'attribut des folios du cartouche en "FOLIO XX/YY". J'ai inclus la possibilité de dire que le premier folio est une page de garde ou non. Par contre, le numéro des folios dans le cartouche déconne quand le nombre de présentation dépasse 99 🤥. Voir dans la partie "Paging" d'où vient le problème. Bon en même temps, le maximum de folios dans un même fichier DWG, que j'ai vu, était de 60, donc j'suis large mais si quelqu'un peut dire dire pourquoi ça déconne (et comment le résoudre) quand on dépasse les 99 folios, il est le bienvenue 😉 ;; Renumber Layouts - Lee Mac ;; Sequentially numbers all Paperspace layouts, with an optional prefix & suffix. ;; Optional Page de Garde include (defun RL ( / int lst lyn ord pre sed suf ) ;; Ask for a Page de Garde (initget "Yes No") (setq pdgtab 0) (if (= (getkword "\nY'a t'il une Page de Garde ? [Yes/No] <No>: ") "Yes") (setq pdgtab -1) ) ;; Count all tabs with or without Page de Garde (setq nbtab (itoa (+ pdgtab (length (layoutlist))))) (if (< (strlen nbtab) 2) (setq nbtab (strcat "0" nbtab)) ) ;; Prefix & suffix (setq pdgname "PDG" pre "Folio" suf (strcat "-" nbtab) lyn (list (strcase pre)) ) ;; Obtain list of layout objects, current names, and sort index (vlax-for lyt (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (if (= :vlax-false (vla-get-modeltype lyt)) (setq lst (cons lyt lst) lyn (cons (strcase (vla-get-name lyt)) lyn) ord (cons (vla-get-taborder lyt) ord) ) ) ) ;; Construct a unique seed for temporary renaming (setq sed "%") (while (vl-some '(lambda ( x ) (wcmatch x (strcat "*" sed "*"))) lyn) (setq sed (strcat sed "%")) ) ;; Temporarily rename layouts to ensure no duplicate keys when renumbering (setq int (+ 0 pdgtab)) (foreach lyt lst (vla-put-name lyt (strcat sed (itoa (setq int (1+ int))))) ) ;; Rename layouts in tab order, with prefix & suffix (setq int (+ 0 pdgtab)) (foreach idx (vl-sort-i ord '<) (vla-put-name (nth idx lst) (strcat pre (padzeros (itoa (setq int (1+ int))) 2) suf)) ;; Rename the first layout PDG if the answer of Page de Garde is Yes (if (= int 0) (vla-put-name (nth idx lst) pdgname) ) ) (princ) ) (defun padzeros ( str len ) (if (< (strlen str) len) (padzeros (strcat "0" str) len) str) ) (defun validstring ( msg / rtn ) (while (not (or (= "" (setq rtn (getstring t msg))) (snvalid rtn) ) ) (princ (strcat "\nThe name cannot contain the characters \\<>/?\":;*|,=`")) ) rtn ) (defun PAGING( / nombloc attpage attnumpage adoc numtabs atts id lay_field) ; Paramètres (setq nombloc "Cartouche horizontal") ; nom du bloc cartouche (setq attpage "NUM_F") ; étiquette de l'attribut numéro de page ; Fin paramètres (setq adoc (vla-get-activedocument (vlax-get-acad-object))) (setq lay_field 0) (setq id 0) (vlax-for lt (vla-get-layouts adoc) (vlax-for obj (vla-get-block lt) (if (and (= "AcDbBlockReference" (vla-get-objectname obj)) (= nombloc (vla-get-effectivename obj)) (= :vlax-true (vla-get-hasattributes obj) )) (progn (setq atts (vlax-invoke obj 'getattributes)) (foreach x atts (if (= attpage (vla-get-tagstring x)) (progn (setq lay_field (+ 1 lay_field)) (setq id (itoa lay_field)) (if (< (strlen id) 2) (setq id (strcat "0" id)) ) ; fin if strlen id (setq lay_fieldc (strcat "FOLIO " id "/" nbtab)) (vla-put-textstring x lay_fieldc) ; insère la mention folio x/y (if (> id nbtab) (vla-put-textstring x pdgname) ; insère la mention pdgname à la place de folio x/y ) ; fin if id nbtab ) ; fin progn ) ; fin if attpage ) ; fin foreach atts ) ; fin progn ) ; fin if AcDbBlockReference ) ; fin vlax-for obj ) ; fin vlax-for lt (princ) ) ; fin defun PAGING (defun c:GEFPAGING() (vl-load-com) (princ) (RL) (PAGING) ) -
Nombre de bloc dans une cellule tableau légende ?
JPhil a répondu à un(e) sujet de Oeil2bidule dans Personnalisation, macros, DIESEL
En voici un autre qui rajoute la désignation du bloc contenue dans un attribut "LEGENDE". ;; LGD ;; Crée un tableau qui liste les blocs sélectionnés ;; avec la désignation inclue dans l'attribut LEGENDE (defun c:lgd (/ ss refs lst ele ins tbl row) (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*))) (prompt "\nSélectionnez les blocs à lister ou ") (or (setq ss (ssget '((0 . "INSERT")))) (setq ss (ssget "_X" '((0 . "INSERT")))) ) (if ss (progn (vlax-for x (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (or (vlax-property-available-p x 'Path) (setq refs (cons (list (cons (vla-get-EffectiveName x) (gc:GetVisibilityState x) ) (vla-get-Name x) ) refs ) ) ) ) (vla-delete ss) ) ) (foreach n refs (setq lst (if (setq ele (assoc (car n) lst)) (subst (list (car ele) (cadr ele) (1+ (caddr ele))) ele lst) (cons (list (car n) (cadr n) 1) lst) ) ) ) (initget 1) (setq ins (trans (getpoint "\nPoint d'insertion: ") 1 0)) (setq tbl (vla-addtable (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)) ) (vlax-3d-point ins) (+ 2 (length lst)) 4 20 ; Hauteur cellule 80 ; Largeur cellule ) ) (vla-put-VertCellMargin tbl 4.0) ; Marge verticale (vla-put-TitleSuppressed tbl :vlax-false) (vla-put-HeaderSuppressed tbl :vlax-false) (vla-setText tbl 0 0 "Légende") ; Titre (vla-setText tbl 1 0 "Nom du bloc") ; Titre colonne 1 (vla-setText tbl 1 1 "Quantité") ; Titre colonne 2 (vla-setText tbl 1 2 "Symbole") ; Titre colonne 3 (vla-setText tbl 1 3 "Désignation") ; Titre colonne 4 (setq row 2) (foreach b lst (setq tag "XXXXX") (if (= (cdr (assoc 0 (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" (caar b))))) '("*")))) "ATTDEF") (if (= (cdr (assoc 2 (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" (caar b))))) '("*")))) "LEGENDE") (setq tag (cdr (assoc 1 (entget (cdr (assoc -2 (entget (tblobjname "BLOCK" (caar b))))) '("*"))))) ) ) (vla-SetText tbl row 0 (if (cdar B) (strcat (caar B) " (" (cdar B) ")") (caar B) ) ) (vla-SetText tbl row 1 (caddr B)) (vla-SetBlockTableRecordId tbl row 2 (vla-get-ObjectId (vla-Item *blocks* (cadr B))) :vlax-true) (vla-SetText tbl row 3 tag) (vla-setcellalignment tbl row 0 5) (vla-setcellalignment tbl row 1 5) (vla-setcellalignment tbl row 3 4) (setq row (1+ row)) ) (princ) ) ;; gc:GetVisibilityState ;; Retourne l'état de visibilité d'un bloc dynamique ou nil (defun gc:GetVisibilityState (blk / state) (if (= (vla-get-IsDynamicblock blk) :vlax-true) (foreach p (vlax-invoke blk 'GetDynamicBlockProperties) (if (= (type (car (vlax-get p 'AllowedValues))) 'STR) (setq state (vlax-get p 'Value)) ) ) ) state ) (prompt "\nprogramme chargé, saisir: LGD pour lancer.") -
[LISP/Diesel ou Full Lisp] Renommer des onglets et des folios dans un cartouche automatiquement
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Actuellement, je dirais que mes collègues travaillent de cette façon lors d'un nouveau carnet : - nouveau plan avec un seul folio (inclus cartouche et 1 fenêtre) - modification du nom de l'onglet puis duplication de l'onglet ou duplication de l'onglet puis modification du nom de l'onglet - modification de l'attribut folio avant ou après avoir pris connaissance du nombre total de folio -> en fait j'en sais rien :unsure: mais ce que je sais c'est qu'ils le font à la mano. J'ai pas l'impression qu'ils suppriment ou modifient l'ordre des onglets au moment de la création du carnet et même après. Le lisp peut mettre à jour les numéros des folios en fonction de l'avancement du projet, je trouve que c'est un plus qui peut servir. Donc relancer le lisp tous les 4/5 présentations ou plus en fonction de l'avancement du travail jusqu'à avoir fini me paraît pas trop déconnant, sachant qu'il est assez rare de rajouter (ou supprimer) une présentation entre deux si on a bien fait le travail. Dans ce service, il y a beaucoup de vérificateurs, alors ce genre de chose devrait être évité :(rires forts): Je comprends un peu plus facilement l'AutoLISP que les autres. Je vais regarder ton astuce pour les carnets existants (et futur aussi). J'essaye d'apprendre à mes collègues que l'automatisation (si bien fait) peut être un plus :) Sympa ton programme, dans mon ancien service, j'avais utilisé deux champs automatiques dans le cartouche à deux endroits : Pour le nom du fichier un champ non modifiable basique : "Document" comme catégorie de champ, puis "Nom de fichier uniquement" avec "Afficher l'extension du fichier" -> c'est pour éviter d'avoir un fichier qui s’appelle toto.dwg avec un numéro de cartouche autre <_< Pour l'identification du plan en Diesel, j'avais fait un mixte entre le nom du fichier autocad et le nom de l'onglet : $(upper,$(substr,$(getvar,dwgname),1,$(-,$(strlen,$(getvar,dwgname)),$(if,$(eq,$(substr,$(getvar,dwgname),$(-,$(strlen,$(getvar,dwgname)),9),1),"-"),9,$(if,$(eq,$(substr,$(getvar,dwgname),$(-,$(strlen,$(getvar,dwgname)),8),1),"-"),14,11)))))$(substr,$(getvar,ctab),1)L'idée est de prendre les premiers caractères du nom du fichier autocad puis de rajouter le nom de l'onglet, en sachant que dans le nom du fichier autocad il n'y a pas forcément le numéro du folio. Bref, ça permet d'avoir un nom de fichier autocad à l'indice B, et d'avoir 2 plans à l'indice A et 1 plan à l'indice B. J'ai fait en sorte qu'il soit évolutif en fonction du nombre de caractère du numéro de projet (ça va de 4 à 7). Le nom du fichier autocad se résume ainsi : [Numéro projet]-[Phase]- -[Discipline]-[Numéro du plan]-[Numéro du folio]-[indice] ou [Numéro projet]-[Phase]-[Code Géo]-[Discipline]-[Numéro du plan]-[indice]Le nom de l'onglet du plan se résume ainsi : [Numéro du plan]-[Numéro du folio]-[indice] L'identification du plan sur le cartouche se résume ainsi : [Numéro projet]-[Phase]-[Code Géo]-[Discipline]-[Numéro du plan]-[Numéro du folio]-[indice] J'avais tenté de jouer avec la phase (AVP, PRO, DCE) en Diesel, mais j'ai vite abandonné à cause des mises à jour des projets. -
[LISP/Diesel ou Full Lisp] Renommer des onglets et des folios dans un cartouche automatiquement
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Hello, En fait, dans le service où je suis on utilise le logiciel Méridian de BlueCielo. Il inclut une tonne de fichier avec des champs automatique du style nom du fichier, nom du projeteur, du chargé d'affaire, du titre du plan ..... bref super balèze! Là dans le cartouche AutoCAD on peut modifier le numéro du folio et un sous-titre à la mano, le reste étant automatique. Et d'après ce que j'ai compris vaut mieux pas y mettre son nez sinon on y fout le bordel et ça c'est pas bon du tout. Donc oui, l'idéal serait de modifier le fichier d'origine qui sert de modèle pour inclure ce champ automatique, mais pour l'instant j'y crois absolument pas à cette possibilité. Les fichiers modèles ont été créés en 2010 pour information. Donc pour les nouveaux documents on peut intégrer l'expression Diesel puisqu'on duplique l'onglet de base pour faire notre carnet, mais pour l'existant à part faire à la mano lors d'une mise à jour je vois pas trop. L'idée de ce "double programme" c'est dû à un collègue qui m'a dit, sur un des carnets existants que j'avais mis à jour, que le numéro des folios n'était pas bon, à savoir qu'il veut "FOLIO 10/15" plutôt que "FOLIO 10". Bon je pense que t'as compris que pour 2/3 cartouches c'est rapide, mais sur un document existant comportant 37 folios c'est .... hum... plus long! Comme on ne peut pas ajouter le nombre total de folio en utilisant l'expression Diesel (pas faute d'avoir chercher), j'ai donc pris le problème à l'envers en renommant l'onglet (plus facile, après avoir trouvé LE lisp qui va bien). En plus l'avantage de ce lisp comme celui de Patrick_35 (Ron v1.01) c'est qu'il permet très facilement de mettre à jour les numéros de folios après avoir déplacer, supprimer, ou rajouter un onglet. C'est la raison du pourquoi j'ai partagé le lisp et l'expression Diesel pour ceux qui font des carnets sous AutoCAD. Ma question était plus vis à vis des carnets existants, puisque faire à la mano (texte basique) ou mettre le champ (expression Diesel) à la mano, au niveau temps c'est pareil. Par contre la deuxième solution est plus intéressante pour l'avenir. Pour l'automatisation, le nom du bloc du cartouche est "Cartouche horizontal" et l'attribut pour le numéro de folio est "NUM_F". Je n'ai pas ouvert tous les modèles de plan, mais je ne serai pas surpris de voir "Cartouche vertical", "Cartouche A3" .... Donc si t'as une idée de lisp, pourquoi pas. Je vois bien l'idée de demander à l'utilisateur de cliquer sur le cartouche puis l'attribut du folio et que le programme se débrouille pour mettre à jour cet attribut sans toucher les autres. Par contre, me vient une réflexion :mellow: . Serait-il possible, en modifiant le lisp plus haut, d'ajouter la possibilité de modifier cet attribut ("NUM_F") sans utiliser l'expression Diesel ? Je dis ça car quand les personnes utilisent le viewer d'Autodesk, ils ne voient pas l'information de l'expression Diesel. Pour cette partie : Je veux bien ton lisp pour comprendre si c'est possible :) -
Bonjour à toutes et tous, Programme double (Lisp et Diesel) qui permet de renommer totomatiquement les folios d'un cartouche. Idéal pour un carnet contenant plusieurs dizaines de folios. [01/07/2021] Mise à jour en full lisp 🙂, voir plus bas. Pour renommer les onglets il faut utiliser ce lisp suivant dont la source est >>> ici <<< : Les modifications sont : (setq nb (itoa (length (layoutlist)))) (if (< (strlen nb) 2) (setq nb (strcat "0" nb)) ) (setq pre "Folio" suf (strcat "-" nb) lyn (list (strcase pre)) ) à la place de : (setq pre (validstring "\nSpecify prefix <none>: ") suf (validstring "\nSpecify suffix <none>: ") lyn (list (strcase pre)) Le lisp : ;; Renumber Layouts - Lee Mac ;; Sequentially numbers all Paperspace layouts, with an optional prefix & suffix. (defun c:rl ( / int lst lyn ord pre sed suf ) ;; Obtain a valid (optional) prefix & suffix ;;; (setq pre (validstring "\nSpecify prefix <none>: ") ;;; suf (validstring "\nSpecify suffix <none>: ") ;;; lyn (list (strcase pre)) (setq nb (itoa (length (layoutlist)))) (if (< (strlen nb) 2) (setq nb (strcat "0" nb)) ) (setq pre "Folio" suf (strcat "-" nb) lyn (list (strcase pre)) ) ;; Obtain list of layout objects, current names, and sort index (vlax-for lyt (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (if (= :vlax-false (vla-get-modeltype lyt)) (setq lst (cons lyt lst) lyn (cons (strcase (vla-get-name lyt)) lyn) ord (cons (vla-get-taborder lyt) ord) ) ) ) ;; Construct a unique seed for temporary renaming (setq sed "%") (while (vl-some '(lambda ( x ) (wcmatch x (strcat "*" sed "*"))) lyn) (setq sed (strcat sed "%")) ) ;; Temporarily rename layouts to ensure no duplicate keys when renumbering (setq int 0) (foreach lyt lst (vla-put-name lyt (strcat sed (itoa (setq int (1+ int))))) ) ;; Rename layouts in tab order, with prefix & suffix (setq int 0) (foreach idx (vl-sort-i ord '<) (vla-put-name (nth idx lst) (strcat pre (padzeros (itoa (setq int (1+ int))) 2) suf)) ) (princ) ) (defun padzeros ( str len ) (if (< (strlen str) len) (padzeros (strcat "0" str) len) str) ) (defun validstring ( msg / rtn ) (while (not (or (= "" (setq rtn (getstring t msg))) (snvalid rtn) ) ) (princ (strcat "\nThe name cannot contain the characters \\<>/?\":;*|,=`")) ) rtn ) (vl-load-com) (princ) Le lisp va créer le mot "Folio", suivi du numéro de l'onglet en cours en fonction de sa place, suivi du séparateur "-", suivi du nombre total d'onglets. Il n'est pas possible de rajouter un espace et/ou le séparateur "/" dans le nom de l'onglet -> trop facile sinon <_< Pour renommer le numéro de folio dans le cartouche, il faut créer un champ dans l'attribut folio en prenant l'expression Diesel, et y mettre ceci : $(upper,$(substr,$(getvar,ctab),1,5)) $(substr,$(getvar,ctab),6,$(if,$(eq,$(substr,$(getvar,ctab),8,1),"-"),2,$(if,$(eq,$(substr,$(getvar,ctab),9,1),"-"),3)))/$(substr,$(getvar,ctab),$(if,$(eq,$(substr,$(getvar,ctab),$(-,$(strlen,$(getvar,ctab)),2),1),"-"),$(+,1,$(-,$(strlen,$(getvar,ctab)),2)),$(+,1,$(-,$(strlen,$(getvar,ctab)),3)))) L'expression Diesel va mettre le mot "Folio" tout en majuscule, puis va créer un espace, puis va mettre le numéro du folio en cours, puis va transformer le séparateur "-" en séparateur "/", puis va mettre le nombre total de folio. Le nom de l'onglet sera : "Folio01-99" ou "Folio50-200" ou "Folio701-800" Le numéro de folio dans le cartouche sera "FOLIO 01/99" ou "FOLIO 50/200" ou "FOLIO 701/800" Si vous déplacez, supprimez, ou rajoutez un onglet, relancer le lisp pour mettre à jour. Le lisp fonctionne très bien sur un carnet existant contenant plusieurs onglets. L'expression Diesel est à utiliser dés le début de la conception d'un carnet de folio pour plus de facilité 🙂 Question : Est-il possible de faire un lisp qui puisse modifier l'attribut folio en y intégrant l'expression Diesel sur un carnet existant contenant plusieurs dizaines de pages ? -> à première vue plutôt compliqué :unsure: Testé sous AutoCAD 2020
-
Sous Excel j'ai jamais utilisé de VBA et Macro dans mes formules, car en entreprise c'est souvent en off, ce qui me parait logique afin d'éviter les virus.Donc sous AutoCAD, l'utilisation du VBA est-elle la même ? Pour la grille pourquoi pas, de toutes façons comme c'est partie t'as le temps de la programmer, y'a pas d'urgence ;)
-
J'avoue que le jeu du 25 en lui-même m'a fait ressurgir de la nostalgie, le fameux "oh putain! 15 ans" Chiche :P :unsure: Ça fonctionne toujours sur les derniers TotoCAD ? :D
-
Jeu bien connu :D Avec des copains on avait fait une version PalmOS sous le nom de Jumber en 2005 (ouch c'est vieux :ph34r:) : 5x5, 10x10 ou dimension libre, avec retour arrière et une aide activable/désactivable pour les déplacements possibles. A quand une version sous AutoCad (en version lisp) ? :P
-
Voici le LISP modifié qui demande l'angle avant de l'appliquer sur les attributs qu'on souhaite faire une rotation. Un clic en dehors d'un attribut ou la touche échap pour sortir. ;;; ;;; Change la rotation d'un attribut de bloc ;;; ;;; (defun c:ROTATT ( / newrotatt selatt objatt) (vl-load-com) (setq newrotatt (getangle "\nAngle : ")) (while (/= (setq selatt (nentsel "\nSélectionner l'attribut à changer de rotation :")) nil) (setq objatt (vlax-ename->vla-object (car selatt))) (if (= (vla-get-ObjectName objatt) "AcDbAttribute") (progn (vla-put-rotation objatt newrotatt) ) ) ) (princ) ) ;;; ;;; Fin Lisp ROTATT ;;; Voici le LISP source dont j'ai modifié la finalité : ;;; ;;; Change le calque d'un attribut à partir d'un nouveau calque ;;; Le calque doit être créé avant, pas de déroulement de liste pour le choisir ;;; (defun c:layatt ( / newcal selatt objatt) (vl-load-com) (setq newcal (getstring "\nNom du nouveau calque : ")) (while (/= (setq selatt (nentsel "\nSélectionner l'attribut à changer de calque:")) nil) (setq objatt (vlax-ename->vla-object (car selatt))) (if (= (vla-get-ObjectName objatt) "AcDbAttribute") (progn (vla-put-layer objatt newcal) ) ) ) (princ) ) ;;; ;;; Fin Lisp LAYATT ;;; Une version "améliorée" de ce LISP au passage : ;;; ;;; Change le calque d'un attribut à partir d'un attribut source ;;; (defun c:coplayatt ( / selattsource objattsource newcal selatt objatt) (vl-load-com) (setq selattsource (nentsel "\nSélectionner l'attribut source:")) (setq objattsource (vlax-ename->vla-object (car selattsource))) (setq newcal (vla-get-layer objattsource)) (while (/= (setq selatt (nentsel "\nSélectionner l'attribut à changer de calque:")) nil) (setq objatt (vlax-ename->vla-object (car selatt))) (if (= (vla-get-ObjectName objatt) "AcDbAttribute") (progn (vla-put-layer objatt newcal) ) ) ) (princ) ) ;;; ;;; Fin Lisp COPLAYATT ;;;
-
Dimension d'une zone de dessin dans l'espace objet...
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Le LISP n'a pas encore été validé à ce jour, mais voici le code qui peut servir à d'autres : (defun c:geftest() (progn ;;; récupération du nom dwffile (setq DwfFile (getvar "DWGPREFIX")) (setq DwfFile (strcat DwfFile (getvar "DWGNAME"))) (setq DwfFile (substr DwfFile 1 (- (strlen DwfFile) 4))) (setq DwfFile (strcat DwfFile "-Model.dwfx")) ;;; fin de la récupération du nom dwffile (command "ctab" "model") (setq bt (getvar "extmin") tp (getvar "extmax")) (setq xfmult (- (car tp) (car bt))) (setq yfmult (- (cadr tp) (cadr bt))) (setq xyfmult (list (+ 10 xfmult) (+ 10 yfmult) 0)) (command "_layout" "_NEW" "ITGEF") (command "ctab" "ITGEF") (command "_erase" "_ALL" "") (command "_-layer" "_MAKE" "ITGEF" "") (command "_.mview" "0,0,0" xyfmult) (command "_mspace") (command "_zoom" "1xp") (command "_pspace") (command "_zoom" "_ALL") (command "_-layer" "_SET" "0" "") (command "_-layer" "_OFF" "ITGEF" "") (command "_-PLOT" "_Y" "ITGEF" "DWFx ePlot (XPS Compatible).pc3" "RFL_Test" "_M" "_L" "_N" "_E" "_F" "_C" "_Y" "Référentiel (olivier).stb" "_Y" "_Y" "_Y" "_N" DwfFile "_N" "_Y") (command "ctab" "model") (command "_layout" "_DELETE" "ITGEF") (command "_-layer" "_DELETE" "ITGEF" "") ) ) -
Dimension d'une zone de dessin dans l'espace objet...
JPhil a répondu à un(e) sujet de JPhil dans Pour aller plus loin en LISP
Merci (gile). Je continue mes tests et pour l'instant c'est du tout bon. Je donnerais prochainement le code. -
Dimension d'une zone de dessin dans l'espace objet...
JPhil a posté un sujet dans Pour aller plus loin en LISP
Bonjour à tous, Je suis actuellement en train de modifier un "gros" lisp qui n'est pas de moi. Actuellement une partie du lisp fait ceci : imprimer le dessin de la présentation objet dans un DWFx ajusté au format de papier de 4000 x 900 mm sans tenir compte du style de tracé et des épaisseurs de ligne. Pour l'instant, j'ai trouver comment faire pour imprimer un DWFx avec STB et épaisseurs de ligne. Malheureusement le dessin étant grand, il n'est pas possible d'appliquer "Mettre à l'échelle les épaisseurs de ligne", valable uniquement en espace papier. Résolution partielle du problème : - Créer une présentation temporaire avec une fenêtre de 20000 x 4000 mm avec 1xp - imprimer un DWFx ajusté au format de papier de 4000 x 900 mm, en prenant en compte le style de tracé, les épaisseurs de ligne et aussi (surtout) la mise à l'échelle des épaisseurs de ligne Problème en cours : la taille de la fenêtre dans l'espace papier lors de l'impression En effet, les plans peuvent varier de 3000 à 65000 mm pour la longueur et de 2500 à 5000 mm pour la hauteur. Je souhaite donc connaitre la hauteur et la longueur d'un dessin dans l'espace objet (voir pièce jointe). Actuellement je n'ai pas trouver de lisp répondant à ma demande, j'ai uniquement trouver des lisps qui permettent de donner la hauteur et largeur d'une fenêtre de présentation, ce qui m'aide pas. L'idée étant que ça soit automatique et surtout transparent pour l'utilisateur, donc exit l'idée de créer un cadre manuel ou par bloc dynamique autour du dessin. Merci d'avance pour votre aide.
