kopia lustrzana https://github.com/hdacosta400/intelligent-textiles
can create grids without the need for inkstitch
rodzic
e49be2df0e
commit
c41ccf9e4f
Plik binarny nie jest wyświetlany.
|
@ -6,16 +6,17 @@ from argparse import ArgumentParser, REMAINDER
|
|||
|
||||
import appdirs
|
||||
import inkex
|
||||
from inkex import Line, Rectangle, Path
|
||||
from inkex import Line, Rectangle, Path, Polyline
|
||||
import wx
|
||||
import wx.adv
|
||||
from lxml import etree
|
||||
|
||||
import numpy as np
|
||||
from extension import InkstitchExtension
|
||||
from simple_inkscape_scripting import *
|
||||
|
||||
MIN_GRID_SPACING = 2.5
|
||||
BBOX_SPACING = 5
|
||||
MIN_GRID_SPACING = inkex.units.convert_unit(2.5, "mm")
|
||||
BBOX_SPACING = inkex.units.convert_unit(5, 'mm')
|
||||
|
||||
class BoundingBoxMetadata():
|
||||
'''
|
||||
|
@ -50,7 +51,6 @@ class CreateGridEffect(inkex.Effect):
|
|||
help="The number of desired vertical wires")
|
||||
|
||||
def effect(self):
|
||||
|
||||
arg_parser = ArgumentParser()
|
||||
self.add_arguments(arg_parser)
|
||||
args, _ = arg_parser.parse_known_args()
|
||||
|
@ -66,66 +66,90 @@ class CreateGridEffect(inkex.Effect):
|
|||
for elem in self.svg.get_selected(): # PATH ELEMENT
|
||||
inkex.errormsg("things selected:{}".format(len(self.svg.get_selected())))
|
||||
inkex.errormsg("type of elem:{}".format(type(elem)))
|
||||
inkex.errormsg("path:{}".format(elem.path))
|
||||
shape_points = [p for p in elem.path.end_points]
|
||||
bbox = elem.bounding_box()
|
||||
rectangle = BoundingBoxMetadata(bbox.width, bbox.height, bbox.top, bbox.bottom, bbox.left, bbox.right)
|
||||
rectangle = BoundingBoxMetadata(inkex.units.convert_unit(bbox.width, 'mm'),
|
||||
inkex.units.convert_unit(bbox.height, 'mm'),
|
||||
inkex.units.convert_unit(bbox.top, 'mm'),
|
||||
inkex.units.convert_unit(bbox.bottom, 'mm'),
|
||||
inkex.units.convert_unit(bbox.left, 'mm'),
|
||||
inkex.units.convert_unit(bbox.right, 'mm'))
|
||||
|
||||
create_grid_worker = CreateGrid(shape_points, rectangle, int(args.horizontal_wires), int(args.vertical_wires), self.svg)
|
||||
create_grid_worker = CreateGrid(shape_points, rectangle, int(args.horizontal_wires), int(args.vertical_wires), self.svg, self.document)
|
||||
create_grid_worker.create_grid_layout()
|
||||
|
||||
# parent = self.svg.get_current_layer()
|
||||
# self.draw_SVG_line(10,10,0,0, parent)
|
||||
|
||||
points = ['542.9868434645668,846.242620472441', '542.9868434645668,1053.0930708661417']
|
||||
def draw_SVG_line(self, x1, y1, x2, y2, parent):
|
||||
color = "red"
|
||||
line_attribs = {
|
||||
'style' : "stroke: %s; stroke-width: 0.4; fill: none; stroke-dasharray:0.4,0.4" % color,
|
||||
# 'd' : 'M 55.3977 90.881 H 114.748 V 80.9478 H 46.3977 V 78.0146 H 114.748 V 75.0815 H 46.3977 V 72.1483 H 114.748 V 69.2151 H 46.3977 V 66.2819 H 114.748 V 63.3488 H 46.3977 V 60.4156 H 114.748 V 57.4824 H 46.3977',
|
||||
'points': 'M 0,0 9,9 5,5'
|
||||
}
|
||||
|
||||
line = etree.SubElement(parent, inkex.addNS('path','svg'), line_attribs)
|
||||
|
||||
points = ['0,0', '10,10']
|
||||
color = "red"
|
||||
path_str = ' '.join(points)
|
||||
poly = inkex.Polyline(attrib={
|
||||
'id': "wire_segment",
|
||||
'style': "stroke: %s; stroke-width: 0.4; fill: none; stroke-dasharray:0.4,0.4" % color,
|
||||
# 'id': "wire_segment",
|
||||
'style':"stroke: %s; stroke-width: 0.4; fill: none; stroke-dasharray:0.4,0.4" % color,
|
||||
'points': path_str,
|
||||
})
|
||||
inkex.errormsg(str(poly.get_path()))
|
||||
line_attribs = {'style' : "stroke: %s; stroke-width: 0.4; fill: none; stroke-dasharray:0.4,0.4" % color,
|
||||
inkex.addNS('label','inkscape') : "wire_sement",
|
||||
'd' : str(poly.get_path())}
|
||||
|
||||
line_attribs = {
|
||||
'style' : "stroke: %s; stroke-width: 0.4; fill: none; stroke-dasharray:0.4,0.4" % color,
|
||||
'd': str(poly.get_path())
|
||||
# 'points': 'M 0,0 9,9 5,5'
|
||||
}
|
||||
|
||||
etree.SubElement(self.svg.get_current_layer(), inkex.addNS('path','svg'), line_attribs)
|
||||
|
||||
# polyline(points,style=style)
|
||||
class CreateGrid():
|
||||
def __init__(self, shape_points, rectangle, num_horizontal_wires, num_vertical_wires, svg):
|
||||
def __init__(self, shape_points, rectangle, num_horizontal_wires, num_vertical_wires, svg, document):
|
||||
self.shape_points = shape_points
|
||||
self.rectangle = rectangle
|
||||
self.num_horizontal_wires = num_horizontal_wires
|
||||
self.num_vertical_wires = num_vertical_wires
|
||||
self.svg = svg
|
||||
inkex.errormsg("what is svg:{}".format(type(self.svg)))
|
||||
self.lower_left, self.lower_right,self.upper_left,self.upper_right = self.rectangle.get_rectangle_points()
|
||||
|
||||
self.document = document
|
||||
|
||||
def create_grid_layout(self):
|
||||
# check vertical and horizontal spacing
|
||||
total_horizontal_spacing = self.rectangle.height / (self.num_horizontal_wires)
|
||||
total_vertical_spacing = self.rectangle.width / (self.num_vertical_wires)
|
||||
# can only actually add wires within boundaries of rectangle
|
||||
horizontal_wire_spacing = (self.rectangle.height - total_horizontal_spacing) / self.num_horizontal_wires
|
||||
vertical_wire_spacing = (self.rectangle.width - total_vertical_spacing) / self.num_vertical_wires
|
||||
if (horizontal_wire_spacing < MIN_GRID_SPACING):
|
||||
inkex.errormsg('''The horizontal wires must be at least {} mm apart
|
||||
They are currently {} mm apart. Either decrease the
|
||||
number of wires or increase the size of the grid and try again.'''.format(MIN_GRID_SPACING, horizontal_wire_spacing))
|
||||
return
|
||||
if (vertical_wire_spacing < MIN_GRID_SPACING):
|
||||
inkex.errormsg('''The vertical wires must be at least {} mm apart
|
||||
They are currently {} mm apart. Either decrease the
|
||||
number of wires or increase the size of the grid and try again.'''.format(MIN_GRID_SPACING, vertical_wire_spacing))
|
||||
return
|
||||
inkex.errormsg("laying wires...")
|
||||
self.lay_horizontal_wires(total_horizontal_spacing)
|
||||
self.lay_vertical_wires(total_vertical_spacing)
|
||||
if self.num_horizontal_wires != 0:
|
||||
total_horizontal_spacing = self.rectangle.height / (self.num_horizontal_wires + 1)
|
||||
horizontal_wire_spacing = (self.rectangle.height - total_horizontal_spacing) / self.num_horizontal_wires
|
||||
|
||||
if (horizontal_wire_spacing < MIN_GRID_SPACING):
|
||||
inkex.errormsg('''The horizontal wires must be at least {} mm apart
|
||||
They are currently {} mm apart. Either decrease the
|
||||
number of wires or increase the size of the grid and try again.'''.format(MIN_GRID_SPACING, horizontal_wire_spacing))
|
||||
return
|
||||
self.lay_horizontal_wires(total_horizontal_spacing)
|
||||
if self.num_vertical_wires != 0:
|
||||
total_vertical_spacing = self.rectangle.width / (self.num_vertical_wires + 1)
|
||||
vertical_wire_spacing = (self.rectangle.width - total_vertical_spacing) / self.num_vertical_wires
|
||||
|
||||
if (vertical_wire_spacing < MIN_GRID_SPACING):
|
||||
inkex.errormsg('''The vertical wires must be at least {} mm apart
|
||||
They are currently {} mm apart. Either decrease the
|
||||
number of wires or increase the size of the grid and try again.'''.format(MIN_GRID_SPACING, vertical_wire_spacing))
|
||||
return
|
||||
self.lay_vertical_wires(total_vertical_spacing)
|
||||
|
||||
def lay_horizontal_wires(self, horizontal_wire_spacing):
|
||||
curr_point = list(self.lower_left)
|
||||
inkex.errormsg("curr_point:{}".format(curr_point))
|
||||
wire_count = 0
|
||||
points = []
|
||||
while round(curr_point[1]) != round(self.rectangle.top + horizontal_wire_spacing):
|
||||
curr_point[1] -= horizontal_wire_spacing
|
||||
while wire_count != self.num_horizontal_wires:
|
||||
curr_point[1] += horizontal_wire_spacing
|
||||
if wire_count % 2 == 0:
|
||||
points.append('{},{}'.format(self.rectangle.left - BBOX_SPACING, curr_point[1]))
|
||||
points.append('{},{}'.format(self.rectangle.right, curr_point[1]))
|
||||
|
@ -135,15 +159,14 @@ class CreateGrid():
|
|||
points.append('{},{}'.format(self.rectangle.right, curr_point[1]))
|
||||
points.append('{},{}'.format(self.rectangle.left - BBOX_SPACING, curr_point[1]))
|
||||
wire_count += 1
|
||||
break
|
||||
|
||||
inkex.errormsg("RESULT:{}".format(points))
|
||||
self.create_path(points, is_horizontal=True)
|
||||
|
||||
def lay_vertical_wires(self, vertical_wire_spacing):
|
||||
curr_point = list(self.upper_left)
|
||||
wire_count = 0
|
||||
points = []
|
||||
while round(curr_point[0]) != round(self.rectangle.right - vertical_wire_spacing):
|
||||
while wire_count != self.num_vertical_wires:
|
||||
curr_point[0] += vertical_wire_spacing
|
||||
if wire_count % 2 == 0:
|
||||
points.append('{},{}'.format(curr_point[0], self.rectangle.top - BBOX_SPACING))
|
||||
|
@ -152,7 +175,6 @@ class CreateGrid():
|
|||
points.append('{},{}'.format(curr_point[0], self.rectangle.bottom))
|
||||
points.append('{},{}'.format(curr_point[0], self.rectangle.top - BBOX_SPACING))
|
||||
wire_count += 1
|
||||
break
|
||||
|
||||
|
||||
|
||||
|
@ -163,14 +185,41 @@ class CreateGrid():
|
|||
'''
|
||||
Creates a wire segment path given all of the points sequentially
|
||||
'''
|
||||
|
||||
color = "red" if is_horizontal else "blue"
|
||||
path_str = ' '.join(points)
|
||||
inkex.errormsg("points:{}".format(path_str))
|
||||
path = inkex.Polyline(attrib={
|
||||
'id': "wire_segment",
|
||||
'style': "stroke: %s; stroke-width: 0.4; fill: none; stroke-dasharray:0.4,0.4" % color,
|
||||
'points': path_str,
|
||||
})
|
||||
self.svg.get_current_layer().append(path)
|
||||
|
||||
inkex.errormsg("input points:{}".format(points))
|
||||
inkex.errormsg("path str:{}".format(str(path.get_path())))
|
||||
line_attribs = {
|
||||
'style' : "stroke: %s; stroke-width: 0.4; fill: none; stroke-dasharray:0.4,0.4" % color,
|
||||
'd': str(path.get_path())
|
||||
# 'points': 'M 0,0 9,9 5,5'
|
||||
}
|
||||
|
||||
etree.SubElement(self.svg.get_current_layer(), inkex.addNS('path','svg'), line_attribs)
|
||||
|
||||
# etree.SubElement(parent, inkex.addNS('path','svg'), path_str)
|
||||
|
||||
if __name__ == '__main__':
|
||||
CreateGridEffect().run()
|
||||
CreateGridEffect().run()
|
||||
|
||||
|
||||
|
||||
# Take a look at this as to why current layer gets edited in inkstitch
|
||||
# def get_current_layer(self):
|
||||
# # if no layer is selected, inkex defaults to the root, which isn't
|
||||
# # particularly useful
|
||||
# current_layer = self.svg.get_current_layer()
|
||||
# if current_layer is self.document.getroot():
|
||||
# try:
|
||||
# current_layer = self.document.xpath(".//svg:g[@inkscape:groupmode='layer']", namespaces=inkex.NSS)[0]
|
||||
# except IndexError:
|
||||
# # No layers at all?? Fine, we'll stick with the default.
|
||||
# pass
|
||||
# return current_layer
|
Ładowanie…
Reference in New Issue