diff --git a/extensions/fablabchemnitz_migrategroups.inx b/extensions/fablabchemnitz_migrategroups.inx index a4eb2921..181fcfdf 100644 --- a/extensions/fablabchemnitz_migrategroups.inx +++ b/extensions/fablabchemnitz_migrategroups.inx @@ -29,11 +29,11 @@ - true - true - true - true - true + true + true + true + true + true true @@ -67,4 +67,4 @@ - \ No newline at end of file + diff --git a/extensions/fablabchemnitz_migrategroups.py b/extensions/fablabchemnitz_migrategroups.py index c7d951d0..d00fa20b 100644 --- a/extensions/fablabchemnitz_migrategroups.py +++ b/extensions/fablabchemnitz_migrategroups.py @@ -8,7 +8,7 @@ This extension parses the selection and will put all elements into one single gr Author: Mario Voigt / FabLab Chemnitz Mail: mario.voigt@stadtfabrikanten.org Date: 13.08.2020 -Last Patch: 23.08.2020 +Last Patch: 29.08.2020 License: GNU GPL v3 """ @@ -17,9 +17,9 @@ from lxml import etree class MigrateGroups(inkex.Effect): - allElements = [] - allGroups = [] - allNonMigrates = [] + allElements = [] #list of all (sub)elements to process within selection + allGroups = [] #list of all groups (svg:g and svg:svg items) to delete + allNonMigrates = [] #list of all other elements except svg:g and svg:svg to drop while migrating def __init__(self): inkex.Effect.__init__(self) @@ -40,11 +40,11 @@ class MigrateGroups(inkex.Effect): self.arg_parser.add_argument("--svg", type=inkex.Boolean, default=True) self.arg_parser.add_argument("--text", type=inkex.Boolean, default=True) self.arg_parser.add_argument("--tspan", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--lineargradient", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--radialgradient", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--meshgradient", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--meshrow", type=inkex.Boolean, default=True) - self.arg_parser.add_argument("--meshpatch", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--linearGradient", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--radialGradient", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--meshGradient", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--meshRow", type=inkex.Boolean, default=True) + self.arg_parser.add_argument("--meshPatch", type=inkex.Boolean, default=True) self.arg_parser.add_argument("--metadata", type=inkex.Boolean, default=True) self.arg_parser.add_argument("--script", type=inkex.Boolean, default=True) self.arg_parser.add_argument("--stop", type=inkex.Boolean, default=True) @@ -69,11 +69,11 @@ class MigrateGroups(inkex.Effect): #namespace.append("{http://www.w3.org/2000/svg}svg") if self.options.svg else "" namespace.append("{http://www.w3.org/2000/svg}text") if self.options.text else "" namespace.append("{http://www.w3.org/2000/svg}tspan") if self.options.tspan else "" - namespace.append("{http://www.w3.org/2000/svg}lineargradient") if self.options.lineargradient else "" - namespace.append("{http://www.w3.org/2000/svg}radialgradient") if self.options.radialgradient else "" - namespace.append("{http://www.w3.org/2000/svg}meshgradient") if self.options.meshgradient else "" - namespace.append("{http://www.w3.org/2000/svg}meshrow") if self.options.meshrow else "" - namespace.append("{http://www.w3.org/2000/svg}meshpatch") if self.options.meshpatch else "" + namespace.append("{http://www.w3.org/2000/svg}linearGradient") if self.options.linearGradient else "" + namespace.append("{http://www.w3.org/2000/svg}radialGradient") if self.options.radialGradient else "" + namespace.append("{http://www.w3.org/2000/svg}meshGradient") if self.options.meshGradient else "" + namespace.append("{http://www.w3.org/2000/svg}meshRow") if self.options.meshRow else "" + namespace.append("{http://www.w3.org/2000/svg}meshPatch") if self.options.meshPatch else "" namespace.append("{http://www.w3.org/2000/svg}script") if self.options.script else "" namespace.append("{http://www.w3.org/2000/svg}metadata") if self.options.metadata else "" namespace.append("{http://www.w3.org/2000/svg}stop") if self.options.stop else "" @@ -82,6 +82,8 @@ class MigrateGroups(inkex.Effect): namespace.append("{http://www.w3.org/2000/svg}flowRegion") if self.options.flowRegion else "" namespace.append("{http://www.w3.org/2000/svg}flowPara") if self.options.flowPara else "" + #inkex.utils.debug(namespace) + #check if we have selected elements or if we should parse the whole document instead selected = [] #list of elements to parse if len(self.svg.selected) == 0: @@ -89,19 +91,21 @@ class MigrateGroups(inkex.Effect): if element != self.document.getroot(): selected.append(element) else: - selected = self.svg.selected + selected = self.svg.get_selected() - def parseNodes(self, element): - + #check the element for it's type and put it into the the according list (either re-group or delete) + def parseElement(self, element): if self.options.allitems: if element not in self.allElements: if element.tag != inkex.addNS('g','svg') and element.tag != inkex.addNS('svg','svg') and element.tag != inkex.addNS('namedview','sodipodi'): self.allElements.append(element) else: + #inkex.utils.debug(element.tag) if element.tag in namespace: if element not in self.allElements: self.allElements.append(element) else: + #inkex.utils.debug(element.tag) if element.tag != inkex.addNS('g','svg') and element.tag != inkex.addNS('svg','svg') and element.tag != inkex.addNS('namedview','sodipodi'): if element not in self.allNonMigrates: self.allNonMigrates.append(element) @@ -112,18 +116,17 @@ class MigrateGroups(inkex.Effect): groups = element.getchildren() if groups is not None: for group in groups: - parseNodes(self, group) + parseElement(self, group) if group not in self.allGroups: self.allGroups.append(group) #get all elements from the selection. Remove all groups from the selection and form a new single group of it. We also handle svg:svg because it behaves like a group container too for element in selected: - parseNodes(self, element) + parseElement(self, element) + #copy all element into the new group if len(self.allElements) > 0: - #copy all element into the new group newGroup = self.document.getroot().add(inkex.Group()) #make a new group at root level - for oldElement in self.allElements: #oldElementId = oldElement.get('id') newElement = oldElement.copy() @@ -133,23 +136,30 @@ class MigrateGroups(inkex.Effect): if oldElement.getparent() is not None: oldElement.getparent().remove(oldElement) - if self.options.droponly == False: - #now remove all the obsolete groups - if len(self.allGroups) > 0: - for group in self.allGroups: - #if group.getparent() is not None: - group.getparent().remove(group) - - #remove the selected, now empty group (if it's the case) - this applies not if there is no user selection at all so some dangling group(s) might be left over - if len(self.svg.selected) > 0 and len(self.allElements) > 0: - if self.svg.selected[0].tag == inkex.addNS('g','svg') or self.svg.selected[0].tag == inkex.addNS('svg','svg'): - if self.svg.selected[0].getparent() is not None: - self.svg.selected[0].getparent().remove(self.svg.selected[0]) - + #show a list with items to delete if self.options.showdroplist: self.msg(str(len(self.allNonMigrates)) + " elements were removed during nodes while migration:") for i in self.allNonMigrates: if i.get('id') is not None: - self.msg(i.tag.replace("{http://www.w3.org/2000/svg}","svg:") + " id:" + i.get('id')) - -MigrateGroups().run() \ No newline at end of file + self.msg(i.tag.replace("{http://www.w3.org/2000/svg}","svg:") + " id:" + i.get('id')) + + # #now remove the stuff with nonMigrates list. this has to be done before we drop the groups where they are located + # if len(self.allNonMigrates) > 0: + # for nonMigrate in self.allNonMigrates: + # if nonMigrate.getparent() is not None: + # nonMigrate.getparent().remove(nonMigrate) + + #now remove all the obsolete groups + if self.options.droponly == False: + if len(self.allGroups) > 0: + for group in self.allGroups: + if group.getparent() is not None: + group.getparent().remove(group) + + #remove the selected, now empty group (if it's the case) - this applies not if there is no user selection at all so some dangling group(s) might be left over + if len(self.svg.selected) > 0 and len(self.allElements) > 0: + if self.svg.get_first_selected().tag == inkex.addNS('g','svg') or self.svg.get_first_selected().tag == inkex.addNS('svg','svg'): + if self.svg.get_first_selected().getparent() is not None: + self.svg.get_first_selected().getparent().remove(self.svg.get_first_selected()) + +MigrateGroups().run()