2011-06-29 2 views
1

J'ai une figure matplotlib à l'intérieur d'un panneau wxmpl, et j'essaie de l'imprimer dans un fichier Postscript. Le mieux que je peux obtenir est un fichier vide - par 'vide' je ne veux pas dire vide, mais plutôt un fichier .ps avec des en-têtes et autres joyeusetés mais affiche comme une page vierge.Fichiers postscript vierges de l'intrigue

Le code à imprimer est:

printer = self.GetPrinter() # wxmpl.FigurePrinter 
fig = self.get_figure() # matplotlib.figure.Figure 
printData = wx.PrintData(printer.getPrintData()) 
printer.printFigure(fig, "Plot") 
self.printer.setPrintData(printData) # reset print data (avoid segfaults) 

J'ai regardé dans le code wxmpl et a constaté que OnPrintPage est jamais appelé, donc j'ai essayé d'ajouter un appel à ce via wxmpl.FigurePrintout.OnBeginDocument. Alors OnPrintPage arrive à cette ligne:

self.GetDC().DrawBitmap(image.ConvertToBitmap(), wM_Dx, hM_Dx, False)

et renvoie une erreur:

wx._core.PyAssertionError 
C++ assertion "wxAssertFailure" failed in ../src/generic/dcpsg.cpp(2238): invalid postscript dc 

Google m'a conduit à this email string, et par conséquent j'essayé de remplacer la ligne ci-dessus:

dc = self.GetDC() 
dc.StartDoc("printing stuff") 
dc.StartPage() 
dc.BeginDrawing() 
dc.DrawBitmap(image.ConvertToBitmap(), wM_Dx, hM_Dx, False) 
dc.EndDrawing() 
dc.EndPage() 
dc.EndDoc() 

Cela a permis de se débarrasser de l'erreur - mais après tout, c'est toujours en train d'imprimer des fichiers vierges comme avant. Une autre remarque, simplement sauvegarder le tracé comme Postscript fonctionne bien - il utilise un backend différent (FigureCanvasWxAgg au lieu de RendererAgg - donc peut-être que le problème est dans matplotlib au lieu de wxmpl/wxPython?). Cependant, j'ai besoin d'imprimer cela sur une imprimante réelle, donc le boîtier spécial pour les fichiers .ps n'est pas vraiment une solution viable.

Exécution Linux
Version 1.2.9 wxmpl
wxPython Version 2.6.4.0
version matplotlib 0,84 (oui, je sais que c'est horriblement pas à jour, mais c'est ce que je dois travailler avec pour l'instant)

+0

Mise à jour - J'avais mis la mauvaise signature de fonction pour OnBeginDocument, donc il n'était pas appelé. J'ai corrigé cela afin que OnPrintPage ait été appelé, et il a imprimé correctement (bien que les fichiers de sortie semblent beaucoup trop grands - mais c'est un problème différent). La question reste cependant de savoir pourquoi OnPrintPage n'est pas appelé normalement, cependant. Toute info serait utile! – whrrgarbl

Répondre

0

Le problème était que wxmpl n'avait aucun appel à HasPage - l'ensemble des changements ci-dessus n'avait pas d'importance, après tout. Ajout dans ce code dans la classe FigurePrintout fixe la question avec pas l'impression:

def HasPage(self, page): 
    return page <= 1 

Eh oui ... deux lignes. Basé sur la documentation de l'infrastructure d'impression wxPython, la valeur par défaut est return page == 1, mais wxmpl renvoie 0 comme première page de son remplacement de GetPageInfo. Donc l'imprimeur ne pensait pas qu'il avait une page à imprimer.