Infobox in column: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
|||
(45 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{Scripting Index}} | {{Scripting Index}} | ||
===Original Version=== | |||
<pre><nowiki> | <pre><nowiki> | ||
#!/usr/bin/env python | |||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
Line 22: | Line 24: | ||
""" | """ | ||
(C) 2005 by Thomas R. Koll, <tomk32@ | (C) 2005 by Thomas R. Koll, <tomk32@gmx.de>, http://verlag.tomk32.de | ||
A simple script for exact placment of a textbox (infobox) | A simple script for exact placment of a textbox (infobox) | ||
over the current textbox, asking the user for the width | over the current textbox, asking the user for the width | ||
of the infobox and in which column to place it. | of the infobox and in which column to place it. | ||
I normally use it for a table-like box above the regular text. | |||
USAGE | USAGE | ||
Line 39: | Line 42: | ||
""" | """ | ||
import sys | |||
import re | 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() | unit = getUnit() | ||
setUnit(UNIT_MILLIMETERS) | 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: | try: | ||
textbox = getSelectedObject() | textbox = getSelectedObject() | ||
left, top = getPosition(textbox) | left, top = getPosition(textbox) | ||
o_width, o_height = getSize(textbox) | o_width, o_height = getSize(textbox) | ||
o_cols = int(getColumns(textbox)) | |||
o_gap = getColumnGap(textbox) | |||
except: | except: | ||
messageBox('Scribus - Script Error', | |||
"Can't get size of object, maybe not a textframe", ICON_WARNING, BUTTON_OK) | |||
sys.exit(2) | |||
columns_width = 1 | |||
column_pos = 0 | |||
o_colwidth = (o_width - ((o_cols - 1) * o_gap)) / o_cols | |||
columns_width = | |||
column_pos = | |||
o_colwidth = (o_width - ((o_cols - 1) * | |||
if (o_cols > 1): | if (o_cols > 1): | ||
while (columns_width > o_cols or columns_width < 1): | while (columns_width > o_cols or columns_width < 1): | ||
Line 80: | Line 88: | ||
str(o_cols) + ')?') | str(o_cols) + ')?') | ||
column_pos = int(column_pos) - 1 | column_pos = int(column_pos) - 1 | ||
new_width = columns_width * o_colwidth + (columns_width-1) * | new_width = columns_width * o_colwidth + (columns_width-1) * o_gap | ||
new_left = left + column_pos | new_left = left + ((column_pos) * o_colwidth) + ((column_pos) * o_gap) | ||
new_textbox = createText(new_left, top, new_width, o_height, | new_textbox = createText(new_left, top, new_width, o_height, | ||
"infobox " + textbox) | "infobox " + textbox) | ||
setColumnGap(0, new_textbox) | |||
setColumnGap( | |||
setColumns(1, new_textbox) | setColumns(1, new_textbox) | ||
setUnit(unit) | 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 | |||
</nowiki></pre> | </nowiki></pre> | ||
===Enhanced Version=== | |||
This version does not use Python Imaging Library. What this means is that you will not get an automatic sizing of the frame vertically. See the next version below this one for that capability. | |||
{|width=90% | |||
|valign=top|Requirements: | |||
* You have to run this in Scribus | |||
* You must have a document open, with a text frame selected | |||
After the script analyzes the frame, you then indicate via dialogs: | |||
* How many columns you wish the infobox to spread across | |||
** If there is only one column this is skipped | |||
* Which column to start in | |||
** If there is only one column this is also skipped | |||
* What height you wish the infobox to be – default is entire height of selected frame. | |||
* Where you want the top of infobox to be – default is top of selected frame | |||
* Now you are presented with a default name for the infobox, which you can change | |||
* Next you select Frame Type | |||
** 'text' for text frame (no quotes) – this is the default | |||
** 'imageL' for image frame and file dialog to load image | |||
*** The open file dialog now also looks for capitalized versions of file suffixes, like .JPG and .PNG | |||
** anything else (including blank) for empty image frame | |||
* At this point, infobox is created and script ends | |||
* Since the frame is not automatically sized vertically, you will need to adjust this after the frame with image is created. | |||
** If you have estimated a height too great for the image, right-click and choose Adjust Frame to Image. | |||
** If you have estimated a height too short for the image to fit the entire width, use the frame handles to stretch the frame vertically, then use Adjust Frame to Image. | |||
* You can run this script again on the same selected frame | |||
This script will also work with 1.3.5+ versions of Scribus, but you must change the ''textFlowsAroundFrame'' command to ''textFlowMode'' since the name of this was changed – there are two instances of this in the script. | |||
| | |||
{| | |||
|[[Image:Infobox ex2.png|thumb|400px|This illustrates two successive runs of the program, creating one image infobox, one text infobox.<br>Text was subsequently added to the text infobox.]] | |||
|} | |||
|} | |||
===InfoBox.py=== | |||
(Version for 1.3.3.x series – see note above) | |||
<syntaxhighlight lang=python> | |||
#!/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, 2010 modifications, additional features, and some repair | |||
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. | |||
Some enhancements:<br> | |||
* You can now create a text frame or an image frame, and also load | |||
an image.<br> | |||
* More than one infobox can be added to a text frame by repeatedly running | |||
the script (ie, no name conflicts occur).<br> | |||
* Height and Y-Pos of top of infobox can be specified.<br> | |||
* Works with any page unit - pts, mm, in, and picas, cm, and even ciceros.<br> | |||
* Infobox has Text Flows Around Frame activated, also | |||
Scale Image to Frame for images. | |||
USAGE<br> | |||
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. | |||
""" | |||
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','cm',' ciceros'] | |||
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 = 0 | |||
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) + ')?','1') | |||
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) + ')?','1') | |||
column_pos = int(column_pos) - 1 | |||
if (o_cols == 1): | |||
columns_width = 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 +'?\n If you load an image, height will be\n calculated, so the value here does not\n matter.', str(o_height)) | |||
new_top = -1 | |||
while (new_top < 0): | |||
new_top = scribus.valueDialog('Y-Pos','The top of your infobox is currently\n'+ str(top) + | |||
unitlabel +'. Where do you want \n' + | |||
'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: | |||
if (frametype == 'imageL'): | |||
imageload = scribus.fileDialog('Load image','Images(*.jpg *.png *.tif *.JPG *.PNG *.jpeg *.JPEG *.TIF)',haspreview=1) | |||
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename) | |||
scribus.loadImage(imageload, new_image) | |||
scribus.messageBox('Please Note',"Your frame will be created once you click OK.\n\nUse the Context Menu to Adjust Frame to Image.\n\nIf your image does not fill the width completely,\nstretch the frame vertically first.",scribus.BUTTON_OK) | |||
else: | |||
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename) | |||
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 | |||
</syntaxhighlight> | |||
Here is the version using the Python Imaging Library. | |||
<syntaxhighlight lang=python> | |||
#!/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. | |||
Some enhancements: | |||
* You can now create a text frame or an image frame, and also load | |||
an image. | |||
* More than one infobox can be added to a text frame | |||
* Height and Y-Pos of top of infobox can be specified | |||
* Works with any page unit - pts, mm, in, and picas | |||
* Infobox has Text Flows Around Frame activated, also | |||
Scale Image to Frame for images | |||
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. | |||
""" | |||
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) | |||
try: | |||
from PIL import Image | |||
except ImportError: | |||
print "Unable to import the Python Imaging Library module." | |||
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 = 1 | |||
column_pos = 0 | |||
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 +'?\n If you load an image, height will be\n calculated, so the value here does not\n matter.', 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: | |||
if (frametype == 'imageL'): | |||
imageload = scribus.fileDialog('Load image','Images(*.jpg *.png *.tif *.JPG *.PNG *.jpeg *.JPEG *.TIF)',haspreview=1) | |||
im = Image.open(imageload) | |||
xsize, ysize = im.size | |||
new_height = float(ysize)/float(xsize)*new_width | |||
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename) | |||
scribus.loadImage(imageload, new_image) | |||
else: | |||
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename) | |||
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 | |||
</syntaxhighlight> |
Latest revision as of 01:18, 19 November 2016
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 = 1 column_pos = 0 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
Enhanced Version
This version does not use Python Imaging Library. What this means is that you will not get an automatic sizing of the frame vertically. See the next version below this one for that capability.
Requirements:
After the script analyzes the frame, you then indicate via dialogs:
This script will also work with 1.3.5+ versions of Scribus, but you must change the textFlowsAroundFrame command to textFlowMode since the name of this was changed – there are two instances of this in the script. |
|
InfoBox.py
(Version for 1.3.3.x series – see note above)
#!/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, 2010 modifications, additional features, and some repair
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.
Some enhancements:<br>
* You can now create a text frame or an image frame, and also load
an image.<br>
* More than one infobox can be added to a text frame by repeatedly running
the script (ie, no name conflicts occur).<br>
* Height and Y-Pos of top of infobox can be specified.<br>
* Works with any page unit - pts, mm, in, and picas, cm, and even ciceros.<br>
* Infobox has Text Flows Around Frame activated, also
Scale Image to Frame for images.
USAGE<br>
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.
"""
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','cm',' ciceros']
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 = 0
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) + ')?','1')
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) + ')?','1')
column_pos = int(column_pos) - 1
if (o_cols == 1):
columns_width = 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 +'?\n If you load an image, height will be\n calculated, so the value here does not\n matter.', str(o_height))
new_top = -1
while (new_top < 0):
new_top = scribus.valueDialog('Y-Pos','The top of your infobox is currently\n'+ str(top) +
unitlabel +'. Where do you want \n' +
'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:
if (frametype == 'imageL'):
imageload = scribus.fileDialog('Load image','Images(*.jpg *.png *.tif *.JPG *.PNG *.jpeg *.JPEG *.TIF)',haspreview=1)
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename)
scribus.loadImage(imageload, new_image)
scribus.messageBox('Please Note',"Your frame will be created once you click OK.\n\nUse the Context Menu to Adjust Frame to Image.\n\nIf your image does not fill the width completely,\nstretch the frame vertically first.",scribus.BUTTON_OK)
else:
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename)
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
Here is the version using the Python Imaging Library.
#!/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.
Some enhancements:
* You can now create a text frame or an image frame, and also load
an image.
* More than one infobox can be added to a text frame
* Height and Y-Pos of top of infobox can be specified
* Works with any page unit - pts, mm, in, and picas
* Infobox has Text Flows Around Frame activated, also
Scale Image to Frame for images
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.
"""
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)
try:
from PIL import Image
except ImportError:
print "Unable to import the Python Imaging Library module."
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 = 1
column_pos = 0
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 +'?\n If you load an image, height will be\n calculated, so the value here does not\n matter.', 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:
if (frametype == 'imageL'):
imageload = scribus.fileDialog('Load image','Images(*.jpg *.png *.tif *.JPG *.PNG *.jpeg *.JPEG *.TIF)',haspreview=1)
im = Image.open(imageload)
xsize, ysize = im.size
new_height = float(ysize)/float(xsize)*new_width
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename)
scribus.loadImage(imageload, new_image)
else:
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename)
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