High DPI support: Convert sketcher cursors to SVG

Remove xpm
This commit is contained in:
Vanuan
2020-07-18 12:36:11 +03:00
committed by wmayer
parent fa111f86ad
commit 65e66c9e62
29 changed files with 845 additions and 1768 deletions

View File

@@ -23,6 +23,7 @@
#include "PreCompiled.h"
#ifndef _PreComp_
# include <QString>
# include <QApplication>
# include <QBitmap>
# include <QDir>
@@ -36,7 +37,6 @@
# include <QStyleOption>
# include <sstream>
#endif
#if defined (FC_OS_WIN32) && QT_VERSION < 0x050000
#define QTWEBKIT
#endif
@@ -296,7 +296,8 @@ QPixmap BitmapFactoryInst::pixmap(const char* name) const
return QPixmap(not_found);
}
QPixmap BitmapFactoryInst::pixmapFromSvg(const char* name, const QSize& size) const
QPixmap BitmapFactoryInst::pixmapFromSvg(const char* name, const QSizeF& size,
const std::map<unsigned long, unsigned long>& colorMapping) const
{
// If an absolute path is given
QPixmap icon;
@@ -325,15 +326,26 @@ QPixmap BitmapFactoryInst::pixmapFromSvg(const char* name, const QSize& size) co
QFile file(iconPath);
if (file.open(QFile::ReadOnly | QFile::Text)) {
QByteArray content = file.readAll();
icon = pixmapFromSvg(content, size);
icon = pixmapFromSvg(content, size, colorMapping);
}
}
return icon;
}
QPixmap BitmapFactoryInst::pixmapFromSvg(const QByteArray& contents, const QSize& size) const
QPixmap BitmapFactoryInst::pixmapFromSvg(const QByteArray& originalContents, const QSizeF& size,
const std::map<unsigned long, unsigned long>& colorMapping) const
{
QString stringContents = QString::fromUtf8(originalContents);
for ( const auto &colorToColor : colorMapping ) {
ulong fromColor = colorToColor.first;
ulong toColor = colorToColor.second;
QString fromColorString = QString::fromLatin1(":#%1;").arg(fromColor, 6, 16, QChar::fromLatin1('0'));
QString toColorString = QString::fromLatin1(":#%1;").arg(toColor, 6, 16, QChar::fromLatin1('0'));
stringContents = stringContents.replace(fromColorString, toColorString);
}
QByteArray contents = stringContents.toUtf8();
#ifdef QTWEBKIT
// There is a crash when using the Webkit engine in debug mode
// for a couple of SVG files. Thus, use the qsvg plugin.
@@ -419,7 +431,7 @@ QPixmap BitmapFactoryInst::pixmapFromSvg(const QByteArray& contents, const QSize
return QPixmap::fromImage(image);
#endif // QT_VERSION
#else //QTWEBKIT
QImage image(size, QImage::Format_ARGB32_Premultiplied);
QImage image(size.toSize(), QImage::Format_ARGB32_Premultiplied);
image.fill(0x00000000);
QPainter p(&image);

View File

@@ -77,13 +77,19 @@ public:
QPixmap pixmap(const char* name) const;
/** Retrieves a pixmap by name and size created by an
* scalable vector graphics (SVG).
*
* @param colorMapping - a dictionary of substitute colors.
* Can be used to customize icon color scheme, e.g. crosshair color
*/
QPixmap pixmapFromSvg(const char* name, const QSize& size) const;
QPixmap pixmapFromSvg(const char* name, const QSizeF& size,
const std::map<unsigned long, unsigned long>& colorMapping = std::map<unsigned long, unsigned long>()) const;
/** This method is provided for convenience and does the same
* as the method above except that it creates the pixmap from
* a byte array.
* @param colorMapping - see above.
*/
QPixmap pixmapFromSvg(const QByteArray& contents, const QSize& size) const;
QPixmap pixmapFromSvg(const QByteArray& contents, const QSizeF& size,
const std::map<unsigned long, unsigned long>& colorMapping = std::map<unsigned long, unsigned long>()) const;
/** Returns the names of all registered pixmaps.
* To get the appropriate pixmaps call pixmap() for each name.
*/

View File

@@ -803,8 +803,6 @@ protected:
*/
std::vector<std::vector<SketcherGui::SelType> > allowedSelSequences;
const char** constraintCursor = 0;
virtual void applyConstraint(std::vector<SelIdPair> &, int) {}
virtual void activated(int /*iMsg*/);
virtual bool isActive(void)
@@ -813,49 +811,11 @@ protected:
extern char cursor_crosshair_color[];
/* XPM */
static const char *cursor_genericconstraint[]={
"32 32 2 1",
" c None",
cursor_crosshair_color,
" + ",
" + ",
" + ",
" + ",
" + ",
" ",
"+++++ +++++ ",
" ",
" + ",
" + ",
" + ",
" + ",
" + ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",};
class DrawSketchHandlerGenConstraint: public DrawSketchHandler
{
public:
DrawSketchHandlerGenConstraint(const char* cursor[], CmdSketcherConstraint *_cmd)
: constraintCursor(cursor), cmd(_cmd), seqIndex(0) {}
DrawSketchHandlerGenConstraint(CmdSketcherConstraint *_cmd)
: cmd(_cmd), seqIndex(0) {}
virtual ~DrawSketchHandlerGenConstraint()
{
Gui::Selection().rmvSelectionGate();
@@ -872,17 +832,25 @@ public:
Gui::Selection().rmvSelectionGate();
Gui::Selection().addSelectionGate(selFilterGate);
setCrosshairColor();
// Constrain icon size in px
int iconSize = 16;
QPixmap cursorPixmap(cursor_genericconstraint),
icon = Gui::BitmapFactory().pixmap(cmd->sPixmap).scaledToWidth(iconSize);
qreal pixelRatio = devicePixelRatio();
const unsigned long defaultCrosshairColor = 0xFFFFFF;
unsigned long color = getCrosshairColor();
auto colorMapping = std::map<unsigned long, unsigned long>();
colorMapping[defaultCrosshairColor] = color;
qreal fullIconWidth = 32 * pixelRatio;
qreal iconWidth = 16 * pixelRatio;
QPixmap cursorPixmap = Gui::BitmapFactory().pixmapFromSvg("Sketcher_Crosshair", QSizeF(fullIconWidth, fullIconWidth), colorMapping),
icon = Gui::BitmapFactory().pixmapFromSvg(cmd->sPixmap, QSizeF(iconWidth, iconWidth));
QPainter cursorPainter;
cursorPainter.begin(&cursorPixmap);
cursorPainter.drawPixmap(16, 16, icon);
cursorPainter.drawPixmap(16 * pixelRatio, 16 * pixelRatio, icon);
cursorPainter.end();
setCursor(cursorPixmap, 7, 7);
#if QT_VERSION >= 0x050000
cursorPixmap.setDevicePixelRatio(pixelRatio);
#endif
setCursor(cursorPixmap, 7 * pixelRatio, 7 * pixelRatio, false);
}
virtual void mouseMove(Base::Vector2d /*onSketchPos*/) {}
@@ -983,7 +951,6 @@ public:
}
protected:
const char** constraintCursor;
CmdSketcherConstraint* cmd;
GenericConstraintSelection* selFilterGate = nullptr;
@@ -1018,51 +985,12 @@ protected:
void CmdSketcherConstraint::activated(int /*iMsg*/)
{
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
}
// ============================================================================
/* XPM */
static const char *cursor_createhoriconstraint[]={
"32 32 3 1",
"+ c white",
"# c red",
". c None",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"................................",
"+++++...+++++...................",
"................................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+......#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............############.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
"................................",
"................................",
"................................",
"................................",
"................................",
"................................",
"................................"};
class CmdSketcherConstrainHorizontal : public CmdSketcherConstraint
{
public:
@@ -1090,7 +1018,6 @@ CmdSketcherConstrainHorizontal::CmdSketcherConstrainHorizontal()
eType = ForEdit;
allowedSelSequences = {{SelEdge}};
constraintCursor = cursor_createhoriconstraint;
}
void CmdSketcherConstrainHorizontal::activated(int iMsg)
@@ -1107,7 +1034,7 @@ void CmdSketcherConstrainHorizontal::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
@@ -1272,44 +1199,6 @@ void CmdSketcherConstrainHorizontal::applyConstraint(std::vector<SelIdPair> &sel
// ================================================================================
static const char *cursor_createvertconstraint[]={
"32 32 3 1",
"+ c white",
"# c red",
". c None",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"................................",
"+++++...+++++...................",
"................................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+......#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
".............#..........#.......",
"..............#........#........",
"...............#......#.........",
"................#....#..........",
".................#..#...........",
"..................##............",
"................................",
"................................",
"................................",
"................................",
"................................",
"................................",
"................................"};
class CmdSketcherConstrainVertical : public CmdSketcherConstraint
{
public:
@@ -1337,7 +1226,6 @@ CmdSketcherConstrainVertical::CmdSketcherConstrainVertical()
eType = ForEdit;
allowedSelSequences = {{SelEdge}};
constraintCursor = cursor_createvertconstraint;
}
void CmdSketcherConstrainVertical::activated(int iMsg)
@@ -1354,7 +1242,7 @@ void CmdSketcherConstrainVertical::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
@@ -1516,45 +1404,6 @@ void CmdSketcherConstrainVertical::applyConstraint(std::vector<SelIdPair> &selSe
// ======================================================================================
/* XPM */
static const char *cursor_createlock[]={
"32 32 3 1",
"+ c white",
"# c red",
". c None",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"................................",
"+++++...+++++...................",
"................................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+..........###............",
"................######..........",
"...............##....##.........",
"..............##......##........",
"..............##......##........",
".............############.......",
".............############.......",
".............############.......",
".............############.......",
".............############.......",
".............############.......",
".............############.......",
".............############.......",
"................................",
"................................",
"................................",
"................................",
"................................",
"................................",
"................................"};
class CmdSketcherConstrainLock : public CmdSketcherConstraint
{
public:
@@ -1581,7 +1430,6 @@ CmdSketcherConstrainLock::CmdSketcherConstrainLock()
eType = ForEdit;
allowedSelSequences = {{SelVertex}};
constraintCursor = cursor_createlock;
}
void CmdSketcherConstrainLock::activated(int iMsg)
@@ -1598,7 +1446,7 @@ void CmdSketcherConstrainLock::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
@@ -1777,45 +1625,6 @@ void CmdSketcherConstrainLock::updateAction(int mode)
// ======================================================================================
/* XPM */
static const char *cursor_createblock[]={
"32 32 3 1",
"+ c white",
"# c red",
". c None",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"................................",
"+++++...+++++...................",
"................................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+.........................",
"......+..........###............",
"....................##..........",
".....................##.........",
"......................##........",
"......................##........",
".............############.......",
".............###########........",
".............##########.........",
".............########...........",
".............#######............",
".............########...........",
".............##########.........",
".............###########........",
".............############.......",
"......................##........",
"......................##........",
".....................##.........",
"....................##..........",
".................###............",
"................................"};
class CmdSketcherConstrainBlock : public CmdSketcherConstraint
{
public:
@@ -1841,7 +1650,6 @@ CmdSketcherConstrainBlock::CmdSketcherConstrainBlock()
eType = ForEdit;
allowedSelSequences = {{SelEdge}};
constraintCursor = cursor_createblock;
}
void CmdSketcherConstrainBlock::activated(int iMsg)
@@ -1858,7 +1666,7 @@ void CmdSketcherConstrainBlock::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
@@ -2147,7 +1955,6 @@ CmdSketcherConstrainCoincident::CmdSketcherConstrainCoincident()
eType = ForEdit;
allowedSelSequences = {{SelVertex, SelVertexOrRoot}, {SelRoot, SelVertex}};
constraintCursor = cursor_createcoincident;
}
void CmdSketcherConstrainCoincident::activated(int iMsg)
@@ -2164,7 +1971,7 @@ void CmdSketcherConstrainCoincident::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
// TODO: Get the exact message from git history and put it here
@@ -2339,7 +2146,6 @@ CmdSketcherConstrainDistance::CmdSketcherConstrainDistance()
{SelEdge}, {SelExternalEdge},
{SelVertex, SelEdgeOrAxis}, {SelRoot, SelEdge},
{SelVertex, SelExternalEdge}, {SelRoot, SelExternalEdge}};
constraintCursor = cursor_genericconstraint;
}
void CmdSketcherConstrainDistance::activated(int iMsg)
@@ -2355,7 +2161,7 @@ void CmdSketcherConstrainDistance::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
}
@@ -2650,45 +2456,6 @@ void CmdSketcherConstrainDistance::updateAction(int mode)
// ======================================================================================
/* XPM */
static const char * cursor_createpointonobj[] = {
"32 32 3 1",
" c None",
". c #FFFFFF",
"+ c #FF0000",
" . ",
" . ++++",
" . ++++++",
" . +++++++ ",
" . ++++++ ",
" ++++++ ",
"..... ..... +++++ ",
" +++++ ",
" . +++ ++++ ",
" . +++++++++ ",
" . ++++++++ ",
" . +++++++++ ",
" . +++++++++ ",
" +++++++++ ",
" +++++++ ",
" ++++++++ ",
" +++++++ ",
" +++ ",
" +++ ",
" +++ ",
" +++ ",
" +++ ",
" +++ ",
" +++ ",
" +++ ",
" ++ ",
" +++ ",
" ++ ",
" +++ ",
" +++ ",
" ++ ",
" ++ "};
class CmdSketcherConstrainPointOnObject : public CmdSketcherConstraint
{
public:
@@ -2720,7 +2487,6 @@ CmdSketcherConstrainPointOnObject::CmdSketcherConstrainPointOnObject()
{SelVertex, SelExternalEdge},
{SelEdge, SelVertexOrRoot}, {SelEdgeOrAxis, SelVertex},
{SelExternalEdge, SelVertex}};
constraintCursor = cursor_createpointonobj;
}
@@ -2737,7 +2503,7 @@ void CmdSketcherConstrainPointOnObject::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
// TODO: Get the exact message from git history and put it here
@@ -2903,7 +2669,6 @@ CmdSketcherConstrainDistanceX::CmdSketcherConstrainDistanceX()
allowedSelSequences = {{SelVertex, SelVertexOrRoot}, {SelRoot, SelVertex},
{SelEdge}, {SelExternalEdge}}; // Can't do single vertex because its a prefix for 2 vertices
constraintCursor = cursor_genericconstraint;
}
void CmdSketcherConstrainDistanceX::activated(int iMsg)
@@ -2919,7 +2684,7 @@ void CmdSketcherConstrainDistanceX::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
}
else {
@@ -3150,7 +2915,6 @@ CmdSketcherConstrainDistanceY::CmdSketcherConstrainDistanceY()
allowedSelSequences = {{SelVertex, SelVertexOrRoot}, {SelRoot, SelVertex},
{SelEdge}, {SelExternalEdge}}; // Can't do single vertex because its a prefix for 2 vertices
constraintCursor = cursor_genericconstraint;
}
void CmdSketcherConstrainDistanceY::activated(int iMsg)
@@ -3166,7 +2930,7 @@ void CmdSketcherConstrainDistanceY::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
// TODO: Get the exact message from git history and put it here
@@ -3365,45 +3129,6 @@ void CmdSketcherConstrainDistanceY::updateAction(int mode)
//=================================================================================
/* XPM */
static const char *cursor_createparallel[]={
"32 32 3 1",
" c None",
". c #FFFFFF",
"+ c #FF0000",
" . ",
" . ",
" . ",
" . ",
" . ",
" ",
"..... ..... ",
" ",
" . ",
" . ",
" . + + ",
" . ++ ++ ",
" . + + ",
" ++ ++ ",
" + + ",
" ++ ++ ",
" + + ",
" ++ ++ ",
" + + ",
" ++ ++ ",
" + + ",
" ++ ++ ",
" + + ",
" ++ ++ ",
" + + ",
" ++ ++ ",
" + + ",
" ++ ++ ",
" + + ",
" ",
" ",
" "};
class CmdSketcherConstrainParallel : public CmdSketcherConstraint
{
public:
@@ -3432,7 +3157,6 @@ CmdSketcherConstrainParallel::CmdSketcherConstrainParallel()
// TODO: Also needed: ExternalEdges
allowedSelSequences = {{SelEdge, SelEdgeOrAxis}, {SelEdgeOrAxis, SelEdge},
{SelEdge, SelExternalEdge}, {SelExternalEdge, SelEdge}};
constraintCursor = cursor_createparallel;
}
void CmdSketcherConstrainParallel::activated(int iMsg)
@@ -3448,7 +3172,7 @@ void CmdSketcherConstrainParallel::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
// TODO: Get the exact message from git history and put it here
@@ -3555,45 +3279,6 @@ void CmdSketcherConstrainParallel::applyConstraint(std::vector<SelIdPair> &selSe
// ======================================================================================
/* XPM */
static const char *cursor_createperpconstraint[] = {
"32 32 3 1",
" c None",
". c #FFFFFF",
"+ c #FF0000",
" . ",
" . ",
" . ",
" . ",
" . ",
" ",
"..... ..... ",
" ",
" . ",
" . ",
" . ",
" . ++ ",
" . ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++ ",
" ++++++++++++++++++++ ",
" ++++++++++++++++++++ ",
" ",
" "};
class CmdSketcherConstrainPerpendicular : public CmdSketcherConstraint
{
public:
@@ -3631,7 +3316,6 @@ CmdSketcherConstrainPerpendicular::CmdSketcherConstrainPerpendicular()
{SelEdge, SelVertexOrRoot, SelExternalEdge},
{SelExternalEdge, SelVertexOrRoot, SelEdge}};
;
constraintCursor = cursor_createperpconstraint;
}
void CmdSketcherConstrainPerpendicular::activated(int iMsg)
@@ -3654,7 +3338,7 @@ void CmdSketcherConstrainPerpendicular::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
// TODO: Get the exact message from git history and put it here
@@ -4237,7 +3921,6 @@ CmdSketcherConstrainTangent::CmdSketcherConstrainTangent()
{SelEdge, SelVertexOrRoot, SelExternalEdge},
{SelExternalEdge, SelVertexOrRoot, SelEdge}, /* Two Curves and a Point */
{SelVertexOrRoot, SelVertex} /*Two Endpoints*/ /*No Place for One Endpoint and One Curve*/};
constraintCursor = cursor_genericconstraint;
}
void CmdSketcherConstrainTangent::activated(int iMsg)
@@ -4260,7 +3943,7 @@ void CmdSketcherConstrainTangent::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
strError = QObject::tr("Select some geometry from the sketch.", "tangent constraint");
@@ -4871,7 +4554,6 @@ CmdSketcherConstrainRadius::CmdSketcherConstrainRadius()
eType = ForEdit;
allowedSelSequences = {{SelEdge}, {SelExternalEdge}};
constraintCursor = cursor_genericconstraint;
}
void CmdSketcherConstrainRadius::activated(int iMsg)
@@ -4887,7 +4569,7 @@ void CmdSketcherConstrainRadius::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
// TODO: Get the exact message from git history and put it here
@@ -5330,7 +5012,6 @@ CmdSketcherConstrainDiameter::CmdSketcherConstrainDiameter()
eType = ForEdit;
allowedSelSequences = {{SelEdge}, {SelExternalEdge}};
constraintCursor = cursor_genericconstraint;
}
void CmdSketcherConstrainDiameter::activated(int iMsg)
@@ -5346,7 +5027,7 @@ void CmdSketcherConstrainDiameter::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
// TODO: Get the exact message from git history and put it here
@@ -5904,7 +5585,6 @@ CmdSketcherConstrainAngle::CmdSketcherConstrainAngle()
{SelVertexOrRoot, SelEdge, SelExternalEdge},
{SelVertexOrRoot, SelExternalEdge, SelEdge},
{SelVertexOrRoot, SelExternalEdge, SelExternalEdge}};
constraintCursor = cursor_genericconstraint;
}
void CmdSketcherConstrainAngle::activated(int iMsg)
@@ -5921,7 +5601,7 @@ void CmdSketcherConstrainAngle::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
// TODO: Get the exact message from git history and put it here
@@ -6394,7 +6074,6 @@ CmdSketcherConstrainEqual::CmdSketcherConstrainEqual()
allowedSelSequences = {{SelEdge, SelEdge}, {SelEdge, SelExternalEdge},
{SelExternalEdge, SelEdge}}; // Only option for equal constraint
constraintCursor = cursor_genericconstraint;
}
void CmdSketcherConstrainEqual::activated(int iMsg)
@@ -6410,7 +6089,7 @@ void CmdSketcherConstrainEqual::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
@@ -6592,7 +6271,6 @@ CmdSketcherConstrainSymmetric::CmdSketcherConstrainSymmetric()
{SelVertex, SelVertexOrRoot, SelVertex},
{SelVertex, SelVertex, SelVertexOrRoot},
{SelVertexOrRoot, SelVertex, SelVertex}};
constraintCursor = cursor_genericconstraint;
}
void CmdSketcherConstrainSymmetric::activated(int iMsg)
@@ -6608,7 +6286,7 @@ void CmdSketcherConstrainSymmetric::activated(int iMsg)
if (constraintMode) {
ActivateHandler(getActiveGuiDocument(),
new DrawSketchHandlerGenConstraint(constraintCursor, this));
new DrawSketchHandlerGenConstraint(this));
getSelection().clearSelection();
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),

