Added parabola extension
This commit is contained in:
parent
bb53681a4f
commit
2ab27300e0
37
extensions/fablabchemnitz/parabola.inx
Normal file
37
extensions/fablabchemnitz/parabola.inx
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
|
||||||
|
<name>Parabola</name>
|
||||||
|
<id>fablabchemnitz.de.parabola</id>
|
||||||
|
<param name="tab" type="notebook">
|
||||||
|
<page name="common" gui-text="Basic Options">
|
||||||
|
<param name="height" type="int" min="100" max="1000" gui-text="Shape Height:">120</param>
|
||||||
|
<param name="width" type="int" min="100" max="1000" gui-text="Shape Width:">120</param>
|
||||||
|
<param name="seg_count" type="int" min="5" max="100" gui-text="Number of Line Segments:">25</param>
|
||||||
|
<param name="shape" type="optiongroup" appearance="combo" gui-text="Choose a Shape:">
|
||||||
|
<option value="cross">Cross</option>
|
||||||
|
<option value="square">Square</option>
|
||||||
|
<option value="triangle">Triangle</option></param>
|
||||||
|
<label> </label>
|
||||||
|
<label> </label>
|
||||||
|
<label>v1.1.0</label>
|
||||||
|
</page>
|
||||||
|
<page name="corners" gui-text="Corners">
|
||||||
|
<param name="c1" type="bool" gui-text="Corner 1">true</param>
|
||||||
|
<param name="c2" type="bool" gui-text="Corner 2">true</param>
|
||||||
|
<param name="c3" type="bool" gui-text="Corner 3">true</param>
|
||||||
|
<param name="c4" type="bool" gui-text="Corner 4 *">true</param>
|
||||||
|
<label>* Corner 4 doesn't apply to the Triangle Shape</label>
|
||||||
|
</page>
|
||||||
|
</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.py</command>
|
||||||
|
</script>
|
||||||
|
</inkscape-extension>
|
240
extensions/fablabchemnitz/parabola.py
Normal file
240
extensions/fablabchemnitz/parabola.py
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# coding=utf-8
|
||||||
|
#
|
||||||
|
# 2/27/2021 - v.1.1.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.
|
||||||
|
"""
|
||||||
|
import inkex
|
||||||
|
|
||||||
|
from inkex import turtle as pturtle
|
||||||
|
|
||||||
|
class parabola(inkex.GenerateExtension):
|
||||||
|
container_label = 'Parabola'
|
||||||
|
def add_arguments(self, pars):
|
||||||
|
pars.add_argument("--height", type=int, default=300, help="Shape Height")
|
||||||
|
pars.add_argument("--width", type=int, default=300, help="Shape Width")
|
||||||
|
pars.add_argument("--seg_count", type=int, default=10, help="Number of line segments")
|
||||||
|
pars.add_argument("--shape", default="square")
|
||||||
|
pars.add_argument("--tab", default="common")
|
||||||
|
pars.add_argument("--c1", default="true")
|
||||||
|
pars.add_argument("--c2", default="false")
|
||||||
|
pars.add_argument("--c3", default="false")
|
||||||
|
pars.add_argument("--c4", default="false")
|
||||||
|
|
||||||
|
def generate(self):
|
||||||
|
# Let's simplify the variable names
|
||||||
|
ht = int(self.options.height)
|
||||||
|
wt = int(self.options.width)
|
||||||
|
sc = int(self.options.seg_count)
|
||||||
|
shape = self.options.shape
|
||||||
|
c1 = self.options.c1
|
||||||
|
c2 = self.options.c2
|
||||||
|
c3 = self.options.c3
|
||||||
|
c4 = self.options.c4
|
||||||
|
|
||||||
|
point = self.svg.namedview.center
|
||||||
|
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'
|
||||||
|
})
|
||||||
|
|
||||||
|
# Setting the amount to move across the horizontal and vertical
|
||||||
|
increaseht = (ht / sc)
|
||||||
|
increasewt = (wt / sc)
|
||||||
|
|
||||||
|
tur = pturtle.pTurtle()
|
||||||
|
|
||||||
|
tur.pu() # Pen up
|
||||||
|
tur.setpos(point) # start in the center
|
||||||
|
|
||||||
|
if shape == "cross":
|
||||||
|
# We draw the cross shape and store the 4 points
|
||||||
|
# Can this be looped?
|
||||||
|
# Should I store the coordinates in an array/list?
|
||||||
|
tur.forward((ht / 2))
|
||||||
|
toppoint = tur.getpos()
|
||||||
|
if c3 == 'true' or c4 == 'true':
|
||||||
|
tur.pd()
|
||||||
|
tur.backward((ht / 2))
|
||||||
|
tur.pu()
|
||||||
|
if c1 == 'true' or c2 == 'true':
|
||||||
|
tur.pd()
|
||||||
|
tur.backward((ht / 2))
|
||||||
|
bottompoint = tur.getpos()
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos(point)
|
||||||
|
tur.right(90)
|
||||||
|
tur.forward((wt / 2))
|
||||||
|
rightpoint = tur.getpos()
|
||||||
|
if c3 == 'true' or c2 == 'true':
|
||||||
|
tur.pd()
|
||||||
|
tur.backward((wt / 2))
|
||||||
|
tur.pu()
|
||||||
|
if c1 == 'true' or c4 == 'true':
|
||||||
|
tur.pd()
|
||||||
|
tur.backward((wt / 2))
|
||||||
|
leftpoint = tur.getpos()
|
||||||
|
|
||||||
|
while sc > 0:
|
||||||
|
if c1 == 'true':
|
||||||
|
# Drawing the SE Corner based on SW coordinates
|
||||||
|
# We always draw this corner
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((bottompoint[0], bottompoint[1] - ( (increaseht / 2) * sc ) ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos((bottompoint[0] + ( (increasewt / 2) * sc ), bottompoint[1] - (ht / 2) ))
|
||||||
|
|
||||||
|
if c2 == 'true': # Drawing the SW Corner based on SE Coordinates
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((bottompoint[0], bottompoint[1] - ( (increaseht / 2) * sc ) ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos((bottompoint[0] - ( (increasewt / 2) * sc ), bottompoint[1] - (ht / 2) ))
|
||||||
|
|
||||||
|
if c3 == 'true': # Drawing the NW Corner based on NE Coordinates
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((toppoint[0], toppoint[1] + ( (increaseht / 2) * sc ) ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos((toppoint[0] - ( (increasewt / 2) * sc ), toppoint[1] + (ht / 2) ))
|
||||||
|
|
||||||
|
if c4 == 'true': # Drawing the NE Corner based on NW Coordinates
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((toppoint[0], toppoint[1] + ( (increaseht / 2) * sc ) ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos((toppoint[0] + ( (increasewt / 2) * sc ), toppoint[1] + (ht / 2) ))
|
||||||
|
|
||||||
|
sc = sc - 1
|
||||||
|
|
||||||
|
if shape == "triangle":
|
||||||
|
# We draw the triangle and store the 3 corner points
|
||||||
|
# Loopable?
|
||||||
|
tur.backward((ht / 2))
|
||||||
|
tur.right(90)
|
||||||
|
tur.forward((wt /2))
|
||||||
|
cornera = tur.getpos()
|
||||||
|
if c3 == 'true' or c2 == 'true':
|
||||||
|
tur.pd()
|
||||||
|
tur.backward((wt))
|
||||||
|
cornerb = tur.getpos()
|
||||||
|
tur.pu()
|
||||||
|
if c2 == 'true' or c1 == 'true':
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos((point[0], (cornera[1] - ht) ))
|
||||||
|
cornerc = tur.getpos()
|
||||||
|
tur.pu()
|
||||||
|
if c1 == 'true' or c3 == 'true':
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos(cornera)
|
||||||
|
|
||||||
|
# So.. The math below took a lot of trial and error to figure out...
|
||||||
|
# I probably need to take some geography classes...
|
||||||
|
|
||||||
|
while sc > 0:
|
||||||
|
if c1 == 'true':
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos(( (cornerb[0] + ((increasewt / 2) * (sc)) - (wt / 2)), cornerb[1] + (increaseht * sc) - ht ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos(( (cornera[0] + (increasewt / 2) * (sc)), cornera[1] - (increaseht * sc) ))
|
||||||
|
|
||||||
|
if c2 == 'true':
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((cornerb[0] - (increasewt * sc ) , cornerb[1] ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos(( (cornerb[0] + ((increasewt / 2) * sc) - (wt / 2)), cornerb[1] + (increaseht * sc) - ht ))
|
||||||
|
|
||||||
|
if c3 == 'true':
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((cornera[0] + (increasewt * sc ) , cornera[1] ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos(( (cornera[0] - ((increasewt / 2) * sc) + (wt / 2)), cornera[1] + (increaseht * sc) - ht ))
|
||||||
|
|
||||||
|
sc = sc - 1
|
||||||
|
|
||||||
|
|
||||||
|
if shape == "square":
|
||||||
|
# We draw out the square shape and store the coordinates for each corner
|
||||||
|
# Can this be looped?
|
||||||
|
tur.right(90)
|
||||||
|
tur.forward((wt / 2))
|
||||||
|
tur.right(90)
|
||||||
|
tur.forward((ht / 2))
|
||||||
|
swcorner = tur.getpos()
|
||||||
|
if c4 == 'true' or c3 == 'true': # We only draw the 2 lines that are part of these corners
|
||||||
|
tur.pd() # Pen Down
|
||||||
|
tur.right(90)
|
||||||
|
tur.forward(wt)
|
||||||
|
secorner = tur.getpos()
|
||||||
|
tur.pu()
|
||||||
|
if c3 == 'true' or c2 == 'true': # We only draw the 2 lines that are part of these corners
|
||||||
|
tur.pd()
|
||||||
|
tur.right(90)
|
||||||
|
tur.forward(ht)
|
||||||
|
necorner = tur.getpos()
|
||||||
|
tur.pu()
|
||||||
|
if c1 == 'true' or c2 == 'true': # We only draw the 2 lines that are part of these corners
|
||||||
|
tur.pd()
|
||||||
|
tur.right(90)
|
||||||
|
tur.forward(wt)
|
||||||
|
nwcorner = tur.getpos()
|
||||||
|
tur.right(90)
|
||||||
|
tur.pu()
|
||||||
|
if c4 == 'true' or c1 == 'true': # We only draw the 2 lines that are part of these corners
|
||||||
|
tur.pd()
|
||||||
|
tur.forward(ht)
|
||||||
|
|
||||||
|
while sc > 0:
|
||||||
|
if c1 == 'true':
|
||||||
|
# Drawing the NW Corner based on SW coordinates
|
||||||
|
# We always draw this corner
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((swcorner[0], swcorner[1] - ( increaseht * sc ) ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos((swcorner[0] + ( increasewt * sc ), swcorner[1] - ht))
|
||||||
|
|
||||||
|
if c2 == 'true': # Drawing the NE Corner based on SE Coordinates
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((secorner[0], secorner[1] - ( increaseht * sc ) ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos((secorner[0] - ( increasewt * sc ), secorner[1] - ht))
|
||||||
|
|
||||||
|
if c3 == 'true': # Drawing the SE Corner based on NE Coordinates
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((necorner[0], necorner[1] + ( increaseht * sc ) ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos((necorner[0] - ( increasewt * sc ), necorner[1] + ht))
|
||||||
|
|
||||||
|
if c4 == 'true': # Drawing the SW Corner based on NW Coordinates
|
||||||
|
tur.pu()
|
||||||
|
tur.setpos((nwcorner[0], nwcorner[1] + ( increaseht * sc ) ))
|
||||||
|
tur.pd()
|
||||||
|
tur.setpos((nwcorner[0] + ( increasewt * sc ), nwcorner[1] + ht))
|
||||||
|
|
||||||
|
sc = sc - 1
|
||||||
|
|
||||||
|
return inkex.PathElement(d=tur.getPath(), style=str(style))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# execute only if run as a script
|
||||||
|
parabola().run()
|
Reference in New Issue
Block a user