-
-
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.