summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 58b01d0)
raw | patch | inline | side by side (parent: 58b01d0)
author | Arcadie M. Cracan <acracan@gmail.com> | |
Wed, 2 Dec 2009 20:26:44 +0000 (22:26 +0200) | ||
committer | Arcadie M. Cracan <acracan@gmail.com> | |
Wed, 2 Dec 2009 20:26:44 +0000 (22:26 +0200) |
51 files changed:
diff --git a/po/inkscape.pot b/po/inkscape.pot
--- a/po/inkscape.pot
+++ /dev/null
@@ -1,22382 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2009-11-30 21:00+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: ../inkscape.desktop.in.h:1
-msgid "Create and edit Scalable Vector Graphics images"
-msgstr ""
-
-#: ../inkscape.desktop.in.h:2
-msgid "Inkscape"
-msgstr ""
-
-#: ../inkscape.desktop.in.h:3
-msgid "Inkscape Vector Graphics Editor"
-msgstr ""
-
-#: ../inkscape.desktop.in.h:4
-msgid "Vector Graphics Editor"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:2
-msgid "Matte jelly"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:2 ../share/filters/filters.svg.h:10
-#: ../share/filters/filters.svg.h:107 ../share/filters/filters.svg.h:109
-#: ../share/filters/filters.svg.h:115 ../share/filters/filters.svg.h:116
-#: ../share/filters/filters.svg.h:118 ../share/filters/filters.svg.h:122
-#: ../share/filters/filters.svg.h:167 ../share/filters/filters.svg.h:206
-msgid "ABCs"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:2
-msgid "Bulging, matte jelly covering"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:3
-msgid "Smart jelly"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:3 ../share/filters/filters.svg.h:4
-#: ../share/filters/filters.svg.h:9 ../share/filters/filters.svg.h:14
-#: ../share/filters/filters.svg.h:15 ../share/filters/filters.svg.h:39
-#: ../share/filters/filters.svg.h:48 ../share/filters/filters.svg.h:49
-#: ../share/filters/filters.svg.h:50 ../share/filters/filters.svg.h:51
-#: ../share/filters/filters.svg.h:54 ../share/filters/filters.svg.h:56
-#: ../share/filters/filters.svg.h:69 ../share/filters/filters.svg.h:71
-#: ../share/filters/filters.svg.h:89 ../share/filters/filters.svg.h:101
-#: ../share/filters/filters.svg.h:102 ../share/filters/filters.svg.h:207
-#: ../share/filters/filters.svg.h:208 ../share/filters/filters.svg.h:209
-#: ../share/filters/filters.svg.h:210 ../share/filters/filters.svg.h:211
-msgid "Bevels"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:3
-msgid "Same as Matte jelly but with more controls"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:4
-msgid "Metal casting"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:4
-msgid "Smooth drop-like bevel with metallic finish"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:5
-msgid "Motion blur, horizontal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:5 ../share/filters/filters.svg.h:6
-#: ../share/filters/filters.svg.h:7 ../share/filters/filters.svg.h:57
-#: ../share/filters/filters.svg.h:94 ../share/filters/filters.svg.h:108
-#: ../share/filters/filters.svg.h:111 ../share/filters/filters.svg.h:159
-msgid "Blurs"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:5
-msgid ""
-"Blur as if the object flies horizontally; adjust Standard Deviation to vary "
-"force"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:6
-msgid "Motion blur, vertical"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:6
-msgid ""
-"Blur as if the object flies vertically; adjust Standard Deviation to vary "
-"force"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:7
-msgid "Apparition"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:7
-msgid "Edges are partly feathered out"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:8
-msgid "Cutout"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:8 ../share/filters/filters.svg.h:40
-#: ../share/filters/filters.svg.h:85 ../share/filters/filters.svg.h:95
-#: ../share/filters/filters.svg.h:119 ../share/filters/filters.svg.h:169
-#: ../share/filters/filters.svg.h:170 ../share/filters/filters.svg.h:171
-#: ../share/filters/filters.svg.h:176 ../share/filters/filters.svg.h:214
-#: ../src/extension/internal/filter/drop-shadow.h:45
-#: ../src/extension/internal/filter/drop-shadow.h:100
-msgid "Shadows and Glows"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:8
-msgid "Drop shadow under the cut-out of the shape"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:9
-msgid "Jigsaw piece"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:9
-msgid "Low, sharp bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:10
-msgid "Roughen"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:10
-msgid "Small-scale roughening to edges and content"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:11
-msgid "Rubber stamp"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:11 ../share/filters/filters.svg.h:17
-#: ../share/filters/filters.svg.h:18 ../share/filters/filters.svg.h:19
-#: ../share/filters/filters.svg.h:21 ../share/filters/filters.svg.h:22
-#: ../share/filters/filters.svg.h:36 ../share/filters/filters.svg.h:37
-#: ../share/filters/filters.svg.h:38 ../share/filters/filters.svg.h:90
-#: ../share/filters/filters.svg.h:113 ../share/filters/filters.svg.h:114
-#: ../share/filters/filters.svg.h:117 ../share/filters/filters.svg.h:150
-#: ../share/filters/filters.svg.h:154 ../share/filters/filters.svg.h:183
-#: ../share/filters/filters.svg.h:217
-msgid "Overlays"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:11
-msgid "Random whiteouts inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:12
-msgid "Ink bleed"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:12 ../share/filters/filters.svg.h:13
-#: ../share/filters/filters.svg.h:41 ../share/filters/filters.svg.h:166
-msgid "Protrusions"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:12
-msgid "Inky splotches underneath the object"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:13
-msgid "Fire"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:13
-msgid "Edges of object are on fire"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:14
-msgid "Bloom"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:14
-msgid "Soft, cushion-like bevel with matte highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:15
-msgid "Ridged border"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:15
-msgid "Ridged border with inner bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:16
-msgid "Ripple"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:16 ../share/filters/filters.svg.h:43
-#: ../share/filters/filters.svg.h:106 ../share/filters/filters.svg.h:110
-#: ../share/filters/filters.svg.h:112 ../share/filters/filters.svg.h:128
-#: ../share/filters/filters.svg.h:173 ../share/filters/filters.svg.h:194
-msgid "Distort"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:16
-msgid "Horizontal rippling of edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:17
-msgid "Speckle"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:17
-msgid "Fill object with sparse translucent specks"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:18
-msgid "Oil slick"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:18
-msgid "Rainbow-colored semitransparent oily splotches"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:19
-msgid "Frost"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:19
-msgid "Flake-like white splotches"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:20
-msgid "Leopard fur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:20 ../share/filters/filters.svg.h:58
-#: ../share/filters/filters.svg.h:59 ../share/filters/filters.svg.h:60
-#: ../share/filters/filters.svg.h:62 ../share/filters/filters.svg.h:67
-#: ../share/filters/filters.svg.h:78 ../share/filters/filters.svg.h:79
-#: ../share/filters/filters.svg.h:80 ../share/filters/filters.svg.h:82
-#: ../share/filters/filters.svg.h:136 ../share/filters/filters.svg.h:151
-#: ../share/filters/filters.svg.h:152 ../share/filters/filters.svg.h:153
-msgid "Materials"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:20
-msgid "Leopard spots (loses object's own color)"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:21
-msgid "Zebra"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:21
-msgid "Irregular vertical dark stripes (loses object's own color)"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:22
-msgid "Clouds"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:22
-msgid "Airy, fluffy, sparse white clouds"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:23
-#: ../src/extension/internal/bitmap/sharpen.cpp:37
-msgid "Sharpen"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:23 ../share/filters/filters.svg.h:24
-#: ../share/filters/filters.svg.h:25 ../share/filters/filters.svg.h:26
-#: ../share/filters/filters.svg.h:27 ../share/filters/filters.svg.h:28
-#: ../share/filters/filters.svg.h:29 ../share/filters/filters.svg.h:30
-#: ../share/filters/filters.svg.h:34 ../share/filters/filters.svg.h:100
-#: ../share/filters/filters.svg.h:160 ../share/filters/filters.svg.h:162
-#: ../share/filters/filters.svg.h:175 ../share/filters/filters.svg.h:190
-msgid "Image effects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:23
-msgid "Sharpen edges and boundaries within the object, force=0.15"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:24
-msgid "Sharpen more"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:24
-msgid "Sharpen edges and boundaries within the object, force=0.3"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:25
-msgid "Oil painting"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:25
-msgid "Simulate oil painting style"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:26
-msgid "Edge detect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:26
-msgid "Detect color edges in object"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:27
-msgid "Horizontal edge detect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:27
-msgid "Detect horizontal color edges in object"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:28
-msgid "Vertical edge detect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:28
-msgid "Detect vertical color edges in object"
-msgstr ""
-
-#. Pencil
-#: ../share/filters/filters.svg.h:29
-#: ../src/ui/dialog/inkscape-preferences.cpp:486 ../src/verbs.cpp:2516
-msgid "Pencil"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:29
-msgid "Detect color edges and retrace them in grayscale"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:30
-msgid "Blueprint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:30
-msgid "Detect color edges and retrace them in blue"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:31
-#: ../share/extensions/color_desaturate.inx.h:2
-msgid "Desaturate"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:31 ../share/filters/filters.svg.h:32
-#: ../share/filters/filters.svg.h:33 ../share/filters/filters.svg.h:72
-#: ../share/filters/filters.svg.h:91 ../share/filters/filters.svg.h:98
-#: ../share/filters/filters.svg.h:99 ../share/filters/filters.svg.h:157
-#: ../share/filters/filters.svg.h:174 ../share/filters/filters.svg.h:196
-#: ../share/filters/filters.svg.h:205 ../share/filters/filters.svg.h:215
-#: ../share/filters/filters.svg.h:218 ../share/filters/filters.svg.h:219
-#: ../src/dialogs/clonetiler.cpp:2607 ../src/dialogs/clonetiler.cpp:2754
-#: ../src/extension/internal/bitmap/colorize.cpp:51
-#: ../share/extensions/color_brighter.inx.h:2
-#: ../share/extensions/color_custom.inx.h:2
-#: ../share/extensions/color_darker.inx.h:1
-#: ../share/extensions/color_desaturate.inx.h:1
-#: ../share/extensions/color_grayscale.inx.h:1
-#: ../share/extensions/color_lesshue.inx.h:1
-#: ../share/extensions/color_lesslight.inx.h:1
-#: ../share/extensions/color_lesssaturation.inx.h:1
-#: ../share/extensions/color_morehue.inx.h:1
-#: ../share/extensions/color_morelight.inx.h:1
-#: ../share/extensions/color_moresaturation.inx.h:1
-#: ../share/extensions/color_negative.inx.h:1
-#: ../share/extensions/color_randomize.inx.h:1
-#: ../share/extensions/color_removeblue.inx.h:1
-#: ../share/extensions/color_removegreen.inx.h:1
-#: ../share/extensions/color_removered.inx.h:1
-#: ../share/extensions/color_replace.inx.h:2
-#: ../share/extensions/color_rgbbarrel.inx.h:1
-#: ../share/extensions/interp_att_g.inx.h:2
-msgid "Color"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:31
-msgid "Render in shades of gray by reducing saturation to zero"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:32 ../src/ui/widget/selected-style.cpp:228
-msgid "Invert"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:32
-msgid "Invert colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:33
-msgid "Sepia"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:33
-msgid "Render in warm sepia tones"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:34
-msgid "Age"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:34
-msgid "Imitate aged photograph"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:35
-msgid "Organic"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:35 ../share/filters/filters.svg.h:42
-#: ../share/filters/filters.svg.h:45 ../share/filters/filters.svg.h:61
-#: ../share/filters/filters.svg.h:63 ../share/filters/filters.svg.h:64
-#: ../share/filters/filters.svg.h:81 ../share/filters/filters.svg.h:83
-#: ../share/filters/filters.svg.h:84 ../share/filters/filters.svg.h:125
-#: ../share/filters/filters.svg.h:126 ../share/filters/filters.svg.h:127
-#: ../share/filters/filters.svg.h:130 ../share/filters/filters.svg.h:131
-#: ../share/filters/filters.svg.h:132 ../share/filters/filters.svg.h:133
-#: ../share/filters/filters.svg.h:134 ../share/filters/filters.svg.h:135
-#: ../share/filters/filters.svg.h:155 ../share/filters/filters.svg.h:172
-#: ../share/filters/filters.svg.h:181 ../share/filters/filters.svg.h:187
-#: ../share/filters/filters.svg.h:200
-msgid "Textures"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:35
-msgid "Bulging, knotty, slick 3D surface"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:36
-msgid "Barbed wire"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:36
-msgid "Gray bevelled wires with drop shadows"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:37
-msgid "Swiss cheese"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:37
-msgid "Random inner-bevel holes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:38
-msgid "Blue cheese"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:38
-msgid "Marble-like bluish speckles"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:39
-msgid "Button"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:39
-msgid "Soft bevel, slightly depressed middle"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:40
-msgid "Inset"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:40
-msgid "Shadowy outer bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:41
-msgid "Dripping"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:41
-msgid "Random paint streaks downwards"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:42
-msgid "Jam spread"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:42
-msgid "Glossy clumpy jam spread"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:43
-msgid "Pixel smear"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:43
-msgid "Van Gogh painting effect for bitmaps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:44
-msgid "HSL Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:44 ../share/filters/filters.svg.h:46
-#: ../share/filters/filters.svg.h:97 ../share/filters/filters.svg.h:120
-#: ../share/filters/filters.svg.h:121 ../share/filters/filters.svg.h:123
-#: ../share/filters/filters.svg.h:124 ../share/filters/filters.svg.h:161
-#: ../share/filters/filters.svg.h:163 ../share/filters/filters.svg.h:180
-#: ../share/filters/filters.svg.h:182 ../share/filters/filters.svg.h:184
-#: ../share/filters/filters.svg.h:185 ../share/filters/filters.svg.h:192
-#: ../share/filters/filters.svg.h:201 ../share/filters/filters.svg.h:202
-#: ../share/filters/filters.svg.h:203 ../share/filters/filters.svg.h:212
-#: ../share/filters/filters.svg.h:213 ../share/filters/filters.svg.h:216
-msgid "Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:44
-msgid "Highly flexible bump combining diffuse and specular lightings"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:45
-msgid "Cracked glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:45
-msgid "Under a cracked glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:46
-msgid "Bubbly Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:46
-msgid "Flexible bubbles effect with some displacement"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:47
-msgid "Glowing bubble"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:47 ../share/filters/filters.svg.h:52
-#: ../share/filters/filters.svg.h:53 ../share/filters/filters.svg.h:65
-#: ../share/filters/filters.svg.h:66 ../share/filters/filters.svg.h:68
-#: ../share/filters/filters.svg.h:70
-msgid "Ridges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:47
-msgid "Bubble effect with refraction and glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:48
-msgid "Neon"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:48
-msgid "Neon light effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:49
-msgid "Molten metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:49
-msgid "Melting parts of object together, with a glossy bevel and a glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:50
-msgid "Pressed steel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:50
-msgid "Pressed metal with a rolled edge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:51
-msgid "Matte bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:51
-msgid "Soft, pastel-colored, blurry bevel"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:52
-msgid "Thin Membrane"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:52
-msgid "Thin like a soap membrane"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:53
-msgid "Matte ridge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:53
-msgid "Soft pastel ridge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:54
-msgid "Glowing metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:54
-msgid "Glowing metal texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:55
-msgid "Leaves"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:55 ../share/filters/filters.svg.h:77
-#: ../share/filters/filters.svg.h:86 ../share/extensions/pathscatter.inx.h:10
-msgid "Scatter"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:55
-msgid "Leaves on the ground in Fall, or living foliage"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:56
-msgid "Translucent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:56
-msgid "Illuminated translucent plastic or glass effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:57
-msgid "Cross-smooth"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:57
-msgid "Blur inner borders and intersections"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:58
-msgid "Iridescent beeswax"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:58
-msgid "Waxy texture which keeps its iridescence through color fill change"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:59
-msgid "Eroded metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:59
-msgid "Eroded metal texture with ridges, grooves, holes and bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:60
-msgid "Cracked Lava"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:60
-msgid "A volcanic texture, a little like leather"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:61
-msgid "Bark"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:61
-msgid "Bark texture, vertical; use with deep colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:62
-msgid "Lizard skin"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:62
-msgid "Stylized reptile skin texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:63
-msgid "Stone wall"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:63
-msgid "Stone wall texture to use with not too saturated colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:64
-msgid "Silk carpet"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:64
-msgid "Silk carpet texture, horizontal stripes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:65
-msgid "Refractive gel A"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:65
-msgid "Gel effect with light refraction"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:66
-msgid "Refractive gel B"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:66
-msgid "Gel effect with strong refraction"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:67
-msgid "Metallized paint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:67
-msgid ""
-"Metallized effect with a soft lighting, slightly translucent at the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:68
-msgid "Dragee"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:68
-msgid "Gel Ridge with a pearlescent look"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:69
-msgid "Raised border"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:69
-msgid "Strongly raised border around a flat surface"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:70
-msgid "Metallized ridge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:70
-msgid "Gel Ridge metallized at its top"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:71
-msgid "Fat oil"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:71
-msgid "Fat oil with some adjustable turbulence"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:72
-#: ../src/extension/internal/bitmap/colorize.cpp:49
-msgid "Colorize"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:72
-msgid "Blend image or object with a flood color and set lightness and contrast"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:73
-msgid "Parallel hollow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:73 ../share/filters/filters.svg.h:74
-#: ../share/filters/filters.svg.h:75 ../share/filters/filters.svg.h:76
-#: ../share/filters/filters.svg.h:87 ../share/filters/filters.svg.h:88
-#: ../share/filters/filters.svg.h:92 ../share/filters/filters.svg.h:93
-#: ../share/filters/filters.svg.h:96 ../share/filters/filters.svg.h:105
-#: ../share/filters/filters.svg.h:129 ../share/filters/filters.svg.h:168
-#: ../src/filter-enums.cpp:31
-msgid "Morphology"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:73
-msgid "A blurry hollow going parallel to the edge on the inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:74
-msgid "Hole"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:74
-msgid "Opens a smooth hole inside the shape"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:75
-msgid "Black hole"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:75
-msgid "Creates a black light inside and outside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:76
-msgid "Smooth outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:76
-msgid "Outlining the lines and smoothing their crossings"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:77
-msgid "Cubes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:77
-msgid "Scattered cubes; adjust the Morphology primitive to vary size"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:78
-msgid "Peel off"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:78
-msgid "Peeling painting on a wall"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:79
-msgid "Gold splatter"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:79
-msgid "Splattered cast metal, with golden highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:80
-msgid "Gold paste"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:80
-msgid "Fat pasted cast metal, with golden highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:81
-msgid "Crumpled plastic"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:81
-msgid "Crumpled matte plastic, with melted edge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:82
-msgid "Enamel jewelry"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:82
-msgid "Slightly cracked enameled texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:83
-msgid "Rough paper"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:83
-msgid "Aquarelle paper effect which can be used for pictures as for objects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:84
-msgid "Rough and glossy"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:84
-msgid ""
-"Crumpled glossy paper effect which can be used for pictures as for objects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:85
-msgid "In and Out"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:85
-msgid "Inner colorized shadow, outer black shadow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:86
-msgid "Air spray"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:86
-msgid "Convert to small scattered particles with some thickness"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:87
-msgid "Warm inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:87
-msgid "Blurred colorized contour, filled inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:88
-msgid "Cool outside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:88
-msgid "Blurred colorized contour, empty inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:89
-msgid "Electronic microscopy"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:89
-msgid ""
-"Bevel, crude light, discoloration and glow like in electronic microscopy"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:90
-msgid "Tartan"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:90
-msgid "Checkered tartan pattern"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:91
-msgid "Invert hue"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:91
-msgid "Invert hue, or rotate it"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:92
-msgid "Inner outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:92
-msgid "Draws an outline around"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:93
-msgid "Outline, double"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:93
-msgid "Draws a smooth line inside colorized with the color it overlays"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:94
-msgid "Fancy blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:94
-msgid "Smooth colorized contour which allows desaturation and hue rotation"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:95
-msgid "Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:95
-msgid "Glow of object's own color at the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:96
-msgid "Outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:96
-msgid "Adds a glowing blur and removes the shape"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:97
-msgid "Color emboss"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:97
-msgid "Classic or colorized emboss effect: grayscale, color and 3D relief"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:98
-#: ../src/extension/internal/bitmap/solarize.cpp:36
-msgid "Solarize"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:98
-msgid "Classical photographic solarization effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:99
-msgid "Moonarize"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:99
-msgid ""
-"An effect between solarize and invert which often preserves sky and water "
-"lights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:100
-msgid "Soft focus lens"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:100
-msgid "Glowing image content without blurring it"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:101
-msgid "Stained glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:101
-msgid "Illuminated stained glass effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:102
-msgid "Dark glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:102
-msgid "Illuminated glass effect with light coming from beneath"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:103
-msgid "HSL Bumps alpha"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:103 ../share/filters/filters.svg.h:104
-#: ../share/filters/filters.svg.h:164 ../share/filters/filters.svg.h:165
-#: ../share/filters/filters.svg.h:177 ../share/filters/filters.svg.h:178
-#: ../share/filters/filters.svg.h:179 ../share/filters/filters.svg.h:186
-#: ../share/filters/filters.svg.h:188 ../share/filters/filters.svg.h:189
-#: ../share/filters/filters.svg.h:191 ../share/filters/filters.svg.h:193
-#: ../share/filters/filters.svg.h:204
-msgid "Image effects, transparent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:103
-msgid "Same as HSL Bumps but with transparent highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:104
-msgid "Bubbly Bumps alpha"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:104
-msgid "Same as Bubbly Bumps but with transparent highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:105
-msgid "Smooth edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:105
-msgid ""
-"Smooth the outside of shapes and pictures without altering their contents"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:106 ../share/filters/filters.svg.h:128
-msgid "Torn edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:106 ../share/filters/filters.svg.h:128
-msgid ""
-"Displace the outside of shapes and pictures without altering their content"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:107
-msgid "Feather"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:107
-msgid "Blurred mask on the edge without altering the contents"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:108
-msgid "Blur content"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:108
-msgid "Blur the contents of objects, preserving the outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:109
-msgid "Specular light"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:109 ../share/filters/filters.svg.h:211
-msgid "Basic specular bevel to use for building textures"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:110
-msgid "Roughen inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:110
-msgid "Roughen all inside shapes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:111
-msgid "Evanescent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:111
-msgid ""
-"Blur the contents of objects, preserving the outline and adding progressive "
-"transparency at edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:112
-msgid "Chalk and sponge"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:112
-msgid "Low turbulence gives sponge look and high turbulence chalk"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:113
-msgid "People"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:113
-msgid "Colorized blotches, like a crowd of people"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:114
-msgid "Scotland"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:114
-msgid "Colorized mountain tops out of the fog"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:115
-msgid "Noise transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:115
-msgid "Basic noise transparency texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:116
-msgid "Noise fill"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:116
-msgid "Basic noise fill texture; adjust color in Flood"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:117
-msgid "Garden of Delights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:117
-msgid ""
-"Phantasmagorical turbulent wisps, like Hieronymus Bosch's Garden of Delights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:118
-msgid "Diffuse light"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:118
-msgid "Basic diffuse bevel to use for building textures"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:119
-msgid "Cutout Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:119
-msgid "In and out glow with a possible offset and colorizable flood"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:120
-msgid "HSL Bumps, matte"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:120
-msgid ""
-"Same as HSL bumps but with a diffuse reflection instead of a specular one"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:121
-msgid "Dark Emboss"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:121
-msgid "Emboss effect : 3D relief where white is replaced by black"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:122
-msgid "Simple blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:122
-msgid "Simple Gaussian blur, same as the blur slider in Fill and Stroke dialog"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:123
-msgid "Bubbly Bumps, matte"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:123
-msgid "Same as Bubbly Bumps but with a diffuse light instead of a specular one"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:124
-#: ../src/extension/internal/bitmap/emboss.cpp:37
-msgid "Emboss"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:124
-msgid ""
-"Emboss effect : Colors of the original images are preserved or modified by "
-"Blend"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:125
-msgid "Blotting paper"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:125
-msgid "Inkblot on blotting paper"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:126
-msgid "Wax print"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:126
-msgid "Wax print on tissue texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:127
-msgid "Inkblot"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:127
-msgid "Inkblot on tissue or rough paper"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:129
-msgid "Color outline, in"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:129
-msgid "A colorizable inner outline with adjustable width and blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:130
-msgid "Liquid"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:130
-msgid "Colorizable filling with liquid transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:131
-msgid "Watercolor"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:131
-msgid "Cloudy watercolor effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:132
-msgid "Felt"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:132
-msgid ""
-"Felt like texture with color turbulence and slightly darker at the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:133
-msgid "Ink paint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:133
-msgid "Ink paint on paper with some turbulent color shift"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:134
-msgid "Tinted rainbow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:134
-msgid "Smooth rainbow colors melted along the edges and colorizable"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:135
-msgid "Melted rainbow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:135
-msgid "Smooth rainbow colors slightly melted along the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:136
-msgid "Flex metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:136
-msgid "Bright, polished uneven metal casting, colorizable"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:137
-msgid "Comics draft"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:137 ../share/filters/filters.svg.h:138
-#: ../share/filters/filters.svg.h:139 ../share/filters/filters.svg.h:140
-#: ../share/filters/filters.svg.h:141 ../share/filters/filters.svg.h:142
-#: ../share/filters/filters.svg.h:143 ../share/filters/filters.svg.h:144
-#: ../share/filters/filters.svg.h:145 ../share/filters/filters.svg.h:146
-#: ../share/filters/filters.svg.h:147 ../share/filters/filters.svg.h:148
-#: ../share/filters/filters.svg.h:149 ../share/filters/filters.svg.h:156
-msgid "Non realistic 3D shaders"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:137
-msgid "Draft painted cartoon shading with a glassy look"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:138
-msgid "Comics fading"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:138
-msgid "Cartoon paint style with some fading at the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:139
-msgid "Smooth shader"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:139
-msgid "Smooth shading with a graphite pencil grey"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:140
-msgid "Emboss shader"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:140
-msgid "Combination of smooth shading and embossing"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:141
-msgid "Smooth shader dark"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:141
-msgid "Dark version of non realistic smooth shading"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:142
-msgid "Comics"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:142
-msgid "Imitation of black and white cartoon shading"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:143
-msgid "Satin"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:143
-msgid "Silky close to mother of pearl shading"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:144
-msgid "Frosted glass"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:144
-msgid "Non realistic frosted glass imitation"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:145
-msgid "Smooth shader contour"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:145
-msgid "Contouring version of smooth shader"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:146
-msgid "Aluminium"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:146
-msgid "Brushed aluminium shader"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:147
-msgid "Comics fluid"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:147
-msgid "Fluid brushed cartoon drawing"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:148
-msgid "Chrome"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:148
-msgid "Non realistic chrome shader with strong speculars"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:149
-msgid "Chrome dark"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:149
-msgid "Dark version of chrome shading with a ground reflection simulation"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:150
-msgid "Wavy tartan"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:150
-msgid "Tartan pattern with a wavy displacement and bevel around the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:151
-msgid "3D marble"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:151
-msgid "3D warped marble texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:152
-msgid "3D wood"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:152
-msgid "3D warped, fibered wood texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:153
-msgid "3D mother of pearl"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:153
-msgid "3D warped, iridescent pearly shell texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:154
-msgid "Tiger fur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:154
-msgid "Tiger fur pattern with folds and bevel around the edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:155
-msgid "Shaken liquid"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:155
-msgid "Colorizable filling with flow inside like transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:156
-msgid "Comics cream"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:156
-msgid "Comics shader with creamy waves transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:157
-msgid "Black Light"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:157
-msgid "Light areas turn to black"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:158
-msgid "Light eraser"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:158 ../share/filters/filters.svg.h:195
-#: ../share/filters/filters.svg.h:197 ../share/filters/filters.svg.h:198
-#: ../share/filters/filters.svg.h:199
-msgid "Transparency utilities"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:158
-msgid "Make the lightest parts of the object progressively transparent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:159
-msgid "Noisy blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:159
-msgid "Small-scale roughening and blurring to edges and content"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:160
-msgid "Film grain"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:160
-msgid "Adds a small scale graininess"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:161
-msgid "HSL Bumps, transparent"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:161
-msgid "Highly flexible specular bump with transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:162
-#: ../src/ui/dialog/align-and-distribute.cpp:920
-#: ../src/widgets/desktop-widget.cpp:1576
-msgid "Drawing"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:162
-msgid ""
-"Give lead pencil or chromolithography or engraving or other effects to "
-"images and material filled objects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:163
-msgid "Velvet Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:163
-msgid "Gives Smooth Bumps velvet like"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:164
-msgid "Alpha draw"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:164
-msgid "Gives a transparent drawing effect to bitmaps and materials"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:165
-msgid "Alpha draw, color"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:165
-msgid "Gives a transparent color fill effect to bitmaps and materials"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:166
-msgid "Chewing gum"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:166
-msgid ""
-"Creates colorizable blotches which smoothly flow over the edges of the lines "
-"at their crossings"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:167
-msgid "Black outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:167
-msgid "Draws a black outline around"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:168
-msgid "Color outline"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:168
-msgid "Draws a colored outline around"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:169
-msgid "Inner Shadow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:169
-msgid "Adds a colorizable drop shadow inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:170
-msgid "Dark and Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:170
-msgid "Darkens the edge with an inner blur and adds a flexible glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:171
-msgid "Darken edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:171
-msgid "Darken the edges with an inner blur"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:172
-msgid "Warped rainbow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:172
-msgid "Smooth rainbow colors warped along the edges and colorizable"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:173
-msgid "Rough and dilate"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:173
-msgid "Create a turbulent contour around"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:174
-msgid "Quadritone fantasy"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:174
-msgid "Replace hue by two colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:175
-msgid "Old postcard"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:175
-msgid "Slightly posterize and draw edges like on old printed postcards"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:176
-msgid "Fuzzy Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:176
-msgid "Overlays a semi-transparent shifted copy to a blurred one"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:177
-msgid "Dots transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:177
-msgid "Gives a pointillist HSL sensitive transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:178
-msgid "Canvas transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:178
-msgid "Gives a canvas like HSL sensitive transparency."
-msgstr ""
-
-#: ../share/filters/filters.svg.h:179
-msgid "Smear transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:179
-msgid ""
-"Paint objects with a transparent turbulence which turns around color edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:180
-msgid "Thick paint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:180
-msgid "Thick painting effect with turbulence"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:181
-msgid "Burst"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:181
-msgid "Burst balloon texture crumpled and with holes"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:182
-msgid "Embossed leather"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:182
-msgid ""
-"Combine a HSL edges detection bump with a leathery or woody and colorizable "
-"texture"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:183
-msgid "Carnaval"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:183
-msgid "White splotches evocating carnaval masks"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:184
-msgid "Plastify"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:184
-msgid ""
-"HSL edges detection bump with a wavy reflective surface effect and variable "
-"crumple"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:185
-msgid "Plaster"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:185
-msgid ""
-"Combine a HSL edges detection bump with a matte and crumpled surface effect"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:186
-msgid "Rough transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:186
-msgid "Adds a turbulent transparency which displaces pixels at the same time"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:187
-msgid "Gouache"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:187
-msgid "Partly opaque water color effect with bleed"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:188
-msgid "Alpha engraving"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:188
-msgid "Gives a transparent engraving effect with rough line and filling"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:189
-msgid "Alpha draw, liquid"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:189
-msgid "Gives a transparent fluid drawing effect with rough line and filling"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:190
-msgid "Liquid drawing"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:190
-msgid "Gives a fluid and wavy expressionist drawing effect to images"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:191
-msgid "Marbled ink"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:191
-msgid "Marbled transparency effect which conforms to image detected edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:192
-msgid "Thick acrylic"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:192
-msgid "Thick acrylic paint texture with high texture depth"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:193
-msgid "Alpha engraving B"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:193
-msgid ""
-"Gives a controllable roughness engraving effect to bitmaps and materials"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:194
-msgid "Lapping"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:194
-msgid "Something like a water noise"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:195
-msgid "Monochrome transparency"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:195
-msgid "Convert to a colorizable transparent positive or negative"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:196
-msgid "Duotone"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:196
-msgid "Change colors to a duotone palette"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:197
-msgid "Light eraser, negative"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:197
-msgid "Like Light eraser but converts to negative"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:198
-msgid "Alpha repaint"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:198
-msgid "Repaint anything monochrome"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:199
-msgid "Saturation map"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:199
-msgid ""
-"Creates an approximative semi-transparent and colorizable image of the "
-"saturation levels"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:200
-msgid "Riddled"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:200
-msgid "Riddle the surface and add bump to images"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:201
-msgid "Wrinkled varnish"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:201
-msgid "Thick glossy and translucent paint texture with high depth"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:202
-msgid "Canvas Bumps"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:202
-msgid "Canvas texture with an HSL sensitive height map"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:203
-msgid "Canvas Bumps, matte"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:203
-msgid "Same as Canvas Bumps but with a diffuse light instead of a specular one"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:204
-msgid "Canvas Bumps alpha"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:204
-msgid "Same as Canvas Bumps but with transparent highlights"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:205
-msgid "Lightness-Contrast"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:205
-msgid "Increase or decrease lightness and contrast"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:206
-msgid "Clean edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:206
-msgid ""
-"Removes or decreases glows and jaggeries around objects edges after applying "
-"some filters"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:207
-msgid "Bright metal"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:207
-msgid "Bright metallic effect for any color"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:208
-msgid "Deep colors plastic"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:208
-msgid "Transparent plastic with deep colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:209
-msgid "Melted jelly, matte"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:209
-msgid "Matte bevel with blurred edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:210
-msgid "Melted jelly"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:210
-msgid "Glossy bevel with blurred edges"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:211
-msgid "Combined lighting"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:212
-msgid "Tinfoil"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:212
-msgid "Metallic foil effect combining two lighting types and variable crumple"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:213
-msgid "Copper and chocolate"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:213
-msgid ""
-"Specular bump which can be easily converted from metallic to molded plastic "
-"effects"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:214
-msgid "Inner Glow"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:214
-msgid "Adds a colorizable glow inside"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:215
-msgid "Soft colors"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:215
-msgid "Adds a colorizable edges glow inside objects and pictures"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:216
-msgid "Relief print"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:216
-msgid "Bumps effect with a bevel, color flood and complex lighting"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:217
-msgid "Growing cells"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:217
-msgid "Random rounded living cells like fill"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:218
-msgid "Fluorescence"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:218
-msgid "Oversaturate colors which can be fluorescent in real world"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:219
-msgid "Tritone"
-msgstr ""
-
-#: ../share/filters/filters.svg.h:219
-msgid "Create a tritone palette with hue selectable by flood"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:2
-msgid "Stripes 1:1"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:3
-msgid "Stripes 1:1 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:4
-msgid "Stripes 1:1.5"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:5
-msgid "Stripes 1:1.5 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:6
-msgid "Stripes 1:2"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:7
-msgid "Stripes 1:2 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:8
-msgid "Stripes 1:3"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:9
-msgid "Stripes 1:3 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:10
-msgid "Stripes 1:4"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:11
-msgid "Stripes 1:4 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:12
-msgid "Stripes 1:5"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:13
-msgid "Stripes 1:5 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:14
-msgid "Stripes 1:8"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:15
-msgid "Stripes 1:8 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:16
-msgid "Stripes 1:10"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:17
-msgid "Stripes 1:10 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:18
-msgid "Stripes 1:16"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:19
-msgid "Stripes 1:16 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:20
-msgid "Stripes 1:32"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:21
-msgid "Stripes 1:32 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:22
-msgid "Stripes 1:64"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:23
-msgid "Stripes 2:1"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:24
-msgid "Stripes 2:1 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:25
-msgid "Stripes 4:1"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:26
-msgid "Stripes 4:1 white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:27
-msgid "Checkerboard"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:28
-msgid "Checkerboard white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:29
-msgid "Packed circles"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:30
-msgid "Polka dots, small"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:31
-msgid "Polka dots, small white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:32
-msgid "Polka dots, medium"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:33
-msgid "Polka dots, medium white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:34
-msgid "Polka dots, large"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:35
-msgid "Polka dots, large white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:36
-msgid "Wavy"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:37
-msgid "Wavy white"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:38
-msgid "Camouflage"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:39
-msgid "Ermine"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:40
-msgid "Sand (bitmap)"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:41
-msgid "Cloth (bitmap)"
-msgstr ""
-
-#: ../share/patterns/patterns.svg.h:42
-msgid "Old paint (bitmap)"
-msgstr ""
-
-#: ../src/arc-context.cpp:319
-msgid ""
-"<b>Ctrl</b>: make circle or integer-ratio ellipse, snap arc/segment angle"
-msgstr ""
-
-#: ../src/arc-context.cpp:320 ../src/rect-context.cpp:362
-msgid "<b>Shift</b>: draw around the starting point"
-msgstr ""
-
-#: ../src/arc-context.cpp:471
-#, c-format
-msgid ""
-"<b>Ellipse</b>: %s × %s (constrained to ratio %d:%d); with <b>Shift</b> "
-"to draw around the starting point"
-msgstr ""
-
-#: ../src/arc-context.cpp:473
-#, c-format
-msgid ""
-"<b>Ellipse</b>: %s × %s; with <b>Ctrl</b> to make square or integer-"
-"ratio ellipse; with <b>Shift</b> to draw around the starting point"
-msgstr ""
-
-#: ../src/arc-context.cpp:499
-msgid "Create ellipse"
-msgstr ""
-
-#: ../src/box3d-context.cpp:429 ../src/box3d-context.cpp:436
-#: ../src/box3d-context.cpp:443 ../src/box3d-context.cpp:450
-#: ../src/box3d-context.cpp:457 ../src/box3d-context.cpp:464
-msgid "Change perspective (angle of PLs)"
-msgstr ""
-
-#. status text
-#: ../src/box3d-context.cpp:622
-msgid "<b>3D Box</b>; with <b>Shift</b> to extrude along the Z axis"
-msgstr ""
-
-#: ../src/box3d-context.cpp:650
-msgid "Create 3D box"
-msgstr ""
-
-#: ../src/box3d.cpp:315
-msgid "<b>3D Box</b>"
-msgstr ""
-
-#: ../src/connector-context.cpp:526
-msgid "Creating new connector"
-msgstr ""
-
-#: ../src/connector-context.cpp:775
-msgid "Connector endpoint drag cancelled."
-msgstr ""
-
-#: ../src/connector-context.cpp:824
-msgid "Reroute connector"
-msgstr ""
-
-#. Flush pending updates
-#: ../src/connector-context.cpp:988
-msgid "Create connector"
-msgstr ""
-
-#: ../src/connector-context.cpp:1012
-msgid "Finishing connector"
-msgstr ""
-
-#: ../src/connector-context.cpp:1154
-msgid "<b>Connection point</b>: click or drag to create a new connector"
-msgstr ""
-
-#: ../src/connector-context.cpp:1227
-msgid "<b>Connector endpoint</b>: drag to reroute or connect to new shapes"
-msgstr ""
-
-#: ../src/connector-context.cpp:1339
-msgid "Select <b>at least one non-connector object</b>."
-msgstr ""
-
-#: ../src/connector-context.cpp:1344 ../src/widgets/toolbox.cpp:6997
-msgid "Make connectors avoid selected objects"
-msgstr ""
-
-#: ../src/connector-context.cpp:1345 ../src/widgets/toolbox.cpp:7007
-msgid "Make connectors ignore selected objects"
-msgstr ""
-
-#: ../src/context-fns.cpp:36 ../src/context-fns.cpp:65
-msgid "<b>Current layer is hidden</b>. Unhide it to be able to draw on it."
-msgstr ""
-
-#: ../src/context-fns.cpp:42 ../src/context-fns.cpp:71
-msgid "<b>Current layer is locked</b>. Unlock it to be able to draw on it."
-msgstr ""
-
-#: ../src/desktop.cpp:830
-msgid "No previous zoom."
-msgstr ""
-
-#: ../src/desktop.cpp:855
-msgid "No next zoom."
-msgstr ""
-
-#: ../src/desktop-events.cpp:187
-msgid "Create guide"
-msgstr ""
-
-#: ../src/desktop-events.cpp:391
-msgid "Move guide"
-msgstr ""
-
-#: ../src/desktop-events.cpp:398 ../src/desktop-events.cpp:445
-#: ../src/ui/dialog/guides.cpp:125
-msgid "Delete guide"
-msgstr ""
-
-#: ../src/desktop-events.cpp:425
-#, c-format
-msgid "<b>Guideline</b>: %s"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:155
-msgid "<small>Nothing selected.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:161
-msgid "<small>More than one object selected.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:168
-#, c-format
-msgid "<small>Object has <b>%d</b> tiled clones.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:173
-msgid "<small>Object has no tiled clones.</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:976
-msgid "Select <b>one object</b> whose tiled clones to unclump."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:998
-msgid "Unclump tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1028
-msgid "Select <b>one object</b> whose tiled clones to remove."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1051
-msgid "Delete tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1097 ../src/selection-chemistry.cpp:1883
-msgid "Select an <b>object</b> to clone."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1103
-msgid ""
-"If you want to clone several objects, <b>group</b> them and <b>clone the "
-"group</b>."
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1112
-msgid "<small>Creating tiled clones...</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1515
-msgid "Create tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1706
-msgid "<small>Per row:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1719
-msgid "<small>Per column:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1727
-msgid "<small>Randomize:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1888
-msgid "_Symmetry"
-msgstr ""
-
-#. TRANSLATORS: For the following 17 symmetry groups, see
-#. * http://www.bib.ulb.ac.be/coursmath/doc/17.htm (visual examples);
-#. * http://www.clarku.edu/~djoyce/wallpaper/seventeen.html (English vocabulary); or
-#. * http://membres.lycos.fr/villemingerard/Geometri/Sym1D.htm (French vocabulary).
-#.
-#: ../src/dialogs/clonetiler.cpp:1896
-msgid "Select one of the 17 symmetry groups for the tiling"
-msgstr ""
-
-#. TRANSLATORS: "translation" means "shift" / "displacement" here.
-#: ../src/dialogs/clonetiler.cpp:1907
-msgid "<b>P1</b>: simple translation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1908
-msgid "<b>P2</b>: 180° rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1909
-msgid "<b>PM</b>: reflection"
-msgstr ""
-
-#. TRANSLATORS: "glide reflection" is a reflection and a translation combined.
-#. For more info, see http://mathforum.org/sum95/suzanne/symsusan.html
-#: ../src/dialogs/clonetiler.cpp:1912
-msgid "<b>PG</b>: glide reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1913
-msgid "<b>CM</b>: reflection + glide reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1914
-msgid "<b>PMM</b>: reflection + reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1915
-msgid "<b>PMG</b>: reflection + 180° rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1916
-msgid "<b>PGG</b>: glide reflection + 180° rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1917
-msgid "<b>CMM</b>: reflection + reflection + 180° rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1918
-msgid "<b>P4</b>: 90° rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1919
-msgid "<b>P4M</b>: 90° rotation + 45° reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1920
-msgid "<b>P4G</b>: 90° rotation + 90° reflection"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1921
-msgid "<b>P3</b>: 120° rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1922
-msgid "<b>P31M</b>: reflection + 120° rotation, dense"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1923
-msgid "<b>P3M1</b>: reflection + 120° rotation, sparse"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1924
-msgid "<b>P6</b>: 60° rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1925
-msgid "<b>P6M</b>: reflection + 60° rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1953
-msgid "S_hift"
-msgstr ""
-
-#. TRANSLATORS: "shift" means: the tiles will be shifted (offset) horizontally by this amount
-#: ../src/dialogs/clonetiler.cpp:1963
-#, no-c-format
-msgid "<b>Shift X:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1971
-#, no-c-format
-msgid "Horizontal shift per row (in % of tile width)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1979
-#, no-c-format
-msgid "Horizontal shift per column (in % of tile width)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:1986
-msgid "Randomize the horizontal shift by this percentage"
-msgstr ""
-
-#. TRANSLATORS: "shift" means: the tiles will be shifted (offset) vertically by this amount
-#: ../src/dialogs/clonetiler.cpp:1996
-#, no-c-format
-msgid "<b>Shift Y:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2004
-#, no-c-format
-msgid "Vertical shift per row (in % of tile height)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2012
-#, no-c-format
-msgid "Vertical shift per column (in % of tile height)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2019
-msgid "Randomize the vertical shift by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2027 ../src/dialogs/clonetiler.cpp:2175
-msgid "<b>Exponent:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2034
-msgid "Whether rows are spaced evenly (1), converge (<1) or diverge (>1)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2041
-msgid "Whether columns are spaced evenly (1), converge (<1) or diverge (>1)"
-msgstr ""
-
-#. TRANSLATORS: "Alternate" is a verb here
-#: ../src/dialogs/clonetiler.cpp:2049 ../src/dialogs/clonetiler.cpp:2219
-#: ../src/dialogs/clonetiler.cpp:2296 ../src/dialogs/clonetiler.cpp:2372
-#: ../src/dialogs/clonetiler.cpp:2421 ../src/dialogs/clonetiler.cpp:2552
-msgid "<small>Alternate:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2055
-msgid "Alternate the sign of shifts for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2060
-msgid "Alternate the sign of shifts for each column"
-msgstr ""
-
-#. TRANSLATORS: "Cumulate" is a verb here
-#: ../src/dialogs/clonetiler.cpp:2067 ../src/dialogs/clonetiler.cpp:2237
-#: ../src/dialogs/clonetiler.cpp:2314
-msgid "<small>Cumulate:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2073
-msgid "Cumulate the shifts for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2078
-msgid "Cumulate the shifts for each column"
-msgstr ""
-
-#. TRANSLATORS: "Cumulate" is a verb here
-#: ../src/dialogs/clonetiler.cpp:2085
-msgid "<small>Exclude tile:</small>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2091
-msgid "Exclude tile height in shift"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2096
-msgid "Exclude tile width in shift"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2105
-msgid "Sc_ale"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2113
-msgid "<b>Scale X:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2121
-#, no-c-format
-msgid "Horizontal scale per row (in % of tile width)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2129
-#, no-c-format
-msgid "Horizontal scale per column (in % of tile width)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2136
-msgid "Randomize the horizontal scale by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2144
-msgid "<b>Scale Y:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2152
-#, no-c-format
-msgid "Vertical scale per row (in % of tile height)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2160
-#, no-c-format
-msgid "Vertical scale per column (in % of tile height)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2167
-msgid "Randomize the vertical scale by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2182
-msgid "Whether row scaling is uniform (1), converge (<1) or diverge (>1)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2189
-msgid "Whether column scaling is uniform (1), converge (<1) or diverge (>1)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2197
-msgid "<b>Base:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2204 ../src/dialogs/clonetiler.cpp:2211
-msgid ""
-"Base for a logarithmic spiral: not used (0), converge (<1), or diverge (>1)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2225
-msgid "Alternate the sign of scales for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2230
-msgid "Alternate the sign of scales for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2243
-msgid "Cumulate the scales for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2248
-msgid "Cumulate the scales for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2257
-msgid "_Rotation"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2265
-msgid "<b>Angle:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2273
-#, no-c-format
-msgid "Rotate tiles by this angle for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2281
-#, no-c-format
-msgid "Rotate tiles by this angle for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2288
-msgid "Randomize the rotation angle by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2302
-msgid "Alternate the rotation direction for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2307
-msgid "Alternate the rotation direction for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2320
-msgid "Cumulate the rotation for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2325
-msgid "Cumulate the rotation for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2334
-msgid "_Blur & opacity"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2343
-msgid "<b>Blur:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2350
-msgid "Blur tiles by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2357
-msgid "Blur tiles by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2364
-msgid "Randomize the tile blur by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2378
-msgid "Alternate the sign of blur change for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2383
-msgid "Alternate the sign of blur change for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2392
-msgid "<b>Fade out:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2399
-msgid "Decrease tile opacity by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2406
-msgid "Decrease tile opacity by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2413
-msgid "Randomize the tile opacity by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2427
-msgid "Alternate the sign of opacity change for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2432
-msgid "Alternate the sign of opacity change for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2440
-msgid "Co_lor"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2445
-msgid "Initial color: "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2449
-msgid "Initial color of tiled clones"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2449
-msgid ""
-"Initial color for clones (works only if the original has unset fill or "
-"stroke)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2464
-msgid "<b>H:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2471
-msgid "Change the tile hue by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2478
-msgid "Change the tile hue by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2485
-msgid "Randomize the tile hue by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2494
-msgid "<b>S:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2501
-msgid "Change the color saturation by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2508
-msgid "Change the color saturation by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2515
-msgid "Randomize the color saturation by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2523
-msgid "<b>L:</b>"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2530
-msgid "Change the color lightness by this percentage for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2537
-msgid "Change the color lightness by this percentage for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2544
-msgid "Randomize the color lightness by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2558
-msgid "Alternate the sign of color changes for each row"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2563
-msgid "Alternate the sign of color changes for each column"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2571
-msgid "_Trace"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2578
-msgid "Trace the drawing under the tiles"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2582
-msgid ""
-"For each clone, pick a value from the drawing in that clone's location and "
-"apply it to the clone"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2596
-msgid "1. Pick from the drawing:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2608
-msgid "Pick the visible color and opacity"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2615 ../src/dialogs/clonetiler.cpp:2764
-#: ../src/extension/internal/bitmap/opacity.cpp:37
-#: ../src/extension/internal/bitmap/opacity.cpp:39
-#: ../src/widgets/toolbox.cpp:4326 ../share/extensions/interp_att_g.inx.h:12
-msgid "Opacity"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2616
-msgid "Pick the total accumulated opacity"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2623
-msgid "R"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2624
-msgid "Pick the Red component of the color"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2631
-msgid "G"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2632
-msgid "Pick the Green component of the color"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2639
-msgid "B"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2640
-msgid "Pick the Blue component of the color"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/dialogs/clonetiler.cpp:2649
-msgid "clonetiler|H"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2650
-msgid "Pick the hue of the color"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/dialogs/clonetiler.cpp:2659
-msgid "clonetiler|S"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2660
-msgid "Pick the saturation of the color"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/dialogs/clonetiler.cpp:2669
-msgid "clonetiler|L"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2670
-msgid "Pick the lightness of the color"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2680
-msgid "2. Tweak the picked value:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2690
-msgid "Gamma-correct:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2695
-msgid "Shift the mid-range of the picked value upwards (>0) or downwards (<0)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2702
-msgid "Randomize:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2707
-msgid "Randomize the picked value by this percentage"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2714
-msgid "Invert:"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2718
-msgid "Invert the picked value"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2724
-msgid "3. Apply the value to the clones':"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2734
-msgid "Presence"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2737
-msgid ""
-"Each clone is created with the probability determined by the picked value in "
-"that point"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2744
-msgid "Size"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2747
-msgid "Each clone's size is determined by the picked value in that point"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2757
-msgid ""
-"Each clone is painted by the picked color (the original must have unset fill "
-"or stroke)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2767
-msgid "Each clone's opacity is determined by the picked value in that point"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2794
-msgid "How many rows in the tiling"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2814
-msgid "How many columns in the tiling"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2844
-msgid "Width of the rectangle to be filled"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2869
-msgid "Height of the rectangle to be filled"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2884
-msgid "Rows, columns: "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2885
-msgid "Create the specified number of rows and columns"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2894
-msgid "Width, height: "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2895
-msgid "Fill the specified width and height with the tiling"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2911
-msgid "Use saved size and position of the tile"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2914
-msgid ""
-"Pretend that the size and position of the tile are the same as the last time "
-"you tiled it (if any), instead of using the current size"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2938
-msgid " <b>_Create</b> "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2940
-msgid "Create and tile the clones of the selection"
-msgstr ""
-
-#. TRANSLATORS: if a group of objects are "clumped" together, then they
-#. are unevenly spread in the given amount of space - as shown in the
-#. diagrams on the left in the following screenshot:
-#. http://www.inkscape.org/screenshots/gallery/inkscape-0.42-CVS-tiles-unclump.png
-#. So unclumping is the process of spreading a number of objects out more evenly.
-#: ../src/dialogs/clonetiler.cpp:2955
-msgid " _Unclump "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2956
-msgid "Spread out clones to reduce clumping; can be applied repeatedly"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2962
-msgid " Re_move "
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2963
-msgid "Remove existing tiled clones of the selected object (siblings only)"
-msgstr ""
-
-#: ../src/dialogs/clonetiler.cpp:2979
-msgid " R_eset "
-msgstr ""
-
-#. TRANSLATORS: "change" is a noun here
-#: ../src/dialogs/clonetiler.cpp:2981
-msgid ""
-"Reset all shifts, scales, rotates, opacity and color changes in the dialog "
-"to zero"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:146 ../src/verbs.cpp:2623
-msgid "_Page"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:146 ../src/verbs.cpp:2627
-msgid "_Drawing"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:146 ../src/verbs.cpp:2629
-msgid "_Selection"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:146
-msgid "_Custom"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:271
-msgid "<big><b>Export area</b></big>"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:285
-msgid "Units:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:313
-msgid "_x0:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:318
-msgid "x_1:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:323
-msgid "Wid_th:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:329
-msgid "_y0:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:334
-msgid "y_1:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:339
-msgid "Hei_ght:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:471
-msgid "<big><b>Bitmap size</b></big>"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:484 ../src/ui/widget/page-sizer.cpp:230
-msgid "_Width:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:484 ../src/dialogs/export.cpp:498
-msgid "pixels at"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:492
-msgid "dp_i"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:498 ../src/ui/widget/page-sizer.cpp:231
-msgid "_Height:"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:509 ../src/ui/dialog/inkscape-preferences.cpp:768
-#: ../src/ui/dialog/inkscape-preferences.cpp:1180
-msgid "dpi"
-msgstr ""
-
-#. true = has mnemonic
-#: ../src/dialogs/export.cpp:520
-msgid "<big><b>_Filename</b></big>"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:590
-msgid "_Browse..."
-msgstr ""
-
-#: ../src/dialogs/export.cpp:619
-msgid "Batch export all selected objects"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:623
-msgid ""
-"Export each selected object into its own PNG file, using export hints if any "
-"(caution, overwrites without asking!)"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:631
-msgid "Hide all except selected"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:635
-msgid "In the exported image, hide all objects except those that are selected"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:652
-msgid "_Export"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:656
-msgid "Export the bitmap file with these settings"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:682
-#, c-format
-msgid "Batch export %d selected object"
-msgid_plural "Batch export %d selected objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/dialogs/export.cpp:1013
-msgid "Export in progress"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1101
-#, c-format
-msgid "Exporting %d files"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1145 ../src/dialogs/export.cpp:1222
-#, c-format
-msgid "Could not export to filename %s.\n"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1175
-msgid "You have to enter a filename"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1180
-msgid "The chosen area to be exported is invalid"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1195
-#, c-format
-msgid "Directory %s does not exist or is not a directory.\n"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1207
-#, c-format
-msgid "Exporting %s (%lu x %lu)"
-msgstr ""
-
-#: ../src/dialogs/export.cpp:1331 ../src/dialogs/export.cpp:1366
-msgid "Select a filename for exporting"
-msgstr ""
-
-#. TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
-#: ../src/dialogs/find.cpp:362 ../src/ui/dialog/find.cpp:437
-#, c-format
-msgid "<b>%d</b> object found (out of <b>%d</b>), %s match."
-msgid_plural "<b>%d</b> objects found (out of <b>%d</b>), %s match."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/dialogs/find.cpp:365 ../src/ui/dialog/find.cpp:440
-msgid "exact"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:365 ../src/ui/dialog/find.cpp:440
-msgid "partial"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:372 ../src/ui/dialog/find.cpp:447
-msgid "No objects found"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:530
-msgid "T_ype: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:537 ../src/ui/dialog/find.cpp:69
-msgid "Search in all object types"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:537 ../src/ui/dialog/find.cpp:69
-msgid "All types"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:548 ../src/ui/dialog/find.cpp:70
-msgid "Search all shapes"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:548 ../src/ui/dialog/find.cpp:70
-msgid "All shapes"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:565 ../src/ui/dialog/find.cpp:71
-msgid "Search rectangles"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:565 ../src/ui/dialog/find.cpp:71
-msgid "Rectangles"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:570 ../src/ui/dialog/find.cpp:72
-msgid "Search ellipses, arcs, circles"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:570 ../src/ui/dialog/find.cpp:72
-msgid "Ellipses"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:575 ../src/ui/dialog/find.cpp:73
-msgid "Search stars and polygons"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:575 ../src/ui/dialog/find.cpp:73
-msgid "Stars"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:580 ../src/ui/dialog/find.cpp:74
-msgid "Search spirals"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:580 ../src/ui/dialog/find.cpp:74
-msgid "Spirals"
-msgstr ""
-
-#. TRANSLATORS: polyline is a set of connected straight line segments
-#. http://www.w3.org/TR/SVG11/shapes.html#PolylineElement
-#: ../src/dialogs/find.cpp:593 ../src/ui/dialog/find.cpp:75
-msgid "Search paths, lines, polylines"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:593 ../src/ui/dialog/find.cpp:75
-#: ../src/widgets/toolbox.cpp:2091
-msgid "Paths"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:598 ../src/ui/dialog/find.cpp:76
-msgid "Search text objects"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:598 ../src/ui/dialog/find.cpp:76
-msgid "Texts"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:603 ../src/ui/dialog/find.cpp:77
-msgid "Search groups"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:603 ../src/ui/dialog/find.cpp:77
-msgid "Groups"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:608 ../src/ui/dialog/find.cpp:82
-msgid "Search clones"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Clones" is a noun indicating type of object to find
-#: ../src/dialogs/find.cpp:612 ../src/ui/dialog/find.cpp:82
-msgid "find|Clones"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:617 ../src/ui/dialog/find.cpp:83
-msgid "Search images"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:617 ../src/ui/dialog/find.cpp:83
-#: ../share/extensions/embedimage.inx.h:3
-#: ../share/extensions/extractimage.inx.h:2
-msgid "Images"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:622 ../src/ui/dialog/find.cpp:84
-msgid "Search offset objects"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:622 ../src/ui/dialog/find.cpp:84
-msgid "Offsets"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:687 ../src/ui/dialog/find.cpp:60
-msgid "_Text: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:687 ../src/ui/dialog/find.cpp:60
-msgid "Find objects by their text content (exact or partial match)"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:688 ../src/ui/dialog/find.cpp:61
-msgid "_ID: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:688 ../src/ui/dialog/find.cpp:61
-msgid "Find objects by the value of the id attribute (exact or partial match)"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:689 ../src/ui/dialog/find.cpp:62
-msgid "_Style: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:689 ../src/ui/dialog/find.cpp:62
-msgid ""
-"Find objects by the value of the style attribute (exact or partial match)"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:690 ../src/ui/dialog/find.cpp:63
-msgid "_Attribute: "
-msgstr ""
-
-#: ../src/dialogs/find.cpp:690 ../src/ui/dialog/find.cpp:63
-msgid "Find objects by the name of an attribute (exact or partial match)"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:704 ../src/ui/dialog/find.cpp:64
-msgid "Search in s_election"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:708 ../src/ui/dialog/find.cpp:64
-msgid "Limit search to the current selection"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:713 ../src/ui/dialog/find.cpp:65
-msgid "Search in current _layer"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:717 ../src/ui/dialog/find.cpp:65
-msgid "Limit search to the current layer"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:722 ../src/ui/dialog/find.cpp:66
-msgid "Include _hidden"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:726 ../src/ui/dialog/find.cpp:66
-msgid "Include hidden objects in search"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:731 ../src/ui/dialog/find.cpp:67
-msgid "Include l_ocked"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:735 ../src/ui/dialog/find.cpp:67
-msgid "Include locked objects in search"
-msgstr ""
-
-#. TRANSLATORS: "Clear" is a verb here
-#: ../src/dialogs/find.cpp:746 ../src/ui/dialog/debug.cpp:75
-#: ../src/ui/dialog/find.cpp:86 ../src/ui/dialog/messages.cpp:53
-#: ../src/ui/dialog/scriptdialog.cpp:209
-msgid "_Clear"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:746 ../src/ui/dialog/find.cpp:86
-msgid "Clear values"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:747 ../src/ui/dialog/find.cpp:87
-msgid "_Find"
-msgstr ""
-
-#: ../src/dialogs/find.cpp:747 ../src/ui/dialog/find.cpp:87
-msgid "Select objects matching all of the fields you filled in"
-msgstr ""
-
-#. Create the label for the object id
-#: ../src/dialogs/item-properties.cpp:120
-#: ../src/dialogs/item-properties.cpp:334
-#: ../src/dialogs/item-properties.cpp:443
-#: ../src/dialogs/item-properties.cpp:450
-msgid "_Id"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:129
-msgid ""
-"The id= attribute (only letters, digits, and the characters .-_: allowed)"
-msgstr ""
-
-#. Button for setting the object's id, label, title and description.
-#: ../src/dialogs/item-properties.cpp:143 ../src/verbs.cpp:2486
-#: ../src/verbs.cpp:2492
-msgid "_Set"
-msgstr ""
-
-#. Create the label for the object label
-#: ../src/dialogs/item-properties.cpp:152
-msgid "_Label"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:161
-msgid "A freeform label for the object"
-msgstr ""
-
-#. Create the label for the object title
-#: ../src/dialogs/item-properties.cpp:173
-msgid "_Title"
-msgstr ""
-
-#. Create the frame for the object description
-#: ../src/dialogs/item-properties.cpp:191
-msgid "_Description"
-msgstr ""
-
-#. Hide
-#: ../src/dialogs/item-properties.cpp:222
-msgid "_Hide"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:223
-msgid "Check to make the object invisible"
-msgstr ""
-
-#. Lock
-#. TRANSLATORS: "Lock" is a verb here
-#: ../src/dialogs/item-properties.cpp:232
-msgid "L_ock"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:233
-msgid "Check to make the object insensitive (not selectable by mouse)"
-msgstr ""
-
-#. Create the frame for interactivity options
-#: ../src/dialogs/item-properties.cpp:243
-msgid "_Interactivity"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:317
-#: ../src/dialogs/item-properties.cpp:324
-msgid "Ref"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:402
-msgid "Lock object"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:402
-msgid "Unlock object"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:421
-msgid "Hide object"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:421
-msgid "Unhide object"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:445
-msgid "Id invalid! "
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:447
-msgid "Id exists! "
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:454
-msgid "Set object ID"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:469
-msgid "Set object label"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:477
-msgid "Set object title"
-msgstr ""
-
-#: ../src/dialogs/item-properties.cpp:487
-msgid "Set object description"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:32
-msgid "Href:"
-msgstr ""
-
-#. default x:
-#. default y:
-#: ../src/dialogs/object-attributes.cpp:33
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2191
-msgid "Target:"
-msgstr ""
-
-#. _settings->add_checkbutton(false, SP_ATTR_STITCHTILES, _("Stitch Tiles"), "stitch", "noStitch");
-#: ../src/dialogs/object-attributes.cpp:34
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2168
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2246
-msgid "Type:"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkRoleAttribute
-#. Identifies the type of the related resource with an absolute URI
-#: ../src/dialogs/object-attributes.cpp:37
-msgid "Role:"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkArcRoleAttribute
-#. For situations where the nature/role alone isn't enough, this offers an additional URI defining the purpose of the link.
-#: ../src/dialogs/object-attributes.cpp:40
-msgid "Arcrole:"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkTitleAttribute
-#: ../src/dialogs/object-attributes.cpp:42
-msgid "Title:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:43
-#: ../share/extensions/polyhedron_3d.inx.h:36
-msgid "Show:"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkActuateAttribute
-#: ../src/dialogs/object-attributes.cpp:45
-msgid "Actuate:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:50
-msgid "URL:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:51
-#: ../src/dialogs/object-attributes.cpp:59 ../src/ui/dialog/guides.cpp:43
-#: ../src/ui/view/edit-widget.cpp:1074 ../src/widgets/desktop-widget.cpp:504
-#: ../src/widgets/toolbox.cpp:1472
-msgid "X:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:52
-#: ../src/dialogs/object-attributes.cpp:60 ../src/ui/dialog/guides.cpp:44
-#: ../src/ui/view/edit-widget.cpp:1075 ../src/widgets/desktop-widget.cpp:507
-#: ../src/widgets/toolbox.cpp:1490
-msgid "Y:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:53
-#: ../src/dialogs/object-attributes.cpp:61 ../src/widgets/toolbox.cpp:4124
-#: ../src/widgets/toolbox.cpp:4715 ../src/widgets/toolbox.cpp:5734
-msgid "Width:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:54
-#: ../src/dialogs/object-attributes.cpp:62
-msgid "Height:"
-msgstr ""
-
-#: ../src/dialogs/object-attributes.cpp:106
-#, c-format
-msgid "%s Properties"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:444
-#, c-format
-msgid "<b>Finished</b>, <b>%d</b> words added to dictionary"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:446
-#, c-format
-msgid "<b>Finished</b>, nothing suspicious found"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:559
-#, c-format
-msgid "Not in dictionary (%s): <b>%s</b>"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:711
-msgid "<i>Checking...</i>"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:781
-msgid "Fix spelling"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:955
-msgid "Suggestions:"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:967
-msgid "_Accept"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:967
-msgid "Accept the chosen suggestion"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:969
-msgid "_Ignore once"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:969
-msgid "Ignore this word only once"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:971
-msgid "_Ignore"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:971
-msgid "Ignore this word in this session"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:978
-msgid "A_dd to dictionary:"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:978
-msgid "Add this word to the chosen dictionary"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:1002
-msgid "_Stop"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:1002
-msgid "Stop the check"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:1004
-msgid "_Start"
-msgstr ""
-
-#: ../src/dialogs/spellcheck.cpp:1004
-msgid "Start the check"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:198
-msgid "Font"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:221 ../share/extensions/svgcalendar.inx.h:12
-msgid "Layout"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:235
-msgid "Align lines left"
-msgstr ""
-
-#. TRANSLATORS: `Center' here is a verb.
-#: ../src/dialogs/text-edit.cpp:250
-msgid "Center lines"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:264
-msgid "Align lines right"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:278
-msgid "Justify lines"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:300 ../src/widgets/toolbox.cpp:6804
-msgid "Horizontal text"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:314 ../src/widgets/toolbox.cpp:6816
-msgid "Vertical text"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:329
-msgid "Line spacing:"
-msgstr ""
-
-#. Text
-#: ../src/dialogs/text-edit.cpp:375 ../src/selection-describer.cpp:69
-#: ../src/ui/dialog/inkscape-preferences.cpp:522 ../src/verbs.cpp:2522
-#: ../share/extensions/lorem_ipsum.inx.h:5
-#: ../share/extensions/render_alphabetsoup.inx.h:5
-#: ../share/extensions/text_braille.inx.h:2
-#: ../share/extensions/text_flipcase.inx.h:1
-#: ../share/extensions/text_lowercase.inx.h:1
-#: ../share/extensions/text_randomcase.inx.h:1
-#: ../share/extensions/text_replace.inx.h:4
-#: ../share/extensions/text_sentencecase.inx.h:2
-#: ../share/extensions/text_titlecase.inx.h:1
-#: ../share/extensions/text_uppercase.inx.h:1
-msgid "Text"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:422
-msgid "Set as default"
-msgstr ""
-
-#: ../src/dialogs/text-edit.cpp:665 ../src/text-context.cpp:1493
-msgid "Set text style"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:152
-msgid "<b>Click</b> to select nodes, <b>drag</b> to rearrange."
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:163
-msgid "<b>Click</b> attribute to edit."
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:167
-#, c-format
-msgid ""
-"Attribute <b>%s</b> selected. Press <b>Ctrl+Enter</b> when done editing to "
-"commit changes."
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:263
-msgid "Drag to reorder nodes"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:283
-msgid "New element node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:305
-msgid "New text node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:326 ../src/dialogs/xml-tree.cpp:1409
-#: ../src/nodepath.cpp:2249
-msgid "Duplicate node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:347
-msgid "nodeAsInXMLdialogTooltip|Delete node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:363 ../src/dialogs/xml-tree.cpp:1571
-msgid "Unindent node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:378 ../src/dialogs/xml-tree.cpp:1550
-msgid "Indent node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:390 ../src/dialogs/xml-tree.cpp:1503
-msgid "Raise node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:402 ../src/dialogs/xml-tree.cpp:1520
-msgid "Lower node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:447 ../src/dialogs/xml-tree.cpp:1444
-msgid "Delete attribute"
-msgstr ""
-
-#. TRANSLATORS: "Attribute" is a noun here
-#: ../src/dialogs/xml-tree.cpp:492
-msgid "Attribute name"
-msgstr ""
-
-#. TRANSLATORS: "Set" is a verb here
-#: ../src/dialogs/xml-tree.cpp:512 ../src/widgets/sp-attribute-widget.cpp:158
-#: ../src/widgets/sp-attribute-widget.cpp:765
-msgid "Set attribute"
-msgstr ""
-
-#. TRANSLATORS: "Set" is a verb here
-#: ../src/dialogs/xml-tree.cpp:514
-msgid "Set"
-msgstr ""
-
-#. TRANSLATORS: "Attribute" is a noun here
-#: ../src/dialogs/xml-tree.cpp:537
-msgid "Attribute value"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:874
-msgid "Drag XML subtree"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1311
-msgid "New element node..."
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1333
-msgid "Cancel"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1341
-msgid "Create"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1375
-msgid "Create new element node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1391
-msgid "Create new text node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1426
-msgid "nodeAsInXMLinHistoryDialog|Delete node"
-msgstr ""
-
-#: ../src/dialogs/xml-tree.cpp:1473
-msgid "Change attribute"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:396 ../src/display/canvas-grid.cpp:670
-msgid "Grid _units:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:398 ../src/display/canvas-grid.cpp:672
-msgid "_Origin X:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:398 ../src/display/canvas-grid.cpp:672
-#: ../src/ui/dialog/inkscape-preferences.cpp:978
-#: ../src/ui/dialog/inkscape-preferences.cpp:999
-msgid "X coordinate of grid origin"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:400 ../src/display/canvas-grid.cpp:674
-msgid "O_rigin Y:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:400 ../src/display/canvas-grid.cpp:674
-#: ../src/ui/dialog/inkscape-preferences.cpp:979
-#: ../src/ui/dialog/inkscape-preferences.cpp:1000
-msgid "Y coordinate of grid origin"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:402 ../src/display/canvas-grid.cpp:678
-msgid "Spacing _Y:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:402
-#: ../src/ui/dialog/inkscape-preferences.cpp:1002
-msgid "Base length of z-axis"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:404
-#: ../src/ui/dialog/inkscape-preferences.cpp:1005
-#: ../src/widgets/toolbox.cpp:3422
-msgid "Angle X:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:404
-#: ../src/ui/dialog/inkscape-preferences.cpp:1005
-msgid "Angle of x-axis"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:406
-#: ../src/ui/dialog/inkscape-preferences.cpp:1006
-#: ../src/widgets/toolbox.cpp:3501
-msgid "Angle Z:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:406
-#: ../src/ui/dialog/inkscape-preferences.cpp:1006
-msgid "Angle of z-axis"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:410 ../src/display/canvas-grid.cpp:682
-msgid "Grid line _color:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:410 ../src/display/canvas-grid.cpp:682
-msgid "Grid line color"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:410 ../src/display/canvas-grid.cpp:682
-msgid "Color of grid lines"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:415 ../src/display/canvas-grid.cpp:687
-msgid "Ma_jor grid line color:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:415 ../src/display/canvas-grid.cpp:687
-msgid "Major grid line color"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:416 ../src/display/canvas-grid.cpp:688
-msgid "Color of the major (highlighted) grid lines"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:420 ../src/display/canvas-grid.cpp:692
-msgid "_Major grid line every:"
-msgstr ""
-
-#: ../src/display/canvas-axonomgrid.cpp:420 ../src/display/canvas-grid.cpp:692
-msgid "lines"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:39
-msgid "Rectangular grid"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:40
-msgid "Axonometric grid"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:258
-msgid "Create new grid"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:324
-msgid "_Enabled"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:325
-msgid ""
-"Determines whether to snap to this grid or not. Can be 'on' for invisible "
-"grids."
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:329
-msgid "Snap to visible _grid lines only"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:330
-msgid ""
-"When zoomed out, not all grid lines will be displayed. Only the visible ones "
-"will be snapped to"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:334
-msgid "_Visible"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:335
-msgid ""
-"Determines whether the grid is displayed or not. Objects are still snapped "
-"to invisible grids."
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:676
-msgid "Spacing _X:"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:676
-#: ../src/ui/dialog/inkscape-preferences.cpp:982
-msgid "Distance between vertical grid lines"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:678
-#: ../src/ui/dialog/inkscape-preferences.cpp:983
-msgid "Distance between horizontal grid lines"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:711
-msgid "_Show dots instead of lines"
-msgstr ""
-
-#: ../src/display/canvas-grid.cpp:712
-msgid "If set, displays dots at gridpoints instead of gridlines"
-msgstr ""
-
-#. TRANSLATORS: undefined target for snapping
-#: ../src/display/snap-indicator.cpp:60 ../src/display/snap-indicator.cpp:63
-#: ../src/display/snap-indicator.cpp:148 ../src/display/snap-indicator.cpp:151
-msgid "UNDEFINED"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:66
-msgid "grid line"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:69
-msgid "grid intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:72
-msgid "guide"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:75
-msgid "guide intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:78
-msgid "guide origin"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:81
-msgid "grid-guide intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:84
-msgid "cusp node"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:87
-msgid "smooth node"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:90
-msgid "path"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:93
-msgid "path intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:96
-msgid "bounding box corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:99
-msgid "bounding box side"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:102
-msgid "bounding box"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:105
-msgid "page border"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:108
-msgid "line midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:111
-msgid "object midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:114
-msgid "object rotation center"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:117
-msgid "handle"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:120
-msgid "bounding box side midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:123
-msgid "bounding box midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:126
-msgid "page corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:129
-msgid "convex hull corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:132
-msgid "quadrant point"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:135
-msgid "center"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:138
-msgid "corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:141
-msgid "text baseline"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:154
-msgid "Bounding box corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:157
-msgid "Bounding box midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:160
-msgid "Bounding box side midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:163
-msgid "Smooth node"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:166
-msgid "Cusp node"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:169
-msgid "Line midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:172
-msgid "Object midpoint"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:175
-msgid "Object rotation center"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:178
-msgid "Handle"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:181
-msgid "Path intersection"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:184
-msgid "Guide"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:187
-msgid "Guide origin"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:190
-msgid "Convex hull corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:193
-msgid "Quadrant point"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:196 ../src/widgets/toolbox.cpp:6734
-msgid "Center"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:199
-msgid "Corner"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:202
-msgid "Text baseline"
-msgstr ""
-
-#: ../src/display/snap-indicator.cpp:241
-msgid " to "
-msgstr ""
-
-#: ../src/document.cpp:445
-#, c-format
-msgid "New document %d"
-msgstr ""
-
-#: ../src/document.cpp:477
-#, c-format
-msgid "Memory document %d"
-msgstr ""
-
-#: ../src/document.cpp:632
-#, c-format
-msgid "Unnamed document %d"
-msgstr ""
-
-#. We hit green anchor, closing Green-Blue-Red
-#: ../src/draw-context.cpp:581
-msgid "Path is closed."
-msgstr ""
-
-#. We hit bot start and end of single curve, closing paths
-#: ../src/draw-context.cpp:596
-msgid "Closing path."
-msgstr ""
-
-#: ../src/draw-context.cpp:706
-msgid "Draw path"
-msgstr ""
-
-#: ../src/draw-context.cpp:867
-msgid "Creating single dot"
-msgstr ""
-
-#: ../src/draw-context.cpp:868
-msgid "Create single dot"
-msgstr ""
-
-#. alpha of color under cursor, to show in the statusbar
-#. locale-sensitive printf is OK, since this goes to the UI, not into SVG
-#: ../src/dropper-context.cpp:302
-#, c-format
-msgid " alpha %.3g"
-msgstr ""
-
-#. where the color is picked, to show in the statusbar
-#: ../src/dropper-context.cpp:304
-#, c-format
-msgid ", averaged with radius %d"
-msgstr ""
-
-#: ../src/dropper-context.cpp:304
-#, c-format
-msgid " under cursor"
-msgstr ""
-
-#. message, to show in the statusbar
-#: ../src/dropper-context.cpp:306
-msgid "<b>Release mouse</b> to set color."
-msgstr ""
-
-#: ../src/dropper-context.cpp:306 ../src/tools-switch.cpp:208
-msgid ""
-"<b>Click</b> to set fill, <b>Shift+click</b> to set stroke; <b>drag</b> to "
-"average color in area; with <b>Alt</b> to pick inverse color; <b>Ctrl+C</b> "
-"to copy the color under mouse to clipboard"
-msgstr ""
-
-#: ../src/dropper-context.cpp:344
-msgid "Set picked color"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:615
-msgid ""
-"<b>Guide path selected</b>; start drawing along the guide with <b>Ctrl</b>"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:617
-msgid "<b>Select a guide path</b> to track with <b>Ctrl</b>"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:752
-msgid "Tracking: <b>connection to guide path lost!</b>"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:752
-msgid "<b>Tracking</b> a guide path"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:755
-msgid "<b>Drawing</b> a calligraphic stroke"
-msgstr ""
-
-#: ../src/dyna-draw-context.cpp:1044
-msgid "Draw calligraphic stroke"
-msgstr ""
-
-#: ../src/eraser-context.cpp:527
-msgid "<b>Drawing</b> an eraser stroke"
-msgstr ""
-
-#: ../src/eraser-context.cpp:830
-msgid "Draw eraser stroke"
-msgstr ""
-
-#: ../src/event-context.cpp:618
-msgid "<b>Space+mouse drag</b> to pan canvas"
-msgstr ""
-
-#: ../src/event-log.cpp:37
-msgid "[Unchanged]"
-msgstr ""
-
-#. Edit
-#: ../src/event-log.cpp:264 ../src/event-log.cpp:267 ../src/verbs.cpp:2276
-msgid "_Undo"
-msgstr ""
-
-#: ../src/event-log.cpp:274 ../src/event-log.cpp:278 ../src/verbs.cpp:2278
-msgid "_Redo"
-msgstr ""
-
-#: ../src/extension/dependency.cpp:246
-msgid "Dependency:"
-msgstr ""
-
-#: ../src/extension/dependency.cpp:247
-msgid " type: "
-msgstr ""
-
-#: ../src/extension/dependency.cpp:248
-msgid " location: "
-msgstr ""
-
-#: ../src/extension/dependency.cpp:249
-msgid " string: "
-msgstr ""
-
-#: ../src/extension/dependency.cpp:252
-msgid " description: "
-msgstr ""
-
-#: ../src/extension/effect.cpp:39
-msgid " (No preferences)"
-msgstr ""
-
-#. This is some filler text, needs to change before relase
-#: ../src/extension/error-file.cpp:53
-msgid ""
-"<span weight=\"bold\" size=\"larger\">One or more extensions failed to load</"
-"span>\n"
-"\n"
-"The failed extensions have been skipped. Inkscape will continue to run "
-"normally but those extensions will be unavailable. For details to "
-"troubleshoot this problem, please refer to the error log located at: "
-msgstr ""
-
-#: ../src/extension/error-file.cpp:63
-msgid "Show dialog on startup"
-msgstr ""
-
-#: ../src/extension/execution-env.cpp:134
-#, c-format
-msgid "'%s' working, please wait..."
-msgstr ""
-
-#. static int i = 0;
-#. std::cout << "Checking module[" << i++ << "]: " << name << std::endl;
-#: ../src/extension/extension.cpp:252
-msgid ""
-" This is caused by an improper .inx file for this extension. An improper ."
-"inx file could have been caused by a faulty installation of Inkscape."
-msgstr ""
-
-#: ../src/extension/extension.cpp:255
-msgid "an ID was not defined for it."
-msgstr ""
-
-#: ../src/extension/extension.cpp:259
-msgid "there was no name defined for it."
-msgstr ""
-
-#: ../src/extension/extension.cpp:263
-msgid "the XML description of it got lost."
-msgstr ""
-
-#: ../src/extension/extension.cpp:267
-msgid "no implementation was defined for the extension."
-msgstr ""
-
-#. std::cout << "Failed: " << *(_deps[i]) << std::endl;
-#: ../src/extension/extension.cpp:274
-msgid "a dependency was not met."
-msgstr ""
-
-#: ../src/extension/extension.cpp:294
-msgid "Extension \""
-msgstr ""
-
-#: ../src/extension/extension.cpp:294
-msgid "\" failed to load because "
-msgstr ""
-
-#: ../src/extension/extension.cpp:625
-#, c-format
-msgid "Could not create extension error log file '%s'"
-msgstr ""
-
-#: ../src/extension/extension.cpp:723
-msgid "Name:"
-msgstr ""
-
-#: ../src/extension/extension.cpp:724
-msgid "ID:"
-msgstr ""
-
-#: ../src/extension/extension.cpp:725
-msgid "State:"
-msgstr ""
-
-#: ../src/extension/extension.cpp:725
-msgid "Loaded"
-msgstr ""
-
-#: ../src/extension/extension.cpp:725
-msgid "Unloaded"
-msgstr ""
-
-#: ../src/extension/extension.cpp:725
-msgid "Deactivated"
-msgstr ""
-
-#: ../src/extension/extension.cpp:756
-msgid ""
-"Currently there is no help available for this Extension. Please look on the "
-"Inkscape website or ask on the mailing lists if you have questions regarding "
-"this extension."
-msgstr ""
-
-#: ../src/extension/implementation/script.cpp:1060
-msgid ""
-"Inkscape has received additional data from the script executed. The script "
-"did not return an error, but this may indicate the results will not be as "
-"expected."
-msgstr ""
-
-#: ../src/extension/init.cpp:274
-msgid "Null external module directory name. Modules will not be loaded."
-msgstr ""
-
-#: ../src/extension/init.cpp:288
-#: ../src/extension/internal/filter/filter-file.cpp:56
-#, c-format
-msgid ""
-"Modules directory (%s) is unavailable. External modules in that directory "
-"will not be loaded."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:38
-msgid "Adaptive Threshold"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:40
-#: ../src/extension/internal/bitmap/raise.cpp:41
-#: ../src/extension/internal/bitmap/sample.cpp:40
-#: ../src/extension/internal/bluredge.cpp:136 ../src/libgdl/gdl-dock.c:190
-#: ../src/libgdl/gdl-dock-placeholder.c:169
-#: ../src/live_effects/lpe-bendpath.cpp:56
-#: ../src/live_effects/lpe-patternalongpath.cpp:64
-#: ../src/widgets/toolbox.cpp:3095 ../src/widgets/toolbox.cpp:4124
-#: ../share/extensions/foldablebox.inx.h:9
-#: ../share/extensions/interp_att_g.inx.h:26
-msgid "Width"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:41
-#: ../src/extension/internal/bitmap/raise.cpp:42
-#: ../src/extension/internal/bitmap/sample.cpp:41 ../src/libgdl/gdl-dock.c:198
-#: ../src/libgdl/gdl-dock-placeholder.c:177 ../src/widgets/toolbox.cpp:3112
-#: ../share/extensions/foldablebox.inx.h:4
-#: ../share/extensions/interp_att_g.inx.h:6
-msgid "Height"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:42
-#: ../src/filter-enums.cpp:32 ../src/live_effects/effect.cpp:99
-#: ../src/live_effects/lpe-ruler.cpp:50
-msgid "Offset"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:46
-#: ../src/extension/internal/bitmap/addNoise.cpp:57
-#: ../src/extension/internal/bitmap/blur.cpp:44
-#: ../src/extension/internal/bitmap/channel.cpp:63
-#: ../src/extension/internal/bitmap/charcoal.cpp:44
-#: ../src/extension/internal/bitmap/colorize.cpp:55
-#: ../src/extension/internal/bitmap/contrast.cpp:45
-#: ../src/extension/internal/bitmap/cycleColormap.cpp:42
-#: ../src/extension/internal/bitmap/despeckle.cpp:40
-#: ../src/extension/internal/bitmap/edge.cpp:42
-#: ../src/extension/internal/bitmap/emboss.cpp:44
-#: ../src/extension/internal/bitmap/enhance.cpp:39
-#: ../src/extension/internal/bitmap/equalize.cpp:39
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:44
-#: ../src/extension/internal/bitmap/implode.cpp:42
-#: ../src/extension/internal/bitmap/levelChannel.cpp:70
-#: ../src/extension/internal/bitmap/level.cpp:48
-#: ../src/extension/internal/bitmap/medianFilter.cpp:42
-#: ../src/extension/internal/bitmap/modulate.cpp:47
-#: ../src/extension/internal/bitmap/negate.cpp:40
-#: ../src/extension/internal/bitmap/normalize.cpp:40
-#: ../src/extension/internal/bitmap/oilPaint.cpp:42
-#: ../src/extension/internal/bitmap/opacity.cpp:43
-#: ../src/extension/internal/bitmap/raise.cpp:47
-#: ../src/extension/internal/bitmap/reduceNoise.cpp:45
-#: ../src/extension/internal/bitmap/sample.cpp:45
-#: ../src/extension/internal/bitmap/shade.cpp:47
-#: ../src/extension/internal/bitmap/sharpen.cpp:44
-#: ../src/extension/internal/bitmap/solarize.cpp:42
-#: ../src/extension/internal/bitmap/spread.cpp:42
-#: ../src/extension/internal/bitmap/swirl.cpp:42
-#: ../src/extension/internal/bitmap/threshold.cpp:43
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:49
-#: ../src/extension/internal/bitmap/wave.cpp:44
-msgid "Raster"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:48
-msgid "Apply adaptive thresholding to selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:44
-msgid "Add Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:46 ../src/rdf.cpp:238
-msgid "Type"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:47
-msgid "Uniform Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:48
-msgid "Gaussian Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:49
-msgid "Multiplicative Gaussian Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:50
-msgid "Impulse Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:51
-msgid "Laplacian Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:52
-msgid "Poisson Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/addNoise.cpp:59
-msgid "Add random noise to selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/blur.cpp:37
-msgid "Blur"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/blur.cpp:39
-#: ../src/extension/internal/bitmap/charcoal.cpp:39
-#: ../src/extension/internal/bitmap/edge.cpp:38
-#: ../src/extension/internal/bitmap/emboss.cpp:39
-#: ../src/extension/internal/bitmap/medianFilter.cpp:38
-#: ../src/extension/internal/bitmap/oilPaint.cpp:38
-#: ../src/extension/internal/bitmap/sharpen.cpp:39
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:42
-msgid "Radius"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/blur.cpp:40
-#: ../src/extension/internal/bitmap/charcoal.cpp:40
-#: ../src/extension/internal/bitmap/emboss.cpp:40
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:40
-#: ../src/extension/internal/bitmap/sharpen.cpp:40
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:43
-msgid "Sigma"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/blur.cpp:46
-msgid "Blur selected bitmap(s)"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:47
-#: ../src/extension/internal/bitmap/levelChannel.cpp:53
-msgid "Channel"
-msgstr ""
-
-#. TODO: find an unused layer number, forming name from _("Layer ") + "%d"
-#: ../src/extension/internal/bitmap/channel.cpp:49
-#: ../src/ui/dialog/layer-properties.cpp:178
-#: ../src/ui/dialog/layer-properties.cpp:200
-msgid "Layer"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:50
-#: ../src/extension/internal/bitmap/levelChannel.cpp:54
-msgid "Red Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:51
-#: ../src/extension/internal/bitmap/levelChannel.cpp:55
-msgid "Green Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:52
-#: ../src/extension/internal/bitmap/levelChannel.cpp:56
-msgid "Blue Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:53
-#: ../src/extension/internal/bitmap/levelChannel.cpp:57
-msgid "Cyan Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:54
-#: ../src/extension/internal/bitmap/levelChannel.cpp:58
-msgid "Magenta Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:55
-#: ../src/extension/internal/bitmap/levelChannel.cpp:59
-msgid "Yellow Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:56
-#: ../src/extension/internal/bitmap/levelChannel.cpp:60
-msgid "Black Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:57
-#: ../src/extension/internal/bitmap/levelChannel.cpp:61
-msgid "Opacity Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:58
-#: ../src/extension/internal/bitmap/levelChannel.cpp:62
-msgid "Matte Channel"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/channel.cpp:65
-msgid "Extract specific channel from image."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/charcoal.cpp:37
-msgid "Charcoal"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/charcoal.cpp:46
-msgid "Apply charcoal stylization to selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/colorize.cpp:57
-msgid "Colorize selected bitmap(s) with specified color, using given opacity."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/contrast.cpp:39
-msgid "Contrast"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/contrast.cpp:41
-msgid "Adjust"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/contrast.cpp:47
-msgid "Increase or decrease contrast in bitmap(s)"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/cycleColormap.cpp:36
-msgid "Cycle Colormap"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/cycleColormap.cpp:38
-#: ../src/extension/internal/bitmap/spread.cpp:38
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:44
-msgid "Amount"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/cycleColormap.cpp:44
-msgid "Cycle colormap(s) of selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/despeckle.cpp:35
-msgid "Despeckle"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/despeckle.cpp:42
-msgid "Reduce speckle noise of selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/edge.cpp:36
-msgid "Edge"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/edge.cpp:44
-msgid "Highlight edges of selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/emboss.cpp:46
-msgid "Emboss selected bitmap(s) -- highlight edges with 3D effect."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/enhance.cpp:34
-msgid "Enhance"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/enhance.cpp:41
-msgid "Enhance selected bitmap(s) -- minimize noise."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/equalize.cpp:34
-msgid "Equalize"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/equalize.cpp:41
-msgid "Equalize selected bitmap(s) -- histogram equalization."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:37
-#: ../src/filter-enums.cpp:28
-msgid "Gaussian Blur"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:39
-#: ../src/extension/internal/bitmap/implode.cpp:38
-#: ../src/extension/internal/bitmap/solarize.cpp:38
-msgid "Factor"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/gaussianBlur.cpp:46
-msgid "Gaussian blur selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/implode.cpp:36
-msgid "Implode"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/implode.cpp:44
-msgid "Implode selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:51
-msgid "Level (with Channel)"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:64
-#: ../src/extension/internal/bitmap/level.cpp:42
-msgid "Black Point"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:65
-#: ../src/extension/internal/bitmap/level.cpp:43
-msgid "White Point"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:66
-#: ../src/extension/internal/bitmap/level.cpp:44
-msgid "Gamma Correction"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/levelChannel.cpp:72
-msgid ""
-"Level the specified channel of selected bitmap(s) by scaling values falling "
-"between the given ranges to the full color range."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/level.cpp:40
-msgid "Level"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/level.cpp:50
-msgid ""
-"Level selected bitmap(s) by scaling values falling between the given ranges "
-"to the full color range."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/medianFilter.cpp:36
-msgid "Median"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/medianFilter.cpp:44
-msgid ""
-"Replace each pixel component with the median color in a circular "
-"neighborhood."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:39
-msgid "HSB Adjust"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:41
-#: ../src/flood-context.cpp:250 ../src/widgets/sp-color-icc-selector.cpp:236
-#: ../src/widgets/sp-color-icc-selector.cpp:237
-#: ../src/widgets/sp-color-scales.cpp:426
-#: ../src/widgets/sp-color-scales.cpp:427 ../src/widgets/toolbox.cpp:4281
-#: ../share/extensions/color_randomize.inx.h:2
-msgid "Hue"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:42
-#: ../src/flood-context.cpp:251 ../src/ui/dialog/inkscape-preferences.cpp:830
-#: ../src/widgets/sp-color-icc-selector.cpp:236
-#: ../src/widgets/sp-color-icc-selector.cpp:237
-#: ../src/widgets/sp-color-scales.cpp:429
-#: ../src/widgets/sp-color-scales.cpp:430 ../src/widgets/toolbox.cpp:4296
-#: ../share/extensions/color_randomize.inx.h:5
-msgid "Saturation"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:43
-msgid "Brightness"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/modulate.cpp:49
-msgid ""
-"Adjust the amount of hue, saturation, and brightness in selected bitmap(s)"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/negate.cpp:35
-msgid "Negate"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/negate.cpp:42
-msgid "Negate (take inverse) selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/normalize.cpp:35
-msgid "Normalize"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/normalize.cpp:42
-msgid ""
-"Normalize selected bitmap(s), expanding color range to the full possible "
-"range of color."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/oilPaint.cpp:36
-msgid "Oil Paint"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/oilPaint.cpp:44
-msgid "Stylize selected bitmap(s) so that they appear to be painted with oils."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/opacity.cpp:45
-msgid "Modify opacity channel(s) of selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/raise.cpp:39
-msgid "Raise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/raise.cpp:43
-msgid "Raised"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/raise.cpp:49
-msgid ""
-"Alter lightness the edges of selected bitmap(s) to create a raised "
-"appearance."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/reduceNoise.cpp:39
-msgid "Reduce Noise"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/reduceNoise.cpp:41
-#: ../share/extensions/lindenmayer.inx.h:26
-msgid "Order"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/reduceNoise.cpp:47
-msgid ""
-"Reduce noise in selected bitmap(s) using a noise peak elimination filter."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/sample.cpp:38
-msgid "Resample"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/sample.cpp:47
-msgid ""
-"Alter the resolution of selected image by resizing it to the given pixel size"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:39
-msgid "Shade"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:41
-#: ../src/ui/dialog/filter-effects-dialog.cpp:955
-msgid "Azimuth"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:42
-#: ../src/ui/dialog/filter-effects-dialog.cpp:956
-msgid "Elevation"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:43
-msgid "Colored Shading"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/shade.cpp:49
-msgid "Shade selected bitmap(s) simulating distant light source."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/sharpen.cpp:46
-msgid "Sharpen selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/solarize.cpp:44
-msgid "Solarize selected bitmap(s), like overexposing photographic film."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/spread.cpp:36
-msgid "Dither"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/spread.cpp:44
-msgid ""
-"Randomly scatter pixels in selected bitmap(s), within the given radius of "
-"the original position"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/swirl.cpp:36
-msgid "Swirl"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/swirl.cpp:38
-#: ../share/extensions/grid_polar.inx.h:7
-msgid "Degrees"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/swirl.cpp:44
-msgid "Swirl selected bitmap(s) around center point."
-msgstr ""
-
-#. TRANSLATORS: see http://docs.gimp.org/en/gimp-tool-threshold.html
-#: ../src/extension/internal/bitmap/threshold.cpp:37
-#: ../src/extension/internal/bitmap/threshold.cpp:39
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:45
-msgid "Threshold"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/threshold.cpp:45
-msgid "Threshold selected bitmap(s)."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:40
-msgid "Unsharp Mask"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/unsharpmask.cpp:51
-msgid "Sharpen selected bitmap(s) using unsharp mask algorithms."
-msgstr ""
-
-#: ../src/extension/internal/bitmap/wave.cpp:37
-msgid "Wave"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/wave.cpp:39
-msgid "Amplitude"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/wave.cpp:40
-msgid "Wavelength"
-msgstr ""
-
-#: ../src/extension/internal/bitmap/wave.cpp:46
-msgid "Alter selected bitmap(s) along sine wave."
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:134
-msgid "Inset/Outset Halo"
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:136
-msgid "Width in px of the halo"
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:137
-msgid "Number of steps"
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:137
-msgid "Number of inset/outset copies of the object to make"
-msgstr ""
-
-#: ../src/extension/internal/bluredge.cpp:141
-#: ../share/extensions/extrude.inx.h:2 ../share/extensions/interp.inx.h:3
-#: ../share/extensions/motion.inx.h:2
-#: ../share/extensions/pathalongpath.inx.h:4
-#: ../share/extensions/pathscatter.inx.h:5
-msgid "Generate from Path"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:274
-#: ../share/extensions/ps_input.inx.h:1
-msgid "PostScript"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:276
-#: ../src/extension/internal/cairo-ps-out.cpp:313
-msgid "Restrict to PS level"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:277
-#: ../src/extension/internal/cairo-ps-out.cpp:314
-msgid "PostScript level 3"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:279
-#: ../src/extension/internal/cairo-ps-out.cpp:316
-msgid "PostScript level 2"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:282
-#: ../src/extension/internal/cairo-ps-out.cpp:319
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:219
-#: ../src/extension/internal/emf-win32-inout.cpp:2430
-msgid "Convert texts to paths"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:283
-#: ../src/extension/internal/cairo-ps-out.cpp:320
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:220
-msgid "Rasterize filter effects"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:284
-#: ../src/extension/internal/cairo-ps-out.cpp:321
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:221
-msgid "Resolution for rasterization (dpi)"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:285
-#: ../src/extension/internal/cairo-ps-out.cpp:322
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:222
-msgid "Export area is drawing"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:286
-#: ../src/extension/internal/cairo-ps-out.cpp:323
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:223
-msgid "Export area is page"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:287
-#: ../src/extension/internal/cairo-ps-out.cpp:324
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:224
-msgid "Limit export to the object with ID"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:291
-#: ../share/extensions/ps_input.inx.h:2
-msgid "PostScript (*.ps)"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:292
-msgid "PostScript File"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:311
-#: ../share/extensions/eps_input.inx.h:2
-msgid "Encapsulated PostScript"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:328
-#: ../share/extensions/eps_input.inx.h:3
-msgid "Encapsulated PostScript (*.eps)"
-msgstr ""
-
-#: ../src/extension/internal/cairo-ps-out.cpp:329
-msgid "Encapsulated PostScript File"
-msgstr ""
-
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:216
-msgid "Restrict to PDF version"
-msgstr ""
-
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:217
-msgid "PDF 1.4"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2400
-msgid "EMF Input"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2405
-msgid "Enhanced Metafiles (*.emf)"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2406
-msgid "Enhanced Metafiles"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2414
-msgid "WMF Input"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2419
-msgid "Windows Metafiles (*.wmf)"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2420
-msgid "Windows Metafiles"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2428
-msgid "EMF Output"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2434
-msgid "Enhanced Metafile (*.emf)"
-msgstr ""
-
-#: ../src/extension/internal/emf-win32-inout.cpp:2435
-msgid "Enhanced Metafile"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:35
-msgid "Drop Shadow"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:37
-#: ../src/extension/internal/filter/drop-shadow.h:92
-msgid "Blur radius, px"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:38
-#: ../src/extension/internal/filter/drop-shadow.h:93
-#: ../src/ui/widget/object-composite-settings.cpp:62
-#: ../src/ui/widget/selected-style.cpp:1033
-#: ../src/ui/widget/selected-style.cpp:1034
-msgid "Opacity, %"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:39
-#: ../src/extension/internal/filter/drop-shadow.h:94
-msgid "Horizontal offset, px"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:40
-#: ../src/extension/internal/filter/drop-shadow.h:95
-msgid "Vertical offset, px"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:44
-#: ../src/extension/internal/filter/drop-shadow.h:99
-#: ../src/extension/internal/filter/filter.cpp:214
-#: ../src/extension/internal/filter/filter-file.cpp:148
-#: ../src/extension/internal/filter/snow.h:38
-#: ../src/ui/dialog/inkscape-preferences.cpp:733
-msgid "Filters"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:48
-msgid "Black, blurred drop shadow"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:90
-msgid "Drop Glow"
-msgstr ""
-
-#: ../src/extension/internal/filter/drop-shadow.h:103
-msgid "White, blurred drop glow"
-msgstr ""
-
-#: ../src/extension/internal/filter/filter-file.cpp:32
-msgid "Bundled"
-msgstr ""
-
-#: ../src/extension/internal/filter/filter-file.cpp:33
-msgid "Personal"
-msgstr ""
-
-#: ../src/extension/internal/filter/filter-file.cpp:44
-msgid "Null external module directory name. Filters will not be loaded."
-msgstr ""
-
-#: ../src/extension/internal/filter/snow.h:32
-msgid "Snow crest"
-msgstr ""
-
-#: ../src/extension/internal/filter/snow.h:34
-msgid "Drift Size"
-msgstr ""
-
-#: ../src/extension/internal/filter/snow.h:42
-msgid "Snow has fallen on object"
-msgstr ""
-
-#: ../src/extension/internal/gdkpixbuf-input.cpp:127
-#, c-format
-msgid "%s GDK pixbuf Input"
-msgstr ""
-
-#: ../src/extension/internal/gimpgrad.cpp:274
-msgid "GIMP Gradients"
-msgstr ""
-
-#: ../src/extension/internal/gimpgrad.cpp:279
-msgid "GIMP Gradient (*.ggr)"
-msgstr ""
-
-#: ../src/extension/internal/gimpgrad.cpp:280
-msgid "Gradients used in GIMP"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:192 ../src/ui/widget/panel.cpp:112
-msgid "Grid"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:194
-msgid "Line Width"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:195
-msgid "Horizontal Spacing"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:196
-msgid "Vertical Spacing"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:197
-msgid "Horizontal Offset"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:198
-msgid "Vertical Offset"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:202
-#: ../share/extensions/draw_from_triangle.inx.h:30
-#: ../share/extensions/eqtexsvg.inx.h:3
-#: ../share/extensions/foldablebox.inx.h:6
-#: ../share/extensions/funcplot.inx.h:13 ../share/extensions/gears.inx.h:5
-#: ../share/extensions/grid_cartesian.inx.h:15
-#: ../share/extensions/grid_polar.inx.h:18
-#: ../share/extensions/guides_creator.inx.h:17
-#: ../share/extensions/lindenmayer.inx.h:31
-#: ../share/extensions/param_curves.inx.h:9
-#: ../share/extensions/perfectboundcover.inx.h:17
-#: ../share/extensions/polyhedron_3d.inx.h:31
-#: ../share/extensions/printing-marks.inx.h:14
-#: ../share/extensions/render_alphabetsoup.inx.h:3
-#: ../share/extensions/render_barcode.inx.h:5
-#: ../share/extensions/rtree.inx.h:4 ../share/extensions/spirograph.inx.h:6
-#: ../share/extensions/svgcalendar.inx.h:22
-#: ../share/extensions/triangle.inx.h:10
-msgid "Render"
-msgstr ""
-
-#: ../src/extension/internal/grid.cpp:204
-msgid "Draw a path which is a grid"
-msgstr ""
-
-#: ../src/extension/internal/javafx-out.cpp:965
-msgid "JavaFX Output"
-msgstr ""
-
-#: ../src/extension/internal/javafx-out.cpp:970
-msgid "JavaFX (*.fx)"
-msgstr ""
-
-#: ../src/extension/internal/javafx-out.cpp:971
-msgid "JavaFX Raytracer File"
-msgstr ""
-
-#: ../src/extension/internal/latex-pstricks.cpp:337
-msgid "LaTeX Print"
-msgstr ""
-
-#: ../src/extension/internal/latex-pstricks-out.cpp:105
-msgid "LaTeX Output"
-msgstr ""
-
-#: ../src/extension/internal/latex-pstricks-out.cpp:110
-msgid "LaTeX With PSTricks macros (*.tex)"
-msgstr ""
-
-#: ../src/extension/internal/latex-pstricks-out.cpp:111
-msgid "LaTeX PSTricks File"
-msgstr ""
-
-#: ../src/extension/internal/odf.cpp:2417
-msgid "OpenDocument Drawing Output"
-msgstr ""
-
-#: ../src/extension/internal/odf.cpp:2422
-msgid "OpenDocument drawing (*.odg)"
-msgstr ""
-
-#: ../src/extension/internal/odf.cpp:2423
-msgid "OpenDocument drawing file"
-msgstr ""
-
-#. TRANSLATORS: The following are document crop settings for PDF import
-#. more info: http://www.acrobatusers.com/tech_corners/javascript_corner/tips/2006/page_bounds/
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:56
-msgid "media box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:57
-msgid "crop box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:58
-msgid "trim box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:59
-msgid "bleed box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:60
-msgid "art box"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:72
-msgid "Select page:"
-msgstr ""
-
-#. Display total number of pages
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:86
-#, c-format
-msgid "out of %i"
-msgstr ""
-
-#. Crop settings
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:92
-msgid "Clip to:"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:104
-msgid "Page settings"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:106
-msgid "Precision of approximating gradient meshes:"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:107
-msgid ""
-"<b>Note</b>: setting the precision too high may result in a large SVG file "
-"and slow performance."
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:112
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:393
-msgid "rough"
-msgstr ""
-
-#. Text options
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:116
-msgid "Text handling:"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:118
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:119
-msgid "Import text as text"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:120
-msgid "Replace PDF fonts by closest-named installed fonts"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:123
-msgid "Embed images"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:126
-msgid "Import settings"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:248
-msgid "PDF Import Settings"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:396
-msgid "pdfinput|medium"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:397
-msgid "fine"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:398
-msgid "very fine"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:753
-msgid "PDF Input"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:758
-msgid "Adobe PDF (*.pdf)"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:759
-msgid "Adobe Portable Document Format"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:766
-msgid "AI Input"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:771
-msgid "Adobe Illustrator 9.0 and above (*.ai)"
-msgstr ""
-
-#: ../src/extension/internal/pdfinput/pdf-input.cpp:772
-msgid "Open files saved in Adobe Illustrator 9.0 and newer versions"
-msgstr ""
-
-#: ../src/extension/internal/pov-out.cpp:700
-msgid "PovRay Output"
-msgstr ""
-
-#: ../src/extension/internal/pov-out.cpp:705
-msgid "PovRay (*.pov) (paths and shapes only)"
-msgstr ""
-
-#: ../src/extension/internal/pov-out.cpp:706
-msgid "PovRay Raytracer File"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:55
-msgid "SVG Input"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:60
-msgid "Scalable Vector Graphic (*.svg)"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:61
-msgid "Inkscape native file format and W3C standard"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:69
-msgid "SVG Output Inkscape"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:74
-msgid "Inkscape SVG (*.svg)"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:75
-msgid "SVG format with Inkscape extensions"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:83
-msgid "SVG Output"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:88
-msgid "Plain SVG (*.svg)"
-msgstr ""
-
-#: ../src/extension/internal/svg.cpp:89
-msgid "Scalable Vector Graphics format as defined by the W3C"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:47
-msgid "SVGZ Input"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:53 ../src/extension/internal/svgz.cpp:67
-msgid "Compressed Inkscape SVG (*.svgz)"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:54
-msgid "SVG file format compressed with GZip"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:62 ../src/extension/internal/svgz.cpp:76
-msgid "SVGZ Output"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:68
-msgid "Inkscape's native file format compressed with GZip"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:81
-msgid "Compressed plain SVG (*.svgz)"
-msgstr ""
-
-#: ../src/extension/internal/svgz.cpp:82
-msgid "Scalable Vector Graphics format compressed with GZip"
-msgstr ""
-
-#: ../src/extension/internal/win32.cpp:485
-msgid "Windows 32-bit Print"
-msgstr ""
-
-#: ../src/extension/internal/wpg-input.cpp:102
-msgid "WPG Input"
-msgstr ""
-
-#: ../src/extension/internal/wpg-input.cpp:107
-msgid "WordPerfect Graphics (*.wpg)"
-msgstr ""
-
-#: ../src/extension/internal/wpg-input.cpp:108
-msgid "Vector graphics format used by Corel WordPerfect"
-msgstr ""
-
-#: ../src/extension/prefdialog.cpp:236
-msgid "Live preview"
-msgstr ""
-
-#: ../src/extension/prefdialog.cpp:236
-msgid "Is the effect previewed live on canvas?"
-msgstr ""
-
-#. We can't call sp_ui_error_dialog because we may be
-#. running from the console, in which case calling sp_ui
-#. routines will cause a segfault. See bug 1000350 - bryce
-#. sp_ui_error_dialog(_("Format autodetect failed. The file is being opened as SVG."));
-#: ../src/extension/system.cpp:107
-msgid "Format autodetect failed. The file is being opened as SVG."
-msgstr ""
-
-#: ../src/file.cpp:147
-msgid "default.svg"
-msgstr ""
-
-#: ../src/file.cpp:265 ../src/file.cpp:1071
-#, c-format
-msgid "Failed to load the requested file %s"
-msgstr ""
-
-#: ../src/file.cpp:290
-msgid "Document not saved yet. Cannot revert."
-msgstr ""
-
-#: ../src/file.cpp:296
-#, c-format
-msgid "Changes will be lost! Are you sure you want to reload document %s?"
-msgstr ""
-
-#: ../src/file.cpp:325
-msgid "Document reverted."
-msgstr ""
-
-#: ../src/file.cpp:327
-msgid "Document not reverted."
-msgstr ""
-
-#: ../src/file.cpp:477
-msgid "Select file to open"
-msgstr ""
-
-#: ../src/file.cpp:564
-msgid "Vacuum <defs>"
-msgstr ""
-
-#: ../src/file.cpp:569
-#, c-format
-msgid "Removed <b>%i</b> unused definition in <defs>."
-msgid_plural "Removed <b>%i</b> unused definitions in <defs>."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/file.cpp:574
-msgid "No unused definitions in <defs>."
-msgstr ""
-
-#: ../src/file.cpp:605
-#, c-format
-msgid ""
-"No Inkscape extension found to save document (%s). This may have been "
-"caused by an unknown filename extension."
-msgstr ""
-
-#: ../src/file.cpp:606 ../src/file.cpp:614 ../src/file.cpp:622
-#: ../src/file.cpp:628 ../src/file.cpp:633
-msgid "Document not saved."
-msgstr ""
-
-#: ../src/file.cpp:613
-#, c-format
-msgid ""
-"File %s is write protected. Please remove write protection and try again."
-msgstr ""
-
-#: ../src/file.cpp:621
-#, c-format
-msgid "File %s could not be saved."
-msgstr ""
-
-#: ../src/file.cpp:638
-msgid "Document saved."
-msgstr ""
-
-#. We are saving for the first time; create a unique default filename
-#: ../src/file.cpp:770 ../src/file.cpp:1208
-#, c-format
-msgid "drawing%s"
-msgstr ""
-
-#: ../src/file.cpp:776
-#, c-format
-msgid "drawing-%d%s"
-msgstr ""
-
-#: ../src/file.cpp:780
-#, c-format
-msgid "%s"
-msgstr ""
-
-#: ../src/file.cpp:795
-msgid "Select file to save a copy to"
-msgstr ""
-
-#: ../src/file.cpp:797
-msgid "Select file to save to"
-msgstr ""
-
-#: ../src/file.cpp:892
-msgid "No changes need to be saved."
-msgstr ""
-
-#: ../src/file.cpp:909
-msgid "Saving document..."
-msgstr ""
-
-#: ../src/file.cpp:1068
-msgid "Import"
-msgstr ""
-
-#: ../src/file.cpp:1118
-msgid "Select file to import"
-msgstr ""
-
-#: ../src/file.cpp:1230
-msgid "Select file to export to"
-msgstr ""
-
-#: ../src/file.cpp:1473 ../src/verbs.cpp:2265
-msgid "Import From Open Clip Art Library"
-msgstr ""
-
-#: ../src/filter-enums.cpp:20
-msgid "Blend"
-msgstr ""
-
-#: ../src/filter-enums.cpp:21
-msgid "Color Matrix"
-msgstr ""
-
-#: ../src/filter-enums.cpp:22
-msgid "Component Transfer"
-msgstr ""
-
-#: ../src/filter-enums.cpp:23
-msgid "Composite"
-msgstr ""
-
-#: ../src/filter-enums.cpp:24
-msgid "Convolve Matrix"
-msgstr ""
-
-#: ../src/filter-enums.cpp:25
-msgid "Diffuse Lighting"
-msgstr ""
-
-#: ../src/filter-enums.cpp:26
-msgid "Displacement Map"
-msgstr ""
-
-#: ../src/filter-enums.cpp:27
-msgid "Flood"
-msgstr ""
-
-#: ../src/filter-enums.cpp:29 ../src/selection-describer.cpp:55
-msgid "Image"
-msgstr ""
-
-#: ../src/filter-enums.cpp:30
-msgid "Merge"
-msgstr ""
-
-#: ../src/filter-enums.cpp:33
-msgid "Specular Lighting"
-msgstr ""
-
-#: ../src/filter-enums.cpp:34
-msgid "Tile"
-msgstr ""
-
-#: ../src/filter-enums.cpp:35 ../src/filter-enums.cpp:119
-msgid "Turbulence"
-msgstr ""
-
-#: ../src/filter-enums.cpp:40
-msgid "Source Graphic"
-msgstr ""
-
-#: ../src/filter-enums.cpp:41
-msgid "Source Alpha"
-msgstr ""
-
-#: ../src/filter-enums.cpp:42
-msgid "Background Image"
-msgstr ""
-
-#: ../src/filter-enums.cpp:43
-msgid "Background Alpha"
-msgstr ""
-
-#: ../src/filter-enums.cpp:44
-msgid "Fill Paint"
-msgstr ""
-
-#: ../src/filter-enums.cpp:45
-msgid "Stroke Paint"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/filter-enums.cpp:53
-msgid "filterBlendMode|Normal"
-msgstr ""
-
-#: ../src/filter-enums.cpp:54
-msgid "Multiply"
-msgstr ""
-
-#: ../src/filter-enums.cpp:55
-msgid "Screen"
-msgstr ""
-
-#: ../src/filter-enums.cpp:56
-msgid "Darken"
-msgstr ""
-
-#: ../src/filter-enums.cpp:57
-msgid "Lighten"
-msgstr ""
-
-#: ../src/filter-enums.cpp:63
-msgid "Matrix"
-msgstr ""
-
-#: ../src/filter-enums.cpp:64
-msgid "Saturate"
-msgstr ""
-
-#: ../src/filter-enums.cpp:65
-msgid "Hue Rotate"
-msgstr ""
-
-#: ../src/filter-enums.cpp:66
-msgid "Luminance to Alpha"
-msgstr ""
-
-#. File
-#: ../src/filter-enums.cpp:72 ../src/verbs.cpp:2242
-msgid "Default"
-msgstr ""
-
-#: ../src/filter-enums.cpp:73
-msgid "Over"
-msgstr ""
-
-#: ../src/filter-enums.cpp:74
-msgid "In"
-msgstr ""
-
-#: ../src/filter-enums.cpp:75
-msgid "Out"
-msgstr ""
-
-#: ../src/filter-enums.cpp:76
-msgid "Atop"
-msgstr ""
-
-#: ../src/filter-enums.cpp:77
-msgid "XOR"
-msgstr ""
-
-#: ../src/filter-enums.cpp:78
-msgid "Arithmetic"
-msgstr ""
-
-#: ../src/filter-enums.cpp:84
-msgid "Identity"
-msgstr ""
-
-#: ../src/filter-enums.cpp:85
-msgid "Table"
-msgstr ""
-
-#: ../src/filter-enums.cpp:86
-msgid "Discrete"
-msgstr ""
-
-#: ../src/filter-enums.cpp:87
-msgid "Linear"
-msgstr ""
-
-#: ../src/filter-enums.cpp:88
-msgid "Gamma"
-msgstr ""
-
-#: ../src/filter-enums.cpp:94 ../src/selection-chemistry.cpp:316
-#: ../src/widgets/gradient-selector.cpp:139
-msgid "Duplicate"
-msgstr ""
-
-#: ../src/filter-enums.cpp:95
-msgid "Wrap"
-msgstr ""
-
-#: ../src/filter-enums.cpp:96 ../src/flood-context.cpp:264
-#: ../src/live_effects/lpe-ruler.cpp:34
-#: ../src/ui/dialog/document-properties.cpp:327
-#: ../src/ui/dialog/filter-effects-dialog.cpp:468
-#: ../src/ui/dialog/inkscape-preferences.cpp:259
-#: ../src/ui/dialog/inkscape-preferences.cpp:422
-#: ../src/ui/dialog/inkscape-preferences.cpp:554
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-#: ../src/ui/dialog/inkscape-preferences.cpp:1216 ../src/verbs.cpp:2239
-#: ../src/widgets/stroke-style.cpp:765 ../src/widgets/toolbox.cpp:3887
-#: ../share/extensions/grid_polar.inx.h:16
-#: ../share/extensions/guides_creator.inx.h:15
-#: ../share/extensions/scour.inx.h:7
-msgid "None"
-msgstr ""
-
-#: ../src/filter-enums.cpp:102 ../src/flood-context.cpp:247
-#: ../src/widgets/sp-color-icc-selector.cpp:234
-#: ../src/widgets/sp-color-scales.cpp:400
-#: ../src/widgets/sp-color-scales.cpp:401
-msgid "Red"
-msgstr ""
-
-#: ../src/filter-enums.cpp:103 ../src/flood-context.cpp:248
-#: ../src/widgets/sp-color-icc-selector.cpp:234
-#: ../src/widgets/sp-color-scales.cpp:403
-#: ../src/widgets/sp-color-scales.cpp:404
-msgid "Green"
-msgstr ""
-
-#: ../src/filter-enums.cpp:104 ../src/flood-context.cpp:249
-#: ../src/widgets/sp-color-icc-selector.cpp:234
-#: ../src/widgets/sp-color-scales.cpp:406
-#: ../src/widgets/sp-color-scales.cpp:407
-msgid "Blue"
-msgstr ""
-
-#: ../src/filter-enums.cpp:105 ../src/flood-context.cpp:253
-msgid "Alpha"
-msgstr ""
-
-#: ../src/filter-enums.cpp:111
-msgid "Erode"
-msgstr ""
-
-#: ../src/filter-enums.cpp:112
-msgid "Dilate"
-msgstr ""
-
-#: ../src/filter-enums.cpp:118
-msgid "Fractal Noise"
-msgstr ""
-
-#: ../src/filter-enums.cpp:125
-msgid "Distant Light"
-msgstr ""
-
-#: ../src/filter-enums.cpp:126
-msgid "Point Light"
-msgstr ""
-
-#: ../src/filter-enums.cpp:127
-msgid "Spot Light"
-msgstr ""
-
-#: ../src/flood-context.cpp:246
-msgid "Visible Colors"
-msgstr ""
-
-#: ../src/flood-context.cpp:252 ../src/widgets/sp-color-icc-selector.cpp:237
-#: ../src/widgets/sp-color-scales.cpp:432
-#: ../src/widgets/sp-color-scales.cpp:433 ../src/widgets/toolbox.cpp:4311
-#: ../share/extensions/color_randomize.inx.h:3
-msgid "Lightness"
-msgstr ""
-
-#: ../src/flood-context.cpp:265 ../src/ui/dialog/inkscape-preferences.cpp:1072
-msgid "Small"
-msgstr ""
-
-#: ../src/flood-context.cpp:266
-msgid "Medium"
-msgstr ""
-
-#: ../src/flood-context.cpp:267 ../src/ui/dialog/inkscape-preferences.cpp:1072
-msgid "Large"
-msgstr ""
-
-#: ../src/flood-context.cpp:469
-msgid "<b>Too much inset</b>, the result is empty."
-msgstr ""
-
-#: ../src/flood-context.cpp:509
-#, c-format
-msgid ""
-"Area filled, path with <b>%d</b> node created and unioned with selection."
-msgid_plural ""
-"Area filled, path with <b>%d</b> nodes created and unioned with selection."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/flood-context.cpp:513
-#, c-format
-msgid "Area filled, path with <b>%d</b> node created."
-msgid_plural "Area filled, path with <b>%d</b> nodes created."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/flood-context.cpp:785 ../src/flood-context.cpp:1099
-msgid "<b>Area is not bounded</b>, cannot fill."
-msgstr ""
-
-#: ../src/flood-context.cpp:1104
-msgid ""
-"<b>Only the visible part of the bounded area was filled.</b> If you want to "
-"fill all of the area, undo, zoom out, and fill again."
-msgstr ""
-
-#: ../src/flood-context.cpp:1122 ../src/flood-context.cpp:1282
-msgid "Fill bounded area"
-msgstr ""
-
-#: ../src/flood-context.cpp:1142
-msgid "Set style on object"
-msgstr ""
-
-#: ../src/flood-context.cpp:1201
-msgid "<b>Draw over</b> areas to add to fill, hold <b>Alt</b> for touch fill"
-msgstr ""
-
-#: ../src/gradient-context.cpp:132 ../src/gradient-drag.cpp:75
-msgid "Linear gradient <b>start</b>"
-msgstr ""
-
-#. POINT_LG_BEGIN
-#: ../src/gradient-context.cpp:133 ../src/gradient-drag.cpp:76
-msgid "Linear gradient <b>end</b>"
-msgstr ""
-
-#: ../src/gradient-context.cpp:134 ../src/gradient-drag.cpp:77
-msgid "Linear gradient <b>mid stop</b>"
-msgstr ""
-
-#: ../src/gradient-context.cpp:135 ../src/gradient-drag.cpp:78
-msgid "Radial gradient <b>center</b>"
-msgstr ""
-
-#: ../src/gradient-context.cpp:136 ../src/gradient-context.cpp:137
-#: ../src/gradient-drag.cpp:79 ../src/gradient-drag.cpp:80
-msgid "Radial gradient <b>radius</b>"
-msgstr ""
-
-#: ../src/gradient-context.cpp:138 ../src/gradient-drag.cpp:81
-msgid "Radial gradient <b>focus</b>"
-msgstr ""
-
-#. POINT_RG_FOCUS
-#: ../src/gradient-context.cpp:139 ../src/gradient-context.cpp:140
-#: ../src/gradient-drag.cpp:82 ../src/gradient-drag.cpp:83
-msgid "Radial gradient <b>mid stop</b>"
-msgstr ""
-
-#. TRANSLATORS: %s will be substituted with the point name (see previous messages); This is part of a compound message
-#: ../src/gradient-context.cpp:165
-#, c-format
-msgid "%s selected"
-msgstr ""
-
-#. TRANSLATORS: Mind the space in front. This is part of a compound message
-#: ../src/gradient-context.cpp:167 ../src/gradient-context.cpp:176
-#, c-format
-msgid " out of %d gradient handle"
-msgid_plural " out of %d gradient handles"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message
-#: ../src/gradient-context.cpp:168 ../src/gradient-context.cpp:177
-#: ../src/gradient-context.cpp:184
-#, c-format
-msgid " on %d selected object"
-msgid_plural " on %d selected objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: This is a part of a compound message (out of two more indicating: grandint handle count & object count)
-#: ../src/gradient-context.cpp:174
-#, c-format
-msgid ""
-"One handle merging %d stop (drag with <b>Shift</b> to separate) selected"
-msgid_plural ""
-"One handle merging %d stops (drag with <b>Shift</b> to separate) selected"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: The plural refers to number of selected gradient handles. This is part of a compound message (part two indicates selected object count)
-#: ../src/gradient-context.cpp:182
-#, c-format
-msgid "<b>%d</b> gradient handle selected out of %d"
-msgid_plural "<b>%d</b> gradient handles selected out of %d"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: The plural refers to number of selected objects
-#: ../src/gradient-context.cpp:189
-#, c-format
-msgid "<b>No</b> gradient handles selected out of %d on %d selected object"
-msgid_plural ""
-"<b>No</b> gradient handles selected out of %d on %d selected objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/gradient-context.cpp:389 ../src/gradient-context.cpp:482
-#: ../src/widgets/gradient-vector.cpp:744
-msgid "Add gradient stop"
-msgstr ""
-
-#: ../src/gradient-context.cpp:457
-msgid "Simplify gradient"
-msgstr ""
-
-#: ../src/gradient-context.cpp:534
-msgid "Create default gradient"
-msgstr ""
-
-#: ../src/gradient-context.cpp:588
-msgid "<b>Draw around</b> handles to select them"
-msgstr ""
-
-#: ../src/gradient-context.cpp:686
-msgid "<b>Ctrl</b>: snap gradient angle"
-msgstr ""
-
-#: ../src/gradient-context.cpp:687
-msgid "<b>Shift</b>: draw gradient around the starting point"
-msgstr ""
-
-#: ../src/gradient-context.cpp:807
-msgid "Invert gradient"
-msgstr ""
-
-#: ../src/gradient-context.cpp:924
-#, c-format
-msgid "<b>Gradient</b> for %d object; with <b>Ctrl</b> to snap angle"
-msgid_plural "<b>Gradient</b> for %d objects; with <b>Ctrl</b> to snap angle"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/gradient-context.cpp:928
-msgid "Select <b>objects</b> on which to create gradient."
-msgstr ""
-
-#: ../src/gradient-drag.cpp:591
-msgid "Merge gradient handles"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:912
-msgid "Move gradient handle"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:965 ../src/widgets/gradient-vector.cpp:776
-msgid "Delete gradient stop"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1129
-#, c-format
-msgid ""
-"%s %d for: %s%s; drag with <b>Ctrl</b> to snap offset; click with <b>Ctrl"
-"+Alt</b> to delete stop"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1133 ../src/gradient-drag.cpp:1140
-msgid " (stroke)"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1137
-#, c-format
-msgid ""
-"%s for: %s%s; drag with <b>Ctrl</b> to snap angle, with <b>Ctrl+Alt</b> to "
-"preserve angle, with <b>Ctrl+Shift</b> to scale around center"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1145
-#, c-format
-msgid ""
-"Radial gradient <b>center</b> and <b>focus</b>; drag with <b>Shift</b> to "
-"separate focus"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1148
-#, c-format
-msgid ""
-"Gradient point shared by <b>%d</b> gradient; drag with <b>Shift</b> to "
-"separate"
-msgid_plural ""
-"Gradient point shared by <b>%d</b> gradients; drag with <b>Shift</b> to "
-"separate"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/gradient-drag.cpp:1823
-msgid "Move gradient handle(s)"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:1859
-msgid "Move gradient mid stop(s)"
-msgstr ""
-
-#: ../src/gradient-drag.cpp:2147
-msgid "Delete gradient stop(s)"
-msgstr ""
-
-#: ../src/helper/units.cpp:37 ../src/live_effects/lpe-ruler.cpp:43
-#: ../share/extensions/foldablebox.inx.h:8
-#: ../share/extensions/interp_att_g.inx.h:24
-#: ../share/extensions/printing-marks.inx.h:19
-msgid "Unit"
-msgstr ""
-
-#. Add the units menu.
-#: ../src/helper/units.cpp:37 ../src/widgets/select-toolbar.cpp:504
-#: ../src/widgets/toolbox.cpp:1504 ../src/widgets/toolbox.cpp:3156
-#: ../src/widgets/toolbox.cpp:5660 ../src/widgets/toolbox.cpp:7203
-msgid "Units"
-msgstr ""
-
-#: ../src/helper/units.cpp:38
-msgid "Point"
-msgstr ""
-
-#: ../src/helper/units.cpp:38 ../src/ui/widget/selected-style.cpp:293
-msgid "pt"
-msgstr ""
-
-#: ../src/helper/units.cpp:38 ../share/extensions/perfectboundcover.inx.h:15
-msgid "Points"
-msgstr ""
-
-#: ../src/helper/units.cpp:38
-msgid "Pt"
-msgstr ""
-
-#: ../src/helper/units.cpp:39
-msgid "Pica"
-msgstr ""
-
-#: ../src/helper/units.cpp:39
-msgid "pc"
-msgstr ""
-
-#: ../src/helper/units.cpp:39
-msgid "Picas"
-msgstr ""
-
-#: ../src/helper/units.cpp:39
-msgid "Pc"
-msgstr ""
-
-#: ../src/helper/units.cpp:40
-msgid "Pixel"
-msgstr ""
-
-#: ../src/helper/units.cpp:40 ../src/ui/dialog/inkscape-preferences.cpp:246
-#: ../src/ui/dialog/inkscape-preferences.cpp:250
-#: ../src/ui/dialog/inkscape-preferences.cpp:253
-#: ../src/ui/widget/selected-style.cpp:289
-msgid "px"
-msgstr ""
-
-#: ../src/helper/units.cpp:40
-msgid "Pixels"
-msgstr ""
-
-#: ../src/helper/units.cpp:40
-msgid "Px"
-msgstr ""
-
-#. You can add new elements from this point forward
-#: ../src/helper/units.cpp:42 ../share/extensions/straightseg.inx.h:3
-msgid "Percent"
-msgstr ""
-
-#: ../src/helper/units.cpp:42 ../src/ui/dialog/inkscape-preferences.cpp:266
-msgid "%"
-msgstr ""
-
-#: ../src/helper/units.cpp:42
-msgid "Percents"
-msgstr ""
-
-#: ../src/helper/units.cpp:43
-msgid "Millimeter"
-msgstr ""
-
-#: ../src/helper/units.cpp:43 ../src/ui/widget/selected-style.cpp:297
-msgid "mm"
-msgstr ""
-
-#: ../src/helper/units.cpp:43
-msgid "Millimeters"
-msgstr ""
-
-#: ../src/helper/units.cpp:44
-msgid "Centimeter"
-msgstr ""
-
-#: ../src/helper/units.cpp:44
-msgid "cm"
-msgstr ""
-
-#: ../src/helper/units.cpp:44
-msgid "Centimeters"
-msgstr ""
-
-#: ../src/helper/units.cpp:45
-msgid "Meter"
-msgstr ""
-
-#: ../src/helper/units.cpp:45
-msgid "m"
-msgstr ""
-
-#: ../src/helper/units.cpp:45
-msgid "Meters"
-msgstr ""
-
-#. no svg_unit
-#: ../src/helper/units.cpp:46
-msgid "Inch"
-msgstr ""
-
-#: ../src/helper/units.cpp:46
-msgid "in"
-msgstr ""
-
-#: ../src/helper/units.cpp:46
-msgid "Inches"
-msgstr ""
-
-#: ../src/helper/units.cpp:47
-msgid "Foot"
-msgstr ""
-
-#: ../src/helper/units.cpp:47
-msgid "ft"
-msgstr ""
-
-#: ../src/helper/units.cpp:47
-msgid "Feet"
-msgstr ""
-
-#. Volatiles do not have default, so there are none here
-#. TRANSLATORS: for info, see http://www.w3.org/TR/REC-CSS2/syndata.html#length-units
-#: ../src/helper/units.cpp:50
-msgid "Em square"
-msgstr ""
-
-#: ../src/helper/units.cpp:50
-msgid "em"
-msgstr ""
-
-#: ../src/helper/units.cpp:50
-msgid "Em squares"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/REC-CSS2/syndata.html#length-units
-#: ../src/helper/units.cpp:52
-msgid "Ex square"
-msgstr ""
-
-#: ../src/helper/units.cpp:52
-msgid "ex"
-msgstr ""
-
-#: ../src/helper/units.cpp:52
-msgid "Ex squares"
-msgstr ""
-
-#: ../src/inkscape.cpp:328
-msgid "Autosaving documents..."
-msgstr ""
-
-#: ../src/inkscape.cpp:399
-msgid "Autosave failed! Could not find inkscape extension to save document."
-msgstr ""
-
-#: ../src/inkscape.cpp:402 ../src/inkscape.cpp:409
-#, c-format
-msgid "Autosave failed! File %s could not be saved."
-msgstr ""
-
-#: ../src/inkscape.cpp:424
-msgid "Autosave complete."
-msgstr ""
-
-#: ../src/inkscape.cpp:661
-msgid "Untitled document"
-msgstr ""
-
-#. Show nice dialog box
-#: ../src/inkscape.cpp:691
-msgid "Inkscape encountered an internal error and will close now.\n"
-msgstr ""
-
-#: ../src/inkscape.cpp:692
-msgid ""
-"Automatic backups of unsaved documents were done to the following "
-"locations:\n"
-msgstr ""
-
-#: ../src/inkscape.cpp:693
-msgid "Automatic backup of the following documents failed:\n"
-msgstr ""
-
-#. sp_ui_menu_append_check_item_from_verb(m, view, _("_Menu"), _("Show or hide the menu bar"), "menu",
-#. checkitem_toggled, checkitem_update, 0);
-#: ../src/interface.cpp:868
-msgid "Commands Bar"
-msgstr ""
-
-#: ../src/interface.cpp:868
-msgid "Show or hide the Commands bar (under the menu)"
-msgstr ""
-
-#: ../src/interface.cpp:870
-msgid "Snap Controls Bar"
-msgstr ""
-
-#: ../src/interface.cpp:870
-msgid "Show or hide the snapping controls"
-msgstr ""
-
-#: ../src/interface.cpp:872
-msgid "Tool Controls Bar"
-msgstr ""
-
-#: ../src/interface.cpp:872
-msgid "Show or hide the Tool Controls bar"
-msgstr ""
-
-#: ../src/interface.cpp:874
-msgid "_Toolbox"
-msgstr ""
-
-#: ../src/interface.cpp:874
-msgid "Show or hide the main toolbox (on the left)"
-msgstr ""
-
-#: ../src/interface.cpp:880
-msgid "_Palette"
-msgstr ""
-
-#: ../src/interface.cpp:880
-msgid "Show or hide the color palette"
-msgstr ""
-
-#: ../src/interface.cpp:882
-msgid "_Statusbar"
-msgstr ""
-
-#: ../src/interface.cpp:882
-msgid "Show or hide the statusbar (at the bottom of the window)"
-msgstr ""
-
-#: ../src/interface.cpp:956
-#, c-format
-msgid "Verb \"%s\" Unknown"
-msgstr ""
-
-#: ../src/interface.cpp:995
-msgid "Open _Recent"
-msgstr ""
-
-#. TRANSLATORS: #%s is the id of the group e.g. <g id="#g7">, not a number.
-#: ../src/interface.cpp:1096
-#, c-format
-msgid "Enter group #%s"
-msgstr ""
-
-#: ../src/interface.cpp:1107
-msgid "Go to parent"
-msgstr ""
-
-#: ../src/interface.cpp:1198 ../src/interface.cpp:1284
-#: ../src/interface.cpp:1387 ../src/ui/widget/selected-style.cpp:468
-msgid "Drop color"
-msgstr ""
-
-#: ../src/interface.cpp:1237 ../src/interface.cpp:1347
-msgid "Drop color on gradient"
-msgstr ""
-
-#: ../src/interface.cpp:1400
-msgid "Could not parse SVG data"
-msgstr ""
-
-#: ../src/interface.cpp:1439
-msgid "Drop SVG"
-msgstr ""
-
-#: ../src/interface.cpp:1495
-msgid "Drop bitmap image"
-msgstr ""
-
-#: ../src/interface.cpp:1587
-#, c-format
-msgid ""
-"<span weight=\"bold\" size=\"larger\">A file named \"%s\" already exists. Do "
-"you want to replace it?</span>\n"
-"\n"
-"The file already exists in \"%s\". Replacing it will overwrite its contents."
-msgstr ""
-
-#: ../src/interface.cpp:1594 ../share/extensions/web-set-att.inx.h:5
-#: ../share/extensions/web-transmit-att.inx.h:5
-msgid "Replace"
-msgstr ""
-
-#: ../src/io/sys.cpp:446 ../src/io/sys.cpp:454
-#, c-format
-msgid "Failed to read from child pipe (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:478
-#, c-format
-msgid "Failed to change to directory '%s' (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:484 ../src/io/sys.cpp:710
-#, c-format
-msgid "Failed to execute child process (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:657
-#, c-format
-msgid "Invalid program name: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:667 ../src/io/sys.cpp:956
-#, c-format
-msgid "Invalid string in argument vector at %d: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:678 ../src/io/sys.cpp:971
-#, c-format
-msgid "Invalid string in environment: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:739
-#, c-format
-msgid "Failed to create pipe for communicating with child process (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:952
-#, c-format
-msgid "Invalid working directory: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:1020
-#, c-format
-msgid "Failed to execute helper program (%s)"
-msgstr ""
-
-#: ../src/knot.cpp:431
-msgid "Node or handle drag canceled."
-msgstr ""
-
-#: ../src/knotholder.cpp:135
-msgid "Change handle"
-msgstr ""
-
-#: ../src/knotholder.cpp:214
-msgid "Move handle"
-msgstr ""
-
-#. TRANSLATORS: This refers to the pattern that's inside the object
-#: ../src/knotholder.cpp:235
-msgid "<b>Move</b> the pattern fill inside the object"
-msgstr ""
-
-#: ../src/knotholder.cpp:238
-msgid "<b>Scale</b> the pattern fill; uniformly if with <b>Ctrl</b>"
-msgstr ""
-
-#: ../src/knotholder.cpp:241
-msgid "<b>Rotate</b> the pattern fill; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-bar.c:108
-msgid "Master"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-bar.c:109
-msgid "GdlDockMaster object which the dockbar widget is attached to"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-bar.c:116
-msgid "Dockbar style"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-bar.c:117
-msgid "Dockbar style to show items on it"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:175 ../src/ui/dialog/inkscape-preferences.cpp:549
-#: ../src/ui/dialog/inkscape-preferences.cpp:570
-msgid "Floating"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:176
-msgid "Whether the dock is floating in its own window"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:183 ../src/libgdl/gdl-dock-master.c:144
-msgid "Default title"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:184
-msgid "Default title for the newly created floating docks"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:191
-msgid "Width for the dock when it's of floating type"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:199
-msgid "Height for the dock when it's of floating type"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:206
-msgid "Float X"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:207
-msgid "X coordinate for a floating dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:214
-msgid "Float Y"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:215
-msgid "Y coordinate for a floating dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock.c:499
-#, c-format
-msgid "Dock #%d"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:287
-msgid "Orientation"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:288
-msgid "Orientation of the docking item"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:303
-msgid "Resizable"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:304
-msgid "If set, the dock item can be resized when docked in a panel"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:311
-msgid "Item behavior"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:312
-msgid ""
-"General behavior for the dock item (i.e. whether it can float, if it's "
-"locked, etc.)"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:320 ../src/libgdl/gdl-dock-master.c:151
-msgid "Locked"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:321
-msgid ""
-"If set, the dock item cannot be dragged around and it doesn't show a grip"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:329
-msgid "Preferred width"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:330
-msgid "Preferred width for the dock item"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:336
-msgid "Preferred height"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:337
-msgid "Preferred height for the dock item"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:616
-#, c-format
-msgid ""
-"You can't add a dock object (%p of type %s) inside a %s. Use a GdlDock or "
-"some other compound dock object."
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:623
-#, c-format
-msgid ""
-"Attempting to add a widget with type %s to a %s, but it can only contain one "
-"widget at a time; it already contains a widget of type %s"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:1345 ../src/libgdl/gdl-dock-item.c:1390
-#, c-format
-msgid "Unsupported docking strategy %s in dock object of type %s"
-msgstr ""
-
-#. UnLock menuitem
-#: ../src/libgdl/gdl-dock-item.c:1479
-msgid "UnLock"
-msgstr ""
-
-#. Hide menuitem.
-#: ../src/libgdl/gdl-dock-item.c:1486
-msgid "Hide"
-msgstr ""
-
-#. Lock menuitem
-#: ../src/libgdl/gdl-dock-item.c:1491
-msgid "Lock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item.c:1717
-#, c-format
-msgid "Attempt to bind an unbound item %p"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:395
-msgid "Iconify"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:395
-msgid "Iconify this dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:397
-msgid "Close"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:397
-msgid "Close this dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:706
-#: ../src/libgdl/gdl-dock-tablabel.c:128
-msgid "Controlling dock item"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-item-grip.c:707
-msgid "Dockitem which 'owns' this grip"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:145
-msgid "Default title for newly created floating docks"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:152
-msgid ""
-"If is set to 1, all the dock items bound to the master are locked; if it's "
-"0, all are unlocked; -1 indicates inconsistency among the items"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:160 ../src/libgdl/gdl-switcher.c:706
-msgid "Switcher Style"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:161 ../src/libgdl/gdl-switcher.c:707
-msgid "Switcher buttons style"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:168
-msgid "Expand direction"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:169
-msgid ""
-"Allow the master's dock items to expand their container dock objects in the "
-"given direction"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:796
-#, c-format
-msgid ""
-"master %p: unable to add object %p[%s] to the hash. There already is an "
-"item with that name (%p)."
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-master.c:969
-#, c-format
-msgid ""
-"The new dock controller %p is automatic. Only manual dock objects should be "
-"named controller."
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-notebook.c:134
-#: ../src/ui/dialog/align-and-distribute.cpp:919
-#: ../src/ui/dialog/document-properties.cpp:118
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1410
-#: ../src/widgets/desktop-widget.cpp:1572
-msgid "Page"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-notebook.c:135
-msgid "The index of the current page"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:120 ../src/ui/widget/page-sizer.cpp:237
-msgid "Name"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:121
-msgid "Unique name for identifying the dock object"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:128
-msgid "Long name"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:129
-msgid "Human readable name for the dock object"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:135
-msgid "Stock Icon"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:136
-msgid "Stock icon for the dock object"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:142
-msgid "Pixbuf Icon"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:143
-msgid "Pixbuf icon for the dock object"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:148
-msgid "Dock master"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:149
-msgid "Dock master this dock object is bound to"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:434
-#, c-format
-msgid ""
-"Call to gdl_dock_object_dock in a dock object %p (object type is %s) which "
-"hasn't implemented this method"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:563
-#, c-format
-msgid ""
-"Dock operation requested in a non-bound object %p. The application might "
-"crash"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:570
-#, c-format
-msgid "Cannot dock %p to %p because they belong to different masters"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-object.c:612
-#, c-format
-msgid ""
-"Attempt to bind to %p an already bound dock object %p (current master: %p)"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-paned.c:132
-msgid "Position"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-paned.c:133
-msgid "Position of the divider in pixels"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:143
-msgid "Sticky"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:144
-msgid ""
-"Whether the placeholder will stick to its host or move up the hierarchy when "
-"the host is redocked"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:151
-msgid "Host"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:152
-msgid "The dock object this placeholder is attached to"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:159
-msgid "Next placement"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:160
-msgid ""
-"The position an item will be docked to our host if a request is made to dock "
-"to us"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:170
-msgid "Width for the widget when it's attached to the placeholder"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:178
-msgid "Height for the widget when it's attached to the placeholder"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:184
-msgid "Floating Toplevel"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:185
-msgid "Whether the placeholder is standing in for a floating toplevel dock"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:191
-msgid "X-Coordinate"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:192
-msgid "X coordinate for dock when floating"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:198
-msgid "Y-Coordinate"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:199
-msgid "Y coordinate for dock when floating"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:494
-msgid "Attempt to dock a dock object to an unbound placeholder"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:618
-#, c-format
-msgid "Got a detach signal from an object (%p) who is not our host %p"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-placeholder.c:643
-#, c-format
-msgid ""
-"Something weird happened while getting the child placement for %p from "
-"parent %p"
-msgstr ""
-
-#: ../src/libgdl/gdl-dock-tablabel.c:129
-msgid "Dockitem which 'owns' this tablabel"
-msgstr ""
-
-#: ../src/libnrtype/FontFactory.cpp:806
-msgid "Ignoring font without family that will crash Pango"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:88
-msgid "doEffect stack test"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:89
-msgid "Angle bisector"
-msgstr ""
-
-#. TRANSLATORS: boolean operations
-#: ../src/live_effects/effect.cpp:91
-msgid "Boolops"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:92
-msgid "Circle (by center and radius)"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:93
-msgid "Circle by 3 points"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:94
-msgid "Dynamic stroke"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:95 ../share/extensions/extrude.inx.h:1
-msgid "Extrude"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:96
-msgid "Lattice Deformation"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:97
-msgid "Line Segment"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:98
-msgid "Mirror symmetry"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:100
-msgid "Parallel"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:101
-msgid "Path length"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:102
-msgid "Perpendicular bisector"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:103
-msgid "Perspective path"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:104
-msgid "Rotate copies"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:105
-msgid "Recursive skeleton"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:106
-msgid "Tangent to curve"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:107
-msgid "Text label"
-msgstr ""
-
-#. 0.46
-#: ../src/live_effects/effect.cpp:110
-msgid "Bend"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:111
-msgid "Gears"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:112
-msgid "Pattern Along Path"
-msgstr ""
-
-#. for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG
-#: ../src/live_effects/effect.cpp:113
-msgid "Stitch Sub-Paths"
-msgstr ""
-
-#. 0.47
-#: ../src/live_effects/effect.cpp:115
-msgid "VonKoch"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:116
-msgid "Knot"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:117
-msgid "Construct grid"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:118
-msgid "Spiro spline"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:119
-msgid "Envelope Deformation"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:120
-msgid "Interpolate Sub-Paths"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:121
-msgid "Hatches (rough)"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:122
-msgid "Sketch"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:123
-msgid "Ruler"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:279
-msgid "Is visible?"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:279
-msgid ""
-"If unchecked, the effect remains applied to the object but is temporarily "
-"disabled on canvas"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:300
-msgid "No effect"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:347
-#, c-format
-msgid "Please specify a parameter path for the LPE '%s' with %d mouse clicks"
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:645
-#, c-format
-msgid "Editing parameter <b>%s</b>."
-msgstr ""
-
-#: ../src/live_effects/effect.cpp:650
-msgid "None of the applied path effect's parameters can be edited on-canvas."
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:55
-msgid "Bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:55
-msgid "Path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:56
-msgid "Width of the path"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:57
-#: ../src/live_effects/lpe-patternalongpath.cpp:65
-msgid "Width in units of length"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:57
-msgid "Scale the width of the path in units of its length"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:58
-msgid "Original path is vertical"
-msgstr ""
-
-#: ../src/live_effects/lpe-bendpath.cpp:58
-msgid "Rotates the original 90 degrees, before bending it along the bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-constructgrid.cpp:28
-msgid "Size X"
-msgstr ""
-
-#: ../src/live_effects/lpe-constructgrid.cpp:28
-msgid "The size of the grid in X direction."
-msgstr ""
-
-#: ../src/live_effects/lpe-constructgrid.cpp:29
-msgid "Size Y"
-msgstr ""
-
-#: ../src/live_effects/lpe-constructgrid.cpp:29
-msgid "The size of the grid in Y direction."
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:42
-msgid "Stitch path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:42
-msgid "The path that will be used as stitch."
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:43
-msgid "Number of paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:43
-msgid "The number of paths that will be generated."
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:44
-msgid "Start edge variance"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:44
-msgid ""
-"The amount of random jitter to move the start points of the stitches inside "
-"& outside the guide path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:45
-msgid "Start spacing variance"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:45
-msgid ""
-"The amount of random shifting to move the start points of the stitches back "
-"& forth along the guide path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:46
-msgid "End edge variance"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:46
-msgid ""
-"The amount of randomness that moves the end points of the stitches inside & "
-"outside the guide path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:47
-msgid "End spacing variance"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:47
-msgid ""
-"The amount of random shifting to move the end points of the stitches back & "
-"forth along the guide path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:48
-msgid "Scale width"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:48
-msgid "Scale the width of the stitch path"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:49
-msgid "Scale width relative to length"
-msgstr ""
-
-#: ../src/live_effects/lpe-curvestitch.cpp:49
-msgid "Scale the width of the stitch path relative to its length"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:33
-msgid "Top bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:33
-msgid "Top path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:34
-msgid "Right bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:34
-msgid "Right path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:35
-msgid "Bottom bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:35
-msgid "Bottom path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:36
-msgid "Left bend path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:36
-msgid "Left path along which to bend the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:37
-msgid "Enable left & right paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:37
-msgid "Enable the left and right deformation paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:38
-msgid "Enable top & bottom paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-envelope.cpp:38
-msgid "Enable the top and bottom deformation paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-gears.cpp:212
-msgid "Teeth"
-msgstr ""
-
-#: ../src/live_effects/lpe-gears.cpp:212
-msgid "The number of teeth"
-msgstr ""
-
-#: ../src/live_effects/lpe-gears.cpp:213
-msgid "Phi"
-msgstr ""
-
-#: ../src/live_effects/lpe-gears.cpp:213
-msgid ""
-"Tooth pressure angle (typically 20-25 deg). The ratio of teeth not in "
-"contact."
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:30
-msgid "Trajectory"
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:30
-msgid "Path along which intermediate steps are created."
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:31
-#: ../src/ui/dialog/inkscape-preferences.cpp:242
-msgid "Steps"
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:31
-msgid "Determines the number of steps from start to end path."
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:32
-msgid "Equidistant spacing"
-msgstr ""
-
-#: ../src/live_effects/lpe-interpolate.cpp:32
-msgid ""
-"If true, the spacing between intermediates is constant along the length of "
-"the path. If false, the distance depends on the location of the nodes of the "
-"trajectory path."
-msgstr ""
-
-#. initialise your parameters here:
-#: ../src/live_effects/lpe-knot.cpp:329
-msgid "Fixed width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:329
-msgid "Size of hidden region of lower string"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:330
-msgid "In units of stroke width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:330
-msgid "Consider 'Interruption width' as a ratio of stroke width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:331 ../src/widgets/stroke-style.cpp:1093
-#: ../share/extensions/edge3d.inx.h:9
-msgid "Stroke width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:331
-msgid "Add the stroke width to the interruption size"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:332
-msgid "Crossing path stroke width"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:332
-msgid "Add crossed stroke width to the interruption size"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:333
-msgid "Switcher size"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:333
-msgid "Orientation indicator/switcher size"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:334
-msgid "Crossing Signs"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:334
-msgid "Crossings signs"
-msgstr ""
-
-#: ../src/live_effects/lpe-knot.cpp:345
-msgid "Drag to select a crossing, click to flip it"
-msgstr ""
-
-#. / @todo Is this the right verb?
-#: ../src/live_effects/lpe-knot.cpp:638
-msgid "Change knot crossing"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:52
-#: ../share/extensions/pathalongpath.inx.h:11
-msgid "Single"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:53
-#: ../share/extensions/pathalongpath.inx.h:12
-msgid "Single, stretched"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:54
-#: ../share/extensions/pathalongpath.inx.h:8
-msgid "Repeated"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:55
-#: ../share/extensions/pathalongpath.inx.h:9
-msgid "Repeated, stretched"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:61
-msgid "Pattern source"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:61
-msgid "Path to put along the skeleton path"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:62
-msgid "Pattern copies"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:62
-msgid "How many pattern copies to place along the skeleton path"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:64
-msgid "Width of the pattern"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:66
-msgid "Scale the width of the pattern in units of its length"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:68
-msgid "Spacing"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:70
-#, no-c-format
-msgid ""
-"Space between copies of the pattern. Negative values allowed, but are "
-"limited to -90% of pattern width."
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:72
-#: ../share/extensions/pathalongpath.inx.h:5
-#: ../share/extensions/pathscatter.inx.h:7
-msgid "Normal offset"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:73
-#: ../share/extensions/pathalongpath.inx.h:15
-#: ../share/extensions/pathscatter.inx.h:13
-msgid "Tangential offset"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:74
-msgid "Offsets in unit of pattern size"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:75
-msgid ""
-"Spacing, tangential and normal offset are expressed as a ratio of width/"
-"height"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:77
-#: ../share/extensions/pathalongpath.inx.h:7
-#: ../share/extensions/pathscatter.inx.h:9
-msgid "Pattern is vertical"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:77
-msgid "Rotate pattern 90 deg before applying"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:79
-msgid "Fuse nearby ends"
-msgstr ""
-
-#: ../src/live_effects/lpe-patternalongpath.cpp:79
-msgid "Fuse ends closer than this number. 0 means don't fuse."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:226
-msgid "Frequency randomness"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:226
-msgid "Variation of distance between hatches, in %."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:227
-msgid "Growth"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:227
-msgid "Growth of distance between hatches."
-msgstr ""
-
-#. FIXME: top/bottom names are inverted in the UI/svg and in the code!!
-#: ../src/live_effects/lpe-rough-hatches.cpp:229
-msgid "Half-turns smoothness: 1st side, in"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:229
-msgid ""
-"Set smoothness/sharpness of path when reaching a 'bottom' half-turn. "
-"0=sharp, 1=default"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:230
-msgid "1st side, out"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:230
-msgid ""
-"Set smoothness/sharpness of path when leaving a 'bottom' half-turn. 0=sharp, "
-"1=default"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:231
-msgid "2nd side, in"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:231
-msgid ""
-"Set smoothness/sharpness of path when reaching a 'top' half-turn. 0=sharp, "
-"1=default"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:232
-msgid "2nd side, out"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:232
-msgid ""
-"Set smoothness/sharpness of path when leaving a 'top' half-turn. 0=sharp, "
-"1=default"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:233
-msgid "Magnitude jitter: 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:233
-msgid "Randomly moves 'bottom' half-turns to produce magnitude variations."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:234
-#: ../src/live_effects/lpe-rough-hatches.cpp:236
-#: ../src/live_effects/lpe-rough-hatches.cpp:238
-msgid "2nd side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:234
-msgid "Randomly moves 'top' half-turns to produce magnitude variations."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:235
-msgid "Parallelism jitter: 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:235
-msgid ""
-"Add direction randomness by moving 'bottom' half-turns tangentially to the "
-"boundary."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:236
-msgid ""
-"Add direction randomness by randomly moving 'top' half-turns tangentially to "
-"the boundary."
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:237
-msgid "Variance: 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:237
-msgid "Randomness of 'bottom' half-turns smoothness"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:238
-msgid "Randomness of 'top' half-turns smoothness"
-msgstr ""
-
-#.
-#: ../src/live_effects/lpe-rough-hatches.cpp:240
-msgid "Generate thick/thin path"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:240
-msgid "Simulate a stroke of varying width"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:241
-msgid "Bend hatches"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:241
-msgid "Add a global bend to the hatches (slower)"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:242
-msgid "Thickness: at 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:242
-msgid "Width at 'bottom' half-turns"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:243
-msgid "at 2nd side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:243
-msgid "Width at 'top' half-turns"
-msgstr ""
-
-#.
-#: ../src/live_effects/lpe-rough-hatches.cpp:245
-msgid "from 2nd to 1st side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:245
-msgid "Width from 'top' to 'bottom'"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:246
-msgid "from 1st to 2nd side"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:246
-msgid "Width from 'bottom' to 'top'"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:248
-msgid "Hatches width and dir"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:248
-msgid "Defines hatches frequency and direction"
-msgstr ""
-
-#.
-#. bender(_("Global bending"), _("Relative position to a reference point defines global bending direction and amount"), "bender", &wr, this, NULL, Geom::Point(-5,0)),
-#: ../src/live_effects/lpe-rough-hatches.cpp:251
-msgid "Global bending"
-msgstr ""
-
-#: ../src/live_effects/lpe-rough-hatches.cpp:251
-msgid ""
-"Relative position to a reference point defines global bending direction and "
-"amount"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:27 ../share/extensions/restack.inx.h:7
-msgid "Left"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:28 ../share/extensions/restack.inx.h:14
-msgid "Right"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:29 ../src/live_effects/lpe-ruler.cpp:37
-msgid "Both"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:35 ../src/widgets/toolbox.cpp:5168
-msgid "Start"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:36 ../src/widgets/toolbox.cpp:5181
-msgid "End"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:44
-msgid "Mark distance"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:44
-msgid "Distance between successive ruler marks"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:45
-msgid "Major length"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:45
-msgid "Length of major ruler marks"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:46
-msgid "Minor length"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:46
-msgid "Length of minor ruler marks"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:47
-msgid "Major steps"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:47
-msgid "Draw a major mark every ... steps"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:48
-msgid "Shift marks by"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:48
-msgid "Shift marks by this many steps"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:49
-msgid "Mark direction"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:49
-msgid "Direction of marks (when viewing along the path from start to end)"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:50
-msgid "Offset of first mark"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:51
-msgid "Border marks"
-msgstr ""
-
-#: ../src/live_effects/lpe-ruler.cpp:51
-msgid "Choose whether to draw marks at the beginning and end of the path"
-msgstr ""
-
-#. initialise your parameters here:
-#. testpointA(_("Test Point A"), _("Test A"), "ptA", &wr, this, Geom::Point(100,100)),
-#: ../src/live_effects/lpe-sketch.cpp:35
-msgid "Strokes"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:35
-msgid "Draw that many approximating strokes"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:36
-msgid "Max stroke length"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:37
-msgid "Maximum length of approximating strokes"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:38
-msgid "Stroke length variation"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:39
-msgid "Random variation of stroke length (relative to maximum length)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:40
-msgid "Max. overlap"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:41
-msgid "How much successive strokes should overlap (relative to maximum length)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:42
-msgid "Overlap variation"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:43
-msgid "Random variation of overlap (relative to maximum overlap)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:44
-msgid "Max. end tolerance"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:45
-msgid ""
-"Maximum distance between ends of original and approximating paths (relative "
-"to maximum length)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:46
-msgid "Average offset"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:47
-msgid "Average distance each stroke is away from the original path"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:48
-msgid "Max. tremble"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:49
-msgid "Maximum tremble magnitude"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:50
-msgid "Tremble frequency"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:51
-msgid "Average number of tremble periods in a stroke"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:53
-msgid "Construction lines"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:54
-msgid "How many construction lines (tangents) to draw"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:55 ../src/selection-chemistry.cpp:1516
-#: ../src/seltrans.cpp:531 ../src/ui/dialog/transformation.cpp:738
-#: ../share/extensions/interp_att_g.inx.h:16
-#: ../share/extensions/render_alphabetsoup.inx.h:4
-msgid "Scale"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:56
-msgid ""
-"Scale factor relating curvature and length of construction lines (try "
-"5*offset)"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:57
-msgid "Max. length"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:57
-msgid "Maximum length of construction lines"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:58
-msgid "Length variation"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:58
-msgid "Random variation of the length of construction lines"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:59
-msgid "Placement randomness"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:59
-msgid "0: evenly distributed construction lines, 1: purely random placement"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:61
-msgid "k_min"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:61
-msgid "min curvature"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:62
-msgid "k_max"
-msgstr ""
-
-#: ../src/live_effects/lpe-sketch.cpp:62
-msgid "max curvature"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:47
-msgid "Nb of generations"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:47
-msgid "Depth of the recursion --- keep low!!"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:48
-msgid "Generating path"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:48
-msgid "Path whose segments define the iterated transforms"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:49
-msgid "Use uniform transforms only"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:49
-msgid ""
-"2 consecutive segments are used to reverse/preserve orientation only "
-"(otherwise, they define a general transform)."
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:50
-msgid "Draw all generations"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:50
-msgid "If unchecked, draw only the last generation"
-msgstr ""
-
-#. ,draw_boxes(_("Display boxes"), _("Display boxes instead of paths only"), "draw_boxes", &wr, this, true)
-#: ../src/live_effects/lpe-vonkoch.cpp:52
-msgid "Reference segment"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:52
-msgid "The reference segment. Defaults to the horizontal midline of the bbox."
-msgstr ""
-
-#. refA(_("Ref Start"), _("Left side middle of the reference box"), "refA", &wr, this),
-#. refB(_("Ref End"), _("Right side middle of the reference box"), "refB", &wr, this),
-#. FIXME: a path is used here instead of 2 points to work around path/point param incompatibility bug.
-#: ../src/live_effects/lpe-vonkoch.cpp:56
-msgid "Max complexity"
-msgstr ""
-
-#: ../src/live_effects/lpe-vonkoch.cpp:56
-msgid "Disable effect if the output is too complex"
-msgstr ""
-
-#: ../src/live_effects/parameter/bool.cpp:69
-msgid "Change bool parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/enum.h:50
-msgid "Change enumeration parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/parameter.cpp:139
-msgid "Change scalar parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:158
-msgid "Edit on-canvas"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:168
-msgid "Copy path"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:178
-msgid "Paste path"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:188
-msgid "Link to path"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:409
-msgid "Paste path parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/path.cpp:441
-msgid "Link path parameter to path"
-msgstr ""
-
-#: ../src/live_effects/parameter/point.cpp:91
-msgid "Change point parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/random.cpp:137
-msgid "Change random parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/text.cpp:101
-msgid "Change text parameter"
-msgstr ""
-
-#: ../src/live_effects/parameter/unit.cpp:77
-msgid "Change unit parameter"
-msgstr ""
-
-#: ../src/main-cmdlineact.cpp:49
-#, c-format
-msgid "Unable to find verb ID '%s' specified on the command line.\n"
-msgstr ""
-
-#: ../src/main-cmdlineact.cpp:61
-#, c-format
-msgid "Unable to find node ID: '%s'\n"
-msgstr ""
-
-#: ../src/main.cpp:265
-msgid "Print the Inkscape version number"
-msgstr ""
-
-#: ../src/main.cpp:270
-msgid "Do not use X server (only process files from console)"
-msgstr ""
-
-#: ../src/main.cpp:275
-msgid "Try to use X server (even if $DISPLAY is not set)"
-msgstr ""
-
-#: ../src/main.cpp:280
-msgid "Open specified document(s) (option string may be excluded)"
-msgstr ""
-
-#: ../src/main.cpp:281 ../src/main.cpp:286 ../src/main.cpp:291
-#: ../src/main.cpp:358 ../src/main.cpp:363 ../src/main.cpp:368
-#: ../src/main.cpp:373 ../src/main.cpp:379
-msgid "FILENAME"
-msgstr ""
-
-#: ../src/main.cpp:285
-msgid "Print document(s) to specified output file (use '| program' for pipe)"
-msgstr ""
-
-#: ../src/main.cpp:290
-msgid "Export document to a PNG file"
-msgstr ""
-
-#: ../src/main.cpp:295
-msgid ""
-"Resolution for exporting to bitmap and for rasterization of filters in PS/"
-"EPS/PDF (default 90)"
-msgstr ""
-
-#: ../src/main.cpp:296 ../src/ui/widget/rendering-options.cpp:43
-msgid "DPI"
-msgstr ""
-
-#: ../src/main.cpp:300
-msgid ""
-"Exported area in SVG user units (default is the page; 0,0 is lower-left "
-"corner)"
-msgstr ""
-
-#: ../src/main.cpp:301
-msgid "x0:y0:x1:y1"
-msgstr ""
-
-#: ../src/main.cpp:305
-msgid "Exported area is the entire drawing (not page)"
-msgstr ""
-
-#: ../src/main.cpp:310
-msgid "Exported area is the entire page"
-msgstr ""
-
-#: ../src/main.cpp:315
-msgid ""
-"Snap the bitmap export area outwards to the nearest integer values (in SVG "
-"user units)"
-msgstr ""
-
-#: ../src/main.cpp:320
-msgid "The width of exported bitmap in pixels (overrides export-dpi)"
-msgstr ""
-
-#: ../src/main.cpp:321
-msgid "WIDTH"
-msgstr ""
-
-#: ../src/main.cpp:325
-msgid "The height of exported bitmap in pixels (overrides export-dpi)"
-msgstr ""
-
-#: ../src/main.cpp:326
-msgid "HEIGHT"
-msgstr ""
-
-#: ../src/main.cpp:330
-msgid "The ID of the object to export"
-msgstr ""
-
-#: ../src/main.cpp:331 ../src/main.cpp:424
-msgid "ID"
-msgstr ""
-
-#. TRANSLATORS: this means: "Only export the object whose id is given in --export-id".
-#. See "man inkscape" for details.
-#: ../src/main.cpp:337
-msgid ""
-"Export just the object with export-id, hide all others (only with export-id)"
-msgstr ""
-
-#: ../src/main.cpp:342
-msgid "Use stored filename and DPI hints when exporting (only with export-id)"
-msgstr ""
-
-#: ../src/main.cpp:347
-msgid "Background color of exported bitmap (any SVG-supported color string)"
-msgstr ""
-
-#: ../src/main.cpp:348
-msgid "COLOR"
-msgstr ""
-
-#: ../src/main.cpp:352
-msgid "Background opacity of exported bitmap (either 0.0 to 1.0, or 1 to 255)"
-msgstr ""
-
-#: ../src/main.cpp:353
-msgid "VALUE"
-msgstr ""
-
-#: ../src/main.cpp:357
-msgid "Export document to plain SVG file (no sodipodi or inkscape namespaces)"
-msgstr ""
-
-#: ../src/main.cpp:362
-msgid "Export document to a PS file"
-msgstr ""
-
-#: ../src/main.cpp:367
-msgid "Export document to an EPS file"
-msgstr ""
-
-#: ../src/main.cpp:372
-msgid "Export document to a PDF file"
-msgstr ""
-
-#: ../src/main.cpp:378
-msgid "Export document to an Enhanced Metafile (EMF) File"
-msgstr ""
-
-#: ../src/main.cpp:384
-msgid "Convert text object to paths on export (PS, EPS, PDF)"
-msgstr ""
-
-#: ../src/main.cpp:389
-msgid ""
-"Render filtered objects without filters, instead of rasterizing (PS, EPS, "
-"PDF)"
-msgstr ""
-
-#. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:395
-msgid ""
-"Query the X coordinate of the drawing or, if specified, of the object with --"
-"query-id"
-msgstr ""
-
-#. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:401
-msgid ""
-"Query the Y coordinate of the drawing or, if specified, of the object with --"
-"query-id"
-msgstr ""
-
-#. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:407
-msgid ""
-"Query the width of the drawing or, if specified, of the object with --query-"
-"id"
-msgstr ""
-
-#. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:413
-msgid ""
-"Query the height of the drawing or, if specified, of the object with --query-"
-"id"
-msgstr ""
-
-#: ../src/main.cpp:418
-msgid "List id,x,y,w,h for all objects"
-msgstr ""
-
-#: ../src/main.cpp:423
-msgid "The ID of the object whose dimensions are queried"
-msgstr ""
-
-#. TRANSLATORS: this option makes Inkscape print the name (path) of the extension directory
-#: ../src/main.cpp:429
-msgid "Print out the extension directory and exit"
-msgstr ""
-
-#: ../src/main.cpp:434
-msgid "Remove unused definitions from the defs section(s) of the document"
-msgstr ""
-
-#: ../src/main.cpp:439
-msgid "List the IDs of all the verbs in Inkscape"
-msgstr ""
-
-#: ../src/main.cpp:444
-msgid "Verb to call when Inkscape opens."
-msgstr ""
-
-#: ../src/main.cpp:445
-msgid "VERB-ID"
-msgstr ""
-
-#: ../src/main.cpp:449
-msgid "Object ID to select when Inkscape opens."
-msgstr ""
-
-#: ../src/main.cpp:450
-msgid "OBJECT-ID"
-msgstr ""
-
-#: ../src/main.cpp:454
-msgid "Start Inkscape in interactive shell mode."
-msgstr ""
-
-#: ../src/main.cpp:762 ../src/main.cpp:1088
-msgid ""
-"[OPTIONS...] [FILE...]\n"
-"\n"
-"Available options:"
-msgstr ""
-
-#. ## Add a menu for clear()
-#: ../src/menus-skeleton.h:16 ../src/ui/dialog/debug.cpp:74
-#: ../src/ui/dialog/messages.cpp:52 ../src/ui/dialog/scriptdialog.cpp:208
-msgid "_File"
-msgstr ""
-
-#: ../src/menus-skeleton.h:17
-msgid "_New"
-msgstr ""
-
-#. TODO look at some dynamic option for changing the menu tree:
-#. " <verb verb-id=\"DialogInput2\" />\n"
-#: ../src/menus-skeleton.h:49 ../src/verbs.cpp:2488 ../src/verbs.cpp:2494
-msgid "_Edit"
-msgstr ""
-
-#: ../src/menus-skeleton.h:59 ../src/verbs.cpp:2288
-msgid "Paste Si_ze"
-msgstr ""
-
-#: ../src/menus-skeleton.h:71
-msgid "Clo_ne"
-msgstr ""
-
-#: ../src/menus-skeleton.h:91
-msgid "_View"
-msgstr ""
-
-#: ../src/menus-skeleton.h:92
-msgid "_Zoom"
-msgstr ""
-
-#: ../src/menus-skeleton.h:108
-msgid "_Display mode"
-msgstr ""
-
-#: ../src/menus-skeleton.h:120
-msgid "Show/Hide"
-msgstr ""
-
-#. " <verb verb-id=\"DialogScript\" />\n"
-#. Not quite ready to be in the menus.
-#. " <verb verb-id=\"FocusToggle\" />\n"
-#: ../src/menus-skeleton.h:139
-msgid "_Layer"
-msgstr ""
-
-#: ../src/menus-skeleton.h:159
-msgid "_Object"
-msgstr ""
-
-#: ../src/menus-skeleton.h:166
-msgid "Cli_p"
-msgstr ""
-
-#: ../src/menus-skeleton.h:170
-msgid "Mas_k"
-msgstr ""
-
-#: ../src/menus-skeleton.h:174
-msgid "Patter_n"
-msgstr ""
-
-#: ../src/menus-skeleton.h:198
-msgid "_Path"
-msgstr ""
-
-#: ../src/menus-skeleton.h:225
-msgid "_Text"
-msgstr ""
-
-#: ../src/menus-skeleton.h:244
-msgid "Filter_s"
-msgstr ""
-
-#: ../src/menus-skeleton.h:250
-msgid "Exte_nsions"
-msgstr ""
-
-#: ../src/menus-skeleton.h:257
-msgid "Whiteboa_rd"
-msgstr ""
-
-#: ../src/menus-skeleton.h:261
-msgid "_Help"
-msgstr ""
-
-#: ../src/menus-skeleton.h:265
-msgid "Tutorials"
-msgstr ""
-
-#: ../src/node-context.cpp:228
-msgid ""
-"<b>Ctrl</b>: toggle node type, snap handle angle, move hor/vert; <b>Ctrl"
-"+Alt</b>: move along handles"
-msgstr ""
-
-#: ../src/node-context.cpp:229
-msgid ""
-"<b>Shift</b>: toggle node selection, disable snapping, rotate both handles"
-msgstr ""
-
-#: ../src/node-context.cpp:230
-msgid "<b>Alt</b>: lock handle length; <b>Ctrl+Alt</b>: move along handles"
-msgstr ""
-
-#: ../src/nodepath.cpp:755 ../src/seltrans.cpp:624
-msgid "Stamp"
-msgstr ""
-
-#: ../src/nodepath.cpp:1671 ../src/nodepath.cpp:1697
-msgid "Move nodes vertically"
-msgstr ""
-
-#: ../src/nodepath.cpp:1673 ../src/nodepath.cpp:1699
-msgid "Move nodes horizontally"
-msgstr ""
-
-#: ../src/nodepath.cpp:1675 ../src/nodepath.cpp:1701 ../src/nodepath.cpp:1716
-#: ../src/nodepath.cpp:3625
-msgid "Move nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:1754
-msgid ""
-"<b>Node handle</b>: drag to shape the curve; with <b>Ctrl</b> to snap angle; "
-"with <b>Alt</b> to lock length; with <b>Shift</b> to rotate both handles"
-msgstr ""
-
-#: ../src/nodepath.cpp:1924
-msgid "Align nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:1986
-msgid "Distribute nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:2024
-msgid "Add nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:2026 ../src/nodepath.cpp:2128
-msgid "Add node"
-msgstr ""
-
-#: ../src/nodepath.cpp:2220
-msgid "Break path"
-msgstr ""
-
-#: ../src/nodepath.cpp:2276
-msgid "Close subpath"
-msgstr ""
-
-#: ../src/nodepath.cpp:2337
-msgid "Join nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:2364
-msgid "Close subpath by segment"
-msgstr ""
-
-#: ../src/nodepath.cpp:2418
-msgid "Join nodes by segment"
-msgstr ""
-
-#: ../src/nodepath.cpp:2431 ../src/nodepath.cpp:2446
-msgid "To join, you must have <b>two endnodes</b> selected."
-msgstr ""
-
-#: ../src/nodepath.cpp:2603 ../src/nodepath.cpp:2639 ../src/nodepath.cpp:2643
-msgid "Delete nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:2605
-msgid "Delete nodes preserving shape"
-msgstr ""
-
-#: ../src/nodepath.cpp:2662 ../src/nodepath.cpp:2676
-msgid ""
-"Select <b>two non-endpoint nodes</b> on a path between which to delete "
-"segments."
-msgstr ""
-
-#: ../src/nodepath.cpp:2772
-msgid "Cannot find path between nodes."
-msgstr ""
-
-#: ../src/nodepath.cpp:2804 ../src/widgets/toolbox.cpp:1343
-msgid "Delete segment"
-msgstr ""
-
-#: ../src/nodepath.cpp:2825
-msgid "Change segment type"
-msgstr ""
-
-#: ../src/nodepath.cpp:2842 ../src/nodepath.cpp:3579
-msgid "Change node type"
-msgstr ""
-
-#: ../src/nodepath.cpp:3529 ../src/widgets/toolbox.cpp:1300
-msgid "Delete node"
-msgstr ""
-
-#: ../src/nodepath.cpp:3871
-msgid "Retract handle"
-msgstr ""
-
-#: ../src/nodepath.cpp:3926
-msgid "Move node handle"
-msgstr ""
-
-#: ../src/nodepath.cpp:4111
-#, c-format
-msgid ""
-"<b>Node handle</b>: angle %0.2f°, length %s; with <b>Ctrl</b> to snap "
-"angle; with <b>Alt</b> to lock length; with <b>Shift</b> to rotate both "
-"handles"
-msgstr ""
-
-#: ../src/nodepath.cpp:4305
-msgid "Rotate nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:4420
-msgid "Cannot scale nodes when all are at the same location."
-msgstr ""
-
-#: ../src/nodepath.cpp:4446
-msgid "Scale nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:4490
-msgid "Flip nodes"
-msgstr ""
-
-#: ../src/nodepath.cpp:4659
-msgid ""
-"<b>Node</b>: drag to edit the path; with <b>Ctrl</b> to snap to horizontal/"
-"vertical; with <b>Ctrl+Alt</b> to snap to handles' directions"
-msgstr ""
-
-#. TRANSLATORS: "end" is an adjective here (NOT a verb)
-#: ../src/nodepath.cpp:4892
-msgid "end node"
-msgstr ""
-
-#. TRANSLATORS: "cusp" means "sharp" (cusp node); see also the Advanced Tutorial
-#: ../src/nodepath.cpp:4897
-msgid "cusp"
-msgstr ""
-
-#. TRANSLATORS: "smooth" is an adjective here
-#: ../src/nodepath.cpp:4900
-msgid "smooth"
-msgstr ""
-
-#: ../src/nodepath.cpp:4902
-msgid "auto"
-msgstr ""
-
-#: ../src/nodepath.cpp:4904
-msgid "symmetric"
-msgstr ""
-
-#. TRANSLATORS: "end" is an adjective here (NOT a verb)
-#: ../src/nodepath.cpp:4910
-msgid "end node, handle retracted (drag with <b>Shift</b> to extend)"
-msgstr ""
-
-#: ../src/nodepath.cpp:4912
-msgid "one handle retracted (drag with <b>Shift</b> to extend)"
-msgstr ""
-
-#: ../src/nodepath.cpp:4915
-msgid "both handles retracted (drag with <b>Shift</b> to extend)"
-msgstr ""
-
-#: ../src/nodepath.cpp:4927
-msgid ""
-"<b>Drag</b> nodes or node handles; <b>Alt+drag</b> nodes to sculpt; "
-"<b>arrow</b> keys to move nodes, <b>< ></b> to scale, <b>[ ]</b> to "
-"rotate"
-msgstr ""
-
-#: ../src/nodepath.cpp:4928
-msgid "<b>Drag</b> the node or its handles; <b>arrow</b> keys to move the node"
-msgstr ""
-
-#: ../src/nodepath.cpp:4954 ../src/nodepath.cpp:4966
-msgid "Select a single object to edit its nodes or handles."
-msgstr ""
-
-#: ../src/nodepath.cpp:4958
-#, c-format
-msgid ""
-"<b>0</b> out of <b>%i</b> node selected. <b>Click</b>, <b>Shift+click</b>, "
-"or <b>drag around</b> nodes to select."
-msgid_plural ""
-"<b>0</b> out of <b>%i</b> nodes selected. <b>Click</b>, <b>Shift+click</b>, "
-"or <b>drag around</b> nodes to select."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/nodepath.cpp:4964
-msgid "Drag the handles of the object to modify it."
-msgstr ""
-
-#: ../src/nodepath.cpp:4972
-#, c-format
-msgid "<b>%i</b> of <b>%i</b> node selected; %s. %s."
-msgid_plural "<b>%i</b> of <b>%i</b> nodes selected; %s. %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/nodepath.cpp:4979
-#, c-format
-msgid ""
-"<b>%i</b> of <b>%i</b> node selected in <b>%i</b> of <b>%i</b> subpaths. %s."
-msgid_plural ""
-"<b>%i</b> of <b>%i</b> nodes selected in <b>%i</b> of <b>%i</b> subpaths. %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/nodepath.cpp:4985
-#, c-format
-msgid "<b>%i</b> of <b>%i</b> node selected. %s."
-msgid_plural "<b>%i</b> of <b>%i</b> nodes selected. %s."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/object-edit.cpp:439
-msgid ""
-"Adjust the <b>horizontal rounding</b> radius; with <b>Ctrl</b> to make the "
-"vertical radius the same"
-msgstr ""
-
-#: ../src/object-edit.cpp:443
-msgid ""
-"Adjust the <b>vertical rounding</b> radius; with <b>Ctrl</b> to make the "
-"horizontal radius the same"
-msgstr ""
-
-#: ../src/object-edit.cpp:447 ../src/object-edit.cpp:451
-msgid ""
-"Adjust the <b>width and height</b> of the rectangle; with <b>Ctrl</b> to "
-"lock ratio or stretch in one dimension only"
-msgstr ""
-
-#: ../src/object-edit.cpp:685 ../src/object-edit.cpp:688
-#: ../src/object-edit.cpp:691 ../src/object-edit.cpp:694
-msgid ""
-"Resize box in X/Y direction; with <b>Shift</b> along the Z axis; with "
-"<b>Ctrl</b> to constrain to the directions of edges or diagonals"
-msgstr ""
-
-#: ../src/object-edit.cpp:697 ../src/object-edit.cpp:700
-#: ../src/object-edit.cpp:703 ../src/object-edit.cpp:706
-msgid ""
-"Resize box along the Z axis; with <b>Shift</b> in X/Y direction; with "
-"<b>Ctrl</b> to constrain to the directions of edges or diagonals"
-msgstr ""
-
-#: ../src/object-edit.cpp:709
-msgid "Move the box in perspective"
-msgstr ""
-
-#: ../src/object-edit.cpp:927
-msgid "Adjust ellipse <b>width</b>, with <b>Ctrl</b> to make circle"
-msgstr ""
-
-#: ../src/object-edit.cpp:930
-msgid "Adjust ellipse <b>height</b>, with <b>Ctrl</b> to make circle"
-msgstr ""
-
-#: ../src/object-edit.cpp:933
-msgid ""
-"Position the <b>start point</b> of the arc or segment; with <b>Ctrl</b> to "
-"snap angle; drag <b>inside</b> the ellipse for arc, <b>outside</b> for "
-"segment"
-msgstr ""
-
-#: ../src/object-edit.cpp:937
-msgid ""
-"Position the <b>end point</b> of the arc or segment; with <b>Ctrl</b> to "
-"snap angle; drag <b>inside</b> the ellipse for arc, <b>outside</b> for "
-"segment"
-msgstr ""
-
-#: ../src/object-edit.cpp:1076
-msgid ""
-"Adjust the <b>tip radius</b> of the star or polygon; with <b>Shift</b> to "
-"round; with <b>Alt</b> to randomize"
-msgstr ""
-
-#: ../src/object-edit.cpp:1083
-msgid ""
-"Adjust the <b>base radius</b> of the star; with <b>Ctrl</b> to keep star "
-"rays radial (no skew); with <b>Shift</b> to round; with <b>Alt</b> to "
-"randomize"
-msgstr ""
-
-#: ../src/object-edit.cpp:1272
-msgid ""
-"Roll/unroll the spiral from <b>inside</b>; with <b>Ctrl</b> to snap angle; "
-"with <b>Alt</b> to converge/diverge"
-msgstr ""
-
-#: ../src/object-edit.cpp:1275
-msgid ""
-"Roll/unroll the spiral from <b>outside</b>; with <b>Ctrl</b> to snap angle; "
-"with <b>Shift</b> to scale/rotate"
-msgstr ""
-
-#: ../src/object-edit.cpp:1319
-msgid "Adjust the <b>offset distance</b>"
-msgstr ""
-
-#: ../src/object-edit.cpp:1355
-msgid "Drag to resize the <b>flowed text frame</b>"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:49
-msgid "Select <b>object(s)</b> to combine."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:53
-msgid "Combining paths..."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:161
-msgid "Combine"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:168
-msgid "<b>No path(s)</b> to combine in the selection."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:180
-msgid "Select <b>path(s)</b> to break apart."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:184
-msgid "Breaking apart paths..."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:271
-msgid "Break apart"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:273
-msgid "<b>No path(s)</b> to break apart in the selection."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:285
-msgid "Select <b>object(s)</b> to convert to path."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:291
-msgid "Converting objects to paths..."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:313
-msgid "Object to path"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:315
-msgid "<b>No objects</b> to convert to path in the selection."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:551
-msgid "Select <b>path(s)</b> to reverse."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:560
-msgid "Reversing paths..."
-msgstr ""
-
-#: ../src/path-chemistry.cpp:594
-msgid "Reverse path"
-msgstr ""
-
-#: ../src/path-chemistry.cpp:596
-msgid "<b>No paths</b> to reverse in the selection."
-msgstr ""
-
-#: ../src/pencil-context.cpp:269 ../src/pen-context.cpp:493
-msgid "Continuing selected path"
-msgstr ""
-
-#: ../src/pencil-context.cpp:277 ../src/pen-context.cpp:503
-msgid "Creating new path"
-msgstr ""
-
-#: ../src/pencil-context.cpp:280 ../src/pen-context.cpp:505
-msgid "Appending to selected path"
-msgstr ""
-
-#: ../src/pencil-context.cpp:381
-msgid "<b>Release</b> here to close and finish the path."
-msgstr ""
-
-#: ../src/pencil-context.cpp:387
-msgid "Drawing a freehand path"
-msgstr ""
-
-#: ../src/pencil-context.cpp:392
-msgid "<b>Drag</b> to continue the path from this point."
-msgstr ""
-
-#. Write curves to object
-#: ../src/pencil-context.cpp:466
-msgid "Finishing freehand"
-msgstr ""
-
-#: ../src/pencil-context.cpp:522 ../src/pen-context.cpp:253
-msgid "Drawing cancelled"
-msgstr ""
-
-#: ../src/pencil-context.cpp:572
-msgid ""
-"<b>Sketch mode</b>: holding <b>Alt</b> interpolates between sketched paths. "
-"Release <b>Alt</b> to finalize."
-msgstr ""
-
-#: ../src/pencil-context.cpp:600
-msgid "Finishing freehand sketch"
-msgstr ""
-
-#: ../src/pen-context.cpp:662
-msgid "<b>Click</b> or <b>click and drag</b> to close and finish the path."
-msgstr ""
-
-#: ../src/pen-context.cpp:672
-msgid ""
-"<b>Click</b> or <b>click and drag</b> to continue the path from this point."
-msgstr ""
-
-#: ../src/pen-context.cpp:1266
-#, c-format
-msgid ""
-"<b>Curve segment</b>: angle %3.2f°, distance %s; with <b>Ctrl</b> to "
-"snap angle, <b>Enter</b> to finish the path"
-msgstr ""
-
-#: ../src/pen-context.cpp:1267
-#, c-format
-msgid ""
-"<b>Line segment</b>: angle %3.2f°, distance %s; with <b>Ctrl</b> to "
-"snap angle, <b>Enter</b> to finish the path"
-msgstr ""
-
-#: ../src/pen-context.cpp:1285
-#, c-format
-msgid ""
-"<b>Curve handle</b>: angle %3.2f°, length %s; with <b>Ctrl</b> to snap "
-"angle"
-msgstr ""
-
-#: ../src/pen-context.cpp:1307
-#, c-format
-msgid ""
-"<b>Curve handle, symmetric</b>: angle %3.2f°, length %s; with <b>Ctrl</"
-"b> to snap angle, with <b>Shift</b> to move this handle only"
-msgstr ""
-
-#: ../src/pen-context.cpp:1308
-#, c-format
-msgid ""
-"<b>Curve handle</b>: angle %3.2f°, length %s; with <b>Ctrl</b> to snap "
-"angle, with <b>Shift</b> to move this handle only"
-msgstr ""
-
-#: ../src/pen-context.cpp:1355
-msgid "Drawing finished"
-msgstr ""
-
-#: ../src/persp3d.cpp:335
-msgid "Toggle vanishing point"
-msgstr ""
-
-#: ../src/persp3d.cpp:346
-msgid "Toggle multiple vanishing points"
-msgstr ""
-
-#: ../src/preferences.cpp:129
-msgid ""
-"Inkscape will run with default settings, and new settings will not be saved. "
-msgstr ""
-
-#. the creation failed
-#. _reportError(Glib::ustring::compose(_("Cannot create profile directory %1."),
-#. Glib::filename_to_utf8(_prefs_dir)), not_saved);
-#: ../src/preferences.cpp:144
-#, c-format
-msgid "Cannot create profile directory %s."
-msgstr ""
-
-#. The profile dir is not actually a directory
-#. _reportError(Glib::ustring::compose(_("%1 is not a valid directory."),
-#. Glib::filename_to_utf8(_prefs_dir)), not_saved);
-#: ../src/preferences.cpp:162
-#, c-format
-msgid "%s is not a valid directory."
-msgstr ""
-
-#. The write failed.
-#. _reportError(Glib::ustring::compose(_("Failed to create the preferences file %1."),
-#. Glib::filename_to_utf8(_prefs_filename)), not_saved);
-#: ../src/preferences.cpp:173
-#, c-format
-msgid "Failed to create the preferences file %s."
-msgstr ""
-
-#: ../src/preferences.cpp:209
-#, c-format
-msgid "The preferences file %s is not a regular file."
-msgstr ""
-
-#: ../src/preferences.cpp:219
-#, c-format
-msgid "The preferences file %s could not be read."
-msgstr ""
-
-#: ../src/preferences.cpp:230
-#, c-format
-msgid "The preferences file %s is not a valid XML document."
-msgstr ""
-
-#: ../src/preferences.cpp:239
-#, c-format
-msgid "The file %s is not a valid Inkscape preferences file."
-msgstr ""
-
-#: ../src/preferences-skeleton.h:98
-msgid "Dip pen"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:99
-msgid "Marker"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:100
-msgid "Brush"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:101
-msgid "Wiggly"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:102
-msgid "Splotchy"
-msgstr ""
-
-#: ../src/preferences-skeleton.h:103
-msgid "Tracing"
-msgstr ""
-
-#: ../src/rdf.cpp:172
-msgid "CC Attribution"
-msgstr ""
-
-#: ../src/rdf.cpp:177
-msgid "CC Attribution-ShareAlike"
-msgstr ""
-
-#: ../src/rdf.cpp:182
-msgid "CC Attribution-NoDerivs"
-msgstr ""
-
-#: ../src/rdf.cpp:187
-msgid "CC Attribution-NonCommercial"
-msgstr ""
-
-#: ../src/rdf.cpp:192
-msgid "CC Attribution-NonCommercial-ShareAlike"
-msgstr ""
-
-#: ../src/rdf.cpp:197
-msgid "CC Attribution-NonCommercial-NoDerivs"
-msgstr ""
-
-#: ../src/rdf.cpp:202
-msgid "Public Domain"
-msgstr ""
-
-#: ../src/rdf.cpp:207
-msgid "FreeArt"
-msgstr ""
-
-#: ../src/rdf.cpp:212
-msgid "Open Font License"
-msgstr ""
-
-#: ../src/rdf.cpp:229
-msgid "Title"
-msgstr ""
-
-#: ../src/rdf.cpp:230
-msgid "Name by which this document is formally known."
-msgstr ""
-
-#: ../src/rdf.cpp:232
-msgid "Date"
-msgstr ""
-
-#: ../src/rdf.cpp:233
-msgid "Date associated with the creation of this document (YYYY-MM-DD)."
-msgstr ""
-
-#: ../src/rdf.cpp:235
-msgid "Format"
-msgstr ""
-
-#: ../src/rdf.cpp:236
-msgid "The physical or digital manifestation of this document (MIME type)."
-msgstr ""
-
-#: ../src/rdf.cpp:239
-msgid "Type of document (DCMI Type)."
-msgstr ""
-
-#: ../src/rdf.cpp:242
-msgid "Creator"
-msgstr ""
-
-#: ../src/rdf.cpp:243
-msgid ""
-"Name of entity primarily responsible for making the content of this document."
-msgstr ""
-
-#: ../src/rdf.cpp:245
-msgid "Rights"
-msgstr ""
-
-#: ../src/rdf.cpp:246
-msgid ""
-"Name of entity with rights to the Intellectual Property of this document."
-msgstr ""
-
-#: ../src/rdf.cpp:248
-msgid "Publisher"
-msgstr ""
-
-#: ../src/rdf.cpp:249
-msgid "Name of entity responsible for making this document available."
-msgstr ""
-
-#: ../src/rdf.cpp:252
-msgid "Identifier"
-msgstr ""
-
-#: ../src/rdf.cpp:253
-msgid "Unique URI to reference this document."
-msgstr ""
-
-#: ../src/rdf.cpp:255 ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1438
-msgid "Source"
-msgstr ""
-
-#: ../src/rdf.cpp:256
-msgid "Unique URI to reference the source of this document."
-msgstr ""
-
-#: ../src/rdf.cpp:258
-msgid "Relation"
-msgstr ""
-
-#: ../src/rdf.cpp:259
-msgid "Unique URI to a related document."
-msgstr ""
-
-#: ../src/rdf.cpp:261
-msgid "Language"
-msgstr ""
-
-#: ../src/rdf.cpp:262
-msgid ""
-"Two-letter language tag with optional subtags for the language of this "
-"document. (e.g. 'en-GB')"
-msgstr ""
-
-#: ../src/rdf.cpp:264
-msgid "Keywords"
-msgstr ""
-
-#: ../src/rdf.cpp:265
-msgid ""
-"The topic of this document as comma-separated key words, phrases, or "
-"classifications."
-msgstr ""
-
-#. TRANSLATORS: "Coverage": the spatial or temporal characteristics of the content.
-#. For info, see Appendix D of http://www.w3.org/TR/1998/WD-rdf-schema-19980409/
-#: ../src/rdf.cpp:269
-msgid "Coverage"
-msgstr ""
-
-#: ../src/rdf.cpp:270
-msgid "Extent or scope of this document."
-msgstr ""
-
-#: ../src/rdf.cpp:273 ../src/ui/widget/page-sizer.cpp:239
-msgid "Description"
-msgstr ""
-
-#: ../src/rdf.cpp:274
-msgid "A short account of the content of this document."
-msgstr ""
-
-#. FIXME: need to handle 1 agent per line of input
-#: ../src/rdf.cpp:278
-msgid "Contributors"
-msgstr ""
-
-#: ../src/rdf.cpp:279
-msgid ""
-"Names of entities responsible for making contributions to the content of "
-"this document."
-msgstr ""
-
-#. TRANSLATORS: URL to a page that defines the license for the document
-#: ../src/rdf.cpp:283
-msgid "URI"
-msgstr ""
-
-#. TRANSLATORS: this is where you put a URL to a page that defines the license
-#: ../src/rdf.cpp:285
-msgid "URI to this document's license's namespace definition."
-msgstr ""
-
-#. TRANSLATORS: fragment of XML representing the license of the document
-#: ../src/rdf.cpp:289
-msgid "Fragment"
-msgstr ""
-
-#: ../src/rdf.cpp:290
-msgid "XML fragment for the RDF 'License' section."
-msgstr ""
-
-#: ../src/rect-context.cpp:361
-msgid ""
-"<b>Ctrl</b>: make square or integer-ratio rect, lock a rounded corner "
-"circular"
-msgstr ""
-
-#: ../src/rect-context.cpp:508
-#, c-format
-msgid ""
-"<b>Rectangle</b>: %s × %s (constrained to ratio %d:%d); with <b>Shift</"
-"b> to draw around the starting point"
-msgstr ""
-
-#: ../src/rect-context.cpp:511
-#, c-format
-msgid ""
-"<b>Rectangle</b>: %s × %s (constrained to golden ratio 1.618 : 1); with "
-"<b>Shift</b> to draw around the starting point"
-msgstr ""
-
-#: ../src/rect-context.cpp:513
-#, c-format
-msgid ""
-"<b>Rectangle</b>: %s × %s (constrained to golden ratio 1 : 1.618); with "
-"<b>Shift</b> to draw around the starting point"
-msgstr ""
-
-#: ../src/rect-context.cpp:517
-#, c-format
-msgid ""
-"<b>Rectangle</b>: %s × %s; with <b>Ctrl</b> to make square or integer-"
-"ratio rectangle; with <b>Shift</b> to draw around the starting point"
-msgstr ""
-
-#: ../src/rect-context.cpp:542
-msgid "Create rectangle"
-msgstr ""
-
-#: ../src/select-context.cpp:233
-msgid "Move canceled."
-msgstr ""
-
-#: ../src/select-context.cpp:241
-msgid "Selection canceled."
-msgstr ""
-
-#: ../src/select-context.cpp:555
-msgid ""
-"<b>Draw over</b> objects to select them; release <b>Alt</b> to switch to "
-"rubberband selection"
-msgstr ""
-
-#: ../src/select-context.cpp:557
-msgid ""
-"<b>Drag around</b> objects to select them; press <b>Alt</b> to switch to "
-"touch selection"
-msgstr ""
-
-#: ../src/select-context.cpp:721
-msgid "<b>Ctrl</b>: click to select in groups; drag to move hor/vert"
-msgstr ""
-
-#: ../src/select-context.cpp:722
-msgid "<b>Shift</b>: click to toggle select; drag for rubberband selection"
-msgstr ""
-
-#: ../src/select-context.cpp:723
-msgid ""
-"<b>Alt</b>: click to select under; drag to move selected or select by touch"
-msgstr ""
-
-#: ../src/select-context.cpp:898
-msgid "Selected object is not a group. Cannot enter."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:195
-msgid "Delete text"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:203
-msgid "<b>Nothing</b> was deleted."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:221 ../src/text-context.cpp:995
-#: ../src/ui/dialog/swatches.cpp:471 ../src/widgets/toolbox.cpp:1304
-#: ../src/widgets/toolbox.cpp:5752
-msgid "Delete"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:249
-msgid "Select <b>object(s)</b> to duplicate."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:341
-msgid "Delete all"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:464
-msgid "Select <b>some objects</b> to group."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:537 ../src/selection-describer.cpp:53
-msgid "Group"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:551
-msgid "Select a <b>group</b> to ungroup."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:592
-msgid "<b>No groups</b> to ungroup in the selection."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:598 ../src/sp-item-group.cpp:516
-msgid "Ungroup"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:688
-msgid "Select <b>object(s)</b> to raise."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:694 ../src/selection-chemistry.cpp:756
-#: ../src/selection-chemistry.cpp:790 ../src/selection-chemistry.cpp:854
-msgid ""
-"You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Raise" means "to raise an object" in the undo history
-#: ../src/selection-chemistry.cpp:736
-msgid "undo_action|Raise"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:748
-msgid "Select <b>object(s)</b> to raise to top."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:771
-msgid "Raise to top"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:784
-msgid "Select <b>object(s)</b> to lower."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:834
-msgid "Lower"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:846
-msgid "Select <b>object(s)</b> to lower to bottom."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:881
-msgid "Lower to bottom"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:888
-msgid "Nothing to undo."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:895
-msgid "Nothing to redo."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:955
-msgid "Paste"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:962
-msgid "Paste style"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:971
-msgid "Paste live path effect"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:991
-msgid "Select <b>object(s)</b> to remove live path effects from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1003
-msgid "Remove live path effect"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1014
-msgid "Select <b>object(s)</b> to remove filters from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1024
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1336
-msgid "Remove filter"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1033
-msgid "Paste size"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1041
-msgid "Paste size separately"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1050
-msgid "Select <b>object(s)</b> to move to the layer above."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1076
-msgid "Raise to next layer"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1083
-msgid "No more layers above."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1095
-msgid "Select <b>object(s)</b> to move to the layer below."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1121
-msgid "Lower to previous layer"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1128
-msgid "No more layers below."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1315
-msgid "Remove transform"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1418
-msgid "Rotate 90° CCW"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1418
-msgid "Rotate 90° CW"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1439 ../src/seltrans.cpp:534
-#: ../src/ui/dialog/transformation.cpp:760
-msgid "Rotate"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1486
-msgid "Rotate by pixels"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1541
-msgid "Scale by whole factor"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1556
-msgid "Move vertically"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1559
-msgid "Move horizontally"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1562 ../src/selection-chemistry.cpp:1588
-#: ../src/seltrans.cpp:528 ../src/ui/dialog/transformation.cpp:681
-msgid "Move"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1582
-msgid "Move vertically by pixels"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1585
-msgid "Move horizontally by pixels"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1713
-msgid "The selection has no applied path effect."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1760
-msgid "The selection has no applied clip path."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1762
-msgid "The selection has no applied mask."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1919
-msgid "action|Clone"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1935
-msgid "Select <b>clones</b> to relink."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1942
-msgid "Copy an <b>object</b> to clipboard to relink clones to."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1966
-msgid "<b>No clones to relink</b> in the selection."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1969
-msgid "Relink clone"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:1983
-msgid "Select <b>clones</b> to unlink."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2032
-msgid "<b>No clones to unlink</b> in the selection."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2036
-msgid "Unlink clone"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2049
-msgid ""
-"Select a <b>clone</b> to go to its original. Select a <b>linked offset</b> "
-"to go to its source. Select a <b>text on path</b> to go to the path. Select "
-"a <b>flowed text</b> to go to its frame."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2072
-msgid ""
-"<b>Cannot find</b> the object to select (orphaned clone, offset, textpath, "
-"flowed text?)"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2078
-msgid ""
-"The object you're trying to select is <b>not visible</b> (it is in <"
-"defs>)"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2124
-msgid "Select <b>object(s)</b> to convert to marker."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2192
-msgid "Objects to marker"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2220
-msgid "Select <b>object(s)</b> to convert to guides."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2232
-msgid "Objects to guides"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2248
-msgid "Select <b>object(s)</b> to convert to pattern."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2336
-msgid "Objects to pattern"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2352
-msgid "Select an <b>object with pattern fill</b> to extract objects from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2405
-msgid "<b>No pattern fills</b> in the selection."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2408
-msgid "Pattern to objects"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2493
-msgid "Select <b>object(s)</b> to make a bitmap copy."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2497
-msgid "Rendering bitmap..."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2676
-msgid "Create bitmap"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2708
-msgid "Select <b>object(s)</b> to create clippath or mask from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2711
-msgid "Select mask object and <b>object(s)</b> to apply clippath or mask to."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2818
-msgid "Set clipping path"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2820
-msgid "Set mask"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2833
-msgid "Select <b>object(s)</b> to remove clippath or mask from."
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2906
-msgid "Release clipping path"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2908
-msgid "Release mask"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2924
-msgid "Select <b>object(s)</b> to fit canvas to."
-msgstr ""
-
-#. Fit Page
-#: ../src/selection-chemistry.cpp:2944 ../src/verbs.cpp:2723
-msgid "Fit Page to Selection"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2969 ../src/verbs.cpp:2725
-msgid "Fit Page to Drawing"
-msgstr ""
-
-#: ../src/selection-chemistry.cpp:2985 ../src/verbs.cpp:2727
-msgid "Fit Page to Selection or Drawing"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Link" means internet link (anchor)
-#: ../src/selection-describer.cpp:45
-msgid "web|Link"
-msgstr ""
-
-#: ../src/selection-describer.cpp:47
-msgid "Circle"
-msgstr ""
-
-#. ellipse
-#: ../src/selection-describer.cpp:49 ../src/selection-describer.cpp:76
-#: ../src/ui/dialog/inkscape-preferences.cpp:474 ../src/verbs.cpp:2510
-#: ../src/widgets/toolbox.cpp:3890
-msgid "Ellipse"
-msgstr ""
-
-#: ../src/selection-describer.cpp:51
-msgid "Flowed text"
-msgstr ""
-
-#: ../src/selection-describer.cpp:57
-msgid "Line"
-msgstr ""
-
-#: ../src/selection-describer.cpp:59
-msgid "Path"
-msgstr ""
-
-#: ../src/selection-describer.cpp:61 ../src/widgets/toolbox.cpp:2726
-msgid "Polygon"
-msgstr ""
-
-#: ../src/selection-describer.cpp:63
-msgid "Polyline"
-msgstr ""
-
-#. Rectangle
-#: ../src/selection-describer.cpp:65
-#: ../src/ui/dialog/inkscape-preferences.cpp:464 ../src/verbs.cpp:2506
-msgid "Rectangle"
-msgstr ""
-
-#. 3D box
-#: ../src/selection-describer.cpp:67
-#: ../src/ui/dialog/inkscape-preferences.cpp:469 ../src/verbs.cpp:2508
-msgid "3D Box"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Clone" is a noun, type of object
-#: ../src/selection-describer.cpp:74
-msgid "object|Clone"
-msgstr ""
-
-#: ../src/selection-describer.cpp:78
-msgid "Offset path"
-msgstr ""
-
-#. spiral
-#: ../src/selection-describer.cpp:80
-#: ../src/ui/dialog/inkscape-preferences.cpp:482 ../src/verbs.cpp:2514
-msgid "Spiral"
-msgstr ""
-
-#. star
-#: ../src/selection-describer.cpp:82
-#: ../src/ui/dialog/inkscape-preferences.cpp:478 ../src/verbs.cpp:2512
-#: ../src/widgets/toolbox.cpp:2733
-msgid "Star"
-msgstr ""
-
-#: ../src/selection-describer.cpp:128
-msgid "Click selection to toggle scale/rotation handles"
-msgstr ""
-
-#. no items
-#: ../src/selection-describer.cpp:130
-msgid ""
-"No objects selected. Click, Shift+click, or drag around objects to select."
-msgstr ""
-
-#: ../src/selection-describer.cpp:139
-msgid "root"
-msgstr ""
-
-#: ../src/selection-describer.cpp:151
-#, c-format
-msgid "layer <b>%s</b>"
-msgstr ""
-
-#: ../src/selection-describer.cpp:153
-#, c-format
-msgid "layer <b><i>%s</i></b>"
-msgstr ""
-
-#: ../src/selection-describer.cpp:162
-#, c-format
-msgid "<i>%s</i>"
-msgstr ""
-
-#: ../src/selection-describer.cpp:171
-#, c-format
-msgid " in %s"
-msgstr ""
-
-#: ../src/selection-describer.cpp:173
-#, c-format
-msgid " in group %s (%s)"
-msgstr ""
-
-#: ../src/selection-describer.cpp:175
-#, c-format
-msgid " in <b>%i</b> parents (%s)"
-msgid_plural " in <b>%i</b> parents (%s)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/selection-describer.cpp:178
-#, c-format
-msgid " in <b>%i</b> layers"
-msgid_plural " in <b>%i</b> layers"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/selection-describer.cpp:188
-msgid "Use <b>Shift+D</b> to look up original"
-msgstr ""
-
-#: ../src/selection-describer.cpp:192
-msgid "Use <b>Shift+D</b> to look up path"
-msgstr ""
-
-#: ../src/selection-describer.cpp:196
-msgid "Use <b>Shift+D</b> to look up frame"
-msgstr ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:211 ../src/tweak-context.cpp:202
-#, c-format
-msgid "<b>%i</b> object selected"
-msgid_plural "<b>%i</b> objects selected"
-msgstr[0] ""
-msgstr[1] ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:216
-#, c-format
-msgid "<b>%i</b> object of type <b>%s</b>"
-msgid_plural "<b>%i</b> objects of type <b>%s</b>"
-msgstr[0] ""
-msgstr[1] ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:221
-#, c-format
-msgid "<b>%i</b> object of types <b>%s</b>, <b>%s</b>"
-msgid_plural "<b>%i</b> objects of types <b>%s</b>, <b>%s</b>"
-msgstr[0] ""
-msgstr[1] ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:226
-#, c-format
-msgid "<b>%i</b> object of types <b>%s</b>, <b>%s</b>, <b>%s</b>"
-msgid_plural "<b>%i</b> objects of types <b>%s</b>, <b>%s</b>, <b>%s</b>"
-msgstr[0] ""
-msgstr[1] ""
-
-#. this is only used with 2 or more objects
-#: ../src/selection-describer.cpp:231
-#, c-format
-msgid "<b>%i</b> object of <b>%i</b> types"
-msgid_plural "<b>%i</b> objects of <b>%i</b> types"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/selection-describer.cpp:236
-#, c-format
-msgid "%s%s. %s."
-msgstr ""
-
-#: ../src/seltrans.cpp:537 ../src/ui/dialog/transformation.cpp:819
-msgid "Skew"
-msgstr ""
-
-#: ../src/seltrans.cpp:549
-msgid "Set center"
-msgstr ""
-
-#: ../src/seltrans.cpp:646
-msgid ""
-"<b>Center</b> of rotation and skewing: drag to reposition; scaling with "
-"Shift also uses this center"
-msgstr ""
-
-#: ../src/seltrans.cpp:673
-msgid ""
-"<b>Squeeze or stretch</b> selection; with <b>Ctrl</b> to scale uniformly; "
-"with <b>Shift</b> to scale around rotation center"
-msgstr ""
-
-#: ../src/seltrans.cpp:674
-msgid ""
-"<b>Scale</b> selection; with <b>Ctrl</b> to scale uniformly; with <b>Shift</"
-"b> to scale around rotation center"
-msgstr ""
-
-#: ../src/seltrans.cpp:678
-msgid ""
-"<b>Skew</b> selection; with <b>Ctrl</b> to snap angle; with <b>Shift</b> to "
-"skew around the opposite side"
-msgstr ""
-
-#: ../src/seltrans.cpp:679
-msgid ""
-"<b>Rotate</b> selection; with <b>Ctrl</b> to snap angle; with <b>Shift</b> "
-"to rotate around the opposite corner"
-msgstr ""
-
-#: ../src/seltrans.cpp:813
-msgid "Reset center"
-msgstr ""
-
-#: ../src/seltrans.cpp:1058 ../src/seltrans.cpp:1157
-#, c-format
-msgid "<b>Scale</b>: %0.2f%% x %0.2f%%; with <b>Ctrl</b> to lock ratio"
-msgstr ""
-
-#. TRANSLATORS: don't modify the first ";"
-#. (it will NOT be displayed as ";" - only the second one will be)
-#: ../src/seltrans.cpp:1269
-#, c-format
-msgid "<b>Skew</b>: %0.2f°; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#. TRANSLATORS: don't modify the first ";"
-#. (it will NOT be displayed as ";" - only the second one will be)
-#: ../src/seltrans.cpp:1329
-#, c-format
-msgid "<b>Rotate</b>: %0.2f°; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/seltrans.cpp:1371
-#, c-format
-msgid "Move <b>center</b> to %s, %s"
-msgstr ""
-
-#: ../src/seltrans.cpp:1541
-#, c-format
-msgid ""
-"<b>Move</b> by %s, %s; with <b>Ctrl</b> to restrict to horizontal/vertical; "
-"with <b>Shift</b> to disable snapping"
-msgstr ""
-
-#: ../src/shape-editor.cpp:472
-msgid "Drag curve"
-msgstr ""
-
-#: ../src/sp-anchor.cpp:178
-#, c-format
-msgid "<b>Link</b> to %s"
-msgstr ""
-
-#: ../src/sp-anchor.cpp:182
-msgid "<b>Link</b> without URI"
-msgstr ""
-
-#: ../src/sp-ellipse.cpp:502 ../src/sp-ellipse.cpp:879
-msgid "<b>Ellipse</b>"
-msgstr ""
-
-#: ../src/sp-ellipse.cpp:643
-msgid "<b>Circle</b>"
-msgstr ""
-
-#: ../src/sp-ellipse.cpp:874
-msgid "<b>Segment</b>"
-msgstr ""
-
-#: ../src/sp-ellipse.cpp:876
-msgid "<b>Arc</b>"
-msgstr ""
-
-#. TRANSLATORS: "Flow region" is an area where text is allowed to flow
-#: ../src/sp-flowregion.cpp:270
-#, c-format
-msgid "Flow region"
-msgstr ""
-
-#. TRANSLATORS: A region "cut out of" a flow region; text is not allowed to flow inside the
-#. * flow excluded region. flowRegionExclude in SVG 1.2: see
-#. * http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html#flowRegion-elem and
-#. * http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html#flowRegionExclude-elem.
-#: ../src/sp-flowregion.cpp:487
-#, c-format
-msgid "Flow excluded region"
-msgstr ""
-
-#: ../src/sp-flowtext.cpp:376
-#, c-format
-msgid "<b>Flowed text</b> (%d character)"
-msgid_plural "<b>Flowed text</b> (%d characters)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-flowtext.cpp:378
-#, c-format
-msgid "<b>Linked flowed text</b> (%d character)"
-msgid_plural "<b>Linked flowed text</b> (%d characters)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-guide.cpp:287
-msgid "Guides Around Page"
-msgstr ""
-
-#: ../src/sp-guide.cpp:421
-msgid ""
-"<b>Shift+drag</b> to rotate, <b>Ctrl+drag</b> to move origin, <b>Del</b> to "
-"delete"
-msgstr ""
-
-#: ../src/sp-guide.cpp:426
-#, c-format
-msgid "vertical, at %s"
-msgstr ""
-
-#: ../src/sp-guide.cpp:429
-#, c-format
-msgid "horizontal, at %s"
-msgstr ""
-
-#: ../src/sp-guide.cpp:434
-#, c-format
-msgid "at %d degrees, through (%s,%s)"
-msgstr ""
-
-#: ../src/sp-image.cpp:1128
-msgid "embedded"
-msgstr ""
-
-#: ../src/sp-image.cpp:1136
-#, c-format
-msgid "<b>Image with bad reference</b>: %s"
-msgstr ""
-
-#: ../src/sp-image.cpp:1137
-#, c-format
-msgid "<b>Image</b> %d × %d: %s"
-msgstr ""
-
-#: ../src/spiral-context.cpp:319
-msgid "<b>Ctrl</b>: snap angle"
-msgstr ""
-
-#: ../src/spiral-context.cpp:321
-msgid "<b>Alt</b>: lock spiral radius"
-msgstr ""
-
-#: ../src/spiral-context.cpp:453
-#, c-format
-msgid ""
-"<b>Spiral</b>: radius %s, angle %5g°; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/spiral-context.cpp:479
-msgid "Create spiral"
-msgstr ""
-
-#: ../src/sp-item.cpp:1035
-msgid "Object"
-msgstr ""
-
-#: ../src/sp-item.cpp:1052
-#, c-format
-msgid "%s; <i>clipped</i>"
-msgstr ""
-
-#: ../src/sp-item.cpp:1057
-#, c-format
-msgid "%s; <i>masked</i>"
-msgstr ""
-
-#: ../src/sp-item.cpp:1065
-#, c-format
-msgid "%s; <i>filtered (%s)</i>"
-msgstr ""
-
-#: ../src/sp-item.cpp:1067
-#, c-format
-msgid "%s; <i>filtered</i>"
-msgstr ""
-
-#: ../src/sp-item-group.cpp:761
-#, c-format
-msgid "<b>Group</b> of <b>%d</b> object"
-msgid_plural "<b>Group</b> of <b>%d</b> objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-line.cpp:194
-msgid "<b>Line</b>"
-msgstr ""
-
-#: ../src/splivarot.cpp:66 ../src/splivarot.cpp:72
-msgid "Union"
-msgstr ""
-
-#: ../src/splivarot.cpp:78
-msgid "Intersection"
-msgstr ""
-
-#: ../src/splivarot.cpp:84 ../src/splivarot.cpp:90
-msgid "Difference"
-msgstr ""
-
-#: ../src/splivarot.cpp:96
-msgid "Exclusion"
-msgstr ""
-
-#: ../src/splivarot.cpp:101
-msgid "Division"
-msgstr ""
-
-#: ../src/splivarot.cpp:106
-msgid "Cut path"
-msgstr ""
-
-#: ../src/splivarot.cpp:121
-msgid "Select <b>at least 2 paths</b> to perform a boolean operation."
-msgstr ""
-
-#: ../src/splivarot.cpp:125
-msgid "Select <b>at least 1 path</b> to perform a boolean union."
-msgstr ""
-
-#: ../src/splivarot.cpp:131
-msgid ""
-"Select <b>exactly 2 paths</b> to perform difference, division, or path cut."
-msgstr ""
-
-#: ../src/splivarot.cpp:147 ../src/splivarot.cpp:162
-msgid ""
-"Unable to determine the <b>z-order</b> of the objects selected for "
-"difference, XOR, division, or path cut."
-msgstr ""
-
-#: ../src/splivarot.cpp:192
-msgid ""
-"One of the objects is <b>not a path</b>, cannot perform boolean operation."
-msgstr ""
-
-#: ../src/splivarot.cpp:633
-msgid "Select <b>stroked path(s)</b> to convert stroke to path."
-msgstr ""
-
-#: ../src/splivarot.cpp:976
-msgid "Convert stroke to path"
-msgstr ""
-
-#. TRANSLATORS: "to outline" means "to convert stroke to path"
-#: ../src/splivarot.cpp:979
-msgid "<b>No stroked paths</b> in the selection."
-msgstr ""
-
-#: ../src/splivarot.cpp:1062
-msgid "Selected object is <b>not a path</b>, cannot inset/outset."
-msgstr ""
-
-#: ../src/splivarot.cpp:1181 ../src/splivarot.cpp:1250
-msgid "Create linked offset"
-msgstr ""
-
-#: ../src/splivarot.cpp:1182 ../src/splivarot.cpp:1251
-msgid "Create dynamic offset"
-msgstr ""
-
-#: ../src/splivarot.cpp:1276
-msgid "Select <b>path(s)</b> to inset/outset."
-msgstr ""
-
-#: ../src/splivarot.cpp:1494
-msgid "Outset path"
-msgstr ""
-
-#: ../src/splivarot.cpp:1494
-msgid "Inset path"
-msgstr ""
-
-#: ../src/splivarot.cpp:1496
-msgid "<b>No paths</b> to inset/outset in the selection."
-msgstr ""
-
-#: ../src/splivarot.cpp:1674
-msgid "Simplifying paths (separately):"
-msgstr ""
-
-#: ../src/splivarot.cpp:1676
-msgid "Simplifying paths:"
-msgstr ""
-
-#: ../src/splivarot.cpp:1713
-#, c-format
-msgid "%s <b>%d</b> of <b>%d</b> paths simplified..."
-msgstr ""
-
-#: ../src/splivarot.cpp:1725
-#, c-format
-msgid "<b>%d</b> paths simplified."
-msgstr ""
-
-#: ../src/splivarot.cpp:1739
-msgid "Select <b>path(s)</b> to simplify."
-msgstr ""
-
-#: ../src/splivarot.cpp:1753
-msgid "Simplify"
-msgstr ""
-
-#: ../src/splivarot.cpp:1755
-msgid "<b>No paths</b> to simplify in the selection."
-msgstr ""
-
-#: ../src/sp-lpe-item.cpp:363
-msgid "An exception occurred during execution of the Path Effect."
-msgstr ""
-
-#. TRANSLATORS COMMENT: %s is either "outset" or "inset" depending on sign
-#: ../src/sp-offset.cpp:426
-#, c-format
-msgid "<b>Linked offset</b>, %s by %f pt"
-msgstr ""
-
-#: ../src/sp-offset.cpp:427 ../src/sp-offset.cpp:431
-msgid "outset"
-msgstr ""
-
-#: ../src/sp-offset.cpp:427 ../src/sp-offset.cpp:431
-msgid "inset"
-msgstr ""
-
-#. TRANSLATORS COMMENT: %s is either "outset" or "inset" depending on sign
-#: ../src/sp-offset.cpp:430
-#, c-format
-msgid "<b>Dynamic offset</b>, %s by %f pt"
-msgstr ""
-
-#: ../src/sp-path.cpp:156
-#, c-format
-msgid "<b>Path</b> (%i node, path effect: %s)"
-msgid_plural "<b>Path</b> (%i nodes, path effect: %s)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-path.cpp:159
-#, c-format
-msgid "<b>Path</b> (%i node)"
-msgid_plural "<b>Path</b> (%i nodes)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-polygon.cpp:226
-msgid "<b>Polygon</b>"
-msgstr ""
-
-#: ../src/sp-polyline.cpp:177
-msgid "<b>Polyline</b>"
-msgstr ""
-
-#: ../src/sp-rect.cpp:223
-msgid "<b>Rectangle</b>"
-msgstr ""
-
-#. TRANSLATORS: since turn count isn't an integer, please adjust the
-#. string as needed to deal with an localized plural forms.
-#: ../src/sp-spiral.cpp:325
-#, c-format
-msgid "<b>Spiral</b> with %3f turns"
-msgstr ""
-
-#: ../src/sp-star.cpp:309
-#, c-format
-msgid "<b>Star</b> with %d vertex"
-msgid_plural "<b>Star</b> with %d vertices"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-star.cpp:313
-#, c-format
-msgid "<b>Polygon</b> with %d vertex"
-msgid_plural "<b>Polygon</b> with %d vertices"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/sp-switch.cpp:100
-#, c-format
-msgid "<b>Conditional group</b> of <b>%d</b> object"
-msgid_plural "<b>Conditional group</b> of <b>%d</b> objects"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: For description of font with no name.
-#: ../src/sp-text.cpp:419
-msgid "<no name found>"
-msgstr ""
-
-#: ../src/sp-text.cpp:425
-#, c-format
-msgid "<b>Text on path</b> (%s, %s)"
-msgstr ""
-
-#: ../src/sp-text.cpp:426
-#, c-format
-msgid "<b>Text</b> (%s, %s)"
-msgstr ""
-
-#: ../src/sp-tref.cpp:368
-#, c-format
-msgid "<b>Cloned character data</b>%s%s"
-msgstr ""
-
-#: ../src/sp-tref.cpp:369
-msgid " from "
-msgstr ""
-
-#: ../src/sp-tref.cpp:374
-msgid "<b>Orphaned cloned character data</b>"
-msgstr ""
-
-#: ../src/sp-tspan.cpp:284
-msgid "<b>Text span</b>"
-msgstr ""
-
-#. TRANSLATORS: Used for statusbar description for long <use> chains:
-#. * "Clone of: Clone of: ... in Layer 1".
-#: ../src/sp-use.cpp:327
-msgid "..."
-msgstr ""
-
-#: ../src/sp-use.cpp:335
-#, c-format
-msgid "<b>Clone</b> of: %s"
-msgstr ""
-
-#: ../src/sp-use.cpp:339
-msgid "<b>Orphaned clone</b>"
-msgstr ""
-
-#: ../src/star-context.cpp:333
-msgid "<b>Ctrl</b>: snap angle; keep rays radial"
-msgstr ""
-
-#: ../src/star-context.cpp:464
-#, c-format
-msgid ""
-"<b>Polygon</b>: radius %s, angle %5g°; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/star-context.cpp:465
-#, c-format
-msgid "<b>Star</b>: radius %s, angle %5g°; with <b>Ctrl</b> to snap angle"
-msgstr ""
-
-#: ../src/star-context.cpp:494
-msgid "Create star"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:104
-msgid "Select <b>a text and a path</b> to put text on path."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:109
-msgid ""
-"This text object is <b>already put on a path</b>. Remove it from the path "
-"first. Use <b>Shift+D</b> to look up its path."
-msgstr ""
-
-#. rect is the only SPShape which is not <path> yet, and thus SVG forbids us from putting text on it
-#: ../src/text-chemistry.cpp:115
-msgid ""
-"You cannot put text on a rectangle in this version. Convert rectangle to "
-"path first."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:125
-msgid "The flowed text(s) must be <b>visible</b> in order to be put on a path."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:192 ../src/verbs.cpp:2364
-msgid "Put text on path"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:204
-msgid "Select <b>a text on path</b> to remove it from path."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:226
-msgid "<b>No texts-on-paths</b> in the selection."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:229 ../src/verbs.cpp:2366
-msgid "Remove text from path"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:269 ../src/text-chemistry.cpp:290
-msgid "Select <b>text(s)</b> to remove kerns from."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:293
-msgid "Remove manual kerns"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:313
-msgid ""
-"Select <b>a text</b> and one or more <b>paths or shapes</b> to flow text "
-"into frame."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:381
-msgid "Flow text into shape"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:403
-msgid "Select <b>a flowed text</b> to unflow it."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:477
-msgid "Unflow flowed text"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:489
-msgid "Select <b>flowed text(s)</b> to convert."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:507
-msgid "The flowed text(s) must be <b>visible</b> in order to be converted."
-msgstr ""
-
-#: ../src/text-chemistry.cpp:535
-msgid "Convert flowed text to text"
-msgstr ""
-
-#: ../src/text-chemistry.cpp:540
-msgid "<b>No flowed text(s)</b> to convert in the selection."
-msgstr ""
-
-#: ../src/text-context.cpp:441
-msgid "<b>Click</b> to edit the text, <b>drag</b> to select part of the text."
-msgstr ""
-
-#: ../src/text-context.cpp:443
-msgid ""
-"<b>Click</b> to edit the flowed text, <b>drag</b> to select part of the text."
-msgstr ""
-
-#: ../src/text-context.cpp:498
-msgid "Create text"
-msgstr ""
-
-#: ../src/text-context.cpp:522
-msgid "Non-printable character"
-msgstr ""
-
-#: ../src/text-context.cpp:537
-msgid "Insert Unicode character"
-msgstr ""
-
-#: ../src/text-context.cpp:572
-#, c-format
-msgid "Unicode (<b>Enter</b> to finish): %s: %s"
-msgstr ""
-
-#: ../src/text-context.cpp:574 ../src/text-context.cpp:849
-msgid "Unicode (<b>Enter</b> to finish): "
-msgstr ""
-
-#: ../src/text-context.cpp:649
-#, c-format
-msgid "<b>Flowed text frame</b>: %s × %s"
-msgstr ""
-
-#: ../src/text-context.cpp:681
-msgid "Type text; <b>Enter</b> to start new line."
-msgstr ""
-
-#: ../src/text-context.cpp:694
-msgid "Flowed text is created."
-msgstr ""
-
-#: ../src/text-context.cpp:696
-msgid "Create flowed text"
-msgstr ""
-
-#: ../src/text-context.cpp:698
-msgid ""
-"The frame is <b>too small</b> for the current font size. Flowed text not "
-"created."
-msgstr ""
-
-#: ../src/text-context.cpp:834
-msgid "No-break space"
-msgstr ""
-
-#: ../src/text-context.cpp:836
-msgid "Insert no-break space"
-msgstr ""
-
-#: ../src/text-context.cpp:873
-msgid "Make bold"
-msgstr ""
-
-#: ../src/text-context.cpp:891
-msgid "Make italic"
-msgstr ""
-
-#: ../src/text-context.cpp:930
-msgid "New line"
-msgstr ""
-
-#: ../src/text-context.cpp:964
-msgid "Backspace"
-msgstr ""
-
-#: ../src/text-context.cpp:1012
-msgid "Kern to the left"
-msgstr ""
-
-#: ../src/text-context.cpp:1037
-msgid "Kern to the right"
-msgstr ""
-
-#: ../src/text-context.cpp:1062
-msgid "Kern up"
-msgstr ""
-
-#: ../src/text-context.cpp:1088
-msgid "Kern down"
-msgstr ""
-
-#: ../src/text-context.cpp:1165
-msgid "Rotate counterclockwise"
-msgstr ""
-
-#: ../src/text-context.cpp:1186
-msgid "Rotate clockwise"
-msgstr ""
-
-#: ../src/text-context.cpp:1203
-msgid "Contract line spacing"
-msgstr ""
-
-#: ../src/text-context.cpp:1211
-msgid "Contract letter spacing"
-msgstr ""
-
-#: ../src/text-context.cpp:1230
-msgid "Expand line spacing"
-msgstr ""
-
-#: ../src/text-context.cpp:1238
-msgid "Expand letter spacing"
-msgstr ""
-
-#: ../src/text-context.cpp:1368
-msgid "Paste text"
-msgstr ""
-
-#: ../src/text-context.cpp:1602
-#, c-format
-msgid ""
-"Type or edit flowed text (%d characters); <b>Enter</b> to start new "
-"paragraph."
-msgstr ""
-
-#: ../src/text-context.cpp:1604
-#, c-format
-msgid "Type or edit text (%d characters); <b>Enter</b> to start new line."
-msgstr ""
-
-#: ../src/text-context.cpp:1612 ../src/tools-switch.cpp:190
-msgid ""
-"<b>Click</b> to select or create text, <b>drag</b> to create flowed text; "
-"then type."
-msgstr ""
-
-#: ../src/text-context.cpp:1722
-msgid "Type text"
-msgstr ""
-
-#: ../src/text-editing.cpp:40
-msgid "You cannot edit <b>cloned character data</b>."
-msgstr ""
-
-#: ../src/tools-switch.cpp:130
-msgid ""
-"To edit a path, <b>click</b>, <b>Shift+click</b>, or <b>drag around</b> "
-"nodes to select them, then <b>drag</b> nodes and handles. <b>Click</b> on an "
-"object to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:136
-msgid "To tweak a path by pushing, select it and drag over it."
-msgstr ""
-
-#: ../src/tools-switch.cpp:142
-msgid ""
-"<b>Drag</b> to create a rectangle. <b>Drag controls</b> to round corners and "
-"resize. <b>Click</b> to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:148
-msgid ""
-"<b>Drag</b> to create a 3D box. <b>Drag controls</b> to resize in "
-"perspective. <b>Click</b> to select (with <b>Ctrl+Alt</b> for single faces)."
-msgstr ""
-
-#: ../src/tools-switch.cpp:154
-msgid ""
-"<b>Drag</b> to create an ellipse. <b>Drag controls</b> to make an arc or "
-"segment. <b>Click</b> to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:160
-msgid ""
-"<b>Drag</b> to create a star. <b>Drag controls</b> to edit the star shape. "
-"<b>Click</b> to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:166
-msgid ""
-"<b>Drag</b> to create a spiral. <b>Drag controls</b> to edit the spiral "
-"shape. <b>Click</b> to select."
-msgstr ""
-
-#: ../src/tools-switch.cpp:172
-msgid ""
-"<b>Drag</b> to create a freehand line. <b>Shift</b> appends to selected "
-"path, <b>Alt</b> activates sketch mode."
-msgstr ""
-
-#: ../src/tools-switch.cpp:178
-msgid ""
-"<b>Click</b> or <b>click and drag</b> to start a path; with <b>Shift</b> to "
-"append to selected path. <b>Ctrl+click</b> to create single dots (straight "
-"line modes only)."
-msgstr ""
-
-#: ../src/tools-switch.cpp:184
-msgid ""
-"<b>Drag</b> to draw a calligraphic stroke; with <b>Ctrl</b> to track a guide "
-"path. <b>Arrow keys</b> adjust width (left/right) and angle (up/down)."
-msgstr ""
-
-#: ../src/tools-switch.cpp:196
-msgid ""
-"<b>Drag</b> or <b>double click</b> to create a gradient on selected objects, "
-"<b>drag handles</b> to adjust gradients."
-msgstr ""
-
-#: ../src/tools-switch.cpp:202
-msgid ""
-"<b>Click</b> or <b>drag around an area</b> to zoom in, <b>Shift+click</b> to "
-"zoom out."
-msgstr ""
-
-#: ../src/tools-switch.cpp:214
-msgid "<b>Click and drag</b> between shapes to create a connector."
-msgstr ""
-
-#: ../src/tools-switch.cpp:220
-msgid ""
-"<b>Click</b> to paint a bounded area, <b>Shift+click</b> to union the new "
-"fill with the current selection, <b>Ctrl+click</b> to change the clicked "
-"object's fill and stroke to the current setting."
-msgstr ""
-
-#: ../src/tools-switch.cpp:226
-msgid "<b>Drag</b> to erase."
-msgstr ""
-
-#: ../src/tools-switch.cpp:232
-msgid "Choose a subtool from the toolbar"
-msgstr ""
-
-#: ../src/trace/potrace/inkscape-potrace.cpp:524
-#: ../src/trace/potrace/inkscape-potrace.cpp:598
-#, c-format
-msgid "Trace: %d. %ld nodes"
-msgstr ""
-
-#: ../src/trace/trace.cpp:71 ../src/trace/trace.cpp:136
-#: ../src/trace/trace.cpp:144 ../src/trace/trace.cpp:243
-msgid "Select an <b>image</b> to trace"
-msgstr ""
-
-#: ../src/trace/trace.cpp:106
-msgid "Select only one <b>image</b> to trace"
-msgstr ""
-
-#: ../src/trace/trace.cpp:124
-msgid "Select one image and one or more shapes above it"
-msgstr ""
-
-#: ../src/trace/trace.cpp:234
-msgid "Trace: No active desktop"
-msgstr ""
-
-#: ../src/trace/trace.cpp:334
-msgid "Invalid SIOX result"
-msgstr ""
-
-#: ../src/trace/trace.cpp:439
-msgid "Trace: No active document"
-msgstr ""
-
-#: ../src/trace/trace.cpp:462
-msgid "Trace: Image has no bitmap data"
-msgstr ""
-
-#: ../src/trace/trace.cpp:469
-msgid "Trace: Starting trace..."
-msgstr ""
-
-#. ## inform the document, so we can undo
-#: ../src/trace/trace.cpp:571
-msgid "Trace bitmap"
-msgstr ""
-
-#: ../src/trace/trace.cpp:575
-#, c-format
-msgid "Trace: Done. %ld nodes created"
-msgstr ""
-
-#: ../src/tweak-context.cpp:204
-#, c-format
-msgid "<b>Nothing</b> selected"
-msgstr ""
-
-#: ../src/tweak-context.cpp:210
-#, c-format
-msgid "%s. Drag to <b>move</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:214
-#, c-format
-msgid "%s. Drag or click to <b>move in</b>; with Shift to <b>move out</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:218
-#, c-format
-msgid "%s. Drag or click to <b>move randomly</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:222
-#, c-format
-msgid "%s. Drag or click to <b>scale down</b>; with Shift to <b>scale up</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:226
-#, c-format
-msgid ""
-"%s. Drag or click to <b>rotate clockwise</b>; with Shift, "
-"<b>counterclockwise</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:230
-#, c-format
-msgid "%s. Drag or click to <b>duplicate</b>; with Shift, <b>delete</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:234
-#, c-format
-msgid "%s. Drag to <b>push paths</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:238
-#, c-format
-msgid "%s. Drag or click to <b>inset paths</b>; with Shift to <b>outset</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:246
-#, c-format
-msgid "%s. Drag or click to <b>attract paths</b>; with Shift to <b>repel</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:254
-#, c-format
-msgid "%s. Drag or click to <b>roughen paths</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:258
-#, c-format
-msgid "%s. Drag or click to <b>paint objects</b> with color."
-msgstr ""
-
-#: ../src/tweak-context.cpp:262
-#, c-format
-msgid "%s. Drag or click to <b>randomize colors</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:266
-#, c-format
-msgid ""
-"%s. Drag or click to <b>increase blur</b>; with Shift to <b>decrease</b>."
-msgstr ""
-
-#: ../src/tweak-context.cpp:1223
-msgid "<b>Nothing selected!</b> Select objects to tweak."
-msgstr ""
-
-#: ../src/tweak-context.cpp:1259
-msgid "Move tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1263
-msgid "Move in/out tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1267
-msgid "Move jitter tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1271
-msgid "Scale tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1275
-msgid "Rotate tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1279
-msgid "Duplicate/delete tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1283
-msgid "Push path tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1287
-msgid "Shrink/grow path tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1291
-msgid "Attract/repel path tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1295
-msgid "Roughen path tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1299
-msgid "Color paint tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1303
-msgid "Color jitter tweak"
-msgstr ""
-
-#: ../src/tweak-context.cpp:1307
-msgid "Blur tweak"
-msgstr ""
-
-#. check whether something is selected
-#: ../src/ui/clipboard.cpp:257
-msgid "Nothing was copied."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:318 ../src/ui/clipboard.cpp:520
-#: ../src/ui/clipboard.cpp:544
-msgid "Nothing on the clipboard."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:374
-msgid "Select <b>object(s)</b> to paste style to."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:385 ../src/ui/clipboard.cpp:403
-msgid "No style on the clipboard."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:425
-msgid "Select <b>object(s)</b> to paste size to."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:432
-msgid "No size on the clipboard."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:483
-msgid "Select <b>object(s)</b> to paste live path effect to."
-msgstr ""
-
-#. no_effect:
-#: ../src/ui/clipboard.cpp:507
-msgid "No effect on the clipboard."
-msgstr ""
-
-#: ../src/ui/clipboard.cpp:527 ../src/ui/clipboard.cpp:554
-msgid "Clipboard does not contain a path."
-msgstr ""
-
-#. Item dialog
-#: ../src/ui/context-menu.cpp:105
-msgid "Object _Properties"
-msgstr ""
-
-#. Select item
-#: ../src/ui/context-menu.cpp:115
-msgid "_Select This"
-msgstr ""
-
-#. Create link
-#: ../src/ui/context-menu.cpp:125
-msgid "_Create Link"
-msgstr ""
-
-#. Set mask
-#: ../src/ui/context-menu.cpp:132
-msgid "Set Mask"
-msgstr ""
-
-#. Release mask
-#: ../src/ui/context-menu.cpp:143
-msgid "Release Mask"
-msgstr ""
-
-#. Set Clip
-#: ../src/ui/context-menu.cpp:154
-msgid "Set Clip"
-msgstr ""
-
-#. Release Clip
-#: ../src/ui/context-menu.cpp:165
-msgid "Release Clip"
-msgstr ""
-
-#: ../src/ui/context-menu.cpp:288
-msgid "Create link"
-msgstr ""
-
-#. "Ungroup"
-#: ../src/ui/context-menu.cpp:306 ../src/verbs.cpp:2360
-msgid "_Ungroup"
-msgstr ""
-
-#. Link dialog
-#: ../src/ui/context-menu.cpp:346
-msgid "Link _Properties"
-msgstr ""
-
-#. Select item
-#: ../src/ui/context-menu.cpp:352
-msgid "_Follow Link"
-msgstr ""
-
-#. Reset transformations
-#: ../src/ui/context-menu.cpp:357
-msgid "_Remove Link"
-msgstr ""
-
-#. Link dialog
-#: ../src/ui/context-menu.cpp:405
-msgid "Image _Properties"
-msgstr ""
-
-#: ../src/ui/context-menu.cpp:411
-msgid "Edit Externally..."
-msgstr ""
-
-#. Item dialog
-#: ../src/ui/context-menu.cpp:504
-msgid "_Fill and Stroke"
-msgstr ""
-
-#. *
-#. * Constructor
-#.
-#: ../src/ui/dialog/aboutbox.cpp:77
-msgid "About Inkscape"
-msgstr ""
-
-#: ../src/ui/dialog/aboutbox.cpp:88
-msgid "_Splash"
-msgstr ""
-
-#: ../src/ui/dialog/aboutbox.cpp:92
-msgid "_Authors"
-msgstr ""
-
-#: ../src/ui/dialog/aboutbox.cpp:94
-msgid "_Translators"
-msgstr ""
-
-#: ../src/ui/dialog/aboutbox.cpp:96
-msgid "_License"
-msgstr ""
-
-#. TRANSLATORS: This is the filename of the `About Inkscape' picture in
-#. the `screens' directory. Thus the translation of "about.svg" should be
-#. the filename of its translated version, e.g. about.zh.svg for Chinese.
-#.
-#. N.B. about.svg changes once per release. (We should probably rename
-#. the original to about-0.40.svg etc. as soon as we have a translation.
-#. If we do so, then add an item to release-checklist saying that the
-#. string here should be changed.)
-#. FIXME? INKSCAPE_SCREENSDIR and "about.svg" are in UTF-8, not the
-#. native filename encoding... and the filename passed to sp_document_new
-#. should be in UTF-*8..
-#: ../src/ui/dialog/aboutbox.cpp:149
-msgid "about.svg"
-msgstr ""
-
-#. TRANSLATORS: Put here your name (and other national contributors')
-#. one per line in the form of: name surname (email). Use \n for newline.
-#: ../src/ui/dialog/aboutbox.cpp:371
-msgid "translator-credits"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:238
-#: ../src/ui/dialog/align-and-distribute.cpp:787
-msgid "Align"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:397
-#: ../src/ui/dialog/align-and-distribute.cpp:788
-msgid "Distribute"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:466
-msgid "Minimum horizontal gap (in px units) between bounding boxes"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "H:" stands for horizontal gap
-#: ../src/ui/dialog/align-and-distribute.cpp:470
-msgid "gap|H:"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:478
-msgid "Minimum vertical gap (in px units) between bounding boxes"
-msgstr ""
-
-#. TRANSLATORS: Vertical gap
-#: ../src/ui/dialog/align-and-distribute.cpp:480
-msgid "V:"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:509
-#: ../src/ui/dialog/align-and-distribute.cpp:789
-#: ../src/widgets/toolbox.cpp:7068
-msgid "Remove overlaps"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:540
-#: ../src/widgets/toolbox.cpp:6931
-msgid "Arrange connector network"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:571
-msgid "Unclump"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:642
-msgid "Randomize positions"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:739
-msgid "Distribute text baselines"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:759
-msgid "Align text baselines"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:790
-msgid "Connector network layout"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:791
-#: ../src/widgets/toolbox.cpp:2083
-msgid "Nodes"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:797
-msgid "Relative to: "
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:798
-msgid "Treat selection as group: "
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:804
-msgid "Align right edges of objects to the left edge of the anchor"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:807
-msgid "Align left edges"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:810
-msgid "Center on vertical axis"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:813
-msgid "Align right sides"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:816
-msgid "Align left edges of objects to the right edge of the anchor"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:819
-msgid "Align bottom edges of objects to the top edge of the anchor"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:822
-msgid "Align top edges"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:825
-msgid "Center on horizontal axis"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:828
-msgid "Align bottom edges"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:831
-msgid "Align top edges of objects to the bottom edge of the anchor"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:836
-msgid "Align baseline anchors of texts horizontally"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:839
-msgid "Align baselines of texts"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:844
-msgid "Make horizontal gaps between objects equal"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:848
-msgid "Distribute left edges equidistantly"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:851
-msgid "Distribute centers equidistantly horizontally"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:854
-msgid "Distribute right edges equidistantly"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:858
-msgid "Make vertical gaps between objects equal"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:862
-msgid "Distribute top edges equidistantly"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:865
-msgid "Distribute centers equidistantly vertically"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:868
-msgid "Distribute bottom edges equidistantly"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:873
-msgid "Distribute baseline anchors of texts horizontally"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:876
-msgid "Distribute baselines of texts vertically"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:881
-msgid "Randomize centers in both dimensions"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:884
-msgid "Unclump objects: try to equalize edge-to-edge distances"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:889
-msgid ""
-"Move objects as little as possible so that their bounding boxes do not "
-"overlap"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:893
-#: ../src/widgets/toolbox.cpp:7031
-msgid "Nicely arrange selected connector network"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:901
-msgid "Align selected nodes to a common horizontal line"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:904
-msgid "Align selected nodes to a common vertical line"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:907
-msgid "Distribute selected nodes horizontally"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:910
-msgid "Distribute selected nodes vertically"
-msgstr ""
-
-#. Rest of the widgetry
-#: ../src/ui/dialog/align-and-distribute.cpp:915
-msgid "Last selected"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:916
-msgid "First selected"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:917
-msgid "Biggest object"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:918
-msgid "Smallest object"
-msgstr ""
-
-#: ../src/ui/dialog/align-and-distribute.cpp:921
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1414
-#: ../src/ui/dialog/icon-preview.cpp:178
-#: ../src/widgets/desktop-widget.cpp:1580
-msgid "Selection"
-msgstr ""
-
-#: ../src/ui/dialog/calligraphic-profile-rename.cpp:38
-msgid "Profile name:"
-msgstr ""
-
-#. When changing the interval or enabling/disabling the autosave function,
-#. * update our running configuration
-#. *
-#. * FIXME!
-#. * the inkscape_autosave_init should be called AFTER the values have been changed
-#. * (which cannot be guaranteed from here) - use a PrefObserver somewhere
-#.
-#.
-#. _autosave_autosave_enable.signal_toggled().connect( sigc::ptr_fun(inkscape_autosave_init), TRUE );
-#. _autosave_autosave_interval.signal_changed().connect( sigc::ptr_fun(inkscape_autosave_init), TRUE );
-#.
-#. -----------
-#: ../src/ui/dialog/calligraphic-profile-rename.cpp:52
-#: ../src/ui/dialog/inkscape-preferences.cpp:1145
-msgid "Save"
-msgstr ""
-
-#: ../src/ui/dialog/debug.cpp:68
-msgid "Messages"
-msgstr ""
-
-#: ../src/ui/dialog/debug.cpp:77 ../src/ui/dialog/messages.cpp:55
-msgid "Capture log messages"
-msgstr ""
-
-#: ../src/ui/dialog/debug.cpp:79 ../src/ui/dialog/messages.cpp:57
-msgid "Release log messages"
-msgstr ""
-
-#: ../src/ui/dialog/document-metadata.cpp:73
-msgid "Metadata"
-msgstr ""
-
-#: ../src/ui/dialog/document-metadata.cpp:74
-msgid "License"
-msgstr ""
-
-#: ../src/ui/dialog/document-metadata.cpp:154
-msgid "<b>Dublin Core Entities</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-metadata.cpp:176
-msgid "<b>License</b>"
-msgstr ""
-
-#. ---------------------------------------------------------------
-#: ../src/ui/dialog/document-properties.cpp:90
-msgid "Show page _border"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:90
-msgid "If set, rectangular page border is shown"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:91
-msgid "Border on _top of drawing"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:91
-msgid "If set, border is always on top of the drawing"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:92
-msgid "_Show border shadow"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:92
-msgid "If set, page border shows a shadow on its right and lower side"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:93
-msgid "Back_ground:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:93
-msgid "Background color"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:93
-msgid ""
-"Color and transparency of the page background (also used for bitmap export)"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:94
-msgid "Border _color:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:94
-msgid "Page border color"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:94
-msgid "Color of the page border"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:95
-msgid "Default _units:"
-msgstr ""
-
-#. ---------------------------------------------------------------
-#. General snap options
-#: ../src/ui/dialog/document-properties.cpp:99
-msgid "Show _guides"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:99
-msgid "Show or hide guides"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:100
-msgid "_Snap guides while dragging"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:100
-msgid ""
-"While dragging a guide, snap to object nodes or bounding box corners ('Snap "
-"to nodes' or 'snap to bounding box corners' must be enabled; only a small "
-"part of the guide near the cursor will snap)"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:102
-msgid "Guide co_lor:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:102
-msgid "Guideline color"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:102
-msgid "Color of guidelines"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:103
-msgid "_Highlight color:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:103
-msgid "Highlighted guideline color"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:103
-msgid "Color of a guideline when it is under mouse"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "New" refers to grid
-#: ../src/ui/dialog/document-properties.cpp:109
-msgid "Grid|_New"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:109
-msgid "Create new grid."
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:110
-msgid "_Remove"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:110
-msgid "Remove selected grid."
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:119
-#: ../src/widgets/toolbox.cpp:2172
-msgid "Guides"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:120
-#: ../src/ui/dialog/inkscape-preferences.cpp:1014
-#: ../src/widgets/toolbox.cpp:2163
-msgid "Grids"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:121 ../src/verbs.cpp:2587
-#: ../src/widgets/toolbox.cpp:2028
-msgid "Snap"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:122
-msgid "Color Management"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:123
-msgid "Scripting"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:221
-msgid "<b>General</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:223
-msgid "<b>Border</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:225
-msgid "<b>Format</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:253
-msgid "<b>Guides</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:272
-msgid "Snap _distance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:272
-msgid "Snap only when _closer than:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:272
-#: ../src/ui/dialog/document-properties.cpp:278
-#: ../src/ui/dialog/document-properties.cpp:284
-msgid "Always snap"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:273
-msgid "Snapping distance, in screen pixels, for snapping to objects"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:273
-msgid "Always snap to objects, regardless of their distance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:274
-msgid ""
-"If set, objects only snap to another object when it's within the range "
-"specified below"
-msgstr ""
-
-#. Options for snapping to grids
-#: ../src/ui/dialog/document-properties.cpp:278
-msgid "Snap d_istance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:278
-msgid "Snap only when c_loser than:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:279
-msgid "Snapping distance, in screen pixels, for snapping to grid"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:279
-msgid "Always snap to grids, regardless of the distance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:280
-msgid ""
-"If set, objects only snap to a grid line when it's within the range "
-"specified below"
-msgstr ""
-
-#. Options for snapping to guides
-#: ../src/ui/dialog/document-properties.cpp:284
-msgid "Snap dist_ance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:284
-msgid "Snap only when close_r than:"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:285
-msgid "Snapping distance, in screen pixels, for snapping to guides"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:285
-msgid "Always snap to guides, regardless of the distance"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:286
-msgid ""
-"If set, objects only snap to a guide when it's within the range specified "
-"below"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:290
-msgid "<b>Snap to objects</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:292
-msgid "<b>Snap to grids</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:294
-msgid "<b>Snap to guides</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:323
-msgid "(invalid UTF-8 string)"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:349
-#, c-format
-msgid "Color profiles directory (%s) is unavailable."
-msgstr ""
-
-#. TODO check if this next line was sometimes needed. It being there caused an assertion.
-#. Inkscape::GC::release(defsRepr);
-#. inform the document, so we can undo
-#. Color Management
-#: ../src/ui/dialog/document-properties.cpp:451 ../src/verbs.cpp:2739
-msgid "Link Color Profile"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:524
-msgid "Remove linked color profile"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:538
-msgid "<b>Linked Color Profiles:</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:540
-msgid "<b>Available Color Profiles:</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:542
-msgid "Link Profile"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:573
-msgid "Profile Name"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:604
-msgid "<b>External script files:</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:606
-#: ../src/ui/dialog/swatches.cpp:463
-msgid "Add"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:629
-msgid "Filename"
-msgstr ""
-
-#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:669
-msgid "Add external script..."
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:693
-msgid "Remove external script"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:774
-msgid "<b>Creation</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:775
-msgid "<b>Defined grids</b>"
-msgstr ""
-
-#: ../src/ui/dialog/document-properties.cpp:985
-msgid "Remove grid"
-msgstr ""
-
-#: ../src/ui/dialog/extension-editor.cpp:80
-msgid "Information"
-msgstr ""
-
-#: ../src/ui/dialog/extension-editor.cpp:81
-#: ../share/extensions/draw_from_triangle.inx.h:20
-#: ../share/extensions/dxf_input.inx.h:9
-#: ../share/extensions/dxf_outlines.inx.h:8
-#: ../share/extensions/lindenmayer.inx.h:23
-#: ../share/extensions/measure.inx.h:2 ../share/extensions/scour.inx.h:4
-msgid "Help"
-msgstr ""
-
-#: ../src/ui/dialog/extension-editor.cpp:82
-msgid "Parameters"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:383
-msgid "No preview"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:489
-msgid "too large for preview"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:577
-msgid "Enable preview"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:711
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:712
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:197
-msgid "All Inkscape Files"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:716
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:717
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:196
-msgid "All Files"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:722
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:723
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:198
-msgid "All Images"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:727
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:728
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:199
-msgid "All Vectors"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:732
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:733
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:200
-msgid "All Bitmaps"
-msgstr ""
-
-#. ###### File options
-#. ###### Do we want the .xxx extension automatically added?
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:927
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1475
-msgid "Append filename extension automatically"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1085
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1339
-msgid "Guess from extension"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1360
-msgid "Left edge of source"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1361
-msgid "Top edge of source"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1362
-msgid "Right edge of source"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1363
-msgid "Bottom edge of source"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1364
-msgid "Source width"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1365
-msgid "Source height"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1366
-msgid "Destination width"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1367
-msgid "Destination height"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1368
-msgid "Resolution (dots per inch)"
-msgstr ""
-
-#. #########################################
-#. ## EXTRA WIDGET -- SOURCE SIDE
-#. #########################################
-#. ##### Export options buttons/spinners, etc
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1406
-msgid "Document"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1418
-#: ../share/extensions/color_custom.inx.h:3
-msgid "Custom"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1458
-msgid "Cairo"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1461
-msgid "Antialias"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1464
-msgid "Background"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1487
-msgid "Destination"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:476
-msgid "Show Preview"
-msgstr ""
-
-#: ../src/ui/dialog/filedialogimpl-win32.cpp:611
-msgid "No file selected"
-msgstr ""
-
-#: ../src/ui/dialog/fill-and-stroke.cpp:48
-#: ../share/extensions/interp_att_g.inx.h:4
-msgid "Fill"
-msgstr ""
-
-#: ../src/ui/dialog/fill-and-stroke.cpp:49
-msgid "Stroke _paint"
-msgstr ""
-
-#: ../src/ui/dialog/fill-and-stroke.cpp:50
-msgid "Stroke st_yle"
-msgstr ""
-
-#. TRANSLATORS: this dialog is accessible via menu Filters - Filter editor
-#: ../src/ui/dialog/filter-effects-dialog.cpp:465
-msgid ""
-"This matrix determines a linear transform on color space. Each line affects "
-"one of the color components. Each column determines how much of each color "
-"component from the input is passed to the output. The last column does not "
-"depend on input colors, so can be used to adjust a constant component value."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:575
-msgid "Image File"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:578
-msgid "Selected SVG Element"
-msgstr ""
-
-#. TODO: any image, not just svg
-#: ../src/ui/dialog/filter-effects-dialog.cpp:648
-msgid "Select an image to be used as feImage input"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:740
-msgid "This SVG filter effect does not require any parameters."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:746
-msgid "This SVG filter effect is not yet implemented in Inkscape."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:938
-msgid "Light Source:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:955
-msgid "Direction angle for the light source on the XY plane, in degrees"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:956
-msgid "Direction angle for the light source on the YZ plane, in degrees"
-msgstr ""
-
-#. default x:
-#. default y:
-#. default z:
-#: ../src/ui/dialog/filter-effects-dialog.cpp:959
-#: ../src/ui/dialog/filter-effects-dialog.cpp:962
-msgid "Location"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:959
-#: ../src/ui/dialog/filter-effects-dialog.cpp:962
-#: ../src/ui/dialog/filter-effects-dialog.cpp:965
-msgid "X coordinate"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:959
-#: ../src/ui/dialog/filter-effects-dialog.cpp:962
-#: ../src/ui/dialog/filter-effects-dialog.cpp:965
-msgid "Y coordinate"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:959
-#: ../src/ui/dialog/filter-effects-dialog.cpp:962
-#: ../src/ui/dialog/filter-effects-dialog.cpp:965
-msgid "Z coordinate"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:965
-msgid "Points At"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:966
-msgid "Specular Exponent"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:966
-msgid "Exponent value controlling the focus for the light source"
-msgstr ""
-
-#. TODO: here I have used 100 degrees as default value. But spec says that if not specified, no limiting cone is applied. So, there should be a way for the user to set a "no limiting cone" option.
-#: ../src/ui/dialog/filter-effects-dialog.cpp:968
-msgid "Cone Angle"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:968
-msgid ""
-"This is the angle between the spot light axis (i.e. the axis between the "
-"light source and the point to which it is pointing at) and the spot light "
-"cone. No light is projected outside this cone."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1029
-msgid "New light source"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1070
-msgid "_Duplicate"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1096
-msgid "_Filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1110
-msgid "R_ename"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1213
-msgid "Rename filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1249
-msgid "Apply filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1318
-msgid "filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1325
-msgid "Add filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1351
-msgid "Duplicate filter"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1418
-msgid "_Effect"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1426
-msgid "Connections"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1542
-msgid "Remove filter primitive"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:1914
-msgid "Remove merge node"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2030
-msgid "Reorder filter primitive"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2064
-msgid "Add Effect:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2065
-msgid "No effect selected"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2066
-msgid "No filter selected"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2104
-msgid "Effect parameters"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2105
-msgid "Filter General Settings"
-msgstr ""
-
-#. default x:
-#. default y:
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2161
-msgid "Coordinates:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2161
-msgid "X coordinate of the left corners of filter effects region"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2161
-msgid "Y coordinate of the upper corners of filter effects region"
-msgstr ""
-
-#. default width:
-#. default height:
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2162
-msgid "Dimensions:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2162
-msgid "Width of filter effects region"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2162
-msgid "Height of filter effects region"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2165
-#: ../src/widgets/toolbox.cpp:3859 ../src/widgets/toolbox.cpp:4250
-#: ../share/extensions/extrude.inx.h:4
-msgid "Mode:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2168
-msgid ""
-"Indicates the type of matrix operation. The keyword 'matrix' indicates that "
-"a full 5x4 matrix of values will be provided. The other keywords represent "
-"convenience shortcuts to allow commonly used color operations to be "
-"performed without specifying a complete matrix."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2169
-msgid "Value(s):"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2183
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2223
-msgid "Operator:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2184
-msgid "K1:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2184
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2185
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2186
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2187
-msgid ""
-"If the arithmetic operation is chosen, each result pixel is computed using "
-"the formula k1*i1*i2 + k2*i1 + k3*i2 + k4 where i1 and i2 are the pixel "
-"values of the first and second inputs respectively."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2185
-msgid "K2:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2186
-msgid "K3:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2187
-msgid "K4:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2190
-#: ../src/ui/dialog/tracedialog.cpp:581
-msgid "Size:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2190
-msgid "width of the convolve matrix"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2190
-msgid "height of the convolve matrix"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2191
-msgid ""
-"X coordinate of the target point in the convolve matrix. The convolution is "
-"applied to pixels around this point."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2191
-msgid ""
-"Y coordinate of the target point in the convolve matrix. The convolution is "
-"applied to pixels around this point."
-msgstr ""
-
-#. TRANSLATORS: for info on "Kernel", see http://en.wikipedia.org/wiki/Kernel_(matrix)
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2193
-msgid "Kernel:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2193
-msgid ""
-"This matrix describes the convolve operation that is applied to the input "
-"image in order to calculate the pixel colors at the output. Different "
-"arrangements of values in this matrix result in various possible visual "
-"effects. An identity matrix would lead to a motion blur effect (parallel to "
-"the matrix diagonal) while a matrix filled with a constant non-zero value "
-"would lead to a common blur effect."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2195
-msgid "Divisor:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2195
-msgid ""
-"After applying the kernelMatrix to the input image to yield a number, that "
-"number is divided by divisor to yield the final destination color value. A "
-"divisor that is the sum of all the matrix values tends to have an evening "
-"effect on the overall color intensity of the result."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2196
-msgid "Bias:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2196
-msgid ""
-"This value is added to each component. This is useful to define a constant "
-"value as the zero response of the filter."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2197
-msgid "Edge Mode:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2197
-msgid ""
-"Determines how to extend the input image as necessary with color values so "
-"that the matrix operations can be applied when the kernel is positioned at "
-"or near the edge of the input image."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2198
-msgid "Preserve Alpha"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2198
-msgid "If set, the alpha channel won't be altered by this filter primitive."
-msgstr ""
-
-#. default: white
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2201
-msgid "Diffuse Color:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2201
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2234
-msgid "Defines the color of the light source"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2202
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2235
-msgid "Surface Scale:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2202
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2235
-msgid ""
-"This value amplifies the heights of the bump map defined by the input alpha "
-"channel"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2203
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2236
-msgid "Constant:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2203
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2236
-msgid "This constant affects the Phong lighting model."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2204
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2238
-msgid "Kernel Unit Length:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2208
-msgid "Scale:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2208
-msgid "This defines the intensity of the displacement effect."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2209
-msgid "X displacement:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2209
-msgid "Color component that controls the displacement in the X direction"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2210
-msgid "Y displacement:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2210
-msgid "Color component that controls the displacement in the Y direction"
-msgstr ""
-
-#. default: black
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2213
-msgid "Flood Color:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2213
-msgid "The whole filter region will be filled with this color."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2214
-#: ../src/widgets/toolbox.cpp:5299
-msgid "Opacity:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2217
-msgid "Standard Deviation:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2217
-msgid "The standard deviation for the blur operation."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2223
-msgid ""
-"Erode: performs \"thinning\" of input image.\n"
-"Dilate: performs \"fattenning\" of input image."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2224
-msgid "Radius:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2227
-msgid "Source of Image:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2230
-msgid "Delta X:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2230
-msgid "This is how far the input image gets shifted to the right"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2231
-msgid "Delta Y:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2231
-msgid "This is how far the input image gets shifted downwards"
-msgstr ""
-
-#. default: white
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2234
-msgid "Specular Color:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2237
-msgid "Exponent:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2237
-msgid "Exponent for specular term, larger is more \"shiny\"."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2246
-msgid ""
-"Indicates whether the filter primitive should perform a noise or turbulence "
-"function."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2247
-msgid "Base Frequency:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2248
-msgid "Octaves:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2249
-msgid "Seed:"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2249
-msgid "The starting number for the pseudo random number generator."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2261
-msgid "Add filter primitive"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2278
-msgid ""
-"The <b>feBlend</b> filter primitive provides 4 image blending modes: screen, "
-"multiply, darken and lighten."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2282
-msgid ""
-"The <b>feColorMatrix</b> filter primitive applies a matrix transformation to "
-"color of each rendered pixel. This allows for effects like turning object to "
-"grayscale, modifying color saturation and changing color hue."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2286
-msgid ""
-"The <b>feComponentTransfer</b> filter primitive manipulates the input's "
-"color components (red, green, blue, and alpha) according to particular "
-"transfer functions, allowing operations like brightness and contrast "
-"adjustment, color balance, and thresholding."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2290
-msgid ""
-"The <b>feComposite</b> filter primitive composites two images using one of "
-"the Porter-Duff blending modes or the arithmetic mode described in SVG "
-"standard. Porter-Duff blending modes are essentially logical operations "
-"between the corresponding pixel values of the images."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2294
-msgid ""
-"The <b>feConvolveMatrix</b> lets you specify a Convolution to be applied on "
-"the image. Common effects created using convolution matrices are blur, "
-"sharpening, embossing and edge detection. Note that while gaussian blur can "
-"be created using this filter primitive, the special gaussian blur primitive "
-"is faster and resolution-independent."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2298
-msgid ""
-"The <b>feDiffuseLighting</b> and feSpecularLighting filter primitives create "
-"\"embossed\" shadings. The input's alpha channel is used to provide depth "
-"information: higher opacity areas are raised toward the viewer and lower "
-"opacity areas recede away from the viewer."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2302
-msgid ""
-"The <b>feDisplacementMap</b> filter primitive displaces the pixels in the "
-"first input using the second input as a displacement map, that shows from "
-"how far the pixel should come from. Classical examples are whirl and pinch "
-"effects."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2306
-msgid ""
-"The <b>feFlood</b> filter primitive fills the region with a given color and "
-"opacity. It is usually used as an input to other filters to apply color to "
-"a graphic."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2310
-msgid ""
-"The <b>feGaussianBlur</b> filter primitive uniformly blurs its input. It is "
-"commonly used together with feOffset to create a drop shadow effect."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2314
-msgid ""
-"The <b>feImage</b> filter primitive fills the region with an external image "
-"or another part of the document."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2318
-msgid ""
-"The <b>feMerge</b> filter primitive composites several temporary images "
-"inside the filter primitive to a single image. It uses normal alpha "
-"compositing for this. This is equivalent to using several feBlend primitives "
-"in 'normal' mode or several feComposite primitives in 'over' mode."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2322
-msgid ""
-"The <b>feMorphology</b> filter primitive provides erode and dilate effects. "
-"For single-color objects erode makes the object thinner and dilate makes it "
-"thicker."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2326
-msgid ""
-"The <b>feOffset</b> filter primitive offsets the image by an user-defined "
-"amount. For example, this is useful for drop shadows, where the shadow is in "
-"a slightly different position than the actual object."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2330
-msgid ""
-"The feDiffuseLighting and <b>feSpecularLighting</b> filter primitives create "
-"\"embossed\" shadings. The input's alpha channel is used to provide depth "
-"information: higher opacity areas are raised toward the viewer and lower "
-"opacity areas recede away from the viewer."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2334
-msgid ""
-"The <b>feTile</b> filter primitive tiles a region with its input graphic"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2338
-msgid ""
-"The <b>feTurbulence</b> filter primitive renders Perlin noise. This kind of "
-"noise is useful in simulating several nature phenomena like clouds, fire and "
-"smoke and in generating complex textures like marble or granite."
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2357
-msgid "Duplicate filter primitive"
-msgstr ""
-
-#: ../src/ui/dialog/filter-effects-dialog.cpp:2410
-msgid "Set filter primitive attribute"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:42
-msgid "Unit:"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:45
-msgid "Angle (degrees):"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:46
-msgid "Rela_tive change"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:46
-msgid "Move and/or rotate the guide relative to current settings"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:112
-msgid "Set guide properties"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:151
-msgid "Guideline"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:239
-#, c-format
-msgid "Guideline ID: %s"
-msgstr ""
-
-#: ../src/ui/dialog/guides.cpp:245
-#, c-format
-msgid "Current: %s"
-msgstr ""
-
-#: ../src/ui/dialog/icon-preview.cpp:130
-#, c-format
-msgid "%d x %d"
-msgstr ""
-
-#: ../src/ui/dialog/icon-preview.cpp:180
-msgid "Selection only or whole document"
-msgstr ""
-
-#: ../src/ui/dialog/icon-preview.cpp:188
-msgid "Refresh the icons"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:169
-msgid "Mouse"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:171
-msgid "Grab sensitivity:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:171
-#: ../src/ui/dialog/inkscape-preferences.cpp:174
-#: ../src/ui/dialog/inkscape-preferences.cpp:190
-#: ../src/ui/dialog/inkscape-preferences.cpp:194
-#: ../src/ui/dialog/inkscape-preferences.cpp:204
-msgid "pixels"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:172
-msgid ""
-"How close on the screen you need to be to an object to be able to grab it "
-"with mouse (in screen pixels)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:174
-msgid "Click/drag threshold:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:175
-msgid ""
-"Maximum mouse drag (in screen pixels) which is considered a click, not a drag"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:177
-msgid "Use pressure-sensitive tablet (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:179
-msgid ""
-"Use the capabilities of a tablet or other pressure-sensitive device. Disable "
-"this only if you have problems with the tablet (you can still use it as a "
-"mouse)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:181
-msgid "Switch tool based on tablet device (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:183
-msgid ""
-"Change tool as different devices are used on the tablet (pen, eraser, mouse)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:188
-msgid "Scrolling"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:190
-msgid "Mouse wheel scrolls by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:191
-msgid ""
-"One mouse wheel notch scrolls by this distance in screen pixels "
-"(horizontally with Shift)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:192
-msgid "Ctrl+arrows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:194
-msgid "Scroll by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:195
-msgid "Pressing Ctrl+arrow key scrolls by this distance (in screen pixels)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:197
-msgid "Acceleration:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:198
-msgid ""
-"Pressing and holding Ctrl+arrow will gradually speed up scrolling (0 for no "
-"acceleration)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:199
-msgid "Autoscrolling"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:201
-msgid "Speed:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:202
-msgid ""
-"How fast the canvas autoscrolls when you drag beyond canvas edge (0 to turn "
-"autoscroll off)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:204
-#: ../src/ui/dialog/tracedialog.cpp:420 ../src/ui/dialog/tracedialog.cpp:453
-#: ../src/ui/dialog/tracedialog.cpp:596 ../src/widgets/toolbox.cpp:7185
-msgid "Threshold:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:205
-msgid ""
-"How far (in screen pixels) you need to be from the canvas edge to trigger "
-"autoscroll; positive is outside the canvas, negative is within the canvas"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:206
-msgid "Left mouse button pans when Space is pressed"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:208
-msgid ""
-"When on, pressing and holding Space and dragging with left mouse button pans "
-"canvas (as in Adobe Illustrator). When off, Space temporarily switches to "
-"Selector tool (default)."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:209
-msgid "Mouse wheel zooms by default"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:211
-msgid ""
-"When on, mouse wheel zooms without Ctrl and scrolls canvas with Ctrl; when "
-"off, it zooms with Ctrl and scrolls without Ctrl."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:217
-msgid "Enable snap indicator"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:219
-msgid "After snapping, a symbol is drawn at the point that has snapped"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:222
-msgid "Delay (in ms):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:223
-msgid ""
-"Postpone snapping as long as the mouse is moving, and then wait an "
-"additional fraction of a second. This additional delay is specified here. "
-"When set to zero or to a very small number, snapping will be immediate."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:225
-msgid "Only snap the node closest to the pointer"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:227
-msgid ""
-"Only try to snap the node that is initially closest to the mouse pointer"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:230
-msgid "Weight factor:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:231
-msgid ""
-"When multiple snap solutions are found, then Inkscape can either prefer the "
-"closest transformation (when set to 0), or prefer the node that was "
-"initially the closest to the pointer (when set to 1)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:233
-msgid "Snap the mouse pointer when dragging a constrained knot"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:235
-msgid ""
-"When dragging a knot along a constraint line, then snap the position of the "
-"mouse pointer instead of snapping the projection of the knot onto the "
-"constraint line"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:237
-msgid "Snapping"
-msgstr ""
-
-#. nudgedistance is limited to 1000 in select-context.cpp: use the same limit here
-#: ../src/ui/dialog/inkscape-preferences.cpp:246
-msgid "Arrow keys move by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:247
-msgid ""
-"Pressing an arrow key moves selected object(s) or node(s) by this distance "
-"(in px units)"
-msgstr ""
-
-#. defaultscale is limited to 1000 in select-context.cpp: use the same limit here
-#: ../src/ui/dialog/inkscape-preferences.cpp:250
-msgid "> and < scale by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:251
-msgid ""
-"Pressing > or < scales selection up or down by this increment (in px units)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:253
-msgid "Inset/Outset by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:254
-msgid ""
-"Inset and Outset commands displace the path by this distance (in px units)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:255
-msgid "Compass-like display of angles"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:257
-msgid ""
-"When on, angles are displayed with 0 at north, 0 to 360 range, positive "
-"clockwise; otherwise with 0 at east, -180 to 180 range, positive "
-"counterclockwise"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:263
-msgid "Rotation snaps every:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:263
-msgid "degrees"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:264
-msgid ""
-"Rotating with Ctrl pressed snaps every that much degrees; also, pressing "
-"[ or ] rotates by this amount"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:266
-msgid "Zoom in/out by:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:267
-msgid ""
-"Zoom tool click, +/- keys, and middle click zoom in and out by this "
-"multiplier"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:273
-msgid "Show selection cue"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:274
-msgid ""
-"Whether selected objects display a selection cue (the same as in selector)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:280
-msgid "Enable gradient editing"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:281
-msgid "Whether selected objects display gradient editing controls"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:286
-msgid "Conversion to guides uses edges instead of bounding box"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:287
-msgid ""
-"Converting an object to guides places these along the object's true edges "
-"(imitating the object's shape), not along the bounding box."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:294
-msgid "Ctrl+click dot size:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:294
-msgid "times current stroke width"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:295
-msgid "Size of dots created with Ctrl+click (relative to current stroke width)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:310
-msgid "<b>No objects selected</b> to take the style from."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:319
-msgid ""
-"<b>More than one object selected.</b> Cannot take style from multiple "
-"objects."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:352
-msgid "Create new objects with:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:354
-msgid "Last used style"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:356
-msgid "Apply the style you last set on an object"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:361
-msgid "This tool's own style:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:365
-msgid ""
-"Each tool may store its own style to apply to the newly created objects. Use "
-"the button below to set it."
-msgstr ""
-
-#. style swatch
-#: ../src/ui/dialog/inkscape-preferences.cpp:369
-msgid "Take from selection"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:374
-msgid "This tool's style of new objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:381
-msgid "Remember the style of the (first) selected object as this tool's style"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:386
-msgid "Tools"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:389
-msgid "Bounding box to use:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:390
-msgid "Visual bounding box"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:392
-msgid "This bounding box includes stroke width, markers, filter margins, etc."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:393
-msgid "Geometric bounding box"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:395
-msgid "This bounding box includes only the bare path"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:397
-msgid "Conversion to guides:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:398
-msgid "Keep objects after conversion to guides"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:400
-msgid ""
-"When converting an object to guides, don't delete the object after the "
-"conversion."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:401
-msgid "Treat groups as a single object"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:403
-msgid ""
-"Treat groups as a single object during conversion to guides rather than "
-"converting each child separately."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:405
-msgid "Average all sketches"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:406
-msgid "Width is in absolute units"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:407
-msgid "Select new path"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:408
-msgid "Don't attach connectors to text objects"
-msgstr ""
-
-#. Selector
-#: ../src/ui/dialog/inkscape-preferences.cpp:411
-msgid "Selector"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:414
-msgid "When transforming, show:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:415
-msgid "Objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:417
-msgid "Show the actual objects when moving or transforming"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:418
-msgid "Box outline"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:420
-msgid "Show only a box outline of the objects when moving or transforming"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:421
-msgid "Per-object selection cue:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:424
-msgid "No per-object selection indication"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:425
-msgid "Mark"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:427
-msgid "Each selected object has a diamond mark in the top left corner"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:428
-msgid "Box"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:430
-msgid "Each selected object displays its bounding box"
-msgstr ""
-
-#. Node
-#: ../src/ui/dialog/inkscape-preferences.cpp:433
-msgid "Node"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:436
-msgid "Path outline:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:437
-#: ../src/ui/dialog/inkscape-preferences.cpp:438
-msgid "Path outline color"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:438
-msgid "Selects the color used for showing the path outline."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:439
-msgid "Path outline flash on mouse-over"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:440
-msgid "When hovering over a path, briefly flash its outline."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:441
-msgid "Suppress path outline flash when one path selected"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:442
-msgid "If a path is selected, do not continue flashing path outlines."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:444
-msgid "Flash time"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:444
-msgid ""
-"Specifies how long the path outline will be visible after a mouse-over (in "
-"milliseconds). Specify 0 to have the outline shown until mouse leaves the "
-"path."
-msgstr ""
-
-#. Tweak
-#: ../src/ui/dialog/inkscape-preferences.cpp:447 ../src/verbs.cpp:2504
-msgid "Tweak"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:448
-msgid "Paint objects with:"
-msgstr ""
-
-#. Zoom
-#: ../src/ui/dialog/inkscape-preferences.cpp:453
-#: ../src/ui/view/edit-widget.cpp:1062 ../src/verbs.cpp:2526
-#: ../src/widgets/desktop-widget.cpp:483
-msgid "Zoom"
-msgstr ""
-
-#. Shapes
-#: ../src/ui/dialog/inkscape-preferences.cpp:458
-msgid "Shapes"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:490
-msgid "Sketch mode"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:492
-msgid ""
-"If on, the sketch result will be the normal average of all sketches made, "
-"instead of averaging the old result with the new sketch."
-msgstr ""
-
-#. Pen
-#: ../src/ui/dialog/inkscape-preferences.cpp:495 ../src/verbs.cpp:2518
-msgid "Pen"
-msgstr ""
-
-#. Calligraphy
-#: ../src/ui/dialog/inkscape-preferences.cpp:501 ../src/verbs.cpp:2520
-msgid "Calligraphy"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:505
-msgid ""
-"If on, pen width is in absolute units (px) independent of zoom; otherwise "
-"pen width depends on zoom so that it looks the same at any zoom"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:507
-msgid ""
-"If on, each newly created object will be selected (deselecting previous "
-"selection)"
-msgstr ""
-
-#. Paint Bucket
-#: ../src/ui/dialog/inkscape-preferences.cpp:509 ../src/verbs.cpp:2532
-msgid "Paint Bucket"
-msgstr ""
-
-#. Eraser
-#: ../src/ui/dialog/inkscape-preferences.cpp:514 ../src/verbs.cpp:2536
-msgid "Eraser"
-msgstr ""
-
-#. LPETool
-#: ../src/ui/dialog/inkscape-preferences.cpp:518 ../src/verbs.cpp:2538
-msgid "LPE Tool"
-msgstr ""
-
-#. Gradient
-#: ../src/ui/dialog/inkscape-preferences.cpp:528 ../src/verbs.cpp:2524
-msgid "Gradient"
-msgstr ""
-
-#. Connector
-#: ../src/ui/dialog/inkscape-preferences.cpp:532 ../src/verbs.cpp:2530
-msgid "Connector"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:535
-msgid "If on, connector attachment points will not be shown for text objects"
-msgstr ""
-
-#. Dropper
-#: ../src/ui/dialog/inkscape-preferences.cpp:537 ../src/verbs.cpp:2528
-msgid "Dropper"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:544
-msgid "Save and restore window geometry for each document"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:545
-msgid "Remember and use last window's geometry"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:546
-msgid "Don't save window geometry"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:548
-#: ../src/ui/dialog/inkscape-preferences.cpp:568
-msgid "Dockable"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:551
-msgid "Dialogs are hidden in taskbar"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:552
-msgid "Zoom when window is resized"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:553
-msgid "Show close button on dialogs"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:555
-msgid "Normal"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:556
-msgid "Aggressive"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:558
-msgid "Saving window geometry (size and position):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:560
-msgid "Let the window manager determine placement of all windows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:562
-msgid ""
-"Remember and use the last window's geometry (saves geometry to user "
-"preferences)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:564
-msgid ""
-"Save and restore window geometry for each document (saves geometry in the "
-"document)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:566
-msgid "Dialog behavior (requires restart):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:573
-msgid "Dialogs on top:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:576
-msgid "Dialogs are treated as regular windows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:578
-msgid "Dialogs stay on top of document windows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:580
-msgid "Same as Normal but may work better with some window managers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:584
-msgid "Dialog Transparency:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:586
-msgid "Opacity when focused:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:588
-msgid "Opacity when unfocused:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:590
-msgid "Time of opacity change animation:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:593
-msgid "Miscellaneous:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:596
-msgid "Whether dialog windows are to be hidden in the window manager taskbar"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:599
-msgid ""
-"Zoom drawing when document window is resized, to keep the same area visible "
-"(this is the default which can be changed in any window using the button "
-"above the right scrollbar)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:601
-msgid "Whether dialog windows have a close button (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:602
-msgid "Windows"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:607
-msgid "Move in parallel"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:609
-msgid "Stay unmoved"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:611
-msgid "Move according to transform"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:613
-msgid "Are unlinked"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:615
-msgid "Are deleted"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:618
-msgid "When the original moves, its clones and linked offsets:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:620
-msgid "Clones are translated by the same vector as their original."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:622
-msgid "Clones preserve their positions when their original is moved."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:624
-msgid ""
-"Each clone moves according to the value of its transform= attribute. For "
-"example, a rotated clone will move in a different direction than its "
-"original."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:625
-msgid "When the original is deleted, its clones:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:627
-msgid "Orphaned clones are converted to regular objects."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:629
-msgid "Orphaned clones are deleted along with their original."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:631
-msgid "When duplicating original+clones:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:633
-msgid "Relink duplicated clones"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:635
-msgid ""
-"When duplicating a selection containing both a clone and its original "
-"(possibly in groups), relink the duplicated clone to the duplicated original "
-"instead of the old original"
-msgstr ""
-
-#. TRANSLATORS: Heading for the Inkscape Preferences "Clones" Page
-#: ../src/ui/dialog/inkscape-preferences.cpp:638
-msgid "Clones"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:643
-msgid "When applying, use the topmost selected object as clippath/mask"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:645
-msgid ""
-"Uncheck this to use the bottom selected object as the clipping path or mask"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:646
-msgid "Remove clippath/mask object after applying"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:648
-msgid ""
-"After applying, remove the object used as the clipping path or mask from the "
-"drawing"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:649
-msgid "Clippaths and masks"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:654
-#: ../src/widgets/select-toolbar.cpp:544
-msgid "Scale stroke width"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:655
-msgid "Scale rounded corners in rectangles"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:656
-msgid "Transform gradients"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:657
-msgid "Transform patterns"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:658
-msgid "Optimized"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:659
-msgid "Preserved"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:662
-#: ../src/widgets/select-toolbar.cpp:545
-msgid "When scaling objects, scale the stroke width by the same proportion"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:664
-#: ../src/widgets/select-toolbar.cpp:556
-msgid "When scaling rectangles, scale the radii of rounded corners"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:666
-#: ../src/widgets/select-toolbar.cpp:567
-msgid "Move gradients (in fill or stroke) along with the objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:668
-#: ../src/widgets/select-toolbar.cpp:578
-msgid "Move patterns (in fill or stroke) along with the objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:669
-msgid "Store transformation:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:671
-msgid ""
-"If possible, apply transformation to objects without adding a transform= "
-"attribute"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:673
-msgid "Always store transformation as a transform= attribute on objects"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:675
-msgid "Transforms"
-msgstr ""
-
-#. blur quality
-#. filter quality
-#: ../src/ui/dialog/inkscape-preferences.cpp:681
-#: ../src/ui/dialog/inkscape-preferences.cpp:705
-msgid "Best quality (slowest)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:683
-#: ../src/ui/dialog/inkscape-preferences.cpp:707
-msgid "Better quality (slower)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:685
-#: ../src/ui/dialog/inkscape-preferences.cpp:709
-msgid "Average quality"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:687
-#: ../src/ui/dialog/inkscape-preferences.cpp:711
-msgid "Lower quality (faster)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:689
-#: ../src/ui/dialog/inkscape-preferences.cpp:713
-msgid "Lowest quality (fastest)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:692
-msgid "Gaussian blur quality for display:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:694
-#: ../src/ui/dialog/inkscape-preferences.cpp:718
-msgid ""
-"Best quality, but display may be very slow at high zooms (bitmap export "
-"always uses best quality)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:696
-#: ../src/ui/dialog/inkscape-preferences.cpp:720
-msgid "Better quality, but slower display"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:698
-#: ../src/ui/dialog/inkscape-preferences.cpp:722
-msgid "Average quality, acceptable display speed"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:700
-#: ../src/ui/dialog/inkscape-preferences.cpp:724
-msgid "Lower quality (some artifacts), but display is faster"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:702
-#: ../src/ui/dialog/inkscape-preferences.cpp:726
-msgid "Lowest quality (considerable artifacts), but display is fastest"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:716
-msgid "Filter effects quality for display:"
-msgstr ""
-
-#. show infobox
-#: ../src/ui/dialog/inkscape-preferences.cpp:729
-msgid "Show filter primitives infobox"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:731
-msgid ""
-"Show icons and descriptions for the filter primitives available at the "
-"filter effects dialog."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:739
-msgid "Select in all layers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:740
-msgid "Select only within current layer"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:741
-msgid "Select in current layer and sublayers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:742
-msgid "Ignore hidden objects and layers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:743
-msgid "Ignore locked objects and layers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:744
-msgid "Deselect upon layer change"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:746
-msgid "Ctrl+A, Tab, Shift+Tab:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:748
-msgid "Make keyboard selection commands work on objects in all layers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:750
-msgid "Make keyboard selection commands work on objects in current layer only"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:752
-msgid ""
-"Make keyboard selection commands work on objects in current layer and all "
-"its sublayers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:754
-msgid ""
-"Uncheck this to be able to select objects that are hidden (either by "
-"themselves or by being in a hidden layer)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:756
-msgid ""
-"Uncheck this to be able to select objects that are locked (either by "
-"themselves or by being in a locked layer)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:759
-msgid ""
-"Uncheck this to be able to keep the current objects selected when the "
-"current layer changes"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:761
-msgid "Selecting"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:768
-msgid "Default export resolution:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:769
-msgid "Default bitmap resolution (in dots per inch) in the Export dialog"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:771
-msgid "Open Clip Art Library Server Name:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:772
-msgid ""
-"The server name of the Open Clip Art Library webdav server. It's used by the "
-"Import and Export to OCAL function."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:774
-msgid "Open Clip Art Library Username:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:775
-msgid "The username used to log into Open Clip Art Library."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:777
-msgid "Open Clip Art Library Password:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:778
-msgid "The password used to log into Open Clip Art Library."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:780
-msgid "Import/Export"
-msgstr ""
-
-#. TRANSLATORS: see http://www.newsandtech.com/issues/2004/03-04/pt/03-04_rendering.htm
-#: ../src/ui/dialog/inkscape-preferences.cpp:830
-msgid "Perceptual"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:830
-msgid "Relative Colorimetric"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:830
-msgid "Absolute Colorimetric"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:834
-msgid "(Note: Color management has been disabled in this build)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:838
-msgid "Display adjustment"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:848
-#, c-format
-msgid ""
-"The ICC profile to use to calibrate display output.\n"
-"Searched directories:%s"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:849
-msgid "Display profile:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:854
-msgid "Retrieve profile from display"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:857
-msgid "Retrieve profiles from those attached to displays via XICC."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:859
-msgid "Retrieve profiles from those attached to displays."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:864
-msgid "Display rendering intent:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:865
-#: ../src/ui/dialog/inkscape-preferences.cpp:888
-msgid "The rendering intent to use to calibrate display output."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:867
-msgid "Proofing"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:869
-msgid "Simulate output on screen"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:871
-msgid "Simulates output of target device."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:873
-msgid "Mark out of gamut colors"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:875
-msgid "Highlights colors that are out of gamut for the target device."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:880
-msgid "Out of gamut warning color:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:881
-msgid "Selects the color used for out of gamut warning."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:883
-msgid "Device profile:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:884
-msgid "The ICC profile to use to simulate device output."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:887
-msgid "Device rendering intent:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:890
-msgid "Black point compensation"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:892
-msgid "Enables black point compensation."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:894
-msgid "Preserve black"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:899
-msgid "(LittleCMS 1.15 or later required)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:901
-msgid "Preserve K channel in CMYK -> CMYK transforms"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:914
-#: ../src/widgets/sp-color-icc-selector.cpp:306
-#: ../src/widgets/sp-color-icc-selector.cpp:579
-msgid "<none>"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:959
-msgid "Color management"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:964
-msgid "Major grid line emphasizing"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:966
-msgid "Don't emphasize gridlines when zoomed out"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:967
-msgid ""
-"If set and zoomed out, the gridlines will be shown in normal color instead "
-"of major grid line color."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:969
-msgid "Default grid settings"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:975
-#: ../src/ui/dialog/inkscape-preferences.cpp:996
-msgid "Grid units:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:978
-#: ../src/ui/dialog/inkscape-preferences.cpp:999
-msgid "Origin X:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:979
-#: ../src/ui/dialog/inkscape-preferences.cpp:1000
-msgid "Origin Y:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:982
-msgid "Spacing X:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:983
-#: ../src/ui/dialog/inkscape-preferences.cpp:1002
-msgid "Spacing Y:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:985
-#: ../src/ui/dialog/inkscape-preferences.cpp:986
-#: ../src/ui/dialog/inkscape-preferences.cpp:1007
-#: ../src/ui/dialog/inkscape-preferences.cpp:1008
-msgid "Grid line color:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:986
-#: ../src/ui/dialog/inkscape-preferences.cpp:1008
-msgid "Color used for normal grid lines"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:987
-#: ../src/ui/dialog/inkscape-preferences.cpp:988
-#: ../src/ui/dialog/inkscape-preferences.cpp:1009
-#: ../src/ui/dialog/inkscape-preferences.cpp:1010
-msgid "Major grid line color:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:988
-#: ../src/ui/dialog/inkscape-preferences.cpp:1010
-msgid "Color used for major (highlighted) grid lines"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:990
-#: ../src/ui/dialog/inkscape-preferences.cpp:1012
-msgid "Major grid line every:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:991
-msgid "Show dots instead of lines"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:992
-msgid "If set, display dots at gridpoints instead of gridlines"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1019
-msgid "Use named colors"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1020
-msgid ""
-"If set, write the CSS name of the color when available (e.g. 'red' or "
-"'magenta') instead of the numeric value"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1022
-msgid "XML formatting"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1024
-msgid "Inline attributes"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1025
-msgid "Put attributes on the same line as the element tag"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1028
-msgid "Indent, spaces:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1028
-msgid ""
-"The number of spaces to use for indenting nested elements; set to 0 for no "
-"indentation"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1030
-msgid "Path data"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1032
-msgid "Allow relative coordinates"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1033
-msgid "If set, relative coordinates may be used in path data"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1035
-msgid "Force repeat commands"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1036
-msgid ""
-"Force repeating of the same path command (for example, 'L 1,2 L 3,4' instead "
-"of 'L 1,2 3,4')"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1038
-msgid "Numbers"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1041
-msgid "Numeric precision:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1041
-msgid "How many digits to write after the decimal dot"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1044
-msgid "Minimum exponent:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1044
-msgid ""
-"The smallest number written to SVG is 10 to the power of this exponent; "
-"anything smaller is written as zero."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1046
-msgid "SVG output"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "System default"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Albanian (sq)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Amharic (am)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Arabic (ar)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Armenian (hy)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Azerbaijani (az)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Basque (eu)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1051
-msgid "Belarusian (be)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Bulgarian (bg)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Bengali (bn)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Breton (br)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Catalan (ca)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Valencian Catalan (ca@valencia)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1052
-msgid "Chinese/China (zh_CN)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1053
-msgid "Chinese/Taiwan (zh_TW)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1053
-msgid "Croatian (hr)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1053
-msgid "Czech (cs)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "Danish (da)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "Dutch (nl)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "Dzongkha (dz)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "German (de)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "Greek (el)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "English (en)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1054
-msgid "English/Australia (en_AU)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1055
-msgid "English/Canada (en_CA)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1055
-msgid "English/Great Britain (en_GB)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1055
-msgid "Pig Latin (en_US@piglatin)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1056
-msgid "Esperanto (eo)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1056
-msgid "Estonian (et)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1056
-msgid "Finnish (fi)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "French (fr)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "Irish (ga)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "Galician (gl)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "Hebrew (he)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1057
-msgid "Hungarian (hu)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Indonesian (id)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Italian (it)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Japanese (ja)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Khmer (km)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Kinyarwanda (rw)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Korean (ko)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Lithuanian (lt)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1058
-msgid "Macedonian (mk)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Mongolian (mn)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Nepali (ne)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Norwegian Bokmål (nb)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Norwegian Nynorsk (nn)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1059
-msgid "Panjabi (pa)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Polish (pl)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Portuguese (pt)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Portuguese/Brazil (pt_BR)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Romanian (ro)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1060
-msgid "Russian (ru)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Serbian (sr)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Serbian in Latin script (sr@latin)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Slovak (sk)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Slovenian (sl)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Spanish (es)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1061
-msgid "Spanish/Mexico (es_MX)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Swedish (sv)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Thai (th)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Turkish (tr)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Ukrainian (uk)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1062
-msgid "Vietnamese (vi)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1069
-msgid "Language (requires restart):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1070
-msgid "Set the language for menus and number formats"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1072
-msgid "Smaller"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1076
-msgid "Toolbox icon size"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1077
-msgid "Set the size for the tool icons (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1080
-msgid "Control bar icon size"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1081
-msgid ""
-"Set the size for the icons in tools' control bars to use (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1084
-msgid "Secondary toolbar icon size"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1085
-msgid ""
-"Set the size for the icons in secondary toolbars to use (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1088
-msgid "Work-around color sliders not drawing."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1090
-msgid ""
-"When on, will attempt to work around bugs in certain GTK themes drawing "
-"color sliders."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1096
-msgid "Clear list"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1101
-msgid "Maximum documents in Open Recent:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1102
-msgid ""
-"Set the maximum length of the Open Recent list in the File menu, or clear "
-"the list"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1105
-msgid "Zoom correction factor (in %):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1106
-msgid ""
-"Adjust the slider until the length of the ruler on your screen matches its "
-"real length. This information is used when zooming to 1:1, 1:2, etc., to "
-"display objects in their true sizes"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1108
-msgid "Interface"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1114
-msgid "Use current directory for \"Save As ...\""
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1116
-msgid ""
-"When this option is on, the \"Save as...\" dialog will always open in the "
-"directory where the currently open document is. When it's off, it will open "
-"in the directory where you last saved a file using that dialog."
-msgstr ""
-
-#. Autosave options
-#: ../src/ui/dialog/inkscape-preferences.cpp:1120
-msgid "Enable autosave (requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1121
-msgid ""
-"Automatically save the current document(s) at a given interval, thus "
-"minimizing loss in case of a crash"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1123
-msgid "Interval (in minutes):"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1123
-msgid "Interval (in minutes) at which document will be autosaved"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/ui/dialog/inkscape-preferences.cpp:1127
-msgid "filesystem|Path:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1127
-msgid "The directory where autosaves will be written"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1129
-msgid "Maximum number of autosaves:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1129
-msgid ""
-"Maximum number of autosaved files; use this to limit the storage space used"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-msgid "2x2"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-msgid "4x4"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-msgid "8x8"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1151
-msgid "16x16"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1155
-msgid "Oversample bitmaps:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1158
-msgid "Automatically reload bitmaps"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1160
-msgid "Automatically reload linked images when file is changed on disk"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1174
-msgid "Bitmap editor:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1180
-msgid "Resolution for Create Bitmap Copy:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1181
-msgid "Resolution used by the Create Bitmap Copy command"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1183
-msgid "Bitmaps"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1235
-msgid "Language:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1236
-msgid "Set the main spell check language"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1239
-msgid "Second language:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1240
-msgid ""
-"Set the second spell check language; checking will only stop on words "
-"unknown in ALL chosen languages"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1243
-msgid "Third language:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1244
-msgid ""
-"Set the third spell check language; checking will only stop on words unknown "
-"in ALL chosen languages"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1246
-msgid "Ignore words with digits"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1248
-msgid "Ignore words containing digits, such as \"R2D2\""
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1250
-msgid "Ignore words in ALL CAPITALS"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1252
-msgid "Ignore words in all capitals, such as \"IUPAC\""
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1254
-msgid "Spellcheck"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1273
-msgid "Add label comments to printing output"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1275
-msgid ""
-"When on, a comment will be added to the raw print output, marking the "
-"rendered output for an object with its label"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1277
-msgid "Prevent sharing of gradient definitions"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1279
-msgid ""
-"When on, shared gradient definitions are automatically forked on change; "
-"uncheck to allow sharing of gradient definitions so that editing one object "
-"may affect other objects using the same gradient"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1282
-msgid "Simplification threshold:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1283
-msgid ""
-"How strong is the Node tool's Simplify command by default. If you invoke "
-"this command several times in quick succession, it will act more and more "
-"aggressively; invoking it again after a pause restores the default threshold."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1286
-msgid "Latency skew:"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1286
-msgid "(requires restart)"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1287
-msgid ""
-"Factor by which the event clock is skewed from the actual time (0.9766 on "
-"some systems)."
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1289
-msgid "Pre-render named icons"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1291
-msgid ""
-"When on, named icons will be rendered before displaying the ui. This is for "
-"working around bugs in GTK+ named icon notification"
-msgstr ""
-
-#. TRANSLATORS: following strings are paths in Inkscape preferences - Misc - System info
-#: ../src/ui/dialog/inkscape-preferences.cpp:1297
-msgid "User config: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1301
-msgid "User data: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1305
-msgid "User cache: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1309
-msgid "System config: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1312
-msgid "System data: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1315
-msgid "PIXMAP: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1319
-msgid "DATA: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1323
-msgid "UI: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1332
-msgid "Icon theme: "
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1347
-msgid "System info"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1347
-msgid "General system information"
-msgstr ""
-
-#: ../src/ui/dialog/inkscape-preferences.cpp:1349
-msgid "Misc"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:41
-msgid "Layer name:"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:109
-msgid "Add layer"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:147
-msgid "Above current"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:151
-msgid "Below current"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:154
-msgid "As sublayer of current"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:158
-msgid "Position:"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:176
-msgid "Rename Layer"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:179
-msgid "_Rename"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:192
-msgid "Rename layer"
-msgstr ""
-
-#. TRANSLATORS: This means "The layer has been renamed"
-#: ../src/ui/dialog/layer-properties.cpp:194
-msgid "Renamed layer"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:198
-msgid "Add Layer"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:201
-msgid "_Add"
-msgstr ""
-
-#: ../src/ui/dialog/layer-properties.cpp:225
-msgid "New layer created."
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:495 ../src/ui/widget/layer-selector.cpp:595
-msgid "Unhide layer"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:495 ../src/ui/widget/layer-selector.cpp:595
-msgid "Hide layer"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:506 ../src/ui/widget/layer-selector.cpp:587
-msgid "Lock layer"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:506 ../src/ui/widget/layer-selector.cpp:587
-msgid "Unlock layer"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:656
-msgid "New"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/ui/dialog/layers.cpp:663
-msgid "layers|Top"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:669
-msgid "Up"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:675
-msgid "Dn"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:681
-msgid "Bot"
-msgstr ""
-
-#: ../src/ui/dialog/layers.cpp:691
-msgid "X"
-msgstr ""
-
-#. TRANSLATORS: this dialog is accessible via menu Path - Path Effect Editor...
-#: ../src/ui/dialog/livepatheffect-editor.cpp:78
-msgid "Apply new effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:79
-msgid "Current effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:80
-msgid "Effect list"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:269
-msgid "Unknown effect is applied"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:272
-msgid "No effect applied"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:276
-msgid "Item is not a path or shape"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:280
-msgid "Only one item can be selected"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:284
-msgid "Empty selection"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:308
-msgid "Unknown effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:374
-msgid "Create and apply path effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:391
-msgid "Remove path effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:407
-msgid "Move path effect up"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:423
-msgid "Move path effect down"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:462
-msgid "Activate path effect"
-msgstr ""
-
-#: ../src/ui/dialog/livepatheffect-editor.cpp:462
-msgid "Deactivate path effect"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:94
-msgid "Heap"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:95
-msgid "In Use"
-msgstr ""
-
-#. TRANSLATORS: "Slack" refers to memory which is in the heap but currently unused.
-#. More typical usage is to call this memory "free" rather than "slack".
-#: ../src/ui/dialog/memory.cpp:98
-msgid "Slack"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:99
-msgid "Total"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:139 ../src/ui/dialog/memory.cpp:145
-#: ../src/ui/dialog/memory.cpp:152 ../src/ui/dialog/memory.cpp:184
-msgid "Unknown"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:165
-msgid "Combined"
-msgstr ""
-
-#: ../src/ui/dialog/memory.cpp:207
-msgid "Recalculate"
-msgstr ""
-
-#: ../src/ui/dialog/messages.cpp:73
-msgid "Ready."
-msgstr ""
-
-#: ../src/ui/dialog/messages.cpp:74
-msgid ""
-"Enable log display by setting dialogs.debug 'redirect' attribute to 1 in "
-"preferences.xml"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:422
-msgid "Error while reading the Open Clip Art RSS feed"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:461
-msgid ""
-"Failed to receive the Open Clip Art Library RSS feed. Verify if the server "
-"name is correct in Configuration->Import/Export (e.g.: openclipart.org)"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:475
-msgid "Server supplied malformed Clip Art feed"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:566
-msgid "Search for:"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:567
-msgid "No files matched your search"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:578
-msgid "Search"
-msgstr ""
-
-#: ../src/ui/dialog/ocaldialogs.cpp:595
-msgid "Files found"
-msgstr ""
-
-#: ../src/ui/dialog/print.cpp:93
-msgid "Could not open temporary PNG for bitmap printing"
-msgstr ""
-
-#: ../src/ui/dialog/print.cpp:136
-msgid "Could not set up Document"
-msgstr ""
-
-#: ../src/ui/dialog/print.cpp:140
-msgid "Failed to set CairoRenderContext"
-msgstr ""
-
-#. set up dialog title, based on document name
-#: ../src/ui/dialog/print.cpp:180
-msgid "SVG Document"
-msgstr ""
-
-#: ../src/ui/dialog/print.cpp:181
-msgid "Print"
-msgstr ""
-
-#. build custom preferences tab
-#: ../src/ui/dialog/print.cpp:215
-msgid "Rendering"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:211
-msgid "_Execute Javascript"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:213
-msgid "_Execute Python"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:215
-msgid "_Execute Ruby"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:224
-msgid "Script"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:234
-msgid "Output"
-msgstr ""
-
-#: ../src/ui/dialog/scriptdialog.cpp:244
-msgid "Errors"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:121
-msgid "Set SVG Font attribute"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:174
-msgid "Adjust kerning value"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:364
-msgid "Family Name:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:374
-msgid "Set width:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:433
-msgid "glyph"
-msgstr ""
-
-#. SPGlyph* glyph =
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:465
-msgid "Add glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:481
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:525
-msgid "Select a <b>path</b> to define the curves of a glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:489
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:533
-msgid "The selected object does not have a <b>path</b> description."
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:504
-msgid "No glyph selected in the SVGFonts dialog."
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:509
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:551
-msgid "Set glyph curves"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:570
-msgid "Reset missing-glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:585
-msgid "Edit glyph name"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:598
-msgid "Set glyph unicode"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:608
-msgid "Remove font"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:623
-msgid "Remove glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:638
-msgid "Remove kerning pair"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:648
-msgid "Missing Glyph:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:652
-msgid "From selection..."
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:654
-#: ../src/ui/widget/preferences-widget.cpp:590
-msgid "Reset"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:665
-msgid "Glyph name"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:666
-msgid "Matching string"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:669
-msgid "Add Glyph"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:676
-msgid "Get curves from selection..."
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:726
-msgid "Add kerning pair"
-msgstr ""
-
-#. Kerning Setup:
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:734
-msgid "Kerning Setup:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:736
-msgid "1st Glyph:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:738
-msgid "2nd Glyph:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:741
-msgid "Add pair"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:753
-msgid "First Unicode range"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:754
-msgid "Second Unicode range"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:761
-msgid "Kerning value:"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:819
-msgid "Set font family"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:828
-msgid "font"
-msgstr ""
-
-#. select_font(font);
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:842
-msgid "Add font"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:862
-msgid "_Font"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:870
-msgid "_Global Settings"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:871
-msgid "_Glyphs"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:872
-msgid "_Kerning"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:879
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:880
-msgid "Sample Text"
-msgstr ""
-
-#: ../src/ui/dialog/svg-fonts-dialog.cpp:884
-msgid "Preview Text:"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:331
-#, c-format
-msgid ""
-"Color: <b>%s</b>; <b>Click</b> to set fill, <b>Shift+click</b> to set stroke"
-msgstr ""
-
-#. TRANSLATORS: An item in context menu on a colour in the swatches
-#: ../src/ui/dialog/swatches.cpp:442
-msgid "Set fill"
-msgstr ""
-
-#. TRANSLATORS: An item in context menu on a colour in the swatches
-#: ../src/ui/dialog/swatches.cpp:450
-msgid "Set stroke"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:476 ../src/widgets/gradient-selector.cpp:144
-#: ../src/widgets/gradient-toolbar.cpp:466
-msgid "Edit..."
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:488
-msgid "Convert"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:651
-msgid "Change color definition"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:852
-msgid "Remove stroke color"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:852
-msgid "Remove fill color"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:857
-msgid "Set stroke color to none"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:857
-msgid "Set fill color to none"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:874
-msgid "Set stroke color from swatch"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:874
-msgid "Set fill color from swatch"
-msgstr ""
-
-#: ../src/ui/dialog/swatches.cpp:1198
-#, c-format
-msgid "Palettes directory (%s) is unavailable."
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:346
-msgid "Arrange in a grid"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:652
-msgid "Rows:"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:660
-msgid "Number of rows"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:664
-msgid "Equal height"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:674
-msgid "If not set, each row has the height of the tallest object in it"
-msgstr ""
-
-#. #### Radio buttons to control vertical alignment ####
-#. #### Radio buttons to control horizontal alignment ####
-#: ../src/ui/dialog/tile.cpp:680 ../src/ui/dialog/tile.cpp:750
-msgid "Align:"
-msgstr ""
-
-#. #### Number of columns ####
-#: ../src/ui/dialog/tile.cpp:722
-msgid "Columns:"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:730
-msgid "Number of columns"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:734
-msgid "Equal width"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:743
-msgid "If not set, each column has the width of the widest object in it"
-msgstr ""
-
-#. #### Radio buttons to control spacing manually or to fit selection bbox ####
-#: ../src/ui/dialog/tile.cpp:789
-msgid "Fit into selection box"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:795
-msgid "Set spacing:"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:815
-msgid "Vertical spacing between rows (px units)"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:840
-msgid "Horizontal spacing between columns (px units)"
-msgstr ""
-
-#. ## The OK button
-#: ../src/ui/dialog/tile.cpp:863
-msgid "tileClonesDialog|Arrange"
-msgstr ""
-
-#: ../src/ui/dialog/tile.cpp:864
-msgid "Arrange selected objects"
-msgstr ""
-
-#. #### begin left panel
-#. ### begin notebook
-#. ## begin mode page
-#. # begin single scan
-#. brightness
-#: ../src/ui/dialog/tracedialog.cpp:406
-msgid "Brightness cutoff"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:410
-msgid "Trace by a given brightness level"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:418
-msgid "Brightness cutoff for black/white"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:425
-msgid "Single scan: creates a path"
-msgstr ""
-
-#. canny edge detection
-#. TRANSLATORS: "Canny" is the name of the inventor of this edge detection method
-#: ../src/ui/dialog/tracedialog.cpp:430
-msgid "Edge detection"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:434
-msgid "Trace with optimal edge detection by J. Canny's algorithm"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:451
-msgid "Brightness cutoff for adjacent pixels (determines edge thickness)"
-msgstr ""
-
-#. quantization
-#. TRANSLATORS: Color Quantization: the process of reducing the number
-#. of colors in an image by selecting an optimized set of representative
-#. colors and then re-applying this reduced set to the original image.
-#: ../src/ui/dialog/tracedialog.cpp:463
-msgid "Color quantization"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:467
-msgid "Trace along the boundaries of reduced colors"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:475
-msgid "The number of reduced colors"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:477
-msgid "Colors:"
-msgstr ""
-
-#. swap black and white
-#: ../src/ui/dialog/tracedialog.cpp:483
-msgid "Invert image"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:488
-msgid "Invert black and white regions"
-msgstr ""
-
-#. # end single scan
-#. # begin multiple scan
-#: ../src/ui/dialog/tracedialog.cpp:497
-msgid "Brightness steps"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:501
-msgid "Trace the given number of brightness levels"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:508
-msgid "Scans:"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:511
-msgid "The desired number of scans"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:515
-#: ../share/extensions/svgcalendar.inx.h:6
-msgid "Colors"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:519
-msgid "Trace the given number of reduced colors"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:523
-msgid "Grays"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:527
-msgid "Same as Colors, but the result is converted to grayscale"
-msgstr ""
-
-#. TRANSLATORS: "Smooth" is a verb here
-#: ../src/ui/dialog/tracedialog.cpp:532
-msgid "Smooth"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:536
-msgid "Apply Gaussian blur to the bitmap before tracing"
-msgstr ""
-
-#. TRANSLATORS: "Stack" is a verb here
-#: ../src/ui/dialog/tracedialog.cpp:539
-msgid "Stack scans"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:542
-msgid ""
-"Stack scans on top of one another (no gaps) instead of tiling (usually with "
-"gaps)"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:545
-msgid "Remove background"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:550
-msgid "Remove bottom (background) layer when done"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:554
-msgid "Multiple scans: creates a group of paths"
-msgstr ""
-
-#. # end multiple scan
-#. ## end mode page
-#: ../src/ui/dialog/tracedialog.cpp:563 ../src/widgets/toolbox.cpp:4249
-#: ../share/extensions/triangle.inx.h:9
-msgid "Mode"
-msgstr ""
-
-#. ## begin option page
-#. # potrace parameters
-#: ../src/ui/dialog/tracedialog.cpp:569
-msgid "Suppress speckles"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:571
-msgid "Ignore small spots (speckles) in the bitmap"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:579
-msgid "Speckles of up to this many pixels will be suppressed"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:584
-msgid "Smooth corners"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:586
-msgid "Smooth out sharp corners of the trace"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:595
-msgid "Increase this to smooth corners more"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:599
-msgid "Optimize paths"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:602
-msgid "Try to optimize paths by joining adjacent Bezier curve segments"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:610
-msgid ""
-"Increase this to reduce the number of nodes in the trace by more aggressive "
-"optimization"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:611
-msgid "Tolerance:"
-msgstr ""
-
-#. ## end option page
-#: ../src/ui/dialog/tracedialog.cpp:617 ../src/ui/dialog/tracedialog.cpp:623
-#: ../share/extensions/dxf_input.inx.h:11
-#: ../share/extensions/dxf_outlines.inx.h:9 ../share/extensions/scour.inx.h:10
-msgid "Options"
-msgstr ""
-
-#. ### credits
-#: ../src/ui/dialog/tracedialog.cpp:627
-msgid ""
-"Inkscape bitmap tracing\n"
-"is based on Potrace,\n"
-"created by Peter Selinger\n"
-"\n"
-"http://potrace.sourceforge.net"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:630
-msgid "Credits"
-msgstr ""
-
-#. #### begin right panel
-#. ## SIOX
-#: ../src/ui/dialog/tracedialog.cpp:644
-msgid "SIOX foreground selection"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:647
-msgid "Cover the area you want to select as the foreground"
-msgstr ""
-
-#. ## preview
-#: ../src/ui/dialog/tracedialog.cpp:652
-msgid "Update"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:658
-msgid ""
-"Preview the intermediate bitmap with the current settings, without actual "
-"tracing"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:662
-msgid "Preview"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:679
-msgid "Abort a trace in progress"
-msgstr ""
-
-#: ../src/ui/dialog/tracedialog.cpp:683
-msgid "Execute the trace"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:82
-#: ../src/ui/dialog/transformation.cpp:92
-msgid "_Horizontal"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:82
-msgid "Horizontal displacement (relative) or position (absolute)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:84
-#: ../src/ui/dialog/transformation.cpp:94
-msgid "_Vertical"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:84
-msgid "Vertical displacement (relative) or position (absolute)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:86
-msgid "_Width"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:86
-msgid "Horizontal size (absolute or percentage of current)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:88
-msgid "_Height"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:88
-msgid "Vertical size (absolute or percentage of current)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:90
-msgid "A_ngle"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:90
-msgid "Rotation angle (positive = counterclockwise)"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:92
-msgid ""
-"Horizontal skew angle (positive = counterclockwise), or absolute "
-"displacement, or percentage displacement"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:94
-msgid ""
-"Vertical skew angle (positive = counterclockwise), or absolute displacement, "
-"or percentage displacement"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:97
-msgid "Transformation matrix element A"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:98
-msgid "Transformation matrix element B"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:99
-msgid "Transformation matrix element C"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:100
-msgid "Transformation matrix element D"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:101
-msgid "Transformation matrix element E"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:102
-msgid "Transformation matrix element F"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:104
-msgid "Rela_tive move"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:104
-msgid ""
-"Add the specified relative displacement to the current position; otherwise, "
-"edit the current absolute position directly"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:105
-msgid "Scale proportionally"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:105
-msgid "Preserve the width/height ratio of the scaled objects"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:106
-msgid "Apply to each _object separately"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:106
-msgid ""
-"Apply the scale/rotate/skew to each selected object separately; otherwise, "
-"transform the selection as a whole"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:107
-msgid "Edit c_urrent matrix"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:107
-msgid ""
-"Edit the current transform= matrix; otherwise, post-multiply transform= by "
-"this matrix"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:117
-msgid "_Move"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:120
-msgid "_Scale"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:123
-msgid "_Rotate"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:126
-msgid "Ske_w"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:129
-msgid "Matri_x"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:153
-msgid "Reset the values on the current tab to defaults"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:160
-msgid "Apply transformation to selection"
-msgstr ""
-
-#: ../src/ui/dialog/transformation.cpp:846
-msgid "Edit transformation matrix"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:330 ../src/ui/view/edit-widget.cpp:335
-#: ../src/ui/view/edit-widget.cpp:343 ../src/ui/view/edit-widget.cpp:348
-#: ../src/ui/view/edit-widget.cpp:353 ../src/ui/view/edit-widget.cpp:368
-#: ../src/ui/view/edit-widget.cpp:381 ../src/ui/view/edit-widget.cpp:386
-#: ../src/ui/view/edit-widget.cpp:400 ../src/ui/view/edit-widget.cpp:404
-#: ../src/ui/view/edit-widget.cpp:412 ../src/ui/view/edit-widget.cpp:416
-#: ../src/ui/view/edit-widget.cpp:420 ../src/ui/view/edit-widget.cpp:756
-#: ../src/ui/view/edit-widget.cpp:761 ../src/ui/view/edit-widget.cpp:867
-#: ../src/ui/view/edit-widget.cpp:871 ../src/ui/view/edit-widget.cpp:992
-msgid "PLACEHOLDER, do not translate"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1051 ../src/widgets/desktop-widget.cpp:379
-msgid "Zoom drawing if window size changes"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1072 ../src/widgets/desktop-widget.cpp:503
-msgid "Cursor coordinates"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1082 ../src/widgets/desktop-widget.cpp:518
-msgid "Z:"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1089
-msgid ""
-"<b>Welcome to Inkscape!</b> Use shape or drawing tools to create objects; "
-"use selector (arrow) to move or transform them."
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1200 ../src/widgets/desktop-widget.cpp:838
-#, c-format
-msgid ""
-"<span weight=\"bold\" size=\"larger\">Save changes to document \"%s\" before "
-"closing?</span>\n"
-"\n"
-"If you close without saving, your changes will be discarded."
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1211 ../src/ui/view/edit-widget.cpp:1259
-#: ../src/widgets/desktop-widget.cpp:845 ../src/widgets/desktop-widget.cpp:902
-msgid "Close _without saving"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1247 ../src/widgets/desktop-widget.cpp:894
-#, c-format
-msgid ""
-"<span weight=\"bold\" size=\"larger\">The file \"%s\" was saved with a "
-"format (%s) that may cause data loss!</span>\n"
-"\n"
-"Do you want to save this file as an Inkscape SVG?"
-msgstr ""
-
-#: ../src/ui/view/edit-widget.cpp:1262 ../src/widgets/desktop-widget.cpp:905
-msgid "_Save as SVG"
-msgstr ""
-
-#: ../src/ui/widget/filter-effect-chooser.cpp:25
-msgid "_Blend mode:"
-msgstr ""
-
-#: ../src/ui/widget/filter-effect-chooser.cpp:26
-msgid "B_lur:"
-msgstr ""
-
-#: ../src/ui/widget/layer-selector.cpp:114
-msgid "Toggle current layer visibility"
-msgstr ""
-
-#: ../src/ui/widget/layer-selector.cpp:135
-msgid "Lock or unlock current layer"
-msgstr ""
-
-#: ../src/ui/widget/layer-selector.cpp:138
-msgid "Current layer"
-msgstr ""
-
-#: ../src/ui/widget/layer-selector.cpp:566
-msgid "(root)"
-msgstr ""
-
-#: ../src/ui/widget/licensor.cpp:35
-msgid "Proprietary"
-msgstr ""
-
-#: ../src/ui/widget/licensor.cpp:38
-msgid "MetadataLicence|Other"
-msgstr ""
-
-#: ../src/ui/widget/object-composite-settings.cpp:172
-msgid "Change blur"
-msgstr ""
-
-#: ../src/ui/widget/object-composite-settings.cpp:212
-#: ../src/ui/widget/selected-style.cpp:857
-#: ../src/ui/widget/selected-style.cpp:1151
-msgid "Change opacity"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:229
-msgid "U_nits:"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:230
-msgid "Width of paper"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:231
-msgid "Height of paper"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:277
-msgid "P_age size:"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:285
-msgid "Page orientation:"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:288
-msgid "_Landscape"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:293
-msgid "_Portrait"
-msgstr ""
-
-#. ## Set up custom size frame
-#: ../src/ui/widget/page-sizer.cpp:300
-msgid "Custom size"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:313
-msgid "_Fit page to selection"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:314
-msgid ""
-"Resize the page to fit the current selection, or the entire drawing if there "
-"is no selection"
-msgstr ""
-
-#: ../src/ui/widget/page-sizer.cpp:377
-msgid "Set page size"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:111
-msgid "List"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/ui/widget/panel.cpp:136
-msgid "swatches|Size"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:140
-msgid "tiny"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:141
-msgid "small"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "medium" indicates size of colour swatches
-#: ../src/ui/widget/panel.cpp:145
-msgid "swatchesHeight|medium"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:146
-msgid "large"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:147
-msgid "huge"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/ui/widget/panel.cpp:171
-msgid "swatches|Width"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:175
-msgid "narrower"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:176
-msgid "narrow"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "medium" indicates width of colour swatches
-#: ../src/ui/widget/panel.cpp:180
-msgid "swatchesWidth|medium"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:181
-msgid "wide"
-msgstr ""
-
-#: ../src/ui/widget/panel.cpp:182
-msgid "wider"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Wrap" indicates how colour swatches are displayed
-#: ../src/ui/widget/panel.cpp:215
-msgid "swatches|Wrap"
-msgstr ""
-
-#: ../src/ui/widget/random.cpp:123
-msgid ""
-"Reseed the random number generator; this creates a different sequence of "
-"random numbers."
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:39
-msgid "Backend"
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:40
-msgid "Vector"
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:41
-msgid "Bitmap"
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:42
-msgid "Bitmap options"
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:44
-msgid "Preferred resolution of rendering, in dots per inch."
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:52
-msgid ""
-"Render using Cairo vector operations. The resulting image is usually "
-"smaller in file size and can be arbitrarily scaled, but some filter effects "
-"will not be correctly rendered."
-msgstr ""
-
-#: ../src/ui/widget/rendering-options.cpp:57
-msgid ""
-"Render everything as bitmap. The resulting image is usually larger in file "
-"size and cannot be arbitrarily scaled without quality loss, but all objects "
-"will be rendered exactly as displayed."
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:112
-#: ../src/ui/widget/style-swatch.cpp:117
-msgid "Fill:"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:113
-#: ../src/ui/widget/style-swatch.cpp:118
-msgid "Stroke:"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:114
-msgid "O:"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:156
-msgid "N/A"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:159
-#: ../src/ui/widget/selected-style.cpp:1026
-#: ../src/ui/widget/selected-style.cpp:1027
-msgid "Nothing selected"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:161
-#: ../src/ui/widget/style-swatch.cpp:296
-msgid "<i>None</i>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:164
-#: ../src/ui/widget/style-swatch.cpp:298
-msgid "No fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:164
-#: ../src/ui/widget/style-swatch.cpp:298
-msgid "No stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:166
-#: ../src/ui/widget/style-swatch.cpp:277 ../src/widgets/paint-selector.cpp:189
-msgid "Pattern"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:169
-#: ../src/ui/widget/style-swatch.cpp:279 ../src/widgets/paint-selector.cpp:997
-msgid "Pattern fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:169
-#: ../src/ui/widget/style-swatch.cpp:279
-msgid "Pattern stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:171
-msgid "<b>L</b>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:174
-#: ../src/ui/widget/style-swatch.cpp:271
-msgid "Linear gradient fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:174
-#: ../src/ui/widget/style-swatch.cpp:271
-msgid "Linear gradient stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:181
-msgid "<b>R</b>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:184
-#: ../src/ui/widget/style-swatch.cpp:275
-msgid "Radial gradient fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:184
-#: ../src/ui/widget/style-swatch.cpp:275
-msgid "Radial gradient stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:191
-msgid "Different"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:194
-msgid "Different fills"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:194
-msgid "Different strokes"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:196
-#: ../src/ui/widget/style-swatch.cpp:301
-msgid "<b>Unset</b>"
-msgstr ""
-
-#. TRANSLATORS COMMENT: unset is a verb here
-#: ../src/ui/widget/selected-style.cpp:199
-#: ../src/ui/widget/selected-style.cpp:257
-#: ../src/ui/widget/selected-style.cpp:499
-#: ../src/ui/widget/style-swatch.cpp:303 ../src/widgets/fill-style.cpp:528
-msgid "Unset fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:199
-#: ../src/ui/widget/selected-style.cpp:257
-#: ../src/ui/widget/selected-style.cpp:515
-#: ../src/ui/widget/style-swatch.cpp:303 ../src/widgets/stroke-style.cpp:462
-msgid "Unset stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:202
-msgid "Flat color fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:202
-msgid "Flat color stroke"
-msgstr ""
-
-#. TRANSLATOR COMMENT: A means "Averaged"
-#: ../src/ui/widget/selected-style.cpp:205
-msgid "<b>a</b>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:208
-msgid "Fill is averaged over selected objects"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:208
-msgid "Stroke is averaged over selected objects"
-msgstr ""
-
-#. TRANSLATOR COMMENT: M means "Multiple"
-#: ../src/ui/widget/selected-style.cpp:211
-msgid "<b>m</b>"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:214
-msgid "Multiple selected objects have the same fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:214
-msgid "Multiple selected objects have the same stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:216
-msgid "Edit fill..."
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:216
-msgid "Edit stroke..."
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:220
-msgid "Last set color"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:224
-msgid "Last selected color"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:232
-msgid "White"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:236
-#: ../src/widgets/sp-color-icc-selector.cpp:238
-#: ../src/widgets/sp-color-scales.cpp:463
-#: ../src/widgets/sp-color-scales.cpp:464
-msgid "Black"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:240
-msgid "Copy color"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:244
-msgid "Paste color"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:248
-#: ../src/ui/widget/selected-style.cpp:782
-msgid "Swap fill and stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:252
-#: ../src/ui/widget/selected-style.cpp:524
-#: ../src/ui/widget/selected-style.cpp:533
-msgid "Make fill opaque"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:252
-msgid "Make stroke opaque"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:261
-#: ../src/ui/widget/selected-style.cpp:481 ../src/widgets/fill-style.cpp:385
-msgid "Remove fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:261
-#: ../src/ui/widget/selected-style.cpp:490 ../src/widgets/stroke-style.cpp:336
-msgid "Remove stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:314
-msgid "Remove"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:545
-msgid "Apply last set color to fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:557
-msgid "Apply last set color to stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:568
-msgid "Apply last selected color to fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:579
-msgid "Apply last selected color to stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:599
-msgid "Invert fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:619
-msgid "Invert stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:631
-msgid "White fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:643
-msgid "White stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:655
-msgid "Black fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:667
-msgid "Black stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:710
-msgid "Paste fill"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:728
-msgid "Paste stroke"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:892
-msgid "Change stroke width"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:987
-msgid ", drag to adjust"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1068
-#, c-format
-msgid "Stroke width: %.5g%s%s"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1072
-msgid " (averaged)"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1100
-msgid "0 (transparent)"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1124
-msgid "100% (opaque)"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1278
-msgid "Adjust saturation"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1280
-#, c-format
-msgid ""
-"Adjusting <b>saturation</b>: was %.3g, now <b>%.3g</b> (diff %.3g); with "
-"<b>Ctrl</b> to adjust lightness, without modifiers to adjust hue"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1284
-msgid "Adjust lightness"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1286
-#, c-format
-msgid ""
-"Adjusting <b>lightness</b>: was %.3g, now <b>%.3g</b> (diff %.3g); with "
-"<b>Shift</b> to adjust saturation, without modifiers to adjust hue"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1290
-msgid "Adjust hue"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1292
-#, c-format
-msgid ""
-"Adjusting <b>hue</b>: was %.3g, now <b>%.3g</b> (diff %.3g); with <b>Shift</"
-"b> to adjust saturation, with <b>Ctrl</b> to adjust lightness"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1401
-#: ../src/ui/widget/selected-style.cpp:1415
-msgid "Adjust stroke width"
-msgstr ""
-
-#: ../src/ui/widget/selected-style.cpp:1402
-#, c-format
-msgid "Adjusting <b>stroke width</b>: was %.3g, now <b>%.3g</b> (diff %.3g)"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. "Link" means to _link_ two sliders together
-#: ../src/ui/widget/spin-slider.cpp:120
-msgid "sliders|Link"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:269
-msgid "L Gradient"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:273
-msgid "R Gradient"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:289
-#, c-format
-msgid "Fill: %06x/%.3g"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:291
-#, c-format
-msgid "Stroke: %06x/%.3g"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:323
-#, c-format
-msgid "Stroke width: %.5g%s"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:339
-#, c-format
-msgid "O:%.3g"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:341
-#, c-format
-msgid "O:.%d"
-msgstr ""
-
-#: ../src/ui/widget/style-swatch.cpp:346
-#, c-format
-msgid "Opacity: %.3g"
-msgstr ""
-
-#: ../src/vanishing-point.cpp:123
-msgid "Split vanishing points"
-msgstr ""
-
-#: ../src/vanishing-point.cpp:168
-msgid "Merge vanishing points"
-msgstr ""
-
-#: ../src/vanishing-point.cpp:224
-msgid "3D box: Move vanishing point"
-msgstr ""
-
-#: ../src/vanishing-point.cpp:305
-#, c-format
-msgid "<b>Finite</b> vanishing point shared by <b>%d</b> box"
-msgid_plural ""
-"<b>Finite</b> vanishing point shared by <b>%d</b> boxes; drag with <b>Shift</"
-"b> to separate selected box(es)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. This won't make sense any more when infinite VPs are not shown on the canvas,
-#. but currently we update the status message anyway
-#: ../src/vanishing-point.cpp:312
-#, c-format
-msgid "<b>Infinite</b> vanishing point shared by <b>%d</b> box"
-msgid_plural ""
-"<b>Infinite</b> vanishing point shared by <b>%d</b> boxes; drag with "
-"<b>Shift</b> to separate selected box(es)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/vanishing-point.cpp:320
-#, c-format
-msgid ""
-"shared by <b>%d</b> box; drag with <b>Shift</b> to separate selected box(es)"
-msgid_plural ""
-"shared by <b>%d</b> boxes; drag with <b>Shift</b> to separate selected box"
-"(es)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../src/verbs.cpp:1140
-msgid "Switch to next layer"
-msgstr ""
-
-#: ../src/verbs.cpp:1141
-msgid "Switched to next layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1143
-msgid "Cannot go past last layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1152
-msgid "Switch to previous layer"
-msgstr ""
-
-#: ../src/verbs.cpp:1153
-msgid "Switched to previous layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1155
-msgid "Cannot go before first layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1172 ../src/verbs.cpp:1268 ../src/verbs.cpp:1300
-#: ../src/verbs.cpp:1306
-msgid "No current layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1201 ../src/verbs.cpp:1205
-#, c-format
-msgid "Raised layer <b>%s</b>."
-msgstr ""
-
-#: ../src/verbs.cpp:1202
-msgid "Layer to top"
-msgstr ""
-
-#: ../src/verbs.cpp:1206
-msgid "Raise layer"
-msgstr ""
-
-#: ../src/verbs.cpp:1209 ../src/verbs.cpp:1213
-#, c-format
-msgid "Lowered layer <b>%s</b>."
-msgstr ""
-
-#: ../src/verbs.cpp:1210
-msgid "Layer to bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:1214
-msgid "Lower layer"
-msgstr ""
-
-#: ../src/verbs.cpp:1223
-msgid "Cannot move layer any further."
-msgstr ""
-
-#: ../src/verbs.cpp:1237 ../src/verbs.cpp:1255
-#, c-format
-msgid "%s copy"
-msgstr ""
-
-#: ../src/verbs.cpp:1263
-msgid "Duplicate layer"
-msgstr ""
-
-#. TRANSLATORS: this means "The layer has been duplicated."
-#: ../src/verbs.cpp:1266
-msgid "Duplicated layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1295
-msgid "Delete layer"
-msgstr ""
-
-#. TRANSLATORS: this means "The layer has been deleted."
-#: ../src/verbs.cpp:1298
-msgid "Deleted layer."
-msgstr ""
-
-#: ../src/verbs.cpp:1309
-msgid "Toggle layer solo"
-msgstr ""
-
-#: ../src/verbs.cpp:1389
-msgid "Flip horizontally"
-msgstr ""
-
-#: ../src/verbs.cpp:1404
-msgid "Flip vertically"
-msgstr ""
-
-#. TRANSLATORS: If you have translated the tutorial-basic.svg file to your language,
-#. then translate this string as "tutorial-basic.LANG.svg" (where LANG is your language
-#. code); otherwise leave as "tutorial-basic.svg".
-#: ../src/verbs.cpp:1912
-msgid "tutorial-basic.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1916
-msgid "tutorial-shapes.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1920
-msgid "tutorial-advanced.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1924
-msgid "tutorial-tracing.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1928
-msgid "tutorial-calligraphy.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1932
-msgid "tutorial-elements.svg"
-msgstr ""
-
-#. TRANSLATORS: See "tutorial-basic.svg" comment.
-#: ../src/verbs.cpp:1936
-msgid "tutorial-tips.svg"
-msgstr ""
-
-#: ../src/verbs.cpp:2212 ../src/verbs.cpp:2731
-msgid "Unlock all objects in the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2216 ../src/verbs.cpp:2733
-msgid "Unlock all objects in all layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2220 ../src/verbs.cpp:2735
-msgid "Unhide all objects in the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2224 ../src/verbs.cpp:2737
-msgid "Unhide all objects in all layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2239
-msgid "Does nothing"
-msgstr ""
-
-#: ../src/verbs.cpp:2242
-msgid "Create new document from the default template"
-msgstr ""
-
-#: ../src/verbs.cpp:2244
-msgid "_Open..."
-msgstr ""
-
-#: ../src/verbs.cpp:2245
-msgid "Open an existing document"
-msgstr ""
-
-#: ../src/verbs.cpp:2246
-msgid "Re_vert"
-msgstr ""
-
-#: ../src/verbs.cpp:2247
-msgid "Revert to the last saved version of document (changes will be lost)"
-msgstr ""
-
-#: ../src/verbs.cpp:2248
-msgid "_Save"
-msgstr ""
-
-#: ../src/verbs.cpp:2248
-msgid "Save document"
-msgstr ""
-
-#: ../src/verbs.cpp:2250
-msgid "Save _As..."
-msgstr ""
-
-#: ../src/verbs.cpp:2251
-msgid "Save document under a new name"
-msgstr ""
-
-#: ../src/verbs.cpp:2252
-msgid "Save a Cop_y..."
-msgstr ""
-
-#: ../src/verbs.cpp:2253
-msgid "Save a copy of the document under a new name"
-msgstr ""
-
-#: ../src/verbs.cpp:2254
-msgid "_Print..."
-msgstr ""
-
-#: ../src/verbs.cpp:2254
-msgid "Print document"
-msgstr ""
-
-#. TRANSLATORS: "Vacuum Defs" means "Clean up defs" (so as to remove unused definitions)
-#: ../src/verbs.cpp:2257
-msgid "Vac_uum Defs"
-msgstr ""
-
-#: ../src/verbs.cpp:2257
-msgid ""
-"Remove unused definitions (such as gradients or clipping paths) from the <"
-"defs> of the document"
-msgstr ""
-
-#: ../src/verbs.cpp:2259
-msgid "Print Previe_w"
-msgstr ""
-
-#: ../src/verbs.cpp:2260
-msgid "Preview document printout"
-msgstr ""
-
-#: ../src/verbs.cpp:2261
-msgid "_Import..."
-msgstr ""
-
-#: ../src/verbs.cpp:2262
-msgid "Import a bitmap or SVG image into this document"
-msgstr ""
-
-#: ../src/verbs.cpp:2263
-msgid "_Export Bitmap..."
-msgstr ""
-
-#: ../src/verbs.cpp:2264
-msgid "Export this document or a selection as a bitmap image"
-msgstr ""
-
-#: ../src/verbs.cpp:2265
-msgid "Import a document from Open Clip Art Library"
-msgstr ""
-
-#. new FileVerb(SP_VERB_FILE_EXPORT_TO_OCAL, "FileExportToOCAL", N_("Export To Open Clip Art Library"), N_("Export this document to Open Clip Art Library"), INKSCAPE_ICON_DOCUMENT_EXPORT_OCAL),
-#: ../src/verbs.cpp:2267
-msgid "N_ext Window"
-msgstr ""
-
-#: ../src/verbs.cpp:2268
-msgid "Switch to the next document window"
-msgstr ""
-
-#: ../src/verbs.cpp:2269
-msgid "P_revious Window"
-msgstr ""
-
-#: ../src/verbs.cpp:2270
-msgid "Switch to the previous document window"
-msgstr ""
-
-#: ../src/verbs.cpp:2271
-msgid "_Close"
-msgstr ""
-
-#: ../src/verbs.cpp:2272
-msgid "Close this document window"
-msgstr ""
-
-#: ../src/verbs.cpp:2273
-msgid "_Quit"
-msgstr ""
-
-#: ../src/verbs.cpp:2273
-msgid "Quit Inkscape"
-msgstr ""
-
-#: ../src/verbs.cpp:2276
-msgid "Undo last action"
-msgstr ""
-
-#: ../src/verbs.cpp:2279
-msgid "Do again the last undone action"
-msgstr ""
-
-#: ../src/verbs.cpp:2280
-msgid "Cu_t"
-msgstr ""
-
-#: ../src/verbs.cpp:2281
-msgid "Cut selection to clipboard"
-msgstr ""
-
-#: ../src/verbs.cpp:2282
-msgid "_Copy"
-msgstr ""
-
-#: ../src/verbs.cpp:2283
-msgid "Copy selection to clipboard"
-msgstr ""
-
-#: ../src/verbs.cpp:2284
-msgid "_Paste"
-msgstr ""
-
-#: ../src/verbs.cpp:2285
-msgid "Paste objects from clipboard to mouse point, or paste text"
-msgstr ""
-
-#: ../src/verbs.cpp:2286
-msgid "Paste _Style"
-msgstr ""
-
-#: ../src/verbs.cpp:2287
-msgid "Apply the style of the copied object to selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2289
-msgid "Scale selection to match the size of the copied object"
-msgstr ""
-
-#: ../src/verbs.cpp:2290
-msgid "Paste _Width"
-msgstr ""
-
-#: ../src/verbs.cpp:2291
-msgid "Scale selection horizontally to match the width of the copied object"
-msgstr ""
-
-#: ../src/verbs.cpp:2292
-msgid "Paste _Height"
-msgstr ""
-
-#: ../src/verbs.cpp:2293
-msgid "Scale selection vertically to match the height of the copied object"
-msgstr ""
-
-#: ../src/verbs.cpp:2294
-msgid "Paste Size Separately"
-msgstr ""
-
-#: ../src/verbs.cpp:2295
-msgid "Scale each selected object to match the size of the copied object"
-msgstr ""
-
-#: ../src/verbs.cpp:2296
-msgid "Paste Width Separately"
-msgstr ""
-
-#: ../src/verbs.cpp:2297
-msgid ""
-"Scale each selected object horizontally to match the width of the copied "
-"object"
-msgstr ""
-
-#: ../src/verbs.cpp:2298
-msgid "Paste Height Separately"
-msgstr ""
-
-#: ../src/verbs.cpp:2299
-msgid ""
-"Scale each selected object vertically to match the height of the copied "
-"object"
-msgstr ""
-
-#: ../src/verbs.cpp:2300
-msgid "Paste _In Place"
-msgstr ""
-
-#: ../src/verbs.cpp:2301
-msgid "Paste objects from clipboard to the original location"
-msgstr ""
-
-#: ../src/verbs.cpp:2302
-msgid "Paste Path _Effect"
-msgstr ""
-
-#: ../src/verbs.cpp:2303
-msgid "Apply the path effect of the copied object to selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2304
-msgid "Remove Path _Effect"
-msgstr ""
-
-#: ../src/verbs.cpp:2305
-msgid "Remove any path effects from selected objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2306
-msgid "Remove Filters"
-msgstr ""
-
-#: ../src/verbs.cpp:2307
-msgid "Remove any filters from selected objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2308
-msgid "_Delete"
-msgstr ""
-
-#: ../src/verbs.cpp:2309
-msgid "Delete selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2310
-msgid "Duplic_ate"
-msgstr ""
-
-#: ../src/verbs.cpp:2311
-msgid "Duplicate selected objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2312
-msgid "Create Clo_ne"
-msgstr ""
-
-#: ../src/verbs.cpp:2313
-msgid "Create a clone (a copy linked to the original) of selected object"
-msgstr ""
-
-#: ../src/verbs.cpp:2314
-msgid "Unlin_k Clone"
-msgstr ""
-
-#: ../src/verbs.cpp:2315
-msgid ""
-"Cut the selected clones' links to the originals, turning them into "
-"standalone objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2316
-msgid "Relink to Copied"
-msgstr ""
-
-#: ../src/verbs.cpp:2317
-msgid "Relink the selected clones to the object currently on the clipboard"
-msgstr ""
-
-#: ../src/verbs.cpp:2318
-msgid "Select _Original"
-msgstr ""
-
-#: ../src/verbs.cpp:2319
-msgid "Select the object to which the selected clone is linked"
-msgstr ""
-
-#: ../src/verbs.cpp:2320
-msgid "Objects to _Marker"
-msgstr ""
-
-#: ../src/verbs.cpp:2321
-msgid "Convert selection to a line marker"
-msgstr ""
-
-#: ../src/verbs.cpp:2322
-msgid "Objects to Gu_ides"
-msgstr ""
-
-#: ../src/verbs.cpp:2323
-msgid ""
-"Convert selected objects to a collection of guidelines aligned with their "
-"edges"
-msgstr ""
-
-#: ../src/verbs.cpp:2324
-msgid "Objects to Patter_n"
-msgstr ""
-
-#: ../src/verbs.cpp:2325
-msgid "Convert selection to a rectangle with tiled pattern fill"
-msgstr ""
-
-#: ../src/verbs.cpp:2326
-msgid "Pattern to _Objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2327
-msgid "Extract objects from a tiled pattern fill"
-msgstr ""
-
-#: ../src/verbs.cpp:2328
-msgid "Clea_r All"
-msgstr ""
-
-#: ../src/verbs.cpp:2329
-msgid "Delete all objects from document"
-msgstr ""
-
-#: ../src/verbs.cpp:2330
-msgid "Select Al_l"
-msgstr ""
-
-#: ../src/verbs.cpp:2331
-msgid "Select all objects or all nodes"
-msgstr ""
-
-#: ../src/verbs.cpp:2332
-msgid "Select All in All La_yers"
-msgstr ""
-
-#: ../src/verbs.cpp:2333
-msgid "Select all objects in all visible and unlocked layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2334
-msgid "In_vert Selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2335
-msgid "Invert selection (unselect what is selected and select everything else)"
-msgstr ""
-
-#: ../src/verbs.cpp:2336
-msgid "Invert in All Layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2337
-msgid "Invert selection in all visible and unlocked layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2338
-msgid "Select Next"
-msgstr ""
-
-#: ../src/verbs.cpp:2339
-msgid "Select next object or node"
-msgstr ""
-
-#: ../src/verbs.cpp:2340
-msgid "Select Previous"
-msgstr ""
-
-#: ../src/verbs.cpp:2341
-msgid "Select previous object or node"
-msgstr ""
-
-#: ../src/verbs.cpp:2342
-msgid "D_eselect"
-msgstr ""
-
-#: ../src/verbs.cpp:2343
-msgid "Deselect any selected objects or nodes"
-msgstr ""
-
-#: ../src/verbs.cpp:2344
-msgid "_Guides Around Page"
-msgstr ""
-
-#: ../src/verbs.cpp:2345
-msgid "Create four guides aligned with the page borders"
-msgstr ""
-
-#: ../src/verbs.cpp:2346
-msgid "Next Path Effect Parameter"
-msgstr ""
-
-#: ../src/verbs.cpp:2347
-msgid "Show next Path Effect parameter for editing"
-msgstr ""
-
-#. Selection
-#: ../src/verbs.cpp:2350
-msgid "Raise to _Top"
-msgstr ""
-
-#: ../src/verbs.cpp:2351
-msgid "Raise selection to top"
-msgstr ""
-
-#: ../src/verbs.cpp:2352
-msgid "Lower to _Bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:2353
-msgid "Lower selection to bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:2354
-msgid "_Raise"
-msgstr ""
-
-#: ../src/verbs.cpp:2355
-msgid "Raise selection one step"
-msgstr ""
-
-#: ../src/verbs.cpp:2356
-msgid "_Lower"
-msgstr ""
-
-#: ../src/verbs.cpp:2357
-msgid "Lower selection one step"
-msgstr ""
-
-#: ../src/verbs.cpp:2358
-msgid "_Group"
-msgstr ""
-
-#: ../src/verbs.cpp:2359
-msgid "Group selected objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2361
-msgid "Ungroup selected groups"
-msgstr ""
-
-#: ../src/verbs.cpp:2363
-msgid "_Put on Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2365
-msgid "_Remove from Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2367
-msgid "Remove Manual _Kerns"
-msgstr ""
-
-#. TRANSLATORS: "glyph": An image used in the visual representation of characters;
-#. roughly speaking, how a character looks. A font is a set of glyphs.
-#: ../src/verbs.cpp:2370
-msgid "Remove all manual kerns and glyph rotations from a text object"
-msgstr ""
-
-#: ../src/verbs.cpp:2372
-msgid "_Union"
-msgstr ""
-
-#: ../src/verbs.cpp:2373
-msgid "Create union of selected paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2374
-msgid "_Intersection"
-msgstr ""
-
-#: ../src/verbs.cpp:2375
-msgid "Create intersection of selected paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2376
-msgid "_Difference"
-msgstr ""
-
-#: ../src/verbs.cpp:2377
-msgid "Create difference of selected paths (bottom minus top)"
-msgstr ""
-
-#: ../src/verbs.cpp:2378
-msgid "E_xclusion"
-msgstr ""
-
-#: ../src/verbs.cpp:2379
-msgid ""
-"Create exclusive OR of selected paths (those parts that belong to only one "
-"path)"
-msgstr ""
-
-#: ../src/verbs.cpp:2380
-msgid "Di_vision"
-msgstr ""
-
-#: ../src/verbs.cpp:2381
-msgid "Cut the bottom path into pieces"
-msgstr ""
-
-#. TRANSLATORS: "to cut a path" is not the same as "to break a path apart" - see the
-#. Advanced tutorial for more info
-#: ../src/verbs.cpp:2384
-msgid "Cut _Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2385
-msgid "Cut the bottom path's stroke into pieces, removing fill"
-msgstr ""
-
-#. TRANSLATORS: "outset": expand a shape by offsetting the object's path,
-#. i.e. by displacing it perpendicular to the path in each point.
-#. See also the Advanced Tutorial for explanation.
-#: ../src/verbs.cpp:2389
-msgid "Outs_et"
-msgstr ""
-
-#: ../src/verbs.cpp:2390
-msgid "Outset selected paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2392
-msgid "O_utset Path by 1 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2393
-msgid "Outset selected paths by 1 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2395
-msgid "O_utset Path by 10 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2396
-msgid "Outset selected paths by 10 px"
-msgstr ""
-
-#. TRANSLATORS: "inset": contract a shape by offsetting the object's path,
-#. i.e. by displacing it perpendicular to the path in each point.
-#. See also the Advanced Tutorial for explanation.
-#: ../src/verbs.cpp:2400
-msgid "I_nset"
-msgstr ""
-
-#: ../src/verbs.cpp:2401
-msgid "Inset selected paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2403
-msgid "I_nset Path by 1 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2404
-msgid "Inset selected paths by 1 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2406
-msgid "I_nset Path by 10 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2407
-msgid "Inset selected paths by 10 px"
-msgstr ""
-
-#: ../src/verbs.cpp:2409
-msgid "D_ynamic Offset"
-msgstr ""
-
-#: ../src/verbs.cpp:2409
-msgid "Create a dynamic offset object"
-msgstr ""
-
-#: ../src/verbs.cpp:2411
-msgid "_Linked Offset"
-msgstr ""
-
-#: ../src/verbs.cpp:2412
-msgid "Create a dynamic offset object linked to the original path"
-msgstr ""
-
-#: ../src/verbs.cpp:2414
-msgid "_Stroke to Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2415
-msgid "Convert selected object's stroke to paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2416
-msgid "Si_mplify"
-msgstr ""
-
-#: ../src/verbs.cpp:2417
-msgid "Simplify selected paths (remove extra nodes)"
-msgstr ""
-
-#: ../src/verbs.cpp:2418
-msgid "_Reverse"
-msgstr ""
-
-#: ../src/verbs.cpp:2419
-msgid "Reverse the direction of selected paths (useful for flipping markers)"
-msgstr ""
-
-#. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize)
-#: ../src/verbs.cpp:2421
-msgid "_Trace Bitmap..."
-msgstr ""
-
-#: ../src/verbs.cpp:2422
-msgid "Create one or more paths from a bitmap by tracing it"
-msgstr ""
-
-#: ../src/verbs.cpp:2423
-msgid "_Make a Bitmap Copy"
-msgstr ""
-
-#: ../src/verbs.cpp:2424
-msgid "Export selection to a bitmap and insert it into document"
-msgstr ""
-
-#: ../src/verbs.cpp:2425
-msgid "_Combine"
-msgstr ""
-
-#: ../src/verbs.cpp:2426
-msgid "Combine several paths into one"
-msgstr ""
-
-#. TRANSLATORS: "to cut a path" is not the same as "to break a path apart" - see the
-#. Advanced tutorial for more info
-#: ../src/verbs.cpp:2429
-msgid "Break _Apart"
-msgstr ""
-
-#: ../src/verbs.cpp:2430
-msgid "Break selected paths into subpaths"
-msgstr ""
-
-#: ../src/verbs.cpp:2431
-msgid "Rows and Columns..."
-msgstr ""
-
-#: ../src/verbs.cpp:2432
-msgid "Arrange selected objects in a table"
-msgstr ""
-
-#. Layer
-#: ../src/verbs.cpp:2434
-msgid "_Add Layer..."
-msgstr ""
-
-#: ../src/verbs.cpp:2435
-msgid "Create a new layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2436
-msgid "Re_name Layer..."
-msgstr ""
-
-#: ../src/verbs.cpp:2437
-msgid "Rename the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2438
-msgid "Switch to Layer Abov_e"
-msgstr ""
-
-#: ../src/verbs.cpp:2439
-msgid "Switch to the layer above the current"
-msgstr ""
-
-#: ../src/verbs.cpp:2440
-msgid "Switch to Layer Belo_w"
-msgstr ""
-
-#: ../src/verbs.cpp:2441
-msgid "Switch to the layer below the current"
-msgstr ""
-
-#: ../src/verbs.cpp:2442
-msgid "Move Selection to Layer Abo_ve"
-msgstr ""
-
-#: ../src/verbs.cpp:2443
-msgid "Move selection to the layer above the current"
-msgstr ""
-
-#: ../src/verbs.cpp:2444
-msgid "Move Selection to Layer Bel_ow"
-msgstr ""
-
-#: ../src/verbs.cpp:2445
-msgid "Move selection to the layer below the current"
-msgstr ""
-
-#: ../src/verbs.cpp:2446
-msgid "Layer to _Top"
-msgstr ""
-
-#: ../src/verbs.cpp:2447
-msgid "Raise the current layer to the top"
-msgstr ""
-
-#: ../src/verbs.cpp:2448
-msgid "Layer to _Bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:2449
-msgid "Lower the current layer to the bottom"
-msgstr ""
-
-#: ../src/verbs.cpp:2450
-msgid "_Raise Layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2451
-msgid "Raise the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2452
-msgid "_Lower Layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2453
-msgid "Lower the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2454
-msgid "Duplicate Current Layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2455
-msgid "Duplicate an existing layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2456
-msgid "_Delete Current Layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2457
-msgid "Delete the current layer"
-msgstr ""
-
-#: ../src/verbs.cpp:2458
-msgid "_Show/hide other layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2459
-msgid "Solo the current layer"
-msgstr ""
-
-#. Object
-#: ../src/verbs.cpp:2462
-msgid "Rotate _90° CW"
-msgstr ""
-
-#. This is shared between tooltips and statusbar, so they
-#. must use UTF-8, not HTML entities for special characters.
-#: ../src/verbs.cpp:2465
-msgid "Rotate selection 90° clockwise"
-msgstr ""
-
-#: ../src/verbs.cpp:2466
-msgid "Rotate 9_0° CCW"
-msgstr ""
-
-#. This is shared between tooltips and statusbar, so they
-#. must use UTF-8, not HTML entities for special characters.
-#: ../src/verbs.cpp:2469
-msgid "Rotate selection 90° counter-clockwise"
-msgstr ""
-
-#: ../src/verbs.cpp:2470
-msgid "Remove _Transformations"
-msgstr ""
-
-#: ../src/verbs.cpp:2471
-msgid "Remove transformations from object"
-msgstr ""
-
-#: ../src/verbs.cpp:2472
-msgid "_Object to Path"
-msgstr ""
-
-#: ../src/verbs.cpp:2473
-msgid "Convert selected object to path"
-msgstr ""
-
-#: ../src/verbs.cpp:2474
-msgid "_Flow into Frame"
-msgstr ""
-
-#: ../src/verbs.cpp:2475
-msgid ""
-"Put text into a frame (path or shape), creating a flowed text linked to the "
-"frame object"
-msgstr ""
-
-#: ../src/verbs.cpp:2476
-msgid "_Unflow"
-msgstr ""
-
-#: ../src/verbs.cpp:2477
-msgid "Remove text from frame (creates a single-line text object)"
-msgstr ""
-
-#: ../src/verbs.cpp:2478
-msgid "_Convert to Text"
-msgstr ""
-
-#: ../src/verbs.cpp:2479
-msgid "Convert flowed text to regular text object (preserves appearance)"
-msgstr ""
-
-#: ../src/verbs.cpp:2481
-msgid "Flip _Horizontal"
-msgstr ""
-
-#: ../src/verbs.cpp:2481
-msgid "Flip selected objects horizontally"
-msgstr ""
-
-#: ../src/verbs.cpp:2484
-msgid "Flip _Vertical"
-msgstr ""
-
-#: ../src/verbs.cpp:2484
-msgid "Flip selected objects vertically"
-msgstr ""
-
-#: ../src/verbs.cpp:2487
-msgid "Apply mask to selection (using the topmost object as mask)"
-msgstr ""
-
-#: ../src/verbs.cpp:2489
-msgid "Edit mask"
-msgstr ""
-
-#: ../src/verbs.cpp:2490 ../src/verbs.cpp:2496
-msgid "_Release"
-msgstr ""
-
-#: ../src/verbs.cpp:2491
-msgid "Remove mask from selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2493
-msgid ""
-"Apply clipping path to selection (using the topmost object as clipping path)"
-msgstr ""
-
-#: ../src/verbs.cpp:2495 ../src/widgets/toolbox.cpp:1446
-msgid "Edit clipping path"
-msgstr ""
-
-#: ../src/verbs.cpp:2497
-msgid "Remove clipping path from selection"
-msgstr ""
-
-#. Tools
-#: ../src/verbs.cpp:2500
-msgid "Select"
-msgstr ""
-
-#: ../src/verbs.cpp:2501
-msgid "Select and transform objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2502
-msgid "Node Edit"
-msgstr ""
-
-#: ../src/verbs.cpp:2503
-msgid "Edit paths by nodes"
-msgstr ""
-
-#: ../src/verbs.cpp:2505
-msgid "Tweak objects by sculpting or painting"
-msgstr ""
-
-#: ../src/verbs.cpp:2507
-msgid "Create rectangles and squares"
-msgstr ""
-
-#: ../src/verbs.cpp:2509
-msgid "Create 3D boxes"
-msgstr ""
-
-#: ../src/verbs.cpp:2511
-msgid "Create circles, ellipses, and arcs"
-msgstr ""
-
-#: ../src/verbs.cpp:2513
-msgid "Create stars and polygons"
-msgstr ""
-
-#: ../src/verbs.cpp:2515
-msgid "Create spirals"
-msgstr ""
-
-#: ../src/verbs.cpp:2517
-msgid "Draw freehand lines"
-msgstr ""
-
-#: ../src/verbs.cpp:2519
-msgid "Draw Bezier curves and straight lines"
-msgstr ""
-
-#: ../src/verbs.cpp:2521
-msgid "Draw calligraphic or brush strokes"
-msgstr ""
-
-#: ../src/verbs.cpp:2523
-msgid "Create and edit text objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2525
-msgid "Create and edit gradients"
-msgstr ""
-
-#: ../src/verbs.cpp:2527
-msgid "Zoom in or out"
-msgstr ""
-
-#: ../src/verbs.cpp:2529
-msgid "Pick colors from image"
-msgstr ""
-
-#: ../src/verbs.cpp:2531
-msgid "Create diagram connectors"
-msgstr ""
-
-#: ../src/verbs.cpp:2533
-msgid "Fill bounded areas"
-msgstr ""
-
-#: ../src/verbs.cpp:2534
-msgid "LPE Edit"
-msgstr ""
-
-#: ../src/verbs.cpp:2535
-msgid "Edit Path Effect parameters"
-msgstr ""
-
-#: ../src/verbs.cpp:2537
-msgid "Erase existing paths"
-msgstr ""
-
-#: ../src/verbs.cpp:2539
-msgid "Do geometric constructions"
-msgstr ""
-
-#. Tool prefs
-#: ../src/verbs.cpp:2541
-msgid "Selector Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2542
-msgid "Open Preferences for the Selector tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2543
-msgid "Node Tool Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2544
-msgid "Open Preferences for the Node tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2545
-msgid "Tweak Tool Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2546
-msgid "Open Preferences for the Tweak tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2547
-msgid "Rectangle Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2548
-msgid "Open Preferences for the Rectangle tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2549
-msgid "3D Box Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2550
-msgid "Open Preferences for the 3D Box tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2551
-msgid "Ellipse Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2552
-msgid "Open Preferences for the Ellipse tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2553
-msgid "Star Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2554
-msgid "Open Preferences for the Star tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2555
-msgid "Spiral Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2556
-msgid "Open Preferences for the Spiral tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2557
-msgid "Pencil Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2558
-msgid "Open Preferences for the Pencil tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2559
-msgid "Pen Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2560
-msgid "Open Preferences for the Pen tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2561
-msgid "Calligraphic Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2562
-msgid "Open Preferences for the Calligraphy tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2563
-msgid "Text Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2564
-msgid "Open Preferences for the Text tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2565
-msgid "Gradient Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2566
-msgid "Open Preferences for the Gradient tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2567
-msgid "Zoom Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2568
-msgid "Open Preferences for the Zoom tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2569
-msgid "Dropper Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2570
-msgid "Open Preferences for the Dropper tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2571
-msgid "Connector Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2572
-msgid "Open Preferences for the Connector tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2573
-msgid "Paint Bucket Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2574
-msgid "Open Preferences for the Paint Bucket tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2575
-msgid "Eraser Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2576
-msgid "Open Preferences for the Eraser tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2577
-msgid "LPE Tool Preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2578
-msgid "Open Preferences for the LPETool tool"
-msgstr ""
-
-#. Zoom/View
-#: ../src/verbs.cpp:2581
-msgid "Zoom In"
-msgstr ""
-
-#: ../src/verbs.cpp:2581
-msgid "Zoom in"
-msgstr ""
-
-#: ../src/verbs.cpp:2582
-msgid "Zoom Out"
-msgstr ""
-
-#: ../src/verbs.cpp:2582
-msgid "Zoom out"
-msgstr ""
-
-#: ../src/verbs.cpp:2583
-msgid "_Rulers"
-msgstr ""
-
-#: ../src/verbs.cpp:2583
-msgid "Show or hide the canvas rulers"
-msgstr ""
-
-#: ../src/verbs.cpp:2584
-msgid "Scroll_bars"
-msgstr ""
-
-#: ../src/verbs.cpp:2584
-msgid "Show or hide the canvas scrollbars"
-msgstr ""
-
-#: ../src/verbs.cpp:2585
-msgid "_Grid"
-msgstr ""
-
-#: ../src/verbs.cpp:2585
-msgid "Show or hide the grid"
-msgstr ""
-
-#: ../src/verbs.cpp:2586
-msgid "G_uides"
-msgstr ""
-
-#: ../src/verbs.cpp:2586
-msgid "Show or hide guides (drag from a ruler to create a guide)"
-msgstr ""
-
-#: ../src/verbs.cpp:2587
-msgid "Toggle snapping on or off"
-msgstr ""
-
-#: ../src/verbs.cpp:2588
-msgid "Nex_t Zoom"
-msgstr ""
-
-#: ../src/verbs.cpp:2588
-msgid "Next zoom (from the history of zooms)"
-msgstr ""
-
-#: ../src/verbs.cpp:2590
-msgid "Pre_vious Zoom"
-msgstr ""
-
-#: ../src/verbs.cpp:2590
-msgid "Previous zoom (from the history of zooms)"
-msgstr ""
-
-#: ../src/verbs.cpp:2592
-msgid "Zoom 1:_1"
-msgstr ""
-
-#: ../src/verbs.cpp:2592
-msgid "Zoom to 1:1"
-msgstr ""
-
-#: ../src/verbs.cpp:2594
-msgid "Zoom 1:_2"
-msgstr ""
-
-#: ../src/verbs.cpp:2594
-msgid "Zoom to 1:2"
-msgstr ""
-
-#: ../src/verbs.cpp:2596
-msgid "_Zoom 2:1"
-msgstr ""
-
-#: ../src/verbs.cpp:2596
-msgid "Zoom to 2:1"
-msgstr ""
-
-#: ../src/verbs.cpp:2599
-msgid "_Fullscreen"
-msgstr ""
-
-#: ../src/verbs.cpp:2599
-msgid "Stretch this document window to full screen"
-msgstr ""
-
-#: ../src/verbs.cpp:2602
-msgid "Toggle _Focus Mode"
-msgstr ""
-
-#: ../src/verbs.cpp:2602
-msgid "Remove excess toolbars to focus on drawing"
-msgstr ""
-
-#: ../src/verbs.cpp:2604
-msgid "Duplic_ate Window"
-msgstr ""
-
-#: ../src/verbs.cpp:2604
-msgid "Open a new window with the same document"
-msgstr ""
-
-#: ../src/verbs.cpp:2606
-msgid "_New View Preview"
-msgstr ""
-
-#: ../src/verbs.cpp:2607
-msgid "New View Preview"
-msgstr ""
-
-#. "view_new_preview"
-#: ../src/verbs.cpp:2609
-msgid "_Normal"
-msgstr ""
-
-#: ../src/verbs.cpp:2610
-msgid "Switch to normal display mode"
-msgstr ""
-
-#: ../src/verbs.cpp:2611
-msgid "No _Filters"
-msgstr ""
-
-#: ../src/verbs.cpp:2612
-msgid "Switch to normal display without filters"
-msgstr ""
-
-#: ../src/verbs.cpp:2613
-msgid "_Outline"
-msgstr ""
-
-#: ../src/verbs.cpp:2614
-msgid "Switch to outline (wireframe) display mode"
-msgstr ""
-
-#: ../src/verbs.cpp:2615
-msgid "_Toggle"
-msgstr ""
-
-#: ../src/verbs.cpp:2616
-msgid "Toggle between normal and outline display modes"
-msgstr ""
-
-#: ../src/verbs.cpp:2618
-msgid "Color-managed view"
-msgstr ""
-
-#: ../src/verbs.cpp:2619
-msgid "Toggle color-managed display for this document window"
-msgstr ""
-
-#: ../src/verbs.cpp:2621
-msgid "Ico_n Preview..."
-msgstr ""
-
-#: ../src/verbs.cpp:2622
-msgid "Open a window to preview objects at different icon resolutions"
-msgstr ""
-
-#: ../src/verbs.cpp:2624
-msgid "Zoom to fit page in window"
-msgstr ""
-
-#: ../src/verbs.cpp:2625
-msgid "Page _Width"
-msgstr ""
-
-#: ../src/verbs.cpp:2626
-msgid "Zoom to fit page width in window"
-msgstr ""
-
-#: ../src/verbs.cpp:2628
-msgid "Zoom to fit drawing in window"
-msgstr ""
-
-#: ../src/verbs.cpp:2630
-msgid "Zoom to fit selection in window"
-msgstr ""
-
-#. Dialogs
-#: ../src/verbs.cpp:2633
-msgid "In_kscape Preferences..."
-msgstr ""
-
-#: ../src/verbs.cpp:2634
-msgid "Edit global Inkscape preferences"
-msgstr ""
-
-#: ../src/verbs.cpp:2635
-msgid "_Document Properties..."
-msgstr ""
-
-#: ../src/verbs.cpp:2636
-msgid "Edit properties of this document (to be saved with the document)"
-msgstr ""
-
-#: ../src/verbs.cpp:2637
-msgid "Document _Metadata..."
-msgstr ""
-
-#: ../src/verbs.cpp:2638
-msgid "Edit document metadata (to be saved with the document)"
-msgstr ""
-
-#: ../src/verbs.cpp:2639
-msgid "_Fill and Stroke..."
-msgstr ""
-
-#: ../src/verbs.cpp:2640
-msgid ""
-"Edit objects' colors, gradients, stroke width, arrowheads, dash patterns..."
-msgstr ""
-
-#. TRANSLATORS: "Swatches" means: color samples
-#: ../src/verbs.cpp:2642
-msgid "S_watches..."
-msgstr ""
-
-#: ../src/verbs.cpp:2643
-msgid "Select colors from a swatches palette"
-msgstr ""
-
-#: ../src/verbs.cpp:2644
-msgid "Transfor_m..."
-msgstr ""
-
-#: ../src/verbs.cpp:2645
-msgid "Precisely control objects' transformations"
-msgstr ""
-
-#: ../src/verbs.cpp:2646
-msgid "_Align and Distribute..."
-msgstr ""
-
-#: ../src/verbs.cpp:2647
-msgid "Align and distribute objects"
-msgstr ""
-
-#: ../src/verbs.cpp:2648
-msgid "Undo _History..."
-msgstr ""
-
-#: ../src/verbs.cpp:2649
-msgid "Undo History"
-msgstr ""
-
-#: ../src/verbs.cpp:2650
-msgid "_Text and Font..."
-msgstr ""
-
-#: ../src/verbs.cpp:2651
-msgid "View and select font family, font size and other text properties"
-msgstr ""
-
-#: ../src/verbs.cpp:2652
-msgid "_XML Editor..."
-msgstr ""
-
-#: ../src/verbs.cpp:2653
-msgid "View and edit the XML tree of the document"
-msgstr ""
-
-#: ../src/verbs.cpp:2654
-msgid "_Find..."
-msgstr ""
-
-#: ../src/verbs.cpp:2655
-msgid "Find objects in document"
-msgstr ""
-
-#: ../src/verbs.cpp:2656
-msgid "Find and _Replace Text..."
-msgstr ""
-
-#: ../src/verbs.cpp:2657
-msgid "Find and replace text in document"
-msgstr ""
-
-#: ../src/verbs.cpp:2658
-msgid "Check Spellin_g..."
-msgstr ""
-
-#: ../src/verbs.cpp:2659
-msgid "Check spelling of text in document"
-msgstr ""
-
-#: ../src/verbs.cpp:2660
-msgid "_Messages..."
-msgstr ""
-
-#: ../src/verbs.cpp:2661
-msgid "View debug messages"
-msgstr ""
-
-#: ../src/verbs.cpp:2662
-msgid "S_cripts..."
-msgstr ""
-
-#: ../src/verbs.cpp:2663
-msgid "Run scripts"
-msgstr ""
-
-#: ../src/verbs.cpp:2664
-msgid "Show/Hide D_ialogs"
-msgstr ""
-
-#: ../src/verbs.cpp:2665
-msgid "Show or hide all open dialogs"
-msgstr ""
-
-#: ../src/verbs.cpp:2666
-msgid "Create Tiled Clones..."
-msgstr ""
-
-#: ../src/verbs.cpp:2667
-msgid ""
-"Create multiple clones of selected object, arranging them into a pattern or "
-"scattering"
-msgstr ""
-
-#: ../src/verbs.cpp:2668
-msgid "_Object Properties..."
-msgstr ""
-
-#: ../src/verbs.cpp:2669
-msgid "Edit the ID, locked and visible status, and other object properties"
-msgstr ""
-
-#. #ifdef WITH_INKBOARD
-#. new DialogVerb(SP_VERB_XMPP_CLIENT, "DialogXmppClient",
-#. N_("_Instant Messaging..."), N_("Jabber Instant Messaging Client"), NULL),
-#. #endif
-#: ../src/verbs.cpp:2674
-msgid "_Input Devices..."
-msgstr ""
-
-#: ../src/verbs.cpp:2675 ../src/verbs.cpp:2677
-msgid "Configure extended input devices, such as a graphics tablet"
-msgstr ""
-
-#: ../src/verbs.cpp:2676
-msgid "_Input Devices (new)..."
-msgstr ""
-
-#: ../src/verbs.cpp:2678
-msgid "_Extensions..."
-msgstr ""
-
-#: ../src/verbs.cpp:2679
-msgid "Query information about extensions"
-msgstr ""
-
-#: ../src/verbs.cpp:2680
-msgid "Layer_s..."
-msgstr ""
-
-#: ../src/verbs.cpp:2681
-msgid "View Layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2682
-msgid "Path Effect Editor..."
-msgstr ""
-
-#: ../src/verbs.cpp:2683
-msgid "Manage, edit, and apply path effects"
-msgstr ""
-
-#: ../src/verbs.cpp:2684
-msgid "Filter Editor..."
-msgstr ""
-
-#: ../src/verbs.cpp:2685
-msgid "Manage, edit, and apply SVG filters"
-msgstr ""
-
-#: ../src/verbs.cpp:2686
-msgid "SVG Font Editor..."
-msgstr ""
-
-#: ../src/verbs.cpp:2687
-msgid "Edit SVG fonts"
-msgstr ""
-
-#. Help
-#: ../src/verbs.cpp:2690
-msgid "About E_xtensions"
-msgstr ""
-
-#: ../src/verbs.cpp:2691
-msgid "Information on Inkscape extensions"
-msgstr ""
-
-#: ../src/verbs.cpp:2692
-msgid "About _Memory"
-msgstr ""
-
-#: ../src/verbs.cpp:2693
-msgid "Memory usage information"
-msgstr ""
-
-#: ../src/verbs.cpp:2694
-msgid "_About Inkscape"
-msgstr ""
-
-#: ../src/verbs.cpp:2695
-msgid "Inkscape version, authors, license"
-msgstr ""
-
-#. new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"),
-#. N_("Distribution terms"), /*"show_license"*/"inkscape_options"),
-#. Tutorials
-#: ../src/verbs.cpp:2700
-msgid "Inkscape: _Basic"
-msgstr ""
-
-#: ../src/verbs.cpp:2701
-msgid "Getting started with Inkscape"
-msgstr ""
-
-#. "tutorial_basic"
-#: ../src/verbs.cpp:2702
-msgid "Inkscape: _Shapes"
-msgstr ""
-
-#: ../src/verbs.cpp:2703
-msgid "Using shape tools to create and edit shapes"
-msgstr ""
-
-#: ../src/verbs.cpp:2704
-msgid "Inkscape: _Advanced"
-msgstr ""
-
-#: ../src/verbs.cpp:2705
-msgid "Advanced Inkscape topics"
-msgstr ""
-
-#. "tutorial_advanced"
-#. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize)
-#: ../src/verbs.cpp:2707
-msgid "Inkscape: T_racing"
-msgstr ""
-
-#: ../src/verbs.cpp:2708
-msgid "Using bitmap tracing"
-msgstr ""
-
-#. "tutorial_tracing"
-#: ../src/verbs.cpp:2709
-msgid "Inkscape: _Calligraphy"
-msgstr ""
-
-#: ../src/verbs.cpp:2710
-msgid "Using the Calligraphy pen tool"
-msgstr ""
-
-#: ../src/verbs.cpp:2711
-msgid "_Elements of Design"
-msgstr ""
-
-#: ../src/verbs.cpp:2712
-msgid "Principles of design in the tutorial form"
-msgstr ""
-
-#. "tutorial_design"
-#: ../src/verbs.cpp:2713
-msgid "_Tips and Tricks"
-msgstr ""
-
-#: ../src/verbs.cpp:2714
-msgid "Miscellaneous tips and tricks"
-msgstr ""
-
-#. "tutorial_tips"
-#. Effect -- renamed Extension
-#: ../src/verbs.cpp:2717
-msgid "Previous Extension"
-msgstr ""
-
-#: ../src/verbs.cpp:2718
-msgid "Repeat the last extension with the same settings"
-msgstr ""
-
-#: ../src/verbs.cpp:2719
-msgid "Previous Extension Settings..."
-msgstr ""
-
-#: ../src/verbs.cpp:2720
-msgid "Repeat the last extension with new settings"
-msgstr ""
-
-#: ../src/verbs.cpp:2724
-msgid "Fit the page to the current selection"
-msgstr ""
-
-#: ../src/verbs.cpp:2726
-msgid "Fit the page to the drawing"
-msgstr ""
-
-#: ../src/verbs.cpp:2728
-msgid ""
-"Fit the page to the current selection or the drawing if there is no selection"
-msgstr ""
-
-#. LockAndHide
-#: ../src/verbs.cpp:2730
-msgid "Unlock All"
-msgstr ""
-
-#: ../src/verbs.cpp:2732
-msgid "Unlock All in All Layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2734
-msgid "Unhide All"
-msgstr ""
-
-#: ../src/verbs.cpp:2736
-msgid "Unhide All in All Layers"
-msgstr ""
-
-#: ../src/verbs.cpp:2740
-msgid "Link an ICC color profile"
-msgstr ""
-
-#: ../src/verbs.cpp:2741
-msgid "Remove Color Profile"
-msgstr ""
-
-#: ../src/verbs.cpp:2742
-msgid "Remove a linked ICC color profile"
-msgstr ""
-
-#: ../src/widgets/dash-selector.cpp:62
-msgid "Dash pattern"
-msgstr ""
-
-#: ../src/widgets/dash-selector.cpp:77
-msgid "Pattern offset"
-msgstr ""
-
-#. display the initial welcome message in the statusbar
-#: ../src/widgets/desktop-widget.cpp:551
-msgid ""
-"<b>Welcome to Inkscape!</b> Use shape or freehand tools to create objects; "
-"use selector (arrow) to move or transform them."
-msgstr ""
-
-#: ../src/widgets/desktop-widget.cpp:615
-#, c-format
-msgid "%s: %d (outline) - Inkscape"
-msgstr ""
-
-#: ../src/widgets/desktop-widget.cpp:617
-#, c-format
-msgid "%s: %d - Inkscape"
-msgstr ""
-
-#: ../src/widgets/desktop-widget.cpp:621
-#, c-format
-msgid "%s (outline) - Inkscape"
-msgstr ""
-
-#: ../src/widgets/desktop-widget.cpp:623
-#, c-format
-msgid "%s - Inkscape"
-msgstr ""
-
-#: ../src/widgets/ege-paint-def.cpp:70 ../src/widgets/ege-paint-def.cpp:92
-#: ../src/widgets/gradient-selector.cpp:167
-msgid "none"
-msgstr ""
-
-#: ../src/widgets/ege-paint-def.cpp:89
-msgid "remove"
-msgstr ""
-
-#: ../src/widgets/fill-style.cpp:283
-msgid "Change fill rule"
-msgstr ""
-
-#: ../src/widgets/fill-style.cpp:323 ../src/widgets/fill-style.cpp:397
-msgid "Set fill color"
-msgstr ""
-
-#: ../src/widgets/fill-style.cpp:466
-msgid "Set gradient on fill"
-msgstr ""
-
-#: ../src/widgets/fill-style.cpp:513
-msgid "Set pattern on fill"
-msgstr ""
-
-#. Family frame
-#: ../src/widgets/font-selector.cpp:157
-msgid "Font family"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. Style frame
-#: ../src/widgets/font-selector.cpp:190
-msgid "fontselector|Style"
-msgstr ""
-
-#: ../src/widgets/font-selector.cpp:228
-msgid "Font size:"
-msgstr ""
-
-#. TRANSLATORS: Test string used in text and font dialog (when no
-#. * text has been entered) to get a preview of the font. Choose
-#. * some representative characters that users of your locale will be
-#. * interested in.
-#: ../src/widgets/font-selector.cpp:641 ../src/widgets/toolbox.cpp:6522
-msgid "AaBbCcIiPpQq12369$€¢?.;/()"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/pservers.html#LinearGradientSpreadMethodAttribute
-#: ../src/widgets/gradient-selector.cpp:161
-msgid ""
-"Whether to fill with flat color beyond the ends of the gradient vector "
-"(spreadMethod=\"pad\"), or repeat the gradient in the same direction "
-"(spreadMethod=\"repeat\"), or repeat the gradient in alternating opposite "
-"directions (spreadMethod=\"reflect\")"
-msgstr ""
-
-#: ../src/widgets/gradient-selector.cpp:171
-msgid "reflected"
-msgstr ""
-
-#: ../src/widgets/gradient-selector.cpp:175
-msgid "direct"
-msgstr ""
-
-#: ../src/widgets/gradient-selector.cpp:183
-msgid "Repeat:"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:155
-msgid "Assign gradient to object"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:189
-msgid "<small>No gradients</small>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:198
-msgid "<small>Nothing selected</small>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:209
-msgid "<small>No gradients in selection</small>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:219
-msgid "<small>Multiple gradients</small>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:467
-msgid "Edit the stops of the gradient"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:527 ../src/widgets/toolbox.cpp:2630
-#: ../src/widgets/toolbox.cpp:2708 ../src/widgets/toolbox.cpp:3039
-#: ../src/widgets/toolbox.cpp:3077 ../src/widgets/toolbox.cpp:3692
-#: ../src/widgets/toolbox.cpp:3716 ../src/widgets/toolbox.cpp:5130
-#: ../src/widgets/toolbox.cpp:5159
-msgid "<b>New:</b>"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:540
-msgid "Create linear gradient"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:554
-msgid "Create radial (elliptic or circular) gradient"
-msgstr ""
-
-#. TODO replace aux_toolbox_space(tbl, AUX_SPACING);
-#: ../src/widgets/gradient-toolbar.cpp:569
-msgid "on"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:582
-msgid "Create gradient in the fill"
-msgstr ""
-
-#: ../src/widgets/gradient-toolbar.cpp:596
-msgid "Create gradient in the stroke"
-msgstr ""
-
-#. FIXME: implement averaging of all parameters for multiple selected
-#. gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
-#: ../src/widgets/gradient-toolbar.cpp:610 ../src/widgets/toolbox.cpp:2632
-#: ../src/widgets/toolbox.cpp:3047 ../src/widgets/toolbox.cpp:3065
-#: ../src/widgets/toolbox.cpp:3694 ../src/widgets/toolbox.cpp:3705
-#: ../src/widgets/toolbox.cpp:5133 ../src/widgets/toolbox.cpp:5144
-msgid "<b>Change:</b>"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:270
-#: ../src/widgets/paint-selector.cpp:885 ../src/widgets/stroke-style.cpp:820
-msgid "No document selected"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:276
-msgid "No gradients in document"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:282
-msgid "No gradient selected"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:547
-msgid "No stops in gradient"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:670
-msgid "Change gradient stop offset"
-msgstr ""
-
-#. TRANSLATORS: "Stop" means: a "phase" of a gradient
-#: ../src/widgets/gradient-vector.cpp:811
-msgid "Add stop"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:814
-msgid "Add another control stop to gradient"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:816
-msgid "Delete stop"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:819
-msgid "Delete current control stop from gradient"
-msgstr ""
-
-#. Label
-#: ../src/widgets/gradient-vector.cpp:830
-#: ../share/extensions/printing-marks.inx.h:9
-msgid "Offset:"
-msgstr ""
-
-#. TRANSLATORS: "Stop" means: a "phase" of a gradient
-#: ../src/widgets/gradient-vector.cpp:875
-msgid "Stop Color"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:905
-msgid "Gradient editor"
-msgstr ""
-
-#: ../src/widgets/gradient-vector.cpp:1192
-msgid "Change gradient stop color"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:181 ../src/widgets/paint-selector.cpp:564
-msgid "No paint"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:183 ../src/widgets/paint-selector.cpp:636
-msgid "Flat color"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:185 ../src/widgets/paint-selector.cpp:707
-msgid "Linear gradient"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:187 ../src/widgets/paint-selector.cpp:710
-msgid "Radial gradient"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:191
-msgid "Unset paint (make it undefined so it can be inherited)"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
-#: ../src/widgets/paint-selector.cpp:203
-msgid ""
-"Any path self-intersections or subpaths create holes in the fill (fill-rule: "
-"evenodd)"
-msgstr ""
-
-#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
-#: ../src/widgets/paint-selector.cpp:214
-msgid ""
-"Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:531
-msgid "No objects"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:542
-msgid "Multiple styles"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:553
-msgid "Paint is undefined"
-msgstr ""
-
-#: ../src/widgets/paint-selector.cpp:984
-msgid ""
-"Use the <b>Node tool</b> to adjust position, scale, and rotation of the "
-"pattern on canvas. Use <b>Object > Pattern > Objects to Pattern</b> to "
-"create a new pattern from selection."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:247
-msgid "Transform by toolbar"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:304
-msgid "Now <b>stroke width</b> is <b>scaled</b> when objects are scaled."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:306
-msgid "Now <b>stroke width</b> is <b>not scaled</b> when objects are scaled."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:317
-msgid ""
-"Now <b>rounded rectangle corners</b> are <b>scaled</b> when rectangles are "
-"scaled."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:319
-msgid ""
-"Now <b>rounded rectangle corners</b> are <b>not scaled</b> when rectangles "
-"are scaled."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:330
-msgid ""
-"Now <b>gradients</b> are <b>transformed</b> along with their objects when "
-"those are transformed (moved, scaled, rotated, or skewed)."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:332
-msgid ""
-"Now <b>gradients</b> remain <b>fixed</b> when objects are transformed "
-"(moved, scaled, rotated, or skewed)."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:343
-msgid ""
-"Now <b>patterns</b> are <b>transformed</b> along with their objects when "
-"those are transformed (moved, scaled, rotated, or skewed)."
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:345
-msgid ""
-"Now <b>patterns</b> remain <b>fixed</b> when objects are transformed (moved, "
-"scaled, rotated, or skewed)."
-msgstr ""
-
-#. four spinbuttons
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/widgets/select-toolbar.cpp:460
-msgid "select_toolbar|X position"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:460
-msgid "select_toolbar|X"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:462
-msgid "Horizontal coordinate of selection"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/widgets/select-toolbar.cpp:468
-msgid "select_toolbar|Y position"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:468
-msgid "select_toolbar|Y"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:470
-msgid "Vertical coordinate of selection"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/widgets/select-toolbar.cpp:476
-msgid "select_toolbar|Width"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:476
-msgid "select_toolbar|W"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:478
-msgid "Width of selection"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:485
-msgid "Lock width and height"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:486
-msgid "When locked, change both width and height by the same proportion"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#: ../src/widgets/select-toolbar.cpp:497
-msgid "select_toolbar|Height"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:497
-msgid "select_toolbar|H"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:499
-msgid "Height of selection"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:536
-msgid "Affect:"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:536
-msgid ""
-"Control whether or not to scale stroke widths, scale rectangle corners, "
-"transform gradient fills, and transform pattern fills with the object"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:555
-msgid "Scale rounded corners"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:566
-msgid "Move gradients"
-msgstr ""
-
-#: ../src/widgets/select-toolbar.cpp:577
-msgid "Move patterns"
-msgstr ""
-
-#: ../src/widgets/sp-color-gtkselector.cpp:50
-msgid "System"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:111
-msgid "CMS"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:220
-#: ../src/widgets/sp-color-scales.cpp:399
-msgid "_R"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:220
-#: ../src/widgets/sp-color-icc-selector.cpp:221
-#: ../src/widgets/sp-color-scales.cpp:402
-msgid "_G"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:220
-#: ../src/widgets/sp-color-scales.cpp:405
-msgid "_B"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:222
-#: ../src/widgets/sp-color-icc-selector.cpp:223
-#: ../src/widgets/sp-color-scales.cpp:425
-msgid "_H"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:222
-#: ../src/widgets/sp-color-icc-selector.cpp:223
-#: ../src/widgets/sp-color-scales.cpp:428
-msgid "_S"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:223
-#: ../src/widgets/sp-color-scales.cpp:431
-msgid "_L"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:224
-#: ../src/widgets/sp-color-icc-selector.cpp:225
-#: ../src/widgets/sp-color-scales.cpp:453
-msgid "_C"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:224
-#: ../src/widgets/sp-color-icc-selector.cpp:225
-#: ../src/widgets/sp-color-scales.cpp:456
-msgid "_M"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:224
-#: ../src/widgets/sp-color-icc-selector.cpp:225
-#: ../src/widgets/sp-color-scales.cpp:459
-msgid "_Y"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:224
-#: ../src/widgets/sp-color-scales.cpp:462
-msgid "_K"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:235
-msgid "Gray"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:238
-#: ../src/widgets/sp-color-icc-selector.cpp:239
-#: ../src/widgets/sp-color-scales.cpp:454
-#: ../src/widgets/sp-color-scales.cpp:455
-msgid "Cyan"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:238
-#: ../src/widgets/sp-color-icc-selector.cpp:239
-#: ../src/widgets/sp-color-scales.cpp:457
-#: ../src/widgets/sp-color-scales.cpp:458
-msgid "Magenta"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:238
-#: ../src/widgets/sp-color-icc-selector.cpp:239
-#: ../src/widgets/sp-color-scales.cpp:460
-#: ../src/widgets/sp-color-scales.cpp:461
-msgid "Yellow"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:296
-msgid "Fix"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:299
-msgid "Fix RGB fallback to match icc-color() value."
-msgstr ""
-
-#. Label
-#: ../src/widgets/sp-color-icc-selector.cpp:380
-#: ../src/widgets/sp-color-scales.cpp:408
-#: ../src/widgets/sp-color-scales.cpp:434
-#: ../src/widgets/sp-color-scales.cpp:465
-#: ../src/widgets/sp-color-wheel-selector.cpp:134
-msgid "_A"
-msgstr ""
-
-#: ../src/widgets/sp-color-icc-selector.cpp:390
-#: ../src/widgets/sp-color-icc-selector.cpp:402
-#: ../src/widgets/sp-color-scales.cpp:409
-#: ../src/widgets/sp-color-scales.cpp:410
-#: ../src/widgets/sp-color-scales.cpp:435
-#: ../src/widgets/sp-color-scales.cpp:436
-#: ../src/widgets/sp-color-scales.cpp:466
-#: ../src/widgets/sp-color-scales.cpp:467
-#: ../src/widgets/sp-color-wheel-selector.cpp:144
-#: ../src/widgets/sp-color-wheel-selector.cpp:156
-msgid "Alpha (opacity)"
-msgstr ""
-
-#: ../src/widgets/sp-color-notebook.cpp:330
-msgid "RGBA_:"
-msgstr ""
-
-#: ../src/widgets/sp-color-notebook.cpp:338
-msgid "Hexadecimal RGBA value of the color"
-msgstr ""
-
-#: ../src/widgets/sp-color-scales.cpp:79
-msgid "RGB"
-msgstr ""
-
-#: ../src/widgets/sp-color-scales.cpp:79
-msgid "HSL"
-msgstr ""
-
-#: ../src/widgets/sp-color-scales.cpp:79
-msgid "CMYK"
-msgstr ""
-
-#: ../src/widgets/sp-color-selector.cpp:64
-msgid "Unnamed"
-msgstr ""
-
-#: ../src/widgets/sp-color-wheel-selector.cpp:61
-msgid "Wheel"
-msgstr ""
-
-#: ../src/widgets/sp-xmlview-attr-list.cpp:46
-msgid "Attribute"
-msgstr ""
-
-#: ../src/widgets/sp-xmlview-attr-list.cpp:47
-#: ../share/extensions/perfectboundcover.inx.h:19
-msgid "Value"
-msgstr ""
-
-#: ../src/widgets/sp-xmlview-content.cpp:169
-msgid "Type text in a text node"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:286 ../src/widgets/stroke-style.cpp:345
-msgid "Set stroke color"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:397
-msgid "Set gradient on stroke"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:441
-msgid "Set pattern on stroke"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:904
-msgid "Set markers"
-msgstr ""
-
-#. TRANSLATORS: only translate "string" in "context|string".
-#. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
-#. Stroke width
-#: ../src/widgets/stroke-style.cpp:1079
-msgid "StrokeWidth|Width:"
-msgstr ""
-
-#. Join type
-#. TRANSLATORS: The line join style specifies the shape to be used at the
-#. corners of paths. It can be "miter", "round" or "bevel".
-#: ../src/widgets/stroke-style.cpp:1117
-msgid "Join:"
-msgstr ""
-
-#. TRANSLATORS: Miter join: joining lines with a sharp (pointed) corner.
-#. For an example, draw a triangle with a large stroke width and modify the
-#. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:1129
-msgid "Miter join"
-msgstr ""
-
-#. TRANSLATORS: Round join: joining lines with a rounded corner.
-#. For an example, draw a triangle with a large stroke width and modify the
-#. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:1139
-msgid "Round join"
-msgstr ""
-
-#. TRANSLATORS: Bevel join: joining lines with a blunted (flattened) corner.
-#. For an example, draw a triangle with a large stroke width and modify the
-#. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:1149
-msgid "Bevel join"
-msgstr ""
-
-#. Miterlimit
-#. TRANSLATORS: Miter limit: only for "miter join", this limits the length
-#. of the sharp "spike" when the lines connect at too sharp an angle.
-#. When two line segments meet at a sharp angle, a miter join results in a
-#. spike that extends well beyond the connection point. The purpose of the
-#. miter limit is to cut off such spikes (i.e. convert them into bevels)
-#. when they become too long.
-#: ../src/widgets/stroke-style.cpp:1161
-msgid "Miter limit:"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1169
-msgid "Maximum length of the miter (in units of stroke width)"
-msgstr ""
-
-#. Cap type
-#. TRANSLATORS: cap type specifies the shape for the ends of lines
-#: ../src/widgets/stroke-style.cpp:1181
-msgid "Cap:"
-msgstr ""
-
-#. TRANSLATORS: Butt cap: the line shape does not extend beyond the end point
-#. of the line; the ends of the line are square
-#: ../src/widgets/stroke-style.cpp:1193
-msgid "Butt cap"
-msgstr ""
-
-#. TRANSLATORS: Round cap: the line shape extends beyond the end point of the
-#. line; the ends of the line are rounded
-#: ../src/widgets/stroke-style.cpp:1201
-msgid "Round cap"
-msgstr ""
-
-#. TRANSLATORS: Square cap: the line shape extends beyond the end point of the
-#. line; the ends of the line are square
-#: ../src/widgets/stroke-style.cpp:1209
-msgid "Square cap"
-msgstr ""
-
-#. Dash
-#: ../src/widgets/stroke-style.cpp:1215
-msgid "Dashes:"
-msgstr ""
-
-#. TRANSLATORS: Path markers are an SVG feature that allows you to attach arbitrary shapes
-#. (arrowheads, bullets, faces, whatever) to the start, end, or middle nodes of a path.
-#: ../src/widgets/stroke-style.cpp:1232
-msgid "Start Markers:"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1234
-msgid "Start Markers are drawn on the first node of a path or shape"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1243
-msgid "Mid Markers:"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1245
-msgid ""
-"Mid Markers are drawn on every node of a path or shape except the first and "
-"last nodes"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1254
-msgid "End Markers:"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1256
-msgid "End Markers are drawn on the last node of a path or shape"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:1605 ../src/widgets/stroke-style.cpp:1701
-msgid "Set stroke style"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:183
-msgid "Color/opacity used for color tweaking"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:187
-msgid "Style of new stars"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:189
-msgid "Style of new rectangles"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:191
-msgid "Style of new 3D boxes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:193
-msgid "Style of new ellipses"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:195
-msgid "Style of new spirals"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:197
-msgid "Style of new paths created by Pencil"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:199
-msgid "Style of new paths created by Pen"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:201
-msgid "Style of new calligraphic strokes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:203 ../src/widgets/toolbox.cpp:205
-msgid "TBD"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:215
-msgid "Style of Paint Bucket fill objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1289
-msgid "Insert node"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1290
-msgid "Insert new nodes into selected segments"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1293
-msgid "Insert"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1301
-msgid "Delete selected nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1311
-msgid "Join endnodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1312
-msgid "Join selected endnodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1315
-msgid "Join"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1322
-msgid "Break nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1323
-msgid "Break path at selected nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1333
-msgid "Join with segment"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1334
-msgid "Join selected endnodes with a new segment"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1344
-msgid "Delete segment between two non-endpoint nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1353
-msgid "Node Cusp"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1354
-msgid "Make selected nodes corner"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1363
-msgid "Node Smooth"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1364
-msgid "Make selected nodes smooth"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1373
-msgid "Node Symmetric"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1374
-msgid "Make selected nodes symmetric"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1383
-msgid "Node Auto"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1384
-msgid "Make selected nodes auto-smooth"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1393
-msgid "Node Line"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1394
-msgid "Make selected segments lines"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1403
-msgid "Node Curve"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1404
-msgid "Make selected segments curves"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1413
-msgid "Show Handles"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1414
-msgid "Show the Bezier handles of selected nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1424
-msgid "Show Outline"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1425
-msgid "Show the outline of the path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1435
-msgid "Next path effect parameter"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1436
-msgid "Show next path effect parameter for editing"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1447
-msgid "Edit the clipping path of the object"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1457
-msgid "Edit mask path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1458
-msgid "Edit the mask of the object"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1472
-msgid "X coordinate:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1472
-msgid "X coordinate of selected node(s)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1490
-msgid "Y coordinate:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:1490
-msgid "Y coordinate of selected node(s)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2028
-msgid "Enable snapping"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2037
-msgid "Bounding box"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2037
-msgid "Snap bounding box corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2046
-msgid "Bounding box edges"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2046
-msgid "Snap to edges of a bounding box"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2055
-msgid "Bounding box corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2055
-msgid "Snap to bounding box corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2064
-msgid "BBox Edge Midpoints"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2064
-msgid "Snap from and to midpoints of bounding box edges"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2074
-msgid "BBox Centers"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2074
-msgid "Snapping from and to centers of bounding boxes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2083
-msgid "Snap nodes or handles"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2091
-msgid "Snap to paths"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2100
-msgid "Path intersections"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2100
-msgid "Snap to path intersections"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2109
-msgid "To nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2109
-msgid "Snap to cusp nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2118
-msgid "Smooth nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2118
-msgid "Snap to smooth nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2127
-msgid "Line Midpoints"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2127
-msgid "Snap from and to midpoints of line segments"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2136
-msgid "Object Centers"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2136
-msgid "Snap from and to centers of objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2145
-msgid "Rotation Centers"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2145
-msgid "Snap from and to an item's rotation center"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2154
-msgid "Page border"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2154
-msgid "Snap to the page border"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2163
-msgid "Snap to grids"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2172
-msgid "Snap to guides"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2377
-msgid "Star: Change number of corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2422
-msgid "Star: Change spoke ratio"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2465
-msgid "Make polygon"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2465
-msgid "Make star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2501
-msgid "Star: Change rounding"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2536
-msgid "Star: Change randomization"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2727
-msgid "Regular polygon (with one handle) instead of a star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2734
-msgid "Star instead of a regular polygon (with one handle)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2755
-msgid "triangle/tri-star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2755
-msgid "square/quad-star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2755
-msgid "pentagon/five-pointed star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2755
-msgid "hexagon/six-pointed star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2758
-msgid "Corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2758
-msgid "Corners:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2758
-msgid "Number of corners of a polygon or star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "thin-ray star"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "pentagram"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "hexagram"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "heptagram"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "octagram"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2771
-msgid "regular polygon"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2774
-msgid "Spoke ratio"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2774
-msgid "Spoke ratio:"
-msgstr ""
-
-#. TRANSLATORS: Tip radius of a star is the distance from the center to the farthest handle.
-#. Base radius is the same for the closest handle.
-#: ../src/widgets/toolbox.cpp:2777
-msgid "Base radius to tip radius ratio"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "stretched"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "twisted"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "slightly pinched"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "NOT rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "slightly rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "visibly rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "well rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795
-msgid "amply rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2795 ../src/widgets/toolbox.cpp:2810
-msgid "blown up"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2798
-msgid "Rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2798
-msgid "Rounded:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2798
-msgid "How much rounded are the corners (0 for sharp)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2810
-msgid "NOT randomized"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2810
-msgid "slightly irregular"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2810
-msgid "visibly randomized"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2810
-msgid "strongly randomized"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2813
-msgid "Randomized"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2813
-msgid "Randomized:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2813
-msgid "Scatter randomly the corners and angles"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2828 ../src/widgets/toolbox.cpp:3767
-#: ../src/widgets/toolbox.cpp:4027 ../src/widgets/toolbox.cpp:7249
-msgid "Defaults"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2829 ../src/widgets/toolbox.cpp:3768
-msgid ""
-"Reset shape parameters to defaults (use Inkscape Preferences > Tools to "
-"change defaults)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:2902
-msgid "Change rectangle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3095
-msgid "W:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3095
-msgid "Width of rectangle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3112
-msgid "H:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3112
-msgid "Height of rectangle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3126 ../src/widgets/toolbox.cpp:3141
-msgid "not rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3129
-msgid "Horizontal radius"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3129
-msgid "Rx:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3129
-msgid "Horizontal radius of rounded corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3144
-msgid "Vertical radius"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3144
-msgid "Ry:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3144
-msgid "Vertical radius of rounded corners"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3163
-msgid "Not rounded"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3164
-msgid "Make corners sharp"
-msgstr ""
-
-#. TODO: use the correct axis here, too
-#: ../src/widgets/toolbox.cpp:3352
-msgid "3D Box: Change perspective (angle of infinite axis)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3422
-msgid "Angle in X direction"
-msgstr ""
-
-#. Translators: PL is short for 'perspective line'
-#: ../src/widgets/toolbox.cpp:3424
-msgid "Angle of PLs in X direction"
-msgstr ""
-
-#. Translators: VP is short for 'vanishing point'
-#: ../src/widgets/toolbox.cpp:3446
-msgid "State of VP in X direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3447
-msgid "Toggle VP in X direction between 'finite' and 'infinite' (=parallel)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3462
-msgid "Angle in Y direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3462
-msgid "Angle Y:"
-msgstr ""
-
-#. Translators: PL is short for 'perspective line'
-#: ../src/widgets/toolbox.cpp:3464
-msgid "Angle of PLs in Y direction"
-msgstr ""
-
-#. Translators: VP is short for 'vanishing point'
-#: ../src/widgets/toolbox.cpp:3485
-msgid "State of VP in Y direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3486
-msgid "Toggle VP in Y direction between 'finite' and 'infinite' (=parallel)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3501
-msgid "Angle in Z direction"
-msgstr ""
-
-#. Translators: PL is short for 'perspective line'
-#: ../src/widgets/toolbox.cpp:3503
-msgid "Angle of PLs in Z direction"
-msgstr ""
-
-#. Translators: VP is short for 'vanishing point'
-#: ../src/widgets/toolbox.cpp:3524
-msgid "State of VP in Z direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3525
-msgid "Toggle VP in Z direction between 'finite' and 'infinite' (=parallel)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3583
-msgid "Change spiral"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3724
-msgid "just a curve"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3724
-msgid "one full revolution"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3727
-msgid "Number of turns"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3727
-msgid "Turns:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3727
-msgid "Number of revolutions"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "circle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "edge is much denser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "edge is denser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "even"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "center is denser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3738
-msgid "center is much denser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3741
-msgid "Divergence"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3741
-msgid "Divergence:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3741
-msgid "How much denser/sparser are outer revolutions; 1 = uniform"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3752
-msgid "starts from center"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3752
-msgid "starts mid-way"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3752
-msgid "starts near edge"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3755
-msgid "Inner radius"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3755
-msgid "Inner radius:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3755
-msgid "Radius of the innermost revolution (relative to the spiral size)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3828
-msgid "Bezier"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3829
-msgid "Create regular Bezier path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3835
-msgid "Spiro"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3836
-msgid "Create Spiro path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3843
-msgid "Zigzag"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3844
-msgid "Create a sequence of straight line segments"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3850
-msgid "Paraxial"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3851
-msgid "Create a sequence of paraxial line segments"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3859
-msgid "Mode of new lines drawn by this tool"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3888
-msgid "Triangle in"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3889
-msgid "Triangle out"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3891
-msgid "From clipboard"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3916 ../src/widgets/toolbox.cpp:3917
-msgid "Shape:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:3916
-msgid "Shape of new paths drawn by this tool"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4001
-msgid "(many nodes, rough)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4001 ../src/widgets/toolbox.cpp:4121
-#: ../src/widgets/toolbox.cpp:4138 ../src/widgets/toolbox.cpp:4341
-#: ../src/widgets/toolbox.cpp:4712 ../src/widgets/toolbox.cpp:4745
-#: ../src/widgets/toolbox.cpp:5731
-msgid "(default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4001
-msgid "(few nodes, smooth)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4004
-msgid "Smoothing:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4004
-msgid "Smoothing: "
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4005
-msgid "How much smoothing (simplifying) is applied to the line"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4028
-msgid ""
-"Reset pencil parameters to defaults (use Inkscape Preferences > Tools to "
-"change defaults)"
-msgstr ""
-
-#. Width
-#: ../src/widgets/toolbox.cpp:4121
-msgid "(pinch tweak)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4121
-msgid "(broad tweak)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4124
-msgid "The width of the tweak area (relative to the visible canvas area)"
-msgstr ""
-
-#. Force
-#: ../src/widgets/toolbox.cpp:4138
-msgid "(minimum force)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4138
-msgid "(maximum force)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4141
-msgid "Force"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4141
-msgid "Force:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4141
-msgid "The force of the tweak action"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4159
-msgid "Move mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4160
-msgid "Move objects in any direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4166
-msgid "Move in/out mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4167
-msgid "Move objects towards cursor; with Shift from cursor"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4173
-msgid "Move jitter mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4174
-msgid "Move objects in random directions"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4180
-msgid "Scale mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4181
-msgid "Shrink objects, with Shift enlarge"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4187
-msgid "Rotate mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4188
-msgid "Rotate objects, with Shift counterclockwise"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4194
-msgid "Duplicate/delete mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4195
-msgid "Duplicate objects, with Shift delete"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4201
-msgid "Push mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4202
-msgid "Push parts of paths in any direction"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4208
-msgid "Shrink/grow mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4209
-msgid "Shrink (inset) parts of paths; with Shift grow (outset)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4215
-msgid "Attract/repel mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4216
-msgid "Attract parts of paths towards cursor; with Shift from cursor"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4222
-msgid "Roughen mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4223
-msgid "Roughen parts of paths"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4229
-msgid "Color paint mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4230
-msgid "Paint the tool's color upon selected objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4236
-msgid "Color jitter mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4237
-msgid "Jitter the colors of selected objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4243
-msgid "Blur mode"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4244
-msgid "Blur selected objects more; with Shift, blur less"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4271
-msgid "Channels:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4282
-msgid "In color mode, act on objects' hue"
-msgstr ""
-
-#. TRANSLATORS: "H" here stands for hue
-#: ../src/widgets/toolbox.cpp:4286
-msgid "H"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4297
-msgid "In color mode, act on objects' saturation"
-msgstr ""
-
-#. TRANSLATORS: "S" here stands for Saturation
-#: ../src/widgets/toolbox.cpp:4301
-msgid "S"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4312
-msgid "In color mode, act on objects' lightness"
-msgstr ""
-
-#. TRANSLATORS: "L" here stands for Lightness
-#: ../src/widgets/toolbox.cpp:4316
-msgid "L"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4327
-msgid "In color mode, act on objects' opacity"
-msgstr ""
-
-#. TRANSLATORS: "O" here stands for Opacity
-#: ../src/widgets/toolbox.cpp:4331
-msgid "O"
-msgstr ""
-
-#. Fidelity
-#: ../src/widgets/toolbox.cpp:4341
-msgid "(rough, simplified)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4341
-msgid "(fine, but many nodes)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4344
-msgid "Fidelity"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4344
-msgid "Fidelity:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4345
-msgid ""
-"Low fidelity simplifies paths; high fidelity preserves path features but may "
-"generate a lot of new nodes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4362 ../src/widgets/toolbox.cpp:4863
-msgid "Pressure"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4363
-msgid "Use the pressure of the input device to alter the force of tweak action"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4543
-msgid "No preset"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4561
-msgid "Save..."
-msgstr ""
-
-#. Width
-#: ../src/widgets/toolbox.cpp:4712 ../src/widgets/toolbox.cpp:5731
-msgid "(hairline)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4712 ../src/widgets/toolbox.cpp:5731
-msgid "(broad stroke)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4715 ../src/widgets/toolbox.cpp:5734
-msgid "Pen Width"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4716
-msgid "The width of the calligraphic pen (relative to the visible canvas area)"
-msgstr ""
-
-#. Thinning
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(speed blows up stroke)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(slight widening)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(constant width)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(slight thinning, default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4729
-msgid "(speed deflates stroke)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4732
-msgid "Stroke Thinning"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4732
-msgid "Thinning:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4733
-msgid ""
-"How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 "
-"makes them broader, 0 makes width independent of velocity)"
-msgstr ""
-
-#. Angle
-#: ../src/widgets/toolbox.cpp:4745
-msgid "(left edge up)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4745
-msgid "(horizontal)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4745
-msgid "(right edge up)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4748
-msgid "Pen Angle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4748
-msgid "Angle:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4749
-msgid ""
-"The angle of the pen's nib (in degrees; 0 = horizontal; has no effect if "
-"fixation = 0)"
-msgstr ""
-
-#. Fixation
-#: ../src/widgets/toolbox.cpp:4763
-msgid "(perpendicular to stroke, \"brush\")"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4763
-msgid "(almost fixed, default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4763
-msgid "(fixed by Angle, \"pen\")"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4766
-msgid "Fixation"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4766
-msgid "Fixation:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4767
-msgid ""
-"Angle behavior (0 = nib always perpendicular to stroke direction, 100 = "
-"fixed angle)"
-msgstr ""
-
-#. Cap Rounding
-#: ../src/widgets/toolbox.cpp:4779
-msgid "(blunt caps, default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4779
-msgid "(slightly bulging)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4779
-msgid "(approximately round)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4779
-msgid "(long protruding caps)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4783
-msgid "Cap rounding"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4783
-msgid "Caps:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4784
-msgid ""
-"Increase to make caps at the ends of strokes protrude more (0 = no caps, 1 = "
-"round caps)"
-msgstr ""
-
-#. Tremor
-#: ../src/widgets/toolbox.cpp:4796
-msgid "(smooth line)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4796
-msgid "(slight tremor)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4796
-msgid "(noticeable tremor)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4796
-msgid "(maximum tremor)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4799
-msgid "Stroke Tremor"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4799
-msgid "Tremor:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4800
-msgid "Increase to make strokes rugged and trembling"
-msgstr ""
-
-#. Wiggle
-#: ../src/widgets/toolbox.cpp:4814
-msgid "(no wiggle)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4814
-msgid "(slight deviation)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4814
-msgid "(wild waves and curls)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4817
-msgid "Pen Wiggle"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4817
-msgid "Wiggle:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4818
-msgid "Increase to make the pen waver and wiggle"
-msgstr ""
-
-#. Mass
-#: ../src/widgets/toolbox.cpp:4831
-msgid "(no inertia)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4831
-msgid "(slight smoothing, default)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4831
-msgid "(noticeable lagging)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4831
-msgid "(maximum inertia)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4834
-msgid "Pen Mass"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4834
-msgid "Mass:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4835
-msgid "Increase to make the pen drag behind, as if slowed by inertia"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4850
-msgid "Trace Background"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4851
-msgid ""
-"Trace the lightness of the background by the width of the pen (white - "
-"minimum width, black - maximum width)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4864
-msgid "Use the pressure of the input device to alter the width of the pen"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4876
-msgid "Tilt"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4877
-msgid "Use the tilt of the input device to alter the angle of the pen's nib"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4890
-msgid "Choose a preset"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:4978
-msgid "Arc: Change start/end"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5042
-msgid "Arc: Change open/closed"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5168
-msgid "Start:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5169
-msgid "The angle (in degrees) from the horizontal to the arc's start point"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5181
-msgid "End:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5182
-msgid "The angle (in degrees) from the horizontal to the arc's end point"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5198
-msgid "Closed arc"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5199
-msgid "Switch to segment (closed shape with two radii)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5205
-msgid "Open Arc"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5206
-msgid "Switch to arc (unclosed shape)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5229
-msgid "Make whole"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5230
-msgid "Make the shape a whole ellipse, not arc or segment"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5306
-msgid "Pick opacity"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5307
-msgid ""
-"Pick both the color and the alpha (transparency) under cursor; otherwise, "
-"pick only the visible color premultiplied by alpha"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5310
-msgid "Pick"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5319
-msgid "Assign opacity"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5320
-msgid ""
-"If alpha was picked, assign it to selection as fill or stroke transparency"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5323
-msgid "Assign"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5509
-msgid "Closed"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5511
-msgid "Open start"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5513
-msgid "Open end"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5515
-msgid "Open both"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5574
-msgid "All inactive"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5575
-msgid "No geometric tool is active"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5608
-msgid "Show limiting bounding box"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5609
-msgid "Show bounding box (used to cut infinite lines)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5620
-msgid "Get limiting bounding box from selection"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5621
-msgid ""
-"Set limiting bounding box (used to cut infinite lines) to the bounding box "
-"of current selection"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5633
-msgid "Choose a line segment type"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5649
-msgid "Display measuring info"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5650
-msgid "Display measuring info for selected items"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5670
-msgid "Open LPE dialog"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5671
-msgid "Open LPE dialog (to adapt parameters numerically)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5735
-msgid "The width of the eraser pen (relative to the visible canvas area)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5753
-msgid "Delete objects touched by the eraser"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5759
-msgid "Cut"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:5760
-msgid "Cut out from objects"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6104
-msgid "Text: Change font family"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6174
-msgid "Text: Change alignment"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6278
-msgid "Text: Change font style"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6325
-msgid "Text: Change orientation"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6439
-msgid "Text: Change font size"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6650
-msgid "Select font family (Alt+X to access)"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6687
-msgid ""
-"This font is currently not installed on your system. Inkscape will use the "
-"default font instead."
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6723
-msgid "Align left"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6745
-msgid "Align right"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6756
-msgid "Justify"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6771
-msgid "Bold"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6782
-msgid "Italic"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6913
-msgid "Change connector spacing"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:6996
-msgid "Avoid"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7006
-msgid "Ignore"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7018
-msgid "Connector Spacing"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7018
-msgid "Spacing:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7019
-msgid "The amount of space left around objects by auto-routing connectors"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7030
-msgid "Graph"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7040
-msgid "Connector Length"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7040
-msgid "Length:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7041
-msgid "Ideal length for connectors when layout is applied"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7053
-msgid "Downwards"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7054
-msgid "Make connectors with end-markers (arrows) point downwards"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7069
-msgid "Do not allow overlapping shapes"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7172
-msgid "Fill by"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7173
-msgid "Fill by:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7185
-msgid "Fill Threshold"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7186
-msgid ""
-"The maximum allowed difference between the clicked pixel and the neighboring "
-"pixels to be counted in the fill"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7211
-msgid "Grow/shrink by"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7211
-msgid "Grow/shrink by:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7212
-msgid ""
-"The amount to grow (positive) or shrink (negative) the created fill path"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7237
-msgid "Close gaps"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7238
-msgid "Close gaps:"
-msgstr ""
-
-#: ../src/widgets/toolbox.cpp:7250
-msgid ""
-"Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools "
-"to change defaults)"
-msgstr ""
-
-#: ../share/extensions/dimension.py:99
-msgid "Unable to process this object. Try changing it into a path first."
-msgstr ""
-
-#. report to the Inkscape console using errormsg
-#: ../share/extensions/draw_from_triangle.py:175
-msgid "Side Length 'a'/px: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:176
-msgid "Side Length 'b'/px: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:177
-msgid "Side Length 'c'/px: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:178
-msgid "Angle 'A'/radians: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:179
-msgid "Angle 'B'/radians: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:180
-msgid "Angle 'C'/radians: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:181
-msgid "Semiperimeter/px: "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.py:182
-msgid "Area /px^2: "
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.py:33
-msgid ""
-"Failed to import the numpy or numpy.linalg modules. These modules are "
-"required by this extension. Please install them and try again."
-msgstr ""
-
-#: ../share/extensions/embedimage.py:74
-msgid ""
-"No xlink:href or sodipodi:absref attributes found, or they do not point to "
-"an existing file! Unable to embed image."
-msgstr ""
-
-#: ../share/extensions/embedimage.py:76
-#, python-format
-msgid "Sorry we could not locate %s"
-msgstr ""
-
-#: ../share/extensions/embedimage.py:101
-#, python-format
-msgid ""
-"%s is not of type image/png, image/jpeg, image/bmp, image/gif, image/tiff, "
-"or image/x-icon"
-msgstr ""
-
-#: ../share/extensions/export_gimp_palette.py:14
-msgid ""
-"The export_gpl.py module requires PyXML. Please download the latest version "
-"from http://pyxml.sourceforge.net/."
-msgstr ""
-
-#: ../share/extensions/extractimage.py:66
-msgid "Unable to find image data."
-msgstr ""
-
-#: ../share/extensions/inkex.py:66
-msgid ""
-"The fantastic lxml wrapper for libxml2 is required by inkex.py and therefore "
-"this extension. Please download and install the latest version from http://"
-"cheeseshop.python.org/pypi/lxml/, or install it through your package manager "
-"by a command like: sudo apt-get install python-lxml"
-msgstr ""
-
-#: ../share/extensions/inkex.py:222
-#, python-format
-msgid "No matching node for expression: %s"
-msgstr ""
-
-#: ../share/extensions/markers_strokepaint.py:41
-#, python-format
-msgid "No style attribute found for id: %s"
-msgstr ""
-
-#: ../share/extensions/markers_strokepaint.py:56
-#, python-format
-msgid "unable to locate marker: %s"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.py:197
-#: ../share/extensions/pathscatter.py:208
-#: ../share/extensions/perspective.py:61
-msgid "This extension requires two selected paths."
-msgstr ""
-
-#: ../share/extensions/pathmodifier.py:229
-#, python-format
-msgid "Please first convert objects to paths! (Got [%s].)"
-msgstr ""
-
-#: ../share/extensions/perspective.py:29
-msgid ""
-"Failed to import the numpy or numpy.linalg modules. These modules are "
-"required by this extension. Please install them and try again. On a Debian-"
-"like system this can be done with the command, sudo apt-get install python-"
-"numpy."
-msgstr ""
-
-#: ../share/extensions/perspective.py:68
-#: ../share/extensions/summersnight.py:43
-#, python-format
-msgid ""
-"The first selected object is of type '%s'.\n"
-"Try using the procedure Path->Object to Path."
-msgstr ""
-
-#: ../share/extensions/perspective.py:74
-#: ../share/extensions/summersnight.py:50
-msgid ""
-"This extension requires that the second selected path be four nodes long."
-msgstr ""
-
-#: ../share/extensions/perspective.py:99
-#: ../share/extensions/summersnight.py:82
-msgid ""
-"The second selected object is a group, not a path.\n"
-"Try using the procedure Object->Ungroup."
-msgstr ""
-
-#: ../share/extensions/perspective.py:101
-#: ../share/extensions/summersnight.py:84
-msgid ""
-"The second selected object is not a path.\n"
-"Try using the procedure Path->Object to Path."
-msgstr ""
-
-#: ../share/extensions/perspective.py:104
-#: ../share/extensions/summersnight.py:87
-msgid ""
-"The first selected object is not a path.\n"
-"Try using the procedure Path->Object to Path."
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:60
-msgid ""
-"Failed to import the numpy module. This module is required by this "
-"extension. Please install it and try again. On a Debian-like system this "
-"can be done with the command 'sudo apt-get install python-numpy'."
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:331
-msgid "No face data found in specified file."
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:332
-msgid "Try selecting \"Edge Specified\" in the Model File tab.\n"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:338
-msgid "No edge data found in specified file."
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:339
-msgid "Try selecting \"Face Specified\" in the Model File tab.\n"
-msgstr ""
-
-#. we cannot generate a list of faces from the edges without a lot of computation
-#: ../share/extensions/polyhedron_3d.py:514
-msgid ""
-"Face Data Not Found. Ensure file contains face data, and check the file is "
-"imported as \"Face-Specified\" under the \"Model File\" tab.\n"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.py:516
-msgid "Internal Error. No view type selected\n"
-msgstr ""
-
-#: ../share/extensions/summersnight.py:36
-msgid ""
-"This extension requires two selected paths. \n"
-"The second path must be exactly four nodes long."
-msgstr ""
-
-#: ../share/extensions/svg_and_media_zip_output.py:125
-#, python-format
-msgid "Could not locate file: %s"
-msgstr ""
-
-#: ../share/extensions/uniconv_output.py:118
-msgid "You need to install the UniConvertor software.\n"
-msgstr ""
-
-#: ../share/extensions/web-set-att.py:52
-#: ../share/extensions/web-transmit-att.py:48
-msgid "You must select at least two elements."
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:1
-msgid "Add Nodes"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:2
-msgid "By max. segment length"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:3
-msgid "By number of segments"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:4
-msgid "Division method"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:5
-msgid "Maximum segment length (px)"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:6
-#: ../share/extensions/convert2dashes.inx.h:2
-#: ../share/extensions/edge3d.inx.h:6 ../share/extensions/flatten.inx.h:3
-#: ../share/extensions/fractalize.inx.h:2
-#: ../share/extensions/interp_att_g.inx.h:10
-#: ../share/extensions/markers_strokepaint.inx.h:2
-#: ../share/extensions/perspective.inx.h:1
-#: ../share/extensions/radiusrand.inx.h:4
-#: ../share/extensions/rubberstretch.inx.h:3
-#: ../share/extensions/straightseg.inx.h:2
-#: ../share/extensions/summersnight.inx.h:2 ../share/extensions/whirl.inx.h:2
-msgid "Modify Path"
-msgstr ""
-
-#: ../share/extensions/addnodes.inx.h:7
-msgid "Number of segments"
-msgstr ""
-
-#: ../share/extensions/ai_input.inx.h:1
-msgid "AI 8.0 Input"
-msgstr ""
-
-#: ../share/extensions/ai_input.inx.h:2
-msgid "Adobe Illustrator 8.0 and below (*.ai)"
-msgstr ""
-
-#: ../share/extensions/ai_input.inx.h:3
-msgid "Open files saved with Adobe Illustrator 8.0 or older"
-msgstr ""
-
-#: ../share/extensions/aisvg.inx.h:1
-msgid "AI SVG Input"
-msgstr ""
-
-#: ../share/extensions/aisvg.inx.h:2
-msgid "Adobe Illustrator SVG (*.ai.svg)"
-msgstr ""
-
-#: ../share/extensions/aisvg.inx.h:3
-msgid "Cleans the cruft out of Adobe Illustrator SVGs before opening"
-msgstr ""
-
-#: ../share/extensions/ccx_input.inx.h:1
-msgid "Corel DRAW Compressed Exchange files (.ccx)"
-msgstr ""
-
-#: ../share/extensions/ccx_input.inx.h:2
-msgid "Corel DRAW Compressed Exchange files input"
-msgstr ""
-
-#: ../share/extensions/ccx_input.inx.h:3
-msgid "Open compressed exchange files saved in Corel DRAW"
-msgstr ""
-
-#: ../share/extensions/cdr_input.inx.h:1
-msgid "Corel DRAW 7-X4 files (*.cdr)"
-msgstr ""
-
-#: ../share/extensions/cdr_input.inx.h:2
-msgid "Corel DRAW Input"
-msgstr ""
-
-#: ../share/extensions/cdr_input.inx.h:3
-msgid "Open files saved in Corel DRAW 7-X4"
-msgstr ""
-
-#: ../share/extensions/cdt_input.inx.h:1
-msgid "Corel DRAW 7-13 template files (.cdt)"
-msgstr ""
-
-#: ../share/extensions/cdt_input.inx.h:2
-msgid "Corel DRAW templates input"
-msgstr ""
-
-#: ../share/extensions/cdt_input.inx.h:3
-msgid "Open files saved in Corel DRAW 7-13"
-msgstr ""
-
-#: ../share/extensions/cgm_input.inx.h:1
-msgid "Computer Graphics Metafile files (.cgm)"
-msgstr ""
-
-#: ../share/extensions/cgm_input.inx.h:2
-msgid "Computer Graphics Metafile files input"
-msgstr ""
-
-#: ../share/extensions/cgm_input.inx.h:3
-msgid "Open Computer Graphics Metafile files"
-msgstr ""
-
-#: ../share/extensions/cmx_input.inx.h:1
-msgid "Corel DRAW Presentation Exchange files (.cmx)"
-msgstr ""
-
-#: ../share/extensions/cmx_input.inx.h:2
-msgid "Corel DRAW Presentation Exchange files input"
-msgstr ""
-
-#: ../share/extensions/cmx_input.inx.h:3
-msgid "Open presentation exchange files saved in Corel DRAW"
-msgstr ""
-
-#: ../share/extensions/color_brighter.inx.h:1
-msgid "Brighter"
-msgstr ""
-
-#: ../share/extensions/color_custom.inx.h:1
-msgid "Blue Function"
-msgstr ""
-
-#: ../share/extensions/color_custom.inx.h:4
-msgid "Green Function"
-msgstr ""
-
-#: ../share/extensions/color_custom.inx.h:5
-msgid "Red Function"
-msgstr ""
-
-#: ../share/extensions/color_darker.inx.h:2
-msgid "Darker"
-msgstr ""
-
-#: ../share/extensions/color_grayscale.inx.h:2
-msgid "Grayscale"
-msgstr ""
-
-#: ../share/extensions/color_lesshue.inx.h:2
-msgid "Less Hue"
-msgstr ""
-
-#: ../share/extensions/color_lesslight.inx.h:2
-msgid "Less Light"
-msgstr ""
-
-#: ../share/extensions/color_lesssaturation.inx.h:2
-msgid "Less Saturation"
-msgstr ""
-
-#: ../share/extensions/color_morehue.inx.h:2
-msgid "More Hue"
-msgstr ""
-
-#: ../share/extensions/color_morelight.inx.h:2
-msgid "More Light"
-msgstr ""
-
-#: ../share/extensions/color_moresaturation.inx.h:2
-msgid "More Saturation"
-msgstr ""
-
-#: ../share/extensions/color_negative.inx.h:2
-msgid "Negative"
-msgstr ""
-
-#: ../share/extensions/color_randomize.inx.h:4
-msgid "Randomize"
-msgstr ""
-
-#: ../share/extensions/color_removeblue.inx.h:2
-msgid "Remove Blue"
-msgstr ""
-
-#: ../share/extensions/color_removegreen.inx.h:2
-msgid "Remove Green"
-msgstr ""
-
-#: ../share/extensions/color_removered.inx.h:2
-msgid "Remove Red"
-msgstr ""
-
-#: ../share/extensions/color_replace.inx.h:1
-msgid "By color (RRGGBB hex):"
-msgstr ""
-
-#: ../share/extensions/color_replace.inx.h:3
-msgid "Replace color"
-msgstr ""
-
-#: ../share/extensions/color_replace.inx.h:4
-msgid "Replace color (RRGGBB hex):"
-msgstr ""
-
-#: ../share/extensions/color_rgbbarrel.inx.h:2
-msgid "RGB Barrel"
-msgstr ""
-
-#: ../share/extensions/convert2dashes.inx.h:1
-msgid "Convert to Dashes"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:1
-msgid "A diagram created with the program Dia"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:2
-msgid "Dia Diagram (*.dia)"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:3
-msgid "Dia Input"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:4
-msgid ""
-"In order to import Dia files, Dia itself must be installed. You can get Dia "
-"at http://live.gnome.org/Dia"
-msgstr ""
-
-#: ../share/extensions/dia.inx.h:5
-msgid ""
-"The dia2svg.sh script should be installed with your Inkscape distribution. "
-"If you do not have it, there is likely to be something wrong with your "
-"Inkscape installation."
-msgstr ""
-
-#: ../share/extensions/dimension.inx.h:1
-msgid "Dimensions"
-msgstr ""
-
-#: ../share/extensions/dimension.inx.h:2 ../share/extensions/dots.inx.h:4
-#: ../share/extensions/handles.inx.h:2 ../share/extensions/measure.inx.h:11
-msgid "Visualize Path"
-msgstr ""
-
-#: ../share/extensions/dimension.inx.h:3
-msgid "X Offset"
-msgstr ""
-
-#: ../share/extensions/dimension.inx.h:4
-msgid "Y Offset"
-msgstr ""
-
-#: ../share/extensions/dots.inx.h:1
-msgid "Dot size"
-msgstr ""
-
-#: ../share/extensions/dots.inx.h:2
-msgid "Font size"
-msgstr ""
-
-#: ../share/extensions/dots.inx.h:3
-msgid "Number Nodes"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:1
-msgid "Altitudes"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:2
-msgid "Angle Bisectors"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:3
-msgid "Centroid"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:4
-msgid "Circumcentre"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:5
-msgid "Circumcircle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:6
-msgid "Common Objects"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:7
-msgid "Contact Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:8
-msgid "Custom Point Specified By:"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:9
-msgid "Custom Points and Options"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:10
-msgid "Draw Circle Around This Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:11
-msgid "Draw From Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:12
-msgid "Draw Isogonal Conjugate"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:13
-msgid "Draw Isotomic Conjugate"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:14
-msgid "Draw Marker At This Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:15
-msgid "Excentral Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:16
-msgid "Excentres"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:17
-msgid "Excircles"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:18
-msgid "Extouch Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:19
-msgid "Gergonne Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:21
-msgid "Incentre"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:22
-msgid "Incircle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:23
-msgid "Nagel Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:24
-msgid "Nine-Point Centre"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:25
-msgid "Nine-Point Circle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:26
-msgid "Orthic Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:27
-msgid "Orthocentre"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:28
-msgid "Point At"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:29
-msgid "Radius / px"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:31
-msgid "Report this triangle's properties"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:32
-msgid "Symmedial Triangle"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:33
-msgid "Symmedian Point"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:34
-msgid "Symmedians"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:35
-msgid ""
-"This extension draws constructions about a triangle defined by the first 3 "
-"nodes of a selected path. You may select one of preset objects or create "
-"your own ones.\n"
-" \n"
-"All units are the Inkscape's pixel unit. Angles are all in radians.\n"
-"You can specify a point by trilinear coordinates or by a triangle centre "
-"function.\n"
-"Enter as functions of the side length or angles.\n"
-"Trilinear elements should be separated by a colon: ':'.\n"
-"Side lengths are represented as 's_a', 's_b' and 's_c'.\n"
-"Angles corresponding to these are 'a_a', 'a_b', and 'a_c'.\n"
-"You can also use the semi-perimeter and area of the triangle as constants. "
-"Write 'area' or 'semiperim' for these.\n"
-"\n"
-"You can use any standard Python math function:\n"
-"ceil(x); fabs(x); floor(x); fmod(x,y); frexp(x); ldexp(x,i); \n"
-"modf(x); exp(x); log(x [, base]); log10(x); pow(x,y); sqrt(x); \n"
-"acos(x); asin(x); atan(x); atan2(y,x); hypot(x,y); \n"
-"cos(x); sin(x); tan(x); degrees(x); radians(x); \n"
-"cosh(x); sinh(x); tanh(x)\n"
-"\n"
-"Also available are the inverse trigonometric functions:\n"
-"sec(x); csc(x); cot(x)\n"
-"\n"
-"You can specify the radius of a circle around a custom point using a "
-"formula, which may also contain the side lengths, angles, etc. You can also "
-"plot the isogonal and isotomic conjugate of the point. Be aware that this "
-"may cause a divide-by-zero error for certain points.\n"
-" "
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:57
-msgid "Triangle Function"
-msgstr ""
-
-#: ../share/extensions/draw_from_triangle.inx.h:58
-msgid "Trilinear Coordinates"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:1
-msgid ""
-"- AutoCAD Release 13 and newer.\n"
-"- assume dxf drawing is in mm.\n"
-"- assume svg drawing is in pixels, at 90 dpi.\n"
-"- layers are preserved only on File->Open, not Import.\n"
-"- limited support for BLOCKS, use AutoCAD Explode Blocks instead, if needed."
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:6
-msgid "AutoCAD DXF R13 (*.dxf)"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:7
-msgid "Character Encoding"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:8
-msgid "DXF Input"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:10
-msgid "Import AutoCAD's Document Exchange Format"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:12
-msgid "Or, use manual scale factor"
-msgstr ""
-
-#: ../share/extensions/dxf_input.inx.h:13
-msgid "Use automatic scaling to size A4"
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.inx.h:1
-msgid ""
-"- AutoCAD Release 13 format.\n"
-"- assume svg drawing is in pixels, at 90 dpi.\n"
-"- assume dxf drawing is in mm.\n"
-"- only LWPOLYLINE and SPLINE elements are supported.\n"
-"- ROBO-Master option is a specialized spline readable only by ROBO-Master "
-"and AutoDesk viewers, not Inkscape."
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.inx.h:6
-msgid "Desktop Cutting Plotter"
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.inx.h:7
-msgid "Desktop Cutting Plotter (R13) (*.dxf)"
-msgstr ""
-
-#: ../share/extensions/dxf_outlines.inx.h:10
-msgid "enable ROBO-Master output"
-msgstr ""
-
-#: ../share/extensions/dxf_output.inx.h:1
-msgid "AutoCAD DXF R12 (*.dxf)"
-msgstr ""
-
-#: ../share/extensions/dxf_output.inx.h:2
-msgid "DXF Output"
-msgstr ""
-
-#: ../share/extensions/dxf_output.inx.h:3
-msgid "DXF file written by pstoedit"
-msgstr ""
-
-#: ../share/extensions/dxf_output.inx.h:4
-msgid "pstoedit must be installed to run; see http://www.pstoedit.net/pstoedit"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:1
-msgid "Blur height"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:2
-msgid "Blur stdDeviation"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:3
-msgid "Blur width"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:4
-msgid "Edge 3D"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:5
-msgid "Illumination Angle"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:7
-msgid "Only black and white"
-msgstr ""
-
-#: ../share/extensions/edge3d.inx.h:8
-msgid "Shades"
-msgstr ""
-
-#: ../share/extensions/embedimage.inx.h:1
-msgid "Embed Images"
-msgstr ""
-
-#: ../share/extensions/embedimage.inx.h:2
-msgid "Embed only selected images"
-msgstr ""
-
-#: ../share/extensions/eps_input.inx.h:1
-msgid "EPS Input"
-msgstr ""
-
-#: ../share/extensions/eqtexsvg.inx.h:1
-msgid "LaTeX formula"
-msgstr ""
-
-#: ../share/extensions/eqtexsvg.inx.h:2
-msgid "LaTeX formula: "
-msgstr ""
-
-#: ../share/extensions/export_gimp_palette.inx.h:1
-msgid "Export as GIMP Palette"
-msgstr ""
-
-#: ../share/extensions/export_gimp_palette.inx.h:2
-msgid "Exports the colors of this document as GIMP Palette"
-msgstr ""
-
-#: ../share/extensions/export_gimp_palette.inx.h:3
-msgid "GIMP Palette (*.gpl)"
-msgstr ""
-
-#: ../share/extensions/extractimage.inx.h:1
-msgid "Extract Image"
-msgstr ""
-
-#: ../share/extensions/extractimage.inx.h:3
-msgid "Note: The file extension is appended automatically."
-msgstr ""
-
-#: ../share/extensions/extractimage.inx.h:4
-msgid "Path to save image"
-msgstr ""
-
-#: ../share/extensions/extrude.inx.h:3
-msgid "Lines"
-msgstr ""
-
-#: ../share/extensions/extrude.inx.h:5
-msgid "Polygons"
-msgstr ""
-
-#: ../share/extensions/fig_input.inx.h:1
-msgid "Open files saved with XFIG"
-msgstr ""
-
-#: ../share/extensions/fig_input.inx.h:2
-msgid "XFIG Graphics File (*.fig)"
-msgstr ""
-
-#: ../share/extensions/fig_input.inx.h:3
-msgid "XFIG Input"
-msgstr ""
-
-#: ../share/extensions/flatten.inx.h:1
-msgid "Flatness"
-msgstr ""
-
-#: ../share/extensions/flatten.inx.h:2
-msgid "Flatten Beziers"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:1
-msgid "Add Guide Lines"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:2
-msgid "Depth"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:3
-msgid "Foldable Box"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:5
-msgid "Paper Thickness"
-msgstr ""
-
-#: ../share/extensions/foldablebox.inx.h:7
-msgid "Tab Proportion"
-msgstr ""
-
-#: ../share/extensions/fractalize.inx.h:1
-msgid "Fractalize"
-msgstr ""
-
-#: ../share/extensions/fractalize.inx.h:3
-msgid "Smoothness"
-msgstr ""
-
-#: ../share/extensions/fractalize.inx.h:4
-msgid "Subdivisions"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:1
-msgid "Calculate first derivative numerically"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:2
-#: ../share/extensions/param_curves.inx.h:1
-msgid "Draw Axes"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:3
-msgid "End X value"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:4
-msgid "First derivative"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:5
-msgid "Function"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:6
-msgid "Function Plotter"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:7
-#: ../share/extensions/param_curves.inx.h:3
-msgid "Functions"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:8
-msgid "Isotropic scaling (uses smallest of width/xrange or height/yrange)"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:9
-msgid "Multiply X range by 2*pi"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:10
-msgid "Number of samples"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:11
-msgid "Range and sampling"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:12
-#: ../share/extensions/param_curves.inx.h:8
-msgid "Remove rectangle"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:14
-msgid ""
-"Select a rectangle before calling the extension,\n"
-"it will determine X and Y scales.\n"
-"\n"
-"With polar coordinates:\n"
-" Start and end X values define the angle range in radians.\n"
-" X scale is set so that left and right edges of rectangle are at +/-1.\n"
-" Isotropic scaling is disabled.\n"
-" First derivative is always determined numerically."
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:22
-#: ../share/extensions/param_curves.inx.h:15
-msgid ""
-"Standard Python math functions are available:\n"
-"\n"
-"ceil(x); fabs(x); floor(x); fmod(x,y); frexp(x); ldexp(x,i); \n"
-"modf(x); exp(x); log(x [, base]); log10(x); pow(x,y); sqrt(x); \n"
-"acos(x); asin(x); atan(x); atan2(y,x); hypot(x,y); \n"
-"cos(x); sin(x); tan(x); degrees(x); radians(x); \n"
-"cosh(x); sinh(x); tanh(x).\n"
-"\n"
-"The constants pi and e are also available."
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:31
-msgid "Start X value"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:32
-#: ../share/extensions/param_curves.inx.h:25
-msgid "Use"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:33
-msgid "Use polar coordinates"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:34
-msgid "Y value of rectangle's bottom"
-msgstr ""
-
-#: ../share/extensions/funcplot.inx.h:35
-msgid "Y value of rectangle's top"
-msgstr ""
-
-#: ../share/extensions/gears.inx.h:1
-msgid "Circular pitch, px"
-msgstr ""
-
-#: ../share/extensions/gears.inx.h:2
-msgid "Gear"
-msgstr ""
-
-#: ../share/extensions/gears.inx.h:3
-msgid "Number of teeth"
-msgstr ""
-
-#: ../share/extensions/gears.inx.h:4
-msgid "Pressure angle"
-msgstr ""
-
-#: ../share/extensions/gimp_xcf.inx.h:1
-msgid "GIMP XCF"
-msgstr ""
-
-#: ../share/extensions/gimp_xcf.inx.h:2
-msgid "GIMP XCF maintaining layers (*.xcf)"
-msgstr ""
-
-#: ../share/extensions/gimp_xcf.inx.h:3
-msgid "Save Grid:"
-msgstr ""
-
-#: ../share/extensions/gimp_xcf.inx.h:4
-msgid "Save Guides:"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:1
-msgid "Border Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:2
-msgid "Cartesian Grid"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:3
-msgid "Halve X Subsubdiv. Frequency after 'n' Subdivs. (log only)"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:4
-msgid "Halve Y Subsubdiv. Frequency after 'n' Subdivs. (log only)"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:5
-msgid "Logarithmic X Subdiv. (Base given by entry above)"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:6
-msgid "Logarithmic Y Subdiv. (Base given by entry above)"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:7
-msgid "Major X Division Spacing [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:8
-msgid "Major X Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:9
-msgid "Major X Divisions"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:10
-msgid "Major Y Division Spacing [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:11
-msgid "Major Y Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:12
-msgid "Major Y Divisions"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:13
-msgid "Minor X Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:14
-msgid "Minor Y Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:16
-msgid "Subdivisions per Major X Division"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:17
-msgid "Subdivisions per Major Y Division"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:18
-msgid "Subminor X Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:19
-msgid "Subminor Y Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:20
-msgid "Subsubdivs. per X Subdivision"
-msgstr ""
-
-#: ../share/extensions/grid_cartesian.inx.h:21
-msgid "Subsubdivs. per Y Subdivision"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:1
-msgid "Angle Divisions"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:2
-msgid "Angle Divisions at Centre"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:3
-msgid "Centre Dot Diameter [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:4
-msgid "Circumferential Label Outset [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:5
-msgid "Circumferential Label Size [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:6
-msgid "Circumferential Labels"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:8
-msgid "Logarithmic Subdiv. (Base given by entry above)"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:9
-msgid "Major Angular Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:10
-msgid "Major Circular Division Spacing [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:11
-msgid "Major Circular Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:12
-msgid "Major Circular Divisions"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:13
-msgid "Minor Angle Division End 'n' Divs. Before Centre"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:14
-msgid "Minor Angular Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:15
-msgid "Minor Circular Division Thickness [px]"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:17
-msgid "Polar Grid"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:19
-msgid "Subdivisions per Major Angular Division"
-msgstr ""
-
-#: ../share/extensions/grid_polar.inx.h:20
-msgid "Subdivisions per Major Circular Division"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:1
-msgid "1/10"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:2
-msgid "1/2"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:3
-msgid "1/3"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:4
-msgid "1/4"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:5
-msgid "1/5"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:6
-msgid "1/6"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:7
-msgid "1/7"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:8
-msgid "1/8"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:9
-msgid "1/9"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:10
-msgid "Custom..."
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:11
-msgid "Delete existing guides"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:12
-msgid "Golden ratio"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:13
-msgid "Guides creator"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:14
-msgid "Horizontal guide each"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:16
-msgid "Preset"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:18
-msgid "Rule-of-third"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:19
-msgid "Start from edges"
-msgstr ""
-
-#: ../share/extensions/guides_creator.inx.h:20
-msgid "Vertical guide each"
-msgstr ""
-
-#: ../share/extensions/handles.inx.h:1
-msgid "Draw Handles"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:1
-msgid "Export to an HP Graphics Language file"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:2
-msgid "HP Graphics Language file (*.hpgl)"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:3
-msgid "HPGL Output"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:4
-msgid "Mirror Y-axis"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:5
-msgid "Plot invisible layers"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:6
-msgid "X-origin (px)"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:7
-msgid "Y-origin (px)"
-msgstr ""
-
-#: ../share/extensions/hpgl_output.inx.h:8
-msgid "hpgl output flatness"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_askaquestion.inx.h:1
-msgid "Ask Us a Question"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_commandline.inx.h:1
-msgid "Command Line Options"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_faq.inx.h:1
-msgid "FAQ"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_keys.inx.h:1
-msgid "Keys and Mouse Reference"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_manual.inx.h:1
-msgid "Inkscape Manual"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_relnotes.inx.h:1
-msgid "New in This Version"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_reportabug.inx.h:1
-msgid "Report a Bug"
-msgstr ""
-
-#: ../share/extensions/inkscape_help_svgspec.inx.h:1
-msgid "SVG 1.1 Specification"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:1
-msgid "Attribute to Interpolate"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:3
-msgid "End Value"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:5
-msgid "Float Number"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:7
-msgid ""
-"If you select \"Other\", you must know the SVG attributes to identify here "
-"this \"other\":"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:8
-msgid "Integer Number"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:9
-msgid "Interpolate Attribute in a group"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:11
-msgid "No Unit"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:13
-msgid "Other"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:14
-msgid "Other Attribute"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:15
-msgid "Other Attribute type"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:17
-msgid "Start Value"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:18
-#: ../share/extensions/polyhedron_3d.inx.h:43
-msgid "Style"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:19
-msgid "Tag"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:20
-msgid ""
-"This effect applies a value for any interpolatable attribute for all "
-"elements inside the selected group or for all elements in a multiple "
-"selection"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:21
-msgid "Transformation"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:22
-msgid "Translate X"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:23
-msgid "Translate Y"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:25
-msgid "Where to apply?"
-msgstr ""
-
-#: ../share/extensions/interp_att_g.inx.h:27
-#: ../share/extensions/web-set-att.inx.h:28
-#: ../share/extensions/web-transmit-att.inx.h:26
-msgid "••••••••••••••••••••••••••••••••••••••••••••••••"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:1
-msgid "Duplicate endpaths"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:2
-msgid "Exponent"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:4
-msgid "Interpolate"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:5
-msgid "Interpolate style"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:6
-msgid "Interpolation method"
-msgstr ""
-
-#: ../share/extensions/interp.inx.h:7
-msgid "Interpolation steps"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:1
-msgid ""
-"\n"
-"The path is generated by applying the \n"
-"substitutions of Rules to the Axiom, \n"
-"Order times. The following commands are \n"
-"recognized in Axiom and Rules:\n"
-"\n"
-"Any of A,B,C,D,E,F: draw forward \n"
-"\n"
-"Any of G,H,I,J,K,L: move forward \n"
-"\n"
-"+: turn left\n"
-"\n"
-"-: turn right\n"
-"\n"
-"|: turn 180 degrees\n"
-"\n"
-"[: remember point\n"
-"\n"
-"]: return to remembered point\n"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:21
-msgid "Axiom"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:22
-msgid "Axiom and rules"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:24
-msgid "L-system"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:25
-msgid "Left angle"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:28
-#, no-c-format
-msgid "Randomize angle (%)"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:30
-#, no-c-format
-msgid "Randomize step (%)"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:32
-msgid "Right angle"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:33
-msgid "Rules"
-msgstr ""
-
-#: ../share/extensions/lindenmayer.inx.h:34
-msgid "Step length (px)"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:1
-msgid "Lorem ipsum"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:2
-msgid "Number of paragraphs"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:3
-msgid "Paragraph length fluctuation (sentences)"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:4
-msgid "Sentences per paragraph"
-msgstr ""
-
-#: ../share/extensions/lorem_ipsum.inx.h:6
-msgid ""
-"This effect creates the standard \"Lorem Ipsum\" pseudolatin placeholder "
-"text. If a flowed text is selected, Lorem Ipsum is added to it; otherwise a "
-"new flowed text object, the size of the page, is created in a new layer."
-msgstr ""
-
-#: ../share/extensions/markers_strokepaint.inx.h:1
-msgid "Color Markers to Match Stroke"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:1
-msgid "Font size [px]"
-msgstr ""
-
-#. <param name="unit" type="string" _gui-text="Unit {km|m|cm|mm|in|px|pt}">mm</param>
-#: ../share/extensions/measure.inx.h:4
-msgid "Length Unit: "
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:5
-msgid "Measure"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:6
-msgid "Measure Path"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:7
-msgid "Offset [px]"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:8
-msgid "Precision"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:9
-msgid "Scale Factor (Drawing:Real Length) = 1:"
-msgstr ""
-
-#: ../share/extensions/measure.inx.h:10
-msgid ""
-"This effect measures the length of the selected path and adds it as a text-"
-"on-path object with the selected unit. The number of significant digits can "
-"be controlled by the Precision field. The Offset field controls the distance "
-"from the text to the path. The Scale factor can be used to make measurements "
-"in scaled drawings. For example, if 1 cm in the drawing equals 2.5 m in the "
-"real world, Scale must be set to 250."
-msgstr ""
-
-#: ../share/extensions/motion.inx.h:1 ../share/extensions/restack.inx.h:1
-msgid "Angle"
-msgstr ""
-
-#: ../share/extensions/motion.inx.h:3
-msgid "Magnitude"
-msgstr ""
-
-#: ../share/extensions/motion.inx.h:4
-msgid "Motion"
-msgstr ""
-
-#: ../share/extensions/outline2svg.inx.h:1
-msgid "ASCII Text with outline markup"
-msgstr ""
-
-#: ../share/extensions/outline2svg.inx.h:2
-msgid "Text Outline File (*.outline)"
-msgstr ""
-
-#: ../share/extensions/outline2svg.inx.h:3
-msgid "Text Outline Input"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:2
-msgid "End t-value"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:4
-msgid "Isotropic scaling (uses smallest: width/xrange or height/yrange)"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:5
-msgid "Multiply t-range by 2*pi"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:6
-msgid "Parametric Curves"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:7
-msgid "Range and Sampling"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:10
-msgid "Samples"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:11
-msgid ""
-"Select a rectangle before calling the extension,\n"
-"it will determine X and Y scales.\n"
-"\n"
-"First derivatives are always determined numerically."
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:24
-msgid "Start t-value"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:26
-msgid "x-Function"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:27
-msgid "x-value of rectangle's left"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:28
-msgid "x-value of rectangle's right"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:29
-msgid "y-Function"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:30
-msgid "y-value of rectangle's bottom"
-msgstr ""
-
-#: ../share/extensions/param_curves.inx.h:31
-msgid "y-value of rectangle's top"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:1
-msgid "Copies of the pattern:"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:2
-msgid "Deformation type:"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:3
-#: ../share/extensions/pathscatter.inx.h:3
-msgid "Duplicate the pattern before deformation"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:6
-msgid "Pattern along Path"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:10
-msgid "Ribbon"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:13
-msgid "Snake"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:14
-#: ../share/extensions/pathscatter.inx.h:11
-msgid "Space between copies:"
-msgstr ""
-
-#: ../share/extensions/pathalongpath.inx.h:16
-msgid ""
-"This effect bends a pattern object along arbitrary \"skeleton\" paths. The "
-"pattern is the topmost object in the selection. (groups of paths/shapes/"
-"clones... allowed)"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:1
-msgid "Cloned"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:2
-msgid "Copied"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:4
-msgid "Follow path orientation"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:6
-msgid "Moved"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:8
-msgid "Original pattern will be:"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:12
-msgid "Stretch spaces to fit skeleton length"
-msgstr ""
-
-#: ../share/extensions/pathscatter.inx.h:14
-msgid ""
-"This effect scatters a pattern along arbitrary \"skeleton\" paths. The "
-"pattern must be the topmost object in the selection. Groups of paths, "
-"shapes, clones are allowed."
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:1
-msgid "Bleed (in)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:2
-msgid "Bond Weight #"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:3
-msgid "Book Height (inches)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:4
-msgid "Book Properties"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:5
-msgid "Book Width (inches)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:6
-msgid "Caliper (inches)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:7
-msgid "Cover"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:8
-msgid "Cover Thickness Measurement"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:9
-msgid "Interior Pages"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:10
-msgid "Note: Bond Weight # calculations are a best-guess estimate."
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:11
-msgid "Number of Pages"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:12
-msgid "Pages Per Inch (PPI)"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:13
-msgid "Paper Thickness Measurement"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:14
-msgid "Perfect-Bound Cover Template"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:16
-msgid "Remove existing guides"
-msgstr ""
-
-#: ../share/extensions/perfectboundcover.inx.h:18
-msgid "Specify Width"
-msgstr ""
-
-#: ../share/extensions/perspective.inx.h:2
-msgid "Perspective"
-msgstr ""
-
-#: ../share/extensions/plt_input.inx.h:1
-msgid "AutoCAD Plot Input"
-msgstr ""
-
-#: ../share/extensions/plt_input.inx.h:2
-#: ../share/extensions/plt_output.inx.h:2
-msgid "HP Graphics Language Plot file [AutoCAD] (*.plt)"
-msgstr ""
-
-#: ../share/extensions/plt_input.inx.h:3
-msgid "Open HPGL plotter files"
-msgstr ""
-
-#: ../share/extensions/plt_output.inx.h:1
-msgid "AutoCAD Plot Output"
-msgstr ""
-
-#: ../share/extensions/plt_output.inx.h:3
-msgid "Save a file for plotters"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:1
-msgid "3D Polyhedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:2
-msgid "Clockwise wound object"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:3
-msgid "Cube"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:4
-msgid "Cuboctahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:5
-msgid "Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:6
-msgid "Draw back-facing polygons"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:7
-msgid "Edge-Specified"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:8
-msgid "Edges"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:9
-msgid "Face-Specified"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:10
-msgid "Faces"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:11
-msgid "Filename:"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:12
-msgid "Fill color, Blue"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:13
-msgid "Fill color, Green"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:14
-msgid "Fill color, Red"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:16
-#, no-c-format
-msgid "Fill opacity, %"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:17
-msgid "Great Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:18
-msgid "Great Stellated Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:19
-msgid "Icosahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:20
-msgid "Light X"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:21
-msgid "Light Y"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:22
-msgid "Light Z"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:23
-msgid "Load from file"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:24
-msgid "Maximum"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:25
-msgid "Mean"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:26
-msgid "Minimum"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:27
-msgid "Model file"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:28
-msgid "Object Type"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:29
-msgid "Object:"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:30
-msgid "Octahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:32
-msgid "Rotate around:"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:33
-msgid "Rotation, degrees"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:34
-msgid "Scaling factor"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:35
-msgid "Shading"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:37
-msgid "Small Triambic Icosahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:38
-msgid "Snub Cube"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:39
-msgid "Snub Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:41
-#, no-c-format
-msgid "Stroke opacity, %"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:42
-msgid "Stroke width, px"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:44
-msgid "Tetrahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:45
-msgid "Then rotate around:"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:46
-msgid "Truncated Cube"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:47
-msgid "Truncated Dodecahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:48
-msgid "Truncated Icosahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:49
-msgid "Truncated Octahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:50
-msgid "Truncated Tetrahedron"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:51
-msgid "Vertices"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:52
-msgid "View"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:53
-msgid "X-Axis"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:54
-msgid "Y-Axis"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:55
-msgid "Z-Axis"
-msgstr ""
-
-#: ../share/extensions/polyhedron_3d.inx.h:56
-msgid "Z-sort faces by:"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:1
-msgid "Bleed Margin"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:2
-msgid "Bleed Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:3
-msgid "Bottom:"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:4
-msgid "Canvas"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:5
-msgid "Color Bars"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:6
-msgid "Crop Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:7
-msgid "Left:"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:8
-msgid "Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:10
-msgid "Page Information"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:11
-msgid "Positioning"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:12
-msgid "Printing Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:13
-msgid "Registration Marks"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:15
-msgid "Right:"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:16
-msgid "Set crop marks to"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:17
-msgid "Star Target"
-msgstr ""
-
-#: ../share/extensions/printing-marks.inx.h:18
-msgid "Top:"
-msgstr ""
-
-#: ../share/extensions/ps_input.inx.h:3
-msgid "PostScript Input"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:1
-msgid "Jitter nodes"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:2
-msgid "Maximum displacement in X, px"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:3
-msgid "Maximum displacement in Y, px"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:5
-msgid "Shift node handles"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:6
-msgid "Shift nodes"
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:7
-msgid ""
-"This effect randomly shifts the nodes (and optionally node handles) of the "
-"selected path."
-msgstr ""
-
-#: ../share/extensions/radiusrand.inx.h:8
-msgid "Use normal distribution"
-msgstr ""
-
-#: ../share/extensions/render_alphabetsoup.inx.h:1
-msgid "Alphabet Soup"
-msgstr ""
-
-#: ../share/extensions/render_alphabetsoup.inx.h:2
-msgid "Random Seed"
-msgstr ""
-
-#: ../share/extensions/render_barcode.inx.h:1
-msgid "Bar Height:"
-msgstr ""
-
-#: ../share/extensions/render_barcode.inx.h:2
-msgid "Barcode"
-msgstr ""
-
-#: ../share/extensions/render_barcode.inx.h:3
-msgid "Barcode Data:"
-msgstr ""
-
-#: ../share/extensions/render_barcode.inx.h:4
-msgid "Barcode Type:"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:2
-msgid "Arbitrary Angle:"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:3
-msgid "Arrange"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:4
-msgid "Bottom"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:5
-msgid "Bottom to Top (90)"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:6
-msgid "Horizontal Point:"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:8
-msgid "Left to Right (0)"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:9
-msgid "Middle"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:10
-msgid "Radial Inward"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:11
-msgid "Radial Outward"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:12
-msgid "Restack"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:13
-msgid "Restack Direction:"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:15
-msgid "Right to Left (180)"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:16
-msgid "Top"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:17
-msgid "Top to Bottom (270)"
-msgstr ""
-
-#: ../share/extensions/restack.inx.h:18
-msgid "Vertical Point:"
-msgstr ""
-
-#: ../share/extensions/rtree.inx.h:1
-msgid "Initial size"
-msgstr ""
-
-#: ../share/extensions/rtree.inx.h:2
-msgid "Minimum size"
-msgstr ""
-
-#: ../share/extensions/rtree.inx.h:3
-msgid "Random Tree"
-msgstr ""
-
-#: ../share/extensions/rubberstretch.inx.h:2
-#, no-c-format
-msgid "Curve (%):"
-msgstr ""
-
-#: ../share/extensions/rubberstretch.inx.h:4
-msgid "Rubber Stretch"
-msgstr ""
-
-#: ../share/extensions/rubberstretch.inx.h:6
-#, no-c-format
-msgid "Strength (%):"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:1
-msgid "Embed rasters"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:2
-msgid "Enable id stripping"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:3
-msgid "Group collapsing"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:5
-msgid "Indent"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:6
-msgid "Keep editor data"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:8
-msgid "Optimized SVG (*.svg)"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:9
-msgid "Optimized SVG Output"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:11
-msgid "Scalable Vector Graphics"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:12
-msgid "Set precision"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:13
-msgid "Simplify colors"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:14
-msgid "Space"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:15
-msgid "Strip xml prolog"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:16
-msgid "Style to xml"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:17
-msgid "Tab"
-msgstr ""
-
-#: ../share/extensions/scour.inx.h:18
-msgid ""
-"This extension optimize the SVG file according to the following options:\n"
-" * Simplify colors: convert all colors to #RRGGBB format.\n"
-" * Style to xml: convert styles into XML attributes.\n"
-" * Group collapsing: collapse <g> elements.\n"
-" * Enable id stripping: remove all un-referenced ID attributes.\n"
-" * Embed rasters: embed rasters as base64-encoded data.\n"
-" * Keep editor data: don't remove Inkscape, Sodipodi or Adobe Illustrator "
-"elements and attributes.\n"
-" * Strip xml prolog: don't output the xml prolog.\n"
-" * Set precision: set number of significant digits (default: 5).\n"
-" * Indent: indentation of the output: none, space, tab (default: space)."
-msgstr ""
-
-#: ../share/extensions/sk1_input.inx.h:1
-msgid "Open files saved in sK1 vector graphics editor"
-msgstr ""
-
-#: ../share/extensions/sk1_input.inx.h:2
-#: ../share/extensions/sk1_output.inx.h:2
-msgid "sK1 vector graphics files (.sk1)"
-msgstr ""
-
-#: ../share/extensions/sk1_input.inx.h:3
-msgid "sK1 vector graphics files input"
-msgstr ""
-
-#: ../share/extensions/sk1_output.inx.h:1
-msgid "File format for use in sK1 vector graphics editor"
-msgstr ""
-
-#: ../share/extensions/sk1_output.inx.h:3
-msgid "sK1 vector graphics files output"
-msgstr ""
-
-#: ../share/extensions/sk_input.inx.h:1
-msgid "A diagram created with the program Sketch"
-msgstr ""
-
-#: ../share/extensions/sk_input.inx.h:2
-msgid "Sketch Diagram (*.sk)"
-msgstr ""
-
-#: ../share/extensions/sk_input.inx.h:3
-msgid "Sketch Input"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:1
-msgid "Gear Placement"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:2
-msgid "Inside (Hypotrochoid)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:3
-msgid "Outside (Epitrochoid)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:4
-msgid "Quality (Default = 16)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:5
-msgid "R - Ring Radius (px)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:7
-msgid "Rotation (deg)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:8
-msgid "Spirograph"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:9
-msgid "d - Pen Radius (px)"
-msgstr ""
-
-#: ../share/extensions/spirograph.inx.h:10
-msgid "r - Gear Radius (px)"
-msgstr ""
-
-#: ../share/extensions/straightseg.inx.h:1
-msgid "Behavior"
-msgstr ""
-
-#: ../share/extensions/straightseg.inx.h:4
-msgid "Straighten Segments"
-msgstr ""
-
-#: ../share/extensions/summersnight.inx.h:1
-msgid "Envelope"
-msgstr ""
-
-#: ../share/extensions/svg2xaml.inx.h:1 ../share/extensions/xaml2svg.inx.h:1
-msgid "Microsoft XAML (*.xaml)"
-msgstr ""
-
-#: ../share/extensions/svg2xaml.inx.h:2 ../share/extensions/xaml2svg.inx.h:2
-msgid "Microsoft's GUI definition format"
-msgstr ""
-
-#: ../share/extensions/svg2xaml.inx.h:3
-msgid "XAML Output"
-msgstr ""
-
-#: ../share/extensions/svg_and_media_zip_output.inx.h:1
-msgid "Compressed Inkscape SVG with media (*.zip)"
-msgstr ""
-
-#: ../share/extensions/svg_and_media_zip_output.inx.h:2
-msgid ""
-"Inkscape's native file format compressed with Zip and including all media "
-"files"
-msgstr ""
-
-#: ../share/extensions/svg_and_media_zip_output.inx.h:3
-msgid "ZIP Output"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:1
-msgid ""
-"(Select your system encoding. More information at http://docs.python.org/"
-"library/codecs.html#standard-encodings)"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:2
-msgid "(The day names list must start from Sunday)"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:3
-msgid "Automatically set size and position"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:4
-msgid "Calendar"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:5
-msgid "Char Encoding"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:7
-msgid "Configuration"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:8
-msgid "Day color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:9
-msgid "Day names"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:10
-msgid "Fill empty day boxes with next month's days"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:11
-msgid ""
-"January February March April May June July August September October November "
-"December"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:13
-msgid "Localization"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:14
-msgid "Monday"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:15
-msgid "Month (0 for all)"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:16
-msgid "Month Margin"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:17
-msgid "Month Width"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:18
-msgid "Month color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:19
-msgid "Month names"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:20
-msgid "Months per line"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:21
-msgid "Next month day color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:23
-msgid "Saturday"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:24
-msgid "Saturday and Sunday"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:25
-msgid "Sun Mon Tue Wed Thu Fri Sat"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:26
-msgid "Sunday"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:27
-msgid "The options below have no influence when the above is checked."
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:28
-msgid "Week start day"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:29
-msgid "Weekday name color "
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:30
-msgid "Weekend"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:31
-msgid "Weekend day color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:32
-msgid "Year (0 for current)"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:33
-msgid "Year color"
-msgstr ""
-
-#: ../share/extensions/svgcalendar.inx.h:34
-msgid "You may change the names for other languages:"
-msgstr ""
-
-#: ../share/extensions/text_braille.inx.h:1
-msgid "Convert to Braille"
-msgstr ""
-
-#: ../share/extensions/text_flipcase.inx.h:2
-msgid "fLIP cASE"
-msgstr ""
-
-#: ../share/extensions/text_lowercase.inx.h:2
-msgid "lowercase"
-msgstr ""
-
-#: ../share/extensions/text_randomcase.inx.h:2
-msgid "rANdOm CasE"
-msgstr ""
-
-#: ../share/extensions/text_replace.inx.h:1
-msgid "By:"
-msgstr ""
-
-#: ../share/extensions/text_replace.inx.h:2
-msgid "Replace text"
-msgstr ""
-
-#: ../share/extensions/text_replace.inx.h:3
-msgid "Replace:"
-msgstr ""
-
-#: ../share/extensions/text_sentencecase.inx.h:1
-msgid "Sentence case"
-msgstr ""
-
-#: ../share/extensions/text_titlecase.inx.h:2
-msgid "Title Case"
-msgstr ""
-
-#: ../share/extensions/text_uppercase.inx.h:2
-msgid "UPPERCASE"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:1
-msgid "Angle a / deg"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:2
-msgid "Angle b / deg"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:3
-msgid "Angle c / deg"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:4
-msgid "From Side a and Angles a, b"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:5
-msgid "From Side c and Angles a, b"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:6
-msgid "From Sides a, b and Angle a"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:7
-msgid "From Sides a, b and Angle c"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:8
-msgid "From Three Sides"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:11
-msgid "Side Length a / px"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:12
-msgid "Side Length b / px"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:13
-msgid "Side Length c / px"
-msgstr ""
-
-#: ../share/extensions/triangle.inx.h:14
-msgid "Triangle"
-msgstr ""
-
-#: ../share/extensions/txt2svg.inx.h:1
-msgid "ASCII Text"
-msgstr ""
-
-#: ../share/extensions/txt2svg.inx.h:2
-msgid "Text File (*.txt)"
-msgstr ""
-
-#: ../share/extensions/txt2svg.inx.h:3
-msgid "Text Input"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:1
-msgid "All selected ones set an attribute in the last one"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:2
-msgid "Attribute to set"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:3
-#: ../share/extensions/web-transmit-att.inx.h:3
-msgid "Compatibility with previews code to this event"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:4
-msgid ""
-"If you want to set more than one attribute, you must separate this with a "
-"space, and only with a space."
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:6
-#: ../share/extensions/web-transmit-att.inx.h:6
-msgid "Run it after"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:7
-#: ../share/extensions/web-transmit-att.inx.h:7
-msgid "Run it before"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:8
-msgid "Set Attributes"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:9
-msgid "Source and destination of setting"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:10
-msgid "The first selected sets an attribute in all others"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:11
-msgid "The list of values must have the same size as the attributes list."
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:12
-#: ../share/extensions/web-transmit-att.inx.h:10
-msgid "The next parameter is useful when you select more than two elements"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:13
-#: ../share/extensions/web-transmit-att.inx.h:11
-msgid ""
-"This effect adds a feature visible (or usable) only on a SVG enabled web "
-"browser (like Firefox)."
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:14
-msgid ""
-"This effect sets one or more attributes in the second selected element, when "
-"a defined event occurs on the first selected element."
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:15
-msgid "Value to set"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:16
-#: ../share/extensions/web-transmit-att.inx.h:14
-msgid "Web"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:17
-msgid "When should the set be done?"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:18
-#: ../share/extensions/web-transmit-att.inx.h:16
-msgid "on activate"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:19
-#: ../share/extensions/web-transmit-att.inx.h:17
-msgid "on blur"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:20
-#: ../share/extensions/web-transmit-att.inx.h:18
-msgid "on click"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:21
-#: ../share/extensions/web-transmit-att.inx.h:19
-msgid "on element loaded"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:22
-#: ../share/extensions/web-transmit-att.inx.h:20
-msgid "on focus"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:23
-#: ../share/extensions/web-transmit-att.inx.h:21
-msgid "on mouse down"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:24
-#: ../share/extensions/web-transmit-att.inx.h:22
-msgid "on mouse move"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:25
-#: ../share/extensions/web-transmit-att.inx.h:23
-msgid "on mouse out"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:26
-#: ../share/extensions/web-transmit-att.inx.h:24
-msgid "on mouse over"
-msgstr ""
-
-#: ../share/extensions/web-set-att.inx.h:27
-#: ../share/extensions/web-transmit-att.inx.h:25
-msgid "on mouse up"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:1
-msgid "All selected ones transmit to the last one"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:2
-msgid "Attribute to transmit"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:4
-msgid ""
-"If you want to transmit more than one attribute, you should separate this "
-"with a space, and only with a space."
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:8
-msgid "Source and destination of transmitting"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:9
-msgid "The first selected transmits to all others"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:12
-msgid ""
-"This effect transmits one or more attributes from the first selected element "
-"to the second when an event occurs."
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:13
-msgid "Transmit Attributes"
-msgstr ""
-
-#: ../share/extensions/web-transmit-att.inx.h:15
-msgid "When to transmit"
-msgstr ""
-
-#: ../share/extensions/whirl.inx.h:1
-msgid "Amount of whirl"
-msgstr ""
-
-#: ../share/extensions/whirl.inx.h:3
-msgid "Rotation is clockwise"
-msgstr ""
-
-#: ../share/extensions/whirl.inx.h:4
-msgid "Whirl"
-msgstr ""
-
-#: ../share/extensions/wmf_input.inx.h:1
-#: ../share/extensions/wmf_output.inx.h:1
-msgid "A popular graphics file format for clipart"
-msgstr ""
-
-#: ../share/extensions/wmf_input.inx.h:2
-#: ../share/extensions/wmf_output.inx.h:2
-msgid "Windows Metafile (*.wmf)"
-msgstr ""
-
-#: ../share/extensions/wmf_input.inx.h:3
-#: ../share/extensions/wmf_output.inx.h:3
-msgid "Windows Metafile Input"
-msgstr ""
-
-#: ../share/extensions/xaml2svg.inx.h:3
-msgid "XAML Input"
-msgstr ""
diff --git a/share/icons/icons.svg b/share/icons/icons.svg
index baa74483a77de2382d8a4091073c7c5f7b760ef4..e8f690ecb7a0cfe15ce2d6d93969d1c5770fb4f8 100644 (file)
--- a/share/icons/icons.svg
+++ b/share/icons/icons.svg
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- inkscape:version="0.47+devel"
+ inkscape:version="0.47pre4 r22446"
sodipodi:docname="icons.svg"
height="540"
width="1250"
version="1.0">
<defs
id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 270 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1250 : 270 : 1"
+ inkscape:persp3d-origin="625 : 180 : 1"
+ id="perspective2930" />
<linearGradient
inkscape:collect="always"
id="linearGradient7836">
style="stop-color:#000000;stop-opacity:1"
offset="1" />
</linearGradient>
+ <inkscape:perspective
+ id="perspective5649"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10585-7"
+ id="linearGradient5209"
+ gradientUnits="userSpaceOnUse"
+ x1="5.6449146"
+ y1="209.98189"
+ x2="13.522233"
+ y2="214.77893" />
+ <linearGradient
+ id="linearGradient10585-7">
+ <stop
+ style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop10587-0" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop10595-2" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient10585-7"
+ y2="214.77893"
+ x2="13.522233"
+ y1="209.98189"
+ x1="5.6449146"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8278-4"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5658-5">
+ <stop
+ style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop5660" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop5662" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient10585-7"
+ y2="214.77893"
+ x2="13.522233"
+ y1="209.98189"
+ x1="5.6449146"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8276-2"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5665">
+ <stop
+ style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop5667-5" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop5669" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient10585-7"
+ y2="214.77893"
+ x2="13.522233"
+ y1="209.98189"
+ x1="5.6449146"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8290-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5672">
+ <stop
+ style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop5674" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop5676" />
+ </linearGradient>
+ <linearGradient
+ xlink:href="#linearGradient10585-7"
+ y2="214.77893"
+ x2="13.522233"
+ y1="209.98189"
+ x1="5.6449146"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8288-3"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5679-3">
+ <stop
+ style="stop-color:#d7d7d7;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop5681" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop5683" />
+ </linearGradient>
</defs>
<sodipodi:namedview
inkscape:guide-bbox="true"
inkscape:window-x="0"
inkscape:window-height="737"
inkscape:window-width="1024"
- inkscape:cy="118.75673"
- inkscape:cx="458.6199"
- inkscape:zoom="1.9420505"
+ inkscape:cy="142.58814"
+ inkscape:cx="464.32174"
+ inkscape:zoom="1.3732371"
gridtolerance="6"
snaptogrid="false"
showgrid="true"
id="path4622"
sodipodi:nodetypes="cccccccc" />
</g>
- <g
- id="connector-ignore"
- inkscape:label="#g8308">
- <g
- id="g5802"
- style="stroke:url(#linearGradient8290);stroke-opacity:1"
- transform="matrix(0.625904,0,0,0.672041,489.16821,222.32729)">
- <rect
- style="color:#000000;fill:none;stroke:url(#linearGradient8288);stroke-width:1.54186893;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
- id="rect5792"
- width="7.9986801"
- height="2.959625"
- x="8.5082998"
- y="211.5502" />
- </g>
- <path
- style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.8469945"
- d="m 494.5,361.4977 6,8"
- id="path7667"
- sodipodi:nodetypes="cc" />
- <g
- transform="matrix(0.689556,0,0,0.507098,484.56529,256.2643)"
- id="g5761"
- style="stroke:#000000;stroke-opacity:1">
- <rect
- style="color:#000000;fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
- id="rect5763"
- width="4.5088892"
- height="2.0118859"
- x="11.50698"
- y="205.5087" />
- </g>
- <use
- xlink:href="#g5761"
- height="1250"
- width="1250"
- transform="matrix(0.997702,0,0,1.018967,8.1086669,2.1407896)"
- id="use5785"
- y="0"
- x="0" />
- </g>
- <g
- id="connector-avoid"
- inkscape:label="#g8327">
- <path
- style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.83060111"
- d="m 517.5,361.4977 5,3 0,5"
- id="path12164"
- sodipodi:nodetypes="ccc" />
- <g
- transform="matrix(0.689556,0,0,0.507098,506.56529,256.2643)"
- id="use5787"
- style="stroke:#000000;stroke-opacity:1">
- <rect
- style="color:#000000;fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
- id="rect8286"
- width="4.5088892"
- height="2.0118859"
- x="11.50698"
- y="205.5087" />
- </g>
- <g
- transform="matrix(0.689556,0,0,0.507098,513.514,265.26677)"
- id="use5790"
- style="stroke:#000000;stroke-opacity:1">
- <rect
- style="color:#000000;fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
- id="rect8282"
- width="4.5088892"
- height="2.0118859"
- x="11.50698"
- y="205.5087" />
- </g>
- <g
- id="use5814"
- style="stroke:url(#linearGradient8278);stroke-opacity:1"
- transform="matrix(0.625904,0,0,0.672041,509.17462,223.32729)">
- <rect
- style="color:#000000;fill:none;stroke:url(#linearGradient8276);stroke-width:1.54186893;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
- id="rect8274"
- width="7.9986801"
- height="2.959625"
- x="8.5082998"
- y="211.5502" />
- </g>
- </g>
<use
xlink:href="#properties_fill"
height="1250"
@@ -20308,4 +20336,222 @@ http://www.inkscape.org/</dc:description>
id="path11005-9"
style="fill:url(#linearGradient7201-4);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient7203-5);stroke-width:1.1095854px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
</g>
+ <g
+ id="connector-ignore"
+ inkscape:label="#g8308"
+ transform="translate(16.916975,1.0009742)">
+ <g
+ id="g5802"
+ style="stroke:url(#linearGradient8290-1);stroke-opacity:1"
+ transform="matrix(0.625904,0,0,0.672041,489.16821,222.32729)">
+ <rect
+ style="fill:none;stroke:url(#linearGradient8288-3);stroke-width:1.54186893;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+ id="rect5792"
+ width="7.9986801"
+ height="2.959625"
+ x="8.5082998"
+ y="211.5502" />
+ </g>
+ <path
+ style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.8469945"
+ d="m 494.5,361.4977 6,8"
+ id="path7667"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="matrix(0.689556,0,0,0.507098,484.56529,256.2643)"
+ id="g5761"
+ style="stroke:#000000;stroke-opacity:1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+ id="rect5763"
+ width="4.5088892"
+ height="2.0118859"
+ x="11.50698"
+ y="205.5087" />
+ </g>
+ <use
+ xlink:href="#g5761"
+ height="1250"
+ width="1250"
+ transform="matrix(0.997702,0,0,1.018967,8.1086669,2.1407896)"
+ id="use5785"
+ y="0"
+ x="0" />
+ </g>
+ <g
+ id="connector-avoid"
+ inkscape:label="#g8327"
+ transform="translate(16.916975,1.0009742)">
+ <path
+ style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.83060111"
+ d="m 517.5,361.4977 5,3 0,5"
+ id="path12164"
+ sodipodi:nodetypes="ccc" />
+ <g
+ transform="matrix(0.689556,0,0,0.507098,506.56529,256.2643)"
+ id="use5787"
+ style="stroke:#000000;stroke-opacity:1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+ id="rect8286"
+ width="4.5088892"
+ height="2.0118859"
+ x="11.50698"
+ y="205.5087" />
+ </g>
+ <g
+ transform="matrix(0.689556,0,0,0.507098,513.514,265.26677)"
+ id="use5790"
+ style="stroke:#000000;stroke-opacity:1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+ id="rect8282"
+ width="4.5088892"
+ height="2.0118859"
+ x="11.50698"
+ y="205.5087" />
+ </g>
+ <g
+ id="use5814"
+ style="stroke:url(#linearGradient8278-4);stroke-opacity:1"
+ transform="matrix(0.625904,0,0,0.672041,509.17462,223.32729)">
+ <rect
+ style="fill:none;stroke:url(#linearGradient8276-2);stroke-width:1.54186893;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+ id="rect8274"
+ width="7.9986801"
+ height="2.959625"
+ x="8.5082998"
+ y="211.5502" />
+ </g>
+ </g>
+ <g
+ id="connector-orthogonal"
+ inkscape:label="#g8327"
+ transform="matrix(-1,0,0,1,1072.9748,1.0009342)">
+ <path
+ style="fill:none;stroke:#3c3c3c;stroke-width:1.00000024px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.83060111"
+ d="m 517.5,360.9977 2,0.002 0,9.00234 3,-0.002"
+ id="path5193"
+ sodipodi:nodetypes="cccc" />
+ <g
+ transform="matrix(0.689556,0,0,0.507098,506.56529,256.2643)"
+ id="g5195"
+ style="stroke:#000000;stroke-opacity:1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+ id="rect5197"
+ width="4.5088892"
+ height="2.0118859"
+ x="11.50698"
+ y="205.5087" />
+ </g>
+ <g
+ transform="matrix(0.689556,0,0,0.507098,513.514,265.26677)"
+ id="g5199"
+ style="stroke:#000000;stroke-opacity:1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.69109905;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+ id="rect5201"
+ width="4.5088892"
+ height="2.0118859"
+ x="11.50698"
+ y="205.5087" />
+ </g>
+ <g
+ id="g5203"
+ style="stroke:url(#linearGradient5209);stroke-opacity:1"
+ transform="matrix(0.625904,0,0,0.672041,509.17462,223.32729)" />
+ </g>
+ <g
+ id="connector-edit"
+ transform="matrix(0.5008045,0,0,0.5008045,547.98616,270.83347)"
+ inkscape:label="#draw_node">
+ <rect
+ y="180"
+ x="-110"
+ height="24"
+ width="24"
+ id="rect5213"
+ style="fill:none;stroke:none;stroke-width:1;marker:none;display:inline" />
+ <rect
+ style="fill:#ff0000;fill-opacity:0.39215692;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.99678624;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+ id="rect5217"
+ width="6.1177049"
+ height="5.9961362"
+ x="-108.26915"
+ y="181.73476" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path5221"
+ d="m -104.98202,185.05712 10.198948,18.1231 6.79927,-6.79616 -16.998218,-11.32694 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99839354;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ transform="translate(-11.083035,0.97828419)"
+ id="connector-new-connpoint"
+ inkscape:label="#g6061">
+ <path
+ sodipodi:end="4.7170453"
+ sodipodi:start="3.1455643"
+ d="m 578.00008,371.96028 c 0.0219,-5.5228 4.51683,-9.98214 10.03964,-9.9602 0.002,10e-6 0.005,2e-5 0.007,3e-5 L 588,372 z"
+ sodipodi:ry="10"
+ sodipodi:rx="10"
+ sodipodi:cy="372"
+ sodipodi:cx="588"
+ id="path6018"
+ style="fill:#b0c5da;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:1.5;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <rect
+ y="360.98068"
+ x="577"
+ height="12.019308"
+ width="12.019308"
+ id="rect5199"
+ style="fill:none;stroke:none;stroke-width:1;marker:none;display:inline" />
+ <rect
+ style="fill:#ff7777;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:0.94117647;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline"
+ id="rect5202"
+ width="3"
+ height="3"
+ x="580"
+ y="363" />
+ </g>
+ <g
+ transform="translate(-11.083035,0.97828419)"
+ id="connector-remove-connpoint"
+ inkscape:label="#g6098">
+ <rect
+ style="fill:none;stroke:none;stroke-width:1;marker:none;display:inline"
+ id="rect6086"
+ width="12.019308"
+ height="12.019308"
+ x="591.5"
+ y="361" />
+ <g
+ transform="matrix(0.5555556,0,0,0.5555556,57.499957,271.55555)"
+ id="g6088">
+ <path
+ id="path6090"
+ d="m 972,171 1,-1 7,0 1,1 0,7 -1,1 -7,0 -1,-1 0,-7 z"
+ style="fill:#aa0000;fill-opacity:1;fill-rule:evenodd;stroke:#aa0000;stroke-width:1.79999971px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:2.15999985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 974,171.85 5,5"
+ id="path6092"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:2.15999985;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 979,171.85 -5,5"
+ id="path6094"
+ sodipodi:nodetypes="cc" />
+ </g>
+ <rect
+ y="363"
+ x="593"
+ height="3"
+ width="3"
+ id="rect6096"
+ style="fill:#ff7777;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:0.94117647;stroke-dasharray:none;stroke-dashoffset:0;marker:none;display:inline" />
+ </g>
</svg>
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1885f56e51d89552f707ea120b687bff432f4383..46c2586d120753936a988cd310213e1e8cb48746 100644 (file)
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
common-context.cpp\r
conditions.cpp\r
conn-avoid-ref.cpp\r
+connection-points.cpp\r
connector-context.cpp\r
console-output-undo-observer.cpp\r
context-fns.cpp\r
diff --git a/src/Makefile_insert b/src/Makefile_insert
index 18beaec37c46d9844c60e841e3c5bfbdaa1f4a60..da49187bacb5dd840bb07828e54ada293a3e9c6c 100644 (file)
--- a/src/Makefile_insert
+++ b/src/Makefile_insert
composite-undo-stack-observer.cpp \
composite-undo-stack-observer.h \
conditions.cpp conditions.h \
+ connection-points.cpp connection-points.h \
conn-avoid-ref.cpp conn-avoid-ref.h \
connection-pool.h \
connector-context.cpp connector-context.h \
diff --git a/src/attributes.cpp b/src/attributes.cpp
index 69b11fae9cf06afcc018b88f4e3f3024b0435dea..d03c3be3e5b785990cab7a57b52acb041e1086c6 100644 (file)
--- a/src/attributes.cpp
+++ b/src/attributes.cpp
{SP_ATTR_SODIPODI_INSENSITIVE, "sodipodi:insensitive"},
{SP_ATTR_SODIPODI_NONPRINTABLE, "sodipodi:nonprintable"},
{SP_ATTR_CONNECTOR_AVOID, "inkscape:connector-avoid"},
+ {SP_ATTR_CONNECTION_POINTS, "inkscape:connection-points"},
{SP_ATTR_STYLE, "style"},
{SP_ATTR_TRANSFORM_CENTER_X, "inkscape:transform-center-x"},
{SP_ATTR_TRANSFORM_CENTER_Y, "inkscape:transform-center-y"},
{SP_ATTR_CONNECTOR_TYPE, "inkscape:connector-type"},
{SP_ATTR_CONNECTION_START, "inkscape:connection-start"},
{SP_ATTR_CONNECTION_END, "inkscape:connection-end"},
+ {SP_ATTR_CONNECTOR_CURVATURE, "inkscape:connector-curvature"},
/* SPRect */
{SP_ATTR_RX, "rx"},
{SP_ATTR_RY, "ry"},
diff --git a/src/attributes.h b/src/attributes.h
index 52f71b203a298bc7d0ac03f7ac537cb3bca7597c..af60b75be4d5782dff445cf7b4722cf6dfd77f1e 100644 (file)
--- a/src/attributes.h
+++ b/src/attributes.h
SP_ATTR_SODIPODI_INSENSITIVE,
SP_ATTR_SODIPODI_NONPRINTABLE,
SP_ATTR_CONNECTOR_AVOID,
+ SP_ATTR_CONNECTION_POINTS,
SP_ATTR_STYLE,
SP_ATTR_TRANSFORM_CENTER_X,
SP_ATTR_TRANSFORM_CENTER_Y,
SP_ATTR_CONNECTOR_TYPE,
SP_ATTR_CONNECTION_START,
SP_ATTR_CONNECTION_END,
+ SP_ATTR_CONNECTOR_CURVATURE,
/* SPRect */
SP_ATTR_RX,
SP_ATTR_RY,
diff --git a/src/conn-avoid-ref.cpp b/src/conn-avoid-ref.cpp
index 43c9c0b66cb652c5fa906f50d7d1f5e1c5ca20b2..c04ad9e49a4cb2d3a0c122653faf16a986bf721e 100644 (file)
--- a/src/conn-avoid-ref.cpp
+++ b/src/conn-avoid-ref.cpp
#include <cstring>
#include <string>
+#include <iostream>
#include "sp-item.h"
+#include "display/curve.h"
+#include "2geom/line.h"
+#include "2geom/crossing.h"
+#include "2geom/convex-cover.h"
+#include "svg/stringstream.h"
#include "conn-avoid-ref.h"
-#include "libavoid/polyutil.h"
+#include "connection-points.h"
+#include "sp-conn-end.h"
+#include "sp-path.h"
#include "libavoid/router.h"
#include "libavoid/connector.h"
+#include "libavoid/geomtypes.h"
#include "xml/node.h"
#include "document.h"
#include "desktop.h"
#include "desktop-handles.h"
#include "sp-namedview.h"
#include "inkscape.h"
+#include <glibmm/i18n.h>
+
using Avoid::Router;
-static Avoid::Polygn avoid_item_poly(SPItem const *item);
+static Avoid::Polygon avoid_item_poly(SPItem const *item);
SPAvoidRef::SPAvoidRef(SPItem *spitem)
SPAvoidRef::~SPAvoidRef()
{
_transformed_connection.disconnect();
- if (shapeRef) {
+
+ // If the document is being destroyed then the router instance
+ // and the ShapeRefs will have been destroyed with it.
+ const bool routerInstanceExists = (item->document->router != NULL);
+
+ if (shapeRef && routerInstanceExists) {
Router *router = shapeRef->router();
- // shapeRef is finalised by delShape,
- // so no memory is lost here.
- router->delShape(shapeRef);
- shapeRef = NULL;
+ router->removeShape(shapeRef);
+ delete shapeRef;
}
+ shapeRef = NULL;
}
}
}
+void print_connection_points(std::map<int, ConnectionPoint>& cp)
+{
+ std::map<int, ConnectionPoint>::iterator i;
+ for (i=cp.begin(); i!=cp.end(); ++i)
+ {
+ const ConnectionPoint& p = i->second;
+ std::cout<<p.id<<" "<<p.type<<" "<<p.pos[Geom::X]<<" "<<p.pos[Geom::Y]<<std::endl;
+ }
+}
+
+void SPAvoidRef::setConnectionPoints(gchar const *value)
+{
+ std::set<int> updates;
+ std::set<int> deletes;
+ std::set<int> seen;
+
+ if (value)
+ {
+ /* Rebuild the connection points list.
+ Update the connectors for which
+ the endpoint has changed.
+ */
+
+ gchar ** strarray = g_strsplit(value, "|", 0);
+ gchar ** iter = strarray;
+
+ while (*iter != NULL) {
+ ConnectionPoint cp;
+ Inkscape::SVGIStringStream is(*iter);
+ is>>cp;
+ cp.type = ConnPointUserDefined;
+
+ /* Mark this connection point as seen, so we can delete
+ the other ones.
+ */
+ seen.insert(cp.id);
+ if ( connection_points.find(cp.id) != connection_points.end() )
+ {
+ /* An already existing connection point.
+ Check to see if changed, and, if it is
+ the case, trigger connector update for
+ the connector attached to this connection
+ point. This is done by adding the
+ connection point to a list of connection
+ points to be updated.
+ */
+ if ( connection_points[cp.id] != cp )
+ // The connection point got updated.
+ // Put it in the update list.
+ updates.insert(cp.id);
+ }
+ connection_points[cp.id] = cp;
+ ++iter;
+ }
+ /* Delete the connection points that didn't appear
+ in the new connection point list.
+ */
+ std::map<int, ConnectionPoint>::iterator it;
+
+ for (it=connection_points.begin(); it!=connection_points.end(); ++it)
+ if ( seen.find(it->first) == seen.end())
+ deletes.insert(it->first);
+ g_strfreev(strarray);
+ }
+ else
+ {
+ /* Delete all the user-defined connection points
+ Actually we do this by adding them to the list
+ of connection points to be deleted.
+ */
+ std::map<int, ConnectionPoint>::iterator it;
+
+ for (it=connection_points.begin(); it!=connection_points.end(); ++it)
+ deletes.insert(it->first);
+ }
+ /* Act upon updates and deletes.
+ */
+ if (deletes.empty() && updates.empty())
+ // Nothing to do, just return.
+ return;
+ // Get a list of attached connectors.
+ GSList* conns = getAttachedConnectors(Avoid::runningToAndFrom);
+ for (GSList *i = conns; i != NULL; i = i->next)
+ {
+ SPPath* path = SP_PATH(i->data);
+ SPConnEnd** connEnds = path->connEndPair.getConnEnds();
+ for (int ix=0; ix<2; ++ix)
+ if (connEnds[ix]->type == ConnPointUserDefined)
+ if (updates.find(connEnds[ix]->id) != updates.end())
+ if (path->connEndPair.isAutoRoutingConn())
+ path->connEndPair.tellLibavoidNewEndpoints();
+ else
+ {
+ }
+ else
+ if (deletes.find(connEnds[ix]->id) != deletes.end())
+ sp_conn_end_detach(path, ix);
+ }
+ g_slist_free(conns);
+ // Remove all deleted connection points
+ if (deletes.size())
+ for (std::set<int>::iterator it = deletes.begin(); it != deletes.end(); ++it)
+ connection_points.erase(*it);
+}
+
+void SPAvoidRef::setConnectionPointsAttrUndoable(const gchar* value, const gchar* action)
+{
+ SPDocument* doc = SP_OBJECT_DOCUMENT(item);
+
+ sp_object_setAttribute( SP_OBJECT(item), "inkscape:connection-points", value, 0 );
+ item->updateRepr();
+ sp_document_ensure_up_to_date(doc);
+ sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR, action);
+}
+
+void SPAvoidRef::addConnectionPoint(ConnectionPoint &cp)
+{
+ Inkscape::SVGOStringStream ostr;
+ bool first = true;
+ int newId = 1;
+ if ( connection_points.size() )
+ {
+ for (IdConnectionPointMap::iterator it = connection_points.begin(); ; )
+ {
+ if ( first )
+ {
+ first = false;
+ ostr<<it->second;
+ }
+ else
+ ostr<<'|'<<it->second;
+ IdConnectionPointMap::iterator prev_it = it;
+ ++it;
+ if ( it == connection_points.end() || prev_it->first + 1 != it->first )
+ {
+ newId = prev_it->first + 1;
+ break;
+ }
+ }
+ }
+ cp.id = newId;
+ if ( first )
+ {
+ first = false;
+ ostr<<cp;
+ }
+ else
+ ostr<<'|'<<cp;
+
+ this->setConnectionPointsAttrUndoable( ostr.str().c_str(), _("Added a new connection point") );
+}
+
+void SPAvoidRef::updateConnectionPoint(ConnectionPoint &cp)
+{
+ Inkscape::SVGOStringStream ostr;
+ IdConnectionPointMap::iterator cp_pos = connection_points.find( cp.id );
+ if ( cp_pos != connection_points.end() )
+ {
+ bool first = true;
+ for (IdConnectionPointMap::iterator it = connection_points.begin(); it != connection_points.end(); ++it)
+ {
+ ConnectionPoint* to_write;
+ if ( it != cp_pos )
+ to_write = &it->second;
+ else
+ to_write = &cp;
+ if ( first )
+ {
+ first = false;
+ ostr<<*to_write;
+ }
+ else
+ ostr<<'|'<<*to_write;
+ }
+ this->setConnectionPointsAttrUndoable( ostr.str().c_str(), _("Moved a connection point") );
+ }
+}
+
+void SPAvoidRef::deleteConnectionPoint(ConnectionPoint &cp)
+{
+ Inkscape::SVGOStringStream ostr;
+ IdConnectionPointMap::iterator cp_pos = connection_points.find( cp.id );
+ if ( cp_pos != connection_points.end() )
+ {
+ bool first = true;
+ for (IdConnectionPointMap::iterator it = connection_points.begin(); it != connection_points.end(); ++it)
+ {
+ if ( it != cp_pos )
+ if ( first )
+ {
+ first = false;
+ ostr<<it->second;
+ }
+ else
+ ostr<<'|'<<it->second;
+ }
+ this->setConnectionPointsAttrUndoable( ostr.str().c_str(), _("Removed a connection point") );
+ }
+}
void SPAvoidRef::handleSettingChange(void)
{
_transformed_connection.disconnect();
if (new_setting) {
- Avoid::Polygn poly = avoid_item_poly(item);
- if (poly.pn > 0) {
+ Avoid::Polygon poly = avoid_item_poly(item);
+ if (poly.size() > 0) {
_transformed_connection = item->connectTransformed(
sigc::ptr_fun(&avoid_item_move));
// Get a unique ID for the item.
GQuark itemID = g_quark_from_string(id);
- shapeRef = new Avoid::ShapeRef(router, itemID, poly);
- Avoid::freePoly(poly);
+ shapeRef = new Avoid::ShapeRef(router, poly, itemID);
router->addShape(shapeRef);
}
{
g_assert(shapeRef);
- // shapeRef is finalised by delShape,
- // so no memory is lost here.
- router->delShape(shapeRef);
+ router->removeShape(shapeRef);
+ delete shapeRef;
shapeRef = NULL;
}
}
return list;
}
+Geom::Point SPAvoidRef::getConnectionPointPos(const int type, const int id)
+{
+ g_assert(item);
+ Geom::Point pos;
+ const Geom::Matrix& transform = sp_item_i2doc_affine(item);
+ SPDesktop *desktop = inkscape_active_desktop();
+
+ if ( type == ConnPointDefault )
+ {
+ // For now, just default to the centre of the item
+ Geom::OptRect bbox = item->getBounds(sp_item_i2doc_affine(item));
+ pos = (bbox) ? bbox->midpoint() : Geom::Point(0, 0);
+ }
+ else
+ {
+ // Get coordinates from the list of connection points
+ // that are attached to the item
+ pos = connection_points[id].pos * transform;
+ }
+
+ return pos;
+}
+
+bool SPAvoidRef::isValidConnPointId( const int type, const int id )
+{
+ if ( type < 0 || type > 1 )
+ return false;
+ else
+ {
+ if ( type == ConnPointDefault )
+ if ( id < 0 || id > 8 )
+ return false;
+ else
+ {
+ }
+ else
+ return connection_points.find( id ) != connection_points.end();
+ }
+
+ return true;
+}
-static Avoid::Polygn avoid_item_poly(SPItem const *item)
+static Avoid::Polygon avoid_item_poly(SPItem const *item)
{
SPDesktop *desktop = inkscape_active_desktop();
g_assert(desktop != NULL);
- Avoid::Polygn poly;
-
// TODO: The right way to do this is to return the convex hull of
// the object, or an approximation in the case of a rounded
// object. Specific SPItems will need to have a new
// some convex hull code, though not NR::ConvexHull as this
// only keeps the bounding box of the convex hull currently.
- // TODO: SPItem::getBounds gives the wrong result for some objects
- // that have internal representations that are updated later
- // by the sp_*_update functions, e.g., text.
- sp_document_ensure_up_to_date(item->document);
+ double spacing = desktop->namedview->connector_spacing;
+
+ // [sommer] If item is a shape, use an approximation of its convex hull
+ {
+ // MJW: Disable this for the moment. It still has some issues.
+ const bool convex_hull_approximation_enabled = false;
+
+ if ( convex_hull_approximation_enabled && SP_IS_SHAPE (item) ) {
+ // The number of points to use for approximation
+ const unsigned NUM_POINTS = 64;
+
+// printf("[sommer] is a shape\n");
+ SPCurve* curve = sp_shape_get_curve (SP_SHAPE (item));
+ if (curve) {
+// printf("[sommer] is a curve\n");
+
+ // apply all transformations
+ Geom::Matrix itd_mat = sp_item_i2doc_affine(item);
+ curve->transform(itd_mat);
+
+ // iterate over all paths
+ const Geom::PathVector& curve_pv = curve->get_pathvector();
+ std::vector<Geom::Point> hull_points;
+ for (Geom::PathVector::const_iterator i = curve_pv.begin(); i != curve_pv.end(); i++) {
+ const Geom::Path& curve_pv_path = *i;
+// printf("[sommer] tracing sub-path\n");
+
+ // FIXME: enlarge path by "desktop->namedview->connector_spacing" (using sp_selected_path_do_offset)?
+
+ // use appropriate fraction of points for this path (first one gets any remainder)
+ unsigned num_points = NUM_POINTS / curve_pv.size();
+ if (i == curve_pv.begin()) num_points += NUM_POINTS - (num_points * curve_pv.size());
+ printf("[sommer] using %d points for this path\n", num_points);
+
+ // sample points along the path for approximation of convex hull
+ for (unsigned n = 0; n < num_points; n++) {
+ double at = curve_pv_path.size() / static_cast<double>(num_points) * n;
+ Geom::Point pt = curve_pv_path.pointAt(at);
+ hull_points.push_back(pt);
+ }
+ }
+
+ curve->unref();
+
+ // create convex hull from all sampled points
+ Geom::ConvexHull hull(hull_points);
+
+ // store expanded convex hull in Avoid::Polygn
+ unsigned n = 0;
+ Avoid::Polygon poly;
+ const Geom::Point& old_pt = *hull.boundary.begin();
+
+ Geom::Line hull_edge(*hull.boundary.begin(), *(hull.boundary.begin()+1));
+ Geom::Line parallel_hull_edge;
+ parallel_hull_edge.origin(hull_edge.origin()+hull_edge.versor().ccw()*spacing);
+ parallel_hull_edge.versor(hull_edge.versor());
+ Geom::Line bisector = Geom::make_angle_bisector_line( *(hull.boundary.end()), *hull.boundary.begin(),
+ *(hull.boundary.begin()+1));
+ Geom::OptCrossing int_pt = Geom::intersection(parallel_hull_edge, bisector);
+
+ if (int_pt)
+ {
+ Avoid::Point avoid_pt((parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::X],
+ (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::Y]);
+// printf("[sommer] %f, %f\n", old_pt[Geom::X], old_pt[Geom::Y]);
+/* printf("[sommer] %f, %f\n", (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::X],
+ (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::Y]);*/
+ poly.ps.push_back(avoid_pt);
+ }
+ for (std::vector<Geom::Point>::const_iterator i = hull.boundary.begin() + 1; i != hull.boundary.end(); i++, n++) {
+ const Geom::Point& old_pt = *i;
+ Geom::Line hull_edge(*i, *(i+1));
+ Geom::Line parallel_hull_edge;
+ parallel_hull_edge.origin(hull_edge.origin()+hull_edge.versor().ccw()*spacing);
+ parallel_hull_edge.versor(hull_edge.versor());
+ Geom::Line bisector = Geom::make_angle_bisector_line( *(i-1), *i, *(i+1));
+ Geom::OptCrossing intersect_pt = Geom::intersection(parallel_hull_edge, bisector);
+
+ if (int_pt)
+ {
+ Avoid::Point avoid_pt((parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::X],
+ (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::Y]);
+/* printf("[sommer] %f, %f\n", old_pt[Geom::X], old_pt[Geom::Y]);
+ printf("[sommer] %f, %f\n", (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::X],
+ (parallel_hull_edge.origin()+parallel_hull_edge.versor()*int_pt->ta)[Geom::Y]);*/
+ poly.ps.push_back(avoid_pt);
+ }
+ }
+
+
+ return poly;
+ }// else printf("[sommer] is no curve\n");
+ }// else printf("[sommer] is no shape\n");
+ }
Geom::OptRect rHull = item->getBounds(sp_item_i2doc_affine(item));
if (!rHull) {
- return Avoid::newPoly(0);
+ return Avoid::Polygon();
}
- double spacing = desktop->namedview->connector_spacing;
-
// Add a little buffer around the edge of each object.
Geom::Rect rExpandedHull = *rHull;
rExpandedHull.expandBy(spacing);
- poly = Avoid::newPoly(4);
+ Avoid::Polygon poly(4);
- for (unsigned n = 0; n < 4; ++n) {
+ for (size_t n = 0; n < 4; ++n) {
Geom::Point hullPoint = rExpandedHull.corner(n);
poly.ps[n].x = hullPoint[Geom::X];
poly.ps[n].y = hullPoint[Geom::Y];
g_assert(shapeRef);
Router *router = moved_item->document->router;
- Avoid::Polygn poly = avoid_item_poly(moved_item);
- if (poly.pn > 0) {
- router->moveShape(shapeRef, &poly);
- Avoid::freePoly(poly);
+ Avoid::Polygon poly = avoid_item_poly(moved_item);
+ if (!poly.empty()) {
+ router->moveShape(shapeRef, poly);
}
}
diff --git a/src/conn-avoid-ref.h b/src/conn-avoid-ref.h
index d34d8ca2e644be593e20589368326718dd51598a..5dff8dd381dcde6fcff5db0f54a0f7491e35cf18 100644 (file)
--- a/src/conn-avoid-ref.h
+++ b/src/conn-avoid-ref.h
struct SPDesktop;
struct SPItem;
+struct ConnectionPoint;
+typedef std::map<int, ConnectionPoint> IdConnectionPointMap;
namespace Avoid { class ShapeRef; }
class SPAvoidRef {
// libavoid's internal representation of the item.
Avoid::ShapeRef *shapeRef;
+ // Used for holding connection points for item
+ IdConnectionPointMap connection_points;
+
void setAvoid(char const *value);
+ void setConnectionPoints(gchar const *value);
+ void addConnectionPoint(ConnectionPoint &cp);
+ void updateConnectionPoint(ConnectionPoint &cp);
+ void deleteConnectionPoint(ConnectionPoint &cp);
void handleSettingChange(void);
-
+
// Returns a list of SPItems of all connectors/shapes attached to
// this object. Pass one of the following for 'type':
// Avoid::runningTo
// Avoid::runningToAndFrom
GSList *getAttachedShapes(const unsigned int type);
GSList *getAttachedConnectors(const unsigned int type);
+ Geom::Point getConnectionPointPos(const int type, const int id);
+
+ bool isValidConnPointId( const int type, const int id );
private:
SPItem *item;
// A sigc connection for transformed signal.
sigc::connection _transformed_connection;
+ void setConnectionPointsAttrUndoable(const gchar* value, const gchar* action);
};
extern GSList *get_avoided_items(GSList *list, SPObject *from,
extern void init_avoided_shape_geometry(SPDesktop *desktop);
static const double defaultConnSpacing = 3.0;
+static const double defaultConnCurvature = 3.0;
#endif /* !SEEN_CONN_AVOID_REF */
index 2131bdced797be78964e0e798c769ba9535f06d7..228c81d29e0bdc26365ebe694bf4600778f901f3 100644 (file)
* Authors:
* Michael Wybrow <mjwybrow@users.sourceforge.net>
*
- * Copyright (C) 2005 Michael Wybrow
+ * Copyright (C) 2005-2008 Michael Wybrow
+ * Copyright (C) 2009 Monash University
*
* Released under GNU GPL, read the file 'COPYING' for more information
*
* TODO:
- * o Have shapes avoid convex hulls of objects, rather than their
- * bounding box. Possibly implement the unfinished ConvexHull
- * class in libnr.
- * (HOWEVER, using the convex hull C of a shape S does the wrong thing if a
- * connector starts outside of S but inside C, or if the best route around
- * an object involves going inside C but without entering S.)
- * o Draw connectors to shape edges rather than bounding box.
* o Show a visual indicator for objects with the 'avoid' property set.
* o Allow user to change a object between a path and connector through
* the interface.
* o Create an interface for setting markers (arrow heads).
* o Better distinguish between paths and connectors to prevent problems
- * in the node tool and paths accidently being turned into connectors
+ * in the node tool and paths accidentally being turned into connectors
* in the connector tool. Perhaps have a way to convert between.
* o Only call libavoid's updateEndPoint as required. Currently we do it
* for both endpoints, even if only one is moving.
* o Allow user-placeable connection points.
* o Deal sanely with connectors with both endpoints attached to the
* same connection point, and drawing of connectors attaching
- * overlaping shapes (currently tries to adjust connector to be
+ * overlapping shapes (currently tries to adjust connector to be
* outside both bounding boxes).
* o Fix many special cases related to connectors updating,
* e.g., copying a couple of shapes and a connector that are
* one of the other contexts.
* o Cope with shapes whose ids change when they have attached
* connectors.
- * o gobble_motion_events(GDK_BUTTON1_MASK)?;
+ * o During dragging motion, gobble up to and use the final motion event.
+ * Gobbling away all duplicates after the current can occasionally result
+ * in the path lagging behind the mouse cursor if it is no longer being
+ * dragged.
+ * o Fix up libavoid's representation after undo actions. It doesn't see
+ * any transform signals and hence doesn't know shapes have moved back to
+ * there earlier positions.
+ * o Decide whether drawing/editing mode should be an Inkscape preference
+ * or the connector tool should always start in drawing mode.
+ * o Correct the problem with switching to the select tool when pressing
+ * space bar (there are moments when it refuses to do so).
+ *
+ * ----------------------------------------------------------------------------
+ *
+ * mjwybrow's observations on acracan's Summer of Code connector work:
+ *
+ * - GUI comments:
+ *
+ * - Buttons for adding and removing user-specified connection
+ * points should probably have "+" and "-" symbols on them so they
+ * are consistent with the similar buttons for the node tool.
+ * - Controls on the connector tool be should be reordered logically,
+ * possibly as follows:
+ *
+ * *Connector*: [Polyline-radio-button] [Orthgonal-radio-button]
+ * [Curvature-control] | *Shape*: [Avoid-button] [Dont-avoid-button]
+ * [Spacing-control] | *Connection pts*: [Edit-mode] [Add-pt] [Rm-pt]
+ *
+ * I think that the network layout controls be moved to the
+ * Align and Distribute dialog (there is already the layout button
+ * there, but no options are exposed).
+ *
+ * I think that the style change between polyline and orthogonal
+ * would be much clearer with two buttons (radio behaviour -- just
+ * one is true).
+ *
+ * The other tools show a label change from "New:" to "Change:"
+ * depending on whether an object is selected. We could consider
+ * this but there may not be space.
+ *
+ * The Add-pt and Rm-pt buttons should be greyed out (inactive) if
+ * we are not in connection point editing mode. And probably also
+ * if there is no shape selected, i.e. at the times they have no
+ * effect when clicked.
+ *
+ * Likewise for the avoid/ignore shapes buttons. These should be
+ * inactive when a shape is not selected in the connector context.
+ *
+ * - When creating/editing connection points:
+ *
+ * - Strange things can happen if you have connectors selected, or
+ * try rerouting connectors by dragging their endpoints when in
+ * connection point editing mode.
+ *
+ * - Possibly the selected shape's connection points should always
+ * be shown (i.e., have knots) when in editing mode.
+ *
+ * - It is a little strange to be able to place connection points
+ * competely outside shapes. Especially when you later can't draw
+ * connectors to them since the knots are only visible when you
+ * are over the shape. I think that you should only be able to
+ * place connection points inside or on the boundary of the shape
+ * itself.
+ *
+ * - The intended ability to place a new point at the current cursor
+ * position by pressing RETURN does not seem to work.
+ *
+ * - The Status bar tooltip should change to reflect editing mode
+ * and tell the user about RETURN and how to use the tool.
+ *
+ * - Connection points general:
+ *
+ * - Connection points that were inside the shape can end up outside
+ * after a rotation is applied to the shape in the select tool.
+ * It doesn't seem like the correct transform is being applied to
+ * these, or it is being applied at the wrong time. I'd expect
+ * connection points to rotate with the shape, and stay at the
+ * same position "on the shape"
+ *
+ * - I was able to make the connectors attached to a shape fall off
+ * the shape after scaling it. Not sure the exact cause, but may
+ * require more investigation/debugging.
+ *
+ * - The user-defined connection points should be either absolute
+ * (as the current ones are) or defined as a percentage of the
+ * shape. These would be based on a toggle setting on the
+ * toolbar, and they would be placed in exactly the same way by
+ * the user. The only difference would be that they would be
+ * store as percentage positions in the SVG connection-points
+ * property and that they would update/move automatically if the
+ * object was resized or scaled.
+ *
+ * - Thinking more, I think you always want to store and think about
+ * the positions of connection points to be pre-transform, but
+ * obviously the shape transform is applied to them. That way,
+ * they will rotate and scale automatically with the shape, when
+ * the shape transform is altered. The Percentage version would
+ * compute their position from the pre-transform dimensions and
+ * then have the transform applied to them, for example.
+ *
+ * - The connection points in the test_connection_points.svg file
+ * seem to follow the shape when it is moved, but connection
+ * points I add to new shapes, do not follow the shape, either
+ * when the shape is just moved or transformed. There is
+ * something wrong here. What exactly should the behaviour be
+ * currently?
+ *
+ * - I see that connection points are specified at absolute canvas
+ * positions. I really think that they should be specified in
+ * shape coordinated relative to the shapes. There may be
+ * transforms applied to layers and the canvas which would make
+ * specifying them quite difficult. I'd expect a position of 0, 0
+ * to be on the shape in question or very close to it, for example.
*
*/
+
+
#include <gdk/gdkkeysyms.h>
#include <string>
#include <cstring>
#include "connector-context.h"
#include "pixmaps/cursor-connector.xpm"
+#include "pixmaps/cursor-node.xpm"
+#include "pixmaps/cursor-node-m.xpm"
+#include "pixmaps/cursor-node-d.xpm"
#include "xml/node-event-vector.h"
#include "xml/repr.h"
#include "svg/svg.h"
#include "display/canvas-bpath.h"
#include "display/sodipodi-ctrl.h"
#include <glibmm/i18n.h>
+#include <glibmm/stringutils.h>
#include "snap.h"
#include "knot.h"
#include "sp-conn-end.h"
+#include "sp-conn-end-pair.h"
#include "conn-avoid-ref.h"
#include "libavoid/vertices.h"
+#include "libavoid/router.h"
#include "context-fns.h"
#include "sp-namedview.h"
#include "sp-text.h"
static void sp_connector_context_dispose(GObject *object);
static void sp_connector_context_setup(SPEventContext *ec);
+static void sp_connector_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val);
static void sp_connector_context_finish(SPEventContext *ec);
static gint sp_connector_context_root_handler(SPEventContext *ec, GdkEvent *event);
static gint sp_connector_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event);
@@ -98,11 +213,14 @@ static gint connector_handle_motion_notify(SPConnectorContext *const cc, GdkEven
static gint connector_handle_button_release(SPConnectorContext *const cc, GdkEventButton const &revent);
static gint connector_handle_key_press(SPConnectorContext *const cc, guint const keyval);
+static void cc_active_shape_add_knot(SPDesktop* desktop, SPItem* item, ConnectionPointMap &cphandles, ConnectionPoint& cp);
static void cc_set_active_shape(SPConnectorContext *cc, SPItem *item);
static void cc_clear_active_shape(SPConnectorContext *cc);
static void cc_set_active_conn(SPConnectorContext *cc, SPItem *item);
static void cc_clear_active_conn(SPConnectorContext *cc);
static gchar *conn_pt_handle_test(SPConnectorContext *cc, Geom::Point& w);
+static void cc_select_handle(SPKnot* knot);
+static void cc_deselect_handle(SPKnot* knot);
static bool cc_item_is_shape(SPItem *item);
static void cc_selection_changed(Inkscape::Selection *selection, gpointer data);
static void cc_connector_rerouting_finish(SPConnectorContext *const cc,
@@ -115,8 +233,8 @@ static void shape_event_attr_changed(Inkscape::XML::Node *repr, gchar const *nam
gpointer data);
-static Geom::Point connector_drag_origin_w(0, 0);
-static bool connector_within_tolerance = false;
+/*static Geom::Point connector_drag_origin_w(0, 0);
+static bool connector_within_tolerance = false;*/
static SPEventContextClass *parent_class;
object_class->dispose = sp_connector_context_dispose;
event_context_class->setup = sp_connector_context_setup;
+ event_context_class->set = sp_connector_context_set;
event_context_class->finish = sp_connector_context_finish;
event_context_class->root_handler = sp_connector_context_root_handler;
event_context_class->item_handler = sp_connector_context_item_handler;
ec->xp = 0;
ec->yp = 0;
+ cc->mode = SP_CONNECTOR_CONTEXT_DRAWING_MODE;
+ cc->knot_tip = 0;
+
cc->red_color = 0xff00007f;
cc->newconn = NULL;
cc->newConnRef = NULL;
+ cc->curvature = 0.0;
cc->sel_changed_connection = sigc::connection();
cc->active_handle = NULL;
+ cc->selected_handle = NULL;
+
cc->clickeditem = NULL;
cc->clickedhandle = NULL;
- cc->connpthandle = NULL;
+ new (&cc->connpthandles) ConnectionPointMap();
+
for (int i = 0; i < 2; ++i) {
cc->endpt_handle[i] = NULL;
cc->endpt_handler_id[i] = 0;
cc->sel_changed_connection.disconnect();
- if (cc->connpthandle) {
- g_object_unref(cc->connpthandle);
- cc->connpthandle = NULL;
+ if (!cc->connpthandles.empty()) {
+ for (ConnectionPointMap::iterator it = cc->connpthandles.begin();
+ it != cc->connpthandles.end(); ++it) {
+ g_object_unref(it->first);
+ }
+ cc->connpthandles.clear();
}
+ cc->connpthandles.~ConnectionPointMap();
for (int i = 0; i < 2; ++i) {
if (cc->endpt_handle[1]) {
g_object_unref(cc->endpt_handle[i]);
// Notice the initial selection.
cc_selection_changed(cc->selection, (gpointer) cc);
+ cc->within_tolerance = false;
+
+ sp_event_context_read(ec, "curvature");
+ sp_event_context_read(ec, "orthogonal");
+ sp_event_context_read(ec, "mode");
+ cc->knot_tip = cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE ? cc_knot_tips[0] : cc_knot_tips[1];
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
if (prefs->getBool("/tools/connector/selcue", 0)) {
ec->enableSelectionCue();
}
+static void
+sp_connector_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val)
+{
+ SPConnectorContext *cc = SP_CONNECTOR_CONTEXT(ec);
+
+ /* fixme: Proper error handling for non-numeric data. Use a locale-independent function like
+ * g_ascii_strtod (or a thin wrapper that does the right thing for invalid values inf/nan). */
+ Glib::ustring name = val->getEntryName();
+ if ( name == "curvature" ) {
+ cc->curvature = val->getDoubleLimited(); // prevents NaN and +/-Inf from messing up
+ }
+ else if ( name == "orthogonal" ) {
+ cc->isOrthogonal = val->getBool();
+ }
+ else if ( name == "mode")
+ {
+ sp_connector_context_switch_mode(ec, val->getBool() ? SP_CONNECTOR_CONTEXT_EDITING_MODE : SP_CONNECTOR_CONTEXT_DRAWING_MODE);
+ }
+}
+
+void sp_connector_context_switch_mode(SPEventContext* ec, unsigned int newMode)
+{
+ SPConnectorContext *cc = SP_CONNECTOR_CONTEXT(ec);
+
+ cc->mode = newMode;
+ if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+ {
+ ec->cursor_shape = cursor_connector_xpm;
+ cc->knot_tip = cc_knot_tips[0];
+ if (cc->selected_handle)
+ cc_deselect_handle( cc->selected_handle );
+ cc->selected_handle = NULL;
+ // Show all default connection points
+
+ }
+ else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+ {
+ ec->cursor_shape = cursor_node_xpm;
+ cc->knot_tip = cc_knot_tips[1];
+/* if (cc->active_shape)
+ {
+ cc->selection->set( SP_OBJECT( cc->active_shape ) );
+ }
+ else
+ {
+ SPItem* item = cc->selection->singleItem();
+ if ( item )
+ {
+ cc_set_active_shape(cc, item);
+ cc->selection->set( SP_OBJECT( item ) );
+ }
+ }*/
+ }
+ sp_event_context_update_cursor(ec);
+
+}
+
+
static void
sp_connector_context_finish(SPEventContext *ec)
{
cc->active_shape_layer_repr = NULL;
}
- // Hide the center connection point if it exists.
- if (cc->connpthandle) {
- sp_knot_hide(cc->connpthandle);
+ // Hide the connection points if they exist.
+ if (cc->connpthandles.size()) {
+ for (ConnectionPointMap::iterator it = cc->connpthandles.begin();
+ it != cc->connpthandles.end(); ++it) {
+ sp_knot_hide(it->first);
+ }
}
}
// TODO: this will need to change when there are more connection
// points available for each shape.
- SPKnot *centerpt = cc->connpthandle;
- if (cc->active_handle && (cc->active_handle == centerpt))
+ if (cc->active_handle && (cc->connpthandles.find(cc->active_handle) != cc->connpthandles.end()))
{
- p = centerpt->pos;
- return g_strdup_printf("#%s", SP_OBJECT_ID(cc->active_shape));
+ p = cc->active_handle->pos;
+ const ConnectionPoint& cp = cc->connpthandles[cc->active_handle];
+ return g_strdup_printf("#%s_%c_%d", SP_OBJECT_ID(cc->active_shape),
+ cp.type == ConnPointDefault ? 'd' : 'u' , cp.id);
}
return NULL;
}
+static void
+cc_select_handle(SPKnot* knot)
+{
+ knot->setShape(SP_KNOT_SHAPE_SQUARE);
+ knot->setSize(10);
+ knot->setAnchor(GTK_ANCHOR_CENTER);
+ knot->setFill(0x0000ffff, 0x0000ffff, 0x0000ffff);
+ sp_knot_update_ctrl(knot);
+}
+static void
+cc_deselect_handle(SPKnot* knot)
+{
+ knot->setShape(SP_KNOT_SHAPE_SQUARE);
+ knot->setSize(8);
+ knot->setAnchor(GTK_ANCHOR_CENTER);
+ knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
+ sp_knot_update_ctrl(knot);
+}
static gint
sp_connector_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event)
@@ -400,29 +616,40 @@ sp_connector_context_item_handler(SPEventContext *event_context, SPItem *item, G
SPConnectorContext *cc = SP_CONNECTOR_CONTEXT(event_context);
Geom::Point p(event->button.x, event->button.y);
-
+
switch (event->type) {
case GDK_BUTTON_RELEASE:
if (event->button.button == 1 && !event_context->space_panning) {
if ((cc->state == SP_CONNECTOR_CONTEXT_DRAGGING) &&
- (connector_within_tolerance))
+ (event_context->within_tolerance))
{
spcc_reset_colors(cc);
cc->state = SP_CONNECTOR_CONTEXT_IDLE;
- sp_event_context_discard_delayed_snap_event(event_context);
+// sp_event_context_snap_window_closed(event_context);
}
if (cc->state != SP_CONNECTOR_CONTEXT_IDLE) {
- // Doing simething else like rerouting.
+ // Doing something else like rerouting.
break;
}
- // find out clicked item, disregarding groups, honoring Alt
- SPItem *item_ungrouped = sp_event_context_find_item(desktop,
- p, event->button.state & GDK_MOD1_MASK, TRUE);
+ // find out clicked item, honoring Alt
+ SPItem *item = sp_event_context_find_item(desktop,
+ p, event->button.state & GDK_MOD1_MASK, FALSE);
if (event->button.state & GDK_SHIFT_MASK) {
- cc->selection->toggle(item_ungrouped);
+ cc->selection->toggle(item);
} else {
- cc->selection->set(item_ungrouped);
+ cc->selection->set(item);
+ if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE && cc->selected_handle )
+ {
+ cc_deselect_handle( cc->selected_handle );
+ cc->selected_handle = NULL;
+ }
+ /* When selecting a new item,
+ do not allow showing connection points
+ on connectors. (yet?)
+ */
+ if ( item != cc->active_shape && !cc_item_is_connector( item ) )
+ cc_set_active_shape( cc, item );
}
ret = TRUE;
@@ -430,15 +657,24 @@ sp_connector_context_item_handler(SPEventContext *event_context, SPItem *item, G
break;
case GDK_ENTER_NOTIFY:
{
- if (cc_item_is_shape(item)) {
- // This is a shape, so show connection point(s).
- if (!(cc->active_shape) ||
- // Don't show handle for another handle.
- (item != ((SPItem *) cc->connpthandle))) {
+ if (cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE || (cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE && !cc->selected_handle))
+ {
+ if (cc_item_is_shape(item)) {
+
+ // I don't really understand what the above does,
+ // so I commented it.
+ // This is a shape, so show connection point(s).
+ /* if (!(cc->active_shape)
+ // Don't show handle for another handle.
+ // || (cc->connpthandles.find((SPKnot*) item) != cc->connpthandles.end())
+ )
+ {
+ cc_set_active_shape(cc, item);
+ }*/
cc_set_active_shape(cc, item);
}
+ ret = TRUE;
}
- ret = TRUE;
break;
}
default:
break;
case GDK_MOTION_NOTIFY:
- ret = connector_handle_motion_notify(cc, event->motion);
+ ret = connector_handle_motion_notify(cc, event->motion);
break;
case GDK_BUTTON_RELEASE:
@@ -497,96 +733,166 @@ connector_handle_button_press(SPConnectorContext *const cc, GdkEventButton const
SPEventContext *event_context = SP_EVENT_CONTEXT(cc);
gint ret = FALSE;
- if ( bevent.button == 1 && !event_context->space_panning ) {
+ if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+ {
+ if ( bevent.button == 1 && !event_context->space_panning ) {
- SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+ SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
- if (Inkscape::have_viable_layer(desktop, cc->_message_context) == false) {
- return TRUE;
- }
+ if (Inkscape::have_viable_layer(desktop, cc->_message_context) == false) {
+ return TRUE;
+ }
- Geom::Point const event_w(bevent.x,
- bevent.y);
- connector_drag_origin_w = event_w;
- connector_within_tolerance = true;
+ Geom::Point const event_w(bevent.x,
+ bevent.y);
+// connector_drag_origin_w = event_w;
+ cc->xp = bevent.x;
+ cc->yp = bevent.y;
+ cc->within_tolerance = true;
- Geom::Point const event_dt = cc->desktop->w2d(event_w);
+ Geom::Point const event_dt = cc->desktop->w2d(event_w);
- SnapManager &m = cc->desktop->namedview->snap_manager;
- m.setup(cc->desktop);
+ SnapManager &m = cc->desktop->namedview->snap_manager;
+ m.setup(cc->desktop);
- switch (cc->state) {
- case SP_CONNECTOR_CONTEXT_STOP:
- /* This is allowed, if we just cancelled curve */
- case SP_CONNECTOR_CONTEXT_IDLE:
- {
- if ( cc->npoints == 0 ) {
- cc_clear_active_conn(cc);
+ switch (cc->state) {
+ case SP_CONNECTOR_CONTEXT_STOP:
+ /* This is allowed, if we just cancelled curve */
+ case SP_CONNECTOR_CONTEXT_IDLE:
+ {
+ if ( cc->npoints == 0 ) {
+ cc_clear_active_conn(cc);
- SP_EVENT_CONTEXT_DESKTOP(cc)->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Creating new connector"));
+ SP_EVENT_CONTEXT_DESKTOP(cc)->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Creating new connector"));
- /* Set start anchor */
- /* Create green anchor */
- Geom::Point p = event_dt;
+ /* Set start anchor */
+ /* Create green anchor */
+ Geom::Point p = event_dt;
- // Test whether we clicked on a connection point
- cc->sid = conn_pt_handle_test(cc, p);
+ // Test whether we clicked on a connection point
+ cc->sid = conn_pt_handle_test(cc, p);
+
+// sp_event_context_snap_window_open(event_context);
+
+ if (!cc->sid) {
+ // This is the first point, so just snap it to the grid
+ // as there's no other points to go off.
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+ }
+ spcc_connector_set_initial_point(cc, p);
- if (!cc->sid) {
- // This is the first point, so just snap it to the grid
- // as there's no other points to go off.
- m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
}
- spcc_connector_set_initial_point(cc, p);
+ cc->state = SP_CONNECTOR_CONTEXT_DRAGGING;
+ ret = TRUE;
+ break;
+ }
+ case SP_CONNECTOR_CONTEXT_DRAGGING:
+ {
+ // This is the second click of a connector creation.
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+ spcc_connector_set_subsequent_point(cc, p);
+ spcc_connector_finish_segment(cc, p);
+ // Test whether we clicked on a connection point
+ cc->eid = conn_pt_handle_test(cc, p);
+ if (cc->npoints != 0) {
+ spcc_connector_finish(cc);
+ }
+ cc_set_active_conn(cc, cc->newconn);
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+// sp_event_context_snap_window_closed(event_context);
+ ret = TRUE;
+ break;
}
- cc->state = SP_CONNECTOR_CONTEXT_DRAGGING;
- ret = TRUE;
- break;
+ case SP_CONNECTOR_CONTEXT_CLOSE:
+ {
+ g_warning("Button down in CLOSE state");
+ break;
+ }
+ default:
+ break;
}
- case SP_CONNECTOR_CONTEXT_DRAGGING:
- {
- // This is the second click of a connector creation.
- m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+ } else if (bevent.button == 3) {
+ if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
+ // A context menu is going to be triggered here,
+ // so end the rerouting operation.
+ cc_connector_rerouting_finish(cc, &p);
- spcc_connector_set_subsequent_point(cc, p);
- spcc_connector_finish_segment(cc, p);
- // Test whether we clicked on a connection point
- cc->eid = conn_pt_handle_test(cc, p);
- if (cc->npoints != 0) {
- spcc_connector_finish(cc);
- }
- cc_set_active_conn(cc, cc->newconn);
cc->state = SP_CONNECTOR_CONTEXT_IDLE;
- sp_event_context_discard_delayed_snap_event(event_context);
- ret = TRUE;
- break;
+// sp_event_context_snap_window_closed(event_context);
+
+ // Don't set ret to TRUE, so we drop through to the
+ // parent handler which will open the context menu.
}
- case SP_CONNECTOR_CONTEXT_CLOSE:
- {
- g_warning("Button down in CLOSE state");
- break;
+ else if (cc->npoints != 0) {
+ spcc_connector_finish(cc);
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+// sp_event_context_snap_window_closed(event_context);
+ ret = TRUE;
}
- default:
- break;
}
- } else if (bevent.button == 3) {
- if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
- // A context menu is going to be triggered here,
- // so end the rerouting operation.
- cc_connector_rerouting_finish(cc, &p);
+ }
+ else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+ {
+ if ( bevent.button == 1 && !event_context->space_panning )
+ {
+ // Initialize variables in case of dragging
- cc->state = SP_CONNECTOR_CONTEXT_IDLE;
- sp_event_context_discard_delayed_snap_event(event_context);
+ SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
- // Don't set ret to TRUE, so we drop through to the
- // parent handler which will open the context menu.
- }
- else if (cc->npoints != 0) {
- spcc_connector_finish(cc);
- cc->state = SP_CONNECTOR_CONTEXT_IDLE;
- sp_event_context_discard_delayed_snap_event(event_context);
- ret = TRUE;
+ if (Inkscape::have_viable_layer(desktop, cc->_message_context) == false) {
+ return TRUE;
+ }
+
+ cc->xp = bevent.x;
+ cc->yp = bevent.y;
+ cc->within_tolerance = true;
+
+ ConnectionPointMap::iterator const& active_knot_it = cc->connpthandles.find( cc->active_handle );
+
+ switch (cc->state)
+ {
+ case SP_CONNECTOR_CONTEXT_IDLE:
+ if ( active_knot_it != cc->connpthandles.end() )
+ {
+ // We do not allow selecting and, thereby, moving default knots
+ if ( active_knot_it->second.type != ConnPointDefault)
+ {
+ if (cc->selected_handle != cc->active_handle)
+ {
+ if ( cc->selected_handle )
+ cc_deselect_handle( cc->selected_handle );
+ cc->selected_handle = cc->active_handle;
+ cc_select_handle( cc->selected_handle );
+ }
+ }
+ else
+ // Just ignore the default connection point
+ return FALSE;
+ }
+ else
+ if ( cc->selected_handle )
+ {
+ cc_deselect_handle( cc->selected_handle );
+ cc->selected_handle = NULL;
+ }
+
+ if ( cc->selected_handle )
+ {
+// sp_event_context_snap_window_open(event_context);
+ cc->state = SP_CONNECTOR_CONTEXT_DRAGGING;
+ cc->selection->set( SP_OBJECT( cc->active_shape ) );
+ }
+
+ ret = TRUE;
+ break;
+ // Dragging valid because of the way we create
+ // new connection points.
+ case SP_CONNECTOR_CONTEXT_DRAGGING:
+ // Do nothing.
+ ret = TRUE;
+ break;
+ }
}
}
return ret;
@@ -607,71 +913,94 @@ connector_handle_motion_notify(SPConnectorContext *const cc, GdkEventMotion cons
Geom::Point const event_w(mevent.x, mevent.y);
- if (connector_within_tolerance) {
- gint const tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
- if ( Geom::LInfty( event_w - connector_drag_origin_w ) < tolerance ) {
+ if (cc->within_tolerance) {
+ cc->tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
+ if ( ( abs( (gint) mevent.x - cc->xp ) < cc->tolerance ) &&
+ ( abs( (gint) mevent.y - cc->yp ) < cc->tolerance ) ) {
return FALSE; // Do not drag if we're within tolerance from origin.
}
}
// Once the user has moved farther than tolerance from the original location
// (indicating they intend to move the object, not click), then always process
// the motion notify coordinates as given (no snapping back to origin)
- connector_within_tolerance = false;
+ cc->within_tolerance = false;
SPDesktop *const dt = cc->desktop;
/* Find desktop coordinates */
Geom::Point p = dt->w2d(event_w);
- SnapManager &m = dt->namedview->snap_manager;
- m.setup(dt);
-
- switch (cc->state) {
- case SP_CONNECTOR_CONTEXT_DRAGGING:
- {
- // This is movement during a connector creation.
- if ( cc->npoints > 0 ) {
- m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
- cc->selection->clear();
- spcc_connector_set_subsequent_point(cc, p);
- ret = TRUE;
+ if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+ {
+ SnapManager &m = dt->namedview->snap_manager;
+ m.setup(dt);
+
+ switch (cc->state) {
+ case SP_CONNECTOR_CONTEXT_DRAGGING:
+ {
+ gobble_motion_events(mevent.state);
+ // This is movement during a connector creation.
+ if ( cc->npoints > 0 ) {
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p,
+ Inkscape::SNAPSOURCE_HANDLE);
+ cc->selection->clear();
+ spcc_connector_set_subsequent_point(cc, p);
+ ret = TRUE;
+ }
+ break;
}
- break;
- }
- case SP_CONNECTOR_CONTEXT_REROUTING:
- {
- g_assert( SP_IS_PATH(cc->clickeditem));
+ case SP_CONNECTOR_CONTEXT_REROUTING:
+ {
+ gobble_motion_events(GDK_BUTTON1_MASK);
+ g_assert( SP_IS_PATH(cc->clickeditem));
- m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p,
+ Inkscape::SNAPSOURCE_HANDLE);
- // Update the hidden path
- Geom::Matrix i2d = sp_item_i2d_affine(cc->clickeditem);
- Geom::Matrix d2i = i2d.inverse();
- SPPath *path = SP_PATH(cc->clickeditem);
- SPCurve *curve = (SP_SHAPE(path))->curve;
- if (cc->clickedhandle == cc->endpt_handle[0]) {
- Geom::Point o = cc->endpt_handle[1]->pos;
- curve->stretch_endpoints(p * d2i, o * d2i);
- }
- else {
- Geom::Point o = cc->endpt_handle[0]->pos;
- curve->stretch_endpoints(o * d2i, p * d2i);
- }
- sp_conn_adjust_path(path);
+ // Update the hidden path
+ Geom::Matrix i2d = sp_item_i2d_affine(cc->clickeditem);
+ Geom::Matrix d2i = i2d.inverse();
+ SPPath *path = SP_PATH(cc->clickeditem);
+ SPCurve *curve = path->original_curve ? path->original_curve : path->curve;
+ if (cc->clickedhandle == cc->endpt_handle[0]) {
+ Geom::Point o = cc->endpt_handle[1]->pos;
+ curve->stretch_endpoints(p * d2i, o * d2i);
+ }
+ else {
+ Geom::Point o = cc->endpt_handle[0]->pos;
+ curve->stretch_endpoints(o * d2i, p * d2i);
+ }
+ sp_conn_reroute_path_immediate(path);
- // Copy this to the temporary visible path
- cc->red_curve = SP_SHAPE(path)->curve->copy();
- cc->red_curve->transform(i2d);
+ // Copy this to the temporary visible path
+ cc->red_curve = path->original_curve ?
+ path->original_curve->copy() : path->curve->copy();
+ cc->red_curve->transform(i2d);
- sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(cc->red_bpath), cc->red_curve);
- ret = TRUE;
- break;
+ sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(cc->red_bpath), cc->red_curve);
+ ret = TRUE;
+ break;
+ }
+ case SP_CONNECTOR_CONTEXT_STOP:
+ /* This is perfectly valid */
+ break;
+ default:
+ break;
+ }
+ }
+ else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+ {
+ switch ( cc->state )
+ {
+ case SP_CONNECTOR_CONTEXT_DRAGGING:
+ sp_knot_set_position(cc->selected_handle, p, 0);
+ ret = TRUE;
+ break;
+ case SP_CONNECTOR_CONTEXT_NEWCONNPOINT:
+ sp_knot_set_position(cc->selected_handle, p, 0);
+ ret = TRUE;
+ break;
}
- case SP_CONNECTOR_CONTEXT_STOP:
- /* This is perfectly valid */
- break;
- default:
- break;
}
return ret;
@@ -685,60 +1014,111 @@ connector_handle_button_release(SPConnectorContext *const cc, GdkEventButton con
SPEventContext *event_context = SP_EVENT_CONTEXT(cc);
if ( revent.button == 1 && !event_context->space_panning ) {
- SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+ SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
SPDocument *doc = sp_desktop_document(desktop);
SnapManager &m = desktop->namedview->snap_manager;
- m.setup(desktop);
+ m.setup(desktop);
Geom::Point const event_w(revent.x, revent.y);
/* Find desktop coordinates */
Geom::Point p = cc->desktop->w2d(event_w);
-
- switch (cc->state) {
- //case SP_CONNECTOR_CONTEXT_POINT:
- case SP_CONNECTOR_CONTEXT_DRAGGING:
- {
- m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
-
- if (connector_within_tolerance)
+ if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+ {
+ switch (cc->state) {
+ //case SP_CONNECTOR_CONTEXT_POINT:
+ case SP_CONNECTOR_CONTEXT_DRAGGING:
{
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+
+ if (cc->within_tolerance)
+ {
+ spcc_connector_finish_segment(cc, p);
+ return TRUE;
+ }
+ // Connector has been created via a drag, end it now.
+ spcc_connector_set_subsequent_point(cc, p);
spcc_connector_finish_segment(cc, p);
- return TRUE;
+ // Test whether we clicked on a connection point
+ cc->eid = conn_pt_handle_test(cc, p);
+ if (cc->npoints != 0) {
+ spcc_connector_finish(cc);
+ }
+ cc_set_active_conn(cc, cc->newconn);
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+// sp_event_context_snap_window_closed(event_context);
+ break;
}
- // Connector has been created via a drag, end it now.
- spcc_connector_set_subsequent_point(cc, p);
- spcc_connector_finish_segment(cc, p);
- // Test whether we clicked on a connection point
- cc->eid = conn_pt_handle_test(cc, p);
- if (cc->npoints != 0) {
- spcc_connector_finish(cc);
+ case SP_CONNECTOR_CONTEXT_REROUTING:
+ {
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+ cc_connector_rerouting_finish(cc, &p);
+
+ sp_document_ensure_up_to_date(doc);
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+// sp_event_context_snap_window_closed(event_context);
+ return TRUE;
+ break;
}
- cc_set_active_conn(cc, cc->newconn);
- cc->state = SP_CONNECTOR_CONTEXT_IDLE;
- sp_event_context_discard_delayed_snap_event(event_context);
- break;
+ case SP_CONNECTOR_CONTEXT_STOP:
+ /* This is allowed, if we just cancelled curve */
+ break;
+ default:
+ break;
}
- case SP_CONNECTOR_CONTEXT_REROUTING:
+ ret = TRUE;
+ }
+ else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+ {
+ switch ( cc->state )
{
- m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
- cc_connector_rerouting_finish(cc, &p);
+ case SP_CONNECTOR_CONTEXT_DRAGGING:
+
+ if (!cc->within_tolerance)
+ {
+// sp_event_context_snap_window_open(event_context);
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+ sp_knot_set_position(cc->selected_handle, p, 0);
+// sp_event_context_snap_window_closed(event_context);
+ ConnectionPoint& cp = cc->connpthandles[cc->selected_handle];
+ cp.pos = p * sp_item_dt2i_affine(cc->active_shape);
+ cc->active_shape->avoidRef->updateConnectionPoint(cp);
+ }
- sp_document_ensure_up_to_date(doc);
- cc->state = SP_CONNECTOR_CONTEXT_IDLE;
- sp_event_context_discard_delayed_snap_event(event_context);
- return TRUE;
- break;
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+ ret = TRUE;
+ break;
+
+
+ case SP_CONNECTOR_CONTEXT_NEWCONNPOINT:
+// sp_event_context_snap_window_open( event_context );
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+
+ sp_knot_set_position(cc->selected_handle, p, 0);
+// sp_event_context_snap_window_closed(event_context);
+
+ ConnectionPoint cp;
+ cp.type = ConnPointUserDefined;
+ cp.pos = p * sp_item_dt2i_affine(cc->active_shape);
+ cp.dir = Avoid::ConnDirAll;
+ g_object_unref(cc->selected_handle);
+ cc->active_shape->avoidRef->addConnectionPoint(cp);
+ sp_document_ensure_up_to_date(doc);
+ for (ConnectionPointMap::iterator it = cc->connpthandles.begin(); it != cc->connpthandles.end(); ++it)
+ if (it->second.type == ConnPointUserDefined && it->second.id == cp.id)
+ {
+ cc->selected_handle = it->first;
+ break;
+ }
+ cc_select_handle( cc->selected_handle );
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+ ret = TRUE;
+ break;
}
- case SP_CONNECTOR_CONTEXT_STOP:
- /* This is allowed, if we just cancelled curve */
- break;
- default:
- break;
}
- ret = TRUE;
}
+
return ret;
}
@@ -749,43 +1129,145 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
{
gint ret = FALSE;
/* fixme: */
- switch (keyval) {
- case GDK_Return:
- case GDK_KP_Enter:
- if (cc->npoints != 0) {
- spcc_connector_finish(cc);
- cc->state = SP_CONNECTOR_CONTEXT_IDLE;
- sp_event_context_discard_delayed_snap_event(SP_EVENT_CONTEXT(cc));
- ret = TRUE;
- }
- break;
- case GDK_Escape:
- if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
+ if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
+ {
+ switch (keyval) {
+ case GDK_Return:
+ case GDK_KP_Enter:
+ if (cc->npoints != 0) {
+ spcc_connector_finish(cc);
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+// sp_event_context_snap_window_closed(SP_EVENT_CONTEXT(cc));
+ ret = TRUE;
+ }
+ break;
+ case GDK_Escape:
+ if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
- SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
- SPDocument *doc = sp_desktop_document(desktop);
+ SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+ SPDocument *doc = sp_desktop_document(desktop);
- cc_connector_rerouting_finish(cc, NULL);
+ cc_connector_rerouting_finish(cc, NULL);
- sp_document_undo(doc);
+ sp_document_undo(doc);
- cc->state = SP_CONNECTOR_CONTEXT_IDLE;
- sp_event_context_discard_delayed_snap_event(SP_EVENT_CONTEXT(cc));
- desktop->messageStack()->flash( Inkscape::NORMAL_MESSAGE,
- _("Connector endpoint drag cancelled."));
- ret = TRUE;
- }
- else if (cc->npoints != 0) {
- // if drawing, cancel, otherwise pass it up for deselecting
- cc->state = SP_CONNECTOR_CONTEXT_STOP;
- sp_event_context_discard_delayed_snap_event(SP_EVENT_CONTEXT(cc));
- spcc_reset_colors(cc);
- ret = TRUE;
- }
- break;
- default:
- break;
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+// sp_event_context_snap_window_closed(SP_EVENT_CONTEXT(cc));
+ desktop->messageStack()->flash( Inkscape::NORMAL_MESSAGE,
+ _("Connector endpoint drag cancelled."));
+ ret = TRUE;
+ }
+ else if (cc->npoints != 0) {
+ // if drawing, cancel, otherwise pass it up for deselecting
+ cc->state = SP_CONNECTOR_CONTEXT_STOP;
+// sp_event_context_snap_window_closed(SP_EVENT_CONTEXT(cc));
+ spcc_reset_colors(cc);
+ ret = TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
+ {
+ switch ( cc->state )
+ {
+ case SP_CONNECTOR_CONTEXT_DRAGGING:
+ if ( keyval == GDK_Escape )
+ {
+ // Cancel connection point dragging
+
+ // Obtain original position
+ ConnectionPoint const& cp = cc->connpthandles[cc->selected_handle];
+ SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+ const Geom::Matrix& i2doc = sp_item_i2doc_affine(cc->active_shape);
+ sp_knot_set_position(cc->selected_handle, cp.pos * i2doc * desktop->doc2dt(), 0);
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+ desktop->messageStack()->flash( Inkscape::NORMAL_MESSAGE,
+ _("Connection point drag cancelled."));
+ ret = TRUE;
+ }
+ else if ( keyval == GDK_Return || keyval == GDK_KP_Enter )
+ {
+ // Put connection point at current position
+
+ SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+ SnapManager &m = desktop->namedview->snap_manager;
+ m.setup(desktop);
+ Geom::Point p = cc->selected_handle->pos;
+ SPEventContext* event_context = SP_EVENT_CONTEXT( cc );
+
+ if (!cc->within_tolerance)
+ {
+// sp_event_context_snap_window_open(event_context);
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+ sp_knot_set_position(cc->selected_handle, p, 0);
+// sp_event_context_snap_window_closed(event_context);
+ ConnectionPoint& cp = cc->connpthandles[cc->selected_handle];
+ cp.pos = p * sp_item_dt2i_affine(cc->active_shape);
+ cc->active_shape->avoidRef->updateConnectionPoint(cp);
+ }
+
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+ ret = TRUE;
+ }
+ break;
+ case SP_CONNECTOR_CONTEXT_NEWCONNPOINT:
+ if ( keyval == GDK_Escape )
+ {
+ // Just destroy the knot
+ g_object_unref( cc->selected_handle );
+ cc->selected_handle = NULL;
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+ ret = TRUE;
+ }
+ else if ( keyval == GDK_Return || keyval == GDK_KP_Enter )
+ {
+ SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
+ SPDocument *doc = sp_desktop_document(desktop);
+ SnapManager &m = desktop->namedview->snap_manager;
+ m.setup(desktop);
+ Geom::Point p = cc->selected_handle->pos;
+ SPEventContext* event_context = SP_EVENT_CONTEXT( cc );
+
+// sp_event_context_snap_window_open( event_context );
+ m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
+
+ sp_knot_set_position(cc->selected_handle, p, 0);
+// sp_event_context_snap_window_closed(event_context);
+
+ ConnectionPoint cp;
+ cp.type = ConnPointUserDefined;
+ cp.pos = p * sp_item_dt2i_affine(cc->active_shape);
+ cp.dir = Avoid::ConnDirAll;
+ g_object_unref(cc->selected_handle);
+ cc->active_shape->avoidRef->addConnectionPoint(cp);
+ sp_document_ensure_up_to_date(doc);
+ for (ConnectionPointMap::iterator it = cc->connpthandles.begin(); it != cc->connpthandles.end(); ++it)
+ if (it->second.type == ConnPointUserDefined && it->second.id == cp.id)
+ {
+ cc->selected_handle = it->first;
+ break;
+ }
+ cc_select_handle( cc->selected_handle );
+ cc->state = SP_CONNECTOR_CONTEXT_IDLE;
+ ret = TRUE;
+ }
+
+ break;
+ case SP_CONNECTOR_CONTEXT_IDLE:
+ if ( keyval == GDK_Delete && cc->selected_handle )
+ {
+ cc->active_shape->avoidRef->deleteConnectionPoint(cc->connpthandles[cc->selected_handle]);
+ cc->selected_handle = NULL;
+ ret = TRUE;
+ }
+
+ break;
+ }
}
+
return ret;
}
@@ -818,7 +1300,7 @@ cc_connector_rerouting_finish(SPConnectorContext *const cc, Geom::Point *const p
}
}
cc->clickeditem->setHidden(false);
- sp_conn_adjust_path(SP_PATH(cc->clickeditem));
+ sp_conn_reroute_path_immediate(SP_PATH(cc->clickeditem));
cc->clickeditem->updateRepr();
sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR,
_("Reroute connector"));
@@ -863,25 +1345,20 @@ spcc_connector_set_subsequent_point(SPConnectorContext *const cc, Geom::Point co
if (!cc->newConnRef) {
Avoid::Router *router = sp_desktop_document(dt)->router;
- cc->newConnRef = new Avoid::ConnRef(router, 0, src, dst);
- cc->newConnRef->updateEndPoint(Avoid::VertID::src, src);
+ cc->newConnRef = new Avoid::ConnRef(router);
+ cc->newConnRef->setEndpoint(Avoid::VertID::src, src);
+ if (cc->isOrthogonal)
+ cc->newConnRef->setRoutingType(Avoid::ConnType_Orthogonal);
+ else
+ cc->newConnRef->setRoutingType(Avoid::ConnType_PolyLine);
}
- cc->newConnRef->updateEndPoint(Avoid::VertID::tar, dst);
-
+ // Set new endpoint.
+ cc->newConnRef->setEndpoint(Avoid::VertID::tar, dst);
+ // Immediately generate new routes for connector.
cc->newConnRef->makePathInvalid();
- cc->newConnRef->generatePath(src, dst);
-
- Avoid::PolyLine route = cc->newConnRef->route();
- cc->newConnRef->calcRouteDist();
-
- cc->red_curve->reset();
- Geom::Point pt(route.ps[0].x, route.ps[0].y);
- cc->red_curve->moveto(pt);
-
- for (int i = 1; i < route.pn; ++i) {
- Geom::Point p(route.ps[i].x, route.ps[i].y);
- cc->red_curve->lineto(p);
- }
+ cc->newConnRef->router()->processTransaction();
+ // Recreate curve from libavoid route.
+ recreateCurve( cc->red_curve, cc->newConnRef, cc->curvature );
cc->red_curve->transform(dt->doc2dt());
sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(cc->red_bpath), cc->red_curve);
}
/* Attach repr */
cc->newconn = SP_ITEM(desktop->currentLayer()->appendChildRepr(repr));
- cc->selection->set(repr);
- Inkscape::GC::release(repr);
cc->newconn->transform = sp_item_i2doc_affine(SP_ITEM(desktop->currentLayer())).inverse();
- cc->newconn->updateRepr();
bool connection = false;
sp_object_setAttribute(cc->newconn, "inkscape:connector-type",
- "polyline", false);
+ cc->isOrthogonal ? "orthogonal" : "polyline", false);
+ sp_object_setAttribute(cc->newconn, "inkscape:connector-curvature",
+ Glib::Ascii::dtostr(cc->curvature).c_str(), false);
if (cc->sid)
{
sp_object_setAttribute(cc->newconn, "inkscape:connection-start",
cc->eid, false);
connection = true;
}
+ // Process pending updates.
cc->newconn->updateRepr();
+ sp_document_ensure_up_to_date(doc);
+
if (connection) {
// Adjust endpoints to shape edge.
- sp_conn_adjust_path(SP_PATH(cc->newconn));
+ sp_conn_reroute_path_immediate(SP_PATH(cc->newconn));
+ cc->newconn->updateRepr();
}
- cc->newconn->updateRepr();
+
+ // Only set the selection after we are finished with creating the attributes of
+ // the connector. Otherwise, the selection change may alter the defaults for
+ // values like curvature in the connector context, preventing subsequent lookup
+ // of their original values.
+ cc->selection->set(repr);
+ Inkscape::GC::release(repr);
}
c->unref();
- /* Flush pending updates */
sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR, _("Create connector"));
- sp_document_ensure_up_to_date(doc);
}
gboolean consumed = FALSE;
+ gchar* knot_tip = knot->tip ? knot->tip : cc->knot_tip;
switch (event->type) {
case GDK_ENTER_NOTIFY:
sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, TRUE);
cc->active_handle = knot;
-
- if (knot->tip)
+ if (knot_tip)
{
knot->desktop->event_context->defaultMessageContext()->set(
- Inkscape::NORMAL_MESSAGE, knot->tip);
+ Inkscape::NORMAL_MESSAGE, knot_tip);
}
consumed = TRUE;
cc->active_handle = NULL;
- if (knot->tip) {
+ if (knot_tip) {
knot->desktop->event_context->defaultMessageContext()->clear();
}
cc->clickedhandle = cc->active_handle;
cc_clear_active_conn(cc);
cc->state = SP_CONNECTOR_CONTEXT_REROUTING;
+// sp_event_context_snap_window_open(SP_EVENT_CONTEXT(cc));
// Disconnect from attached shape
unsigned ind = (cc->active_handle == cc->endpt_handle[0]) ? 0 : 1;
}
// Show the red path for dragging.
- cc->red_curve = SP_PATH(cc->clickeditem)->curve->copy();
+ cc->red_curve = SP_PATH(cc->clickeditem)->original_curve ? SP_PATH(cc->clickeditem)->original_curve->copy() : SP_PATH(cc->clickeditem)->curve->copy();
Geom::Matrix i2d = sp_item_i2d_affine(cc->clickeditem);
cc->red_curve->transform(i2d);
sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(cc->red_bpath), cc->red_curve);
return consumed;
}
-
-static void cc_set_active_shape(SPConnectorContext *cc, SPItem *item)
+static void cc_active_shape_add_knot(SPDesktop* desktop, SPItem* item, ConnectionPointMap &cphandles, ConnectionPoint& cp)
{
- g_assert(item != NULL );
-
- cc->active_shape = item;
-
- // Remove existing active shape listeners
- if (cc->active_shape_repr) {
- sp_repr_remove_listener_by_data(cc->active_shape_repr, cc);
- Inkscape::GC::release(cc->active_shape_repr);
-
- sp_repr_remove_listener_by_data(cc->active_shape_layer_repr, cc);
- Inkscape::GC::release(cc->active_shape_layer_repr);
- }
-
- // Listen in case the active shape changes
- cc->active_shape_repr = SP_OBJECT_REPR(item);
- if (cc->active_shape_repr) {
- Inkscape::GC::anchor(cc->active_shape_repr);
- sp_repr_add_listener(cc->active_shape_repr, &shape_repr_events, cc);
-
- cc->active_shape_layer_repr = cc->active_shape_repr->parent();
- Inkscape::GC::anchor(cc->active_shape_layer_repr);
- sp_repr_add_listener(cc->active_shape_layer_repr, &layer_repr_events, cc);
- }
-
-
- // Set center connection point.
- if ( cc->connpthandle == NULL ) {
- SPKnot *knot = sp_knot_new(cc->desktop,
- _("<b>Connection point</b>: click or drag to create a new connector"));
+ SPKnot *knot = sp_knot_new(desktop, 0);
knot->setShape(SP_KNOT_SHAPE_SQUARE);
knot->setSize(8);
knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
sp_knot_update_ctrl(knot);
- // We don't want to use the standard knot handler,
- //since we don't want this knot to be draggable.
+ // We don't want to use the standard knot handler.
g_signal_handler_disconnect(G_OBJECT(knot->item),
knot->_event_handler_id);
knot->_event_handler_id = 0;
gtk_signal_connect(GTK_OBJECT(knot->item), "event",
GTK_SIGNAL_FUNC(cc_generic_knot_handler), knot);
+ sp_knot_set_position(knot, item->avoidRef->getConnectionPointPos(cp.type, cp.id) * desktop->doc2dt(), 0);
+ sp_knot_show(knot);
+ cphandles[knot] = cp;
+}
+
+static void cc_set_active_shape(SPConnectorContext *cc, SPItem *item)
+{
+ g_assert(item != NULL );
+
+ std::map<int, ConnectionPoint>* connpts = &item->avoidRef->connection_points;
+
+ if (cc->active_shape != item)
+ {
+ // The active shape has changed
+ // Rebuild everything
+ cc->active_shape = item;
+ // Remove existing active shape listeners
+ if (cc->active_shape_repr) {
+ sp_repr_remove_listener_by_data(cc->active_shape_repr, cc);
+ Inkscape::GC::release(cc->active_shape_repr);
+
+ sp_repr_remove_listener_by_data(cc->active_shape_layer_repr, cc);
+ Inkscape::GC::release(cc->active_shape_layer_repr);
+ }
+
+ // Listen in case the active shape changes
+ cc->active_shape_repr = SP_OBJECT_REPR(item);
+ if (cc->active_shape_repr) {
+ Inkscape::GC::anchor(cc->active_shape_repr);
+ sp_repr_add_listener(cc->active_shape_repr, &shape_repr_events, cc);
+
+ cc->active_shape_layer_repr = cc->active_shape_repr->parent();
+ Inkscape::GC::anchor(cc->active_shape_layer_repr);
+ sp_repr_add_listener(cc->active_shape_layer_repr, &layer_repr_events, cc);
+ }
- cc->connpthandle = knot;
+
+ // Set the connection points.
+ if ( cc->connpthandles.size() )
+ // destroy the old list
+ while (! cc->connpthandles.empty() )
+ {
+ g_object_unref(cc->connpthandles.begin()->first);
+ cc->connpthandles.erase(cc->connpthandles.begin());
+ }
+ // build the new one
+ if ( connpts->size() )
+ for (std::map<int, ConnectionPoint>::iterator it = connpts->begin(); it != connpts->end(); ++it)
+ cc_active_shape_add_knot(cc->desktop, item, cc->connpthandles, it->second);
+
+ // Also add default connection points
+ // For now, only centre default connection point will
+ // be available
+ ConnectionPoint centre;
+ centre.type = ConnPointDefault;
+ centre.id = ConnPointPosCC;
+ cc_active_shape_add_knot(cc->desktop, item, cc->connpthandles, centre);
}
+ else
+ {
+ // The active shape didn't change
+ // Update only the connection point knots
+ // Ensure the item's connection_points map
+ // has been updated
+ sp_document_ensure_up_to_date(SP_OBJECT_DOCUMENT(item));
- Geom::OptRect bbox = sp_item_bbox_desktop(cc->active_shape);
- if (bbox) {
- Geom::Point center = bbox->midpoint();
- sp_knot_set_position(cc->connpthandle, center, 0);
- sp_knot_show(cc->connpthandle);
- } else {
- sp_knot_hide(cc->connpthandle);
+ std::set<int> seen;
+ for ( ConnectionPointMap::iterator it = cc->connpthandles.begin(); it != cc->connpthandles.end() ;)
+ {
+ bool removed = false;
+ if ( it->second.type == ConnPointUserDefined )
+ {
+ std::map<int, ConnectionPoint>::iterator p = connpts->find(it->second.id);
+ if (p != connpts->end())
+ {
+ if ( it->second != p->second )
+ // Connection point position has changed
+ // Update knot position
+ sp_knot_set_position(it->first,
+ item->avoidRef->getConnectionPointPos(it->second.type, it->second.id) * cc->desktop->doc2dt(), 0);
+ seen.insert(it->second.id);
+ sp_knot_show(it->first);
+ }
+ else
+ {
+ // This connection point does no longer exist,
+ // remove the knot
+ ConnectionPointMap::iterator curr = it;
+ ++it;
+ g_object_unref( curr->first );
+ cc->connpthandles.erase(curr);
+ removed = true;
+ }
+ }
+ else
+ {
+ // It's a default connection point
+ // Just make sure it's position is correct
+ sp_knot_set_position(it->first,
+ item->avoidRef->getConnectionPointPos(it->second.type, it->second.id) * cc->desktop->doc2dt(), 0);
+ sp_knot_show(it->first);
+
+ }
+ if ( !removed )
+ ++it;
+ }
+ // Add knots for new connection points.
+ if (connpts->size())
+ for ( std::map<int, ConnectionPoint>::iterator it = connpts->begin(); it != connpts->end(); ++it )
+ if ( seen.find(it->first) == seen.end() )
+ // A new connection point has been added
+ // to the shape. Add a knot for it.
+ cc_active_shape_add_knot(cc->desktop, item, cc->connpthandles, it->second);
}
}
{
g_assert( SP_IS_PATH(item) );
- SPCurve *curve = SP_SHAPE(SP_PATH(item))->curve;
+ SPCurve *curve = SP_PATH(item)->original_curve ? SP_PATH(item)->original_curve : SP_PATH(item)->curve;
Geom::Matrix i2d = sp_item_i2d_affine(item);
if (cc->active_conn == item)
sp_knot_update_ctrl(knot);
// We don't want to use the standard knot handler,
- //since we don't want this knot to be draggable.
+ // since we don't want this knot to be draggable.
g_signal_handler_disconnect(G_OBJECT(knot->item),
knot->_event_handler_id);
knot->_event_handler_id = 0;
sp_knot_show(cc->endpt_handle[1]);
}
+void cc_create_connection_point(SPConnectorContext* cc)
+{
+ if (cc->active_shape && cc->state == SP_CONNECTOR_CONTEXT_IDLE)
+ {
+ if (cc->selected_handle)
+ {
+ cc_deselect_handle( cc->selected_handle );
+ }
+ SPKnot *knot = sp_knot_new(cc->desktop, 0);
+ // We do not process events on this knot.
+ g_signal_handler_disconnect(G_OBJECT(knot->item),
+ knot->_event_handler_id);
+ knot->_event_handler_id = 0;
+
+ cc_select_handle( knot );
+ cc->selected_handle = knot;
+ sp_knot_show(cc->selected_handle);
+ cc->state = SP_CONNECTOR_CONTEXT_NEWCONNPOINT;
+ }
+}
+
+void cc_remove_connection_point(SPConnectorContext* cc)
+{
+ if (cc->selected_handle && cc->state == SP_CONNECTOR_CONTEXT_IDLE )
+ {
+ cc->active_shape->avoidRef->deleteConnectionPoint(cc->connpthandles[cc->selected_handle]);
+ cc->selected_handle = NULL;
+ }
+}
static bool cc_item_is_shape(SPItem *item)
{
{
if (SP_IS_PATH(item)) {
if (SP_PATH(item)->connEndPair.isAutoRoutingConn()) {
- g_assert( !(SP_SHAPE(item)->curve->is_closed()) );
+ g_assert( SP_PATH(item)->original_curve ? !(SP_PATH(item)->original_curve->is_closed()) : !(SP_PATH(item)->curve->is_closed()) );
return true;
}
}
g_assert(data);
SPConnectorContext *cc = SP_CONNECTOR_CONTEXT(data);
- // Look for changes than result in onscreen movement.
+ // Look for changes that result in onscreen movement.
if (!strcmp(name, "d") || !strcmp(name, "x") || !strcmp(name, "y") ||
!strcmp(name, "width") || !strcmp(name, "height") ||
!strcmp(name, "transform"))
cc_set_active_conn(cc, cc->active_conn);
}
}
+ else
+ if ( !strcmp(name, "inkscape:connection-points") )
+ if (repr == cc->active_shape_repr)
+ // The connection points of the active shape
+ // have changed. Update them.
+ cc_set_active_shape(cc, cc->active_shape);
}
index d67e12b8134b8534f81078ebd231a4a0392171e7..640a03aaea67d8848439fc9009ed91fbaf17590b 100644 (file)
--- a/src/connector-context.h
+++ b/src/connector-context.h
#include <display/display-forward.h>
#include <2geom/point.h>
#include "libavoid/connector.h"
-
+#include "connection-points.h"
+#include <glibmm/i18n.h>
#define SP_TYPE_CONNECTOR_CONTEXT (sp_connector_context_get_type())
#define SP_CONNECTOR_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_CONNECTOR_CONTEXT, SPConnectorContext))
SP_CONNECTOR_CONTEXT_DRAGGING,
SP_CONNECTOR_CONTEXT_CLOSE,
SP_CONNECTOR_CONTEXT_STOP,
- SP_CONNECTOR_CONTEXT_REROUTING
+ SP_CONNECTOR_CONTEXT_REROUTING,
+ SP_CONNECTOR_CONTEXT_NEWCONNPOINT
+};
+
+enum {
+ SP_CONNECTOR_CONTEXT_DRAWING_MODE,
+ SP_CONNECTOR_CONTEXT_EDITING_MODE
};
+static char* cc_knot_tips[] = { _("<b>Connection point</b>: click or drag to create a new connector"),
+ _("<b>Connection point</b>: click to select, drag to move") };
+typedef std::map<SPKnot *, ConnectionPoint> ConnectionPointMap;
struct SPConnectorContext : public SPEventContext {
Inkscape::Selection *selection;
/** \invar npoints in {0, 2}. */
gint npoints;
-
+ /* The tool mode can be connector drawing or
+ connection points editing.
+ */
unsigned int mode : 1;
unsigned int state : 4;
+ gchar* knot_tip;
+
// Red curve
SPCanvasItem *red_bpath;
SPCurve *red_curve;
// The new connector
SPItem *newconn;
Avoid::ConnRef *newConnRef;
+ gdouble curvature;
+ bool isOrthogonal;
// The active shape
SPItem *active_shape;
// The activehandle
SPKnot *active_handle;
+ // The selected handle, used in editing mode
+ SPKnot *selected_handle;
+
SPItem *clickeditem;
SPKnot *clickedhandle;
- SPKnot *connpthandle;
+ ConnectionPointMap connpthandles;
SPKnot *endpt_handle[2];
guint endpt_handler_id[2];
gchar *sid;
GType sp_connector_context_get_type();
+void sp_connector_context_switch_mode(SPEventContext* ec, unsigned int newMode);
void cc_selection_set_avoid(bool const set_ignore);
+void cc_create_connection_point(SPConnectorContext* cc);
+void cc_remove_connection_point(SPConnectorContext* cc);
bool cc_item_is_connector(SPItem *item);
diff --git a/src/document.cpp b/src/document.cpp
index d406f3712d4ba2cf7a483efe3bf2449b0839c0d4..a3ad6f7beb1486a4bc236e6d0ff44213b2d89ef5 100644 (file)
--- a/src/document.cpp
+++ b/src/document.cpp
#include "xml/repr.h"
#include "xml/rebase-hrefs.h"
-#define SP_DOCUMENT_UPDATE_PRIORITY (G_PRIORITY_HIGH_IDLE - 1)
+// Higher number means lower priority.
+#define SP_DOCUMENT_UPDATE_PRIORITY (G_PRIORITY_HIGH_IDLE - 2)
+
+// Should have a lower priority than SP_DOCUMENT_UPDATE_PRIORITY,
+// since we want it to happen when there are no more updates.
+#define SP_DOCUMENT_REROUTING_PRIORITY (G_PRIORITY_HIGH_IDLE - 1)
static gint sp_document_idle_handler(gpointer data);
+static gint sp_document_rerouting_handler(gpointer data);
gboolean sp_document_resource_list_free(gpointer key, gpointer value, gpointer data);
priv(0), // reset in ctor
actionkey(0),
modified_id(0),
+ rerouting_handler_id(0),
profileManager(0), // deferred until after other initialization
- router(new Avoid::Router()),
+ router(new Avoid::Router(Avoid::PolyLineRouting|Avoid::OrthogonalRouting)),
perspectives(0),
current_persp3d(0),
_collection_queue(0),
oldSignalsConnected(false)
{
- // Don't use the Consolidate moves optimisation.
- router->ConsolidateMoves = false;
+ // Penalise libavoid for choosing paths with needless extra segments.
+ // This results in much better looking orthogonal connector paths.
+ router->setRoutingPenalty(Avoid::segmentPenalty);
SPDocumentPrivate *p = new SPDocumentPrivate();
profileManager = 0;
}
+ if (router) {
+ delete router;
+ router = NULL;
+ }
+
if (priv) {
if (priv->partial) {
sp_repr_free_log(priv->partial);
}
if (modified_id) {
- gtk_idle_remove(modified_id);
+ g_source_remove(modified_id);
modified_id = 0;
}
+ if (rerouting_handler_id) {
+ g_source_remove(rerouting_handler_id);
+ rerouting_handler_id = 0;
+ }
+
if (oldSignalsConnected) {
g_signal_handlers_disconnect_by_func(G_OBJECT(INKSCAPE),
reinterpret_cast<gpointer>(sp_document_reset_key),
keepalive = FALSE;
}
- if (router) {
- delete router;
- router = NULL;
- }
-
//delete this->_whiteboard_session_manager;
-
}
void SPDocument::add_persp3d (Persp3D * const /*persp*/)
sp_document_request_modified(SPDocument *doc)
{
if (!doc->modified_id) {
- doc->modified_id = gtk_idle_add_priority(SP_DOCUMENT_UPDATE_PRIORITY, sp_document_idle_handler, doc);
+ doc->modified_id = g_idle_add_full(SP_DOCUMENT_UPDATE_PRIORITY,
+ sp_document_idle_handler, doc, NULL);
+ }
+ if (!doc->rerouting_handler_id) {
+ doc->rerouting_handler_id = g_idle_add_full(SP_DOCUMENT_REROUTING_PRIORITY,
+ sp_document_rerouting_handler, doc, NULL);
}
}
* Repeatedly works on getting the document updated, since sometimes
* it takes more than one pass to get the document updated. But it
* usually should not take more than a few loops, and certainly never
- * more than 64 iterations. So we bail out if we hit 64 iterations,
+ * more than 32 iterations. So we bail out if we hit 32 iterations,
* since this typically indicates we're stuck in an update loop.
*/
gint
sp_document_ensure_up_to_date(SPDocument *doc)
{
- int counter = 64;
- while (!doc->_updateDocument()) {
- if (counter == 0) {
- g_warning("More than 64 iteration while updating document '%s'", doc->uri? doc->uri:"<unknown URI, probably clipboard>");
+ // Bring the document up-to-date, specifically via the following:
+ // 1a) Process all document updates.
+ // 1b) When completed, process connector routing changes.
+ // 2a) Process any updates resulting from connector reroutings.
+ int counter = 32;
+ for (unsigned int pass = 1; pass <= 2; ++pass) {
+ // Process document updates.
+ while (!doc->_updateDocument()) {
+ if (counter == 0) {
+ g_warning("More than 32 iteration while updating document '%s'", doc->uri);
+ break;
+ }
+ counter--;
+ }
+ if (counter == 0)
+ {
break;
}
- counter--;
- }
+ // After updates on the first pass we get libavoid to process all the
+ // changed objects and provide new routings. This may cause some objects
+ // to be modified, hence the second update pass.
+ if (pass == 1) {
+ doc->router->processTransaction();
+ }
+ }
+
if (doc->modified_id) {
/* Remove handler */
- gtk_idle_remove(doc->modified_id);
+ g_source_remove(doc->modified_id);
doc->modified_id = 0;
}
+ if (doc->rerouting_handler_id) {
+ /* Remove handler */
+ g_source_remove(doc->rerouting_handler_id);
+ doc->rerouting_handler_id = 0;
+ }
return counter>0;
}
}
}
+/**
+ * An idle handler to reroute connectors in the document.
+ */
+static gint
+sp_document_rerouting_handler(gpointer data)
+{
+ // Process any queued movement actions and determine new routings for
+ // object-avoiding connectors. Callbacks will be used to update and
+ // redraw affected connectors.
+ SPDocument *doc = static_cast<SPDocument *>(data);
+ doc->router->processTransaction();
+
+ // We don't need to handle rerouting again until there are further
+ // diagram updates.
+ doc->rerouting_handler_id = 0;
+ return false;
+}
+
static bool is_within(Geom::Rect const &area, Geom::Rect const &box)
{
return area.contains(box);
diff --git a/src/document.h b/src/document.h
index 789e3e2ed7b55dc702c781e03bdd0d7033a83e1a..06174c265f593b402151200b2fcb2e6a221f6c26 100644 (file)
--- a/src/document.h
+++ b/src/document.h
const gchar *actionkey;
/// Handler ID
guint modified_id;
+
+ /// Connector rerouting handler ID
+ guint rerouting_handler_id;
Inkscape::ProfileManager* profileManager;
index cd1683c343d68481c28da4ecd6c7b8c4cd9d1d2d..81ea590598397ba993e4163abb4b6e456dcad680 100644 (file)
#include "style.h"
#include "conn-avoid-ref.h"
#include "libavoid/connector.h"
+#include "libavoid/router.h"
#include "libavoid/geomtypes.h"
#include "libcola/cola.h"
#include "libvpsc/generate-constraints.h"
index df532c5644da63485ce2bc7bdf206027905ce4f7..3f408074c733df6fdd8465921bbb2f05afc527f6 100644 (file)
timer.cpp
vertices.cpp
visibility.cpp
+orthogonal.cpp
+vpsc.cpp
)
ADD_LIBRARY(avoid STATIC ${libavoid_SRC})
TARGET_LINK_LIBRARIES(avoid
index f75470e26e1fde5b9f17cc49b378bbead8cc2d06..77728499c978c030245e9017a529c5f4a80c4bd7 100644 (file)
libavoid/debug.h \
libavoid/geometry.cpp \
libavoid/geometry.h \
+ libavoid/geomtypes.cpp \
libavoid/geomtypes.h \
libavoid/graph.cpp \
libavoid/graph.h \
libavoid/makepath.cpp \
libavoid/makepath.h \
- libavoid/polyutil.cpp \
- libavoid/polyutil.h \
+ libavoid/orthogonal.cpp \
+ libavoid/orthogonal.h \
+ libavoid/vpsc.cpp \
+ libavoid/vpsc.h \
libavoid/router.cpp \
libavoid/router.h \
libavoid/shape.cpp \
libavoid/shape.h \
- libavoid/static.cpp \
- libavoid/static.h \
libavoid/timer.cpp \
libavoid/timer.h \
libavoid/vertices.cpp \
libavoid/vertices.h \
libavoid/visibility.cpp \
libavoid/visibility.h \
- libavoid/libavoid.h \
- libavoid/region.h
+ libavoid/viscluster.cpp \
+ libavoid/viscluster.h \
+ libavoid/libavoid.h
index 6473033718981abbd7a53bb0c627bacbed8e8102..d9088dfe712f7a13875e9be7306d44f3fd84a434 100644 (file)
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
+#include <cstring>
+#include <cfloat>
+#include <cmath>
#include <cstdlib>
+
#include "libavoid/graph.h"
#include "libavoid/connector.h"
#include "libavoid/makepath.h"
#include "libavoid/visibility.h"
#include "libavoid/debug.h"
#include "libavoid/router.h"
+#include "libavoid/assertions.h"
namespace Avoid {
+
+ConnEnd::ConnEnd(const Point& point)
+ : _point(point),
+ _directions(ConnDirAll),
+ _shapeRef(NULL)
+{
+}
+
+
+ConnEnd::ConnEnd(const Point& point, const ConnDirFlags visDirs)
+ : _point(point),
+ _directions(visDirs),
+ _shapeRef(NULL)
+{
+}
+
+ConnEnd::ConnEnd(ShapeRef *shapeRef, const double x_pos, const double y_pos,
+ const double insideOffset, const ConnDirFlags visDirs)
+ : _directions(visDirs),
+ _shapeRef(shapeRef),
+ _xPosition(x_pos),
+ _yPosition(y_pos),
+ _insideOffset(insideOffset)
+{
+}
+
+const Point ConnEnd::point(void) const
+{
+ if (_shapeRef)
+ {
+ const Polygon& poly = _shapeRef->polygon();
+
+ double x_min = DBL_MAX;
+ double x_max = -DBL_MAX;
+ double y_min = DBL_MAX;
+ double y_max = -DBL_MAX;
+ for (size_t i = 0; i < poly.size(); ++i)
+ {
+ x_min = std::min(x_min, poly.ps[i].x);
+ x_max = std::max(x_max, poly.ps[i].x);
+ y_min = std::min(y_min, poly.ps[i].y);
+ y_max = std::max(y_max, poly.ps[i].y);
+ }
+
+ Point point;
+
+ // We want to place connection points on the edges of shapes,
+ // or possibly slightly inside them (if _insideOfset is set).
+
+ point.vn = kUnassignedVertexNumber;
+ if (_xPosition == ATTACH_POS_LEFT)
+ {
+ point.x = x_min + _insideOffset;
+ point.vn = 6;
+ }
+ else if (_xPosition == ATTACH_POS_RIGHT)
+ {
+ point.x = x_max - _insideOffset;
+ point.vn = 4;
+ }
+ else
+ {
+ point.x = x_min + (_xPosition * (x_max - x_min));
+ }
+
+ if (_yPosition == ATTACH_POS_TOP)
+ {
+ point.y = y_max - _insideOffset;
+ point.vn = 5;
+ }
+ else if (_yPosition == ATTACH_POS_BOTTOM)
+ {
+ point.y = y_min + _insideOffset;
+ point.vn = 7;
+ }
+ else
+ {
+ point.y = y_min + (_yPosition * (y_max - y_min));
+ point.vn = kUnassignedVertexNumber;
+ }
+
+ return point;
+ }
+ else
+ {
+ return _point;
+ }
+}
+
+
+ConnDirFlags ConnEnd::directions(void) const
+{
+ if (_shapeRef)
+ {
+ ConnDirFlags visDir = _directions;
+ if (_directions == ConnDirNone)
+ {
+ // None is set, use the defaults:
+ if (_xPosition == ATTACH_POS_LEFT)
+ {
+ visDir = ConnDirLeft;
+ }
+ else if (_xPosition == ATTACH_POS_RIGHT)
+ {
+ visDir = ConnDirRight;
+ }
+ if (_yPosition == ATTACH_POS_TOP)
+ {
+ visDir = ConnDirDown;
+ }
+ else if (_yPosition == ATTACH_POS_BOTTOM)
+ {
+ visDir = ConnDirUp;
+ }
+
+ if (visDir == ConnDirNone)
+ {
+ visDir = ConnDirAll;
+ }
+ }
+ return visDir;
+ }
+ else
+ {
+ return _directions;
+ }
+}
+
+
ConnRef::ConnRef(Router *router, const unsigned int id)
- : _router(router)
- , _id(id)
- , _type(ConnType_PolyLine)
- , _srcId(0)
- , _dstId(0)
- , _needs_reroute_flag(true)
- , _false_path(false)
- , _active(false)
- , _route_dist(0)
- , _srcVert(NULL)
- , _dstVert(NULL)
- , _initialised(false)
- , _callback(NULL)
- , _connector(NULL)
- , _hateCrossings(false)
+ : _router(router),
+ _type(router->validConnType()),
+ _srcId(0),
+ _dstId(0),
+ _needs_reroute_flag(true),
+ _false_path(false),
+ _needs_repaint(false),
+ _active(false),
+ _route_dist(0),
+ _srcVert(NULL),
+ _dstVert(NULL),
+ _startVert(NULL),
+ _initialised(false),
+ _callback(NULL),
+ _connector(NULL),
+ _hateCrossings(false)
{
+ _id = router->assignId(id);
+
// TODO: Store endpoints and details.
- _route.pn = 0;
- _route.ps = NULL;
-}
-
-
-ConnRef::ConnRef(Router *router, const unsigned int id,
- const Point& src, const Point& dst)
- : _router(router)
- , _id(id)
- , _type(ConnType_PolyLine)
- , _srcId(0)
- , _dstId(0)
- , _needs_reroute_flag(true)
- , _false_path(false)
- , _active(false)
- , _route_dist(0)
- , _srcVert(NULL)
- , _dstVert(NULL)
- , _initialised(false)
- , _callback(NULL)
- , _connector(NULL)
- , _hateCrossings(false)
-{
- _route.pn = 0;
- _route.ps = NULL;
-
- if (_router->IncludeEndpoints)
- {
- bool isShape = false;
- _srcVert = new VertInf(_router, VertID(id, isShape, 1), src);
- _dstVert = new VertInf(_router, VertID(id, isShape, 2), dst);
- _router->vertices.addVertex(_srcVert);
- _router->vertices.addVertex(_dstVert);
- makeActive();
- _initialised = true;
- }
+ _route.clear();
+}
+
+
+ConnRef::ConnRef(Router *router, const ConnEnd& src, const ConnEnd& dst,
+ const unsigned int id)
+ : _router(router),
+ _type(router->validConnType()),
+ _srcId(0),
+ _dstId(0),
+ _needs_reroute_flag(true),
+ _false_path(false),
+ _needs_repaint(false),
+ _active(false),
+ _route_dist(0),
+ _srcVert(NULL),
+ _dstVert(NULL),
+ _initialised(false),
+ _callback(NULL),
+ _connector(NULL),
+ _hateCrossings(false)
+{
+ _id = router->assignId(id);
+ _route.clear();
+
+ bool isShape = false;
+ _srcVert = new VertInf(_router, VertID(_id, isShape, 1), src.point());
+ _srcVert->visDirections = src.directions();
+ _dstVert = new VertInf(_router, VertID(_id, isShape, 2), dst.point());
+ _dstVert->visDirections = dst.directions();
+ makeActive();
+ _initialised = true;
+
+ setEndpoints(src, dst);
}
ConnRef::~ConnRef()
{
- freeRoute();
+ _router->removeQueuedConnectorActions(this);
+ removeFromGraph();
+
+ freeRoutes();
if (_srcVert)
{
_dstVert = NULL;
}
- if (_active)
- {
- makeInactive();
- }
+ makeInactive();
}
-void ConnRef::setType(unsigned int type)
+ConnType ConnRef::routingType(void) const
{
- _type = type;
+ return _type;
}
-void ConnRef::updateEndPoint(const unsigned int type, const Point& point)
+void ConnRef::setRoutingType(ConnType type)
{
- assert((type == (unsigned int) VertID::src) ||
- (type == (unsigned int) VertID::tar));
-
- // XXX: This was commented out. Is there a case where it isn't true?
- assert(_router->IncludeEndpoints);
+ type = _router->validConnType(type);
+ if (_type != type)
+ {
+ _type = type;
+
+ makePathInvalid();
+
+ _router->modifyConnector(this);
+ }
+}
+
+void ConnRef::common_updateEndPoint(const unsigned int type, const ConnEnd& connEnd)
+{
+ const Point& point = connEnd.point();
+ //db_printf("common_updateEndPoint(%d,(pid=%d,vn=%d,(%f,%f)))\n",
+ // type,point.id,point.vn,point.x,point.y);
+ COLA_ASSERT((type == (unsigned int) VertID::src) ||
+ (type == (unsigned int) VertID::tar));
+
if (!_initialised)
{
makeActive();
{
if (_srcVert)
{
- _srcVert->Reset(point);
+ _srcVert->Reset(VertID(_id, isShape, type), point);
}
else
{
_srcVert = new VertInf(_router, VertID(_id, isShape, type), point);
- _router->vertices.addVertex(_srcVert);
}
+ _srcVert->visDirections = connEnd.directions();
altered = _srcVert;
partner = _dstVert;
}
- else // if (type == (unsigned int) VertID::dst)
+ else // if (type == (unsigned int) VertID::tar)
{
if (_dstVert)
{
- _dstVert->Reset(point);
+ _dstVert->Reset(VertID(_id, isShape, type), point);
}
else
{
_dstVert = new VertInf(_router, VertID(_id, isShape, type), point);
- _router->vertices.addVertex(_dstVert);
}
+ _dstVert->visDirections = connEnd.directions();
altered = _dstVert;
partner = _srcVert;
// XXX: Seems to be faster to just remove the edges and recreate
bool isConn = true;
altered->removeFromGraph(isConn);
- bool knownNew = true;
- vertexVisibility(altered, partner, knownNew, true);
+
+ makePathInvalid();
+ _router->setStaticGraphInvalidated(true);
+}
+
+
+void ConnRef::setEndpoints(const ConnEnd& srcPoint, const ConnEnd& dstPoint)
+{
+ _router->modifyConnector(this, VertID::src, srcPoint);
+ _router->modifyConnector(this, VertID::tar, dstPoint);
+}
+
+
+void ConnRef::setEndpoint(const unsigned int type, const ConnEnd& connEnd)
+{
+ _router->modifyConnector(this, type, connEnd);
+}
+
+
+void ConnRef::setSourceEndpoint(const ConnEnd& srcPoint)
+{
+ _router->modifyConnector(this, VertID::src, srcPoint);
+}
+
+
+void ConnRef::setDestEndpoint(const ConnEnd& dstPoint)
+{
+ _router->modifyConnector(this, VertID::tar, dstPoint);
+}
+
+
+void ConnRef::updateEndPoint(const unsigned int type, const ConnEnd& connEnd)
+{
+ common_updateEndPoint(type, connEnd);
+
+ if (_router->_polyLineRouting)
+ {
+ bool knownNew = true;
+ bool genContains = true;
+ if (type == (unsigned int) VertID::src)
+ {
+ vertexVisibility(_srcVert, _dstVert, knownNew, genContains);
+ }
+ else
+ {
+ vertexVisibility(_dstVert, _srcVert, knownNew, genContains);
+ }
+ }
+}
+
+
+bool ConnRef::setEndpoint(const unsigned int type, const VertID& pointID,
+ Point *pointSuggestion)
+{
+ VertInf *vInf = _router->vertices.getVertexByID(pointID);
+ if (vInf == NULL)
+ {
+ return false;
+ }
+ Point& point = vInf->point;
+ if (pointSuggestion)
+ {
+ if (euclideanDist(point, *pointSuggestion) > 0.5)
+ {
+ return false;
+ }
+ }
+
+ common_updateEndPoint(type, point);
+
+ // Give this visibility just to the point it is over.
+ EdgeInf *edge = new EdgeInf(
+ (type == VertID::src) ? _srcVert : _dstVert, vInf);
+ // XXX: We should be able to set this to zero, but can't due to
+ // assumptions elsewhere in the code.
+ edge->setDist(0.001);
+
+ _router->processTransaction();
+ return true;
}
void ConnRef::makeActive(void)
{
- assert(!_active);
+ COLA_ASSERT(!_active);
// Add to connRefs list.
_pos = _router->connRefs.insert(_router->connRefs.begin(), this);
void ConnRef::makeInactive(void)
{
- assert(_active);
+ COLA_ASSERT(_active);
// Remove from connRefs list.
_router->connRefs.erase(_pos);
}
-void ConnRef::freeRoute(void)
+void ConnRef::freeRoutes(void)
{
- if (_route.ps)
- {
- _route.pn = 0;
- std::free(_route.ps);
- _route.ps = NULL;
- }
+ _route.clear();
+ _display_route.clear();
}
-PolyLine& ConnRef::route(void)
+const PolyLine& ConnRef::route(void) const
{
return _route;
}
-void ConnRef::calcRouteDist(void)
+PolyLine& ConnRef::routeRef(void)
{
- _route_dist = 0;
- for (int i = 1; i < _route.pn; i++)
+ return _route;
+}
+
+
+void ConnRef::set_route(const PolyLine& route)
+{
+ if (&_display_route == &route)
{
- _route_dist += dist(_route.ps[i], _route.ps[i - 1]);
+ db_printf("Error:\tTrying to update libavoid route with itself.\n");
+ return;
}
+ _display_route.ps = route.ps;
+
+ //_display_route.clear();
}
-bool ConnRef::needsReroute(void)
+Polygon& ConnRef::displayRoute(void)
{
- return (_false_path || _needs_reroute_flag);
+ if (_display_route.empty())
+ {
+ // No displayRoute is set. Simplify the current route to get it.
+ _display_route = _route.simplify();
+ }
+ return _display_route;
}
-void ConnRef::lateSetup(const Point& src, const Point& dst)
+void ConnRef::calcRouteDist(void)
{
- assert(!_initialised);
+ double (*dist)(const Point& a, const Point& b) =
+ (_type == ConnType_PolyLine) ? euclideanDist : manhattanDist;
- bool isShape = false;
- _srcVert = new VertInf(_router, VertID(_id, isShape, 1), src);
- _dstVert = new VertInf(_router, VertID(_id, isShape, 2), dst);
- _router->vertices.addVertex(_srcVert);
- _router->vertices.addVertex(_dstVert);
- makeActive();
- _initialised = true;
+ _route_dist = 0;
+ for (size_t i = 1; i < _route.size(); ++i)
+ {
+ _route_dist += dist(_route.at(i), _route.at(i - 1));
+ }
}
-unsigned int ConnRef::id(void)
+bool ConnRef::needsRepaint(void) const
+{
+ return _needs_repaint;
+}
+
+
+unsigned int ConnRef::id(void) const
{
return _id;
}
}
+VertInf *ConnRef::start(void)
+{
+ return _startVert;
+}
+
+
bool ConnRef::isInitialised(void)
{
return _initialised;
void ConnRef::removeFromGraph(void)
{
- for (VertInf *iter = _srcVert; iter != NULL; )
- {
- VertInf *tmp = iter;
- iter = (iter == _srcVert) ? _dstVert : NULL;
-
- // For each vertex.
- EdgeInfList& visList = tmp->visList;
- EdgeInfList::iterator finish = visList.end();
- EdgeInfList::iterator edge;
- while ((edge = visList.begin()) != finish)
- {
- // Remove each visibility edge
- delete (*edge);
- }
-
- EdgeInfList& invisList = tmp->invisList;
- finish = invisList.end();
- while ((edge = invisList.begin()) != finish)
- {
- // Remove each invisibility edge
- delete (*edge);
- }
- }
+ _srcVert->removeFromGraph();
+ _dstVert->removeFromGraph();
}
}
-void ConnRef::handleInvalid(void)
+void ConnRef::performCallback(void)
{
- if (_false_path || _needs_reroute_flag) {
- if (_callback) {
- _callback(_connector);
- }
+ if (_callback)
+ {
+ _callback(_connector);
}
}
}
-Router *ConnRef::router(void)
+Router *ConnRef::router(void) const
{
return _router;
}
-int ConnRef::generatePath(Point p0, Point p1)
+bool ConnRef::generatePath(Point p0, Point p1)
+{
+ // XXX Code to determine when connectors really need to be rerouted
+ // does not yet work for orthogonal connectors.
+ if (_type != ConnType_Orthogonal)
+ {
+ if (!_false_path && !_needs_reroute_flag)
+ {
+ // This connector is up to date.
+ return false;
+ }
+ }
+
+ bool result = generatePath();
+
+ return result;
+}
+
+
+// Validates a bend point on a path to check it does not form a zigzag corner.
+// a, b, c are consecutive points on the path. d and e are b's neighbours,
+// forming the shape corner d-b-e.
+//
+bool validateBendPoint(VertInf *aInf, VertInf *bInf, VertInf *cInf)
{
- if (!_false_path && !_needs_reroute_flag) {
+ bool bendOkay = true;
+
+ if ((aInf == NULL) || (cInf == NULL))
+ {
+ // Not a bendpoint, i.e., the end of the connector, so don't test.
+ return bendOkay;
+ }
+
+ COLA_ASSERT(bInf != NULL);
+ VertInf *dInf = bInf->shPrev;
+ VertInf *eInf = bInf->shNext;
+ COLA_ASSERT(dInf != NULL);
+ COLA_ASSERT(eInf != NULL);
+
+ Point& a = aInf->point;
+ Point& b = bInf->point;
+ Point& c = cInf->point;
+ Point& d = dInf->point;
+ Point& e = eInf->point;
+
+ if ((a == b) || (b == c))
+ {
+ return bendOkay;
+ }
+
+#ifdef PATHDEBUG
+ db_printf("a=(%g, %g)\n", a.x, a.y);
+ db_printf("b=(%g, %g)\n", b.x, b.y);
+ db_printf("c=(%g, %g)\n", c.x, c.y);
+ db_printf("d=(%g, %g)\n", d.x, d.y);
+ db_printf("e=(%g, %g)\n", e.x, e.y);
+#endif
+ // Check angle:
+ int abc = vecDir(a, b, c);
+#ifdef PATHDEBUG
+ db_printf("(abc == %d) ", abc);
+#endif
+
+ if (abc == 0)
+ {
+ // The three consecutive point on the path are in a line.
+ // Thus, there should always be an equally short path that
+ // skips this bend point.
+ bendOkay = false;
+ }
+ else // (abc != 0)
+ {
+ COLA_ASSERT(vecDir(d, b, e) > 0);
+ int abe = vecDir(a, b, e);
+ int abd = vecDir(a, b, d);
+ int bce = vecDir(b, c, e);
+ int bcd = vecDir(b, c, d);
+#ifdef PATHDEBUG
+ db_printf("&& (abe == %d) && (abd == %d) &&\n(bce == %d) && (bcd == %d)",
+ abe, abd, bce, bcd);
+#endif
+
+ bendOkay = false;
+ if (abe > 0)
+ {
+ if ((abc > 0) && (abd >= 0) && (bce >= 0))
+ {
+ bendOkay = true;
+ }
+ }
+ else if (abd < 0)
+ {
+ if ((abc < 0) && (abe <= 0) && (bcd <= 0))
+ {
+ bendOkay = true;
+ }
+ }
+ }
+#ifdef PATHDEBUG
+ db_printf("\n");
+#endif
+ return bendOkay;
+}
+
+
+bool ConnRef::generatePath(void)
+{
+ if (!_false_path && !_needs_reroute_flag)
+ {
// This connector is up to date.
- return (int) false;
+ return false;
}
+ if (!_dstVert || !_srcVert)
+ {
+ // Connector is not fully initialised..
+ return false;
+ }
+
+ //COLA_ASSERT(_srcVert->point != _dstVert->point);
+
_false_path = false;
_needs_reroute_flag = false;
- VertInf *src = _srcVert;
VertInf *tar = _dstVert;
+ _startVert = _srcVert;
- if ( !(_router->IncludeEndpoints) )
- {
- lateSetup(p0, p1);
-
- // Update as they have just been set by lateSetup.
- src = _srcVert;
- tar = _dstVert;
+ bool *flag = &(_needs_reroute_flag);
- bool knownNew = true;
- bool genContains = true;
- vertexVisibility(src, tar, knownNew, genContains);
- vertexVisibility(tar, src, knownNew, genContains);
+ size_t existingPathStart = 0;
+ const PolyLine& currRoute = route();
+ if (_router->RubberBandRouting)
+ {
+ COLA_ASSERT(_router->IgnoreRegions == true);
+
+#ifdef PATHDEBUG
+ db_printf("\n");
+ _srcVert->id.db_print();
+ db_printf(": %g, %g\n", _srcVert->point.x, _srcVert->point.y);
+ tar->id.db_print();
+ db_printf(": %g, %g\n", tar->point.x, tar->point.y);
+ for (size_t i = 0; i < currRoute.ps.size(); ++i)
+ {
+ db_printf("%g, %g ", currRoute.ps[i].x, currRoute.ps[i].y);
+ }
+ db_printf("\n");
+#endif
+ if (currRoute.size() > 2)
+ {
+ if (_srcVert->point == currRoute.ps[0])
+ {
+ existingPathStart = currRoute.size() - 2;
+ COLA_ASSERT(existingPathStart != 0);
+ const Point& pnt = currRoute.at(existingPathStart);
+ bool isShape = true;
+ VertID vID(pnt.id, isShape, pnt.vn);
+
+ _startVert = _router->vertices.getVertexByID(vID);
+ }
+ }
+ }
+ //db_printf("GO\n");
+ //db_printf("src: %X strt: %X dst: %x\n", (int) _srcVert, (int) _startVert, (int) _dstVert);
+ bool found = false;
+ while (!found)
+ {
+ makePath(this, flag);
+ for (VertInf *i = tar; i != NULL; i = i->pathNext)
+ {
+ if (i == _srcVert)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ {
+ if (existingPathStart == 0)
+ {
+ break;
+ }
+#ifdef PATHDEBUG
+ db_printf("BACK\n");
+#endif
+ existingPathStart--;
+ const Point& pnt = currRoute.at(existingPathStart);
+ bool isShape = (existingPathStart > 0);
+ VertID vID(pnt.id, isShape, pnt.vn);
+
+ _startVert = _router->vertices.getVertexByID(vID);
+ COLA_ASSERT(_startVert);
+ }
+ else if (_router->RubberBandRouting)
+ {
+ // found.
+ bool unwind = false;
+
+#ifdef PATHDEBUG
+ db_printf("\n\n\nSTART:\n\n");
+#endif
+ VertInf *prior = NULL;
+ for (VertInf *curr = tar; curr != _startVert->pathNext;
+ curr = curr->pathNext)
+ {
+ if (!validateBendPoint(curr->pathNext, curr, prior))
+ {
+ unwind = true;
+ break;
+ }
+ prior = curr;
+ }
+ if (unwind)
+ {
+#ifdef PATHDEBUG
+ db_printf("BACK II\n");
+#endif
+ if (existingPathStart == 0)
+ {
+ break;
+ }
+ existingPathStart--;
+ const Point& pnt = currRoute.at(existingPathStart);
+ bool isShape = (existingPathStart > 0);
+ VertID vID(pnt.id, isShape, pnt.vn);
+
+ _startVert = _router->vertices.getVertexByID(vID);
+ COLA_ASSERT(_startVert);
+
+ found = false;
+ }
+ }
}
- bool *flag = &(_needs_reroute_flag);
-
- makePath(this, flag);
bool result = true;
int pathlen = 1;
- for (VertInf *i = tar; i != src; i = i->pathNext)
+ for (VertInf *i = tar; i != _srcVert; i = i->pathNext)
{
pathlen++;
if (i == NULL)
{
db_printf("Warning: Path not found...\n");
pathlen = 2;
- tar->pathNext = src;
- if (_router->InvisibilityGrph)
+ tar->pathNext = _srcVert;
+ if ((_type == ConnType_PolyLine) && _router->InvisibilityGrph)
{
// TODO: Could we know this edge already?
- EdgeInf *edge = EdgeInf::existingEdge(src, tar);
- assert(edge != NULL);
+ EdgeInf *edge = EdgeInf::existingEdge(_srcVert, tar);
+ COLA_ASSERT(edge != NULL);
edge->addCycleBlocker();
}
- result = false;
break;
}
- if (pathlen > 100)
- {
- fprintf(stderr, "ERROR: Should never be here...\n");
- exit(1);
- }
+ // Check we don't have an apparent infinite connector path.
+ COLA_ASSERT(pathlen < 200);
}
- Point *path = (Point *) malloc(pathlen * sizeof(Point));
+ std::vector<Point> path(pathlen);
int j = pathlen - 1;
- for (VertInf *i = tar; i != src; i = i->pathNext)
+ for (VertInf *i = tar; i != _srcVert; i = i->pathNext)
{
- if (_router->InvisibilityGrph)
+ if (_router->InvisibilityGrph && (_type == ConnType_PolyLine))
{
// TODO: Again, we could know this edge without searching.
EdgeInf *edge = EdgeInf::existingEdge(i, i->pathNext);
+ COLA_ASSERT(edge != NULL);
edge->addConn(flag);
}
else
_false_path = true;
}
path[j] = i->point;
- path[j].id = i->id.objID;
+ if (i->id.isShape)
+ {
+ path[j].id = i->id.objID;
+ path[j].vn = i->id.vn;
+ }
+ else
+ {
+ path[j].id = _id;
+ path[j].vn = kUnassignedVertexNumber;
+ }
j--;
- }
- path[0] = src->point;
+ if (i->pathNext && (i->pathNext->point == i->point))
+ {
+ if (i->pathNext->id.isShape && i->id.isShape)
+ {
+ // Check for consecutive points on opposite
+ // corners of two touching shapes.
+ COLA_ASSERT(abs(i->pathNext->id.objID - i->id.objID) != 2);
+ }
+ }
+ }
+ path[0] = _srcVert->point;
+ // Use topbit to differentiate between start and end point of connector.
+ // They need unique IDs for nudging.
+ unsigned int topbit = ((unsigned int) 1) << 31;
+ path[0].id = _id | topbit;
+ path[0].vn = kUnassignedVertexNumber;
// Would clear visibility for endpoints here if required.
- PolyLine& output_route = route();
- output_route.pn = pathlen;
+ freeRoutes();
+ PolyLine& output_route = _route;
output_route.ps = path;
- if ( !(_router->IncludeEndpoints) )
+#ifdef PATHDEBUG
+ db_printf("Output route:\n");
+ for (size_t i = 0; i < output_route.ps.size(); ++i)
{
- assert(_initialised);
- unInitialise();
+ db_printf("[%d,%d] %g, %g ", output_route.ps[i].id,
+ output_route.ps[i].vn, output_route.ps[i].x,
+ output_route.ps[i].y);
}
-
- return (int) result;
+ db_printf("\n\n");
+#endif
+
+ return result;
}
}
+PtOrder::~PtOrder()
+{
+ // Free the PointRep lists.
+ for (int dim = 0; dim < 2; ++dim)
+ {
+ PointRepList::iterator curr = connList[dim].begin();
+ while (curr != connList[dim].end())
+ {
+ PointRep *doomed = *curr;
+ curr = connList[dim].erase(curr);
+ delete doomed;
+ }
+ }
+}
+
+bool PointRep::follow_inner(PointRep *target)
+{
+ if (this == target)
+ {
+ return true;
+ }
+ else
+ {
+ for (PointRepSet::iterator curr = inner_set.begin();
+ curr != inner_set.end(); ++curr)
+ {
+ if ((*curr)->follow_inner(target))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
+int PtOrder::positionFor(const ConnRef *conn, const size_t dim) const
+{
+ int position = 0;
+ for (PointRepList::const_iterator curr = connList[dim].begin();
+ curr != connList[dim].end(); ++curr)
+ {
+ if ((*curr)->conn == conn)
+ {
+ return position;
+ }
+ ++position;
+ }
+ // Not found.
+ return -1;
+}
+
+
+bool PtOrder::addPoints(const int dim, PtConnPtrPair innerArg,
+ PtConnPtrPair outerArg, bool swapped)
+{
+ PtConnPtrPair inner = (swapped) ? outerArg : innerArg;
+ PtConnPtrPair outer = (swapped) ? innerArg : outerArg;
+ COLA_ASSERT(inner != outer);
+
+ //printf("addPoints(%d, [%g, %g]-%X, [%g, %g]-%X)\n", dim,
+ // inner->x, inner->y, (int) inner, outer->x, outer->y, (int) outer);
+
+ PointRep *innerPtr = NULL;
+ PointRep *outerPtr = NULL;
+ for (PointRepList::iterator curr = connList[dim].begin();
+ curr != connList[dim].end(); ++curr)
+ {
+ if ((*curr)->point == inner.first)
+ {
+ innerPtr = *curr;
+ }
+ if ((*curr)->point == outer.first)
+ {
+ outerPtr = *curr;
+ }
+ }
+
+ if (innerPtr == NULL)
+ {
+ innerPtr = new PointRep(inner.first, inner.second);
+ connList[dim].push_back(innerPtr);
+ }
+
+ if (outerPtr == NULL)
+ {
+ outerPtr = new PointRep(outer.first, outer.second);
+ connList[dim].push_back(outerPtr);
+ }
+ // TODO COLA_ASSERT(innerPtr->inner_set.find(outerPtr) == innerPtr->inner_set.end());
+ bool cycle = innerPtr->follow_inner(outerPtr);
+ if (cycle)
+ {
+ // Must reverse to avoid a cycle.
+ innerPtr->inner_set.insert(outerPtr);
+ }
+ else
+ {
+ outerPtr->inner_set.insert(innerPtr);
+ }
+ return cycle;
+}
+
+
+// Assuming that addPoints has been called for each pair of points in the
+// shared path at that corner, then the contents of inner_set can be used
+// to determine the correct ordering.
+static bool pointRepLessThan(PointRep *r1, PointRep *r2)
+{
+ size_t r1less = r1->inner_set.size();
+ size_t r2less = r2->inner_set.size();
+ //COLA_ASSERT(r1less != r2less);
+
+ return (r1less > r2less);
+}
+
+
+void PtOrder::sort(const int dim)
+{
+ connList[dim].sort(pointRepLessThan);
+}
+
+
+// Returns a vertex number representing a point on the line between
+// two shape corners, represented by p0 and p1.
+//
+static int midVertexNumber(const Point& p0, const Point& p1, const Point& c)
+{
+ if (c.vn != kUnassignedVertexNumber)
+ {
+ // The split point is a shape corner, so doesn't need its
+ // vertex number adjusting.
+ return c.vn;
+ }
+ if ((p0.vn >= 4) && (p0.vn < kUnassignedVertexNumber))
+ {
+ // The point next to this has the correct nudging direction,
+ // so use that.
+ return p0.vn;
+ }
+ if ((p1.vn >= 4) && (p1.vn < kUnassignedVertexNumber))
+ {
+ // The point next to this has the correct nudging direction,
+ // so use that.
+ return p1.vn;
+ }
+ if ((p0.vn < 4) && (p1.vn < 4))
+ {
+ if (p0.vn != p1.vn)
+ {
+ return p0.vn;
+ }
+ // Splitting between two ordinary shape corners.
+ int vn_mid = std::min(p0.vn, p1.vn);
+ if ((std::max(p0.vn, p1.vn) == 3) && (vn_mid == 0))
+ {
+ vn_mid = 3; // Next vn is effectively 4.
+ }
+ return vn_mid + 4;
+ }
+ COLA_ASSERT((p0.x == p1.x) || (p0.y == p1.y));
+ if (p0.vn != kUnassignedVertexNumber)
+ {
+ if (p0.x == p1.x)
+ {
+ if ((p0.vn == 2) || (p0.vn == 3))
+ {
+ return 6;
+ }
+ return 4;
+ }
+ else
+ {
+ if ((p0.vn == 0) || (p0.vn == 3))
+ {
+ return 7;
+ }
+ return 5;
+ }
+ }
+ else if (p1.vn != kUnassignedVertexNumber)
+ {
+ if (p0.x == p1.x)
+ {
+ if ((p1.vn == 2) || (p1.vn == 3))
+ {
+ return 6;
+ }
+ return 4;
+ }
+ else
+ {
+ if ((p1.vn == 0) || (p1.vn == 3))
+ {
+ return 7;
+ }
+ return 5;
+ }
+ }
+
+ // Shouldn't both be new (kUnassignedVertexNumber) points.
+ db_printf("midVertexNumber(): p0.vn and p1.vn both = "
+ "kUnassignedVertexNumber\n");
+ db_printf("p0.vn %d p1.vn %d\n", p0.vn, p1.vn);
+ return kUnassignedVertexNumber;
+}
+
+
+// Break up overlapping parallel segments that are not the same edge in
+// the visibility graph, i.e., where one segment is a subsegment of another.
+void splitBranchingSegments(Avoid::Polygon& poly, bool polyIsConn,
+ Avoid::Polygon& conn, const double tolerance)
+{
+ for (std::vector<Avoid::Point>::iterator i = conn.ps.begin();
+ i != conn.ps.end(); ++i)
+ {
+ if (i == conn.ps.begin())
+ {
+ // Skip the first point.
+ // There are points-1 segments in a connector.
+ continue;
+ }
+
+ for (std::vector<Avoid::Point>::iterator j = poly.ps.begin();
+ j != poly.ps.end(); )
+ {
+ if (polyIsConn && (j == poly.ps.begin()))
+ {
+ // Skip the first point.
+ // There are points-1 segments in a connector.
+ ++j;
+ continue;
+ }
+ Point& c0 = *(i - 1);
+ Point& c1 = *i;
+
+ Point& p0 = (j == poly.ps.begin()) ? poly.ps.back() : *(j - 1);
+ Point& p1 = *j;
+
+ // Check the first point of the first segment.
+ if (((i - 1) == conn.ps.begin()) &&
+ pointOnLine(p0, p1, c0, tolerance))
+ {
+ //db_printf("add to poly %g %g\n", c0.x, c0.y);
+
+ c0.vn = midVertexNumber(p0, p1, c0);
+ j = poly.ps.insert(j, c0);
+ if (j != poly.ps.begin())
+ {
+ --j;
+ }
+ continue;
+ }
+ // And the second point of every segment.
+ if (pointOnLine(p0, p1, c1, tolerance))
+ {
+ //db_printf("add to poly %g %g\n", c1.x, c1.y);
+
+ c1.vn = midVertexNumber(p0, p1, c1);
+ j = poly.ps.insert(j, c1);
+ if (j != poly.ps.begin())
+ {
+ --j;
+ }
+ continue;
+ }
+
+ // Check the first point of the first segment.
+ if (polyIsConn && ((j - 1) == poly.ps.begin()) &&
+ pointOnLine(c0, c1, p0, tolerance))
+ {
+ //db_printf("add to conn %g %g\n", p0.x, p0.y);
+
+ p0.vn = midVertexNumber(c0, c1, p0);
+ i = conn.ps.insert(i, p0);
+ continue;
+ }
+ // And the second point of every segment.
+ if (pointOnLine(c0, c1, p1, tolerance))
+ {
+ //db_printf("add to conn %g %g\n", p1.x, p1.y);
+
+ p1.vn = midVertexNumber(c0, c1, p1);
+ i = conn.ps.insert(i, p1);
+ }
+ ++j;
+ }
+ }
+}
+
+
+static int segDir(const Point& p1, const Point& p2)
+{
+ int result = 1;
+ if (p1.x == p2.x)
+ {
+ if (p2.y > p1.y)
+ {
+ result = -1;
+ }
+ }
+ else if (p1.y == p2.y)
+ {
+ if (p2.x < p1.x)
+ {
+ result = -1;
+ }
+ }
+ return result;
+}
+
+
+// Works out if the segment conn[cIndex-1]--conn[cIndex] really crosses poly.
+// This does not not count non-crossing shared paths as crossings.
+// poly can be either a connector (polyIsConn = true) or a cluster
+// boundary (polyIsConn = false).
+//
+CrossingsInfoPair countRealCrossings(Avoid::Polygon& poly,
+ bool polyIsConn, Avoid::Polygon& conn, size_t cIndex,
+ bool checkForBranchingSegments, const bool finalSegment,
+ PointSet *crossingPoints, PtOrderMap *pointOrders,
+ ConnRef *polyConnRef, ConnRef *connConnRef)
+{
+ unsigned int crossingFlags = CROSSING_NONE;
+ if (checkForBranchingSegments)
+ {
+ size_t conn_pn = conn.size();
+ // XXX When doing the pointOnLine test we allow the points to be
+ // slightly non-collinear. This addresses a problem with clustered
+ // routing where connectors could otherwise route cheaply through
+ // shape corners that were not quite on the cluster boundary, but
+ // reported to be on there by the line segment intersection code,
+ // which I suspect is not numerically accurate enough. This occured
+ // for points that only differed by about 10^-12 in the y-dimension.
+ double tolerance = (!polyIsConn) ? 0.00001 : 0.0;
+ splitBranchingSegments(poly, polyIsConn, conn, tolerance);
+ // cIndex is going to be the last, so take into account added points.
+ cIndex += (conn.size() - conn_pn);
+ }
+ COLA_ASSERT(cIndex >= 1);
+ COLA_ASSERT(cIndex < conn.size());
+
+ bool polyIsOrthogonal = (polyConnRef &&
+ (polyConnRef->routingType() == ConnType_Orthogonal));
+ bool connIsOrthogonal = (connConnRef &&
+ (connConnRef->routingType() == ConnType_Orthogonal));
+
+ size_t poly_size = poly.size();
+ int crossingCount = 0;
+ std::vector<Avoid::Point *> c_path;
+ std::vector<Avoid::Point *> p_path;
+
+ Avoid::Point& a1 = conn.ps[cIndex - 1];
+ Avoid::Point& a2 = conn.ps[cIndex];
+ //db_printf("a1: %g %g\n", a1.x, a1.y);
+ //db_printf("a2: %g %g\n", a2.x, a2.y);
+
+ for (size_t j = ((polyIsConn) ? 1 : 0); j < poly_size; ++j)
+ {
+ Avoid::Point& b1 = poly.ps[(j - 1 + poly_size) % poly_size];
+ Avoid::Point& b2 = poly.ps[j];
+ //db_printf("b1: %g %g\n", b1.x, b1.y);
+ //db_printf("b2: %g %g\n", b2.x, b2.y);
+
+ p_path.clear();
+ c_path.clear();
+ bool converging = false;
+
+ const bool a1_eq_b1 = (a1 == b1);
+ const bool a2_eq_b1 = (a2 == b1);
+ const bool a2_eq_b2 = (a2 == b2);
+ const bool a1_eq_b2 = (a1 == b2);
+
+ if ( (a1_eq_b1 && a2_eq_b2) ||
+ (a2_eq_b1 && a1_eq_b2) )
+ {
+ if (finalSegment)
+ {
+ converging = true;
+ }
+ else
+ {
+ // Route along same segment: no penalty. We detect
+ // crossovers when we see the segments diverge.
+ continue;
+ }
+ }
+ else if (a2_eq_b1 || a2_eq_b2 || a1_eq_b2)
+ {
+ // Each crossing that is at a vertex in the
+ // visibility graph gets noticed four times.
+ // We ignore three of these cases.
+ // This also catches the case of a shared path,
+ // but this is one that terminates at a common
+ // endpoint, so we don't care about it.
+ continue;
+ }
+
+ if (a1_eq_b1 || converging)
+ {
+ if (!converging)
+ {
+ if (polyIsConn && (j == 1))
+ {
+ // Can't be the end of a shared path or crossing path
+ // since the common point is the first point of the
+ // connector path. This is not a shared path at all.
+ continue;
+ }
+
+ Avoid::Point& b0 = poly.ps[(j - 2 + poly_size) % poly_size];
+ // The segments share an endpoint -- a1==b1.
+ if (a2 == b0)
+ {
+ // a2 is not a split, continue.
+ continue;
+ }
+ }
+
+ // If here and not converging, then we know that a2 != b2
+ // And a2 and its pair in b are a split.
+ COLA_ASSERT(converging || !a2_eq_b2);
+
+ bool shared_path = false;
+
+ // Initial values here don't matter. They are only used after
+ // being set to sensible values, but we set them to stop a MSVC
+ // warning.
+ bool p_dir_back;
+ int p_dir = 0;
+ int trace_c = 0;
+ int trace_p = 0;
+
+ if (converging)
+ {
+ // Determine direction we have to look through
+ // the points of connector b.
+ p_dir_back = a2_eq_b2 ? true : false;
+ p_dir = p_dir_back ? -1 : 1;
+ trace_c = (int) cIndex;
+ trace_p = (int) j;
+ if (!p_dir_back)
+ {
+ if (finalSegment)
+ {
+ trace_p--;
+ }
+ else
+ {
+ trace_c--;
+ }
+ }
+
+ shared_path = true;
+ }
+ else if (cIndex >= 2)
+ {
+ Avoid::Point& b0 = poly.ps[(j - 2 + poly_size) % poly_size];
+ Avoid::Point& a0 = conn.ps[cIndex - 2];
+
+ //db_printf("a0: %g %g\n", a0.x, a0.y);
+ //db_printf("b0: %g %g\n", b0.x, b0.y);
+
+ if ((a0 == b2) || (a0 == b0))
+ {
+ // Determine direction we have to look through
+ // the points of connector b.
+ p_dir_back = (a0 == b0) ? true : false;
+ p_dir = p_dir_back ? -1 : 1;
+ trace_c = (int) cIndex;
+ trace_p = (int) (p_dir_back ? j : j - 2);
+
+ shared_path = true;
+ }
+ }
+
+ if (shared_path)
+ {
+ crossingFlags |= CROSSING_SHARES_PATH;
+ // Shouldn't be here if p_dir is still equal to zero.
+ COLA_ASSERT(p_dir != 0);
+
+ // Build the shared path, including the diverging points at
+ // each end if the connector does not end at a common point.
+ while ( (trace_c >= 0) && (!polyIsConn ||
+ ((trace_p >= 0) && (trace_p < (int) poly_size))) )
+ {
+ // If poly is a cluster boundary, then it is a closed
+ // poly-line and so it wraps arounds.
+ size_t index_p = (size_t)
+ ((trace_p + (2 * poly_size)) % poly_size);
+ size_t index_c = (size_t) trace_c;
+ c_path.push_back(&conn.ps[index_c]);
+ p_path.push_back(&poly.ps[index_p]);
+ if ((c_path.size() > 1) &&
+ (conn.ps[index_c] != poly.ps[index_p]))
+ {
+ // Points don't match, so break out of loop.
+ break;
+ }
+ trace_c--;
+ trace_p += p_dir;
+ }
+
+ // Are there diverging points at the ends of the shared path.
+ bool front_same = (*(c_path.front()) == *(p_path.front()));
+ bool back_same = (*(c_path.back()) == *(p_path.back()));
+
+ size_t size = c_path.size();
+
+ // Check to see if these share a fixed segment.
+ if (polyIsOrthogonal && connIsOrthogonal)
+ {
+ size_t startPt = (front_same) ? 0 : 1;
+ if (c_path[startPt]->x == c_path[startPt + 1]->x)
+ {
+ // Vertical
+ double xPos = c_path[startPt]->x;
+ // See if this is inline with either the start
+ // or end point of both connectors.
+ if ( ((xPos == poly.ps[0].x) ||
+ (xPos == poly.ps[poly_size - 1].x)) &&
+ ((xPos == conn.ps[0].x) ||
+ (xPos == conn.ps[cIndex].x)) )
+ {
+ crossingFlags |= CROSSING_SHARES_FIXED_SEGMENT;
+ }
+ }
+ else
+ {
+ // Horizontal
+ double yPos = c_path[startPt]->y;
+ // See if this is inline with either the start
+ // or end point of both connectors.
+ if ( ((yPos == poly.ps[0].y) ||
+ (yPos == poly.ps[poly_size - 1].y)) &&
+ ((yPos == conn.ps[0].y) ||
+ (yPos == conn.ps[cIndex].y)) )
+ {
+ crossingFlags |= CROSSING_SHARES_FIXED_SEGMENT;
+ }
+ }
+ }
+
+ int prevTurnDir = -1;
+ int startCornerSide = 1;
+ int endCornerSide = 1;
+ bool reversed = false;
+ if (!front_same)
+ {
+ // If there is a divergence at the beginning,
+ // then order the shared path based on this.
+ prevTurnDir = vecDir(*c_path[0], *c_path[1], *c_path[2]);
+ startCornerSide = Avoid::cornerSide(*c_path[0], *c_path[1],
+ *c_path[2], *p_path[0])
+ * segDir(*c_path[1], *c_path[2]);
+ reversed = (startCornerSide != -prevTurnDir);
+ }
+ if (!back_same)
+ {
+ // If there is a divergence at the end of the path,
+ // then order the shared path based on this.
+ prevTurnDir = vecDir(*c_path[size - 3],
+ *c_path[size - 2], *c_path[size - 1]);
+ endCornerSide = Avoid::cornerSide(*c_path[size - 3],
+ *c_path[size - 2], *c_path[size - 1],
+ *p_path[size - 1])
+ * segDir(*c_path[size - 3], *c_path[size - 2]);
+ reversed = (endCornerSide != -prevTurnDir);
+ }
+ else
+ {
+ endCornerSide = startCornerSide;
+ }
+ if (front_same)
+ {
+ startCornerSide = endCornerSide;
+ }
+
+ if (front_same || back_same)
+ {
+ crossingFlags |= CROSSING_SHARES_PATH_AT_END;
+ }
+ else if (polyIsOrthogonal && connIsOrthogonal)
+ {
+ int cStartDir = vecDir(*c_path[0], *c_path[1], *c_path[2]);
+ int pStartDir = vecDir(*p_path[0], *p_path[1], *p_path[2]);
+ if ((cStartDir != 0) && (cStartDir == -pStartDir))
+ {
+ // The start segments diverge at 180 degrees to each
+ // other. So order based on not introducing overlap
+ // of the diverging segments when these are nudged
+ // apart.
+ startCornerSide = -cStartDir *
+ segDir(*c_path[1], *c_path[2]);
+ }
+ else
+ {
+ int cEndDir = vecDir(*c_path[size - 3],
+ *c_path[size - 2], *c_path[size - 1]);
+ int pEndDir = vecDir(*p_path[size - 3],
+ *p_path[size - 2], *p_path[size - 1]);
+ if ((cEndDir != 0) && (cEndDir == -pEndDir))
+ {
+ // The end segments diverge at 180 degrees to
+ // each other. So order based on not introducing
+ // overlap of the diverging segments when these
+ // are nudged apart.
+ startCornerSide = -cEndDir * segDir(
+ *c_path[size - 3], *c_path[size - 2]);
+ }
+ }
+ }
+
+#if 0
+ prevTurnDir = 0;
+ if (pointOrders)
+ {
+ // Return the ordering for the shared path.
+ COLA_ASSERT(c_path.size() > 0 || back_same);
+ size_t adj_size = (c_path.size() - ((back_same) ? 0 : 1));
+ for (size_t i = (front_same) ? 0 : 1; i < adj_size; ++i)
+ {
+ Avoid::Point& an = *(c_path[i]);
+ Avoid::Point& bn = *(p_path[i]);
+ int currTurnDir = ((i > 0) && (i < (adj_size - 1))) ?
+ vecDir(*c_path[i - 1], an,
+ *c_path[i + 1]) : 0;
+ VertID vID(an.id, true, an.vn);
+ if ( (currTurnDir == (-1 * prevTurnDir)) &&
+ (currTurnDir != 0) && (prevTurnDir != 0) )
+ {
+ // The connector turns the opposite way around
+ // this shape as the previous bend on the path,
+ // so reverse the order so that the inner path
+ // become the outer path and vice versa.
+ reversed = !reversed;
+ }
+ bool orderSwapped = (*pointOrders)[an].addPoints(
+ &bn, &an, reversed);
+ if (orderSwapped)
+ {
+ // Reverse the order for later points.
+ reversed = !reversed;
+ }
+ prevTurnDir = currTurnDir;
+ }
+ }
+#endif
+ prevTurnDir = 0;
+ if (pointOrders)
+ {
+ reversed = false;
+ size_t startPt = (front_same) ? 0 : 1;
+
+ // Orthogonal should always have at least one segment.
+ COLA_ASSERT(c_path.size() > (startPt + 1));
+
+ if (startCornerSide > 0)
+ {
+ reversed = !reversed;
+ }
+
+ int prevDir = 0;
+ // Return the ordering for the shared path.
+ COLA_ASSERT(c_path.size() > 0 || back_same);
+ size_t adj_size = (c_path.size() - ((back_same) ? 0 : 1));
+ for (size_t i = (front_same) ? 0 : 1; i < adj_size; ++i)
+ {
+ Avoid::Point& an = *(c_path[i]);
+ Avoid::Point& bn = *(p_path[i]);
+ COLA_ASSERT(an == bn);
+
+ int thisDir = prevDir;
+ if ((i > 0) && (*(c_path[i - 1]) == *(p_path[i - 1])))
+ {
+ thisDir = segDir(*c_path[i - 1], *c_path[i]);
+ }
+
+ if (thisDir != prevDir)
+ {
+ reversed = !reversed;
+ }
+ prevDir = thisDir;
+
+ if (i > startPt)
+ {
+ Avoid::Point& ap = *(c_path[i - 1]);
+ Avoid::Point& bp = *(p_path[i - 1]);
+ int orientation = (ap.x == an.x) ? 0 : 1;
+ //printf("prevOri %d\n", prevOrientation);
+ //printf("1: %X, %X\n", (int) &(bn), (int) &(an));
+ bool orderSwapped = (*pointOrders)[an].addPoints(
+ orientation,
+ std::make_pair(&bn, polyConnRef),
+ std::make_pair(&an, connConnRef),
+ reversed);
+ if (orderSwapped)
+ {
+ // Reverse the order for later points.
+ reversed = !reversed;
+ }
+ COLA_ASSERT(ap == bp);
+ //printf("2: %X, %X\n", (int) &bp, (int) &ap);
+ orderSwapped = (*pointOrders)[ap].addPoints(
+ orientation,
+ std::make_pair(&bp, polyConnRef),
+ std::make_pair(&ap, connConnRef),
+ reversed);
+ COLA_ASSERT(!orderSwapped);
+ }
+ }
+ }
+#if 0
+ int ymod = -1;
+ if ((id.vn == 1) || (id.vn == 2))
+ {
+ // bottom.
+ ymod = +1;
+ }
+
+ int xmod = -1;
+ if ((id.vn == 0) || (id.vn == 1))
+ {
+ // right.
+ xmod = +1;
+ }
+ if(id.vn > 3)
+ {
+ xmod = ymod = 0;
+ if (id.vn == 4)
+ {
+ // right.
+ xmod = +1;
+ }
+ else if (id.vn == 5)
+ {
+ // bottom.
+ ymod = +1;
+ }
+ else if (id.vn == 6)
+ {
+ // left.
+ xmod = -1;
+ }
+ else if (id.vn == 7)
+ {
+ // top.
+ ymod = -1;
+ }
+ }
+#endif
+
+ if (endCornerSide != startCornerSide)
+ {
+ // Mark that the shared path crosses.
+ //db_printf("shared path crosses.\n");
+ crossingCount += 1;
+ if (crossingPoints)
+ {
+ crossingPoints->insert(*c_path[1]);
+ }
+ }
+ crossingFlags |= CROSSING_TOUCHES;
+ }
+ else if (cIndex >= 2)
+ {
+ // The connectors cross or touch at this point.
+ //db_printf("Cross or touch at point... \n");
+
+ // Crossing shouldn't be at an endpoint.
+ COLA_ASSERT(cIndex >= 2);
+ COLA_ASSERT(polyIsConn && (j >= 2));
+
+ Avoid::Point& b0 = poly.ps[(j - 2 + poly_size) % poly_size];
+ Avoid::Point& a0 = conn.ps[cIndex - 2];
+
+ int side1 = Avoid::cornerSide(a0, a1, a2, b0);
+ int side2 = Avoid::cornerSide(a0, a1, a2, b2);
+ if (side1 != side2)
+ {
+ // The connectors cross at this point.
+ //db_printf("cross.\n");
+ crossingCount += 1;
+ if (crossingPoints)
+ {
+ crossingPoints->insert(a1);
+ }
+ }
+
+ crossingFlags |= CROSSING_TOUCHES;
+ if (pointOrders)
+ {
+ if (polyIsOrthogonal && connIsOrthogonal)
+ {
+ // Orthogonal case:
+ // Just order based on which comes from the left and
+ // top in each dimension because this can only be two
+ // L-shaped segments touching at the bend.
+ bool reversedX = ((a0.x < a1.x) || (a2.x < a1.x));
+ bool reversedY = ((a0.y < a1.y) || (a2.y < a1.y));
+ // XXX: Why do we need to invert the reversed values
+ // here? Are they wrong for orthogonal points
+ // in the other places?
+ (*pointOrders)[b1].addPoints(0,
+ std::make_pair(&b1, polyConnRef),
+ std::make_pair(&a1, connConnRef),
+ !reversedX);
+ (*pointOrders)[b1].addPoints(1,
+ std::make_pair(&b1, polyConnRef),
+ std::make_pair(&a1, connConnRef),
+ !reversedY);
+ }
+ else
+ {
+ int turnDirA = vecDir(a0, a1, a2);
+ int turnDirB = vecDir(b0, b1, b2);
+ bool reversed = (side1 != -turnDirA);
+ if (side1 != side2)
+ {
+ // Interesting case where a connector routes round
+ // the edge of a shape and intersects a connector
+ // which is connected to a port on the edge of the
+ // shape.
+ if (turnDirA == 0)
+ {
+ // We'll make B the outer by preference,
+ // because the points of A are collinear.
+ reversed = false;
+ }
+ else if (turnDirB == 0)
+ {
+ reversed = true;
+ }
+ // TODO COLA_ASSERT((turnDirB != 0) ||
+ // (turnDirA != 0));
+ }
+ VertID vID(b1.id, true, b1.vn);
+ //(*pointOrders)[b1].addPoints(&b1, &a1, reversed);
+ }
+ }
+ }
+ }
+ else
+ {
+ if ( polyIsOrthogonal && connIsOrthogonal)
+ {
+ // All crossings in orthogonal connectors will be at a
+ // vertex in the visibility graph, so we need not bother
+ // doing normal line intersection.
+ continue;
+ }
+
+ // No endpoint is shared between these two line segments,
+ // so just calculate normal segment intersection.
+
+ Point cPt;
+ int intersectResult = Avoid::segmentIntersectPoint(
+ a1, a2, b1, b2, &(cPt.x), &(cPt.y));
+
+ if (intersectResult == Avoid::DO_INTERSECT)
+ {
+ if (!polyIsConn &&
+ ((a1 == cPt) || (a2 == cPt) || (b1 == cPt) || (b2 == cPt)))
+ {
+ // XXX: This shouldn't actually happen, because these
+ // points should be added as bends to each line by
+ // splitBranchingSegments(). Thus, lets ignore them.
+ COLA_ASSERT(a1 != cPt);
+ COLA_ASSERT(a2 != cPt);
+ COLA_ASSERT(b1 != cPt);
+ COLA_ASSERT(b2 != cPt);
+ continue;
+ }
+ //db_printf("crossing lines:\n");
+ //db_printf("cPt: %g %g\n", cPt.x, cPt.y);
+ crossingCount += 1;
+ if (crossingPoints)
+ {
+ crossingPoints->insert(cPt);
+ }
+ }
+ }
+ }
+ //db_printf("crossingcount %d\n", crossingCount);
+ return std::make_pair(crossingCount, crossingFlags);
+}
+
+
//============================================================================
}
index 64afb4dda7f9abe698031613d687ac7522f692d7..8f7499a2934838709479ec325a87d5a18713761c 100644 (file)
--- a/src/libavoid/connector.h
+++ b/src/libavoid/connector.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+//! @file shape.h
+//! @brief Contains the interface for the ConnRef class.
+
+
#ifndef AVOID_CONNECTOR_H
#define AVOID_CONNECTOR_H
-#include "libavoid/router.h"
+#include <list>
+#include <vector>
+
+#include "libavoid/vertices.h"
#include "libavoid/geometry.h"
#include "libavoid/shape.h"
-#include <list>
namespace Avoid {
+class Router;
+class ConnRef;
+typedef std::list<ConnRef *> ConnRefList;
+
+
+//! @brief Describes the type of routing that is performed for each
+//! connector.
+enum ConnType {
+ ConnType_None = 0,
+ //! @brief The connector path will be a shortest-path poly-line that
+ //! routes around obstacles.
+ ConnType_PolyLine = 1,
+ //! @brief The connector path will be a shortest-path orthogonal
+ //! poly-line (only vertical and horizontal line segments) that
+ //! routes around obstacles.
+ ConnType_Orthogonal = 2
+};
+
+//! @brief Flags that can be passed to the ConnEnd constructor to specify
+//! which sides of a shape this point should have visibility to if
+//! it is located within the shape's area.
+//!
+//! Like SVG, libavoid considers the Y-axis to point downwards, that is,
+//! like screen coordinates the coordinates increase from left-to-right and
+//! also from top-to-bottom.
+//!
+enum ConnDirFlag {
+ ConnDirNone = 0,
+ //! @brief This option specifies the point should be given visibility
+ //! to the top of the shape that it is located within.
+ ConnDirUp = 1,
+ //! @brief This option specifies the point should be given visibility
+ //! to the bottom of the shape that it is located within.
+ ConnDirDown = 2,
+ //! @brief This option specifies the point should be given visibility
+ //! to the left side of the shape that it is located within.
+ ConnDirLeft = 4,
+ //! @brief This option specifies the point should be given visibility
+ //! to the right side of the shape that it is located within.
+ ConnDirRight = 8,
+ //! @brief This option, provided for convenience, specifies the point
+ //! should be given visibility to all four sides of the shape
+ //! that it is located within.
+ ConnDirAll = 15
+};
+//! @brief One or more Avoid::ConnDirFlag options.
+//!
+typedef unsigned int ConnDirFlags;
+
+
+static const double ATTACH_POS_TOP = 0;
+static const double ATTACH_POS_CENTER = 0.5;
+static const double ATTACH_POS_BOTTOM = 1;
+static const double ATTACH_POS_LEFT = ATTACH_POS_TOP;
+static const double ATTACH_POS_RIGHT = ATTACH_POS_BOTTOM;
+
+
+//! @brief The ConnEnd class represents different possible endpoints for
+//! connectors.
+//!
+//! Currently this class just allows free-floating endpoints, but in future
+//! will be capable of representing attachments to connection points on shapes.
+//!
+class ConnEnd
+{
+ public:
+ //! @brief Constructs a ConnEnd from a free-floating point.
+ //!
+ //! @param[in] point The position of the connector endpoint.
+ //!
+ ConnEnd(const Point& point);
+
+ //! @brief Constructs a ConnEnd from a free-floating point as well
+ //! as a set of flags specifying visibility for this point
+ //! if it is located inside a shape.
+ //!
+ //! @param[in] point The position of the connector endpoint.
+ //! @param[in] visDirs One or more Avoid::ConnDirFlag options
+ //! specifying the directions that this point
+ //! should be given visibility if it is inside
+ //! a shape.
+ //!
+ ConnEnd(const Point& point, const ConnDirFlags visDirs);
+
+ ConnEnd(ShapeRef *shapeRef, const double x_pos, const double y_pos,
+ const double insideOffset = 0.0,
+ const ConnDirFlags visDirs = ConnDirNone);
-static const int ConnType_PolyLine = 1;
-static const int ConnType_Orthogonal = 2;
+ //! @brief Returns the position of this connector endpoint
+ //!
+ //! @return The position of this connector endpoint.
+ const Point point(void) const;
+
+ ConnDirFlags directions(void) const;
+ private:
+ Point _point;
+ ConnDirFlags _directions;
+
+ // For referencing ConnEnds
+ ShapeRef *_shapeRef;
+ double _xPosition;
+ double _yPosition;
+ double _insideOffset;
+};
+//! @brief The ConnRef class represents a connector object.
+//!
+//! Connectors are a (possible multi-segment) line between two points.
+//! They are routed intelligently so as not to overlap any of the shape
+//! objects in the Router scene.
+//!
+//! Routing penalties can be applied, resulting in more aesthetically pleasing
+//! connector paths with fewer segments or less severe bend-points.
+//!
+//! You can set a function to be called when the connector has been rerouted
+//! and needs to be redrawn. Alternatively, you can query the connector's
+//! needsRepaint() function to determine this manually.
+//!
+//! Usually, it is expected that you would create a ConnRef for each connector
+//! in your diagram and keep that reference in your own connector class.
+//!
class ConnRef
{
public:
- ConnRef(Router *router, const unsigned int id);
- ConnRef(Router *router, const unsigned int id,
- const Point& src, const Point& dst);
- virtual ~ConnRef();
+ //! @brief Constructs a connector with no endpoints specified.
+ //!
+ //! @param[in] router The router scene to place the connector into.
+ //! @param[in] id A unique positive integer ID for the connector.
+ //!
+ //! If an ID is not specified, then one will be assigned to the shape.
+ //! If assigning an ID yourself, note that it should be a unique
+ //! positive integer. Also, IDs are given to all objects in a scene,
+ //! so the same ID cannot be given to a shape and a connector for
+ //! example.
+ //!
+ ConnRef(Router *router, const unsigned int id = 0);
+ //! @brief Constructs a connector with endpoints specified.
+ //!
+ //! @param[in] router The router scene to place the connector into.
+ //! @param[in] id A unique positive integer ID for the connector.
+ //! @param[in] src The source endpoint of the connector.
+ //! @param[in] dst The destination endpoint of the connector.
+ //!
+ //! If an ID is not specified, then one will be assigned to the shape.
+ //! If assigning an ID yourself, note that it should be a unique
+ //! positive integer. Also, IDs are given to all objects in a scene,
+ //! so the same ID cannot be given to a shape and a connector for
+ //! example.
+ //!
+ ConnRef(Router *router, const ConnEnd& src, const ConnEnd& dst,
+ const unsigned int id = 0);
+ //! @brief Destuctor.
+ ~ConnRef();
- void setType(unsigned int type);
- PolyLine& route(void);
- bool needsReroute(void);
- void freeRoute(void);
+ //! @brief Sets both new source and destination endpoints for this
+ //! connector.
+ //!
+ //! @param[in] srcPoint New source endpoint for the connector.
+ //! @param[in] dstPoint New destination endpoint for the connector.
+ void setEndpoints(const ConnEnd& srcPoint, const ConnEnd& dstPoint);
+ //! @brief Sets just a new source endpoint for this connector.
+ //!
+ //! @param[in] srcPoint New source endpoint for the connector.
+ void setSourceEndpoint(const ConnEnd& srcPoint);
+ //! @brief Sets just a new destination endpoint for this connector.
+ //!
+ //! @param[in] dstPoint New destination endpoint for the connector.
+ void setDestEndpoint(const ConnEnd& dstPoint);
+ //! @brief Returns the ID of this connector.
+ //! @returns The ID of the connector.
+ unsigned int id(void) const;
+ //! @brief Returns a pointer to the router scene this connector is in.
+ //! @returns A pointer to the router scene for this connector.
+ Router *router(void) const;
+
+ //! @brief Returns an indication of whether this connector has a
+ //! new route and thus needs to be repainted.
+ //!
+ //! If the connector has been rerouted and need repainting, the
+ //! route() method can be called to get a reference to the new route.
+ //!
+ //! @returns Returns true if the connector requires repainting, or
+ //! false if it does not.
+ bool needsRepaint(void) const;
+
+ //! @brief Returns a reference to the current route for the connector.
+ //!
+ //! This is a "raw" version of the route, where each line segment in
+ //! the route may be made up of multiple collinear line segments. It
+ //! will also not have post-processing (like curved corners) applied
+ //! to it. The simplified route for display can be obtained by calling
+ //! displayRoute().
+ //!
+ //! @returns The PolyLine route for the connector.
+ //! @note You can obtain a modified version of this poly-line
+ //! route with curved corners added by calling
+ //! PolyLine::curvedPolyline().
+ const PolyLine& route(void) const;
+
+ //! @brief Returns a reference to the current display version of the
+ //! route for the connector.
+ //!
+ //! The display version of a route has been simplified to collapse all
+ //! collinear line segments into single segments. It may also have
+ //! post-processing applied to the route, such as curved corners or
+ //! nudging.
+ //!
+ //! @returns The PolyLine display route for the connector.
+ PolyLine& displayRoute(void);
+
+ //! @brief Sets a callback function that will called to indicate that
+ //! the connector needs rerouting.
+ //!
+ //! The cb function will be called when shapes are added to, removed
+ //! from or moved about on the page. The pointer ptr will be passed
+ //! as an argument to the callback function.
+ //!
+ //! @param[in] cb A pointer to the callback function.
+ //! @param[in] ptr A generic pointer that will be passed to the
+ //! callback function.
+ void setCallback(void (*cb)(void *), void *ptr);
+ //! @brief Returns the type of routing performed for this connector.
+ //! @return The type of routing performed.
+ //!
+ ConnType routingType(void) const;
+ //! @brief Sets the type of routing to be performed for this
+ //! connector.
+ //!
+ //! If a call to this method changes the current type of routing
+ //! being used for the connector, then it will get rerouted during
+ //! the next processTransaction() call, or immediately if
+ //! transactions are not being used.
+ //!
+ //! @param type The type of routing to be performed.
+ //!
+ void setRoutingType(ConnType type);
+
+
+
+ // @brief Returns the source endpoint vertex in the visibility graph.
+ // @returns The source endpoint vertex.
+ VertInf *src(void);
+ // @brief Returns the destination endpoint vertex in the
+ // visibility graph.
+ // @returns The destination endpoint vertex.
+ VertInf *dst(void);
+
+
+ void set_route(const PolyLine& route);
void calcRouteDist(void);
- void updateEndPoint(const unsigned int type, const Point& point);
void setEndPointId(const unsigned int type, const unsigned int id);
unsigned int getSrcShapeId(void);
unsigned int getDstShapeId(void);
void makeActive(void);
void makeInactive(void);
- void lateSetup(const Point& src, const Point& dst);
- unsigned int id(void);
- VertInf *src(void);
- VertInf *dst(void);
+ VertInf *start(void);
void removeFromGraph(void);
bool isInitialised(void);
- void unInitialise(void);
- void setCallback(void (*cb)(void *), void *ptr);
- void handleInvalid(void);
- int generatePath(Point p0, Point p1);
void makePathInvalid(void);
- Router *router(void);
void setHateCrossings(bool value);
bool doesHateCrossings(void);
-
- friend void Router::attachedShapes(IntList &shapes,
- const unsigned int shapeId, const unsigned int type);
- friend void Router::attachedConns(IntList &conns,
- const unsigned int shapeId, const unsigned int type);
- friend void Router::markConnectors(ShapeRef *shape);
-
+ void setEndpoint(const unsigned int type, const ConnEnd& connEnd);
+ bool setEndpoint(const unsigned int type, const VertID& pointID,
+ Point *pointSuggestion = NULL);
+
private:
+ friend class Router;
+
+ PolyLine& routeRef(void);
+ void freeRoutes(void);
+ void performCallback(void);
+ bool generatePath(void);
+ bool generatePath(Point p0, Point p1);
+ void unInitialise(void);
+ void updateEndPoint(const unsigned int type, const ConnEnd& connEnd);
+ void common_updateEndPoint(const unsigned int type, const ConnEnd& connEnd);
Router *_router;
unsigned int _id;
- unsigned int _type;
+ ConnType _type;
unsigned int _srcId, _dstId;
+ bool _orthogonal;
bool _needs_reroute_flag;
bool _false_path;
+ bool _needs_repaint;
bool _active;
PolyLine _route;
+ Polygon _display_route;
double _route_dist;
ConnRefList::iterator _pos;
VertInf *_srcVert;
VertInf *_dstVert;
+ VertInf *_startVert;
bool _initialised;
void (*_callback)(void *);
void *_connector;
};
+class PointRep;
+typedef std::set<PointRep *> PointRepSet;
+typedef std::list<PointRep *> PointRepList;
+
+class PointRep
+{
+ public:
+ PointRep(Point *p, const ConnRef *c)
+ : point(p),
+ conn(c)
+
+ {
+ }
+ bool follow_inner(PointRep *target);
+
+ Point *point;
+ const ConnRef *conn;
+ // inner_set: Set of pointers to the PointReps 'inner' of
+ // this one, at this corner.
+ PointRepSet inner_set;
+};
+
+
+typedef std::pair<Point *, ConnRef *> PtConnPtrPair;
+
+class PtOrder
+{
+ public:
+ PtOrder()
+ {
+ }
+ ~PtOrder();
+ bool addPoints(const int dim, PtConnPtrPair innerArg,
+ PtConnPtrPair outerArg, bool swapped);
+ void sort(const int dim);
+ int positionFor(const ConnRef *conn, const size_t dim) const;
+
+ // One for each dimension.
+ PointRepList connList[2];
+};
+
+typedef std::map<Avoid::Point,PtOrder> PtOrderMap;
+typedef std::set<Avoid::Point> PointSet;
+
+
+const unsigned int CROSSING_NONE = 0;
+const unsigned int CROSSING_TOUCHES = 1;
+const unsigned int CROSSING_SHARES_PATH = 2;
+const unsigned int CROSSING_SHARES_PATH_AT_END = 4;
+const unsigned int CROSSING_SHARES_FIXED_SEGMENT = 8;
+
+
+typedef std::pair<int, unsigned int> CrossingsInfoPair;
+
+extern CrossingsInfoPair countRealCrossings( Avoid::Polygon& poly,
+ bool polyIsConn, Avoid::Polygon& conn, size_t cIndex,
+ bool checkForBranchingSegments, const bool finalSegment = false,
+ PointSet *crossingPoints = NULL, PtOrderMap *pointOrders = NULL,
+ ConnRef *polyConnRef = NULL, ConnRef *connConnRef = NULL);
+extern void splitBranchingSegments(Avoid::Polygon& poly, bool polyIsConn,
+ Avoid::Polygon& conn, const double tolerance = 0);
+extern bool validateBendPoint(VertInf *aInf, VertInf *bInf, VertInf *cInf);
+
}
diff --git a/src/libavoid/debug.h b/src/libavoid/debug.h
index 20e6f470512aae033e7e8ea7617ffb3e70ec3760..443529eced18aea6e7b283991b7a31129c634bcc 100644 (file)
--- a/src/libavoid/debug.h
+++ b/src/libavoid/debug.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
#ifndef AVOID_DEBUG_H
#define AVOID_DEBUG_H
va_end(ap);
}
#else
-inline void db_printf(const char */*fmt*/, ...)
+inline void db_printf(const char *, ...)
{
}
#endif
index 15840c3816a9c85f5061db8352ae8649c8fd78ba..2523375cf2addacb63379ab5671bdbb6becd2c3c 100644 (file)
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* --------------------------------------------------------------------
* Much of the code in this module is based on code published with
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
+#include <cmath>
+
#include "libavoid/graph.h"
#include "libavoid/geometry.h"
-#include "libavoid/polyutil.h"
-
-#include <math.h>
+#include "libavoid/assertions.h"
namespace Avoid {
-Point::Point()
-{
-}
-
-
-Point::Point(const double xv, const double yv)
- : x(xv)
- , y(yv)
-{
-}
-
-
-bool Point::operator==(const Point& rhs) const
-{
- if ((x == rhs.x) && (y == rhs.y))
- {
- return true;
- }
- return false;
-}
-
-
-bool Point::operator!=(const Point& rhs) const
-{
- if ((x != rhs.x) || (y != rhs.y))
- {
- return true;
- }
- return false;
-}
-
// Returns true iff the point c lies on the closed segment ab.
+// To be used when the points are known to be collinear.
//
// Based on the code of 'Between'.
//
-static const bool inBetween(const Point& a, const Point& b, const Point& c)
+bool inBetween(const Point& a, const Point& b, const Point& c)
{
// We only call this when we know the points are collinear,
// otherwise we should be checking this here.
- assert(vecDir(a, b, c) == 0);
+ COLA_ASSERT(vecDir(a, b, c, 0.0001) == 0);
- if (a.x != b.x)
+ if ((fabs(a.x - b.x) > 1) && (a.x != b.x))
{
// not vertical
return (((a.x < c.x) && (c.x < b.x)) ||
}
+// Returns true iff the point c lies on the closed segment ab.
+//
+bool pointOnLine(const Point& a, const Point& b, const Point& c,
+ const double tolerance)
+{
+ return (vecDir(a, b, c, tolerance) == 0) && inBetween(a, b, c);
+}
+
+
// Returns true if the segment cd intersects the segment ab, blocking
// visibility.
//
const Point& d)
{
int ab_c = vecDir(a, b, c);
- if ((ab_c == 0) && inBetween(a, b, c))
+ if (ab_c == 0)
{
- return true;
+ return false;
}
int ab_d = vecDir(a, b, d);
- if ((ab_d == 0) && inBetween(a, b, d))
+ if (ab_d == 0)
{
- return true;
+ return false;
}
// It's ok for either of the points a or b to be on the line cd,
}
+// Returns true if the segment e1-e2 intersects the shape boundary
+// segment s1-s2, blocking visibility.
+//
+bool segmentShapeIntersect(const Point& e1, const Point& e2, const Point& s1,
+ const Point& s2, bool& seenIntersectionAtEndpoint)
+{
+ if (segmentIntersect(e1, e2, s1, s2))
+ {
+ // Basic intersection of segments.
+ return true;
+ }
+ else if ( (((s2 == e1) || pointOnLine(s1, s2, e1)) &&
+ (vecDir(s1, s2, e2) != 0))
+ ||
+ (((s2 == e2) || pointOnLine(s1, s2, e2)) &&
+ (vecDir(s1, s2, e1) != 0)) )
+ {
+ // Segments intersect at the endpoint of one of the segments. We
+ // allow this once, but the second one blocks visibility. Otherwise
+ // shapes butted up against each other could have visibility through
+ // shapes.
+ if (seenIntersectionAtEndpoint)
+ {
+ return true;
+ }
+ seenIntersectionAtEndpoint = true;
+ }
+ return false;
+}
+
+
// Returns true iff the point p in a valid region that can contain
// shortest paths. a0, a1, a2 are ordered vertices of a shape.
//
int s12p = vecDir(c1, c2, p);
int s23p = vecDir(c2, c3, p);
- if (s12p == 0)
- {
- // Case of p being somewhere on c1-c2.
- return s23p;
- }
- if (s23p == 0)
- {
- // Case of p being somewhere on c2-c3.
- return s12p;
- }
-
if (s123 == 1)
{
- if ((s12p == 1) && (s23p == 1))
+ if ((s12p >= 0) && (s23p >= 0))
{
return 1;
}
}
else if (s123 == -1)
{
- if ((s12p == -1) && (s23p == -1))
+ if ((s12p <= 0) && (s23p <= 0))
{
return -1;
}
return 1;
}
- // Case of c3 being somewhere on c1-c2.
+
+ // c1-c2-c3 are collinear, so just return vecDir from c1-c2
return s12p;
}
-// Returns the distance between points a and b.
+// Returns the Euclidean distance between points a and b.
+//
+double euclideanDist(const Point& a, const Point& b)
+{
+ double xdiff = a.x - b.x;
+ double ydiff = a.y - b.y;
+
+ return sqrt((xdiff * xdiff) + (ydiff * ydiff));
+}
+
+// Returns the Manhattan distance between points a and b.
+//
+double manhattanDist(const Point& a, const Point& b)
+{
+ return fabs(a.x - b.x) + fabs(a.y - b.y);
+}
+
+
+// Returns the Euclidean distance between points a and b.
//
double dist(const Point& a, const Point& b)
{
}
// Returns the total length of all line segments in the polygon
-double totalLength(const Polygn& poly)
+double totalLength(const Polygon& poly)
{
double l = 0;
- for (int i = 0; i < poly.pn-1; ++i) {
- l += dist(poly.ps[i], poly.ps[i+1]);
+ for (size_t i = 1; i < poly.size(); ++i)
+ {
+ l += dist(poly.ps[i-1], poly.ps[i]);
}
return l;
}
// This is a fast version that only works for convex shapes. The
// other version (inPolyGen) is more general.
//
-bool inPoly(const Polygn& poly, const Point& q)
+bool inPoly(const Polygon& poly, const Point& q, bool countBorder)
{
- int n = poly.pn;
- Point *P = poly.ps;
- for (int i = 0; i < n; i++)
+ size_t n = poly.size();
+ const std::vector<Point>& P = poly.ps;
+ bool onBorder = false;
+ for (size_t i = 0; i < n; i++)
{
// point index; i1 = i-1 mod n
- int prev = (i + n - 1) % n;
- if (vecDir(P[prev], P[i], q) == -1)
+ size_t prev = (i + n - 1) % n;
+ int dir = vecDir(P[prev], P[i], q);
+ if (dir == -1)
{
+ // Point is outside
return false;
}
+ // Record if point was on a boundary.
+ onBorder |= (dir == 0);
+ }
+ if (!countBorder && onBorder)
+ {
+ return false;
}
return true;
}
//
// Based on the code of 'InPoly'.
//
-bool inPolyGen(const Polygn& argpoly, const Point& q)
+bool inPolyGen(const PolygonInterface& argpoly, const Point& q)
{
// Numbers of right and left edge/ray crossings.
int Rcross = 0;
int Lcross = 0;
// Copy the argument polygon
- Polygn poly = copyPoly(argpoly);
- Point *P = poly.ps;
- int n = poly.pn;
+ Polygon poly = argpoly;
+ std::vector<Point>& P = poly.ps;
+ size_t n = poly.size();
// Shift so that q is the origin. This is done for pedogical clarity.
- for (int i = 0; i < n; ++i)
+ for (size_t i = 0; i < n; ++i)
{
P[i].x = P[i].x - q.x;
P[i].y = P[i].y - q.y;
}
// For each edge e=(i-1,i), see if crosses ray.
- for (int i = 0; i < n; ++i)
+ for (size_t i = 0; i < n; ++i)
{
// First see if q=(0,0) is a vertex.
if ((P[i].x == 0) && (P[i].y == 0))
{
// We count a vertex as inside.
- freePoly(poly);
return true;
}
// point index; i1 = i-1 mod n
- int i1 = ( i + n - 1 ) % n;
+ size_t i1 = ( i + n - 1 ) % n;
// if e "straddles" the x-axis...
// The commented-out statement is logically equivalent to the one
}
}
}
- freePoly(poly);
// q on the edge if left and right cross are not the same parity.
if ( (Rcross % 2) != (Lcross % 2) )
int segmentIntersectPoint(const Point& a1, const Point& a2,
const Point& b1, const Point& b2, double *x, double *y)
{
-
- double Ax,Bx,Cx,Ay,By,Cy,d,e,f,num,offset;
+ double Ax,Bx,Cx,Ay,By,Cy,d,e,f,num;
double x1lo,x1hi,y1lo,y1hi;
Ax = a2.x - a1.x;
if (y1hi < b1.y || b2.y < y1lo) return DONT_INTERSECT;
}
-
Cx = a1.x - b1.x;
Cy = a1.y - b1.y;
// alpha numerator:
d = By*Cx - Bx*Cy;
// Both denominator:
f = Ay*Bx - Ax*By;
- // aplha tests:
+ // alpha tests:
if (f > 0)
{
if (d < 0 || d > f) return DONT_INTERSECT;
// Numerator:
num = d*Ax;
- // Round direction:
- offset = SAME_SIGNS(num,f) ? f/2 : -f/2;
// Intersection X:
- *x = a1.x + (num+offset) / f;
+ *x = a1.x + (num) / f;
+
+ num = d*Ay;
+ // Intersection Y:
+ *y = a1.y + (num) / f;
+
+ return DO_INTERSECT;
+}
+
+
+// Line Segment Intersection
+// Original code by Franklin Antonio
+//
+int rayIntersectPoint(const Point& a1, const Point& a2,
+ const Point& b1, const Point& b2, double *x, double *y)
+{
+ double Ax,Bx,Cx,Ay,By,Cy,d,f,num;
+
+ Ay = a2.y - a1.y;
+ By = b1.y - b2.y;
+ Ax = a2.x - a1.x;
+ Bx = b1.x - b2.x;
+
+ Cx = a1.x - b1.x;
+ Cy = a1.y - b1.y;
+ // alpha numerator:
+ d = By*Cx - Bx*Cy;
+ // Both denominator:
+ f = Ay*Bx - Ax*By;
+
+ // compute intersection coordinates:
+
+ if (f == 0) return PARALLEL;
+
+ // Numerator:
+ num = d*Ax;
+ // Intersection X:
+ *x = a1.x + (num) / f;
num = d*Ay;
- offset = SAME_SIGNS(num,f) ? f/2 : -f/2;
// Intersection Y:
- *y = a1.y + (num+offset) / f;
+ *y = a1.y + (num) / f;
return DO_INTERSECT;
}
index 1422be0502213343abfe365bcf57249987911ba6..abd0d60e2e493abdf6a2c11b8b266a893d248df4 100644 (file)
--- a/src/libavoid/geometry.h
+++ b/src/libavoid/geometry.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* --------------------------------------------------------------------
* Much of the code in this module is based on code published with
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
#define _GEOMETRY_H
#include "libavoid/geomtypes.h"
+#include "libavoid/assertions.h"
namespace Avoid {
-extern double dist(const Point& a, const Point& b);
-extern double totalLength(const Polygn& poly);
+extern double euclideanDist(const Point& a, const Point& b);
+extern double manhattanDist(const Point& a, const Point& b);
+extern double totalLength(const Polygon& poly);
extern double angle(const Point& a, const Point& b, const Point& c);
extern bool segmentIntersect(const Point& a, const Point& b,
const Point& c, const Point& d);
-extern bool inPoly(const Polygn& poly, const Point& q);
-extern bool inPolyGen(const Polygn& poly, const Point& q);
+extern bool segmentShapeIntersect(const Point& e1, const Point& e2,
+ const Point& s1, const Point& s2, bool& seenIntersectionAtEndpoint);
+extern bool inPoly(const Polygon& poly, const Point& q, bool countBorder = true);
+extern bool inPolyGen(const PolygonInterface& poly, const Point& q);
extern bool inValidRegion(bool IgnoreRegions, const Point& a0,
const Point& a1, const Point& a2, const Point& b);
extern int cornerSide(const Point &c1, const Point &c2, const Point &c3,
const Point& p);
+extern bool pointOnLine(const Point& a, const Point& b, const Point& c,
+ const double tolerance = 0.0);
+
+// To be used only when the points are known to be colinear.
+extern bool inBetween(const Point& a, const Point& b, const Point& c);
// Direction from vector.
//
// Based on the code of 'AreaSign'.
//
-static inline int vecDir(const Point& a, const Point& b, const Point& c)
+// The 'maybeZero' argument can be used to adjust the tolerance of the
+// function. It will be most accurate when 'maybeZero' == 0.0, the default.
+//
+static inline int vecDir(const Point& a, const Point& b, const Point& c,
+ const double maybeZero = 0.0)
{
+ COLA_ASSERT(maybeZero >= 0);
+
double area2 = ((b.x - a.x) * (c.y - a.y)) -
((c.x - a.x) * (b.y - a.y));
- if (area2 < -0.001)
+ if (area2 < (-maybeZero))
{
return -1;
}
- else if (area2 > 0.001)
+ else if (area2 > maybeZero)
{
return 1;
}
static const int PARALLEL = 3;
extern int segmentIntersectPoint(const Point& a1, const Point& a2,
const Point& b1, const Point& b2, double *x, double *y);
+extern int rayIntersectPoint(const Point& a1, const Point& a2,
+ const Point& b1, const Point& b2, double *x, double *y);
}
index dd9d26f2f415b1689645330d0c5331923d6e9ee8..ced53e6b0c73217c849498044b858c997929286d 100644 (file)
--- a/src/libavoid/geomtypes.h
+++ b/src/libavoid/geomtypes.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+//! @file geomtypes.h
+//! @brief Contains the interface for various geometry types and classes.
+
#ifndef AVOID_GEOMTYPES_H
#define AVOID_GEOMTYPES_H
+#include <vector>
+#include <utility>
+
namespace Avoid
{
-
+
+//! @brief The Point class defines a point in the plane.
+//!
+//! Points consist of an x and y value. They may also have an ID and vertex
+//! number associated with them.
+//!
class Point
{
public:
+ //! @brief Default constructor.
+ //!
Point();
+ //! @brief Standard constructor.
+ //!
+ //! @param[in] xv The x position of the point.
+ //! @param[in] yv The y position of the point.
+ //!
Point(const double xv, const double yv);
+
+ //! @brief Comparison operator. Returns true if at same position.
+ //!
+ //! @param[in] rhs The point to compare with this one.
+ //! @return The result of the comparison.
+ //!
bool operator==(const Point& rhs) const;
+ //! @brief Comparison operator. Returns true if at different positions.
+ //!
+ //! @param[in] rhs The point to compare with this one.
+ //! @return The result of the comparison.
+ //!
bool operator!=(const Point& rhs) const;
+ //! @brief Comparison operator. Returns true if less-then rhs point.
+ //!
+ //! @note This operator is not particularly useful, but is defined
+ //! to allow std::set<Point>.
+ //!
+ //! @param[in] rhs The point to compare with this one.
+ //! @return The result of the comparison.
+ //!
+ bool operator<(const Point& rhs) const;
+ //! @brief Returns the x or y value of the point, given the dimension.
+ //!
+ //! @param[in] dimension The dimension: 0 for x, 1 for y.
+ //! @return The component of the point in that dimension.
+ double& operator[](const unsigned int dimension);
+ const double& operator[](const unsigned int dimension) const;
+
+ //! The x position.
double x;
+ //! The y position.
double y;
- int id;
+ //! The ID associated with this point.
+ unsigned int id;
+ //! The vertex number associated with this point.
+ unsigned short vn;
};
+//! Constant value representing an unassigned vertex number.
+//!
+static const unsigned short kUnassignedVertexNumber = 8;
+
+
+//! @brief A vector, represented by the Point class.
+//!
typedef Point Vector;
-typedef struct
+//! @brief A common interface used by the Polygon classes.
+//!
+class PolygonInterface
{
- int id;
- Point *ps;
- int pn;
-} Polygn;
-
-typedef Polygn PolyLine;
+ public:
+ //! @brief Constructor.
+ PolygonInterface() { }
+ //! @brief Destructor.
+ virtual ~PolygonInterface() { }
+ //! @brief Resets this to the empty polygon.
+ virtual void clear(void) = 0;
+ //! @brief Returns true if this polygon is empty.
+ virtual bool empty(void) const = 0;
+ //! @brief Returns the number of points in this polygon.
+ virtual size_t size(void) const = 0;
+ //! @brief Returns the ID value associated with this polygon.
+ virtual int id(void) const = 0;
+ //! @brief Returns a specific point in the polygon.
+ //! @param[in] index The array index of the point to be returned.
+ virtual const Point& at(size_t index) const = 0;
+ //! @brief Returns the bounding rectangle that contains this polygon.
+ //!
+ //! If a NULL pointer is passed for any of the arguments, then that
+ //! value is ignored and not returned.
+ //!
+ //! @param[out] minX The left hand side of the bounding box.
+ //! @param[out] minY The top of the bounding box.
+ //! @param[out] maxX The right hand side of the bounding box.
+ //! @param[out] maxY The bottom of the bounding box.
+ void getBoundingRect(double *minX, double *minY,
+ double *maxX, double *maxY) const;
+};
-typedef struct
+//! @brief A line between two points.
+//!
+class Edge
{
- Point a;
- Point b;
-} Edge;
+ public:
+ //! The first point.
+ Point a;
+ //! The second point.
+ Point b;
+};
+
+//! @brief A bounding box, represented with an Edge between top-left and
+//! bottom-right corners.
+//!
typedef Edge BBox;
+class Router;
+class ReferencingPolygon;
+
+
+//! @brief A dynamic Polygon, to which points can be easily added and removed.
+//!
+//! @note The Rectangle class can be used as an easy way of constructing a
+//! square or rectangular polygon.
+//!
+class Polygon : public PolygonInterface
+{
+ public:
+ //! @brief Constructs an empty polygon (with zero points).
+ Polygon();
+ //! @brief Constructs a new polygon with n points.
+ //!
+ //! A rectangle would be comprised of four point. An n segment
+ //! PolyLine (represented as a Polygon) would be comprised of n+1
+ //! points. Whether a particular Polygon is closed or not, depends
+ //! on whether it is a Polygon or Polyline. Shape polygons are always
+ //! considered to be closed, meaning the last point joins back to the
+ //! first point.
+ //!
+ //! @param[in] n Number of points in the polygon.
+ //!
+ Polygon(const int n);
+ //! @brief Constructs a new polygon from an existing Polygon.
+ //!
+ //! @param[in] poly An existing polygon to copy the new polygon from.
+ //!
+ Polygon(const PolygonInterface& poly);
+ //! @brief Resets this to the empty polygon.
+ void clear(void);
+ //! @brief Returns true if this polygon is empty.
+ bool empty(void) const;
+ //! @brief Returns the number of points in this polygon.
+ size_t size(void) const;
+ //! @brief Returns the ID value associated with this polygon.
+ int id(void) const;
+ //! @brief Returns a specific point in the polygon.
+ //! @param[in] index The array index of the point to be returned.
+ const Point& at(size_t index) const;
+ //! @brief Returns a simplified Polyline, where all collinear line
+ //! segments have been collapsed down into single line
+ //! segments.
+ //!
+ //! @return A new polyline with a simplified representation.
+ //!
+ Polygon simplify(void) const;
+ //! @brief Returns a curved approximation of this multi-segment
+ //! PolyLine, with the corners replaced by smooth Bezier
+ //! curves.
+ //!
+ //! This function does not do any further obstacle avoidance with the
+ //! curves produced. Hence, you would usually specify a curve_amount
+ //! in similar size to the space buffer around obstacles in the scene.
+ //! This way the curves will cut the corners around shapes but still
+ //! run within this buffer space.
+ //!
+ //! @param curve_amount Describes the distance along the end of each
+ //! line segment to turn into a curve.
+ //! @param closed Describes whether the Polygon should be
+ //! treated as closed. Defaults to false.
+ //! @return A new polyline (polygon) representing the curved path.
+ //! Its points represent endpoints of line segments and
+ //! Bezier spline control points. The Polygon::ts vector for
+ //! this returned polygon is populated with a character for
+ //! each point describing its type.
+ //! @sa ts
+ Polygon curvedPolyline(const double curve_amount,
+ const bool closed = false) const;
+ //! @brief Translates the polygon position by a relative amount.
+ //!
+ //! @param[in] xDist Distance to move polygon in the x dimension.
+ //! @param[in] yDist Distance to move polygon in the y dimension.
+ void translate(const double xDist, const double yDist);
+
+ //! @brief An ID for the polygon.
+ int _id;
+ //! @brief A vector of the points that make up the Polygon.
+ std::vector<Point> ps;
+ //! @brief If used, denotes whether the corresponding point in ps is
+ //! a move-to operation or a Bezier curve-to.
+ //!
+ //! Each character describes the drawing operation for the
+ //! corresponding point in the ps vector. Possible values are:
+ //! - 'M': A moveto operation, marks the first point;
+ //! - 'L': A lineto operation, is a line from the previous point to
+ //! the current point; or
+ //! - 'C': A curveto operation, three consecutive 'C' points
+ //! (along with the previous point) describe the control points
+ //! of a Bezier curve.
+ //! - 'Z': Closes the path (used for cluster boundaries).
+ //!
+ //! @note This vector will currently only be populated for polygons
+ //! returned by curvedPolyline().
+ std::vector<char> ts;
+};
+
+
+//! @brief A multi-segment line, represented with the Polygon class.
+//!
+typedef Polygon PolyLine;
+
+
+//! @brief A Polygon which just references its points from other Polygons.
+//!
+//! This type of Polygon is used to accurately represent cluster boundaries
+//! made up from the corner points of shapes.
+//!
+class ReferencingPolygon : public PolygonInterface
+{
+ public:
+ ReferencingPolygon();
+ ReferencingPolygon(const Polygon& poly, const Router *router);
+ void clear(void);
+ bool empty(void) const;
+ size_t size(void) const;
+ int id(void) const;
+ const Point& at(size_t index) const;
+
+ int _id;
+ std::vector<std::pair<const Polygon *, unsigned short> > ps;
+};
+
+
+//! @brief A Rectangle, a simpler way to define the polygon for square or
+//! rectangular shapes.
+//!
+class Rectangle : public Polygon
+{
+ public:
+ //! @brief Constructs a rectangular polygon given two opposing
+ //! corner points.
+ //!
+ //! @param[in] topLeft The first corner point of the rectangle.
+ //! @param[in] bottomRight The opposing corner point of the rectangle.
+ //!
+ Rectangle(const Point& topLeft, const Point& bottomRight);
+
+ //! @brief Constructs a rectangular polygon given the centre, width
+ //! and height.
+ //!
+ //! @param[in] centre The centre of the rectangle, specified as
+ //! a point.
+ //! @param[in] width The width of the rectangle.
+ //! @param[in] height The height of the rectangle.
+ //!
+ Rectangle(const Point& centre, const double width, const double height);
+};
+
+
}
#endif
diff --git a/src/libavoid/graph.cpp b/src/libavoid/graph.cpp
index 1970212df4e31214beb8b398c528588d8c6046f0..728f8c0859c8b3bff044e7e887e9e65fd05c0d75 100644 (file)
--- a/src/libavoid/graph.cpp
+++ b/src/libavoid/graph.cpp
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
+#include <cmath>
+
#include "libavoid/debug.h"
#include "libavoid/graph.h"
#include "libavoid/connector.h"
#include "libavoid/geometry.h"
-#include "libavoid/polyutil.h"
#include "libavoid/timer.h"
#include "libavoid/vertices.h"
#include "libavoid/router.h"
+#include "libavoid/assertions.h"
-#include <math.h>
using std::pair;
namespace Avoid {
-EdgeInf::EdgeInf(VertInf *v1, VertInf *v2)
- : lstPrev(NULL)
- , lstNext(NULL)
- , _blocker(0)
- , _router(NULL)
- , _added(false)
- , _visible(false)
- , _v1(v1)
- , _v2(v2)
- , _dist(-1)
+EdgeInf::EdgeInf(VertInf *v1, VertInf *v2, const bool orthogonal)
+ : lstPrev(NULL),
+ lstNext(NULL),
+ _blocker(0),
+ _router(NULL),
+ _added(false),
+ _visible(false),
+ _orthogonal(orthogonal),
+ _v1(v1),
+ _v2(v2),
+ _dist(-1)
{
// Not passed NULL values.
- assert(v1 && v2);
+ COLA_ASSERT(v1 && v2);
// We are in the same instance
- assert(_v1->_router == _v2->_router);
+ COLA_ASSERT(_v1->_router == _v2->_router);
_router = _v1->_router;
_conns.clear();
}
+// Gives an order value between 0 and 3 for the point c, given the last
+// segment was from a to b. Returns the following value:
+// 0 : Point c is directly backwards from point b.
+// 1 : Point c is a left-hand 90 degree turn.
+// 2 : Point c is a right-hand 90 degree turn.
+// 3 : Point c is straight ahead (collinear).
+//
+static inline int orthogTurnOrder(const Point& a, const Point& b,
+ const Point& c)
+{
+ // We should only be calling this with orthogonal points,
+ COLA_ASSERT((c.x == b.x) || (c.y == b.y));
+ COLA_ASSERT((a.x == b.x) || (a.y == b.y));
+
+ int direction = vecDir(a, b, c);
+
+ if (direction > 0)
+ {
+ // Counterclockwise := left
+ return 1;
+ }
+ else if (direction < 0)
+ {
+ // Clockwise := right
+ return 2;
+ }
+
+ if (b.x == c.x)
+ {
+ if ( ((a.y < b.y) && (c.y < b.y)) ||
+ ((a.y > b.y) && (c.y > b.y)) )
+ {
+ // Behind.
+ return 0;
+ }
+ }
+ else
+ {
+ if ( ((a.x < b.x) && (c.x < b.x)) ||
+ ((a.x > b.x) && (c.x > b.x)) )
+ {
+ // Behind.
+ return 0;
+ }
+ }
+
+ // Ahead.
+ return 3;
+}
+
+
+// Returns a less than operation for a set exploration order for orthogonal
+// searching. Forward, then left, then right. Or if there is no previous
+// point, then the order is north, east, south, then west.
+// Note: This method assumes the two Edges that share a common point.
+bool EdgeInf::rotationLessThan(const VertInf *lastV, const EdgeInf *rhs) const
+{
+ if ((_v1 == rhs->_v1) && (_v2 == rhs->_v2))
+ {
+ // Effectively the same visibility edge, so they are equal.
+ return false;
+ }
+ VertInf *lhsV = NULL, *rhsV = NULL, *commonV = NULL;
+
+ // Determine common Point and the comparison point on the left- and
+ // the right-hand-side.
+ if (_v1 == rhs->_v1)
+ {
+ commonV = _v1;
+ lhsV = _v2;
+ rhsV = rhs->_v2;
+ }
+ else if (_v1 == rhs->_v2)
+ {
+ commonV = _v1;
+ lhsV = _v2;
+ rhsV = rhs->_v1;
+ }
+ else if (_v2 == rhs->_v1)
+ {
+ commonV = _v2;
+ lhsV = _v1;
+ rhsV = rhs->_v2;
+ }
+ else if (_v2 == rhs->_v2)
+ {
+ commonV = _v2;
+ lhsV = _v1;
+ rhsV = rhs->_v1;
+ }
+
+ const Point& lhsPt = lhsV->point;
+ const Point& rhsPt = rhsV->point;
+ const Point& commonPt = commonV->point;
+
+ // If no lastPt, use one directly to the left;
+ Point lastPt = (lastV) ? lastV->point : Point(commonPt.x - 10, commonPt.y);
+
+ int lhsVal = orthogTurnOrder(lastPt, commonPt, lhsPt);
+ int rhsVal = orthogTurnOrder(lastPt, commonPt, rhsPt);
+
+ return lhsVal < rhsVal;
+}
+
+
void EdgeInf::makeActive(void)
{
- assert(_added == false);
+ COLA_ASSERT(_added == false);
- if (_visible)
+ if (_orthogonal)
{
- _router->visGraph.addEdge(this);
- _pos1 = _v1->visList.insert(_v1->visList.begin(), this);
- _v1->visListSize++;
- _pos2 = _v2->visList.insert(_v2->visList.begin(), this);
- _v2->visListSize++;
+ COLA_ASSERT(_visible);
+ _router->visOrthogGraph.addEdge(this);
+ _pos1 = _v1->orthogVisList.insert(_v1->orthogVisList.begin(), this);
+ _v1->orthogVisListSize++;
+ _pos2 = _v2->orthogVisList.insert(_v2->orthogVisList.begin(), this);
+ _v2->orthogVisListSize++;
}
- else // if (invisible)
+ else
{
- _router->invisGraph.addEdge(this);
- _pos1 = _v1->invisList.insert(_v1->invisList.begin(), this);
- _v1->invisListSize++;
- _pos2 = _v2->invisList.insert(_v2->invisList.begin(), this);
- _v2->invisListSize++;
+ if (_visible)
+ {
+ _router->visGraph.addEdge(this);
+ _pos1 = _v1->visList.insert(_v1->visList.begin(), this);
+ _v1->visListSize++;
+ _pos2 = _v2->visList.insert(_v2->visList.begin(), this);
+ _v2->visListSize++;
+ }
+ else // if (invisible)
+ {
+ _router->invisGraph.addEdge(this);
+ _pos1 = _v1->invisList.insert(_v1->invisList.begin(), this);
+ _v1->invisListSize++;
+ _pos2 = _v2->invisList.insert(_v2->invisList.begin(), this);
+ _v2->invisListSize++;
+ }
}
_added = true;
}
void EdgeInf::makeInactive(void)
{
- assert(_added == true);
+ COLA_ASSERT(_added == true);
- if (_visible)
+ if (_orthogonal)
{
- _router->visGraph.removeEdge(this);
- _v1->visList.erase(_pos1);
- _v1->visListSize--;
- _v2->visList.erase(_pos2);
- _v2->visListSize--;
+ COLA_ASSERT(_visible);
+ _router->visOrthogGraph.removeEdge(this);
+ _v1->orthogVisList.erase(_pos1);
+ _v1->orthogVisListSize--;
+ _v2->orthogVisList.erase(_pos2);
+ _v2->orthogVisListSize--;
}
- else // if (invisible)
+ else
{
- _router->invisGraph.removeEdge(this);
- _v1->invisList.erase(_pos1);
- _v1->invisListSize--;
- _v2->invisList.erase(_pos2);
- _v2->invisListSize--;
+ if (_visible)
+ {
+ _router->visGraph.removeEdge(this);
+ _v1->visList.erase(_pos1);
+ _v1->visListSize--;
+ _v2->visList.erase(_pos2);
+ _v2->visListSize--;
+ }
+ else // if (invisible)
+ {
+ _router->invisGraph.removeEdge(this);
+ _v1->invisList.erase(_pos1);
+ _v1->invisListSize--;
+ _v2->invisList.erase(_pos2);
+ _v2->invisListSize--;
+ }
}
_blocker = 0;
_conns.clear();
void EdgeInf::setDist(double dist)
{
- //assert(dist != 0);
+ //COLA_ASSERT(dist != 0);
if (_added && !_visible)
{
makeInactive();
+ COLA_ASSERT(!_added);
}
if (!_added)
{
}
+bool EdgeInf::added(void)
+{
+ return _added;
+}
+
+
void EdgeInf::alertConns(void)
{
FlagList::iterator finish = _conns.end();
void EdgeInf::addBlocker(int b)
{
- assert(_router->InvisibilityGrph);
+ COLA_ASSERT(_router->InvisibilityGrph);
if (_added && _visible)
{
makeInactive();
+ COLA_ASSERT(!_added);
}
if (!_added)
{
cone1 = inValidRegion(_router->IgnoreRegions, i->shPrev->point,
iPoint, i->shNext->point, jPoint);
}
- else
+ else if (_router->IgnoreRegions == false)
{
+ // If Ignoring regions then this case is already caught by
+ // the invalid regions, so only check it when not ignoring
+ // regions.
ShapeSet& ss = _router->contains[iID];
if ((jID.isShape) && (ss.find(jID.objID) != ss.end()))
cone2 = inValidRegion(_router->IgnoreRegions, j->shPrev->point,
jPoint, j->shNext->point, iPoint);
}
- else
+ else if (_router->IgnoreRegions == false)
{
+ // If Ignoring regions then this case is already caught by
+ // the invalid regions, so only check it when not ignoring
+ // regions.
ShapeSet& ss = _router->contains[jID];
if ((iID.isShape) && (ss.find(iID.objID) != ss.end()))
db_printf("\tSetting visibility edge... \n\t\t");
db_print();
- double d = dist(iPoint, jPoint);
+ double d = euclideanDist(iPoint, jPoint);
setDist(d);
}
VertInf *last = _router->vertices.end();
+ unsigned int lastId = 0;
+ bool seenIntersectionAtEndpoint = false;
for (VertInf *k = _router->vertices.shapesBegin(); k != last; )
{
VertID kID = k->id;
- if ((ss.find(kID.objID) != ss.end()))
+ if (k->id == dummyOrthogID)
+ {
+ // Don't include orthogonal dummy vertices.
+ k = k->lstNext;
+ continue;
+ }
+ if (kID.objID != lastId)
{
- unsigned int shapeID = kID.objID;
- db_printf("Endpoint is inside shape %u so ignore shape edges.\n",
- kID.objID);
- // One of the endpoints is inside this shape so ignore it.
- while ((k != last) && (k->id.objID == shapeID))
+ if ((ss.find(kID.objID) != ss.end()))
{
- // And skip the other vertices from this shape.
- k = k->lstNext;
+ unsigned int shapeID = kID.objID;
+ db_printf("Endpoint is inside shape %u so ignore shape "
+ "edges.\n", kID.objID);
+ // One of the endpoints is inside this shape so ignore it.
+ while ((k != last) && (k->id.objID == shapeID))
+ {
+ // And skip the other vertices from this shape.
+ k = k->lstNext;
+ }
+ continue;
}
- continue;
+ seenIntersectionAtEndpoint = false;
+ lastId = kID.objID;
}
Point& kPoint = k->point;
Point& kPrevPoint = k->shPrev->point;
-
- if (segmentIntersect(pti, ptj, kPrevPoint, kPoint))
+ if (segmentShapeIntersect(pti, ptj, kPrevPoint, kPoint,
+ seenIntersectionAtEndpoint))
{
ss.clear();
return kID.objID;
}
+ // Returns true if this edge is a vertical or horizontal line segment.
+bool EdgeInf::isOrthogonal(void) const
+{
+ return ((_v1->point.x == _v2->point.x) ||
+ (_v1->point.y == _v2->point.y));
+}
+
+
VertInf *EdgeInf::otherVert(VertInf *vert)
{
- assert((vert == _v1) || (vert == _v2));
+ COLA_ASSERT((vert == _v1) || (vert == _v2));
if (vert == _v1)
{
EdgeInf *EdgeInf::checkEdgeVisibility(VertInf *i, VertInf *j, bool knownNew)
{
+ // This is for polyline routing, so check we're not
+ // considering orthogonal vertices.
+ COLA_ASSERT(i->id != dummyOrthogID);
+ COLA_ASSERT(j->id != dummyOrthogID);
+
Router *router = i->_router;
EdgeInf *edge = NULL;
if (knownNew)
{
- assert(existingEdge(i, j) == NULL);
+ COLA_ASSERT(existingEdge(i, j) == NULL);
edge = new EdgeInf(i, j);
}
else
}
+ // XXX: This function is ineffecient, and shouldn't even really be
+ // required.
EdgeInf *EdgeInf::existingEdge(VertInf *i, VertInf *j)
{
VertInf *selected = NULL;
- if (i->visListSize <= j->visListSize)
- {
- selected = i;
- }
- else
- {
- selected = j;
- }
-
+ // Look through poly-line visibility edges.
+ selected = (i->visListSize <= j->visListSize) ? i : j;
EdgeInfList& visList = selected->visList;
- EdgeInfList::iterator finish = visList.end();
- for (EdgeInfList::iterator edge = visList.begin(); edge != finish;
+ EdgeInfList::const_iterator finish = visList.end();
+ for (EdgeInfList::const_iterator edge = visList.begin(); edge != finish;
++edge)
{
if ((*edge)->isBetween(i, j))
}
}
- if (i->invisListSize <= j->invisListSize)
- {
- selected = i;
- }
- else
+ // Look through orthogonal visbility edges.
+ selected = (i->orthogVisListSize <= j->orthogVisListSize) ? i : j;
+ EdgeInfList& orthogVisList = selected->orthogVisList;
+ finish = orthogVisList.end();
+ for (EdgeInfList::const_iterator edge = orthogVisList.begin();
+ edge != finish; ++edge)
{
- selected = j;
+ if ((*edge)->isBetween(i, j))
+ {
+ return (*edge);
+ }
}
+ // Look through poly-line invisbility edges.
+ selected = (i->invisListSize <= j->invisListSize) ? i : j;
EdgeInfList& invisList = selected->invisList;
finish = invisList.end();
- for (EdgeInfList::iterator edge = invisList.begin(); edge != finish;
+ for (EdgeInfList::const_iterator edge = invisList.begin(); edge != finish;
++edge)
{
if ((*edge)->isBetween(i, j))
//===========================================================================
-EdgeList::EdgeList()
- : _firstEdge(NULL)
- , _lastEdge(NULL)
- , _count(0)
+EdgeList::EdgeList(bool orthogonal)
+ : _orthogonal(orthogonal),
+ _firstEdge(NULL),
+ _lastEdge(NULL),
+ _count(0)
+{
+}
+
+
+EdgeList::~EdgeList()
+{
+ clear();
+}
+
+
+void EdgeList::clear(void)
+{
+ while (_firstEdge)
+ {
+ delete _firstEdge;
+ }
+ COLA_ASSERT(_count == 0);
+ _lastEdge = NULL;
+}
+
+
+int EdgeList::size(void) const
{
+ return _count;
}
void EdgeList::addEdge(EdgeInf *edge)
{
+ COLA_ASSERT(!_orthogonal || edge->isOrthogonal());
+
if (_firstEdge == NULL)
{
- assert(_lastEdge == NULL);
+ COLA_ASSERT(_lastEdge == NULL);
_lastEdge = edge;
_firstEdge = edge;
}
else
{
- assert(_lastEdge != NULL);
+ COLA_ASSERT(_lastEdge != NULL);
_lastEdge->lstNext = edge;
edge->lstPrev = _lastEdge;
diff --git a/src/libavoid/graph.h b/src/libavoid/graph.h
index 05f03a988ba66d6bebd5edccb7159ee90374143d..db776b80b139c98286725538652590d36d38a9ca 100644 (file)
--- a/src/libavoid/graph.h
+++ b/src/libavoid/graph.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
#ifndef AVOID_GRAPH_H
#define AVOID_GRAPH_H
namespace Avoid {
+
class ConnRef;
class Router;
class EdgeInf
{
public:
- EdgeInf(VertInf *v1, VertInf *v2);
- virtual ~EdgeInf();
+ EdgeInf(VertInf *v1, VertInf *v2, const bool orthogonal = false);
+ ~EdgeInf();
inline double getDist(void)
{
return _dist;
void addConn(bool *flag);
void addCycleBlocker(void);
void addBlocker(int b);
+ bool added(void);
+ bool isOrthogonal(void) const;
+ bool rotationLessThan(const VertInf* last, const EdgeInf *rhs) const;
std::pair<VertID, VertID> ids(void);
std::pair<Point, Point> points(void);
Router *_router;
bool _added;
bool _visible;
+ bool _orthogonal;
VertInf *_v1;
VertInf *_v2;
EdgeInfList::iterator _pos1;
class EdgeList
{
public:
- EdgeList();
- void addEdge(EdgeInf *edge);
- void removeEdge(EdgeInf *edge);
+ friend class EdgeInf;
+ EdgeList(bool orthogonal = false);
+ ~EdgeList();
+ void clear(void);
EdgeInf *begin(void);
EdgeInf *end(void);
+ int size(void) const;
private:
+ void addEdge(EdgeInf *edge);
+ void removeEdge(EdgeInf *edge);
+ bool _orthogonal;
EdgeInf *_firstEdge;
EdgeInf *_lastEdge;
unsigned int _count;
index d598c6c74b6873213c6ebe0a5be4723f9bb8ab95..1d4cd1fdc476aef929adef3d5974d162a512166c 100644 (file)
--- a/src/libavoid/libavoid.h
+++ b/src/libavoid/libavoid.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+//! @file libavoid.h
+//! @brief Standard libavoid include file which includes all libavoid
+//! header files.
+
+//! @namespace Avoid
+//! @brief The namespace used by code in the libavoid library.
+
#ifndef AVOID_LIBAVOID_H
#define AVOID_LIBAVOID_H
#include "libavoid/geomtypes.h"
-#include "libavoid/polyutil.h"
#include "libavoid/connector.h"
#include "libavoid/graph.h"
#include "libavoid/debug.h"
#include "libavoid/makepath.h"
#include "libavoid/vertices.h"
#include "libavoid/visibility.h"
-#include "libavoid/static.h"
#include "libavoid/router.h"
#endif
index 3a57f8e4e3f099e99f03fd2602e08749219f6810..4e15dbca9878aa697bd4f8404362fac588375ddc 100644 (file)
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
*
- * --------------------------------------------------------------------
- * The dijkstraPath function is based on code published and described
- * in "Algorithms in C" (Second Edition), 1990, by Robert Sedgewick.
- * --------------------------------------------------------------------
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
+#include <algorithm>
+#include <vector>
+#include <climits>
+#define _USE_MATH_DEFINES
+#include <cmath>
+
#include "libavoid/vertices.h"
#include "libavoid/makepath.h"
#include "libavoid/geometry.h"
#include "libavoid/connector.h"
#include "libavoid/graph.h"
#include "libavoid/router.h"
-#include <algorithm>
-#include <vector>
-#include <climits>
-#include <limits.h>
-#include <math.h>
+#include "libavoid/debug.h"
+#include "libavoid/assertions.h"
+#ifdef ASTAR_DEBUG
+ #include <SDL_gfxPrimitives.h>
+#endif
namespace Avoid {
+class ANode
+{
+ public:
+ VertInf* inf;
+ double g; // Gone
+ double h; // Heuristic
+ double f; // Formula f = g + h
+
+ int prevIndex; // Index into DONE for the previous ANode.
+ int timeStamp; // Timestamp used to determine explaration order of
+ // seemingly equal paths during orthogonal routing.
+
+ ANode(VertInf *vinf, int time)
+ : inf(vinf),
+ g(0),
+ h(0),
+ f(0),
+ prevIndex(-1),
+ timeStamp(time)
+ {
+ }
+ ANode()
+ : inf(NULL),
+ g(0),
+ h(0),
+ f(0),
+ prevIndex(-1),
+ timeStamp(-1)
+ {
+ }
+};
+
+
+// This returns the opposite result (>) so that when used with stl::make_heap,
+// the head node of the heap will be the smallest value, rather than the
+// largest. This saves us from having to sort the heap (and then reorder
+// it back into a heap) when getting the next node to examine. This way we
+// get better complexity -- logarithmic pushs and pops to the heap.
+//
+bool operator<(const ANode &a, const ANode &b)
+{
+ if (a.f != b.f)
+ {
+ return a.f > b.f;
+ }
+ if (a.timeStamp != b.timeStamp)
+ {
+ // Tiebreaker, if two paths have equal cost, then choose the one with
+ // the highest timeStamp. This corresponds to the furthest point
+ // explored along the straight-line path. When exploring we give the
+ // directions the following timeStamps; left:1, right:2 and forward:3,
+ // then we always try to explore forward first.
+ return a.timeStamp < b.timeStamp;
+ }
+ COLA_ASSERT(a.prevIndex != b.prevIndex);
+ return a.prevIndex > b.prevIndex;
+}
+
static double Dot(const Point& l, const Point& r)
{
//
static double angleBetween(const Point& p1, const Point& p2, const Point& p3)
{
+ if ((p1.x == p2.x && p1.y == p2.y) || (p2.x == p3.x && p2.y == p3.y))
+ {
+ // If two of the points are the same, then we can't say anything
+ // about the angle between. Treat them as being collinear.
+ return M_PI;
+ }
+
Point v1(p1.x - p2.x, p1.y - p2.y);
Point v2(p3.x - p2.x, p3.y - p2.y);
}
+// Construct a temporary Polygon path given several VertInf's for a connector.
+//
+static void constructPolygonPath(Polygon& connRoute, VertInf *inf2,
+ VertInf *inf3, std::vector<ANode>& done, int inf1Index)
+{
+ int routeSize = 2;
+ for (int curr = inf1Index; curr >= 0; curr = done[curr].prevIndex)
+ {
+ routeSize += 1;
+ }
+ connRoute.ps.resize(routeSize);
+ connRoute.ps[routeSize - 1] = inf3->point;
+ connRoute.ps[routeSize - 2] = inf2->point;
+ routeSize -= 3;
+ for (int curr = inf1Index; curr >= 0; curr = done[curr].prevIndex)
+ {
+ connRoute.ps[routeSize] = done[curr].inf->point;
+ routeSize -= 1;
+ }
+}
+
+
// Given the two points for a new segment of a path (inf2 & inf3)
// as well as the distance between these points (dist), as well as
// possibly the previous point (inf1) [from inf1--inf2], return a
// cost associated with this route.
//
-double cost(ConnRef *lineRef, const double dist, VertInf *inf1,
- VertInf *inf2, VertInf *inf3)
+static double cost(ConnRef *lineRef, const double dist, VertInf *inf2,
+ VertInf *inf3, std::vector<ANode>& done, int inf1Index)
{
+ VertInf *inf1 = (inf1Index >= 0) ? done[inf1Index].inf : NULL;
double result = dist;
+ Polygon connRoute;
Router *router = inf2->_router;
- if (inf2->pathNext != NULL)
+ if (inf1 != NULL)
{
- double& angle_penalty = router->angle_penalty;
- double& segmt_penalty = router->segmt_penalty;
+ const double angle_penalty = router->routingPenalty(anglePenalty);
+ const double segmt_penalty = router->routingPenalty(segmentPenalty);
// This is not the first segment, so there is a bend
// between it and the last one in the existing path.
double rad = M_PI - angleBetween(p1, p2, p3);
- // Make `xval' between 0--10 then take its log so small
- // angles are not penalised as much as large ones.
- //
- double xval = rad * 10 / M_PI;
- double yval = xval * log10(xval + 1) / 10.5;
- result += (angle_penalty * yval);
- //printf("deg from straight: %g\tpenalty: %g\n",
- // rad * 180 / M_PI, (angle_penalty * yval));
-
- // Don't penalise as an extra segment if there is no turn.
- if (rad > 0.0005)
+ if (rad > 0)
+ {
+ // Make `xval' between 0--10 then take its log so small
+ // angles are not penalised as much as large ones.
+ //
+ double xval = rad * 10 / M_PI;
+ double yval = xval * log10(xval + 1) / 10.5;
+ result += (angle_penalty * yval);
+ //db_printf("deg from straight: %g\tpenalty: %g\n",
+ // rad * 180 / M_PI, (angle_penalty * yval));
+ }
+
+ if (rad == M_PI)
{
+ // Needs to double back
+ result += (2 * segmt_penalty);
+ }
+ else if (rad > 0)
+ {
+ // Only penalise as an extra segment if the two
+ // segments are not collinear.
result += segmt_penalty;
}
}
}
- if (lineRef->doesHateCrossings() && (router->crossing_penalty > 0))
+ if (!router->_inCrossingPenaltyReroutingStage)
{
- Point& a1 = inf2->point;
- Point& a2 = inf3->point;
+ // Return here if we ar not in the postprocessing stage
+ return result;
+ }
- ConnRefList::iterator curr, finish = router->connRefs.end();
+ const double cluster_crossing_penalty =
+ router->routingPenalty(clusterCrossingPenalty);
+ // XXX: Clustered routing doesn't yet work with orthogonal connectors.
+ if (router->ClusteredRouting && !router->clusterRefs.empty() &&
+ (cluster_crossing_penalty > 0) &&
+ (lineRef->routingType() != ConnType_Orthogonal))
+ {
+ if (connRoute.empty())
+ {
+ constructPolygonPath(connRoute, inf2, inf3, done, inf1Index);
+ }
+ // There are clusters so do cluster routing.
+ for (ClusterRefList::const_iterator cl = router->clusterRefs.begin();
+ cl != router->clusterRefs.end(); ++cl)
+ {
+ ReferencingPolygon& cBoundary = (*cl)->polygon();
+ COLA_ASSERT(cBoundary.ps[0] != cBoundary.ps[cBoundary.size() - 1]);
+ for (size_t j = 0; j < cBoundary.size(); ++j)
+ {
+ // Cluster boundary points should correspond to shape
+ // vertices and hence already be in the list of vertices.
+ COLA_ASSERT(router->vertices.getVertexByPos(cBoundary.at(j))!=NULL);
+ }
+
+ bool isConn = false;
+ Polygon dynamic_c_boundary(cBoundary);
+ Polygon dynamic_conn_route(connRoute);
+ const bool finalSegment = (inf3 == lineRef->dst());
+ CrossingsInfoPair crossings = countRealCrossings(
+ dynamic_c_boundary, isConn, dynamic_conn_route,
+ connRoute.size() - 1, true, finalSegment);
+ result += (crossings.first * cluster_crossing_penalty);
+ }
+ }
+
+ const double shared_path_penalty =
+ router->routingPenalty(fixedSharedPathPenalty);
+ if (shared_path_penalty > 0)
+ {
+ // Penalises shared paths, except if the connectors shared an endpoint.
+ if (connRoute.empty())
+ {
+ constructPolygonPath(connRoute, inf2, inf3, done, inf1Index);
+ }
+ ConnRefList::const_iterator curr, finish = router->connRefs.end();
for (curr = router->connRefs.begin(); curr != finish; ++curr)
{
ConnRef *connRef = *curr;
{
continue;
}
- Avoid::PolyLine& route2 = connRef->route();
- for (int j = 1; j < route2.pn; ++j)
- {
- Avoid::Point& b1 = route2.ps[j - 1];
- Avoid::Point& b2 = route2.ps[j];
+ const Avoid::PolyLine& route2 = connRef->route();
- if (((a1 == b1) && (a2 == b2)) ||
- ((a2 == b1) && (a1 == b2)))
- {
- // Route along same segment: no penalty. We detect
- // crossovers when we see the segments diverge.
- continue;
- }
-
- if ((a2 == b2) || (a2 == b1) || (b2 == a1))
- {
- // Each crossing that is at a vertex in the
- // visibility graph gets noticed four times.
- // We ignore three of these cases.
- // This also catches the case of a shared path,
- // but this is one that terminates at a common
- // endpoint, so we don't care about it.
- continue;
- }
-
- if (a1 == b1)
- {
- if (j == 1)
- {
- // common source point.
- continue;
- }
- Avoid::Point& b0 = route2.ps[j - 2];
- // The segments share an endpoint -- a1==b1.
- if (a2 == b0)
- {
- // a2 is not a split, continue.
- continue;
- }
-
- // If here, then we know that a2 != b2
- // And a2 and its pair in b are a split.
- assert(a2 != b2);
-
- if (inf2->pathNext == NULL)
- {
- continue;
- }
- Avoid::Point& a0 = inf1->point;
-
- if ((a0 == b0) || (a0 == b2))
- {
- //printf("Shared path... ");
- bool normal = (a0 == b0) ? true : false;
- // Determine direction we have to look through
- // the points of connector b.
- int dir = normal ? -1 : 1;
-
- int traceJ = j - 1 + dir;
-
- int endCornerSide = Avoid::cornerSide(
- a0, a1, a2, normal ? b2 : b0);
-
-
- VertInf *traceInf1 = inf2->pathNext;
- VertInf *traceInf2 = inf2;
- VertInf *traceInf3 = inf3;
- while (traceInf1 &&
- (traceJ >= 0) && (traceJ < route2.pn) &&
- (traceInf1->point == route2.ps[traceJ]))
- {
- traceInf3 = traceInf2;
- traceInf2 = traceInf1;
- traceInf1 = traceInf1->pathNext;
- traceJ += dir;
- }
-
- if (!traceInf1 ||
- (traceJ < 0) || (traceJ >= route2.pn))
- {
- //printf("common source or destination.\n");
- // The connectors have a shared path, but it
- // comes from a common source point.
- // XXX: There might be a better way to
- // check this by asking the connectors
- // for the IDs of the attached shapes.
- continue;
- }
-
- int startCornerSide = Avoid::cornerSide(
- traceInf1->point, traceInf2->point,
- traceInf3->point, route2.ps[traceJ]);
-
- if (endCornerSide != startCornerSide)
- {
- //printf("crosses.\n");
- result += router->crossing_penalty;
- }
- else
- {
- //printf("doesn't cross.\n");
- }
- }
- else
- {
- // The connectors cross or touch at this point.
- //printf("Cross or touch at point... ");
-
- int side1 = Avoid::cornerSide(a0, a1, a2, b0);
- int side2 = Avoid::cornerSide(a0, a1, a2, b2);
-
- if (side1 != side2)
- {
- //printf("cross.\n");
- // The connectors cross at this point.
- result += router->crossing_penalty;
- }
- else
- {
- //printf("touch.\n");
- // The connectors touch at this point.
- }
- }
- continue;
- }
+ bool isConn = true;
+ Polygon dynamic_route2(route2);
+ Polygon dynamic_conn_route(connRoute);
+ CrossingsInfoPair crossings = countRealCrossings(
+ dynamic_route2, isConn, dynamic_conn_route,
+ connRoute.size() - 1, false, false, NULL, NULL,
+ connRef, lineRef);
+
+ if ((crossings.second & CROSSING_SHARES_PATH) &&
+ (crossings.second & CROSSING_SHARES_FIXED_SEGMENT) &&
+ !(crossings.second & CROSSING_SHARES_PATH_AT_END))
+ {
+ // Penalise unecessary shared paths in the middle of
+ // connectors.
+ result += shared_path_penalty;
+ }
+ }
+ }
- double xc, yc;
- int intersectResult = Avoid::segmentIntersectPoint(
- a1, a2, b1, b2, &xc, &yc);
+ const double crossing_penalty = router->routingPenalty(crossingPenalty);
+ if (lineRef->doesHateCrossings() && (crossing_penalty > 0))
+ {
+ if (connRoute.empty())
+ {
+ constructPolygonPath(connRoute, inf2, inf3, done, inf1Index);
+ }
+ ConnRefList::const_iterator curr, finish = router->connRefs.end();
+ for (curr = router->connRefs.begin(); curr != finish; ++curr)
+ {
+ ConnRef *connRef = *curr;
- if (intersectResult == Avoid::DO_INTERSECT)
- {
- result += router->crossing_penalty;
- }
+ if (connRef->id() == lineRef->id())
+ {
+ continue;
}
+ const Avoid::PolyLine& route2 = connRef->route();
+
+ bool isConn = true;
+ Polygon dynamic_route2(route2);
+ Polygon dynamic_conn_route(connRoute);
+ CrossingsInfoPair crossings = countRealCrossings(
+ dynamic_route2, isConn, dynamic_conn_route,
+ connRoute.size() - 1, true);
+ result += (crossings.first * crossing_penalty);
}
}
-
+
return result;
}
-// Returns the best path from src to tar using the cost function.
-//
-// The path is worked out via Dijkstra's algorithm, and is encoded via
-// pathNext links in each of the VerInfs along the path.
-//
-// Based on the code of 'matrixpfs'.
-//
-static void dijkstraPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
+static double estimatedCost(ConnRef *lineRef, const Point *last,
+ const Point& a, const Point& b)
{
- Router *router = src->_router;
-
- double unseen = (double) __INT_MAX__;
-
- // initialize arrays
- VertInf *finish = router->vertices.end();
- for (VertInf *t = router->vertices.connsBegin(); t != finish; t = t->lstNext)
+ if (lineRef->routingType() == ConnType_PolyLine)
{
- t->pathNext = NULL;
- t->pathDist = -unseen;
+ return euclideanDist(a, b);
}
-
- VertInf *min = src;
- while (min != tar)
+ else // Orthogonal
{
- VertInf *k = min;
- min = NULL;
-
- k->pathDist *= -1;
- if (k->pathDist == unseen)
+ // XXX: This currently just takes into account the compulsory
+ // bend but will have to be updated when port direction
+ // information is available.
+ int num_penalties = 0;
+ double xmove = b.x - a.x;
+ double ymove = b.y - a.y;
+ if (!last)
{
- k->pathDist = 0;
- }
-
- EdgeInfList& visList = k->visList;
- EdgeInfList::iterator finish = visList.end();
- for (EdgeInfList::iterator edge = visList.begin(); edge != finish;
- ++edge)
- {
- VertInf *t = (*edge)->otherVert(k);
- VertID tID = t->id;
-
- // Only check shape verticies, or endpoints.
- if ((t->pathDist < 0) &&
- ((tID.objID == src->id.objID) || tID.isShape))
+ // Just two points.
+ if ((xmove != 0) && (ymove != 0))
{
- double kt_dist = (*edge)->getDist();
- double priority = k->pathDist +
- cost(lineRef, kt_dist, k->pathNext, k, t);
-
- if ((kt_dist != 0) && (t->pathDist < -priority))
- {
- t->pathDist = -priority;
- t->pathNext = k;
- }
- if ((min == NULL) || (t->pathDist > min->pathDist))
- {
- min = t;
- }
+ num_penalties += 1;
}
}
- EdgeInfList& invisList = k->invisList;
- finish = invisList.end();
- for (EdgeInfList::iterator edge = invisList.begin(); edge != finish;
- ++edge)
+ else
{
- VertInf *t = (*edge)->otherVert(k);
- VertID tID = t->id;
-
- // Only check shape verticies, or endpoints.
- if ((t->pathDist < 0) &&
- ((tID.objID == src->id.objID) || tID.isShape > 0))
+ // We have three points, so we know the direction of the
+ // previous segment.
+ double rad = M_PI - angleBetween(*last, a, b);
+ if (rad > (M_PI / 2))
{
- if ((min == NULL) || (t->pathDist > min->pathDist))
- {
- min = t;
- }
+ // Target point is back in the direction of the first point,
+ // so at least two bends are required.
+ num_penalties += 2;
+ }
+ else if (rad > 0)
+ {
+ // To the side, so at least one bend.
+ num_penalties += 1;
}
}
+ double penalty = num_penalties *
+ lineRef->router()->routingPenalty(segmentPenalty);
+
+ return manhattanDist(a, b) + penalty;
}
}
-class ANode
+class CmpVisEdgeRotation
{
public:
- VertInf* inf;
- double g; // Gone
- double h; // Heuristic
- double f; // Formula f = g + h
- VertInf *pp;
-
- ANode(VertInf *vinf)
- : inf(vinf)
- , g(0)
- , h(0)
- , f(0)
- , pp(NULL)
+ CmpVisEdgeRotation(const VertInf* lastPt)
+ : _lastPt(lastPt)
{
}
- ANode()
- : inf(NULL)
- , g(0)
- , h(0)
- , f(0)
- , pp(NULL)
+ bool operator() (const EdgeInf* u, const EdgeInf* v) const
{
+ return u->rotationLessThan(_lastPt, v);
}
+ private:
+ const VertInf *_lastPt;
};
-bool operator<(const ANode &a, const ANode &b)
-{
- return a.f < b.f;
-}
-
-
-bool operator>(const ANode &a, const ANode &b)
-{
- return a.f > b.f;
-}
-
// Returns the best path from src to tar using the cost function.
//
// The path is worked out using the aStar algorithm, and is encoded via
-// pathNext links in each of the VerInfs along the path.
+// prevIndex values for each ANode which point back to the previous ANode's
+// position in the DONE vector. At completion, this order is written into
+// the pathNext links in each of the VerInfs along the path.
//
// The aStar STL code is based on public domain code available on the
// internet.
//
-static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar)
+static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar,
+ VertInf *start)
{
+ bool isOrthogonal = (lineRef->routingType() == ConnType_Orthogonal);
+
+ double (*dist)(const Point& a, const Point& b) =
+ (isOrthogonal) ? manhattanDist : euclideanDist;
+
std::vector<ANode> PENDING; // STL Vectors chosen because of rapid
std::vector<ANode> DONE; // insertions/deletions at back,
ANode Node, BestNode; // Temporary Node and BestNode
bool bNodeFound = false; // Flag if node is found in container
+ int timestamp = 1;
- tar->pathNext = NULL;
+ if (start == NULL)
+ {
+ start = src;
+ }
+
+ Router *router = lineRef->router();
+ if (router->RubberBandRouting && (start != src))
+ {
+ COLA_ASSERT(router->IgnoreRegions == true);
+
+ const PolyLine& currRoute = lineRef->route();
+ VertInf *last = NULL;
+ int rIndx = 0;
+ while (last != start)
+ {
+ const Point& pnt = currRoute.at(rIndx);
+ bool isShape = (rIndx > 0);
+ VertID vID(pnt.id, isShape, pnt.vn);
+
+#ifdef PATHDEBUG
+ db_printf("/// %d %d %d\n", pnt.id, (int) isShape, pnt.vn);
+#endif
+ VertInf *curr = router->vertices.getVertexByID(vID);
+ COLA_ASSERT(curr != NULL);
+
+ Node = ANode(curr, timestamp++);
+ if (!last)
+ {
+ Node.g = 0;
+ Node.h = estimatedCost(lineRef, NULL, Node.inf->point,
+ tar->point);
+ Node.f = Node.g + Node.h;
+ }
+ else
+ {
+ double edgeDist = dist(BestNode.inf->point, curr->point);
+
+ Node.g = BestNode.g + cost(lineRef, edgeDist, BestNode.inf,
+ Node.inf, DONE, BestNode.prevIndex);
+
+ // Calculate the Heuristic.
+ Node.h = estimatedCost(lineRef, &(BestNode.inf->point),
+ Node.inf->point, tar->point);
+
+ // The A* formula
+ Node.f = Node.g + Node.h;
+
+ // Point parent to last BestNode (pushed onto DONE)
+ Node.prevIndex = DONE.size() - 1;
+ }
+
+ if (curr != start)
+ {
+ BestNode = Node;
+
+ DONE.push_back(BestNode);
+ }
+ else
+ {
+ PENDING.push_back(Node);
+ }
- // Create the start node
- Node = ANode(src);
- Node.g = 0;
- Node.h = dist(Node.inf->point, tar->point);
- Node.f = Node.g + Node.h;
- // Set a null parent, so cost function knows this is the first segment.
- Node.pp = NULL;
+ rIndx++;
+ last = curr;
+ }
+ }
+ else
+ {
+ // Create the start node
+ Node = ANode(src, timestamp++);
+ Node.g = 0;
+ Node.h = estimatedCost(lineRef, NULL, Node.inf->point, tar->point);
+ Node.f = Node.g + Node.h;
+ // Set a null parent, so cost function knows this is the first segment.
+
+ // Populate the PENDING container with the first location
+ PENDING.push_back(Node);
+ }
+
+ tar->pathNext = NULL;
- // Populate the PENDING container with the first location
- PENDING.push_back(Node);
// Create a heap from PENDING for sorting
using std::make_heap; using std::push_heap; using std::pop_heap;
make_heap( PENDING.begin(), PENDING.end() );
while (!PENDING.empty())
{
- // Ascending sort based on overloaded operators below
- sort_heap(PENDING.begin(), PENDING.end());
-
- // Set the Node with lowest f value to BESTNODE
+ // Set the Node with lowest f value to BESTNODE.
+ // Since the ANode operator< is reversed, the head of the
+ // heap is the node with the lowest f value.
BestNode = PENDING.front();
// Pop off the heap. Actually this moves the
// is not actually removed since the pop is to
// the heap and not the container.
pop_heap(PENDING.begin(), PENDING.end());
-
-
// Remove node from right (the value we pop_heap'd)
PENDING.pop_back();
// Push the BestNode onto DONE
- BestNode.inf->pathNext = BestNode.pp;
DONE.push_back(BestNode);
+ VertInf *prevInf = (BestNode.prevIndex >= 0) ?
+ DONE[BestNode.prevIndex].inf : NULL;
#if 0
- printf("Considering... ");
- BestNode.ID->print(stdout);
- printf(" - g: %3.1f h: %3.1f f: %3.1f back: ", BestNode.g, BestNode.h,
- BestNode.f);
- BestNode.pp.print(stdout);
- printf("\n");
+ db_printf("Considering... ");
+ db_printf(" %g %g ", BestNode.inf->point.x, BestNode.inf->point.y);
+ BestNode.inf->id.db_print();
+ db_printf(" - g: %3.1f h: %3.1f back: ", BestNode.g, BestNode.h);
+ if (prevInf)
+ {
+ db_printf(" %g %g", prevInf->point.x, prevInf->point.y);
+ //prevInf->id.db_print();
+ }
+ db_printf("\n");
+#endif
+
+#if defined(ASTAR_DEBUG)
+ if (router->avoid_screen)
+ {
+ int canx = 151;
+ int cany = 55;
+ int radius = 5;
+ ANode curr;
+ for (curr = BestNode; curr.prevIndex >= 0;
+ curr = DONE[curr.prevIndex])
+ {
+ filledCircleRGBA(router->avoid_screen,
+ (int) curr.inf->point.x + canx,
+ (int) curr.inf->point.y + cany,
+ radius, 0, 0, 255, 128);
+ }
+ filledCircleRGBA(router->avoid_screen,
+ (int) BestNode.inf->point.x + canx,
+ (int) BestNode.inf->point.y + cany,
+ radius, 255, 0, 0, 255);
+
+ SDL_Flip(router->avoid_screen);
+ //SDL_Delay(500);
+
+ filledCircleRGBA(router->avoid_screen,
+ (int) BestNode.inf->point.x + canx,
+ (int) BestNode.inf->point.y + cany,
+ radius, 255, 255, 255, 255);
+ filledCircleRGBA(router->avoid_screen,
+ (int) BestNode.inf->point.x + canx,
+ (int) BestNode.inf->point.y + cany,
+ radius, 0, 255, 0, 128);
+ for (curr = BestNode; curr.prevIndex >= 0;
+ curr = DONE[curr.prevIndex])
+ {
+ filledCircleRGBA(router->avoid_screen,
+ (int) curr.inf->point.x + canx,
+ (int) curr.inf->point.y + cany,
+ radius, 255, 255, 255, 255);
+ filledCircleRGBA(router->avoid_screen,
+ (int) curr.inf->point.x + canx,
+ (int) curr.inf->point.y + cany,
+ radius, 0, 255, 0, 128);
+ }
+ }
#endif
// If at destination, break and create path below
if (BestNode.inf == tar)
{
+#ifdef PATHDEBUG
+ db_printf("Cost: %g\n", BestNode.f);
+#endif
//bPathFound = true; // arrived at destination...
+
+ // Correct all the pathNext pointers.
+ ANode curr;
+ int currIndex = DONE.size() - 1;
+ for (curr = BestNode; curr.prevIndex > 0;
+ curr = DONE[curr.prevIndex])
+ {
+ COLA_ASSERT(curr.prevIndex < currIndex);
+ curr.inf->pathNext = DONE[curr.prevIndex].inf;
+ currIndex = curr.prevIndex;
+ }
+ // Check that we've gone through the complete path.
+ COLA_ASSERT(curr.prevIndex == 0);
+ // Fill in the final pathNext pointer.
+ curr.inf->pathNext = DONE[curr.prevIndex].inf;
+
break;
}
// Check adjacent points in graph
- EdgeInfList& visList = BestNode.inf->visList;
- EdgeInfList::iterator finish = visList.end();
- for (EdgeInfList::iterator edge = visList.begin(); edge != finish;
- ++edge)
+ EdgeInfList& visList = (!isOrthogonal) ?
+ BestNode.inf->visList : BestNode.inf->orthogVisList;
+ if (isOrthogonal)
+ {
+ // We would like to explore in a structured way,
+ // so sort the points in the visList...
+ CmpVisEdgeRotation compare(prevInf);
+ visList.sort(compare);
+ }
+ EdgeInfList::const_iterator finish = visList.end();
+ for (EdgeInfList::const_iterator edge = visList.begin();
+ edge != finish; ++edge)
{
- Node.inf = (*edge)->otherVert(BestNode.inf);
+ Node = ANode((*edge)->otherVert(BestNode.inf), timestamp++);
+
+ // Set the index to the previous ANode that we reached
+ // this ANode through (the last BestNode pushed onto DONE).
+ Node.prevIndex = DONE.size() - 1;
// Only check shape verticies, or the tar endpoint.
if (!(Node.inf->id.isShape) && (Node.inf != tar))
continue;
}
+ VertInf *prevInf = (BestNode.prevIndex >= 0) ?
+ DONE[BestNode.prevIndex].inf : NULL;
+
+ // Don't bother looking at the segment we just arrived along.
+ if (prevInf && (prevInf == Node.inf))
+ {
+ continue;
+ }
+
double edgeDist = (*edge)->getDist();
if (edgeDist == 0)
continue;
}
- VertInf *prevInf = BestNode.inf->pathNext;
+ if (!router->_orthogonalRouting &&
+ (!router->RubberBandRouting || (start == src)) &&
+ (validateBendPoint(prevInf, BestNode.inf, Node.inf) == false))
+ {
+ // The bendpoint is not valid, i.e., is a zigzag corner, so...
+ continue;
+ // For RubberBand routing we want to allow these routes and
+ // unwind them later, otherwise instead or unwinding, paths
+ // can go the *really* long way round.
+ }
- Node.g = BestNode.g + cost(lineRef, edgeDist, prevInf,
- BestNode.inf, Node.inf);
+ Node.g = BestNode.g + cost(lineRef, edgeDist, BestNode.inf,
+ Node.inf, DONE, BestNode.prevIndex);
// Calculate the Heuristic.
- Node.h = dist(Node.inf->point, tar->point);
+ Node.h = estimatedCost(lineRef, &(BestNode.inf->point),
+ Node.inf->point, tar->point);
// The A* formula
Node.f = Node.g + Node.h;
- // Point parent to last BestNode (pushed onto DONE)
- Node.pp = BestNode.inf;
+
+#if 0
+ db_printf("-- Adding: %g %g ", Node.inf->point.x,
+ Node.inf->point.y);
+ Node.inf->id.db_print();
+ db_printf(" - g: %3.1f h: %3.1f \n", Node.g, Node.h);
+#endif
bNodeFound = false;
// Check to see if already on PENDING
for (unsigned int i = 0; i < PENDING.size(); i++)
{
- if (Node.inf == PENDING.at(i).inf)
- { // If already on PENDING
- if (Node.g < PENDING.at(i).g)
+ ANode& ati = PENDING.at(i);
+ if ((Node.inf == ati.inf) &&
+ (DONE[Node.prevIndex].inf == DONE[ati.prevIndex].inf))
+ {
+ // If already on PENDING
+ if (Node.g < ati.g)
{
- PENDING.at(i).g = Node.g;
- PENDING.at(i).f = Node.g + PENDING.at(i).h;
- PENDING.at(i).pp = Node.pp;
+ PENDING[i] = Node;
+
+ make_heap( PENDING.begin(), PENDING.end() );
}
bNodeFound = true;
break;
// Check to see if already on DONE
for (unsigned int i = 0; i < DONE.size(); i++)
{
- if (Node.inf == DONE.at(i).inf)
+ ANode& ati = DONE.at(i);
+ if ((Node.inf == ati.inf) &&
+ (DONE[Node.prevIndex].inf == DONE[ati.prevIndex].inf))
{
// If on DONE, Which has lower gone?
- if (Node.g < DONE.at(i).g)
+ if (Node.g < ati.g)
{
- DONE.at(i).g = Node.g;
- DONE.at(i).f = Node.g + DONE.at(i).h;
- DONE.at(i).pp = Node.pp;
- DONE.at(i).inf->pathNext = Node.pp;
+ DONE[i] = Node;
}
bNodeFound = true;
break;
PENDING.push_back(Node);
// Push NewNode onto heap
push_heap( PENDING.begin(), PENDING.end() );
- // Re-Assert heap, or will be short by one
- make_heap( PENDING.begin(), PENDING.end() );
#if 0
+ using std::cout; using std::endl;
// Display PENDING and DONE containers (For Debugging)
cout << "PENDING: ";
- for (int i = 0; i < PENDING.size(); i++)
+ for (unsigned int i = 0; i < PENDING.size(); i++)
{
- cout << PENDING.at(i).x << "," << PENDING.at(i).y << ",";
- cout << PENDING.at(i).g << "," << PENDING.at(i).h << " ";
+ cout << PENDING.at(i).g << "," << PENDING.at(i).h << ",";
+ cout << PENDING.at(i).inf << "," << PENDING.at(i).pp << " ";
}
cout << endl;
cout << "DONE: ";
- for (int i = 0; i < DONE.size(); i++)
+ for (unsigned int i = 0; i < DONE.size(); i++)
{
- cout << DONE.at(i).x << "," << DONE.at(i).y << ",";
- cout << DONE.at(i).g << "," << DONE.at(i).h << " ";
+ cout << DONE.at(i).g << "," << DONE.at(i).h << ",";
+ cout << DONE.at(i).inf << "," << DONE.at(i).pp << " ";
}
cout << endl << endl;
- int ch = _getch();
#endif
}
}
// Returns the best path for the connector referred to by lineRef.
//
-// The path encoded in the pathNext links in each of the VerInfs
+// The path encoded in the pathNext links in each of the VertInfs
// backwards along the path, from the tar back to the source.
//
void makePath(ConnRef *lineRef, bool *flag)
{
+ bool isOrthogonal = (lineRef->routingType() == ConnType_Orthogonal);
Router *router = lineRef->router();
VertInf *src = lineRef->src();
VertInf *tar = lineRef->dst();
+ VertInf *start = lineRef->start();
- // If the connector hates crossings then we want to examine direct paths:
- bool examineDirectPath = lineRef->doesHateCrossings();
-
// TODO: Could be more efficient here.
- EdgeInf *directEdge = EdgeInf::existingEdge(src, tar);
- if (!(router->IncludeEndpoints) && directVis(src, tar))
- {
- Point p = src->point;
- Point q = tar->point;
-
- assert(directEdge == NULL);
-
- directEdge = new EdgeInf(src, tar);
- tar->pathNext = src;
- directEdge->setDist(dist(p, q));
- directEdge->addConn(flag);
-
- return;
- }
- else if (router->IncludeEndpoints && directEdge &&
- (directEdge->getDist() > 0) && !examineDirectPath)
+ if (isOrthogonal)
{
- tar->pathNext = src;
- directEdge->addConn(flag);
+ aStarPath(lineRef, src, tar, start);
}
- else
+ else // if (!isOrthogonal)
{
- // Mark the path endpoints as not being able to see
- // each other. This is true if we are here.
- if (!(router->IncludeEndpoints) && router->InvisibilityGrph)
- {
- if (!directEdge)
- {
- directEdge = new EdgeInf(src, tar);
- }
- directEdge->addBlocker(0);
- }
-
- if (router->UseAStarSearch)
+ EdgeInf *directEdge = EdgeInf::existingEdge(src, tar);
+ // If the connector hates crossings or there are clusters present,
+ // then we want to examine direct paths:
+ bool examineDirectPath = lineRef->doesHateCrossings() ||
+ !(router->clusterRefs.empty());
+
+ if ((start == src) && directEdge && (directEdge->getDist() > 0) &&
+ !examineDirectPath)
{
- aStarPath(lineRef, src, tar);
+ tar->pathNext = src;
+ directEdge->addConn(flag);
}
else
{
- dijkstraPath(lineRef, src, tar);
+ aStarPath(lineRef, src, tar, start);
}
+ }
#if 0
- PointMap::iterator t;
- for (VertInf *t = vertices.connsBegin(); t != vertices.end();
- t = t->lstNext)
- {
-
- t->id.print();
- printf(" -> ");
- t->pathNext->id.print();
- printf("\n");
- }
-#endif
+ for (VertInf *t = vertices.connsBegin(); t != vertices.end();
+ t = t->lstNext)
+ {
+ t->id.db_print();
+ db_printf(" -> ");
+ t->pathNext->id.db_print();
+ db_printf("\n");
}
+#endif
}
index 4d68a01e3160fee822f43fe8f2b4d2352d7ccd0a..b40bfbc3d8ce22c0bb066c12e56647cee7b72492 100644 (file)
--- a/src/libavoid/makepath.h
+++ b/src/libavoid/makepath.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
#ifndef AVOID_MAKEPATH_H
#define AVOID_MAKEPATH_H
diff --git a/src/libavoid/polyutil.cpp b/src/libavoid/polyutil.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
-*/
-
-#include <cassert>
-#include <cstdlib>
-
-#include "libavoid/polyutil.h"
-#include "libavoid/geomtypes.h"
-#include "libavoid/vertices.h"
-#include "libavoid/shape.h"
-
-namespace Avoid {
-
-
-Polygn newPoly(int size)
-{
- Polygn newpoly;
-
- newpoly.id = 0;
- newpoly.pn = size;
- newpoly.ps = (Point *) calloc(size, sizeof(Point));
- if (!newpoly.ps)
- {
- fprintf(stderr,
- "Error: Unable to allocate Point array in Avoid::newPoly\n");
- abort();
- }
- return newpoly;
-}
-
-
-Polygn copyPoly(Polygn poly)
-{
- Polygn newpoly = newPoly(poly.pn);
-
- newpoly.id = poly.id;
- for (int i = 0; i < poly.pn; i++)
- {
- newpoly.ps[i] = poly.ps[i];
- }
- return newpoly;
-}
-
-
-Polygn copyPoly(ShapeRef *shape)
-{
- Polygn poly = shape->poly();
- Polygn newpoly = newPoly(poly.pn);
-
- newpoly.id = poly.id;
- for (int i = 0; i < poly.pn; i++)
- {
- newpoly.ps[i] = poly.ps[i];
- }
- return newpoly;
-}
-
-
-void freePoly(Polygn& poly)
-{
- std::free(poly.ps);
-}
-
-
-void freePtrPoly(Polygn *poly)
-{
- std::free(poly->ps);
- std::free(poly);
-}
-
-
-}
-
diff --git a/src/libavoid/polyutil.h b/src/libavoid/polyutil.h
--- a/src/libavoid/polyutil.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
-*/
-
-#include "libavoid/geometry.h"
-#include "libavoid/shape.h"
-
-#ifndef AVOID_POLYUTIL_H
-#define AVOID_POLYUTIL_H
-
-namespace Avoid {
-
-
-extern Polygn newPoly(int size);
-extern Polygn copyPoly(Polygn);
-extern Polygn copyPoly(ShapeRef *shape);
-extern void freePoly(Polygn&);
-extern void freePtrPoly(Polygn *argpoly);
-
-
-}
-
-#endif
diff --git a/src/libavoid/region.cpp b/src/libavoid/region.cpp
--- a/src/libavoid/region.cpp
+++ /dev/null
@@ -1,858 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
-*/
-
-#include <stdio.h>
-#include <cstdlib>
-#include <algorithm>
-#include <cassert>
-#include <cmath>
-
-#include "libavoid/shape.h"
-#include "libavoid/region.h"
-
-
-namespace Avoid {
-
-Region *centerRegion = NULL;
-
-static const BBox screenBBox =
- {Point(-INFINITY, -INFINITY), Point(INFINITY, INFINITY)};
-
-
-Region::Region()
- : _bbox(screenBBox)
- , _left(NULL), _right(NULL), _up(NULL), _down(NULL)
-{
- _blocks.clear();
-}
-
-
-Region::Region(double x1, double y1, double x2, double y2)
- : _left(NULL), _right(NULL), _up(NULL), _down(NULL)
-{
- _bbox.a.x = x1;
- _bbox.a.y = y1;
- _bbox.b.x = x2;
- _bbox.b.y = y2;
-
- _blocks.clear();
-}
-
-
-static const unsigned int R_INSIDE = 0;
-static const unsigned int R_LEFT = 1;
-static const unsigned int R_LEDGE = 2;
-static const unsigned int R_RIGHT = 4;
-static const unsigned int R_REDGE = 8;
-static const unsigned int R_ABOVE = 16;
-static const unsigned int R_TEDGE = 32;
-static const unsigned int R_BELOW = 64;
-static const unsigned int R_BEDGE = 128;
-
-static const unsigned int R_NONE = R_INSIDE;
-static const unsigned int R_UP = R_ABOVE;
-static const unsigned int R_DOWN = R_BELOW;
-static const unsigned int R_HORI = R_LEFT | R_RIGHT;
-static const unsigned int R_VERT = R_UP | R_DOWN;
-
-
-static void printBBox(const char *label, const BBox &bbox)
-{
- if (label)
- {
- printf("%s: ", label);
- }
- printf("(%.2f, %.2f)-(%.2f, %.2f)\n", bbox.a.x, bbox.a.y,
- bbox.b.x, bbox.b.y);
-}
-
-
-bool Region::overlapCheck(BBox& bbox, unsigned int& p)
-{
- p = R_INSIDE;
- Point& a = bbox.a;
- Point& b = bbox.b;
- Point& r = _bbox.a;
- Point& s = _bbox.b;
-
- if (s.x <= a.x)
- {
- // Wholly right.
- p = R_RIGHT;
- return false;
- }
- else if (r.x >= b.x)
- {
- // Wholly left.
- p = R_LEFT;
- return false;
- }
-
- if (s.y <= a.y)
- {
- // Wholly below.
- p = R_BELOW;
- return false;
- }
- else if (r.y >= b.y)
- {
- // Wholly above.
- p = R_ABOVE;
- return false;
- }
-
- if (a.y == r.y)
- {
- // Shared top edge.
- p |= R_TEDGE;
- }
- else if (a.y < r.y)
- {
- // Need to split above.
- p |= R_ABOVE;
- }
-
- if (b.y == s.y)
- {
- // Shared bottom edge.
- p |= R_BEDGE;
- }
- else if (b.y > s.y)
- {
- // Need to split below.
- p |= R_BELOW;
- }
-
- if (a.x == r.x)
- {
- // Shared left edge.
- p |= R_LEDGE;
- }
- else if (a.x < r.x)
- {
- // Need to split left.
- p |= R_LEFT;
- }
-
- if (b.x == s.x)
- {
- // Shared right edge.
- p |= R_REDGE;
- }
- else if (b.x > s.x)
- {
- // Need to split right.
- p |= R_RIGHT;
- }
-
- return true;
-}
-
-
-void Region::getBBox(BBox& bb)
-{
- bb.a = _bbox.a;
- bb.b = _bbox.b;
-}
-
-
-Region *Region::up(void)
-{
- return _up;
-}
-
-
-Region *Region::down(void)
-{
- return _down;
-}
-
-
-Region *Region::left(void)
-{
- return _left;
-}
-
-
-Region *Region::right(void)
-{
- return _right;
-}
-
-
-bool Region::isBlock(void)
-{
- return !(_blocks.empty());
-}
-
-
-void Region::initialSplit(BBox& bbox, unsigned int pos, unsigned int& shapeId)
-{
- Point& n1 = bbox.a;
- Point& n2 = bbox.b;
- Region *newR = this;
- Region *left, *right, *top, *bottom;
-
- if (pos == R_INSIDE)
- {
- split(n2.y, R_HORI);
- split(n2.x, R_VERT);
- newR = split(n1.y, R_HORI);
- newR = newR->split(n1.x, R_VERT);
-
- printf("%p - list %d add %d\n", newR,
- (int) newR->_blocks.size(), shapeId);
- newR->_blocks.push_back((int) shapeId);
- newR->_blocks.sort();
- newR->_blocks.unique();
- }
- else
- {
- Region *tar = NULL;
- tar = newR->findRegion(n1.x, R_VERT);
- if (pos & R_LEFT)
- {
- if (n1.x == tar->_bbox.a.x)
- {
- newR = tar->_right;
- }
- else if (n1.x == tar->_bbox.b.x)
- {
- newR = tar;
- }
- else
- {
- newR = tar->split(n1.x, R_VERT);
- }
- }
- else if (!(pos & R_LEDGE))
- {
- newR = tar->split(n1.x, R_VERT);
- }
- left = newR;
-
- tar = left->findRegion(n1.y, R_HORI);
- if (pos & R_ABOVE)
- {
- if (n1.y == tar->_bbox.a.y)
- {
- newR = tar->_down;
- }
- else if (n1.y == tar->_bbox.b.y)
- {
- newR = tar;
- }
- else
- {
- newR = tar->split(n1.y, R_HORI);
- }
- }
- else if (!(pos & R_TEDGE))
- {
- newR = tar->split(n1.y, R_HORI);
- }
- top = newR;
-
- right = newR;
- tar = newR->findRegion(n2.x, R_VERT);
- if (pos & R_RIGHT)
- {
-
- if (n2.x == tar->_bbox.a.x)
- {
- right = tar->_left;
- }
- else if (n2.x == tar->_bbox.b.x)
- {
- right = tar;
- }
- else
- {
- tar->split(n2.x, R_VERT);
- right = tar;
- }
- }
- else if (!(pos & R_REDGE))
- {
- tar->split(n2.x, R_VERT);
- right = tar;
- }
-
- bottom = right;
- tar = right->findRegion(n2.y, R_HORI);
- if (pos & R_BELOW)
- {
- if (n2.y == tar->_bbox.a.y)
- {
- bottom = tar->_up;
- }
- else if (n2.y == tar->_bbox.b.y)
- {
- bottom = tar;
- }
- else
- {
- tar->split(n2.y, R_HORI);
- bottom = tar;
- }
- }
- else if (!(pos & R_BEDGE))
- {
- tar->split(n2.y, R_HORI);
- bottom = tar;
- }
-
- // top is actually top-left, and bottom is bottom-right.
- Region *curr = top, *cptr = NULL;
- while (curr->_bbox.b.y <= bottom->_bbox.b.y)
- {
- cptr = curr;
- while (cptr->_bbox.b.x <= bottom->_bbox.b.x)
- {
- printf("%p - list %d add %d\n", cptr,
- (int) cptr->_blocks.size(), shapeId);
- cptr->_blocks.push_back((int) shapeId);
- cptr->_blocks.sort();
- cptr->_blocks.unique();
-
- cptr = cptr->_right;
- }
-
- curr = curr->_down;
- }
- }
-}
-
-
-// Returns the region containing the value 'pos' in the direction 'dir'.
-// Thus, if looking for the x value 55, you would pass R_VERT as 'dir'.
-// 'forMerge' specifies that the left or top block of a pair of regions
-// with the split value of 'pos' should be returned.
-Region *Region::findRegion(double pos, unsigned int dir, const bool forMerge)
-{
- Region *curr = this;
-
- if (dir & R_VERT)
- {
- while (pos > curr->_bbox.b.x)
- {
- curr = curr->_right;
- }
- while (pos < curr->_bbox.a.x)
- {
- curr = curr->_left;
- }
- if (forMerge)
- {
- if (pos == curr->_bbox.a.x)
- {
- curr = curr->_left;
- }
- if (pos != curr->_bbox.b.x)
- {
- // 'pos' is not on the boundary.
- return NULL;
- }
- }
- }
- else if (dir & R_HORI)
- {
- while (pos > curr->_bbox.b.y)
- {
- curr = curr->_down;
- }
- while (pos < curr->_bbox.a.y)
- {
- curr = curr->_up;
- }
- if (forMerge)
- {
- if (pos == curr->_bbox.a.y)
- {
- curr = curr->_up;
- }
- if (pos != curr->_bbox.b.y)
- {
- // 'pos' is not on the boundary.
- return NULL;
- }
- }
- }
- return curr;
-}
-
-
-Region *Region::split(double pos, unsigned int dir)
-{
- Region *newR = NULL;
- bool first = true;
-
- if (dir & R_VERT)
- {
- newR = splitDir(pos, R_UP, first);
- if (_down) _down->splitDir(pos, R_DOWN);
- }
- else if (dir & R_HORI)
- {
- newR = splitDir(pos, R_RIGHT, first);
- if (_left) _left->splitDir(pos, R_LEFT);
- }
- return newR;
-}
-
-
-void Region::merge(unsigned int dir)
-{
- bool first = true;
-
- if (dir & R_VERT)
- {
- mergeDir(R_UP, first);
- if (_down) _down->mergeDir(R_DOWN);
- }
- else if (dir & R_HORI)
- {
- mergeDir(R_RIGHT, first);
- if (_left) _left->mergeDir(R_LEFT);
- }
-}
-
-
-void Region::mergeRegion(Region *src)
-{
- assert(src != NULL);
-
- if (src == _left)
- {
- pairHor(src->_left, this);
- _bbox.a.x = src->_bbox.a.x;
- }
- else if (src == _right)
- {
- pairHor(this, src->_right);
- _bbox.b.x = src->_bbox.b.x;
- }
- else if (src == _up)
- {
- pairVer(src->_up, this);
- _bbox.a.y = src->_bbox.a.y;
- }
- else if (src == _down)
- {
- pairVer(this, src->_down);
- _bbox.b.y = src->_bbox.b.y;
- }
- else
- {
- fprintf(stderr, "Error: Avoid::Region::merge(): "
- "Argument not adjoining region.\n");
- abort();
- }
- mergeAttributes(src);
- printf("DEL %p\n", src);
- delete src;
-}
-
-
-Region *Region::splitDir(double pos, unsigned int dir, bool first)
-{
- Point& o1 = _bbox.a;
- Point& o2 = _bbox.b;
-
- Region *newR = NULL;
-
- if (dir & R_VERT)
- {
- assert(pos > _bbox.a.x);
- assert(pos < _bbox.b.x);
-
- // Vertical recursion:
-
- // Create new block.
- Region *r = new Region(pos, o1.y, o2.x, o2.y);
- printf("NEW %p\n", r);
- r->copyAttributes(this);
-
- Region *o_up = _up;
- Region *o_down = _down;
-
- // Resize old block.
- o2.x = pos;
-
- pairHor(r, _right);
- pairHor(this, r);
-
- if (dir & R_UP)
- {
- if (!first) pairVer(r, _down->_right);
-
- if (o_up) o_up->splitDir(pos, R_UP);
- }
- else if (dir & R_DOWN)
- {
- if (!first) pairVer(_up->_right, r);
-
- if (o_down) o_down->splitDir(pos, R_DOWN);
- }
- newR = r;
- }
- else if (dir & R_HORI)
- {
- // Vertical recursion:
-
- // Create new block.
- Region *b = new Region(o1.x, pos, o2.x, o2.y);
- printf("NEW %p\n", b);
- b->copyAttributes(this);
-
- Region *o_left = _left;
- Region *o_right = _right;
-
- // Resize old block.
- o2.y = pos;
-
- pairVer(b, _down);
- pairVer(this, b);
-
- if (dir & R_LEFT)
- {
- if (!first) pairHor(b, _right->_down);
-
- if (o_left) o_left->splitDir(pos, R_LEFT);
- }
- else if (dir & R_RIGHT)
- {
- if (!first) pairHor(_left->_down, b);
-
- if (o_right) o_right->splitDir(pos, R_RIGHT);
- }
- newR = b;
- }
- return newR;
-}
-
-
-void Region::mergeDir(unsigned int dir, bool first)
-{
- if (dir & R_VERT)
- {
- assert(_right != NULL);
-
- mergeRegion(_right);
-
- if (dir & R_UP)
- {
- if (_up) _up->mergeDir(dir, R_UP);
- }
- else if (dir & R_DOWN)
- {
- if (_down) _down->mergeDir(dir, R_DOWN);
- }
- }
- else if (dir & R_HORI)
- {
- assert(_down != NULL);
-
- mergeRegion(_down);
-
- if (dir & R_LEFT)
- {
- if (_left) _left->mergeDir(dir, R_LEFT);
- }
- else if (dir & R_RIGHT)
- {
- if (_right) _right->mergeDir(dir, R_RIGHT);
- }
- }
-}
-
-
-void Region::copyAttributes(Region *src)
-{
- _blocks = src->_blocks;
-}
-
-
-void Region::mergeAttributes(Region *src)
-{
- _blocks.merge(src->_blocks);
- _blocks.sort();
- _blocks.unique();
-}
-
-
-//---------------------------
-// Static member functions:
-
-
-void Region::pairHor(Region *l, Region *r)
-{
- if (l) l->_right = r;
- if (r) r->_left = l;
-}
-
-
-void Region::pairVer(Region *a, Region *b)
-{
- if (a) a->_down = b;
- if (b) b->_up = a;
-}
-
-
-void Region::addShape(ShapeRef *shape)
-{
- if (!centerRegion)
- {
- // Add new default region.
- centerRegion = new Region();
- printf("NEW %p\n", centerRegion);
- }
- BBox bbox;
- // Get bounding box for added shape.
- shape->boundingBox(bbox);
- printBBox("Add", bbox);
-
- unsigned int shapeId = shape->id();
-
- // Find starting point for overlap
- Region *curr = centerRegion;
- unsigned int pos = R_INSIDE;
- while (!(curr->overlapCheck(bbox, pos)))
- {
- if (pos & R_LEFT)
- {
- curr = curr->_left;
- }
- else if (pos & R_RIGHT)
- {
- curr = curr->_right;
- }
- else if (pos & R_ABOVE)
- {
- curr = curr->_up;
- }
- else if (pos & R_BELOW)
- {
- curr = curr->_down;
- }
- }
-
- curr->initialSplit(bbox, pos, shapeId);
- centerRegion = curr;
-}
-
-
-void Region::removeShape(ShapeRef *shape)
-{
- const bool forMerge = true;
-
- BBox bbox;
- // Get bounding box for added shape.
- shape->boundingBox(bbox);
- printBBox("Remove", bbox);
-
- unsigned int shapeId = shape->id();
-
- Region *aboveTop = centerRegion->findRegion(bbox.a.y, R_HORI, forMerge);
- Region *aboveBottom = aboveTop->findRegion(bbox.b.y, R_HORI, forMerge);
- Region *leftOfLeft = aboveBottom->findRegion(bbox.a.x, R_VERT, forMerge);
- Region *leftOfRight = leftOfLeft->findRegion(bbox.b.x, R_VERT, forMerge);
-
- assert(aboveTop != NULL);
- assert(aboveBottom != NULL);
- assert(leftOfLeft != NULL);
- assert(leftOfRight != NULL);
-
- // Find Top Left.
- Region *topLeft = leftOfLeft->_right;
- while (topLeft->_bbox.a.y != aboveTop->_bbox.b.y)
- {
- topLeft = topLeft->_up;
- }
-
- // Find Bottom Right.
- Region *botRight = leftOfRight;
- while (botRight->_bbox.b.y != aboveBottom->_bbox.b.y)
- {
- botRight = botRight->_down;
- }
-
- // Clear blocking flag.
- Region *curr = topLeft, *cptr = NULL;
- while (curr->_bbox.b.y <= botRight->_bbox.b.y)
- {
- cptr = curr;
- while (cptr->_bbox.b.x <= botRight->_bbox.b.x)
- {
- ShapeList& blocks = cptr->_blocks;
-
- assert(std::find(blocks.begin(), blocks.end(), (int) shapeId) !=
- blocks.end());
- printf("%p - list %d remove %d\n", cptr,
- (int) blocks.size(), shapeId);
- cptr->_blocks.remove((int) shapeId);
-
- cptr = cptr->_right;
- }
-
- curr = curr->_down;
- }
-
- // These two are safe since they don't invalidate the pointers
- // to the regions that are inside the shape.
- if (aboveBottom->safeToMerge(R_HORI))
- {
- aboveBottom->merge(R_HORI);
- }
- if (leftOfRight->safeToMerge(R_VERT))
- {
- leftOfRight->merge(R_VERT);
- }
-
- // Be a bit more careful with these.
- double leftX = leftOfLeft->_bbox.b.x;
- if (aboveTop->safeToMerge(R_HORI))
- {
- aboveTop->merge(R_HORI);
- }
- // leftOfLeft may have been freed, so look for the new block at
- // that position.
- leftOfLeft = aboveTop->findRegion(leftX, R_VERT, forMerge);
- assert(leftOfLeft);
- if (leftOfLeft->safeToMerge(R_VERT))
- {
- leftOfLeft->merge(R_VERT);
- }
-}
-
-
-bool Region::safeToMerge(unsigned int dir)
-{
- bool unsafe = false;
-
- if (dir == R_HORI)
- {
- printf("safeToMerge? y = %.3f... ", _bbox.b.y);
- unsafe |= unsafeToMerge(R_RIGHT);
- if (_left) unsafe |= _left->unsafeToMerge(R_LEFT);
- }
- else if (dir == R_VERT)
- {
- printf("safeToMerge? x = %.3f... ", _bbox.b.x);
- unsafe |= unsafeToMerge(R_DOWN);
- if (_up) unsafe |= _up->unsafeToMerge(R_UP);
- }
- printf("%s.\n", (unsafe) ? "no" : "yes");
-
- return !unsafe;
-}
-
-
-bool Region::unsafeToMerge(unsigned int dir)
-{
- bool unsafe = false;
-
- if (dir & R_HORI)
- {
- // If they are not the same on both sides then we can merge.
- if (_blocks != _down->_blocks)
- {
- printf("\n _blocks:\n ");
- for (ShapeList::iterator i = _blocks.begin(); i != _blocks.end();
- ++i)
- {
- printf("%d ", *i);
- }
- printf("\n _down->_blocks:\n ");
- for (ShapeList::iterator i = _down->_blocks.begin();
- i != _down->_blocks.end(); ++i)
- {
- printf("%d ", *i);
- }
- unsafe |= true;
- printf("\n");
- }
-
- if ((dir == R_LEFT) && _left)
- {
- unsafe |= _left->unsafeToMerge(dir);
- }
- else if ((dir == R_RIGHT) && _right)
- {
- unsafe |= _right->unsafeToMerge(dir);
- }
- }
- else if (dir & R_VERT)
- {
- if (_blocks != _right->_blocks)
- {
- printf("\n _blocks:\n ");
- for (ShapeList::iterator i = _blocks.begin(); i != _blocks.end();
- ++i)
- {
- printf("%d ", *i);
- }
- printf("\n _right->_blocks:\n ");
- for (ShapeList::iterator i = _right->_blocks.begin();
- i != _right->_blocks.end(); ++i)
- {
- printf("%d ", *i);
- }
- unsafe |= true;
- printf("\n");
- }
-
- if ((dir == R_UP) && _up)
- {
- unsafe |= _up->unsafeToMerge(dir);
- }
- else if ((dir == R_DOWN) && _down)
- {
- unsafe |= _down->unsafeToMerge(dir);
- }
- }
- return unsafe;
-
-}
-
-
-Region *Region::getTopLeftRegion(void)
-{
- Region *curr = centerRegion;
-
- while (curr && (curr->_up || curr->_left))
- {
- if (curr->_up)
- {
- curr = curr->_up;
- }
- else
- {
- curr = curr->_left;
- }
- }
- return curr;
-}
-
-
-}
-
diff --git a/src/libavoid/region.h b/src/libavoid/region.h
--- a/src/libavoid/region.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
-*/
-
-#ifndef AVOID_REGION_H
-#define AVOID_REGION_H
-
-#include <list>
-#include "libavoid/geomtypes.h"
-
-namespace Avoid {
-
-class ShapeRef;
-
-typedef std::list<int> ShapeList;
-
-
-class Region
-{
- public:
- Region();
- Region(double x1, double y1, double x2, double y2);
-
- bool overlapCheck(BBox& bbox, unsigned int& p);
- void getBBox(BBox& bb);
- Region *up(void);
- Region *down(void);
- Region *left(void);
- Region *right(void);
- void initialSplit(BBox& bbox, unsigned int pos, unsigned int& shapeId);
- bool isBlock(void);
-
- static void pairHor(Region *l, Region *r);
- static void pairVer(Region *a, Region *b);
- static void addShape(ShapeRef *shape);
- static void removeShape(ShapeRef *shape);
- static Region *getTopLeftRegion(void);
-
- private:
- BBox _bbox;
- Region *_left;
- Region *_right;
- Region *_up;
- Region *_down;
- ShapeList _blocks;
-
- Region *split(double pos, unsigned int dir);
- void merge(unsigned int dir);
- void mergeRegion(Region *src);
- Region *findRegion(double pos, unsigned int dir,
- const bool forMerge = false);
- Region *splitDir(double pos, unsigned int dir, bool first = false);
- void mergeDir(unsigned int dir, bool first = false);
- void copyAttributes(Region *src);
- void mergeAttributes(Region *src);
- bool safeToMerge(unsigned int dir);
- bool unsafeToMerge(unsigned int dir);
-};
-
-
-}
-
-#endif
index df0bacd0266e848fd15e7f889c85397897dc45dc..754c464b4a8098a7b8deb7045906ed0284c4f1f7 100644 (file)
--- a/src/libavoid/router.cpp
+++ b/src/libavoid/router.cpp
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
-#include <cstdlib>
+
+#include <algorithm>
+#include <cmath>
+
#include "libavoid/shape.h"
#include "libavoid/router.h"
#include "libavoid/visibility.h"
#include "libavoid/connector.h"
-#include "libavoid/polyutil.h"
#include "libavoid/debug.h"
-#include "libavoid/region.h"
-#include "math.h"
-
-//#define ORTHOGONAL_ROUTING
+#include "libavoid/orthogonal.h"
+#include "libavoid/assertions.h"
namespace Avoid {
-static const unsigned int infoAdd = 1;
-static const unsigned int infoDel = 2;
-static const unsigned int infoMov = 3;
+enum ActionType {
+ ShapeMove,
+ ShapeAdd,
+ ShapeRemove,
+ ConnChange
+};
+typedef std::list<std::pair<unsigned int, ConnEnd> > ConnUpdateList;
-class MoveInfo {
+class ActionInfo {
public:
- MoveInfo(ShapeRef *s, Polygn *p, bool fM)
- : shape(s)
- , newPoly(copyPoly(*p))
- , firstMove(fM)
- { }
- ~MoveInfo()
+ ActionInfo(ActionType t, ShapeRef *s, const Polygon& p, bool fM)
+ : type(t),
+ objPtr(s),
+ newPoly(p),
+ firstMove(fM)
+ {
+ COLA_ASSERT(type == ShapeMove);
+ }
+ ActionInfo(ActionType t, ShapeRef *s)
+ : type(t),
+ objPtr(s)
+ {
+ COLA_ASSERT(type != ConnChange);
+ }
+ ActionInfo(ActionType t, ConnRef *c)
+ : type(t),
+ objPtr(c)
+ {
+ COLA_ASSERT(type == ConnChange);
+ }
+ ~ActionInfo()
+ {
+ }
+ ShapeRef *shape(void) const
+ {
+ COLA_ASSERT((type == ShapeMove) || (type == ShapeAdd) ||
+ (type == ShapeRemove));
+ return (static_cast<ShapeRef *> (objPtr));
+ }
+ ConnRef *conn(void) const
+ {
+ COLA_ASSERT(type == ConnChange);
+ return (static_cast<ConnRef *> (objPtr));
+ }
+ bool operator==(const ActionInfo& rhs) const
+ {
+ return (type == rhs.type) && (objPtr == rhs.objPtr);
+ }
+ bool operator<(const ActionInfo& rhs) const
{
- freePoly(newPoly);
+ if (type != rhs.type)
+ {
+ return type < rhs.type;
+ }
+ return objPtr < rhs.objPtr;
}
- ShapeRef *shape;
- Polygn newPoly;
+ ActionType type;
+ void *objPtr;
+ Polygon newPoly;
bool firstMove;
+ ConnUpdateList conns;
};
-
-Router::Router()
- : PartialTime(false)
- , SimpleRouting(false)
- , segmt_penalty(0)
- , angle_penalty(0)
- , crossing_penalty(200)
- // Algorithm options:
- , UseAStarSearch(true)
- , IgnoreRegions(true)
- , SelectiveReroute(true)
- , IncludeEndpoints(true)
- , UseLeesAlgorithm(false)
- , InvisibilityGrph(true)
- , ConsolidateMoves(true)
- , PartialFeedback(false)
- // Instrumentation:
- , st_checked_edges(0)
-#ifdef LINEDEBUG
- , avoid_screen(NULL)
+Router::Router(const unsigned int flags)
+ : visOrthogGraph(true),
+ PartialTime(false),
+ SimpleRouting(false),
+ ClusteredRouting(true),
+ // Poly-line algorithm options:
+ IgnoreRegions(true),
+ UseLeesAlgorithm(true),
+ InvisibilityGrph(true),
+ // General algorithm options:
+ SelectiveReroute(true),
+ PartialFeedback(false),
+ RubberBandRouting(false),
+ // Instrumentation:
+ st_checked_edges(0),
+#ifdef LIBAVOID_SDL
+ avoid_screen(NULL),
#endif
-{ }
+ _largestAssignedId(0),
+ _consolidateActions(true),
+ _orthogonalNudgeDistance(4.0),
+ // Mode options:
+ _polyLineRouting(false),
+ _orthogonalRouting(false),
+ _staticGraphInvalidated(true),
+ _inCrossingPenaltyReroutingStage(false)
+{
+ // At least one of the Routing modes must be set.
+ COLA_ASSERT(flags & (PolyLineRouting | OrthogonalRouting));
+ if (flags & PolyLineRouting)
+ {
+ _polyLineRouting = true;
+ }
+ if (flags & OrthogonalRouting)
+ {
+ _orthogonalRouting = true;
+ }
+ for (size_t p = 0; p < lastPenaltyMarker; ++p)
+ {
+ _routingPenalties[p] = 0.0;
+ }
+ _routingPenalties[clusterCrossingPenalty] = 4000;
+}
-void Router::addShape(ShapeRef *shape)
+Router::~Router()
{
- unsigned int pid = shape->id();
- Polygn poly = shape->poly();
+ // Delete remaining connectors.
+ ConnRefList::iterator conn = connRefs.begin();
+ while (conn != connRefs.end())
+ {
+ db_printf("Deleting connector %u in ~Router()\n", (*conn)->id());
+ delete *conn;
+ conn = connRefs.begin();
+ }
- adjustContainsWithAdd(poly, pid);
-
- // o Check all visibility edges to see if this one shape
- // blocks them.
- newBlockingShape(&poly, pid);
+ // Remove remaining shapes.
+ ShapeRefList::iterator shape = shapeRefs.begin();
+ while (shape != shapeRefs.end())
+ {
+ ShapeRef *shapePtr = *shape;
+ db_printf("Deleting shape %u in ~Router()\n", shapePtr->id());
+ if (shapePtr->isActive())
+ {
+ shapePtr->removeFromGraph();
+ shapePtr->makeInactive();
+ }
+ delete shapePtr;
+ shape = shapeRefs.begin();
+ }
+
+ // Cleanup orphaned orthogonal graph vertices.
+ destroyOrthogonalVisGraph();
+
+ COLA_ASSERT(connRefs.size() == 0);
+ COLA_ASSERT(shapeRefs.size() == 0);
+ COLA_ASSERT(visGraph.size() == 0);
+ COLA_ASSERT(invisGraph.size() == 0);
+}
-#ifdef ORTHOGONAL_ROUTING
- Region::addShape(shape);
-#endif
- // o Calculate visibility for the new vertices.
- if (UseLeesAlgorithm)
+void Router::modifyConnector(ConnRef *conn, const unsigned int type,
+ const ConnEnd& connEnd)
+{
+ ActionInfo modInfo(ConnChange, conn);
+
+ ActionInfoList::iterator found =
+ find(actionList.begin(), actionList.end(), modInfo);
+ if (found == actionList.end())
{
- shapeVisSweep(shape);
+ modInfo.conns.push_back(std::make_pair(type, connEnd));
+ actionList.push_back(modInfo);
}
else
{
- shapeVis(shape);
+ found->conns.push_back(std::make_pair(type, connEnd));
+ }
+
+ if (!_consolidateActions)
+ {
+ processTransaction();
}
- callbackAllInvalidConnectors();
}
-void Router::delShape(ShapeRef *shape)
+void Router::modifyConnector(ConnRef *conn)
{
- unsigned int pid = shape->id();
+ ActionInfo modInfo(ConnChange, conn);
+
+ ActionInfoList::iterator found =
+ find(actionList.begin(), actionList.end(), modInfo);
+ if (found == actionList.end())
+ {
+ actionList.push_back(modInfo);
+ }
- // Delete items that are queued in the movList.
- for (MoveInfoList::iterator it = moveList.begin(); it != moveList.end(); )
+ if (!_consolidateActions)
{
- if ((*it)->shape->id() == pid)
- {
- MoveInfoList::iterator doomed = it;
- ++it;
- moveList.erase(doomed);
- }
- else
- {
- ++it;
- }
+ processTransaction();
}
+}
- // o Remove entries related to this shape's vertices
- shape->removeFromGraph();
-
- if (SelectiveReroute)
+
+void Router::removeQueuedConnectorActions(ConnRef *conn)
+{
+ ActionInfo modInfo(ConnChange, conn);
+
+ ActionInfoList::iterator found =
+ find(actionList.begin(), actionList.end(), modInfo);
+ if (found != actionList.end())
{
- markConnectors(shape);
+ actionList.erase(found);
}
+}
- adjustContainsWithDel(pid);
-
-#ifdef ORTHOGONAL_ROUTING
- Region::removeShape(shape);
-#endif
- delete shape;
+void Router::addShape(ShapeRef *shape)
+{
+ // There shouldn't be remove events or move events for the same shape
+ // already in the action list.
+ // XXX: Possibly we could handle this by ordering them intelligently.
+ COLA_ASSERT(find(actionList.begin(), actionList.end(),
+ ActionInfo(ShapeRemove, shape)) == actionList.end());
+ COLA_ASSERT(find(actionList.begin(), actionList.end(),
+ ActionInfo(ShapeMove, shape)) == actionList.end());
+
+ ActionInfo addInfo(ShapeAdd, shape);
- // o Check all edges that were blocked by this shape.
- if (InvisibilityGrph)
+ ActionInfoList::iterator found =
+ find(actionList.begin(), actionList.end(), addInfo);
+ if (found == actionList.end())
{
- checkAllBlockedEdges(pid);
+ actionList.push_back(addInfo);
}
- else
+
+ if (!_consolidateActions)
{
- // check all edges not in graph
- checkAllMissingEdges();
+ processTransaction();
}
- callbackAllInvalidConnectors();
}
-void Router::moveShape(ShapeRef *shape, Polygn *newPoly, const bool first_move)
+void Router::removeShape(ShapeRef *shape)
{
+ // There shouldn't be add events events for the same shape already
+ // in the action list.
+ // XXX: Possibly we could handle this by ordering them intelligently.
+ COLA_ASSERT(find(actionList.begin(), actionList.end(),
+ ActionInfo(ShapeAdd, shape)) == actionList.end());
+
+ // Delete any ShapeMove entries for this shape in the action list.
+ ActionInfoList::iterator found = find(actionList.begin(),
+ actionList.end(), ActionInfo(ShapeMove, shape));
+ if (found != actionList.end())
+ {
+ actionList.erase(found);
+ }
+
+ // Add the ShapeRemove entry.
+ ActionInfo remInfo(ShapeRemove, shape);
+ found = find(actionList.begin(), actionList.end(), remInfo);
+ if (found == actionList.end())
+ {
+ actionList.push_back(remInfo);
+ }
+
+ if (!_consolidateActions)
+ {
+ processTransaction();
+ }
+}
+
+
+void Router::moveShape(ShapeRef *shape, const double xDiff, const double yDiff)
+{
+ Polygon newPoly = shape->polygon();
+ newPoly.translate(xDiff, yDiff);
+
+ moveShape(shape, newPoly);
+}
+
+
+void Router::moveShape(ShapeRef *shape, const Polygon& newPoly,
+ const bool first_move)
+{
+ // There shouldn't be remove events or add events for the same shape
+ // already in the action list.
+ // XXX: Possibly we could handle this by ordering them intelligently.
+ COLA_ASSERT(find(actionList.begin(), actionList.end(),
+ ActionInfo(ShapeRemove, shape)) == actionList.end());
+
+ if (find(actionList.begin(), actionList.end(),
+ ActionInfo(ShapeAdd, shape)) != actionList.end())
+ {
+ // The Add is enough, no need for the Move action too.
+ return;
+ }
+
+ ActionInfo moveInfo(ShapeMove, shape, newPoly, first_move);
// Sanely cope with the case where the user requests moving the same
// shape multiple times before rerouting connectors.
- bool alreadyThere = false;
- unsigned int id = shape->id();
- MoveInfoList::iterator finish = moveList.end();
- for (MoveInfoList::iterator it = moveList.begin(); it != finish; ++it)
+ ActionInfoList::iterator found =
+ find(actionList.begin(), actionList.end(), moveInfo);
+
+ if (found != actionList.end())
{
- if ((*it)->shape->id() == id)
+ if (!SimpleRouting)
{
- if (!SimpleRouting)
- {
- fprintf(stderr,
- "warning: multiple moves requested for shape %d.\n",
- (int) id);
- }
- // Just update the MoveInfo with the second polygon, but
- // leave the firstMove setting alone.
- (*it)->newPoly = copyPoly(*newPoly);
- alreadyThere = true;
+ db_printf("warning: multiple moves requested for shape %d "
+ "within a single transaction.\n", (int) shape->id());
}
+ // Just update the ActionInfo with the second polygon, but
+ // leave the firstMove setting alone.
+ found->newPoly = newPoly;
+ }
+ else
+ {
+ actionList.push_back(moveInfo);
}
- if (!alreadyThere)
+ if (!_consolidateActions)
{
- MoveInfo *moveInfo = new MoveInfo(shape, newPoly, first_move);
- moveList.push_back(moveInfo);
+ processTransaction();
}
+}
+
+
+void Router::setStaticGraphInvalidated(const bool invalidated)
+{
+ _staticGraphInvalidated = invalidated;
+}
+
+
+void Router::destroyOrthogonalVisGraph(void)
+{
+ // Remove orthogonal visibility graph edges.
+ visOrthogGraph.clear();
- if (!ConsolidateMoves)
+ // Remove the now orphaned vertices.
+ VertInf *curr = vertices.shapesBegin();
+ while (curr)
{
- processMoves();
+ if (curr->orphaned() && (curr->id == dummyOrthogID))
+ {
+ VertInf *following = vertices.removeVertex(curr);
+ delete curr;
+ curr = following;
+ continue;
+ }
+ curr = curr->lstNext;
}
}
-void Router::processMoves(void)
+void Router::regenerateStaticBuiltGraph(void)
{
- // If SimpleRouting, then don't update yet.
- if (moveList.empty() || SimpleRouting)
+ // Here we do talks involved in updating the static-built visibility
+ // graph (if necessary) before we do any routing.
+ if (_staticGraphInvalidated)
{
- return;
+ if (_orthogonalRouting)
+ {
+ destroyOrthogonalVisGraph();
+
+ timers.Register(tmOrthogGraph, timerStart);
+ // Regenerate a new visibility graph.
+ generateStaticOrthogonalVisGraph(this);
+
+ timers.Stop();
+ }
+ _staticGraphInvalidated = false;
}
+}
+
- MoveInfoList::iterator curr;
- MoveInfoList::iterator finish = moveList.end();
- for (curr = moveList.begin(); curr != finish; ++curr)
+bool Router::shapeInQueuedActionList(ShapeRef *shape) const
+{
+ bool foundAdd = find(actionList.begin(), actionList.end(),
+ ActionInfo(ShapeAdd, shape)) != actionList.end();
+ bool foundRem = find(actionList.begin(), actionList.end(),
+ ActionInfo(ShapeRemove, shape)) != actionList.end();
+ bool foundMove = find(actionList.begin(), actionList.end(),
+ ActionInfo(ShapeMove, shape)) != actionList.end();
+
+ return (foundAdd || foundRem || foundMove);
+}
+
+
+bool Router::transactionUse(void) const
+{
+ return _consolidateActions;
+}
+
+
+void Router::setTransactionUse(const bool transactions)
+{
+ _consolidateActions = transactions;
+}
+
+
+bool Router::processTransaction(void)
+{
+ bool notPartialTime = !(PartialFeedback && PartialTime);
+ bool seenShapeMovesOrDeletes = false;
+
+ // If SimpleRouting, then don't update here.
+ if (actionList.empty() || SimpleRouting)
+ {
+ return false;
+ }
+
+ actionList.sort();
+ ActionInfoList::iterator curr;
+ ActionInfoList::iterator finish = actionList.end();
+ for (curr = actionList.begin(); curr != finish; ++curr)
{
- MoveInfo *moveInf = *curr;
- ShapeRef *shape = moveInf->shape;
- Polygn *newPoly = &(moveInf->newPoly);
- bool first_move = moveInf->firstMove;
+ ActionInfo& actInf = *curr;
+ if (!((actInf.type == ShapeRemove) || (actInf.type == ShapeMove)))
+ {
+ // Not a move or remove action, so don't do anything.
+ continue;
+ }
+ seenShapeMovesOrDeletes = true;
+
+ ShapeRef *shape = actInf.shape();
+ bool isMove = (actInf.type == ShapeMove);
+ bool first_move = actInf.firstMove;
unsigned int pid = shape->id();
- bool notPartialTime = !(PartialFeedback && PartialTime);
// o Remove entries related to this shape's vertices
shape->removeFromGraph();
- if (SelectiveReroute && (notPartialTime || first_move))
+ if (SelectiveReroute && (!isMove || notPartialTime || first_move))
{
markConnectors(shape);
}
adjustContainsWithDel(pid);
-#ifdef ORTHOGONAL_ROUTING
- Region::removeShape(shape);
-#endif
-
- shape->setNewPoly(*newPoly);
-
- adjustContainsWithAdd(*newPoly, pid);
-
// Ignore this shape for visibility.
// XXX: We don't really need to do this if we're not using Partial
// Feedback. Without this the blocked edges still route
// around the shape until it leaves the connector.
shape->makeInactive();
-
}
- if (InvisibilityGrph)
+ if (seenShapeMovesOrDeletes && _polyLineRouting)
{
- for (curr = moveList.begin(); curr != finish; ++curr)
+ if (InvisibilityGrph)
{
- MoveInfo *moveInf = *curr;
- ShapeRef *shape = moveInf->shape;
- unsigned int pid = shape->id();
-
- // o Check all edges that were blocked by this shape.
- checkAllBlockedEdges(pid);
+ for (curr = actionList.begin(); curr != finish; ++curr)
+ {
+ ActionInfo& actInf = *curr;
+ if (!((actInf.type == ShapeRemove) ||
+ (actInf.type == ShapeMove)))
+ {
+ // Not a move or remove action, so don't do anything.
+ continue;
+ }
+
+ // o Check all edges that were blocked by this shape.
+ checkAllBlockedEdges(actInf.shape()->id());
+ }
+ }
+ else
+ {
+ // check all edges not in graph
+ checkAllMissingEdges();
}
- }
- else
- {
- // check all edges not in graph
- checkAllMissingEdges();
}
- while ( ! moveList.empty() )
+ for (curr = actionList.begin(); curr != finish; ++curr)
{
- MoveInfo *moveInf = moveList.front();
- ShapeRef *shape = moveInf->shape;
- Polygn *newPoly = &(moveInf->newPoly);
+ ActionInfo& actInf = *curr;
+ if (!((actInf.type == ShapeAdd) || (actInf.type == ShapeMove)))
+ {
+ // Not a move or add action, so don't do anything.
+ continue;
+ }
+
+ ShapeRef *shape = actInf.shape();
+ Polygon& newPoly = actInf.newPoly;
+ bool isMove = (actInf.type == ShapeMove);
unsigned int pid = shape->id();
- bool notPartialTime = !(PartialFeedback && PartialTime);
// Restore this shape for visibility.
shape->makeActive();
+
+ if (isMove)
+ {
+ shape->setNewPoly(newPoly);
+ }
+ const Polygon& shapePoly = shape->polygon();
-#ifdef ORTHOGONAL_ROUTING
- Region::addShape(shape);
-#endif
+ adjustContainsWithAdd(shapePoly, pid);
- // o Check all visibility edges to see if this one shape
- // blocks them.
- if (notPartialTime)
+ if (_polyLineRouting)
{
- newBlockingShape(newPoly, pid);
+ // o Check all visibility edges to see if this one shape
+ // blocks them.
+ if (!isMove || notPartialTime)
+ {
+ newBlockingShape(shapePoly, pid);
+ }
+
+ // o Calculate visibility for the new vertices.
+ if (UseLeesAlgorithm)
+ {
+ shapeVisSweep(shape);
+ }
+ else
+ {
+ shapeVis(shape);
+ }
}
+ }
- // o Calculate visibility for the new vertices.
- if (UseLeesAlgorithm)
+ // Update connector endpoints.
+ for (curr = actionList.begin(); curr != finish; ++curr)
+ {
+ ActionInfo& actInf = *curr;
+ if (actInf.type != ConnChange)
{
- shapeVisSweep(shape);
+ continue;
}
- else
+ for (ConnUpdateList::iterator conn = actInf.conns.begin();
+ conn != actInf.conns.end(); ++conn)
{
- shapeVis(shape);
+ actInf.conn()->updateEndPoint(conn->first, conn->second);
}
-
- moveList.pop_front();
- delete moveInf;
}
- callbackAllInvalidConnectors();
+ // Clear the actionList.
+ actionList.clear();
+
+ _staticGraphInvalidated = true;
+ rerouteAndCallbackConnectors();
+
+ return true;
+}
+
+
+void Router::addCluster(ClusterRef *cluster)
+{
+ cluster->makeActive();
+
+ unsigned int pid = cluster->id();
+ ReferencingPolygon& poly = cluster->polygon();
+
+ adjustClustersWithAdd(poly, pid);
+}
+
+
+void Router::delCluster(ClusterRef *cluster)
+{
+ cluster->makeInactive();
+
+ unsigned int pid = cluster->id();
+
+ adjustClustersWithDel(pid);
+}
+
+
+void Router::setOrthogonalNudgeDistance(const double dist)
+{
+ COLA_ASSERT(dist >= 0);
+ _orthogonalNudgeDistance = dist;
+}
+
+
+double Router::orthogonalNudgeDistance(void) const
+{
+ return _orthogonalNudgeDistance;
+}
+
+
+unsigned int Router::assignId(const unsigned int suggestedId)
+{
+ // If the suggestedId is zero, then we assign the object the next
+ // smallest unassigned ID, otherwise we trust the ID given is unique.
+ unsigned int assignedId = (suggestedId == 0) ?
+ (_largestAssignedId + 1) : suggestedId;
+
+ // Have the router record if this ID is larger than the _largestAssignedId.
+ _largestAssignedId = std::max(_largestAssignedId, assignedId);
+
+ // If assertions are enabled, then we check that this ID really is unique.
+ COLA_ASSERT(idIsUnique(assignedId));
+
+ return assignedId;
+}
+
+
+ // Returns whether the given ID is unique among all objects known by the
+ // router. Outputs a warning if the ID is found ore than once.
+ // It is expected this is only going to be called from assertions while
+ // debugging, so efficiency is not an issue and we just iterate over all
+ // objects.
+bool Router::idIsUnique(const unsigned int id) const
+{
+ unsigned int count = 0;
+
+ // Examine shapes.
+ for (ShapeRefList::const_iterator i = shapeRefs.begin();
+ i != shapeRefs.end(); ++i)
+ {
+ if ((*i)->id() == id)
+ {
+ count++;
+ }
+ }
+
+ // Examine connectors.
+ for (ConnRefList::const_iterator i = connRefs.begin();
+ i != connRefs.end(); ++i)
+ {
+ if ((*i)->id() == id)
+ {
+ count++;
+ }
+ }
+
+ // Examine clusters.
+ for (ClusterRefList::const_iterator i = clusterRefs.begin();
+ i != clusterRefs.end(); ++i)
+ {
+ if ((*i)->id() == id)
+ {
+ count++;
+ }
+ }
+
+ if (count > 1)
+ {
+ db_printf("Warning:\tlibavoid object ID %d not unique.\n", id);
+ return false;
+ }
+ return true;
}
void Router::attachedConns(IntList &conns, const unsigned int shapeId,
const unsigned int type)
{
- ConnRefList::iterator fin = connRefs.end();
- for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) {
-
- if ((type & runningTo) && ((*i)->_dstId == shapeId)) {
+ ConnRefList::const_iterator fin = connRefs.end();
+ for (ConnRefList::const_iterator i = connRefs.begin(); i != fin; ++i)
+ {
+ if ((type & runningTo) && ((*i)->_dstId == shapeId))
+ {
conns.push_back((*i)->_id);
}
- else if ((type & runningFrom) && ((*i)->_srcId == shapeId)) {
+ else if ((type & runningFrom) && ((*i)->_srcId == shapeId))
+ {
conns.push_back((*i)->_id);
}
}
void Router::attachedShapes(IntList &shapes, const unsigned int shapeId,
const unsigned int type)
{
- ConnRefList::iterator fin = connRefs.end();
- for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) {
- if ((type & runningTo) && ((*i)->_dstId == shapeId)) {
+ ConnRefList::const_iterator fin = connRefs.end();
+ for (ConnRefList::const_iterator i = connRefs.begin(); i != fin; ++i)
+ {
+ if ((type & runningTo) && ((*i)->_dstId == shapeId))
+ {
if ((*i)->_srcId != 0)
{
// Only if there is a shape attached to the other end.
shapes.push_back((*i)->_srcId);
}
}
- else if ((type & runningFrom) && ((*i)->_srcId == shapeId)) {
+ else if ((type & runningFrom) && ((*i)->_srcId == shapeId))
+ {
if ((*i)->_dstId != 0)
{
// Only if there is a shape attached to the other end.
}
- // It's intended this function is called after shape movement has
- // happened to alert connectors that they need to be rerouted.
-void Router::callbackAllInvalidConnectors(void)
+ // It's intended this function is called after visibility changes
+ // resulting from shape movement have happened. It will alert
+ // rerouted connectors (via a callback) that they need to be redrawn.
+void Router::rerouteAndCallbackConnectors(void)
+{
+ std::set<ConnRef *> reroutedConns;
+ ConnRefList::const_iterator fin = connRefs.end();
+
+ // Updating the orthogonal visibility graph if necessary.
+ regenerateStaticBuiltGraph();
+
+ timers.Register(tmOrthogRoute, timerStart);
+ for (ConnRefList::const_iterator i = connRefs.begin(); i != fin; ++i)
+ {
+ (*i)->_needs_repaint = false;
+ bool rerouted = (*i)->generatePath();
+ if (rerouted)
+ {
+ reroutedConns.insert(*i);
+ }
+ }
+ timers.Stop();
+
+ // Find and reroute crossing connectors if crossing penalties are set.
+ improveCrossings();
+
+ // Perform centring and nudging for othogonal routes.
+ improveOrthogonalRoutes(this);
+
+ // Alert connectors that they need redrawing.
+ for (ConnRefList::const_iterator i = connRefs.begin(); i != fin; ++i)
+ {
+ (*i)->_needs_repaint = true;
+ (*i)->performCallback();
+ }
+}
+
+
+typedef std::set<ConnRef *> ConnRefSet;
+
+void Router::improveCrossings(void)
{
+ const double crossing_penalty = routingPenalty(crossingPenalty);
+ const double shared_path_penalty = routingPenalty(fixedSharedPathPenalty);
+ if ((crossing_penalty == 0) && (shared_path_penalty == 0))
+ {
+ // No penalties, return.
+ return;
+ }
+
+ // Find crossings and reroute connectors.
+ _inCrossingPenaltyReroutingStage = true;
+ ConnRefSet crossingConns;
ConnRefList::iterator fin = connRefs.end();
- for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) {
- (*i)->handleInvalid();
+ for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i)
+ {
+ Avoid::Polygon& iRoute = (*i)->routeRef();
+ ConnRefList::iterator j = i;
+ for (++j; j != fin; ++j)
+ {
+ if ((crossingConns.find(*i) != crossingConns.end()) &&
+ (crossingConns.find(*j) != crossingConns.end()))
+ {
+ // We already know both these have crossings.
+ continue;
+ }
+ // Determine if this pair cross.
+ Avoid::Polygon& jRoute = (*j)->routeRef();
+ CrossingsInfoPair crossingInfo = std::make_pair(0, 0);
+ bool meetsPenaltyCriteria = false;
+ for (size_t jInd = 1; jInd < jRoute.size(); ++jInd)
+ {
+ const bool finalSegment = ((jInd + 1) == jRoute.size());
+ CrossingsInfoPair crossingInfo = countRealCrossings(
+ iRoute, true, jRoute, jInd, false,
+ finalSegment, NULL, NULL, *i, *j);
+
+ if ((shared_path_penalty > 0) &&
+ (crossingInfo.second & CROSSING_SHARES_PATH) &&
+ (crossingInfo.second & CROSSING_SHARES_FIXED_SEGMENT) &&
+ !(crossingInfo.second & CROSSING_SHARES_PATH_AT_END))
+ {
+ // We are penalising fixedSharedPaths and there is a
+ // fixedSharedPath.
+ meetsPenaltyCriteria = true;
+ break;
+ }
+ else if ((crossing_penalty > 0) && (crossingInfo.first > 0))
+ {
+ // We are penalising crossings and this is a crossing.
+ meetsPenaltyCriteria = true;
+ break;
+ }
+ }
+ if (meetsPenaltyCriteria)
+ {
+ crossingConns.insert(*i);
+ crossingConns.insert(*j);
+ }
+ }
+ }
+
+ for (ConnRefSet::iterator i = crossingConns.begin();
+ i != crossingConns.end(); ++i)
+ {
+ ConnRef *conn = *i;
+ conn->makePathInvalid();
+ // XXX: Could we free these routes here for extra savings?
+ // conn->freeRoutes();
+ }
+ for (ConnRefSet::iterator i = crossingConns.begin();
+ i != crossingConns.end(); ++i)
+ {
+ ConnRef *conn = *i;
+ conn->generatePath();
}
+ _inCrossingPenaltyReroutingStage = false;
}
-void Router::newBlockingShape(Polygn *poly, int pid)
+void Router::newBlockingShape(const Polygon& poly, int pid)
{
// o Check all visibility edges to see if this one shape
// blocks them.
Point e2 = points.second;
bool blocked = false;
- bool ep_in_poly1 = !(eID1.isShape) ? inPoly(*poly, e1) : false;
- bool ep_in_poly2 = !(eID2.isShape) ? inPoly(*poly, e2) : false;
+ bool countBorder = false;
+ bool ep_in_poly1 = !(eID1.isShape) ?
+ inPoly(poly, e1, countBorder) : false;
+ bool ep_in_poly2 = !(eID2.isShape) ?
+ inPoly(poly, e2, countBorder) : false;
if (ep_in_poly1 || ep_in_poly2)
{
// Don't check edges that have a connector endpoint
continue;
}
- for (int pt_i = 0; pt_i < poly->pn; pt_i++)
+ bool seenIntersectionAtEndpoint = false;
+ for (size_t pt_i = 0; pt_i < poly.size(); ++pt_i)
{
- int pt_n = (pt_i == (poly->pn - 1)) ? 0 : pt_i + 1;
- if (segmentIntersect(e1, e2, poly->ps[pt_i], poly->ps[pt_n]))
+ size_t pt_n = (pt_i == (poly.size() - 1)) ? 0 : pt_i + 1;
+ const Point& pi = poly.ps[pt_i];
+ const Point& pn = poly.ps[pt_n];
+ if (segmentShapeIntersect(e1, e2, pi, pn,
+ seenIntersectionAtEndpoint))
{
blocked = true;
break;
void Router::checkAllBlockedEdges(int pid)
{
- assert(InvisibilityGrph);
+ COLA_ASSERT(InvisibilityGrph);
for (EdgeInf *iter = invisGraph.begin(); iter != invisGraph.end() ; )
{
void Router::checkAllMissingEdges(void)
{
- assert(!InvisibilityGrph);
+ COLA_ASSERT(!InvisibilityGrph);
- VertInf *first = NULL;
-
- if (IncludeEndpoints)
- {
- first = vertices.connsBegin();
- }
- else
- {
- first = vertices.shapesBegin();
- }
+ VertInf *first = vertices.connsBegin();
VertInf *pend = vertices.end();
for (VertInf *i = first; i != pend; i = i->lstNext)
void Router::generateContains(VertInf *pt)
{
contains[pt->id].clear();
+ enclosingClusters[pt->id].clear();
- ShapeRefList::iterator finish = shapeRefs.end();
- for (ShapeRefList::iterator i = shapeRefs.begin(); i != finish; ++i)
+ // Don't count points on the border as being inside.
+ bool countBorder = false;
+
+ // Compute enclosing shapes.
+ ShapeRefList::const_iterator finish = shapeRefs.end();
+ for (ShapeRefList::const_iterator i = shapeRefs.begin(); i != finish; ++i)
{
- Polygn poly = copyPoly(*i);
- if (inPoly(poly, pt->point))
+ if (inPoly((*i)->polygon(), pt->point, countBorder))
{
contains[pt->id].insert((*i)->id());
}
- freePoly(poly);
+ }
+
+ // Computer enclosing Clusters
+ ClusterRefList::const_iterator clFinish = clusterRefs.end();
+ for (ClusterRefList::const_iterator i = clusterRefs.begin();
+ i != clFinish; ++i)
+ {
+ if (inPolyGen((*i)->polygon(), pt->point))
+ {
+ enclosingClusters[pt->id].insert((*i)->id());
+ }
}
}
-void Router::adjustContainsWithAdd(const Polygn& poly, const int p_shape)
+void Router::adjustClustersWithAdd(const PolygonInterface& poly,
+ const int p_cluster)
{
for (VertInf *k = vertices.connsBegin(); k != vertices.shapesBegin();
k = k->lstNext)
{
- if (inPoly(poly, k->point))
+ if (inPolyGen(poly, k->point))
{
- contains[k->id].insert(p_shape);
+ enclosingClusters[k->id].insert(p_cluster);
}
}
}
-void Router::adjustContainsWithDel(const int p_shape)
+void Router::adjustClustersWithDel(const int p_cluster)
+{
+ for (ContainsMap::iterator k = enclosingClusters.begin();
+ k != enclosingClusters.end(); ++k)
+ {
+ (*k).second.erase(p_cluster);
+ }
+}
+
+
+void Router::adjustContainsWithAdd(const Polygon& poly, const int p_shape)
{
+ // Don't count points on the border as being inside.
+ bool countBorder = false;
+
for (VertInf *k = vertices.connsBegin(); k != vertices.shapesBegin();
k = k->lstNext)
{
- contains[k->id].erase(p_shape);
+ if (inPoly(poly, k->point, countBorder))
+ {
+ contains[k->id].insert(p_shape);
+ }
+ }
+}
+
+
+void Router::adjustContainsWithDel(const int p_shape)
+{
+ for (ContainsMap::iterator k = contains.begin(); k != contains.end(); ++k)
+ {
+ (*k).second.erase(p_shape);
}
}
void Router::markConnectors(ShapeRef *shape)
{
- assert(SelectiveReroute);
+ if (RubberBandRouting)
+ {
+ // When rubber-band routing, we do no reroute connectors that
+ // may have a better route, only invalid connectors.
+ return;
+ }
+
+ COLA_ASSERT(SelectiveReroute);
- ConnRefList::iterator end = connRefs.end();
- for (ConnRefList::iterator it = connRefs.begin(); it != end; ++it)
+ ConnRefList::const_iterator end = connRefs.end();
+ for (ConnRefList::const_iterator it = connRefs.begin(); it != end; ++it)
{
ConnRef *conn = (*it);
- if (conn->_route.pn == 0)
+ if (conn->_route.empty())
{
// Ignore uninitialised connectors.
continue;
}
Point start = conn->_route.ps[0];
- Point end = conn->_route.ps[conn->_route.pn - 1];
+ Point end = conn->_route.ps[conn->_route.size() - 1];
double conndist = conn->_route_dist;
Point n_p2(p2.x - p1.x, p2.y - p1.y);
Point n_start(start.x - p1.x, start.y - p1.y);
Point n_end(end.x - p1.x, end.y - p1.y);
- //printf("n_p2: (%.1f, %.1f)\n", n_p2.x, n_p2.y);
- //printf("n_start: (%.1f, %.1f)\n", n_start.x, n_start.y);
- //printf("n_end: (%.1f, %.1f)\n", n_end.x, n_end.y);
+ //db_printf("n_p2: (%.1f, %.1f)\n", n_p2.x, n_p2.y);
+ //db_printf("n_start: (%.1f, %.1f)\n", n_start.x, n_start.y);
+ //db_printf("n_end: (%.1f, %.1f)\n", n_end.x, n_end.y);
double theta = 0 - atan2(n_p2.y, n_p2.x);
- //printf("theta = %.2f\n", theta * (180 / PI));
+ //db_printf("theta = %.2f\n", theta * (180 / PI));
Point r_p1(0, 0);
Point r_p2 = n_p2;
start.y = cosv * n_start.y + sinv * n_start.x;
end.x = cosv * n_end.x - sinv * n_end.y;
end.y = cosv * n_end.y + sinv * n_end.x;
- //printf("r_p2: (%.1f, %.1f)\n", r_p2.x, r_p2.y);
- //printf("r_start: (%.1f, %.1f)\n", start.x, start.y);
- //printf("r_end: (%.1f, %.1f)\n", end.x, end.y);
+ //db_printf("r_p2: (%.1f, %.1f)\n", r_p2.x, r_p2.y);
+ //db_printf("r_start: (%.1f, %.1f)\n", start.x, start.y);
+ //db_printf("r_end: (%.1f, %.1f)\n", end.x, end.y);
- if (((int) r_p2.y) != 0)
+ // This might be slightly off.
+ if (fabs(r_p2.y) > 0.0001)
{
- printf("r_p2.y: %f != 0\n", r_p2.y);
- std::abort();
+ db_printf("r_p2.y: %f != 0\n", r_p2.y);
}
- // This might be slightly off.
r_p2.y = 0;
offy = r_p1.y;
x = ((b*c) + (a*d)) / (b + d);
}
- //printf("%.1f, %.1f, %.1f, %.1f\n", a, b, c, d);
- //printf("x = %.1f\n", x);
+ //db_printf("%.1f, %.1f, %.1f, %.1f\n", a, b, c, d);
+ //db_printf("x = %.1f\n", x);
x = std::max(min, x);
x = std::min(max, x);
- //printf("x = %.1f\n", x);
+ //db_printf("x = %.1f\n", x);
Point xp;
if (p1.x == p2.x)
xp.x = x;
xp.y = offy;
}
- //printf("(%.1f, %.1f)\n", xp.x, xp.y);
+ //db_printf("(%.1f, %.1f)\n", xp.x, xp.y);
- e1 = dist(start, xp);
- e2 = dist(xp, end);
+ e1 = euclideanDist(start, xp);
+ e2 = euclideanDist(xp, end);
estdist = e1 + e2;
- //printf("is %.1f < %.1f\n", estdist, conndist);
+ //db_printf("is %.1f < %.1f\n", estdist, conndist);
if (estdist < conndist)
{
#ifdef SELECTIVE_DEBUG
//double angle = AngleAFromThreeSides(dist(start, end),
// e1, e2);
- printf("[%3d] - Possible better path found (%.1f < %.1f)\n",
+ db_printf("[%3d] - Possible better path found (%.1f < %.1f)\n",
conn->_id, estdist, conndist);
#endif
conn->_needs_reroute_flag = true;
}
+ConnType Router::validConnType(const ConnType select) const
+{
+ if (select != ConnType_None)
+ {
+ if ((select == ConnType_Orthogonal) && _orthogonalRouting)
+ {
+ return ConnType_Orthogonal;
+ }
+ else if ((select == ConnType_PolyLine) && _polyLineRouting)
+ {
+ return ConnType_PolyLine;
+ }
+ }
+
+ if (_polyLineRouting)
+ {
+ return ConnType_PolyLine;
+ }
+ else if (_orthogonalRouting)
+ {
+ return ConnType_Orthogonal;
+ }
+ return ConnType_None;
+}
+
+
+void Router::setRoutingPenalty(const PenaltyType penType, const double penVal)
+{
+ COLA_ASSERT(penType < lastPenaltyMarker);
+ if (penVal < 0)
+ {
+ // Set some sensible penalty.
+ switch (penType)
+ {
+ case segmentPenalty:
+ _routingPenalties[penType] = 50;
+ break;
+ case fixedSharedPathPenalty:
+ _routingPenalties[penType] = 110;
+ break;
+ case anglePenalty:
+ _routingPenalties[penType] = 50;
+ break;
+ case crossingPenalty:
+ _routingPenalties[penType] = 200;
+ break;
+ case clusterCrossingPenalty:
+ _routingPenalties[penType] = 4000;
+ break;
+ default:
+ _routingPenalties[penType] = 50;
+ break;
+ }
+ }
+ else
+ {
+ _routingPenalties[penType] = penVal;
+ }
+}
+
+
+double Router::routingPenalty(const PenaltyType penType) const
+{
+ COLA_ASSERT(penType < lastPenaltyMarker);
+ return _routingPenalties[penType];
+}
+
+
+double& Router::penaltyRef(const PenaltyType penType)
+{
+ COLA_ASSERT(penType < lastPenaltyMarker);
+ return _routingPenalties[penType];
+}
+
+
void Router::printInfo(void)
{
FILE *fp = stdout;
int st_endpoints = 0;
int st_valid_shape_visedges = 0;
int st_valid_endpt_visedges = 0;
+ int st_orthogonal_visedges = 0;
int st_invalid_visedges = 0;
VertInf *finish = vertices.end();
for (VertInf *t = vertices.connsBegin(); t != finish; t = t->lstNext)
{
st_invalid_visedges++;
}
+ for (EdgeInf *t = visOrthogGraph.begin(); t != visOrthogGraph.end();
+ t = t->lstNext)
+ {
+ st_orthogonal_visedges++;
+ }
fprintf(fp, "Number of shapes: %d\n", st_shapes);
fprintf(fp, "Number of vertices: %d (%d real, %d endpoints)\n",
st_vertices + st_endpoints, st_vertices, st_endpoints);
+ fprintf(fp, "Number of orhtog_vis_edges: %d\n", st_orthogonal_visedges);
fprintf(fp, "Number of vis_edges: %d (%d valid [%d normal, %d endpt], "
"%d invalid)\n", st_valid_shape_visedges + st_invalid_visedges +
st_valid_endpt_visedges, st_valid_shape_visedges +
fprintf(fp, "checkVisEdge tally: %d\n", st_checked_edges);
fprintf(fp, "----------------------\n");
- fprintf(fp, "ADDS: "); timers.Print(tmAdd);
- fprintf(fp, "DELS: "); timers.Print(tmDel);
- fprintf(fp, "MOVS: "); timers.Print(tmMov);
- fprintf(fp, "***S: "); timers.Print(tmSev);
- fprintf(fp, "PTHS: "); timers.Print(tmPth);
+ fprintf(fp, "ADDS: "); timers.Print(tmAdd, fp);
+ fprintf(fp, "DELS: "); timers.Print(tmDel, fp);
+ fprintf(fp, "MOVS: "); timers.Print(tmMov, fp);
+ fprintf(fp, "***S: "); timers.Print(tmSev, fp);
+ fprintf(fp, "PTHS: "); timers.Print(tmPth, fp);
+ fprintf(fp, "OrthogGraph: "); timers.Print(tmOrthogGraph, fp);
+ fprintf(fp, "OrthogRoute: "); timers.Print(tmOrthogRoute, fp);
+ fprintf(fp, "OrthogCentre: "); timers.Print(tmOrthogCentre, fp);
+ fprintf(fp, "OrthogNudge: "); timers.Print(tmOrthogNudge, fp);
fprintf(fp, "\n");
+ timers.Reset();
+}
+
+
+static const double LIMIT = 100000000;
+
+static void reduceRange(double& val)
+{
+ val = std::min(val, LIMIT);
+ val = std::max(val, -LIMIT);
+}
+
+
+//=============================================================================
+// The following methods are for testing and debugging.
+
+
+bool Router::existsOrthogonalPathOverlap(void)
+{
+ ConnRefList::iterator fin = connRefs.end();
+ for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i)
+ {
+ Avoid::Polygon iRoute = (*i)->displayRoute();
+ ConnRefList::iterator j = i;
+ for (++j; j != fin; ++j)
+ {
+ // Determine if this pair overlap
+ Avoid::Polygon jRoute = (*j)->displayRoute();
+ CrossingsInfoPair crossingInfo = std::make_pair(0, 0);
+ for (size_t jInd = 1; jInd < jRoute.size(); ++jInd)
+ {
+ const bool finalSegment = ((jInd + 1) == jRoute.size());
+ CrossingsInfoPair crossingInfo = countRealCrossings(
+ iRoute, true, jRoute, jInd, true,
+ finalSegment, NULL, NULL, *i, *j);
+
+ if ((crossingInfo.second & CROSSING_SHARES_PATH) &&
+ (crossingInfo.second & CROSSING_SHARES_FIXED_SEGMENT) &&
+ !(crossingInfo.second & CROSSING_SHARES_PATH_AT_END))
+ {
+ // We looking for fixedSharedPaths and there is a
+ // fixedSharedPath.
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+
+bool Router::existsOrthogonalTouchingCorners(void)
+{
+ ConnRefList::iterator fin = connRefs.end();
+ for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i)
+ {
+ Avoid::Polygon iRoute = (*i)->displayRoute();
+ ConnRefList::iterator j = i;
+ for (++j; j != fin; ++j)
+ {
+ // Determine if this pair overlap
+ Avoid::Polygon jRoute = (*j)->displayRoute();
+ CrossingsInfoPair crossingInfo = std::make_pair(0, 0);
+ for (size_t jInd = 1; jInd < jRoute.size(); ++jInd)
+ {
+ const bool finalSegment = ((jInd + 1) == jRoute.size());
+ CrossingsInfoPair crossingInfo = countRealCrossings(
+ iRoute, true, jRoute, jInd, true,
+ finalSegment, NULL, NULL, *i, *j);
+
+ if (crossingInfo.second & CROSSING_TOUCHES)
+ {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+
+void Router::outputInstanceToSVG(std::string instanceName)
+{
+ std::string filename;
+ if (!instanceName.empty())
+ {
+ filename = instanceName;
+ }
+ else
+ {
+ filename = "libavoid-debug";
+ }
+ filename += ".svg";
+ FILE *fp = fopen(filename.c_str(), "w");
+
+ if (fp == NULL)
+ {
+ return;
+ }
+
+ double minX = LIMIT;
+ double minY = LIMIT;
+ double maxX = -LIMIT;
+ double maxY = -LIMIT;
+
+ VertInf *curr = vertices.connsBegin();
+ while (curr)
+ {
+ Point p = curr->point;
+
+ reduceRange(p.x);
+ reduceRange(p.y);
+
+ if (p.x > -LIMIT)
+ {
+ minX = std::min(minX, p.x);
+ }
+ if (p.x < LIMIT)
+ {
+ maxX = std::max(maxX, p.x);
+ }
+ if (p.y > -LIMIT)
+ {
+ minY = std::min(minY, p.y);
+ }
+ if (p.y < LIMIT)
+ {
+ maxY = std::max(maxY, p.y);
+ }
+ curr = curr->lstNext;
+ }
+ minX -= 50;
+ minY -= 50;
+ maxX += 50;
+ maxY += 50;
+
+ fprintf(fp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+ fprintf(fp, "<svg xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" xmlns=\"http://www.w3.org/2000/svg\" width=\"100%%\" height=\"100%%\" viewBox=\"%g %g %g %g\">\n", minX, minY, maxX - minX, maxY - minY);
+
+ // Output source code to generate this instance of the router.
+ fprintf(fp, "<!-- Source code to generate this instance:\n");
+ fprintf(fp, "#include \"libavoid/libavoid.h\"\n");
+ fprintf(fp, "using namespace Avoid;\n");
+ fprintf(fp, "int main(void) {\n");
+ fprintf(fp, " Router *router = new Router(\n");
+ fprintf(fp, " PolyLineRouting | OrthogonalRouting);\n");
+ for (size_t p = 0; p < lastPenaltyMarker; ++p)
+ {
+ fprintf(fp, " router->setRoutingPenalty((PenaltyType)%lu, %g);\n",
+ p, _routingPenalties[p]);
+ }
+ fprintf(fp, " router->setOrthogonalNudgeDistance(%g);\n\n",
+ orthogonalNudgeDistance());
+ ShapeRefList::iterator shRefIt = shapeRefs.begin();
+ while (shRefIt != shapeRefs.end())
+ {
+ ShapeRef *shRef = *shRefIt;
+ fprintf(fp, " Polygon poly%u(%lu);\n",
+ shRef->id(), shRef->polygon().size());
+ for (size_t i = 0; i < shRef->polygon().size(); ++i)
+ {
+ fprintf(fp, " poly%u.ps[%lu] = Point(%g, %g);\n",
+ shRef->id(), i, shRef->polygon().at(i).x,
+ shRef->polygon().at(i).y);
+ }
+ fprintf(fp, " ShapeRef *shapeRef%u = new ShapeRef(router, poly%u, "
+ "%u);\n", shRef->id(), shRef->id(), shRef->id());
+ fprintf(fp, " router->addShape(shapeRef%u);\n\n", shRef->id());
+ ++shRefIt;
+ }
+ ConnRefList::reverse_iterator revConnRefIt = connRefs.rbegin();
+ while (revConnRefIt != connRefs.rend())
+ {
+ ConnRef *connRef = *revConnRefIt;
+ fprintf(fp, " ConnRef *connRef%u = new ConnRef(router, %u);\n",
+ connRef->id(), connRef->id());
+ if (connRef->src())
+ {
+ fprintf(fp, " ConnEnd srcPt%u(Point(%g, %g), %u);\n",
+ connRef->id(), connRef->src()->point.x,
+ connRef->src()->point.y, connRef->src()->visDirections);
+ fprintf(fp, " connRef%u->setSourceEndpoint(srcPt%u);\n",
+ connRef->id(), connRef->id());
+ }
+ if (connRef->dst())
+ {
+ fprintf(fp, " ConnEnd dstPt%u(Point(%g, %g), %u);\n",
+ connRef->id(), connRef->dst()->point.x,
+ connRef->dst()->point.y, connRef->dst()->visDirections);
+ fprintf(fp, " connRef%u->setDestEndpoint(dstPt%u);\n",
+ connRef->id(), connRef->id());
+ }
+ fprintf(fp, " connRef%u->setRoutingType((ConnType)%u);\n\n",
+ connRef->id(), connRef->routingType());
+ ++revConnRefIt;
+ }
+ fprintf(fp, " router->processTransaction();\n");
+ fprintf(fp, " router->outputInstanceToSVG();\n");
+ fprintf(fp, " delete router;\n");
+ fprintf(fp, " return 0;\n");
+ fprintf(fp, "};\n");
+ fprintf(fp, "-->\n");
+
+
+ fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+ "inkscape:label=\"ShapesPoly\">\n");
+ shRefIt = shapeRefs.begin();
+ while (shRefIt != shapeRefs.end())
+ {
+ ShapeRef *shRef = *shRefIt;
+
+ fprintf(fp, "<path id=\"poly-%u\" style=\"stroke-width: 1px; "
+ "stroke: black; fill: blue; fill-opacity: 0.3;\" d=\"",
+ shRef->id());
+ for (size_t i = 0; i < shRef->polygon().size(); ++i)
+ {
+ fprintf(fp, "%c %g,%g ", ((i == 0) ? 'M' : 'L'),
+ shRef->polygon().at(i).x, shRef->polygon().at(i).y);
+ }
+ fprintf(fp, "Z\" />\n");
+ ++shRefIt;
+ }
+ fprintf(fp, "</g>\n");
+
+ fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+ "style=\"display: none;\" "
+ "inkscape:label=\"ShapesRect\">\n");
+ shRefIt = shapeRefs.begin();
+ while (shRefIt != shapeRefs.end())
+ {
+ ShapeRef *shRef = *shRefIt;
+ double minX, minY, maxX, maxY;
+ shRef->polygon().getBoundingRect(&minX, &minY, &maxX, &maxY);
+
+ fprintf(fp, "<rect id=\"rect-%u\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\" "
+ "style=\"stroke-width: 1px; stroke: black; fill: blue; fill-opacity: 0.3;\" />\n",
+ shRef->id(), minX, minY, maxX - minX, maxY - minY);
+ ++shRefIt;
+ }
+ fprintf(fp, "</g>\n");
+
+
+ fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+ "inkscape:label=\"VisGraph\""
+ ">\n");
+ EdgeInf *finish = NULL;
+ fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+ "style=\"display: none;\" "
+ "inkscape:label=\"VisGraph-shape\""
+ ">\n");
+ finish = visGraph.end();
+ for (EdgeInf *t = visGraph.begin(); t != finish; t = t->lstNext)
+ {
+ std::pair<VertID, VertID> ids = t->ids();
+ bool isShape = (ids.first.isShape) && (ids.second.isShape);
+ if (!isShape)
+ {
+ continue;
+ }
+ std::pair<Point, Point> ptpair = t->points();
+ Point p1 = ptpair.first;
+ Point p2 = ptpair.second;
+
+ reduceRange(p1.x);
+ reduceRange(p1.y);
+ reduceRange(p2.x);
+ reduceRange(p2.y);
+
+ fprintf(fp, "<path d=\"M %g,%g L %g,%g\" "
+ "style=\"fill: none; stroke: %s; stroke-width: 1px;\" />\n",
+ p1.x, p1.y, p2.x, p2.y,
+ (!(ids.first.isShape) || !(ids.second.isShape)) ? "green" :
+ "red");
+ }
+ fprintf(fp, "</g>\n");
+
+ fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+ "style=\"display: none;\" "
+ "inkscape:label=\"VisGraph-conn\""
+ ">\n");
+ finish = visGraph.end();
+ for (EdgeInf *t = visGraph.begin(); t != finish; t = t->lstNext)
+ {
+ std::pair<VertID, VertID> ids = t->ids();
+ bool isShape = (ids.first.isShape) && (ids.second.isShape);
+ if (isShape)
+ {
+ continue;
+ }
+ std::pair<Point, Point> ptpair = t->points();
+ Point p1 = ptpair.first;
+ Point p2 = ptpair.second;
+
+ reduceRange(p1.x);
+ reduceRange(p1.y);
+ reduceRange(p2.x);
+ reduceRange(p2.y);
+
+ fprintf(fp, "<path d=\"M %g,%g L %g,%g\" "
+ "style=\"fill: none; stroke: %s; stroke-width: 1px;\" />\n",
+ p1.x, p1.y, p2.x, p2.y,
+ (!(ids.first.isShape) || !(ids.second.isShape)) ? "green" :
+ "red");
+ }
+ fprintf(fp, "</g>\n");
+ fprintf(fp, "</g>\n");
+
+ fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+ "style=\"display: none;\" "
+ "inkscape:label=\"OrthogVisGraph\">\n");
+ finish = visOrthogGraph.end();
+ for (EdgeInf *t = visOrthogGraph.begin(); t != finish; t = t->lstNext)
+ {
+ std::pair<Point, Point> ptpair = t->points();
+ Point p1 = ptpair.first;
+ Point p2 = ptpair.second;
+
+ reduceRange(p1.x);
+ reduceRange(p1.y);
+ reduceRange(p2.x);
+ reduceRange(p2.y);
+
+ std::pair<VertID, VertID> ids = t->ids();
+
+ fprintf(fp, "<path d=\"M %g,%g L %g,%g\" "
+ "style=\"fill: none; stroke: %s; stroke-width: 1px;\" />\n",
+ p1.x, p1.y, p2.x, p2.y,
+ (!(ids.first.isShape) || !(ids.second.isShape)) ? "green" :
+ "red");
+ }
+ fprintf(fp, "</g>\n");
+
+ fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+ "style=\"display: none;\" "
+ "inkscape:label=\"RawConnectors\""
+ ">\n");
+ ConnRefList::iterator connRefIt = connRefs.begin();
+ while (connRefIt != connRefs.end())
+ {
+ ConnRef *connRef = *connRefIt;
+
+ PolyLine route = connRef->route();
+ if (!route.empty())
+ {
+ fprintf(fp, "<path id=\"raw-%u\" d=\"M %g,%g ", connRef->id(),
+ route.ps[0].x, route.ps[0].y);
+ for (size_t i = 1; i < route.size(); ++i)
+ {
+ fprintf(fp, "L %g,%g ", route.ps[i].x, route.ps[i].y);
+ }
+ fprintf(fp, "\" ");
+ if (connRef->src() && connRef->dst())
+ {
+ fprintf(fp, "debug=\"src: %d dst: %d\" ",
+ connRef->src()->visDirections,
+ connRef->dst()->visDirections);
+ }
+ fprintf(fp, "style=\"fill: none; stroke: black; "
+ "stroke-width: 1px;\" />\n");
+ }
+
+ ++connRefIt;
+ }
+ fprintf(fp, "</g>\n");
+
+ fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+ "style=\"display: none;\" "
+ "inkscape:label=\"CurvedDisplayConnectors\""
+ ">\n");
+ connRefIt = connRefs.begin();
+ while (connRefIt != connRefs.end())
+ {
+ ConnRef *connRef = *connRefIt;
+
+ PolyLine route = connRef->displayRoute().curvedPolyline(8);
+ if (!route.empty())
+ {
+ fprintf(fp, "<path id=\"curved-%u\" d=\"M %g,%g ", connRef->id(),
+ route.ps[0].x, route.ps[0].y);
+ for (size_t i = 1; i < route.size(); ++i)
+ {
+ if (route.ts[i] == 'C')
+ {
+ fprintf(fp, "%c %g,%g %g,%g %g,%g", route.ts[i],
+ route.ps[i].x, route.ps[i].y,
+ route.ps[i+1].x, route.ps[i+1].y,
+ route.ps[i+2].x, route.ps[i+2].y);
+ i += 2;
+ }
+ else
+ {
+ fprintf(fp, "%c %g,%g ", route.ts[i],
+ route.ps[i].x, route.ps[i].y);
+ }
+ }
+ fprintf(fp, "\" ");
+ if (connRef->src() && connRef->dst())
+ {
+ fprintf(fp, "debug=\"src: %d dst: %d\" ",
+ connRef->src()->visDirections,
+ connRef->dst()->visDirections);
+ }
+ fprintf(fp, "style=\"fill: none; stroke: black; "
+ "stroke-width: 1px;\" />\n");
+ }
+
+ ++connRefIt;
+ }
+ fprintf(fp, "</g>\n");
+
+
+ fprintf(fp, "<g inkscape:groupmode=\"layer\" "
+ "inkscape:label=\"DisplayConnectors\""
+ ">\n");
+ connRefIt = connRefs.begin();
+ while (connRefIt != connRefs.end())
+ {
+ ConnRef *connRef = *connRefIt;
+
+ PolyLine route = connRef->displayRoute();
+ if (!route.empty())
+ {
+ fprintf(fp, "<path id=\"disp-%u\" d=\"M %g,%g ", connRef->id(),
+ route.ps[0].x, route.ps[0].y);
+ for (size_t i = 1; i < route.size(); ++i)
+ {
+ fprintf(fp, "L %g,%g ", route.ps[i].x, route.ps[i].y);
+ }
+ fprintf(fp, "\" ");
+ if (connRef->src() && connRef->dst())
+ {
+ fprintf(fp, "debug=\"src: %d dst: %d\" ",
+ connRef->src()->visDirections,
+ connRef->dst()->visDirections);
+ }
+ fprintf(fp, "style=\"fill: none; stroke: black; "
+ "stroke-width: 1px;\" />\n");
+ }
+
+ ++connRefIt;
+ }
+ fprintf(fp, "</g>\n");
+
+
+ fprintf(fp, "</svg>\n");
+ fclose(fp);
}
diff --git a/src/libavoid/router.h b/src/libavoid/router.h
index 597f48c5e6b848b0ddd5bc9228cc075dab19f50e..03060b0258d9a8efc2ff012e54d55526ece7cfc1 100644 (file)
--- a/src/libavoid/router.h
+++ b/src/libavoid/router.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+//! @file router.h
+//! @brief Contains the interface for the Router class.
+
#ifndef AVOID_ROUTER_H
#define AVOID_ROUTER_H
-//#define LINEDEBUG
+#include <list>
+#include <utility>
+#include <string>
#include "libavoid/shape.h"
+#include "libavoid/viscluster.h"
#include "libavoid/graph.h"
#include "libavoid/timer.h"
-#include <list>
-#include <utility>
-#ifdef LINEDEBUG
+#include "libavoid/connector.h"
+
+#if defined(LINEDEBUG) || defined(ASTAR_DEBUG) || defined(LIBAVOID_SDL)
#include <SDL.h>
+ #ifndef LIBAVOID_SDL
+ #define LIBAVOID_SDL
+ #endif
#endif
namespace Avoid {
-class ConnRef;
-typedef std::list<ConnRef *> ConnRefList;
typedef std::list<unsigned int> IntList;
-class MoveInfo;
-typedef std::list<MoveInfo *> MoveInfoList;
+
+class ActionInfo;
+typedef std::list<ActionInfo> ActionInfoList;
+class ShapeRef;
+
+//! @brief Flags that can be passed to the router during initialisation
+//! to specify options.
+enum RouterFlag
+{
+ //! @brief This option specifies that the router should maintain the
+ //! structures necessary to allow poly-line connector routing.
+ PolyLineRouting = 1,
+ //! @brief This option specifies that the router should maintain the
+ //! structures necessary to allow orthogonal connector routing.
+ OrthogonalRouting = 2
+};
static const unsigned int runningTo = 1;
static const unsigned int runningFrom = 2;
static const unsigned int runningToAndFrom = runningTo | runningFrom;
+//! @brief Types of penalty cases that can be used to improve the quality
+//! of the connector routes produced.
+enum PenaltyType
+{
+ //! @brief This penalty is applied for each segment in the connector
+ //! path beyond the first. This should always normally be set
+ //! when doing orthogonal routing to prevent step-like connector
+ //! paths.
+ segmentPenalty = 0,
+ //! @brief This penalty is applied in its full amount to tight acute
+ //! bends in the connector path. A smaller portion of the penalty
+ //! is applied for slight bends, i.e., where the bend is close to
+ //! 180 degrees. This is useful for polyline routing where there
+ //! is some evidence that tighter corners are worse for
+ //! readability, but that slight bends might not be so bad,
+ //! especially when smoothed by curves.
+ anglePenalty,
+ //! @brief This penalty is applied whenever a connector path crosses
+ //! another connector path. It takes shared paths into
+ //! consideration and the penalty is only applied if there
+ //! is an actual crossing.
+ //! @note This penalty is still experimental! It is not recommended
+ //! for normal use.
+ crossingPenalty,
+ //! @brief This penalty is applied whenever a connector path crosses
+ //! a cluster boundary.
+ //! @note This penalty is still experimental! It is not recommended
+ //! for normal use.
+ clusterCrossingPenalty,
+ //! @brief This penalty is applied whenever a connector path shares
+ //! some segments with an immovable portion of an existing
+ //! connector route (such as the first or last segment of a
+ //! connector).
+ //! @note This penalty is still experimental! It is not recommended
+ //! for normal use.
+ fixedSharedPathPenalty,
+ // Used for determining the size of the penalty array.
+ // This should always we the last value in the enum.
+ lastPenaltyMarker
+};
+
+
+static const double noPenalty = 0;
+static const double chooseSensiblePenalty = -1;
+
+//! @brief The Router class represents a libavoid router instance.
+//!
+//! Usually you would keep a separate Router instance for each diagram
+//! or layout you have open in your application.
+//
class Router {
public:
- Router();
+ //! @brief Constructor for router instance.
+ //!
+ //! @param[in] flags One or more Avoid::RouterFlag options to
+ //! control the behaviour of the router.
+ Router(const unsigned int flags);
+
+ //! @brief Destructor for router instance.
+ //!
+ //! @note Destroying a router instance will delete all remaining
+ //! shapes and connectors, thereby invalidating any existing
+ //! pointers to them.
+ ~Router();
ShapeRefList shapeRefs;
ConnRefList connRefs;
+ ClusterRefList clusterRefs;
EdgeList visGraph;
EdgeList invisGraph;
+ EdgeList visOrthogGraph;
ContainsMap contains;
VertInfList vertices;
+ ContainsMap enclosingClusters;
bool PartialTime;
bool SimpleRouting;
- double segmt_penalty;
- double angle_penalty;
- double crossing_penalty;
-
+ bool ClusteredRouting;
- bool UseAStarSearch;
+ // Poly-line routing options:
bool IgnoreRegions;
- bool SelectiveReroute;
- bool IncludeEndpoints;
bool UseLeesAlgorithm;
bool InvisibilityGrph;
- bool ConsolidateMoves;
+
+ // General routing options:
+ bool SelectiveReroute;
+
bool PartialFeedback;
+ bool RubberBandRouting;
+
// Instrumentation:
Timer timers;
int st_checked_edges;
-#ifdef LINEDEBUG
+#ifdef LIBAVOID_SDL
SDL_Surface *avoid_screen;
#endif
+ //! @brief Allows setting of the behaviour of the router in regard
+ //! to transactions. This controls whether transactions are
+ //! used to queue changes and process them effeciently at once
+ //! or they are instead processed immediately.
+ //!
+ //! It is more efficient to perform actions like shape movement,
+ //! addition or deletion as batch tasks, and reroute the necessary
+ //! connectors just once after these actions have been performed.
+ //! For this reason, libavoid allows you to group such actions into
+ //! "transactions" that are processed efficiently when the
+ //! processTransaction() method is called.
+ //!
+ //! By default, the router will process all actions as tranactions.
+ //! If transactionUse() is set to false, then all actions will get
+ //! processed immediately, and cause immediate routing callbacks to
+ //! all affected connectors after each action.
+ //!
+ //! @param[in] transactions A boolean value specifying whether to
+ //! use transactions.
+ //!
+ void setTransactionUse(const bool transactions);
+
+ //! @brief Reports whether the router groups actions into transactions.
+ //!
+ //! @return A boolean value describing whether transactions are in use.
+ //!
+ //! @sa setTransactionUse
+ //! @sa processTransaction
+ //!
+ bool transactionUse(void) const;
+
+ //! @brief Finishes the current transaction and processes all the
+ //! queued object changes efficiently.
+ //!
+ //! This method will efficiently process all moves, additions and
+ //! deletions that have occurred since processTransaction() was
+ //! last called.
+ //!
+ //! If transactionUse() is false, then all actions will have been
+ //! processed immediately and this method will do nothing.
+ //!
+ //! @return A boolean value describing whether there were any actions
+ //! to process.
+ //!
+ //! @sa setTransactionUse
+ //!
+ bool processTransaction(void);
+
+ //! @brief Add a shape to the router scene.
+ //!
+ //! This shape will be considered to be an obstacle. Calling this
+ //! method will cause connectors intersecting the added shape to
+ //! be marked as needing to be rerouted.
+ //!
+ //! @param[in] shape Pointer reference to the shape being added.
+ //!
void addShape(ShapeRef *shape);
- void delShape(ShapeRef *shape);
- void moveShape(ShapeRef *shape, Polygn *newPoly,
+
+ //! @brief Remove a shape from the router scene.
+ //!
+ //! Connectors that could have a better (usually shorter) path after
+ //! the removal of this shape will be marked as needing to be rerouted.
+ //!
+ //! @param[in] shape Pointer reference to the shape being removed.
+ //!
+ void removeShape(ShapeRef *shape);
+
+ //! @brief Move or resize an existing shape within the router scene.
+ //!
+ //! A new polygon for the shape can be given to effectively move or
+ //! resize the shape with the scene. Connectors that intersect the
+ //! new shape polygon, or that could have a better (usually shorter)
+ //! path after the change, will be marked as needing to be rerouted.
+ //!
+ //! @param[in] shape Pointer reference to the shape being
+ //! moved/resized.
+ //! @param[in] newPoly The new polygon boundary for the shape.
+ //! @param[in] first_move This option is used for some advanced
+ //! (currently undocumented) behaviour and
+ //! it should be ignored for the moment.
+ //!
+ void moveShape(ShapeRef *shape, const Polygon& newPoly,
const bool first_move = false);
- void processMoves(void);
-
+
+ //! @brief Move an existing shape within the router scene by a relative
+ //! distance.
+ //!
+ //! Connectors that intersect the shape's new position, or that could
+ //! have a better (usually shorter) path after the change, will be
+ //! marked as needing to be rerouted.
+ //!
+ //! @param[in] shape Pointer reference to the shape being moved.
+ //! @param[in] xDiff The distance to move the shape in the
+ //! x dimension.
+ //! @param[in] yDiff The distance to move the shape in the
+ //! y dimension.
+ //!
+ void moveShape(ShapeRef *shape, const double xDiff, const double yDiff);
+
+ //! @brief Sets a spacing distance for overlapping orthogonal
+ //! connectors to be nudged apart.
+ //!
+ //! By default, this distance is set to a value of 4.
+ //!
+ //! This method does not re-trigger post-processing of connectors.
+ //! The new distance will be used the next time rerouting is performed.
+ //!
+ //! @param[in] dist The distance to be used for orthogonal nudging.
+ //!
+ void setOrthogonalNudgeDistance(const double dist);
+
+ //! @brief Returns the spacing distance that overlapping orthogonal
+ //! connecotrs are nudged apart.
+ //!
+ //! @return The current spacing distance used for orthogonal nudging.
+ //!
+ double orthogonalNudgeDistance(void) const;
+
+ //! @brief Sets or removes penalty values that are applied during
+ //! connector routing.
+ //!
+ //! By default, libavoid will produce shortest path routes between
+ //! the source and destination points for each connector. There are
+ //! several penalties that can be applied during this stage to
+ //! improve the aesthetics of the routes generated. These different
+ //! penalties are specified and explained by the PenaltyType enum.
+ //!
+ //! If a value of zero or Avoid::noPenalty is given then the penalty
+ //! for this case will be removed. If no penalty argument (or a
+ //! negative value) is specified when calling this method, then a
+ //! sensible penalty value will be automatically chosen.
+ //!
+ //! @param[in] penType The type of penalty, a PenaltyType.
+ //! @param[in] penVal The value to be applied for each occurance
+ //! of the penalty case.
+ //!
+ void setRoutingPenalty(const PenaltyType penType,
+ const double penVal = chooseSensiblePenalty);
+
+ //! @brief Returns the current penalty value for a particular
+ //! routing penalty case.
+ //!
+ //! @param[in] penType The type of penalty, a PenaltyType.
+ //! @return The penalty value for the specified penalty case.
+ //!
+ double routingPenalty(const PenaltyType penType) const;
+
+ void addCluster(ClusterRef *cluster);
+ void delCluster(ClusterRef *cluster);
+
void attachedConns(IntList &conns, const unsigned int shapeId,
const unsigned int type);
void attachedShapes(IntList &shapes, const unsigned int shapeId,
void markConnectors(ShapeRef *shape);
void generateContains(VertInf *pt);
void printInfo(void);
+ void outputInstanceToSVG(std::string filename = std::string());
+ unsigned int assignId(const unsigned int suggestedId);
+ void regenerateStaticBuiltGraph(void);
+ void destroyOrthogonalVisGraph(void);
+ void setStaticGraphInvalidated(const bool invalidated);
+ ConnType validConnType(const ConnType select = ConnType_None) const;
+ bool shapeInQueuedActionList(ShapeRef *shape) const;
+ double& penaltyRef(const PenaltyType penType);
+ bool existsOrthogonalPathOverlap(void);
+ bool existsOrthogonalTouchingCorners(void);
+
private:
- void newBlockingShape(Polygn *poly, int pid);
+ friend class ConnRef;
+
+ void modifyConnector(ConnRef *conn);
+ void modifyConnector(ConnRef *conn, unsigned int type,
+ const ConnEnd &connEnd);
+ void removeQueuedConnectorActions(ConnRef *conn);
+ void newBlockingShape(const Polygon& poly, int pid);
void checkAllBlockedEdges(int pid);
void checkAllMissingEdges(void);
- void adjustContainsWithAdd(const Polygn& poly, const int p_shape);
+ void adjustContainsWithAdd(const Polygon& poly, const int p_shape);
void adjustContainsWithDel(const int p_shape);
- void callbackAllInvalidConnectors(void);
+ void adjustClustersWithAdd(const PolygonInterface& poly,
+ const int p_cluster);
+ void adjustClustersWithDel(const int p_cluster);
+ void rerouteAndCallbackConnectors(void);
+ bool idIsUnique(const unsigned int id) const;
+ void improveCrossings(void);
+
+ ActionInfoList actionList;
+ unsigned int _largestAssignedId;
+ bool _consolidateActions;
+ double _orthogonalNudgeDistance;
+ double _routingPenalties[lastPenaltyMarker];
+
+ public:
+ // Overall modes:
+ bool _polyLineRouting;
+ bool _orthogonalRouting;
- MoveInfoList moveList;
+ bool _staticGraphInvalidated;
+ bool _inCrossingPenaltyReroutingStage;
};
}
diff --git a/src/libavoid/shape.cpp b/src/libavoid/shape.cpp
index c0ff2f6e893d83a51d4585d8ad7abc52c0365d25..ac3f0c1933e621b769a04116571b508e2b61fe93 100644 (file)
--- a/src/libavoid/shape.cpp
+++ b/src/libavoid/shape.cpp
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
-#include <cassert>
#include "libavoid/shape.h"
#include "libavoid/graph.h" // For alertConns
#include "libavoid/vertices.h"
-#include "libavoid/polyutil.h"
#include "libavoid/router.h"
+#include "libavoid/debug.h"
+#include "libavoid/assertions.h"
namespace Avoid {
-ShapeRef::ShapeRef(Router *router, unsigned int id, Polygn& ply)
+ShapeRef::ShapeRef(Router *router, Polygon& ply, const unsigned int id)
: _router(router)
- , _id(id)
- , _poly(copyPoly(ply))
+ , _poly(ply)
, _active(false)
, _inMoveList(false)
, _firstVert(NULL)
, _lastVert(NULL)
{
+ _id = router->assignId(id);
+
bool isShape = true;
- VertID i = VertID(id, isShape, 0);
+ VertID i = VertID(_id, isShape, 0);
+ const bool addToRouterNow = false;
VertInf *last = NULL;
VertInf *node = NULL;
- for (int pt_i = 0; pt_i < _poly.pn; pt_i++)
+ for (size_t pt_i = 0; pt_i < _poly.size(); ++pt_i)
{
- node = new VertInf(_router, i, _poly.ps[pt_i]);
+ node = new VertInf(_router, i, _poly.ps[pt_i], addToRouterNow);
if (!_firstVert)
{
_lastVert->shNext = _firstVert;
_firstVert->shPrev = _lastVert;
-
- makeActive();
}
ShapeRef::~ShapeRef()
{
- assert(_firstVert != NULL);
-
- makeInactive();
+ COLA_ASSERT(!_router->shapeInQueuedActionList(this));
+ if (_active)
+ {
+ // Destroying a shape without calling removeShape(), so do it now.
+ _router->removeShape(this);
+ _router->processTransaction();
+ }
+
+ COLA_ASSERT(_firstVert != NULL);
+
VertInf *it = _firstVert;
do
{
}
while (it != _firstVert);
_firstVert = _lastVert = NULL;
-
- freePoly(_poly);
}
-void ShapeRef::setNewPoly(Polygn& poly)
+void ShapeRef::setNewPoly(const Polygon& poly)
{
- assert(_firstVert != NULL);
- assert(_poly.pn == poly.pn);
+ COLA_ASSERT(_firstVert != NULL);
+ COLA_ASSERT(_poly.size() == poly.size());
VertInf *curr = _firstVert;
- for (int pt_i = 0; pt_i < _poly.pn; pt_i++)
+ for (size_t pt_i = 0; pt_i < _poly.size(); ++pt_i)
{
- assert(curr->visListSize == 0);
- assert(curr->invisListSize == 0);
+ COLA_ASSERT(curr->visListSize == 0);
+ COLA_ASSERT(curr->invisListSize == 0);
// Reset with the new polygon point.
curr->Reset(poly.ps[pt_i]);
curr->pathNext = NULL;
- curr->pathDist = 0;
curr = curr->shNext;
}
- assert(curr == _firstVert);
+ COLA_ASSERT(curr == _firstVert);
- freePoly(_poly);
- _poly = copyPoly(poly);
+ _poly = poly;
}
void ShapeRef::makeActive(void)
{
- assert(!_active);
+ COLA_ASSERT(!_active);
- // Add to connRefs list.
+ // Add to shapeRefs list.
_pos = _router->shapeRefs.insert(_router->shapeRefs.begin(), this);
// Add points to vertex list.
void ShapeRef::makeInactive(void)
{
- assert(_active);
+ COLA_ASSERT(_active);
- // Remove from connRefs list.
+ // Remove from shapeRefs list.
_router->shapeRefs.erase(_pos);
// Remove points from vertex list.
_active = false;
}
-
+
+
+bool ShapeRef::isActive(void) const
+{
+ return _active;
+}
+
VertInf *ShapeRef::firstVert(void)
{
}
-unsigned int ShapeRef::id(void)
+unsigned int ShapeRef::id(void) const
{
return _id;
}
-Polygn ShapeRef::poly(void)
+const Polygon& ShapeRef::polygon(void) const
{
return _poly;
}
-Router *ShapeRef::router(void)
+Router *ShapeRef::router(void) const
{
return _router;
}
void ShapeRef::boundingBox(BBox& bbox)
{
- assert(_poly.pn > 0);
+ COLA_ASSERT(!_poly.empty());
bbox.a = bbox.b = _poly.ps[0];
Point& a = bbox.a;
Point& b = bbox.b;
- for (int i = 1; i < _poly.pn; ++i)
+ for (size_t i = 1; i < _poly.size(); ++i)
{
const Point& p = _poly.ps[i];
// For each vertex.
EdgeInfList& visList = tmp->visList;
- EdgeInfList::iterator finish = visList.end();
- EdgeInfList::iterator edge;
+ EdgeInfList::const_iterator finish = visList.end();
+ EdgeInfList::const_iterator edge;
while ((edge = visList.begin()) != finish)
{
// Remove each visibility edge
// Remove each invisibility edge
delete (*edge);
}
+
+ EdgeInfList& orthogList = tmp->orthogVisList;
+ finish = orthogList.end();
+ while ((edge = orthogList.begin()) != finish)
+ {
+ // Remove each orthogonal visibility edge
+ (*edge)->alertConns();
+ delete (*edge);
+ }
}
}
}
else
{
- fprintf(stderr, "WARNING: two moves queued for same shape prior to "
- "rerouting.\n This is not safe.\n");
+ db_printf("WARNING: two moves queued for same shape prior to rerouting."
+ "\n This is not safe.\n");
}
}
diff --git a/src/libavoid/shape.h b/src/libavoid/shape.h
index b654c6eea159bf458694e998ce1c1f899d29b663..df4c98df14a70d20fbd832e776d2146e4fec90d2 100644 (file)
--- a/src/libavoid/shape.h
+++ b/src/libavoid/shape.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+//! @file shape.h
+//! @brief Contains the interface for the ShapeRef class.
+
+
#ifndef AVOID_SHAPE_H
#define AVOID_SHAPE_H
typedef std::list<ShapeRef *> ShapeRefList;
+//! @brief The ShapeRef class represents a shape object.
+//!
+//! Shapes are obstacles that connectors must be routed around. They can be
+//! placed into a Router scene and can be repositioned or resized (via
+//! Router::moveShape()).
+//!
+//! Usually, it is expected that you would create a ShapeRef for each shape
+//! in your diagram and keep that reference in your own shape class.
+//!
class ShapeRef
{
public:
- ShapeRef(Router *router, unsigned int id, Polygn& poly);
- virtual ~ShapeRef();
- void setNewPoly(Polygn& poly);
+ //! @brief Shape reference constructor.
+ //!
+ //! Creates a shape obect reference, but does not yet place it into the
+ //! Router scene.
+ //!
+ //! The poly argument will usually be the boundary of the shape in your
+ //! application with additional buffer of several pixels on each side.
+ //! Specifying such a buffer results in connectors leaving a small
+ //! amount of space around shapes, rather than touching them on the
+ //! corners or edges.
+ //!
+ //! If an ID is not specified, then one will be assigned to the shape.
+ //! If assigning an ID yourself, note that it should be a unique
+ //! positive integer. Also, IDs are given to all objects in a scene,
+ //! so the same ID cannot be given to a shape and a connector for
+ //! example.
+ //!
+ //! @param[in] router The router scene to place the shape into.
+ //! @param[in] poly A Polygon representing the boundary of the
+ //! shape.
+ //! @param[in] id A unique positive integer ID for the shape.
+ ShapeRef(Router *router, Polygon& poly, const unsigned int id = 0);
+ //! @brief Shape reference destructor.
+ //!
+ //! This will call Router::removeShape() for this shape, if this has
+ //! not already be called.
+ ~ShapeRef();
+
+ //! @brief Returns the ID of this shape.
+ //! @returns The ID of the shape.
+ unsigned int id(void) const;
+ //! @brief Returns a reference to the polygon boundary of this shape.
+ //! @returns A reference to the polygon boundary of the shape.
+ const Polygon& polygon(void) const;
+ //! @brief Returns a pointer to the router scene this shape is in.
+ //! @returns A pointer to the router scene for this shape.
+ Router *router(void) const;
+
+ void setNewPoly(const Polygon& poly);
VertInf *firstVert(void);
VertInf *lastVert(void);
- unsigned int id(void);
- Polygn poly(void);
- Router *router(void);
void boundingBox(BBox& bbox);
void makeActive(void);
void makeInactive(void);
+ bool isActive(void) const;
void removeFromGraph(void);
void markForMove(void);
private:
Router *_router;
unsigned int _id;
- Polygn _poly;
+ Polygon _poly;
bool _active;
bool _inMoveList;
ShapeRefList::iterator _pos;
diff --git a/src/libavoid/static.cpp b/src/libavoid/static.cpp
--- a/src/libavoid/static.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
-*/
-
-#include <cassert>
-#include <iostream>
-#include "libavoid/vertices.h"
-#include "libavoid/connector.h"
-#include "libavoid/graph.h"
-#include "libavoid/static.h"
-#include "libavoid/shape.h"
-#include "libavoid/visibility.h"
-#include "libavoid/debug.h"
-#include "libavoid/router.h"
-
-namespace Avoid {
-
-static void computeCompleteVis(Router *router);
-
-
-// This should only be used for the static algorithm.
-//
-// XXX: If to set up the vis graph for incremental it would need
-// the shapeRef pointers in obs.
-//
-void CreateVisGraph(Router *router, Polygn **obs, int n_obs)
-{
- for (int poly_i = 0; poly_i < n_obs; poly_i++)
- {
- unsigned int id = obs[poly_i]->id;
-
- new ShapeRef(router, id, *(obs[poly_i]));
- }
- computeCompleteVis(router);
-}
-
-
-static void computeCompleteVis(Router *router)
-{
- VertInf *beginVert = router->vertices.shapesBegin();
- VertInf *endVert = router->vertices.end();
- for (VertInf *i = beginVert; i != endVert; i = i->lstNext)
- {
- db_printf("-- CONSIDERING --\n");
- i->id.db_print();
-
- for (VertInf *j = i->lstPrev ; j != NULL; j = j->lstPrev)
- {
- bool knownNew = true;
- EdgeInf::checkEdgeVisibility(i, j, knownNew);
- }
- }
-}
-
-
-void DestroyVisGraph(Router *router)
-{
- ShapeRefList::iterator sFinish = router->shapeRefs.end();
- ShapeRefList::iterator sCurr;
-
- while ((sCurr = router->shapeRefs.begin()) != sFinish)
- {
- ShapeRef *shape = (*sCurr);
-
- shape->removeFromGraph();
- delete shape;
- }
-
- ConnRefList::iterator cFinish = router->connRefs.end();
- ConnRefList::iterator cCurr;
-
- while ((cCurr = router->connRefs.begin())!= cFinish)
- {
- ConnRef *conn = (*cCurr);
-
- conn->removeFromGraph();
- conn->unInitialise();
- }
- // Clear contains info.
- router->contains.clear();
-
- assert(router->vertices.connsBegin() == NULL);
-}
-
-
-}
-
diff --git a/src/libavoid/static.h b/src/libavoid/static.h
--- a/src/libavoid/static.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * vim: ts=4 sw=4 et tw=0 wm=0
- *
- * libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
-*/
-
-
-#ifndef AVOID_STATIC_H
-#define AVOID_STATIC_H
-
-#include "libavoid/geomtypes.h"
-
-
-namespace Avoid {
-
-class Router;
-
-
-extern void CreateVisGraph(Router *router, Polygn **obstacles,
- int n_obstacles);
-extern void DestroyVisGraph(Router *router);
-
-}
-
-
-#endif
diff --git a/src/libavoid/timer.cpp b/src/libavoid/timer.cpp
index e4349bea971626598960b7d973dca3692b4ce2e8..f8600acbebaf40f9b7bae8d708d5e62c41a841de 100644 (file)
--- a/src/libavoid/timer.cpp
+++ b/src/libavoid/timer.cpp
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
#include <cstdio>
#include <cstdlib>
-#include <cassert>
-using std::abort;
#include <climits>
#include "libavoid/timer.h"
+#include "libavoid/debug.h"
+#include "libavoid/assertions.h"
namespace Avoid {
}
-void Timer::Register(const int t, const bool start)
+void Timer::Register(const TimerIndex t, const bool start)
{
- assert(t != tmNon);
+ COLA_ASSERT(t != tmNon);
if (type == tmNon)
{
void Timer::Start(void)
{
- if (running)
- {
- fprintf(stderr, "ERROR: Timer already running in Timer::Start()\n");
- abort();
- }
+ COLA_ASSERT(!running);
cStart[type] = clock(); // CPU time
running = true;
}
void Timer::Stop(void)
{
- if (!running)
- {
- fprintf(stderr, "ERROR: Timer not running in Timer::Stop()\n");
- abort();
- }
+ COLA_ASSERT(running);
clock_t cStop = clock(); // CPU time
running = false;
cDiff = cStop - cStart[type];
}
- if (cDiff > LONG_MAX)
- {
- fprintf(stderr, "Error: cDiff overflow in Timer:Stop()\n");
- abort();
- }
+ COLA_ASSERT(cDiff < LONG_MAX);
if (type == tmPth)
{
}
-void Timer::PrintAll(void)
+void Timer::PrintAll(FILE *fp)
{
- for (int i = 0; i < tmCount; i++)
+ for (unsigned int i = 0; i < tmCount; i++)
{
- Print(i);
+ Print((TimerIndex) i, fp);
}
}
#define toMsec(tot) ((bigclock_t) ((tot) / (((double) CLOCKS_PER_SEC) / 1000)))
#define toAvg(tot, cnt) ((((cnt) > 0) ? ((long double) (tot)) / (cnt) : 0))
-void Timer::Print(const int t)
+void Timer::Print(const TimerIndex t, FILE *fp)
{
bigclock_t avg = toMsec(toAvg(cTotal[t], cTally[t]));
bigclock_t pind = toMsec(toAvg(cPath[t], cPathTally[t]));
bigclock_t pavg = toMsec(toAvg(cPath[t], cTally[t]));
double max = toMsec(cMax[t]);
double pmax = toMsec(cPathMax[t]);
- printf("\t%lld %d %lld %.0f %lld %d %lld %.0f %lld\n",
+ fprintf(fp, "\t%lld %d %lld %.0f %lld %d %lld %.0f %lld\n",
cTotal[t], cTally[t], avg, max,
cPath[t], cPathTally[t], pavg, pmax, pind);
}
diff --git a/src/libavoid/timer.h b/src/libavoid/timer.h
index a7e6081fab2b917e52fe2f1f0fe99576592628ca..9cab6d7ff21b56c62a1707c0900db9237cf4107f 100644 (file)
--- a/src/libavoid/timer.h
+++ b/src/libavoid/timer.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
#ifndef PROFILE_H
#define PROFILE_H
typedef unsigned long long int bigclock_t;
-static const int tmCount = 5;
-
-static const int tmNon = -1;
-static const int tmAdd = 0;
-static const int tmDel = 1;
-static const int tmMov = 2;
-static const int tmPth = 3;
-static const int tmSev = 4;
+enum TimerIndex
+{
+ tmNon = 0,
+ tmAdd,
+ tmDel,
+ tmMov,
+ tmPth,
+ tmSev,
+ tmOrthogGraph,
+ tmOrthogRoute,
+ tmOrthogCentre,
+ tmOrthogNudge,
+ tmCount
+};
static const bool timerStart = true;
{
public:
Timer();
- void Register(const int t, const bool start = timerDelay);
+ void Register(const TimerIndex t, const bool start = timerDelay);
void Start(void);
void Stop(void);
void Reset(void);
- void Print(const int t);
- void PrintAll(void);
+ void Print(TimerIndex, FILE *fp);
+ void PrintAll(FILE *fp);
private:
clock_t cStart[tmCount];
bool running;
long count;
- int type, lasttype;
+ TimerIndex type, lasttype;
};
index c2be955ac3d89c27ce227d0cd88b987cd1076cbb..85226498aa1fedcd5b3e624f5f8fdb640057e0bc 100644 (file)
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
+#include <iostream>
+#include <cstdlib>
+
#include "libavoid/vertices.h"
#include "libavoid/geometry.h"
#include "libavoid/graph.h" // For alertConns
#include "libavoid/debug.h"
#include "libavoid/router.h"
-
-#include <iostream>
-#include <cstdlib>
-#include <cassert>
+#include "libavoid/assertions.h"
using std::ostream;
{
return false;
}
- assert(isShape == rhs.isShape);
+ // XXX RubberBand search breaks this:
+ // COLA_ASSERT(isShape == rhs.isShape);
return true;
}
{
return true;
}
- assert(isShape == rhs.isShape);
+ COLA_ASSERT(isShape == rhs.isShape);
return false;
}
}
-const int VertID::src = 1;
-const int VertID::tar = 2;
+const unsigned short VertID::src = 1;
+const unsigned short VertID::tar = 2;
ostream& operator<<(ostream& os, const VertID& vID)
-VertInf::VertInf(Router *router, const VertID& vid, const Point& vpoint)
- : _router(router)
- , id(vid)
- , point(vpoint)
- , lstPrev(NULL)
- , lstNext(NULL)
- , shPrev(NULL)
- , shNext(NULL)
- , visListSize(0)
- , invisListSize(0)
- , pathNext(NULL)
- , pathDist(0)
+VertInf::VertInf(Router *router, const VertID& vid, const Point& vpoint,
+ const bool addToRouter)
+ : _router(router),
+ id(vid),
+ point(vpoint),
+ lstPrev(NULL),
+ lstNext(NULL),
+ shPrev(NULL),
+ shNext(NULL),
+ visListSize(0),
+ orthogVisListSize(0),
+ invisListSize(0),
+ pathNext(NULL),
+ visDirections(ConnDirNone)
+{
+ point.id = vid.objID;
+ point.vn = vid.vn;
+
+ if (addToRouter)
+ {
+ _router->vertices.addVertex(this);
+ }
+}
+
+
+VertInf::~VertInf()
+{
+}
+
+
+void VertInf::Reset(const VertID& vid, const Point& vpoint)
{
+ id = vid;
+ point = vpoint;
+ point.id = id.objID;
+ point.vn = id.vn;
}
void VertInf::Reset(const Point& vpoint)
{
point = vpoint;
+ point.id = id.objID;
+ point.vn = id.vn;
+}
+
+
+// Returns true if this vertex is not involved in any (in)visibility graphs.
+bool VertInf::orphaned(void)
+{
+ return (visList.empty() && invisList.empty() && orthogVisList.empty());
}
{
if (isConnVert)
{
- assert(!(id.isShape));
+ COLA_ASSERT(!(id.isShape));
}
- VertInf *tmp = this;
-
// For each vertex.
- EdgeInfList& visList = tmp->visList;
- EdgeInfList::iterator finish = visList.end();
- EdgeInfList::iterator edge;
+ EdgeInfList::const_iterator finish = visList.end();
+ EdgeInfList::const_iterator edge;
while ((edge = visList.begin()) != finish)
{
// Remove each visibility edge
delete (*edge);
}
- EdgeInfList& invisList = tmp->invisList;
+ finish = orthogVisList.end();
+ while ((edge = orthogVisList.begin()) != finish)
+ {
+ // Remove each orthogonal visibility edge.
+ (*edge)->alertConns();
+ delete (*edge);
+ }
+
finish = invisList.end();
while ((edge = invisList.begin()) != finish)
{
// We better be part of the same instance of libavoid.
Router *router = src->_router;
- assert(router == dst->_router);
+ COLA_ASSERT(router == dst->_router);
ContainsMap& contains = router->contains;
if (!(pID.isShape))
VertInfList::VertInfList()
- : _firstShapeVert(NULL)
- , _firstConnVert(NULL)
- , _lastShapeVert(NULL)
- , _lastConnVert(NULL)
- , _shapeVertices(0)
- , _connVertices(0)
+ : _firstShapeVert(NULL),
+ _firstConnVert(NULL),
+ _lastShapeVert(NULL),
+ _lastConnVert(NULL),
+ _shapeVertices(0),
+ _connVertices(0)
{
}
#define checkVertInfListConditions() \
do { \
- assert((!_firstConnVert && (_connVertices == 0)) || \
+ COLA_ASSERT((!_firstConnVert && (_connVertices == 0)) || \
((_firstConnVert->lstPrev == NULL) && (_connVertices > 0))); \
- assert((!_firstShapeVert && (_shapeVertices == 0)) || \
+ COLA_ASSERT((!_firstShapeVert && (_shapeVertices == 0)) || \
((_firstShapeVert->lstPrev == NULL) && (_shapeVertices > 0))); \
- assert(!_lastShapeVert || (_lastShapeVert->lstNext == NULL)); \
- assert(!_lastConnVert || (_lastConnVert->lstNext == _firstShapeVert)); \
- assert((!_firstConnVert && !_lastConnVert) || \
+ COLA_ASSERT(!_lastShapeVert || (_lastShapeVert->lstNext == NULL)); \
+ COLA_ASSERT(!_lastConnVert || (_lastConnVert->lstNext == _firstShapeVert)); \
+ COLA_ASSERT((!_firstConnVert && !_lastConnVert) || \
(_firstConnVert && _lastConnVert) ); \
- assert((!_firstShapeVert && !_lastShapeVert) || \
+ COLA_ASSERT((!_firstShapeVert && !_lastShapeVert) || \
(_firstShapeVert && _lastShapeVert) ); \
- assert(!_firstShapeVert || _firstShapeVert->id.isShape); \
- assert(!_lastShapeVert || _lastShapeVert->id.isShape); \
- assert(!_firstConnVert || !(_firstConnVert->id.isShape)); \
- assert(!_lastConnVert || !(_lastConnVert->id.isShape)); \
+ COLA_ASSERT(!_firstShapeVert || _firstShapeVert->id.isShape); \
+ COLA_ASSERT(!_lastShapeVert || _lastShapeVert->id.isShape); \
+ COLA_ASSERT(!_firstConnVert || !(_firstConnVert->id.isShape)); \
+ COLA_ASSERT(!_lastConnVert || !(_lastConnVert->id.isShape)); \
} while(0)
void VertInfList::addVertex(VertInf *vert)
{
checkVertInfListConditions();
- assert(vert->lstPrev == NULL);
- assert(vert->lstNext == NULL);
+ COLA_ASSERT(vert->lstPrev == NULL);
+ COLA_ASSERT(vert->lstNext == NULL);
if (!(vert->id.isShape))
{
}
-void VertInfList::removeVertex(VertInf *vert)
+// Removes a vertex from the list and returns a pointer to the vertex
+// following the removed one.
+VertInf *VertInfList::removeVertex(VertInf *vert)
{
+ if (vert == NULL)
+ {
+ return NULL;
+ }
// Conditions for correct data structure
checkVertInfListConditions();
+
+ VertInf *following = vert->lstNext;
if (!(vert->id.isShape))
{
vert->lstNext = NULL;
checkVertInfListConditions();
+
+ return following;
+}
+
+
+VertInf *VertInfList::getVertexByID(const VertID& id)
+{
+ VertID searchID = id;
+ if (searchID.vn == kUnassignedVertexNumber)
+ {
+ unsigned int topbit = ((unsigned int) 1) << 31;
+ if (searchID.objID & topbit)
+ {
+ searchID.objID = searchID.objID & ~topbit;
+ searchID.vn = VertID::src;
+ }
+ else
+ {
+ searchID.vn = VertID::tar;
+ }
+ }
+ VertInf *last = end();
+ for (VertInf *curr = connsBegin(); curr != last; curr = curr->lstNext)
+ {
+ if (curr->id == searchID)
+ {
+ return curr;
+ }
+ }
+ return NULL;
+}
+
+
+VertInf *VertInfList::getVertexByPos(const Point& p)
+{
+ VertInf *last = end();
+ for (VertInf *curr = shapesBegin(); curr != last; curr = curr->lstNext)
+ {
+ if (curr->point == p)
+ {
+ return curr;
+ }
+ }
+ return NULL;
}
}
+unsigned int VertInfList::connsSize(void) const
+{
+ return _connVertices;
+}
+
+
+unsigned int VertInfList::shapesSize(void) const
+{
+ return _shapeVertices;
+}
+
+
}
index 1b0dcf3aa0331e04e99e5c4112815838254534b9..b07c87f95141632eceb0d42343899186fe0a8ce8 100644 (file)
--- a/src/libavoid/vertices.h
+++ b/src/libavoid/vertices.h
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
#ifndef AVOID_VERTICES_H
#define AVOID_VERTICES_H
#include <map>
#include <iostream>
#include <cstdio>
+
#include "libavoid/geomtypes.h"
namespace Avoid {
typedef std::list<EdgeInf *> EdgeInfList;
+typedef unsigned int ConnDirFlags;
+
class VertID
{
public:
unsigned int objID;
bool isShape;
- int vn;
+ unsigned short vn;
- static const int src;
- static const int tar;
+ static const unsigned short src;
+ static const unsigned short tar;
VertID();
VertID(unsigned int id, bool s, int n);
};
+// An ID given to all dummy vertices inserted to allow creation of the
+// orthogonal visibility graph since the vertices in the orthogonal graph
+// mostly do not correspond to shape corners or connector endpoints.
+//
+static const VertID dummyOrthogID(0, true, 0);
+
+
class VertInf
{
public:
- VertInf(Router *router, const VertID& vid, const Point& vpoint);
+ VertInf(Router *router, const VertID& vid, const Point& vpoint,
+ const bool addToRouter = true);
+ ~VertInf();
+ void Reset(const VertID& vid, const Point& vpoint);
void Reset(const Point& vpoint);
void removeFromGraph(const bool isConnVert = true);
+ bool orphaned(void);
Router *_router;
VertID id;
VertInf *shNext;
EdgeInfList visList;
unsigned int visListSize;
+ EdgeInfList orthogVisList;
+ unsigned int orthogVisListSize;
EdgeInfList invisList;
unsigned int invisListSize;
VertInf *pathNext;
- double pathDist;
+ ConnDirFlags visDirections;
};
bool directVis(VertInf *src, VertInf *dst);
+// A linked list of all the vertices in the router instance. All the
+// connector endpoints are listed first, then all the shape vertices.
+// Dunnny vertices inserted for orthogonal routing are classed as shape
+// vertices but have VertID(0, 0).
+//
class VertInfList
{
public:
VertInfList();
void addVertex(VertInf *vert);
- void removeVertex(VertInf *vert);
+ VertInf *removeVertex(VertInf *vert);
+ VertInf *getVertexByID(const VertID& id);
+ VertInf *getVertexByPos(const Point& p);
VertInf *shapesBegin(void);
VertInf *connsBegin(void);
VertInf *end(void);
- void stats(void)
+ unsigned int connsSize(void) const;
+ unsigned int shapesSize(void) const;
+ void stats(FILE *fp = stderr)
{
- printf("Conns %d, shapes %d\n", _connVertices, _shapeVertices);
+ fprintf(fp, "Conns %d, shapes %d\n", _connVertices,
+ _shapeVertices);
}
private:
VertInf *_firstShapeVert;
index d2b0576435c365c4a7c798679b1c961b6869c0d8..089911f35e4ffb756d6f4544bec0fd31f8267d7a 100644 (file)
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2009 Monash University
+ *
+ * --------------------------------------------------------------------
+ * The Visibility Sweep technique is based upon the method described
+ * in Section 5.2 of:
+ * Lee, D.-T. (1978). Proximity and reachability in the plane.,
+ * PhD thesis, Department of Electrical Engineering,
+ * University of Illinois, Urbana, IL.
+ * --------------------------------------------------------------------
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
#include <algorithm>
#include <cfloat>
+#define _USE_MATH_DEFINES
+#include <cmath>
#include "libavoid/shape.h"
#include "libavoid/debug.h"
#include "libavoid/graph.h"
#include "libavoid/geometry.h"
#include "libavoid/router.h"
-
-#include <math.h>
+#include "libavoid/assertions.h"
#ifdef LINEDEBUG
#include "SDL_gfxPrimitives.h"
VertInf *shapeBegin = shape->firstVert();
VertInf *shapeEnd = shape->lastVert()->lstNext;
- VertInf *pointsBegin = NULL;
- if (router->IncludeEndpoints)
- {
- pointsBegin = router->vertices.connsBegin();
- }
- else
- {
- pointsBegin = router->vertices.shapesBegin();
- }
-
+ VertInf *pointsBegin = router->vertices.connsBegin();
for (VertInf *curr = shapeBegin; curr != shapeEnd; curr = curr->lstNext)
{
bool knownNew = true;
db_printf("\tFirst Half:\n");
for (VertInf *j = pointsBegin ; j != curr; j = j->lstNext)
{
+ if (j->id == dummyOrthogID)
+ {
+ // Don't include orthogonal dummy vertices.
+ continue;
+ }
EdgeInf::checkEdgeVisibility(curr, j, knownNew);
}
VertInf *pointsEnd = router->vertices.end();
for (VertInf *k = shapeEnd; k != pointsEnd; k = k->lstNext)
{
+ if (k->id == dummyOrthogID)
+ {
+ // Don't include orthogonal dummy vertices.
+ continue;
+ }
EdgeInf::checkEdgeVisibility(curr, k, knownNew);
}
}
const VertID& pID = point->id;
// Make sure we're only doing ptVis for endpoints.
- assert(!(pID.isShape));
+ COLA_ASSERT(!(pID.isShape));
if ( !(router->InvisibilityGrph) )
{
for (VertInf *k = router->vertices.shapesBegin(); k != shapesEnd;
k = k->lstNext)
{
+ if (k->id == dummyOrthogID)
+ {
+ // Don't include orthogonal dummy vertices.
+ continue;
+ }
EdgeInf::checkEdgeVisibility(point, k, knownNew);
}
- if (router->IncludeEndpoints && partner)
+ if (partner)
{
EdgeInf::checkEdgeVisibility(point, partner, knownNew);
}
static VertInf *centerInf;
static Point centerPoint;
static VertID centerID;
-static double centerAngle;
class PointPair
double y = vInf->point.y - centerPoint.y;
angle = pos_to_angle(x, y);
+ distance = euclideanDist(centerPoint, vInf->point);
}
- bool operator==(const PointPair& rhs) const
+ bool operator<(const PointPair& rhs) const
{
- if (vInf->id == rhs.vInf->id)
+ // Firstly order by angle.
+ if (angle == rhs.angle)
{
- return true;
+ // If the points are collinear, then order them in increasing
+ // distance from the point we are sweeping around.
+ if (distance == rhs.distance)
+ {
+ // XXX: Add this assertion back if we require that
+ // connector endpoints have unique IDs. For the
+ // moment it is okay for them to have the same ID.
+ //COLA_ASSERT(vInf->id != rhs.vInf->id);
+
+ // If comparing two points at the same physical
+ // position, then order them by their VertIDs.
+ return vInf->id < rhs.vInf->id;
+ }
+ return distance < rhs.distance;
}
- return false;
+ return angle < rhs.angle;
}
static double pos_to_angle(double x, double y)
{
+ if (y == 0)
+ {
+ return ((x < 0) ? 180 : 0);
+ }
+ else if (x == 0)
+ {
+ return ((y < 0) ? 270 : 90);
+ }
+
double ang = atan(y / x);
ang = (ang * 180) / M_PI;
+
if (x < 0)
{
ang += 180;
{
ang += 360;
}
+ COLA_ASSERT(ang >= 0);
+ COLA_ASSERT(ang <= 360);
return ang;
}
VertInf *vInf;
double angle;
+ double distance;
};
-typedef std::list<PointPair > VertList;
+typedef std::set<PointPair > VertSet;
class EdgePair
{
public:
- EdgePair(VertInf *v1, VertInf *v2, double d, double a)
- : vInf1(v1), vInf2(v2), initdist(d), initangle(a)
+ EdgePair() :
+ vInf1(NULL), vInf2(NULL), dist1(0.0), dist2(0.0), angle(0.0),
+ angleDist(0.0)
+ {
+ // The default constuctor should never be called.
+ // This is defined to appease the MSVC compiler.
+ COLA_ASSERT(false);
+ }
+ EdgePair(const PointPair& p1, VertInf *v) :
+ vInf1(p1.vInf),
+ vInf2(v),
+ dist1(p1.distance),
+ dist2(euclideanDist(vInf2->point, centerPoint)),
+ angle(p1.angle),
+ angleDist(p1.distance)
{
- currdist = initdist;
- currangle = initangle;
}
bool operator<(const EdgePair& rhs) const
{
- if (initdist == rhs.initdist)
+ COLA_ASSERT(angle == rhs.angle);
+ if (angleDist == rhs.angleDist)
{
- // TODO: This is a bit of a hack, should be
- // set by the call to the constructor.
- return dist(centerPoint, vInf2->point) <
- dist(centerPoint, rhs.vInf2->point);
+ return (dist2 < rhs.dist2);
}
- return (initdist < rhs.initdist);
+ return (angleDist < rhs.angleDist);
}
bool operator==(const EdgePair& rhs) const
{
}
return true;
}
- void SetObsAng(double a)
+ void setNegativeAngle(void)
{
- obsAngle = fmod(initangle - (a - 180), 360);
+ angle = -1.0;
+ }
+ double setCurrAngle(const PointPair& p)
+ {
+ if (p.vInf->point == vInf1->point)
+ {
+ angleDist = dist1;
+ angle = p.angle;
+ }
+ else if (p.vInf->point == vInf2->point)
+ {
+ angleDist = dist2;
+ angle = p.angle;
+ }
+ else if (p.angle != angle)
+ {
+ COLA_ASSERT(p.angle > angle);
+ angle = p.angle;
+ Point pp;
+ int result = rayIntersectPoint(vInf1->point, vInf2->point,
+ centerPoint, p.vInf->point, &(pp.x), &(pp.y));
+ if (result != DO_INTERSECT)
+ {
+ // This can happen with points that appear to have the
+ // same angle but at are at slightly different positions
+ angleDist = std::min(dist1, dist2);
+ }
+ else
+ {
+ angleDist = euclideanDist(pp, centerPoint);
+ }
+ }
- //db_printf("SetObsAng: %.2f (from init %.2f, a %.2f)\n",
- // obsAngle, initangle, a);
+ return angleDist;
}
VertInf *vInf1;
VertInf *vInf2;
- double initdist;
- double initangle;
- double currdist;
- double currangle;
- double obsAngle;
+ double dist1;
+ double dist2;
+ double angle;
+ double angleDist;
};
-typedef std::set<EdgePair> EdgeSet;
-
-
-static bool ppCompare(PointPair& pp1, PointPair& pp2)
-{
- if (pp1.angle == pp2.angle)
- {
- // If the points are colinear, then order them in increasing
- // distance from the point we are sweeping around.
- return dist(centerPoint, pp1.vInf->point) <
- dist(centerPoint, pp2.vInf->point);
- }
- return pp1.angle < pp2.angle;
-}
+typedef std::list<EdgePair> SweepEdgeList;
#define AHEAD 1
class isBoundingShape
{
public:
- // constructor remembers the value provided
- isBoundingShape(ShapeSet& set)
- : ss(set)
+ // Class instance remembers the ShapeSet.
+ isBoundingShape(ShapeSet& set) :
+ ss(set)
{ }
- // the following is an overloading of the function call operator
+ // The following is an overloading of the function call operator.
bool operator () (const PointPair& pp)
{
if (pp.vInf->id.isShape &&
return false;
}
private:
+ // MSVC wants to generate the assignment operator and the default
+ // constructor, but fails. Therefore we declare them private and
+ // don't implement them.
+ isBoundingShape & operator=(isBoundingShape const &);
+ isBoundingShape();
+
ShapeSet& ss;
};
-static bool sweepVisible(EdgeSet& T, VertInf *currInf, VertInf *lastInf,
- bool lastVisible, double lastAngle, int *blocker)
+static bool sweepVisible(SweepEdgeList& T, const PointPair& point,
+ std::set<unsigned int>& onBorderIDs, int *blocker)
{
+ if (T.empty())
+ {
+ // No blocking edges.
+ return true;
+ }
- if (!lastInf || (lastAngle != centerAngle))
+ Router *router = point.vInf->_router;
+ bool visible = true;
+
+ SweepEdgeList::const_iterator closestIt = T.begin();
+ SweepEdgeList::const_iterator end = T.end();
+ while (closestIt != end)
{
- // Nothing before it on the current ray
- EdgeSet::iterator closestIt = T.begin();
- if (closestIt != T.end())
+ if ((point.vInf->point == closestIt->vInf1->point) ||
+ (point.vInf->point == closestIt->vInf2->point))
{
+ // If the ray intersects just the endpoint of a
+ // blocking edge then ignore that edge.
+ ++closestIt;
+ continue;
+ }
+ break;
+ }
+ if (closestIt == end)
+ {
+ return true;
+ }
- Point &e1 = (*closestIt).vInf1->point;
- Point &e2 = (*closestIt).vInf2->point;
-
- if (segmentIntersect(centerInf->point, currInf->point, e1, e2))
+ if (! point.vInf->id.isShape )
+ {
+ // It's a connector endpoint, so we have to ignore
+ // edges of containing shapes for determining visibility.
+ ShapeSet& rss = router->contains[point.vInf->id];
+ while (closestIt != end)
+ {
+ if (rss.find(closestIt->vInf1->id.objID) == rss.end())
{
- *blocker = (*closestIt).vInf1->id.objID;
- return false;
+ // This is not a containing edge so do the normal
+ // test and then stop.
+ if (point.distance > closestIt->angleDist)
+ {
+ visible = false;
+ }
+ else if ((point.distance == closestIt->angleDist) &&
+ onBorderIDs.find(closestIt->vInf1->id.objID) !=
+ onBorderIDs.end())
+ {
+ // Touching, but centerPoint is on another edge of
+ // shape shape, so count as blocking.
+ visible = false;
+ }
+ break;
}
+ // This was a containing edge, so consider the next along.
+ ++closestIt;
}
}
else
{
- // There was another point before this on the ray (lastInf)
- if (!lastVisible)
+ // Just test to see if this point is closer than the closest
+ // edge blocking this ray.
+ if (point.distance > closestIt->angleDist)
{
- *blocker = -1;
- return false;
+ visible = false;
}
- else
+ else if ((point.distance == closestIt->angleDist) &&
+ onBorderIDs.find(closestIt->vInf1->id.objID) !=
+ onBorderIDs.end())
{
- // Check if there is an edge in T that blocks the ray
- // between lastInf and currInf.
- EdgeSet::iterator tfin = T.end();
- for (EdgeSet::iterator l = T.begin(); l != tfin; ++l)
- {
- Point &e1 = (*l).vInf1->point;
- Point &e2 = (*l).vInf2->point;
+ // Touching, but centerPoint is on another edge of
+ // shape shape, so count as blocking.
+ visible = false;
+ }
+ }
- if (segmentIntersect(lastInf->point, currInf->point, e1, e2))
- {
- *blocker = (*l).vInf1->id.objID;
- return false;
- }
- }
+ if (!visible)
+ {
+ *blocker = (*closestIt).vInf1->id.objID;
+#ifdef LINEDEBUG
+ Point &e1 = (*closestIt).vInf1->point;
+ Point &e2 = (*closestIt).vInf2->point;
+
+ if (router->avoid_screen)
+ {
+ int canx = 151;
+ int cany = 55;
+ lineRGBA(router->avoid_screen, e1.x + canx, e1.y + cany,
+ e2.x + canx, e2.y + cany, 0, 0, 225, 255);
}
+#endif
}
- return true;
+ return visible;
}
centerID = pID;
centerPoint = pPoint;
Point centerPt = pPoint;
- centerAngle = -1;
// List of shape (and maybe endpt) vertices, except p
// Sort list, around
- VertList v;
+ VertSet v;
// Initialise the vertex list
+ ShapeSet& ss = router->contains[centerID];
VertInf *beginVert = router->vertices.connsBegin();
VertInf *endVert = router->vertices.end();
for (VertInf *inf = beginVert; inf != endVert; inf = inf->lstNext)
{
- if (inf->id == centerID)
+ if (inf == centerInf)
+ {
+ // Don't include the center point itself.
+ continue;
+ }
+ else if (inf->id == dummyOrthogID)
{
- // Don't include the center point
+ // Don't include orthogonal dummy vertices.
+ continue;
+ }
+
+ if (!(centerID.isShape) && (ss.find(inf->id.objID) != ss.end()))
+ {
+ // Don't include edge points of containing shapes.
+ unsigned int shapeID = inf->id.objID;
+ db_printf("Center is inside shape %u so ignore shape edges.\n",
+ shapeID);
continue;
}
if (inf->id.isShape)
{
- // Add shape vertex
- v.push_back(inf);
+ // Add shape vertex.
+ v.insert(inf);
}
else
{
- if (router->IncludeEndpoints)
+ // Add connector endpoint.
+ if (centerID.isShape)
{
- if (centerID.isShape)
- {
- // Add endpoint vertex
- v.push_back(inf);
- }
- else
+ // Center is a shape vertex, so add all endpoint vertices.
+ v.insert(inf);
+ }
+ else
+ {
+ // Center is an endpoint, so only include the other
+ // endpoint from the matching connector.
+ VertID partnerID = VertID(centerID.objID, false,
+ (centerID.vn == 1) ? 2 : 1);
+ if (inf->id == partnerID)
{
- // Center is an endpoint, so only include the other
- // endpoint from the matching connector.
- VertID partnerID = VertID(centerID.objID, false,
- (centerID.vn == 1) ? 2 : 1);
- if (inf->id == partnerID)
- {
- v.push_back(inf);
- }
+ v.insert(inf);
}
}
}
}
- // TODO: This should be done with a sorted data type and insertion sort.
- v.sort(ppCompare);
-
- EdgeSet e;
- ShapeSet& ss = router->contains[centerID];
+ std::set<unsigned int> onBorderIDs;
- // And edge to T that intersect the initial ray.
- VertInf *last = router->vertices.end();
- for (VertInf *k = router->vertices.shapesBegin(); k != last; )
+ // Add edges to T that intersect the initial ray.
+ SweepEdgeList e;
+ VertSet::const_iterator vbegin = v.begin();
+ VertSet::const_iterator vend = v.end();
+ for (VertSet::const_iterator t = vbegin; t != vend; ++t)
{
- VertID kID = k->id;
- if (!(centerID.isShape) && (ss.find(kID.objID) != ss.end()))
- {
- unsigned int shapeID = kID.objID;
- db_printf("Center is inside shape %u so ignore shape edges.\n",
- shapeID);
- // One of the endpoints is inside this shape so ignore it.
- while ((k != last) && (k->id.objID == shapeID))
- {
- // And skip the other vertices from this shape.
- k = k->lstNext;
- }
- continue;
- }
+ VertInf *k = t->vInf;
- VertInf *kPrev = k->shPrev;
- if ((centerInf == k) || (centerInf == kPrev))
- {
- k = k->lstNext;
- continue;
- }
+ COLA_ASSERT(centerInf != k);
+ COLA_ASSERT(centerID.isShape || (ss.find(k->id.objID) == ss.end()));
Point xaxis(DBL_MAX, centerInf->point.y);
- if (segmentIntersect(centerInf->point, xaxis, kPrev->point, k->point))
+ VertInf *kPrev = k->shPrev;
+ VertInf *kNext = k->shNext;
+ if (kPrev && (kPrev != centerInf) &&
+ (vecDir(centerInf->point, xaxis, kPrev->point) == AHEAD))
{
- double distance;
- if (vecDir(centerInf->point, xaxis, kPrev->point) == BEHIND)
+ if (segmentIntersect(centerInf->point, xaxis, kPrev->point,
+ k->point))
{
- distance = dist(centerInf->point, kPrev->point);
+ EdgePair intPair = EdgePair(*t, kPrev);
+ e.push_back(intPair);
}
- else
+ if ((vecDir(kPrev->point, k->point, centerInf->point) == 0) &&
+ inBetween(kPrev->point, k->point, centerInf->point))
{
- distance = dist(centerInf->point, k->point);
+ // Record that centerPoint is on an obstacle line.
+ onBorderIDs.insert(k->id.objID);
+ }
+ }
+ else if (kNext && (kNext != centerInf) &&
+ (vecDir(centerInf->point, xaxis, kNext->point) == AHEAD))
+ {
+ if (segmentIntersect(centerInf->point, xaxis, kNext->point,
+ k->point))
+ {
+ EdgePair intPair = EdgePair(*t, kNext);
+ e.push_back(intPair);
+ }
+ if ((vecDir(kNext->point, k->point, centerInf->point) == 0) &&
+ inBetween(kNext->point, k->point, centerInf->point))
+ {
+ // Record that centerPoint is on an obstacle line.
+ onBorderIDs.insert(k->id.objID);
}
-
- EdgePair intPair = EdgePair(k, kPrev, distance, 0.0);
- e.insert(intPair).first;
}
- k = k->lstNext;
}
+ for (SweepEdgeList::iterator c = e.begin(); c != e.end(); ++c)
+ {
+ (*c).setNegativeAngle();
+ }
+
// Start the actual sweep.
db_printf("SWEEP: "); centerID.db_print(); db_printf("\n");
- VertInf *lastInf = NULL;
- double lastAngle = 0;
- bool lastVisible = false;
- int lastBlocker = 0;
-
- isBoundingShape isBounding(router->contains[centerID]);
- VertList::iterator vfst = v.begin();
- VertList::iterator vfin = v.end();
- for (VertList::iterator t = vfst; t != vfin; ++t)
+ isBoundingShape isBounding(ss);
+ for (VertSet::const_iterator t = vbegin; t != vend; ++t)
{
VertInf *currInf = (*t).vInf;
VertID& currID = currInf->id;
Point& currPt = currInf->point;
- centerAngle = (*t).angle;
#ifdef LINEDEBUG
Sint16 ppx = (int) centerPt.x;
Sint16 cx = (int) currPt.x;
Sint16 cy = (int) currPt.y;
+
+ int canx = 151;
+ int cany = 55;
#endif
- double currDist = dist(centerPt, currPt);
- db_printf("Dist: %.1f.\n", currDist);
+ const double& currDist = (*t).distance;
EdgeInf *edge = EdgeInf::existingEdge(centerInf, currInf);
if (edge == NULL)
{
edge = new EdgeInf(centerInf, currInf);
}
- // Ignore vertices from bounding shapes, if sweeping round an endpoint.
- if (!(centerID.isShape) && isBounding(*t))
+
+ for (SweepEdgeList::iterator c = e.begin(); c != e.end(); ++c)
{
- if (router->InvisibilityGrph)
- {
- // if p and t can't see each other, add blank edge
- db_printf("\tSkipping visibility edge... \n\t\t");
- edge->addBlocker(currInf->id.objID);
- edge->db_print();
- }
- continue;
+ (*c).setCurrAngle(*t);
}
+ e.sort();
+ // Check visibility.
+ int blocker = 0;
+ bool currVisible = sweepVisible(e, *t, onBorderIDs, &blocker);
bool cone1 = true, cone2 = true;
if (centerID.isShape)
if (!cone1 || !cone2)
{
- lastInf = NULL;
if (router->InvisibilityGrph)
{
db_printf("\tSetting invisibility edge... \n\t\t");
}
else
{
- int blocker = 0;
- // Check visibility.
- bool currVisible = sweepVisible(e, currInf,
- lastInf, lastVisible, lastAngle, &blocker);
- if (blocker == -1)
- {
- blocker = lastBlocker;
- }
if (currVisible)
{
#ifdef LINEDEBUG
- lineRGBA(avoid_screen, ppx, ppy, cx, cy, 255, 0, 0, 32);
+ if (router->avoid_screen)
+ {
+ lineRGBA(router->avoid_screen, ppx + canx, ppy + cany,
+ cx + canx, cy + cany, 255, 0, 0, 75);
+ SDL_Delay(1000);
+ }
#endif
db_printf("\tSetting visibility edge... \n\t\t");
edge->setDist(currDist);
edge->addBlocker(blocker);
edge->db_print();
}
-
- lastVisible = currVisible;
- lastInf = currInf;
- lastAngle = centerAngle;
- lastBlocker = blocker;
+ }
+
+ if (!(edge->added()) && !(router->InvisibilityGrph))
+ {
+ delete edge;
+ edge = NULL;
}
if (currID.isShape)
{
// This is a shape edge
- Point& prevPt = currInf->shPrev->point;
- Point& nextPt = currInf->shNext->point;
-
- int prevDir = vecDir(centerPt, currPt, prevPt);
- EdgePair prevPair = EdgePair(currInf, currInf->shPrev,
- currDist, centerAngle);
- EdgeSet::iterator ePtr;
- if (prevDir == BEHIND)
+ if (currInf->shPrev != centerInf)
{
- // XXX: Strangely e.find does not return the correct results.
- // ePtr = e.find(prevPair);
- ePtr = std::find(e.begin(), e.end(), prevPair);
- if (ePtr != e.end())
+ Point& prevPt = currInf->shPrev->point;
+ int prevDir = vecDir(centerPt, currPt, prevPt);
+ EdgePair prevPair = EdgePair(*t, currInf->shPrev);
+
+ if (prevDir == BEHIND)
{
- e.erase(ePtr);
+ e.remove(prevPair);
}
- }
- else if ((prevDir == AHEAD) && (currInf->shPrev != centerInf))
- {
- double x = prevPt.x - currPt.x;
- double y = prevPt.y - currPt.y;
- double angle = PointPair::pos_to_angle(x, y);
- prevPair.SetObsAng(angle);
-
- ePtr = e.insert(prevPair).first;
- }
-
-
- int nextDir = vecDir(centerPt, currPt, nextPt);
- EdgePair nextPair = EdgePair(currInf, currInf->shNext,
- currDist, centerAngle);
-
- if (nextDir == BEHIND)
- {
- // XXX: Strangely e.find does not return the correct results.
- // ePtr = e.find(nextPair);
- ePtr = std::find(e.begin(), e.end(), nextPair);
- if (ePtr != e.end())
+ else if (prevDir == AHEAD)
{
- e.erase(ePtr);
+ e.push_front(prevPair);
}
}
- else if ((nextDir == AHEAD) && (currInf->shNext != centerInf))
+
+ if (currInf->shNext != centerInf)
{
- double x = nextPt.x - currPt.x;
- double y = nextPt.y - currPt.y;
- double angle = PointPair::pos_to_angle(x, y);
- nextPair.SetObsAng(angle);
+ Point& nextPt = currInf->shNext->point;
+ int nextDir = vecDir(centerPt, currPt, nextPt);
+ EdgePair nextPair = EdgePair(*t, currInf->shNext);
- ePtr = e.insert(nextPair).first;
+ if (nextDir == BEHIND)
+ {
+ e.remove(nextPair);
+ }
+ else if (nextDir == AHEAD)
+ {
+ e.push_front(nextPair);
+ }
}
}
-
#ifdef LINEDEBUG
- SDL_Flip(avoid_screen);
+ if (router->avoid_screen)
+ {
+ SDL_Flip(router->avoid_screen);
+ }
#endif
}
}
index dd68ac692a38616e19d5445b7a1abc2bef89351b..92e56d922ea6be953a992ce6a1aafcb227e088b8 100644 (file)
* vim: ts=4 sw=4 et tw=0 wm=0
*
* libavoid - Fast, Incremental, Object-avoiding Line Router
- * Copyright (C) 2004-2006 Michael Wybrow <mjwybrow@users.sourceforge.net>
+ *
+ * Copyright (C) 2004-2008 Monash University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
+ * See the file LICENSE.LGPL distributed with the library.
+ *
+ * Licensees holding a valid commercial license may use this file in
+ * accordance with the commercial license agreement provided with the
+ * library.
*
* This library 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
- * Lesser General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Author(s): Michael Wybrow <mjwybrow@users.sourceforge.net>
*/
+
#ifndef AVOID_VISIBILITY_H
#define AVOID_VISIBILITY_H
namespace Avoid {
-
+class ShapeRef;
+class VertInf;
+
extern void vertexVisibility(VertInf *point, VertInf *partner, bool knownNew,
const bool gen_contains = false);
extern void vertexSweep(VertInf *point);
index 4dc0230ff71c27ff4c7293f7e223dd351b09392f..98b2aec26dc23eaf1125a5c04f601746ea35da9f 100644 (file)
--- a/src/sp-conn-end-pair.cpp
+++ b/src/sp-conn-end-pair.cpp
#include <cstring>
#include <string>
+#include <iostream>
+#include <glibmm/stringutils.h>
#include "attributes.h"
#include "sp-conn-end.h"
SPConnEndPair::SPConnEndPair(SPPath *const owner)
- : _invalid_path_connection()
- , _path(owner)
+ : _path(owner)
, _connRef(NULL)
, _connType(SP_CONNECTOR_NOAVOID)
+ , _connCurvature(0.0)
, _transformed_connection()
{
for (unsigned handle_ix = 0; handle_ix <= 1; ++handle_ix) {
delete this->_connEnd[handle_ix];
this->_connEnd[handle_ix] = NULL;
}
- if (_connRef) {
- _connRef->removeFromGraph();
- delete _connRef;
- _connRef = NULL;
- }
-
- _invalid_path_connection.disconnect();
- _transformed_connection.disconnect();
}
void
this->_connEnd[handle_ix]->href = NULL;
this->_connEnd[handle_ix]->ref.detach();
}
+
+ // If the document is being destroyed then the router instance
+ // and the ConnRefs will have been destroyed with it.
+ const bool routerInstanceExists = (_path->document->router != NULL);
+
+ if (_connRef && routerInstanceExists) {
+ _connRef->removeFromGraph();
+ delete _connRef;
+ }
+ _connRef = NULL;
+
+ _transformed_connection.disconnect();
}
void
sp_object_read_attr(object, "inkscape:connector-type");
sp_object_read_attr(object, "inkscape:connection-start");
sp_object_read_attr(object, "inkscape:connection-end");
+ sp_object_read_attr(object, "inkscape:connector-curvature");
}
static void
-avoid_conn_move(Geom::Matrix const */*mp*/, SPItem *moved_item)
+avoid_conn_transformed(Geom::Matrix const */*mp*/, SPItem *moved_item)
{
- // Reroute connector
SPPath *path = SP_PATH(moved_item);
- path->connEndPair.makePathInvalid();
- sp_conn_adjust_invalid_path(path);
+ if (path->connEndPair.isAutoRoutingConn()) {
+ path->connEndPair.tellLibavoidNewEndpoints();
+ }
}
SPConnEndPair::setAttr(unsigned const key, gchar const *const value)
{
if (key == SP_ATTR_CONNECTOR_TYPE) {
- if (value && (strcmp(value, "polyline") == 0)) {
- _connType = SP_CONNECTOR_POLYLINE;
-
- Avoid::Router *router = _path->document->router;
- GQuark itemID = g_quark_from_string(SP_OBJECT(_path)->id);
- _connRef = new Avoid::ConnRef(router, itemID);
- _invalid_path_connection = connectInvalidPath(
- sigc::ptr_fun(&sp_conn_adjust_invalid_path));
- _transformed_connection = _path->connectTransformed(
- sigc::ptr_fun(&avoid_conn_move));
+ if (value && (strcmp(value, "polyline") == 0 || strcmp(value, "orthogonal") == 0)) {
+ int newconnType = strcmp(value, "polyline") ? SP_CONNECTOR_ORTHOGONAL : SP_CONNECTOR_POLYLINE;
+
+ if (!_connRef)
+ {
+ _connType = newconnType;
+ Avoid::Router *router = _path->document->router;
+ GQuark itemID = g_quark_from_string(SP_OBJECT(_path)->id);
+ _connRef = new Avoid::ConnRef(router, itemID);
+ switch (newconnType)
+ {
+ case SP_CONNECTOR_POLYLINE:
+ _connRef->setRoutingType(Avoid::ConnType_PolyLine);
+ break;
+ case SP_CONNECTOR_ORTHOGONAL:
+ _connRef->setRoutingType(Avoid::ConnType_Orthogonal);
+ }
+ _transformed_connection = _path->connectTransformed(
+ sigc::ptr_fun(&avoid_conn_transformed));
+ }
+ else
+ if (newconnType != _connType)
+ {
+ _connType = newconnType;
+ switch (newconnType)
+ {
+ case SP_CONNECTOR_POLYLINE:
+ _connRef->setRoutingType(Avoid::ConnType_PolyLine);
+ break;
+ case SP_CONNECTOR_ORTHOGONAL:
+ _connRef->setRoutingType(Avoid::ConnType_Orthogonal);
+ }
+ sp_conn_reroute_path(_path);
+ }
}
else {
_connType = SP_CONNECTOR_NOAVOID;
_connRef->removeFromGraph();
delete _connRef;
_connRef = NULL;
- _invalid_path_connection.disconnect();
_transformed_connection.disconnect();
}
}
return;
-
+ }
+ else if (key == SP_ATTR_CONNECTOR_CURVATURE) {
+ if (value) {
+ _connCurvature = g_strtod(value, NULL);
+ if (_connRef && _connRef->isInitialised()) {
+ // Redraw the connector, but only if it has been initialised.
+ sp_conn_reroute_path(_path);
+ }
+ }
+ return;
}
unsigned const handle_ix = key - SP_ATTR_CONNECTION_START;
g_assert( handle_ix <= 1 );
- this->_connEnd[handle_ix]->setAttacherHref(value);
+ this->_connEnd[handle_ix]->setAttacherHref(value, _path);
}
void
if (this->_connEnd[handle_ix]->ref.getURI()) {
char const * const attr_strs[] = {"inkscape:connection-start",
"inkscape:connection-end"};
- gchar *uri_string = this->_connEnd[handle_ix]->ref.getURI()->toString();
- repr->setAttribute(attr_strs[handle_ix], uri_string);
- g_free(uri_string);
+ std::ostringstream ostr;
+ ostr<<this->_connEnd[handle_ix]->ref.getURI()->toString()<<"_"<<
+ (this->_connEnd[handle_ix]->type == ConnPointDefault ? "d":"u") <<
+ "_" << this->_connEnd[handle_ix]->id;
+
+
+ repr->setAttribute(attr_strs[handle_ix], ostr.str().c_str());
}
}
+ repr->setAttribute("inkscape:connector-curvature", Glib::Ascii::dtostr(_connCurvature).c_str());
+ if (_connType == SP_CONNECTOR_POLYLINE || _connType == SP_CONNECTOR_ORTHOGONAL)
+ repr->setAttribute("inkscape:connector-type", _connType == SP_CONNECTOR_POLYLINE ? "polyline" : "orthogonal" );
}
void
void
SPConnEndPair::getEndpoints(Geom::Point endPts[]) const {
- SPCurve *curve = _path->curve;
+ SPCurve *curve = _path->original_curve ? _path->original_curve : _path->curve;
SPItem *h2attItem[2];
getAttachedItems(h2attItem);
for (unsigned h = 0; h < 2; ++h) {
if ( h2attItem[h] ) {
- Geom::OptRect bbox = h2attItem[h]->getBounds(sp_item_i2doc_affine(h2attItem[h]));
- if (bbox) {
- endPts[h] = bbox->midpoint();
- } else {
- // FIXME
- endPts[h] = Geom::Point(0, 0);
- }
+ g_assert(h2attItem[h]->avoidRef);
+ endPts[h] = h2attItem[h]->avoidRef->getConnectionPointPos(_connEnd[h]->type, _connEnd[h]->id);
}
else
{
}
}
-sigc::connection
-SPConnEndPair::connectInvalidPath(sigc::slot<void, SPPath *> slot)
-{
- return _invalid_path_signal.connect(slot);
+gdouble
+SPConnEndPair::getCurvature(void) const {
+ return _connCurvature;
}
-static void emitPathInvalidationNotification(void *ptr)
+SPConnEnd**
+SPConnEndPair::getConnEnds(void)
{
- // We emit a signal here rather than just calling the reroute function
- // since this allows all the movement action computation to happen,
- // then all connectors (that require it) will be rerouted. Otherwise,
- // one connector could get rerouted several times as a result of
- // dragging a couple of shapes.
+ return _connEnd;
+}
- SPPath *path = SP_PATH(ptr);
- path->connEndPair._invalid_path_signal.emit(path);
+bool
+SPConnEndPair::isOrthogonal(void) const {
+ return _connType == SP_CONNECTOR_ORTHOGONAL;
}
-void
-SPConnEndPair::rerouteFromManipulation(void)
+
+static void redrawConnectorCallback(void *ptr)
{
- _connRef->makePathInvalid();
- sp_conn_adjust_path(_path);
+ SPPath *path = SP_PATH(ptr);
+ if (path->document == NULL) {
+ // This can happen when the document is being destroyed.
+ return;
+ }
+ sp_conn_redraw_path(path);
}
void
-SPConnEndPair::reroute(void)
+SPConnEndPair::rerouteFromManipulation(void)
{
- sp_conn_adjust_path(_path);
+ sp_conn_reroute_path_immediate(_path);
}
+
// Called from sp_path_update to initialise the endpoints.
void
SPConnEndPair::update(void)
Avoid::Point src(endPt[0][Geom::X], endPt[0][Geom::Y]);
Avoid::Point dst(endPt[1][Geom::X], endPt[1][Geom::Y]);
- _connRef->lateSetup(src, dst);
- _connRef->setCallback(&emitPathInvalidationNotification, _path);
+ _connRef->setEndpoints(src, dst);
+ _connRef->setCallback(&redrawConnectorCallback, _path);
}
// Store the ID of the objects attached to the connector.
storeIds();
void SPConnEndPair::storeIds(void)
{
if (_connEnd[0]->href) {
+ gchar ** href_strarray = NULL;
+ href_strarray = g_strsplit(_connEnd[0]->href, "_", 0);
// href begins with a '#' which we don't want.
- const char *startId = _connEnd[0]->href + 1;
+ const char *startId = href_strarray[0] + 1;
GQuark itemId = g_quark_from_string(startId);
_connRef->setEndPointId(Avoid::VertID::src, itemId);
+ g_strfreev(href_strarray);
}
else {
_connRef->setEndPointId(Avoid::VertID::src, 0);
}
if (_connEnd[1]->href) {
+ gchar ** href_strarray = NULL;
+ href_strarray = g_strsplit(_connEnd[1]->href, "_", 0);
// href begins with a '#' which we don't want.
- const char *endId = _connEnd[1]->href + 1;
+ const char *endId = href_strarray[0] + 1;
GQuark itemId = g_quark_from_string(endId);
_connRef->setEndPointId(Avoid::VertID::tar, itemId);
+ g_strfreev(href_strarray);
}
else {
_connRef->setEndPointId(Avoid::VertID::tar, 0);
_connRef->makePathInvalid();
}
+
+// Redraws the curve along the recalculated route
+// Straight or curved
+void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, const gdouble curvature)
+{
+ bool straight = curvature<1e-3;
+
+ Avoid::PolyLine route = connRef->displayRoute();
+ if (!straight)
+ route = route.curvedPolyline(curvature);
+ connRef->calcRouteDist();
+
+ curve->reset();
+
+ curve->moveto( Geom::Point(route.ps[0].x, route.ps[0].y) );
+ int pn = route.size();
+ for (int i = 1; i < pn; ++i) {
+ Geom::Point p(route.ps[i].x, route.ps[i].y);
+ if (straight) {
+ curve->lineto( p );
+ }
+ else {
+ switch (route.ts[i]) {
+ case 'M':
+ curve->moveto( p );
+ break;
+ case 'L':
+ curve->lineto( p );
+ break;
+ case 'C':
+ g_assert( i+2<pn );
+ curve->curveto( p, Geom::Point(route.ps[i+1].x, route.ps[i+1].y),
+ Geom::Point(route.ps[i+2].x, route.ps[i+2].y) );
+ i+=2;
+ break;
+ }
+ }
+ }
+}
+
+
void
-SPConnEndPair::reroutePath(void)
+SPConnEndPair::tellLibavoidNewEndpoints(const bool processTransaction)
{
if (!isAutoRoutingConn()) {
// Do nothing
return;
}
-
- SPCurve *curve = _path->curve;
+ makePathInvalid();
Geom::Point endPt[2];
getEndpoints(endPt);
Avoid::Point src(endPt[0][Geom::X], endPt[0][Geom::Y]);
Avoid::Point dst(endPt[1][Geom::X], endPt[1][Geom::Y]);
- _connRef->updateEndPoint(Avoid::VertID::src, src);
- _connRef->updateEndPoint(Avoid::VertID::tar, dst);
-
- _connRef->generatePath(src, dst);
-
- Avoid::PolyLine route = _connRef->route();
- _connRef->calcRouteDist();
+ _connRef->setEndpoints(src, dst);
+ if (processTransaction)
+ {
+ _connRef->router()->processTransaction();
+ }
+ return;
+}
- curve->reset();
- curve->moveto(endPt[0]);
- for (int i = 1; i < route.pn; ++i) {
- Geom::Point p(route.ps[i].x, route.ps[i].y);
- curve->lineto(p);
+bool
+SPConnEndPair::reroutePathFromLibavoid(void)
+{
+ if (!isAutoRoutingConn()) {
+ // Do nothing
+ return false;
}
+ SPCurve *curve = _path->original_curve ?_path->original_curve : _path->curve;
+
+ recreateCurve( curve, _connRef, _connCurvature );
+
Geom::Matrix doc2item = sp_item_i2doc_affine(SP_ITEM(_path)).inverse();
curve->transform(doc2item);
+
+ return true;
}
+
/*
Local Variables:
mode:c++
diff --git a/src/sp-conn-end-pair.h b/src/sp-conn-end-pair.h
index 9b9e181db9b3dfc359bc6d0e81643945c1c059fc..3b011ed173a6bb1b99b77be92d8436c5e4c582bb 100644 (file)
--- a/src/sp-conn-end-pair.h
+++ b/src/sp-conn-end-pair.h
}
}
+extern void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, gdouble curvature);
class SPConnEndPair {
public:
void writeRepr(Inkscape::XML::Node *const repr) const;
void getAttachedItems(SPItem *[2]) const;
void getEndpoints(Geom::Point endPts[]) const;
- void reroutePath(void);
+ gdouble getCurvature(void) const;
+ SPConnEnd** getConnEnds(void);
+ bool isOrthogonal(void) const;
+ friend void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, gdouble curvature);
+ void tellLibavoidNewEndpoints(const bool processTransaction = false);
+ bool reroutePathFromLibavoid(void);
void makePathInvalid(void);
void update(void);
bool isAutoRoutingConn(void);
void rerouteFromManipulation(void);
- void reroute(void);
- sigc::connection connectInvalidPath(sigc::slot<void, SPPath *> slot);
-
- // A signal emited by a call back from libavoid. Used to let
- // connectors know when they need to reroute themselves.
- sigc::signal<void, SPPath *> _invalid_path_signal;
- // A sigc connection to listen for connector path invalidation.
- sigc::connection _invalid_path_connection;
private:
SPConnEnd *_connEnd[2];
Avoid::ConnRef *_connRef;
int _connType;
+ gdouble _connCurvature;
// A sigc connection for transformed signal.
sigc::connection _transformed_connection;
// _connType options:
enum {
- SP_CONNECTOR_NOAVOID, // Basic connector - a straight line.
- SP_CONNECTOR_POLYLINE // Object avoiding polyline.
+ SP_CONNECTOR_NOAVOID, // Basic connector - a straight line.
+ SP_CONNECTOR_POLYLINE, // Object avoiding polyline.
+ SP_CONNECTOR_ORTHOGONAL // Object avoiding orthogonal polyline (only horizontal and verical segments).
};
diff --git a/src/sp-conn-end.cpp b/src/sp-conn-end.cpp
index 0b420a98e09ec62a74ccadb8f9d1c972f4cc19f4..52914ee9e0bab7b7f770a40820526ef07c9c53b4 100644 (file)
--- a/src/sp-conn-end.cpp
+++ b/src/sp-conn-end.cpp
#include "2geom/path-intersection.h"
-static void change_endpts(SPCurve *const curve, Geom::Point const h2endPt[2]);
+static void change_endpts(SPCurve *const curve, double const endPos[2]);
SPConnEnd::SPConnEnd(SPObject *const owner) :
ref(owner),
@@ -39,45 +39,37 @@ get_nearest_common_ancestor(SPObject const *const obj, SPItem const *const objs[
}
-static bool try_get_intersect_point_with_item_recursive(SPCurve *conn_curve, SPItem& item,
- const Geom::Matrix& item_transform, const bool at_start, double* intersect_pos,
- unsigned *intersect_index) {
-
- double initial_pos = (at_start) ? 0.0 : std::numeric_limits<double>::max();
+static bool try_get_intersect_point_with_item_recursive(Geom::PathVector& conn_pv, SPItem* item,
+ const Geom::Matrix& item_transform, double& intersect_pos) {
+ double initial_pos = intersect_pos;
// if this is a group...
- if (SP_IS_GROUP(&item)) {
- SPGroup* group = SP_GROUP(&item);
+ if (SP_IS_GROUP(item)) {
+ SPGroup* group = SP_GROUP(item);
// consider all first-order children
- double child_pos = initial_pos;
- unsigned child_index;
+ double child_pos = std::numeric_limits<double>::max();
for (GSList const* i = sp_item_group_item_list(group); i != NULL; i = i->next) {
SPItem* child_item = SP_ITEM(i->data);
- try_get_intersect_point_with_item_recursive(conn_curve, *child_item,
- item_transform * child_item->transform, at_start, &child_pos, &child_index);
- if (fabs(initial_pos - child_pos) > fabs(initial_pos - *intersect_pos)) {
- // It is further away from the initial point than the current intersection
- // point (i.e. the "outermost" intersection), so use this one.
- *intersect_pos = child_pos;
- *intersect_index = child_index;
- }
+ try_get_intersect_point_with_item_recursive(conn_pv, child_item,
+ item_transform * child_item->transform, child_pos);
+ if (intersect_pos > child_pos)
+ intersect_pos = child_pos;
}
- return *intersect_pos != initial_pos;
+ return intersect_pos != initial_pos;
}
- // if this is a shape...
- if (!SP_IS_SHAPE(&item)) return false;
+ // if this is not a shape, nothing to be done
+ if (!SP_IS_SHAPE(item)) return false;
// make sure it has an associated curve
- SPCurve* item_curve = sp_shape_get_curve(SP_SHAPE(&item));
+ SPCurve* item_curve = sp_shape_get_curve(SP_SHAPE(item));
if (!item_curve) return false;
// apply transformations (up to common ancestor)
item_curve->transform(item_transform);
const Geom::PathVector& curve_pv = item_curve->get_pathvector();
- const Geom::PathVector& conn_pv = conn_curve->get_pathvector();
Geom::CrossingSet cross = crossings(conn_pv, curve_pv);
// iterate over all Crossings
for (Geom::CrossingSet::const_iterator i = cross.begin(); i != cross.end(); i++) {
@@ -85,18 +77,14 @@ static bool try_get_intersect_point_with_item_recursive(SPCurve *conn_curve, SPI
for (Geom::Crossings::const_iterator i = cr.begin(); i != cr.end(); i++) {
const Geom::Crossing& cr_pt = *i;
- if (fabs(initial_pos - cr_pt.ta) > fabs(initial_pos - *intersect_pos)) {
- // It is further away from the initial point than the current intersection
- // point (i.e. the "outermost" intersection), so use this one.
- *intersect_pos = cr_pt.ta;
- *intersect_index = cr_pt.a;
- }
+ if ( intersect_pos > cr_pt.ta)
+ intersect_pos = cr_pt.ta;
}
}
item_curve->unref();
- return *intersect_pos != initial_pos;
+ return intersect_pos != initial_pos;
}
@@ -104,22 +92,36 @@ static bool try_get_intersect_point_with_item_recursive(SPCurve *conn_curve, SPI
// and the item given. If the item is a group, then the component items are considered.
// The transforms given should be to a common ancestor of both the path and item.
//
-static bool try_get_intersect_point_with_item(SPPath& conn, SPItem& item,
+static bool try_get_intersect_point_with_item(SPPath* conn, SPItem* item,
const Geom::Matrix& item_transform, const Geom::Matrix& conn_transform,
- const bool at_start, double* intersect_pos, unsigned *intersect_index) {
+ const bool at_start, double& intersect_pos) {
- // We start with the intersection point either at the beginning or end of the
- // path, depending on whether we are considering the source or target endpoint.
- *intersect_pos = (at_start) ? 0.0 : std::numeric_limits<double>::max();
-
// Copy the curve and apply transformations up to common ancestor.
- SPCurve* conn_curve = conn.curve->copy();
+ SPCurve* conn_curve = conn->curve->copy();
conn_curve->transform(conn_transform);
+ Geom::PathVector conn_pv = conn_curve->get_pathvector();
+
+ // If this is not the starting point, use Geom::Path::reverse() to reverse the path
+ if (!at_start)
+ {
+ // connectors are actually a single path, so consider the first element from a Geom::PathVector
+ conn_pv[0] = conn_pv[0].reverse();
+ }
+
+ // We start with the intersection point at the end of the path
+ intersect_pos = conn_pv[0].size();
+
// Find the intersection.
- bool result = try_get_intersect_point_with_item_recursive(conn_curve, item, item_transform,
- at_start, intersect_pos, intersect_index);
-
+ bool result = try_get_intersect_point_with_item_recursive(conn_pv, item, item_transform, intersect_pos);
+
+ if (!result)
+ // No intersection point has been found (why?)
+ // just default to connector end
+ intersect_pos = 0;
+ // If not at the starting point, recompute position with respect to original path
+ if (!at_start)
+ intersect_pos = conn_pv[0].size() - intersect_pos;
// Free the curve copy.
conn_curve->unref();
static void
-sp_conn_end_move_compensate(Geom::Matrix const */*mp*/, SPItem */*moved_item*/,
- SPPath *const path,
- bool const updatePathRepr = true)
+sp_conn_get_route_and_redraw(SPPath *const path,
+ const bool updatePathRepr = true)
{
- // TODO: SPItem::getBounds gives the wrong result for some objects
- // that have internal representations that are updated later
- // by the sp_*_update functions, e.g., text.
- sp_document_ensure_up_to_date(path->document);
-
// Get the new route around obstacles.
- path->connEndPair.reroutePath();
-
+ bool rerouted = path->connEndPair.reroutePathFromLibavoid();
+ if (!rerouted) {
+ return;
+ }
+
SPItem *h2attItem[2];
path->connEndPair.getAttachedItems(h2attItem);
@@ -147,72 +146,80 @@ sp_conn_end_move_compensate(Geom::Matrix const */*mp*/, SPItem */*moved_item*/,
SPObject const *const ancestor = get_nearest_common_ancestor(path_item, h2attItem);
Geom::Matrix const path2anc(i2anc_affine(path_item, ancestor));
- Geom::Point endPts[2] = { *(path->curve->first_point()), *(path->curve->last_point()) };
-
+ // Set sensible values incase there the connector ends are not
+ // attached to any shapes.
+ Geom::PathVector conn_pv = path->curve->get_pathvector();
+ double endPos[2] = { 0, conn_pv[0].size() };
+
+ SPConnEnd** _connEnd = path->connEndPair.getConnEnds();
for (unsigned h = 0; h < 2; ++h) {
- if (h2attItem[h]) {
- // For each attached object, change the corresponding point to be
- // at the outermost intersection with the object's path.
- double intersect_pos;
- unsigned intersect_index;
+ if (h2attItem[h] && _connEnd[h]->type == ConnPointDefault && _connEnd[h]->id == ConnPointPosCC) {
Geom::Matrix h2i2anc = i2anc_affine(h2attItem[h], ancestor);
- if ( try_get_intersect_point_with_item(*path, *h2attItem[h], h2i2anc, path2anc,
- (h == 0), &intersect_pos, &intersect_index) ) {
- const Geom::PathVector& curve = path->curve->get_pathvector();
- endPts[h] = curve[intersect_index].pointAt(intersect_pos);
- }
+ try_get_intersect_point_with_item(path, h2attItem[h], h2i2anc, path2anc,
+ (h == 0), endPos[h]);
}
}
- change_endpts(path->curve, endPts);
+ change_endpts(path->curve, endPos);
if (updatePathRepr) {
- path->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
path->updateRepr();
+ path->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
}
}
-// TODO: This triggering of makeInvalidPath could be cleaned up to be
-// another option passed to move_compensate.
+
static void
-sp_conn_end_shape_move_compensate(Geom::Matrix const *mp, SPItem *moved_item,
+sp_conn_end_shape_move(Geom::Matrix const */*mp*/, SPItem */*moved_item*/,
SPPath *const path)
{
if (path->connEndPair.isAutoRoutingConn()) {
- path->connEndPair.makePathInvalid();
+ path->connEndPair.tellLibavoidNewEndpoints();
}
- sp_conn_end_move_compensate(mp, moved_item, path);
}
void
-sp_conn_adjust_invalid_path(SPPath *const path)
+sp_conn_reroute_path(SPPath *const path)
{
- sp_conn_end_move_compensate(NULL, NULL, path);
+ if (path->connEndPair.isAutoRoutingConn()) {
+ path->connEndPair.tellLibavoidNewEndpoints();
+ }
}
+
void
-sp_conn_adjust_path(SPPath *const path)
+sp_conn_reroute_path_immediate(SPPath *const path)
{
if (path->connEndPair.isAutoRoutingConn()) {
- path->connEndPair.makePathInvalid();
+ bool processTransaction = true;
+ path->connEndPair.tellLibavoidNewEndpoints(processTransaction);
}
// Don't update the path repr or else connector dragging is slowed by
// constant update of values to the xml editor, and each step is also
// needlessly remembered by undo/redo.
bool const updatePathRepr = false;
- sp_conn_end_move_compensate(NULL, NULL, path, updatePathRepr);
+ sp_conn_get_route_and_redraw(path, updatePathRepr);
+}
+
+void sp_conn_redraw_path(SPPath *const path)
+{
+ sp_conn_get_route_and_redraw(path);
}
static void
-change_endpts(SPCurve *const curve, Geom::Point const h2endPt[2])
+change_endpts(SPCurve *const curve, double const endPos[2])
{
-#if 0
- curve->reset();
- curve->moveto(h2endPt[0]);
- curve->lineto(h2endPt[1]);
-#else
- curve->move_endpoints(h2endPt[0], h2endPt[1]);
-#endif
+ // Use Geom::Path::portion to cut the curve at the end positions
+ if (endPos[0] > endPos[1])
+ {
+ // Path is "negative", reset the curve and return
+ curve->reset();
+ return;
+ }
+ const Geom::Path& old_path = curve->get_pathvector()[0];
+ Geom::PathVector new_path_vector;
+ new_path_vector.push_back(old_path.portion(endPos[0], endPos[1]));
+ curve->set_pathvector(new_path_vector);
}
static void
}
void
-SPConnEnd::setAttacherHref(gchar const *value)
+SPConnEnd::setAttacherHref(gchar const *value, SPPath* path)
{
if ( value && href && ( strcmp(value, href) == 0 ) ) {
/* No change, do nothing. */
} else {
- g_free(href);
- href = NULL;
- if (value) {
- // First, set the href field, because sp_conn_end_href_changed will need it.
- href = g_strdup(value);
-
- // Now do the attaching, which emits the changed signal.
- try {
- ref.attach(Inkscape::URI(value));
- } catch (Inkscape::BadURIException &e) {
- /* TODO: Proper error handling as per
- * http://www.w3.org/TR/SVG11/implnote.html#ErrorProcessing. (Also needed for
- * sp-use.) */
- g_warning("%s", e.what());
+ if (!value)
+ {
+ ref.detach();
+ g_free(href);
+ href = NULL;
+ }
+ else
+ {
+
+ /* References to the connection points have the following format
+ #svguri_t_id, where #svguri is the id of the item the
+ connector is attached to, t is the type of the point, which
+ can be either "d" for default or "u" for user-defined, and
+ id is the local (inside the item) id of the connection point.
+ In the case of default points id represents the position on the
+ item (i.e. Top-Left, Centre-Centre, etc.).
+ */
+
+ gchar ** href_strarray = NULL;
+ if (href)
+ href_strarray = g_strsplit(href, "_", 0);
+ gchar ** value_strarray = g_strsplit(value, "_", 0);
+
+ g_free(href);
+ href = NULL;
+
+ bool changed = false;
+ bool validRef = true;
+
+ if ( !href_strarray || g_strcmp0(href_strarray[0], value_strarray[0]) != 0 )
+ {
+ // The href has changed, so update it.
+ changed = true;
+ // Set the href field, because sp_conn_end_href_changed will need it.
+ href = g_strdup(value);
+ // Now do the attaching, which emits the changed signal.
+ try {
+ ref.attach(Inkscape::URI(value_strarray[0]));
+ } catch (Inkscape::BadURIException &e) {
+ /* TODO: Proper error handling as per
+ * http://www.w3.org/TR/SVG11/implnote.html#ErrorProcessing. (Also needed for
+ * sp-use.) */
+ g_warning("%s", e.what());
+ validRef = false;
+ }
+ }
+ // Check to see if the connection point changed and update it.
+ //
+
+ if ( !value_strarray[1] )
+ {
+ /* Treat the old references to connection points
+ as default points that connect to the centre
+ of the item.
+ */
+ if ( type != ConnPointDefault )
+ {
+ type = ConnPointDefault;
+ changed = true;
+ }
+ if ( id != ConnPointPosCC )
+ {
+ id = ConnPointPosCC;
+ changed = true;
+ }
+ }
+ else
+ {
+ switch (value_strarray[1][0])
+ {
+ case 'd':
+ if ( type != ConnPointDefault )
+ {
+ type = ConnPointDefault;
+ changed = true;
+ }
+ break;
+ case 'u':
+ if ( type != ConnPointUserDefined)
+ {
+ type = ConnPointUserDefined;
+ changed = true;
+ }
+ break;
+ default:
+ g_warning("Bad reference to a connection point.");
+ validRef = false;
+ }
+ if ( value_strarray[2] )
+ {
+ int newId = (int) g_ascii_strtod( value_strarray[2], 0 );
+ if ( id != newId )
+ {
+ id = newId;
+ changed = true;
+ }
+
+ }
+ else
+ {
+ // We have a malformed reference to a connection point,
+ // emit a warning, clear href and detach ref.
+ changed = true;
+ g_warning("Bad reference to a connection point.");\
+ validRef = false;
+ }
+ }
+
+ if ( changed )
+ {
+ // We still have to verify that the reference to the
+ // connection point is a valid one.
+
+ // Get the item the connector is attached to
+ SPItem* item = ref.getObject();
+ if ( item && !item->avoidRef->isValidConnPointId( type, id ) )
+ {
+ g_warning("Bad reference to a connection point.");
+ validRef = false;
+ }
+/* else
+ // Update the connector
+ if (path->connEndPair.isAutoRoutingConn()) {
+ path->connEndPair.tellLibavoidNewEndpoints();
+ }*/
+ }
+
+ if ( !validRef )
+ {
ref.detach();
+ g_free(href);
+ href = NULL;
}
- } else {
- ref.detach();
+ else
+ if (!href)
+ href = g_strdup(value);
+
+ g_strfreev(href_strarray);
+ g_strfreev(value_strarray);
}
}
}
= SP_OBJECT(refobj)->connectDelete(sigc::bind(sigc::ptr_fun(&sp_conn_end_deleted),
SP_OBJECT(path), handle_ix));
connEnd._transformed_connection
- = SP_ITEM(refobj)->connectTransformed(sigc::bind(sigc::ptr_fun(&sp_conn_end_shape_move_compensate),
+ = SP_ITEM(refobj)->connectTransformed(sigc::bind(sigc::ptr_fun(&sp_conn_end_shape_move),
path));
}
}
diff --git a/src/sp-conn-end.h b/src/sp-conn-end.h
index a565b6404f08146a9d660e978ef14c23e808ae93..5e9dbb9dae35620eb7d5a21154fd3552bf8bb694 100644 (file)
--- a/src/sp-conn-end.h
+++ b/src/sp-conn-end.h
#include <sigc++/connection.h>
#include "sp-use-reference.h"
+#include "connection-points.h"
+#include "conn-avoid-ref.h"
class SPConnEnd {
SPUseReference ref;
gchar *href;
+ /* In the following, type refers to connection point type,
+ i.e. default (one of the 9 combinations of right, centre,
+ left, top, bottom) or user-defined. The id serves to identify
+ the connection point in a list of connection points.
+ */
+
+ ConnPointType type;
+ int id;
+
/** Change of href string (not a modification of the attributes of the referrent). */
sigc::connection _changed_connection;
/** A sigc connection for transformed signal, used to do move compensation. */
sigc::connection _transformed_connection;
- void setAttacherHref(gchar const *);
+ void setAttacherHref(gchar const *, SPPath *);
private:
SPConnEnd(SPConnEnd const &);
void sp_conn_end_href_changed(SPObject *old_ref, SPObject *ref,
SPConnEnd *connEnd, SPPath *path, unsigned const handle_ix);
-void sp_conn_adjust_invalid_path(SPPath *const path);
-void sp_conn_adjust_path(SPPath *const path);
+void sp_conn_reroute_path(SPPath *const path);
+void sp_conn_reroute_path_immediate(SPPath *const path);
+void sp_conn_redraw_path(SPPath *const path);
void sp_conn_end_detach(SPObject *const owner, unsigned const handle_ix);
diff --git a/src/sp-item.cpp b/src/sp-item.cpp
index 3950482803a544b3efe179f976b39ad03204de72..9f7157b995561f8e8b6aeef0765ce67841f1b391 100644 (file)
--- a/src/sp-item.cpp
+++ b/src/sp-item.cpp
@@ -412,6 +412,7 @@ sp_item_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
sp_object_read_attr(object, "inkscape:transform-center-x");
sp_object_read_attr(object, "inkscape:transform-center-y");
sp_object_read_attr(object, "inkscape:connector-avoid");
+ sp_object_read_attr(object, "inkscape:connection-points");
if (((SPObjectClass *) (parent_class))->build) {
(* ((SPObjectClass *) (parent_class))->build)(object, document, repr);
case SP_ATTR_CONNECTOR_AVOID:
item->avoidRef->setAvoid(value);
break;
+ case SP_ATTR_CONNECTION_POINTS:
+ item->avoidRef->setConnectionPoints(value);
+ break;
case SP_ATTR_TRANSFORM_CENTER_X:
if (value) {
item->transform_center_x = g_strtod(value, NULL);
index 6b9e512a144d23797a8cc7cf9be452aeac74db38..431d5d97b15cbc268b2f398f886c6042ca056dc1 100644 (file)
--- a/src/svg/stringstream.cpp
+++ b/src/svg/stringstream.cpp
return os;
}
+Inkscape::SVGIStringStream::SVGIStringStream():std::istringstream()
+{
+ this->imbue(std::locale::classic());
+ this->setf(std::ios::showpoint);
+
+ /* This one is (currently) needed though, as we currently use ostr.precision as a sort of
+ variable for storing the desired precision: see our two precision methods and our operator<<
+ methods for float and double. */
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ this->precision(prefs->getInt("/options/svgoutput/numericprecision", 8));
+}
+
+Inkscape::SVGIStringStream::SVGIStringStream(const std::string& str):std::istringstream(str)
+{
+ this->imbue(std::locale::classic());
+ this->setf(std::ios::showpoint);
+
+ /* This one is (currently) needed though, as we currently use ostr.precision as a sort of
+ variable for storing the desired precision: see our two precision methods and our operator<<
+ methods for float and double. */
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ this->precision(prefs->getInt("/options/svgoutput/numericprecision", 8));
+}
+
+
/*
Local Variables:
mode:c++
diff --git a/src/svg/stringstream.h b/src/svg/stringstream.h
index 5fbf1976c3b70b942f1d0785df247e5f22e13b91..60ed74ecbef249d5e7f9974a78c9ea98ea8b4567 100644 (file)
--- a/src/svg/stringstream.h
+++ b/src/svg/stringstream.h
}
};
+class SVGIStringStream:public std::istringstream {
+
+public:
+ SVGIStringStream();
+ SVGIStringStream(const std::string &str);
+};
+
}
Inkscape::SVGOStringStream &operator<<(Inkscape::SVGOStringStream &os, float d);
diff --git a/src/ui/icon-names.h b/src/ui/icon-names.h
index 0388b200f48036450136c499b7197e5a875626e1..76e76ea34aba168665baad11fbd36e89cf041ee4 100644 (file)
--- a/src/ui/icon-names.h
+++ b/src/ui/icon-names.h
"color-picker"
#define INKSCAPE_ICON_COLOR_REMOVE \
"color-remove"
+#define INKSCAPE_ICON_CONNECTOR_EDIT \
+ "connector-edit"
#define INKSCAPE_ICON_CONNECTOR_AVOID \
"connector-avoid"
#define INKSCAPE_ICON_CONNECTOR_IGNORE \
"connector-ignore"
+#define INKSCAPE_ICON_CONNECTOR_ORTHOGONAL \
+ "connector-orthogonal"
+#define INKSCAPE_ICON_CONNECTOR_NEW_CONNPOINT \
+ "connector-new-connpoint"
+#define INKSCAPE_ICON_CONNECTOR_REMOVE_CONNPOINT \
+ "connector-remove-connpoint"
#define INKSCAPE_ICON_DIALOG_ALIGN_AND_DISTRIBUTE \
"dialog-align-and-distribute"
#define INKSCAPE_ICON_DIALOG_FILL_AND_STROKE \
index 5f163d138ce7133253130e0b275ca51108ab3b4e..b10c60c7916ca59fbf8c08f72b0bec6c69057bc2 100644 (file)
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
" </toolbar>"
" <toolbar name='ConnectorToolbar'>"
+ " <toolitem action='ConnectorEditModeAction' />"
" <toolitem action='ConnectorAvoidAction' />"
" <toolitem action='ConnectorIgnoreAction' />"
+ " <toolitem action='ConnectorOrthogonalAction' />"
+ " <toolitem action='ConnectorCurvatureAction' />"
" <toolitem action='ConnectorSpacingAction' />"
" <toolitem action='ConnectorGraphAction' />"
" <toolitem action='ConnectorLengthAction' />"
" <toolitem action='ConnectorDirectedAction' />"
" <toolitem action='ConnectorOverlapAction' />"
+ " <toolitem action='ConnectorNewConnPointAction' />"
+ " <toolitem action='ConnectorRemoveConnPointAction' />"
" </toolbar>"
"</ui>"
//## Connector ##
//#########################
+static void sp_connector_mode_toggled( GtkToggleAction* act, GtkObject */*tbl*/ )
+{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setBool("/tools/connector/mode",
+ gtk_toggle_action_get_active( act ));
+}
+
static void sp_connector_path_set_avoid(void)
{
cc_selection_set_avoid(true);
cc_selection_set_avoid(false);
}
+static void sp_connector_orthogonal_toggled( GtkToggleAction* act, GObject *tbl )
+{
+ SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
+ Inkscape::Selection * selection = sp_desktop_selection(desktop);
+ SPDocument *doc = sp_desktop_document(desktop);
+
+ if (!sp_document_get_undo_sensitive(doc))
+ {
+ return;
+ }
+
+
+ // quit if run by the _changed callbacks
+ if (g_object_get_data( tbl, "freeze" )) {
+ return;
+ }
+
+ // in turn, prevent callbacks from responding
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
+
+ bool is_orthog = gtk_toggle_action_get_active( act );
+ gchar orthog_str[] = "orthogonal";
+ gchar polyline_str[] = "polyline";
+ gchar *value = is_orthog ? orthog_str : polyline_str ;
+
+ bool modmade = false;
+ GSList *l = (GSList *) selection->itemList();
+ while (l) {
+ SPItem *item = (SPItem *) l->data;
+
+ if (cc_item_is_connector(item)) {
+ sp_object_setAttribute(item, "inkscape:connector-type",
+ value, false);
+ item->avoidRef->handleSettingChange();
+ modmade = true;
+ }
+ l = l->next;
+ }
+
+ if (!modmade)
+ {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setBool("/tools/connector/orthogonal", is_orthog);
+ }
+
+ sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR,
+ is_orthog ? _("Set connector type: orthogonal"): _("Set connector type: polyline"));
+
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
+}
+
+static void connector_curvature_changed(GtkAdjustment *adj, GObject* tbl)
+{
+ SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
+ Inkscape::Selection * selection = sp_desktop_selection(desktop);
+ SPDocument *doc = sp_desktop_document(desktop);
+
+ if (!sp_document_get_undo_sensitive(doc))
+ {
+ return;
+ }
+
+
+ // quit if run by the _changed callbacks
+ if (g_object_get_data( tbl, "freeze" )) {
+ return;
+ }
+
+ // in turn, prevent callbacks from responding
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
+
+ gdouble newValue = gtk_adjustment_get_value(adj);
+ gchar value[G_ASCII_DTOSTR_BUF_SIZE];
+ g_ascii_dtostr(value, G_ASCII_DTOSTR_BUF_SIZE, newValue);
+
+ bool modmade = false;
+ GSList *l = (GSList *) selection->itemList();
+ while (l) {
+ SPItem *item = (SPItem *) l->data;
+
+ if (cc_item_is_connector(item)) {
+ sp_object_setAttribute(item, "inkscape:connector-curvature",
+ value, false);
+ item->avoidRef->handleSettingChange();
+ modmade = true;
+ }
+ l = l->next;
+ }
+
+ if (!modmade)
+ {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setDouble(Glib::ustring("/tools/connector/curvature"), newValue);
+ }
+
+ sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR,
+ _("Change connector curvature"));
+
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
+}
static void connector_spacing_changed(GtkAdjustment *adj, GObject* tbl)
if (g_object_get_data(G_OBJECT(tbl), "freeze")) {
return;
}
- if (strcmp(name, "inkscape:connector-spacing") != 0) {
- return;
+ if (strcmp(name, "inkscape:connector-spacing") == 0)
+ {
+ GtkAdjustment *adj = (GtkAdjustment*)
+ gtk_object_get_data(GTK_OBJECT(tbl), "spacing");
+ gdouble spacing = defaultConnSpacing;
+ sp_repr_get_double(repr, "inkscape:connector-spacing", &spacing);
+
+ gtk_adjustment_set_value(adj, spacing);
+ gtk_adjustment_value_changed(adj);
}
- GtkAdjustment *adj = (GtkAdjustment*)
- gtk_object_get_data(GTK_OBJECT(tbl), "spacing");
- gdouble spacing = defaultConnSpacing;
- sp_repr_get_double(repr, "inkscape:connector-spacing", &spacing);
+ spinbutton_defocus(GTK_OBJECT(tbl));
+}
- gtk_adjustment_set_value(adj, spacing);
- gtk_adjustment_value_changed(adj);
+static void sp_connector_new_connection_point(GtkWidget *, GObject *tbl)
+{
+ SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
+ SPConnectorContext* cc = SP_CONNECTOR_CONTEXT(desktop->event_context);
- spinbutton_defocus(GTK_OBJECT(tbl));
+ if (cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE)
+ cc_create_connection_point(cc);
}
+static void sp_connector_remove_connection_point(GtkWidget *, GObject *tbl)
+{
+ SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
+ SPConnectorContext* cc = SP_CONNECTOR_CONTEXT(desktop->event_context);
+
+ if (cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE)
+ cc_remove_connection_point(cc);
+}
static Inkscape::XML::NodeEventVector connector_tb_repr_events = {
NULL, /* child_added */
NULL /* order_changed */
};
+static void sp_connector_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl)
+{
+ GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "curvature" ) );
+ GtkToggleAction *act = GTK_TOGGLE_ACTION( g_object_get_data( tbl, "orthogonal" ) );
+ SPItem *item = selection->singleItem();
+ if (SP_IS_PATH(item))
+ {
+ gdouble curvature = SP_PATH(item)->connEndPair.getCurvature();
+ bool is_orthog = SP_PATH(item)->connEndPair.isOrthogonal();
+ gtk_toggle_action_set_active(act, is_orthog);
+ gtk_adjustment_set_value(adj, curvature);
+ }
+
+}
static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder )
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
Inkscape::IconSize secondarySize = prefToSize("/toolbox/secondary", 1);
+ // Editing mode toggle button
+ {
+ InkToggleAction* act = ink_toggle_action_new( "ConnectorEditModeAction",
+ _("EditMode"),
+ _("Switch between connection point editing and connector drawing mode"),
+ INKSCAPE_ICON_CONNECTOR_EDIT,
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+
+ bool tbuttonstate = prefs->getBool("/tools/connector/mode");
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), ( tbuttonstate ? TRUE : FALSE ));
+ g_object_set_data( holder, "mode", act );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_connector_mode_toggled), holder );
+ }
+
+
{
InkAction* inky = ink_action_new( "ConnectorAvoidAction",
_("Avoid"),
@@ -7233,17 +7391,42 @@ static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainA
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
}
+ // Orthogonal connectors toggle button
+ {
+ InkToggleAction* act = ink_toggle_action_new( "ConnectorOrthogonalAction",
+ _("Orthogonal"),
+ _("Make connector orthogonal or polyline"),
+ INKSCAPE_ICON_CONNECTOR_ORTHOGONAL,
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+
+ bool tbuttonstate = prefs->getBool("/tools/connector/orthogonal");
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), ( tbuttonstate ? TRUE : FALSE ));
+ g_object_set_data( holder, "orthogonal", act );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_connector_orthogonal_toggled), holder );
+ }
+
EgeAdjustmentAction* eact = 0;
+ // Curvature spinbox
+ eact = create_adjustment_action( "ConnectorCurvatureAction",
+ _("Connector Curvature"), _("Curvature:"),
+ _("The amount of connectors curvature"),
+ "/tools/connector/curvature", defaultConnCurvature,
+ GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-curvature",
+ 0, 100, 1.0, 10.0,
+ 0, 0, 0,
+ connector_curvature_changed, 1, 0 );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
// Spacing spinbox
eact = create_adjustment_action( "ConnectorSpacingAction",
- _("Connector Spacing"), _("Spacing:"),
- _("The amount of space left around objects by auto-routing connectors"),
- "/tools/connector/spacing", defaultConnSpacing,
- GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-spacing",
- 0, 100, 1.0, 10.0,
- 0, 0, 0,
- connector_spacing_changed, 1, 0 );
+ _("Connector Spacing"), _("Spacing:"),
+ _("The amount of space left around objects by auto-routing connectors"),
+ "/tools/connector/spacing", defaultConnSpacing,
+ GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-spacing",
+ 0, 100, 1.0, 10.0,
+ 0, 0, 0,
+ connector_spacing_changed, 1, 0 );
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
// Graph (connector network) layout
@@ -7282,6 +7465,8 @@ static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainA
gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), ( tbuttonstate ? TRUE : FALSE ));
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_directed_graph_layout_toggled), holder );
+ sigc::connection *connection = new sigc::connection(sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_connector_toolbox_selection_changed), (GObject *)holder))
+ );
}
// Avoid overlaps toggle button
@@ -7299,6 +7484,31 @@ static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainA
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_nooverlaps_graph_layout_toggled), holder );
}
+
+ // New connection point button
+ {
+ InkAction* inky = ink_action_new( "ConnectorNewConnPointAction",
+ _("New connection point"),
+ _("Add a new connection point to the currently selected item"),
+ INKSCAPE_ICON_CONNECTOR_NEW_CONNPOINT,
+ secondarySize );
+ g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_new_connection_point), holder );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ }
+
+ // Remove selected connection point button
+
+ {
+ InkAction* inky = ink_action_new( "ConnectorRemoveConnPointAction",
+ _("Remove connection point"),
+ _("Remove the currently selected connection point"),
+ INKSCAPE_ICON_CONNECTOR_REMOVE_CONNPOINT,
+ secondarySize );
+ g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_remove_connection_point), holder );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ }
+
+
// Code to watch for changes to the connector-spacing attribute in
// the XML.
Inkscape::XML::Node *repr = SP_OBJECT_REPR(desktop->namedview);