a lot of work on th map-creator
@@ -6,16 +6,21 @@
|
||||
|
||||
QT += core gui opengl
|
||||
|
||||
CONFIG += c++11
|
||||
CONFIG += c++11 -g3 -O0
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets svg
|
||||
|
||||
TARGET = IndoorMap
|
||||
TEMPLATE = app
|
||||
|
||||
DEFINES += WITH_ASSERTIONS
|
||||
DEFINES += WITH_DEBUG_LOG
|
||||
|
||||
INCLUDEPATH += \
|
||||
../
|
||||
|
||||
|
||||
|
||||
SOURCES += \
|
||||
lib/gpc/gpc.cpp \
|
||||
main.cpp \
|
||||
@@ -30,7 +35,8 @@ SOURCES += \
|
||||
params/ToolBox.cpp \
|
||||
mapview/model/MapModel.cpp \
|
||||
tree/MapTreeModel.cpp \
|
||||
mapview/3D/MapView3D.cpp
|
||||
mapview/3D/MapView3D.cpp \
|
||||
params/StairBuilder.cpp
|
||||
|
||||
|
||||
HEADERS += MainWindow.h \
|
||||
@@ -101,7 +107,21 @@ HEADERS += MainWindow.h \
|
||||
mapview/grid/MapModelGrid.h \
|
||||
mapview/3DGrid/GridModel.h \
|
||||
mapview/3DGrid/GridRenderer.h \
|
||||
mapview/3DGrid/MyNode.h
|
||||
mapview/3DGrid/MyNode.h \
|
||||
mapview/3D/MV3DElementStair.h \
|
||||
mapview/model/MMFloorStair.h \
|
||||
mapview/model/MMFloorStairs.h \
|
||||
mapview/elements/MV2DElementStair.h \
|
||||
params/StairBuilder.h \
|
||||
misc/GnuplotExport.h \
|
||||
exp.h \
|
||||
ray.h \
|
||||
mapview/model/MMFloorObstacleDoor.h \
|
||||
mapview/elements/MV2DElementFloorObstacleDoor.h \
|
||||
mapview/model/IHasDoorType.h \
|
||||
mapview/3D/MV3DElementFloorObstacleDoor.h \
|
||||
mapview/3D/misc/Plane.h \
|
||||
mapview/elements/HasMoveableNodes.h
|
||||
|
||||
FORMS += MainWindow.ui
|
||||
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
#include <QFileDialog>
|
||||
#include <QTreeView>
|
||||
|
||||
#include "mapview/3DGrid/GridRenderer.h"
|
||||
|
||||
|
||||
|
||||
MainController::MainController() {
|
||||
|
||||
mw = new MainWindow();
|
||||
@@ -53,6 +57,7 @@ MainController::MainController() {
|
||||
|
||||
connect(layerTree, SIGNAL(clicked(QModelIndex)), this, SLOT(layerSelected(QModelIndex)));
|
||||
connect(mapSelector, SIGNAL(onMapElementSelected(MapModelElement*)), this, SLOT(mapElementSelected(MapModelElement*)));
|
||||
connect(mw->getMapView2D(), SIGNAL(onElementChange(MV2DElement*)), this, SLOT(curMapElementChanged()));
|
||||
|
||||
// model events
|
||||
connect(mapModel, SIGNAL(aboutToReset()), this, SLOT(onMapModelAboutToReset()));
|
||||
@@ -63,11 +68,17 @@ MainController::MainController() {
|
||||
connect(mw->getActionWidget(), SIGNAL(onSave()), this, SLOT(onSave()));
|
||||
|
||||
// 3D view change
|
||||
connect(mw->getShow3DFloorplan(), SIGNAL(triggered(bool)), this, SLOT(onShow3DFloorplan()));
|
||||
connect(mw->getShow3DGrid(), SIGNAL(triggered(bool)), this, SLOT(onShow3DGrid()));
|
||||
connect(mw, SIGNAL(onShow3DFloorplan()), this, SLOT(onShow3DFloorplan()));
|
||||
connect(mw, SIGNAL(onShow3DGrid()), this, SLOT(onShow3DGrid()));
|
||||
|
||||
// 3D grid view config
|
||||
connect(mw, &MainWindow::onGridNodeColorImp, [&] () {mw->getMapView3D()->getGridRenderer()->setNodeColorMode(GridRendererColorMode::SHOW_NODE_IMPORTANCE);} );
|
||||
connect(mw, &MainWindow::onGridNodeColorType, [&] () {mw->getMapView3D()->getGridRenderer()->setNodeColorMode(GridRendererColorMode::SHOW_NODE_TYPE);} );
|
||||
connect(mw, &MainWindow::onGridShowEdges, [&] (const bool show) {mw->getMapView3D()->getGridRenderer()->setShowEdges(show);} );
|
||||
|
||||
|
||||
mapModel->load("../IndoorMap/maps/SHL9.xml");
|
||||
mapModel->load("../IndoorMap/maps/SHL17.xml");
|
||||
//mapModel->load("../IndoorMap/maps/test.xml");
|
||||
|
||||
}
|
||||
|
||||
@@ -84,9 +95,13 @@ void MainController::layerSelected(QModelIndex idx) {
|
||||
MapLayer* ml = static_cast<MapLayer*>(idx.internalPointer());
|
||||
mapModel->setSelectedLayer(ml);
|
||||
mw->getMapView2D()->layerChange();
|
||||
mw->getMapView3D()->layerChange();
|
||||
mw->getLayerParamWidget()->setElement(ml);
|
||||
mw->getToolBoxWidget()->setSelectedLayer(ml);
|
||||
}
|
||||
|
||||
void MainController::curMapElementChanged() {
|
||||
mw->getElementParamWidget()->refresh();
|
||||
}
|
||||
|
||||
void MainController::mapElementSelected(MapModelElement* el) {
|
||||
|
||||
@@ -27,6 +27,10 @@ public slots:
|
||||
/** MapElement selection has changed */
|
||||
void mapElementSelected(MapModelElement* el);
|
||||
|
||||
/** the currently selected MapElement has changed */
|
||||
void curMapElementChanged();
|
||||
|
||||
|
||||
void onLoad();
|
||||
|
||||
void onSave();
|
||||
|
||||
@@ -23,12 +23,18 @@
|
||||
#include "tree/MapTreeModel.h"
|
||||
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow) {
|
||||
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
|
||||
|
||||
ui->setupUi(this);
|
||||
|
||||
QString css;
|
||||
css += "QPushButton { border: 1px solid #000000; background-color: #ffffff; }";
|
||||
css += "QPushButton:!enabled { border: 1px solid #cccccc; background-color:none; }";
|
||||
css += "QPushButton:hover { border: 1px solid #000000; background-color: #dddddd; }";
|
||||
css += "QPushButton:pressed { border: 1px solid #000000; background-color: #bbbbbb; }";
|
||||
|
||||
this->setStyleSheet(css);
|
||||
|
||||
mapView2D = new MapView2D();
|
||||
mapView3D = new MapView3D();
|
||||
|
||||
@@ -47,22 +53,37 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
ui->layTree->addWidget(actionWidget);
|
||||
|
||||
|
||||
// show mode
|
||||
QActionGroup* grpMode = new QActionGroup(this);
|
||||
grpMode->addAction(ui->actShow3DFloorplan);
|
||||
grpMode->addAction(ui->actShow3DGrid);
|
||||
|
||||
connect(ui->actShow2D, SIGNAL(triggered(bool)), this, SIGNAL(onShow2D()));
|
||||
connect(ui->actShow3DGrid, SIGNAL(triggered(bool)), this, SIGNAL(onShow3DGrid()));
|
||||
connect(ui->actShow3DFloorplan, SIGNAL(triggered(bool)), this, SIGNAL(onShow3DFloorplan()));
|
||||
|
||||
|
||||
// node coloring
|
||||
QActionGroup* grpNodeCol = new QActionGroup(this);
|
||||
grpNodeCol->addAction(ui->actGridNodeColorImportance);
|
||||
grpNodeCol->addAction(ui->actGridNodeColorType);
|
||||
|
||||
connect(ui->actGridNodeColorImportance, SIGNAL(triggered(bool)), this, SIGNAL(onGridNodeColorImp()));
|
||||
connect(ui->actGridNodeColorType, SIGNAL(triggered(bool)), this, SIGNAL(onGridNodeColorType()));
|
||||
|
||||
// edges
|
||||
connect(ui->actGridShowEdges, &QAction::triggered, this, &MainWindow::onGridShowEdges);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
MainWindow::~MainWindow() {
|
||||
delete ui;
|
||||
}
|
||||
|
||||
|
||||
QAction* MainWindow::getShow3DFloorplan() {
|
||||
return ui->actShow3DFloorplan;
|
||||
}
|
||||
|
||||
QAction* MainWindow::getShow3DGrid() {
|
||||
return ui->actShow3DGrid;
|
||||
}
|
||||
|
||||
QTreeView* MainWindow::getTree() {
|
||||
return ui->layerTree;
|
||||
}
|
||||
|
||||
11
MainWindow.h
@@ -30,11 +30,18 @@ public:
|
||||
ToolBoxWidget* getToolBoxWidget() {return toolBoxWidget;}
|
||||
ActionWidget* getActionWidget() {return actionWidget;}
|
||||
|
||||
QAction* getShow3DFloorplan();
|
||||
QAction* getShow3DGrid();
|
||||
|
||||
QTreeView* getTree();
|
||||
|
||||
signals:
|
||||
|
||||
void onShow2D();
|
||||
void onShow3DFloorplan();
|
||||
void onShow3DGrid();
|
||||
void onGridShowEdges(bool);
|
||||
void onGridNodeColorImp();
|
||||
void onGridNodeColorType();
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
MapView2D* mapView2D;
|
||||
|
||||
@@ -58,22 +58,70 @@
|
||||
<addaction name="actShow3DFloorplan"/>
|
||||
<addaction name="actShow3DGrid"/>
|
||||
</widget>
|
||||
<addaction name="action2D"/>
|
||||
<addaction name="actShow2D"/>
|
||||
<addaction name="menu3D"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuGridf">
|
||||
<property name="title">
|
||||
<string>Grid</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuNode_color">
|
||||
<property name="title">
|
||||
<string>node color</string>
|
||||
</property>
|
||||
<addaction name="actGridNodeColorType"/>
|
||||
<addaction name="actGridNodeColorImportance"/>
|
||||
</widget>
|
||||
<addaction name="actGridShowEdges"/>
|
||||
<addaction name="menuNode_color"/>
|
||||
</widget>
|
||||
<addaction name="menuView"/>
|
||||
<addaction name="menuGridf"/>
|
||||
</widget>
|
||||
<action name="action2D">
|
||||
<action name="actShow2D">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>2D</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actShow3DFloorplan">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Floorplan</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actGridShowEdges">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>show edges</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actGridNodeColorType">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>node type</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actGridNodeColorImportance">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>node importance</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actShow3DGrid">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Grid</string>
|
||||
</property>
|
||||
|
||||
79
UIHelper.h
@@ -3,8 +3,12 @@
|
||||
|
||||
#include <QImage>
|
||||
#include <QPainter>
|
||||
#include <QRgb>
|
||||
|
||||
#include <QtSvg/QSvgRenderer>
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
class UIHelper {
|
||||
|
||||
public:
|
||||
@@ -15,16 +19,71 @@ public:
|
||||
// return QIcon(img);
|
||||
// }
|
||||
|
||||
static QIcon getIcon(const std::string& name) {
|
||||
const int size = 32;
|
||||
const QColor fill = Qt::transparent;
|
||||
const std::string file = "://res/icons/" + name + ".svg";
|
||||
QSvgRenderer renderer(QString(file.c_str()));
|
||||
QPixmap pm(size, size);
|
||||
pm.fill(fill);
|
||||
QPainter painter(&pm);
|
||||
renderer.render(&painter, pm.rect());
|
||||
return QIcon(pm);
|
||||
static const QPixmap& getPixmap(const std::string& name, const int size = 32) {
|
||||
|
||||
// caching
|
||||
static std::unordered_map<std::string, QPixmap> cache;
|
||||
|
||||
// try to get the image from the cache
|
||||
const std::string cacheKey = std::to_string(size) + name;
|
||||
auto it = cache.find(cacheKey);
|
||||
|
||||
// not in cache?
|
||||
if (it == cache.end()) {
|
||||
|
||||
// build
|
||||
const QColor fill = Qt::transparent;
|
||||
const std::string file = "://res/icons/" + name + ".svg";
|
||||
QSvgRenderer renderer(QString(file.c_str()));
|
||||
QPixmap pm(size, size);
|
||||
pm.fill(fill);
|
||||
QPainter painter(&pm);
|
||||
renderer.render(&painter, pm.rect());
|
||||
|
||||
// add to cache
|
||||
cache[cacheKey] = pm;
|
||||
|
||||
}
|
||||
|
||||
// done
|
||||
return cache[cacheKey];
|
||||
|
||||
}
|
||||
|
||||
static const QPixmap& getPixmapColored(const std::string& name, const QColor color, const int size = 32) {
|
||||
|
||||
// caching
|
||||
static std::unordered_map<std::string, QPixmap> cache;
|
||||
|
||||
// try to get the image from the cache
|
||||
const QString hex = color.name();
|
||||
const std::string cacheKey = hex.toStdString() + "_" + std::to_string(size) + "_" + name;
|
||||
auto it = cache.find(cacheKey);
|
||||
|
||||
// not in cache?
|
||||
if (it == cache.end()) {
|
||||
|
||||
// copy
|
||||
QPixmap colored = getPixmap(name, size);
|
||||
QPainter painter(&colored);
|
||||
painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
|
||||
painter.fillRect(colored.rect(), color);
|
||||
painter.end();
|
||||
|
||||
// add to cache
|
||||
cache[cacheKey] = colored;
|
||||
|
||||
}
|
||||
|
||||
// done
|
||||
return cache[cacheKey];
|
||||
|
||||
}
|
||||
|
||||
static QIcon getIcon(const std::string& name, const int size = 32) {
|
||||
|
||||
return QIcon(getPixmap(name, size));
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
9
main.cpp
@@ -1,16 +1,19 @@
|
||||
#include "MainController.h"
|
||||
#include <QApplication>
|
||||
|
||||
|
||||
#include "exp.h"
|
||||
#include "ray.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
QApplication a(argc, argv);
|
||||
//exp();
|
||||
//ray();
|
||||
|
||||
QApplication a(argc, argv);
|
||||
|
||||
MainController mc;
|
||||
mc.show();
|
||||
|
||||
|
||||
return a.exec();
|
||||
|
||||
}
|
||||
|
||||
35
mapview/3D/MV3DElementFloorObstacleDoor.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#ifndef MV3DELEMENTFLOOROBSTACLEDOOR_H
|
||||
#define MV3DELEMENTFLOOROBSTACLEDOOR_H
|
||||
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
#include <Indoor/math/Math.h>
|
||||
|
||||
#include "MV3DElement.h"
|
||||
#include "misc/Plane.h"
|
||||
|
||||
|
||||
|
||||
class MV3DElementFloorObstacleDoor : public MV3DElement {
|
||||
|
||||
Floorplan::Floor* f;
|
||||
Floorplan::FloorObstacleDoor* fo;
|
||||
|
||||
public:
|
||||
|
||||
/** ctor */
|
||||
MV3DElementFloorObstacleDoor(Floorplan::Floor* f, Floorplan::FloorObstacleDoor* fo) : f(f), fo(fo) {
|
||||
;
|
||||
}
|
||||
|
||||
/** repaint me */
|
||||
void paintGL() override {
|
||||
|
||||
glColor3f(0,1,0);
|
||||
Plane p(fo->from, fo->to, f->atHeight, fo->height);
|
||||
p.paintGL();
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // MV3DELEMENTFLOOROBSTACLEDOOR_H
|
||||
@@ -2,9 +2,12 @@
|
||||
#define MV3DELEMENTFLOOROBSTACLEWALL_H
|
||||
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
#include <Indoor/math/Math.h>
|
||||
|
||||
#include "MV3DElement.h"
|
||||
|
||||
|
||||
|
||||
class MV3DElementFloorObstacleWall : public MV3DElement {
|
||||
|
||||
Floorplan::Floor* f;
|
||||
@@ -19,39 +22,39 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
Point3 cross(Point3 u, Point3 v) {
|
||||
float x = u.y*v.z - u.z*v.y;
|
||||
float y = u.z*v.x - u.x*v.z;
|
||||
float z = u.x*v.y - u.y*v.x;
|
||||
return Point3(x,y,z);
|
||||
}
|
||||
|
||||
/** repaint me */
|
||||
void paintGL() override {
|
||||
|
||||
float y1 = f->atHeight;
|
||||
float y2 = y1+f->height;
|
||||
|
||||
|
||||
struct Wall {
|
||||
|
||||
Point2 from;
|
||||
Point2 to;
|
||||
float atHeight;
|
||||
float height;
|
||||
|
||||
Wall(const Point2 from, const Point2 to, float atHeight, float height) :
|
||||
from(from), to(to), atHeight(atHeight), height(height) {;}
|
||||
|
||||
void paintGL() {
|
||||
|
||||
Point3 p1 = Point3(fo->from.x, y1, fo->from.y);
|
||||
Point3 p2 = Point3(fo->to.x, y1, fo->to.y);
|
||||
Point3 p3 = Point3(fo->to.x, y2, fo->to.y);
|
||||
Point3 p4 = Point3(fo->from.x, y2, fo->from.y);
|
||||
float y1 = atHeight;
|
||||
float y2 = atHeight + height;
|
||||
|
||||
Point3 v1 = p2-p1;
|
||||
Point3 v2 = p3-p1;
|
||||
Point3 n = cross(v1, v2);
|
||||
n/=n.length();
|
||||
// polygon edges
|
||||
Point3 p1 = Point3(from.x, y1, from.y);
|
||||
Point3 p2 = Point3(to.x, y1, to.y);
|
||||
Point3 p3 = Point3(to.x, y2, to.y);
|
||||
Point3 p4 = Point3(from.x, y2, from.y);
|
||||
|
||||
// align normals to virtual viewport
|
||||
Point3 view(99,99,99);
|
||||
if ((view-n).length() > (view+n).length()) {n = -n;}
|
||||
// calculate normal
|
||||
// Point3 v1 = p2-p1;
|
||||
// Point3 v2 = p3-p1;
|
||||
// Point3 n = cross(v1, v2);
|
||||
// n/=n.length();
|
||||
Point3 n = Math::normal(p2-p1, p3-p1);
|
||||
|
||||
if (fo->type == Floorplan::ObstacleType::WALL) {
|
||||
// align normals to virtual viewport
|
||||
Point3 view(99,99,99);
|
||||
if ((view-n).length() > (view+n).length()) {n = -n;}
|
||||
|
||||
// fill the wall
|
||||
glColor3f(0.75, 0.75, 0.75);
|
||||
@@ -67,17 +70,85 @@ protected:
|
||||
|
||||
}
|
||||
|
||||
glColor3f(0,0,0);
|
||||
};
|
||||
|
||||
// glDisable(GL_LIGHTING);
|
||||
// glBegin(GL_LINE_STRIP);
|
||||
// glVertex3f(p1.x, p1.y, p1.z);
|
||||
// glVertex3f(p2.x, p2.y, p2.z);
|
||||
// glVertex3f(p3.x, p3.y, p3.z);
|
||||
// glVertex3f(p4.x, p4.y, p4.z);
|
||||
// glVertex3f(p1.x, p1.y, p1.z);
|
||||
// glEnd();
|
||||
// glEnable(GL_LIGHTING);
|
||||
struct Handrail {
|
||||
|
||||
Point2 from;
|
||||
Point2 to;
|
||||
float atHeight;
|
||||
float height;
|
||||
|
||||
Handrail(const Point2 from, const Point2 to, float atHeight, float height) :
|
||||
from(from), to(to), atHeight(atHeight), height(height) {;}
|
||||
|
||||
void paintGL() {
|
||||
|
||||
float y1 = atHeight;
|
||||
float y2 = atHeight + height;
|
||||
|
||||
// polygon edges
|
||||
Point3 p1 = Point3(from.x, y1, from.y);
|
||||
Point3 p2 = Point3(to.x, y1, to.y);
|
||||
|
||||
Point3 p3 = Point3(from.x, y2, from.y);
|
||||
Point3 p4 = Point3(to.x, y2, to.y);
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
glBegin(GL_LINES);
|
||||
|
||||
glColor3f(1,1,1);
|
||||
|
||||
// top
|
||||
glVertex3f(p3.x, p3.y, p3.z);
|
||||
glVertex3f(p4.x, p4.y, p4.z);
|
||||
|
||||
// start bar
|
||||
glVertex3f(p1.x, p1.y, p1.z);
|
||||
glVertex3f(p3.x, p3.y, p3.z);
|
||||
|
||||
// end bar
|
||||
glVertex3f(p2.x, p2.y, p2.z);
|
||||
glVertex3f(p4.x, p4.y, p4.z);
|
||||
|
||||
glColor3f(0.6, 0.6, 0.6);
|
||||
|
||||
// intermediate bars
|
||||
const Point3 d1 = p2-p1;
|
||||
const Point3 d2 = p4-p3;
|
||||
const int numBars = d2.length() / 1;
|
||||
for (int i = 1; i < numBars; ++i) {
|
||||
const Point3 s = p1 + d1 * i / numBars;
|
||||
const Point3 e = p3 + d2 * i / numBars;
|
||||
glVertex3f(s.x, s.y, s.z);
|
||||
glVertex3f(e.x, e.y, e.z);
|
||||
}
|
||||
|
||||
glEnd();
|
||||
glEnable(GL_LIGHTING);
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/** repaint me */
|
||||
void paintGL() override {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (fo->type == Floorplan::ObstacleType::WALL) {
|
||||
|
||||
Wall wall(fo->from, fo->to, f->atHeight, f->height);
|
||||
wall.paintGL();
|
||||
|
||||
} else if (fo->type == Floorplan::ObstacleType::HANDRAIL) {
|
||||
|
||||
Handrail rail(fo->from, fo->to, f->atHeight, 1.0);
|
||||
rail.paintGL();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
59
mapview/3D/MV3DElementStair.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#ifndef MV3DELEMENTSTAIR_H
|
||||
#define MV3DELEMENTSTAIR_H
|
||||
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
#include "misc/Cube.h"
|
||||
#include "MV3DElement.h"
|
||||
|
||||
class MV3DElementStair : public MV3DElement {
|
||||
|
||||
Floorplan::Floor* floor;
|
||||
Floorplan::Stair* stair;
|
||||
|
||||
public:
|
||||
|
||||
/** ctor */
|
||||
MV3DElementStair(Floorplan::Floor* floor, Floorplan::Stair* stair) : floor(floor), stair(stair) {
|
||||
;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
/** repaint me */
|
||||
void paintGL() override {
|
||||
|
||||
glDisable(GL_CULL_FACE);
|
||||
|
||||
glColor3f(1.0, 0.55, 0.55);
|
||||
glBegin(GL_QUADS);
|
||||
|
||||
const std::vector<Floorplan::StairPart> parts = stair->getParts();
|
||||
const std::vector<Floorplan::Quad3> quads = Floorplan::getQuads(parts, floor);
|
||||
|
||||
for (int i = 0; i < (int) parts.size(); ++i) {
|
||||
|
||||
//const Floorplan::StairPart& part = parts[i];
|
||||
const Floorplan::Quad3& quad = quads[i];
|
||||
|
||||
//const Floorplan::Quad3 quad = part.getQuad(floor);
|
||||
const Point3 p1 = quad.p2-quad.p1;
|
||||
const Point3 p2 = quad.p4-quad.p1;
|
||||
const Point3 n = Math::normal(p1,p2);
|
||||
glNormal3f(n.x, n.z, n.z);
|
||||
glVertex3f(quad.p1.x, quad.p1.z, quad.p1.y);
|
||||
glVertex3f(quad.p2.x, quad.p2.z, quad.p2.y);
|
||||
glVertex3f(quad.p3.x, quad.p3.z, quad.p3.y);
|
||||
glVertex3f(quad.p4.x, quad.p4.z, quad.p4.y);
|
||||
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glEnable(GL_CULL_FACE);
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // MV3DELEMENTSTAIR_H
|
||||
@@ -21,6 +21,8 @@ MapView3D::MapView3D(QWidget *parent) : QGLWidget(parent) {
|
||||
scale.y = 0.05f;
|
||||
scale.z = 0.05f;
|
||||
|
||||
gridRenderer = new GridRenderer();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -40,10 +42,10 @@ void MapView3D::initializeGL() {
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
glEnable(GL_LIGHT1);
|
||||
//glEnable(GL_LIGHT1);
|
||||
|
||||
GLfloat light0_position [] = {+5, 5, +5, 1};
|
||||
GLfloat light1_position [] = {-5, 5, -5, 1};
|
||||
GLfloat light0_position [] = {+50, 50, +50, 1};
|
||||
GLfloat light1_position [] = {-50, 50, -50, 1};
|
||||
|
||||
glLightfv ( GL_LIGHT0, GL_POSITION, light0_position );
|
||||
glLightfv ( GL_LIGHT1, GL_POSITION, light1_position );
|
||||
@@ -75,8 +77,6 @@ void MapView3D::paintGL() {
|
||||
|
||||
glLoadIdentity();
|
||||
|
||||
|
||||
|
||||
// 3) scale
|
||||
glScalef(scale.x, scale.y, scale.z);
|
||||
|
||||
@@ -180,8 +180,7 @@ void MapView3D::draw() {
|
||||
if (gridModel) {
|
||||
|
||||
// show grid
|
||||
GridRenderer renderer(gridModel->getGrid());
|
||||
renderer.paintGL();
|
||||
gridRenderer->paintGL(gridModel->getGrid());
|
||||
|
||||
} else {
|
||||
|
||||
@@ -189,6 +188,7 @@ void MapView3D::draw() {
|
||||
for (MapModelElement* el : getModel()->getVisibleElements()) {
|
||||
if (el->getMV3D()) {el->getMV3D()->paintGL();}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
class MapModel;
|
||||
class GridModel;
|
||||
class GridRenderer;
|
||||
|
||||
class MapView3D : public QGLWidget {
|
||||
|
||||
@@ -23,20 +24,31 @@ public:
|
||||
update();
|
||||
}
|
||||
|
||||
void layerChange() {
|
||||
update();
|
||||
}
|
||||
|
||||
/** get the underlying data-model */
|
||||
MapModel* getModel() {return model;}
|
||||
|
||||
/** get the renderer to use for the grid */
|
||||
GridRenderer* getGridRenderer() {return gridRenderer;}
|
||||
|
||||
|
||||
/** show 3D rendered floorplan */
|
||||
void showFloorplan();
|
||||
|
||||
/** show 3D rendered grid derived from the floorplan */
|
||||
void showGrid();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
/** the underlying data-model */
|
||||
MapModel* model = nullptr;
|
||||
|
||||
GridModel* gridModel = nullptr;
|
||||
GridRenderer* gridRenderer = nullptr;
|
||||
|
||||
Point3 rot;
|
||||
Point3 center;
|
||||
|
||||
52
mapview/3D/misc/Plane.h
Normal file
@@ -0,0 +1,52 @@
|
||||
#ifndef PLANE_H
|
||||
#define PLANE_H
|
||||
|
||||
#include <Indoor/geo/Point3.h>
|
||||
#include <QtOpenGL>
|
||||
|
||||
class Plane {
|
||||
|
||||
private:
|
||||
|
||||
Point3 p1;
|
||||
Point3 p2;
|
||||
Point3 p3;
|
||||
Point3 p4;
|
||||
Point3 n;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
/** construct from 2D line and heights */
|
||||
Plane(const Point2 from, const Point2 to, const float atHeight, const float height) {
|
||||
|
||||
p1 = Point3(from.x, from.y, atHeight);
|
||||
p2 = Point3(to.x, to.y, atHeight);
|
||||
p3 = Point3(to.x, to.y, atHeight+height);
|
||||
p4 = Point3(from.x, from.y, atHeight+height);
|
||||
|
||||
const Point2 perp = (to-from).perpendicular();
|
||||
n = Point3(perp.x, perp.y, 0);
|
||||
|
||||
}
|
||||
|
||||
void paintGL() {
|
||||
|
||||
glDisable(GL_CULL_FACE);
|
||||
glBegin(GL_QUADS);
|
||||
|
||||
// bottom
|
||||
glNormal3f(n.x, n.z, n.y);
|
||||
glVertex3f(p1.x, p1.z, p1.y);
|
||||
glVertex3f(p2.x, p2.z, p2.y);
|
||||
glVertex3f(p3.x, p3.z, p3.y);
|
||||
glVertex3f(p4.x, p4.z, p4.y);
|
||||
|
||||
glEnd();
|
||||
glEnable(GL_CULL_FACE);
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // PLANE_H
|
||||
@@ -4,7 +4,13 @@
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
#include <Indoor/grid/Grid.h>
|
||||
#include <Indoor/grid/factory/v2/GridFactory.h>
|
||||
#include <Indoor/grid/factory/v2/Importance.h>
|
||||
|
||||
#include <QProgressDialog>
|
||||
#include <QApplication>
|
||||
#include <QVBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QProgressBar>
|
||||
|
||||
#include "MyNode.h"
|
||||
|
||||
@@ -15,7 +21,7 @@ class GridModel {
|
||||
|
||||
private:
|
||||
|
||||
int gridSize_cm = 40;
|
||||
int gridSize_cm = 31;
|
||||
Grid<MyNode> grid;
|
||||
Floorplan::IndoorMap* im;
|
||||
|
||||
@@ -27,10 +33,60 @@ public:
|
||||
|
||||
Grid<MyNode>* getGrid() {return &grid;}
|
||||
|
||||
|
||||
class Listener : public GridFactoryListener {
|
||||
|
||||
private:
|
||||
QDialog dlg;
|
||||
QLabel* lbl1;
|
||||
QLabel* lbl2;
|
||||
QProgressBar* bar1;
|
||||
QProgressBar* bar2;
|
||||
|
||||
public:
|
||||
Listener() {
|
||||
QVBoxLayout* lay = new QVBoxLayout(&dlg);
|
||||
lbl1 = new QLabel(); lay->addWidget(lbl1);
|
||||
bar1 = new QProgressBar(); lay->addWidget(bar1);
|
||||
lbl2 = new QLabel(); lay->addWidget(lbl2);
|
||||
bar2 = new QProgressBar(); lay->addWidget(bar2);
|
||||
dlg.resize(350, 120);
|
||||
dlg.show();
|
||||
}
|
||||
~Listener() {
|
||||
dlg.close();
|
||||
}
|
||||
|
||||
void onGridBuildUpdateMajor(const std::string& what) override {
|
||||
lbl1->setText(what.c_str());
|
||||
QApplication::processEvents();
|
||||
}
|
||||
void onGridBuildUpdateMajor(const int cnt, const int cur) override {
|
||||
bar1->setValue(cur*100/cnt);
|
||||
QApplication::processEvents();
|
||||
}
|
||||
|
||||
void onGridBuildUpdateMinor(const std::string& what) override {
|
||||
lbl2->setText(what.c_str());
|
||||
QApplication::processEvents();
|
||||
}
|
||||
void onGridBuildUpdateMinor(const int cnt, const int cur) override {
|
||||
bar2->setValue(cur*100/cnt);
|
||||
QApplication::processEvents();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
void rebuild(Floorplan::IndoorMap* im) {
|
||||
|
||||
Listener l;
|
||||
|
||||
GridFactory<MyNode> fac(grid);
|
||||
fac.build(im);
|
||||
int i = 0;(void) i;
|
||||
fac.build(im, true, &l);
|
||||
|
||||
Importance::addImportance(grid, 0);
|
||||
//Importance::addImportance(grid, 400);
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -1,40 +1,125 @@
|
||||
#ifndef GRIDRENDERER_H
|
||||
#define GRIDRENDERER_H
|
||||
|
||||
#include "../3D/MV3DElement.h"
|
||||
#include "MyNode.h"
|
||||
|
||||
#include <unordered_set>
|
||||
#include <Indoor/grid/Grid.h>
|
||||
|
||||
enum class GridRendererColorMode {
|
||||
SHOW_NODE_TYPE,
|
||||
SHOW_NODE_IMPORTANCE,
|
||||
};
|
||||
|
||||
class GridRenderer : public MV3DElement {
|
||||
class GridRenderer {
|
||||
|
||||
private:
|
||||
|
||||
Grid<MyNode>* grid;
|
||||
// settings
|
||||
GridRendererColorMode colorMode = GridRendererColorMode::SHOW_NODE_IMPORTANCE;
|
||||
bool showEdges = false;
|
||||
|
||||
struct Color {
|
||||
float r,g,b;
|
||||
Color(float r, float g, float b) : r(r), g(g), b(b) {;}
|
||||
};
|
||||
|
||||
Color colors[4] = {
|
||||
Color(0.3, 0.3, 0.3), Color(0,0,1), Color(0,0,1), Color(0,0.65,0)
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
GridRenderer(Grid<MyNode>* grid) : grid(grid) {
|
||||
/** ctor */
|
||||
GridRenderer() {
|
||||
;
|
||||
}
|
||||
|
||||
virtual void paintGL() override {
|
||||
|
||||
void setNodeColorMode(const GridRendererColorMode mode) {this->colorMode = mode;}
|
||||
void setShowEdges(const bool show) {this->showEdges = show;}
|
||||
|
||||
|
||||
/** render the given grid using GL commands */
|
||||
void paintGL(Grid<MyNode>* grid) {
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
glColor3f(0,0,0);
|
||||
|
||||
glPointSize(0.1f);
|
||||
const float s = 2;
|
||||
|
||||
if (showEdges) {
|
||||
std::unordered_set<uint64_t> used;
|
||||
glBegin(GL_LINES);
|
||||
for (MyNode& n1 : *grid) {
|
||||
glColor3f(0.5, 0.5, 0.5);
|
||||
for (MyNode& n2 : grid->neighbors(n1)) {
|
||||
uint64_t min = std::min(n1.getIdx(), n2.getIdx());
|
||||
uint64_t max = std::max(n1.getIdx(), n2.getIdx());
|
||||
uint64_t idx = max << 32 | min;
|
||||
if (used.find(idx) == used.end()) {
|
||||
glVertex3f(n1.x_cm/100.0f, n1.z_cm/100.0f*s, n1.y_cm/100.0f);
|
||||
glVertex3f(n2.x_cm/100.0f, n2.z_cm/100.0f*s, n2.y_cm/100.0f);
|
||||
used.insert(idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
||||
|
||||
glPointSize(3.0f);
|
||||
glBegin(GL_POINTS);
|
||||
for (MyNode& n : *grid) {
|
||||
glVertex3f(n.x_cm/100.0f, n.z_cm/100.0f*5, n.y_cm/100.0f);
|
||||
|
||||
// get the color to use
|
||||
switch(colorMode) {
|
||||
case GridRendererColorMode::SHOW_NODE_TYPE: {
|
||||
const Color c = colors[n.getType()];
|
||||
glColor3f(c.r, c.g, c.b);
|
||||
break;
|
||||
}
|
||||
|
||||
case GridRendererColorMode::SHOW_NODE_IMPORTANCE: {
|
||||
const float xx = n.imp - 0.6;
|
||||
glColor3f(xx, xx, xx);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
glVertex3f(n.x_cm/100.0f, n.z_cm/100.0f*s, n.y_cm/100.0f);
|
||||
|
||||
}
|
||||
glEnd();
|
||||
|
||||
// std::vector<MyNode> vec = lint();
|
||||
// glPointSize(4.0f);
|
||||
// glBegin(GL_POINTS);
|
||||
// glColor3f(1,0,0);
|
||||
// for (MyNode& n : vec) {
|
||||
// glVertex3f(n.x_cm/100.0f, n.z_cm/100.0f*s, n.y_cm/100.0f);
|
||||
// }
|
||||
// glEnd();
|
||||
|
||||
//glEnable(GL_DEPTH_TEST);
|
||||
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
|
||||
}
|
||||
|
||||
// std::vector<MyNode> lint() {
|
||||
// std::vector<MyNode> vec;
|
||||
// lintStair(vec);
|
||||
// return vec;
|
||||
// }
|
||||
|
||||
// void lintStair(std::vector<MyNode>& vec) {
|
||||
// for (MyNode& n1 : *grid) {
|
||||
// if (n1.getNumNeighbors() <= 5) { vec.push_back(n1);}
|
||||
// }
|
||||
// }
|
||||
|
||||
};
|
||||
|
||||
#endif // GRIDRENDERER_H
|
||||
|
||||
@@ -4,7 +4,11 @@
|
||||
#include <Indoor/grid/Grid.h>
|
||||
|
||||
struct MyNode : public GridNode, public GridPoint {
|
||||
|
||||
float imp;
|
||||
|
||||
MyNode(float x, float y, float z) : GridPoint(x,y,z) {;}
|
||||
|
||||
};
|
||||
|
||||
#endif // MYNODE_H
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
|
||||
#include "Scaler.h"
|
||||
class MapModel;
|
||||
class MV2DElement;
|
||||
|
||||
#include "mapview/tools/Tools.h"
|
||||
|
||||
|
||||
@@ -60,6 +62,11 @@ public:
|
||||
Scaler& getScaler() {return s;}
|
||||
|
||||
|
||||
signals:
|
||||
|
||||
void onElementChange(MV2DElement*e);
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define PAINTER_H
|
||||
|
||||
#include <QPainter>
|
||||
#include <QBitmap>
|
||||
|
||||
#include <Indoor/geo/Point2.h>
|
||||
#include <Indoor/geo/Point3.h>
|
||||
@@ -36,6 +37,17 @@ public:
|
||||
p->drawLine(s.xms(p1.x), s.yms(p1.y), s.xms(p2.x), s.yms(p2.y));
|
||||
}
|
||||
|
||||
float radToDeg(const float rad) const {
|
||||
return rad * 180 / M_PI;
|
||||
}
|
||||
|
||||
void drawArc(const Point2 center, const float radius, const float startAngleRad, const float spanAngleRad) {
|
||||
const float wh = s.ms(radius) * 2;
|
||||
const float x1 = s.xms(center.x) - wh/2;
|
||||
const float y1 = s.yms(center.y) - wh/2;
|
||||
p->drawArc(x1, y1, wh, wh, radToDeg(startAngleRad)*16, radToDeg(spanAngleRad)*16);
|
||||
}
|
||||
|
||||
void drawCircle(const Point3 center) {
|
||||
int r = 5;
|
||||
p->drawEllipse(s.xms(center.x)-r, s.yms(center.y)-r, 2*r, 2*r);
|
||||
@@ -46,6 +58,11 @@ public:
|
||||
p->drawEllipse(s.xms(center.x)-r, s.yms(center.y)-r, 2*r, 2*r);
|
||||
}
|
||||
|
||||
void drawDot(const Point2 center) {
|
||||
int r = 1;
|
||||
p->drawEllipse(s.xms(center.x)-r, s.yms(center.y)-r, 2*r, 2*r);
|
||||
}
|
||||
|
||||
void drawCircle(const Point2 center, const float size_m) {
|
||||
int r = s.ms(size_m);
|
||||
p->drawEllipse(s.xms(center.x)-r, s.yms(center.y)-r, 2*r, 2*r);
|
||||
@@ -55,14 +72,23 @@ public:
|
||||
p->drawLine(s.xms(x1), s.yms(y1), s.xms(x2), s.yms(y2));
|
||||
}
|
||||
|
||||
void drawRect(const Point2 p1, const Point2 p2) {
|
||||
drawRect(p1.x, p1.y, p2.x, p2.y);
|
||||
}
|
||||
|
||||
void drawRect(const float x1, const float y1, const float x2, const float y2) {
|
||||
float w = x2-x1;
|
||||
float h = y1-y2;
|
||||
p->drawRect(s.xms(x1), s.yms(y1), s.ms(w), s.ms(h));
|
||||
}
|
||||
|
||||
void drawRect(const Point2 center) {
|
||||
float r = s.sm(5); // 5 pixel
|
||||
drawRect(center-Point2(r,r), center+Point2(r,r));
|
||||
}
|
||||
|
||||
void drawText(const Point2 pos, const std::string& text) {
|
||||
p->drawText(s.xms(pos.x), s.xms(pos.y), text.c_str());
|
||||
p->drawText(s.xms(pos.x), s.yms(pos.y), text.c_str());
|
||||
}
|
||||
|
||||
void drawPolygon(const std::vector<Point2>& points) {
|
||||
@@ -80,6 +106,14 @@ public:
|
||||
p->drawPolygon(vec.data(), vec.size());
|
||||
}
|
||||
|
||||
void drawPixmap(const Point2 pt, const QPixmap& img) {
|
||||
p->drawPixmap(s.xms(pt.x)-img.width()/2, s.yms(pt.y)-img.height()/2, img);
|
||||
}
|
||||
|
||||
void drawImage(const Point2 pt, const QImage& img) {
|
||||
p->drawImage(s.xms(pt.x)-img.width()/2, s.yms(pt.y)-img.height()/2, img);
|
||||
}
|
||||
|
||||
void setBrush(const QBrush& brush) { p->setBrush(brush); }
|
||||
void setBrush(const Qt::BrushStyle& brush) { p->setBrush(brush); }
|
||||
|
||||
|
||||
@@ -88,9 +88,21 @@ public:
|
||||
|
||||
public:
|
||||
|
||||
float majorGridLineStep() const {return 1.0f * getLODstep();}
|
||||
float minorGridLineStep() const {return majorGridLineStep() / 5.0f;}
|
||||
|
||||
/** snap everything to minor grid lines */
|
||||
float snap(const float v) const { return snap(v, minorGridLineStep()); }
|
||||
|
||||
Point2 snap(const Point2 p) const { return Point2(snap(p.x), snap(p.y)); }
|
||||
Point3 snap(const Point3 p) const { return Point3(snap(p.x), snap(p.y), snap(p.z)); }
|
||||
|
||||
|
||||
private:
|
||||
|
||||
static float snap(const float v, const float grid) { return std::round(v/grid)*grid; }
|
||||
static Point2 snap(const Point2 p, const float grid) { return Point2(snap(p.x, grid), snap(p.y, grid)); }
|
||||
static Point3 snap(const Point3 p, const float grid) { return Point3(snap(p.x, grid), snap(p.y, grid), snap(p.z, grid)); }
|
||||
//static Point2 snap(const Point2 p, const float grid) { return Point2(snap(p.x, grid), snap(p.y, grid)); }
|
||||
//tatic Point3 snap(const Point3 p, const float grid) { return Point3(snap(p.x, grid), snap(p.y, grid), snap(p.z, grid)); }
|
||||
|
||||
static float snapCeil(const float v, const float grid) { return std::ceil(v/grid) * grid; }
|
||||
static float snapFloor(const float v, const float grid) { return std::floor(v/grid) * grid; }
|
||||
|
||||
64
mapview/elements/HasMoveableNodes.h
Normal file
@@ -0,0 +1,64 @@
|
||||
#ifndef MV2D_IHASMOVEABLENODES_H
|
||||
#define MV2D_IHASMOVEABLENODES_H
|
||||
|
||||
#include <Indoor/geo/Point2.h>
|
||||
#include "../MapView2D.h"
|
||||
|
||||
/** the selectable/moveable node */
|
||||
struct MoveableNode {
|
||||
|
||||
/** user-defined index */
|
||||
int userIdx;
|
||||
|
||||
/** the node's position */
|
||||
Point2 pos;
|
||||
|
||||
|
||||
/** ctor */
|
||||
MoveableNode(const int userIdx, const Point2 pos) : userIdx(userIdx), pos(pos) {;}
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* base for all 2D elements that have selectable and moveable nodes
|
||||
* the ToolSelector is able to get, select, and move those nodes
|
||||
*/
|
||||
class HasMoveableNodes {
|
||||
|
||||
protected:
|
||||
|
||||
/** currently selected node */
|
||||
int selectedUserIdx = -1;
|
||||
|
||||
public:
|
||||
|
||||
|
||||
/** get a list of all nodes that are selectable / moveable */
|
||||
virtual std::vector<MoveableNode> getMoveableNodes() const = 0;
|
||||
|
||||
/** the given node was moved */
|
||||
virtual void onNodeMove(MapView2D* v, const int userIdx, const Point2 newPos) = 0;
|
||||
|
||||
|
||||
/** the given node was selected */
|
||||
virtual void onNodeSelect(MapView2D* v, const int userIdx) {
|
||||
(void) v;
|
||||
this->selectedUserIdx = userIdx;
|
||||
}
|
||||
|
||||
/** unselect any selected node */
|
||||
virtual void onNodeUnselect(MapView2D* v) {
|
||||
(void) v;
|
||||
this->selectedUserIdx = -1;
|
||||
}
|
||||
|
||||
/** get the currently selected node */
|
||||
virtual int getSelectedNode() const {
|
||||
return selectedUserIdx;
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // MV2D_IHASMOVEABLENODES_H
|
||||
@@ -63,6 +63,7 @@ public:
|
||||
/** key pressed. return true when consumed. */
|
||||
virtual bool keyPressEvent(MapView2D* v, QKeyEvent* e) = 0;
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
virtual void onFocus() = 0;
|
||||
|
||||
@@ -2,14 +2,18 @@
|
||||
#define MV2DELEMENTACCESSPOINT_H
|
||||
|
||||
#include "MV2DElement.h"
|
||||
#include "HasMoveableNodes.h"
|
||||
|
||||
#include "MapViewElementHelper.h"
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
class MV2DElementAccessPoint : public MV2DElement {
|
||||
#include "../../UIHelper.h"
|
||||
|
||||
class MV2DElementAccessPoint : public MV2DElement, public HasMoveableNodes {
|
||||
|
||||
private:
|
||||
|
||||
bool sel = false;
|
||||
//bool sel = false;
|
||||
Floorplan::AccessPoint* ap;
|
||||
|
||||
public:
|
||||
@@ -34,19 +38,28 @@ public:
|
||||
/** repaint me */
|
||||
void paint(Painter& p) override {
|
||||
|
||||
if (sel) {
|
||||
p.setPenBrush(Qt::black, CFG::SEL_COLOR);
|
||||
p.drawCircle(ap->pos.xy());
|
||||
static const QPixmap& pixmapUnfocused = UIHelper::getPixmapColored("wifi", CFG::UNFOCUS_COLOR, 16);
|
||||
static const QPixmap& pixmapFocused = UIHelper::getPixmapColored("wifi", CFG::FOCUS_COLOR, 16);
|
||||
static const QPixmap& pixmapSel = UIHelper::getPixmapColored("wifi", CFG::SEL_COLOR, 16);
|
||||
|
||||
|
||||
if (selectedUserIdx == 0) {
|
||||
//p.setPenBrush(Qt::black, CFG::SEL_COLOR);
|
||||
//p.drawCircle(ap->pos.xy());
|
||||
p.drawPixmap(ap->pos.xy(), pixmapSel);
|
||||
} else if (hasFocus()) {
|
||||
p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
p.drawCircle(ap->pos.xy());
|
||||
//p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
//p.drawCircle(ap->pos.xy());
|
||||
p.drawPixmap(ap->pos.xy(), pixmapFocused);
|
||||
} else {
|
||||
p.setPenBrush(Qt::gray, Qt::NoBrush);
|
||||
p.drawCircle(ap->pos.xy());
|
||||
//p.setPenBrush(Qt::gray, Qt::NoBrush);
|
||||
//p.drawCircle(ap->pos.xy());
|
||||
p.drawPixmap(ap->pos.xy(), pixmapUnfocused);
|
||||
}
|
||||
|
||||
// label
|
||||
p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
p.drawDot(ap->pos.xy());
|
||||
if (p.getScaler().getScale() >= 25) {
|
||||
const std::string str = ap->name + " (" + ap->name + ")";
|
||||
p.p->drawText(p.getScaler().xms(ap->pos.x) + 10, p.getScaler().yms(ap->pos.y) + 5, str.c_str());
|
||||
@@ -57,6 +70,14 @@ public:
|
||||
|
||||
}
|
||||
|
||||
virtual std::vector<MoveableNode> getMoveableNodes() const override {
|
||||
return { MoveableNode(0, ap->pos.xy()) };
|
||||
}
|
||||
|
||||
virtual void onNodeMove(MapView2D* v, const int userIdx, const Point2 newPos) override {
|
||||
(void) v;
|
||||
if (userIdx == 0) {ap->pos.x = newPos.x; ap->pos.y = newPos.y;}
|
||||
}
|
||||
|
||||
|
||||
/** mouse pressed at the given point */
|
||||
@@ -67,20 +88,15 @@ public:
|
||||
}
|
||||
|
||||
/** mouse moved to the given point */
|
||||
virtual void mouseMove(MapView2D* v, const Point2 _p) override {
|
||||
virtual void mouseMove(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
if (sel) {
|
||||
const Point2 p = Scaler::snap(_p, CFG::MOVE_SNAP_SIZE_M);
|
||||
ap->pos.x = p.x;
|
||||
ap->pos.y = p.y;
|
||||
}
|
||||
(void) p;
|
||||
}
|
||||
|
||||
/** mouse released */
|
||||
virtual void mouseReleased(MapView2D* v, const Point2 _p) override {
|
||||
virtual void mouseReleased(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
(void) _p;
|
||||
sel = true;
|
||||
(void) p;
|
||||
}
|
||||
|
||||
virtual bool keyPressEvent(MapView2D* v, QKeyEvent *e) override {
|
||||
@@ -90,11 +106,11 @@ public:
|
||||
}
|
||||
|
||||
virtual void onFocus() override {
|
||||
|
||||
;
|
||||
}
|
||||
|
||||
virtual void onUnfocus() override {
|
||||
sel = false;
|
||||
;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -2,14 +2,17 @@
|
||||
#define MV2DELEMENTBEACON_H
|
||||
|
||||
#include "MV2DElement.h"
|
||||
#include "HasMoveableNodes.h"
|
||||
|
||||
#include "MapViewElementHelper.h"
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
class MV2DElementBeacon : public MV2DElement {
|
||||
#include "../../UIHelper.h"
|
||||
|
||||
class MV2DElementBeacon : public MV2DElement, public HasMoveableNodes {
|
||||
|
||||
private:
|
||||
|
||||
bool sel = false;
|
||||
Floorplan::Beacon* b;
|
||||
|
||||
public:
|
||||
@@ -33,19 +36,28 @@ public:
|
||||
/** repaint me */
|
||||
void paint(Painter& p) override {
|
||||
|
||||
if (sel) {
|
||||
p.setPenBrush(Qt::black, CFG::SEL_COLOR);
|
||||
p.drawCircle(b->pos.xy());
|
||||
static const QPixmap& pixmapUnfocused = UIHelper::getPixmapColored("beacon", CFG::UNFOCUS_COLOR, 16);
|
||||
static const QPixmap& pixmapFocused = UIHelper::getPixmapColored("beacon", CFG::FOCUS_COLOR, 16);
|
||||
static const QPixmap& pixmapSel = UIHelper::getPixmapColored("beacon", CFG::SEL_COLOR, 16);
|
||||
|
||||
if (selectedUserIdx == 0) {
|
||||
//p.setPenBrush(Qt::black, CFG::SEL_COLOR);
|
||||
//p.drawCircle(b->pos.xy());
|
||||
p.drawPixmap(b->pos.xy(), pixmapSel);
|
||||
|
||||
} else if (hasFocus()) {
|
||||
p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
p.drawCircle(b->pos.xy());
|
||||
//p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
//p.drawCircle(b->pos.xy());
|
||||
p.drawPixmap(b->pos.xy(), pixmapFocused);
|
||||
} else {
|
||||
p.setPenBrush(Qt::gray, Qt::NoBrush);
|
||||
p.drawCircle(b->pos.xy());
|
||||
//p.setPenBrush(Qt::gray, Qt::NoBrush);
|
||||
//p.drawCircle(b->pos.xy());
|
||||
p.drawPixmap(b->pos.xy(), pixmapUnfocused);
|
||||
}
|
||||
|
||||
// label
|
||||
p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
p.drawDot(b->pos.xy());
|
||||
if (p.getScaler().getScale() >= 25) {
|
||||
const std::string str = b->name + " (" + b->mac + ")";
|
||||
p.p->drawText(p.getScaler().xms(b->pos.x) + 10, p.getScaler().yms(b->pos.y) + 5, str.c_str());
|
||||
@@ -56,12 +68,21 @@ public:
|
||||
|
||||
}
|
||||
|
||||
virtual std::vector<MoveableNode> getMoveableNodes() const override {
|
||||
return { MoveableNode(0, b->pos.xy()) };
|
||||
}
|
||||
|
||||
virtual void onNodeMove(MapView2D* v, const int userIdx, const Point2 newPos) override {
|
||||
(void) v;
|
||||
if (userIdx == 0) {b->pos.x = newPos.x; b->pos.y = newPos.y;}
|
||||
}
|
||||
|
||||
virtual void onFocus() override {
|
||||
;
|
||||
}
|
||||
|
||||
virtual void onUnfocus() override {
|
||||
sel = false;
|
||||
;
|
||||
}
|
||||
|
||||
/** mouse pressed at the given point */
|
||||
@@ -71,20 +92,15 @@ public:
|
||||
}
|
||||
|
||||
/** mouse moved to the given point */
|
||||
virtual void mouseMove(MapView2D* v, const Point2 _p) override {
|
||||
virtual void mouseMove(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
if (sel) {
|
||||
const Point2 p = Scaler::snap(_p, CFG::MOVE_SNAP_SIZE_M);
|
||||
b->pos.x = p.x;
|
||||
b->pos.y = p.y;
|
||||
}
|
||||
(void) p;
|
||||
}
|
||||
|
||||
/** mouse released */
|
||||
virtual void mouseReleased(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
(void) p;
|
||||
sel = true;
|
||||
}
|
||||
|
||||
virtual bool keyPressEvent(MapView2D* v, QKeyEvent *e) override {
|
||||
|
||||
@@ -35,7 +35,7 @@ public:
|
||||
/** repaint me */
|
||||
void paint(Painter& p) override {
|
||||
|
||||
QPen pen = MapElementHelper::getPen(c->material, c->type, hasFocus());
|
||||
QPen pen;// = MapElementHelper::getPen(c->material, c->type, hasFocus());
|
||||
|
||||
p.setPenBrush(pen, Qt::NoBrush);
|
||||
p.drawCircle(c->center, c->radius);
|
||||
@@ -81,7 +81,7 @@ public:
|
||||
virtual void mouseMove(MapView2D* v, const Point2 _p) override {
|
||||
(void) v;
|
||||
if (selPoint == -1) {return;}
|
||||
const Point2 p = Scaler::snap(_p, CFG::MOVE_SNAP_SIZE_M);
|
||||
const Point2 p = v->getScaler().snap(_p);
|
||||
if (selPoint == 0) {c->center = p;}
|
||||
if (selPoint == 1) {c->radius = p.getDistance(c->center);}
|
||||
}
|
||||
|
||||
146
mapview/elements/MV2DElementFloorObstacleDoor.h
Normal file
@@ -0,0 +1,146 @@
|
||||
#ifndef MV2DELEMENTFLOOROBSTACLEDOOR_H
|
||||
#define MV2DELEMENTFLOOROBSTACLEDOOR_H
|
||||
|
||||
#include "MV2DElement.h"
|
||||
#include "MapViewElementHelper.h"
|
||||
#include "HasMoveableNodes.h"
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
class MV2DElementFloorObstacleDoor : public MV2DElement, public HasMoveableNodes {
|
||||
|
||||
private:
|
||||
|
||||
//int selPoint = -1;
|
||||
Floorplan::FloorObstacleDoor* fo;
|
||||
|
||||
public:
|
||||
|
||||
/** ctor */
|
||||
MV2DElementFloorObstacleDoor(Floorplan::FloorObstacleDoor* fo) : fo(fo) {;}
|
||||
|
||||
/** get the element's 3D bounding box */
|
||||
BBox2 getBoundingBox() const override {
|
||||
BBox2 bbox;
|
||||
bbox.add(fo->from);
|
||||
bbox.add(fo->to);
|
||||
return bbox;
|
||||
}
|
||||
|
||||
/** get the element's minimal distance (nearest whatsoever) to the given point */
|
||||
float getMinDistanceXY(const Point2 p) const override {
|
||||
return MapElementHelper::getLineDistanceXY(fo->from, fo->to, p);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** repaint me */
|
||||
void paint(Painter& p) override {
|
||||
|
||||
// selected endpoints?
|
||||
if (hasFocus()) {
|
||||
p.setPenBrush(Qt::NoPen, CFG::SEL_COLOR);
|
||||
if (selectedUserIdx == 0) {p.drawCircle(fo->from);}
|
||||
if (selectedUserIdx == 1) {p.drawCircle(fo->to);}
|
||||
}
|
||||
|
||||
QPen pen;
|
||||
pen.setColor(QColor(0.5,0.5,0.5));
|
||||
pen.setStyle(Qt::PenStyle::DotLine);
|
||||
p.setPenBrush(pen, Qt::NoBrush);
|
||||
|
||||
// opening indicator
|
||||
const float open = (fo->swap) ? (-M_PI * 0.5) : (+M_PI * 0.5);
|
||||
const float len = (fo->to - fo->from).length();
|
||||
const float angle1 = std::atan2(fo->to.y-fo->from.y, fo->to.x-fo->from.x);
|
||||
const float angle2 = angle1 + open;
|
||||
const Point2 pOpen = Point2( std::cos(angle2) * len, std::sin(angle2) * len ) + fo->from;
|
||||
|
||||
pen.setWidth(2); p.setPen(pen);
|
||||
p.drawLine(fo->from, fo->to);
|
||||
|
||||
pen.setWidth(1); p.setPen(pen);
|
||||
p.drawLine(fo->from, pOpen);
|
||||
p.drawArc(fo->from, len, angle1, open);
|
||||
|
||||
// available endpoints
|
||||
if (hasFocus()) {
|
||||
p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
p.drawCircle(fo->from);
|
||||
p.drawCircle(fo->to);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
virtual void onFocus() override {
|
||||
;
|
||||
}
|
||||
|
||||
virtual void onUnfocus() override {
|
||||
selectedUserIdx = -1; // clear selection
|
||||
}
|
||||
|
||||
virtual void mousePressed(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
(void) p;
|
||||
}
|
||||
|
||||
virtual void mouseMove(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
(void) p;
|
||||
}
|
||||
|
||||
virtual void mouseReleased(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
(void) p;
|
||||
}
|
||||
|
||||
/** mouse moved to the given point */
|
||||
// virtual void mouseMove(MapView2D* v, const Point2 _p) override {
|
||||
// (void) v;
|
||||
// if (selPoint == -1) {return;}
|
||||
// const Point2 p = v->getScaler().snap(_p);
|
||||
// if (selPoint == 0) {fo->from.x = p.x; fo->from.y = p.y;}
|
||||
// if (selPoint == 1) {fo->to.x = p.x; fo->to.y = p.y;}
|
||||
// emit v->onElementChange(this);
|
||||
// }
|
||||
|
||||
/** mouse released */
|
||||
// virtual void mouseReleased(MapView2D* v, const Point2 _p) override {
|
||||
// // select a new point on mouse-release (more robust than on mouse-press)
|
||||
// const float t = v->getScaler().sm(CFG::SEL_THRESHOLD_SIZE_PX);
|
||||
// const float l1 = _p.getDistance(fo->from);
|
||||
// const float l2 = _p.getDistance(fo->to);
|
||||
// if (l1 < l2 && l1 <= t) {selPoint = 0;}
|
||||
// else if (l2 < l1 && l2 <= t) {selPoint = 1;}
|
||||
// else {selPoint = -1;}
|
||||
|
||||
// }
|
||||
|
||||
/** get a list of all nodes that are selectable / moveable */
|
||||
virtual std::vector<MoveableNode> getMoveableNodes() const override {
|
||||
std::vector<MoveableNode> nodes = {
|
||||
MoveableNode(0, fo->from),
|
||||
MoveableNode(1, fo->to)
|
||||
};
|
||||
return nodes;
|
||||
}
|
||||
|
||||
/** the given node was moved */
|
||||
virtual void onNodeMove(MapView2D* v, const int userIdx, const Point2 newPos) override {
|
||||
switch (userIdx) {
|
||||
case 0: fo->from = newPos; break;
|
||||
case 1: fo->to = newPos; break;
|
||||
}
|
||||
emit v->onElementChange(this);
|
||||
}
|
||||
|
||||
virtual bool keyPressEvent(MapView2D* v, QKeyEvent *e) override {
|
||||
(void) v;
|
||||
(void) e;
|
||||
return false;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // MV2DELEMENTFLOOROBSTACLEDOOR_H
|
||||
@@ -42,10 +42,18 @@ public:
|
||||
if (selPoint == 1) {p.drawCircle(fo->to);}
|
||||
}
|
||||
|
||||
// line
|
||||
|
||||
p.setPenBrush(MapElementHelper::getPen(fo->material, fo->type, hasFocus()), Qt::NoBrush);
|
||||
p.drawLine(fo->from, fo->to);
|
||||
|
||||
// // door?
|
||||
// if (fo->type == Floorplan::ObstacleType::DOOR) {
|
||||
// paintDoor(p);
|
||||
// } else {
|
||||
// p.setPenBrush(MapElementHelper::getPen(fo->material, fo->type, hasFocus()), Qt::NoBrush);
|
||||
// p.drawLine(fo->from, fo->to);
|
||||
// }
|
||||
|
||||
// available endpoints
|
||||
if (hasFocus()) {
|
||||
p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
@@ -55,6 +63,29 @@ public:
|
||||
|
||||
}
|
||||
|
||||
void paintDoor(Painter& p) {
|
||||
|
||||
QPen pen;
|
||||
pen.setColor(QColor(0.5,0.5,0.5));
|
||||
pen.setStyle(Qt::PenStyle::DotLine);
|
||||
p.setPenBrush(pen, Qt::NoBrush);
|
||||
|
||||
|
||||
// opening indicator
|
||||
const float open = M_PI / 4;
|
||||
const float len = (fo->to - fo->from).length();
|
||||
const float angle1 = std::atan2(fo->to.y-fo->from.y, fo->to.x-fo->from.x);
|
||||
const float angle2 = angle1 + open;
|
||||
const Point2 pOpen = Point2( std::cos(angle2) * len, std::sin(angle2) * len ) + fo->from;
|
||||
|
||||
p.drawLine(fo->from, fo->to);
|
||||
p.drawLine(fo->from, pOpen);
|
||||
|
||||
p.drawArc(fo->from, len, angle1, open);
|
||||
//p.drawLine(fo->to, pOpen);
|
||||
|
||||
}
|
||||
|
||||
virtual void onFocus() override {
|
||||
;
|
||||
}
|
||||
@@ -74,7 +105,7 @@ public:
|
||||
virtual void mouseMove(MapView2D* v, const Point2 _p) override {
|
||||
(void) v;
|
||||
if (selPoint == -1) {return;}
|
||||
const Point2 p = Scaler::snap(_p, CFG::MOVE_SNAP_SIZE_M);
|
||||
const Point2 p = v->getScaler().snap(_p);
|
||||
if (selPoint == 0) {fo->from.x = p.x; fo->from.y = p.y;}
|
||||
if (selPoint == 1) {fo->to.x = p.x; fo->to.y = p.y;}
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ public:
|
||||
virtual void mouseMove(MapView2D* v, const Point2 _p) override {
|
||||
(void) v;
|
||||
if (selPoint == -1) {return;}
|
||||
const Point2 p = Scaler::snap(_p, CFG::MOVE_SNAP_SIZE_M);
|
||||
const Point2 p = v->getScaler().snap(_p);
|
||||
fo.poly.points[selPoint].x = p.x;
|
||||
fo.poly.points[selPoint].y = p.y;
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ public:
|
||||
virtual void mouseMove(MapView2D* v, const Point2 _p) override {
|
||||
(void) v;
|
||||
if (selPoint == -1) {return;}
|
||||
const Point2 p = Scaler::snap(_p, CFG::MOVE_SNAP_SIZE_M);
|
||||
const Point2 p = v->getScaler().snap(_p);
|
||||
if (selPoint == 0) {underlay->anchor = p;}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,14 +2,17 @@
|
||||
#define MV2DELEMENTPOI_H
|
||||
|
||||
#include "MV2DElement.h"
|
||||
#include "HasMoveableNodes.h"
|
||||
#include "MapViewElementHelper.h"
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
class MV2DElementPOI : public MV2DElement {
|
||||
#include "../../UIHelper.h"
|
||||
|
||||
class MV2DElementPOI : public MV2DElement, public HasMoveableNodes {
|
||||
|
||||
private:
|
||||
|
||||
bool sel = false;
|
||||
//bool sel = false;
|
||||
Floorplan::POI* poi;
|
||||
|
||||
public:
|
||||
@@ -34,19 +37,28 @@ public:
|
||||
/** repaint me */
|
||||
void paint(Painter& p) override {
|
||||
|
||||
if (sel) {
|
||||
p.setPenBrush(Qt::black, CFG::SEL_COLOR);
|
||||
p.drawCircle(poi->pos);
|
||||
static const QPixmap& pixmapUnfocused = UIHelper::getPixmapColored("poi", CFG::UNFOCUS_COLOR, 16);
|
||||
static const QPixmap& pixmapFocused = UIHelper::getPixmapColored("poi", CFG::FOCUS_COLOR, 16);
|
||||
static const QPixmap& pixmapSel = UIHelper::getPixmapColored("poi", CFG::SEL_COLOR, 16);
|
||||
|
||||
|
||||
if (selectedUserIdx == 0) {
|
||||
// p.setPenBrush(Qt::black, CFG::SEL_COLOR);
|
||||
// p.drawCircle(poi->pos);
|
||||
p.drawPixmap(poi->pos, pixmapSel);
|
||||
} else if (hasFocus()) {
|
||||
p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
p.drawCircle(poi->pos);
|
||||
// p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
// p.drawCircle(poi->pos);
|
||||
p.drawPixmap(poi->pos, pixmapFocused);
|
||||
} else {
|
||||
p.setPenBrush(Qt::gray, Qt::NoBrush);
|
||||
p.drawCircle(poi->pos);
|
||||
// p.setPenBrush(Qt::gray, Qt::NoBrush);
|
||||
// p.drawCircle(poi->pos);
|
||||
p.drawPixmap(poi->pos, pixmapUnfocused);
|
||||
}
|
||||
|
||||
// label
|
||||
p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
p.drawDot(poi->pos);
|
||||
if (p.getScaler().getScale() >= 10) {
|
||||
const std::string str = poi->name;
|
||||
p.p->drawText(p.getScaler().xms(poi->pos.x) + 10, p.getScaler().yms(poi->pos.y) + 5, str.c_str());
|
||||
@@ -55,29 +67,37 @@ public:
|
||||
}
|
||||
|
||||
|
||||
virtual std::vector<MoveableNode> getMoveableNodes() const override {
|
||||
return { MoveableNode(0, poi->pos) };
|
||||
}
|
||||
|
||||
virtual void onNodeMove(MapView2D* v, const int userIdx, const Point2 newPos) override {
|
||||
(void) v;
|
||||
if (userIdx == 0) {poi->pos = newPos;}
|
||||
}
|
||||
|
||||
|
||||
/** mouse pressed at the given point */
|
||||
virtual void mousePressed(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
(void) p;
|
||||
|
||||
}
|
||||
|
||||
/** mouse moved to the given point */
|
||||
virtual void mouseMove(MapView2D* v, const Point2 _p) override {
|
||||
virtual void mouseMove(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
if (sel) {
|
||||
const Point2 p = Scaler::snap(_p, CFG::MOVE_SNAP_SIZE_M);
|
||||
poi->pos.x = p.x;
|
||||
poi->pos.y = p.y;
|
||||
}
|
||||
(void) p;
|
||||
// if (sel) {
|
||||
// const Point2 p = v->getScaler().snap(_p);
|
||||
// poi->pos.x = p.x;
|
||||
// poi->pos.y = p.y;
|
||||
// }
|
||||
}
|
||||
|
||||
/** mouse released */
|
||||
virtual void mouseReleased(MapView2D* v, const Point2 _p) override {
|
||||
virtual void mouseReleased(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
(void) _p;
|
||||
sel = true;
|
||||
(void) p;
|
||||
}
|
||||
|
||||
virtual bool keyPressEvent(MapView2D* v, QKeyEvent *e) override {
|
||||
@@ -87,11 +107,11 @@ public:
|
||||
}
|
||||
|
||||
virtual void onFocus() override {
|
||||
|
||||
;
|
||||
}
|
||||
|
||||
virtual void onUnfocus() override {
|
||||
sel = false;
|
||||
;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
233
mapview/elements/MV2DElementStair.h
Normal file
@@ -0,0 +1,233 @@
|
||||
#ifndef MV2DELEMENTSTAIR_H
|
||||
#define MV2DELEMENTSTAIR_H
|
||||
|
||||
#include "MV2DElement.h"
|
||||
#include "MapViewElementHelper.h"
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
class MV2DElementStair : public MV2DElement {
|
||||
|
||||
private:
|
||||
|
||||
bool sel = false;
|
||||
Floorplan::Floor* floor;
|
||||
Floorplan::Stair* stair;
|
||||
int selPart = -1;
|
||||
int selNode = -1;
|
||||
|
||||
public:
|
||||
|
||||
/** ctor with the AP to render/edit */
|
||||
MV2DElementStair(Floorplan::Floor* floor, Floorplan::Stair* stair) : floor(floor), stair(stair) {;}
|
||||
|
||||
|
||||
/** get the element's 3D bounding box */
|
||||
BBox2 getBoundingBox() const override {
|
||||
BBox2 bbox;
|
||||
if (dynamic_cast<Floorplan::StairFreeform*>(stair)) {
|
||||
Floorplan::StairFreeform* stair = dynamic_cast<Floorplan::StairFreeform*>(this->stair);
|
||||
for (const Floorplan::StairPart p : stair->parts) {
|
||||
bbox.add(p.start.xy());
|
||||
bbox.add(p.end.xy());
|
||||
}
|
||||
}
|
||||
return bbox;
|
||||
}
|
||||
|
||||
/** get the element's minimal distance (nearest whatsoever) to the given point */
|
||||
float getMinDistanceXY(const Point2 p) const override {
|
||||
|
||||
auto comp = [p] (const Floorplan::StairPart& p1, const Floorplan::StairPart& p2) {
|
||||
const float d1 = MapElementHelper::getLineDistanceXY(p1.start.xy(), p1.end.xy(), p);
|
||||
const float d2 = MapElementHelper::getLineDistanceXY(p2.start.xy(), p2.end.xy(), p);
|
||||
return d1 < d2;
|
||||
};
|
||||
|
||||
auto parts = stair->getParts();
|
||||
auto min = std::min_element(parts.begin(), parts.end(), comp);
|
||||
return MapElementHelper::getLineDistanceXY(min->start.xy(), min->end.xy(), p);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int getSelPart() const {return selPart;}
|
||||
int getSelNode() const {return selNode;}
|
||||
|
||||
static inline float clamp01(const float val) {
|
||||
if (val < 0) {return 0;}
|
||||
if (val > 1) {return 1;}
|
||||
return val;
|
||||
}
|
||||
|
||||
/** repaint me */
|
||||
void paint(Painter& p) override {
|
||||
|
||||
Floorplan::StairFreeform* stair = dynamic_cast<Floorplan::StairFreeform*>(this->stair);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// if (sel) {
|
||||
// p.setPenBrush(Qt::black, CFG::SEL_COLOR);
|
||||
// p.drawCircle(stair->center);
|
||||
// } else if (hasFocus()) {
|
||||
// p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
// p.drawCircle(stair->center);
|
||||
// } else {
|
||||
// p.setPenBrush(Qt::gray, Qt::NoBrush);
|
||||
// p.drawCircle(stair->center);
|
||||
// }
|
||||
|
||||
// draw all parts of the stair (all polygons)
|
||||
p.setPenBrush(Qt::black, Qt::NoBrush);
|
||||
|
||||
std::vector<Floorplan::StairPart> parts = stair->getParts();
|
||||
std::vector<Floorplan::Quad3> quads = Floorplan::getQuads(parts, floor);
|
||||
|
||||
for (int i = 0; i < (int) parts.size(); ++i) {
|
||||
|
||||
const Floorplan::StairPart& part = parts[i];
|
||||
const Floorplan::Quad3& quad = quads[i];
|
||||
|
||||
// fill the polygon with a gradient corresponding with the stair's height relative to the floor's height
|
||||
QLinearGradient gradient(p.s.xms(part.start.x), p.s.yms(part.start.y), p.s.xms(part.end.x), p.s.yms(part.end.y));
|
||||
const float p1 = 0.1 + clamp01( part.start.z / floor->height) * 0.8;
|
||||
const float p2 = 0.1 + clamp01( part.end.z / floor->height) * 0.8;
|
||||
gradient.setColorAt(0, QColor(p1*255, p1*255, p1*255));
|
||||
gradient.setColorAt(1, QColor(p2*255, p2*255, p2*255));
|
||||
p.setBrush(gradient);
|
||||
p.setPen(QColor(0,0,0,128));
|
||||
|
||||
// polygon-construction
|
||||
//const Floorplan::Quad3 quad = part.getQuad(floor);
|
||||
const std::vector<Point3> points = {quad.p1, quad.p2, quad.p3, quad.p4};
|
||||
p.drawPolygon(points);
|
||||
|
||||
}
|
||||
|
||||
if (hasFocus()) {
|
||||
int cnt = 0;
|
||||
std::vector<Floorplan::StairPart> parts = stair->getParts();
|
||||
for (const Floorplan::StairPart& part : parts) {
|
||||
p.setPenBrush(Qt::black, (cnt == selPart && selNode == 0) ? CFG::SEL_COLOR : Qt::NoBrush); // part start
|
||||
p.drawCircle(part.start.xy());
|
||||
p.setPenBrush(Qt::black, (cnt == selPart && selNode == 1) ? CFG::SEL_COLOR : Qt::NoBrush); // part end
|
||||
p.drawRect(part.end.xy());
|
||||
p.setPenBrush(Qt::blue, Qt::NoBrush);
|
||||
Point2 ctr = (part.start+part.end).xy() / 2;
|
||||
p.drawText(ctr, "p" + std::to_string(cnt+1)); // part name
|
||||
++cnt;
|
||||
}
|
||||
for (int i = 0; i < (int)parts.size() - 1; ++i) {
|
||||
const Point3 p1 = parts[i+0][1];
|
||||
const Point3 p2 = parts[i+1][0];
|
||||
p.drawLine(p1.xy(), p2.xy());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** mouse pressed at the given point */
|
||||
virtual void mousePressed(MapView2D* v, const Point2 p) override {
|
||||
(void) v;
|
||||
(void) p;
|
||||
|
||||
}
|
||||
|
||||
/** mouse moved to the given point */
|
||||
virtual void mouseMove(MapView2D* v, const Point2 _p) override {
|
||||
(void) v;
|
||||
if (selPart == -1) {return;}
|
||||
Floorplan::StairFreeform* stair = dynamic_cast<Floorplan::StairFreeform*>(this->stair);
|
||||
const Point2 p = v->getScaler().snap(_p);
|
||||
stair->parts[selPart][selNode].x = p.x;
|
||||
stair->parts[selPart][selNode].y = p.y;
|
||||
}
|
||||
|
||||
/** mouse released */
|
||||
virtual void mouseReleased(MapView2D* v, const Point2 _p) override {
|
||||
(void) v;
|
||||
(void) _p;
|
||||
// select a new point on mouse-release (more robust than on mouse-press)
|
||||
Floorplan::StairFreeform* stair = dynamic_cast<Floorplan::StairFreeform*>(this->stair);
|
||||
const float t = v->getScaler().sm(CFG::SEL_THRESHOLD_SIZE_PX);
|
||||
// auto comp = [&] (const Point3 a, const Point3 b) {return a.xy().getDistance(_p) < b.xy().getDistance(_p);};
|
||||
// auto it = std::min_element(stair->nodes.begin(), stair->nodes.end(), comp);
|
||||
// if (it == stair->nodes.end()) {selIdx = -1;} // none found -> skip
|
||||
// else if ((*it).xy().getDistance(_p) > t) {selIdx = -1;} // nearest distance is above threshold -> skip
|
||||
// else {selIdx = it - stair->nodes.begin();}
|
||||
|
||||
float best = 999999;
|
||||
int minPart; int minNode;
|
||||
for (int part = 0; part < (int) stair->parts.size(); ++part) {
|
||||
for (int node = 0; node < 2; ++node) {
|
||||
const float dist = stair->parts[part][node].xy().getDistance(_p);
|
||||
if (dist < best) {best = dist; minPart = part; minNode = node;}
|
||||
}
|
||||
}
|
||||
|
||||
if (best <= t) {
|
||||
selPart = minPart; selNode = minNode;
|
||||
} else {
|
||||
selPart = -1; selNode = -1;
|
||||
}
|
||||
|
||||
emit v->onElementChange(this);
|
||||
|
||||
}
|
||||
|
||||
virtual bool keyPressEvent(MapView2D* v, QKeyEvent *e) override {
|
||||
(void) v;
|
||||
(void) e;
|
||||
|
||||
Floorplan::StairFreeform* stair = dynamic_cast<Floorplan::StairFreeform*>(this->stair);
|
||||
|
||||
if (e->key() == Qt::Key_Delete) {
|
||||
|
||||
// delete the currently selected vertex?
|
||||
if (selPart != -1) {
|
||||
// stair->nodes.erase(stair->nodes.begin() + selIdx);
|
||||
// selIdx = -1;
|
||||
// return true;
|
||||
}
|
||||
|
||||
} else if (e->key() == Qt::Key_Plus && selPart != -1) {
|
||||
// int idx1 = selIdx;
|
||||
// int idx2 = (selIdx + 1) % stair->nodes.size();
|
||||
// int idxNew = idx2;
|
||||
// Point3 pNew = (stair->nodes[idx1] + stair->nodes[idx2]) / 2.0f;
|
||||
// stair->nodes.insert(stair->nodes.begin() + idxNew, pNew);
|
||||
// selIdx = idxNew;
|
||||
// return true;
|
||||
const int idxNew = selPart + 1;
|
||||
const Point3 p0 = stair->parts[selPart][1];
|
||||
const Point3 p1 = p0 + Point3(1,1,0);
|
||||
const Point3 p2 = p1 + Point3(2,2,0);
|
||||
const float w = stair->parts[selPart].width;
|
||||
stair->parts.insert(stair->parts.begin() + idxNew, Floorplan::StairPart(p1, p2, w));
|
||||
return true;
|
||||
}
|
||||
|
||||
// not consumed
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
virtual void onFocus() override {
|
||||
selPart = -1;
|
||||
selNode = -1;
|
||||
}
|
||||
|
||||
virtual void onUnfocus() override {
|
||||
sel = false;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // MV2DELEMENTSTAIR_H
|
||||
@@ -15,6 +15,8 @@
|
||||
namespace CFG {
|
||||
const float MOVE_SNAP_SIZE_M = 0.1f; // in meter (= map-space)
|
||||
const int SEL_THRESHOLD_SIZE_PX = 15; // in screen-pixels (-> should depend on the current zoom)
|
||||
const QColor FOCUS_COLOR = Qt::black;
|
||||
const QColor UNFOCUS_COLOR = Qt::gray;
|
||||
const QColor SEL_COLOR = Qt::blue;
|
||||
}
|
||||
|
||||
@@ -52,7 +54,9 @@ public:
|
||||
} else {
|
||||
|
||||
// no cut detected
|
||||
return 9999999;
|
||||
const float d1 = p1.getDistance(dst);
|
||||
const float d2 = p2.getDistance(dst);
|
||||
return std::min(d1, d2);
|
||||
|
||||
}
|
||||
|
||||
|
||||
16
mapview/model/IHasDoorType.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#ifndef IHASDOORTYPE_H
|
||||
#define IHASDOORTYPE_H
|
||||
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
class IHasDoorType {
|
||||
public:
|
||||
|
||||
virtual void setDoorType(const Floorplan::DoorType t) = 0;
|
||||
|
||||
virtual Floorplan::DoorType getDoorType() const = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif // IHASDOORTYPE_H
|
||||
@@ -6,6 +6,8 @@
|
||||
#include <Indoor/geo/Point3.h>
|
||||
|
||||
enum class ParamType {
|
||||
NOT_AVAILABLE,
|
||||
BOOL,
|
||||
INT,
|
||||
FLOAT,
|
||||
STRING,
|
||||
@@ -18,6 +20,7 @@ class ParamValue {
|
||||
|
||||
private:
|
||||
union {
|
||||
bool _bool;
|
||||
int _int;
|
||||
float _float;
|
||||
float _arr[3];
|
||||
@@ -31,16 +34,18 @@ public:
|
||||
}
|
||||
|
||||
void setValue(const std::string& val) {_str = val;}
|
||||
void setValue(float val) {_float = val;}
|
||||
void setValue(int val) {_int = val;}
|
||||
void setValue(Point2 p) {_arr[0] = p.x; _arr[1] = p.y;}
|
||||
void setValue(Point3 p) {_arr[0] = p.x; _arr[1] = p.y; _arr[2] = p.z;}
|
||||
void setValue(const float val) {_float = val;}
|
||||
void setValue(const int val) {_int = val;}
|
||||
void setValue(const bool val) {_bool = val;}
|
||||
void setValue(const Point2 p) {_arr[0] = p.x; _arr[1] = p.y;}
|
||||
void setValue(const Point3 p) {_arr[0] = p.x; _arr[1] = p.y; _arr[2] = p.z;}
|
||||
|
||||
Point2 toPoint2() const {return Point2(_arr[0], _arr[1]);}
|
||||
Point3 toPoint3() const {return Point3(_arr[0], _arr[1], _arr[2]);}
|
||||
std::string toString() const {return _str;}
|
||||
float toFloat() const {return _float;}
|
||||
int toInt() const {return _int;}
|
||||
bool toBool() const {return _bool;}
|
||||
|
||||
};
|
||||
|
||||
@@ -66,9 +71,23 @@ public:
|
||||
//};
|
||||
|
||||
struct Param {
|
||||
|
||||
/** parameter name */
|
||||
std::string name;
|
||||
|
||||
/** parameter type */
|
||||
ParamType type;
|
||||
Param(const std::string& name, const ParamType type) : name(name), type(type) {;}
|
||||
|
||||
/** read-only parameter? */
|
||||
bool readOnly;
|
||||
|
||||
|
||||
/** ctor */
|
||||
Param(const std::string& name, const ParamType type, const bool readOnly = false) : name(name), type(type), readOnly(readOnly) {;}
|
||||
|
||||
/** special parameter */
|
||||
static Param getNA() { return Param("", ParamType::NOT_AVAILABLE); }
|
||||
|
||||
};
|
||||
|
||||
/** free parameters */
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "MMFloorBeacons.h"
|
||||
#include "MMFloorUnderlays.h"
|
||||
#include "MMFloorPOIs.h"
|
||||
#include "MMFloorStairs.h"
|
||||
|
||||
#include "IHasParams.h"
|
||||
|
||||
@@ -37,6 +38,7 @@ public:
|
||||
new MMFloorAccessPoints(this, floor);
|
||||
new MMFloorBeacons(this, floor);
|
||||
new MMFloorPOIs(this, floor);
|
||||
new MMFloorStairs(this, floor);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
|
||||
class MMFloorObstacleCircle : public MapModelElement, public IHasMaterial, public IHasObstacleType {
|
||||
class MMFloorObstacleCircle : public MapModelElement, public IHasMaterial {
|
||||
|
||||
private:
|
||||
|
||||
@@ -31,8 +31,8 @@ public:
|
||||
void setMaterial(const Floorplan::Material m) override {c->material = m;}
|
||||
Floorplan::Material getMaterial() const override {return c->material;}
|
||||
|
||||
void setObstacleType(const Floorplan::ObstacleType t) override {c->type = t;}
|
||||
Floorplan::ObstacleType getObatcleType() const override {return c->type;}
|
||||
// void setObstacleType(const Floorplan::ObstacleType t) override {c->type = t;}
|
||||
// Floorplan::ObstacleType getObatcleType() const override {return c->type;}
|
||||
|
||||
MV2DElement* getMV2D() const override {return (MV2DElement*) &mv2d;}
|
||||
|
||||
|
||||
84
mapview/model/MMFloorObstacleDoor.h
Normal file
@@ -0,0 +1,84 @@
|
||||
#ifndef MMFLOOROBSTACLEDOOR_H
|
||||
#define MMFLOOROBSTACLEDOOR_H
|
||||
|
||||
#include "MapModelElement.h"
|
||||
#include "../elements/MapViewElementHelper.h"
|
||||
|
||||
#include "IHasMaterial.h"
|
||||
#include "IHasDoorType.h"
|
||||
#include "IHasParams.h"
|
||||
|
||||
#include "../elements/MV2DElementFloorObstacleDoor.h"
|
||||
#include "../3D/MV3DElementFloorObstacleDoor.h"
|
||||
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
|
||||
class MMFloorObstacleDoor : public MapModelElement, public IHasMaterial, public IHasDoorType, public IHasParams {
|
||||
|
||||
public:
|
||||
|
||||
Floorplan::Floor* mf;
|
||||
Floorplan::FloorObstacleDoor* fo;
|
||||
MV2DElementFloorObstacleDoor mv2d;
|
||||
MV3DElementFloorObstacleDoor mv3d;
|
||||
|
||||
public:
|
||||
|
||||
MMFloorObstacleDoor(MapLayer* parent, Floorplan::Floor* mf, Floorplan::FloorObstacleDoor* fo) :
|
||||
MapModelElement(parent), mf(mf), fo(fo), mv2d(fo), mv3d(mf,fo) {
|
||||
|
||||
}
|
||||
|
||||
void setMaterial(const Floorplan::Material m) override {fo->material = m;}
|
||||
Floorplan::Material getMaterial() const override {return fo->material;}
|
||||
|
||||
void setDoorType(const Floorplan::DoorType t) override {fo->type = t;}
|
||||
Floorplan::DoorType getDoorType() const override {return fo->type;}
|
||||
|
||||
MV2DElement* getMV2D() const override {return (MV2DElement*) &mv2d;}
|
||||
MV3DElement* getMV3D() const override {return (MV3DElement*) &mv3d;}
|
||||
|
||||
void deleteMe() const override {
|
||||
parent->removeElement(this);
|
||||
mf->obstacles.erase(std::remove(mf->obstacles.begin(), mf->obstacles.end(), fo), mf->obstacles.end());
|
||||
}
|
||||
|
||||
/** get the number of parameters */
|
||||
int getNumParams() const override {
|
||||
return 3;
|
||||
}
|
||||
|
||||
/** get the description of the idx-th parameter */
|
||||
virtual Param getParamDesc(const int idx) const override {
|
||||
switch (idx) {
|
||||
case 0: return Param("width", ParamType::FLOAT, true);
|
||||
case 1: return Param("height", ParamType::FLOAT);
|
||||
case 2: return Param("swap", ParamType::BOOL);
|
||||
default: throw Exception("out of bounds");
|
||||
}
|
||||
}
|
||||
|
||||
/** get the idx-th param's value */
|
||||
virtual ParamValue getParamValue(const int idx) const override {
|
||||
switch(idx) {
|
||||
case 0: return fo->getSize();
|
||||
case 1: return fo->height;
|
||||
case 2: return fo->swap;
|
||||
default: throw Exception("out of bounds");
|
||||
}
|
||||
}
|
||||
|
||||
/** set the idx-th param's value */
|
||||
virtual void setParamValue(const int idx, const ParamValue& val) const override {
|
||||
switch (idx) {
|
||||
case 0: break;
|
||||
case 1: fo->height = val.toFloat(); break;
|
||||
case 2: fo->swap = val.toBool(); break;
|
||||
default: throw Exception("out of bounds");
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // MMFLOOROBSTACLEDOOR_H
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "MapLayer.h"
|
||||
#include "MMFloorObstacleCircle.h"
|
||||
#include "MMFloorObstacleLine.h"
|
||||
#include "MMFloorObstacleDoor.h"
|
||||
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
@@ -25,6 +26,10 @@ public:
|
||||
elements.push_back(new MMFloorObstacleLine(this, floor, (Floorplan::FloorObstacleLine*)o));
|
||||
} else if (dynamic_cast<Floorplan::FloorObstacleCircle*>(o)) {
|
||||
elements.push_back(new MMFloorObstacleCircle(this, floor, (Floorplan::FloorObstacleCircle*)o));
|
||||
} else if (dynamic_cast<Floorplan::FloorObstacleDoor*>(o)) {
|
||||
elements.push_back(new MMFloorObstacleDoor(this, floor, (Floorplan::FloorObstacleDoor*)o));
|
||||
} else {
|
||||
throw new Exception("todo: not yet implemented obstacle type");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +38,17 @@ public:
|
||||
/** get the corresponding floor from the underlying model */
|
||||
Floorplan::Floor* getFloor() {return floor;}
|
||||
|
||||
//TODO: check
|
||||
void createDoor(Floorplan::FloorObstacleDoor* obs) {
|
||||
|
||||
// add to underlying model
|
||||
floor->obstacles.push_back(obs);
|
||||
|
||||
// add to myself as element
|
||||
elements.push_back(new MMFloorObstacleDoor(this, floor, obs));
|
||||
|
||||
}
|
||||
|
||||
//TODO: check
|
||||
void createLine(Floorplan::FloorObstacleLine* obs) {
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ public:
|
||||
|
||||
virtual Param getParamDesc(const int idx) const override {
|
||||
switch(idx) {
|
||||
case 0: return Param("anem", ParamType::STRING);
|
||||
case 0: return Param("name", ParamType::STRING);
|
||||
}
|
||||
throw 1;
|
||||
}
|
||||
|
||||
132
mapview/model/MMFloorStair.h
Normal file
@@ -0,0 +1,132 @@
|
||||
#ifndef MMFLOORSTAIR_H
|
||||
#define MMFLOORSTAIR_H
|
||||
|
||||
#include "MapLayer.h"
|
||||
#include "IHasParams.h"
|
||||
#include "MMFloorOutlinePolygon.h"
|
||||
|
||||
#include "../elements/MV2DElementStair.h"
|
||||
#include "../3D/MV3DElementStair.h"
|
||||
|
||||
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
/**
|
||||
* layer containing all elements describing a floor's outline
|
||||
*/
|
||||
class MMFloorStair : public MapModelElement, public IHasParams {
|
||||
|
||||
private:
|
||||
|
||||
/** the underlying model */
|
||||
Floorplan::Floor* floor;
|
||||
Floorplan::StairFreeform* stair;
|
||||
|
||||
MV2DElementStair mv2d;
|
||||
MV3DElementStair mv3d;
|
||||
|
||||
public:
|
||||
|
||||
/** ctor with the underlying model */
|
||||
MMFloorStair(MapLayer* parent, Floorplan::Floor* floor, Floorplan::StairFreeform* stair) :
|
||||
MapModelElement(parent), floor(floor), stair(stair), mv2d(floor, stair), mv3d(floor, stair) {
|
||||
|
||||
;
|
||||
|
||||
}
|
||||
|
||||
MV2DElement* getMV2D() const override {return (MV2DElement*) &mv2d;}
|
||||
MV3DElement* getMV3D() const override {return (MV3DElement*) &mv3d;}
|
||||
|
||||
|
||||
virtual int getNumParams() const override {
|
||||
const int selPart = mv2d.getSelPart();
|
||||
return (selPart >= 0) ? (3) : (0);
|
||||
}
|
||||
|
||||
virtual Param getParamDesc(const int idx) const override {
|
||||
const int selPart = mv2d.getSelPart();
|
||||
const int selNode = mv2d.getSelNode();
|
||||
switch(idx) {
|
||||
case 0: return Param("node height", ParamType::FLOAT);
|
||||
case 1: return (selPart >= 0 && selNode == 0) ? Param("part width", ParamType::FLOAT) : Param::getNA();
|
||||
case 2: return (selPart >= 0 && selNode == 0) ? Param("connect", ParamType::BOOL) : Param::getNA();
|
||||
}
|
||||
throw 1;
|
||||
}
|
||||
|
||||
virtual ParamValue getParamValue(const int idx) const override {
|
||||
const int selPart = mv2d.getSelPart();
|
||||
const int selNode = mv2d.getSelNode();
|
||||
switch(idx) {
|
||||
case 0: if (selPart >= 0) {return stair->parts[selPart][selNode].z;} else {return NAN;}
|
||||
case 1: if (selPart >= 0) {return stair->parts[selPart].width;} else {return NAN;}
|
||||
case 2: if (selPart >= 0) {return stair->parts[selPart].connectWithPrev;} else {return false;}
|
||||
}
|
||||
throw 1;
|
||||
}
|
||||
|
||||
virtual void setParamValue(const int idx, const ParamValue& val) const override {
|
||||
const int selPart = mv2d.getSelPart();
|
||||
const int selNode = mv2d.getSelNode();
|
||||
switch(idx) {
|
||||
case 0: if (selPart >= 0) {stair->parts[selPart][selNode].z = val.toFloat();} break;
|
||||
case 1: if (selPart >= 0) {stair->parts[selPart].width = val.toFloat();} break;
|
||||
case 2: if (selPart >= 0) {stair->parts[selPart].connectWithPrev = val.toBool();} break;
|
||||
}
|
||||
}
|
||||
|
||||
void deleteMe() const override {
|
||||
parent->removeElement(this);
|
||||
floor->stairs.erase(std::remove(floor->stairs.begin(), floor->stairs.end(), stair), floor->stairs.end());
|
||||
}
|
||||
|
||||
// virtual int getNumParams() const override {
|
||||
// return 4;
|
||||
// }
|
||||
|
||||
// virtual Param getParamDesc(const int idx) const override {
|
||||
// switch(idx) {
|
||||
// case 0: return Param("center", ParamType::POINT2);
|
||||
// case 1: return Param("at height", ParamType::FLOAT);
|
||||
// case 2: return Param("height", ParamType::FLOAT);
|
||||
// case 3: return Param("angle", ParamType::FLOAT);
|
||||
// }
|
||||
// throw 1;
|
||||
// }
|
||||
|
||||
// virtual ParamValue getParamValue(const int idx) const override {
|
||||
// switch(idx) {
|
||||
// case 0: return stair->center;
|
||||
// case 1: return stair->atHeight;
|
||||
// case 2: return stair->height;
|
||||
// case 3: return stair->angleDeg;
|
||||
// }
|
||||
// throw 1;
|
||||
// }
|
||||
|
||||
// virtual void setParamValue(const int idx, const ParamValue& val) const override {
|
||||
// switch(idx) {
|
||||
// case 0: stair->center = val.toPoint2(); break;
|
||||
// case 1: stair->atHeight = val.toFloat(); break;
|
||||
// case 2: stair->height = val.toFloat(); break;
|
||||
// case 3: stair->angleDeg = val.toFloat(); break;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// //TODO: check
|
||||
// void create(Floorplan::FloorOutlinePolygon* poly) {
|
||||
|
||||
// // add to underlying model
|
||||
// floor->outline.push_back(poly);
|
||||
|
||||
// // add to myself as element
|
||||
// elements.push_back(new MMFloorOutlinePolygon(this, floor, poly));
|
||||
|
||||
// }
|
||||
|
||||
};
|
||||
|
||||
#endif // MMFLOORSTAIR_H
|
||||
48
mapview/model/MMFloorStairs.h
Normal file
@@ -0,0 +1,48 @@
|
||||
#ifndef MMFLOORSTAIRS_H
|
||||
#define MMFLOORSTAIRS_H
|
||||
|
||||
#include "MapLayer.h"
|
||||
#include "MMFloorStair.h"
|
||||
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
|
||||
/**
|
||||
* layer containing all stairs of one floor
|
||||
*/
|
||||
class MMFloorStairs : public MapLayer {
|
||||
|
||||
private:
|
||||
|
||||
Floorplan::Floor* floor;
|
||||
|
||||
public:
|
||||
|
||||
/** ctor with the underlying model */
|
||||
MMFloorStairs(MapLayer* parent, Floorplan::Floor* floor) : MapLayer(parent, MapLayerType::FLOOR_STAIRS), floor(floor) {
|
||||
|
||||
// add all floors
|
||||
for (Floorplan::Stair* stair : floor->stairs) {
|
||||
if (dynamic_cast<Floorplan::StairFreeform*>(stair)) {
|
||||
elements.push_back( new MMFloorStair(this, floor, (Floorplan::StairFreeform*)stair) );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void create(Floorplan::StairFreeform* stair) {
|
||||
|
||||
// add to underlying model
|
||||
floor->stairs.push_back(stair);
|
||||
|
||||
// add to myself as element
|
||||
elements.push_back(new MMFloorStair(this, floor, stair));
|
||||
|
||||
}
|
||||
|
||||
std::string getLayerName() const override {return "stairs";}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif // MMFLOORSTAIRS_H
|
||||
@@ -19,6 +19,7 @@ enum class MapLayerType {
|
||||
FLOOR_ACCESS_POINTS,
|
||||
FLOOR_UNDERLAYS,
|
||||
FLOOR_POIS,
|
||||
FLOOR_STAIRS,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@ public:
|
||||
|
||||
if (!show) {return;}
|
||||
|
||||
static const QColor cB(250,250,250);
|
||||
static const QColor cN(235,235,235);
|
||||
static const QColor cB(245,245,245);
|
||||
static const QColor cN(225,225,225);
|
||||
static const QColor c0(128,128,128);
|
||||
|
||||
int w = p.width();
|
||||
|
||||
@@ -7,6 +7,12 @@
|
||||
#include "../model/MapModel.h"
|
||||
|
||||
|
||||
/**
|
||||
* this tool allows:
|
||||
* - selecting 2D elements within the view (focus/unfocus)
|
||||
* - selecting and moving nodes of elements inheriting from HasMoveableNodes
|
||||
*
|
||||
*/
|
||||
class ToolSelector : public Tool {
|
||||
|
||||
Q_OBJECT
|
||||
@@ -24,54 +30,115 @@ public:
|
||||
virtual ~ToolSelector() {;}
|
||||
|
||||
|
||||
virtual void mousePressEvent(MapView2D* m, QMouseEvent* e) override {
|
||||
|
||||
if (e->button() != Qt::MouseButton::LeftButton) {return;}
|
||||
|
||||
mouseIsDown = true;
|
||||
|
||||
const Scaler& s = m->getScaler();
|
||||
Point2 p2(s.xsm(e->x()), s.ysm(e->y()));
|
||||
//Point3 p3(s.xsm(e->x()), s.ysm(e->y()), 0);
|
||||
|
||||
const float g = m->getScaler().sm(10); // increase each BBox by 10 px (needed mainly for hor/ver lines)
|
||||
|
||||
// get all elements with bounding-box matchings
|
||||
std::vector<MapModelElement*> possible;
|
||||
for (MapModelElement* el : m->getModel()->getSelectedLayerElements()) {
|
||||
if (!el->getMV2D()) {continue;}
|
||||
BBox2 bbox = el->getMV2D()->getBoundingBox(); // elements 3D bbox
|
||||
bbox.grow(Point2(g, g)); // grow a little (needed for straight lines)
|
||||
if (bbox.contains(p2)) {possible.push_back(el);} // intersection?
|
||||
}
|
||||
|
||||
// among those, find the best-matching one (smallest distance to an intersection)
|
||||
auto lambda = [&] (const MapModelElement* el1, const MapModelElement* el2) {return el1->getMV2D()->getMinDistanceXY(p2) < el2->getMV2D()->getMinDistanceXY(p2);};
|
||||
auto it = std::min_element(possible.begin(), possible.end(), lambda);
|
||||
MapModelElement* el = (it == possible.end()) ? (nullptr) : (*it);
|
||||
|
||||
|
||||
|
||||
// focus changed? -> unfocus the old one (if any)
|
||||
if (setFocused(el)) {
|
||||
|
||||
;
|
||||
|
||||
} else {
|
||||
|
||||
// focus kept. provide the currently focused element with events
|
||||
if (focused) {focused->getMV2D()->mousePressed(m, p2);}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** needed eg. when the focused element gets invalid (switching visible layers) */
|
||||
void layerChange(MapView2D* m) override {
|
||||
(void) m;
|
||||
setFocused(nullptr);
|
||||
setFocused(m, nullptr);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
void processUnfocus(MapView2D* m, MapModelElement* elem) {
|
||||
|
||||
MV2DElement* me = elem->getMV2D();
|
||||
if (!me) {return;}
|
||||
|
||||
// elements has selectedable nodes? unselect them
|
||||
if (dynamic_cast<HasMoveableNodes*>(me)) {
|
||||
dynamic_cast<HasMoveableNodes*>(me)->onNodeUnselect(m);
|
||||
}
|
||||
|
||||
// let the element itself process the unfocus
|
||||
me->unfocus();
|
||||
|
||||
}
|
||||
|
||||
void processPress(MapView2D* m, const Point2 p, MapModelElement* elem) {
|
||||
|
||||
MV2DElement* me = elem->getMV2D();
|
||||
if (!me) {return;}
|
||||
|
||||
// let the element itself process all events
|
||||
me->mousePressed(m, p);
|
||||
|
||||
}
|
||||
|
||||
void processMove(MapView2D* m, const Point2 p, MapModelElement* elem) {
|
||||
|
||||
MV2DElement* me = elem->getMV2D();
|
||||
if (!me) {return;}
|
||||
|
||||
// elements has selectedable nodes? try to process them
|
||||
if (dynamic_cast<HasMoveableNodes*>(me)) {
|
||||
if (moveNode(m, p, dynamic_cast<HasMoveableNodes*>(me))) {return;}
|
||||
}
|
||||
|
||||
// otherwise: let the element itself process all events
|
||||
me->mouseMove(m, p);
|
||||
|
||||
}
|
||||
|
||||
void processRelease(MapView2D* m, const Point2 p, MapModelElement* elem) {
|
||||
|
||||
MV2DElement* me = elem->getMV2D();
|
||||
if (!me) {return;}
|
||||
|
||||
// element has selectedable nodes? try to process them
|
||||
if (dynamic_cast<HasMoveableNodes*>(me)) {
|
||||
if (selectNode(m, p, dynamic_cast<HasMoveableNodes*>(me))) {return;}
|
||||
}
|
||||
|
||||
// otherwise: let the element itself process all events
|
||||
me->mouseReleased(m, p);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
/** the given element has selectable nodes. try to select the one near to the mouse. true if successful */
|
||||
bool selectNode(MapView2D* v, Point2 p, HasMoveableNodes* elem) {
|
||||
|
||||
// select a new point on mouse-release (more robust than on mouse-press)
|
||||
|
||||
// find the node nearest to p
|
||||
auto comp = [&] (const MoveableNode& n1, const MoveableNode& n2) {return n1.pos.getDistance(p) < n2.pos.getDistance(p);};
|
||||
auto lst = elem->getMoveableNodes();
|
||||
auto it = std::min_element(lst.begin(), lst.end(), comp);
|
||||
|
||||
// is the nearest point below the threshold?
|
||||
const float t = v->getScaler().sm(CFG::SEL_THRESHOLD_SIZE_PX);
|
||||
const float d = it->pos.getDistance(p);
|
||||
if (d < t) {
|
||||
elem->onNodeSelect(v, it->userIdx);
|
||||
return true;
|
||||
} else {
|
||||
elem->onNodeSelect(v, -1);
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** move the currently selected node. true if successful */
|
||||
bool moveNode(MapView2D* v, Point2 p, HasMoveableNodes* elem) {
|
||||
|
||||
// no node selected? -> done
|
||||
if (elem->getSelectedNode() == -1) {return false;}
|
||||
|
||||
// snap the node
|
||||
const Point2 pSnapped = v->getScaler().snap(p);
|
||||
|
||||
// move
|
||||
elem->onNodeMove(v, elem->getSelectedNode(), pSnapped);
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
@@ -79,7 +146,7 @@ private:
|
||||
* @param el the to-be-focused element or null
|
||||
* @return true if the focused element has changed. false otherwise
|
||||
*/
|
||||
bool setFocused(MapModelElement* el) {
|
||||
bool setFocused(MapView2D* v, MapModelElement* el) {
|
||||
|
||||
// whether the focus has changed or not
|
||||
const bool focusChanged = (focused != el);
|
||||
@@ -87,7 +154,7 @@ private:
|
||||
if (focusChanged) {
|
||||
|
||||
// unfocus the old one (if any)
|
||||
if (focused) {focused->getMV2D()->unfocus();}
|
||||
if (focused) {processUnfocus(v, focused);}
|
||||
|
||||
// set the currently focused object (if any)
|
||||
focused = el;
|
||||
@@ -104,6 +171,53 @@ private:
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
virtual void mousePressEvent(MapView2D* m, QMouseEvent* e) override {
|
||||
|
||||
if (e->button() != Qt::MouseButton::LeftButton) {return;}
|
||||
|
||||
mouseIsDown = true;
|
||||
|
||||
const Scaler& s = m->getScaler();
|
||||
const Point2 p2(s.xsm(e->x()), s.ysm(e->y()));
|
||||
|
||||
const float g = m->getScaler().sm(15); // increase each BBox by 15 px (needed mainly for hor/ver lines)
|
||||
|
||||
// get all elements with bounding-box matchings
|
||||
std::vector<MapModelElement*> possible;
|
||||
for (MapModelElement* el : m->getModel()->getSelectedLayerElements()) {
|
||||
if (!el->getMV2D()) {continue;}
|
||||
BBox2 bbox = el->getMV2D()->getBoundingBox(); // elements 2D bbox
|
||||
bbox.grow(Point2(g, g)); // grow a little (needed for straight lines)
|
||||
if (bbox.contains(p2)) {possible.push_back(el);} // intersection?
|
||||
}
|
||||
|
||||
// among those, find the best-matching one (smallest distance to an intersection)
|
||||
auto lambda = [&] (const MapModelElement* el1, const MapModelElement* el2) {return el1->getMV2D()->getMinDistanceXY(p2) < el2->getMV2D()->getMinDistanceXY(p2);};
|
||||
auto it = std::min_element(possible.begin(), possible.end(), lambda);
|
||||
MapModelElement* el = (it == possible.end()) ? (nullptr) : (*it);
|
||||
|
||||
|
||||
|
||||
// focus changed? -> unfocus the old one (if any)
|
||||
if (setFocused(m, el)) {
|
||||
|
||||
;
|
||||
|
||||
} else {
|
||||
|
||||
// focus kept. provide the currently focused element with events
|
||||
if (focused) {
|
||||
processPress(m, p2, focused);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
virtual void mouseMoveEvent(MapView2D* m, QMouseEvent* e) override {
|
||||
|
||||
const Scaler& s = m->getScaler();
|
||||
@@ -113,7 +227,7 @@ private:
|
||||
if (mouseIsDown) {
|
||||
|
||||
// provide the focused element with the mouse event?
|
||||
if (focused) {focused->getMV2D()->mouseMove(m, p2); return;}
|
||||
if (focused) {processMove(m, p2, focused);}
|
||||
|
||||
}
|
||||
|
||||
@@ -125,7 +239,7 @@ private:
|
||||
Point2 p2(s.xsm(e->x()), s.ysm(e->y()));
|
||||
|
||||
// provide the focused element with the mouse event?
|
||||
if (focused) {focused->getMV2D()->mouseReleased(m, p2);}
|
||||
if (focused) {processRelease(m, p2, focused);}
|
||||
|
||||
mouseIsDown = false;
|
||||
|
||||
@@ -142,12 +256,12 @@ private:
|
||||
// not consumed -> additional options
|
||||
|
||||
// ESCAPE -> unfocus
|
||||
if (e->key() == Qt::Key_Escape) {setFocused(nullptr);}
|
||||
if (e->key() == Qt::Key_Escape) {setFocused(m, nullptr);}
|
||||
|
||||
// DELETE -> delete
|
||||
if (e->key() == Qt::Key_Delete) {
|
||||
focused->deleteMe();
|
||||
setFocused(nullptr);
|
||||
setFocused(m, nullptr);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
171
misc/GnuplotExport.h
Normal file
@@ -0,0 +1,171 @@
|
||||
#ifndef GNUPLOTEXPORT_H
|
||||
#define GNUPLOTEXPORT_H
|
||||
|
||||
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||
#include <Indoor/grid/Grid.h>
|
||||
|
||||
#include <KLib/misc/gnuplot/Gnuplot.h>
|
||||
#include <KLib/misc/gnuplot/GnuplotSplot.h>
|
||||
#include <KLib/misc/gnuplot/GnuplotSplotElementLines.h>
|
||||
#include <KLib/misc/gnuplot/GnuplotSplotElementPoints.h>
|
||||
#include <KLib/misc/gnuplot/GnuplotSplotElementColorPoints.h>
|
||||
#include <KLib/misc/gnuplot/GnuplotSplotElementMesh.h>
|
||||
|
||||
#include <set>
|
||||
#include <fstream>
|
||||
|
||||
class GnuplotExport {
|
||||
|
||||
|
||||
public:
|
||||
|
||||
|
||||
// template <typename T> static void exp(const Floorplan::IndoorMap& map, Grid<T>& grid) {
|
||||
|
||||
// K::GnuplotSplotElementLines* walls =getWalls(map);
|
||||
// write("/tmp/walls.dat", walls);
|
||||
|
||||
|
||||
// K::GnuplotSplotElementPoints* nodesFloor = getNodes(grid, true, false);
|
||||
// write("/tmp/nodesFloor.dat", nodesFloor);
|
||||
|
||||
// K::GnuplotSplotElementPoints* nodesStair = getNodes(grid, false, true);
|
||||
// write("/tmp/nodesStair.dat", nodesStair);
|
||||
|
||||
// K::GnuplotSplotElementPoints* nodesAll = getNodes(grid, true, true);
|
||||
// write("/tmp/nodesAll.dat", nodesAll);
|
||||
|
||||
|
||||
// K::GnuplotSplotElementColorPoints* nodesAllImp = getColorNodes(grid, true, true);
|
||||
// write("/tmp/nodesAllImp.dat", nodesAllImp);
|
||||
// const std::string xxx = getColorNodes2(grid, true, true);
|
||||
// write("/tmp/nodesAllImpPoly.dat", xxx);
|
||||
// const std::string yyy = getColorNodes2(grid, true, false);
|
||||
// write("/tmp/nodesFloorImpPoly.dat", yyy);
|
||||
|
||||
|
||||
// K::GnuplotSplotElementLines* edgesFloor = getEdges(grid, true, false);
|
||||
// write("/tmp/edgesFloor.dat", edgesFloor);
|
||||
|
||||
// K::GnuplotSplotElementLines* edgesStair= getEdges(grid, false, true);
|
||||
// write("/tmp/edgesStair.dat", edgesStair);
|
||||
|
||||
// K::GnuplotSplotElementLines* edgesAll = getEdges(grid, true, true);
|
||||
// write("/tmp/edgesAll.dat", edgesAll);
|
||||
|
||||
|
||||
// }
|
||||
|
||||
|
||||
template <typename T> static void write(const std::string& file, const T* elem) {
|
||||
std::ofstream os(file.c_str());
|
||||
if (!os.good()) {throw "error!";}
|
||||
elem->addDataTo(os);
|
||||
os.close();
|
||||
}
|
||||
|
||||
static void write(const std::string& file, const std::string& str) {
|
||||
std::ofstream os(file.c_str());
|
||||
if (!os.good()) {throw "error!";}
|
||||
os << str;
|
||||
os.close();
|
||||
}
|
||||
|
||||
static K::GnuplotSplotElementLines* getWalls(const Floorplan::IndoorMap& map) {
|
||||
|
||||
K::GnuplotSplotElementLines* lines = new K::GnuplotSplotElementLines();
|
||||
for (const Floorplan::Floor* f : map.floors) {
|
||||
for (const Floorplan::FloorObstacle* o : f->obstacles) {
|
||||
if (dynamic_cast<const Floorplan::FloorObstacleLine*>(o)) {
|
||||
Floorplan::FloorObstacleLine* l = (Floorplan::FloorObstacleLine*) o;
|
||||
K::GnuplotPoint3 p1(l->from.x, l->from.y, f->atHeight);
|
||||
K::GnuplotPoint3 p2(l->to.x, l->to.y, f->atHeight);
|
||||
lines->addSegment(p1*100, p2*100);
|
||||
}
|
||||
}
|
||||
}
|
||||
return lines;
|
||||
|
||||
}
|
||||
|
||||
template <typename T> static K::GnuplotSplotElementPoints* getNodes(Grid<T>& grid, bool addFloor, bool addStair) {
|
||||
|
||||
K::GnuplotSplotElementPoints* points = new K::GnuplotSplotElementPoints();
|
||||
for (const T& n : grid) {
|
||||
if (n.getType() == GridNode::TYPE_STAIR && !addStair) {continue;}
|
||||
if (n.getType() == GridNode::TYPE_FLOOR && !addFloor) {continue;}
|
||||
|
||||
K::GnuplotPoint3 p(n.x_cm, n.y_cm, n.z_cm);
|
||||
points->add(p);
|
||||
}
|
||||
return points;
|
||||
|
||||
}
|
||||
|
||||
|
||||
template <typename T> static std::string getColorNodes2(Grid<T>& grid, bool addFloor, bool addStair) {
|
||||
|
||||
std::stringstream ss;
|
||||
for (const T& n : grid) {
|
||||
if (n.getType() == GridNode::TYPE_STAIR && !addStair) {continue;}
|
||||
if (n.getType() == GridNode::TYPE_FLOOR && !addFloor) {continue;}
|
||||
|
||||
int s = 15;
|
||||
ss << "set object polygon from ";
|
||||
ss << n.x_cm-s << "," << n.y_cm-s << "," << n.z_cm << " to ";
|
||||
ss << n.x_cm+s << "," << n.y_cm-s << "," << n.z_cm << " to ";
|
||||
ss << n.x_cm+s << "," << n.y_cm+s << "," << n.z_cm << " to ";
|
||||
ss << n.x_cm-s << "," << n.y_cm+s << "," << n.z_cm << " ";
|
||||
ss << "fs solid fc palette cb " << n.imp << "\n";
|
||||
}
|
||||
return ss.str();
|
||||
|
||||
}
|
||||
|
||||
template <typename T> static K::GnuplotSplotElementColorPoints* getColorNodes(Grid<T>& grid, bool addFloor, bool addStair) {
|
||||
|
||||
K::GnuplotSplotElementColorPoints* points = new K::GnuplotSplotElementColorPoints();
|
||||
for (const T& n : grid) {
|
||||
if (n.getType() == GridNode::TYPE_STAIR && !addStair) {continue;}
|
||||
if (n.getType() == GridNode::TYPE_FLOOR && !addFloor) {continue;}
|
||||
|
||||
K::GnuplotPoint3 p(n.x_cm, n.y_cm, n.z_cm);
|
||||
points->add(p, n.imp);
|
||||
}
|
||||
return points;
|
||||
|
||||
}
|
||||
|
||||
template <typename T> static K::GnuplotSplotElementLines* getEdges(Grid<T>& grid, bool addFloor, bool addStair) {
|
||||
|
||||
std::set<uint64_t> filter;
|
||||
K::GnuplotSplotElementLines* lines = new K::GnuplotSplotElementLines();
|
||||
for (const T& n1 : grid) {
|
||||
if (n1.getType() == GridNode::TYPE_STAIR && !addStair) {continue;}
|
||||
if (n1.getType() == GridNode::TYPE_FLOOR && !addFloor) {continue;}
|
||||
|
||||
for (const T& n2 : grid.neighbors(n1)) {
|
||||
|
||||
const uint64_t i1 = std::min(n1.getIdx(), n2.getIdx());
|
||||
const uint64_t i2 = std::max(n1.getIdx(), n2.getIdx());
|
||||
const uint64_t idx = i2 << 32 | i1;
|
||||
|
||||
if (filter.find(idx) == filter.end()) {
|
||||
|
||||
filter.insert(idx);
|
||||
K::GnuplotPoint3 p1(n1.x_cm, n1.y_cm, n1.z_cm);
|
||||
K::GnuplotPoint3 p2(n2.x_cm, n2.y_cm, n2.z_cm);
|
||||
lines->addSegment(p1, p2);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return lines;
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // GNUPLOTEXPORT_H
|
||||
@@ -38,7 +38,6 @@ QComboBox* getObstacleTypes() {
|
||||
QComboBox* cmb = new QComboBox();
|
||||
for (int i = 0; i < (int)ObstacleType::_END; ++i) {
|
||||
switch ((ObstacleType)i) {
|
||||
case ObstacleType::DOOR: cmb->addItem("Door", i); break;
|
||||
case ObstacleType::UNKNOWN: cmb->addItem("Unknown ", i); break;
|
||||
case ObstacleType::WALL: cmb->addItem("Wall", i); break;
|
||||
case ObstacleType::WINDOW: cmb->addItem("Window", i); break;
|
||||
@@ -64,6 +63,7 @@ QComboBox* getOutlineMethods() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
ElementParamWidget::ElementParamWidget(QWidget *parent) : QGroupBox(parent) {
|
||||
|
||||
this->lay = new QGridLayout(this);
|
||||
@@ -81,6 +81,13 @@ ElementParamWidget::ElementParamWidget(QWidget *parent) : QGroupBox(parent) {
|
||||
|
||||
void ElementParamWidget::setElement(MapModelElement* el) {
|
||||
|
||||
this->curElement = el;
|
||||
refresh();
|
||||
|
||||
}
|
||||
|
||||
void ElementParamWidget::refresh() {
|
||||
|
||||
while ( QWidget* w = this->findChild<QWidget*>() ) {delete w;}
|
||||
delete this->layout();
|
||||
|
||||
@@ -88,20 +95,7 @@ void ElementParamWidget::setElement(MapModelElement* el) {
|
||||
this->setLayout(lay);
|
||||
int r = 0;
|
||||
|
||||
this->curElement = el;
|
||||
|
||||
// if (el == nullptr) {
|
||||
// lblDetails->setText("-");
|
||||
// } else if (dynamic_cast<MMFloorObstacleLine*>(el)) {
|
||||
// MMFloorObstacleLine* obs = dynamic_cast<MMFloorObstacleLine*>(el);
|
||||
// lblDetails->setText("Obstacle");
|
||||
// } else if (dynamic_cast<MMFloorOutlinePolygon*>(el)) {
|
||||
// MMFloorOutlinePolygon* poly = dynamic_cast<MMFloorOutlinePolygon*>(el);
|
||||
// std::string txt = "Polygon (" + std::to_string(poly->getPolygon()->poly.points.size()) + " Points)";
|
||||
// lblDetails->setText(txt.c_str());
|
||||
// } else {
|
||||
// lblDetails->setText("?");
|
||||
// }
|
||||
MapModelElement* el = this->curElement;
|
||||
|
||||
// material? -> select in combo-box
|
||||
{
|
||||
@@ -157,18 +151,39 @@ void ElementParamWidget::setElement(MapModelElement* el) {
|
||||
const Param param = elem->getParamDesc(i);
|
||||
const ParamValue value = elem->getParamValue(i);
|
||||
|
||||
// skip Not-Available entries
|
||||
if (param.type == ParamType::NOT_AVAILABLE) {continue;}
|
||||
|
||||
lay->addWidget(new QLabel(param.name.c_str()),r,0);
|
||||
|
||||
switch(param.type) {
|
||||
|
||||
case ParamType::BOOL: {
|
||||
QCheckBox* chk = new QCheckBox( );
|
||||
chk->setChecked(value.toBool());
|
||||
if (param.readOnly) {
|
||||
chk->setEnabled(false);
|
||||
} else {
|
||||
connect(chk, &QCheckBox::clicked, [i,elem] (const bool checked) {
|
||||
elem->setParamValue(i, ParamValue(checked));
|
||||
});
|
||||
}
|
||||
lay->addWidget(chk,r,1);
|
||||
break;
|
||||
}
|
||||
|
||||
case ParamType::FLOAT: {
|
||||
const std::string str = std::to_string(value.toFloat());
|
||||
QLineEdit* le = new QLineEdit( str.c_str() );
|
||||
connect(le, &QLineEdit::textChanged, [i,elem] (const QString& str) {
|
||||
const float val = std::stof(str.toStdString());
|
||||
elem->setParamValue(i, ParamValue(val));
|
||||
});
|
||||
lay->addWidget(le,r,1);
|
||||
if (param.readOnly) {
|
||||
lay->addWidget(new QLabel(str.c_str()),r,1);
|
||||
} else {
|
||||
QLineEdit* le = new QLineEdit( str.c_str() );
|
||||
connect(le, &QLineEdit::textChanged, [i,elem] (const QString& str) {
|
||||
const float val = str.toFloat();
|
||||
elem->setParamValue(i, ParamValue(val));
|
||||
});
|
||||
lay->addWidget(le,r,1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -176,7 +191,7 @@ void ElementParamWidget::setElement(MapModelElement* el) {
|
||||
const std::string str = std::to_string(value.toInt());
|
||||
QLineEdit* le = new QLineEdit( str.c_str() );
|
||||
connect(le, &QLineEdit::textChanged, [i,elem] (const QString& str) {
|
||||
const int val = std::stoi(str.toStdString());
|
||||
const int val = str.toInt();
|
||||
elem->setParamValue(i, ParamValue(val));
|
||||
});
|
||||
lay->addWidget(le,r,1);
|
||||
@@ -237,6 +252,7 @@ void ElementParamWidget::setElement(MapModelElement* el) {
|
||||
laySub->addWidget(txtZ,0,2);
|
||||
lay->addWidget(subWidget,r,1);
|
||||
auto onChange = [i,elem,txtX,txtY,txtZ] (const QString& str) {
|
||||
(void) str;
|
||||
elem->setParamValue(i, ParamValue( Point3(txtX->text().toFloat(), txtY->text().toFloat(), txtZ->text().toFloat()) ));
|
||||
};
|
||||
connect(txtX, &QLineEdit::textChanged, onChange);
|
||||
|
||||
@@ -18,7 +18,8 @@ public:
|
||||
|
||||
explicit ElementParamWidget(QWidget *parent = 0);
|
||||
|
||||
|
||||
/** refresh the currently selected element */
|
||||
void refresh();
|
||||
|
||||
private:
|
||||
|
||||
|
||||
6
params/StairBuilder.cpp
Normal file
@@ -0,0 +1,6 @@
|
||||
#include "StairBuilder.h"
|
||||
|
||||
StairBuilder::StairBuilder(QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
|
||||
}
|
||||
17
params/StairBuilder.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef STAIRBUILDER_H
|
||||
#define STAIRBUILDER_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class StairBuilder : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit StairBuilder(QWidget *parent = 0);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
};
|
||||
|
||||
#endif // STAIRBUILDER_H
|
||||
@@ -40,6 +40,17 @@ ToolBoxWidget::ToolBoxWidget(MapView2D* view, QWidget *parent) : QWidget(parent)
|
||||
lay->addWidget(btnPillar, r++, 0, 1,1,Qt::AlignTop);
|
||||
connect(btnPillar, SIGNAL(clicked(bool)), this, SLOT(onNewPillar()));
|
||||
|
||||
btnDoor = new QPushButton(UIHelper::getIcon("door"), "");
|
||||
btnDoor->setMinimumSize(s,s);
|
||||
lay->addWidget(btnDoor, r++, 0, 1,1,Qt::AlignTop);
|
||||
connect(btnDoor, SIGNAL(clicked(bool)), this, SLOT(onNewDoor()));
|
||||
|
||||
btnStair = new QPushButton(UIHelper::getIcon("stair"), "");
|
||||
btnStair->setMinimumSize(s,s);
|
||||
lay->addWidget(btnStair, r++, 0, 1,1,Qt::AlignTop);
|
||||
connect(btnStair, SIGNAL(clicked(bool)), this, SLOT(onNewStair()));
|
||||
|
||||
|
||||
// TRANSMITTERS
|
||||
btnWifi = new QPushButton(UIHelper::getIcon("wifi"), "");
|
||||
btnWifi->setMinimumSize(s,s);
|
||||
@@ -79,6 +90,9 @@ void ToolBoxWidget::setSelectedLayer(MapLayer *ml) {
|
||||
|
||||
btnWall->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_OBSTACLES));
|
||||
btnPillar->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_OBSTACLES));
|
||||
btnDoor->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_OBSTACLES));
|
||||
|
||||
btnStair->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_STAIRS));
|
||||
|
||||
btnWifi->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_ACCESS_POINTS));
|
||||
btnBeacon->setEnabled(ml && (ml->getLayerType() == MapLayerType::FLOOR_BEACONS));
|
||||
@@ -133,7 +147,6 @@ void ToolBoxWidget::onNewPillar() {
|
||||
float s = view->getScaler().sm(50);
|
||||
|
||||
Floorplan::FloorObstacleCircle* pillar = new Floorplan::FloorObstacleCircle(
|
||||
Floorplan::ObstacleType::PILLAR,
|
||||
Floorplan::Material::DRYWALL,
|
||||
Point2(center.x-s, center.y),
|
||||
s
|
||||
@@ -146,6 +159,43 @@ void ToolBoxWidget::onNewPillar() {
|
||||
|
||||
}
|
||||
|
||||
void ToolBoxWidget::onNewDoor() {
|
||||
|
||||
const Point2 center = view->getScaler().getCenter();
|
||||
float s = view->getScaler().sm(50);
|
||||
|
||||
Floorplan::FloorObstacleDoor* door = new Floorplan::FloorObstacleDoor(
|
||||
Floorplan::DoorType::SWING,
|
||||
Floorplan::Material::WOOD,
|
||||
Point2(center.x-s, center.y),
|
||||
Point2(center.x+s, center.y)
|
||||
);
|
||||
|
||||
MMFloorObstacles* obs = (MMFloorObstacles*)curLayer;
|
||||
obs->createDoor(door);
|
||||
|
||||
view->getModel()->reselect();
|
||||
|
||||
}
|
||||
|
||||
void ToolBoxWidget::onNewStair() {
|
||||
|
||||
const Point2 center = view->getScaler().getCenter();
|
||||
|
||||
// Floorplan::Stair* stair = new Floorplan::StairNormal(center, 0, 0, 3, 2, 6);
|
||||
// stair->center = center;
|
||||
|
||||
Floorplan::StairFreeform* stair = new Floorplan::StairFreeform();
|
||||
Floorplan::StairPart part(Point3(center.x-3, center.y, 0), Point3(center.x+3, center.y, 3), 3);
|
||||
stair->parts.push_back( part );
|
||||
|
||||
MMFloorStairs* stairs = (MMFloorStairs*)curLayer;
|
||||
stairs->create(stair);
|
||||
|
||||
view->getModel()->reselect();
|
||||
|
||||
}
|
||||
|
||||
void ToolBoxWidget::onNewAccessPoint() {
|
||||
|
||||
const Point2 center = view->getScaler().getCenter();
|
||||
|
||||
@@ -31,6 +31,9 @@ private:
|
||||
QPushButton* btnGround;
|
||||
QPushButton* btnWall;
|
||||
QPushButton* btnPillar;
|
||||
QPushButton* btnDoor;
|
||||
QPushButton* btnStair;
|
||||
|
||||
|
||||
QPushButton* btnWifi;
|
||||
QPushButton* btnBeacon;
|
||||
@@ -43,6 +46,8 @@ private slots:
|
||||
void onNewGround();
|
||||
void onNewWall();
|
||||
void onNewPillar();
|
||||
void onNewDoor();
|
||||
void onNewStair();
|
||||
|
||||
void onNewAccessPoint();
|
||||
void onNewBeacon();
|
||||
|
||||
2
res.qrc
@@ -10,5 +10,7 @@
|
||||
<file>res/icons/image.svg</file>
|
||||
<file>res/icons/cross.png</file>
|
||||
<file>res/icons/poi.svg</file>
|
||||
<file>res/icons/stair.svg</file>
|
||||
<file>res/icons/door.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -1,770 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:ns1="http://sozi.baierouge.fr"
|
||||
id="svg7413"
|
||||
sodipodi:docname="smarTB arch v2.svg"
|
||||
viewBox="0 0 29.562 19.343"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.1 r9760"
|
||||
>
|
||||
<defs
|
||||
id="defs7415"
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient5302-8"
|
||||
inkscape:collect="always"
|
||||
>
|
||||
<stop
|
||||
id="stop5304"
|
||||
style="stop-color:rgb(136, 138, 133)"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop5306"
|
||||
style="stop-color:rgb(211, 215, 207);stop-opacity:0"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient14881"
|
||||
>
|
||||
<stop
|
||||
id="stop14883"
|
||||
style="stop-color:#877c32"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop14893"
|
||||
style="stop-color:#ffd716"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient7622"
|
||||
>
|
||||
<stop
|
||||
id="stop7624"
|
||||
style="stop-color:white"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop7626"
|
||||
style="stop-color:white;stop-opacity:0"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient3506"
|
||||
>
|
||||
<stop
|
||||
id="stop3508"
|
||||
style="stop-color:#3c3c3c"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop3510"
|
||||
style="stop-color:#3c3c3c;stop-opacity:.22745"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient6215"
|
||||
>
|
||||
<stop
|
||||
id="stop6217"
|
||||
style="stop-color:#cfb900"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop6219"
|
||||
style="stop-color:#e2d44d"
|
||||
offset="0.21"
|
||||
/>
|
||||
<stop
|
||||
id="stop6221"
|
||||
style="stop-color:#9a8b00"
|
||||
offset="0.84"
|
||||
/>
|
||||
<stop
|
||||
id="stop6223"
|
||||
style="stop-color:#cfb900"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<radialGradient
|
||||
id="radialGradient5328"
|
||||
xlink:href="#linearGradient5302-8"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cy="15.259"
|
||||
cx="27.577"
|
||||
gradientTransform="matrix(1.4785 0 0 1.4785 -13.195 -7.3291)"
|
||||
r="3.8335"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<radialGradient
|
||||
id="radialGradient5330"
|
||||
xlink:href="#linearGradient5302-8"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cy="15.048"
|
||||
cx="27.577"
|
||||
gradientTransform="matrix(1.3418 0 0 1.3418 -9.426 -5.2229)"
|
||||
r="3.8335"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<radialGradient
|
||||
id="radialGradient5332"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cy="44.75"
|
||||
cx="21.5"
|
||||
gradientTransform="matrix(1.4601 0 0 .11765 -7.106 31.198)"
|
||||
r="17"
|
||||
inkscape:collect="always"
|
||||
>
|
||||
<stop
|
||||
id="stop14995"
|
||||
style="stop-color:black"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop14997"
|
||||
style="stop-color:black;stop-opacity:0"
|
||||
offset="1"
|
||||
/>
|
||||
</radialGradient
|
||||
>
|
||||
<radialGradient
|
||||
id="radialGradient5334"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cy="14.525"
|
||||
cx="10.78"
|
||||
gradientTransform="matrix(2.7925 .12351 -.032071 .72512 -18.856 8.6275)"
|
||||
r="23"
|
||||
inkscape:collect="always"
|
||||
>
|
||||
<stop
|
||||
id="stop14983"
|
||||
style="stop-color:#628430"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop14985"
|
||||
style="stop-color:#364d17"
|
||||
offset="1"
|
||||
/>
|
||||
</radialGradient
|
||||
>
|
||||
<radialGradient
|
||||
id="radialGradient5336"
|
||||
xlink:href="#linearGradient7622"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cy="12.336"
|
||||
cx="6.509"
|
||||
gradientTransform="matrix(2.0637 -.0048795 .0019461 .82308 -6.9477 9.5473)"
|
||||
r="21.999"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5338"
|
||||
y2="31.347"
|
||||
xlink:href="#linearGradient7622"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="18.968"
|
||||
gradientTransform="matrix(.53081 0 0 .75859 -34.068 -8.2971)"
|
||||
y1="20.166"
|
||||
x1="16.965"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5340"
|
||||
y2="19.5"
|
||||
xlink:href="#linearGradient14881"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="27"
|
||||
gradientTransform="matrix(0 -.33333 1 0 -12.043 28)"
|
||||
y1="19.5"
|
||||
x1="24"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5342"
|
||||
y2="19.5"
|
||||
xlink:href="#linearGradient14881"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="4.3284"
|
||||
gradientTransform="matrix(.33333 0 0 1 2.2901 9)"
|
||||
y1="19.5"
|
||||
x1="8"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5344"
|
||||
y2="19.5"
|
||||
xlink:href="#linearGradient14881"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="4.3284"
|
||||
gradientTransform="matrix(-.33333 0 0 1 14.623 8.7923)"
|
||||
y1="19.5"
|
||||
x1="8"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5346"
|
||||
y2="31.347"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="18.968"
|
||||
gradientTransform="matrix(.26246 0 0 .32273 -22.852 9.5051)"
|
||||
y1="20.166"
|
||||
x1="16.965"
|
||||
inkscape:collect="always"
|
||||
>
|
||||
<stop
|
||||
id="stop14863"
|
||||
style="stop-color:white"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop14865"
|
||||
style="stop-color:white;stop-opacity:0"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient5348"
|
||||
y2="19.5"
|
||||
xlink:href="#linearGradient6215"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="27"
|
||||
gradientTransform="matrix(-.18719 0 0 .28079 -11.485 10.589)"
|
||||
y1="19.5"
|
||||
x1="24"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5350"
|
||||
y2="19.5"
|
||||
xlink:href="#linearGradient6215"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="4.3284"
|
||||
gradientTransform="matrix(0 .18719 -.28079 0 -14.855 14.145)"
|
||||
y1="19.5"
|
||||
x1="8"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5352"
|
||||
y2="11.5"
|
||||
xlink:href="#linearGradient6215"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="4.7127"
|
||||
gradientTransform="matrix(0 .18719 -.28079 0 -14.855 16.673)"
|
||||
y1="11.5"
|
||||
x1="12.647"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5354"
|
||||
y2="19.5"
|
||||
xlink:href="#linearGradient6215"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="4.3284"
|
||||
gradientTransform="matrix(.18719 0 0 .28079 -22.249 10.589)"
|
||||
y1="19.5"
|
||||
x1="8"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5356"
|
||||
y2="19.5"
|
||||
xlink:href="#linearGradient14881"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="4.3284"
|
||||
gradientTransform="matrix(0 -.33333 1 0 -12.043 33.667)"
|
||||
y1="19.5"
|
||||
x1="8"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<radialGradient
|
||||
id="radialGradient5358"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cy="-36.857"
|
||||
cx="21.333"
|
||||
gradientTransform="matrix(.86667 -1.922e-7 1.664e-7 .75005 -8.4222 9.6446)"
|
||||
r="8"
|
||||
inkscape:collect="always"
|
||||
>
|
||||
<stop
|
||||
id="stop9129"
|
||||
style="stop-color:#f0f0f0"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop9131"
|
||||
style="stop-color:#a9a9a9"
|
||||
offset="1"
|
||||
/>
|
||||
</radialGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient5360"
|
||||
y2="9.1187"
|
||||
xlink:href="#linearGradient3506"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="20.405"
|
||||
gradientTransform="matrix(.64540 0 0 .42550 -3.4019 -23.059)"
|
||||
y1="6.9878"
|
||||
x1="20.405"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient5362"
|
||||
y2="9.1187"
|
||||
xlink:href="#linearGradient3506"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="20.405"
|
||||
gradientTransform="matrix(.64540 0 0 .42550 -.90190 -23.059)"
|
||||
y1="6.9878"
|
||||
x1="20.405"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
</defs
|
||||
>
|
||||
<sodipodi:namedview
|
||||
id="namedview7417"
|
||||
fit-margin-left="0"
|
||||
inkscape:zoom="8.0000002"
|
||||
borderopacity="1.0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:cx="29.19243"
|
||||
inkscape:cy="-3.0269165"
|
||||
inkscape:window-maximized="1"
|
||||
showgrid="false"
|
||||
fit-margin-right="0"
|
||||
units="px"
|
||||
inkscape:document-units="in"
|
||||
bordercolor="#666666"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1440"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
pagecolor="#ffffff"
|
||||
inkscape:window-height="823"
|
||||
fit-margin-top="0"
|
||||
/>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-807.72 -736.2)"
|
||||
>
|
||||
<g
|
||||
id="g6941"
|
||||
style="enable-background:new"
|
||||
inkscape:export-ydpi="200"
|
||||
inkscape:export-filename="/home/baptiste/Images/Mesh ecosud topologie.png"
|
||||
transform="matrix(.63449 0 0 .63449 570.41 585.32)"
|
||||
inkscape:export-xdpi="200"
|
||||
/>
|
||||
<g
|
||||
id="g4758"
|
||||
transform="translate(1.25 58.5)"
|
||||
/>
|
||||
<g
|
||||
id="g5144"
|
||||
inkscape:export-ydpi="1000"
|
||||
inkscape:export-xdpi="1000"
|
||||
inkscape:export-filename="/home/baptiste/Images/Projets/SmarTB/smarTB arch.png"
|
||||
transform="translate(79.432 90.278)"
|
||||
>
|
||||
<g
|
||||
id="g5146"
|
||||
style="enable-background:new"
|
||||
transform="matrix(0 -1 1 0 847.93 743.58)"
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
>
|
||||
<g
|
||||
id="g5148"
|
||||
transform="matrix(.44966 -.22409 .22409 .44966 75.597 -117.31)"
|
||||
>
|
||||
<path
|
||||
id="path5150"
|
||||
sodipodi:rx="3.3335035"
|
||||
sodipodi:ry="3.3335035"
|
||||
style="color:#000000;stroke:url(#radialGradient5328);stroke-miterlimit:10;stroke-width:1.5866;fill:none"
|
||||
sodipodi:type="arc"
|
||||
d="m30.911 18.605a3.3335 3.3335 0 1 1 -6.667 0 3.3335 3.3335 0 1 1 6.667 0z"
|
||||
transform="matrix(0 -1.7738 -1.7738 0 57 70.164)"
|
||||
sodipodi:cy="18.604561"
|
||||
sodipodi:cx="27.577164"
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
/>
|
||||
<path
|
||||
id="path5152"
|
||||
sodipodi:rx="3.3335035"
|
||||
sodipodi:ry="3.3335035"
|
||||
style="color:#000000;stroke:url(#radialGradient5330);stroke-miterlimit:10;stroke-width:.81150;fill:none"
|
||||
sodipodi:type="arc"
|
||||
d="m30.911 18.605a3.3335 3.3335 0 1 1 -6.667 0 3.3335 3.3335 0 1 1 6.667 0z"
|
||||
transform="matrix(0 -3.4678 -3.4678 0 88.518 116.88)"
|
||||
sodipodi:cy="18.604561"
|
||||
sodipodi:cx="27.577164"
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
</g
|
||||
>
|
||||
<g
|
||||
id="g5154"
|
||||
transform="translate(-59,28.5)"
|
||||
>
|
||||
<path
|
||||
id="path5156"
|
||||
sodipodi:nodetypes="cczcccc"
|
||||
style="stroke-linejoin:round;fill-rule:evenodd;stroke:#2e3436;stroke-width:.52833;fill:#2e3436"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m793.69 626.37-0.28284 4.1423s0.14906 0.16096 0.30384 0.16265c0.15478 0.002 0.29784-0.15586 0.29784-0.15586l-0.31176-4.1491v-2.0894l-0.007 2.0894z"
|
||||
/>
|
||||
<path
|
||||
id="path5158"
|
||||
d="m797.68 630.65-4.1423-0.28284s-0.16096 0.14905-0.16265 0.30384c-0.002 0.15478 0.15586 0.29784 0.15586 0.29784l4.1491-0.31176h2.0894l-2.0894-0.007z"
|
||||
sodipodi:nodetypes="cczcccc"
|
||||
style="stroke-linejoin:round;fill-rule:evenodd;stroke:#2e3436;stroke-width:.52833;fill:#2e3436"
|
||||
inkscape:connector-curvature="0"
|
||||
/>
|
||||
<g
|
||||
id="g5160"
|
||||
transform="matrix(.40772 0 0 .40772 794.56 621.08)"
|
||||
>
|
||||
<path
|
||||
id="path5162"
|
||||
style="opacity:.3;color:#000000;display:block;fill:url(#radialGradient5332)"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m49.107 36.463a24.822 2 0 0 1 -49.643 0 24.822 2 0 1 1 49.643 0z"
|
||||
/>
|
||||
<path
|
||||
id="path5164"
|
||||
d="m46.5 35.5c-19.549 0-33.623-0.02218-45 0.000005v-20h45z"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
style="stroke-linejoin:round;color:#000000;stroke:#28390d;stroke-width:.89721;display:block;fill:url(#radialGradient5334)"
|
||||
inkscape:connector-curvature="0"
|
||||
/>
|
||||
<path
|
||||
id="path5166"
|
||||
d="m45.5 34.502c-17.946 0-33.678-0.01023-42.995-0.0039-0.0042-0.001-0.0039-17.998-0.0039-17.998h42.999c-0.004 8.3386 0 18.002 0 18.002z"
|
||||
sodipodi:nodetypes="cccccc"
|
||||
style="opacity:.4;color:#000000;stroke:url(#radialGradient5336);display:block;fill:none"
|
||||
inkscape:connector-curvature="0"
|
||||
/>
|
||||
<rect
|
||||
id="rect5168"
|
||||
style="color:#000000;stroke:#2e3436;display:block;fill:#555753"
|
||||
rx=".94194"
|
||||
transform="rotate(-90)"
|
||||
ry=".94194"
|
||||
width="10.056"
|
||||
y="5.4603"
|
||||
x="-30.528"
|
||||
height="5.93"
|
||||
/>
|
||||
<rect
|
||||
id="rect5170"
|
||||
style="opacity:.17045;color:#000000;stroke:url(#linearGradient5338);display:block;fill:none"
|
||||
transform="rotate(-90)"
|
||||
rx="0"
|
||||
ry="0"
|
||||
height="3.882"
|
||||
width="8.016"
|
||||
y="6.4676"
|
||||
x="-29.583"
|
||||
/>
|
||||
<path
|
||||
id="path5172"
|
||||
sodipodi:nodetypes="cccccccccc"
|
||||
style="color:#000000;display:block;fill:url(#linearGradient5340)"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m6.9567 19v1h1v-1zm2 0v1h1v-1z"
|
||||
/>
|
||||
<path
|
||||
id="path5174"
|
||||
style="color:#000000;display:block;fill:url(#linearGradient5342)"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m3.9567 22v1h1v-1h-1zm0 2v1h1v-1h-1zm0 2v1h1v-1h-1zm0 2v1h1v-1h-1z"
|
||||
/>
|
||||
<path
|
||||
id="path5176"
|
||||
style="color:#000000;display:block;fill:url(#linearGradient5344)"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m11.957 21.792v1h1v-1h-1zm0 2v1h1v-1h-1zm0 2v1h1v-1h-1zm0 2v1h1v-1h-1z"
|
||||
/>
|
||||
<g
|
||||
id="g5178"
|
||||
transform="matrix(3.323 0 0 3.323 91.632 -32.316)"
|
||||
>
|
||||
<path
|
||||
id="path5180"
|
||||
sodipodi:nodetypes="cccccc"
|
||||
style="color:#000000;stroke:#305526;stroke-width:.14039;display:block;fill:none"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-21.172 16.064-0.83359 0.29834v0.52648 2.8254l-2.7155 0.01273v-0.58894"
|
||||
/>
|
||||
<rect
|
||||
id="rect5182"
|
||||
style="color:#000000;stroke:#2e3436;stroke-width:.28079;display:block;fill:#555753"
|
||||
rx=".26449"
|
||||
ry=".26449"
|
||||
height="2.2268"
|
||||
width="4.5082"
|
||||
y="15.504"
|
||||
x="-20.899"
|
||||
/>
|
||||
<rect
|
||||
id="rect5184"
|
||||
style="opacity:.17045;color:#000000;stroke:url(#linearGradient5346);stroke-width:.28079;display:block;fill:none"
|
||||
rx="0"
|
||||
ry="0"
|
||||
height="1.6515"
|
||||
width="3.9636"
|
||||
y="15.786"
|
||||
x="-20.634"
|
||||
/>
|
||||
<path
|
||||
id="path5186"
|
||||
style="color:#000000;stroke:#305526;stroke-width:.14039;display:block;fill:none"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-21.172 16.626-0.83798 0.29834"
|
||||
/>
|
||||
<path
|
||||
id="path5188"
|
||||
style="color:#000000;stroke:#305526;stroke-width:.14039;display:block;fill:#98a332"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-21.172 17.187-0.84236 0.42118"
|
||||
/>
|
||||
<path
|
||||
id="path5190"
|
||||
sodipodi:nodetypes="ccccccccccccccc"
|
||||
style="color:#000000;display:block;fill:url(#linearGradient5348)"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-16.274 15.924v0.28079h0.29641v-0.28079zm0 0.56158v0.28079h0.29641v-0.28079zm0 0.56158v0.28079h0.29641v-0.28079z"
|
||||
/>
|
||||
<path
|
||||
id="path5192"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccc"
|
||||
style="color:#000000;display:block;fill:url(#linearGradient5350)"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-20.47 15.081v0.29641h0.28079v-0.29641zm0.56158 0v0.29641h0.28079v-0.29641zm0.56158 0v0.29641h0.28079v-0.29641zm0.56158 0v0.29641h0.28079v-0.29641zm0.56158 0v0.29641h0.28079v-0.29641zm0.56158 0v0.29641h0.28079v-0.29641zm0.56158 0v0.29641h0.28079v-0.29641z"
|
||||
/>
|
||||
<path
|
||||
id="path5194"
|
||||
style="color:#000000;stroke:#305526;stroke-width:.14039;display:block;fill:none"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-20.342 18.103 0.29782 1.0499h0.546l-0.29782-1.0499"
|
||||
/>
|
||||
<path
|
||||
id="path5196"
|
||||
style="color:#000000;stroke:#305526;stroke-width:.14039;display:block;fill:none"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-19.219 18.103 0.29782 1.0499h0.546l-0.29782-1.0499"
|
||||
/>
|
||||
<path
|
||||
id="path5198"
|
||||
style="color:#000000;stroke:#305526;stroke-width:.14039;display:block;fill:none"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-18.096 18.131 0.29782 1.0218h0.54601l-0.29782-1.0218"
|
||||
/>
|
||||
<path
|
||||
id="path5200"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccc"
|
||||
style="color:#000000;display:block;fill:url(#linearGradient5352)"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-20.47 17.852v0.31851h0.28079v-0.31851zm0.56158 0v0.31851h0.28079v-0.31851zm0.56158 0v0.31851h0.28079v-0.31851zm0.56158 0v0.31851h0.28079v-0.31851zm0.56158 0v0.31851h0.28079v-0.31851zm0.56158 0v0.31851h0.28079v-0.31851zm0.56158 0v0.31851h0.28079v-0.31851z"
|
||||
/>
|
||||
<path
|
||||
id="path5202"
|
||||
sodipodi:nodetypes="ccccccccccccccc"
|
||||
style="color:#000000;display:block;fill:url(#linearGradient5354)"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m-21.313 15.924v0.28079h0.29641v-0.28079zm0 0.56158v0.28079h0.29641v-0.28079zm0 0.56158v0.28079h0.29641v-0.28079z"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
<path
|
||||
id="path5204"
|
||||
sodipodi:nodetypes="cccccccccc"
|
||||
style="color:#000000;display:block;fill:url(#linearGradient5356)"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m6.9567 31v1h1v-1zm2 0v1h1v-1z"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
<g
|
||||
id="g5206"
|
||||
transform="matrix(1.3548 0 0 1.3548 763.23 683.41)"
|
||||
>
|
||||
<g
|
||||
id="g5208"
|
||||
transform="matrix(0 -.47816 .47816 0 29.162 -32.888)"
|
||||
>
|
||||
<rect
|
||||
id="rect5210"
|
||||
style="fill:#ffffff"
|
||||
rx=".625"
|
||||
ry=".625"
|
||||
height="4.8971"
|
||||
width="6.3732"
|
||||
y="15.653"
|
||||
x="7.8712"
|
||||
/>
|
||||
<rect
|
||||
id="rect5212"
|
||||
style="stroke:#555753;stroke-width:.56467;fill:url(#radialGradient5358)"
|
||||
rx=".56471"
|
||||
ry=".56471"
|
||||
transform="scale(1,-1)"
|
||||
width="7"
|
||||
y="-21.5"
|
||||
x="7.5"
|
||||
height="7"
|
||||
/>
|
||||
<rect
|
||||
id="rect5214"
|
||||
style="opacity:.88172;fill:url(#linearGradient5360)"
|
||||
transform="scale(1,-1)"
|
||||
height="1"
|
||||
width="1.5"
|
||||
y="-20"
|
||||
x="9"
|
||||
/>
|
||||
<rect
|
||||
id="rect5216"
|
||||
style="opacity:.88172;fill:url(#linearGradient5362)"
|
||||
transform="scale(1,-1)"
|
||||
height="1"
|
||||
width="1.5"
|
||||
y="-20"
|
||||
x="11.5"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
</g
|
||||
>
|
||||
</g
|
||||
>
|
||||
</g
|
||||
>
|
||||
</g
|
||||
>
|
||||
<metadata
|
||||
>
|
||||
<rdf:RDF
|
||||
>
|
||||
<cc:Work
|
||||
>
|
||||
<dc:format
|
||||
>image/svg+xml</dc:format
|
||||
>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||
/>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
|
||||
/>
|
||||
<dc:publisher
|
||||
>
|
||||
<cc:Agent
|
||||
rdf:about="http://openclipart.org/"
|
||||
>
|
||||
<dc:title
|
||||
>Openclipart</dc:title
|
||||
>
|
||||
</cc:Agent
|
||||
>
|
||||
</dc:publisher
|
||||
>
|
||||
<dc:title
|
||||
>Wireless sensor</dc:title
|
||||
>
|
||||
<dc:date
|
||||
>2011-07-29T10:27:30</dc:date
|
||||
>
|
||||
<dc:description
|
||||
>A wireless sensor clipart influenced by Tango project guidelines</dc:description
|
||||
>
|
||||
<dc:source
|
||||
>https://openclipart.org/detail/152365/wireless-sensor-by-b.gaultier</dc:source
|
||||
>
|
||||
<dc:creator
|
||||
>
|
||||
<cc:Agent
|
||||
>
|
||||
<dc:title
|
||||
>b.gaultier</dc:title
|
||||
>
|
||||
</cc:Agent
|
||||
>
|
||||
</dc:creator
|
||||
>
|
||||
<dc:subject
|
||||
>
|
||||
<rdf:Bag
|
||||
>
|
||||
<rdf:li
|
||||
>electronic</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>sensor</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>tango</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>wireless</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>wireless sensor</rdf:li
|
||||
>
|
||||
</rdf:Bag
|
||||
>
|
||||
</dc:subject
|
||||
>
|
||||
</cc:Work
|
||||
>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/publicdomain/"
|
||||
>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
|
||||
/>
|
||||
</cc:License
|
||||
>
|
||||
</rdf:RDF
|
||||
>
|
||||
</metadata
|
||||
>
|
||||
</svg
|
||||
>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" enable-background="new 0 0 50 50" width="50" height="50" style="">
|
||||
<path d="M 25 0 C 11.2 0 0 11.2 0 25 C 0 37.4 9.1 47.7875 21 49.6875 L 21 47.6875 C 10.2 45.6875 2 36.3 2 25 C 2 12.3 12.3 2 25 2 C 37.7 2 48 12.3 48 25 C 48 36.3 39.8 45.69375 29 47.59375 L 29 49.59375 C 40.9 47.79375 50 37.4 50 25 C 50 11.2 38.8 0 25 0 z M 25 4 C 13.4 4 4 13.4 4 25 C 4 35.2 11.3 43.69375 21 45.59375 L 21 43.59375 C 12.4 41.69375 6 34.1 6 25 C 6 14.5 14.5 6 25 6 C 35.5 6 44 14.5 44 25 C 44 34.1 37.6 41.69375 29 43.59375 L 29 45.59375 C 38.7 43.69375 46 35.2 46 25 C 46 13.4 36.6 4 25 4 z M 25 8 C 15.6 8 8 15.6 8 25 C 8 33 13.6 39.7 21 41.5 L 21 39.40625 C 14.7 37.60625 10 31.8 10 25 C 10 16.7 16.7 10 25 10 C 33.3 10 40 16.7 40 25 C 40 31.9 35.3 37.70625 29 39.40625 L 29 41.5 C 36.4 39.7 42 33 42 25 C 42 15.6 34.4 8 25 8 z M 25 12 C 17.8 12 12 17.8 12 25 C 12 30.8 15.8 35.70625 21 37.40625 L 21 35.3125 C 16.9 33.7125 14 29.69375 14 25.09375 C 14 18.99375 18.9 14.09375 25 14.09375 C 31.1 14.09375 36 18.99375 36 25.09375 C 36 29.79375 33.1 33.7125 29 35.3125 L 29 37.40625 C 34.2 35.70625 38 30.8 38 25 C 38 17.8 32.2 12 25 12 z M 25 16 C 20 16 16 20 16 25 C 16 28.5 18 31.59375 21 33.09375 L 21 30.8125 C 19.2 29.5125 18 27.39375 18 25.09375 C 18 21.19375 21.1 18.09375 25 18.09375 C 28.9 18.09375 32 21.19375 32 25.09375 C 32 27.49375 30.8 29.6125 29 30.8125 L 29 33.09375 C 32 31.59375 34 28.5 34 25 C 34 20 30 16 25 16 z M 25 21 C 22.790861 21 21 22.790861 21 25 C 21 27.209139 22.790861 29 25 29 C 27.209139 29 29 27.209139 29 25 C 29 22.790861 27.209139 21 25 21 z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 1.6 KiB |
42
res/icons/door.svg
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="494.239px" height="494.238px" viewBox="0 0 494.239 494.238" style="enable-background:new 0 0 494.239 494.238;"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<path d="M199.725,0v36.025H85.211v421.66l114.514,0.094v36.459l209.085-37.555l0.216-418.867L199.725,0z M234.404,230.574
|
||||
c7.022,0,12.715,7.408,12.715,16.545c0,9.139-5.692,16.545-12.715,16.545s-12.715-7.406-12.715-16.545
|
||||
C221.688,237.982,227.382,230.574,234.404,230.574z M119.211,423.713V70.025h80.514v353.753L119.211,423.713z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
1139
res/icons/floor.svg
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 3.5 KiB |
@@ -1,81 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!--part of the matt icon theme by sixsixfive released under CC0 (https://creativecommons.org/publicdomain/zero/1.0/) on openclipart-->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
|
||||
<defs id="0">
|
||||
<linearGradient id="L">
|
||||
<stop id="h" stop-opacity="0"/>
|
||||
<stop offset="0.5" id="i"/>
|
||||
<stop id="j" offset="1" stop-opacity="0.169"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="M">
|
||||
<stop id="k" stop-opacity="0"/>
|
||||
<stop id="l" offset="0.5"/>
|
||||
<stop offset="1" id="m" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="N">
|
||||
<stop id="n"/>
|
||||
<stop offset="1" id="o" stop-opacity="0.579"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="O">
|
||||
<stop id="p" stop-color="#8bb300"/>
|
||||
<stop offset="1" id="q" stop-color="#99c500"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="P">
|
||||
<stop id="r" stop-color="#eee"/>
|
||||
<stop offset="1" id="s" stop-color="#d2d2d2"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="Q">
|
||||
<stop id="t"/>
|
||||
<stop offset="1" id="u" stop-opacity="0.536"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="R">
|
||||
<stop id="v"/>
|
||||
<stop offset="1" id="w" stop-color="#ddd" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<filter id="S" x="-0.147" width="1.294" y="-0.145" height="1.29">
|
||||
<feGaussianBlur stdDeviation="1.81881" id="x"/>
|
||||
</filter>
|
||||
<filter id="T">
|
||||
<feGaussianBlur stdDeviation="2.58594" id="y"/>
|
||||
</filter>
|
||||
<radialGradient xlink:href="#Q" id="U" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.97467889,0,0.43910718)" cx="89.51" cy="22.254" r="18.279"/>
|
||||
<radialGradient xlink:href="#O" r="31.14" cy="35.807" cx="179.26" gradientTransform="matrix(1,0,0,0.13401545,-131.35837,66.507196)" gradientUnits="userSpaceOnUse" id="V"/>
|
||||
<radialGradient xlink:href="#N" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.64123902,0,22.551491)" r="33.797" cy="62.859" cx="64.2" id="W"/>
|
||||
<filter id="X">
|
||||
<feGaussianBlur stdDeviation="0.2529" id="z"/>
|
||||
</filter>
|
||||
<linearGradient xlink:href="#R" y2="25.1" x2="86.82" y1="14.793" x1="98.33" gradientTransform="matrix(0.96714879,0,0,0.96714879,1.5886796,3.2231964)" gradientUnits="userSpaceOnUse" id="Y"/>
|
||||
<radialGradient xlink:href="#P" r="44.42" cy="100.32" cx="81.79" gradientTransform="matrix(2.0026052,-1.5970314,1.7773333,2.2286954,-278.10308,27.013826)" gradientUnits="userSpaceOnUse" id="Z"/>
|
||||
<linearGradient xlink:href="#L" gradientTransform="translate(-0.42906965,0.17162786)" gradientUnits="userSpaceOnUse" y2="49.07" x2="98.13" y1="41.456" x1="90.12" id="a"/>
|
||||
<filter id="b">
|
||||
<feGaussianBlur stdDeviation="0.2599" id="10"/>
|
||||
</filter>
|
||||
<linearGradient xlink:href="#M" gradientTransform="translate(-60.345531,36.057221)" y2="48.958" x2="97.88" y1="41.3" x1="90.16" gradientUnits="userSpaceOnUse" id="c"/>
|
||||
<linearGradient xlink:href="#P" gradientUnits="userSpaceOnUse" y2="50.42" x2="91.72" y1="31.16" x1="104.33" id="d"/>
|
||||
<linearGradient xlink:href="#P" gradientUnits="userSpaceOnUse" y2="68.34" x2="36.483" y1="89.57" x1="25.99" id="e"/>
|
||||
<filter id="f">
|
||||
<feGaussianBlur stdDeviation="0.34584" id="11"/>
|
||||
</filter>
|
||||
</defs>
|
||||
<path d="m 20.09375,4.1185004 0,117.9999996 88.84375,0 0,-86.15625 -0.59375,-0.625 c 0.21045,0.144391 0.41688,0.302162 0.625,0.4375 L 78.09375,4.1497504 c 0.05654,0.079597 0.09993,0.1703021 0.15625,0.25 l -0.25,-0.28125 -57.90625,0 z" id="1" transform="matrix(0.96714879,0,0,0.97126149,1.5886796,2.6954315)" opacity="0.809" filter="url(#T)"/>
|
||||
<path d="m 21.022325,5.8526322 0,114.1235578 85.925125,0 0,-83.325913 -29.921165,-30.7976448 -56.00396,0 z" id="2" fill="url(#Z)"/>
|
||||
<path id="3" d="m 81.698039,28.309502 0.135161,-8.351 C 81.901124,13.359407 80.956142,8.4107397 77.785779,3.9471419 L 80.362343,3.9159389 107.86271,29.53084 c -4.06802,-2.645393 -9.621189,-0.791242 -16.861906,-1.025606 l -9.302765,-0.195732 z" transform="matrix(1.016085,0,0,1.112241,-3.7922382,2.9647584)" opacity="0.505" fill="url(#U)" filter="url(#S)"/>
|
||||
<path d="m 82.748319,29.121681 0.130721,-8.07666 c 0.06569,-6.382306 -2.691577,-10.83607 -5.75779,-15.1530328 l 29.86674,30.5881668 c -3.93438,-2.558489 -8.23966,-6.942507 -15.242513,-7.169171 l -8.997158,-0.189303 z" id="4" fill="#eee"/>
|
||||
<path id="5" d="m 82.748319,29.121681 0.130721,-8.07666 c 0.06569,-6.382306 -2.691577,-10.83607 -5.75779,-15.1530328 l 29.86674,30.5881668 c -3.93438,-2.558489 -8.23966,-6.942507 -15.242513,-7.169171 l -8.997158,-0.189303 z" fill="url(#Y)"/>
|
||||
<path id="6" d="m 32.34375,41.1875 c -1.076646,0 -1.9375,0.860854 -1.9375,1.9375 l 0.789179,34.65625 6.117071,6.118657 58.75,0.631343 c 1.076646,0 1.9375,-0.860854 1.9375,-1.9375 L 97.368657,49.125 89.370242,41.818843 32.34375,41.1875 z" fill="url(#W)" filter="url(#X)"/>
|
||||
<rect id="7" width="26.652" height="42.516" x="52.03" y="41.28" transform="matrix(2.0986114,0,0,0.88510731,-75.645463,4.7769901)" filter="url(#f)"/>
|
||||
<rect transform="matrix(2.1905454,0,0,0.83797185,-82.955778,8.7656631)" y="41.28" x="52.03" height="42.516" width="26.652" id="8" filter="url(#f)"/>
|
||||
<rect id="9" width="26.652" height="42.516" x="52.03" y="41.28" transform="matrix(2.0066774,0,0,0.82618798,-65.211739,15.098658)" filter="url(#f)"/>
|
||||
<rect transform="matrix(2.1721586,0,0,0.76137672,-73.685188,17.719957)" y="41.28" x="52.03" height="42.516" width="26.652" id="A" filter="url(#f)"/>
|
||||
<path d="m 32.34375,41.1875 c -1.076646,0 -1.9375,0.860854 -1.9375,1.9375 l 0,34.65625 6.90625,6.75 58.75,0 c 1.076646,0 1.9375,-0.860854 1.9375,-1.9375 L 98.048358,49.101925 90.085781,41.323994 32.34375,41.1875 z" id="B" fill="#eee"/>
|
||||
<path d="M 33.0625 43.84375 L 33.0625 80.375 L 34.59375 81.875 L 95.34375 81.875 L 95.34375 46.53125 L 92.5625 43.84375 L 33.0625 43.84375 z " id="C" fill="#6193cf"/>
|
||||
<path d="M 47.53125 43.84375 L 36.9375 46.5625 L 36.46875 46.46875 L 36.75 46.625 L 36.375 46.71875 L 36.96875 46.75 L 37.09375 46.9375 L 38.4375 81.875 L 48.65625 81.875 L 37.21875 47.09375 L 60.84375 81.875 L 79.34375 81.875 L 37.28125 46.9375 L 95.34375 78.375 L 95.34375 59.4375 L 37.78125 46.75 L 95.34375 48.40625 L 95.34375 46.53125 L 92.5625 43.84375 L 47.53125 43.84375 z M 36.53125 46.90625 L 33.0625 53.15625 L 33.0625 62 L 36.53125 46.90625 z " id="D" fill="#7ca6d7"/>
|
||||
<path d="m 33.04788,43.858213 0,7.84375 c 1.05358,0.726143 2.34487,1.15625 3.75,1.15625 3.51981,0 6.375,-2.682059 6.375,-6 0,-1.090212 -0.3052,-2.118572 -0.84375,-3 l -9.28125,0 z" id="E" fill="#ffeb55"/>
|
||||
<path d="M 55.46875 73.53125 C 48.50349 73.48457 41.0516 73.995119 33.0625 75.53125 L 33.0625 80.375 L 34.59375 81.875 L 95.34375 81.875 L 95.34375 76.34375 C 83.78958 76.33405 70.77338 73.633828 55.46875 73.53125 z " id="F" fill="url(#V)"/>
|
||||
<path d="m 89.674152,41.523199 7.912589,7.633977" id="G" opacity="0.717" fill="none" filter="url(#b)" stroke="url(#a)"/>
|
||||
<path id="H" d="m 29.757691,77.408792 7.912589,7.633977" opacity="0.575" fill="none" filter="url(#b)" stroke="url(#c)"/>
|
||||
<path d="m 89.67563,40.948711 9.02517,8.64112 1.024133,-1.152149 -9.473229,-8.449096 -0.576074,0.960125 z" id="I" fill="url(#d)"/>
|
||||
<path d="m 29.536537,77.039758 8.938689,8.55005 -8.79295,-0.291479 -0.145739,-8.258571 z" id="J" stroke-opacity="0.908" fill="url(#e)" stroke-linejoin="round" stroke-linecap="round" stroke-width="3"/>
|
||||
<text x="63.743" y="109.94" id="K" fill="#555" font-family="Jigsaw Trouserdrop" text-anchor="middle" text-align="center" line-height="125%" font-size="40"><tspan id="g" x="63.743" y="109.94" font-family="Liberation Sans" text-align="center" line-height="125%" font-weight="bold" font-size="18">IMAGE</tspan>
|
||||
</text>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 58 58" style="enable-background:new 0 0 58 58;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M57,6H1C0.448,6,0,6.447,0,7v44c0,0.553,0.448,1,1,1h56c0.552,0,1-0.447,1-1V7C58,6.447,57.552,6,57,6z M56,50H2V8h54V50z"
|
||||
/>
|
||||
<path d="M16,28.138c3.071,0,5.569-2.498,5.569-5.568C21.569,19.498,19.071,17,16,17s-5.569,2.498-5.569,5.569
|
||||
C10.431,25.64,12.929,28.138,16,28.138z M16,19c1.968,0,3.569,1.602,3.569,3.569S17.968,26.138,16,26.138s-3.569-1.601-3.569-3.568
|
||||
S14.032,19,16,19z"/>
|
||||
<path d="M7,46c0.234,0,0.47-0.082,0.66-0.249l16.313-14.362l10.302,10.301c0.391,0.391,1.023,0.391,1.414,0s0.391-1.023,0-1.414
|
||||
l-4.807-4.807l9.181-10.054l11.261,10.323c0.407,0.373,1.04,0.345,1.413-0.062c0.373-0.407,0.346-1.04-0.062-1.413l-12-11
|
||||
c-0.196-0.179-0.457-0.268-0.72-0.262c-0.265,0.012-0.515,0.129-0.694,0.325l-9.794,10.727l-4.743-4.743
|
||||
c-0.374-0.373-0.972-0.392-1.368-0.044L6.339,44.249c-0.415,0.365-0.455,0.997-0.09,1.412C6.447,45.886,6.723,46,7,46z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -1,753 +1,62 @@
|
||||
<?xml version="1.0"?>
|
||||
<svg
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:ns1="http://sozi.baierouge.fr"
|
||||
id="svg3382"
|
||||
viewBox="0 0 300.18 644.05"
|
||||
version="1.1"
|
||||
>
|
||||
<defs
|
||||
id="defs3384"
|
||||
>
|
||||
<radialGradient
|
||||
id="radialGradient4328"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cy="209.49"
|
||||
cx="203.65"
|
||||
gradientTransform="matrix(1.1806 0 0 1.2225 -36.777 -46.607)"
|
||||
r="27.577"
|
||||
>
|
||||
<stop
|
||||
id="stop4241"
|
||||
stop-color="#FFF"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop4243"
|
||||
stop-color="#CCC"
|
||||
offset="1"
|
||||
/>
|
||||
</radialGradient
|
||||
>
|
||||
<filter
|
||||
id="filter4319"
|
||||
width="1.2128"
|
||||
y="-.10638"
|
||||
x="-.10638"
|
||||
height="1.2128"
|
||||
color-interpolation-filters="sRGB"
|
||||
>
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4321"
|
||||
stdDeviation="2.9560062"
|
||||
/>
|
||||
</filter
|
||||
>
|
||||
<clipPath
|
||||
id="clipPath4178"
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
>
|
||||
<path
|
||||
id="path4180"
|
||||
opacity=".51439"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
fill="#333"
|
||||
d="m472.23 56.05c-25.407-1.0974-48.956 17.774-51.094 43.688-1.9119 23.171 15.045 45.318 38.875 47.031 20.196 1.4516 39.472-13.408 40.688-34.281 1.0078-17.303-11.873-33.84-29.875-34.563-14.494-0.58199-28.334 10.403-28.562 25.625-0.17655 11.787 8.9789 23.032 21.531 22.75 9.1862-0.20623 18.06-7.6345 17.219-17.656-0.28271-3.3674-1.8434-6.5281-4.2812-8.8438-2.4453-2.3228-6.0679-3.8198-9.9375-3.0312-1.546 0.3275-2.6673 2.0094-2.375 3.5625l0.1875 1c0.29786 1.5936 2.0368 2.7629 3.625 2.4375 1.4246-0.29032 2.5071 0.12559 3.625 1.1875 1.0945 1.0397 1.9052 2.7803 2.0312 4.2812 0.45617 5.4336-4.781 9.8147-10.25 9.9375-8.1309 0.18253-14.37-7.4976-14.25-15.531 0.16316-10.893 10.433-19.024 21.156-18.594 13.743 0.55183 19.624 7.6077 18.837 21.128-0.97088 16.669-16.998 22.229-33.398 21.05-19.664-1.4133 39.81 10.246 41.407-9.1113 1.8071-21.901-20.989-16.617 0.70342-15.68 1.584 0.0676-13.519-39.38-13.423-40.962l0.0625-4.0201c0.10086-1.624-10.875-1.3411-12.501-1.4044z"
|
||||
/>
|
||||
</clipPath
|
||||
>
|
||||
<filter
|
||||
id="filter10847"
|
||||
color-interpolation-filters="sRGB"
|
||||
>
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur10849"
|
||||
stdDeviation="2.7227669"
|
||||
/>
|
||||
</filter
|
||||
>
|
||||
<clipPath
|
||||
id="clipPath4174"
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
>
|
||||
<path
|
||||
id="path4176"
|
||||
opacity=".51439"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
fill="#333"
|
||||
d="m469.17 56.031c-25.407-1.0974-48.956 17.774-51.094 43.688-1.9119 23.171 15.045 45.318 38.875 47.031 20.196 1.4516 39.472-13.408 40.688-34.281 1.0078-17.303-11.873-33.84-29.875-34.562-14.494-0.58199-28.334 10.403-28.562 25.625-0.17655 11.787 8.9789 23.032 21.531 22.75 9.1862-0.20623 18.06-7.6345 17.219-17.656-0.28271-3.3674-1.8434-6.5281-4.2812-8.8438-2.4453-2.3228-6.0679-3.8198-9.9375-3.0312-1.546 0.3275-2.6673 2.0094-2.375 3.5625l0.1875 1c0.29786 1.5936 2.0368 2.7629 3.625 2.4375 1.4246-0.29032 2.5071 0.12559 3.625 1.1875 1.0945 1.0397 1.9052 2.7803 2.0312 4.2812 0.45617 5.4336-4.781 9.8147-10.25 9.9375-8.1309 0.18253-14.37-7.4976-14.25-15.531 0.16316-10.893 10.433-19.024 21.156-18.594 13.743 0.55183 19.624 7.6077 18.837 21.128-0.97088 16.669-16.998 22.229-33.398 21.05-19.664-1.4133 39.81 10.246 41.407-9.1113 1.8071-21.901-20.989-16.617 0.70342-15.68 1.584 0.0676-13.519-39.38-13.423-40.962l0.0625-4.0201c0.10086-1.624-10.875-1.3411-12.501-1.4044z"
|
||||
/>
|
||||
</clipPath
|
||||
>
|
||||
<filter
|
||||
id="filter10867"
|
||||
color-interpolation-filters="sRGB"
|
||||
>
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur10869"
|
||||
stdDeviation="2.2608041"
|
||||
/>
|
||||
</filter
|
||||
>
|
||||
<clipPath
|
||||
id="clipPath4170"
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
>
|
||||
<path
|
||||
id="path4172"
|
||||
opacity=".51439"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
fill="#333"
|
||||
d="m470.62 56.031c-25.407-1.0974-48.956 17.774-51.094 43.688-1.9119 23.171 15.045 45.318 38.875 47.031 20.196 1.4516 39.472-13.408 40.688-34.281 1.0078-17.303-11.873-33.84-29.875-34.562-14.494-0.58199-28.334 10.403-28.562 25.625-0.17655 11.787 8.9789 23.032 21.531 22.75 9.1862-0.20623 18.06-7.6345 17.219-17.656-0.28271-3.3674-1.8434-6.5281-4.2812-8.8438-2.4453-2.3228-6.0679-3.8198-9.9375-3.0312-1.546 0.3275-2.6673 2.0094-2.375 3.5625l0.1875 1c0.29786 1.5936 2.0368 2.7629 3.625 2.4375 1.4246-0.29032 2.5071 0.12559 3.625 1.1875 1.0945 1.0397 1.9052 2.7803 2.0312 4.2812 0.45617 5.4336-4.781 9.8147-10.25 9.9375-8.1309 0.18253-14.37-7.4976-14.25-15.531 0.16316-10.893 10.433-19.024 21.156-18.594 13.743 0.55183 19.624 7.6077 18.837 21.128-0.97088 16.669-16.998 22.229-33.398 21.05-19.664-1.4133 39.81 10.246 41.407-9.1113 1.8071-21.901-20.989-16.617 0.70342-15.68 1.584 0.0676-13.519-39.38-13.423-40.962l0.0625-4.0201c0.10086-1.624-10.875-1.3411-12.501-1.4044z"
|
||||
/>
|
||||
</clipPath
|
||||
>
|
||||
<filter
|
||||
id="filter3996"
|
||||
width="1.0907"
|
||||
y="-.92139"
|
||||
x="-.045325"
|
||||
height="2.8428"
|
||||
color-interpolation-filters="sRGB"
|
||||
>
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur3998"
|
||||
stdDeviation="3.1496171"
|
||||
/>
|
||||
</filter
|
||||
>
|
||||
<filter
|
||||
id="filter4113"
|
||||
width="1.0937"
|
||||
y="-85.061"
|
||||
x="-.046834"
|
||||
height="171.12"
|
||||
color-interpolation-filters="sRGB"
|
||||
>
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4115"
|
||||
stdDeviation="2.5589068"
|
||||
/>
|
||||
</filter
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient4101"
|
||||
y2="721.54"
|
||||
xlink:href="#linearGradient4024"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="201.71"
|
||||
gradientTransform="matrix(-1 0 0 -1 570.66 991.98)"
|
||||
y1="704.86"
|
||||
x1="201.71"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient4024"
|
||||
>
|
||||
<stop
|
||||
id="stop4026"
|
||||
stop-color="#CCC"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop4034"
|
||||
stop-color="#f1f1f1"
|
||||
offset=".2394"
|
||||
/>
|
||||
<stop
|
||||
id="stop4032"
|
||||
stop-color="#f2f2f2"
|
||||
offset=".64835"
|
||||
/>
|
||||
<stop
|
||||
id="stop4028"
|
||||
stop-color="#dbdbdb"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient4099"
|
||||
y2="702.22"
|
||||
xlink:href="#linearGradient3865"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="282.26"
|
||||
gradientTransform="matrix(1 0 0 .625 -569.48 -732.6)"
|
||||
y1="702.22"
|
||||
x1="116.21"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient3865"
|
||||
>
|
||||
<stop
|
||||
id="stop3867"
|
||||
stop-color="#e6e6e6"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop3873"
|
||||
stop-color="#f2f2f2"
|
||||
offset=".5"
|
||||
/>
|
||||
<stop
|
||||
id="stop3869"
|
||||
stop-color="#e6e6e6"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient4030"
|
||||
y2="721.54"
|
||||
xlink:href="#linearGradient4024"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="201.71"
|
||||
gradientTransform="translate(172.19 46.759)"
|
||||
y1="704.86"
|
||||
x1="201.71"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient4011"
|
||||
y2="702.22"
|
||||
xlink:href="#linearGradient3865"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="282.26"
|
||||
gradientTransform="matrix(1 0 0 .625 172.19 306.14)"
|
||||
y1="702.22"
|
||||
x1="116.21"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient4091"
|
||||
y2="471.14"
|
||||
xlink:href="#linearGradient3811"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="152.88"
|
||||
gradientTransform="translate(-576.62 46.759)"
|
||||
y1="471.14"
|
||||
x1="165.43"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient3811"
|
||||
>
|
||||
<stop
|
||||
id="stop3813"
|
||||
stop-color="#b3b3b3"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop3815"
|
||||
stop-color="#e6e6e6"
|
||||
offset=".56701"
|
||||
/>
|
||||
<stop
|
||||
id="stop3817"
|
||||
stop-color="#e6e6e6"
|
||||
offset=".84064"
|
||||
/>
|
||||
<stop
|
||||
id="stop3819"
|
||||
stop-color="#b3b3b3"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient4093"
|
||||
y2="471.14"
|
||||
xlink:href="#linearGradient3821"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="152.88"
|
||||
gradientTransform="translate(-546 46.759)"
|
||||
y1="471.14"
|
||||
x1="165.43"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient3821"
|
||||
>
|
||||
<stop
|
||||
id="stop3823"
|
||||
stop-color="#b3b3b3"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop3825"
|
||||
stop-color="#e6e6e6"
|
||||
offset=".43083"
|
||||
/>
|
||||
<stop
|
||||
id="stop3827"
|
||||
stop-color="#e6e6e6"
|
||||
offset=".74779"
|
||||
/>
|
||||
<stop
|
||||
id="stop3829"
|
||||
stop-color="#b3b3b3"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient4238"
|
||||
y2="471.14"
|
||||
xlink:href="#linearGradient3821"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="152.88"
|
||||
gradientTransform="translate(196.86 46.759)"
|
||||
y1="471.14"
|
||||
x1="165.43"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient4241"
|
||||
y2="471.14"
|
||||
xlink:href="#linearGradient3811"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="152.88"
|
||||
gradientTransform="translate(166.24 46.759)"
|
||||
y1="471.14"
|
||||
x1="165.43"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient3809"
|
||||
y2="471.14"
|
||||
xlink:href="#linearGradient3811"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="152.88"
|
||||
gradientTransform="translate(-8.3462)"
|
||||
y1="471.14"
|
||||
x1="165.43"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient3857"
|
||||
y2="471.14"
|
||||
xlink:href="#linearGradient3821"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="152.88"
|
||||
gradientTransform="translate(22.271)"
|
||||
y1="471.14"
|
||||
x1="165.43"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient3855"
|
||||
y2="471.14"
|
||||
xlink:href="#linearGradient3811"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="152.88"
|
||||
gradientTransform="translate(-402.03)"
|
||||
y1="471.14"
|
||||
x1="165.43"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient3852"
|
||||
y2="471.14"
|
||||
xlink:href="#linearGradient3821"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="152.88"
|
||||
gradientTransform="translate(-371.41)"
|
||||
y1="471.14"
|
||||
x1="165.43"
|
||||
/>
|
||||
<linearGradient
|
||||
id="linearGradient3380"
|
||||
y2="471.14"
|
||||
xlink:href="#linearGradient3865"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y1="471.14"
|
||||
gradientTransform="translate(172.19 46.759)"
|
||||
x2="264.79"
|
||||
x1="133.68"
|
||||
/>
|
||||
</defs
|
||||
>
|
||||
<g
|
||||
id="layer1"
|
||||
transform="translate(-221.34 -158.91)"
|
||||
>
|
||||
<rect
|
||||
id="rect2985"
|
||||
fill-rule="evenodd"
|
||||
rx="0"
|
||||
ry="0"
|
||||
height="441.07"
|
||||
width="131.11"
|
||||
y="297.37"
|
||||
x="305.87"
|
||||
fill="url(#linearGradient3380)"
|
||||
/>
|
||||
<g
|
||||
id="g3859"
|
||||
fill-rule="evenodd"
|
||||
transform="translate(174.59 46.759)"
|
||||
>
|
||||
<rect
|
||||
id="rect3757"
|
||||
rx="3.1024"
|
||||
ry="10.645"
|
||||
height="441.07"
|
||||
width="12.504"
|
||||
y="250.61"
|
||||
x="144.66"
|
||||
fill="url(#linearGradient3809)"
|
||||
/>
|
||||
<rect
|
||||
id="rect3773"
|
||||
rx="3.1024"
|
||||
ry="10.645"
|
||||
height="441.07"
|
||||
width="12.504"
|
||||
y="250.61"
|
||||
x="175.28"
|
||||
fill="url(#linearGradient3857)"
|
||||
/>
|
||||
<rect
|
||||
id="rect3831"
|
||||
ry="10.645"
|
||||
rx="3.1024"
|
||||
transform="scale(-1,1)"
|
||||
height="441.07"
|
||||
width="12.504"
|
||||
y="250.61"
|
||||
x="-249.02"
|
||||
fill="url(#linearGradient3855)"
|
||||
/>
|
||||
<rect
|
||||
id="rect3833"
|
||||
ry="10.645"
|
||||
rx="3.1024"
|
||||
transform="scale(-1,1)"
|
||||
height="441.07"
|
||||
width="12.504"
|
||||
y="250.61"
|
||||
x="-218.4"
|
||||
fill="url(#linearGradient3852)"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
<rect
|
||||
id="rect4133"
|
||||
fill-rule="evenodd"
|
||||
height="34.57"
|
||||
width="220.04"
|
||||
y="768.39"
|
||||
x="261.66"
|
||||
fill="#f2f2f2"
|
||||
/>
|
||||
<rect
|
||||
id="rect4173"
|
||||
fill-rule="evenodd"
|
||||
rx="3.1024"
|
||||
ry="10.645"
|
||||
height="441.07"
|
||||
width="12.504"
|
||||
y="297.37"
|
||||
x="319.25"
|
||||
fill="url(#linearGradient4241)"
|
||||
/>
|
||||
<rect
|
||||
id="rect4175"
|
||||
fill-rule="evenodd"
|
||||
rx="3.1024"
|
||||
ry="10.645"
|
||||
height="441.07"
|
||||
width="12.504"
|
||||
y="297.37"
|
||||
x="349.87"
|
||||
fill="url(#linearGradient4238)"
|
||||
/>
|
||||
<rect
|
||||
id="rect4177"
|
||||
ry="10.645"
|
||||
fill-rule="evenodd"
|
||||
rx="3.1024"
|
||||
transform="scale(-1,1)"
|
||||
height="441.07"
|
||||
width="12.504"
|
||||
y="297.37"
|
||||
x="-423.61"
|
||||
fill="url(#linearGradient4091)"
|
||||
/>
|
||||
<rect
|
||||
id="rect4179"
|
||||
ry="10.645"
|
||||
fill-rule="evenodd"
|
||||
rx="3.1024"
|
||||
transform="scale(-1,1)"
|
||||
height="441.07"
|
||||
width="12.504"
|
||||
y="297.37"
|
||||
x="-392.99"
|
||||
fill="url(#linearGradient4093)"
|
||||
/>
|
||||
<rect
|
||||
id="rect10747"
|
||||
transform="scale(-1,1)"
|
||||
fill-rule="evenodd"
|
||||
rx="3.1024"
|
||||
ry="10.645"
|
||||
height="441.07"
|
||||
width="12.504"
|
||||
y="297.37"
|
||||
x="-423.61"
|
||||
fill="url(#linearGradient4091)"
|
||||
/>
|
||||
<path
|
||||
id="path4117"
|
||||
d="m305.62 738.51 131.13-0.0722"
|
||||
filter="url(#filter4113)"
|
||||
stroke="#000"
|
||||
stroke-width="1px"
|
||||
fill="none"
|
||||
/>
|
||||
<rect
|
||||
id="rect4003"
|
||||
fill-rule="evenodd"
|
||||
ry="6.5891"
|
||||
height="13.178"
|
||||
width="166.05"
|
||||
y="738.44"
|
||||
x="288.41"
|
||||
fill="url(#linearGradient4011)"
|
||||
/>
|
||||
<path
|
||||
id="rect4013"
|
||||
d="m298.12 751.62h146.61s-5.5 6.1177 0.375 11.137c5.875 5.0189 9.342 5.6366 9.342 5.6366l-166.05-0.00001s0.485-0.64878 7.9096-5.6374 1.8125-11.136 1.8125-11.136z"
|
||||
fill="url(#linearGradient4030)"
|
||||
fill-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
id="path4103"
|
||||
d="m305.87 300.37 131.13-0.0722"
|
||||
filter="url(#filter4113)"
|
||||
stroke="#000"
|
||||
stroke-width="1px"
|
||||
fill="none"
|
||||
/>
|
||||
<rect
|
||||
id="rect4095"
|
||||
transform="scale(-1)"
|
||||
fill-rule="evenodd"
|
||||
ry="6.5891"
|
||||
height="13.178"
|
||||
width="166.05"
|
||||
y="-300.3"
|
||||
x="-453.27"
|
||||
fill="url(#linearGradient4099)"
|
||||
/>
|
||||
<path
|
||||
id="path4097"
|
||||
d="m444.73 287.12h-146.61s5.5-6.1177-0.375-11.137c-5.875-5.0189-9.342-5.6366-9.342-5.6366l166.05 0.00001s-0.485 0.64878-7.9096 5.6374-1.8125 11.136-1.8125 11.136z"
|
||||
fill="url(#linearGradient4101)"
|
||||
fill-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
id="path4332"
|
||||
d="m306.62 275.71 131.13-0.0722"
|
||||
filter="url(#filter4113)"
|
||||
stroke="#000"
|
||||
stroke-width="1px"
|
||||
fill="none"
|
||||
/>
|
||||
<path
|
||||
id="rect4221"
|
||||
d="m226.21 212.96 14.159-31.822 38.532-18.096 176.32 1.3038 38.604 16.139 22.546 40.558-6.4918 29.859-17.492 24.612-235.94 0.30278-28.285-30.495z"
|
||||
fill="#e6e6e6"
|
||||
fill-rule="evenodd"
|
||||
/>
|
||||
<path
|
||||
id="path3985"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
d="m457.07 52.487c-25.4-1.097-140.26-1.613-162.83-0.298 2.1188 1.0912-2.0799 7.4488-2.5298 5.1085 17.65 0.1962 141.9 0.12749 163.59 1.0644 4.5318-0.18264 5.3142-5.6141 1.7718-5.8742z"
|
||||
transform="matrix(1.0536 0 0 .60052 -24.475 135.78)"
|
||||
filter="url(#filter3996)"
|
||||
fill="#BBB"
|
||||
/>
|
||||
<g
|
||||
id="g4182"
|
||||
transform="matrix(1.2991 0 0 1.2991 -238.81 66.092)"
|
||||
>
|
||||
<path
|
||||
id="path3127"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
d="m470.62 56.031c-25.407-1.0974-48.956 17.774-51.094 43.688-1.9119 23.171 15.045 45.318 38.875 47.031 20.196 1.4516 39.472-13.408 40.688-34.281 1.0078-17.303-27.346-29.622-29.994-29.622-13.226 0-28.216 5.4627-28.444 20.685-0.17655 11.787 8.9789 23.032 21.531 22.75 9.1862-0.20623 18.06-7.6345 17.219-17.656-0.28271-3.3674-1.8434-6.5281-4.2812-8.8438-2.4453-2.3228-6.0679-3.8198-9.9375-3.0312-1.546 0.3275-2.6673 2.0094-2.375 3.5625l0.1875 1c0.29786 1.5936 2.0368 2.7629 3.625 2.4375 1.4246-0.29032 2.5071 0.12559 3.625 1.1875 1.0945 1.0397 1.9052 2.7803 2.0312 4.2812 0.45617 5.4336-4.781 9.8147-10.25 9.9375-8.1309 0.18253-14.37-7.4976-14.25-15.531 0.16316-10.893 10.433-19.024 21.156-18.594 13.743 0.55183 23.819 13.48 23.031 27-0.97088 16.669-16.663 28.772-33.062 27.594-19.664-1.4133-33.847-19.955-32.25-39.312 1.8071-21.901 21.964-38.093 43.656-37.156 1.584 0.0676 3.0919-1.2924 3.1875-2.875l0.0625-1c0.10085-1.624-1.3116-3.1867-2.9375-3.25z"
|
||||
clip-path="url(#clipPath4178)"
|
||||
transform="matrix(1.0536 0 0 1.0536 -89.357 12.436)"
|
||||
filter="url(#filter10847)"
|
||||
fill="#BBB"
|
||||
/>
|
||||
<path
|
||||
id="path4121"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
d="m470.62 56.031c-25.407-1.0974-48.956 17.774-51.094 43.688-1.9119 23.171 15.045 45.318 38.875 47.031 20.196 1.4516 39.472-13.408 40.688-34.281 1.0078-17.303-28.823-33.561-30.671-33.561-14.506 0-27.539 9.401-27.767 24.623-0.17655 11.787 8.9789 23.032 21.531 22.75 9.1862-0.20623 18.06-7.6345 17.219-17.656-0.28271-3.3674-1.8434-6.5281-4.2812-8.8438-2.4453-2.3228-6.0679-3.8198-9.9375-3.0312-1.546 0.3275-2.6673 2.0094-2.375 3.5625l0.1875 1c0.29786 1.5936 2.0368 2.7629 3.625 2.4375 1.4246-0.29032 2.5071 0.12559 3.625 1.1875 1.0945 1.0397 1.9052 2.7803 2.0312 4.2812 0.45617 5.4336-4.781 9.8147-10.25 9.9375-8.1309 0.18253-14.37-7.4976-14.25-15.531 0.16316-10.893 10.433-19.024 21.156-18.594 13.743 0.55183 23.819 13.48 23.031 27-0.97088 16.669-16.663 28.772-33.062 27.594-19.664-1.4133-33.847-19.955-32.25-39.312 1.8071-21.901 21.964-38.093 43.656-37.156 1.584 0.0676 0.12584-1.2924 0.22146-2.875l0.0625-1c0.10085-1.624 1.6544-3.1867 0.0285-3.25z"
|
||||
clip-path="url(#clipPath4174)"
|
||||
transform="matrix(1.0536 0 0 1.0536 -86.127 12.456)"
|
||||
filter="url(#filter10867)"
|
||||
fill="#BBB"
|
||||
/>
|
||||
<path
|
||||
id="path4125"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
d="m470.62 56.031c-25.407-1.0974-48.956 17.774-51.094 43.688-1.9119 23.171 15.045 45.318 38.875 47.031 20.196 1.4516 39.472-13.408 40.688-34.281 1.0078-17.303-11.873-33.84-29.875-34.562-14.494-0.58199-28.334 10.403-28.562 25.625-0.17655 11.787 8.9789 23.032 21.531 22.75 9.1862-0.20623 18.06-7.6345 17.219-17.656-0.28271-3.3674-1.8434-6.5281-4.2812-8.8438-2.4453-2.3228-6.0679-3.8198-9.9375-3.0312a3.0625 3.0625 0 0 0 -2.375 3.5625l0.1875 1a3.0625 3.0625 0 0 0 3.625 2.4375c1.4246-0.29032 2.5071 0.12559 3.625 1.1875 1.0945 1.0397 1.9052 2.7803 2.0312 4.2812 0.45617 5.4336-4.781 9.8147-10.25 9.9375-8.1309 0.18253-14.37-7.4976-14.25-15.531 0.16316-10.893 10.433-19.024 21.156-18.594 13.743 0.55183 23.819 13.48 23.031 27-0.97088 16.669-16.663 28.772-33.062 27.594-19.664-1.4133-33.847-19.955-32.25-39.312 1.8071-21.901 21.964-38.093 43.656-37.156a3.0625 3.0625 0 0 0 3.1875 -2.875l0.0625-1a3.0625 3.0625 0 0 0 -2.9375 -3.25z"
|
||||
clip-path="url(#clipPath4170)"
|
||||
transform="matrix(1.0536 0 0 1.0536 -87.665 12.456)"
|
||||
fill="#f2f2f2"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
<g
|
||||
id="g4187"
|
||||
transform="matrix(-1.2991 0 0 1.2991 981.67 66.092)"
|
||||
>
|
||||
<path
|
||||
id="path4189"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
d="m470.62 56.031c-25.407-1.0974-48.956 17.774-51.094 43.688-1.9119 23.171 15.045 45.318 38.875 47.031 20.196 1.4516 39.472-13.408 40.688-34.281 1.0078-17.303-27.346-29.622-29.994-29.622-13.226 0-28.216 5.4627-28.444 20.685-0.17655 11.787 8.9789 23.032 21.531 22.75 9.1862-0.20623 18.06-7.6345 17.219-17.656-0.28271-3.3674-1.8434-6.5281-4.2812-8.8438-2.4453-2.3228-6.0679-3.8198-9.9375-3.0312-1.546 0.3275-2.6673 2.0094-2.375 3.5625l0.1875 1c0.29786 1.5936 2.0368 2.7629 3.625 2.4375 1.4246-0.29032 2.5071 0.12559 3.625 1.1875 1.0945 1.0397 1.9052 2.7803 2.0312 4.2812 0.45617 5.4336-4.781 9.8147-10.25 9.9375-8.1309 0.18253-14.37-7.4976-14.25-15.531 0.16316-10.893 10.433-19.024 21.156-18.594 13.743 0.55183 23.819 13.48 23.031 27-0.97088 16.669-16.663 28.772-33.062 27.594-19.664-1.4133-33.847-19.955-32.25-39.312 1.8071-21.901 21.964-38.093 43.656-37.156 1.584 0.0676 3.0919-1.2924 3.1875-2.875l0.0625-1c0.10085-1.624-1.3116-3.1867-2.9375-3.25z"
|
||||
clip-path="url(#clipPath4178)"
|
||||
transform="matrix(1.0536 0 0 1.0536 -89.357 12.436)"
|
||||
filter="url(#filter10847)"
|
||||
fill="#BBB"
|
||||
/>
|
||||
<path
|
||||
id="path4191"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
d="m470.62 56.031c-25.407-1.0974-48.956 17.774-51.094 43.688-1.9119 23.171 15.045 45.318 38.875 47.031 20.196 1.4516 39.472-13.408 40.688-34.281 1.0078-17.303-28.823-33.561-30.671-33.561-14.506 0-27.539 9.401-27.767 24.623-0.17655 11.787 8.9789 23.032 21.531 22.75 9.1862-0.20623 18.06-7.6345 17.219-17.656-0.28271-3.3674-1.8434-6.5281-4.2812-8.8438-2.4453-2.3228-6.0679-3.8198-9.9375-3.0312-1.546 0.3275-2.6673 2.0094-2.375 3.5625l0.1875 1c0.29786 1.5936 2.0368 2.7629 3.625 2.4375 1.4246-0.29032 2.5071 0.12559 3.625 1.1875 1.0945 1.0397 1.9052 2.7803 2.0312 4.2812 0.45617 5.4336-4.781 9.8147-10.25 9.9375-8.1309 0.18253-14.37-7.4976-14.25-15.531 0.16316-10.893 10.433-19.024 21.156-18.594 13.743 0.55183 23.819 13.48 23.031 27-0.97088 16.669-16.663 28.772-33.062 27.594-19.664-1.4133-33.847-19.955-32.25-39.312 1.8071-21.901 21.964-38.093 43.656-37.156 1.584 0.0676 0.12584-1.2924 0.22146-2.875l0.0625-1c0.10085-1.624 1.6544-3.1867 0.0285-3.25z"
|
||||
clip-path="url(#clipPath4174)"
|
||||
transform="matrix(1.0536 0 0 1.0536 -86.127 12.456)"
|
||||
filter="url(#filter10867)"
|
||||
fill="#BBB"
|
||||
/>
|
||||
<path
|
||||
id="path4193"
|
||||
style="block-progression:tb;color:#000000;text-transform:none;text-indent:0"
|
||||
d="m470.62 56.031c-25.407-1.0974-48.956 17.774-51.094 43.688-1.9119 23.171 15.045 45.318 38.875 47.031 20.196 1.4516 39.472-13.408 40.688-34.281 1.0078-17.303-11.873-33.84-29.875-34.562-14.494-0.58199-28.334 10.403-28.562 25.625-0.17655 11.787 8.9789 23.032 21.531 22.75 9.1862-0.20623 18.06-7.6345 17.219-17.656-0.28271-3.3674-1.8434-6.5281-4.2812-8.8438-2.4453-2.3228-6.0679-3.8198-9.9375-3.0312a3.0625 3.0625 0 0 0 -2.375 3.5625l0.1875 1a3.0625 3.0625 0 0 0 3.625 2.4375c1.4246-0.29032 2.5071 0.12559 3.625 1.1875 1.0945 1.0397 1.9052 2.7803 2.0312 4.2812 0.45617 5.4336-4.781 9.8147-10.25 9.9375-8.1309 0.18253-14.37-7.4976-14.25-15.531 0.16316-10.893 10.433-19.024 21.156-18.594 13.743 0.55183 23.819 13.48 23.031 27-0.97088 16.669-16.663 28.772-33.062 27.594-19.664-1.4133-33.847-19.955-32.25-39.312 1.8071-21.901 21.964-38.093 43.656-37.156a3.0625 3.0625 0 0 0 3.1875 -2.875l0.0625-1a3.0625 3.0625 0 0 0 -2.9375 -3.25z"
|
||||
clip-path="url(#clipPath4170)"
|
||||
transform="matrix(1.0536 0 0 1.0536 -87.665 12.456)"
|
||||
fill="#f2f2f2"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
<rect
|
||||
id="rect3951"
|
||||
fill-rule="evenodd"
|
||||
height="9.618"
|
||||
width="169.74"
|
||||
y="158.96"
|
||||
x="288.14"
|
||||
fill="#f2f2f2"
|
||||
/>
|
||||
<g
|
||||
id="g4323"
|
||||
fill-rule="evenodd"
|
||||
transform="translate(-47.728 20.121)"
|
||||
>
|
||||
<path
|
||||
id="path4247"
|
||||
fill="#999"
|
||||
d="m419.16 174.38c-19.4 0-35.125 15.725-35.125 35.125s15.725 35.125 35.125 35.125 35.125-15.725 35.125-35.125-15.725-35.125-35.125-35.125zm0 12.5c12.497 0 22.625 10.128 22.625 22.625s-10.128 22.625-22.625 22.625-22.625-10.128-22.625-22.625 10.128-22.625 22.625-22.625z"
|
||||
/>
|
||||
<path
|
||||
id="path4252"
|
||||
d="m231.22 209.49c0 15.23-12.347 27.577-27.577 27.577s-27.577-12.347-27.577-27.577 12.347-27.577 27.577-27.577 27.577 12.347 27.577 27.577z"
|
||||
fill="url(#radialGradient4328)"
|
||||
transform="matrix(.83864 0 0 .83864 248.37 33.803)"
|
||||
/>
|
||||
<path
|
||||
id="path4259"
|
||||
filter="url(#filter4319)"
|
||||
d="m419.16 176.16c-18.446 0-33.344 14.898-33.344 33.344s14.898 33.344 33.344 33.344 33.344-14.898 33.344-33.344-14.898-33.344-33.344-33.344zm0 8.9375c13.451 0 24.406 10.955 24.406 24.406s-10.955 24.406-24.406 24.406-24.406-10.955-24.406-24.406 10.955-24.406 24.406-24.406z"
|
||||
fill="#FFF"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
</g
|
||||
>
|
||||
<metadata
|
||||
>
|
||||
<rdf:RDF
|
||||
>
|
||||
<cc:Work
|
||||
>
|
||||
<dc:format
|
||||
>image/svg+xml</dc:format
|
||||
>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||
/>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
|
||||
/>
|
||||
<dc:publisher
|
||||
>
|
||||
<cc:Agent
|
||||
rdf:about="http://openclipart.org/"
|
||||
>
|
||||
<dc:title
|
||||
>Openclipart</dc:title
|
||||
>
|
||||
</cc:Agent
|
||||
>
|
||||
</dc:publisher
|
||||
>
|
||||
<dc:title
|
||||
>Antique pillar</dc:title
|
||||
>
|
||||
<dc:date
|
||||
>2013-05-08T10:46:42</dc:date
|
||||
>
|
||||
<dc:description
|
||||
>antique, pillar</dc:description
|
||||
>
|
||||
<dc:source
|
||||
>https://openclipart.org/detail/177883/antique-pillar-by-lfidnl-177883</dc:source
|
||||
>
|
||||
<dc:creator
|
||||
>
|
||||
<cc:Agent
|
||||
>
|
||||
<dc:title
|
||||
>LFIdnl</dc:title
|
||||
>
|
||||
</cc:Agent
|
||||
>
|
||||
</dc:creator
|
||||
>
|
||||
<dc:subject
|
||||
>
|
||||
<rdf:Bag
|
||||
>
|
||||
<rdf:li
|
||||
>antique</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>pillar</rdf:li
|
||||
>
|
||||
</rdf:Bag
|
||||
>
|
||||
</dc:subject
|
||||
>
|
||||
</cc:Work
|
||||
>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/publicdomain/"
|
||||
>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
|
||||
/>
|
||||
</cc:License
|
||||
>
|
||||
</rdf:RDF
|
||||
>
|
||||
</metadata
|
||||
>
|
||||
</svg
|
||||
>
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="134.485px" height="134.485px" viewBox="0 0 134.485 134.485" style="enable-background:new 0 0 134.485 134.485;"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M65.853,0C39.121,0,20.475,9.104,20.475,22.14c0,0.632,0.083,1.265,0.165,1.897c-0.11,0.412-0.165,0.853-0.165,1.32
|
||||
v93.562c0,1.485,0.605,2.915,1.678,3.96c1.21,1.184,12.761,11.606,44.911,11.606h0.357c32.149,0,43.701-10.425,44.912-11.606
|
||||
c1.071-1.045,1.678-2.475,1.678-3.96V25.357c0-0.386-0.028-0.771-0.11-1.128c0.082-0.55,0.11-1.1,0.11-1.65
|
||||
C114.038,7.921,89.202,0,65.853,0z M65.853,11.139c24.063,0,37.019,8.113,37.019,11.413c0,3.163-12.597,10.589-37.019,10.589
|
||||
c-22.799,0-34.24-7.041-34.24-11.001C31.612,18.179,43.053,11.139,65.853,11.139z M102.898,116.114
|
||||
c-3.74,2.338-14.136,7.233-35.45,7.233h-0.357c-21.122,0-31.683-4.951-35.45-7.262v-0.715c0.275-0.248,0.55-0.495,0.853-0.771
|
||||
c0.935-0.797,1.045-2.199,0.22-3.135c-0.302-0.33-0.688-0.521-1.072-0.633V37.266c8.058,4.4,19.994,7.013,34.24,7.013
|
||||
c13.503,0,27.611-2.31,37.018-7.178v72.469c-1.155-0.825-2.394-1.623-3.687-2.365c-1.071-0.605-2.42-0.221-3.024,0.854
|
||||
c-0.604,1.071-0.22,2.42,0.853,3.024c2.229,1.265,4.209,2.667,5.858,4.235v0.796H102.898z"/>
|
||||
<path d="M59.912,100.604c-2.75,0.191-5.445,0.521-7.976,0.99c-1.21,0.219-2.008,1.375-1.815,2.584
|
||||
c0.192,1.072,1.127,1.844,2.2,1.844c0.137,0,0.248,0,0.385-0.027c2.393-0.413,4.923-0.743,7.536-0.936
|
||||
c1.238-0.082,2.145-1.155,2.062-2.394C62.195,101.43,61.095,100.493,59.912,100.604z"/>
|
||||
<path d="M44.044,103.491c-2.723,0.853-5.28,1.897-7.591,3.106c-1.1,0.578-1.512,1.897-0.962,2.998
|
||||
c0.385,0.771,1.183,1.211,1.98,1.211c0.33,0,0.688-0.084,1.018-0.248c2.09-1.072,4.4-2.008,6.875-2.806
|
||||
c1.183-0.356,1.815-1.623,1.458-2.806C46.491,103.766,45.226,103.105,44.044,103.491z"/>
|
||||
<path d="M91.706,103.903c-2.449-0.825-5.089-1.54-7.839-2.091c-1.21-0.248-2.364,0.551-2.612,1.761s0.551,2.364,1.761,2.612
|
||||
c2.558,0.496,5.005,1.155,7.261,1.926c0.247,0.083,0.494,0.109,0.715,0.109c0.936,0,1.787-0.578,2.117-1.513
|
||||
C93.492,105.555,92.86,104.288,91.706,103.903z"/>
|
||||
<path d="M76.084,100.107c-2.559-0.247-5.31-0.329-8.114-0.219c-1.237,0.055-2.2,1.071-2.145,2.31
|
||||
c0.055,1.237,1.073,2.2,2.31,2.146c2.613-0.082,5.143-0.027,7.508,0.221c0.248,0.026,0.495,0,0.743-0.055
|
||||
c0.906-0.222,1.621-0.964,1.705-1.953C78.202,101.318,77.321,100.219,76.084,100.107z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 2.8 KiB |
@@ -1,189 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
id="svg4206"
|
||||
sodipodi:docname="_svgclean2.svg"
|
||||
viewBox="0 0 313.57 499.87"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.3.1 r9886"
|
||||
>
|
||||
<defs
|
||||
id="defs4208"
|
||||
>
|
||||
<radialGradient
|
||||
id="radialGradient3916"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cy="315.54"
|
||||
cx="258.26"
|
||||
gradientTransform="matrix(-.8861 .30979 -.33003 -.94397 705.84 424.5)"
|
||||
r="156.79"
|
||||
inkscape:collect="always"
|
||||
>
|
||||
<stop
|
||||
id="stop3767"
|
||||
style="stop-color:#63798f"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop3769"
|
||||
style="stop-color:#95b8d9"
|
||||
offset="1"
|
||||
/>
|
||||
</radialGradient
|
||||
>
|
||||
<linearGradient
|
||||
id="linearGradient3918"
|
||||
y2="206.65"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x2="372.86"
|
||||
y1="426.65"
|
||||
x1="263.21"
|
||||
inkscape:collect="always"
|
||||
>
|
||||
<stop
|
||||
id="stop3757"
|
||||
style="stop-color:#4d5e6e"
|
||||
offset="0"
|
||||
/>
|
||||
<stop
|
||||
id="stop3759"
|
||||
style="stop-color:#95b8d9"
|
||||
offset="1"
|
||||
/>
|
||||
</linearGradient
|
||||
>
|
||||
<filter
|
||||
id="filter3852"
|
||||
width="1.2618"
|
||||
y="-1.44"
|
||||
x="-.13091"
|
||||
height="3.88"
|
||||
color-interpolation-filters="sRGB"
|
||||
inkscape:collect="always"
|
||||
>
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur3854"
|
||||
stdDeviation="12"
|
||||
inkscape:collect="always"
|
||||
/>
|
||||
</filter
|
||||
>
|
||||
</defs
|
||||
>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
bordercolor="#666666"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-y="0"
|
||||
pagecolor="#ffffff"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-height="645"
|
||||
showgrid="false"
|
||||
borderopacity="1.0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:cx="156.78568"
|
||||
inkscape:cy="249.93782"
|
||||
inkscape:window-width="674"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:document-units="px"
|
||||
/>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-218.21 -282.43)"
|
||||
>
|
||||
<g
|
||||
id="g4259"
|
||||
>
|
||||
<g
|
||||
id="g3856"
|
||||
transform="translate(55,141.14)"
|
||||
>
|
||||
<path
|
||||
id="path3858"
|
||||
d="m266.67 442.36 53.333 160 53.333-160z"
|
||||
style="fill:#4d5e6e"
|
||||
inkscape:connector-curvature="0"
|
||||
/>
|
||||
<path
|
||||
id="path3860"
|
||||
sodipodi:rx="134.28572"
|
||||
sodipodi:ry="134.28572"
|
||||
style="stroke:url(#linearGradient3918);stroke-width:45;fill:url(#radialGradient3916)"
|
||||
sodipodi:type="arc"
|
||||
d="m462.86 289.51c0 74.164-60.122 134.29-134.29 134.29-74.164 0-134.29-60.122-134.29-134.29 0-74.164 60.122-134.29 134.29-134.29 74.164 0 134.29 60.122 134.29 134.29z"
|
||||
transform="translate(-8.5714,8.5714)"
|
||||
sodipodi:cy="289.50504"
|
||||
sodipodi:cx="328.57144"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
<path
|
||||
id="path3866"
|
||||
style="opacity:.85357;filter:url(#filter3852);fill:#000000"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m275 733.5h220l-120 20z"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
</g
|
||||
>
|
||||
<metadata
|
||||
id="metadata19"
|
||||
>
|
||||
<rdf:RDF
|
||||
>
|
||||
<cc:Work
|
||||
>
|
||||
<dc:format
|
||||
>image/svg+xml</dc:format
|
||||
>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||
/>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
|
||||
/>
|
||||
<dc:publisher
|
||||
>
|
||||
<cc:Agent
|
||||
rdf:about="http://openclipart.org/"
|
||||
>
|
||||
<dc:title
|
||||
>Openclipart</dc:title
|
||||
>
|
||||
</cc:Agent
|
||||
>
|
||||
</dc:publisher
|
||||
>
|
||||
</cc:Work
|
||||
>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/publicdomain/"
|
||||
>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
|
||||
/>
|
||||
</cc:License
|
||||
>
|
||||
</rdf:RDF
|
||||
>
|
||||
</metadata
|
||||
>
|
||||
</svg
|
||||
>
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path style="fill:#010002;" d="M26,3c-2.748,0-5.499-2.509-9.018-2.163C16.936,0.555,16.745,0,16,0c-1,0-1,1-1,1v24c0,0,0,1,1,1
|
||||
s1-1,1-1V14.836C20.51,14.499,23.256,17,26,17c3,0,6-2,6-2V1C32,1,29,3,26,3z"/>
|
||||
<path style="fill:#010002;" d="M19,22.049v1.034c6.289,0.344,11,1.742,11,3.417c0,1.934-6.27,3.5-14,3.5c-7.731,0-14-1.566-14-3.5
|
||||
c0-1.675,4.711-3.074,11-3.417v-1.034c-7.4,0.441-13,2.479-13,4.93C0,29.752,7.164,32,16,32c8.837,0,16-2.248,16-5.021
|
||||
C32,24.527,26.4,22.49,19,22.049z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 1.0 KiB |
167
res/icons/stair.svg
Normal file
@@ -0,0 +1,167 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:ns1="http://sozi.baierouge.fr"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
id="svg1395"
|
||||
sodipodi:docname="aiga_stairs_up_.svg"
|
||||
inkscape:export-filename="/home/joanna/gfx/vector/aiga/aiga_stairs_up_.png"
|
||||
viewBox="0 0 439.75 365.14"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:export-xdpi="49.323254"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
inkscape:export-ydpi="49.323254"
|
||||
inkscape:version="0.46"
|
||||
sodipodi:docbase="/datas/Projs/Cliparts Stocker/tmp/AIGA"
|
||||
>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
bordercolor="#666666"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="641"
|
||||
pagecolor="#ffffff"
|
||||
inkscape:zoom="0.43415836"
|
||||
inkscape:window-x="0"
|
||||
showgrid="false"
|
||||
borderopacity="1.0"
|
||||
inkscape:current-layer="svg1395"
|
||||
inkscape:cx="305.25953"
|
||||
inkscape:cy="417.84947"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-height="715"
|
||||
inkscape:pageopacity="0.0"
|
||||
/>
|
||||
<g
|
||||
id="g1405"
|
||||
>
|
||||
<path
|
||||
id="path1407"
|
||||
style="fill:#000000"
|
||||
d="m0 323.97h80.05v-81.47h79.53v-82.03h80.79v-80.496h80.24v-79.974h119.14v40.804h-79.2v80.276h-80.33v81.41h-80.17v80.98h-80.5v81.67h-119.55v-41.17z"
|
||||
/>
|
||||
<path
|
||||
id="path1409"
|
||||
style="fill:#000000"
|
||||
d="m358.84 237.89h-70.79c-19.5 0-20.25 30 0 30h36.29l-69.02 69.01c-15.29 15.3 6.34 37.44 22.6 21.18l67.98-68.17v35.92c-0.1 19.5 30.15 20.25 30.2 0v-70.36c0-10.5-7.05-17.58-17.26-17.58z"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
<metadata
|
||||
>
|
||||
<rdf:RDF
|
||||
>
|
||||
<cc:Work
|
||||
>
|
||||
<dc:format
|
||||
>image/svg+xml</dc:format
|
||||
>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||
/>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
|
||||
/>
|
||||
<dc:publisher
|
||||
>
|
||||
<cc:Agent
|
||||
rdf:about="http://openclipart.org/"
|
||||
>
|
||||
<dc:title
|
||||
>Openclipart</dc:title
|
||||
>
|
||||
</cc:Agent
|
||||
>
|
||||
</dc:publisher
|
||||
>
|
||||
<dc:title
|
||||
>aiga stairs up</dc:title
|
||||
>
|
||||
<dc:date
|
||||
>2009-04-19T07:19:44</dc:date
|
||||
>
|
||||
<dc:description
|
||||
>Set of international airport symbols. \n \nSource: http://www.aiga.org/content.cfm/symbol-signs \n \nConverted to SVG by Jean-Victor Balin.</dc:description
|
||||
>
|
||||
<dc:source
|
||||
>https://openclipart.org/detail/25072/aiga-stairs-up-by-anonymous-25072</dc:source
|
||||
>
|
||||
<dc:creator
|
||||
>
|
||||
<cc:Agent
|
||||
>
|
||||
<dc:title
|
||||
>Anonymous</dc:title
|
||||
>
|
||||
</cc:Agent
|
||||
>
|
||||
</dc:creator
|
||||
>
|
||||
<dc:subject
|
||||
>
|
||||
<rdf:Bag
|
||||
>
|
||||
<rdf:li
|
||||
>aiga</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>aiga no bg</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>arrow</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>black and white</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>externalsource</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>icon</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>map symbol</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>sign</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>silhouette</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>stairs</rdf:li
|
||||
>
|
||||
<rdf:li
|
||||
>symbol</rdf:li
|
||||
>
|
||||
</rdf:Bag
|
||||
>
|
||||
</dc:subject
|
||||
>
|
||||
</cc:Work
|
||||
>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/publicdomain/"
|
||||
>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
|
||||
/>
|
||||
</cc:License
|
||||
>
|
||||
</rdf:RDF
|
||||
>
|
||||
</metadata
|
||||
>
|
||||
</svg
|
||||
>
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
@@ -1,117 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:svg="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:ns1="http://sozi.baierouge.fr" xmlns:xlink="http://www.w3.org/1999/xlink" id="svg2" viewBox="0 0 271.02 309.62" version="1.1" inkscape:version="0.91 r13725">
|
||||
<g id="g3542" transform="translate(-25.674 -14.91)">
|
||||
<g id="g7986" transform="matrix(-.11758 .20365 .20365 .11758 482.75 214.33)">
|
||||
<rect id="use5590-4" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="704.27" x="971.47"/>
|
||||
<rect id="use5592-0" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="784.5" x="1087.5"/>
|
||||
<rect id="use5606-4" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="543.82" x="971.47"/>
|
||||
<rect id="use5608-8" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="624.05" x="1087.5"/>
|
||||
<rect id="use5610-8" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="704.27" x="1203.5"/>
|
||||
<rect id="use5612-2" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="784.5" x="1319.5"/>
|
||||
<rect id="use5622-5" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="383.36" x="971.47"/>
|
||||
<rect id="use5624-5" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="463.59" x="1087.5"/>
|
||||
<rect id="use5626-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="543.82" x="1203.5"/>
|
||||
<rect id="use5628-7" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="624.05" x="1319.5"/>
|
||||
<rect id="use5630-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="704.27" x="1435.5"/>
|
||||
<rect id="use5632-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="784.5" x="1551.5"/>
|
||||
<rect id="use5638-2" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="222.9" x="971.47"/>
|
||||
<rect id="use5640-7" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="303.13" x="1087.5"/>
|
||||
<rect id="use5642-6" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="383.36" x="1203.5"/>
|
||||
<rect id="use5644-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="463.59" x="1319.5"/>
|
||||
<rect id="use5646-4" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="543.82" x="1435.5"/>
|
||||
<rect id="use5648-2" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="624.05" x="1551.5"/>
|
||||
<rect id="use5650-3" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="704.27" x="1667.5"/>
|
||||
<rect id="use5652-2" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="784.5" x="1783.5"/>
|
||||
<rect id="use5654-2" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="62.446" x="971.47"/>
|
||||
<rect id="use5656-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="142.67" x="1087.5"/>
|
||||
<rect id="use5658-6" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="222.9" x="1203.5"/>
|
||||
<rect id="use5660-8" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="303.13" x="1319.5"/>
|
||||
<rect id="use5662-5" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="383.36" x="1435.5"/>
|
||||
<rect id="use5664-7" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="463.59" x="1551.5"/>
|
||||
<rect id="use5666-6" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="543.82" x="1667.5"/>
|
||||
<rect id="use5668-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="624.05" x="1783.5"/>
|
||||
<rect id="use5670-8" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="704.27" x="1899.5"/>
|
||||
<rect id="use5674-9" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="62.446" x="1203.5"/>
|
||||
<rect id="use5676-2" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="142.67" x="1319.5"/>
|
||||
<rect id="use5678-7" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="222.9" x="1435.5"/>
|
||||
<rect id="use5680-9" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="303.13" x="1551.5"/>
|
||||
<rect id="use5682-5" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="383.36" x="1667.5"/>
|
||||
<rect id="use5684-4" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="463.59" x="1783.5"/>
|
||||
<rect id="use5686-3" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="543.82" x="1899.5"/>
|
||||
<rect id="use5694-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="62.446" x="1435.5"/>
|
||||
<rect id="use5696-2" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="142.67" x="1551.5"/>
|
||||
<rect id="use5698-3" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="222.9" x="1667.5"/>
|
||||
<rect id="use5700-3" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="303.13" x="1783.5"/>
|
||||
<rect id="use5702-4" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="383.36" x="1899.5"/>
|
||||
<rect id="use5714-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="62.446" x="1667.5"/>
|
||||
<rect id="use5716-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="142.67" x="1783.5"/>
|
||||
<rect id="use5718-3" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="222.9" x="1899.5"/>
|
||||
<rect id="use5734-8" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="223.08" y="62.446" x="1899.5"/>
|
||||
<rect id="use5554-5" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.45" y="784.81" x="2015.1"/>
|
||||
<rect id="use5554-5-8" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.48" y="624.07" x="2015.1"/>
|
||||
<rect id="use5554-5-4" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.48" y="463.62" x="2015.1"/>
|
||||
<rect id="use5554-5-4-0" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.48" y="303.37" x="2015.1"/>
|
||||
<rect id="use5554-5-4-7" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.48" y="142.62" x="2015.1"/>
|
||||
<rect id="use5554-5-6" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.45" y="784.65" x="971.5"/>
|
||||
<rect id="use5554-5-8-3" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.48" y="623.91" x="971.47"/>
|
||||
<rect id="use5554-5-4-6" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.48" y="463.46" x="971.47"/>
|
||||
<rect id="use5554-5-4-0-1" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.48" y="303.21" x="971.47"/>
|
||||
<rect id="use5554-5-4-7-5" style="fill:#cc0000" transform="matrix(.10991 -.99394 .86603 0.5 0 0)" height="74.286" width="107.48" y="142.46" x="971.47"/>
|
||||
</g>
|
||||
<g id="g3460">
|
||||
<rect id="use5554-5-42" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.809" y="-333.6" x="316.94"/>
|
||||
<rect id="use5554-5-8-0" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.816" y="-371.4" x="316.94"/>
|
||||
<rect id="use5554-5-4-9" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.816" y="-409.13" x="316.94"/>
|
||||
<rect id="use5554-5-4-0-7" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.816" y="-446.81" x="316.94"/>
|
||||
<rect id="use5554-5-4-7-3" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.816" y="-484.61" x="316.94"/>
|
||||
<rect id="use5554-5-42-5" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.809" y="-314.79" x="316.96"/>
|
||||
<rect id="use5554-5-8-0-7" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.816" y="-352.59" x="316.95"/>
|
||||
<rect id="use5554-5-4-9-5" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.816" y="-390.32" x="316.95"/>
|
||||
<rect id="use5554-5-4-0-7-4" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.816" y="-428" x="316.95"/>
|
||||
<rect id="use5554-5-4-7-3-1" style="fill:#8f0000" transform="matrix(.86307 -.50509 0 -1 0 0)" height="17.469" width="26.816" y="-465.8" x="316.95"/>
|
||||
</g>
|
||||
<g id="g3266" transform="matrix(-1 0 0 1 322.45 0)">
|
||||
<path id="use5636-5-2" style="fill:#ff0000" d="m25.753 123.67 48.039-21.076 23.142 13.561-48.039 21.076z"/>
|
||||
<path id="use5636-5-2-07" style="fill:#ff0000" d="m75.714 101.75 48.036-21.08 23.15 13.561-48.044 21.079z"/>
|
||||
<path id="use5636-5-2-7" style="fill:#ff0000" d="m125.68 79.844 48.039-21.076 23.143 13.561-48.039 21.076z"/>
|
||||
<path id="use5636-5-2-3" style="fill:#ff0000" d="m175.63 57.906 48.04-21.076 23.15 13.562-48.04 21.076z"/>
|
||||
<path id="use5636-5-2-9" style="fill:#ff0000" d="m225.59 35.986 48.039-21.076 23.143 13.561-48.039 21.076z"/>
|
||||
</g>
|
||||
</g>
|
||||
<metadata>
|
||||
<rdf:RDF>
|
||||
<cc:Work>
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<cc:license rdf:resource="http://creativecommons.org/licenses/publicdomain/"/>
|
||||
<dc:publisher>
|
||||
<cc:Agent rdf:about="http://openclipart.org/">
|
||||
<dc:title>Openclipart</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
<dc:title>wall 2</dc:title>
|
||||
<dc:date>2013-01-21T11:03:01</dc:date>
|
||||
<dc:description/>
|
||||
<dc:source>https://openclipart.org/detail/174369/wall-2-by-jarda-174369</dc:source>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>jarda</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>brick</rdf:li>
|
||||
<rdf:li>bricks</rdf:li>
|
||||
<rdf:li>wall</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
</cc:Work>
|
||||
<cc:License rdf:about="http://creativecommons.org/licenses/publicdomain/">
|
||||
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction"/>
|
||||
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution"/>
|
||||
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks"/>
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 297 297" style="enable-background:new 0 0 297 297;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M167.959,224.87H69.036c-3.899,0-7.059,3.16-7.059,7.059v49.461c0,3.899,3.16,7.059,7.059,7.059h98.923
|
||||
c3.899,0,7.059-3.16,7.059-7.059V231.93C175.018,228.031,171.858,224.87,167.959,224.87z"/>
|
||||
<path d="M289.941,224.87h-98.924c-3.899,0-7.059,3.16-7.059,7.059v49.461c0,3.899,3.16,7.059,7.059,7.059h98.924
|
||||
c3.899,0,7.059-3.16,7.059-7.059V231.93C297,228.031,293.84,224.87,289.941,224.87z"/>
|
||||
<path d="M69.036,144.236h98.923c3.899,0,7.059-3.16,7.059-7.059v-49.46c0-3.899-3.16-7.059-7.059-7.059H69.036
|
||||
c-3.899,0-7.059,3.16-7.059,7.059v49.46C61.977,141.075,65.137,144.236,69.036,144.236z"/>
|
||||
<path d="M289.941,80.656h-98.924c-3.899,0-7.059,3.16-7.059,7.059v49.46c0,3.899,3.16,7.059,7.059,7.059h98.924
|
||||
c3.899,0,7.059-3.16,7.059-7.059v-49.46C297,83.817,293.84,80.656,289.941,80.656z"/>
|
||||
<path d="M128.508,72.129h98.924c3.899,0,7.059-3.16,7.059-7.059v-49.46c0-3.899-3.16-7.059-7.059-7.059h-98.924
|
||||
c-3.899,0-7.059,3.16-7.059,7.059v49.46C121.449,68.968,124.609,72.129,128.508,72.129z"/>
|
||||
<path d="M123.495,159.822v49.462c0,3.899,3.16,7.059,7.059,7.059h98.923c3.899,0,7.059-3.16,7.059-7.059v-49.462
|
||||
c0-3.899-3.16-7.059-7.059-7.059h-98.923C126.655,152.762,123.495,155.923,123.495,159.822z"/>
|
||||
<path d="M113.042,209.284v-49.462c0-3.899-3.16-7.059-7.059-7.059H7.059c-3.899,0-7.059,3.16-7.059,7.059v49.462
|
||||
c0,3.899,3.16,7.059,7.059,7.059h98.924C109.882,216.344,113.042,213.183,113.042,209.284z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 2.0 KiB |
@@ -1,126 +1,56 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
id="svg4427"
|
||||
inkscape:version="0.91pre3 r13670"
|
||||
viewBox="0 0 614.15501 507.70723"
|
||||
version="1.1"
|
||||
sodipodi:docname="_svgclean2.svg"
|
||||
>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
bordercolor="#666666"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-y="0"
|
||||
pagecolor="#ffffff"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:window-width="799"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-x="0"
|
||||
showgrid="false"
|
||||
borderopacity="1.0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:cx="319.22"
|
||||
inkscape:cy="256.67216"
|
||||
inkscape:window-height="645"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:document-units="px"
|
||||
/>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
transform="translate(-55.78 -281.36)"
|
||||
>
|
||||
<path
|
||||
id="path4391"
|
||||
d="m362.47 399.37c-80.452 0.30312-160.77 30.425-222.31 90.281l55.906 55.281c92.256-89.611 240.75-90.142 333.66-1.1562l55.781-55.813c-62.02-59.38-142.59-88.89-223.04-88.59zm-166.41 145.56-0.125 0.0937z"
|
||||
sodipodi:nodetypes="cccccccccc"
|
||||
style="color:#000000;fill:#000000"
|
||||
inkscape:connector-curvature="0"
|
||||
/>
|
||||
<path
|
||||
id="path4395"
|
||||
d="m362.37 281.37c-110.95 0.41801-221.72 41.957-306.59 124.5l55.469 54.844c138.94-134.56 362.26-135.24 502.03-1.375l56.656-55.781c-85.52-81.9-196.62-122.6-307.57-122.19zm-251.12 179.34-0.5625 0.53125z"
|
||||
sodipodi:nodetypes="sccccsccc"
|
||||
style="color:#000000;fill:#000000"
|
||||
inkscape:connector-curvature="0"
|
||||
/>
|
||||
<path
|
||||
id="path4381"
|
||||
d="m362.34 516.87c-50.088 0.18872-100.12 18.953-138.44 56.219l53.438 52.812c47.181-45.821 123.11-46.068 170.62-0.5625l53.219-53.312c-38.607-36.975-88.756-55.345-138.84-55.156zm-85 109.03-0.063 0.0625z"
|
||||
sodipodi:nodetypes="cccccccccc"
|
||||
style="color:#000000;fill:#000000"
|
||||
inkscape:connector-curvature="0"
|
||||
/>
|
||||
<path
|
||||
id="path4411"
|
||||
sodipodi:rx="78.5"
|
||||
sodipodi:ry="78.5"
|
||||
style="color:#000000;fill:#000000"
|
||||
sodipodi:type="arc"
|
||||
d="m780.99 634.37a78.5 78.5 0 0 1 -0.0574 -110.96 78.5 78.5 0 0 1 110.96 -0.17211 78.5 78.5 0 0 1 0.28684 110.96 78.5 78.5 0 0 1 -110.96 0.40159l55.28-55.74z"
|
||||
transform="translate(-473.55,131.71)"
|
||||
sodipodi:cy="578.86218"
|
||||
sodipodi:cx="836.5"
|
||||
sodipodi:end="2.3520582"
|
||||
sodipodi:start="2.3561945"
|
||||
/>
|
||||
</g
|
||||
>
|
||||
<metadata
|
||||
id="metadata9"
|
||||
>
|
||||
<rdf:RDF
|
||||
>
|
||||
<cc:Work
|
||||
>
|
||||
<dc:format
|
||||
>image/svg+xml</dc:format
|
||||
>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage"
|
||||
/>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/publicdomain/"
|
||||
/>
|
||||
<dc:publisher
|
||||
>
|
||||
<cc:Agent
|
||||
rdf:about="http://openclipart.org/"
|
||||
>
|
||||
<dc:title
|
||||
>Openclipart</dc:title
|
||||
>
|
||||
</cc:Agent
|
||||
>
|
||||
</dc:publisher
|
||||
>
|
||||
</cc:Work
|
||||
>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/publicdomain/"
|
||||
>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution"
|
||||
/>
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
|
||||
/>
|
||||
</cc:License
|
||||
>
|
||||
</rdf:RDF
|
||||
>
|
||||
</metadata
|
||||
>
|
||||
</svg
|
||||
>
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 494.45 494.45" style="enable-background:new 0 0 494.45 494.45;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M395.225,277.325c-6.8,0-13.5-2.6-18.7-7.8c-71.4-71.3-187.4-71.3-258.8,0c-10.3,10.3-27.1,10.3-37.4,0
|
||||
s-10.3-27.1,0-37.4c92-92,241.6-92,333.6,0c10.3,10.3,10.3,27.1,0,37.4C408.725,274.725,401.925,277.325,395.225,277.325z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M323.625,348.825c-6.8,0-13.5-2.6-18.7-7.8c-15.4-15.4-36-23.9-57.8-23.9s-42.4,8.5-57.8,23.9
|
||||
c-10.3,10.3-27.1,10.3-37.4,0c-10.3-10.3-10.3-27.1,0-37.4c25.4-25.4,59.2-39.4,95.2-39.4s69.8,14,95.2,39.5
|
||||
c10.3,10.3,10.3,27.1,0,37.4C337.225,346.225,330.425,348.825,323.625,348.825z"/>
|
||||
</g>
|
||||
<g>
|
||||
<circle cx="247.125" cy="398.925" r="35.3"/>
|
||||
</g>
|
||||
<g>
|
||||
<path d="M467.925,204.625c-6.8,0-13.5-2.6-18.7-7.8c-111.5-111.4-292.7-111.4-404.1,0c-10.3,10.3-27.1,10.3-37.4,0
|
||||
s-10.3-27.1,0-37.4c64-64,149-99.2,239.5-99.2s175.5,35.2,239.5,99.2c10.3,10.3,10.3,27.1,0,37.4
|
||||
C481.425,202.025,474.625,204.625,467.925,204.625z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 1.5 KiB |