def drawLegend(self, pg, pos, color, name, lw): x = self.legendX + self.legendMargin y = self.legendY + self.legendMargin + pos * self.legendSpacing pg.add(pml.PDFOp("%f g" % color)) pg.add( pml.RectOp(x, y, self.legendSize, self.legendSize, pml.STROKE_FILL, lw)) pg.add(pml.PDFOp("0.0 g")) pg.add(pml.TextOp(name, x + self.legendSize + 2.0, y, 6))
def generatePage(self, title, doc): pg = pml.Page(doc) pg.add( pml.TextOp(title, doc.w / 2.0, self.margin, 18, pml.BOLD | pml.ITALIC | pml.UNDERLINED, util.ALIGN_CENTER)) pageCnt = len(self.pages) mmPerPage = max(0.1, self.chartWidth / pageCnt) pg.add(pml.TextOp("Page:", self.chartX - 1.0, self.pageY - 5.0, 10)) # draw backround for every other row. this needs to be done before # drawing the grid. for i in range(len(self.cinfo)): y = self.chartY + i * self.charY if (i % 2) == 1: pg.add(pml.PDFOp("0.93 g")) pg.add(pml.RectOp(self.chartX, y, self.chartWidth, self.charY)) pg.add(pml.PDFOp("0.0 g")) # line width to use lw = 0.25 pg.add(pml.PDFOp("0.5 G")) # dashed pattern pg.add(pml.PDFOp("[2 2] 0 d")) # draw grid and page markers for i in xrange(pageCnt): if (i == 0) or ((i + 1) % 10) == 0: x = self.chartX + i * mmPerPage pg.add( pml.TextOp("%d" % (i + 1), x, self.pageY, 10, align=util.ALIGN_CENTER)) if i != 0: pg.add(pml.genLine(x, self.chartY, 0, self.chartHeight, lw)) pg.add( pml.RectOp(self.chartX, self.chartY, self.chartWidth, self.chartHeight, pml.NO_FILL, lw)) pg.add(pml.PDFOp("0.0 G")) # restore normal line pattern pg.add(pml.PDFOp("[] 0 d")) # legend for page content bars pg.add( pml.RectOp(self.legendX, self.legendY, self.legendWidth, self.legendHeight, pml.NO_FILL, lw)) self.drawLegend(pg, 0, 1.0, "Other", lw) self.drawLegend(pg, 1, 0.7, "Character", lw) self.drawLegend(pg, 2, 0.5, "Dialogue", lw) self.drawLegend(pg, 3, 0.3, "Action", lw) # page content bars for i in xrange(pageCnt): x = self.chartX + i * mmPerPage y = self.barY + self.barHeight pi = self.pages[i] tlc = pi.getTotalLineCount() pg.add(pml.PDFOp("0.3 g")) pct = util.safeDivInt(pi.getLineCount(screenplay.ACTION), tlc) barH = self.barHeight * pct pg.add(pml.RectOp(x, y - barH, mmPerPage, barH)) y -= barH pg.add(pml.PDFOp("0.5 g")) pct = util.safeDivInt(pi.getLineCount(screenplay.DIALOGUE), tlc) barH = self.barHeight * pct pg.add(pml.RectOp(x, y - barH, mmPerPage, barH)) y -= barH pg.add(pml.PDFOp("0.7 g")) pct = util.safeDivInt(pi.getLineCount(screenplay.CHARACTER), tlc) barH = self.barHeight * pct pg.add(pml.RectOp(x, y - barH, mmPerPage, barH)) y -= barH pg.add(pml.PDFOp("0.0 g")) # rectangle around page content bars pg.add( pml.RectOp(self.chartX, self.barY, self.chartWidth, self.barHeight, pml.NO_FILL, lw)) for i in range(len(self.cinfo)): y = self.chartY + i * self.charY ci = self.cinfo[i] pg.add( pml.TextOp(ci.name, self.margin, y + self.charY / 2.0, self.charFs, valign=util.VALIGN_CENTER)) for i in xrange(pageCnt): pi = self.pages[i] cnt = pi.getSpeakerLineCount(ci.name) if cnt > 0: h = self.charY * (float(cnt) / self.sp.cfg.linesOnPage) pg.add( pml.RectOp(self.chartX + i * mmPerPage, y + (self.charY - h) / 2.0, mmPerPage, h)) return pg
def OnGenerate(self, event): watermarks = self.itemsEntry.GetValue().split("\n") common = self.commonMark.GetValue() directory = self.dirEntry.GetValue() fontsize = self.markSize.GetValue() fnprefix = self.filenamePrefix.GetValue() watermarks = set(watermarks) # keep track of ids allocated so far, just on the off-chance we # randomly allocated the same id twice usedIds = set() if not directory: wx.MessageBox("Set directory.", "Error", wx.OK, self) self.dirEntry.SetFocus() return count = 0 for item in watermarks: s = item.strip() if not s: continue basename = item.replace(" ", "-") fn = directory + "/" + fnprefix + '-' + basename + ".pdf" pmldoc = self.sp.generatePML(True) ops = [] # almost-not-there gray ops.append(pml.PDFOp("0.85 g")) if common: wm = pml.TextOp(util.cleanInput(common), self.sp.cfg.marginLeft + 20, self.sp.cfg.paperHeight * 0.45, fontsize, pml.BOLD, angle=45) ops.append(wm) wm = pml.TextOp(util.cleanInput(s), self.sp.cfg.marginLeft + 20, self.sp.cfg.paperHeight * 0.6, fontsize, pml.BOLD, angle=45) ops.append(wm) # ...and back to black ops.append(pml.PDFOp("0.0 g")) for page in pmldoc.pages: page.addOpsToFront(ops) pmldoc.uniqueId = self.getUniqueId(usedIds) pdfdata = pdf.generate(pmldoc) if not util.writeToFile(fn, pdfdata, self): wx.MessageBox("PDF Generation Failed", "Error", wx.OK, self) return else: count += 1 if count > 0: wx.MessageBox( "Generated %d files in directory %s." % (count, directory), "PDFs Generated", wx.OK, self) else: wx.MessageBox("No watermarks were specified.", "Error", wx.OK, self)