diff options
| author | Alexandre Prokoudine <alexandre.prokoudine@gmail.com> | 2008-11-27 22:23:28 +0000 |
|---|---|---|
| committer | prokoudine <prokoudine@users.sourceforge.net> | 2008-11-27 22:23:28 +0000 |
| commit | e444be0400c06905c5daeb22227e215635e8ccab (patch) | |
| tree | 23403f30078740aee8a7ce18ff2874a4fab5598d | |
| parent | small 2geomification of clone tile dialog (diff) | |
| download | inkscape-e444be0400c06905c5daeb22227e215635e8ccab.tar.gz inkscape-e444be0400c06905c5daeb22227e215635e8ccab.zip | |
new version of Guides Creator extension from Jonas Termeau
(bzr r6912)
| -rw-r--r-- | share/extensions/guides_creator.inx | 9 | ||||
| -rwxr-xr-x | share/extensions/guides_creator.py | 167 |
2 files changed, 134 insertions, 42 deletions
diff --git a/share/extensions/guides_creator.inx b/share/extensions/guides_creator.inx index 24aebab67..1ec0a6584 100644 --- a/share/extensions/guides_creator.inx +++ b/share/extensions/guides_creator.inx @@ -4,7 +4,12 @@ <id>org.inkscape.effect.guidescreator</id> <dependency type="executable" location="extensions">guides_creator.py</dependency> <dependency type="executable" location="extensions">inkex.py</dependency> - <param name="vertical_guides" type="optiongroup" appearance="minimal" _gui-text="Vertical guides each"> + <param name="preset" type="optiongroup" appearance="minimal" _gui-text="Preset"> + <_option value="custom">Custom...</_option> + <_option value="golden">Golden ratio</_option> + <_option value="3;3">Rule-of-third</_option> + </param> + <param name="vertical_guides" type="optiongroup" appearance="minimal" _gui-text="Vertical guide each"> <_option value="0">None</_option> <_option value="2">1/2</_option> <_option value="3">1/3</_option>
@@ -16,7 +21,7 @@ <_option value="9">1/9</_option> <_option value="10">1/10</_option> </param> - <param name="horizontal_guides" type="optiongroup" appearance="minimal" _gui-text="Horizontal guides each"> + <param name="horizontal_guides" type="optiongroup" appearance="minimal" _gui-text="Horizontal guide each"> <_option value="0">None</_option> <_option value="2">1/2</_option> <_option value="3">1/3</_option>
diff --git a/share/extensions/guides_creator.py b/share/extensions/guides_creator.py index 2807089f3..45fae9352 100755 --- a/share/extensions/guides_creator.py +++ b/share/extensions/guides_creator.py @@ -1,8 +1,11 @@ #!/usr/bin/env python ''' -Guides Creator v1.0 (21/11/2008) +Guides Creator v2.0 (25/11/2008) +http://code.google.com/p/inkscape-guides-creator/ -Copyright (C) 2008 Jonas Termeau jonas.termeau **AT** gmail.com +Copyright (C) 2008 Jonas Termeau - jonas.termeau **AT** gmail.com + +Thanks to Bernard Gray - bernard.gray **AT** gmail.com ## This basic extension allows you to automatically draw guides in inkscape. @@ -28,8 +31,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # see also http://codespeak.net/lxml/dev/tutorial.html#namespaces for XML namespaces manipulation # # # # # # # # -# TODO: [v2.0] -# -implement vertical and horizontal golden number proportions (987/610) based guides +# TODO: See http://code.google.com/p/inkscape-guides-creator/wiki/Roadmap # # # # # # # # # @@ -47,7 +49,67 @@ from simplestyle import * from xml.etree import ElementTree as ET +# for golden number formulae +from math import sqrt + +# for printing debugging output +import gettext +_ = gettext.gettext + +def printDebug(string): + inkex.errormsg(_(string)) + +def drawVerticalGuides(division,w,h,edges,parent): + if (division > 0): + if (edges): + var = 1 + else: + var = 0 + + for v in range(0,division-1+2*var): + # setting up the guide's attributes (id is generated automatically) + position = str(round((w / division) + (v - var) * (w / division),4)) + ",0" + orientation = str(round(h,4)) + ",0" + + createGuide(position,orientation,parent) + +def drawHorizontalGuides(division,w,h,edges,parent): + if (division > 0): + if (edges): + var = 1 + else: + var = 0 + + for x in range(0,division-1+2*var): + # setting up the guide's attributes (id is generated automatically) + position = "0," + str(round((h / division) + (x - var) * (h / division),4)) + orientation = "0," + str(round(w,4)) + + createGuide(position,orientation,parent) +def createGuide(position,orientation,parent): + # Create a sodipodi:guide node + # (look into inkex's namespaces to find 'sodipodi' value in order to make a "sodipodi:guide" tag) + # see NSS array in file inkex.py for the other namespaces + inkex.etree.SubElement(parent,'{http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd}guide',{'position':position,'orientation':orientation}) + +def getVerticalDivisionsFromPreset(preset): + # take a "string1;string2" preset + # and return "string1" + + str_array = preset.split(';') + result = int(str_array[0]) + + return result + +def getHorizontalDivisionsFromPreset(preset): + # take a "string1;string2" preset + # and return "string2" + + str_array = preset.split(';') + result = int(str_array[1]) + + return result class Guides_Creator(inkex.Effect): @@ -58,29 +120,36 @@ class Guides_Creator(inkex.Effect): """ # Call the base class constructor. inkex.Effect.__init__(self) - # Define string option "--vertical_guides" with default value 0. + + # Define string option "--preset" with default value 'custom'. + self.OptionParser.add_option('--preset', + action = 'store',type = 'string', + dest = 'preset',default = 'custom', + help = 'Preset') + + # Define string option "--vertical_guides" with default value '0'. self.OptionParser.add_option('--vertical_guides', action = 'store',type = 'string', dest = 'vertical_guides',default = 0, help = 'Vertical guides each:') - # Define string option "--horizontal_guides" with default value 0. + # Define string option "--horizontal_guides" with default value '0'. self.OptionParser.add_option('--horizontal_guides', action = 'store',type = 'string', dest = 'horizontal_guides',default = 0, help = 'Horizontal guides each:') - # Define string option "--delete_existing_guides" with default value 0. - self.OptionParser.add_option('--delete_existing_guides', - action = 'store',type = 'inkbool', - dest = 'delete_existing_guides',default = False, - help = 'Delete existing guides') - - # Define string option "--start_from_edges" with default value 0. + # Define string option "--start_from_edges" with default value False. self.OptionParser.add_option('--start_from_edges', action = 'store',type = 'inkbool', dest = 'start_from_edges',default = False, help = 'Start from edges') + + # Define string option "--delete_existing_guides" with default value False. + self.OptionParser.add_option('--delete_existing_guides', + action = 'store',type = 'inkbool', + dest = 'delete_existing_guides',default = False, + help = 'Delete existing guides') def effect(self): @@ -89,6 +158,7 @@ class Guides_Creator(inkex.Effect): delete_existing = self.options.delete_existing_guides h_division = int(self.options.horizontal_guides) v_division = int(self.options.vertical_guides) + preset = self.options.preset # Get access to main SVG document element and get its dimensions. svg = self.document.getroot() @@ -108,35 +178,52 @@ class Guides_Creator(inkex.Effect): for element in children: nv.remove(element) - if (from_edges): - var = 1 - else: - var = 0 - - # creating vertical guides - if (v_division > 0): - for v in range(0,v_division-1+2*var): - # setting up the guide's attributes (id is generated automatically) - position = str(round((width / v_division) + (v - var) * (width / v_division),4)) + ",0" - orientation = str(round(height,4)) + ",0" - - # Create a sodipodi:guide node - # (look into inkex's namespaces to find 'sodipodi' value in order to make a "sodipodi:guide" tag) - # see NSS array in file inkex.py for the other namespaces - inkex.etree.SubElement(nv,'{http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd}guide',{'position':position,'orientation':orientation}) - - # creating horizontal guides - if (h_division > 0): - for h in range(0,h_division-1+2*var): - # setting up the guide's attributes (id is generated automatically) - position = "0," + str(round((height / h_division) + (h - var) * (height / h_division),4)) - orientation = "0," + str(round(width,4)) + if (preset == 'custom'): + + # creating vertical guides + drawVerticalGuides(v_division,width,height,from_edges,nv) - # Create a sodipodi:guide node - # (look into inkex's namespaces to find 'sodipodi' value in order to make a "sodipodi:guide" tag) - # see NSS array in file inkex.py for the other namespaces - inkex.etree.SubElement(nv,'{http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd}guide',{'position':position,'orientation':orientation}) + # creating horizontal guides + drawHorizontalGuides(h_division,width,height,from_edges,nv) + elif (preset == 'golden'): + + gold = (1 + sqrt(5)) / 2 + + # horizontal golden guides + position1 = '0,' + str(height / gold) + position2 = '0,'+ str(height - (height / gold)) + h_orientation = '0,' + str(round(width,4)) + + createGuide(position1,h_orientation,nv) + createGuide(position2,h_orientation,nv) + + # vertical golden guides + position1 = str(width / gold) + ',0' + position2 = str(width - (width / gold)) + ',0' + v_orientation = str(round(height,4)) + ',0' + + createGuide(position1,v_orientation,nv) + createGuide(position2,v_orientation,nv) + + if (from_edges): + # horizontal borders + createGuide('0,' + str(height),h_orientation,nv) + createGuide(str(height) + ',0',h_orientation,nv) + + # horizontal borders + createGuide('0,' + str(width),v_orientation,nv) + createGuide(str(width) + ',0',v_orientation,nv) + + + else: + + v_division = getVerticalDivisionsFromPreset(preset) + h_division = getHorizontalDivisionsFromPreset(preset) + + drawVerticalGuides(v_division,width,height,from_edges,nv) + drawHorizontalGuides(h_division,width,height,from_edges,nv) + # Create effect instance and apply it. effect = Guides_Creator() effect.affect() |
