Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

J'ai dans mon espace objet des carnets de plusieurs feuille au format A4 espacées chacune de 17.77 mm en X et de 16.09 mm en Y. Ce carnet comporte 10 colonnes de feuilles A4 sur un nombre de lignes qui peut être infini...Je vous envoi un modèle en pièce jointe.

J'ai créé un petit programme qui me permet d'automatiser l'impression du nombre de feuilles souhaité en ne sélectionnant que la première.

Cette impression se fait au format PDF.

Le soucis, c'est que je n'ai pas trouvé comment imprimer toutes les feuilles dans un seul fichier PDF. Actuellement ce programme créé autant de fichier PDF qu'il y a de feuille à imprimer.

Auriez vous une idée pour que le programme regroupe automatiquement toutes les feuilles dans un seul fichier PDF ?

Bien sur il y a des logiciels comme PDF Blender qui peuvent regrouper plusieurs PDF en un seul mais si je peux éviter...

 

Voici mon programme :

 

(defun c:tracercarnetpdf (/ ptFA ptFB nbcop compt1 Numpage chemin n)

 

(commune_syndicat)

(setq nbcop (getint "nombre de feuilles dans le carnet de repérage (y compris le cartouche) ?"))

(setq ptFA (getpoint "point inferieur gauche de la feuille du cartouche"))

(setq XptFA (car ptFA))

(setq YptFA (car(cdr ptFA)))

(setq ptFB (getpoint "point superieur droit de la feuille du cartouche"))

(setq XptFB (car ptFB))

(setq YptFB (car(cdr ptFB)))

(setq compt1 1)

(setq Numpage (itoa compt1))

(setq chemin (strcat "C:\\PDF\\" commune "_page " Numpage ".pdf"))

(setq n 1)

(setq a (itoa nbcop))

 

(while (and (<= compt1 nbcop)(<= compt1 (* 10 n)))

 

(command "traceur"

(princ "oui")

(princ "Objet")

(princ "DWG To PDF")

(princ "A4 (210.00 x 297.00 mm)")

(princ "Millimètres")

(princ "Portrait")

(princ "non")

(princ "Fenêtre")

(princ ptFA)

(princ ptFB)

(princ "1:1")

(princ "centre")

(princ "oui")

(princ "")

(princ "oui")

(princ "")

(princ chemin)

(princ "N")

(princ "O")

)

 

(setq XptFA (+ 227.77 XptFA))

(setq YptFA YptFA)

(setq ptFA (list XptFA YptFA))

(setq XptFB (+ 227.77 XptFB))

(setq YptFB YptFB)

(setq ptFB (list XptFB YptFB))

(setq compt1 (1+ compt1))

(setq Numpage (itoa compt1))

(setq chemin (strcat "C:\\PDF\\" commune "_page " Numpage ".pdf"))

 

(if (> compt1 (* 10 n))

(progn

(setq XptFA (- XptFA 2277.7))

(setq YptFA (- YptFA 313.09))

(setq XptFB (- XptFB 2277.7))

(setq YptFB (- YptFB 313.09))

(setq ptFA (list XptFA YptFA))

(setq ptFB (list XptFB YptFB))

(setq n (1+ n))

)

)

 

(if (> compt1 nbcop)

(alert (strcat "Le programme a imprimé " a " feuille(s) au format PDF"))

)

)

 

(princ)

 

)

 

 

Merci d'avance pour votre contribution.

demo.zip

Posté(e)

Salut

 

Je me suis amusé à te faire quelque chose

Il fonctionne avec pdfCreator.

Le premier folio est en bas à gauche, le suivant à sa droite puis au dernier sur la même ligne, on remonte d'un cran et on recommence.

Tu peux avoir des "trous" dans tes lignes.

 

