embroider_input.py: input extension to read embroidery formats

pull/145/head
Lex Neva 2018-04-06 19:55:53 -04:00
rodzic 69c64bf3a7
commit dfbe6f9c0f
5 zmienionych plików z 110 dodań i 3 usunięć

19
bin/gen-input-inx 100755
Wyświetl plik

@ -0,0 +1,19 @@
#!/usr/bin/env python
import sys
sys.path.append('embroidermodder/experimental/python/binding')
from libembroidery import *
formatList = embFormatList_create()
curFormat = formatList
while(curFormat):
extension = embFormat_extension(curFormat)
description = embFormat_description(curFormat)
writerState = embFormat_readerState(curFormat)
if writerState.strip() and embFormat_type(curFormat) != EMBFORMAT_OBJECTONLY:
print extension
curFormat = curFormat.next

51
embroider_input.py 100644
Wyświetl plik

@ -0,0 +1,51 @@
import sys
from libembroidery import *
from inkex import etree
import inkex
from inkstitch import PIXELS_PER_MM, _
from inkstitch.stitch_plan import StitchPlan
from inkstitch.svg import render_stitch_plan
def pattern_stitches(pattern):
stitch_pointer = pattern.stitchList
while stitch_pointer:
yield stitch_pointer.stitch
stitch_pointer = stitch_pointer.next
def main(embroidery_file):
pattern = embPattern_create()
embPattern_read(pattern, embroidery_file)
embPattern_flipVertical(pattern)
stitch_plan = StitchPlan()
color_block = None
current_color = None
for stitch in pattern_stitches(pattern):
if stitch.color != current_color:
thread = embThreadList_getAt(pattern.threadList, stitch.color)
color = thread.color
color_block = stitch_plan.new_color_block((color.r, color.g, color.b))
current_color = stitch.color
if not stitch.flags & END:
color_block.add_stitch(stitch.xx * PIXELS_PER_MM, stitch.yy * PIXELS_PER_MM,
jump=stitch.flags & JUMP,
stop=stitch.flags & STOP,
trim=stitch.flags & TRIM)
dimensions = stitch_plan.dimensions
svg = etree.Element("svg", nsmap=inkex.NSS, attrib=
{
"width": "%s" % dimensions[0],
"height": "%s" % dimensions[1],
"viewBox": "0 0 %s %s" % dimensions,
})
render_stitch_plan(svg, stitch_plan)
print etree.tostring(svg)
if __name__ == '__main__':
sys.exit(main(*sys.argv[1:]))

Wyświetl plik

@ -96,11 +96,22 @@ class StitchPlan(object):
def num_stitches(self):
return sum(block.num_stitches for block in self)
@property
def dimensions(self):
color_block_bounding_boxes = [cb.bounding_box for cb in self]
minx = min(bb[0] for bb in color_block_bounding_boxes)
miny = min(bb[1] for bb in color_block_bounding_boxes)
maxx = max(bb[2] for bb in color_block_bounding_boxes)
maxy = max(bb[3] for bb in color_block_bounding_boxes)
import sys; print >> sys.stderr, color_block_bounding_boxes, minx, miny, maxx, maxy
return (maxx - minx, maxy - miny)
@property
def dimensions_mm(self):
# TODO: implement this. Should do a bounding box calculation and
# convert to millimeters.
return ""
dimensions = self.dimensions
return (dimensions[0] / PIXELS_PER_MM, dimensions[1] / PIXELS_PER_MM)
class ColorBlock(object):
@ -196,3 +207,12 @@ class ColorBlock(object):
def replace_stitches(self, stitches):
self.stitches = stitches
@property
def bounding_box(self):
minx = min(stitch.x for stitch in self)
miny = min(stitch.y for stitch in self)
maxx = max(stitch.x for stitch in self)
maxy = max(stitch.y for stitch in self)
return minx, miny, maxx, maxy

Wyświetl plik

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
<_name>{{ format | upper }} file input</_name>
<id>org.inkstitch.input.{{ format }}</id>
<dependency type="executable" location="extensions">embroider_input.py</dependency>
<dependency type="executable" location="extensions">inkex.py</dependency>
<input>
<extension>.{{ format }}</extension>
<mimetype>application/x-embroidery-{{ format }}</mimetype>
<_filetypename>{{ description }} (.{{ format }})</_filetypename>
<_filetypetooltip>convert {{ format | upper }} file to Ink/Stitch manual-stitch paths</_filetypetooltip>
</input>
<script>
<command reldir="extensions" interpreter="python">embroider_input.py</command>
</script>
</inkscape-extension>