File diff suppressed because it is too large Load Diff

View File

@@ -91,20 +91,130 @@ int DrawSketchHandler::getHighestCurveIndex(void)
return sketchgui->getSketchObject()->getHighestCurveIndex();
}
void DrawSketchHandler::setCursor(const QPixmap &p,int x,int y)
void DrawSketchHandler::setCrosshairCursor(const char* svgName) {
QString cursorName = QString::fromLatin1(svgName);
const unsigned long defaultCrosshairColor = 0xFFFFFF;
unsigned long color = getCrosshairColor();
auto colorMapping = std::map<unsigned long, unsigned long>();
colorMapping[defaultCrosshairColor] = color;
setSvgCursor(cursorName, 7, 7, colorMapping);
}
void DrawSketchHandler::setSvgCursor(const QString & cursorName, int x, int y, const std::map<unsigned long, unsigned long>& colorMapping)
{
qreal pRatio = devicePixelRatio();
qreal defaultCursorSize = 32;
qreal hotX = x * pRatio;
qreal hotY = y * pRatio;
qreal cursorSize = defaultCursorSize * pRatio;
QPixmap pointer = Gui::BitmapFactory().pixmapFromSvg(cursorName.toStdString().c_str(), QSizeF(cursorSize, cursorSize), colorMapping);
#if QT_VERSION >= 0x050000
pointer.setDevicePixelRatio(pRatio);
#endif
setCursor(pointer, hotX, hotY, false);
}
void DrawSketchHandler::setCursor(const QPixmap &p,int x,int y, bool autoScale)
{
Gui::MDIView* view = Gui::getMainWindow()->activeWindow();
if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) {
Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer();
oldCursor = viewer->getWidget()->cursor();
QCursor cursor(p, x, y);
QCursor cursor;
QPixmap p1(p);
// TODO remove autoScale after all cursors are SVG-based
if (autoScale) {
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
qreal pRatio = viewer->devicePixelRatio();
#else
qreal pRatio = 1;
#endif
int newWidth = p.width()*pRatio;
int newHeight = p.height()*pRatio;
p1 = p1.scaled(newWidth, newHeight,Qt::KeepAspectRatio,Qt::SmoothTransformation);
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
p1.setDevicePixelRatio(pRatio);
#endif
cursor = QCursor(p1, x * pRatio, y * pRatio);
} else {
// already scaled
cursor = QCursor(p1, x, y);
}
actCursor = cursor;
actCursorPixmap = p1;
viewer->getWidget()->setCursor(cursor);
}
}
void DrawSketchHandler::addCursorTail( std::vector<QPixmap> &pixmaps ) {
// Create a pixmap that will contain icon and each autoconstraint icon
Gui::MDIView* view = Gui::getMainWindow()->activeWindow();
if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) {
QPixmap baseIcon = QPixmap(actCursorPixmap);
#if QT_VERSION >= 0x050000
baseIcon.setDevicePixelRatio(actCursorPixmap.devicePixelRatio());
qreal pixelRatio = baseIcon.devicePixelRatio();
#else
qreal pixelRatio = 1;
#endif
// cursor size in device independent pixels
qreal baseCursorWidth = baseIcon.width();
qreal baseCursorHeight = baseIcon.height();
int tailWidth = 0;
for (auto const& p: pixmaps) {
tailWidth += p.width();
}
int newIconWidth = baseCursorWidth + tailWidth;
int newIconHeight = baseCursorHeight;
QPixmap newIcon(newIconWidth, newIconHeight);
newIcon.fill(Qt::transparent);
QPainter qp;
qp.begin(&newIcon);
qp.drawPixmap(QPointF(0,0), baseIcon.scaled(
baseCursorWidth * pixelRatio,
baseCursorHeight * pixelRatio,
Qt::KeepAspectRatio,
Qt::SmoothTransformation
));
// Iterate through pixmaps and them to the cursor pixmap
std::vector<QPixmap>::iterator pit=pixmaps.begin();
int i = 0;
qreal currentIconX = baseCursorWidth;
qreal currentIconY;
for (; pit != pixmaps.end(); ++pit, i++) {
QPixmap icon = *pit;
currentIconY = baseCursorHeight - icon.height();
qp.drawPixmap(QPointF(currentIconX, currentIconY), icon);
currentIconX += icon.width();
}
qp.end(); // Finish painting
// Create the new cursor with the icon.
QPoint p=actCursor.hotSpot();
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
newIcon.setDevicePixelRatio(pixelRatio);
#endif
QCursor newCursor(newIcon, p.x(), p.y());
applyCursor(newCursor);
}
}
void DrawSketchHandler::applyCursor(void)
{
applyCursor(actCursor);
@@ -128,6 +238,64 @@ void DrawSketchHandler::unsetCursor(void)
}
}
qreal DrawSketchHandler::devicePixelRatio() {
qreal pixelRatio = 1;
# if QT_VERSION >= 0x050000
Gui::MDIView* view = Gui::getMainWindow()->activeWindow();
if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) {
Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer();
pixelRatio = viewer->devicePixelRatio();
}
# endif
return pixelRatio;
}
std::vector<QPixmap> DrawSketchHandler::suggestedConstraintsPixmaps(
std::vector<AutoConstraint> &suggestedConstraints) {
std::vector<QPixmap> pixmaps;
// Iterate through AutoConstraints types and get their pixmaps
std::vector<AutoConstraint>::iterator it=suggestedConstraints.begin();
int i = 0;
for (; it != suggestedConstraints.end(); ++it, i++) {
QString iconType;
switch (it->Type)
{
case Horizontal:
iconType = QString::fromLatin1("Constraint_Horizontal");
break;
case Vertical:
iconType = QString::fromLatin1("Constraint_Vertical");
break;
case Coincident:
iconType = QString::fromLatin1("Constraint_PointOnPoint");
break;
case PointOnObject:
iconType = QString::fromLatin1("Constraint_PointOnObject");
break;
case Tangent:
iconType = QString::fromLatin1("Constraint_Tangent");
break;
default:
break;
}
if (!iconType.isEmpty()) {
qreal pixelRatio = 1;
# if QT_VERSION >= 0x050000
Gui::MDIView* view = Gui::getMainWindow()->activeWindow();
if (view && view->isDerivedFrom(Gui::View3DInventor::getClassTypeId())) {
Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer();
pixelRatio = viewer->devicePixelRatio();
}
# endif
int iconWidth = 16 * pixelRatio;
QPixmap icon = Gui::BitmapFactory()
.pixmapFromSvg(iconType.toStdString().c_str(), QSize(iconWidth, iconWidth));
pixmaps.push_back(icon);
}
}
return pixmaps;
}
int DrawSketchHandler::seekAutoConstraint(std::vector<AutoConstraint> &suggestedConstraints,
const Base::Vector2d& Pos, const Base::Vector2d& Dir,
AutoConstraint::TargetType type)
@@ -502,58 +670,8 @@ void DrawSketchHandler::createAutoConstraints(const std::vector<AutoConstraint>
void DrawSketchHandler::renderSuggestConstraintsCursor(std::vector<AutoConstraint> &suggestedConstraints)
{
// Auto Constraint icon size in px
int iconSize = 16;
// Create a pixmap that will contain icon and each autoconstraint icon
QPixmap baseIcon = actCursor.pixmap();
QPixmap newIcon(baseIcon.width() + suggestedConstraints.size() * iconSize,
baseIcon.height());
newIcon.fill(Qt::transparent);
QPainter qp;
qp.begin(&newIcon);
qp.drawPixmap(0,0, baseIcon);
// Iterate through AutoConstraints type and add icons to the cursor pixmap
std::vector<AutoConstraint>::iterator it=suggestedConstraints.begin();
int i = 0;
for (; it != suggestedConstraints.end(); ++it, i++) {
QString iconType;
switch (it->Type)
{
case Horizontal:
iconType = QString::fromLatin1("Constraint_Horizontal");
break;
case Vertical:
iconType = QString::fromLatin1("Constraint_Vertical");
break;
case Coincident:
iconType = QString::fromLatin1("Constraint_PointOnPoint");
break;
case PointOnObject:
iconType = QString::fromLatin1("Constraint_PointOnObject");
break;
case Tangent:
iconType = QString::fromLatin1("Constraint_Tangent");
break;
default:
break;
}
if (!iconType.isEmpty()) {
QPixmap icon = Gui::BitmapFactory().pixmap(iconType.toLatin1()).scaledToWidth(iconSize);
qp.drawPixmap(QPoint(baseIcon.width() + i * iconSize, baseIcon.height() - iconSize), icon);
}
}
qp.end(); // Finish painting
// Create the new cursor with the icon.
QPoint p=actCursor.hotSpot();
QCursor newCursor(newIcon, p.x(), p.y());
applyCursor(newCursor);
std::vector<QPixmap> pixmaps = suggestedConstraintsPixmaps(suggestedConstraints);
addCursorTail(pixmaps);
}
void DrawSketchHandler::setPositionText(const Base::Vector2d &Pos, const SbString &text)

View File

@@ -94,15 +94,34 @@ public:
protected:
// helpers
void setCursor( const QPixmap &p,int x,int y );
/**
* Sets a cursor for 3D inventor view.
* pixmap as a cursor image in device independent pixels.
*
* \param autoScale - set this to false if pixmap already scaled for HiDPI
**/
void setCursor(const QPixmap &pixmap, int x,int y, bool autoScale=true);
void setSvgCursor(const QString &svgName, int x, int y,
const std::map<unsigned long, unsigned long>& colorMapping = std::map<unsigned long, unsigned long>());
void addCursorTail(std::vector<QPixmap> &pixmaps);
void unsetCursor(void);
void applyCursor(void);
void applyCursor(QCursor &newCursor);
void setCrosshairColor();
unsigned long getCrosshairColor();
qreal devicePixelRatio();
void setCrosshairCursor(const char* svgName);
/**
* Returns contraints icons scaled to width.
**/
std::vector<QPixmap> suggestedConstraintsPixmaps(
std::vector<AutoConstraint> &suggestedConstraints);
ViewProviderSketch *sketchgui;
QCursor oldCursor;
QCursor actCursor;
QPixmap actCursorPixmap;
};

