summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-03-18 18:13:01 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-03-18 18:13:01 +0000
commit0d3d7f676b29f9d9a9cd53f08ced76e6588b856a (patch)
tree12a2646048750e49e7edee42046b8aa138207f2c /share
parentwarping into a layer (diff)
parentReplace sp_style_xxx functions with SPStyle member functions. (diff)
downloadinkscape-0d3d7f676b29f9d9a9cd53f08ced76e6588b856a.tar.gz
inkscape-0d3d7f676b29f9d9a9cd53f08ced76e6588b856a.zip
update to trunk
(bzr r13682.1.22)
Diffstat (limited to 'share')
-rw-r--r--share/extensions/Makefile.am6
-rw-r--r--share/extensions/dpiswitcher.inx29
-rw-r--r--share/extensions/dpiswitcher.py236
-rwxr-xr-xshare/extensions/inkex.py62
-rwxr-xr-xshare/extensions/jessyInk.js13
-rwxr-xr-xshare/extensions/measure.py7
-rw-r--r--share/markers/markers.svg7
-rw-r--r--share/symbols/MapSymbolsNPS.svg5
-rw-r--r--share/ui/units.xml16
9 files changed, 84 insertions, 297 deletions
diff --git a/share/extensions/Makefile.am b/share/extensions/Makefile.am
index d9d56a362..130ed6e40 100644
--- a/share/extensions/Makefile.am
+++ b/share/extensions/Makefile.am
@@ -13,7 +13,11 @@ otherstuffdir = $(datadir)/inkscape/extensions
moduledir = $(datadir)/inkscape/extensions
-extension_SCRIPTS = $(wildcard $(srcdir)/*.py)
+extension_SCRIPTS = \
+ $(wildcard $(srcdir)/*.py) \
+ $(wildcard $(srcdir)/*.pl) \
+ $(wildcard $(srcdir)/*.sh) \
+ $(wildcard $(srcdir)/*.rb)
otherstuff_DATA = \
fontfix.conf \
diff --git a/share/extensions/dpiswitcher.inx b/share/extensions/dpiswitcher.inx
deleted file mode 100644
index a4f487c97..000000000
--- a/share/extensions/dpiswitcher.inx
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
- <inkscape-extension xmlns=
- "http://www.inkscape.org/namespace/inkscape/extension">
- <_name>DPI Switcher</_name>
- <id>org.inkscape.dpiswitcher</id>
- <dependency type="executable" location="extensions">dpiswitcher.py</dependency>
- <dependency type="executable" location="extensions">inkex.py</dependency>
- <param name="action" type="notebook">
- <page name="dpi_swicher" _gui-text="Switch DPI">
- <param name="switcher" type="enum" _gui-text="Type of convert:">
- <_item value="0">DPI Switch from 90 to 96</_item>
- <_item value="1">DPI Switch from 96 to 90</_item>
- </param>
- </page>
- <page name="page_info" _gui-text="Show page info">
- <_param name="d" type="description">Choose this tab if you would like to see page info previously to apply DPI Switcher.</_param>
- </page>
- </param>
-
- <effect needs-live-preview="false" needs-document="no">
- <object-type>all</object-type>
- <effects-menu>
- <submenu _name="Document"/>
- </effects-menu>
- </effect>
- <script>
- <command reldir="extensions" interpreter="python">dpiswitcher.py</command>
- </script>
-</inkscape-extension>
diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py
deleted file mode 100644
index b110c259f..000000000
--- a/share/extensions/dpiswitcher.py
+++ /dev/null
@@ -1,236 +0,0 @@
-#!/usr/bin/env python
-'''
-This extension scale or reduce a document to fit diferent SVG DPI -90/96-
-
-Copyright (C) 2012 Jabiertxo Arraiza, jabier.arraiza@marker.es
-
-Version 0.4 - DPI Switcher
-
-TODO:
-Comment Better!!!
-
-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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-'''
-
-import inkex, sys, re, string
-from lxml import etree
-
-class DPISwitcher(inkex.Effect):
-
- def __init__(self):
- inkex.Effect.__init__(self)
- self.OptionParser.add_option("--switcher", action="store",
- type="string", dest="switcher", default="0",
- help="Select the DPI switch you want")
- self.OptionParser.add_option("--action", action="store",
- type="string", dest="action",
- default=None, help="")
- self.factor = 90.0/96.0
- self.units = "px"
- self.unitExponent = 1.0
-
- def scaleRoot(self, svg):
- widthNumber = re.sub("[a-zA-Z]", "", svg.get('width'))
- heightNumber = re.sub("[a-zA-Z]", "", svg.get('height'))
- if svg.get('viewBox'):
- widthNumber = svg.get('viewBox').split(" ")[2]
- heightNumber = svg.get('viewBox').split(" ")[3]
- widthDoc = str(float(widthNumber) * self.factor * self.unitExponent)
- heightDoc = str(float(heightNumber) * self.factor * self.unitExponent)
- if svg.get('height'):
- svg.set('height', heightDoc)
- if svg.get('width'):
- svg.set('width', widthDoc)
- svg.set('viewBox',"0 0 " + widthDoc + " " + heightDoc)
- self.scaleGuides(svg)
- self.scaleGrid(svg)
- if self.options.switcher == "1":
- self.factor = self.factor * self.unitExponent
- xpathStr = '//svg:rect | //svg:image | //svg:path | //svg:circle | //svg:ellipse | //svg:text'
- elements = svg.xpath(xpathStr, namespaces=inkex.NSS)
- for element in elements:
- box3DSide = element.get(inkex.addNS('box3dsidetype', 'inkscape'))
- if box3DSide:
- continue
- if element.get('transform'):
- if "matrix" in str(element.get('transform')):
- result = re.sub(r".*?matrix( \(|\()(.*?)\)", self.matrixElement, str(element.get('transform')))
- element.set('transform', result)
- if "scale" in str(element.get('transform')):
- result = re.sub(r".*?scale( \(|\()(.*?)\)", self.scaleElement, str(element.get('transform')))
- element.set('transform', result)
- if "translate" in str(element.get('transform')):
- result = re.sub(r".*?translate( \(|\()(.*?)\)", self.translateElement, str(element.get('transform')))
- element.set('transform', result)
- if "skew" in str(element.get('transform')):
- result = re.sub(r".*?skew( \(|\()(.*?)\)", self.skewElement, str(element.get('transform')))
- element.set('transform', result)
- if "scale" not in str(element.get('transform')) and "matrix" not in str(element.get('transform')):
- element.set('transform', str(element.get('transform')) + "scale(" + str(self.factor) + ", " + str(self.factor) + ")")
- else:
- element.set('transform', "scale(" + str(self.factor) + ", " + str(self.factor) + ")")
- xpathStr = '//svg:g'
- elements = svg.xpath(xpathStr, namespaces=inkex.NSS)
- for element in elements:
- if element.get('transform'):
- if "matrix" in str(element.get('transform')):
- result = re.sub(r".*?matrix( \(|\()(.*?)\)", self.matrixGroupElement, str(element.get('transform')))
- element.set('transform', result)
- if "translate" in str(element.get('transform')):
- result = re.sub(r".*?translate( \(|\()(.*?)\)", self.translateElement, str(element.get('transform')))
- element.set('transform', result)
- if "skew" in str(element.get('transform')):
- result = re.sub(r".*?skew( \(|\()(.*?)\)", self.skewElement, str(element.get('transform')))
- element.set('transform', result)
-
- def scaleGuides(self, svg):
- xpathStr = '//sodipodi:guide'
- guides = svg.xpath(xpathStr, namespaces=inkex.NSS)
- for guide in guides:
- point = string.split(guide.get("position"), ",")
- guide.set("position", str(float(point[0].strip()) * self.factor ) + "," + str(float(point[1].strip()) * self.factor ))
-
- def scaleGrid(self, svg):
- xpathStr = '//inkscape:grid'
- grids = svg.xpath(xpathStr, namespaces=inkex.NSS)
- for grid in grids:
- if self.options.switcher == "0":
- self.unitExponent = 1.0/(self.factor/self.__uuconv[grid.get("units")])
- self.factor = self.factor * self.unitExponent
- grid.set("units", "px")
- if grid.get("spacingx"):
- spacingx = str(float(re.sub("[a-zA-Z]", "", grid.get("spacingx"))) * self.factor) + "px"
- grid.set("spacingx", str(spacingx))
- if grid.get("spacingy"):
- spacingy = str(float(re.sub("[a-zA-Z]", "", grid.get("spacingy"))) * self.factor) + "px"
- grid.set("spacingy", str(spacingy))
- if grid.get("originx"):
- originx = str(float(re.sub("[a-zA-Z]", "", grid.get("originx"))) * self.factor) + "px"
- grid.set("originx", str(originx))
- if grid.get("originy"):
- originy = str(float(re.sub("[a-zA-Z]", "", grid.get("originy"))) * self.factor) + "px"
- grid.set("originy", str(originy))
-
- #a dictionary of unit to user unit conversion factors
- __uuconv = {'in':96.0, 'pt':1.33333333333, 'px':1.0, 'mm':3.77952755913, 'cm':37.7952755913,
- 'm':3779.52755913, 'km':3779527.55913, 'pc':16.0, 'yd':3456.0 , 'ft':1152.0}
-
- __uuconvLegazy = {'in':90.0, 'pt':1.25, 'px':1, 'mm':3.5433070866, 'cm':35.433070866, 'm':3543.3070866,
- 'km':3543307.0866, 'pc':15.0, 'yd':3240 , 'ft':1080}
-
- def scaleElement(self, m):
- scaleVal = m.group(2).replace(" ","")
- total = scaleVal.count(',')
- if total == 1:
- scaleVal = scaleVal.split(",")
- return "scale(" + str(float(scaleVal[0]) * self.factor) + "," + str(float(scaleVal[1]) * self.factor) + ")"
- else:
- return "scale(" + str(float(scaleVal) * self.factor) + ")"
-
-
- def translateElement(self, m):
- translateVal = m.group(2).replace(" ","")
- total = translateVal.count(',')
- if total == 1:
- translateVal = translateVal.split(",")
- return "translate(" + str(float(translateVal[0]) * self.factor) + "," + str(float(translateVal[1]) * self.factor) + ")"
- else:
- return "translate(" + str(float(translateVal) * self.factor) + ")"
-
- def skewElement(self, m):
- skeweVal = m.group(2).replace(" ","")
- total = skewVal.count(',')
- if total == 1:
- skeweVal = skewVal.split(",")
- return "skew(" + str(float(skewVal[0]) * self.factor) + "," + str(float(skewVal[1]) * self.factor) + ")"
- else:
- return "skew(" + str(float(skewVal) * self.factor) + ")"
-
- def matrixElement(self, m):
- matrixVal = m.group(2).replace(" ","")
- total = matrixVal.count(',')
- matrixVal = matrixVal.split(",")
- if total > 2:
- return "matrix(" + str(float(matrixVal[0]) * self.factor) + "," + str(float(matrixVal[1]) * self.factor) + "," + str(float(matrixVal[2]) * self.factor) + "," + str(float(matrixVal[3]) * self.factor) + "," + str(float(matrixVal[4]) * self.factor) + "," + str(float(matrixVal[5]) * self.factor) + ")"
- else:
- return "matrix(" + str(float(matrixVal[0]) * self.factor) + "," + str(float(matrixVal[1]) * self.factor) + "," + str(float(matrixVal[2]) * self.factor) + ")"
-
- def matrixGroupElement(self, m):
- matrixVal = m.group(2).replace(" ","")
- total = matrixVal.count(',')
- matrixVal = matrixVal.split(",")
- if total > 2:
- return "matrix(" + matrixVal[0] + "," + str(float(matrixVal[1]) * self.factor) + "," + matrixVal[2] + "," + str(float(matrixVal[3]) * self.factor) + "," + str(float(matrixVal[4]) * self.factor) + "," + str(float(matrixVal[5]) * self.factor) + ")"
- else:
- return "matrix(" + matrixVal[0] + "," + str(float(matrixVal[1]) * self.factor) + "," + str(float(matrixVal[2]) * self.factor) + ")"
-
- def effect(self):
- action = self.options.action.strip("\"") # TODO Is this a bug? (Extra " characters)
- saveout = sys.stdout
- sys.stdout = sys.stderr
- svg = self.document.getroot()
- if action == "page_info":
- print ":::SVG document related info:::"
- width = svg.get('width')
- if width:
- print "width: " + width
- height = svg.get('height')
- if height:
- print "height: " + height
- viewBox = svg.get('viewBox')
- if viewBox:
- print "viewBox: " + viewBox
- namedview = svg.find(inkex.addNS('namedview', 'sodipodi'))
- docunits= namedview.get(inkex.addNS('document-units', 'inkscape'))
- if docunits:
- print "document-units: " + docunits
- units = namedview.get('units')
- if units:
- print "units: " + units
- xpathStr = '//sodipodi:guide'
- guides = svg.xpath(xpathStr, namespaces=inkex.NSS)
- xpathStr = '//inkscape:grid'
- if guides:
- numberGuides = len(guides)
- print "Document has " + str(numberGuides) + " guides"
- grids = svg.xpath(xpathStr, namespaces=inkex.NSS)
- i = 1
- for grid in grids:
- print "Grid number " + str(i) + ": Units: " + grid.get("units")
- i = i+1
- else:
- if self.options.switcher == "0":
- self.factor = 96.0/90.0
- namedview = svg.find(inkex.addNS('namedview', 'sodipodi'))
- namedview.set(inkex.addNS('document-units', 'inkscape'), "px")
- self.units = re.sub("[0-9]*\.?[0-9]", "", svg.get('width'))
- if self.units and self.units <> "px":
- if self.options.switcher == "0":
- self.unitExponent = 1.0/(self.factor/self.__uuconv[self.units])
- else:
- self.unitExponent = 1.0/(self.factor/self.__uuconvLegazy[self.units])
- '''
- else:
- self.scaleGuides(svg)
- self.unitExponent = 1.0
- self.scaleGrid(svg)
- sys.stdout = saveout
- return
- '''
- self.scaleRoot(svg);
- sys.stdout = saveout
-
-effect = DPISwitcher()
-effect.affect()
diff --git a/share/extensions/inkex.py b/share/extensions/inkex.py
index 0f880005d..19e860b9a 100755
--- a/share/extensions/inkex.py
+++ b/share/extensions/inkex.py
@@ -101,6 +101,13 @@ def errormsg(msg):
else:
sys.stderr.write((unicode(msg, "utf-8", errors='replace') + "\n").encode("UTF-8"))
+def are_near_relative(a, b, eps):
+ if (a-b <= a*eps) and (a-b >= -a*eps):
+ return True
+ else:
+ return False
+
+
# third party library
try:
from lxml import etree
@@ -277,16 +284,57 @@ class Effect:
retval = None
return retval
- def getDocumentUnit(self):
- docunit = self.document.xpath('//sodipodi:namedview/@inkscape:document-units', namespaces=NSS)
- if docunit:
- return docunit[0]
- else:
- return 'px'
-
#a dictionary of unit to user unit conversion factors
__uuconv = {'in':96.0, 'pt':1.33333333333, 'px':1.0, 'mm':3.77952755913, 'cm':37.7952755913,
'm':3779.52755913, 'km':3779527.55913, 'pc':16.0, 'yd':3456.0 , 'ft':1152.0}
+
+ # Function returns the unit used for the values in SVG.
+ # For lack of an attribute in SVG that explicitly defines what units are used for SVG coordinates,
+ # try to calculate the unit from the SVG width and SVG viewbox.
+ # Defaults to 'px' units.
+ def getDocumentUnit(self):
+ svgunit = 'px' #default to pixels
+
+ svgwidth = self.document.getroot().get('width')
+ viewboxstr = self.document.getroot().get('viewBox')
+ if viewboxstr:
+ unitmatch = re.compile('(%s)$' % '|'.join(self.__uuconv.keys()))
+ param = re.compile(r'(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)')
+
+ p = param.match(svgwidth)
+ u = unitmatch.search(svgwidth)
+
+ width = 100 #default
+ viewboxwidth = 100 #default
+ svgwidthunit = 'px' #default assume 'px' unit
+ if p:
+ width = float(p.string[p.start():p.end()])
+ else:
+ errormsg(_("SVG Width not set correctly! Assuming width = 100"))
+ if u:
+ svgwidthunit = u.string[u.start():u.end()]
+
+ viewboxnumbers = []
+ for t in viewboxstr.split():
+ try:
+ viewboxnumbers.append(float(t))
+ except ValueError:
+ pass
+ if len(viewboxnumbers) == 4: #check for correct number of numbers
+ viewboxwidth = viewboxnumbers[2]
+
+ svgunitfactor = self.__uuconv[svgwidthunit] * width / viewboxwidth
+
+ # try to find the svgunitfactor in the list of units known. If we don't find something, ...
+ eps = 0.01 #allow 1% error in factor
+ for key in self.__uuconv:
+ if are_near_relative(self.__uuconv[key], svgunitfactor, eps):
+ #found match!
+ svgunit = key;
+
+ return svgunit
+
+
def unittouu(self, string):
'''Returns userunits given a string representation of units in another system'''
unit = re.compile('(%s)$' % '|'.join(self.__uuconv.keys()))
diff --git a/share/extensions/jessyInk.js b/share/extensions/jessyInk.js
index 78b4bf896..74e9c0b9c 100755
--- a/share/extensions/jessyInk.js
+++ b/share/extensions/jessyInk.js
@@ -1419,18 +1419,7 @@ function slideUpdateExportLayer()
}
// Serialise the new document.
- var serializer = new XMLSerializer();
- var strm =
- {
- content : "",
- close : function() {},
- flush : function() {},
- write : function(str, count) { this.content += str; }
- };
-
- var xml = serializer.serializeToStream(newDoc, strm, 'UTF-8');
-
- window.location = 'data:application/svg+xml;base64;charset=utf-8,' + window.btoa(strm.content);
+ window.location = 'data:application/svg+xml;base64;charset=utf-8,' + window.btoa(unescape(encodeURIComponent((new XMLSerializer()).serializeToString(newDoc))));
// Unsuspend redraw.
ROOT_NODE.unsuspendRedraw(suspendHandle);
diff --git a/share/extensions/measure.py b/share/extensions/measure.py
index edcd2e92f..cdccb6bb8 100755
--- a/share/extensions/measure.py
+++ b/share/extensions/measure.py
@@ -183,9 +183,10 @@ class Length(inkex.Effect):
doc = self.document.getroot()
if doc.get('viewBox'):
[viewx, viewy, vieww, viewh] = doc.get('viewBox').split(' ')
- factor = float(doc.get('width'))/float(vieww)
- if float(doc.get('height'))/float(viewh) < factor:
- factor = float(doc.get('height'))/float(viewh)
+ factor = self.unittouu(doc.get('width'))/float(vieww)
+ if self.unittouu(doc.get('height'))/float(viewh) < factor:
+ factor = self.unittouu(doc.get('height'))/float(viewh)
+ factor /= self.unittouu('1px')
self.options.fontsize /= factor
# loop over all selected paths
for id, node in self.selected.iteritems():
diff --git a/share/markers/markers.svg b/share/markers/markers.svg
index de877a287..91de99ed3 100644
--- a/share/markers/markers.svg
+++ b/share/markers/markers.svg
@@ -4,7 +4,8 @@ NOTE: this file is currently (0.48+) edited manually.
Insert the new markers into the <defs>.
-->
<svg xmlns="http://www.w3.org/2000/svg"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="InkscapeMarkers">
<defs id="defs3">
<!-- Arrows -->
@@ -300,5 +301,9 @@ Insert the new markers into the <defs>.
</g>
</marker>
+ <marker id="ExperimentalArrow" refX="5.0" refY="3.0" orient="auto-start-reverse" inkscape:stockid="ExperimentalArrow">
+ <path style="fill:context-stroke" d="m 10,3 -10,3 0,-6 z"/>
+ </marker>
+
</defs>
</svg>
diff --git a/share/symbols/MapSymbolsNPS.svg b/share/symbols/MapSymbolsNPS.svg
index 81b24adde..aa558c9b2 100644
--- a/share/symbols/MapSymbolsNPS.svg
+++ b/share/symbols/MapSymbolsNPS.svg
@@ -469,6 +469,7 @@
</symbol>
<symbol id="MotorBikeTrail">
+ <title>Motorbike Trail</title>
<g style="stroke:none">
<path d="m 36.625,26.25 6.125,0 a 1.75,1.75 0 0 1 0,3.5 l -7.25,0 c -0.75,0 -1.625,-0.25 -2.25,-1.25 l -2.75,-4.25 -5.25,8 7.25,3.75 c 2,1 2,2.5 2,3.5 l 0,13.5 a 2.75,2.75 0 0 1 -5.5,0 l 0,-11 -11.5,-6.25 c -2,-1.25 -2.25,-3.75 -1.25,-5.25 l 8.5,-13 c 1.25,-1.875 4.5,-2.25 6,-0.25 z"/>
<path d="m 26.5,43.75 0,2.5 -13.5,-7.5 c -2.5,-1.25 -5,-1 -7,0 -0.5,0.25 -1.25,-0.5 -0.5,-1.25 2.5,-2.125 6.5,-2 9,-0.5 z"/>
@@ -484,6 +485,7 @@
</symbol>
<symbol id="MotorBikeTrail_Inv">
+ <title>Motorbike Trail</title>
<rect x="0.5" y="0.5" width="71" height="71" ry="6" style="stroke:white"/>
<g style="fill:white;stroke:none">
<path d="m 36.625,26.25 6.125,0 a 1.75,1.75 0 0 1 0,3.5 l -7.25,0 c -0.75,0 -1.625,-0.25 -2.25,-1.25 l -2.75,-4.25 -5.25,8 7.25,3.75 c 2,1 2,2.5 2,3.5 l 0,13.5 a 2.75,2.75 0 0 1 -5.5,0 l 0,-11 -11.5,-6.25 c -2,-1.25 -2.25,-3.75 -1.25,-5.25 l 8.5,-13 c 1.25,-1.875 4.5,-2.25 6,-0.25 z"/>
@@ -501,6 +503,7 @@
<symbol id="RadiatorWater">
+ <title>Radiator Water</title>
<g style="stroke:none">
<path d="m 17.75,48 c 0.5,-4 2,-6 3.25,-6.5 6.5,-1.5 18.25,-2.25 23,-2.5 l -11.75,-19.625 3.5,0 11.5,19.125 7.25,-12 c 1,-1.5 2.25,-2 4.5,-2 l 7,0 0,3 -7,0 c -1.5,0 -2,1 -2.5,1.75 l -5.75,9.5 15.25,0 0,15.75 -20.5,0 a 11.03,11.03 0 0 0 -22,0 l -4,0 c -1,0 -2.25,-0.5 -2.25,-2 z"/>
<path d="m 20,33.5 c 0,-2 4,-11 4,-11 0,0 4,9 4,11 a 4,4 0 0 1 -8,0 z"/>
@@ -511,6 +514,7 @@
<symbol id="RadiatorWater_Inv">
+ <title>Radiator Water</title>
<rect x="0.5" y="0.5" width="71" height="71" ry="6" style="stroke:white"/>
<g style="fill:white;stroke:none">
<path d="m 17.75,48 c 0.5,-4 2,-6 3.25,-6.5 6.5,-1.5 18.25,-2.25 23,-2.5 l -11.75,-19.625 3.5,0 11.5,19.125 7.25,-12 c 1,-1.5 2.25,-2 4.5,-2 l 7,0 0,3 -7,0 c -1.5,0 -2,1 -2.5,1.75 l -5.75,9.5 15.25,0 0,15.75 -20.5,0 a 11.03,11.03 0 0 0 -22,0 l -4,0 c -1,0 -2.25,-0.5 -2.25,-2 z"/>
@@ -1040,6 +1044,7 @@
</symbol>
<symbol id="blank">
+ <title>Blank</title>
<rect x="1" y="1" width="70" height="70" rx="6" style="fill:none;stroke:black;stroke-width:2"/>
</symbol>
</defs>
diff --git a/share/ui/units.xml b/share/ui/units.xml
index bdfe27919..364515679 100644
--- a/share/ui/units.xml
+++ b/share/ui/units.xml
@@ -18,7 +18,7 @@
<name>point</name>
<plural>points</plural>
<abbr>pt</abbr>
- <factor>1.3333333333</factor>
+ <factor>1.333333333333333</factor>
<description>PostScript points (72/inch)</description>
</unit>
<unit type="LINEAR" pri="n">
@@ -39,21 +39,21 @@
<name>millimeter</name>
<plural>millimeters</plural>
<abbr>mm</abbr>
- <factor>3.77952755913</factor>
+ <factor>3.779527559055119</factor>
<description>Millimeters (25.4 mm/in)</description>
</unit>
<unit type="LINEAR" pri="n">
<name>centimeter</name>
<plural>centimeters</plural>
<abbr>cm</abbr>
- <factor>37.7952755913</factor>
+ <factor>37.79527559055119</factor>
<description>Centimeters (10 mm/cm)</description>
</unit>
<unit type="LINEAR" pri="n">
<name>meter</name>
<plural>meters</plural>
<abbr>m</abbr>
- <factor>3779.52755913</factor>
+ <factor>3779.527559055119</factor>
<description>Meters (100 cm/m)</description>
</unit>
<unit type="LINEAR" pri="n">
@@ -74,15 +74,15 @@
<name>radian</name>
<plural>radians</plural>
<abbr>rad</abbr>
- <factor>57.296</factor>
- <description>Radians (57.296 deg/rad)</description>
+ <factor>57.29577951308232</factor>
+ <description>Radians (180/pi deg/rad)</description>
</unit>
<unit type="RADIAL" pri="n">
<name>gradian</name>
<plural>gradians</plural>
<abbr>grad</abbr>
- <factor>1.111</factor>
- <description>Gradians (1.111 deg/grad)</description>
+ <factor>0.9</factor>
+ <description>Gradians (360/400 deg/grad)</description>
</unit>
<unit type="RADIAL" pri="n">
<name>turn</name>