...
 
Commits (5)
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 32 32.000001"
id="svg2"
version="1.1"
inkscape:version="0.92.2 2405546, 2018-03-11"
sodipodi:docname="light_tool_magnetic_selection.svg"
inkscape:export-filename="C:\dribbble\krita icons\Collaborate\1_flat\tools\light_tool_path_selection.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs4">
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter4429">
<feFlood
flood-opacity="0.501961"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood4431" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite4433" />
<feGaussianBlur
in="composite1"
stdDeviation="0"
result="blur"
id="feGaussianBlur4435" />
<feOffset
dx="0"
dy="-2"
result="offset"
id="feOffset4437" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite4439" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="36.107414"
inkscape:cy="27.180825"
inkscape:document-units="px"
inkscape:current-layer="g4151"
showgrid="false"
units="px"
inkscape:showpageshadow="false"
showborder="true"
inkscape:window-width="1364"
inkscape:window-height="747"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
objecttolerance="20"
inkscape:snap-global="false">
<inkscape:grid
type="xygrid"
id="grid3336"
dotted="false"
empspacing="1"
snapvisiblegridlinesonly="true"
enabled="true"
visible="true"
empcolor="#aaaaff"
empopacity="0.25098039"
color="#7878ff"
opacity="0.1254902"
spacingx="2"
spacingy="2.0000001" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Andrei Rudenko</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="v2"
style="display:inline" />
<g
style="display:inline"
inkscape:label="v3 copy"
id="g4151"
inkscape:groupmode="layer">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#c8c8c8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.04145479;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 14.579019,1.4243258 c -0.04068,0.00421 -0.08144,0.00827 -0.122006,0.012843 0.04075,-0.00454 0.08123,-0.00867 0.122006,-0.012843 z M 1.5907406,6.7776028 V 12.107335 H 8.6264149 V 6.7776028 Z m 21.7769844,0 V 12.03884 H 30.4034 V 6.7776028 Z M 1.6271283,17.220881 c 0.1140499,2.626238 0.8714033,5.100187 2.123331,7.241158 l 5.9568846,-3.664458 c -0.578162,-1.045064 -0.950453,-2.254503 -1.0466817,-3.5767 z m 21.7063497,0.06849 c -0.106183,1.324188 -0.491489,2.532107 -1.080929,3.574559 l 5.961166,3.668739 c 1.265749,-2.138064 2.034165,-4.61405 2.159718,-7.243298 z m -11.684741,5.826317 -3.4439916,6.164509 c 2.2378746,1.53248 4.9036116,2.442259 7.7955356,2.442259 2.845136,0 5.470279,-0.882185 7.686373,-2.369484 l -3.437571,-6.155947 c -1.212757,0.938425 -2.683201,1.483336 -4.248802,1.483336 -1.609989,0 -3.119423,-0.576619 -4.351544,-1.564673 z"
id="path844"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccccccccccccccsccsc" />
<rect
style="opacity:1;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:1.28581953;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect4584"
width="4.4759288"
height="3.8342361"
x="24.734964"
y="1.4169904" />
<rect
y="0.41177323"
x="13.028904"
height="5.6534905"
width="5.9421916"
id="rect4586"
style="opacity:1;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:1.79899764;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
y="1.4169904"
x="2.865325"
height="3.8342361"
width="4.4759288"
id="rect4619"
style="opacity:1;fill:#c8c8c8;fill-opacity:1;stroke:none;stroke-width:1.28581953;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
</svg>
......@@ -28,6 +28,7 @@
<file>dark_tool_outline_selection.svg</file>
<file>dark_tool_pan.svg</file>
<file>dark_tool_path_selection.svg</file>
<file>dark_tool_magnetic_selection.svg</file>
<file>dark_tool_perspectivegrid.svg</file>
<file>dark_tool_polygonal_selection.svg</file>
<file>dark_tool_rect_selection.svg</file>
......@@ -61,6 +62,7 @@
<file>light_tool_outline_selection.svg</file>
<file>light_tool_pan.svg</file>
<file>light_tool_path_selection.svg</file>
<file>light_tool_magnetic_selection.svg</file>
<file>light_tool_perspectivegrid.svg</file>
<file>light_tool_polygonal_selection.svg</file>
<file>light_tool_rect_selection.svg</file>
......
......@@ -7,6 +7,7 @@ set(kritaselectiontools_SOURCES
kis_tool_select_outline.cc
kis_tool_select_path.cc
kis_tool_select_similar.cc
kis_tool_select_magnetic.cc
kis_selection_modifier_mapper.cc
)
......@@ -26,5 +27,6 @@ install( FILES
KisToolSelectRectangular.action
KisToolSelectOutline.action
KisToolSelectPath.action
KisToolSelectMagnetic.action
DESTINATION ${DATA_INSTALL_DIR}/krita/actions
)
<?xml version="1.0" encoding="UTF-8"?>
<ActionCollection version="2" name="Tools">
<Actions category="Magnetic Selection Tool">
<text>Magnetic Selection Tool</text>
</Actions>
</ActionCollection>
/*
* Copyright (c) 2007 Sven Langkamp <sven.langkamp@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kis_tool_select_magnetic.h"
#include <KoPathShape.h>
#include "kis_cursor.h"
#include "kis_image.h"
#include "kis_painter.h"
#include "kis_selection_options.h"
#include "kis_canvas_resource_provider.h"
#include "kis_canvas2.h"
#include "kis_pixel_selection.h"
#include "kis_selection_tool_helper.h"
#include <KisView.h>
KisToolSelectMagnetic::KisToolSelectMagnetic(KoCanvasBase * canvas)
: KisToolSelectBase<KisDelegatedSelectMagneticWrapper>(canvas,
KisCursor::load("tool_magnetic_selection_cursor.svg", 16, 16),
i18n("Select path"),
(KisTool*) (new __KisToolSelectMagneticLocalTool(canvas, this)))
{
}
void KisToolSelectMagnetic::requestStrokeEnd()
{
localTool()->endPathWithoutLastPoint();
}
void KisToolSelectMagnetic::requestStrokeCancellation()
{
localTool()->cancelPath();
}
void KisToolSelectMagnetic::mousePressEvent(KoPointerEvent* event)
{
if (!selectionEditable()) return;
DelegatedSelectMagneticTool::mousePressEvent(event);
}
// Install an event filter to catch right-click events.
// This code is duplicated in kis_tool_path.cc
bool KisToolSelectMagnetic::eventFilter(QObject *obj, QEvent *event)
{
Q_UNUSED(obj);
if (event->type() == QEvent::MouseButtonPress ||
event->type() == QEvent::MouseButtonDblClick) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if (mouseEvent->button() == Qt::RightButton) {
localTool()->removeLastPoint();
return true;
}
} else if (event->type() == QEvent::TabletPress) {
QTabletEvent *tabletEvent = static_cast<QTabletEvent*>(event);
if (tabletEvent->button() == Qt::RightButton) {
localTool()->removeLastPoint();
return true;
}
}
return false;
}
QList<QPointer<QWidget> > KisToolSelectMagnetic::createOptionWidgets()
{
QList<QPointer<QWidget> > widgetsList =
DelegatedSelectMagneticTool::createOptionWidgets();
QList<QPointer<QWidget> > filteredWidgets;
Q_FOREACH (QWidget* widget, widgetsList) {
if (widget->objectName() != "Stroke widget") {
filteredWidgets.push_back(widget);
}
}
return filteredWidgets;
}
bool KisDelegatedSelectMagneticWrapper::hasUserInteractionRunning() const
{
/**
* KoCreatePathTool doesn't support moving interventions from KisToolselectBase,
* because it doesn't use begin/continue/endPrimaryAction and uses direct event
* handling instead.
*
* TODO: refactor KoCreatePathTool and port it to action infrastructure
*/
return true;
}
__KisToolSelectMagneticLocalTool::__KisToolSelectMagneticLocalTool(KoCanvasBase * canvas, KisToolSelectMagnetic* parentTool)
: KoCreatePathTool(canvas), m_selectionTool(parentTool)
{
setEnableClosePathShortcut(false);
}
void __KisToolSelectMagneticLocalTool::paintPath(KoPathShape &pathShape, QPainter &painter, const KoViewConverter &converter)
{
Q_UNUSED(converter);
KisCanvas2 * kisCanvas = dynamic_cast<KisCanvas2*>(canvas());
if (!kisCanvas)
return;
QTransform matrix;
matrix.scale(kisCanvas->image()->xRes(), kisCanvas->image()->yRes());
matrix.translate(pathShape.position().x(), pathShape.position().y());
qreal zoomX, zoomY;
kisCanvas->viewConverter()->zoom(&zoomX, &zoomY);
Q_ASSERT(qFuzzyCompare(zoomX, zoomY));
m_selectionTool->paintToolOutline(&painter, m_selectionTool->pixelToView(matrix.map(pathShape.outline())));
}
void __KisToolSelectMagneticLocalTool::addPathShape(KoPathShape* pathShape)
{
pathShape->normalize();
pathShape->close();
KisCanvas2 * kisCanvas = dynamic_cast<KisCanvas2*>(canvas());
if (!kisCanvas)
return;
KisImageWSP image = kisCanvas->image();
KisSelectionToolHelper helper(kisCanvas, kundo2_i18n("Select by Bezier Curve"));
const SelectionMode mode =
helper.tryOverrideSelectionMode(kisCanvas->viewManager()->selection(),
m_selectionTool->selectionMode(),
m_selectionTool->selectionAction());
if (mode == PIXEL_SELECTION) {
KisPixelSelectionSP tmpSel = KisPixelSelectionSP(new KisPixelSelection());
KisPainter painter(tmpSel);
painter.setPaintColor(KoColor(Qt::black, tmpSel->colorSpace()));
painter.setFillStyle(KisPainter::FillStyleForegroundColor);
painter.setAntiAliasPolygonFill(m_selectionTool->antiAliasSelection());
painter.setStrokeStyle(KisPainter::StrokeStyleNone);
QTransform matrix;
matrix.scale(image->xRes(), image->yRes());
matrix.translate(pathShape->position().x(), pathShape->position().y());
QPainterPath path = matrix.map(pathShape->outline());
painter.fillPainterPath(path);
tmpSel->setOutlineCache(path);
helper.selectPixelSelection(tmpSel, m_selectionTool->selectionAction());
delete pathShape;
} else {
helper.addSelectionShape(pathShape, m_selectionTool->selectionAction());
}
}
void KisToolSelectMagnetic::resetCursorStyle()
{
if (selectionAction() == SELECTION_ADD) {
useCursor(KisCursor::load("tool_polygonal_selection_cursor_add.png", 6, 6));
} else if (selectionAction() == SELECTION_SUBTRACT) {
useCursor(KisCursor::load("tool_polygonal_selection_cursor_sub.png", 6, 6));
} else {
KisToolSelectBase<KisDelegatedSelectMagneticWrapper>::resetCursorStyle();
}
}
/*
* Copyright (c) 2007 Sven Langkamp <sven.langkamp@gmail.com>
* Copyright (c) 2015 Michael Abrahams <miabraha@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef KIS_TOOL_SELECT_MAGNETIC_H_
#define KIS_TOOL_SELECT_MAGNETIC_H_
#include <KoCreatePathTool.h>
#include <KisSelectionToolFactoryBase.h>
#include "kis_tool_select_base.h"
#include "kis_delegated_tool.h"
#include <kis_icon.h>
class KoCanvasBase;
class KisToolSelectMagnetic;
class __KisToolSelectMagneticLocalTool : public KoCreatePathTool {
public:
__KisToolSelectMagneticLocalTool(KoCanvasBase * canvas, KisToolSelectMagnetic* parentTool);
void paintPath(KoPathShape &path, QPainter &painter, const KoViewConverter &converter) override;
void addPathShape(KoPathShape* pathShape) override;
friend class KisToolSelectMagnetic;
using KoCreatePathTool::createOptionWidgets;
using KoCreatePathTool::endPathWithoutLastPoint;
using KoCreatePathTool::endPath;
using KoCreatePathTool::cancelPath;
using KoCreatePathTool::removeLastPoint;
private:
KisToolSelectMagnetic* const m_selectionTool;
};
typedef KisDelegatedTool<KisTool, __KisToolSelectMagneticLocalTool,
DeselectShapesActivationPolicy> DelegatedSelectMagneticTool;
struct KisDelegatedSelectMagneticWrapper : public DelegatedSelectMagneticTool {
KisDelegatedSelectMagneticWrapper(KoCanvasBase *canvas,
const QCursor &cursor,
KisTool* delegateTool)
: DelegatedSelectMagneticTool(canvas, cursor, (__KisToolSelectMagneticLocalTool*)delegateTool)
{
}
// If an event is explicitly forwarded only as an action (e.g. shift-click is captured by "change size")
// we will receive a primary action but no mousePressEvent. Thus these events must be explicitly forwarded.
void beginPrimaryAction(KoPointerEvent *event) override { mousePressEvent(event); }
void continuePrimaryAction(KoPointerEvent *event) override { mouseMoveEvent(event); }
void endPrimaryAction(KoPointerEvent *event) override { mouseReleaseEvent(event); }
bool hasUserInteractionRunning() const;
};
class KisToolSelectMagnetic : public KisToolSelectBase<KisDelegatedSelectMagneticWrapper>
{
Q_OBJECT
public:
KisToolSelectMagnetic(KoCanvasBase * canvas);
void mousePressEvent(KoPointerEvent* event) override;
bool eventFilter(QObject *obj, QEvent *event) override;
void resetCursorStyle() override;
protected:
void requestStrokeCancellation() override;
void requestStrokeEnd() override;
friend class __KisToolSelectMagneticLocalTool;
QList<QPointer<QWidget> > createOptionWidgets() override;
};
class KisToolSelectMagneticFactory : public KisSelectionToolFactoryBase
{
public:
KisToolSelectMagneticFactory()
: KisSelectionToolFactoryBase("KisToolSelectMagnetic") {
setToolTip(i18n("Magnetic Selection Tool"));
setSection(TOOL_TYPE_SELECTION);
setActivationShapeId(KRITA_TOOL_ACTIVATION_ID);
setIconName(koIconNameCStr("tool_magnetic_selection"));
setPriority(6);
}
~KisToolSelectMagneticFactory() override {}
KoToolBase * createTool(KoCanvasBase *canvas) override {
return new KisToolSelectMagnetic(canvas);
}
};
#endif // KIS_TOOL_SELECT_MAGNETIC_H_
......@@ -52,8 +52,6 @@ public:
void resetCursorStyle();
};
class KisToolSelectPolygonalFactory : public KisSelectionToolFactoryBase
{
public:
......
......@@ -36,6 +36,7 @@
#include "kis_tool_select_elliptical.h"
#include "kis_tool_select_path.h"
#include "kis_tool_select_similar.h"
#include "kis_tool_select_magnetic.h"
K_PLUGIN_FACTORY_WITH_JSON(SelectionToolsFactory, "kritaselectiontools.json", registerPlugin<SelectionTools>();)
......@@ -50,6 +51,7 @@ SelectionTools::SelectionTools(QObject *parent, const QVariantList &)
KoToolRegistry::instance()->add(new KisToolSelectContiguousFactory());
KoToolRegistry::instance()->add(new KisToolSelectPathFactory());
KoToolRegistry::instance()->add(new KisToolSelectSimilarFactory());
KoToolRegistry::instance()->add(new KisToolSelectMagneticFactory());
}
SelectionTools::~SelectionTools()
......
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
<RCC>
<qresource prefix="/">
<file>tool_contiguous_selection_cursor_add.png</file>
<file>tool_contiguous_selection_cursor.png</file>
<file>tool_contiguous_selection_cursor_sub.png</file>
......@@ -20,5 +19,7 @@
<file>tool_similar_selection_cursor_add.png</file>
<file>tool_similar_selection_cursor.png</file>
<file>tool_similar_selection_cursor_sub.png</file>
<file>tool_magnetic_selection_cursor.png</file>
<file>tool_magnetic_selection_cursor.svg</file>
</qresource>
</RCC>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666665 8.4666669"
version="1.1"
id="svg8"
inkscape:export-filename="/home/geny/dev/krita-master/krita/plugins/tools/selectiontools/tool_magnetic_selection_cursor.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
inkscape:version="0.92.2 2405546, 2018-03-11"
sodipodi:docname="tool_magnetic_selection_cursor.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#b5b5b5"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="23.518439"
inkscape:cy="14.612518"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:snap-global="false"
inkscape:window-width="1364"
inkscape:window-height="747"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-288.53332)">
<circle
style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path823"
cx="4.2333331"
cy="292.76666"
r="4.0012364" />
<circle
cy="292.76666"
cx="4.2333331"
id="circle825"
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.30186912;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
r="3.6643672" />
<path
style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 3.9105678,290.18408 v 2.2598 H 1.6507552 v 0.64555 h 2.2598126 v 2.2598 h 0.6455311 v -2.2598 h 2.2598126 v -0.64555 H 4.5560989 v -2.2598 z"
id="rect827"
inkscape:connector-curvature="0" />
</g>
</svg>