View File

@@ -60,6 +60,7 @@
<file>icons/Sketcher_Conics_Ellipse_3points.svg</file>
<file>icons/Sketcher_Conics_Ellipse_Center.svg</file>
<file>icons/Sketcher_ConnectLines.svg</file>
<file>icons/Sketcher_Crosshair.svg</file>
<file>icons/Sketcher_ConstrainBlock.svg</file>
<file>icons/Sketcher_ConstrainCoincident.svg</file>
<file>icons/Sketcher_ConstrainDistance.svg</file>
@@ -159,6 +160,26 @@
<file>icons/Sketcher_Move.svg</file>
<file>icons/Sketcher_NewSketch.svg</file>
<file alias="icons/preferences-sketcher.svg">icons/Sketcher_NewSketch.svg</file>
<file>icons/Sketcher_Pointer_Slot.svg</file>
<file>icons/Sketcher_Pointer_Create_Box.svg</file>
<file>icons/Sketcher_Pointer_Create_Line.svg</file>
<file>icons/Sketcher_Pointer_Create_Lineset.svg</file>
<file>icons/Sketcher_Pointer_Create_Arc.svg</file>
<file>icons/Sketcher_Pointer_Create_3PointArc.svg</file>
<file>icons/Sketcher_Pointer_Create_Circle.svg</file>
<file>icons/Sketcher_Pointer_Create_Ellipse.svg</file>
<file>icons/Sketcher_Pointer_Create_ArcOfEllipse.svg</file>
<file>icons/Sketcher_Pointer_Create_ArcOfHyperbola.svg</file>
<file>icons/Sketcher_Pointer_Create_ArcOfParabola.svg</file>
<file>icons/Sketcher_Pointer_Create_BSpline.svg</file>
<file>icons/Sketcher_Pointer_Create_3PointCircle.svg</file>
<file>icons/Sketcher_Pointer_Create_Point.svg</file>
<file>icons/Sketcher_Pointer_Create_Fillet.svg</file>
<file>icons/Sketcher_Pointer_Trimming.svg</file>
<file>icons/Sketcher_Pointer_Extension.svg</file>
<file>icons/Sketcher_Pointer_Regular_Polygon.svg</file>
<file>icons/Sketcher_Pointer_External.svg</file>
<file>icons/Sketcher_Pointer_CarbonCopy.svg</file>
<file>icons/Sketcher_Parabolic_Arc.svg</file>
<file>icons/Sketcher_Parabolic_Arc_Constr.svg</file>
<file>icons/Sketcher_ProfilesHexagon1.svg</file>

