Updated migrate groups
This commit is contained in:
parent
783c6b874d
commit
1c464b313d
14
extensions/fablabchemnitz_drawdirections.inx
Normal file
14
extensions/fablabchemnitz_drawdirections.inx
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
|
||||||
|
<name>Draw Directions</name>
|
||||||
|
<id>fablabchemnitz.de.directions</id>
|
||||||
|
<effect>
|
||||||
|
<object-type>path</object-type>
|
||||||
|
<effects-menu>
|
||||||
|
<submenu name="FabLab Chemnitz Dev" />
|
||||||
|
</effects-menu>
|
||||||
|
</effect>
|
||||||
|
<script>
|
||||||
|
<command location="inx" interpreter="python">fablabchemnitz_drawdirections.py</command>
|
||||||
|
</script>
|
||||||
|
</inkscape-extension>
|
32
extensions/fablabchemnitz_drawdirections.py
Normal file
32
extensions/fablabchemnitz_drawdirections.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import inkex
|
||||||
|
from inkex.paths import Path
|
||||||
|
from inkex import Circle
|
||||||
|
|
||||||
|
# Draws red points at the path's beginning and blue point at the path's end
|
||||||
|
|
||||||
|
class StartEndPoints(inkex.Effect):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
inkex.Effect.__init__(self)
|
||||||
|
self.arg_parser.add_argument("--dotsize", type=int, default=10, help="Dot size (px) for self-intersecting points")
|
||||||
|
|
||||||
|
def effect(self):
|
||||||
|
dot_group = node.getparent().add(inkex.Group())
|
||||||
|
|
||||||
|
for node in self.svg.selection.values():
|
||||||
|
|
||||||
|
points = list(node.path.end_points)
|
||||||
|
start = points[0]
|
||||||
|
end = points[len(points) - 1]
|
||||||
|
|
||||||
|
style = inkex.Style({'stroke': 'none', 'fill': '#FF0000'})
|
||||||
|
startCircle = dot_group.add(Circle(cx=str(start[0]), cy=str(start[1]), r=str(self.svg.unittouu(str(self.options.dotsize/2) + "px"))))
|
||||||
|
startCircle.style = style
|
||||||
|
|
||||||
|
style = inkex.Style({'stroke': 'none', 'fill': '#0000FF'})
|
||||||
|
endCircle = dot_group.add(Circle(cx=str(end[0]), cy=str(end[1]), r=str(self.svg.unittouu(str(self.options.dotsize/2) + "px"))))
|
||||||
|
endCircle.style = style
|
||||||
|
|
||||||
|
StartEndPoints().run()
|
@ -2,7 +2,19 @@
|
|||||||
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
|
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
|
||||||
<name>Migrate Groups</name>
|
<name>Migrate Groups</name>
|
||||||
<id>fablabchemnitz.de.migrategroups</id>
|
<id>fablabchemnitz.de.migrategroups</id>
|
||||||
<effect needs-live-preview="false">
|
<label>What elements to migrate?</label>
|
||||||
|
<label>Unchecked item types will be deleted!</label>
|
||||||
|
<param name="rect" type="bool" gui-text="rect">true</param>
|
||||||
|
<param name="circle" type="bool" gui-text="circle">true</param>
|
||||||
|
<param name="ellipse" type="bool" gui-text="ellipse">true</param>
|
||||||
|
<param name="line" type="bool" gui-text="line">true</param>
|
||||||
|
<param name="polyline" type="bool" gui-text="polyline">true</param>
|
||||||
|
<param name="polygon" type="bool" gui-text="polygon">true</param>
|
||||||
|
<param name="path" type="bool" gui-text="path">true</param>
|
||||||
|
<param name="image" type="bool" gui-text="image">true</param>
|
||||||
|
<param name="text" type="bool" gui-text="text">true</param>
|
||||||
|
<param name="tspan" type="bool" gui-text="tspan">true</param>
|
||||||
|
<effect needs-live-preview="true">
|
||||||
<object-type>path</object-type>
|
<object-type>path</object-type>
|
||||||
<effects-menu>
|
<effects-menu>
|
||||||
<submenu name="FabLab Chemnitz">
|
<submenu name="FabLab Chemnitz">
|
||||||
|
@ -17,18 +17,46 @@ class MigrateGroups(inkex.Effect):
|
|||||||
|
|
||||||
allPaths = []
|
allPaths = []
|
||||||
allGroups = []
|
allGroups = []
|
||||||
|
allNonMigrates = []
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
inkex.Effect.__init__(self)
|
inkex.Effect.__init__(self)
|
||||||
|
self.arg_parser.add_argument("--rect", type=inkex.Boolean, default=True, help="rect")
|
||||||
|
self.arg_parser.add_argument("--circle", type=inkex.Boolean, default=True, help="circle")
|
||||||
|
self.arg_parser.add_argument("--ellipse", type=inkex.Boolean, default=True, help="ellipse")
|
||||||
|
self.arg_parser.add_argument("--line", type=inkex.Boolean, default=True, help="line")
|
||||||
|
self.arg_parser.add_argument("--polyline", type=inkex.Boolean, default=True, help="polyline")
|
||||||
|
self.arg_parser.add_argument("--polygon", type=inkex.Boolean, default=True, help="polygon")
|
||||||
|
self.arg_parser.add_argument("--path", type=inkex.Boolean, default=True, help="path")
|
||||||
|
self.arg_parser.add_argument("--image", type=inkex.Boolean, default=True, help="image")
|
||||||
|
self.arg_parser.add_argument("--text", type=inkex.Boolean, default=True, help="text")
|
||||||
|
self.arg_parser.add_argument("--tspan", type=inkex.Boolean, default=True, help="tspan")
|
||||||
|
|
||||||
def effect(self):
|
def effect(self):
|
||||||
|
|
||||||
|
namespace = []
|
||||||
|
namespace.append("{http://www.w3.org/2000/svg}rect") if self.options.rect else ""
|
||||||
|
namespace.append("{http://www.w3.org/2000/svg}circle") if self.options.circle else ""
|
||||||
|
namespace.append("{http://www.w3.org/2000/svg}ellipse") if self.options.ellipse else ""
|
||||||
|
namespace.append("{http://www.w3.org/2000/svg}line") if self.options.line else ""
|
||||||
|
namespace.append("{http://www.w3.org/2000/svg}polyline") if self.options.polyline else ""
|
||||||
|
namespace.append("{http://www.w3.org/2000/svg}polygon") if self.options.polygon else ""
|
||||||
|
namespace.append("{http://www.w3.org/2000/svg}path") if self.options.path else ""
|
||||||
|
namespace.append("{http://www.w3.org/2000/svg}image") if self.options.image 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 ""
|
||||||
|
|
||||||
#get all paths and groups from selection. Remove all groups from the selection and form a new single group of it
|
#get all paths and groups from selection. Remove all groups from the selection and form a new single group of it
|
||||||
def parseNodes(self, node):
|
def parseNodes(self, node):
|
||||||
if node.tag == inkex.addNS('path','svg'):
|
if node.tag in namespace:
|
||||||
if node not in self.allPaths:
|
if node not in self.allPaths:
|
||||||
self.allPaths.append(node)
|
self.allPaths.append(node)
|
||||||
|
else:
|
||||||
|
if node.tag != inkex.addNS('g','svg'):
|
||||||
|
self.allNonMigrates.append(node)
|
||||||
if node.tag == inkex.addNS('g','svg'):
|
if node.tag == inkex.addNS('g','svg'):
|
||||||
|
if node not in self.allGroups:
|
||||||
|
self.allGroups.append(node)
|
||||||
groups = node.getchildren()
|
groups = node.getchildren()
|
||||||
if groups is not None:
|
if groups is not None:
|
||||||
for group in groups:
|
for group in groups:
|
||||||
@ -38,28 +66,34 @@ class MigrateGroups(inkex.Effect):
|
|||||||
|
|
||||||
for id, item in self.svg.selected.items():
|
for id, item in self.svg.selected.items():
|
||||||
parseNodes(self, item)
|
parseNodes(self, item)
|
||||||
|
|
||||||
if len(self.allPaths) > 0:
|
if len(self.allPaths) > 0:
|
||||||
#make a new group at root level - TODO: respect the position where the first selected object is in XML tree and put it there instead (or make this optional)
|
#make a new group at root level - TODO: respect the position where the first selected object is in XML tree and put it there instead (or make this optional)
|
||||||
newGroup = self.document.getroot().add(inkex.Group())
|
newGroup = self.document.getroot().add(inkex.Group())
|
||||||
|
|
||||||
#copy all paths into the new group
|
#copy all paths into the new group
|
||||||
for path in self.allPaths:
|
for path in self.allPaths:
|
||||||
newGroup.add(path.copy())
|
newGroup.add(path.copy())
|
||||||
|
|
||||||
#then remove all the old stuff
|
#then remove all the old stuff
|
||||||
path.getparent().remove(path)
|
path.getparent().remove(path)
|
||||||
|
|
||||||
#now remove all the obsolete groups
|
#now remove all the obsolete groups
|
||||||
if len(self.allGroups) > 0:
|
if len(self.allGroups) > 0:
|
||||||
for group in self.allGroups:
|
for group in self.allGroups:
|
||||||
if group.getparent() is not None:
|
if group.getparent() is not None:
|
||||||
group.getparent().remove(group)
|
group.getparent().remove(group)
|
||||||
|
|
||||||
#remove the selected, now empty group (if it's the case)
|
#remove the selected, now empty group (if it's the case)
|
||||||
if len(self.svg.selected) > 0:
|
if len(self.svg.selected) > 0 and len(self.allPaths) > 0:
|
||||||
if self.svg.selected[0].tag == inkex.addNS('g','svg'):
|
if self.svg.selected[0].tag == inkex.addNS('g','svg'):
|
||||||
self.svg.selected[0].getparent().remove(self.svg.selected[0])
|
if self.svg.selected[0].getparent() is not None:
|
||||||
|
self.svg.selected[0].getparent().remove(self.svg.selected[0])
|
||||||
|
|
||||||
|
if len(self.allNonMigrates) > 0:
|
||||||
|
self.msg("You are going to remove " + str(len(self.allNonMigrates)) + " nodes while migrating:")
|
||||||
|
for i in self.allNonMigrates:
|
||||||
|
self.msg(i.get('id'))
|
||||||
|
|
||||||
#TODO: make newGroup selected now. How ?
|
#TODO: make newGroup selected now. How ?
|
||||||
MigrateGroups().run()
|
MigrateGroups().run()
|
Reference in New Issue
Block a user