Union-Operation mit Inkscape-Erweiterung für 3 Gruppen durchführen, aber seltsames ErgebnisPython

Python-Programme
Anonymous
 Union-Operation mit Inkscape-Erweiterung für 3 Gruppen durchführen, aber seltsames Ergebnis

Post by Anonymous »

Ich habe eine Erweiterung erstellt, um eine Vereinigungsoperation für jede ausgewählte Gruppe durchzuführen, aber ich habe ein seltsames Ergebnis erhalten.
Zum Beispiel gibt es drei ausgewählte Gruppen von Rechtecken:
Image

Nachdem die Erweiterung für sie verwendet wurde, wird nur die erste Gruppe in einen Vereinigungspfad umgewandelt. der Rest wird dupliziert und befindet sich nicht mehr an ihren ursprünglichen Positionen:
Image

Das erwartete Ergebnis sollte drei Vereinigungspfade sein:
Image

Hier ist die Erweiterung (speichern Sie sie als „union_operation_on_each_selected_group.py“):

Code: Select all

import inkex
import tempfile, os, shutil
from uuid import uuid4
from inkex import Group, Circle, Ellipse, Line, PathElement, Polygon, Polyline, Rectangle, Use
from inkex.paths import Path
from inkex.command import call
from math import ceil
from lxml import etree

def process_svg(svg, action_string):

temp_folder = tempfile.mkdtemp()

# Create a random filename for svg
svg_temp_filepath = os.path.join(temp_folder, f'original_{str(uuid4())}.svg')

with open(svg_temp_filepath, 'w') as output_file:
svg_string = svg.tostring().decode('utf-8')
output_file.write(svg_string)

processed_svg_temp_filepath = os.path.join(temp_folder, f'processed_{str(uuid4())}.svg')

my_actions = '--actions='

export_action_string = my_actions + f'export-filename:{processed_svg_temp_filepath};{action_string}export-do;'

# Run the command line
cmd_selection_list = inkex.command.inkscape(svg_temp_filepath, export_action_string)

# Replace the current document with the processed document
with open(processed_svg_temp_filepath, 'rb') as processed_svg:
loaded_svg = inkex.elements.load_svg(processed_svg).getroot()

shutil.rmtree(temp_folder)
return loaded_svg

def element_list_union(svg, element_list):

group = None

action_string = ''
for element in element_list:
group = element.getparent()
action_string = action_string + f'select-by-id:{element.get_id()};'
action_string = action_string + f'path-union;select-clear;'
processed_svg = process_svg(svg, action_string)

to_remove = []
for child in group:
to_remove.append(child)
for item in to_remove:
group.remove(item)

for elem in processed_svg:
group.add(elem)

class UnionizeEachGroupMembers(inkex.EffectExtension):

def add_arguments(self, pars):

pars.add_argument("--selection_type_radio", type=str, dest="selection_type_radio", default='all')

def effect(self):

SELECTION_TYPE = self.options.selection_type_radio

if SELECTION_TYPE == 'all':
selection_list = self.svg.descendants()
else:
selection_list = self.svg.selected

# Filter for only shapes
selected_elements = selection_list.filter(inkex.ShapeElement)

if len(selected_elements) < 1:
inkex.errormsg('Please select at least one object / No Objects found')
return

for elem in selected_elements:
if elem.tag == inkex.addNS('g', 'svg'): # Check if the tag is 'g' in the SVG namespace
group = elem
group_id = group.get_id()

elements_to_union = [child for child in group if isinstance(child, (Circle, Ellipse, Line, PathElement, Polygon, Polyline, Rectangle, Use))]

if len(elements_to_union) > 0:
element_list_union(self.svg, elements_to_union)

if __name__ == '__main__':
UnionizeEachGroupMembers().run()
Und hier ist die .inx-Datei:

Code: Select all


Union Operation on Each Selected Group
union_operation_on_each_selected_group




Selected Objects
All Objects



all





union_operation_on_each_selected_group.py


Sie können die Beispieldatei hier herunterladen:
Beispieldatei
Ist es möglich, das erwartete Ergebnis mit einer Erweiterung zu erhalten? Wie könnte ich die Erweiterung reparieren?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post