(defun c:imp(/ bck bg doc ent hd lay lst pdf plt sel tot kill mon_impression)
 (defun kill(qui / item meth1 meth2 obj WMI)
   (setq WMI (vlax-create-object "WbemScripting.SWbemLocator")
         meth1 (vlax-invoke WMI 'ConnectServer nil nil nil nil nil nil nil nil)
         meth2 (vlax-invoke meth1 'ExecQuery "Select * from Win32_Process")
   )
   (vlax-for item meth2
     (and (setq obj (vlax-get item 'CommandLine)) (vl-string-search (strcase qui) (strcase obj))
       (vlax-invoke item 'Terminate)
     )
   )
   (foreach item (list WMI meth1 meth2)
     (vlax-release-object item)
   )
 )

 (defun mon_impression(dim)
   (vlax-invoke lay 'setwindowtoplot (list (caar dim)(cadar dim))
			      (list (caadr dim)(cadadr dim))
   )
   (vl-catch-all-apply 'vlax-invoke (list plt 'plottodevice))
 )

 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (and (ssget "x" (list (cons 0 "insert") (cons 2 "feuilledereperage3")))
   (progn
     (vlax-for ent (setq sel (vla-get-activeselectionset doc))
(vla-getboundingbox ent 'bg 'hd)
(setq lst (cons (list (vlax-safearray->list bg) (vlax-safearray->list hd)) lst))
     )
     (vla-delete sel)
     (setq lst (vl-sort lst '(lambda(a B) (if (eq (cadar a) (cadar B))
				     (< (caar a) (caar B))
				     (< (cadar a) (cadar B))
				   )
		     )
	)
     )
     (kill "PDFCreator.exe")
     (setq pdf (vlax-create-object "PDFCreator.clsPDFCreator"))
     (vlax-invoke pdf 'cstart "/NoProcessingAtStartup")
     (vlax-put pdf 'cPrinterStop :vlax-true)
     (vlax-put pdf 'cWindowState 0)
     (vlax-invoke pdf 'cClearCache)
     (setq lay (vla-get-activelayout doc)
    plt (vla-get-plot doc)
    tot 0
     )
     (vla-put-configname		lay "PDFCreator")
     (vla-refreshplotdeviceinfo	lay)
     (vla-put-canonicalmedianame	lay "A4")
     (vla-put-centerplot		lay :vlax-true)
     (vla-put-paperunits		lay acMillimeters)
     (vla-put-plothidden		lay :vlax-false)
     (vla-put-plotrotation		lay ac0degrees)
     (vla-put-plottype			lay acWindow)
     (vla-put-plotviewportborders	lay :vlax-false)
     (vla-put-plotviewportsfirst	lay :vlax-true)
     (vla-put-plotwithlineweights	lay :vlax-true)
     (vla-put-plotwithplotstyles	lay :vlax-true)
     (vla-put-scalelineweights		lay :vlax-false)
     (vla-put-standardscale		lay acVpScaleToFit)
     (vla-put-stylesheet		lay "")
     (vla-put-usestandardscale		lay :vlax-true)
     (if (vl-catch-all-error-p (setq bck (vl-catch-all-apply 'getvar (list "backgroundplot"))))
(setq bck nil)
     )
     (if bck
(setvar "backgroundplot" 0)
     )
     (foreach ent lst
(mon_impression ent)
(while (/= (vlax-get pdf 'cCountOfPrintjobs) (1+ tot)))
(setq tot (1+ tot))
     )
     (vlax-invoke pdf 'cCombineAll)
     (vlax-release-object pdf)
     (if bck
(setvar "backgroundplot" bck)
     )
   )
 )
 (princ)
)

 

@+

  • Upvote 1

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Bonjour Patrick_35,

 

Merci beaucoup pour ton aide.

Ça a l'air de bien fonctionner...

Par contre, est-ce que c'est possible de commencer en haut à gauche et de passer à la ligne du dessous en bout de ligne car l'ordre de mes pages est dans le sens de lecture.

Je vais essayer d'utiliser l'aide pour comprendre le fonctionnement de ton programme car je t'avoue que là j'ai un peu de mal à tout comprendre...

En tout cas une nouvelle fois un grand merci et un grand respect pour tes connaissances en programmation!!!

Posté(e)

Salut

 

Par contre, est-ce que c'est possible de commencer en haut à gauche et de passer à la ligne du dessous en bout de ligne car l'ordre de mes pages est dans le sens de lecture.

Tu remplaces

(< (cadar a) (cadar B))

par

(> (cadar a) (cadar B))

 

Je vais essayer d'utiliser l'aide pour comprendre le fonctionnement de ton programme car je t'avoue que là j'ai un peu de mal à tout comprendre...

Pose des questions et on se fera un plaisir d'y répondre.

Le but du lisp est aussi de montrer ce qui est possible de faire, et d'essayer de le comprendre.

C'est grâce à ce type de lisp trouvé sur le net que j'ai progressé.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 7 mois après...
Posté(e)

Bonjour à tous et merci pour tous vos précieux renseignements.

J'ai le même problème,

J'ai plusieurs Blocs de cadres A3et A4 à l'echelle 1/25ème, 1/20ème ... espacés de 100cm chacun sur l'espace objet.

J'aimerai les imprimer tous en même temps sans passer par l'espace papier.

Un lisp me permettant de sélectionner tous les cadres et les envoyer sur pdf creator me sera d'une grande utilité.

Alors si qqn peut m'aider,

D'avance Merci.

  • 9 mois après...
Posté(e)

Bonjour à tous,

J'ai essayé le programme de Patrick et j'ai un arrêt à la ligne

(vla-put-plottype                 lay acWindow)

 

avec l'erreur suivante :

; erreur: Erreur Automation Entrée incorrecte

 

Je ne comprend pas pourquoi.

Si quelqu'un peut m'éclairer car cela dépasse mes maigres compétences en lisp.

 

Merci par avance...

Olivier

Posté(e)

Bonjour Patrick,

Je te remercie, mais j'ai toujours la même réponse et le même arrêt. J'ai bien le moniteur d'impression qui s'ouvre mais rien dedans.

A quoi correspond la ligne où je bloque ?

 

Olivier

PS : J'ai peut-être raté une étape dans le fonctionnement.

J'ai créé un bloc cadre avec le nom donné dans le programme pour chacune des fenêtres dans l'espace objet puis lancer le lisp.

Posté(e)

Alors l'erreur est ailleurs.

Pour info, si on interroge la variable acWindow sur Autocad, on a la réponse 4.

La ligne est là pour indiquer que l'on choisit une fenêtre comme zone de tracé.

 

Le lisp recherche un bloc nommé "feuilledereperage3" et fait autant d'impression via une fenêtre (d'où la ligne avec acWindow)

 

Si ça continue de bloquer, donne-moi un exemple

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Maintenant cela marche (je n'avais pas bien préparé la 1ère fenêtre) en revanche les pages sont rangées dans le désordre (les lignes sont ok les colonnes non).

 

Par exemple j'obtiens l'ordre suivant :

07-05-03-10-06-01-04-09-02-08-17-15-13-20-16-11-14-19,etc...

 

J'ai remis les blocs pour être sûr de l'alignement et de l'ordre de création.

 

Olivier

Posté(e)

Le problème venait d'un défaut d'alignement que j'avais pourtant vérifié. En faisant une copie réseau des blocs "feuilledereperage3" j'obtiens un résultat correct. Le fichier est récupéré de l'extérieur et contenait des imperfections.

 

Petit résumé au prochain utilisateurs :

- Charger le lisp (réponse #2) dans le dessin.

- Créer un bloc servant de cadre avec pour nom "feuilledereperage3"

- Créer un réseau avec ce cadre pour que toutes les pages souhaitées soient prisent en compte.

- Créer une mise en page dans l'espace objet avec l'imprimant pdf créator, format A4, aire de tracé par fenêtre, centré, mise à l'échelle.

- lancer la commande IMP

 

En très grand merci à Patrick35 et désolé pour le dérangement.

 

Olivier

Posté(e)

Si tu as trouvé, et bien c'est parfait :D

 

ps : la mise en page est automatique, c'est ce qu'indique tous les (vla-put-... lay ...) après vla-refreshplotdeviceinfo

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

C'est ce que j'avais compris au départ mais si je le laisse faire il ne me créé pas les pages. Si j'ai le temps j'essayerais de voir à quel moment précis il bloque.

Merci encore. :D

 

Olivier

Posté(e)

Le problème venait d'un défaut d'alignement que j'avais pourtant vérifié

On peut intégrer une tolérance

 

par exemple

(equal (cadar a) (cadar B) 0.0001)

à la place de

(eq (cadar a) (cadar B))

 

(equal 0.00011 0.00012 0.00001) --> T

(equal 0.00011 0.00012 0.000001) --> Nil

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 1 an après...
Posté(e)

Bonjour,

 

Je viens d'installer la dernière version de PDF Creator (2.1) sur un PC tout neuf et le Lisp de Patrick_35 ne fonctionne plus...

Il renvoie l'erreur erreur: type d'argument incorrect: VLA-OBJECT nil apparemment à la ligne

(vlax-invoke pdf 'cstart "/NoProcessingAtStartup")

 

Savez vous de quoi ça peut venir ?

 

Au pire je peux essayer de retrouver une version plus ancienne de PDF Creator.

 

Merci par avance.

Posté(e)

Salut

 

C'est complétement différent depuis la version 2

Les modifs à adapter selon les besoins.

 

Initialisation de PdfCreator

(kill "PDFCreator.exe")
(if (setq pdf (vlax-get-or-create-object "PDFCreator.clsPDFCreator"))
  (progn
    (vlax-invoke pdf 'cstart "/NoProcessingAtStartup")
    (vlax-put pdf 'cPrinterStop :vlax-false)
    (vlax-put pdf 'cPrinterStop :vlax-true)
    (vlax-put pdf 'cWindowState 0)
    (vlax-invoke pdf 'cClearCache)
    (vlax-put-property pdf 'cOption "savefilename" (vlax-make-variant (vl-filename-base (getvar "dwgname"))))
    (setq tot 0)
  )
  (progn
    (setq pdf2 (vlax-get-or-create-object "PDFCreatorBeta.JobQueue"))
    (if (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke (list pdf2 'initialize)))
      (progn
	(vlax-invoke pdf2 'releasecom)
	(vlax-invoke pdf2 'initialize)
      )
    )
    (setq tot 0)
  )

 

La suite de vos lisps pour imprimer.

 

Attendre la fin de l'impression et éviter ainsi un mélange


     (cond
(pdf
  (while (/= (vlax-get pdf 'cCountOfPrintjobs) (1+ tot)))
  (setq tot (1+ tot))
)
(pdf2
  (vlax-invoke-method pdf2 'waitforjobs (setq tot (1+ tot)) 10)
)
     )

 

Impressions terminées --> Regrouper les pdf et sauvegarde

   (cond
     (pdf
(vlax-invoke pdf 'cCombineAll)
(vlax-release-object pdf)
     )
     (pdf2
(vlax-invoke pdf2 'mergealljobs)
(and (setq fic (getfiled "Nom du PDF" (strcat (getvar "dwgprefix") (vl-filename-base (getvar "dwgname")) ".pdf") "PDF" 1))
  (vlax-invoke (vlax-get pdf2 'nextjob) 'convertto fic)
)
(vlax-invoke pdf2 'releasecom)
(vlax-release-object pdf2)
     )
   )

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

on à le même besoin pour les carnets de ferraillage, j'ai fini par pondre ce truc qui aide aussi à renuméroter avec des blocs "cartouche" A3 ou A4 que tu peux modifier du moment que tu ne change pas le nom des attributs... les bétonneux en sont satisfait.

 

je ne gère pas dpf créator, il faut faire "ajouter à la fille d'attente" puis tout fusionner à la main, mais avec les indications de Patrick_35, ce serai un bon exercice à ajouter car de mémoire pour l'instant, il n'y à pas de vba.

 

attention à la configuration d’impression au nom de l'imprimante et de la feuille de plume sinon il te jette voir les lignes après

(defun Imprime

c'est là

http://joch04.free.fr/achtml/howto-mosaique.htm

 

  • 2 semaines après...
Posté(e)

Super !!!

 

Merci beaucoup Patrick_35.

 

Ton programme marche super bien et en plus, en passant par la version 2.1 de pdf creator, c'est beaucoup plus rapide car on enregistre directement le fichier sans passer par l'interface de pdf creator.

 

Encore merci.

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité