-
-
Save iiey/3cd3d1d9535b3de4dd6fc7b22f5bebbb to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
""" | |
ShellOut.py | |
call an external program passing the active layer as a temp file. Windows Only(?) | |
Author: | |
Rob Antonishen | |
Version: | |
0.7 fixed file save bug where all files were png regardless of extension | |
0.6 modified to allow for a returned layer that is a different size | |
than the saved layer for | |
0.5 file extension parameter in program list. | |
0.4 modified to support many optional programs. | |
this script is modelled after the mm extern LabCurves trace plugin | |
by Michael Munzert http://www.mm-log.com/lab-curves-gimp | |
and thanks to the folds at gimp-chat has grown a bit ;) | |
License: | |
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; version 3 of the License. | |
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. | |
The GNU Public License is available at | |
http://www.gnu.org/copyleft/gpl.html | |
""" | |
from gimpfu import * | |
import shlex | |
import subprocess | |
import os, sys | |
import tempfile | |
# program list function (globals are evil) | |
def listcommands(option=None): | |
# | |
# Insert additional shell command into this list. They will show up in the drop menu in this order. | |
# Use the syntax: | |
# ["Menu Label", "command", "ext"] | |
# | |
# Where what gets executed is command fileame so include and flags needed in the command. | |
programlist = [ | |
["DFine 2", "\"C:\\Program Files\\Google\\Nik Collection\\Dfine 2\\Dfine2.exe\"", "png"], | |
["Sharpener Pro 3", "\"C:\\Program Files\\Google\\Nik Collection\\Sharpener Pro 3\\SHP3OS.exe\"", "png"], | |
["Viveza 2", "\"C:\\Program Files\\Google\\Nik Collection\\Viveza 2\\Viveza 2.exe\"", "png"], | |
["Color Efex Pro 4", "\"C:\\Program Files\\Google\\Nik Collection\\Color Efex Pro 4\\Color Efex Pro 4.exe\"", | |
"jpg"], | |
["Analog Efex Pro 2", "\"C:\\Program Files\\Google\\Nik Collection\\Analog Efex Pro 2\\Analog Efex Pro 2.exe\"", | |
"jpg"], | |
["HDR Efex Pro 2", "\"C:\\Program Files\\Google\\Nik Collection\\HDR Efex Pro 2\\HDR Efex Pro 2.exe\"", "jpg"], | |
["Silver Efex Pro 2", "\"C:\\Program Files\\Google\\Nik Collection\\Silver Efex Pro 2\\Silver Efex Pro 2.exe\"", | |
"jpg"], | |
["", "", ""] | |
] | |
if option == None: # no parameter return menu list, otherwise return the appropriate array | |
menulist = [] | |
for i in programlist: | |
if i[0] != "": | |
menulist.append(i[0]) | |
return menulist | |
else: | |
return programlist[option] | |
def plugin_main(image, drawable, visible, command): | |
pdb.gimp_image_undo_group_start(image) | |
# Copy so the save operations doesn't affect the original | |
if visible == 0: | |
# Save in temporary. Note: empty user entered file name | |
temp = pdb.gimp_image_get_active_drawable(image) | |
else: | |
# Get the current visible | |
temp = pdb.gimp_layer_new_from_visible(image, image, "Visible") | |
image.add_layer(temp, 0) | |
buffer = pdb.gimp_edit_named_copy(temp, "ShellOutTemp") | |
# save selection if one exists | |
hassel = pdb.gimp_selection_is_empty(image) == 0 | |
if hassel: | |
savedsel = pdb.gimp_selection_save(image) | |
tempimage = pdb.gimp_edit_named_paste_as_new(buffer) | |
pdb.gimp_buffer_delete(buffer) | |
if not tempimage: | |
raise RuntimeError | |
pdb.gimp_image_undo_disable(tempimage) | |
tempdrawable = pdb.gimp_image_get_active_layer(tempimage) | |
# get the program to run and filetype. | |
progtorun = listcommands(command) | |
# Use temp file names from gimp, it reflects the user's choices in gimp.rc | |
# change as indicated if you always want to use the same temp file name | |
# tempfilename = pdb.gimp_temp_name(progtorun[2]) | |
tempfilename = os.path.join(tempfile.gettempdir(), "ShellOutTempFile." + progtorun[2]) | |
# !!! Note no run-mode first parameter, and user entered filename is empty string | |
pdb.gimp_progress_set_text("Saving a copy") | |
pdb.gimp_file_save(tempimage, tempdrawable, tempfilename, tempfilename) | |
# Build command line call | |
command = progtorun[1] + " \"" + tempfilename + "\"" | |
args = shlex.split(command) | |
# Invoke external command | |
pdb.gimp_progress_set_text("calling " + progtorun[0] + "...") | |
pdb.gimp_progress_pulse() | |
child = subprocess.Popen(args, shell=False) | |
child.communicate() | |
# put it as a new layer in the opened image | |
try: | |
newlayer2 = pdb.gimp_file_load_layer(tempimage, tempfilename) | |
except: | |
RuntimeError | |
tempimage.add_layer(newlayer2, -1) | |
buffer = pdb.gimp_edit_named_copy(newlayer2, "ShellOutTemp") | |
if visible == 0: | |
drawable.resize(newlayer2.width, newlayer2.height, 0, 0) | |
sel = pdb.gimp_edit_named_paste(drawable, buffer, 1) | |
drawable.translate((tempdrawable.width - newlayer2.width) / 2, (tempdrawable.height - newlayer2.height) / 2) | |
else: | |
temp.resize(newlayer2.width, newlayer2.height, 0, 0) | |
sel = pdb.gimp_edit_named_paste(temp, buffer, 1) | |
temp.translate((tempdrawable.width - newlayer2.width) / 2, (tempdrawable.height - newlayer2.height) / 2) | |
pdb.gimp_buffer_delete(buffer) | |
pdb.gimp_edit_clear(temp) | |
pdb.gimp_floating_sel_anchor(sel) | |
# load up old selection | |
if hassel: | |
pdb.gimp_selection_load(savedsel) | |
image.remove_channel(savedsel) | |
# cleanup | |
os.remove(tempfilename) # delete the temporary file | |
gimp.delete(tempimage) # delete the temporary image | |
# Note the new image is dirty in Gimp and the user will be asked to save before closing. | |
pdb.gimp_image_undo_group_end(image) | |
gimp.displays_flush() | |
register( | |
"python_fu_shellout", | |
"Call an external program", | |
"Call an external program", | |
"Rob Antonishen", | |
"Copyright 2011 Rob Antonishen", | |
"2011", | |
"<Image>/Filters/ShellOut...", | |
"RGB*, GRAY*", | |
[(PF_RADIO, "visible", "Layer:", 1, (("new from visible", 1), ("current layer", 0))), | |
(PF_OPTION, "command", "Program:", 0, listcommands()) | |
], | |
[], | |
plugin_main, | |
) | |
main() |
I changed in the file shellOut.py les Where what gets executed is command fileame so include and flags needed in the command.
programlist = [
["DFine 2", ""C:\Program Files\Google\Nik Collection\Dfine 2\Dfine2.exe"", "png"], by
["DFine 2", ""C:\Program\Google\Nik Collection\Dfine 2\Dfine2.exe"", "png"]
Now in the filters of Gimp 3.0 I have the Shellout Mes command when I click an error message opens, it must not have a big change to operate Nik Collection on Gimp 3.0
Hi TutoPhoto,
I don't think so, from Gimp 2.x to 3.x is 7 years distance, the hold API was changed. The only thing we can keep is the basic idea of this script.
I created a thread in gimp-forum to ask for help and learned something about creating gimp plug-ins.
I also created a separate repo for the new nik collection plugin here: https://github.com/iiey/nikGimp
You could try it out and join the thread discussion if is there any further concern. This gist is pretty much obsolete, maybe i will close it sooner or later.
Hi Jean-Louis,
You are welcome! The PDF was probably no longer there if we replied via email. You could go to this page and "Attach files" directly.
I added some ideas to check here, maybe you could try and let me know what the issue is:
https://www.gimp-forum.net/Thread-Converting-python-plugin-in-shellout-py-from-gimp-2-x-to-3-x?pid=43566#pid43566
Did it help when your update your gimp to v3.0.2 and use the latest state of the script in my repo?
I found did script which was worked with 2.x, but now 3.x has API breaking change (possibly since 2.99.x) with the previous version.
Sorry, but I'm not a gimp developer either, we may need to ask gimp forum.