Skip to content

Instantly share code, notes, and snippets.

@5shekel
Last active June 11, 2023 07:22
Show Gist options
  • Save 5shekel/98cc4898a1a8c7a5a1b305acc01d4326 to your computer and use it in GitHub Desktop.
Save 5shekel/98cc4898a1a8c7a5a1b305acc01d4326 to your computer and use it in GitHub Desktop.

User

Write an Inkscape plugin that export selection to png then runs a Bash script on that png


ChatGPT

To create an Inkscape plugin that exports a selected item to a PNG and then runs a Bash script on the exported PNG, you would need to write a Python script. This script would be executed by Inkscape's internal Python interpreter. The script would need to use Inkscape's internal API to interact with the document and export the selection, then use Python's subprocess module to run the bash script.

Here's a sample Python script that accomplishes this:

#!/usr/bin/env python3

import inkex
import os
import subprocess

class ExportAndRunScript(inkex.EffectExtension):

    def effect(self):
        # Define the export file path
        png_file_path = "/path/to/exported.png"
        
        # Get the current selection
        selection = self.svg.selected

        # If there's no selection, do nothing
        if not selection:
            inkex.utils.debug("No selection to export.")
            return
        
        # Export the selection to PNG
        self.export_selection_to_png(selection, png_file_path)
        
        # Run the bash script on the exported PNG
        self.run_script_on_png(png_file_path)
        
    def export_selection_to_png(self, selection, png_file_path):
        # Create a command that calls Inkscape's command line interface to export the selection to a PNG
        command = ["inkscape", "--export-area-drawing", "--export-dpi=96", "--export-background-opacity=0", "--export-png={}".format(png_file_path)]
        
        # Add the IDs of the selected items to the command
        for id, item in selection.items():
            command.append("--export-id={}".format(id))
            
        # Run the command
        subprocess.check_call(command)

    def run_script_on_png(self, png_file_path):
        # Define the path to your bash script
        bash_script_path = "/path/to/your/script.sh"
        
        # Create a command that calls the bash script with the PNG as an argument
        command = ["bash", bash_script_path, png_file_path]
        
        # Run the command
        subprocess.check_call(command)
        
if __name__ == "__main__":
    ExportAndRunScript().run()

Replace "/path/to/exported.png" and "/path/to/your/script.sh" with the paths to your PNG file and Bash script respectively.

This Python script should be saved with a .inx extension in the Inkscape extensions directory. The exact location of this directory depends on your operating system:

  • Linux: ~/.config/inkscape/extensions/
  • macOS: ~/Library/Application Support/org.inkscape.Inkscape/config/inkscape/extensions/
  • Windows: C:\\Users\\[Username]\\AppData\\Roaming\\inkscape\\extensions\\

Replace [Username] with your actual username.

Please note that this code should work with Inkscape versions 1.0 and later. Prior versions use a different API and may not be compatible with this script.

The bash script mentioned in the Python script could be anything, but make sure it's executable and it's designed to take an image file path as a command line argument.

Lastly, remember that running scripts in this manner can be a security risk if the scripts are not carefully controlled and reviewed. Always ensure that your scripts are secure and do not unintentionally expose vulnerabilities.


User

If no selection done, popup a warning that no selection done. And exit plugin


ChatGPT

If you want to display a warning dialog when no selection is made, you can modify the Python script to use the inkex.dialogs.errormsg() function. This function will display an error message in a dialog box.

Here's how you can modify the script:

#!/usr/bin/env python3

import inkex
import os
import subprocess

class ExportAndRunScript(inkex.EffectExtension):

    def effect(self):
        # Define the export file path
        png_file_path = "/path/to/exported.png"
        
        # Get the current selection
        selection = self.svg.selected

        # If there's no selection, show an error and exit
        if not selection:
            inkex.dialogs.errormsg("No selection to export.")
            return
        
        # Export the selection to PNG
        self.export_selection_to_png(selection, png_file_path)
        
        # Run the bash script on the exported PNG
        self.run_script_on_png(png_file_path)
        
    def export_selection_to_png(self, selection, png_file_path):
        # Create a command that calls Inkscape's command line interface to export the selection to a PNG
        command = ["inkscape", "--export-area-drawing", "--export-dpi=96", "--export-background-opacity=0", "--export-png={}".format(png_file_path)]
        
        # Add the IDs of the selected items to the command
        for id, item in selection.items():
            command.append("--export-id={}".format(id))
            
        # Run the command
        subprocess.check_call(command)

    def run_script_on_png(self, png_file_path):
        # Define the path to your bash script
        bash_script_path = "/path/to/your/script.sh"
        
        # Create a command that calls the bash script with the PNG as an argument
        command = ["bash", bash_script_path, png_file_path]
        
        # Run the command
        subprocess.check_call(command)
        
if __name__ == "__main__":
    ExportAndRunScript().run()

The inkex.dialogs.errormsg("No selection to export.") line will show an error dialog with the message "No selection to export." if there's no selection. The return statement after the error message will exit the plugin.


User

how do i run this


ChatGPT

To run this script, you need to follow these steps:

  1. Save the script: Save the script in a file with a .py extension (e.g., export\_and\_run\_script.py). Make sure to replace "/path/to/exported.png" and "/path/to/your/script.sh" with the paths to your PNG file and Bash script respectively.
  2. Create an INX file: Inkscape plugins also require an .inx file, which is a simple XML file that describes how the plugin should appear in Inkscape's menu. Here is a simple .inx file that would work with the script you've written
<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
    <_name>Export and Run Script</_name>
    <id>org.inkscape.effect.exportandrunscript</id>
    <dependency type="executable" location="extensions">export_and_run_script.py</dependency>
    <effect>
        <object-type>all</object-type>
    </effect>
    <script>
        <command reldir="extensions" interpreter="python">export_and_run_script.py</command>
    </script>
    <category>Fx</category>
</inkscape-extension>

Save this XML to a file with the same name as your Python script, but with an .inx extension (e.g., export\_and\_run\_script.inx).

  1. Install the plugin: Copy both the .py and .inx files to Inkscape's extensions directory. The exact location of this directory depends on your operating system:
  • Linux: ~/.config/inkscape/extensions/
  • macOS: ~/Library/Application Support/org.inkscape.Inkscape/config/inkscape/extensions/
  • Windows: C:\\Users\\[Username]\\AppData\\Roaming\\inkscape\\extensions\\Replace [Username] with your actual username.
  1. Restart Inkscape: If Inkscape is currently running, you will need to restart it in order to load the new plugin.
  2. Use the plugin: To use your new plugin, open Inkscape and navigate to the menu Extensions \-\> Fx \-\> Export and Run Script.

Please note that this guide assumes you have a working installation of Inkscape and Python on your machine. If you encounter any issues, please let me know!


chat2gist v0.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment