summaryrefslogtreecommitdiffstats
path: root/share/extensions/grid_isometric.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xshare/extensions/grid_isometric.py547
1 files changed, 547 insertions, 0 deletions
diff --git a/share/extensions/grid_isometric.py b/share/extensions/grid_isometric.py
new file mode 100755
index 0000000..fa16b69
--- /dev/null
+++ b/share/extensions/grid_isometric.py
@@ -0,0 +1,547 @@
+#!/usr/bin/env python
+# coding=utf-8
+#
+# Copyright (C) 2010 Jean-Luc JOULIN "JeanJouX" jean-luc.joulin@laposte.net
+#
+# 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 allow you to draw a isometric grid with inkscape
+There is some options including subdivision, subsubdivions and custom line width
+All elements are grouped with similar elements
+These grid are used for isometric view in mechanical drawing or piping schematic
+!!! Y Divisions can't be smaller than half the X Divions
+"""
+
+import inkex
+from inkex import Rectangle
+from inkex.paths import Move, Line
+
+
+def draw_line(x1, y1, x2, y2, width, name, parent):
+ elem = parent.add(inkex.PathElement())
+ elem.style = {"stroke": "#000000", "stroke-width": str(width), "fill": "none"}
+ elem.set("inkscape:label", name)
+ elem.path = [Move(x1, y1), Line(x2, y2)]
+
+
+def draw_rect(x, y, w, h, width, fill, name):
+ elem = Rectangle(x=str(x), y=str(y), width=str(w), height=str(h))
+ elem.style = {"stroke": "#000000", "stroke-width": str(width), "fill": fill}
+ elem.set("inkscape:label", name)
+ return elem
+
+
+class GridIsometric(inkex.GenerateExtension):
+ def add_arguments(self, pars):
+ pars.add_argument(
+ "--x_divs", type=int, dest="x_divs", default=5, help="Major X Divisions"
+ )
+ pars.add_argument(
+ "--y_divs", type=int, dest="y_divs", default=5, help="Major Y Divisions"
+ )
+ pars.add_argument(
+ "--dx", type=float, dest="dx", default=50.0, help="Major X division Spacing"
+ )
+ pars.add_argument(
+ "--subdivs",
+ type=int,
+ dest="subdivs",
+ default=2,
+ help="Subdivisions per Major X division",
+ )
+ pars.add_argument(
+ "--subsubdivs",
+ type=int,
+ dest="subsubdivs",
+ default=5,
+ help="Subsubdivisions per Minor X division",
+ )
+ pars.add_argument(
+ "--divs_th",
+ type=float,
+ dest="divs_th",
+ default=2,
+ help="Major X Division Line thickness",
+ )
+ pars.add_argument(
+ "--subdivs_th",
+ type=float,
+ dest="subdivs_th",
+ default=0.5,
+ help="Minor X Division Line thickness",
+ )
+ pars.add_argument(
+ "--subsubdivs_th",
+ type=float,
+ dest="subsubdivs_th",
+ default=0.1,
+ help="Subminor X Division Line thickness",
+ )
+ pars.add_argument(
+ "--border_th",
+ type=float,
+ dest="border_th",
+ default=3,
+ help="Border Line thickness",
+ )
+
+ @property
+ def container_label(self):
+ """Generate label from options"""
+ return "Grid_Polar:X{0.x_divs}:Y{0.y_divs}".format(
+ self.options
+ ) # pylint: disable=missing-format-attribute
+
+ def generate(self):
+ self.options.dx = self.svg.unittouu(str(self.options.dx) + "px")
+ self.options.divs_th = self.svg.unittouu(str(self.options.divs_th) + "px")
+ self.options.subdivs_th = self.svg.unittouu(str(self.options.subdivs_th) + "px")
+ self.options.subsubdivs_th = self.svg.unittouu(
+ str(self.options.subsubdivs_th) + "px"
+ )
+ self.options.border_th = self.svg.unittouu(str(self.options.border_th) + "px")
+
+ # Can't generate a grid too flat
+ # If the Y dimension is smallest than half the X dimension, fix it.
+ if self.options.y_divs < ((self.options.x_divs + 1) / 2):
+ self.options.y_divs = int((self.options.x_divs + 1) / 2)
+
+ # Find the pixel dimensions of the overall grid
+ xmax = self.options.dx * (2 * self.options.x_divs)
+ ymax = self.options.dx * (2 * self.options.y_divs) / 0.866025
+
+ # Group for major x gridlines
+ majglx = inkex.Group.new("MajorXGridlines")
+ yield majglx
+
+ # Group for major y gridlines
+ majgly = inkex.Group.new("MajorYGridlines")
+ yield majgly
+
+ # Group for major z gridlines
+ majglz = inkex.Group.new("MajorZGridlines")
+ yield majglz
+
+ # Group for minor x gridlines
+ if self.options.subdivs > 1: # if there are any minor x gridlines
+ minglx = inkex.Group.new("MinorXGridlines")
+ yield minglx
+ # Group for subminor x gridlines, if there are any minor minor x gridlines
+ if self.options.subsubdivs > 1:
+ mminglx = inkex.Group.new("SubMinorXGridlines")
+ yield mminglx
+ # Group for minor y gridlines, if there are any minor y gridlines
+ if self.options.subdivs > 1:
+ mingly = inkex.Group.new("MinorYGridlines")
+ yield mingly
+ # Group for subminor y gridlines, if there are any minor minor x gridlines
+ if self.options.subsubdivs > 1:
+ mmingly = inkex.Group.new("SubMinorYGridlines")
+ yield mmingly
+ # Group for minor z gridlines, if there are any minor y gridlines
+ if self.options.subdivs > 1:
+ minglz = inkex.Group.new("MinorZGridlines")
+ yield minglz
+ # Group for subminor z gridlines, if there are any minor minor x gridlines
+ if self.options.subsubdivs > 1:
+ mminglz = inkex.Group.new("SubMinorZGridlines")
+ yield mminglz
+
+ # Border of grid
+ yield draw_rect(0, 0, xmax, ymax, self.options.border_th, "none", "Border")
+
+ # X DIVISION
+ # Shortcuts for divisions
+ sd = self.options.subdivs
+ ssd = self.options.subsubdivs
+
+ # Initializing variable
+ cpt_div = 0
+ cpt_subdiv = 0
+ cpt_subsubdiv = 0
+ com_div = 0
+ com_subdiv = 0
+ com_subsubdiv = 0
+
+ for i in range(1, (2 * self.options.x_divs * sd * ssd)):
+ cpt_subsubdiv += 1
+ com_subsubdiv = 1
+ if cpt_subsubdiv == self.options.subsubdivs:
+ cpt_subsubdiv = 0
+ cpt_subdiv += 1
+ com_subsubdiv = 0
+ com_subdiv = 1
+ com_div = 0
+
+ if cpt_subdiv == self.options.subdivs:
+ cpt_subdiv = 0
+ com_subsubdiv = 0
+ com_subdiv = 0
+ com_div = 1
+
+ if com_subsubdiv == 1:
+ draw_line(
+ self.options.dx * i / sd / ssd,
+ 0,
+ self.options.dx * i / sd / ssd,
+ ymax,
+ self.options.subsubdivs_th,
+ "MajorXDiv" + str(i),
+ mminglx,
+ )
+ if com_subdiv == 1:
+ com_subdiv = 0
+ draw_line(
+ self.options.dx * i / sd / ssd,
+ 0,
+ self.options.dx * i / sd / ssd,
+ ymax,
+ self.options.subdivs_th,
+ "MajorXDiv" + str(i),
+ minglx,
+ )
+ if com_div == 1:
+ com_div = 0
+ draw_line(
+ self.options.dx * i / sd / ssd,
+ 0,
+ self.options.dx * i / sd / ssd,
+ ymax,
+ self.options.divs_th,
+ "MajorXDiv" + str(i),
+ majglx,
+ )
+
+ # Y DIVISIONS
+ # Shortcuts for divisions
+ sd = self.options.subdivs
+ ssd = self.options.subsubdivs
+
+ taille = self.options.dx / sd / ssd # Size of unity
+ nb_ligne = (
+ (self.options.x_divs + self.options.y_divs)
+ * self.options.subdivs
+ * self.options.subsubdivs
+ ) # Global number of lines
+ nb_ligne_x = (
+ self.options.x_divs * self.options.subdivs * self.options.subsubdivs
+ ) # Number of lines X
+ nb_ligne_y = (
+ self.options.y_divs * self.options.subdivs * self.options.subsubdivs
+ ) # Number of lines Y
+
+ # Initializing variable
+ cpt_div = 0
+ cpt_subdiv = 0
+ cpt_subsubdiv = 0
+ com_div = 0
+ com_subdiv = 0
+ com_subsubdiv = 0
+
+ for l in range(1, int(nb_ligne * 4)):
+ cpt_subsubdiv += 1
+ com_subsubdiv = 1
+ if cpt_subsubdiv == self.options.subsubdivs:
+ cpt_subsubdiv = 0
+ cpt_subdiv += 1
+ com_subsubdiv = 0
+ com_subdiv = 1
+ com_div = 0
+
+ if cpt_subdiv == self.options.subdivs:
+ cpt_subdiv = 0
+ com_subsubdiv = 0
+ com_subdiv = 0
+ com_div = 1
+
+ if ((2 * l) - 1) < (2 * nb_ligne_x):
+ txa = taille * ((2 * l) - 1)
+ tya = ymax
+ txb = 0
+ tyb = ymax - taille / (2 * 0.866025) - (taille * (l - 1) / 0.866025)
+
+ if com_subsubdiv == 1:
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.subsubdivs_th,
+ "MajorYDiv" + str(i),
+ mmingly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.subsubdivs_th,
+ "MajorZDiv" + str(l),
+ mminglz,
+ )
+ if com_subdiv == 1:
+ com_subdiv = 0
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.subdivs_th,
+ "MajorYDiv" + str(i),
+ mingly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.subdivs_th,
+ "MajorZDiv" + str(l),
+ minglz,
+ )
+ if com_div == 1:
+ com_div = 0
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.divs_th,
+ "MajorYDiv" + str(i),
+ majgly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.divs_th,
+ "MajorZDiv" + str(l),
+ majglz,
+ )
+
+ if ((2 * l) - 1) == (2 * nb_ligne_x):
+ txa = taille * ((2 * l) - 1)
+ tya = ymax
+ txb = 0
+ tyb = ymax - taille / (2 * 0.866025) - (taille * (l - 1) / 0.866025)
+
+ if com_subsubdiv == 1:
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.subsubdivs_th,
+ "MajorYDiv" + str(i),
+ mmingly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.subsubdivs_th,
+ "MajorZDiv" + str(l),
+ mminglz,
+ )
+ if com_subdiv == 1:
+ com_subdiv = 0
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.subdivs_th,
+ "MajorYDiv" + str(i),
+ mingly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.subdivs_th,
+ "MajorZDiv" + str(l),
+ minglz,
+ )
+ if com_div == 1:
+ com_div = 0
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.divs_th,
+ "MajorYDiv" + str(i),
+ majgly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.divs_th,
+ "MajorZDiv" + str(l),
+ majglz,
+ )
+
+ if ((2 * l) - 1) > (2 * nb_ligne_x):
+ txa = xmax
+ tya = (
+ ymax
+ - taille / (2 * 0.866025)
+ - (taille * (l - 1 - ((2 * nb_ligne_x) / 2)) / 0.866025)
+ )
+ txb = 0
+ tyb = ymax - taille / (2 * 0.866025) - (taille * (l - 1) / 0.866025)
+
+ if tyb <= 0:
+ txa = xmax
+ tya = (
+ ymax
+ - taille / (2 * 0.866025)
+ - (taille * (l - 1 - ((2 * nb_ligne_x) / 2)) / 0.866025)
+ )
+ txb = taille * (2 * (l - (2 * nb_ligne_y)) - 1)
+ tyb = 0
+
+ if txb < xmax:
+ if com_subsubdiv == 1:
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.subsubdivs_th,
+ "MajorYDiv" + str(i),
+ mmingly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.subsubdivs_th,
+ "MajorZDiv" + str(l),
+ mminglz,
+ )
+ if com_subdiv == 1:
+ com_subdiv = 0
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.subdivs_th,
+ "MajorYDiv" + str(i),
+ mingly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.subdivs_th,
+ "MajorZDiv" + str(l),
+ minglz,
+ )
+ if com_div == 1:
+ com_div = 0
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.divs_th,
+ "MajorYDiv" + str(i),
+ majgly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.divs_th,
+ "MajorZDiv" + str(l),
+ majglz,
+ )
+
+ else:
+ if txb < xmax:
+ if com_subsubdiv == 1:
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.subsubdivs_th,
+ "MajorYDiv" + str(i),
+ mmingly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.subsubdivs_th,
+ "MajorZDiv" + str(l),
+ mminglz,
+ )
+ if com_subdiv == 1:
+ com_subdiv = 0
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.subdivs_th,
+ "MajorYDiv" + str(i),
+ mingly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.subdivs_th,
+ "MajorZDiv" + str(l),
+ minglz,
+ )
+ if com_div == 1:
+ com_div = 0
+ draw_line(
+ txa,
+ tya,
+ txb,
+ tyb,
+ self.options.divs_th,
+ "MajorYDiv" + str(i),
+ majgly,
+ )
+ draw_line(
+ xmax - txa,
+ tya,
+ xmax - txb,
+ tyb,
+ self.options.divs_th,
+ "MajorZDiv" + str(l),
+ majglz,
+ )
+
+
+if __name__ == "__main__":
+ GridIsometric().run()