Making layout grid with guides

From Scribus Wiki
Jump to navigation Jump to search
This article is part of the Scripts series.

This is my first Python script. (Sorry if it is ugly, but my native language is Rebol). It makes a "layout grid" useful for designing newspapers and magazines.

José Antonio Meira da Rocha
joseantoniorocha@gmail.com
http://meiradarocha.jor.br/news/about

#!/usr/bin/env python2.3
# -*- coding: utf-8 -*-
"""Generate a grid of guides for layout porpouses.
Ask user for number of columns, number of rows and gap measure.
"""
import sys

"""Locale strings to be translated """
numColStr1 = 'Número de colunas' #How many columns
numColStr2 = 'Quantas colunas?'  #How many columns?
numLinStr1 = 'Número de linhas'  #How many rows
numLinStr2 = 'Quantas linhas de módulos?' #How many rows?
gapStr1 = 'Largura da valeta' #gap measure
gapStr2 = 'Qual a largura das valetas em pontos?' #gap measure in points?
TITLE = "Gera linhas-guia" #Generate guides
noDocMsg = "<h2>Abra um documento, primeiramente</h2>Ops! Este script só funciona com um documento aberto. <b>Abra um documento</b> antes de rodar o script." # <h2>First, open a doc</h2>This script only work on opened document. <b>Open a document</b> before run this script.
runningMsg = "Rodando o script..." #"Running script..."
noScribusMsg = "This Python script is written for the Scribus scripting interface.\nIt can only be run from within Scribus."

""" Feel free to change defaults"""
defaultNumColumns = '5'
defaultNumRows = '8'
defaultGap = '14.1732' #5mm in points, due a bug in getPageMargins

""" You don't need change nothing below this line """
try:
    import scribus
except ImportError,err:
    print noScribusMsg
    sys.exit(1)
    
from scribus import UNIT_POINTS,BUTTON_OK,ICON_WARNING

def odd(num):
    return num % 2 

def main(argv):
    """Generate guides"""
    if scribus.haveDoc():
        scribus.setRedraw(False)
        numColumns = int(scribus.valueDialog(numColStr1, numColStr2, defaultNumColumns))
        numRows = int(scribus.valueDialog(numLinStr1, numLinStr2, defaultNumRows))
        gap = float(scribus.valueDialog(gapStr1, gapStr2, defaultGap))
        unit = scribus.getUnit()  # save original unit
        scribus.setUnit(UNIT_POINTS) # working in points, due a bug in getPageMargins
        
        pageWidth, pageHeight = scribus.getPageSize()
        # The margins order is wrong in Scripter documentation
        topMargin, leftMargin, rightMargin, bottomMargin = scribus.getPageMargins()
        
        printAreaWidth  = pageWidth  - leftMargin - rightMargin
        printAreaHeight = pageHeight - topMargin  - bottomMargin 
        
        numVgaps = numColumns-1
        numHgaps = numRows-1
        columnWidth = (printAreaWidth-(numVgaps*gap)) / numColumns
        rowHeight = (printAreaHeight-(numHgaps*gap)) / numRows
        
        VGuides = []
        HGuides = []
        # getPageMargins() return only odd page margins. 
        # This correct even margins
        if not odd(scribus.currentPage()):
            leftMargin = rightMargin
        # Build vertical guides
        for i in range(1,numColumns):
            res = leftMargin+(i*columnWidth)+((i-1)*gap)
            VGuides.append(res)
            VGuides.append(res+gap)
        # Build horizontal guides
        scribus.setVGuides(VGuides)
        for i in range(1,numRows): 
            res = topMargin+(i*rowHeight)+((i-1)*gap)
            HGuides.append(res)
            HGuides.append(res+gap)
        scribus.setHGuides(HGuides)
        scribus.setUnit(unit) # restore original unit
    else:
        scribus.messageBox(TITLE, noDocMsg, ICON_WARNING, BUTTON_OK)

def main_wrapper(argv):
    try:
        scribus.statusMessage(runningMsg)
        scribus.progressReset()
        main(argv)
    finally:
        if scribus.haveDoc():
            scribus.setRedraw(True)
        scribus.statusMessage("")
        scribus.progressReset()

if __name__ == '__main__':
    main_wrapper(sys.argv)