From 42b53baed61b6b06f33ecfa440a747382eb350df Mon Sep 17 00:00:00 2001 From: "Arcadie M. Cracan" Date: Wed, 2 Dec 2009 22:26:44 +0200 Subject: [PATCH] Merge GSoC2009 Connectors into trunk --- po/inkscape.pot | 22382 ------------------------------ share/icons/icons.svg | 426 +- src/CMakeLists.txt | 1 + src/Makefile_insert | 1 + src/attributes.cpp | 2 + src/attributes.h | 2 + src/conn-avoid-ref.cpp | 398 +- src/conn-avoid-ref.h | 16 +- src/connector-context.cpp | 1192 +- src/connector-context.h | 30 +- src/document.cpp | 98 +- src/document.h | 3 + src/graphlayout/graphlayout.cpp | 1 + src/libavoid/CMakeLists.txt | 2 + src/libavoid/Makefile_insert | 14 +- src/libavoid/connector.cpp | 1695 ++- src/libavoid/connector.h | 380 +- src/libavoid/debug.h | 19 +- src/libavoid/geometry.cpp | 241 +- src/libavoid/geometry.h | 47 +- src/libavoid/geomtypes.h | 284 +- src/libavoid/graph.cpp | 379 +- src/libavoid/graph.h | 37 +- src/libavoid/libavoid.h | 25 +- src/libavoid/makepath.cpp | 899 +- src/libavoid/makepath.h | 17 +- src/libavoid/polyutil.cpp | 92 - src/libavoid/polyutil.h | 41 - src/libavoid/region.cpp | 858 -- src/libavoid/region.h | 81 - src/libavoid/router.cpp | 1541 +- src/libavoid/router.h | 331 +- src/libavoid/shape.cpp | 112 +- src/libavoid/shape.h | 77 +- src/libavoid/static.cpp | 105 - src/libavoid/static.h | 42 - src/libavoid/timer.cpp | 53 +- src/libavoid/timer.h | 47 +- src/libavoid/vertices.cpp | 212 +- src/libavoid/vertices.h | 59 +- src/libavoid/visibility.cpp | 579 +- src/libavoid/visibility.h | 21 +- src/sp-conn-end-pair.cpp | 248 +- src/sp-conn-end-pair.h | 22 +- src/sp-conn-end.cpp | 328 +- src/sp-conn-end.h | 18 +- src/sp-item.cpp | 4 + src/svg/stringstream.cpp | 25 + src/svg/stringstream.h | 7 + src/ui/icon-names.h | 8 + src/widgets/toolbox.cpp | 242 +- 51 files changed, 7958 insertions(+), 25786 deletions(-) delete mode 100644 po/inkscape.pot delete mode 100644 src/libavoid/polyutil.cpp delete mode 100644 src/libavoid/polyutil.h delete mode 100644 src/libavoid/region.cpp delete mode 100644 src/libavoid/region.h delete mode 100644 src/libavoid/static.cpp delete mode 100644 src/libavoid/static.h diff --git a/po/inkscape.pot b/po/inkscape.pot deleted file mode 100644 index d48c15b38..000000000 --- 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 , 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 \n" -"Language-Team: LANGUAGE \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 "" -"Ctrl: make circle or integer-ratio ellipse, snap arc/segment angle" -msgstr "" - -#: ../src/arc-context.cpp:320 ../src/rect-context.cpp:362 -msgid "Shift: draw around the starting point" -msgstr "" - -#: ../src/arc-context.cpp:471 -#, c-format -msgid "" -"Ellipse: %s × %s (constrained to ratio %d:%d); with Shift " -"to draw around the starting point" -msgstr "" - -#: ../src/arc-context.cpp:473 -#, c-format -msgid "" -"Ellipse: %s × %s; with Ctrl to make square or integer-" -"ratio ellipse; with Shift 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 "3D Box; with Shift to extrude along the Z axis" -msgstr "" - -#: ../src/box3d-context.cpp:650 -msgid "Create 3D box" -msgstr "" - -#: ../src/box3d.cpp:315 -msgid "3D Box" -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 "Connection point: click or drag to create a new connector" -msgstr "" - -#: ../src/connector-context.cpp:1227 -msgid "Connector endpoint: drag to reroute or connect to new shapes" -msgstr "" - -#: ../src/connector-context.cpp:1339 -msgid "Select at least one non-connector object." -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 "Current layer is hidden. Unhide it to be able to draw on it." -msgstr "" - -#: ../src/context-fns.cpp:42 ../src/context-fns.cpp:71 -msgid "Current layer is locked. 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 "Guideline: %s" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:155 -msgid "Nothing selected." -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:161 -msgid "More than one object selected." -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:168 -#, c-format -msgid "Object has %d tiled clones." -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:173 -msgid "Object has no tiled clones." -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:976 -msgid "Select one object whose tiled clones to unclump." -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:998 -msgid "Unclump tiled clones" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1028 -msgid "Select one object 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 object to clone." -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1103 -msgid "" -"If you want to clone several objects, group them and clone the " -"group." -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1112 -msgid "Creating tiled clones..." -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1515 -msgid "Create tiled clones" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1706 -msgid "Per row:" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1719 -msgid "Per column:" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1727 -msgid "Randomize:" -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 "P1: simple translation" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1908 -msgid "P2: 180° rotation" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1909 -msgid "PM: 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 "PG: glide reflection" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1913 -msgid "CM: reflection + glide reflection" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1914 -msgid "PMM: reflection + reflection" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1915 -msgid "PMG: reflection + 180° rotation" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1916 -msgid "PGG: glide reflection + 180° rotation" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1917 -msgid "CMM: reflection + reflection + 180° rotation" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1918 -msgid "P4: 90° rotation" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1919 -msgid "P4M: 90° rotation + 45° reflection" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1920 -msgid "P4G: 90° rotation + 90° reflection" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1921 -msgid "P3: 120° rotation" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1922 -msgid "P31M: reflection + 120° rotation, dense" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1923 -msgid "P3M1: reflection + 120° rotation, sparse" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1924 -msgid "P6: 60° rotation" -msgstr "" - -#: ../src/dialogs/clonetiler.cpp:1925 -msgid "P6M: 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 "Shift X:" -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 "Shift Y:" -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 "Exponent:" -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 "Alternate:" -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 "Cumulate:" -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 "Exclude tile:" -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 "Scale X:" -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 "Scale Y:" -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 "Base:" -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 "Angle:" -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 "Blur:" -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 "Fade out:" -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 "H:" -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 "S:" -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 "L:" -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 " _Create " -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 "Export area" -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 "Bitmap size" -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 "_Filename" -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 "%d object found (out of %d), %s match." -msgid_plural "%d objects found (out of %d), %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 "Finished, %d words added to dictionary" -msgstr "" - -#: ../src/dialogs/spellcheck.cpp:446 -#, c-format -msgid "Finished, nothing suspicious found" -msgstr "" - -#: ../src/dialogs/spellcheck.cpp:559 -#, c-format -msgid "Not in dictionary (%s): %s" -msgstr "" - -#: ../src/dialogs/spellcheck.cpp:711 -msgid "Checking..." -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 "Click to select nodes, drag to rearrange." -msgstr "" - -#: ../src/dialogs/xml-tree.cpp:163 -msgid "Click attribute to edit." -msgstr "" - -#: ../src/dialogs/xml-tree.cpp:167 -#, c-format -msgid "" -"Attribute %s selected. Press Ctrl+Enter 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 "Release mouse to set color." -msgstr "" - -#: ../src/dropper-context.cpp:306 ../src/tools-switch.cpp:208 -msgid "" -"Click to set fill, Shift+click to set stroke; drag to " -"average color in area; with Alt to pick inverse color; Ctrl+C " -"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 "" -"Guide path selected; start drawing along the guide with Ctrl" -msgstr "" - -#: ../src/dyna-draw-context.cpp:617 -msgid "Select a guide path to track with Ctrl" -msgstr "" - -#: ../src/dyna-draw-context.cpp:752 -msgid "Tracking: connection to guide path lost!" -msgstr "" - -#: ../src/dyna-draw-context.cpp:752 -msgid "Tracking a guide path" -msgstr "" - -#: ../src/dyna-draw-context.cpp:755 -msgid "Drawing a calligraphic stroke" -msgstr "" - -#: ../src/dyna-draw-context.cpp:1044 -msgid "Draw calligraphic stroke" -msgstr "" - -#: ../src/eraser-context.cpp:527 -msgid "Drawing an eraser stroke" -msgstr "" - -#: ../src/eraser-context.cpp:830 -msgid "Draw eraser stroke" -msgstr "" - -#: ../src/event-context.cpp:618 -msgid "Space+mouse drag 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 "" -"One or more extensions failed to load\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 "" -"Note: 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 %i unused definition in <defs>." -msgid_plural "Removed %i 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 "Too much inset, the result is empty." -msgstr "" - -#: ../src/flood-context.cpp:509 -#, c-format -msgid "" -"Area filled, path with %d node created and unioned with selection." -msgid_plural "" -"Area filled, path with %d nodes created and unioned with selection." -msgstr[0] "" -msgstr[1] "" - -#: ../src/flood-context.cpp:513 -#, c-format -msgid "Area filled, path with %d node created." -msgid_plural "Area filled, path with %d nodes created." -msgstr[0] "" -msgstr[1] "" - -#: ../src/flood-context.cpp:785 ../src/flood-context.cpp:1099 -msgid "Area is not bounded, cannot fill." -msgstr "" - -#: ../src/flood-context.cpp:1104 -msgid "" -"Only the visible part of the bounded area was filled. 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 "Draw over areas to add to fill, hold Alt for touch fill" -msgstr "" - -#: ../src/gradient-context.cpp:132 ../src/gradient-drag.cpp:75 -msgid "Linear gradient start" -msgstr "" - -#. POINT_LG_BEGIN -#: ../src/gradient-context.cpp:133 ../src/gradient-drag.cpp:76 -msgid "Linear gradient end" -msgstr "" - -#: ../src/gradient-context.cpp:134 ../src/gradient-drag.cpp:77 -msgid "Linear gradient mid stop" -msgstr "" - -#: ../src/gradient-context.cpp:135 ../src/gradient-drag.cpp:78 -msgid "Radial gradient center" -msgstr "" - -#: ../src/gradient-context.cpp:136 ../src/gradient-context.cpp:137 -#: ../src/gradient-drag.cpp:79 ../src/gradient-drag.cpp:80 -msgid "Radial gradient radius" -msgstr "" - -#: ../src/gradient-context.cpp:138 ../src/gradient-drag.cpp:81 -msgid "Radial gradient focus" -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 mid stop" -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 Shift to separate) selected" -msgid_plural "" -"One handle merging %d stops (drag with Shift 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 "%d gradient handle selected out of %d" -msgid_plural "%d 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 "No gradient handles selected out of %d on %d selected object" -msgid_plural "" -"No 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 "Draw around handles to select them" -msgstr "" - -#: ../src/gradient-context.cpp:686 -msgid "Ctrl: snap gradient angle" -msgstr "" - -#: ../src/gradient-context.cpp:687 -msgid "Shift: draw gradient around the starting point" -msgstr "" - -#: ../src/gradient-context.cpp:807 -msgid "Invert gradient" -msgstr "" - -#: ../src/gradient-context.cpp:924 -#, c-format -msgid "Gradient for %d object; with Ctrl to snap angle" -msgid_plural "Gradient for %d objects; with Ctrl to snap angle" -msgstr[0] "" -msgstr[1] "" - -#: ../src/gradient-context.cpp:928 -msgid "Select objects 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 Ctrl to snap offset; click with Ctrl" -"+Alt 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 Ctrl to snap angle, with Ctrl+Alt to " -"preserve angle, with Ctrl+Shift to scale around center" -msgstr "" - -#: ../src/gradient-drag.cpp:1145 -#, c-format -msgid "" -"Radial gradient center and focus; drag with Shift to " -"separate focus" -msgstr "" - -#: ../src/gradient-drag.cpp:1148 -#, c-format -msgid "" -"Gradient point shared by %d gradient; drag with Shift to " -"separate" -msgid_plural "" -"Gradient point shared by %d gradients; drag with Shift 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. , 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 "" -"A file named \"%s\" already exists. Do " -"you want to replace it?\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 "Move the pattern fill inside the object" -msgstr "" - -#: ../src/knotholder.cpp:238 -msgid "Scale the pattern fill; uniformly if with Ctrl" -msgstr "" - -#: ../src/knotholder.cpp:241 -msgid "Rotate the pattern fill; with Ctrl 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 %s." -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: -#. " \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 "" - -#. " \n" -#. Not quite ready to be in the menus. -#. " \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 "" -"Ctrl: toggle node type, snap handle angle, move hor/vert; Ctrl" -"+Alt: move along handles" -msgstr "" - -#: ../src/node-context.cpp:229 -msgid "" -"Shift: toggle node selection, disable snapping, rotate both handles" -msgstr "" - -#: ../src/node-context.cpp:230 -msgid "Alt: lock handle length; Ctrl+Alt: 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 "" -"Node handle: drag to shape the curve; with Ctrl to snap angle; " -"with Alt to lock length; with Shift 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 two endnodes 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 two non-endpoint nodes 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 "" -"Node handle: angle %0.2f°, length %s; with Ctrl to snap " -"angle; with Alt to lock length; with Shift 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 "" -"Node: drag to edit the path; with Ctrl to snap to horizontal/" -"vertical; with Ctrl+Alt 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 Shift to extend)" -msgstr "" - -#: ../src/nodepath.cpp:4912 -msgid "one handle retracted (drag with Shift to extend)" -msgstr "" - -#: ../src/nodepath.cpp:4915 -msgid "both handles retracted (drag with Shift to extend)" -msgstr "" - -#: ../src/nodepath.cpp:4927 -msgid "" -"Drag nodes or node handles; Alt+drag nodes to sculpt; " -"arrow keys to move nodes, < > to scale, [ ] to " -"rotate" -msgstr "" - -#: ../src/nodepath.cpp:4928 -msgid "Drag the node or its handles; arrow 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 "" -"0 out of %i node selected. Click, Shift+click, " -"or drag around nodes to select." -msgid_plural "" -"0 out of %i nodes selected. Click, Shift+click, " -"or drag around 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 "%i of %i node selected; %s. %s." -msgid_plural "%i of %i nodes selected; %s. %s." -msgstr[0] "" -msgstr[1] "" - -#: ../src/nodepath.cpp:4979 -#, c-format -msgid "" -"%i of %i node selected in %i of %i subpaths. %s." -msgid_plural "" -"%i of %i nodes selected in %i of %i subpaths. %s." -msgstr[0] "" -msgstr[1] "" - -#: ../src/nodepath.cpp:4985 -#, c-format -msgid "%i of %i node selected. %s." -msgid_plural "%i of %i nodes selected. %s." -msgstr[0] "" -msgstr[1] "" - -#: ../src/object-edit.cpp:439 -msgid "" -"Adjust the horizontal rounding radius; with Ctrl to make the " -"vertical radius the same" -msgstr "" - -#: ../src/object-edit.cpp:443 -msgid "" -"Adjust the vertical rounding radius; with Ctrl to make the " -"horizontal radius the same" -msgstr "" - -#: ../src/object-edit.cpp:447 ../src/object-edit.cpp:451 -msgid "" -"Adjust the width and height of the rectangle; with Ctrl 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 Shift along the Z axis; with " -"Ctrl 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 Shift in X/Y direction; with " -"Ctrl 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 width, with Ctrl to make circle" -msgstr "" - -#: ../src/object-edit.cpp:930 -msgid "Adjust ellipse height, with Ctrl to make circle" -msgstr "" - -#: ../src/object-edit.cpp:933 -msgid "" -"Position the start point of the arc or segment; with Ctrl to " -"snap angle; drag inside the ellipse for arc, outside for " -"segment" -msgstr "" - -#: ../src/object-edit.cpp:937 -msgid "" -"Position the end point of the arc or segment; with Ctrl to " -"snap angle; drag inside the ellipse for arc, outside for " -"segment" -msgstr "" - -#: ../src/object-edit.cpp:1076 -msgid "" -"Adjust the tip radius of the star or polygon; with Shift to " -"round; with Alt to randomize" -msgstr "" - -#: ../src/object-edit.cpp:1083 -msgid "" -"Adjust the base radius of the star; with Ctrl to keep star " -"rays radial (no skew); with Shift to round; with Alt to " -"randomize" -msgstr "" - -#: ../src/object-edit.cpp:1272 -msgid "" -"Roll/unroll the spiral from inside; with Ctrl to snap angle; " -"with Alt to converge/diverge" -msgstr "" - -#: ../src/object-edit.cpp:1275 -msgid "" -"Roll/unroll the spiral from outside; with Ctrl to snap angle; " -"with Shift to scale/rotate" -msgstr "" - -#: ../src/object-edit.cpp:1319 -msgid "Adjust the offset distance" -msgstr "" - -#: ../src/object-edit.cpp:1355 -msgid "Drag to resize the flowed text frame" -msgstr "" - -#: ../src/path-chemistry.cpp:49 -msgid "Select object(s) 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 "No path(s) to combine in the selection." -msgstr "" - -#: ../src/path-chemistry.cpp:180 -msgid "Select path(s) 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 "No path(s) to break apart in the selection." -msgstr "" - -#: ../src/path-chemistry.cpp:285 -msgid "Select object(s) 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 "No objects to convert to path in the selection." -msgstr "" - -#: ../src/path-chemistry.cpp:551 -msgid "Select path(s) 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 "No paths 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 "Release 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 "Drag 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 "" -"Sketch mode: holding Alt interpolates between sketched paths. " -"Release Alt to finalize." -msgstr "" - -#: ../src/pencil-context.cpp:600 -msgid "Finishing freehand sketch" -msgstr "" - -#: ../src/pen-context.cpp:662 -msgid "Click or click and drag to close and finish the path." -msgstr "" - -#: ../src/pen-context.cpp:672 -msgid "" -"Click or click and drag to continue the path from this point." -msgstr "" - -#: ../src/pen-context.cpp:1266 -#, c-format -msgid "" -"Curve segment: angle %3.2f°, distance %s; with Ctrl to " -"snap angle, Enter to finish the path" -msgstr "" - -#: ../src/pen-context.cpp:1267 -#, c-format -msgid "" -"Line segment: angle %3.2f°, distance %s; with Ctrl to " -"snap angle, Enter to finish the path" -msgstr "" - -#: ../src/pen-context.cpp:1285 -#, c-format -msgid "" -"Curve handle: angle %3.2f°, length %s; with Ctrl to snap " -"angle" -msgstr "" - -#: ../src/pen-context.cpp:1307 -#, c-format -msgid "" -"Curve handle, symmetric: angle %3.2f°, length %s; with Ctrl to snap angle, with Shift to move this handle only" -msgstr "" - -#: ../src/pen-context.cpp:1308 -#, c-format -msgid "" -"Curve handle: angle %3.2f°, length %s; with Ctrl to snap " -"angle, with Shift 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 "" -"Ctrl: make square or integer-ratio rect, lock a rounded corner " -"circular" -msgstr "" - -#: ../src/rect-context.cpp:508 -#, c-format -msgid "" -"Rectangle: %s × %s (constrained to ratio %d:%d); with Shift to draw around the starting point" -msgstr "" - -#: ../src/rect-context.cpp:511 -#, c-format -msgid "" -"Rectangle: %s × %s (constrained to golden ratio 1.618 : 1); with " -"Shift to draw around the starting point" -msgstr "" - -#: ../src/rect-context.cpp:513 -#, c-format -msgid "" -"Rectangle: %s × %s (constrained to golden ratio 1 : 1.618); with " -"Shift to draw around the starting point" -msgstr "" - -#: ../src/rect-context.cpp:517 -#, c-format -msgid "" -"Rectangle: %s × %s; with Ctrl to make square or integer-" -"ratio rectangle; with Shift 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 "" -"Draw over objects to select them; release Alt to switch to " -"rubberband selection" -msgstr "" - -#: ../src/select-context.cpp:557 -msgid "" -"Drag around objects to select them; press Alt to switch to " -"touch selection" -msgstr "" - -#: ../src/select-context.cpp:721 -msgid "Ctrl: click to select in groups; drag to move hor/vert" -msgstr "" - -#: ../src/select-context.cpp:722 -msgid "Shift: click to toggle select; drag for rubberband selection" -msgstr "" - -#: ../src/select-context.cpp:723 -msgid "" -"Alt: 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 "Nothing 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 object(s) to duplicate." -msgstr "" - -#: ../src/selection-chemistry.cpp:341 -msgid "Delete all" -msgstr "" - -#: ../src/selection-chemistry.cpp:464 -msgid "Select some objects to group." -msgstr "" - -#: ../src/selection-chemistry.cpp:537 ../src/selection-describer.cpp:53 -msgid "Group" -msgstr "" - -#: ../src/selection-chemistry.cpp:551 -msgid "Select a group to ungroup." -msgstr "" - -#: ../src/selection-chemistry.cpp:592 -msgid "No groups 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 object(s) 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 different groups or layers." -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 object(s) to raise to top." -msgstr "" - -#: ../src/selection-chemistry.cpp:771 -msgid "Raise to top" -msgstr "" - -#: ../src/selection-chemistry.cpp:784 -msgid "Select object(s) to lower." -msgstr "" - -#: ../src/selection-chemistry.cpp:834 -msgid "Lower" -msgstr "" - -#: ../src/selection-chemistry.cpp:846 -msgid "Select object(s) 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 object(s) 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 object(s) 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 object(s) 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 object(s) 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 clones to relink." -msgstr "" - -#: ../src/selection-chemistry.cpp:1942 -msgid "Copy an object to clipboard to relink clones to." -msgstr "" - -#: ../src/selection-chemistry.cpp:1966 -msgid "No clones to relink in the selection." -msgstr "" - -#: ../src/selection-chemistry.cpp:1969 -msgid "Relink clone" -msgstr "" - -#: ../src/selection-chemistry.cpp:1983 -msgid "Select clones to unlink." -msgstr "" - -#: ../src/selection-chemistry.cpp:2032 -msgid "No clones to unlink in the selection." -msgstr "" - -#: ../src/selection-chemistry.cpp:2036 -msgid "Unlink clone" -msgstr "" - -#: ../src/selection-chemistry.cpp:2049 -msgid "" -"Select a clone to go to its original. Select a linked offset " -"to go to its source. Select a text on path to go to the path. Select " -"a flowed text to go to its frame." -msgstr "" - -#: ../src/selection-chemistry.cpp:2072 -msgid "" -"Cannot find 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 not visible (it is in <" -"defs>)" -msgstr "" - -#: ../src/selection-chemistry.cpp:2124 -msgid "Select object(s) to convert to marker." -msgstr "" - -#: ../src/selection-chemistry.cpp:2192 -msgid "Objects to marker" -msgstr "" - -#: ../src/selection-chemistry.cpp:2220 -msgid "Select object(s) to convert to guides." -msgstr "" - -#: ../src/selection-chemistry.cpp:2232 -msgid "Objects to guides" -msgstr "" - -#: ../src/selection-chemistry.cpp:2248 -msgid "Select object(s) to convert to pattern." -msgstr "" - -#: ../src/selection-chemistry.cpp:2336 -msgid "Objects to pattern" -msgstr "" - -#: ../src/selection-chemistry.cpp:2352 -msgid "Select an object with pattern fill to extract objects from." -msgstr "" - -#: ../src/selection-chemistry.cpp:2405 -msgid "No pattern fills in the selection." -msgstr "" - -#: ../src/selection-chemistry.cpp:2408 -msgid "Pattern to objects" -msgstr "" - -#: ../src/selection-chemistry.cpp:2493 -msgid "Select object(s) 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 object(s) to create clippath or mask from." -msgstr "" - -#: ../src/selection-chemistry.cpp:2711 -msgid "Select mask object and object(s) 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 object(s) 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 object(s) 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 %s" -msgstr "" - -#: ../src/selection-describer.cpp:153 -#, c-format -msgid "layer %s" -msgstr "" - -#: ../src/selection-describer.cpp:162 -#, c-format -msgid "%s" -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 %i parents (%s)" -msgid_plural " in %i parents (%s)" -msgstr[0] "" -msgstr[1] "" - -#: ../src/selection-describer.cpp:178 -#, c-format -msgid " in %i layers" -msgid_plural " in %i layers" -msgstr[0] "" -msgstr[1] "" - -#: ../src/selection-describer.cpp:188 -msgid "Use Shift+D to look up original" -msgstr "" - -#: ../src/selection-describer.cpp:192 -msgid "Use Shift+D to look up path" -msgstr "" - -#: ../src/selection-describer.cpp:196 -msgid "Use Shift+D 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 "%i object selected" -msgid_plural "%i objects selected" -msgstr[0] "" -msgstr[1] "" - -#. this is only used with 2 or more objects -#: ../src/selection-describer.cpp:216 -#, c-format -msgid "%i object of type %s" -msgid_plural "%i objects of type %s" -msgstr[0] "" -msgstr[1] "" - -#. this is only used with 2 or more objects -#: ../src/selection-describer.cpp:221 -#, c-format -msgid "%i object of types %s, %s" -msgid_plural "%i objects of types %s, %s" -msgstr[0] "" -msgstr[1] "" - -#. this is only used with 2 or more objects -#: ../src/selection-describer.cpp:226 -#, c-format -msgid "%i object of types %s, %s, %s" -msgid_plural "%i objects of types %s, %s, %s" -msgstr[0] "" -msgstr[1] "" - -#. this is only used with 2 or more objects -#: ../src/selection-describer.cpp:231 -#, c-format -msgid "%i object of %i types" -msgid_plural "%i objects of %i 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 "" -"Center of rotation and skewing: drag to reposition; scaling with " -"Shift also uses this center" -msgstr "" - -#: ../src/seltrans.cpp:673 -msgid "" -"Squeeze or stretch selection; with Ctrl to scale uniformly; " -"with Shift to scale around rotation center" -msgstr "" - -#: ../src/seltrans.cpp:674 -msgid "" -"Scale selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" -msgstr "" - -#: ../src/seltrans.cpp:678 -msgid "" -"Skew selection; with Ctrl to snap angle; with Shift to " -"skew around the opposite side" -msgstr "" - -#: ../src/seltrans.cpp:679 -msgid "" -"Rotate selection; with Ctrl to snap angle; with Shift " -"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 "Scale: %0.2f%% x %0.2f%%; with Ctrl 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 "Skew: %0.2f°; with Ctrl 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 "Rotate: %0.2f°; with Ctrl to snap angle" -msgstr "" - -#: ../src/seltrans.cpp:1371 -#, c-format -msgid "Move center to %s, %s" -msgstr "" - -#: ../src/seltrans.cpp:1541 -#, c-format -msgid "" -"Move by %s, %s; with Ctrl to restrict to horizontal/vertical; " -"with Shift to disable snapping" -msgstr "" - -#: ../src/shape-editor.cpp:472 -msgid "Drag curve" -msgstr "" - -#: ../src/sp-anchor.cpp:178 -#, c-format -msgid "Link to %s" -msgstr "" - -#: ../src/sp-anchor.cpp:182 -msgid "Link without URI" -msgstr "" - -#: ../src/sp-ellipse.cpp:502 ../src/sp-ellipse.cpp:879 -msgid "Ellipse" -msgstr "" - -#: ../src/sp-ellipse.cpp:643 -msgid "Circle" -msgstr "" - -#: ../src/sp-ellipse.cpp:874 -msgid "Segment" -msgstr "" - -#: ../src/sp-ellipse.cpp:876 -msgid "Arc" -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 "Flowed text (%d character)" -msgid_plural "Flowed text (%d characters)" -msgstr[0] "" -msgstr[1] "" - -#: ../src/sp-flowtext.cpp:378 -#, c-format -msgid "Linked flowed text (%d character)" -msgid_plural "Linked flowed text (%d characters)" -msgstr[0] "" -msgstr[1] "" - -#: ../src/sp-guide.cpp:287 -msgid "Guides Around Page" -msgstr "" - -#: ../src/sp-guide.cpp:421 -msgid "" -"Shift+drag to rotate, Ctrl+drag to move origin, Del 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 "Image with bad reference: %s" -msgstr "" - -#: ../src/sp-image.cpp:1137 -#, c-format -msgid "Image %d × %d: %s" -msgstr "" - -#: ../src/spiral-context.cpp:319 -msgid "Ctrl: snap angle" -msgstr "" - -#: ../src/spiral-context.cpp:321 -msgid "Alt: lock spiral radius" -msgstr "" - -#: ../src/spiral-context.cpp:453 -#, c-format -msgid "" -"Spiral: radius %s, angle %5g°; with Ctrl 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; clipped" -msgstr "" - -#: ../src/sp-item.cpp:1057 -#, c-format -msgid "%s; masked" -msgstr "" - -#: ../src/sp-item.cpp:1065 -#, c-format -msgid "%s; filtered (%s)" -msgstr "" - -#: ../src/sp-item.cpp:1067 -#, c-format -msgid "%s; filtered" -msgstr "" - -#: ../src/sp-item-group.cpp:761 -#, c-format -msgid "Group of %d object" -msgid_plural "Group of %d objects" -msgstr[0] "" -msgstr[1] "" - -#: ../src/sp-line.cpp:194 -msgid "Line" -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 at least 2 paths to perform a boolean operation." -msgstr "" - -#: ../src/splivarot.cpp:125 -msgid "Select at least 1 path to perform a boolean union." -msgstr "" - -#: ../src/splivarot.cpp:131 -msgid "" -"Select exactly 2 paths to perform difference, division, or path cut." -msgstr "" - -#: ../src/splivarot.cpp:147 ../src/splivarot.cpp:162 -msgid "" -"Unable to determine the z-order of the objects selected for " -"difference, XOR, division, or path cut." -msgstr "" - -#: ../src/splivarot.cpp:192 -msgid "" -"One of the objects is not a path, cannot perform boolean operation." -msgstr "" - -#: ../src/splivarot.cpp:633 -msgid "Select stroked path(s) 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 "No stroked paths in the selection." -msgstr "" - -#: ../src/splivarot.cpp:1062 -msgid "Selected object is not a path, 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 path(s) 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 "No paths 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 %d of %d paths simplified..." -msgstr "" - -#: ../src/splivarot.cpp:1725 -#, c-format -msgid "%d paths simplified." -msgstr "" - -#: ../src/splivarot.cpp:1739 -msgid "Select path(s) to simplify." -msgstr "" - -#: ../src/splivarot.cpp:1753 -msgid "Simplify" -msgstr "" - -#: ../src/splivarot.cpp:1755 -msgid "No paths 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 "Linked offset, %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 "Dynamic offset, %s by %f pt" -msgstr "" - -#: ../src/sp-path.cpp:156 -#, c-format -msgid "Path (%i node, path effect: %s)" -msgid_plural "Path (%i nodes, path effect: %s)" -msgstr[0] "" -msgstr[1] "" - -#: ../src/sp-path.cpp:159 -#, c-format -msgid "Path (%i node)" -msgid_plural "Path (%i nodes)" -msgstr[0] "" -msgstr[1] "" - -#: ../src/sp-polygon.cpp:226 -msgid "Polygon" -msgstr "" - -#: ../src/sp-polyline.cpp:177 -msgid "Polyline" -msgstr "" - -#: ../src/sp-rect.cpp:223 -msgid "Rectangle" -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 "Spiral with %3f turns" -msgstr "" - -#: ../src/sp-star.cpp:309 -#, c-format -msgid "Star with %d vertex" -msgid_plural "Star with %d vertices" -msgstr[0] "" -msgstr[1] "" - -#: ../src/sp-star.cpp:313 -#, c-format -msgid "Polygon with %d vertex" -msgid_plural "Polygon with %d vertices" -msgstr[0] "" -msgstr[1] "" - -#: ../src/sp-switch.cpp:100 -#, c-format -msgid "Conditional group of %d object" -msgid_plural "Conditional group of %d 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 "Text on path (%s, %s)" -msgstr "" - -#: ../src/sp-text.cpp:426 -#, c-format -msgid "Text (%s, %s)" -msgstr "" - -#: ../src/sp-tref.cpp:368 -#, c-format -msgid "Cloned character data%s%s" -msgstr "" - -#: ../src/sp-tref.cpp:369 -msgid " from " -msgstr "" - -#: ../src/sp-tref.cpp:374 -msgid "Orphaned cloned character data" -msgstr "" - -#: ../src/sp-tspan.cpp:284 -msgid "Text span" -msgstr "" - -#. TRANSLATORS: Used for statusbar description for long chains: -#. * "Clone of: Clone of: ... in Layer 1". -#: ../src/sp-use.cpp:327 -msgid "..." -msgstr "" - -#: ../src/sp-use.cpp:335 -#, c-format -msgid "Clone of: %s" -msgstr "" - -#: ../src/sp-use.cpp:339 -msgid "Orphaned clone" -msgstr "" - -#: ../src/star-context.cpp:333 -msgid "Ctrl: snap angle; keep rays radial" -msgstr "" - -#: ../src/star-context.cpp:464 -#, c-format -msgid "" -"Polygon: radius %s, angle %5g°; with Ctrl to snap angle" -msgstr "" - -#: ../src/star-context.cpp:465 -#, c-format -msgid "Star: radius %s, angle %5g°; with Ctrl to snap angle" -msgstr "" - -#: ../src/star-context.cpp:494 -msgid "Create star" -msgstr "" - -#: ../src/text-chemistry.cpp:104 -msgid "Select a text and a path to put text on path." -msgstr "" - -#: ../src/text-chemistry.cpp:109 -msgid "" -"This text object is already put on a path. Remove it from the path " -"first. Use Shift+D to look up its path." -msgstr "" - -#. rect is the only SPShape which is not 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 visible 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 a text on path to remove it from path." -msgstr "" - -#: ../src/text-chemistry.cpp:226 -msgid "No texts-on-paths 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 text(s) to remove kerns from." -msgstr "" - -#: ../src/text-chemistry.cpp:293 -msgid "Remove manual kerns" -msgstr "" - -#: ../src/text-chemistry.cpp:313 -msgid "" -"Select a text and one or more paths or shapes to flow text " -"into frame." -msgstr "" - -#: ../src/text-chemistry.cpp:381 -msgid "Flow text into shape" -msgstr "" - -#: ../src/text-chemistry.cpp:403 -msgid "Select a flowed text to unflow it." -msgstr "" - -#: ../src/text-chemistry.cpp:477 -msgid "Unflow flowed text" -msgstr "" - -#: ../src/text-chemistry.cpp:489 -msgid "Select flowed text(s) to convert." -msgstr "" - -#: ../src/text-chemistry.cpp:507 -msgid "The flowed text(s) must be visible in order to be converted." -msgstr "" - -#: ../src/text-chemistry.cpp:535 -msgid "Convert flowed text to text" -msgstr "" - -#: ../src/text-chemistry.cpp:540 -msgid "No flowed text(s) to convert in the selection." -msgstr "" - -#: ../src/text-context.cpp:441 -msgid "Click to edit the text, drag to select part of the text." -msgstr "" - -#: ../src/text-context.cpp:443 -msgid "" -"Click to edit the flowed text, drag 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 (Enter to finish): %s: %s" -msgstr "" - -#: ../src/text-context.cpp:574 ../src/text-context.cpp:849 -msgid "Unicode (Enter to finish): " -msgstr "" - -#: ../src/text-context.cpp:649 -#, c-format -msgid "Flowed text frame: %s × %s" -msgstr "" - -#: ../src/text-context.cpp:681 -msgid "Type text; Enter 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 too small 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); Enter to start new " -"paragraph." -msgstr "" - -#: ../src/text-context.cpp:1604 -#, c-format -msgid "Type or edit text (%d characters); Enter to start new line." -msgstr "" - -#: ../src/text-context.cpp:1612 ../src/tools-switch.cpp:190 -msgid "" -"Click to select or create text, drag 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 cloned character data." -msgstr "" - -#: ../src/tools-switch.cpp:130 -msgid "" -"To edit a path, click, Shift+click, or drag around " -"nodes to select them, then drag nodes and handles. Click 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 "" -"Drag to create a rectangle. Drag controls to round corners and " -"resize. Click to select." -msgstr "" - -#: ../src/tools-switch.cpp:148 -msgid "" -"Drag to create a 3D box. Drag controls to resize in " -"perspective. Click to select (with Ctrl+Alt for single faces)." -msgstr "" - -#: ../src/tools-switch.cpp:154 -msgid "" -"Drag to create an ellipse. Drag controls to make an arc or " -"segment. Click to select." -msgstr "" - -#: ../src/tools-switch.cpp:160 -msgid "" -"Drag to create a star. Drag controls to edit the star shape. " -"Click to select." -msgstr "" - -#: ../src/tools-switch.cpp:166 -msgid "" -"Drag to create a spiral. Drag controls to edit the spiral " -"shape. Click to select." -msgstr "" - -#: ../src/tools-switch.cpp:172 -msgid "" -"Drag to create a freehand line. Shift appends to selected " -"path, Alt activates sketch mode." -msgstr "" - -#: ../src/tools-switch.cpp:178 -msgid "" -"Click or click and drag to start a path; with Shift to " -"append to selected path. Ctrl+click to create single dots (straight " -"line modes only)." -msgstr "" - -#: ../src/tools-switch.cpp:184 -msgid "" -"Drag to draw a calligraphic stroke; with Ctrl to track a guide " -"path. Arrow keys adjust width (left/right) and angle (up/down)." -msgstr "" - -#: ../src/tools-switch.cpp:196 -msgid "" -"Drag or double click to create a gradient on selected objects, " -"drag handles to adjust gradients." -msgstr "" - -#: ../src/tools-switch.cpp:202 -msgid "" -"Click or drag around an area to zoom in, Shift+click to " -"zoom out." -msgstr "" - -#: ../src/tools-switch.cpp:214 -msgid "Click and drag between shapes to create a connector." -msgstr "" - -#: ../src/tools-switch.cpp:220 -msgid "" -"Click to paint a bounded area, Shift+click to union the new " -"fill with the current selection, Ctrl+click to change the clicked " -"object's fill and stroke to the current setting." -msgstr "" - -#: ../src/tools-switch.cpp:226 -msgid "Drag 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 image to trace" -msgstr "" - -#: ../src/trace/trace.cpp:106 -msgid "Select only one image 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 "Nothing selected" -msgstr "" - -#: ../src/tweak-context.cpp:210 -#, c-format -msgid "%s. Drag to move." -msgstr "" - -#: ../src/tweak-context.cpp:214 -#, c-format -msgid "%s. Drag or click to move in; with Shift to move out." -msgstr "" - -#: ../src/tweak-context.cpp:218 -#, c-format -msgid "%s. Drag or click to move randomly." -msgstr "" - -#: ../src/tweak-context.cpp:222 -#, c-format -msgid "%s. Drag or click to scale down; with Shift to scale up." -msgstr "" - -#: ../src/tweak-context.cpp:226 -#, c-format -msgid "" -"%s. Drag or click to rotate clockwise; with Shift, " -"counterclockwise." -msgstr "" - -#: ../src/tweak-context.cpp:230 -#, c-format -msgid "%s. Drag or click to duplicate; with Shift, delete." -msgstr "" - -#: ../src/tweak-context.cpp:234 -#, c-format -msgid "%s. Drag to push paths." -msgstr "" - -#: ../src/tweak-context.cpp:238 -#, c-format -msgid "%s. Drag or click to inset paths; with Shift to outset." -msgstr "" - -#: ../src/tweak-context.cpp:246 -#, c-format -msgid "%s. Drag or click to attract paths; with Shift to repel." -msgstr "" - -#: ../src/tweak-context.cpp:254 -#, c-format -msgid "%s. Drag or click to roughen paths." -msgstr "" - -#: ../src/tweak-context.cpp:258 -#, c-format -msgid "%s. Drag or click to paint objects with color." -msgstr "" - -#: ../src/tweak-context.cpp:262 -#, c-format -msgid "%s. Drag or click to randomize colors." -msgstr "" - -#: ../src/tweak-context.cpp:266 -#, c-format -msgid "" -"%s. Drag or click to increase blur; with Shift to decrease." -msgstr "" - -#: ../src/tweak-context.cpp:1223 -msgid "Nothing selected! 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 object(s) 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 object(s) to paste size to." -msgstr "" - -#: ../src/ui/clipboard.cpp:432 -msgid "No size on the clipboard." -msgstr "" - -#: ../src/ui/clipboard.cpp:483 -msgid "Select object(s) 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 "Dublin Core Entities" -msgstr "" - -#: ../src/ui/dialog/document-metadata.cpp:176 -msgid "License" -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 "General" -msgstr "" - -#: ../src/ui/dialog/document-properties.cpp:223 -msgid "Border" -msgstr "" - -#: ../src/ui/dialog/document-properties.cpp:225 -msgid "Format" -msgstr "" - -#: ../src/ui/dialog/document-properties.cpp:253 -msgid "Guides" -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 "Snap to objects" -msgstr "" - -#: ../src/ui/dialog/document-properties.cpp:292 -msgid "Snap to grids" -msgstr "" - -#: ../src/ui/dialog/document-properties.cpp:294 -msgid "Snap to guides" -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 "Linked Color Profiles:" -msgstr "" - -#: ../src/ui/dialog/document-properties.cpp:540 -msgid "Available Color Profiles:" -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 "External script files:" -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 "Creation" -msgstr "" - -#: ../src/ui/dialog/document-properties.cpp:775 -msgid "Defined grids" -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 feBlend filter primitive provides 4 image blending modes: screen, " -"multiply, darken and lighten." -msgstr "" - -#: ../src/ui/dialog/filter-effects-dialog.cpp:2282 -msgid "" -"The feColorMatrix 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 feComponentTransfer 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 feComposite 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 feConvolveMatrix 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 feDiffuseLighting 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 feDisplacementMap 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 feFlood 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 feGaussianBlur 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 feImage 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 feMerge 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 feMorphology 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 feOffset 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 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:2334 -msgid "" -"The feTile filter primitive tiles a region with its input graphic" -msgstr "" - -#: ../src/ui/dialog/filter-effects-dialog.cpp:2338 -msgid "" -"The feTurbulence 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 "No objects selected to take the style from." -msgstr "" - -#: ../src/ui/dialog/inkscape-preferences.cpp:319 -msgid "" -"More than one object selected. 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 "" -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 path 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 path 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: %s; Click to set fill, Shift+click 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 "" -"Welcome to Inkscape! 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 "" -"Save changes to document \"%s\" before " -"closing?\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 "" -"The file \"%s\" was saved with a " -"format (%s) that may cause data loss!\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 "None" -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 "L" -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 "R" -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 "Unset" -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 "a" -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 "m" -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 saturation: was %.3g, now %.3g (diff %.3g); with " -"Ctrl 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 lightness: was %.3g, now %.3g (diff %.3g); with " -"Shift 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 hue: was %.3g, now %.3g (diff %.3g); with Shift to adjust saturation, with Ctrl 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 stroke width: was %.3g, now %.3g (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 "Finite vanishing point shared by %d box" -msgid_plural "" -"Finite vanishing point shared by %d boxes; drag with Shift 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 "Infinite vanishing point shared by %d box" -msgid_plural "" -"Infinite vanishing point shared by %d boxes; drag with " -"Shift to separate selected box(es)" -msgstr[0] "" -msgstr[1] "" - -#: ../src/vanishing-point.cpp:320 -#, c-format -msgid "" -"shared by %d box; drag with Shift to separate selected box(es)" -msgid_plural "" -"shared by %d boxes; drag with Shift 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 %s." -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 %s." -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 "" -"Welcome to Inkscape! 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 "No gradients" -msgstr "" - -#: ../src/widgets/gradient-toolbar.cpp:198 -msgid "Nothing selected" -msgstr "" - -#: ../src/widgets/gradient-toolbar.cpp:209 -msgid "No gradients in selection" -msgstr "" - -#: ../src/widgets/gradient-toolbar.cpp:219 -msgid "Multiple gradients" -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 "New:" -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), _("Average:")); -#: ../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 "Change:" -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 Node tool to adjust position, scale, and rotation of the " -"pattern on canvas. Use Object > Pattern > Objects to Pattern 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 stroke width is scaled when objects are scaled." -msgstr "" - -#: ../src/widgets/select-toolbar.cpp:306 -msgid "Now stroke width is not scaled when objects are scaled." -msgstr "" - -#: ../src/widgets/select-toolbar.cpp:317 -msgid "" -"Now rounded rectangle corners are scaled when rectangles are " -"scaled." -msgstr "" - -#: ../src/widgets/select-toolbar.cpp:319 -msgid "" -"Now rounded rectangle corners are not scaled when rectangles " -"are scaled." -msgstr "" - -#: ../src/widgets/select-toolbar.cpp:330 -msgid "" -"Now gradients are transformed along with their objects when " -"those are transformed (moved, scaled, rotated, or skewed)." -msgstr "" - -#: ../src/widgets/select-toolbar.cpp:332 -msgid "" -"Now gradients remain fixed when objects are transformed " -"(moved, scaled, rotated, or skewed)." -msgstr "" - -#: ../src/widgets/select-toolbar.cpp:343 -msgid "" -"Now patterns are transformed along with their objects when " -"those are transformed (moved, scaled, rotated, or skewed)." -msgstr "" - -#: ../src/widgets/select-toolbar.cpp:345 -msgid "" -"Now patterns remain fixed 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 "" - -#. mm -#: ../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 baa74483a..e8f690ecb 100644 --- a/share/icons/icons.svg +++ b/share/icons/icons.svg @@ -8,7 +8,7 @@ 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" @@ -18,6 +18,13 @@ version="1.0"> + @@ -5071,6 +5078,113 @@ style="stop-color:#000000;stop-opacity:1" offset="1" /> + + + + + + + + + + + + + + + + + + + + + + + + + + id="path4622" sodipodi:nodetypes="cccccccc" /> - - - - - - - - - - - - - - - - - - - - - - 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" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1885f56e5..46c2586d1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -86,6 +86,7 @@ composite-undo-stack-observer.cpp common-context.cpp conditions.cpp conn-avoid-ref.cpp +connection-points.cpp connector-context.cpp console-output-undo-observer.cpp context-fns.cpp diff --git a/src/Makefile_insert b/src/Makefile_insert index 18beaec37..da49187ba 100644 --- a/src/Makefile_insert +++ b/src/Makefile_insert @@ -20,6 +20,7 @@ ink_common_sources += \ 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 69b11fae9..d03c3be3e 100644 --- a/src/attributes.cpp +++ b/src/attributes.cpp @@ -37,6 +37,7 @@ static SPStyleProp const props[] = { {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"}, @@ -124,6 +125,7 @@ static SPStyleProp const props[] = { {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 52f71b203..af60b75be 100644 --- a/src/attributes.h +++ b/src/attributes.h @@ -36,6 +36,7 @@ enum SPAttributeEnum { 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, @@ -124,6 +125,7 @@ enum SPAttributeEnum { 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 43c9c0b66..c04ad9e49 100644 --- a/src/conn-avoid-ref.cpp +++ b/src/conn-avoid-ref.cpp @@ -12,23 +12,34 @@ #include #include +#include #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 + 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) @@ -44,13 +55,17 @@ 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; } @@ -66,6 +81,205 @@ void SPAvoidRef::setAvoid(char const *value) } } +void print_connection_points(std::map& cp) +{ + std::map::iterator i; + for (i=cp.begin(); i!=cp.end(); ++i) + { + const ConnectionPoint& p = i->second; + std::cout< updates; + std::set deletes; + std::set 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::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::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::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<second; + } + else + ostr<<'|'<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<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<second; + } + else + ostr<<'|'<second; + } + this->setConnectionPointsAttrUndoable( ostr.str().c_str(), _("Removed a connection point") ); + } +} void SPAvoidRef::handleSettingChange(void) { @@ -93,8 +307,8 @@ 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)); @@ -104,8 +318,7 @@ void SPAvoidRef::handleSettingChange(void) // 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); } @@ -114,9 +327,8 @@ void SPAvoidRef::handleSettingChange(void) { g_assert(shapeRef); - // shapeRef is finalised by delShape, - // so no memory is lost here. - router->delShape(shapeRef); + router->removeShape(shapeRef); + delete shapeRef; shapeRef = NULL; } } @@ -169,14 +381,53 @@ GSList *SPAvoidRef::getAttachedConnectors(const unsigned int type) 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 @@ -185,24 +436,112 @@ static Avoid::Polygn avoid_item_poly(SPItem const *item) // 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 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(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::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]; @@ -242,10 +581,9 @@ void avoid_item_move(Geom::Matrix const */*mp*/, SPItem *moved_item) 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 d34d8ca2e..5dff8dd38 100644 --- a/src/conn-avoid-ref.h +++ b/src/conn-avoid-ref.h @@ -18,6 +18,8 @@ struct SPDesktop; struct SPItem; +struct ConnectionPoint; +typedef std::map IdConnectionPointMap; namespace Avoid { class ShapeRef; } class SPAvoidRef { @@ -28,9 +30,16 @@ public: // 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 @@ -38,6 +47,9 @@ public: // 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; @@ -48,6 +60,7 @@ private: // 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, @@ -56,6 +69,7 @@ extern void avoid_item_move(Geom::Matrix const *mp, SPItem *moved_item); 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 */ diff --git a/src/connector-context.cpp b/src/connector-context.cpp index 2131bdced..228c81d29 100644 --- a/src/connector-context.cpp +++ b/src/connector-context.cpp @@ -4,31 +4,25 @@ * Authors: * Michael Wybrow * - * 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 @@ -37,16 +31,133 @@ * 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 #include #include #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" @@ -63,11 +174,14 @@ #include "display/canvas-bpath.h" #include "display/sodipodi-ctrl.h" #include +#include #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" @@ -79,6 +193,7 @@ static void sp_connector_context_init(SPConnectorContext *conn_context); 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; @@ -171,6 +289,7 @@ sp_connector_context_class_init(SPConnectorContextClass *klass) 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; @@ -188,10 +307,14 @@ sp_connector_context_init(SPConnectorContext *cc) 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(); @@ -204,10 +327,13 @@ sp_connector_context_init(SPConnectorContext *cc) 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; @@ -226,10 +352,14 @@ sp_connector_context_dispose(GObject *object) 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]); @@ -282,6 +412,12 @@ sp_connector_context_setup(SPEventContext *ec) // 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(); @@ -293,6 +429,64 @@ sp_connector_context_setup(SPEventContext *ec) } +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) { @@ -341,9 +535,12 @@ cc_clear_active_shape(SPConnectorContext *cc) 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); + } } } @@ -379,16 +576,35 @@ conn_pt_handle_test(SPConnectorContext *cc, Geom::Point& p) // 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: @@ -462,7 +698,7 @@ sp_connector_context_root_handler(SPEventContext *ec, GdkEvent *event) 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); } @@ -953,14 +1430,13 @@ spcc_flush_white(SPConnectorContext *cc, SPCurve *gc) /* 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", @@ -974,19 +1450,27 @@ spcc_flush_white(SPConnectorContext *cc, SPCurve *gc) 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); } @@ -1036,16 +1520,16 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot) 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; @@ -1055,7 +1539,7 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot) cc->active_handle = NULL; - if (knot->tip) { + if (knot_tip) { knot->desktop->event_context->defaultMessageContext()->clear(); } @@ -1087,6 +1571,7 @@ endpt_handler(SPKnot */*knot*/, GdkEvent *event, SPConnectorContext *cc) 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; @@ -1101,7 +1586,7 @@ endpt_handler(SPKnot */*knot*/, GdkEvent *event, SPConnectorContext *cc) } // 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); @@ -1120,38 +1605,9 @@ endpt_handler(SPKnot */*knot*/, GdkEvent *event, SPConnectorContext *cc) 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, - _("Connection point: click or drag to create a new connector")); + SPKnot *knot = sp_knot_new(desktop, 0); knot->setShape(SP_KNOT_SHAPE_SQUARE); knot->setSize(8); @@ -1159,26 +1615,127 @@ static void cc_set_active_shape(SPConnectorContext *cc, SPItem *item) 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* 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::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 seen; + for ( ConnectionPointMap::iterator it = cc->connpthandles.begin(); it != cc->connpthandles.end() ;) + { + bool removed = false; + if ( it->second.type == ConnPointUserDefined ) + { + std::map::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::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); } } @@ -1188,7 +1745,7 @@ cc_set_active_conn(SPConnectorContext *cc, SPItem *item) { 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) @@ -1234,7 +1791,7 @@ cc_set_active_conn(SPConnectorContext *cc, SPItem *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; @@ -1271,6 +1828,35 @@ cc_set_active_conn(SPConnectorContext *cc, SPItem *item) 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) { @@ -1296,7 +1882,7 @@ bool cc_item_is_connector(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; } } @@ -1394,7 +1980,7 @@ shape_event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, 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")) @@ -1409,6 +1995,12 @@ shape_event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, 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); } diff --git a/src/connector-context.h b/src/connector-context.h index d67e12b81..640a03aae 100644 --- a/src/connector-context.h +++ b/src/connector-context.h @@ -19,7 +19,8 @@ #include #include <2geom/point.h> #include "libavoid/connector.h" - +#include "connection-points.h" +#include #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)) @@ -38,9 +39,18 @@ enum { 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[] = { _("Connection point: click or drag to create a new connector"), + _("Connection point: click to select, drag to move") }; +typedef std::map ConnectionPointMap; struct SPConnectorContext : public SPEventContext { Inkscape::Selection *selection; @@ -48,10 +58,14 @@ struct SPConnectorContext : public SPEventContext { /** \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; @@ -63,6 +77,8 @@ struct SPConnectorContext : public SPEventContext { // The new connector SPItem *newconn; Avoid::ConnRef *newConnRef; + gdouble curvature; + bool isOrthogonal; // The active shape SPItem *active_shape; @@ -78,10 +94,13 @@ struct SPConnectorContext : public SPEventContext { // 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; @@ -93,7 +112,10 @@ struct SPConnectorContextClass : public SPEventContextClass { }; 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 d406f3712..a3ad6f7be 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -63,10 +63,16 @@ #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); @@ -88,15 +94,17 @@ SPDocument::SPDocument() : 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(); @@ -132,6 +140,11 @@ SPDocument::~SPDocument() { profileManager = 0; } + if (router) { + delete router; + router = NULL; + } + if (priv) { if (priv->partial) { sp_repr_free_log(priv->partial); @@ -177,10 +190,15 @@ SPDocument::~SPDocument() { } 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(sp_document_reset_key), @@ -195,13 +213,7 @@ SPDocument::~SPDocument() { keepalive = FALSE; } - if (router) { - delete router; - router = NULL; - } - //delete this->_whiteboard_session_manager; - } void SPDocument::add_persp3d (Persp3D * const /*persp*/) @@ -852,7 +864,12 @@ void 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); } } @@ -908,26 +925,49 @@ SPDocument::_updateDocument() * 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:""); + // 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; } @@ -947,6 +987,24 @@ sp_document_idle_handler(gpointer data) } } +/** + * 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(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 789e3e2ed..06174c265 100644 --- a/src/document.h +++ b/src/document.h @@ -98,6 +98,9 @@ struct SPDocument : public Inkscape::GC::Managed<>, const gchar *actionkey; /// Handler ID guint modified_id; + + /// Connector rerouting handler ID + guint rerouting_handler_id; Inkscape::ProfileManager* profileManager; diff --git a/src/graphlayout/graphlayout.cpp b/src/graphlayout/graphlayout.cpp index cd1683c34..81ea59059 100644 --- a/src/graphlayout/graphlayout.cpp +++ b/src/graphlayout/graphlayout.cpp @@ -31,6 +31,7 @@ #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" diff --git a/src/libavoid/CMakeLists.txt b/src/libavoid/CMakeLists.txt index df532c564..3f408074c 100644 --- a/src/libavoid/CMakeLists.txt +++ b/src/libavoid/CMakeLists.txt @@ -11,6 +11,8 @@ static.cpp timer.cpp vertices.cpp visibility.cpp +orthogonal.cpp +vpsc.cpp ) ADD_LIBRARY(avoid STATIC ${libavoid_SRC}) TARGET_LINK_LIBRARIES(avoid diff --git a/src/libavoid/Makefile_insert b/src/libavoid/Makefile_insert index f75470e26..77728499c 100644 --- a/src/libavoid/Makefile_insert +++ b/src/libavoid/Makefile_insert @@ -11,24 +11,26 @@ libavoid_libavoid_a_SOURCES = \ 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 diff --git a/src/libavoid/connector.cpp b/src/libavoid/connector.cpp index 647303371..d9088dfe7 100644 --- a/src/libavoid/connector.cpp +++ b/src/libavoid/connector.cpp @@ -2,95 +2,236 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + +#include +#include +#include #include + #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) { @@ -106,27 +247,38 @@ ConnRef::~ConnRef() _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(); @@ -141,28 +293,28 @@ void ConnRef::updateEndPoint(const unsigned int type, const Point& point) { 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; @@ -171,8 +323,85 @@ void ConnRef::updateEndPoint(const unsigned int type, const Point& point) // 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; } @@ -203,7 +432,7 @@ unsigned int ConnRef::getDstShapeId(void) void ConnRef::makeActive(void) { - assert(!_active); + COLA_ASSERT(!_active); // Add to connRefs list. _pos = _router->connRefs.insert(_router->connRefs.begin(), this); @@ -213,7 +442,7 @@ void ConnRef::makeActive(void) void ConnRef::makeInactive(void) { - assert(_active); + COLA_ASSERT(_active); // Remove from connRefs list. _router->connRefs.erase(_pos); @@ -221,54 +450,69 @@ void ConnRef::makeInactive(void) } -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; } @@ -286,6 +530,12 @@ VertInf *ConnRef::dst(void) } +VertInf *ConnRef::start(void) +{ + return _startVert; +} + + bool ConnRef::isInitialised(void) { return _initialised; @@ -303,29 +553,8 @@ void ConnRef::unInitialise(void) 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(); } @@ -336,12 +565,11 @@ void ConnRef::setCallback(void (*cb)(void *), void *ptr) } -void ConnRef::handleInvalid(void) +void ConnRef::performCallback(void) { - if (_false_path || _needs_reroute_flag) { - if (_callback) { - _callback(_connector); - } + if (_callback) + { + _callback(_connector); } } @@ -352,79 +580,279 @@ void ConnRef::makePathInvalid(void) } -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 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 @@ -432,25 +860,53 @@ int ConnRef::generatePath(Point p0, Point p1) _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; } @@ -466,6 +922,895 @@ bool ConnRef::doesHateCrossings(void) } +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::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::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 c_path; + std::vector 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); +} + + //============================================================================ } diff --git a/src/libavoid/connector.h b/src/libavoid/connector.h index 64afb4dda..8f7499a29 100644 --- a/src/libavoid/connector.h +++ b/src/libavoid/connector.h @@ -2,93 +2,336 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ +//! @file shape.h +//! @brief Contains the interface for the ConnRef class. + + #ifndef AVOID_CONNECTOR_H #define AVOID_CONNECTOR_H -#include "libavoid/router.h" +#include +#include + +#include "libavoid/vertices.h" #include "libavoid/geometry.h" #include "libavoid/shape.h" -#include namespace Avoid { +class Router; +class ConnRef; +typedef std::list 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; @@ -96,6 +339,69 @@ class ConnRef }; +class PointRep; +typedef std::set PointRepSet; +typedef std::list 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 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 PtOrderMap; +typedef std::set 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 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 20e6f4705..443529ece 100644 --- a/src/libavoid/debug.h +++ b/src/libavoid/debug.h @@ -2,24 +2,27 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + #ifndef AVOID_DEBUG_H #define AVOID_DEBUG_H @@ -42,7 +45,7 @@ inline void db_printf(const char *fmt, ...) va_end(ap); } #else -inline void db_printf(const char */*fmt*/, ...) +inline void db_printf(const char *, ...) { } #endif diff --git a/src/libavoid/geometry.cpp b/src/libavoid/geometry.cpp index 15840c381..2523375cf 100644 --- a/src/libavoid/geometry.cpp +++ b/src/libavoid/geometry.cpp @@ -2,7 +2,8 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * Copyright (C) 2004-2009 Monash University * * -------------------------------------------------------------------- * Much of the code in this module is based on code published with @@ -18,70 +19,42 @@ * 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 */ + +#include + #include "libavoid/graph.h" #include "libavoid/geometry.h" -#include "libavoid/polyutil.h" - -#include +#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)) || @@ -95,6 +68,15 @@ static const bool inBetween(const Point& a, const Point& b, const Point& c) } +// 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. // @@ -104,15 +86,15 @@ bool segmentIntersect(const Point& a, const Point& b, const Point& c, 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, @@ -131,6 +113,37 @@ bool segmentIntersect(const Point& a, const Point& b, const Point& c, } +// 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. // @@ -205,20 +218,9 @@ int cornerSide(const Point &c1, const Point &c2, const Point &c3, 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; } @@ -226,18 +228,37 @@ int cornerSide(const Point &c1, const Point &c2, const Point &c3, } 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) { @@ -248,11 +269,12 @@ 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; } @@ -277,18 +299,27 @@ double angle(const Point& a, const Point& b, const Point& c) // 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& 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; } @@ -299,37 +330,36 @@ bool inPoly(const Polygn& poly, const Point& q) // // 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& 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 @@ -367,7 +397,6 @@ bool inPolyGen(const Polygn& argpoly, const Point& q) } } } - freePoly(poly); // q on the edge if left and right cross are not the same parity. if ( (Rcross % 2) != (Lcross % 2) ) @@ -400,8 +429,7 @@ bool inPolyGen(const Polygn& argpoly, const Point& q) 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; @@ -450,14 +478,13 @@ int segmentIntersectPoint(const Point& a1, const Point& a2, 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; @@ -485,15 +512,49 @@ int segmentIntersectPoint(const Point& a1, const Point& a2, // 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; } diff --git a/src/libavoid/geometry.h b/src/libavoid/geometry.h index 1422be050..abd0d60e2 100644 --- a/src/libavoid/geometry.h +++ b/src/libavoid/geometry.h @@ -2,7 +2,8 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * Copyright (C) 2004-2009 Monash University * * -------------------------------------------------------------------- * Much of the code in this module is based on code published with @@ -18,16 +19,17 @@ * 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 */ @@ -35,21 +37,30 @@ #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. @@ -61,16 +72,22 @@ extern int cornerSide(const Point &c1, const Point &c2, const Point &c3, // // 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; } @@ -100,6 +117,8 @@ static const int DO_INTERSECT = 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); } diff --git a/src/libavoid/geomtypes.h b/src/libavoid/geomtypes.h index dd9d26f2f..ced53e6b0 100644 --- a/src/libavoid/geomtypes.h +++ b/src/libavoid/geomtypes.h @@ -2,70 +2,314 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ +//! @file geomtypes.h +//! @brief Contains the interface for various geometry types and classes. + #ifndef AVOID_GEOMTYPES_H #define AVOID_GEOMTYPES_H +#include +#include + 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. + //! + //! @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 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 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 > 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 1970212df..728f8c085 100644 --- a/src/libavoid/graph.cpp +++ b/src/libavoid/graph.cpp @@ -2,56 +2,61 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + +#include + #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 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(); @@ -67,25 +72,142 @@ EdgeInf::~EdgeInf() } +// 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; } @@ -93,23 +215,35 @@ void EdgeInf::makeActive(void) 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(); @@ -119,11 +253,12 @@ void EdgeInf::makeInactive(void) void EdgeInf::setDist(double dist) { - //assert(dist != 0); + //COLA_ASSERT(dist != 0); if (_added && !_visible) { makeInactive(); + COLA_ASSERT(!_added); } if (!_added) { @@ -135,6 +270,12 @@ void EdgeInf::setDist(double dist) } +bool EdgeInf::added(void) +{ + return _added; +} + + void EdgeInf::alertConns(void) { FlagList::iterator finish = _conns.end(); @@ -161,11 +302,12 @@ void EdgeInf::addCycleBlocker(void) void EdgeInf::addBlocker(int b) { - assert(_router->InvisibilityGrph); + COLA_ASSERT(_router->InvisibilityGrph); if (_added && _visible) { makeInactive(); + COLA_ASSERT(!_added); } if (!_added) { @@ -232,8 +374,11 @@ void EdgeInf::checkVis(void) 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())) @@ -253,8 +398,11 @@ void EdgeInf::checkVis(void) 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())) @@ -274,7 +422,7 @@ void EdgeInf::checkVis(void) db_printf("\tSetting visibility edge... \n\t\t"); db_print(); - double d = dist(iPoint, jPoint); + double d = euclideanDist(iPoint, jPoint); setDist(d); @@ -316,26 +464,39 @@ int EdgeInf::firstBlocker(void) } 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; @@ -358,9 +519,17 @@ bool EdgeInf::isBetween(VertInf *i, VertInf *j) } + // 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) { @@ -372,12 +541,17 @@ VertInf *EdgeInf::otherVert(VertInf *vert) 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 @@ -399,22 +573,17 @@ EdgeInf *EdgeInf::checkEdgeVisibility(VertInf *i, VertInf *j, bool knownNew) } + // 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)) @@ -423,18 +592,24 @@ EdgeInf *EdgeInf::existingEdge(VertInf *i, VertInf *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)) @@ -450,19 +625,45 @@ EdgeInf *EdgeInf::existingEdge(VertInf *i, VertInf *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; @@ -472,7 +673,7 @@ void EdgeList::addEdge(EdgeInf *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 05f03a988..db776b80b 100644 --- a/src/libavoid/graph.h +++ b/src/libavoid/graph.h @@ -2,24 +2,27 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + #ifndef AVOID_GRAPH_H #define AVOID_GRAPH_H @@ -31,6 +34,7 @@ namespace Avoid { + class ConnRef; class Router; @@ -42,8 +46,8 @@ typedef std::list FlagList; 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; @@ -53,6 +57,9 @@ class EdgeInf 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 ids(void); std::pair points(void); @@ -70,6 +77,7 @@ class EdgeInf Router *_router; bool _added; bool _visible; + bool _orthogonal; VertInf *_v1; VertInf *_v2; EdgeInfList::iterator _pos1; @@ -87,12 +95,17 @@ class EdgeInf 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; diff --git a/src/libavoid/libavoid.h b/src/libavoid/libavoid.h index d598c6c74..1d4cd1fdc 100644 --- a/src/libavoid/libavoid.h +++ b/src/libavoid/libavoid.h @@ -2,29 +2,37 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ +//! @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" @@ -32,7 +40,6 @@ #include "libavoid/makepath.h" #include "libavoid/vertices.h" #include "libavoid/visibility.h" -#include "libavoid/static.h" #include "libavoid/router.h" #endif diff --git a/src/libavoid/makepath.cpp b/src/libavoid/makepath.cpp index 3a57f8e4e..4e15dbca9 100644 --- a/src/libavoid/makepath.cpp +++ b/src/libavoid/makepath.cpp @@ -2,43 +2,105 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow * - * -------------------------------------------------------------------- - * 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 */ + +#include +#include +#include +#define _USE_MATH_DEFINES +#include + #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 -#include -#include -#include -#include +#include "libavoid/debug.h" +#include "libavoid/assertions.h" +#ifdef ASTAR_DEBUG + #include +#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) { @@ -56,6 +118,13 @@ static double CrossLength(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); @@ -63,21 +132,45 @@ static double angleBetween(const Point& p1, const Point& p2, const Point& p3) } +// Construct a temporary Polygon path given several VertInf's for a connector. +// +static void constructPolygonPath(Polygon& connRoute, VertInf *inf2, + VertInf *inf3, std::vector& 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& 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. @@ -89,29 +182,83 @@ double cost(ConnRef *lineRef, const double dist, VertInf *inf1, 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; @@ -120,306 +267,237 @@ double cost(ConnRef *lineRef, const double dist, VertInf *inf1, { 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 PENDING; // STL Vectors chosen because of rapid std::vector 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 @@ -427,38 +505,118 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar) // 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)) @@ -466,6 +624,15 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *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) @@ -473,31 +640,49 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar) 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; @@ -508,15 +693,14 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar) // 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; @@ -530,26 +714,24 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar) 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 } } @@ -559,75 +741,52 @@ static void aStarPath(ConnRef *lineRef, VertInf *src, VertInf *tar) // 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 } diff --git a/src/libavoid/makepath.h b/src/libavoid/makepath.h index 4d68a01e3..b40bfbc3d 100644 --- a/src/libavoid/makepath.h +++ b/src/libavoid/makepath.h @@ -2,24 +2,27 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + #ifndef AVOID_MAKEPATH_H #define AVOID_MAKEPATH_H diff --git a/src/libavoid/polyutil.cpp b/src/libavoid/polyutil.cpp deleted file mode 100644 index 1b4b0c619..000000000 --- a/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 - * - * 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 -#include - -#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 deleted file mode 100644 index 9340df5f4..000000000 --- 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 - * - * 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 deleted file mode 100644 index 5a46d7cbb..000000000 --- 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 - * - * 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 -#include -#include -#include -#include - -#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 deleted file mode 100644 index 6a44ccb08..000000000 --- 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 - * - * 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 -#include "libavoid/geomtypes.h" - -namespace Avoid { - -class ShapeRef; - -typedef std::list 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 diff --git a/src/libavoid/router.cpp b/src/libavoid/router.cpp index df0bacd02..754c464b4 100644 --- a/src/libavoid/router.cpp +++ b/src/libavoid/router.cpp @@ -2,302 +2,667 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ -#include + +#include +#include + #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 > 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 (objPtr)); + } + ConnRef *conn(void) const + { + COLA_ASSERT(type == ConnChange); + return (static_cast (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; } @@ -313,13 +678,15 @@ void Router::processMoves(void) 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); } } @@ -331,16 +698,19 @@ void Router::attachedConns(IntList &conns, const unsigned int shapeId, 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. @@ -351,18 +721,127 @@ void Router::attachedShapes(IntList &shapes, const unsigned int shapeId, } - // 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 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 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. @@ -382,8 +861,11 @@ void Router::newBlockingShape(Polygn *poly, int pid) 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 @@ -391,10 +873,14 @@ void Router::newBlockingShape(Polygn *poly, int pid) 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; @@ -422,7 +908,7 @@ void Router::newBlockingShape(Polygn *poly, int pid) void Router::checkAllBlockedEdges(int pid) { - assert(InvisibilityGrph); + COLA_ASSERT(InvisibilityGrph); for (EdgeInf *iter = invisGraph.begin(); iter != invisGraph.end() ; ) { @@ -444,18 +930,9 @@ void Router::checkAllBlockedEdges(int pid) 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) @@ -489,39 +966,79 @@ void Router::checkAllMissingEdges(void) 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); } } @@ -537,14 +1054,21 @@ static double AngleAFromThreeSides(const double a, const double b, 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; @@ -556,7 +1080,7 @@ void Router::markConnectors(ShapeRef *shape) } 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; @@ -609,12 +1133,12 @@ void Router::markConnectors(ShapeRef *shape) 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; @@ -630,16 +1154,15 @@ void Router::markConnectors(ShapeRef *shape) 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; @@ -679,13 +1202,13 @@ void Router::markConnectors(ShapeRef *shape) 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) @@ -698,20 +1221,20 @@ void Router::markConnectors(ShapeRef *shape) 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; @@ -723,6 +1246,81 @@ void Router::markConnectors(ShapeRef *shape) } +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; @@ -735,6 +1333,7 @@ void Router::printInfo(void) 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) @@ -775,9 +1374,15 @@ void Router::printInfo(void) { 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 + @@ -787,12 +1392,462 @@ void Router::printInfo(void) 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, "\n"); + fprintf(fp, "\n", minX, minY, maxX - minX, maxY - minY); + + // Output source code to generate this instance of the router. + fprintf(fp, "\n"); + + + fprintf(fp, "\n"); + shRefIt = shapeRefs.begin(); + while (shRefIt != shapeRefs.end()) + { + ShapeRef *shRef = *shRefIt; + + fprintf(fp, "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, "\n"); + + fprintf(fp, "\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, "\n", + shRef->id(), minX, minY, maxX - minX, maxY - minY); + ++shRefIt; + } + fprintf(fp, "\n"); + + + fprintf(fp, "\n"); + EdgeInf *finish = NULL; + fprintf(fp, "\n"); + finish = visGraph.end(); + for (EdgeInf *t = visGraph.begin(); t != finish; t = t->lstNext) + { + std::pair ids = t->ids(); + bool isShape = (ids.first.isShape) && (ids.second.isShape); + if (!isShape) + { + continue; + } + std::pair 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, "\n", + p1.x, p1.y, p2.x, p2.y, + (!(ids.first.isShape) || !(ids.second.isShape)) ? "green" : + "red"); + } + fprintf(fp, "\n"); + + fprintf(fp, "\n"); + finish = visGraph.end(); + for (EdgeInf *t = visGraph.begin(); t != finish; t = t->lstNext) + { + std::pair ids = t->ids(); + bool isShape = (ids.first.isShape) && (ids.second.isShape); + if (isShape) + { + continue; + } + std::pair 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, "\n", + p1.x, p1.y, p2.x, p2.y, + (!(ids.first.isShape) || !(ids.second.isShape)) ? "green" : + "red"); + } + fprintf(fp, "\n"); + fprintf(fp, "\n"); + + fprintf(fp, "\n"); + finish = visOrthogGraph.end(); + for (EdgeInf *t = visOrthogGraph.begin(); t != finish; t = t->lstNext) + { + std::pair 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 ids = t->ids(); + + fprintf(fp, "\n", + p1.x, p1.y, p2.x, p2.y, + (!(ids.first.isShape) || !(ids.second.isShape)) ? "green" : + "red"); + } + fprintf(fp, "\n"); + + fprintf(fp, "\n"); + ConnRefList::iterator connRefIt = connRefs.begin(); + while (connRefIt != connRefs.end()) + { + ConnRef *connRef = *connRefIt; + + PolyLine route = connRef->route(); + if (!route.empty()) + { + fprintf(fp, "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, "\n"); + + fprintf(fp, "\n"); + connRefIt = connRefs.begin(); + while (connRefIt != connRefs.end()) + { + ConnRef *connRef = *connRefIt; + + PolyLine route = connRef->displayRoute().curvedPolyline(8); + if (!route.empty()) + { + fprintf(fp, "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, "\n"); + + + fprintf(fp, "\n"); + connRefIt = connRefs.begin(); + while (connRefIt != connRefs.end()) + { + ConnRef *connRef = *connRefIt; + + PolyLine route = connRef->displayRoute(); + if (!route.empty()) + { + fprintf(fp, "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, "\n"); + + + fprintf(fp, "\n"); + fclose(fp); } diff --git a/src/libavoid/router.h b/src/libavoid/router.h index 597f48c5e..03060b025 100644 --- a/src/libavoid/router.h +++ b/src/libavoid/router.h @@ -2,94 +2,325 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ +//! @file router.h +//! @brief Contains the interface for the Router class. + #ifndef AVOID_ROUTER_H #define AVOID_ROUTER_H -//#define LINEDEBUG +#include +#include +#include #include "libavoid/shape.h" +#include "libavoid/viscluster.h" #include "libavoid/graph.h" #include "libavoid/timer.h" -#include -#include -#ifdef LINEDEBUG +#include "libavoid/connector.h" + +#if defined(LINEDEBUG) || defined(ASTAR_DEBUG) || defined(LIBAVOID_SDL) #include + #ifndef LIBAVOID_SDL + #define LIBAVOID_SDL + #endif #endif namespace Avoid { -class ConnRef; -typedef std::list ConnRefList; typedef std::list IntList; -class MoveInfo; -typedef std::list MoveInfoList; + +class ActionInfo; +typedef std::list 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, @@ -98,15 +329,49 @@ class Router { 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 c0ff2f6e8..ac3f0c193 100644 --- a/src/libavoid/shape.cpp +++ b/src/libavoid/shape.cpp @@ -2,53 +2,57 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ -#include #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) { @@ -69,17 +73,22 @@ ShapeRef::ShapeRef(Router *router, unsigned int id, Polygn& ply) _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 { @@ -90,41 +99,37 @@ ShapeRef::~ShapeRef() } 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. @@ -144,9 +149,9 @@ void ShapeRef::makeActive(void) 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. @@ -162,7 +167,13 @@ void ShapeRef::makeInactive(void) _active = false; } - + + +bool ShapeRef::isActive(void) const +{ + return _active; +} + VertInf *ShapeRef::firstVert(void) { @@ -176,19 +187,19 @@ VertInf *ShapeRef::lastVert(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; } @@ -196,13 +207,13 @@ Router *ShapeRef::router(void) 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]; @@ -223,8 +234,8 @@ void ShapeRef::removeFromGraph(void) // 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 @@ -239,6 +250,15 @@ void ShapeRef::removeFromGraph(void) // 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); + } } } @@ -251,8 +271,8 @@ void ShapeRef::markForMove(void) } 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 b654c6eea..df4c98df1 100644 --- a/src/libavoid/shape.h +++ b/src/libavoid/shape.h @@ -2,24 +2,30 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ +//! @file shape.h +//! @brief Contains the interface for the ShapeRef class. + + #ifndef AVOID_SHAPE_H #define AVOID_SHAPE_H @@ -35,21 +41,64 @@ class ShapeRef; typedef std::list 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); @@ -60,7 +109,7 @@ class ShapeRef 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 deleted file mode 100644 index 740a4f9c0..000000000 --- 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 - * - * 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 -#include -#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 deleted file mode 100644 index 18e9ac278..000000000 --- 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 - * - * 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 e4349bea9..f8600acbe 100644 --- a/src/libavoid/timer.cpp +++ b/src/libavoid/timer.cpp @@ -2,31 +2,34 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + #include #include -#include -using std::abort; #include #include "libavoid/timer.h" +#include "libavoid/debug.h" +#include "libavoid/assertions.h" namespace Avoid { @@ -52,9 +55,9 @@ void Timer::Reset(void) } -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) { @@ -73,11 +76,7 @@ void Timer::Register(const int t, const bool start) 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; } @@ -85,11 +84,7 @@ void Timer::Start(void) 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; @@ -106,11 +101,7 @@ void Timer::Stop(void) 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) { @@ -136,11 +127,11 @@ void Timer::Stop(void) } -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); } } @@ -148,14 +139,14 @@ void Timer::PrintAll(void) #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 a7e6081fa..9cab6d7ff 100644 --- a/src/libavoid/timer.h +++ b/src/libavoid/timer.h @@ -2,24 +2,27 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + #ifndef PROFILE_H #define PROFILE_H @@ -46,14 +49,20 @@ namespace Avoid { 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; @@ -64,12 +73,12 @@ class Timer { 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]; @@ -82,7 +91,7 @@ class Timer bool running; long count; - int type, lasttype; + TimerIndex type, lasttype; }; diff --git a/src/libavoid/vertices.cpp b/src/libavoid/vertices.cpp index c2be955ac..85226498a 100644 --- a/src/libavoid/vertices.cpp +++ b/src/libavoid/vertices.cpp @@ -2,33 +2,36 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + +#include +#include + #include "libavoid/vertices.h" #include "libavoid/geometry.h" #include "libavoid/graph.h" // For alertConns #include "libavoid/debug.h" #include "libavoid/router.h" - -#include -#include -#include +#include "libavoid/assertions.h" using std::ostream; @@ -76,7 +79,8 @@ bool VertID::operator==(const VertID& rhs) const { return false; } - assert(isShape == rhs.isShape); + // XXX RubberBand search breaks this: + // COLA_ASSERT(isShape == rhs.isShape); return true; } @@ -87,7 +91,7 @@ bool VertID::operator!=(const VertID& rhs) const { return true; } - assert(isShape == rhs.isShape); + COLA_ASSERT(isShape == rhs.isShape); return false; } @@ -133,8 +137,8 @@ void VertID::db_print(void) const } -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) @@ -144,25 +148,57 @@ 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()); } @@ -170,15 +206,12 @@ void VertInf::removeFromGraph(const bool isConnVert) { 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 @@ -186,7 +219,14 @@ void VertInf::removeFromGraph(const bool isConnVert) 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) { @@ -208,7 +248,7 @@ bool directVis(VertInf *src, VertInf *dst) // 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)) @@ -239,40 +279,40 @@ bool directVis(VertInf *src, VertInf *dst) 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)) { @@ -329,10 +369,18 @@ void VertInfList::addVertex(VertInf *vert) } -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)) { @@ -421,6 +469,50 @@ void VertInfList::removeVertex(VertInf *vert) 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; } @@ -447,6 +539,18 @@ VertInf *VertInfList::end(void) } +unsigned int VertInfList::connsSize(void) const +{ + return _connVertices; +} + + +unsigned int VertInfList::shapesSize(void) const +{ + return _shapeVertices; +} + + } diff --git a/src/libavoid/vertices.h b/src/libavoid/vertices.h index 1b0dcf3aa..b07c87f95 100644 --- a/src/libavoid/vertices.h +++ b/src/libavoid/vertices.h @@ -2,24 +2,27 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + #ifndef AVOID_VERTICES_H #define AVOID_VERTICES_H @@ -28,6 +31,7 @@ #include #include #include + #include "libavoid/geomtypes.h" namespace Avoid { @@ -37,16 +41,18 @@ class Router; typedef std::list 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); @@ -64,12 +70,23 @@ class VertID }; +// 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; @@ -80,28 +97,40 @@ class VertInf 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; diff --git a/src/libavoid/visibility.cpp b/src/libavoid/visibility.cpp index d2b057643..089911f35 100644 --- a/src/libavoid/visibility.cpp +++ b/src/libavoid/visibility.cpp @@ -2,26 +2,39 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + #include #include +#define _USE_MATH_DEFINES +#include #include "libavoid/shape.h" #include "libavoid/debug.h" @@ -30,8 +43,7 @@ #include "libavoid/graph.h" #include "libavoid/geometry.h" #include "libavoid/router.h" - -#include +#include "libavoid/assertions.h" #ifdef LINEDEBUG #include "SDL_gfxPrimitives.h" @@ -53,16 +65,7 @@ void shapeVis(ShapeRef *shape) 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; @@ -73,6 +76,11 @@ void shapeVis(ShapeRef *shape) 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); } @@ -80,6 +88,11 @@ void shapeVis(ShapeRef *shape) 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); } } @@ -113,7 +126,7 @@ void vertexVisibility(VertInf *point, VertInf *partner, bool 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) ) { @@ -135,9 +148,14 @@ void vertexVisibility(VertInf *point, VertInf *partner, bool knownNew, 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); } @@ -152,7 +170,6 @@ void vertexVisibility(VertInf *point, VertInf *partner, bool knownNew, static VertInf *centerInf; static Point centerPoint; static VertID centerID; -static double centerAngle; class PointPair @@ -165,19 +182,44 @@ 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; @@ -186,36 +228,48 @@ class PointPair { ang += 360; } + COLA_ASSERT(ang >= 0); + COLA_ASSERT(ang <= 360); return ang; } VertInf *vInf; double angle; + double distance; }; -typedef std::list VertList; +typedef std::set 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 { @@ -239,37 +293,53 @@ class EdgePair } 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 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 SweepEdgeList; #define AHEAD 1 @@ -278,11 +348,11 @@ static bool ppCompare(PointPair& pp1, PointPair& pp2) 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 && @@ -293,58 +363,111 @@ class isBoundingShape 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& 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; } @@ -358,120 +481,128 @@ void vertexSweep(VertInf *vert) 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 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; @@ -479,29 +610,28 @@ void vertexSweep(VertInf *vert) 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) @@ -519,7 +649,6 @@ void vertexSweep(VertInf *vert) if (!cone1 || !cone2) { - lastInf = NULL; if (router->InvisibilityGrph) { db_printf("\tSetting invisibility edge... \n\t\t"); @@ -529,18 +658,15 @@ void vertexSweep(VertInf *vert) } 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); @@ -552,72 +678,55 @@ void vertexSweep(VertInf *vert) 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 } } diff --git a/src/libavoid/visibility.h b/src/libavoid/visibility.h index dd68ac692..92e56d922 100644 --- a/src/libavoid/visibility.h +++ b/src/libavoid/visibility.h @@ -2,24 +2,27 @@ * vim: ts=4 sw=4 et tw=0 wm=0 * * libavoid - Fast, Incremental, Object-avoiding Line Router - * Copyright (C) 2004-2006 Michael Wybrow + * + * 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 */ + #ifndef AVOID_VISIBILITY_H #define AVOID_VISIBILITY_H @@ -28,7 +31,9 @@ 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); diff --git a/src/sp-conn-end-pair.cpp b/src/sp-conn-end-pair.cpp index 4dc0230ff..98b2aec26 100644 --- a/src/sp-conn-end-pair.cpp +++ b/src/sp-conn-end-pair.cpp @@ -12,6 +12,8 @@ #include #include +#include +#include #include "attributes.h" #include "sp-conn-end.h" @@ -26,10 +28,10 @@ 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) { @@ -47,14 +49,6 @@ SPConnEndPair::~SPConnEndPair() 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 @@ -68,6 +62,18 @@ SPConnEndPair::release() 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 @@ -76,16 +82,17 @@ sp_conn_end_pair_build(SPObject *object) 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(); + } } @@ -93,16 +100,40 @@ void 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; @@ -111,17 +142,25 @@ SPConnEndPair::setAttr(unsigned const key, gchar const *const value) _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 @@ -131,11 +170,18 @@ SPConnEndPair::writeRepr(Inkscape::XML::Node *const repr) const 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<_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 @@ -161,19 +207,14 @@ SPConnEndPair::getAttachedItems(SPItem *h2attItem[2]) const { 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 { @@ -187,37 +228,40 @@ SPConnEndPair::getEndpoints(Geom::Point endPts[]) const { } } -sigc::connection -SPConnEndPair::connectInvalidPath(sigc::slot 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) @@ -231,8 +275,8 @@ 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(); @@ -243,19 +287,25 @@ SPConnEndPair::update(void) 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); @@ -278,15 +328,55 @@ SPConnEndPair::makePathInvalid(void) _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+2curveto( 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); @@ -294,26 +384,34 @@ SPConnEndPair::reroutePath(void) 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 9b9e181db..3b011ed17 100644 --- a/src/sp-conn-end-pair.h +++ b/src/sp-conn-end-pair.h @@ -28,6 +28,7 @@ class Node; } } +extern void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, gdouble curvature); class SPConnEndPair { public: @@ -38,19 +39,16 @@ 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 slot); - - // A signal emited by a call back from libavoid. Used to let - // connectors know when they need to reroute themselves. - sigc::signal _invalid_path_signal; - // A sigc connection to listen for connector path invalidation. - sigc::connection _invalid_path_connection; private: SPConnEnd *_connEnd[2]; @@ -61,6 +59,7 @@ private: Avoid::ConnRef *_connRef; int _connType; + gdouble _connCurvature; // A sigc connection for transformed signal. sigc::connection _transformed_connection; @@ -74,8 +73,9 @@ void sp_conn_end_pair_build(SPObject *object); // _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 0b420a98e..52914ee9e 100644 --- a/src/sp-conn-end.cpp +++ b/src/sp-conn-end.cpp @@ -16,7 +16,7 @@ #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::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::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::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(); @@ -128,18 +130,15 @@ static bool try_get_intersect_point_with_item(SPPath& conn, SPItem& item, 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 @@ -234,29 +241,150 @@ sp_conn_end_detach(SPObject *const owner, unsigned const handle_ix) } 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); } } } @@ -277,7 +405,7 @@ sp_conn_end_href_changed(SPObject */*old_ref*/, SPObject */*ref*/, = 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 a565b6404..5e9dbb9da 100644 --- a/src/sp-conn-end.h +++ b/src/sp-conn-end.h @@ -5,6 +5,8 @@ #include #include "sp-use-reference.h" +#include "connection-points.h" +#include "conn-avoid-ref.h" class SPConnEnd { @@ -14,6 +16,15 @@ public: 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; @@ -23,7 +34,7 @@ public: /** 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 &); @@ -32,8 +43,9 @@ private: 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 395048280..9f7157b99 100644 --- 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); @@ -514,6 +515,9 @@ sp_item_set(SPObject *object, unsigned key, gchar const *value) 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); diff --git a/src/svg/stringstream.cpp b/src/svg/stringstream.cpp index 6b9e512a1..431d5d97b 100644 --- a/src/svg/stringstream.cpp +++ b/src/svg/stringstream.cpp @@ -66,6 +66,31 @@ operator<<(Inkscape::SVGOStringStream &os, Geom::Point const & p) 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 5fbf1976c..60ed74ecb 100644 --- a/src/svg/stringstream.h +++ b/src/svg/stringstream.h @@ -74,6 +74,13 @@ public: } }; +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 0388b200f..76e76ea34 100644 --- a/src/ui/icon-names.h +++ b/src/ui/icon-names.h @@ -56,10 +56,18 @@ "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 \ diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 5f163d138..b10c60c79 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -470,13 +470,18 @@ static gchar const * ui_descr = " " " " + " " " " " " + " " + " " " " " " " " " " " " + " " + " " " " "" @@ -7076,6 +7081,13 @@ sp_text_toolbox_new (SPDesktop *desktop) //## 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); @@ -7087,6 +7099,106 @@ static void sp_connector_path_set_ignore(void) 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) @@ -7183,21 +7295,37 @@ static void connector_tb_event_attr_changed(Inkscape::XML::Node *repr, 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 */ @@ -7207,12 +7335,42 @@ static Inkscape::XML::NodeEventVector connector_tb_repr_events = { 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); -- 2.30.2