Krynn Posté(e) le 6 juillet 2007 Posté(e) le 6 juillet 2007 Bonjour, Les présentations sont vraiment bien pratique, mais des fois l'on souhaite faire un petit extrait directement dans l'espace objet.C'est toujours possible d'imprimer avec "fichier imprimer", mais on passe un temps fous a saisir les point de le fenêtre, .... c'est de la que m'est venu l'idée de faire un petit LISP qui demande l'échelle, l'orientation, ... avec le clic droite de la souris. Le CTB est choisi en fonction de l'échelle. Mais force est de constaté que je reste bloqué sur plusieurs points. - Les imprimantes sont déjà définie dans le LISP (aucune souplesse) - changer d'échelle et d'orientation à tout moment.... C'est pour cette raison que je me tourne vers vous afin s'améliorer le LISP Voila le code: ;;;;;;;;;;; AFFICHE LE RECTANGLE PROVISOIRE ;;;;;;;;;;;;;;; (defun dessin_provisoire () (redraw) (if (= ORIENT "PAysage") (progn (setq pt2 (list (car PT1) (+ (cadr PT1) (* ECH (car TAILLE))) 0.0)) (setq pt3 (list (+ (car PT1) (* ECH (cadr TAILLE))) (+ (cadr PT1) (* ECH (car TAILLE))) 0.0)) (setq pt4 (list (+ (car PT1) (* ECH (cadr TAILLE))) (cadr PT1) 0.0)) ) ) (if (= ORIENT "POrtrait") (progn (setq pt2 (list (car PT1) (+ (cadr PT1) (* ECH (cadr TAILLE))) 0.0)) (setq pt3 (list (+ (car PT1) (* ECH (car TAILLE))) (+ (cadr PT1) (* ECH (cadr TAILLE))) 0.0)) (setq pt4 (list (+ (car PT1) (* ECH (car TAILLE))) (cadr PT1) 0.0)) ) ) (princ PT1) (grdraw PT1 PT2 1) (grdraw PT2 PT3 1) (grdraw PT3 PT4 1) (grdraw PT4 PT1 1) (grdraw PT1 PT3 1) (grdraw PT4 PT2 1) ) ;;;;;;;;;;; PROGRAMME DE BASE ;;;;;;;;;;;;;;; (defun c:SPEEDPRINT (/ ocmd attdi filia) ;;;;; QUESTIONS ;;;;;;; (setq ocmd (getvar "cmdecho")) (setq attdi (getvar "ATTDIA")) (setvar "CMDECHO" 1) (setvar "ATTDIA" 0) (initget "A4 A3 A2 A1 A0") (setq FORMAT (getkword "\n Format de la page [A4/A3/A2/A1/A0]")) (if (= FORMAT "A4") (progn (setq TAILLE (list 21.0 29.7)) (princ TAILLE) ) ) (if (= FORMAT "A3") (progn (setq TAILLE (list 29.7 42.0)) (princ TAILLE) ) ) (if (= FORMAT "A2") (progn (setq TAILLE (list 42.0 59.4)) (princ TAILLE) ) ) (if (= FORMAT "A1") (progn (setq TAILLE (list 59.4 84.0)) (princ TAILLE) ) ) (if (= FORMAT "A0") (progn (setq TAILLE (list 84.0 118.8)) (princ TAILLE) ) ) (initget "PAysage POrtrait") (setq ORIENT (getkword "\n Orientation [PAysage/POrtrait]")) (initget "1 2 5 10 20 50 100 200 500 1000") (setq ECH (getint "\n Preciser l'echelle [1/2/5/10/20/50/100/200/500/1000]")) (princ "\nSelectionner la zone : ") (setq FLAG T) (while FLAG (setq CODE_RET (grread 1 7 0)) (setq TYPE_RET (car CODE_RET)) (cond ((= TYPE_RET 5) ;; Elément de saisie graphique (setq PT1 (cadr CODE_RET)) (dessin_provisoire) ) ((= TYPE_RET 3) ;; Point sélectionné (setq PT1 (cadr CODE_RET)) (setq FLAG nil) ) ) ) (if (= FORMAT "A4") (progn (initget "AdobePDF DesignJet1055 LaserJet1300 Riccoh3800") (setq PRINTER (getkword "\n Preciser l'echelle [AdobePDF/DesignJet1055/LaserJet1300/Riccoh3800]")) ) ) (if (= FORMAT "A3" ) (progn (initget "AdobePDF DesignJet1055 Riccoh3800") (setq PRINTER (getkword "\n Preciser l'echelle [AdobePDF/DesignJet1055/Riccoh3800]")) ) ) (if (or (= FORMAT "A2") (= FORMAT "A1") (= FORMAT "A0") ) (progn (princ "\nOK") (initget "DesignJet1055 AdobePDF") (setq PRINTER (getkword "\n Preciser l'echelle [AdobePDF/DesignJet1055]")) ) ) (command "_-plot" "Oui" "" "Adobe PDF.pc3" FORMAT "" ORIENT "Non" "Fenetre" PT1 PT3 (strcat "10=" (itoa ECH)) "c" "oui" (strcat "arc-" (itoa ECH) ".ctb") "" "" "n" "o" "o") (setvar "CMDECHO" ocmd) ; Remise des variable (setvar "ATTDIA" attdi) (princ) ) Toute proposition sera la bien venue.Je suis peut-être parti dans la mauvaise voie et il serait peut-être mieux de développer ca en VBA?J'espère que ce code ne fera pas mourir certains. :-) Pour vous donner une idée d'ou je suis maintenant: Désolé, la qualité est mauvaise et on li rien du tout.mais c'est la première fois que je fais ca. C'est un bon test. <acronym class=dict title= MerciKrynn
Serge Posté(e) le 7 juillet 2007 Posté(e) le 7 juillet 2007 Krynn, J'ai modifié quelque peu ton programme à la lumière de l'objectif que j'en comprenais. J'ai inséré plein de commentaires pour rendre la lecture plus facile. Convertir en VBA ne simplifirait rien car si on veut de la souplesse, on finira par faire ouvrir des boite de dialogue, ce qui en fin de compte revient à exécuter la commande TRACEUR elle-même (à titre d'exemple, lister les imprimantes réseaux, locales, les fichiers pc3, les innombrables formats de feuilles, etc.) Si je me base sur les résultats, on veut normalement choisir un format puis sélectionner l'imprimante si plus d'un choix est offert. C'est comme ça que j'ai conçu le programme. Il y a 3 variables globales: *formats*, *imprimantes* et *echelles*. C'est la seule partie qu'il faut adapter. Si tu ajoute, modofie ou supprime une imprimante, ce sera somme toute assez facile. Voici le code. Après avoir chargé le fichier, on exécute SPEEDPRINT en espace Objet. Serge ;;; ------------------------------------------------------- ;; 3 variables globales qui définissent les paramètres d'impression. ;;; (setq *formats* (list ;; Liste des formats, leur taille correspondante en orientation Portrait et le nom canonique (list "A4" (list 21.0 29.7) "A4 [210 x 297 mm]") (list "A3" (list 29.7 42.0) "A3 [297 x 420 mm]") (list "A2" (list 42.0 59.4) "A2 [420 x 594 mm]") (list "A1" (list 59.4 84.0) "A1 [594 x 840 mm]") (list "A0" (list 84.0 118.8) "A0 [840 x 1188 mm]") (list "Tabloide" (list 11.0 17.0) "Tabloid [11 x 17 in]") ; À titre d'exemple (list "Lettre" (list 8.5 11.0) "Letter [8.5 x 11 in]") ; À titre d'exemple )) (setq *imprimantes* (list ;; Liste des imprimantes, leurs formats supportés et le nom de périphérique de sortie ou fichier pc3. (list "AdobePDF" (list "A4" "A3" "A3" "A2" "A1" "A0") "Adobe PDF.pc3") (list "DesignJet1055" (list "A4" "A3" "A3" "A2" "A1" "A0") "DesignJet 1055.pc3") (list "Riccoh3800" (list "A4" "A3") "Riccoh 3800.pc3") (list "LaserJet1300" (list "A4") "LaserJet1300.pc3") (list "DelrinaFax" (list "Lettre") "Delrina") ; À titre d'exemple )) (setq *echelles* (list ;; Liste des échelles "1" "2" "5" "10" "20" "50" "100" "200" "500" "1000" )) ;;; ------------------------------------------------------- ;;; imprimantesPossibles ;;; Retourne les imprimates qui supportent le format demandé. ;;; ;;; Reçoit ;;; format: 'STR, un choix parmi "A4" "A3" "A3" "A2" "A1" "A0" ;;; Retourne ;;; 'LIST, une liste d'imprimantes ;;; ;;; Exemple: ;;; (imprimantesPossibles "A4") retournait '("LaserJet1300") ;;; (imprimantesPossibles "A0") retournait '("AdobePDF" "DesignJet1055" "LaserJet1300" "Riccoh3800") ;;; (imprimantesPossibles "Tabloide") retournait nil (defun imprimantesPossibles ( format / choix nom return ) (setq return nil) (foreach imprimante *imprimantes* (setq nom (car imprimante)) (setq choix (cadr imprimante)) (if (member format choix) (setq return (cons nom return))) ) (if return (setq return (acad_strlsort return))) ; trier return ) ;;; getkwordString ;;; Convertit une liste de chaine en une seule, dont chaque item est séparé par un / ;;; ;;; Reçoit: ;;; liste: 'STR, une liste de chaînes ;;; separator: 'STR, un (et un seul) caractère, soit idéalement " " ou "/" ;;; Retourne: ;;; 'STR, la chaine résultante ;;; ;;; Exemple: (getkwordString *echelles* "/") ;;; où (setq *echelles* (list "1" "2" "5" "10" "20" "50" "100" "200" "500" "1000")) ;;; retournerait "1/2/5/10/20/50/100/200/500/1000" ;;; Note: Aucune validation n'a été faite sur le paramètre liste. (defun getkwordString ( liste separator / return ) (setq return "") (foreach item liste (setq return (strcat return separator item))) (setq return (substr return 2)) ; Enlever le 1er caractère, i.e. le / return ) ;;; rectangle_provisoire ;;; Dessine un rectangle temporaire qui s'effacera avec Redraw ;;; Reçoit: ;;; ptCentre: 'LIST, un pt 2D ;;; format: 'STR, un des choix "A4" "A3" "A3" "A2" "A1" "A0" ;;; echelle: 'INT, un des choix parmi 1 2 5 10 20 50 100 200 500 1000 ;;; orientation: 'STR, un choix entre pAysage ou pOrtrait. ;;; couleur: 'INT, couleur du rectangle correspond aux couleurs ACI (e.g. 1=rouge, 2=jaune, etc.) ;;; Retourne ;;; LIST, les 2 coins opposés qui on été calculés (defun rectangle_provisoire ( ptCentre format echelle orientation couleur / h2 ptLowerLeft ptLowerRight ptUpperLeft ptUpperRight taille vects w2 x y ) (setq taille (cadr (assoc format *formats*))) (if (= orientation "pAysage") (progn (setq w2 (* 0.5 echelle (nth 1 taille))) ; demi-largeur (setq h2 (* 0.5 echelle (nth 0 taille))) ; demi-hauteur ) (progn (setq w2 (* 0.5 echelle (nth 0 taille))) ; demi-largeur (setq h2 (* 0.5 echelle (nth 1 taille))) ; demi-hauteur )) (setq x (nth 0 ptCentre)) ; X du Point centre (setq y (nth 1 ptCentre)) ; Y du Point centre ;; Les 4 coins (setq ptLowerLeft (list (- x w2) (- y h2))) (setq ptLowerRight (list (+ x w2) (- y h2))) (setq ptUpperRight (list (+ x w2) (+ y h2))) (setq ptUpperLeft (list (- x w2) (+ y h2))) (setq vects (list couleur ptLowerLeft ptLowerRight couleur ptLowerRight ptUpperRight couleur ptUpperRight ptUpperLeft couleur ptUpperLeft ptLowerLeft )) (grvecs vects) (list ptLowerLeft ptUpperRight) ; valeur de retour, les 2 coins opposés ) (defun c:speedprint ( / corners ctb couleur echelle format formats imprimante imprimantes msg orientation pc3 pt pt1 pt2 taille ;; Paramètres de la commande PLOT / TRACEUR _aireDeTrace _configurationDeTraceDetaille _decalageDeTrace _echelleDeTrace _enregistrerModificationsDeMEP _enregistrerTraceDansUnFichier _epaisseurDeLigne _nomDePeripheriqueDeSortie _nomDePresentation _orientationDuDessin _parametrageOmbrage _poursuivre _styleDeTrace _symetrieVerticale _tableDeTraces _tailleDePapier _unitesDePapier ) ;; Demander le format (setq formats (mapcar 'car *formats*)) ; Extrait "A4" "A3" "A3" "A2" "A1" "A0" (setq msg (strcat "\nFormat de la page [" (getkwordString formats "/") "] <" (car formats) ">: ")) (initget (getkwordString formats " ")) (setq format (getkword msg)) (if (not format) (setq format (car formats))) (setq taille (last (assoc format *formats*))) ;; Demander l'imprimante (setq imprimantes (imprimantesPossibles format)) (cond ((not imprimantes) (alert "Il n'y a pas d'imprimante pour ce format.") (exit) ) ((= (length imprimantes) 1) ; Une seule imprimante, la choisir (setq imprimante (car imprimantes)) ) (t (setq msg (strcat "\nChoix de l'imprimante [" (getkwordString imprimantes "/") "] <" (car imprimantes) ">: ")) (initget (getkwordString imprimantes " ")) (setq imprimante (getkword msg)) (if (not imprimante) (setq imprimante (car imprimantes))) ) ) (setq pc3 (last (assoc imprimante *imprimantes*))) ;; Demander l'orientation (initget "pAysage pOrtrait") (setq orientation (getkword "\nOrientation [pAysage/pOrtrait] : ")) (if (not orientation) (setq orientation "pAysage")) ;; Demander l'échelle (setq msg (strcat "\nÉchelle d'impression [" (getkwordString *echelles* "/") "] <" (car *echelles*) ">: ")) (initget (getkwordString *echelles* " ")) (setq echelle (getkword msg)) (if (not echelle) (setq echelle (car *echelles*))) (setq ctb (strcat "arc-" echelle ".ctb")) (setq echelle (atoi echelle)) ;; Demander le point centre de la zone d'impression. (initget 1) ; pas de nil (setq pt (getpoint "\nIndiquez le point centre de la vue: ")) ;; Dessiner le rectangle temporaire (setq couleur 1) ; Dessiner en rouge (setq corners (rectangle_provisoire pt format echelle orientation couleur)) (setq pt1 (nth 0 corners)) (setq pt2 (nth 1 corners)) ;; Imprimer (setq _configurationDeTraceDetaille "_yes") (setq _nomDePresentation (getvar "ctab")) (setq _nomDePeripheriqueDeSortie pc3) (setq _tailleDePapier taille) (setq _unitesDePapier "_millimeters") (setq _orientationDuDessin (strcat "_" orientation)) (setq _symetrieVerticale "_no") (setq _aireDeTrace "_window") (setq _echelleDeTrace (strcat "10=" (itoa echelle))) (setq _decalageDeTrace "_center") (setq _styleDeTrace "_yes") (setq _tableDeTraces ctb) (setq _epaisseurDeLigne "_yes") (setq _parametrageOmbrage "") (setq _enregistrerTraceDansUnFichier "_no") (setq _enregistrerModificationsDeMEP "_yes") (setq _poursuivre "_yes") (command "_-plot" _configurationDeTraceDetaille ; '"_Yes" ou "_No" _nomDePresentation ; "", "Model", qui est universel ou "Objet" _nomDePeripheriqueDeSortie ; Un nom de périphérique ou un fichier pc3 _tailleDePapier ; "A4 [210 x 297 mm]" _unitesDePapier ; _millimeters ou _inches _orientationDuDessin ; _paysage ou _portrait _symetrieVerticale ; _yes ou _no _aireDeTrace pt1 pt2 ; _window et 2 coins opposés _echelleDeTrace ; Pouces/mm tracé = Unités de dessin _decalageDeTrace ; _center ou un point centre _styleDeTrace ; _yes ou _no _tableDeTraces ; Nom d'un fichier ctb ou stb _epaisseurDeLigne ; _yes ou _no _parametrageOmbrage ; _yes ou _no _enregistrerTraceDansUnFichier ; _yes ou _no _enregistrerModificationsDeMEP ; _yes ou _no _poursuivre ; _yes ou _no ) (princ) ) (princ)
Krynn Posté(e) le 9 juillet 2007 Auteur Posté(e) le 9 juillet 2007 Wow, ca marche. super boulot. Merci J'ai encore bcp de progrès a faire avec le LISP. <acronym class=dict title=Merci d'avoir commenté le code, ca va me permettre de mieux comprendre tout ca.
Serge Posté(e) le 9 juillet 2007 Posté(e) le 9 juillet 2007 Au plaisir. Ça faisait longtemps que je n'avais pas visité ce forum. Ça m'a fait fait du bien.Serge
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