112 lines
3.8 KiB
Python
112 lines
3.8 KiB
Python
|
#!/usr/bin/env python
|
||
|
from __future__ import print_function
|
||
|
|
||
|
import inkex
|
||
|
import cubicsuperpath, simplestyle, copy, math, re, bezmisc, simplepath
|
||
|
import pyclipper
|
||
|
import sys
|
||
|
|
||
|
def eprint(*args, **kwargs):
|
||
|
print(*args, file=sys.stderr, **kwargs)
|
||
|
|
||
|
|
||
|
|
||
|
class ofsplot(inkex.Effect):
|
||
|
def __init__(self):
|
||
|
inkex.Effect.__init__(self)
|
||
|
self.OptionParser.add_option("--count",
|
||
|
action="store", type="int",
|
||
|
dest="count", default=10,
|
||
|
help="Number of offset operations")
|
||
|
self.OptionParser.add_option("--ofs",
|
||
|
action="store", type="float",
|
||
|
dest="offset", default=2,
|
||
|
help="Offset amount")
|
||
|
self.OptionParser.add_option("--init_ofs",
|
||
|
action="store", type="float",
|
||
|
dest="init_offset", default=2,
|
||
|
help="Initial Offset Amount")
|
||
|
self.OptionParser.add_option("--copy_org",
|
||
|
action="store", type="inkbool",
|
||
|
dest="copy_org", default=True,
|
||
|
help="copy original path")
|
||
|
self.OptionParser.add_option("--ofs_incr",
|
||
|
action="store", type="float",
|
||
|
dest="offset_increase", default=2,
|
||
|
help="Offset increase between iterations")
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def effect(self):
|
||
|
|
||
|
for id, node in self.selected.iteritems():
|
||
|
if node.tag == inkex.addNS('path','svg'):
|
||
|
p = cubicsuperpath.parsePath(node.get('d'))
|
||
|
|
||
|
scale_factor=5.0
|
||
|
|
||
|
|
||
|
pco = pyclipper.PyclipperOffset()
|
||
|
|
||
|
new = []
|
||
|
|
||
|
|
||
|
# load in initial paths
|
||
|
for sub in p:
|
||
|
sub_simple = []
|
||
|
h1_simple = []
|
||
|
h2_simple = []
|
||
|
for item in sub:
|
||
|
itemx = [float(z)*scale_factor for z in item[1]]
|
||
|
sub_simple.append(itemx)
|
||
|
#eprint(itemx)
|
||
|
#h1_simple.append(item[0]-item[1]) # handle 1 offset
|
||
|
#h2_simple.append(item[2]-item[1]) # handle 2 offset
|
||
|
|
||
|
pco.AddPath(sub_simple, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON)
|
||
|
|
||
|
|
||
|
|
||
|
# calculate offset paths for different offset amounts
|
||
|
offset_list = []
|
||
|
offset_list.append(self.options.init_offset)
|
||
|
for i in range(0,self.options.count+1):
|
||
|
ofs_inc = +math.pow(float(i)*self.options.offset_increase,2)
|
||
|
if self.options.offset_increase <0:
|
||
|
ofs_inc = -ofs_inc
|
||
|
offset_list.append(offset_list[0]+float(i)*self.options.offset+ofs_inc)
|
||
|
|
||
|
|
||
|
solutions = []
|
||
|
for offset in offset_list:
|
||
|
solution = pco.Execute(offset*scale_factor)
|
||
|
solutions.append(solution)
|
||
|
if len(solution)<=0:
|
||
|
continue # no more loops to go, will provide no results.
|
||
|
|
||
|
|
||
|
# re-arrange solutions to fit expected format & add to array
|
||
|
for solution in solutions:
|
||
|
for sol in solution:
|
||
|
solx = [[float(s[0])/scale_factor, float(s[1])/scale_factor] for s in sol]
|
||
|
sol_p = [[a,a,a] for a in solx]
|
||
|
sol_p.append(sol_p[0][:])
|
||
|
new.append(sol_p)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
# add old, just to keep (make optional!)
|
||
|
if self.options.copy_org:
|
||
|
for sub in p:
|
||
|
new.append(sub)
|
||
|
|
||
|
node.set('d',cubicsuperpath.formatPath(new))
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
e = ofsplot()
|
||
|
e.affect()
|
||
|
|