summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLex Neva <github.com@lexneva.name>2018-08-02 20:04:08 -0400
committerLex Neva <github.com@lexneva.name>2018-08-02 20:04:08 -0400
commit64062f7cd7eee9ed5701209618b0564a211c494b (patch)
tree9ee0a9f873fdacc4f497d80e48b3975b2baa96a2 /lib
parent5d17cb9e229ad86fe2c5e932d585df2329c9f076 (diff)
WIP
Diffstat (limited to 'lib')
-rw-r--r--lib/commands.py79
1 files changed, 57 insertions, 22 deletions
diff --git a/lib/commands.py b/lib/commands.py
index 02c13b25..74cf32b8 100644
--- a/lib/commands.py
+++ b/lib/commands.py
@@ -5,28 +5,33 @@ from .svg import apply_transforms
from .svg.tags import SVG_USE_TAG, SVG_SYMBOL_TAG, CONNECTION_START, CONNECTION_END, XLINK_HREF
-class Command(object):
- def __init__(self, connector):
- self.connector = connector
- self.svg = self.connector.getroottree().getroot()
+class CommandParseError(Exception):
+ pass
- self.parse_command()
- def get_node_by_url(self, url):
- # url will be #path12345. Find the object at the other end.
+def get_node_by_url(svg, url):
+ # url will be #path12345. Find the object at the other end.
- if url is None:
- raise ValueError("url is None")
+ if url is None:
+ raise CommandParseError("url is None")
- if not url.startswith('#'):
- raise ValueError("invalid connection url: %s" % url)
+ if not url.startswith('#'):
+ raise CommandParseError("invalid connection url: %s" % url)
- id = url[1:]
+ id = url[1:]
- try:
- return self.svg.xpath(".//*[@id='%s']" % id)[0]
- except (IndexError, AttributeError):
- raise ValueError("could not find node by url %s" % id)
+ try:
+ return svg.xpath(".//*[@id='%s']" % id)[0]
+ except (IndexError, AttributeError):
+ raise CommandParseError("could not find node by url %s" % id)
+
+
+class Command(object):
+ def __init__(self, connector):
+ self.connector = connector
+ self.svg = self.connector.getroottree().getroot()
+
+ self.parse_command()
def parse_connector_path(self):
path = cubicsuperpath.parsePath(self.connector.get('d'))
@@ -36,27 +41,27 @@ class Command(object):
path = self.parse_connector_path()
neighbors = [
- (self.get_node_by_url(self.connector.get(CONNECTION_START)), path[0][0][1]),
- (self.get_node_by_url(self.connector.get(CONNECTION_END)), path[0][-1][1])
+ (get_node_by_url(self.svg, self.connector.get(CONNECTION_START)), path[0][0][1]),
+ (get_node_by_url(self.svg, self.connector.get(CONNECTION_END)), path[0][-1][1])
]
if neighbors[0][0].tag != SVG_USE_TAG:
neighbors.reverse()
if neighbors[0][0].tag != SVG_USE_TAG:
- raise ValueError("connector does not point to a use tag")
+ raise CommandParseError("connector does not point to a use tag")
- self.symbol = self.get_node_by_url(neighbors[0][0].get(XLINK_HREF))
+ self.symbol = self.get_node_by_url(self.svg, neighbors[0][0].get(XLINK_HREF))
if self.symbol.tag != SVG_SYMBOL_TAG:
- raise ValueError("use points to non-symbol")
+ raise CommandParseError("use points to non-symbol")
self.command = self.symbol.get('id')
if self.command.startswith('inkstitch_'):
self.command = self.command[10:]
else:
- raise ValueError("symbol is not an Ink/Stitch command")
+ raise CommandParseError("symbol is not an Ink/Stitch command")
self.target = neighbors[1][0]
self.target_point = neighbors[1][1]
@@ -64,6 +69,17 @@ class Command(object):
def __repr__(self):
return "Command('%s', %s)" % (self.command, self.target_point)
+class StandaloneCommand(object):
+ def __init__(self, symbol):
+ self.symbol = symbol
+ self.svg = self.connector.getroottree().getroot()
+
+ self.parse_command()
+
+ def parse_command(self):
+ pass
+
+
def find_commands(node):
"""Find the symbols this node is connected to and return them as Commands"""
@@ -82,5 +98,24 @@ def find_commands(node):
return commands
+def layer_commands(layer, command):
+ """Find standalone (unconnected) command symbols in this layer."""
+ pass
+
+def global_commands(svg):
+ """Find all unconnected command symbols in the SVG."""
+
+ xpath = ".//svg:use[starts-with(@xlink:href, '#inkstitch_')]"
+ symbols = svg.xpath(xpath, namespace=inkex.NSS)
+
+ commands = []
+ for symbol in symbols:
+ try:
+ commands.append(StandaloneCommand(symbol))
+ except CommandParseError:
+ pass
+
+ return commands
+
def is_command(node):
return CONNECTION_START in node.attrib or CONNECTION_END in node.attrib