Difference between revisions of "Infobox in column"
From Scribus Wiki
(→New Enhanced Version) |
|||
Line 116: | Line 116: | ||
</nowiki></pre> | </nowiki></pre> | ||
===New Enhanced Version=== | ===New Enhanced Version=== | ||
+ | <code> | ||
+ | #!/usr/bin/env python | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | # **************************************************************************** | ||
+ | # This program is free software; you can redistribute it and/or modify | ||
+ | # it under the terms of the GNU General Public License as published by | ||
+ | # the Free Software Foundation; either version 2 of the License, or | ||
+ | # (at your option) any later version. | ||
+ | # | ||
+ | # This program is distributed in the hope that it will be useful, | ||
+ | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
+ | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
+ | # GNU General Public License for more details. | ||
+ | # | ||
+ | # You should have received a copy of the GNU General Public License | ||
+ | # along with this program; if not, write to the Free Software | ||
+ | # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
+ | # | ||
+ | # **************************************************************************** | ||
+ | |||
+ | |||
+ | """ | ||
+ | (C) 2005 by Thomas R. Koll, <tomk32@gmx.de>, http://verlag.tomk32.de | ||
+ | (c) 2008 modifications, additional features by Gregory Pittman | ||
+ | |||
+ | A simple script for exact placement of a frame (infobox) | ||
+ | over the current textbox, asking the user for the width | ||
+ | of the infobox and in which column to place it. | ||
+ | Now can create a text frame or an image frame, and also load | ||
+ | an image. | ||
+ | |||
+ | USAGE | ||
+ | Select a textframe, start the script and have phun | ||
+ | Default name for the infobox is 'infobox' + name_of_selected_frame, | ||
+ | but this can be changed. | ||
+ | |||
+ | |||
+ | """ | ||
+ | |||
+ | import sys | ||
+ | import re | ||
+ | import string | ||
+ | |||
+ | try: | ||
+ | import scribus | ||
+ | except ImportError: | ||
+ | print "Unable to import the 'scribus' module. This script will only run within" | ||
+ | print "the Python interpreter embedded in Scribus. Try Script->Execute Script." | ||
+ | sys.exit(1) | ||
+ | |||
+ | def main(argv): | ||
+ | unit = scribus.getUnit() | ||
+ | units = ['pts','mm','inches','picas'] | ||
+ | unitlabel = units[unit] | ||
+ | if scribus.selectionCount() == 0: | ||
+ | scribus.messageBox('Scribus - Script Error', | ||
+ | "There is no object selected.\nPlease select a text frame and try again.", | ||
+ | scribus.ICON_WARNING, scribus.BUTTON_OK) | ||
+ | sys.exit(2) | ||
+ | if scribus.selectionCount() > 1: | ||
+ | scribus.messageBox('Scribus - Script Error', | ||
+ | "You have more than one object selected.\nPlease select one text frame and try again.", | ||
+ | scribus.ICON_WARNING, scribus.BUTTON_OK) | ||
+ | sys.exit(2) | ||
+ | textbox = scribus.getSelectedObject() | ||
+ | pageitems = scribus.getPageItems() | ||
+ | boxcount = 1 | ||
+ | for item in pageitems: | ||
+ | if (item[0] == textbox): | ||
+ | if (item[1] != 4): | ||
+ | scribus.messageBox('Scribus - Script Error', | ||
+ | "This is not a textframe. Try again.", scribus.ICON_WARNING, scribus.BUTTON_OK) | ||
+ | sys.exit(2) | ||
+ | |||
+ | # While we're finding out what kind of frame is selected, we'll also make sure we | ||
+ | # will come up with a unique name for our infobox frame - it's possible we may want | ||
+ | # more than one for a multicolumn frame. | ||
+ | if (item[0] == ("infobox" + str(boxcount) + textbox)): | ||
+ | boxcount += 1 | ||
+ | left, top = scribus.getPosition(textbox) | ||
+ | o_width, o_height = scribus.getSize(textbox) | ||
+ | o_cols = int(scribus.getColumns(textbox)) | ||
+ | o_gap = scribus.getColumnGap(textbox) | ||
+ | |||
+ | columns_width = 0 | ||
+ | column_pos = 1 | ||
+ | o_colwidth = (o_width - ((o_cols - 1) * o_gap)) / o_cols | ||
+ | if (o_cols > 1): | ||
+ | while (columns_width > o_cols or columns_width < 1): | ||
+ | columns_width = scribus.valueDialog('Width', | ||
+ | 'How many columns width shall the '+ | ||
+ | 'box be (max ' + str(o_cols) + ')?') | ||
+ | columns_width = int(columns_width) | ||
+ | if (columns_width < o_cols): | ||
+ | max = o_cols - columns_width | ||
+ | while (column_pos <= max and column_pos <= 1): | ||
+ | column_pos = scribus.valueDialog('Placement', | ||
+ | 'In which column do you want ' | ||
+ | 'to place the box (1 to ' + | ||
+ | str(o_cols) + ')?') | ||
+ | column_pos = int(column_pos) - 1 | ||
+ | new_height = 0 | ||
+ | while (new_height == 0): | ||
+ | new_height = scribus.valueDialog('Height','Your frame height is '+ str(o_height) + | ||
+ | unitlabel +'. How tall\n do you want your ' + | ||
+ | 'infobox to be in '+ unitlabel +'?', str(o_height)) | ||
+ | new_top = -1 | ||
+ | while (new_top < 0): | ||
+ | new_top = scribus.valueDialog('Y-Pos','The top of your infobox is at '+ str(top) + | ||
+ | unitlabel +'. Where\n do you want ' + | ||
+ | 'the top to be in '+ unitlabel +'?', str(top)) | ||
+ | framename = scribus.valueDialog('Name of Frame','Name your frame or use this default name',"infobox" + str(boxcount) + textbox) | ||
+ | frametype = 'text' | ||
+ | frametype = scribus.valueDialog('Frame Type','Change to anything other\n than "text" for image frame.\nEnter "imageL" to also load an image',frametype) | ||
+ | new_width = columns_width * o_colwidth + (columns_width-1) * o_gap | ||
+ | new_left = left + ((column_pos) * o_colwidth) + ((column_pos) * o_gap) | ||
+ | if (frametype == 'text'): | ||
+ | new_textbox = scribus.createText(new_left, float(new_top), new_width, float(new_height),framename) | ||
+ | scribus.setColumnGap(0, new_textbox) | ||
+ | scribus.setColumns(1, new_textbox) | ||
+ | scribus.textFlowsAroundFrame(new_textbox, 1) | ||
+ | else: | ||
+ | new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename) | ||
+ | if (frametype == 'imageL'): | ||
+ | imageload = scribus.fileDialog('Load image','Images(*.jpg *.png *.tif)',haspreview=1) | ||
+ | scribus.loadImage(imageload, new_image) | ||
+ | scribus.textFlowsAroundFrame(new_image, 1) | ||
+ | scribus.setScaleImageToFrame(scaletoframe=1, proportional=1, name=new_image) | ||
+ | if __name__ == '__main__': | ||
+ | # This script makes no sense without a document open | ||
+ | if not scribus.haveDoc(): | ||
+ | scribus.messageBox('Scribus - Script Error', "No document open", scribus.ICON_WARNING, scribus.BUTTON_OK) | ||
+ | sys.exit(1) | ||
+ | # Disable redraws | ||
+ | scribus.setRedraw(False) | ||
+ | # Run the main script, ensuring redraws are re-enabled even if the | ||
+ | # script aborts with an exception, and don't fail with an exception | ||
+ | # even if the document is closed while the script runs. | ||
+ | try: | ||
+ | main(sys.argv) | ||
+ | finally: | ||
+ | try: | ||
+ | scribus.setRedraw(True) | ||
+ | except: | ||
+ | pass | ||
+ | </code> |
Revision as of 21:14, 17 March 2008
Original Version
#!/usr/bin/env python # -*- coding: utf-8 -*- # **************************************************************************** # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # **************************************************************************** """ (C) 2005 by Thomas R. Koll, <tomk32@gmx.de>, http://verlag.tomk32.de A simple script for exact placment of a textbox (infobox) over the current textbox, asking the user for the width of the infobox and in which column to place it. I normally use it for a table-like box above the regular text. USAGE Select a textframe, start the script and have phun Default name for the infobox is 'infobox' + name_of_selected_frame TODO * ask for height * ask for name * ask for content? """ import sys import re import string try: from scribus import * except ImportError: print "Unable to import the 'scribus' module. This script will only run within" print "the Python interpreter embedded in Scribus. Try Script->Execute Script." sys.exit(1) def main(argv): unit = getUnit() setUnit(UNIT_MILLIMETERS) if selectionCount() == 0: messageBox('Scribus - Script Error', "There is no object selected.\nPlease select a text frame and try again.", ICON_WARNING, BUTTON_OK) sys.exit(2) try: textbox = getSelectedObject() left, top = getPosition(textbox) o_width, o_height = getSize(textbox) o_cols = int(getColumns(textbox)) o_gap = getColumnGap(textbox) except: messageBox('Scribus - Script Error', "Can't get size of object, maybe not a textframe", ICON_WARNING, BUTTON_OK) sys.exit(2) columns_width = 0 column_pos = 1 o_colwidth = (o_width - ((o_cols - 1) * o_gap)) / o_cols if (o_cols > 1): while (columns_width > o_cols or columns_width < 1): columns_width = valueDialog('Width', 'How many columns width shall the '+ 'box be (max ' + str(o_cols) + ')?') columns_width = int(columns_width) if (columns_width < o_cols): max = o_cols - columns_width while (column_pos <= max and column_pos <= 1): column_pos = valueDialog('Placement', 'In which column do you want ' 'to place the box (1 to ' + str(o_cols) + ')?') column_pos = int(column_pos) - 1 new_width = columns_width * o_colwidth + (columns_width-1) * o_gap new_left = left + ((column_pos) * o_colwidth) + ((column_pos) * o_gap) new_textbox = createText(new_left, top, new_width, o_height, "infobox " + textbox) setColumnGap(0, new_textbox) setColumns(1, new_textbox) setUnit(unit) if __name__ == '__main__': # This script makes no sense without a document open if not haveDoc(): messageBox('Scribus - Script Error', "No document open", ICON_WARNING, BUTTON_OK) sys.exit(1) # Disable redraws setRedraw(False) # Run the main script, ensuring redraws are re-enabled even if the # script aborts with an exception, and don't fail with an exception # even if the document is closed while the script runs. try: main(sys.argv) finally: try: setRedraw(True) except: pass
New Enhanced Version
- !/usr/bin/env python
- -*- coding: utf-8 -*-
- ****************************************************************************
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- ****************************************************************************
"""
(C) 2005 by Thomas R. Koll, <tomk32@gmx.de>, http://verlag.tomk32.de
(c) 2008 modifications, additional features by Gregory Pittman
A simple script for exact placement of a frame (infobox) over the current textbox, asking the user for the width of the infobox and in which column to place it. Now can create a text frame or an image frame, and also load an image.
USAGE Select a textframe, start the script and have phun Default name for the infobox is 'infobox' + name_of_selected_frame, but this can be changed.
"""
import sys import re import string
try:
import scribus
except ImportError:
print "Unable to import the 'scribus' module. This script will only run within" print "the Python interpreter embedded in Scribus. Try Script->Execute Script." sys.exit(1)
def main(argv):
unit = scribus.getUnit() units = ['pts','mm','inches','picas'] unitlabel = units[unit] if scribus.selectionCount() == 0: scribus.messageBox('Scribus - Script Error', "There is no object selected.\nPlease select a text frame and try again.", scribus.ICON_WARNING, scribus.BUTTON_OK) sys.exit(2) if scribus.selectionCount() > 1: scribus.messageBox('Scribus - Script Error', "You have more than one object selected.\nPlease select one text frame and try again.", scribus.ICON_WARNING, scribus.BUTTON_OK) sys.exit(2) textbox = scribus.getSelectedObject() pageitems = scribus.getPageItems() boxcount = 1 for item in pageitems: if (item[0] == textbox): if (item[1] != 4): scribus.messageBox('Scribus - Script Error', "This is not a textframe. Try again.", scribus.ICON_WARNING, scribus.BUTTON_OK) sys.exit(2)
- While we're finding out what kind of frame is selected, we'll also make sure we
- will come up with a unique name for our infobox frame - it's possible we may want
- more than one for a multicolumn frame.
if (item[0] == ("infobox" + str(boxcount) + textbox)): boxcount += 1 left, top = scribus.getPosition(textbox) o_width, o_height = scribus.getSize(textbox) o_cols = int(scribus.getColumns(textbox)) o_gap = scribus.getColumnGap(textbox) columns_width = 0 column_pos = 1 o_colwidth = (o_width - ((o_cols - 1) * o_gap)) / o_cols if (o_cols > 1): while (columns_width > o_cols or columns_width < 1): columns_width = scribus.valueDialog('Width', 'How many columns width shall the '+ 'box be (max ' + str(o_cols) + ')?') columns_width = int(columns_width) if (columns_width < o_cols): max = o_cols - columns_width while (column_pos <= max and column_pos <= 1): column_pos = scribus.valueDialog('Placement', 'In which column do you want ' 'to place the box (1 to ' + str(o_cols) + ')?') column_pos = int(column_pos) - 1 new_height = 0 while (new_height == 0): new_height = scribus.valueDialog('Height','Your frame height is '+ str(o_height) + unitlabel +'. How tall\n do you want your ' + 'infobox to be in '+ unitlabel +'?', str(o_height)) new_top = -1 while (new_top < 0): new_top = scribus.valueDialog('Y-Pos','The top of your infobox is at '+ str(top) + unitlabel +'. Where\n do you want ' + 'the top to be in '+ unitlabel +'?', str(top)) framename = scribus.valueDialog('Name of Frame','Name your frame or use this default name',"infobox" + str(boxcount) + textbox) frametype = 'text' frametype = scribus.valueDialog('Frame Type','Change to anything other\n than "text" for image frame.\nEnter "imageL" to also load an image',frametype) new_width = columns_width * o_colwidth + (columns_width-1) * o_gap new_left = left + ((column_pos) * o_colwidth) + ((column_pos) * o_gap) if (frametype == 'text'): new_textbox = scribus.createText(new_left, float(new_top), new_width, float(new_height),framename) scribus.setColumnGap(0, new_textbox) scribus.setColumns(1, new_textbox) scribus.textFlowsAroundFrame(new_textbox, 1) else: new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename) if (frametype == 'imageL'): imageload = scribus.fileDialog('Load image','Images(*.jpg *.png *.tif)',haspreview=1) scribus.loadImage(imageload, new_image) scribus.textFlowsAroundFrame(new_image, 1) scribus.setScaleImageToFrame(scaletoframe=1, proportional=1, name=new_image)
if __name__ == '__main__':
# This script makes no sense without a document open if not scribus.haveDoc(): scribus.messageBox('Scribus - Script Error', "No document open", scribus.ICON_WARNING, scribus.BUTTON_OK) sys.exit(1) # Disable redraws scribus.setRedraw(False) # Run the main script, ensuring redraws are re-enabled even if the # script aborts with an exception, and don't fail with an exception # even if the document is closed while the script runs. try: main(sys.argv) finally: try: scribus.setRedraw(True) except: pass