View File

@@ -1,525 +1,15 @@
<?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: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"
width="64px"
height="64px"
id="svg2816"
version="1.1"
inkscape:version="0.92.2 (unknown)"
sodipodi:docname="Sketcher_ConstrainBlock.svg">
<defs
id="defs2818">
<linearGradient
id="linearGradient3602">
<stop
style="stop-color:#ff2600;stop-opacity:1;"
offset="0"
id="stop3604" />
<stop
style="stop-color:#ff5f00;stop-opacity:1;"
offset="1"
id="stop3606" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective2824" />
<inkscape:perspective
id="perspective3618"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3602-7"
id="linearGradient3608-5"
x1="3.909091"
y1="14.363636"
x2="24.81818"
y2="14.363636"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3602-7">
<stop
style="stop-color:#c51900;stop-opacity:1;"
offset="0"
id="stop3604-1" />
<stop
style="stop-color:#ff5f00;stop-opacity:1;"
offset="1"
id="stop3606-3" />
</linearGradient>
<inkscape:perspective
id="perspective3677"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3602-5"
id="linearGradient3608-1"
x1="3.909091"
y1="14.363636"
x2="24.81818"
y2="14.363636"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3602-5">
<stop
style="stop-color:#c51900;stop-opacity:1;"
offset="0"
id="stop3604-9" />
<stop
style="stop-color:#ff5f00;stop-opacity:1;"
offset="1"
id="stop3606-9" />
</linearGradient>
<linearGradient
y2="14.363636"
x2="24.81818"
y1="14.363636"
x1="3.909091"
gradientUnits="userSpaceOnUse"
id="linearGradient3686"
xlink:href="#linearGradient3602-5"
inkscape:collect="always" />
<inkscape:perspective
id="perspective3717"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3602-58"
id="linearGradient3608-8"
x1="3.909091"
y1="14.363636"
x2="24.81818"
y2="14.363636"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3602-58">
<stop
style="stop-color:#c51900;stop-opacity:1;"
offset="0"
id="stop3604-2" />
<stop
style="stop-color:#ff5f00;stop-opacity:1;"
offset="1"
id="stop3606-2" />
</linearGradient>
<linearGradient
y2="14.363636"
x2="24.81818"
y1="14.363636"
x1="3.909091"
gradientUnits="userSpaceOnUse"
id="linearGradient3726"
xlink:href="#linearGradient3602-58"
inkscape:collect="always" />
<inkscape:perspective
id="perspective4410"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective4944"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective4966"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective5009"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective5165"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7581"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7606"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7638"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7660"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7704"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7730"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7762"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7783"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7881"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective7932"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2866"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2878"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient3602-1">
<stop
style="stop-color:#ff2600;stop-opacity:1;"
offset="0"
id="stop3604-8" />
<stop
style="stop-color:#ff5f00;stop-opacity:1;"
offset="1"
id="stop3606-96" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3602-1"
id="linearGradient2875"
gradientUnits="userSpaceOnUse"
x1="3.909091"
y1="14.363636"
x2="24.81818"
y2="14.363636" />
<inkscape:perspective
id="perspective2885"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient3602-1-5">
<stop
style="stop-color:#ff2600;stop-opacity:1;"
offset="0"
id="stop3604-8-3" />
<stop
style="stop-color:#ff5f00;stop-opacity:1;"
offset="1"
id="stop3606-96-8" />
</linearGradient>
<inkscape:perspective
id="perspective3720"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient3602-1-8">
<stop
style="stop-color:#ff2600;stop-opacity:1;"
offset="0"
id="stop3604-8-5" />
<stop
style="stop-color:#ff5f00;stop-opacity:1;"
offset="1"
id="stop3606-96-2" />
</linearGradient>
<inkscape:perspective
id="perspective3822"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3849"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3879"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2896"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2925"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2925-4"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3726"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="6.3984375"
inkscape:cx="5.6876106"
inkscape:cy="16.324207"
inkscape:current-layer="text3796"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="993"
inkscape:window-x="0"
inkscape:window-y="28"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid3208"
empspacing="2"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata2821">
<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:creator>
<cc:Agent>
<dc:title>[wmayer]</dc:title>
</cc:Agent>
</dc:creator>
<dc:title>Sketcher_ConstrainLock</dc:title>
<dc:date>2011-10-10</dc:date>
<dc:relation>http://www.freecadweb.org/wiki/index.php?title=Artwork</dc:relation>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/Mod/Sketcher/Gui/Resources/icons/Sketcher_ConstrainLock.svg</dc:identifier>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<cc:license>https://www.gnu.org/copyleft/lesser.html</cc:license>
<dc:contributor>
<cc:Agent>
<dc:title>[agryson] Alexander Gryson</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<g
transform="scale(0.73872768,1.3536788)"
style="font-size:54.21519089000000236px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ff2600;fill-opacity:1;stroke:#731200;font-family:Arial;-inkscape-font-specification:Arial;color:#000000;fill-rule:nonzero;stroke-width:2.19132471;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="text3796">
<g
id="g4699"
transform="matrix(1.2685713,0,0,1.2710284,-11.229264,-3.3148656)">
<path
sodipodi:open="true"
d="M 69.037672,20.71525 A 27.750441,15.544155 0 0 1 41.301012,36.259403 27.750441,15.544155 0 0 1 13.536805,20.730688 27.750441,15.544155 0 0 1 41.245891,5.1711121 27.750441,15.544155 0 0 1 69.037617,20.684375"
sodipodi:end="6.281199"
sodipodi:start="0"
sodipodi:ry="15.544155"
sodipodi:rx="27.750441"
sodipodi:cy="20.71525"
sodipodi:cx="41.287231"
sodipodi:type="arc"
id="path4594-5"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:54.21519089px;font-family:Arial;-inkscape-font-specification:Arial;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#bfbfbf;stroke-width:3.03046966;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
<path
sodipodi:open="true"
d="M 70.391352,21.453978 A 27.750441,15.544155 0 0 1 42.654691,36.998131 27.750441,15.544155 0 0 1 14.890484,21.469415 27.750441,15.544155 0 0 1 42.59957,5.9098397 27.750441,15.544155 0 0 1 70.391297,21.423102"
sodipodi:end="6.281199"
sodipodi:start="0"
sodipodi:ry="15.544155"
sodipodi:rx="27.750441"
sodipodi:cy="21.453978"
sodipodi:cx="42.640911"
sodipodi:type="arc"
id="path4594-7"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:54.21519089px;font-family:Arial;-inkscape-font-specification:Arial;display:inline;overflow:visible;visibility:visible;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.03046966;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
<path
sodipodi:open="true"
d="M 70.391354,21.453978 A 27.750443,15.544157 0 0 1 42.654691,36.998133 27.750443,15.544157 0 0 1 14.890482,21.469415 27.750443,15.544157 0 0 1 42.59957,5.9098378 27.750443,15.544157 0 0 1 70.391299,21.423102"
sodipodi:end="6.281199"
sodipodi:start="0"
sodipodi:ry="15.544157"
sodipodi:rx="27.750443"
sodipodi:cy="21.453978"
sodipodi:cx="42.640911"
sodipodi:type="arc"
id="path4594"
style="fill:#cc0000;fill-opacity:1;stroke:#000000;stroke-width:3.03046966;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
sodipodi:open="true"
d="M 56.450161,28.87093 A 19.893389,10.383315 0 0 1 30.622189,30.130692 19.893389,10.383315 0 0 1 24.366219,16.990736"
sodipodi:end="3.6082287"
sodipodi:start="0.76741539"
sodipodi:ry="10.383315"
sodipodi:rx="19.893389"
sodipodi:cy="21.662029"
sodipodi:cx="42.13274"
sodipodi:type="arc"
id="path4594-3-5"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:54.21519089px;font-family:Arial;-inkscape-font-specification:Arial;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.09707427;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
<path
transform="scale(-1)"
sodipodi:open="true"
d="m -28.059505,-14.232113 a 19.893389,10.383315 0 0 1 -25.806816,1.348108 19.893389,10.383315 0 0 1 -6.428073,-13.114745"
sodipodi:end="3.601182"
sodipodi:start="0.76099921"
sodipodi:ry="10.383315"
sodipodi:rx="19.893389"
sodipodi:cy="-21.392918"
sodipodi:cx="-42.465248"
sodipodi:type="arc"
id="path4594-3-5-3"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:54.21519089px;font-family:Arial;-inkscape-font-specification:Arial;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.09707427;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
<path
inkscape:connector-curvature="0"
id="path4670"
d="m 28.427255,14.035826 32.488291,12.55837 v 0"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4672"
d="M 24.366218,16.252009 55.500831,28.81038 v 0"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path4674"
d="M 23.01254,14.035826 60.915546,28.81038"
style="fill:none;fill-rule:evenodd;stroke:#cc0000;stroke-width:2.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="svg2816" height="64px" width="64px">
<g id="pale-red" style="fill:none;stroke:#280000;stroke-width:8;" >
<path d="M 16,48 48,16" />
<circle r="26" cy="32" cx="32" />
</g>
<g id="red" style="fill:none;stroke:#cc0000;stroke-width:4;">
<circle r="26" cy="32" cx="32" />
<path d="M 14,50 50,14" />
</g>
<g id="dark" style="fill:none;stroke:#ef2929;stroke-width:1.99999988;">
<circle r="27" cy="32" cx="32" />
<path d="M 12,50 50,12" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 608 B

