CopyObject() and pasteObject()

This is an introduction to a couple of new Scripter commands. What these allow for is for the copying of selected objects (individually) to all or a number of pages. You might consider this as a workaround for the issue some have brought up regarding Master Pages, so that something occurring on a Master Page might be editable on individual pages.

The first script below uses these commands to copy a selected object to all pages, odd pages, or even pages. If you specify anything else, nothing happens. The second script asks for a list of page numbers to paste your object to.

DIY
As of this writing, these commands are not yet available in Scripter. For the brave, or at least those who understand something about svn and building scribus:

Go to: http://bugs.scribus.net/view.php?id=10560

Download the file cmdobj.tar. Untar this file with tar xvf cmdobj.tar

Now you have a directory named scripter, and inside you will find cmdobj.cpp cmdobj.h scriptplugin.cpp scripterapi-manobj.html The first 3 files need to be copied to yoursvndir/scribus/plugins/scriptplugin/.

The last one goes to yoursvndir/scribus/doc/en/.

Now you just cmake, make, make install as usual.

You can also download the paste2all.py script from the feature request to try out your new commands.

paste2all.py

 * 1) !/usr/bin/env python# -*- coding: utf-8 -*-
 * 2) File: paste2all.py# © 2012.01.29 Gregory Pittman
 * 3) This program is free software; you can redistribute it and/or modify
 * 4) it under the terms of the GNU General Public License as published by
 * 5) the Free Software Foundation; either version 2 of the License, or
 * 6) (at your option) any later version.

""" USAGE

You must have a document open. Select a single object. Run the script, which asks whether you want

all, odd, or even pages to get a copy of the selected object (no copy is made to the original

page of the object). Any other input is ignored. When pasted, the copies go to the same page

coordinates of the original.

The script does not work with groups, and in fact Scribus will hang and then crash if you have

selected a group. If you select more than one item without grouping, an error is generated. This

isn't completely necessary, but otherwise only one object would be copied and pasted.

""" import scribus if scribus.haveDoc:   if scribus.selectionCount == 0:        scribus.messageBox('Scribus - Usage Error',                           "There is no object selected.\nPlease try again.",                           scribus.ICON_WARNING, scribus.BUTTON_OK)        sys.exit(2)    if scribus.selectionCount > 1:        scribus.messageBox('Scribus - Usage Error', "You have more than one object selected.\nPlease select only one object and try again.", scribus.ICON_WARNING, scribus.BUTTON_OK)        sys.exit(2)    paste2 = scribus.valueDialog('Paste to...',"Paste where?\n(all, odd, even)","all")    selframe = scribus.getSelectedObject    pages = scribus.pageCount    currpage = scribus.currentPage    scribus.copyObject(selframe)    if (paste2 == 'all'):        i = 1        while (i <= pages):            if (i != currpage):                scribus.gotoPage(i)                scribus.pasteObject(selframe) i=i+1 elif (paste2 == 'odd'): i = 1 while (i <= pages): if (i != currpage): scribus.gotoPage(i) scribus.pasteObject(selframe) i=i+2 elif (paste2 == 'even'): i = 2 while (i <= pages): if (i != currpage): scribus.gotoPage(i) scribus.pasteObject(selframe) i=i+2 scribus.setRedraw(1) scribus.docChanged(1) scribus.messageBox("Finished", "Done",icon=0,button1=1) else: scribus.messageBox('Usage Error', 'You need a Document open', icon=0, button1=1) sys.exit(2)

paste2pagelist.py
This second script allows you to enter a list of pages by page number, separated by space. You will find this one also on the feature request page.

There is a check to make sure all of your numbers are within the correct range, but the list doesn't have to be in any particular order.


 * 1) !/usr/bin/env python# -*- coding: utf-8 -*-
 * 2) File: paste2pagelist.py# © 2012.03.22 Gregory Pittman
 * 3) This program is free software; you can redistribute it and/or modify
 * 4) it under the terms of the GNU General Public License as published by
 * 5) the Free Software Foundation; either version 2 of the License, or
 * 6) (at your option) any later version.

""" USAGE

You must have a document open. Select a single object. Run the script, which asks for a list

of page numbers -- do not use commas to separate, just whitespace.

When pasted, the copies go to the same page coordinates of the original.

The script does not work with groups, and in fact Scribus will hang and then crash if you have

selected a group. If you select more than one item without grouping, an error is generated.

"""

import scribus

if scribus.haveDoc: if scribus.selectionCount == 0: scribus.messageBox('Scribus - Usage Error',                          "There is no object selected.\nPlease try again.",                           scribus.ICON_WARNING, scribus.BUTTON_OK) sys.exit(2) if scribus.selectionCount > 1: scribus.messageBox('Scribus - Usage Error', "You have more than one object selected.                                \nPlease select one object and try again.", scribus.ICON_WARNING, scribus.BUTTON_OK) sys.exit(2) pagelist = scribus.valueDialog('Paste to...',"Paste to which pages?                                \n(page numbers, separated by white space)","1") pageslist = pagelist.split selframe = scribus.getSelectedObject pages = scribus.pageCount for p in pageslist: p_no = int(p) if ((p_no > pages) or (p_no < 1)): scribus.messageBox('OOPS!', "You have a page number outside the range of pages in your document",                     scribus.ICON_WARNING, scribus.BUTTON_OK) sys.exit(2) scribus.copyObject(selframe) for p in pageslist: p_no = int(p) scribus.gotoPage(p_no) scribus.pasteObject(selframe) scribus.setRedraw(1) scribus.docChanged(1) scribus.messageBox("Finished", "Done",icon=0,button1=1) else: scribus.messageBox('Usage Error', 'You need a Document open', icon=0, button1=1) sys.exit(2)