added parabola 2 extension
This commit is contained in:
parent
848fbe0af4
commit
b14bf6fff2
26
extensions/fablabchemnitz/parabola_2/parabola_2.inx
Normal file
26
extensions/fablabchemnitz/parabola_2/parabola_2.inx
Normal file
@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
|
||||
<name>Parabola 2</name>
|
||||
<id>fablabchemnitz.de.parabola_2</id>
|
||||
<param name="length" type="int" min="1" max="10000" gui-text="Side Length:">200</param>
|
||||
<param name="segments" type="int" min="5" max="1000" gui-text="Number of Line Segments:">25</param>
|
||||
<param name="shape" type="optiongroup" appearance="combo" gui-text="Choose a Shape:">
|
||||
<option value="triangle">Triangle</option>
|
||||
<option value="square">Square</option>
|
||||
<option value="pentagon">Pentagon</option>
|
||||
<option value="hexagon">Hexagon</option>
|
||||
<option value="septagon">Septagon</option>
|
||||
<option value="octagon">Octagon</option>
|
||||
</param>
|
||||
<effect>
|
||||
<object-type>all</object-type>
|
||||
<effects-menu>
|
||||
<submenu name="FabLab Chemnitz">
|
||||
<submenu name="Shape/Pattern from Generator" />
|
||||
</submenu>
|
||||
</effects-menu>
|
||||
</effect>
|
||||
<script>
|
||||
<command location="inx" interpreter="python">parabola_2.py</command>
|
||||
</script>
|
||||
</inkscape-extension>
|
155
extensions/fablabchemnitz/parabola_2/parabola_2.py
Normal file
155
extensions/fablabchemnitz/parabola_2/parabola_2.py
Normal file
@ -0,0 +1,155 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# 7/9/2021 - v.2.0
|
||||
#
|
||||
# Copyright (C) 2021 Reginald Waters opensourcebear@nthebare.com
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
"""
|
||||
This extension renders a wireframe shape and then draws lines to form a parabola
|
||||
shape.
|
||||
|
||||
The height and width are independently variable. The number of lines will change
|
||||
the density of the end product.
|
||||
|
||||
# Triangle has 3 sides and the sum of the 3 angles is 180 degrees
|
||||
# (sides - 2) * 180
|
||||
# This can be 60/60/60 or 90/45/45
|
||||
|
||||
# Square has 4 sides and the sum of 4 angles is 360 degrees
|
||||
# (sides - 2) * 180
|
||||
# 90/90/90/90
|
||||
|
||||
# Pentagon has 5 sides and the sum of 5 angels is 540 degrees
|
||||
# (sides - 2) * 180
|
||||
# 108/108/108/108/108
|
||||
...
|
||||
"""
|
||||
import inkex
|
||||
|
||||
from inkex import turtle as pturtle
|
||||
|
||||
class Parabola2(inkex.GenerateExtension):
|
||||
container_label = 'Parabola 2'
|
||||
def add_arguments(self, pars):
|
||||
pars.add_argument("--length", type=int, default=300, help="Side Length")
|
||||
pars.add_argument("--segments", type=int, default=10, help="Number of line segments")
|
||||
pars.add_argument("--shape", default="square")
|
||||
|
||||
sideopts = [
|
||||
(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),
|
||||
(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),
|
||||
(3,4),(3,5),(3,6),(3,7),(3,8),
|
||||
(4,5),(4,6),(4,7),(4,8),
|
||||
(5,6),(5,7),(5,8),
|
||||
(6,7),(6,8),
|
||||
(7,8)]
|
||||
|
||||
def generate(self):
|
||||
sl = self.options.length
|
||||
sc = self.options.segments
|
||||
shape = self.options.shape
|
||||
|
||||
cp = self.svg.namedview.center # Center Point
|
||||
sp = (cp[0] + (sl / 2), cp[1] + (sl / 2)) # Start Point
|
||||
cords = []
|
||||
|
||||
def mapshape(sides, sl, sc, sp):
|
||||
exteriorAngle = 360/sides
|
||||
movement = sl / sc
|
||||
tur.setpos(sp)
|
||||
for i in range(sides):
|
||||
sidecords = []
|
||||
tl = 0 # total length
|
||||
while tl < sl:
|
||||
sidecords.append(tur.getpos())
|
||||
tur.forward(movement)
|
||||
tl += movement
|
||||
# sidecords.append(tur.getpos())
|
||||
tur.right(exteriorAngle)
|
||||
cords.append(sidecords)
|
||||
return cords
|
||||
|
||||
def mapcross(sl, sc, sp):
|
||||
movement = sl / sc
|
||||
tur.setpos(sp)
|
||||
sidecords = []
|
||||
tl = 0
|
||||
tur.forward(sl)
|
||||
while tl < sl:
|
||||
tur.backward(movement)
|
||||
sidecords.append(tur.getpos())
|
||||
tur.right(90)
|
||||
|
||||
def drawshape(cords):
|
||||
tur.setpos(cords[0][0])
|
||||
for i in range(len(cords)):
|
||||
# tur.pd()
|
||||
# tur.setpos(cords[i][-1])
|
||||
# tur.pu()
|
||||
for side in range(len(cords)):
|
||||
for cord in range(len(cords[0])):
|
||||
if side == (len(cords) - 1):
|
||||
tur.setpos(cords[side][cord])
|
||||
tur.pd()
|
||||
if cord != (len(cords[0])):
|
||||
tur.setpos(cords[0][cord])
|
||||
tur.pu()
|
||||
else:
|
||||
tur.setpos(cords[side][cord])
|
||||
tur.pd()
|
||||
tur.setpos(cords[side + 1][cord])
|
||||
tur.pu()
|
||||
tur.pu()
|
||||
|
||||
tur = pturtle.pTurtle()
|
||||
tur.pu()
|
||||
|
||||
if shape == "triangle":
|
||||
sides = 3
|
||||
mapshape(sides, sl, sc, sp)
|
||||
drawshape(cords)
|
||||
elif shape == "square":
|
||||
sides = 4
|
||||
mapshape(sides, sl, sc, sp)
|
||||
drawshape(cords)
|
||||
elif shape == "pentagon":
|
||||
sides = 5
|
||||
mapshape(sides, sl, sc, sp)
|
||||
drawshape(cords)
|
||||
elif shape == "hexagon":
|
||||
sides = 6
|
||||
mapshape(sides, sl, sc, sp)
|
||||
drawshape(cords)
|
||||
elif shape == "septagon":
|
||||
sides = 7
|
||||
mapshape(sides, sl, sc, sp)
|
||||
drawshape(cords)
|
||||
elif shape == "octagon":
|
||||
sides = 8
|
||||
mapshape(sides, sl, sc, sp)
|
||||
drawshape(cords)
|
||||
|
||||
style = inkex.Style({
|
||||
'stroke-linejoin': 'miter', 'stroke-width': str(self.svg.unittouu('1px')),
|
||||
'stroke-opacity': '1.0', 'fill-opacity': '1.0',
|
||||
'stroke': '#000000', 'stroke-linecap': 'butt',
|
||||
'fill': 'none'
|
||||
})
|
||||
return inkex.PathElement(d=tur.getPath(), style=str(style))
|
||||
|
||||
if __name__ == "__main__":
|
||||
Parabola2().run()
|
Reference in New Issue
Block a user