View File

@@ -0,0 +1,161 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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:xlink="http://www.w3.org/1999/xlink"
version="1.1"
id="svg4564"
height="64"
width="64">
<defs
id="defs4566">
<radialGradient
r="34.345188"
fy="672.79736"
fx="225.26402"
cy="672.79736"
cx="225.26402"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
gradientUnits="userSpaceOnUse"
id="radialGradient4572"
xlink:href="#linearGradient3144-3" />
<linearGradient
id="linearGradient3144-3">
<stop
id="stop3146-7"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop3148-0"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
r="34.345188"
fy="672.79736"
fx="225.26402"
cy="672.79736"
cx="225.26402"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
gradientUnits="userSpaceOnUse"
id="radialGradient4574"
xlink:href="#linearGradient3144-0" />
<linearGradient
id="linearGradient3144-0">
<stop
id="stop3146-2"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop3148-9"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
r="34.345188"
fy="672.79736"
fx="225.26402"
cy="672.79736"
cx="225.26402"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
gradientUnits="userSpaceOnUse"
id="radialGradient3846"
xlink:href="#linearGradient3144-3" />
<radialGradient
r="34.345188"
fy="672.79736"
fx="225.26402"
cy="672.79736"
cx="225.26402"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
gradientUnits="userSpaceOnUse"
id="radialGradient3848"
xlink:href="#linearGradient3144-0" />
<linearGradient
id="linearGradient3836-0-6-4">
<stop
id="stop3838-2-7-0"
offset="0"
style="stop-color:#a40000;stop-opacity:1" />
<stop
id="stop3840-5-5-9"
offset="1"
style="stop-color:#ef2929;stop-opacity:1" />
</linearGradient>
<linearGradient
id="linearGradient3836-0-6">
<stop
id="stop3838-2-7"
offset="0"
style="stop-color:#a40000;stop-opacity:1" />
<stop
id="stop3840-5-5"
offset="1"
style="stop-color:#ef2929;stop-opacity:1" />
</linearGradient>
</defs>
<metadata
id="metadata4569">
<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>[bitacovir]</dc:title>
</cc:Agent>
</dc:creator>
<dc:title>Sketcher_Crosshair</dc:title>
<dc:date />
<dc:relation />
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier />
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<cc:license>https://www.gnu.org/copyleft/lesser.html</cc:license>
<dc:contributor>
<cc:Agent>
<dc:title />
</cc:Agent>
</dc:contributor>
<dc:subject>
<rdf:Bag />
</dc:subject>
<dc:description />
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(0,-988.36218)"
id="layer1">
<path
id="path913"
d="m 16.001457,991.61563 v 8.76197"
style="fill:#ffffff;stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#ffffff;stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 16.005154,1008.394 v 8.7619"
id="path913-6" />
<path
id="path913-6-4"
d="M 3.2625654,1004.386 H 11.992377"
style="fill:#ffffff;stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#ffffff;stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 19.969916,1004.3436 H 28.72376"
id="path913-6-4-4" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
id="svg12"
width="64"
height="64"
version="1.1">
<metadata
id="metadata18">
<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>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs16" />
<g
transform="translate(-6.1362487,-5.2733382)"
style="fill:none;stroke:#cc0000;stroke-width:2"
id="symbol">
<rect
y="46.262405"
x="17.2582"
height="18.312866"
width="20.87805"
id="rect6073"
style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none" />
<rect
y="39.273338"
x="25.2582"
height="18.312866"
width="20.87805"
id="rect6073-6"
style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#cc0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none" />
<path
id="path6092"
d="m 17.2582,46.262405 8,-6.989067"
style="fill:none;stroke:#cc0000;stroke-width:2.828;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path
id="path6096"
d="m 38.13625,46.262405 7.999999,-6.989067"
style="fill:none;stroke:#cc0000;stroke-width:2.828;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path
id="path6098"
d="m 38.13625,64.575271 8,-6.989067"
style="fill:none;stroke:#cc0000;stroke-width:2.828;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path
id="path6100"
d="m 17.2582,64.575271 8,-6.989067"
style="fill:none;stroke:#cc0000;stroke-width:2.828;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
<g
style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;"
id="crosshair">
<path
id="path9"
d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m41,7c14,24-10,48-34,34" />
<circle cx="41" cy="7" r="5" />
<circle cx="7" cy="41" r="5" />
<circle cx="38" cy="38" r="5" />
</g>
<g id="crosshair" style="stroke:#eeeeec;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 537 B

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m41,7c14,24-10,48-34,34" />
<circle cx="41" cy="7" r="5" />
<circle cx="7" cy="41" r="5" />
<circle cx="38" cy="38" r="5" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 537 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m41,7c14,24-10,48-34,34" />
<circle cx="41" cy="7" r="5" />
<circle cx="7" cy="41" r="5" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m55,10c-50,40-45,60-5,45" />
<circle cx="49" cy="36" r="3" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 465 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m55,10c-50,40-45,60-5,45" />
<circle cx="10" cy="36" r="3" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 465 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m55,10c-50,40-45,60-5,45" />
<circle cx="49" cy="36" r="3" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 465 B

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m16,45 l8,8l16-30l10,20" />
<path d="m10,35c5,10 10,10 20,10c10,0 10-20 20-20c10,0 10,10 20,10" stroke="#dddddd"/>
<circle cx="24" cy="53" r="3" />
<circle cx="40" cy="23" r="3" />
<circle cx="50" cy="43" r="3" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 632 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<rect x="20" y="32" width="38" height="25" />
<circle cx="20" cy="57" r="5" />
<circle cx="58" cy="32" r="5" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 553 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<circle cx="40" cy="40" r="18" />
<circle cx="40" cy="40" r="4" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 461 B

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;" transform="rotate(-20 41 45)">
<ellipse cx="41" cy="45" rx="20" ry="10" />
<circle cx="41" cy="45" r="4" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m22,29v15l11,11h15" />
<circle cx="39" cy="36" r="4" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 458 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<line x1="20" y1="57" x2="50" y2="28" />
<circle cx="20" cy="57" r="5" />
<circle cx="50" cy="28" r="5" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 548 B

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m16,45 l8,8l16-30l10,20" />
<circle cx="24" cy="53" r="4" />
<circle cx="40" cy="23" r="4" />
<circle cx="50" cy="43" r="4" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 540 B

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:#cc0000;stroke:none;">
<circle cx="32" cy="32" r="6" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 406 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m19,53l30,-30" stroke-dasharray="3 2" />
<path d="m44,23h5v5z" />
<circle cx="19" cy="53" r="3" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 506 B

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
id="svg12"
width="64"
height="64"
version="1.1">
<metadata
id="metadata18">
<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>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs16" />
<g
transform="translate(-6.1362487,-5.2733382)"
style="fill:none;stroke:#cc0000;stroke-width:2"
id="symbol">
<path
id="path6153"
d="m 13.327165,47.273338 v 20"
style="fill:none;stroke:#d60000;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path
id="path6155"
d="m 38.136249,47.273338 v 20"
style="fill:none;stroke:#d60000;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path
id="path6157"
d="m 46.136249,39.273338 v 22"
style="fill:none;stroke:#d60000;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path
id="path6159"
d="m 13.327165,67.273338 v -20 h 24.809084 v 20 0 l 0,-20 8,-8 v 22"
style="fill:none;stroke:#d60000;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path
id="path6161"
d="m 13.327165,47.273338 9.49201,-8 h 23.317074 v 0"
style="fill:none;stroke:#d60000;stroke-width:2;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
<g
style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;"
id="crosshair">
<path
id="path9"
d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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"
id="svg12"
width="64"
height="64"
version="1.1">
<metadata
id="metadata18">
<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>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs16" />
<g
transform="translate(-6.1362487,-5.2733382)"
style="fill:none;stroke:#cc0000;stroke-width:2"
id="symbol">
<circle
r="3.5762713"
cx="46.13625"
cy="53.273338"
style="stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none"
id="circle4" />
<path
d="M 60.770398,53.273338 53.453324,65.946883 H 38.819175 l -7.317074,-12.673545 7.317074,-12.673544 14.634149,0 z"
id="path4533"
style="stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;fill-rule:evenodd" />
<circle
r="3.5762713"
cx="53.453323"
cy="40.599792"
style="fill:none;stroke:#cc0000;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;fill-rule:evenodd;fill-opacity:1;opacity:1"
id="circle4-3" />
</g>
<g
style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;"
id="crosshair">
<path
id="path9"
d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="64" height="64">
<g style="fill:none;stroke:#cc0000;stroke-width:2" >
<path d="m45,35c14,0 14,20 0,20h-20c-14,0-14-20 0-20z" />
<circle cx="25" cy="45" r="3"/>
</g>
<g style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter">
<path d="m 16,3 v 9 m 0,8 v 9 M 3,16 h 9 m 8,0 h 9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 466 B

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="64" width="64" >
<g id="symbol" style="fill:none;stroke:#cc0000;stroke-width:2;">
<path d="m40,40l-17-15m17,15l-17,15m17-15l17,15" stroke-dasharray="2 2" />
<path d="m40,40l20-18" stroke-dasharray="4 2"/>
<circle cx="40" cy="40" r="3" />
</g>
<g id="crosshair" style="stroke:#ffffff;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;">
<path d="m16,3v9m0,8v9m-13-13h9m8,0h9" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 554 B