Material: Material editor enhancements (#11764)

Continues the work of the material subsystem improvements.

Add support for embedded SVG files. These are not the same
as image files so need to be handled differently.

Add the ability to filter materials in the editor when called from
code. This allows programs to select objects supporting specific
models, complete models, older models, etc.

Updated tests, and refactored code.

New models and materials supporting patterns such as used by the
TechDraw workbench.

fixes #11686 - checks for the presense of a model property before
assinging a value. This can happen when a required model definition is
not available.

---------

Co-authored-by: Chris Hennes <chennes@pioneerlibrarysystem.org>
This commit is contained in:
David Carter
2024-01-06 19:11:53 -05:00
committed by GitHub
parent 08612d4489
commit d9017bcca3
87 changed files with 3894 additions and 655 deletions

View File

@@ -69,6 +69,8 @@ SET(Material_SRCS
FolderTree.h
MaterialConfigLoader.cpp
MaterialConfigLoader.h
MaterialFilter.cpp
MaterialFilter.h
MaterialLibrary.cpp
MaterialLibrary.h
MaterialLoader.cpp
@@ -103,7 +105,18 @@ endif(FREECAD_USE_PCH)
add_library(Material SHARED ${Material_SRCS})
target_link_libraries(Material ${Material_LIBS})
SET_BIN_DIR(Material Material /Mod/Material)
# SET_BIN_DIR(Material Material /Mod/Material)
SET_BIN_DIR(Material Material)
SET_PYTHON_PREFIX_SUFFIX(Material)
INSTALL(TARGETS Material DESTINATION ${CMAKE_INSTALL_LIBDIR})
# INSTALL(TARGETS Material DESTINATION ${CMAKE_INSTALL_LIBDIR})
if(WIN32)
INSTALL(TARGETS Material
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
else(WIN32)
INSTALL(TARGETS Material
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
endif(WIN32)

View File

@@ -0,0 +1,74 @@
/***************************************************************************
* Copyright (c) 2023 David Carter <dcarter@david.carter.ca> *
* *
* This file is part of FreeCAD. *
* *
* FreeCAD is free software: you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 2.1 of the *
* License, or (at your option) any later version. *
* *
* FreeCAD is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with FreeCAD. If not, see *
* <https://www.gnu.org/licenses/>. *
* *
**************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
#endif
#include <App/Application.h>
#include "MaterialFilter.h"
#include "Materials.h"
using namespace Materials;
TYPESYSTEM_SOURCE(Materials::MaterialFilter, Base::BaseClass)
MaterialFilter::MaterialFilter()
: _includeFolders(true)
, _includeLegacy(true)
, _required()
, _requiredComplete()
{}
bool MaterialFilter::modelIncluded(const std::shared_ptr<Material>& material) const
{
for (const auto& complete : _requiredComplete) {
if (!material->isModelComplete(complete)) {
return false;
}
}
for (const auto& required : _required) {
if (!material->hasModel(required)) {
return false;
}
}
return true;
}
void MaterialFilter::addRequired(const QString& uuid)
{
// Ignore any uuids already present
if (!_requiredComplete.contains(uuid)) {
_required.insert(uuid);
}
}
void MaterialFilter::addRequiredComplete(const QString& uuid)
{
if (_required.contains(uuid)) {
// Completeness takes priority
_required.remove(uuid);
}
_requiredComplete.insert(uuid);
}

View File

@@ -0,0 +1,96 @@
/***************************************************************************
* Copyright (c) 2023 David Carter <dcarter@david.carter.ca> *
* *
* This file is part of FreeCAD. *
* *
* FreeCAD is free software: you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 2.1 of the *
* License, or (at your option) any later version. *
* *
* FreeCAD is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with FreeCAD. If not, see *
* <https://www.gnu.org/licenses/>. *
* *
**************************************************************************/
#ifndef MATERIAL_MATERIALFILTER_H
#define MATERIAL_MATERIALFILTER_H
#include <memory>
#include <QSet>
#include <QString>
#include <Base/BaseClass.h>
#include <Mod/Material/MaterialGlobal.h>
namespace Materials
{
class Material;
/*
* This class is used to filter materials during a material tree search
*
*/
class MaterialsExport MaterialFilter: public Base::BaseClass
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
MaterialFilter();
virtual ~MaterialFilter() = default;
/* Indicates if we should include empty folders
*
* Default is to include empty folders
*/
bool includeEmptyFolders() const
{
return _includeFolders;
}
void setIncludeEmptyFolders(bool include)
{
_includeFolders = include;
}
/* Indicates if we should include materials in the older format
*
* Default is to include legacy format materials
*/
bool includeLegacy() const
{
return _includeLegacy;
}
void setIncludeLegacy(bool legacy)
{
_includeLegacy = legacy;
}
/* Sets of model UUIDs that should be included. Optionally, we can
* specify models that must contain values for all properties.
*
* Models only need to be included in one set.
*/
bool modelIncluded(const std::shared_ptr<Material>& material) const;
void addRequired(const QString& uuid);
void addRequiredComplete(const QString& uuid);
private:
bool _includeFolders;
bool _includeLegacy;
QSet<QString> _required;
QSet<QString> _requiredComplete;
};
} // namespace Materials
#endif // MATERIAL_MATERIALFILTER_H

View File

@@ -29,6 +29,7 @@
#include <App/Application.h>
#include "MaterialFilter.h"
#include "MaterialLibrary.h"
#include "MaterialLoader.h"
#include "MaterialManager.h"
@@ -264,8 +265,25 @@ QString MaterialLibrary::getUUIDFromPath(const QString& path) const
}
}
bool MaterialLibrary::materialInTree(const std::shared_ptr<Material>& material,
const MaterialFilter* filter) const
{
if (!filter) {
// If there's no filter we always include
return true;
}
// filter out old format files
if (material->isOldFormat() && !filter->includeLegacy()) {
return false;
}
// filter based on models
return filter->modelIncluded(material);
}
std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>>
MaterialLibrary::getMaterialTree() const
MaterialLibrary::getMaterialTree(const MaterialFilter* filter) const
{
std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>> materialTree =
std::make_shared<std::map<QString, std::shared_ptr<MaterialTreeNode>>>();
@@ -274,20 +292,50 @@ MaterialLibrary::getMaterialTree() const
auto filename = it.first;
auto material = it.second;
QStringList list = filename.split(QString::fromStdString("/"));
if (materialInTree(material, filter)) {
QStringList list = filename.split(QString::fromStdString("/"));
// Start at the root
std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>> node = materialTree;
for (auto& itp : list) {
if (itp.endsWith(QString::fromStdString(".FCMat"))) {
std::shared_ptr<MaterialTreeNode> child = std::make_shared<MaterialTreeNode>();
child->setData(material);
(*node)[itp] = child;
// Start at the root
std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>> node =
materialTree;
for (auto& itp : list) {
if (itp.endsWith(QString::fromStdString(".FCMat"))) {
std::shared_ptr<MaterialTreeNode> child = std::make_shared<MaterialTreeNode>();
child->setData(material);
(*node)[itp] = child;
}
else {
// Add the folder only if it's not already there
if (node->count(itp) == 0) {
auto mapPtr = std::make_shared<
std::map<QString, std::shared_ptr<MaterialTreeNode>>>();
std::shared_ptr<MaterialTreeNode> child =
std::make_shared<MaterialTreeNode>();
child->setFolder(mapPtr);
(*node)[itp] = child;
node = mapPtr;
}
else {
node = (*node)[itp]->getFolder();
}
}
}
else {
}
}
// Empty folders aren't included in _materialPathMap, so we add them by looking at the file
// system
if (!filter || filter->includeEmptyFolders()) {
auto folderList = MaterialLoader::getMaterialFolders(*this);
for (auto& folder : *folderList) {
QStringList list = folder.split(QString::fromStdString("/"));
// Start at the root
auto node = materialTree;
for (auto& itp : list) {
// Add the folder only if it's not already there
if (node->count(itp) == 0) {
auto mapPtr =
std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>> mapPtr =
std::make_shared<std::map<QString, std::shared_ptr<MaterialTreeNode>>>();
std::shared_ptr<MaterialTreeNode> child = std::make_shared<MaterialTreeNode>();
child->setFolder(mapPtr);
@@ -301,30 +349,6 @@ MaterialLibrary::getMaterialTree() const
}
}
// Empty folders aren't included in _materialPathMap, so we add them by looking at the file
// system
auto folderList = MaterialLoader::getMaterialFolders(*this);
for (auto& folder : *folderList) {
QStringList list = folder.split(QString::fromStdString("/"));
// Start at the root
auto node = materialTree;
for (auto& itp : list) {
// Add the folder only if it's not already there
if (node->count(itp) == 0) {
std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>> mapPtr =
std::make_shared<std::map<QString, std::shared_ptr<MaterialTreeNode>>>();
std::shared_ptr<MaterialTreeNode> child = std::make_shared<MaterialTreeNode>();
child->setFolder(mapPtr);
(*node)[itp] = child;
node = mapPtr;
}
else {
node = (*node)[itp]->getFolder();
}
}
}
return materialTree;
}

View File

@@ -40,6 +40,7 @@ namespace Materials
class Material;
class MaterialManager;
class MaterialFilter;
class MaterialsExport MaterialLibrary: public LibraryBase,
public std::enable_shared_from_this<MaterialLibrary>
@@ -77,7 +78,8 @@ public:
bool fileExists(const QString& path) const;
std::shared_ptr<Material> addMaterial(const std::shared_ptr<Material>& material,
const QString& path);
std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>> getMaterialTree() const;
std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>>
getMaterialTree(const MaterialFilter* filter = nullptr) const;
bool isReadOnly() const
{
@@ -96,6 +98,8 @@ protected:
void updatePaths(const QString& oldPath, const QString& newPath);
QString getUUIDFromPath(const QString& path) const;
bool materialInTree(const std::shared_ptr<Material>& material,
const MaterialFilter* filter) const;
bool _readOnly;
std::unique_ptr<std::map<QString, std::shared_ptr<Material>>> _materialPathMap;
@@ -111,7 +115,7 @@ public:
const QString& dir,
const QString& icon,
bool readOnly = true);
~MaterialExternalLibrary() = default;
~MaterialExternalLibrary() override = default;
};
} // namespace Materials

View File

@@ -40,6 +40,8 @@ namespace fs = boost::filesystem;
namespace Materials
{
class MaterialFilter;
class MaterialsExport MaterialManager: public Base::BaseClass
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
@@ -63,9 +65,10 @@ public:
// Library management
std::shared_ptr<std::list<std::shared_ptr<MaterialLibrary>>> getMaterialLibraries() const;
std::shared_ptr<std::map<QString, std::shared_ptr<MaterialTreeNode>>>
getMaterialTree(const std::shared_ptr<MaterialLibrary>& library) const
getMaterialTree(const std::shared_ptr<MaterialLibrary>& library,
const MaterialFilter* filter = nullptr) const
{
return library->getMaterialTree();
return library->getMaterialTree(filter);
}
std::shared_ptr<std::list<QString>>
getMaterialFolders(const std::shared_ptr<MaterialLibrary>& library) const;

View File

@@ -41,6 +41,25 @@ using namespace Materials;
TYPESYSTEM_SOURCE(Materials::MaterialValue, Base::BaseClass)
QMap<QString, MaterialValue::ValueType> MaterialValue::_typeMap {
{QString::fromStdString("String"), String},
{QString::fromStdString("Boolean"), Boolean},
{QString::fromStdString("Integer"), Integer},
{QString::fromStdString("Float"), Float},
{QString::fromStdString("Quantity"), Quantity},
{QString::fromStdString("Distribution"), Distribution},
{QString::fromStdString("List"), List},
{QString::fromStdString("2DArray"), Array2D},
{QString::fromStdString("3DArray"), Array3D},
{QString::fromStdString("Color"), Color},
{QString::fromStdString("Image"), Image},
{QString::fromStdString("File"), File},
{QString::fromStdString("URL"), URL},
{QString::fromStdString("MultiLineString"), MultiLineString},
{QString::fromStdString("FileList"), FileList},
{QString::fromStdString("ImageList"), ImageList},
{QString::fromStdString("SVG"), SVG}};
MaterialValue::MaterialValue()
: _valueType(None)
{
@@ -93,10 +112,16 @@ QString MaterialValue::escapeString(const QString& source)
return res;
}
MaterialValue::ValueType MaterialValue::mapType(const QString& stringType)
{
// If not found, return None
return _typeMap.value(stringType, None);
}
void MaterialValue::setInitialValue(ValueType inherited)
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
if (_valueType == String || _valueType == MultiLineString) {
if (_valueType == String || _valueType == MultiLineString || _valueType == SVG) {
_value = QVariant(static_cast<QVariant::Type>(QMetaType::QString));
}
else if (_valueType == Boolean) {
@@ -121,7 +146,7 @@ void MaterialValue::setInitialValue(ValueType inherited)
_value = QVariant(static_cast<QVariant::Type>(QMetaType::QString));
}
#else
if (_valueType == String || _valueType == MultiLineString) {
if (_valueType == String || _valueType == MultiLineString || _valueType == SVG) {
_value = QVariant(QMetaType(QMetaType::QString));
}
else if (_valueType == Boolean) {
@@ -237,7 +262,7 @@ QString MaterialValue::getYAMLStringImageList() const
QString MaterialValue::getYAMLStringMultiLine() const
{
QString yaml;
yaml = QString::fromStdString(" >2");
yaml = QString::fromStdString(" |2");
auto list =
getValue().toString().split(QRegExp(QString::fromStdString("[\r\n]")), Qt::SkipEmptyParts);
for (auto& it : list) {
@@ -259,7 +284,7 @@ QString MaterialValue::getYAMLString() const
if (getType() == MaterialValue::ImageList) {
return getYAMLStringImageList();
}
if (getType() == MaterialValue::MultiLineString) {
if (getType() == MaterialValue::MultiLineString || getType() == MaterialValue::SVG) {
return getYAMLStringMultiLine();
}
if (getType() == MaterialValue::Quantity) {
@@ -272,16 +297,6 @@ QString MaterialValue::getYAMLString() const
yaml += QString::fromLatin1("%1").arg(value.toFloat(), 0, 'g', 6);
}
}
else if (getType() == MaterialValue::MultiLineString) {
yaml = QString::fromLatin1(">2");
auto list =
getValue().toString().split(QRegularExpression(QString::fromLatin1("[\r\n]")),
Qt::SkipEmptyParts);
for (auto& it : list) {
yaml += QString::fromLatin1("\n ") + it;
}
return yaml;
}
else if (getType() == MaterialValue::List) {
for (auto& it : getList()) {
yaml += QString::fromLatin1("\n - \"") + escapeString(it.toString())
@@ -293,7 +308,7 @@ QString MaterialValue::getYAMLString() const
yaml += getValue().toString();
}
}
yaml = QString::fromLatin1("\"") + escapeString(yaml) + QString::fromLatin1("\"");
yaml = QString::fromLatin1(" \"") + escapeString(yaml) + QString::fromLatin1("\"");
return yaml;
}

View File

@@ -58,7 +58,8 @@ public:
URL = 13,
MultiLineString = 14,
FileList = 15,
ImageList = 16
ImageList = 16,
SVG
};
MaterialValue();
explicit MaterialValue(const MaterialValue& other);
@@ -104,6 +105,7 @@ public:
virtual QString getYAMLString() const;
static QString escapeString(const QString& source);
static ValueType mapType(const QString& stringType);
protected:
MaterialValue(ValueType type, ValueType inherited);
@@ -121,6 +123,9 @@ protected:
ValueType _valueType;
QVariant _value;
private:
static QMap<QString, ValueType> _typeMap;
};
class MaterialsExport Material2DArray: public MaterialValue

View File

@@ -148,60 +148,23 @@ void MaterialProperty::setPropertyType(const QString& type)
void MaterialProperty::setType(const QString& type)
{
if (type == QString::fromStdString("String")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::String);
auto mappedType = MaterialValue::mapType(type);
if (mappedType == MaterialValue::None) {
throw UnknownValueType();
}
else if (type == QString::fromStdString("Boolean")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::Boolean);
}
else if (type == QString::fromStdString("Integer")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::Integer);
}
else if (type == QString::fromStdString("Float")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::Float);
}
else if (type == QString::fromStdString("URL")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::URL);
}
else if (type == QString::fromStdString("Quantity")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::Quantity);
}
else if (type == QString::fromStdString("Color")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::Color);
}
else if (type == QString::fromStdString("File")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::File);
}
else if (type == QString::fromStdString("Image")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::Image);
}
else if (type == QString::fromStdString("List")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::List);
}
else if (type == QString::fromStdString("FileList")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::FileList);
}
else if (type == QString::fromStdString("ImageList")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::ImageList);
}
else if (type == QString::fromStdString("MultiLineString")) {
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::MultiLineString);
}
else if (type == QString::fromStdString("2DArray")) {
if (mappedType == MaterialValue::Array2D) {
auto arrayPtr = std::make_shared<Material2DArray>();
arrayPtr->setColumns(columns());
_valuePtr = arrayPtr;
}
else if (type == QString::fromStdString("3DArray")) {
else if (mappedType == MaterialValue::Array3D) {
auto arrayPtr = std::make_shared<Material3DArray>();
// First column is third dimension
arrayPtr->setColumns(columns() - 1);
_valuePtr = arrayPtr;
}
else {
// Error. Throw something
_valuePtr = std::make_shared<MaterialValue>(MaterialValue::None);
throw UnknownValueType();
_valuePtr = std::make_shared<MaterialValue>(mappedType);
}
}
@@ -457,16 +420,16 @@ Material::Material(const Material& other)
, _editState(other._editState)
{
for (auto& it : other._tags) {
_tags.push_back(it);
_tags.insert(it);
}
for (auto& it : other._physicalUuids) {
_physicalUuids.push_back(it);
_physicalUuids.insert(it);
}
for (auto& it : other._appearanceUuids) {
_appearanceUuids.push_back(it);
_appearanceUuids.insert(it);
}
for (auto& it : other._allUuids) {
_allUuids.push_back(it);
_allUuids.insert(it);
}
for (auto& it : other._physical) {
MaterialProperty prop(it.second);
@@ -498,7 +461,7 @@ QString Material::getAuthorAndLicense() const
void Material::addModel(const QString& uuid)
{
for (QString& modelUUID : _allUuids) {
for (const auto& modelUUID : qAsConst(_allUuids)) {
if (modelUUID == uuid) {
return;
}
@@ -582,9 +545,9 @@ void Material::setEditState(ModelEdit newState)
}
}
void Material::removeUUID(QStringList& uuidList, const QString& uuid)
void Material::removeUUID(QSet<QString>& uuidList, const QString& uuid)
{
uuidList.removeAll(uuid);
uuidList.remove(uuid);
}
void Material::addPhysical(const QString& uuid)
@@ -605,7 +568,7 @@ void Material::addPhysical(const QString& uuid)
removeUUID(_physicalUuids, it);
}
_physicalUuids.push_back(uuid);
_physicalUuids.insert(uuid);
addModel(uuid);
setEditStateExtend();
@@ -637,7 +600,7 @@ void Material::removePhysical(const QString& uuid)
// If it's an inherited model, do nothing
bool inherited = true;
for (auto& it : _physicalUuids) {
for (const auto& it : qAsConst(_physicalUuids)) {
if (it == uuid) {
inherited = false;
break;
@@ -689,7 +652,7 @@ void Material::addAppearance(const QString& uuid)
removeUUID(_appearanceUuids, it);
}
_appearanceUuids.push_back(uuid);
_appearanceUuids.insert(uuid);
addModel(uuid);
setEditStateExtend();
@@ -715,7 +678,7 @@ void Material::removeAppearance(const QString& uuid)
// If it's an inherited model, do nothing
bool inherited = true;
for (auto& it : _appearanceUuids) {
for (const auto& it : qAsConst(_appearanceUuids)) {
if (it == uuid) {
inherited = false;
break;
@@ -790,56 +753,72 @@ void Material::setPhysicalValue(const QString& name, const QString& value)
{
setPhysicalEditState(name);
_physical[name]->setValue(value); // may not be a string type, conversion may be required
if (hasPhysicalProperty(name)) {
_physical[name]->setValue(value); // may not be a string type, conversion may be required
}
}
void Material::setPhysicalValue(const QString& name, int value)
{
setPhysicalEditState(name);
_physical[name]->setInt(value);
if (hasPhysicalProperty(name)) {
_physical[name]->setInt(value);
}
}
void Material::setPhysicalValue(const QString& name, double value)
{
setPhysicalEditState(name);
_physical[name]->setFloat(value);
if (hasPhysicalProperty(name)) {
_physical[name]->setFloat(value);
}
}
void Material::setPhysicalValue(const QString& name, const Base::Quantity& value)
{
setPhysicalEditState(name);
_physical[name]->setQuantity(value);
if (hasPhysicalProperty(name)) {
_physical[name]->setQuantity(value);
}
}
void Material::setPhysicalValue(const QString& name, const std::shared_ptr<MaterialValue>& value)
{
setPhysicalEditState(name);
_physical[name]->setValue(value);
if (hasPhysicalProperty(name)) {
_physical[name]->setValue(value);
}
}
void Material::setPhysicalValue(const QString& name, const std::shared_ptr<QList<QVariant>>& value)
{
setPhysicalEditState(name);
_physical[name]->setList(*value);
if (hasPhysicalProperty(name)) {
_physical[name]->setList(*value);
}
}
void Material::setAppearanceValue(const QString& name, const QString& value)
{
setAppearanceEditState(name);
_appearance[name]->setValue(value); // may not be a string type, conversion may be required
if (hasAppearanceProperty(name)) {
_appearance[name]->setValue(value); // may not be a string type, conversion may be required
}
}
void Material::setAppearanceValue(const QString& name, const std::shared_ptr<MaterialValue>& value)
{
setAppearanceEditState(name);
_appearance[name]->setValue(value);
if (hasAppearanceProperty(name)) {
_appearance[name]->setValue(value);
}
}
void Material::setAppearanceValue(const QString& name,
@@ -847,7 +826,9 @@ void Material::setAppearanceValue(const QString& name,
{
setAppearanceEditState(name);
_appearance[name]->setList(*value);
if (hasAppearanceProperty(name)) {
_appearance[name]->setList(*value);
}
}
std::shared_ptr<MaterialProperty> Material::getPhysicalProperty(const QString& name)
@@ -890,6 +871,28 @@ std::shared_ptr<MaterialProperty> Material::getAppearanceProperty(const QString&
}
}
std::shared_ptr<MaterialProperty> Material::getProperty(const QString& name)
{
if (hasPhysicalProperty(name)) {
return getPhysicalProperty(name);
}
if (hasAppearanceProperty(name)) {
return getAppearanceProperty(name);
}
throw PropertyNotFound();
}
std::shared_ptr<MaterialProperty> Material::getProperty(const QString& name) const
{
if (hasPhysicalProperty(name)) {
return getPhysicalProperty(name);
}
if (hasAppearanceProperty(name)) {
return getAppearanceProperty(name);
}
throw PropertyNotFound();
}
QVariant
Material::getValue(const std::map<QString, std::shared_ptr<MaterialProperty>>& propertyList,
const QString& name)
@@ -1295,7 +1298,8 @@ QString Material::getModelByName(const QString& name) const
void Material::save(QTextStream& stream, bool overwrite, bool saveAsCopy, bool saveInherited)
{
if (saveInherited && !saveAsCopy) {
// Check to see if we're an original or if we're already in the list of models
// Check to see if we're an original or if we're already in the list of
// models
MaterialManager materialManager;
if (materialManager.exists(_uuid) && !overwrite) {
// Make a new version based on the current
@@ -1304,6 +1308,11 @@ void Material::save(QTextStream& stream, bool overwrite, bool saveAsCopy, bool s
}
}
// Prevent self inheritance
if (_parentUuid == _uuid) {
_parentUuid = QString();
}
if (saveAsCopy) {
// Save it in the same format as the parent
if (_parentUuid.isEmpty()) {
@@ -1315,8 +1324,8 @@ void Material::save(QTextStream& stream, bool overwrite, bool saveAsCopy, bool s
}
else {
if (!overwrite) {
// Creating a new derived model when overwriting sets itself as a parent,
// that will no longer exist because it's been overwritten
// Creating a new derived model when overwriting sets itself as a
// parent, that will no longer exist because it's been overwritten
newUuid();
}
}
@@ -1358,19 +1367,19 @@ Material& Material::operator=(const Material& other)
_tags.clear();
for (auto& it : other._tags) {
_tags.push_back(it);
_tags.insert(it);
}
_physicalUuids.clear();
for (auto& it : other._physicalUuids) {
_physicalUuids.push_back(it);
_physicalUuids.insert(it);
}
_appearanceUuids.clear();
for (auto& it : other._appearanceUuids) {
_appearanceUuids.push_back(it);
_appearanceUuids.insert(it);
}
_allUuids.clear();
for (auto& it : other._allUuids) {
_allUuids.push_back(it);
_allUuids.insert(it);
}
// Create copies of the properties rather than modify the originals
@@ -1420,14 +1429,15 @@ QStringList Material::normalizeModels(const QStringList& models)
}
/*
* Set or change the base material for the current material, updating the properties as
* required.
* Set or change the base material for the current material, updating the
* properties as required.
*/
void Material::updateInheritance([[maybe_unused]] const QString& parent)
{}
/*
* Return a list of models that are defined in the parent material but not in this one
* Return a list of models that are defined in the parent material but not in
* this one
*/
QStringList Material::inheritedMissingModels(const Material& parent) const
{
@@ -1457,7 +1467,8 @@ QStringList Material::inheritedAddedModels(const Material& parent) const
}
/*
* Return a list of properties that have different values from the parent material
* Return a list of properties that have different values from the parent
* material
*/
void Material::inheritedPropertyDiff([[maybe_unused]] const QString& parent)
{}

View File

@@ -25,6 +25,7 @@
#include <memory>
#include <QDir>
#include <QSet>
#include <QString>
#include <QStringList>
#include <QTextStream>
@@ -203,15 +204,15 @@ public:
{
return _editState;
}
const QStringList& getTags() const
const QSet<QString>& getTags() const
{
return _tags;
}
const QStringList* getPhysicalModels() const
const QSet<QString>* getPhysicalModels() const
{
return &_physicalUuids;
}
const QStringList* getAppearanceModels() const
const QSet<QString>* getAppearanceModels() const
{
return &_appearanceUuids;
}
@@ -282,6 +283,8 @@ public:
std::shared_ptr<MaterialProperty> getPhysicalProperty(const QString& name) const;
std::shared_ptr<MaterialProperty> getAppearanceProperty(const QString& name);
std::shared_ptr<MaterialProperty> getAppearanceProperty(const QString& name) const;
std::shared_ptr<MaterialProperty> getProperty(const QString& name);
std::shared_ptr<MaterialProperty> getProperty(const QString& name) const;
QVariant getPhysicalValue(const QString& name) const;
Base::Quantity getPhysicalQuantity(const QString& name) const;
QString getPhysicalValueString(const QString& name) const;
@@ -359,7 +362,7 @@ public:
protected:
void addModel(const QString& uuid);
static void removeUUID(QStringList& uuidList, const QString& uuid);
static void removeUUID(QSet<QString>& uuidList, const QString& uuid);
static QVariant
getValue(const std::map<QString, std::shared_ptr<MaterialProperty>>& propertyList,
@@ -388,10 +391,10 @@ private:
QString _description;
QString _url;
QString _reference;
QStringList _tags;
QStringList _physicalUuids;
QStringList _appearanceUuids;
QStringList _allUuids; // Includes inherited models
QSet<QString> _tags;
QSet<QString> _physicalUuids;
QSet<QString> _appearanceUuids;
QSet<QString> _allUuids; // Includes inherited models
std::map<QString, std::shared_ptr<MaterialProperty>> _physical;
std::map<QString, std::shared_ptr<MaterialProperty>> _appearance;
bool _dereferenced;

View File

@@ -55,7 +55,7 @@ QString LibraryBase::getLocalPath(const QString& path) const
QString prefix = QString::fromStdString("/") + getName();
if (cleanPath.startsWith(prefix)) {
// Remove the library name from the path
filePath += cleanPath.right(cleanPath.length() - prefix.length());
filePath += cleanPath.rightRef(cleanPath.length() - prefix.length());
}
else {
filePath += cleanPath;

View File

@@ -155,7 +155,7 @@ SET(FluidMaterial_Files
Resources/Materials/Fluid/None.FCMat
Resources/Materials/Fluid/Air.FCMat
Resources/Materials/Fluid/Argon.FCMat
Resources/Materials/Fluid/Carbon_dioxide.FCMat
"Resources/Materials/Fluid/Carbon Dioxide.FCMat"
Resources/Materials/Fluid/Nitrogen.FCMat
Resources/Materials/Fluid/Water.FCMat
)
@@ -166,25 +166,60 @@ SET(AppearanceLib_Files
Resources/Materials/Appearance/Bronze.FCMat
Resources/Materials/Appearance/Chrome.FCMat
Resources/Materials/Appearance/Copper.FCMat
Resources/Materials/Appearance/DefaultAppearance.FCMat
Resources/Materials/Appearance/Default.FCMat
Resources/Materials/Appearance/Emerald.FCMat
Resources/Materials/Appearance/Gold.FCMat
Resources/Materials/Appearance/Jade.FCMat
Resources/Materials/Appearance/Metalized.FCMat
Resources/Materials/Appearance/NeonGNC.FCMat
Resources/Materials/Appearance/NeonPHC.FCMat
"Resources/Materials/Appearance/Neon GNC.FCMat"
"Resources/Materials/Appearance/Neon PHC.FCMat"
Resources/Materials/Appearance/Obsidian.FCMat
Resources/Materials/Appearance/Pewter.FCMat
Resources/Materials/Appearance/Plaster.FCMat
Resources/Materials/Appearance/Plastic.FCMat
Resources/Materials/Appearance/Ruby.FCMat
Resources/Materials/Appearance/Satin.FCMat
Resources/Materials/Appearance/ShinyPlastic.FCMat
"Resources/Materials/Appearance/Shiny Plastic.FCMat"
Resources/Materials/Appearance/Silver.FCMat
Resources/Materials/Appearance/Steel.FCMat
Resources/Materials/Appearance/Stone.FCMat
)
SET(PatternLib_Files
Resources/Materials/Patterns/PAT/Diagonal4.FCMat
Resources/Materials/Patterns/PAT/Diagonal5.FCMat
Resources/Materials/Patterns/PAT/Diamond.FCMat
Resources/Materials/Patterns/PAT/Diamond2.FCMat
Resources/Materials/Patterns/PAT/Diamond4.FCMat
Resources/Materials/Patterns/PAT/Horizontal5.FCMat
Resources/Materials/Patterns/PAT/Square.FCMat
Resources/Materials/Patterns/PAT/Vertical5.FCMat
"Resources/Materials/Patterns/Pattern Files/aluminum.FCMat"
"Resources/Materials/Patterns/Pattern Files/brick01.FCMat"
"Resources/Materials/Patterns/Pattern Files/concrete.FCMat"
"Resources/Materials/Patterns/Pattern Files/cross.FCMat"
"Resources/Materials/Patterns/Pattern Files/cuprous.FCMat"
"Resources/Materials/Patterns/Pattern Files/diagonal1.FCMat"
"Resources/Materials/Patterns/Pattern Files/diagonal2.FCMat"
"Resources/Materials/Patterns/Pattern Files/earth.FCMat"
"Resources/Materials/Patterns/Pattern Files/general_steel.FCMat"
"Resources/Materials/Patterns/Pattern Files/glass.FCMat"
"Resources/Materials/Patterns/Pattern Files/hatch45L.FCMat"
"Resources/Materials/Patterns/Pattern Files/hatch45R.FCMat"
"Resources/Materials/Patterns/Pattern Files/hbone.FCMat"
"Resources/Materials/Patterns/Pattern Files/line.FCMat"
"Resources/Materials/Patterns/Pattern Files/plastic.FCMat"
"Resources/Materials/Patterns/Pattern Files/plus.FCMat"
"Resources/Materials/Patterns/Pattern Files/simple.FCMat"
"Resources/Materials/Patterns/Pattern Files/solid.FCMat"
"Resources/Materials/Patterns/Pattern Files/square.FCMat"
"Resources/Materials/Patterns/Pattern Files/steel.FCMat"
"Resources/Materials/Patterns/Pattern Files/titanium.FCMat"
"Resources/Materials/Patterns/Pattern Files/wood.FCMat"
"Resources/Materials/Patterns/Pattern Files/woodgrain.FCMat"
"Resources/Materials/Patterns/Pattern Files/zinc.FCMat"
)
SET(MaterialTestLib_Files
"Resources/Materials/Test/Test Material.FCMat"
)
@@ -202,6 +237,24 @@ SET(MaterialModel_Files
Resources/Models/Mechanical/LinearElastic.yml
Resources/Models/Mechanical/OgdenYld2004p18.yml
Resources/Models/Mechanical/OrthotropicLinearElastic.yml
Resources/Models/Patterns/PAT.yml
"Resources/Models/Patterns/Pattern File.yml"
"Resources/Models/Render Workbench/RenderAppleseed.yml"
"Resources/Models/Render Workbench/RenderCarpaint.yml"
"Resources/Models/Render Workbench/RenderCycles.yml"
"Resources/Models/Render Workbench/RenderDiffuse.yml"
"Resources/Models/Render Workbench/RenderDisney.yml"
"Resources/Models/Render Workbench/RenderEmission.yml"
"Resources/Models/Render Workbench/RenderGlass.yml"
"Resources/Models/Render Workbench/RenderLuxcore.yml"
"Resources/Models/Render Workbench/RenderLuxrender.yml"
"Resources/Models/Render Workbench/RenderMixed.yml"
"Resources/Models/Render Workbench/RenderOspray.yml"
"Resources/Models/Render Workbench/RenderPbrt.yml"
"Resources/Models/Render Workbench/RenderPovray.yml"
"Resources/Models/Render Workbench/RenderSubstancePBR.yml"
"Resources/Models/Render Workbench/RenderTexture.yml"
"Resources/Models/Render Workbench/RenderWB.yml"
Resources/Models/Rendering/AdvancedRendering.yml
Resources/Models/Rendering/BasicRendering.yml
Resources/Models/Rendering/TextureRendering.yml
@@ -266,6 +319,9 @@ ADD_CUSTOM_TARGET(FluidMaterialLib ALL
ADD_CUSTOM_TARGET(AppearanceLib ALL
SOURCES ${AppearanceLib_Files}
)
ADD_CUSTOM_TARGET(PatternLib ALL
SOURCES ${PatternLib_Files}
)
ADD_CUSTOM_TARGET(MaterialTestLib ALL
SOURCES ${MaterialTestLib_Files}
)
@@ -287,6 +343,10 @@ fc_target_copy_resource(AppearanceLib
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Material/
${AppearanceLib_Files})
fc_target_copy_resource(PatternLib
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Material/
${PatternLib_Files})
fc_target_copy_resource(MaterialTestLib
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Material/
@@ -306,7 +366,7 @@ INSTALL(
DESTINATION Mod/Material/materialtests
)
foreach(file ${MaterialLib_Files} ${FluidMaterial_Files} ${AppearanceLib_Files} ${MaterialTestLib_Files} ${MaterialModel_Files})
foreach(file ${MaterialLib_Files} ${FluidMaterial_Files} ${AppearanceLib_Files} ${PatternLib_Files} ${MaterialTestLib_Files} ${MaterialModel_Files})
get_filename_component(filepath ${file} DIRECTORY)
INSTALL(
FILES ${file}

View File

@@ -28,6 +28,7 @@
#include <QPainter>
#include <QString>
#include <QStringList>
#include <QSvgRenderer>
#include <QTextStream>
#include <QVariant>
#endif
@@ -55,12 +56,8 @@
using namespace MatGui;
BaseDelegate::BaseDelegate(Materials::MaterialValue::ValueType type,
const QString& units,
QObject* parent)
BaseDelegate::BaseDelegate(QObject* parent)
: QStyledItemDelegate(parent)
, _type(type)
, _units(units)
{}
bool BaseDelegate::newRow(const QAbstractItemModel* model, const QModelIndex& index) const
@@ -71,8 +68,7 @@ bool BaseDelegate::newRow(const QAbstractItemModel* model, const QModelIndex& in
QString BaseDelegate::getStringValue(const QModelIndex& index) const
{
auto model = index.model();
QVariant item = model->data(index);
QVariant item = getValue(index);
auto propertyValue = item.value<QString>();
return propertyValue;
@@ -109,7 +105,7 @@ void BaseDelegate::paintQuantity(QPainter* painter,
painter->drawText(option.rect, 0, QString());
}
else {
QVariant item = model->data(index);
QVariant item = getValue(index);
auto quantity = item.value<Base::Quantity>();
QString text = quantity.getUserString();
painter->drawText(option.rect, 0, text);
@@ -128,7 +124,6 @@ void BaseDelegate::paintImage(QPainter* painter,
QImage img;
if (!propertyValue.isEmpty()) {
Base::Console().Log("Loading image\n");
QByteArray by = QByteArray::fromBase64(propertyValue.toUtf8());
img = QImage::fromData(by, "PNG").scaled(64, 64, Qt::KeepAspectRatio);
}
@@ -144,6 +139,23 @@ void BaseDelegate::paintImage(QPainter* painter,
painter->restore();
}
void BaseDelegate::paintSVG(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
auto propertyValue = getStringValue(index);
painter->save();
if (!propertyValue.isEmpty()) {
QSvgRenderer renderer(propertyValue.toUtf8());
renderer.render(painter, QRectF(option.rect));
}
painter->restore();
}
void BaseDelegate::paintColor(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
@@ -177,6 +189,8 @@ void BaseDelegate::paintList(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
Q_UNUSED(index)
painter->save();
QImage list(QString::fromStdString(":/icons/list.svg"));
@@ -196,6 +210,8 @@ void BaseDelegate::paintMultiLineString(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
Q_UNUSED(index)
painter->save();
QImage table(QString::fromStdString(":/icons/multiline.svg"));
@@ -215,6 +231,8 @@ void BaseDelegate::paintArray(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
Q_UNUSED(index)
painter->save();
QImage table(QString::fromStdString(":/icons/table.svg"));
@@ -228,36 +246,39 @@ void BaseDelegate::paintArray(QPainter* painter,
painter->drawImage(target, table, table.rect());
painter->restore();
return;
}
void BaseDelegate::paint(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
if (_type == Materials::MaterialValue::Quantity) {
auto type = getType(index);
if (type == Materials::MaterialValue::Quantity) {
paintQuantity(painter, option, index);
return;
}
if (_type == Materials::MaterialValue::Image) {
if (type == Materials::MaterialValue::Image) {
paintImage(painter, option, index);
return;
}
if (_type == Materials::MaterialValue::Color) {
if (type == Materials::MaterialValue::SVG) {
paintSVG(painter, option, index);
return;
}
if (type == Materials::MaterialValue::Color) {
paintColor(painter, option, index);
return;
}
if (_type == Materials::MaterialValue::List || _type == Materials::MaterialValue::FileList
|| _type == Materials::MaterialValue::ImageList) {
if (type == Materials::MaterialValue::List || type == Materials::MaterialValue::FileList
|| type == Materials::MaterialValue::ImageList) {
paintList(painter, option, index);
return;
}
if (_type == Materials::MaterialValue::MultiLineString) {
if (type == Materials::MaterialValue::MultiLineString) {
paintMultiLineString(painter, option, index);
return;
}
if (_type == Materials::MaterialValue::Array2D || _type == Materials::MaterialValue::Array3D) {
if (type == Materials::MaterialValue::Array2D || type == Materials::MaterialValue::Array3D) {
paintArray(painter, option, index);
return;
}
@@ -270,16 +291,17 @@ QSize BaseDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelInd
Q_UNUSED(option)
Q_UNUSED(index)
if (_type == Materials::MaterialValue::Color) {
auto type = getType(index);
if (type == Materials::MaterialValue::Color) {
return {75, 23}; // Standard QPushButton size
}
if (_type == Materials::MaterialValue::Image || _type == Materials::MaterialValue::ImageList) {
if (type == Materials::MaterialValue::Image || type == Materials::MaterialValue::SVG) {
return {64, 64};
}
if (_type == Materials::MaterialValue::Array2D || _type == Materials::MaterialValue::Array3D
|| _type == Materials::MaterialValue::MultiLineString
|| _type == Materials::MaterialValue::List || _type == Materials::MaterialValue::FileList
|| _type == Materials::MaterialValue::ImageList) {
if (type == Materials::MaterialValue::Array2D || type == Materials::MaterialValue::Array3D
|| type == Materials::MaterialValue::MultiLineString
|| type == Materials::MaterialValue::List || type == Materials::MaterialValue::FileList
|| type == Materials::MaterialValue::ImageList) {
return {23, 23};
}
@@ -288,24 +310,31 @@ QSize BaseDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelInd
void BaseDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
auto model = index.model();
auto item = model->data(index);
if (!editor) {
return;
}
if (_type == Materials::MaterialValue::List) {
auto item = getValue(index);
auto type = getType(index);
if (type == Materials::MaterialValue::List) {
auto input = dynamic_cast<Gui::PrefLineEdit*>(editor);
item = input->text();
return;
}
if (_type == Materials::MaterialValue::FileList || _type == Materials::MaterialValue::File) {
if (type == Materials::MaterialValue::FileList || type == Materials::MaterialValue::File) {
auto chooser = dynamic_cast<Gui::FileChooser*>(editor);
chooser->setFileName(item.toString());
return;
}
if (_type == Materials::MaterialValue::Quantity) {
if (type == Materials::MaterialValue::Quantity) {
auto input = dynamic_cast<Gui::InputField*>(editor);
input->setQuantityString(item.toString());
return;
}
if (type == Materials::MaterialValue::List || type == Materials::MaterialValue::ImageList) {
// Handled by dialogs
return;
}
QStyledItemDelegate::setEditorData(editor, index);
}
@@ -314,13 +343,40 @@ void BaseDelegate::setModelData(QWidget* editor,
QAbstractItemModel* model,
const QModelIndex& index) const
{
if (_type == Materials::MaterialValue::FileList) {
QVariant value;
auto type = getType(index);
if (type == Materials::MaterialValue::FileList || type == Materials::MaterialValue::File) {
auto chooser = dynamic_cast<Gui::FileChooser*>(editor);
model->setData(index, chooser->fileName());
value = chooser->fileName();
}
else if (type == Materials::MaterialValue::Quantity) {
auto input = dynamic_cast<Gui::InputField*>(editor);
value = input->text();
return;
}
else if (type == Materials::MaterialValue::Integer) {
auto spinner = dynamic_cast<Gui::IntSpinBox*>(editor);
value = spinner->value();
}
else if (type == Materials::MaterialValue::Float) {
auto spinner = dynamic_cast<Gui::DoubleSpinBox*>(editor);
value = spinner->value();
}
else if (type == Materials::MaterialValue::Boolean) {
auto combo = dynamic_cast<Gui::PrefComboBox*>(editor);
value = combo->currentText();
}
else if (type == Materials::MaterialValue::Image || type == Materials::MaterialValue::SVG) {
// Value was already saved to the property
notifyChanged(index.model(), index);
return;
}
else {
QStyledItemDelegate::setModelData(editor, model, index);
auto lineEdit = dynamic_cast<Gui::PrefLineEdit*>(editor);
value = lineEdit->text();
}
setValue(model, index, value);
}
QWidget* BaseDelegate::createEditor(QWidget* parent,
@@ -336,7 +392,7 @@ QWidget* BaseDelegate::createEditor(QWidget* parent,
if (newRow(model, index)) {
const_cast<QAbstractItemModel*>(model)->insertRows(index.row(), 1);
}
auto item = model->data(index);
auto item = getValue(index);
QWidget* editor = createWidget(parent, item, index);
@@ -348,20 +404,15 @@ BaseDelegate::createWidget(QWidget* parent, const QVariant& item, const QModelIn
{
QWidget* widget = nullptr;
if (_type == Materials::MaterialValue::String || _type == Materials::MaterialValue::URL
|| _type == Materials::MaterialValue::List) {
auto lineEdit = new Gui::PrefLineEdit(parent);
lineEdit->setText(item.toString());
widget = lineEdit;
}
else if (_type == Materials::MaterialValue::Integer) {
auto type = getType(index);
if (type == Materials::MaterialValue::Integer) {
auto spinner = new Gui::UIntSpinBox(parent);
spinner->setMinimum(0);
spinner->setMaximum(UINT_MAX);
spinner->setValue(item.toUInt());
widget = spinner;
}
else if (_type == Materials::MaterialValue::Float) {
else if (type == Materials::MaterialValue::Float) {
auto spinner = new Gui::DoubleSpinBox(parent);
// the magnetic permeability is the parameter for which many decimals matter
@@ -376,7 +427,7 @@ BaseDelegate::createWidget(QWidget* parent, const QVariant& item, const QModelIn
spinner->setValue(item.toDouble());
widget = spinner;
}
else if (_type == Materials::MaterialValue::Boolean) {
else if (type == Materials::MaterialValue::Boolean) {
auto combo = new Gui::PrefComboBox(parent);
combo->insertItem(0, QString::fromStdString(""));
combo->insertItem(1, tr("False"));
@@ -384,16 +435,24 @@ BaseDelegate::createWidget(QWidget* parent, const QVariant& item, const QModelIn
combo->setCurrentText(item.toString());
widget = combo;
}
else if (_type == Materials::MaterialValue::Quantity) {
else if (type == Materials::MaterialValue::Quantity) {
auto input = new Gui::QuantitySpinBox(parent);
input->setMinimum(std::numeric_limits<double>::min());
input->setMaximum(std::numeric_limits<double>::max());
input->setUnitText(_units);
input->setUnitText(getUnits(index));
input->setValue(item.value<Base::Quantity>());
widget = input;
}
else if (_type == Materials::MaterialValue::FileList) {
else if (type == Materials::MaterialValue::File) {
auto chooser = new Gui::FileChooser(parent);
if (!item.toString().isEmpty()) {
chooser->setFileName(item.toString());
}
widget = chooser;
}
else if (type == Materials::MaterialValue::FileList) {
auto chooser = new Gui::FileChooser(parent);
auto propertyValue = item.toString();
@@ -412,7 +471,9 @@ BaseDelegate::createWidget(QWidget* parent, const QVariant& item, const QModelIn
}
else {
// Default editor
widget = new QLineEdit(parent);
auto lineEdit = new Gui::PrefLineEdit(parent);
lineEdit->setText(item.toString());
widget = lineEdit;
}
return widget;

View File

@@ -40,12 +40,10 @@ class BaseDelegate: public QStyledItemDelegate
{
Q_OBJECT
public:
BaseDelegate(Materials::MaterialValue::ValueType type = Materials::MaterialValue::None,
const QString& units = QString(),
QObject* parent = nullptr);
BaseDelegate(QObject* parent = nullptr);
virtual ~BaseDelegate() = default;
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const;
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
void paint(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const override;
@@ -53,16 +51,21 @@ public:
const QStyleOptionViewItem& styleOption,
const QModelIndex& index) const override;
void setEditorData(QWidget* editor, const QModelIndex& index) const override;
void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const;
void setModelData(QWidget* editor,
QAbstractItemModel* model,
const QModelIndex& index) const override;
// Q_SIGNALS:
/** Emits this signal when a property has changed */
// void propertyChange(const QModelIndex& index, const QString value);
protected:
Materials::MaterialValue::ValueType _type;
QString _units;
virtual Materials::MaterialValue::ValueType getType(const QModelIndex& index) const = 0;
virtual QString getUnits(const QModelIndex& index) const = 0;
virtual QVariant getValue(const QModelIndex& index) const = 0;
virtual void
setValue(QAbstractItemModel* model, const QModelIndex& index, const QVariant& value) const = 0;
virtual void notifyChanged(const QAbstractItemModel* model, const QModelIndex& index) const = 0;
QString getStringValue(const QModelIndex& index) const;
QRgb parseColor(const QString& color) const;
@@ -73,6 +76,8 @@ protected:
void paintImage(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const;
void
paintSVG(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
void paintColor(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const;

View File

@@ -25,9 +25,13 @@
#endif
#include <QBuffer>
#include <QFile>
#include <QMenu>
#include <QPainter>
#include <QPixmap>
#include <QString>
#include <QSvgRenderer>
#include <QTextStream>
#include <Gui/FileDialog.h>
#include <Gui/MainWindow.h>
@@ -53,16 +57,53 @@ ImageLabel::ImageLabel(QWidget* parent)
void ImageLabel::setPixmap(const QPixmap& pixmap)
{
_pixmap = pixmap;
_svg.clear();
QLabel::setPixmap(pixmap);
}
void ImageLabel::setSVG(const QString& svg)
{
_svg = svg;
_pixmap = QPixmap();
update();
// renderSVG();
}
void ImageLabel::renderSVG()
{
QPainter painter(this);
QSvgRenderer renderer(_svg.toUtf8(), this);
painter.begin(this);
renderer.render(&painter);
painter.end();
}
void ImageLabel::resizeEvent(QResizeEvent* event)
{
QPixmap px = _pixmap.scaled(event->size(), Qt::KeepAspectRatio);
QLabel::setPixmap(px);
QLabel::resizeEvent(event);
if (_svg.isEmpty()) {
QPixmap px = _pixmap.scaled(event->size(), Qt::KeepAspectRatio);
QLabel::setPixmap(px);
QLabel::resizeEvent(event);
}
// else {
// renderSVG();
// }
}
void ImageLabel::paintEvent(QPaintEvent* event)
{
if (!_svg.isEmpty()) {
QSvgRenderer renderer(_svg.toUtf8());
QPainter painter(this);
renderer.render(&painter, QRectF(event->rect()));
}
else {
QLabel::paintEvent(event);
}
}
//===
ImageEdit::ImageEdit(const QString& propertyName,
@@ -86,17 +127,24 @@ ImageEdit::ImageEdit(const QString& propertyName,
_property = nullptr;
}
if (_property) {
QString value = _property->getString();
if (!value.isEmpty()) {
QByteArray by = QByteArray::fromBase64(value.toUtf8());
QImage img = QImage::fromData(by, "PNG");
_pixmap = QPixmap::fromImage(img);
if (_property->getType() == Materials::MaterialValue::SVG) {
_svg = _property->getString();
showSVG();
}
else {
QString value = _property->getString();
if (!value.isEmpty()) {
QByteArray by = QByteArray::fromBase64(value.toUtf8());
QImage img = QImage::fromData(by, "PNG");
_pixmap = QPixmap::fromImage(img);
}
showPixmap();
}
}
else {
Base::Console().Log("No value loaded\n");
showPixmap();
}
showPixmap();
connect(ui->buttonFileSelect, &QPushButton::clicked, this, &ImageEdit::onFileSelect);
@@ -114,43 +162,92 @@ void ImageEdit::showPixmap()
ui->editHeight->setText(text.setNum(_pixmap.height()));
}
void ImageEdit::showSVG()
{
ui->labelThumb->setSVG(_svg);
ui->labelThumb->setFixedSize(64, 64);
ui->labelImage->setSVG(_svg);
// QString text;
// ui->editWidth->setText(text.setNum(_pixmap.width()));
// ui->editHeight->setText(text.setNum(_pixmap.height()));
}
void ImageEdit::onFileSelect(bool checked)
{
Q_UNUSED(checked)
if (_property && _property->getType() == Materials::MaterialValue::SVG) {
onFileSelectSVG();
}
else {
onFileSelectImage();
}
}
QString ImageEdit::selectFile(const QString& filePatterns)
{
QFileDialog::Options dlgOpt;
if (Gui::DialogOptions::dontUseNativeFileDialog()) {
dlgOpt = QFileDialog::DontUseNativeDialog;
}
QString directory = Gui::FileDialog::getWorkingDirectory();
QString fn = Gui::FileDialog::getOpenFileName(
this,
tr("Select an image"),
directory,
tr("Image files (*.jpg *.jpeg *.png *.bmp);;All files (*)"),
nullptr,
dlgOpt);
QString fn = Gui::FileDialog::getOpenFileName(this,
tr("Select an image"),
directory,
filePatterns,
nullptr,
dlgOpt);
return fn;
}
void ImageEdit::onFileSelectImage()
{
QString fn = selectFile(tr("Image files (*.jpg *.jpeg *.png *.bmp);;All files (*)"));
if (!fn.isEmpty()) {
fn = QDir::fromNativeSeparators(fn);
Gui::FileDialog::setWorkingDirectory(fn);
_pixmap = QPixmap(fn);
_svg.clear();
showPixmap();
}
}
void ImageEdit::onFileSelectSVG()
{
QString fn = selectFile(tr("Image files (*.svg);;All files (*)"));
if (!fn.isEmpty()) {
fn = QDir::fromNativeSeparators(fn);
_pixmap = QPixmap();
QFile file(fn);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
_svg.clear();
}
else {
QTextStream stream(&file);
_svg = stream.readAll();
}
showSVG();
}
}
void ImageEdit::accept()
{
if (_property) {
QBuffer buffer;
buffer.open(QIODevice::WriteOnly);
_pixmap.save(&buffer, "PNG");
QByteArray base64 = buffer.data().toBase64();
QString encoded = QString::fromUtf8(base64);
_property->setValue(encoded);
if (_property->getType() == Materials::MaterialValue::SVG) {
_property->setValue(_svg);
}
else {
QBuffer buffer;
buffer.open(QIODevice::WriteOnly);
_pixmap.save(&buffer, "PNG");
QByteArray base64 = buffer.data().toBase64();
QString encoded = QString::fromUtf8(base64);
_property->setValue(encoded);
}
}
QDialog::accept();
}

View File

@@ -53,12 +53,16 @@ public:
~ImageLabel() = default;
void setPixmap(const QPixmap& pixmap);
void setSVG(const QString& svg);
void renderSVG();
protected:
void resizeEvent(QResizeEvent* event);
void paintEvent(QPaintEvent* event);
private:
QPixmap _pixmap;
QString _svg;
};
class ImageEdit: public QDialog
@@ -71,19 +75,26 @@ public:
QWidget* parent = nullptr);
~ImageEdit() override = default;
void onFileSelect(bool checked);
void accept() override;
void reject() override;
private Q_SLOTS:
void onFileSelect(bool checked);
private:
std::unique_ptr<Ui_ImageEdit> ui;
std::shared_ptr<Materials::Material> _material;
std::shared_ptr<Materials::MaterialProperty> _property;
QPixmap _pixmap;
QString _svg;
void showPixmap();
void showSVG();
QString selectFile(const QString& filePatterns);
void onFileSelectImage();
void onFileSelectSVG();
};
} // namespace MatGui

View File

@@ -58,20 +58,47 @@ using namespace MatGui;
ListDelegate::ListDelegate(Materials::MaterialValue::ValueType type,
const QString& units,
QObject* parent)
: BaseDelegate(type, units, parent)
: BaseDelegate(parent)
, _type(type)
, _units(units)
{}
QVariant ListDelegate::getValue(const QModelIndex& index) const
{
auto model = index.model();
auto item = model->data(index);
return item;
}
void ListDelegate::setValue(QAbstractItemModel* model,
const QModelIndex& index,
const QVariant& value) const
{
auto matModel = dynamic_cast<QStandardItemModel*>(model);
matModel->setData(index, value);
notifyChanged(model, index);
}
void ListDelegate::notifyChanged(const QAbstractItemModel* model, const QModelIndex& index) const
{
Q_UNUSED(model)
Q_UNUSED(index)
}
void ListDelegate::paint(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
if (_type == Materials::MaterialValue::Quantity) {
auto type = getType(index);
if (type == Materials::MaterialValue::Quantity) {
paintQuantity(painter, option, index);
return;
}
if (_type == Materials::MaterialValue::Image || _type == Materials::MaterialValue::ImageList) {
if (type == Materials::MaterialValue::Image || type == Materials::MaterialValue::ImageList) {
paintImage(painter, option, index);
return;
}

View File

@@ -51,7 +51,24 @@ public:
const QStyleOptionViewItem& option,
const QModelIndex& index) const override;
protected:
Materials::MaterialValue::ValueType getType(const QModelIndex& index) const override
{
return _type;
}
QString getUnits(const QModelIndex& index) const override
{
return _units;
}
QVariant getValue(const QModelIndex& index) const override;
void setValue(QAbstractItemModel* model,
const QModelIndex& index,
const QVariant& value) const override;
void notifyChanged(const QAbstractItemModel* model, const QModelIndex& index) const override;
private:
Materials::MaterialValue::ValueType _type;
QString _units;
};
} // namespace MatGui

View File

@@ -28,6 +28,7 @@
#include <QPainter>
#include <QString>
#include <QStringList>
#include <QSvgRenderer>
#include <QTextStream>
#include <QVariant>
#endif
@@ -59,9 +60,109 @@
using namespace MatGui;
MaterialDelegate::MaterialDelegate(QObject* parent)
: QStyledItemDelegate(parent)
: BaseDelegate(parent)
{}
Materials::MaterialValue::ValueType MaterialDelegate::getType(const QModelIndex& index) const
{
auto treeModel = dynamic_cast<const QStandardItemModel*>(index.model());
auto item = treeModel->itemFromIndex(index);
auto group = item->parent();
if (!group) {
return {};
}
int row = index.row();
QString propertyType;
if (group->child(row, 1)) {
propertyType = group->child(row, 2)->text();
}
return Materials::MaterialValue::mapType(propertyType);
}
QString MaterialDelegate::getUnits(const QModelIndex& index) const
{
auto treeModel = dynamic_cast<const QStandardItemModel*>(index.model());
auto item = treeModel->itemFromIndex(index);
auto group = item->parent();
if (!group) {
return {};
}
int row = index.row();
QString propertyUnits;
if (group->child(row, 1)) {
propertyUnits = group->child(row, 3)->text();
}
return propertyUnits;
}
QVariant MaterialDelegate::getValue(const QModelIndex& index) const
{
auto treeModel = dynamic_cast<const QStandardItemModel*>(index.model());
auto item = treeModel->itemFromIndex(index);
auto group = item->parent();
if (!group) {
return {};
}
int row = index.row();
QVariant propertyValue;
if (group->child(row, 1)) {
auto material = group->child(row, 1)->data().value<std::shared_ptr<Materials::Material>>();
auto propertyName = group->child(row, 0)->text();
propertyValue = material->getProperty(propertyName)->getValue();
}
return propertyValue;
}
void MaterialDelegate::setValue(QAbstractItemModel* model,
const QModelIndex& index,
const QVariant& value) const
{
auto matModel = dynamic_cast<const QStandardItemModel*>(model);
auto item = matModel->itemFromIndex(index);
auto group = item->parent();
if (!group) {
return;
}
int row = index.row();
if (group->child(row, 1)) {
auto material = group->child(row, 1)->data().value<std::shared_ptr<Materials::Material>>();
auto propertyName = group->child(row, 0)->text();
material->getProperty(propertyName)->setValue(value);
group->child(row, 1)->setText(value.toString());
}
notifyChanged(model, index);
}
void MaterialDelegate::notifyChanged(const QAbstractItemModel* model,
const QModelIndex& index) const
{
Base::Console().Log("MaterialDelegate::notifyChanged()\n");
auto treeModel = dynamic_cast<const QStandardItemModel*>(model);
auto item = treeModel->itemFromIndex(index);
auto group = item->parent();
if (!group) {
return;
}
int row = index.row();
if (group->child(row, 1)) {
auto material = group->child(row, 1)->data().value<std::shared_ptr<Materials::Material>>();
auto propertyName = group->child(row, 0)->text();
auto propertyValue = material->getProperty(propertyName)->getValue();
material->setEditStateAlter();
Base::Console().Log("MaterialDelegate::notifyChanged() - marked altered\n");
Q_EMIT const_cast<MaterialDelegate*>(this)->propertyChange(propertyName,
propertyValue.toString());
}
}
bool MaterialDelegate::editorEvent(QEvent* event,
QAbstractItemModel* model,
const QStyleOptionViewItem& option,
@@ -82,38 +183,35 @@ bool MaterialDelegate::editorEvent(QEvent* event,
int row = index.row();
QString propertyName = group->child(row, 0)->text();
QString propertyType = QString::fromStdString("String");
if (group->child(row, 2)) {
propertyType = group->child(row, 2)->text();
}
std::string type = propertyType.toStdString();
if (type == "Color") {
showColorModal(item, propertyName);
auto type = getType(index);
if (type == Materials::MaterialValue::Color) {
showColorModal(propertyName, item);
// Mark as handled
return true;
}
if (type == "MultiLineString") {
showMultiLineString(propertyName, item);
if (type == Materials::MaterialValue::MultiLineString) {
showMultiLineStringModal(propertyName, item);
// Mark as handled
return true;
}
if (type == "List" || type == "FileList" || type == "ImageList") {
if (type == Materials::MaterialValue::List || type == Materials::MaterialValue::FileList
|| type == Materials::MaterialValue::ImageList) {
showListModal(propertyName, item);
// Mark as handled
return true;
}
if (type == "2DArray") {
if (type == Materials::MaterialValue::Array2D) {
showArray2DModal(propertyName, item);
// Mark as handled
return true;
}
if (type == "3DArray") {
if (type == Materials::MaterialValue::Array3D) {
showArray3DModal(propertyName, item);
// Mark as handled
return true;
}
if (type == "Image") {
if (type == Materials::MaterialValue::Image || type == Materials::MaterialValue::SVG) {
showImageModal(propertyName, item);
// Mark as handled
return true;
@@ -123,7 +221,7 @@ bool MaterialDelegate::editorEvent(QEvent* event,
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
void MaterialDelegate::showColorModal(QStandardItem* item, QString propertyName)
void MaterialDelegate::showColorModal(const QString& propertyName, QStandardItem* item)
{
QColor currentColor; // = d->col;
currentColor.setRgba(parseColor(item->text()));
@@ -166,11 +264,7 @@ void MaterialDelegate::showImageModal(const QString& propertyName, QStandardItem
dlg->adjustSize();
connect(dlg, &QDialog::finished, this, [&](int result) {
if (result == QDialog::Accepted) {
Base::Console().Log("Accepted\n");
}
});
connect(dlg, &QDialog::finished, this, [&](int result) {});
dlg->exec();
}
@@ -184,16 +278,12 @@ void MaterialDelegate::showListModal(const QString& propertyName, QStandardItem*
dlg->adjustSize();
connect(dlg, &QDialog::finished, this, [&](int result) {
if (result == QDialog::Accepted) {
Base::Console().Log("Accepted\n");
}
});
connect(dlg, &QDialog::finished, this, [&](int result) {});
dlg->exec();
}
void MaterialDelegate::showMultiLineString(const QString& propertyName, QStandardItem* item)
void MaterialDelegate::showMultiLineStringModal(const QString& propertyName, QStandardItem* item)
{
auto material = item->data().value<std::shared_ptr<Materials::Material>>();
auto dlg = new TextEdit(propertyName, material);
@@ -202,11 +292,7 @@ void MaterialDelegate::showMultiLineString(const QString& propertyName, QStandar
dlg->adjustSize();
connect(dlg, &QDialog::finished, this, [&](int result) {
if (result == QDialog::Accepted) {
Base::Console().Log("Accepted\n");
}
});
connect(dlg, &QDialog::finished, this, [&](int result) {});
dlg->exec();
}
@@ -221,11 +307,7 @@ void MaterialDelegate::showArray2DModal(const QString& propertyName, QStandardIt
dlg->adjustSize();
connect(dlg, &QDialog::finished, this, [&](int result) {
if (result == QDialog::Accepted) {
Base::Console().Log("Accepted\n");
}
});
connect(dlg, &QDialog::finished, this, [&](int result) {});
dlg->exec();
}
@@ -239,11 +321,7 @@ void MaterialDelegate::showArray3DModal(const QString& propertyName, QStandardIt
dlg->adjustSize();
connect(dlg, &QDialog::finished, this, [&](int result) {
if (result == QDialog::Accepted) {
Base::Console().Log("Accepted\n");
}
});
connect(dlg, &QDialog::finished, this, [&](int result) {});
dlg->exec();
}
@@ -267,207 +345,40 @@ void MaterialDelegate::paint(QPainter* painter,
return;
}
int row = index.row();
QString propertyName = group->child(row, 0)->text();
QString propertyType = QString::fromStdString("String");
if (group->child(row, 2)) {
propertyType = group->child(row, 2)->text();
}
QString propertyValue = QString::fromStdString("");
if (group->child(row, 1)) {
propertyValue = group->child(row, 1)->text();
}
std::string type = propertyType.toStdString();
if (type == "Color") {
painter->save();
;
QColor color;
color.setRgba(qRgba(0, 0, 0, 255)); // Black border
int left = option.rect.left() + 2;
int width = option.rect.width() - 4;
if (option.rect.width() > 75) {
left += (option.rect.width() - 75) / 2;
width = 71;
}
painter->fillRect(left,
option.rect.top() + 2,
width,
option.rect.height() - 4,
QBrush(color));
color.setRgba(parseColor(propertyValue));
left = option.rect.left() + 5;
width = option.rect.width() - 10;
if (option.rect.width() > 75) {
left += (option.rect.width() - 75) / 2;
width = 65;
}
painter->fillRect(left,
option.rect.top() + 5,
width,
option.rect.height() - 10,
QBrush(color));
painter->restore();
auto type = getType(index);
if (type == Materials::MaterialValue::Quantity) {
paintQuantity(painter, option, index);
return;
}
if (type == "Image") {
painter->save();
QImage img;
if (!propertyValue.isEmpty()) {
Base::Console().Log("Loading image\n");
QByteArray by = QByteArray::fromBase64(propertyValue.toUtf8());
img = QImage::fromData(by, "PNG").scaled(64, 64, Qt::KeepAspectRatio);
}
QRect target(option.rect);
if (target.width() > target.height()) {
target.setWidth(target.height());
}
else {
target.setHeight(target.width());
}
painter->drawImage(target, img, img.rect());
painter->restore();
if (type == Materials::MaterialValue::Image) {
paintImage(painter, option, index);
return;
}
if (type == "List" || type == "FileList" || type == "ImageList") {
painter->save();
QImage table(QString::fromStdString(":/icons/list.svg"));
QRect target(option.rect);
if (target.width() > target.height()) {
target.setWidth(target.height());
}
else {
target.setHeight(target.width());
}
painter->drawImage(target, table, table.rect());
painter->restore();
if (type == Materials::MaterialValue::SVG) {
paintSVG(painter, option, index);
return;
}
if (type == "MultiLineString") {
painter->save();
QImage table(QString::fromStdString(":/icons/multiline.svg"));
QRect target(option.rect);
if (target.width() > target.height()) {
target.setWidth(target.height());
}
else {
target.setHeight(target.width());
}
painter->drawImage(target, table, table.rect());
painter->restore();
if (type == Materials::MaterialValue::Color) {
paintColor(painter, option, index);
return;
}
if (type == "2DArray" || type == "3DArray") {
painter->save();
QImage table(QString::fromStdString(":/icons/table.svg"));
QRect target(option.rect);
if (target.width() > target.height()) {
target.setWidth(target.height());
}
else {
target.setHeight(target.width());
}
painter->drawImage(target, table, table.rect());
painter->restore();
if (type == Materials::MaterialValue::List || type == Materials::MaterialValue::FileList
|| type == Materials::MaterialValue::ImageList) {
paintList(painter, option, index);
return;
}
if (type == Materials::MaterialValue::MultiLineString) {
paintMultiLineString(painter, option, index);
return;
}
if (type == Materials::MaterialValue::Array2D || type == Materials::MaterialValue::Array3D) {
paintArray(painter, option, index);
return;
}
QStyledItemDelegate::paint(painter, option, index);
}
QSize MaterialDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
{
if (index.column() != 1) {
return QStyledItemDelegate::sizeHint(option, index);
}
auto treeModel = dynamic_cast<const QStandardItemModel*>(index.model());
// Check we're not the material model root. This is also used to access the entry columns
auto item = treeModel->itemFromIndex(index);
auto group = item->parent();
if (!group) {
return QStyledItemDelegate::sizeHint(option, index);
}
int row = index.row();
QString propertyType = QString::fromStdString("String");
if (group->child(row, 2)) {
propertyType = group->child(row, 2)->text();
}
std::string type = propertyType.toStdString();
if (type == "Color") {
return {75, 23}; // Standard QPushButton size
}
if (type == "Image") {
return {64, 64};
}
if (type == "2DArray" || type == "3DArray" || type == "MultiLineString" || type == "List"
|| type == "FileList" || type == "ImageList") {
return {23, 23};
}
return QStyledItemDelegate::sizeHint(option, index);
}
void MaterialDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
QVariant propertyType = editor->property("Type");
auto model = dynamic_cast<const QStandardItemModel*>(index.model());
QStandardItem* item = model->itemFromIndex(index);
auto group = item->parent();
if (!group) {
return;
}
int row = index.row();
QString propertyName = group->child(row, 0)->text();
std::string type = propertyType.toString().toStdString();
if (type == "File") {
auto chooser = dynamic_cast<Gui::FileChooser*>(editor);
item->setText(chooser->fileName());
}
else if (type == "Quantity") {
auto input = dynamic_cast<Gui::InputField*>(editor);
item->setText(input->getQuantityString());
}
else {
QStyledItemDelegate::setEditorData(editor, index);
}
}
void MaterialDelegate::setModelData(QWidget* editor,
QAbstractItemModel* model,
const QModelIndex& index) const
{
QStyledItemDelegate::setModelData(editor, model, index);
auto item = dynamic_cast<const QStandardItemModel*>(model)->itemFromIndex(index);
auto group = item->parent();
if (!group) {
return;
}
int row = index.row();
QString propertyName = group->child(row, 0)->text();
Q_EMIT const_cast<MaterialDelegate*>(this)->propertyChange(propertyName, item->text());
}
QWidget* MaterialDelegate::createEditor(QWidget* parent,
const QStyleOptionViewItem& styleOption,
const QModelIndex& index) const
@@ -487,52 +398,27 @@ QWidget* MaterialDelegate::createEditor(QWidget* parent,
return nullptr;
}
int row = index.row();
QString propertyName = group->child(row, 0)->text();
QString propertyType = QString::fromStdString("String");
if (group->child(row, 2)) {
propertyType = group->child(row, 2)->text();
}
QString propertyValue = QString::fromStdString("");
if (group->child(row, 1)) {
propertyValue = group->child(row, 1)->text();
}
QString propertyUnits = QString::fromStdString("");
if (group->child(row, 1)) {
propertyUnits = group->child(row, 3)->text();
}
QWidget* editor =
createWidget(parent, propertyName, propertyType, propertyValue, propertyUnits);
QVariant value = treeModel->data(index);
QWidget* editor = createWidget(parent, value, index);
return editor;
}
QWidget* MaterialDelegate::createWidget(QWidget* parent,
const QString& propertyName,
const QString& propertyType,
const QString& propertyValue,
const QString& propertyUnits) const
const QVariant& item,
const QModelIndex& index) const
{
Q_UNUSED(propertyName);
QWidget* widget = nullptr;
std::string type = propertyType.toStdString();
if (type == "String" || type == "URL") {
widget = new Gui::PrefLineEdit(parent);
}
else if (type == "Integer") {
auto type = getType(index);
if (type == Materials::MaterialValue::Integer) {
auto spinner = new Gui::IntSpinBox(parent);
spinner->setMinimum(0);
spinner->setMaximum(INT_MAX);
spinner->setValue(propertyValue.toInt());
spinner->setValue(item.toInt());
widget = spinner;
}
else if (type == "Float") {
else if (type == Materials::MaterialValue::Float) {
auto spinner = new Gui::DoubleSpinBox(parent);
// the magnetic permeability is the parameter for which many decimals matter
@@ -544,64 +430,43 @@ QWidget* MaterialDelegate::createWidget(QWidget* parent,
spinner->setMinimum(std::numeric_limits<double>::min());
spinner->setMaximum(std::numeric_limits<double>::max());
spinner->setValue(propertyValue.toDouble());
spinner->setValue(item.toDouble());
widget = spinner;
}
else if (type == "Boolean") {
else if (type == Materials::MaterialValue::Boolean) {
auto combo = new Gui::PrefComboBox(parent);
combo->insertItem(0, QString::fromStdString(""));
combo->insertItem(1, tr("False"));
combo->insertItem(2, tr("True"));
combo->setCurrentText(propertyValue);
combo->setCurrentText(item.toString());
widget = combo;
}
else if (type == "Quantity") {
else if (type == Materials::MaterialValue::Quantity) {
auto input = new Gui::InputField(parent);
input->setMinimum(std::numeric_limits<double>::min());
input->setMaximum(std::numeric_limits<double>::max());
input->setUnitText(propertyUnits); // TODO: Ensure this exists
input->setUnitText(getUnits(index));
input->setPrecision(6);
input->setQuantityString(propertyValue);
input->setValue(item.value<Base::Quantity>());
widget = input;
}
else if (type == "File") {
else if (type == Materials::MaterialValue::File) {
auto chooser = new Gui::FileChooser(parent);
if (!propertyValue.isEmpty()) {
chooser->setFileName(propertyValue);
if (!item.toString().isEmpty()) {
chooser->setFileName(item.toString());
}
widget = chooser;
}
else {
// Default editor
widget = new QLineEdit(parent);
auto lineEdit = new Gui::PrefLineEdit(parent);
lineEdit->setText(item.toString());
widget = lineEdit;
}
widget->setProperty("Type", propertyType);
// widget->setParent(parent);
return widget;
}
QRgb MaterialDelegate::parseColor(const QString& color) const
{
QString trimmed = color;
trimmed.replace(QRegularExpression(QString::fromStdString("\\(([^<]*)\\)")),
QString::fromStdString("\\1"));
QStringList parts = trimmed.split(QString::fromStdString(","));
if (parts.length() < 3) {
return qRgba(0, 0, 0, 255);
}
int red = parts.at(0).toDouble() * 255;
int green = parts.at(1).toDouble() * 255;
int blue = parts.at(2).toDouble() * 255;
int alpha = 255;
if (parts.length() > 3) {
alpha = parts.at(3).toDouble() * 255;
}
return qRgba(red, green, blue, alpha);
}
#include "moc_MaterialDelegate.cpp"

View File

@@ -33,10 +33,12 @@
#include <Mod/Material/App/Materials.h>
#include <Mod/Material/App/ModelManager.h>
#include "BaseDelegate.h"
namespace MatGui
{
class MaterialDelegate: public QStyledItemDelegate
class MaterialDelegate: public BaseDelegate
{
Q_OBJECT
public:
@@ -46,14 +48,14 @@ public:
QWidget* createEditor(QWidget* parent,
const QStyleOptionViewItem& styleOption,
const QModelIndex& index) const override;
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
// QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
void paint(QPainter* painter,
const QStyleOptionViewItem& option,
const QModelIndex& index) const override;
void setEditorData(QWidget* editor, const QModelIndex& index) const override;
void setModelData(QWidget* editor,
QAbstractItemModel* model,
const QModelIndex& index) const override;
// void setEditorData(QWidget* editor, const QModelIndex& index) const override;
// void setModelData(QWidget* editor,
// QAbstractItemModel* model,
// const QModelIndex& index) const override;
protected:
bool editorEvent(QEvent* event,
@@ -61,21 +63,25 @@ protected:
const QStyleOptionViewItem& option,
const QModelIndex& index) override;
Materials::MaterialValue::ValueType getType(const QModelIndex& index) const override;
QString getUnits(const QModelIndex& index) const override;
QVariant getValue(const QModelIndex& index) const override;
void setValue(QAbstractItemModel* model,
const QModelIndex& index,
const QVariant& value) const override;
void notifyChanged(const QAbstractItemModel* model, const QModelIndex& index) const override;
Q_SIGNALS:
/** Emits this signal when a property has changed */
void propertyChange(const QString& property, const QString value);
private:
QWidget* createWidget(QWidget* parent,
const QString& propertyName,
const QString& propertyType,
const QString& propertyValue,
const QString& propertyUnits) const;
QRgb parseColor(const QString& color) const;
void showColorModal(QStandardItem* item, QString propertyName);
QWidget* createWidget(QWidget* parent, const QVariant& item, const QModelIndex& index) const;
// QRgb parseColor(const QString& color) const;
void showColorModal(const QString& propertyName, QStandardItem* item);
void showImageModal(const QString& propertyName, QStandardItem* item);
void showListModal(const QString& propertyName, QStandardItem* item);
void showMultiLineString(const QString& propertyName, QStandardItem* item);
void showMultiLineStringModal(const QString& propertyName, QStandardItem* item);
void showArray2DModal(const QString& propertyName, QStandardItem* item);
void showArray3DModal(const QString& propertyName, QStandardItem* item);
};

View File

@@ -156,7 +156,7 @@ void MaterialsEditor::getFavorites()
auto param = App::GetApplication().GetParameterGroupByPath(
"User parameter:BaseApp/Preferences/Mod/Material/Favorites");
int count = param->GetInt("Favorites", 0);
for (int i = 0; i < count; i++) {
for (int i = 0; static_cast<long>(i) < count; i++) {
QString key = QString::fromLatin1("FAV%1").arg(i);
QString uuid = QString::fromStdString(param->GetASCII(key.toStdString().c_str(), ""));
_favorites.push_back(uuid);
@@ -170,7 +170,7 @@ void MaterialsEditor::saveFavorites()
// Clear out the existing favorites
int count = param->GetInt("Favorites", 0);
for (int i = 0; i < count; i++) {
for (int i = 0; static_cast<long>(i) < count; i++) {
QString key = QString::fromLatin1("FAV%1").arg(i);
param->RemoveASCII(key.toStdString().c_str());
}
@@ -232,7 +232,7 @@ void MaterialsEditor::getRecents()
"User parameter:BaseApp/Preferences/Mod/Material/Recent");
_recentMax = param->GetInt("RecentMax", 5);
int count = param->GetInt("Recent", 0);
for (int i = 0; i < count; i++) {
for (int i = 0; static_cast<long>(i) < count; i++) {
QString key = QString::fromLatin1("MRU%1").arg(i);
QString uuid = QString::fromStdString(param->GetASCII(key.toStdString().c_str(), ""));
_recents.push_back(uuid);
@@ -246,7 +246,7 @@ void MaterialsEditor::saveRecents()
// Clear out the existing favorites
int count = param->GetInt("Recent", 0);
for (int i = 0; i < count; i++) {
for (int i = 0; static_cast<long>(i) < count; i++) {
QString key = QString::fromLatin1("MRU%1").arg(i);
param->RemoveASCII(key.toStdString().c_str());
}
@@ -342,6 +342,7 @@ void MaterialsEditor::propertyChange(const QString& property, const QString valu
_material->setAppearanceValue(property, value);
updatePreview();
}
update();
_edited = true;
}
@@ -514,6 +515,15 @@ void MaterialsEditor::onOk(bool checked)
{
Q_UNUSED(checked)
// Ensure data is saved (or discarded) before exiting
if (_material->getEditState() != Materials::Material::ModelEdit_None) {
// Prompt the user to save or discard changes
int res = confirmSave(this);
if (res == QMessageBox::Cancel) {
return;
}
}
accept();
}
@@ -606,7 +616,7 @@ void MaterialsEditor::saveMaterialTree(const Base::Reference<ParameterGrp>& para
treeParam->Clear();
auto tree = ui->treeMaterials;
auto model = static_cast<QStandardItemModel*>(tree->model());
auto model = dynamic_cast<QStandardItemModel*>(tree->model());
auto root = model->invisibleRootItem();
for (int i = 0; i < root->rowCount(); i++) {
@@ -796,7 +806,7 @@ void MaterialsEditor::fillMaterialTree()
"User parameter:BaseApp/Preferences/Mod/Material/Editor/MaterialTree");
auto tree = ui->treeMaterials;
auto model = static_cast<QStandardItemModel*>(tree->model());
auto model = dynamic_cast<QStandardItemModel*>(tree->model());
auto lib = new QStandardItem(tr("Favorites"));
lib->setFlags(Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
@@ -835,7 +845,7 @@ void MaterialsEditor::createMaterialTree()
void MaterialsEditor::refreshMaterialTree()
{
auto tree = ui->treeMaterials;
auto model = static_cast<QStandardItemModel*>(tree->model());
auto model = dynamic_cast<QStandardItemModel*>(tree->model());
model->clear();
fillMaterialTree();
@@ -925,7 +935,7 @@ QString MaterialsEditor::getColorHash(const QString& colorString, int colorRange
void MaterialsEditor::updateMaterialAppearance()
{
QTreeView* tree = ui->treeAppearance;
auto treeModel = static_cast<QStandardItemModel*>(tree->model());
auto treeModel = dynamic_cast<QStandardItemModel*>(tree->model());
treeModel->clear();
QStringList headers;
@@ -1099,7 +1109,7 @@ void MaterialsEditor::onSelectMaterial(const QItemSelection& selected,
// Get the UUID before changing the underlying data model
QString uuid;
auto model = static_cast<QStandardItemModel*>(ui->treeMaterials->model());
auto model = dynamic_cast<QStandardItemModel*>(ui->treeMaterials->model());
QModelIndexList indexes = selected.indexes();
for (auto it = indexes.begin(); it != indexes.end(); it++) {
QStandardItem* item = model->itemFromIndex(*it);
@@ -1140,6 +1150,15 @@ void MaterialsEditor::onDoubleClick(const QModelIndex& index)
{
Q_UNUSED(index)
// Ensure data is saved (or discarded) before exiting
if (_material->getEditState() != Materials::Material::ModelEdit_None) {
// Prompt the user to save or discard changes
int res = confirmSave(this);
if (res == QMessageBox::Cancel) {
return;
}
}
accept();
}

View File

@@ -82,7 +82,7 @@ void ModelSelect::getFavorites()
auto param = App::GetApplication().GetParameterGroupByPath(
"User parameter:BaseApp/Preferences/Mod/Material/Models/Favorites");
int count = param->GetInt("Favorites", 0);
for (int i = 0; i < count; i++) {
for (int i = 0; static_cast<long>(i) < count; i++) {
QString key = QString::fromLatin1("FAV%1").arg(i);
QString uuid = QString::fromStdString(param->GetASCII(key.toStdString().c_str(), ""));
_favorites.push_back(uuid);
@@ -96,7 +96,7 @@ void ModelSelect::saveFavorites()
// Clear out the existing favorites
int count = param->GetInt("Favorites", 0);
for (int i = 0; i < count; i++) {
for (int i = 0; static_cast<long>(i) < count; i++) {
QString key = QString::fromLatin1("FAV%1").arg(i);
param->RemoveASCII(key.toStdString().c_str());
}
@@ -149,7 +149,7 @@ void ModelSelect::getRecents()
"User parameter:BaseApp/Preferences/Mod/Material/Models/Recent");
_recentMax = param->GetInt("RecentMax", 5);
int count = param->GetInt("Recent", 0);
for (int i = 0; i < count; i++) {
for (int i = 0; static_cast<long>(i) < count; i++) {
QString key = QString::fromLatin1("MRU%1").arg(i);
QString uuid = QString::fromStdString(param->GetASCII(key.toStdString().c_str(), ""));
_recents.push_back(uuid);
@@ -163,7 +163,7 @@ void ModelSelect::saveRecents()
// Clear out the existing favorites
int count = param->GetInt("Recent", 0);
for (int i = 0; i < count; i++) {
for (int i = 0; static_cast<long>(i) < count; i++) {
QString key = QString::fromLatin1("MRU%1").arg(i);
param->RemoveASCII(key.toStdString().c_str());
}

View File

@@ -4,7 +4,7 @@ General:
UUID: "5dbb7be6-8b63-479b-ab4c-87be02ead973"
Author: "David Carter"
License: "GPL-2.0-or-later"
Name: "Default Appearance"
Name: "Default"
Description: "Defines the default appearance properties"
AppearanceModels:
BasicRendering:

View File

@@ -3,7 +3,7 @@
General:
UUID: "ef0e4040-a498-48c3-a87b-e996bfd89195"
License: "GPL-2.0-or-later"
Name: "Carbon dioxide"
Name: "Carbon Dioxide"
Description: "Carbon dioxide properties at 20 Degrees Celsius and 1 atm"
Models:
Father:

View File

@@ -0,0 +1,16 @@
---
# File created by FreeCAD 0.22.0 Revision: 35279 +19 (Git)
General:
UUID: "c8bb743d-0f50-4109-b452-725037c3e3ec"
Name: "Diagonal4"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
PAT:
UUID: "0326c759-4e3d-46ca-bb7d-146ebebea65e"
Hatch Color: "(0,0,0,1)"
Hatch Pattern: |2
*Diagonal4, 45 diagonal R, Solid, 4.0 mm separation
45,0,0,0,4.0
Hatch Scale: "1"
Hatch Weight: "1"

View File

@@ -0,0 +1,16 @@
---
# File created by FreeCAD 0.22.0 Revision: 35279 +19 (Git)
General:
UUID: "bf7789e6-227d-4859-a75b-18008723fb51"
Name: "Diagonal5"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
PAT:
UUID: "0326c759-4e3d-46ca-bb7d-146ebebea65e"
Hatch Color: "(0,0,0,1)"
Hatch Pattern: |2
*Diagonal5, 45 diagonal L, Solid, 4.0 mm separation
-45,0,0,0,4.0
Hatch Scale: "1"
Hatch Weight: "1"

View File

@@ -0,0 +1,17 @@
---
# File created by FreeCAD 0.22.0 Revision: 35279 +19 (Git)
General:
UUID: "7cc39c57-f49c-400d-a985-8f8d141f5478"
Name: "Diamond"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
PAT:
UUID: "0326c759-4e3d-46ca-bb7d-146ebebea65e"
Hatch Color: "(0,0,0,1)"
Hatch Pattern: |2
*Diamond, 45 diagonals L & R, Solid, 1.0 mm separation
45,0,0,0,1.0
-45,0,0,0,1.0
Hatch Scale: "1"
Hatch Weight: "1"

View File

@@ -0,0 +1,17 @@
---
# File created by FreeCAD 0.22.0 Revision: 35279 +19 (Git)
General:
UUID: "b8940cab-1fbb-4ba5-9e32-2179589d6593"
Name: "Diamond2"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
PAT:
UUID: "0326c759-4e3d-46ca-bb7d-146ebebea65e"
Hatch Color: "(0,0,0,1)"
Hatch Pattern: |2
*Diamond2, 45 diagonals L & R, Solid, 2.0 mm separation
45,0,0,0,2.0
-45,0,0,0,2.0
Hatch Scale: "1"
Hatch Weight: "1"

View File

@@ -0,0 +1,17 @@
---
# File created by FreeCAD 0.22.0 Revision: 35279 +19 (Git)
General:
UUID: "a9146fcf-4168-4065-8a58-ec78735e471d"
Name: "Diamond4"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
PAT:
UUID: "0326c759-4e3d-46ca-bb7d-146ebebea65e"
Hatch Color: "(0,0,0,1)"
Hatch Pattern: |2
*Diamond4, 45 diagonals L & R, Solid, 4.0 mm separation
45,0,0,0,4.0
-45,0,0,0,4.0
Hatch Scale: "1"
Hatch Weight: "1"

View File

@@ -0,0 +1,16 @@
---
# File created by FreeCAD 0.22.0 Revision: 35279 +19 (Git)
General:
UUID: "0902d885-ac66-441e-9c3f-e0086a4817fc"
Name: "Horizontal5"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
PAT:
UUID: "0326c759-4e3d-46ca-bb7d-146ebebea65e"
Hatch Color: "(0,0,0,1)"
Hatch Pattern: |2
*Horizontal5, horizontal lines, Solid 5.0 separation
0,0,0,0,5.0
Hatch Scale: "1"
Hatch Weight: "1"

View File

@@ -0,0 +1,17 @@
---
# File created by FreeCAD 0.22.0 Revision: 35279 +19 (Git)
General:
UUID: "7e8510f7-7d87-4782-894d-068b0d3f04b7"
Name: "Square"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
PAT:
UUID: "0326c759-4e3d-46ca-bb7d-146ebebea65e"
Hatch Color: "(0,0,0,1)"
Hatch Pattern: |2
*Square, square grid, Solid, 5.0 mm separation
90,1,1,0,5.0
0,0,0,1,5.0
Hatch Scale: "1"
Hatch Weight: "1"

View File

@@ -0,0 +1,16 @@
---
# File created by FreeCAD 0.22.0 Revision: 35279 +19 (Git)
General:
UUID: "eaa335a5-3bee-4da7-9e26-0ebbdac2e182"
Name: "Vertical5"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
PAT:
UUID: "0326c759-4e3d-46ca-bb7d-146ebebea65e"
Hatch Color: "(0,0,0,1)"
Hatch Pattern: |2
*Vertical5, vertical lines, Solid, 5.0 separation
90,0,0,0,5.0
Hatch Scale: "1"
Hatch Weight: "1"

View File

@@ -0,0 +1,43 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +10 (Git)
General:
UUID: "abab7c4a-464a-40af-bf9e-32f658adf224"
Name: "aluminum"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.0" id="svg2" height="64" width="64">
<metadata id="metadata23">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs21" />
<g id="groupe1">
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 0.0 L 64.0 64.0 " id="Line_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 48.0 64.0 L 0.0 16.0 " id="Line014_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 64.0 L 0.0 12.8 " id="Line015_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 0.0 L 64.0 12.8 " id="Line013_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 3.2 0.0 L 64.0 60.8 " id="Line001_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 60.8 L 3.2 64.0 " id="Line002_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 35.2 0.0 L 64.0 28.8 " id="Line006_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 44.8 L 19.2 64.0 " id="Line009_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 64.0 48.0 L 16.0 0.0 " id="Line010_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 32.0 L 32.0 64.0 " id="Line003_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 64.0 44.8 L 19.2 0.0 " id="Line011_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 48.0 0.0 L 64.0 16.0 " id="Line012_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 28.8 L 35.2 64.0 " id="Line004_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 0.0 L 64.0 32.0 " id="Line005_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 48.0 L 16.0 64.0 " id="Line008_w0000" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,74 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "37b63834-928e-444c-a1b7-49a3f3fba3d1"
Name: "brick01"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" version="1.1" id="svg2" height="64" width="64">
<defs id="defs4">
<clipPath id="clip1">
<path d="M 12.539062,411 68,411 l 0,2 -55.460938,0 z m 0,0" id="path8148" />
</clipPath>
<clipPath id="clip2">
<path d="M 12.539062,468 124,468 l 0,2 -111.460938,0 z m 0,0" id="path8151" />
</clipPath>
<clipPath id="clip3">
<path d="M 12.539062,525 68,525 l 0,2 -55.460938,0 z m 0,0" id="path8154" />
</clipPath>
<clipPath id="clip4">
<path d="M 12.539062,408 124,408 l 0,2 -111.460938,0 z m 0,0" id="path8157" />
</clipPath>
<clipPath id="clip5">
<path d="M 12.539062,465 68,465 l 0,2 -55.460938,0 z m 0,0" id="path8160" />
</clipPath>
<clipPath id="clip6">
<path d="M 12.539062,522 124,522 l 0,2 -111.460938,0 z m 0,0" id="path8163" />
</clipPath>
<clipPath id="clip7">
<path d="M 12.539062,579 68,579 l 0,2 -55.460938,0 z m 0,0" id="path8166" />
</clipPath>
<clipPath id="clip8">
<path d="M 12.539062,354 241,354 l 0,228.5 -228.460938,0 z m 0,0" id="path8169" />
</clipPath>
</defs>
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Pablo Gil</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>SVG</rdf:li>
<rdf:li>template</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer2">
<path id="path8461" d="m 31.2566,0 0,15.23976 L 0,15.23976 0,0 Z" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path8463" d="m 31.99908,0 0,15.23976 31.2566,0 0,-15.23976 z" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path8467" d="m 63.99926,31.25606 -16.00009,0 0,-15.25624 16.00009,0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795276;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path8469" d="m 0,15.99982 15.23892,0 0,15.25624 -15.23892,0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795276;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path8471" d="m 0,31.99963 31.2566,0 0,15.25625 -31.2566,0 z" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path8473" d="m 0,47.99944 15.23892,0 0,15.25625 -15.23892,0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795276;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="rect8477" d="m 16.00008,15.99982 31.256611,0 0,15.25624 -31.256611,0 z" style="opacity:1;fill:none;fill-opacity:0.61872146;fill-rule:nonzero;stroke:#000000;stroke-width:0.37795276;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="rect8479" d="m 31.999081,31.99963 31.256599,0 0,15.25625 -31.256599,0 z" style="opacity:1;fill:none;fill-opacity:0.61872146;fill-rule:nonzero;stroke:#000000;stroke-width:0.37795276;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="rect8481" d="m 16.00008,47.999439 31.256611,0 0,15.256251 -31.256611,0 z" style="opacity:1;fill:none;fill-opacity:0.61872146;fill-rule:nonzero;stroke:#000000;stroke-width:0.37795276;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795276;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 63.99926,63.25569 -16.00009,0 0,-15.25625 16.00009,0" id="path8486" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,65 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "39221178-f9a4-40f5-927f-eed2f17c748d"
Name: "concrete"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" id="svg3880">
<metadata id="metadata3920">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs3882">
<pattern height=".5" width=".5" y="0" x="0" patternUnits="userSpaceOnUse" id="concrete">
<g id="g3401" transform="scale(.01)" style="fill:none;stroke:#000000;stroke-width:0.5">
<path id="path3886" d="m 5.3571428,3.5228946 a 1.3392857,1.3392857 0 1 1 -2.6785715,0 1.3392857,1.3392857 0 1 1 2.6785715,0 z" />
<path id="path3888" d="m 14.107143,6.8264661 a 3.2142856,3.2142856 0 1 1 -6.4285711,0 3.2142856,3.2142856 0 1 1 6.4285711,0 z" />
<path id="path3890" d="m 14.821428,30.933609 a 0.71428573,0.71428573 0 1 1 -1.428571,0 0.71428573,0.71428573 0 1 1 1.428571,0 z" />
<path id="path3892" d="m 28.571428,16.201466 a 2.2321429,2.2321429 0 1 1 -4.464286,0 2.2321429,2.2321429 0 1 1 4.464286,0 z" />
<path id="path3894" d="m 6.2500002,20.085394 a 0.49107143,0.49107143 0 1 1 -0.9821429,0 0.49107143,0.49107143 0 1 1 0.9821429,0 z" />
<path id="path3896" d="m 34.732144,27.527725 a 0.26785713,0.43340197 0 1 1 -0.535714,0 0.26785713,0.43340197 0 1 1 0.535714,0 z" />
<path id="path3898" d="m 40.178572,9.3711081 a 0.13392857,0.22321428 0 1 1 -0.267857,0 0.13392857,0.22321428 0 1 1 0.267857,0 z" />
<path id="path3900" d="m 40.982144,38.746109 a 0.22321428,0.22321428 0 1 1 -0.446428,0 0.22321428,0.22321428 0 1 1 0.446428,0 z" />
<path id="path3902" d="m 31.160715,40.576466 a 3.9285715,3.9285715 0 1 1 -7.857143,0 3.9285715,3.9285715 0 1 1 7.857143,0 z" />
<path id="path3904" d="m 22.232143,38.255035 a 1.6071428,1.6071428 0 1 1 -3.214286,0 1.6071428,1.6071428 0 1 1 3.214286,0 z" />
<path id="path3906" d="m 41.964287,11.647895 a 0.89285713,0.89285713 0 1 1 -1.785714,0 0.89285713,0.89285713 0 1 1 1.785714,0 z" />
<path id="path3908" d="m 36.07143,25.755037 a 0.35714287,0.35714287 0 1 1 -0.714286,0 0.35714287,0.35714287 0 1 1 0.714286,0 z" />
<path id="path3910" d="m 6.25,42.987179 a 0.625,0.625 0 1 1 -1.25,0 0.625,0.625 0 1 1 1.25,0 z" />
<path id="path3912" d="m 17.321428,19.951466 a 1.3392857,1.3392857 0 1 1 -2.678571,0 1.3392857,1.3392857 0 1 1 2.678571,0 z" />
<path id="path3914" d="m 11.964286,18.165752 a 0.44642857,0.44642857 0 1 1 -0.892857,0 0.44642857,0.44642857 0 1 1 0.892857,0 z" />
<path id="path3916" d="m 16.607143,7.8978949 a 0.53571427,0.53571427 0 1 1 -1.071429,0 0.53571427,0.53571427 0 1 1 1.071429,0 z" />
</g>
</pattern>
</defs>
<g style="fill:none;stroke:#000000;stroke-width:0.5" transform="matrix(1.4548802,0,0,-1.4548802,-0.3104243,65.764647)" id="g4092">
<path d="m 5.3571428,3.5228946 a 1.3392857,1.3392857 0 1 1 -2.6785715,0 1.3392857,1.3392857 0 1 1 2.6785715,0 z" id="path4094" />
<path d="m 14.107143,6.8264661 a 3.2142856,3.2142856 0 1 1 -6.4285711,0 3.2142856,3.2142856 0 1 1 6.4285711,0 z" id="path4096" />
<path d="m 14.821428,30.933609 a 0.71428573,0.71428573 0 1 1 -1.428571,0 0.71428573,0.71428573 0 1 1 1.428571,0 z" id="path4098" />
<path d="m 28.571428,16.201466 a 2.232143,2.232143 0 1 1 -4.464286,0 2.232143,2.232143 0 1 1 4.464286,0 z" id="path4100" />
<path d="m 6.2500002,20.085394 a 0.49107145,0.49107145 0 1 1 -0.9821429,0 0.49107145,0.49107145 0 1 1 0.9821429,0 z" id="path4102" />
<path d="m 34.732144,27.527725 a 0.26785713,0.43340197 0 1 1 -0.535714,0 0.26785713,0.43340197 0 1 1 0.535714,0 z" id="path4104" />
<path d="m 40.178572,9.3711081 a 0.13392857,0.22321428 0 1 1 -0.267857,0 0.13392857,0.22321428 0 1 1 0.267857,0 z" id="path4106" />
<path d="m 40.982144,38.746109 a 0.22321428,0.22321428 0 1 1 -0.446428,0 0.22321428,0.22321428 0 1 1 0.446428,0 z" id="path4108" />
<path d="m 31.160715,40.576466 a 3.9285715,3.9285715 0 1 1 -7.857143,0 3.9285715,3.9285715 0 1 1 7.857143,0 z" id="path4110" />
<path d="m 22.232143,38.255035 a 1.607143,1.607143 0 1 1 -3.214286,0 1.607143,1.607143 0 1 1 3.214286,0 z" id="path4112" />
<path d="m 41.964287,11.647895 a 0.89285713,0.89285713 0 1 1 -1.785714,0 0.89285713,0.89285713 0 1 1 1.785714,0 z" id="path4114" />
<path d="m 36.07143,25.755037 a 0.357143,0.357143 0 1 1 -0.714286,0 0.357143,0.357143 0 1 1 0.714286,0 z" id="path4116" />
<path d="m 6.25,42.987179 a 0.625,0.625 0 1 1 -1.25,0 0.625,0.625 0 1 1 1.25,0 z" id="path4118" />
<path d="m 17.321428,19.951466 a 1.3392857,1.3392857 0 1 1 -2.678571,0 1.3392857,1.3392857 0 1 1 2.678571,0 z" id="path4120" />
<path d="m 11.964286,18.165752 a 0.44642857,0.44642857 0 1 1 -0.892857,0 0.44642857,0.44642857 0 1 1 0.892857,0 z" id="path4122" />
<path d="m 16.607143,7.8978949 a 0.5357145,0.5357145 0 1 1 -1.071429,0 0.5357145,0.5357145 0 1 1 1.071429,0 z" id="path4124" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,47 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "e321248b-de79-4573-b68b-53df020052b0"
Name: "cross"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" id="svg3542">
<metadata id="metadata3552">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs3544">
<pattern height=".1" width=".1" y="0" x="0" patternUnits="userSpaceOnUse" id="cross">
<g id="g3382" style="fill:none;stroke:#000000;stroke-width:0.005">
<path id="path3384" d="M0,0 l.12,.12" />
<path id="path3386" d="M.12,0 l-.12,.12" />
</g>
</pattern>
</defs>
<path id="path2998" d="M 64,0 0,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3000" d="M 48,0 0,48" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3002" d="M 16,64 64,16" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3004" d="M 32,0 0,32" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3006" d="M 16,0 0,16" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3008" d="M 64,32 32,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3010" d="M 64,48 48,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3683" d="M 0,0 64,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3685" d="M 16,0 64,48" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3687" d="M 32,0 64,32" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3689" d="M 48,0 64,16" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3691" d="M 0,16 48,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3693" d="M 0,32 32,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3695" d="M 0,48 16,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,87 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "50e78494-a675-413f-a541-70d1904f0189"
Name: "cuprous"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.0" id="svg2" height="64" width="64">
<metadata id="metadata67">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs65" />
<g id="groupe1">
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 0.0 L 64.0 64.0 " id="Line_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 19.2 L 16.0 22.4 " id="Line022_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 6.4 L 16.0 9.6 " id="Line023_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 51.2 L 22.4 54.4 " id="Line024_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 25.6 L 22.4 28.8 " id="Line026_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 38.4 L 22.4 41.6 " id="Line025_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 0.0 L 9.6 3.2 " id="Line014_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 19.2 L 3.2 22.4 " id="Line012_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 38.4 L 9.6 41.6 " id="Line016_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 25.6 L 9.6 28.8 " id="Line017_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 44.8 L 16.0 48.0 " id="Line020_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 6.4 L 3.2 9.6 " id="Line013_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 32.0 L 16.0 35.2 " id="Line021_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 32.0 L 3.2 35.2 " id="Line011_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 12.8 L 9.6 16.0 " id="Line018_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 51.2 L 9.6 54.4 " id="Line015_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 57.6 L 16.0 60.8 " id="Line019_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 0.0 L 64.0 12.8 " id="Line008_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 57.6 L 3.2 60.8 " id="Line009_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 44.8 L 3.2 48.0 " id="Line010_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 12.8 L 51.2 64.0 " id="Line001_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 0.0 L 64.0 51.2 " id="Line005_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 38.4 L 25.6 64.0 " id="Line003_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 51.2 L 12.8 64.0 " id="Line004_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 25.6 L 38.4 64.0 " id="Line002_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 0.0 L 64.0 38.4 " id="Line006_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 0.0 L 64.0 25.6 " id="Line007_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 6.4 L 41.6 9.6 " id="Line043_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 25.6 L 48.0 28.8 " id="Line046_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 0.0 L 35.2 3.2 " id="Line034_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 57.6 L 28.8 60.8 " id="Line029_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 32.0 L 28.8 35.2 " id="Line031_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 6.4 L 28.8 9.6 " id="Line033_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 12.8 L 35.2 16.0 " id="Line035_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 19.2 L 41.6 22.4 " id="Line042_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 0.0 L 48.0 3.2 " id="Line044_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 57.6 L 54.4 60.8 " id="Line049_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 44.8 L 28.8 48.0 " id="Line030_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 19.2 L 28.8 22.4 " id="Line032_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 57.6 L 41.6 60.8 " id="Line039_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 12.8 L 48.0 16.0 " id="Line045_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 32.0 L 54.4 35.2 " id="Line051_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 0.0 L 22.4 3.2 " id="Line028_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 44.8 L 41.6 48.0 " id="Line040_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 38.4 L 48.0 41.6 " id="Line047_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 25.6 L 35.2 28.8 " id="Line036_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 32.0 L 41.6 35.2 " id="Line041_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 38.4 L 35.2 41.6 " id="Line037_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 51.2 L 48.0 54.4 " id="Line048_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 51.2 L 35.2 54.4 " id="Line038_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 44.8 L 54.4 48.0 " id="Line050_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 12.8 L 22.4 16.0 " id="Line027_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 19.2 L 54.4 22.4 " id="Line052_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 6.4 L 54.4 9.6 " id="Line053_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 51.2 L 60.8 54.4 " id="Line058_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 12.8 L 60.8 16.0 " id="Line055_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 38.4 L 60.8 41.6 " id="Line057_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 0.0 L 60.8 3.2 " id="Line054_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 25.6 L 60.8 28.8 " id="Line056_w0000" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,102 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "2b4e5304-13ab-47d1-b530-e438eeda4ed0"
Name: "diagonal1"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.1" id="svg2" height="64" width="64">
<defs id="defs4" />
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Pablo Gil</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>SVG</rdf:li>
<rdf:li>template</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer4">
<path id="path11166" d="m 0,2.000001 2,-2" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11168" d="M 3.9999999,1e-6 0,4.0000009" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11170" d="M 0,6.0000009 5.9999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11172" d="M 7.9999999,1e-6 0,8.0000009" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11174" d="m 0,10.000001 9.9999998,-10" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11176" d="m 12,1e-6 -12,12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11178" d="m 0,14.000001 14,-14" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11180" d="m 16,1e-6 -16,16" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11182" d="m 0,18.000001 18,-18" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11184" d="m 20,1e-6 -20,20" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11186" d="m 0,22.000001 22,-22" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11188" d="m 24,1e-6 -24,24" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11190" d="m 0,26.000001 26,-26" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11192" d="m 28,1e-6 -28,28" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11194" d="m 0,30.000001 30,-30" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11196" d="M 32,1e-6 0,32" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11198" d="M 0,34 33.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11200" d="M 35.999999,1e-6 0,36" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11202" d="M 0,38 37.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11204" d="M 39.999999,1e-6 0,40" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11206" d="M 0,42 41.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11208" d="M 43.999999,1e-6 0,44" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11210" d="M 0,46 45.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11212" d="M 47.999999,1e-6 0,48" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11214" d="M 0,50 49.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11216" d="M 51.999999,1e-6 0,52" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11218" d="M 0,54 53.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11220" d="M 55.999999,1e-6 0,56" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11222" d="M 0,58 57.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11224" d="M 59.999999,1e-6 0,60" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11226" d="M 0,62 61.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11228" d="M 63.999999,1e-6 0,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11230" d="M 2,64 63.999999,2.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11232" d="M 63.999999,4.0000009 3.9999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11234" d="M 5.9999999,64 63.999999,6.0000009" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11236" d="M 63.999999,8.0000009 7.9999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11238" d="M 9.9999998,64 63.999999,10.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11240" d="M 63.999999,12.000001 12,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11242" d="M 14,64 63.999999,14.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11244" d="M 63.999999,16.000001 16,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11246" d="M 18,64 63.999999,18.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11248" d="M 63.999999,20.000001 20,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11250" d="M 22,64 63.999999,22.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11252" d="M 63.999999,24.000001 24,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11254" d="M 26,64 63.999999,26.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11256" d="M 63.999999,28.000001 28,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11258" d="M 30,64 63.999999,30.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11260" d="M 63.999999,32 32,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11262" d="m 33.999999,64 30,-30" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11264" d="m 63.999999,36 -28,28" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11266" d="m 37.999999,64 26,-26" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11268" d="m 63.999999,40 -24,24" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11270" d="m 41.999999,64 22,-22" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11272" d="m 63.999999,44 -20,20" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11274" d="m 45.999999,64 18,-18" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11276" d="m 63.999999,48 -16,16" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11278" d="m 49.999999,64 14,-14" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11280" d="m 63.999999,52 -12,12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11282" d="m 53.999999,64 10,-10" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11284" d="m 63.999999,56 -8,8" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11286" d="m 57.999999,64 6,-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11288" d="m 59.999999,64 4,-4" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11290" d="m 61.999999,64 2,-2" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,102 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "91efc25f-a841-4bb3-a4ca-6b4d70fd4e05"
Name: "diagonal2"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.1" id="svg2" height="64" width="64">
<defs id="defs4" />
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Pablo Gil</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>SVG</rdf:li>
<rdf:li>template</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer4">
<path id="path11166" d="m 63.999999,2.000001 -2,-2" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11168" d="m 59.999999,1e-6 4,3.9999999" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11170" d="m 63.999999,6.0000009 -6,-5.9999999" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11172" d="m 55.999999,1e-6 8,7.9999999" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11174" d="m 63.999999,10.000001 -10,-10" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11176" d="m 51.999999,1e-6 12,12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11178" d="m 63.999999,14.000001 -14,-14" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11180" d="m 47.999999,1e-6 16,16" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11182" d="m 63.999999,18.000001 -18,-18" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11184" d="m 43.999999,1e-6 20,20" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11186" d="m 63.999999,22.000001 -22,-22" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11188" d="m 39.999999,1e-6 24,24" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11190" d="m 63.999999,26.000001 -26,-26" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11192" d="m 35.999999,1e-6 28,28" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11194" d="m 63.999999,30.000001 -30,-30" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11196" d="M 31.999999,1e-6 63.999999,32" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11198" d="M 63.999999,34 30,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11200" d="M 28,1e-6 63.999999,36" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11202" d="M 63.999999,38 26,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11204" d="M 24,1e-6 63.999999,40" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11206" d="M 63.999999,42 22,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11208" d="M 20,1e-6 63.999999,44" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11210" d="M 63.999999,46 18,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11212" d="M 16,1e-6 63.999999,48" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11214" d="M 63.999999,50 14,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11216" d="M 12,1e-6 63.999999,52" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11218" d="M 63.999999,54 10,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11220" d="M 8,1e-6 63.999999,56" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11222" d="M 63.999999,58 6,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11224" d="M 4,1e-6 63.999999,60" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11226" d="M 63.999999,62 2,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11228" d="M 0,1e-6 63.999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11230" d="M 61.999999,64 0,2.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11232" d="M 0,4.0000009 59.999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11234" d="M 57.999999,64 0,6.0000009" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11236" d="M 0,8.0000009 55.999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11238" d="M 53.999999,64 0,10.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11240" d="M 0,12.000001 51.999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11242" d="M 49.999999,64 0,14.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11244" d="M 0,16.000001 47.999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11246" d="M 45.999999,64 0,18.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11248" d="M 0,20.000001 43.999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11250" d="M 41.999999,64 0,22.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11252" d="M 0,24.000001 39.999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11254" d="M 37.999999,64 0,26.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11256" d="M 0,28.000001 35.999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11258" d="M 33.999999,64 0,30.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11260" d="M 0,32 31.999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11262" d="M 30,64 0,34" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11264" d="M 0,36 28,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11266" d="M 26,64 0,38" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11268" d="M 0,40 24,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11270" d="M 22,64 0,42" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11272" d="M 0,44 20,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11274" d="M 18,64 0,46" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11276" d="M 0,48 16,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11278" d="M 14,64 0,50" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11280" d="M 0,52 12,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11282" d="M 10,64 0,54" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11284" d="m 0,56 8,8" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11286" d="M 6,64 0,58" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11288" d="M 4,64 0,60" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path11290" d="M 2,64 0,62" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,51 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "94149a01-f4ad-4e6a-a6df-acb3ea97eb0b"
Name: "earth"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.1" id="svg2" height="64" width="64">
<defs id="defs4" />
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Pablo Gil</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>SVG</rdf:li>
<rdf:li>template</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer4">
<path id="path10572" d="m 0,4.000001 31.999999,0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path10574" d="m 0,16 31.999999,0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path10576" d="m 1e-6,28.000001 31.999999,0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path10578" d="M 4,32.000001 4,63.999998" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path10580" d="m 16,32 0,31.999996" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path10582" d="m 28,32.000001 0,31.999997" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 32,59.999998 31.999999,0" id="path10615" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 32,47.999999 31.999999,0" id="path10617" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="m 32.000001,35.999998 31.999999,0" id="path10619" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 36,31.999998 36,9.9999999e-7" id="path10621" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 48,31.999999 48,3e-6" id="path10623" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 60,31.999998 60,9.9999999e-7" id="path10625" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,37 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "29329280-1e89-4e8f-8e22-4582965654b4"
Name: "general_steel"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.1" id="svg2" height="64" width="64">
<metadata id="metadata17">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs15" />
<g id="aaaa">
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 0.0 L 64.0 64.0 " id="Line_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 12.8 L 51.2 64.0 " id="Line001_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 25.6 L 38.4 64.0 " id="Line002_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 0.0 L 64.0 51.2 " id="Line005_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 0.0 L 64.0 12.8 " id="Line008_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 0.0 L 64.0 25.6 " id="Line007_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 51.2 L 12.8 64.0 " id="Line004_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 38.4 L 25.6 64.0 " id="Line003_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 0.0 L 64.0 38.4 " id="Line006_w0000" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,108 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "0f8f1e63-885e-4940-a562-afed029b172a"
Name: "glass"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.0" id="svg2" height="64" width="64">
<metadata id="metadata3639">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs3637" />
<g id="groupe1">
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 41.6 57.6 L 44.8 60.8 " id="Line605_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 35.2 0.0 L 38.4 3.2 " id="Line090_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 41.6 6.4 L 44.8 9.6 " id="Line091_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 48.0 32.0 L 51.2 35.2 " id="Line075_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 54.4 38.4 L 57.6 41.6 " id="Line076_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 60.8 44.8 L 64.0 48.0 " id="Line077_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 25.6 L 60.8 28.8 " id="Line089_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 54.4 19.2 L 57.6 22.4 " id="Line093_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 60.8 25.6 L 64.0 28.8 " id="Line094_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 48.0 12.8 L 51.2 16.0 " id="Line092_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 60.8 L 9.6 57.6 " id="Line354_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 0.0 L 35.2 3.2 " id="Line085_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 54.4 L 3.2 51.2 " id="Line355_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 6.4 L 28.8 9.6 " id="Line079_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 12.8 L 48.0 16.0 " id="Line087_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 19.2 L 54.4 22.4 " id="Line088_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 25.6 L 28.8 28.8 " id="Line054_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 19.2 L 22.4 22.4 " id="Line053_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 12.8 L 35.2 16.0 " id="Line080_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 0.0 L 22.4 3.2 " id="Line078_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 6.4 L 41.6 9.6 " id="Line086_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 28.8 25.6 L 32.0 28.8 " id="Line064_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 60.8 12.8 L 64.0 16.0 " id="Line097_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 54.4 6.4 L 57.6 9.6 " id="Line096_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 0.0 L 3.2 3.2 " id="Line000_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 6.4 L 9.6 9.6 " id="Line051_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 51.2 L 41.6 54.4 " id="Line049_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 57.6 L 48.0 60.8 " id="Line050_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 57.6 L 60.8 60.8 " id="Line059_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 12.8 L 16.0 16.0 " id="Line052_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 22.4 6.4 L 25.6 9.6 " id="Line071_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 28.8 12.8 L 32.0 16.0 " id="Line072_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 35.2 32.0 L 38.4 35.2 " id="Line065_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 35.2 19.2 L 38.4 22.4 " id="Line073_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 28.8 57.6 L 32.0 60.8 " id="Line353_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 32.0 L 35.2 35.2 " id="Line055_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 38.4 L 41.6 41.6 " id="Line056_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 44.8 L 48.0 48.0 " id="Line057_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 22.4 19.2 L 25.6 22.4 " id="Line063_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 51.2 L 54.4 54.4 " id="Line058_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 16.0 12.8 L 19.2 16.0 " id="Line062_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 41.6 38.4 L 44.8 41.6 " id="Line066_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 0.0 L 54.4 3.2 " id="Line098_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 9.6 6.4 L 12.8 9.6 " id="Line061_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 48.0 44.8 L 51.2 48.0 " id="Line067_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 54.4 51.2 L 57.6 54.4 " id="Line068_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 16.0 0.0 L 19.2 3.2 " id="Line070_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 60.8 57.6 L 64.0 60.8 " id="Line069_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 3.2 0.0 L 6.4 3.2 " id="Line060_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 22.4 51.2 L 25.6 54.4 " id="Line352_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 25.6 L 48.0 28.8 " id="Line082_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 57.6 L 28.8 60.8 " id="Line027_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 44.8 L 3.2 48.0 " id="Line020_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 19.2 L 41.6 22.4 " id="Line081_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 57.6 L 16.0 60.8 " id="Line022_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 51.2 L 22.4 54.4 " id="Line026_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 32.0 L 54.4 35.2 " id="Line083_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 41.6 25.6 L 44.8 28.8 " id="Line074_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 38.4 L 60.8 41.6 " id="Line084_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 19.2 L 9.6 22.4 " id="Line044_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 51.2 L 9.6 54.4 " id="Line021_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 38.4 L 9.6 41.6 " id="Line024_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 32.0 L 3.2 35.2 " id="Line023_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 44.8 L 16.0 48.0 " id="Line025_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 48.0 0.0 L 51.2 3.2 " id="Line095_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 6.4 L 60.8 9.6 " id="Line099_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 32.0 L 22.4 35.2 " id="Line046_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 12.8 L 3.2 16.0 " id="Line043_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 25.6 L 16.0 28.8 " id="Line045_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 38.4 L 28.8 41.6 " id="Line047_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 44.8 L 35.2 48.0 " id="Line048_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 35.2 51.2 L 38.4 54.4 " id="Line604_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 9.6 38.4 L 12.8 41.6 " id="Line350_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 3.2 32.0 L 6.4 35.2 " id="Line349_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 16.0 44.8 L 19.2 48.0 " id="Line351_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 28.8 44.8 L 32.0 48.0 " id="Line603_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 3.2 19.2 L 6.4 22.4 " id="Line599_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 22.4 38.4 L 25.6 41.6 " id="Line602_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 16.0 32.0 L 19.2 35.2 " id="Line601_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 9.6 25.6 L 12.8 28.8 " id="Line600_w0000" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,39 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "f2421e27-1b54-4c6e-8da9-e0be3f1783a5"
Name: "hatch45L"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" id="svg2985">
<metadata id="metadata2994">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs2987">
<pattern height=".1" width=".1" y="0" x="0" patternUnits="userSpaceOnUse" id="simple">
<g id="g3377" style="fill:none;stroke:#000000;stroke-width:0.005">
<path id="path3379" d="M0,0 l.12,.12" />
</g>
</pattern>
</defs>
<path id="path2998" d="M 0,0 64,64" style="fill:none;stroke:#000000;stroke-width:0.94488192;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path3000" d="M 16,0 64,48" style="fill:none;stroke:#000000;stroke-width:0.94488192;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path3002" d="M 48,64 0,16" style="fill:none;stroke:#000000;stroke-width:0.94488192;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path3004" d="M 32,0 64,32" style="fill:none;stroke:#000000;stroke-width:0.94488192;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path3006" d="M 48,0 64,16" style="fill:none;stroke:#000000;stroke-width:0.94488192;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path3008" d="M 0,32 32,64" style="fill:none;stroke:#000000;stroke-width:0.94488192;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path id="path3010" d="M 0,48 16,64" style="fill:none;stroke:#000000;stroke-width:0.94488192;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,39 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "169e4200-586d-4bde-aae5-4527392012f8"
Name: "hatch45R"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" id="svg2985">
<metadata id="metadata2994">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs2987">
<pattern height=".1" width=".1" y="0" x="0" patternUnits="userSpaceOnUse" id="simple">
<g id="g3377" style="fill:none;stroke:#000000;stroke-width:0.005">
<path id="path3379" d="M0,0 l.12,.12" />
</g>
</pattern>
</defs>
<path id="path2998" d="M 64,0 0,64" style="fill:none;stroke:#000000;stroke-width:0.94488189;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path3000" d="M 48,0 0,48" style="fill:none;stroke:#000000;stroke-width:0.94488189;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path3002" d="M 16,64 64,16" style="fill:none;stroke:#000000;stroke-width:0.94488189;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path3004" d="M 32,0 0,32" style="fill:none;stroke:#000000;stroke-width:0.94488189;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path3006" d="M 16,0 0,16" style="fill:none;stroke:#000000;stroke-width:0.94488189;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path3008" d="M 64,32 32,64" style="fill:none;stroke:#000000;stroke-width:0.94488189;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path3010" d="M 64,48 48,64" style="fill:none;stroke:#000000;stroke-width:0.94488189;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,169 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "92232ced-d96b-4cc8-a052-4e13f7d943ab"
Name: "hbone"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.1" id="svg2" height="64" width="64">
<defs id="defs4">
<clipPath id="clip1">
<path d="M 12.539062 12.5 L 13 12.5 L 13 13 L 12.539062 13 Z M 12.539062 12.5 " id="path8169" />
</clipPath>
<clipPath id="clip2">
<path d="M 12.539062 12.5 L 298 12.5 L 298 298 L 12.539062 298 Z M 12.539062 12.5 " id="path8172" />
</clipPath>
<clipPath id="clip3">
<path d="M 12.539062 154 L 441 154 L 441 582.5 L 12.539062 582.5 Z M 12.539062 154 " id="path8175" />
</clipPath>
<clipPath id="clip4">
<path d="M 582 12.5 L 583 12.5 L 583 13 L 582 13 Z M 582 12.5 " id="path8178" />
</clipPath>
<clipPath id="clip5">
<path d="M 581 12.5 L 584 12.5 L 584 14 L 581 14 Z M 581 12.5 " id="path8181" />
</clipPath>
<clipPath id="clip6">
<path d="M 582 12.5 L 583 12.5 L 583 13 L 582 13 Z M 582 12.5 " id="path8184" />
</clipPath>
<clipPath id="clip7">
<path d="M 581 12.5 L 584 12.5 L 584 14 L 581 14 Z M 581 12.5 " id="path8187" />
</clipPath>
<clipPath id="clip8">
<path d="M 582 12.5 L 583 12.5 L 583 13 L 582 13 Z M 582 12.5 " id="path8190" />
</clipPath>
<clipPath id="clip9">
<path d="M 581 12.5 L 584 12.5 L 584 14 L 581 14 Z M 581 12.5 " id="path8193" />
</clipPath>
<clipPath id="clip10">
<path d="M 582 12.5 L 583 12.5 L 583 13 L 582 13 Z M 582 12.5 " id="path8196" />
</clipPath>
<clipPath id="clip11">
<path d="M 581 12.5 L 584 12.5 L 584 14 L 581 14 Z M 581 12.5 " id="path8199" />
</clipPath>
<clipPath id="clip12">
<path d="M 582 12.5 L 583 12.5 L 583 13 L 582 13 Z M 582 12.5 " id="path8202" />
</clipPath>
<clipPath id="clip13">
<path d="M 581 12.5 L 584 12.5 L 584 14 L 581 14 Z M 581 12.5 " id="path8205" />
</clipPath>
<clipPath id="clip14">
<path d="M 582 12.5 L 583 12.5 L 583 13 L 582 13 Z M 582 12.5 " id="path8208" />
</clipPath>
<clipPath id="clip15">
<path d="M 297 439 L 441 439 L 441 582.5 L 297 582.5 Z M 297 439 " id="path8211" />
</clipPath>
<clipPath id="clip16">
<path d="M 582 582 L 583 582 L 583 582.5 L 582 582.5 Z M 582 582 " id="path8214" />
</clipPath>
<clipPath id="clip17">
<path d="M 581 581 L 584 581 L 584 582.5 L 581 582.5 Z M 581 581 " id="path8217" />
</clipPath>
<clipPath id="clip18">
<path d="M 582 582 L 583 582 L 583 582.5 L 582 582.5 Z M 582 582 " id="path8220" />
</clipPath>
<clipPath id="clip19">
<path d="M 581 581 L 584 581 L 584 582.5 L 581 582.5 Z M 581 581 " id="path8223" />
</clipPath>
<clipPath id="clip20">
<path d="M 582 582 L 583 582 L 583 582.5 L 582 582.5 Z M 582 582 " id="path8226" />
</clipPath>
<clipPath id="clip21">
<path d="M 581 581 L 584 581 L 584 582.5 L 581 582.5 Z M 581 581 " id="path8229" />
</clipPath>
<clipPath id="clip22">
<path d="M 582 582 L 583 582 L 583 582.5 L 582 582.5 Z M 582 582 " id="path8232" />
</clipPath>
<clipPath id="clip23">
<path d="M 581 581 L 584 581 L 584 582.5 L 581 582.5 Z M 581 581 " id="path8235" />
</clipPath>
<clipPath id="clip24">
<path d="M 582 582 L 583 582 L 583 582.5 L 582 582.5 Z M 582 582 " id="path8238" />
</clipPath>
<clipPath id="clip25">
<path d="M 297 582 L 298 582 L 298 582.5 L 297 582.5 Z M 297 582 " id="path8241" />
</clipPath>
<clipPath id="clip26">
<path d="M 296 581 L 299 581 L 299 582.5 L 296 582.5 Z M 296 581 " id="path8244" />
</clipPath>
<clipPath id="clip27">
<path d="M 297 582 L 298 582 L 298 582.5 L 297 582.5 Z M 297 582 " id="path8247" />
</clipPath>
<clipPath id="clip28">
<path d="M 296 581 L 299 581 L 299 582.5 L 296 582.5 Z M 296 581 " id="path8250" />
</clipPath>
<clipPath id="clip29">
<path d="M 297 582 L 298 582 L 298 582.5 L 297 582.5 Z M 297 582 " id="path8253" />
</clipPath>
<clipPath id="clip30">
<path d="M 296 581 L 299 581 L 299 582.5 L 296 582.5 Z M 296 581 " id="path8256" />
</clipPath>
<clipPath id="clip31">
<path d="M 297 582 L 298 582 L 298 582.5 L 297 582.5 Z M 297 582 " id="path8259" />
</clipPath>
<clipPath id="clip32">
<path d="M 296 581 L 299 581 L 299 582.5 L 296 582.5 Z M 296 581 " id="path8262" />
</clipPath>
<clipPath id="clip33">
<path d="M 297 582 L 298 582 L 298 582.5 L 297 582.5 Z M 297 582 " id="path8265" />
</clipPath>
<clipPath id="clip34">
<path d="M 296 581 L 299 581 L 299 582.5 L 296 582.5 Z M 296 581 " id="path8268" />
</clipPath>
<clipPath id="clip35">
<path d="M 297 582 L 298 582 L 298 582.5 L 297 582.5 Z M 297 582 " id="path8271" />
</clipPath>
<clipPath id="clip36">
<path d="M 12.539062 297 L 156 297 L 156 441 L 12.539062 441 Z M 12.539062 297 " id="path8274" />
</clipPath>
<clipPath id="clip37">
<path d="M 297 297 L 583 297 L 583 582.5 L 297 582.5 Z M 297 297 " id="path8277" />
</clipPath>
<clipPath id="clip38">
<path d="M 12.539062 12.5 L 156 12.5 L 156 156 L 12.539062 156 Z M 12.539062 12.5 " id="path8280" />
</clipPath>
<clipPath id="clip39">
<path d="M 297 12.5 L 583 12.5 L 583 298 L 297 298 Z M 297 12.5 " id="path8283" />
</clipPath>
<clipPath id="clip40">
<path d="M 12.539062 12.5 L 583 12.5 L 583 582.5 L 12.539062 582.5 Z M 12.539062 12.5 " id="path8286" />
</clipPath>
<clipPath id="clip41">
<path d="M 12.539062 12.5 L 13 12.5 L 13 582.5 L 12.539062 582.5 Z M 12.539062 12.5 " id="path8289" />
</clipPath>
</defs>
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Pablo Gil</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>SVG</rdf:li>
<rdf:li>template</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(-240.06625,-450.59799)" id="layer1">
<path id="path8652" d="m 240.06625,450.59799 16,16" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path8654" d="m 240.06625,482.59799 32,-32 16,16 -32,32 z" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path8656" d="m 304.06625,482.59799 -16,-16" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path8658" d="m 304.06625,514.59799 -32,-32" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path8660" d="m 288.06625,498.59799 -16,16" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path8662" d="m 240.06625,514.59799 16,-16" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,36 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "bf024194-da67-4c3c-a482-08c7efa6dbde"
Name: "line"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" id="svg3448">
<metadata id="metadata3457">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs3450">
<pattern height=".1" width=".1" y="0" x="0" patternUnits="userSpaceOnUse" id="line">
<g id="g3389" style="fill:none;stroke:#000000;stroke-width:0.005">
<path id="path3391" d="M0,0.05 l.12,0" />
</g>
</pattern>
</defs>
<path id="path3461" d="m 0,56 64,0" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3463" d="m 0,40 64,0" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3465" d="m 0,24 64,0" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3467" d="M 0,8 64,8" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,42 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "2fc720b1-19b3-4a30-a0f4-a782135559f5"
Name: "plastic"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.1" id="svg2" height="64" width="64">
<metadata id="metadata8744">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs8742" />
<g id="aaaa">
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 51.2 L 12.8 64.0 " id="Line_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 12.8 L 51.2 64 " id="Line003_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 38.4 L 25.6 64 " id="Line001_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 0.0 L 64 64 " id="Line004_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 25.6 L 38.4 64 " id="Line002_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 0.0 L 64 51.2 " id="Line005_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 0.0 L 64 38.4 " id="Line006_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 0.0 L 64 25.6 " id="Line007_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 0.0 L 64 12.8 " id="Line008_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 51.2 L 64 51.2 " id="Line010_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 64 L 64 64 " id="Line009_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 38.4 L 64 38.4 " id="Line011_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 25.6 L 64 25.6 " id="Line012_w0000" />
<path style="stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 12.8 L 64 12.8 " id="Line013_w0000" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,47 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "90b1bd10-7df1-4338-bb74-f82040570afd"
Name: "plus"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.1" id="svg2" height="64" width="64">
<defs id="defs4" />
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Pablo Gil</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>SVG</rdf:li>
<rdf:li>template</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer4">
<path id="path8277" d="m 16,12 0,8" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path8279" d="m 12,16 8.000001,0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" d="m 48,12 0,8" id="path8293" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" d="m 44,16 8.000001,0" id="path8295" />
<path id="path8297" d="m 16,44.000001 0,8" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path8299" d="m 12,48.000001 8.000001,0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" d="m 48,44.000001 0,8" id="path8301" />
<path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" d="m 44,48.000001 8.000001,0" id="path8303" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,39 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "52d16497-4e67-45f0-b366-62fdf93dcbe7"
Name: "simple"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" id="svg2985">
<metadata id="metadata2994">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs2987">
<pattern height=".1" width=".1" y="0" x="0" patternUnits="userSpaceOnUse" id="simple">
<g id="g3377" style="fill:none;stroke:#000000;stroke-width:0.005">
<path id="path3379" d="M0,0 l.12,.12" />
</g>
</pattern>
</defs>
<path id="path2998" d="M 64,0 0,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3000" d="M 48,0 0,48" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3002" d="M 16,64 64,16" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3004" d="M 32,0 0,32" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3006" d="M 16,0 0,16" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3008" d="M 64,32 32,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3010" d="M 64,48 48,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,40 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "d7c6b577-b41b-4d4b-a2b3-2139a1a9a7af"
Name: "solid"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.1" id="svg2" height="64" width="64">
<defs id="defs4" />
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Pablo Gil</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>SVG</rdf:li>
<rdf:li>template</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer4">
<path id="path12301" d="M -0.50000001,32 64.500001,32" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:65.00000102;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,41 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "836b307f-542d-466b-ba67-d96401b2fa8f"
Name: "square"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" id="svg3784">
<metadata id="metadata3794">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs3786">
<pattern height=".1" width=".1" y="0" x="0" patternUnits="userSpaceOnUse" id="square">
<g id="g3394" style="fill:none;stroke:#000000;stroke-width:0.005">
<path id="path3396" d="M0,0.05 l.12,0" />
<path id="path3398" d="M0.05,0 l0,.12" />
</g>
</pattern>
</defs>
<path id="path3461" d="m 0,56 64,0" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3463" d="m 0,40 64,0" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3465" d="m 0,24 64,0" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3467" d="M 0,8 64,8" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3811" d="M 8,0 8,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3813" d="m 24,0 0,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3815" d="m 40,0 0,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3817" d="m 56,0 0,64" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,71 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "e8555d5c-c9ff-458f-9ad3-ecabd02b5327"
Name: "steel"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.1" id="svg2" height="64" width="64">
<defs id="defs4" />
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Pablo Gil</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>SVG</rdf:li>
<rdf:li>template</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer4">
<path id="path11166" d="m 0,2.000001 2,-2" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11168" d="M 3.9999999,1e-6 0,4.0000009" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11174" d="m 0,10.000001 9.9999998,-10" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11176" d="m 12,1e-6 -12,12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11182" d="m 0,18.000001 18,-18" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11184" d="m 20,1e-6 -20,20" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11190" d="m 0,26.000001 26,-26" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11192" d="m 28,1e-6 -28,28" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11198" d="M 0,34 33.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11200" d="M 35.999999,1e-6 0,36" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11206" d="M 0,42 41.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11208" d="M 43.999999,1e-6 0,44" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11214" d="M 0,50 49.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11216" d="M 51.999999,1e-6 0,52" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11222" d="M 0,58 57.999999,1e-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11224" d="M 59.999999,1e-6 0,60" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11230" d="M 2,64 63.999999,2.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11232" d="M 63.999999,4.0000009 3.9999999,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11238" d="M 9.9999998,64 63.999999,10.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11240" d="M 63.999999,12.000001 12,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11246" d="M 18,64 63.999999,18.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11248" d="M 63.999999,20.000001 20,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11254" d="M 26,64 63.999999,26.000001" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11256" d="M 63.999999,28.000001 28,64" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11262" d="m 33.999999,64 30,-30" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11264" d="m 63.999999,36 -28,28" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11270" d="m 41.999999,64 22,-22" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11272" d="m 63.999999,44 -20,20" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11278" d="m 49.999999,64 14,-14" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11280" d="m 63.999999,52 -12,12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11286" d="m 57.999999,64 6,-6" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
<path id="path11288" d="m 59.999999,64 4,-4" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.37795277;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,83 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "5c66ffe9-6556-4361-9da7-ed3b187e3cfe"
Name: "titanium"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.0" id="svg2" height="64" width="64">
<metadata id="metadata10845">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs10843" />
<g id="groue">
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 6.4 L 60.8 9.6 " id="Line055_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 41.6 38.4 L 44.8 41.6 " id="Line008_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 0.0 L 64.0 25.6 " id="Line040_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 54.4 0.0 L 64.0 9.6 " id="Line042_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 12.8 L 3.2 16.0 " id="Line029_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 60.8 L 35.2 64.0 " id="Line028_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 6.4 L 28.8 9.6 " id="Line044_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 57.6 L 48.0 60.8 " id="Line036_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 32.0 L 54.4 35.2 " id="Line048_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 48.0 L 16.0 64.0 " id="Line015_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 25.6 L 16.0 28.8 " id="Line031_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 32.0 L 32.0 64.0 " id="Line016_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 51.2 L 41.6 54.4 " id="Line035_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 41.6 L 22.4 64.0 " id="Line014_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 60.8 57.6 L 64.0 60.8 " id="Line011_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 57.6 L 6.4 64.0 " id="Line012_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 48.0 L 22.4 51.2 " id="Line026_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 54.4 L 28.8 57.6 " id="Line027_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 19.2 L 9.6 22.4 " id="Line030_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 48.0 44.8 L 51.2 48.0 " id="Line009_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 32.0 L 22.4 35.2 " id="Line032_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 38.4 L 28.8 41.6 " id="Line033_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 54.4 51.2 L 57.6 54.4 " id="Line010_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 44.8 L 35.2 48.0 " id="Line034_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 16.0 0.0 L 64.0 48.0 " id="Line037_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 22.4 0.0 L 64.0 41.6 " id="Line038_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 0.0 L 64.0 32.0 " id="Line039_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 48.0 0.0 L 64.0 16.0 " id="Line041_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 19.2 0.0 L 22.4 3.2 " id="Line043_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 32.0 12.8 L 35.2 16.0 " id="Line045_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 19.2 L 41.6 22.4 " id="Line046_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 25.6 L 48.0 28.8 " id="Line047_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 38.4 L 60.8 41.6 " id="Line049_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 3.2 L 41.6 6.4 " id="Line050_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 57.6 22.4 L 60.8 25.6 " id="Line053_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 0.0 L 54.4 3.2 " id="Line054_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 44.8 9.6 L 48.0 12.8 " id="Line051_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 16.0 L 54.4 19.2 " id="Line052_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 16.0 L 48.0 64.0 " id="Line018_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 0.0 L 64.0 64.0 " id="Line_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 3.2 0.0 L 6.4 3.2 " id="Line002_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 25.6 L 38.4 64.0 " id="Line017_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 9.6 L 54.4 64.0 " id="Line019_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 44.8 L 3.2 48.0 " id="Line020_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 51.2 L 9.6 54.4 " id="Line021_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 57.6 L 16.0 60.8 " id="Line022_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 28.8 L 3.2 32.0 " id="Line023_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 35.2 L 9.6 38.4 " id="Line024_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 41.6 L 16.0 44.8 " id="Line025_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 6.4 0.0 L 64.0 57.6 " id="Line001_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 9.6 6.4 L 12.8 9.6 " id="Line003_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 22.4 19.2 L 25.6 22.4 " id="Line005_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 16.0 12.8 L 19.2 16.0 " id="Line004_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 28.8 25.6 L 32.0 28.8 " id="Line006_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 35.2 32.0 L 38.4 35.2 " id="Line007_w0000" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,158 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "c693952c-5f5a-4f8f-9e6f-714464219a8b"
Name: "wood"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" id="svg3137" height="64px" width="64px">
<defs id="defs3139">
<pattern id="wood" patternTransform="translate(-0.125,-0.5)" height="65.3125" width="64.96875" patternUnits="userSpaceOnUse">
<g transform="translate(0.125,0.5) scale(0.03,0.03)" id="g3339">
<line x1="36.013824" y1="49.588726" x2="46.448639" y2="44.405113" id="line10" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="26.508579" y1="56.911587" x2="36.013824" y2="49.588726" id="line12" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="18.324862" y1="43.802601" x2="22.828842" y2="36.588356" id="line14" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="10.451589" y1="52.414928" x2="18.324862" y2="43.802601" id="line16" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="60.741768" y1="45.401619" x2="64.450821" y2="51.171249" id="line18" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="54.284355" y1="38.168877" x2="60.741768" y2="45.401619" id="line20" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="46.965157" y1="31.99353" x2="54.284355" y2="38.168877" id="line22" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="53.594742" y1="58.920887" x2="56.52261" y2="64.536659" id="line24" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="48.170364" y1="50.482559" x2="53.594742" y2="58.920887" id="line26" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="41.540775" y1="42.990917" x2="48.170364" y2="50.482559" id="line28" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="34.652008" y1="36.532856" x2="41.540775" y2="42.990917" id="line30" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="39.301613" y1="57.026066" x2="44.812073" y2="64.536659" id="line34" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="30.174595" y1="46.005138" x2="39.301613" y2="57.026066" id="line36" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="20.61714" y1="38.168877" x2="30.174595" y2="46.005138" id="line38" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="12.86751" y1="34.29406" x2="20.61714" y2="38.168877" id="line40" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="2.8796287" y1="31.99353" x2="12.86751" y2="34.29406" id="line42" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="31.121544" y1="59.437401" x2="35.082443" y2="64.536659" id="line44" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="25.008472" y1="52.720814" x2="31.121544" y2="59.437401" id="line46" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="16.914499" y1="45.918133" x2="25.008472" y2="52.720814" id="line48" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="7.2709622" y1="40.75211" x2="16.914499" y2="45.918133" id="line50" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="0.094633415" y1="38.77166" x2="7.2709622" y2="40.75211" id="line52" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="19.411932" y1="58.662621" x2="23.803265" y2="64.536659" id="line54" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="15.364938" y1="54.27129" x2="19.411932" y2="58.662621" id="line56" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="9.8535614" y1="49.966042" x2="15.364938" y2="54.27129" id="line58" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="4.5152779" y1="47.038174" x2="9.8535614" y2="49.966042" id="line60" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="0.094633415" y1="45.745964" x2="4.5152779" y2="47.038174" id="line62" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="12.437076" y1="62.70961" x2="13.470121" y2="64.536659" id="line64" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="8.7344351" y1="58.060017" x2="12.437076" y2="62.70961" id="line66" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="4.0848436" y1="54.701721" x2="8.7344351" y2="58.060017" id="line68" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="0.094633415" y1="53.409504" x2="4.0848436" y2="54.701721" id="line70" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="35.922504" y1="17.814405" x2="46.356174" y2="12.550002" id="line10-8" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="26.418303" y1="25.251396" x2="35.922504" y2="17.814405" id="line12-2" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="18.235481" y1="11.938099" x2="22.73897" y2="4.6114168" id="line14-8" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="10.363072" y1="20.684654" x2="18.235481" y2="11.938099" id="line16-8" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="60.647736" y1="13.562038" x2="64.356377" y2="19.421593" id="line18-9" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="54.191032" y1="6.2165704" x2="60.647736" y2="13.562038" id="line20-6" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="46.872639" y1="-0.055021625" x2="54.191032" y2="6.2165704" id="line22-6" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="53.501495" y1="27.292013" x2="56.429043" y2="32.995308" id="line24-0" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="48.077713" y1="18.72217" x2="53.501495" y2="27.292013" id="line26-2" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="41.448853" y1="11.113765" x2="48.077713" y2="18.72217" id="line28-1" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="34.560841" y1="4.5550518" x2="41.448853" y2="11.113765" id="line30-7" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="27.759834" y1="-0.055021625" x2="34.560841" y2="4.5550518" id="line32-2" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="30.083918" y1="14.174964" x2="39.209934" y2="25.367659" id="line36-1" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="20.527508" y1="6.2165704" x2="30.083918" y2="14.174964" id="line38-3" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="12.778731" y1="2.2813628" x2="20.527508" y2="6.2165704" id="line40-2" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="2.7919424" y1="-0.055021625" x2="12.778731" y2="2.2813628" id="line42-0" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="24.918362" y1="20.995308" x2="31.030762" y2="27.816576" id="line46-7" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="16.825274" y1="14.086603" x2="24.918362" y2="20.995308" id="line48-7" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="7.1827955" y1="8.840064" x2="16.825274" y2="14.086603" id="line50-6" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="0.0072516869" y1="6.8287482" x2="7.1827955" y2="8.840064" id="line52-4" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="15.275883" y1="22.569948" x2="19.322433" y2="27.02972" id="line56-6" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="9.765111" y1="18.197601" x2="15.275883" y2="22.569948" id="line58-2" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="4.4274139" y1="15.2241" x2="9.765111" y2="18.197601" id="line60-1" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="0.0072516869" y1="13.911751" x2="4.4274139" y2="15.2241" id="line62-8" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="12.348343" y1="31.139784" x2="13.381276" y2="32.995308" id="line64-9" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="8.6461048" y1="26.417725" x2="12.348343" y2="31.139784" id="line66-0" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="3.9970255" y1="23.00709" x2="8.6461048" y2="26.417725" id="line68-0" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="0.0072516869" y1="21.694731" x2="3.9970255" y2="23.00709" id="line70-1" style="stroke:#000000;stroke-width:0.92287397px" />
<path id="path3331" d="M 19.181818,26.772727 34.90909,36.590909" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3333" d="m 56.454546,32.772727 3.090909,8" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3335" d="m 39.045455,25.181818 8.090909,6.909091" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3337" d="M 40.181818,38.545455 52.727272,35.818182 64.545454,29.454546" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</pattern>
</defs>
<metadata id="metadata3142">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<rect id="rect3468" y="-0.5" x="-0.125" height="65.3125" width="64.96875" style="stroke:none;fill:none" />
<line x1="36.013824" y1="49.588726" x2="46.448639" y2="44.405113" id="line3533" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="26.508579" y1="56.911587" x2="36.013824" y2="49.588726" id="line3535" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="18.324862" y1="43.802601" x2="22.828842" y2="36.588356" id="line3537" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="10.451589" y1="52.414928" x2="18.324862" y2="43.802601" id="line3539" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="60.741768" y1="45.401619" x2="64.450821" y2="51.171249" id="line3541" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="54.284355" y1="38.168877" x2="60.741768" y2="45.401619" id="line3543" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="46.965157" y1="31.99353" x2="54.284355" y2="38.168877" id="line3545" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="53.594742" y1="58.920887" x2="56.52261" y2="64.536659" id="line3547" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="48.170364" y1="50.482559" x2="53.594742" y2="58.920887" id="line3549" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="41.540775" y1="42.990917" x2="48.170364" y2="50.482559" id="line3551" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="34.652008" y1="36.532856" x2="41.540775" y2="42.990917" id="line3553" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="39.301613" y1="57.026066" x2="44.812073" y2="64.536659" id="line3555" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="30.174595" y1="46.005138" x2="39.301613" y2="57.026066" id="line3557" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="20.61714" y1="38.168877" x2="30.174595" y2="46.005138" id="line3559" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="12.86751" y1="34.29406" x2="20.61714" y2="38.168877" id="line3561" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="2.8796287" y1="31.99353" x2="12.86751" y2="34.29406" id="line3563" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="31.121544" y1="59.437401" x2="35.082443" y2="64.536659" id="line3565" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="25.008472" y1="52.720814" x2="31.121544" y2="59.437401" id="line3567" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="16.914499" y1="45.918133" x2="25.008472" y2="52.720814" id="line3569" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="7.2709622" y1="40.75211" x2="16.914499" y2="45.918133" id="line3571" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="0.094633415" y1="38.77166" x2="7.2709622" y2="40.75211" id="line3573" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="19.411932" y1="58.662621" x2="23.803265" y2="64.536659" id="line3575" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="15.364938" y1="54.27129" x2="19.411932" y2="58.662621" id="line3577" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="9.8535614" y1="49.966042" x2="15.364938" y2="54.27129" id="line3579" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="4.5152779" y1="47.038174" x2="9.8535614" y2="49.966042" id="line3581" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="0.094633415" y1="45.745964" x2="4.5152779" y2="47.038174" id="line3583" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="12.437076" y1="62.70961" x2="13.470121" y2="64.536659" id="line3585" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="8.7344351" y1="58.060017" x2="12.437076" y2="62.70961" id="line3587" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="4.0848436" y1="54.701721" x2="8.7344351" y2="58.060017" id="line3589" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="0.094633415" y1="53.409504" x2="4.0848436" y2="54.701721" id="line3591" style="stroke:#000000;stroke-width:0.91581547px" />
<line x1="35.922504" y1="17.814405" x2="46.356174" y2="12.550002" id="line3593" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="26.418303" y1="25.251396" x2="35.922504" y2="17.814405" id="line3595" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="18.235481" y1="11.938099" x2="22.73897" y2="4.6114168" id="line3597" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="10.363072" y1="20.684654" x2="18.235481" y2="11.938099" id="line3599" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="60.647736" y1="13.562038" x2="64.356377" y2="19.421593" id="line3601" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="54.191032" y1="6.2165704" x2="60.647736" y2="13.562038" id="line3603" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="46.872639" y1="-0.055021625" x2="54.191032" y2="6.2165704" id="line3605" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="53.501495" y1="27.292013" x2="56.429043" y2="32.995308" id="line3607" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="48.077713" y1="18.72217" x2="53.501495" y2="27.292013" id="line3609" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="41.448853" y1="11.113765" x2="48.077713" y2="18.72217" id="line3611" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="34.560841" y1="4.5550518" x2="41.448853" y2="11.113765" id="line3613" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="27.759834" y1="-0.055021625" x2="34.560841" y2="4.5550518" id="line3615" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="30.083918" y1="14.174964" x2="39.209934" y2="25.367659" id="line3617" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="20.527508" y1="6.2165704" x2="30.083918" y2="14.174964" id="line3619" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="12.778731" y1="2.2813628" x2="20.527508" y2="6.2165704" id="line3621" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="2.7919424" y1="-0.055021625" x2="12.778731" y2="2.2813628" id="line3623" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="24.918362" y1="20.995308" x2="31.030762" y2="27.816576" id="line3625" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="16.825274" y1="14.086603" x2="24.918362" y2="20.995308" id="line3627" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="7.1827955" y1="8.840064" x2="16.825274" y2="14.086603" id="line3629" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="0.0072516869" y1="6.8287482" x2="7.1827955" y2="8.840064" id="line3631" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="15.275883" y1="22.569948" x2="19.322433" y2="27.02972" id="line3633" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="9.765111" y1="18.197601" x2="15.275883" y2="22.569948" id="line3635" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="4.4274139" y1="15.2241" x2="9.765111" y2="18.197601" id="line3637" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="0.0072516869" y1="13.911751" x2="4.4274139" y2="15.2241" id="line3639" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="12.348343" y1="31.139784" x2="13.381276" y2="32.995308" id="line3641" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="8.6461048" y1="26.417725" x2="12.348343" y2="31.139784" id="line3643" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="3.9970255" y1="23.00709" x2="8.6461048" y2="26.417725" id="line3645" style="stroke:#000000;stroke-width:0.92287397px" />
<line x1="0.0072516869" y1="21.694731" x2="3.9970255" y2="23.00709" id="line3647" style="stroke:#000000;stroke-width:0.92287397px" />
<path id="path3649" d="M 19.181818,26.772727 34.90909,36.590909" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3651" d="m 56.454546,32.772727 3.090909,8" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3653" d="m 39.045455,25.181818 8.090909,6.909091" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path3655" d="M 40.181818,38.545455 52.727272,35.818182 64.545454,29.454546" style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,49 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "f3ffddec-9468-41c4-b107-035287283e45"
Name: "woodgrain"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" id="svg3137" height="64px" width="64px">
<defs id="defs3139">
<pattern id="woodgrain" patternTransform="translate(-0.125,-0.5)" height="64" width="64" patternUnits="userSpaceOnUse">
<g transform="translate(0.125,0.5) scale(0.03,0.03)" id="g3339">
<path id="path4854" d="M 4,0 8,24 4,44 v 20" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4855" d="m 16,0 -4,8 v 28 l 4,16 v 12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4856" d="m 20,0 v 16 l -4,12 4,8 v 28" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4857" d="M 24,64 28,44 24,28 28,12 V 0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4858" d="m 36,0 c 0,0 0,16 0,16 l 4,4 v 8 l -8,4 v 8 l 4,12 v 12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4859" d="m 44,0 v 36 l -4,4 v 4 l 4,20" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4860" d="m 48,0 4,20 v 8 l -4,12 v 8 l 4,16" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4861" d="m 56,0 4,16 v 16 l -8,4 v 8 l 4,8 v 12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</pattern>
</defs>
<metadata id="metadata3142">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1">
<path id="path4839" d="M 4,0 8,24 4,44 v 20" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4841" d="m 16,0 -4,8 v 28 l 4,16 v 12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4843" d="m 20,0 v 16 l -4,12 4,8 v 28" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4845" d="M 24,64 28,44 24,28 28,12 V 0" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4847" d="m 36,0 c 0,0 0,16 0,16 l 4,4 v 8 l -8,4 v 8 l 4,12 v 12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4849" d="m 44,0 v 36 l -4,4 v 4 l 4,20" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4851" d="m 48,0 4,20 v 8 l -4,12 v 8 l 4,16" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path id="path4853" d="m 56,0 4,16 v 16 l -8,4 v 8 l 4,8 v 12" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -0,0 +1,46 @@
---
# File created by FreeCAD 0.22.0 Revision: 35329 +8 (Git)
General:
UUID: "957f8af7-7a3f-4086-9aaa-2bc7aa07a54f"
Name: "zinc"
Author: "David Carter"
License: "All rights reserved"
AppearanceModels:
Pattern File:
UUID: "c6596294-e97d-4812-87db-28e1d66521a3"
Pattern Color: "(0,0,0,1)"
Pattern File: |2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64.000001 64.000001" version="1.0" id="svg2" height="64" width="64">
<metadata id="metadata7381">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs7379" />
<g id="Groupe">
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 64.0 L 64.0 0.0 " id="Line_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6000003815 0.0 L 64.0 38.4000015259 " id="Line016_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4000015259 0.0 L 64.0 25.6000003815 " id="Line017_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2000007629 0.0 L 64.0 12.8000001907 " id="Line018_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 51.2 L 51.2 0.0 " id="Line007_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 38.4 L 38.4 0.0 " id="Line008_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 12.8 L 12.8 0.0 " id="Line010_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 38.4 64.0 L 64.0 38.4 " id="Line006_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.186683624983 12.6133165359 L 51.2000007629 64.0 " id="Line011_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.108462266624 51.0915374756 L 12.8503952026 63.9496040344 " id="Line014_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 51.2 64.0 L 64.0 51.2 " id="Line005_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 25.6 64.0 L 64.0 25.6 " id="Line003_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 0.0 L 64.0 64.0 " id="Line001_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.8 64.0 L 64.0 12.8 " id="Line002_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.141254857183 25.4587459564 L 38.4251213074 63.9748802185 " id="Line012_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0 25.6 L 25.6 0.0 " id="Line009_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 0.0958266854286 38.3041763306 L 25.6377563477 63.9622421265 " id="Line013_w0000" />
<path style="stroke-width:0.35;stroke-miterlimit:4;stroke-dasharray:none;fill:none;fill-rule:evenodd" stroke-width="0.35 px" stroke="#000000" d="M 12.7872076035 0.0127922063693 L 64.0 51.2000007629 " id="Line015_w0000" />
</g>
</svg>
Pattern Scale: "1"

View File

@@ -39,14 +39,10 @@ Models:
- "Single quote '"
- "Double quote \""
- "Backslash \\"
TestMultiLineString: >2
TestMultiLineString: |2
Now is the time for 'all' \ <good> "men" come to the aid of the party
Indentation is significant
Similar to Python
TestQuantity: "19.76 kg/m^3"
TestString: "Now is the time for 'all' \\ <good> \"men\" come to the aid of the party"
TestMultiLineString: >2
Now is the time for 'all' \ <good> "men" come to the aid of the party
Indentation is significant
Similar to Python
TestURL: "https://www.freecad.org/"

View File

@@ -0,0 +1,49 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: 'PAT'
UUID: '0326c759-4e3d-46ca-bb7d-146ebebea65e'
URL: 'https://wiki.freecad.org/TechDraw_Hatching'
Description: 'AutoDesk® PAT format pattern'
DOI: ''
Hatch Pattern:
Type: 'MultiLineString'
Units: ''
URL: ''
Description: "The format pattern"
Hatch Scale:
Type: 'Float'
Units: ''
URL: ''
Description: "The scale to be applied to the pattern (must be > 0.0)"
Hatch Weight:
Type: 'Float'
Units: ''
URL: ''
Description: "The thickness of the pattern lines"
Hatch Color:
Type: 'Color'
Units: ''
URL: ''
Description: "The color for the pattern lines"

View File

@@ -0,0 +1,44 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: 'Pattern File'
UUID: 'c6596294-e97d-4812-87db-28e1d66521a3'
URL: 'https://wiki.freecad.org/TechDraw_Hatching'
Description: 'SVG based pattern'
DOI: ''
Pattern File:
Type: 'SVG'
Units: ''
URL: ''
Description: "The SVG format pattern"
Pattern Scale:
Type: 'Float'
Units: ''
URL: ''
Description: "The pattern size modifier (must be > 0.0)"
Pattern Color:
Type: 'Color'
Units: ''
URL: ''
Description: "The pattern will be displayed in this color"

View File

@@ -0,0 +1,34 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Appleseed"
UUID: 'b0a10f70-13bf-4598-ab63-bcfbbcd813e3'
URL: ''
Description: "Rendering model aspects specific to the Appleseed renderer"
DOI: ""
Render.Appleseed:
Type: 'MultiLineString'
Units: ''
URL: ''
Description: "Passthrough Options"

View File

@@ -0,0 +1,59 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Carpaint"
UUID: '4d2cc163-0707-40e2-a9f7-14288c4b97bd'
URL: ''
Description: "Rendering Workbench Carpaint rendering model"
DOI: ""
Render.Carpaint.BaseColor:
Type: 'Color'
Units: ''
URL: ''
Description: " "
Render.Carpaint.BaseColor.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Carpaint.BaseColor.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Carpaint.Bump:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Carpaint.Displacement:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Carpaint.Normal:
Type: 'String'
Units: ''
URL: ''
Description: " "

View File

@@ -0,0 +1,34 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Cycles"
UUID: 'a6da1b66-929c-48bf-ae80-3b0495c7b50b'
URL: ''
Description: "Rendering model aspects specific to the Cycles renderer"
DOI: ""
Render.Cycles:
Type: 'MultiLineString'
Units: ''
URL: ''
Description: "Passthrough Options"

View File

@@ -0,0 +1,59 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Diffuse"
UUID: 'c19b2d30-c55b-48aa-a938-df9e2f7779cf'
URL: ''
Description: "Rendering Workbench Diffuse rendering model"
DOI: ""
Render.Diffuse.Bump:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Diffuse.Color:
Type: 'Color'
Units: ''
URL: ''
Description: " "
Render.Diffuse.Color.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Diffuse.Color.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Diffuse.Displacement:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Diffuse.Normal:
Type: 'String'
Units: ''
URL: ''
Description: " "

View File

@@ -0,0 +1,179 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Disney"
UUID: 'f8723572-4470-4c39-a749-6d3b71358a5b'
URL: ''
Description: "Rendering Workbench Disney rendering model"
DOI: ""
Render.Disney.Anisotropic:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.Anisotropic.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.BaseColor:
Type: 'Color'
Units: ''
URL: ''
Description: " "
Render.Disney.BaseColor.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.BaseColor.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Disney.Bump:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.ClearCoat:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.ClearCoat.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.ClearCoat.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Disney.ClearCoatGloss:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.ClearCoatGloss.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.ClearCoatGloss.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Disney.Displacement:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.Metallic:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.Metallic.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.Normal:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.Roughness:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.Roughness.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.Sheen:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.Sheen.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.SheenTint:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.SheenTint.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.Specular:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.Specular.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.Specular.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Disney.SpecularTint:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.SpecularTint.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Disney.SpecularTint.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Disney.Subsurface:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Disney.Subsurface.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "

View File

@@ -0,0 +1,64 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Emission"
UUID: '9f6cb588-c89d-4a74-9d0f-2786a8568cec'
URL: ''
Description: "Rendering Workbench Emission rendering model"
DOI: ""
Render.Emission.Bump:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Emission.Color:
Type: 'Color'
Units: ''
URL: ''
Description: " "
Render.Emission.Color.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Emission.Color.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Emission.Normal:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Emission.Power:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Emission.Power.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "

View File

@@ -0,0 +1,69 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Glass"
UUID: 'd76a56f5-7250-4efb-bb89-8ea0a9ccaa6b'
URL: ''
Description: "Rendering Workbench Glass rendering model"
DOI: ""
Render.Glass.Bump:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Glass.Color:
Type: 'Color'
Units: ''
URL: ''
Description: " "
Render.Glass.Color.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Glass.Color.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Glass.IOR:
Type: 'Float'
Units: ''
URL: ''
Description: "Index of Refraction"
Render.Glass.IOR.Texture:
Type: 'String'
Units: ''
URL: ''
Description: "Index of Refraction"
Render.Glass.Displacement:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Glass.Normal:
Type: 'String'
Units: ''
URL: ''
Description: " "

View File

@@ -0,0 +1,34 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Luxcore"
UUID: '6b992304-33e0-490b-a391-e9d0af79bb69'
URL: ''
Description: "Rendering model aspects specific to the Luxcore renderer"
DOI: ""
Render.Luxcore:
Type: 'MultiLineString'
Units: ''
URL: ''
Description: "Passthrough Options"

View File

@@ -0,0 +1,34 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Luxrender"
UUID: '67ac6a63-e173-4e05-898b-af743f1f9563'
URL: ''
Description: "Rendering model aspects specific to the Luxrender renderer"
DOI: ""
Render.Luxrender:
Type: 'MultiLineString'
Units: ''
URL: ''
Description: "Passthrough Options"

View File

@@ -0,0 +1,94 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Mixed"
UUID: '84bab333-984f-47fe-a512-d17c7cb2daa9'
URL: ''
Description: "Rendering Workbench Mixed rendering model"
DOI: ""
Render.Mixed.Bump:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Mixed.Diffuse.Color:
Type: 'Color'
Units: ''
URL: ''
Description: " "
Render.Mixed.Diffuse.Color.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Mixed.Diffuse.Color.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Mixed.Displacement:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Mixed.Glass.Color:
Type: 'Color'
Units: ''
URL: ''
Description: " "
Render.Mixed.Glass.Color.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Mixed.Glass.Color.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Mixed.Glass.IOR:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Mixed.Glass.IOR.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Mixed.Normal:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Mixed.Transparency:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Mixed.Transparency.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "

View File

@@ -0,0 +1,34 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Ospray"
UUID: 'a4792c23-0be9-47c2-b16d-47b2d2d5efd6'
URL: ''
Description: "Rendering model aspects specific to the Ospray renderer"
DOI: ""
Render.Ospray:
Type: 'MultiLineString'
Units: ''
URL: ''
Description: "Passthrough Options"

View File

@@ -0,0 +1,34 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Pbrt"
UUID: '35b34b82-4325-4d27-97bd-d10bb2c56586'
URL: ''
Description: "Rendering model aspects specific to the Pbrt renderer"
DOI: ""
Render.Pbrt:
Type: 'MultiLineString'
Units: ''
URL: ''
Description: "Passthrough Options"

View File

@@ -0,0 +1,34 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Povray"
UUID: '6ec8b415-4c7b-4206-a80b-2ea64101f34b'
URL: ''
Description: "Rendering model aspects specific to the Povray renderer"
DOI: ""
Render.Povray:
Type: 'MultiLineString'
Units: ''
URL: ''
Description: "Passthrough Options"

View File

@@ -0,0 +1,84 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Substance_PBR"
UUID: 'f212b643-db96-452e-8428-376a4534e5ab'
URL: ''
Description: "Rendering Workbench Substance_PBR rendering model"
DOI: ""
Render.Substance_PBR.BaseColor:
Type: 'Color'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.BaseColor.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.BaseColor.Object:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.Bump:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.Metallic:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.Metallic.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.Normal:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.Roughness:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.Roughness.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.Specular:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Substance_PBR.Specular.Texture:
Type: 'String'
Units: ''
URL: ''
Description: " "

View File

@@ -0,0 +1,59 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Texture"
UUID: 'fc9b6135-95cd-4ba8-ad9a-0972caeebad2'
URL: ''
Description: "Render Workbench texture model"
DOI: ""
Render.Textures.Name:
Type: 'String'
Units: ''
URL: ''
Description: " "
Render.Textures.Images:
Type: 'FileList'
Units: ''
URL: ''
Description: " "
Render.Textures.Scale:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Textures.Rotation:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Textures.TranslationU:
Type: 'Float'
Units: ''
URL: ''
Description: " "
Render.Textures.TranslationV:
Type: 'Float'
Units: ''
URL: ''
Description: " "

View File

@@ -0,0 +1,39 @@
---
# ***************************************************************************
# * *
# * Copyright (c) 2023 David Carter <dcarter@davidcarter.ca> *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
AppearanceModel:
Name: "Render Workbench"
UUID: '344008be-a837-43af-90bc-f795f277b309'
URL: ''
Description: "Rendering model aspects specific to the Render Workbench"
DOI: ""
UseObjectColor:
Type: 'Boolean'
Units: ''
URL: ''
Description: " "
Render.Type:
Type: 'String'
Units: ''
URL: ''
Description: " "

View File

@@ -77,6 +77,11 @@ Model:
Units: ''
URL: ''
Description: "A File"
TestSVG:
Type: 'SVG'
Units: ''
URL: ''
Description: "An SVG"
TestImage:
Type: 'Image'
Units: ''

View File

@@ -20,8 +20,10 @@
# USA *
#**************************************************************************
# import FreeCAD
from os import walk
"""
Test module for FreeCAD material cards and APIs
"""
import unittest
import FreeCAD
import Material
@@ -29,16 +31,29 @@ import Material
parseQuantity = FreeCAD.Units.parseQuantity
class MaterialTestCases(unittest.TestCase):
"""
Test class for FreeCAD material cards and APIs
"""
def setUp(self):
""" Setup function to initialize test data """
self.ModelManager = Material.ModelManager()
self.MaterialManager = Material.MaterialManager()
self.uuids = Material.UUIDs()
def testMaterialManager(self):
""" Ensure the MaterialManager has been initialized correctly """
self.assertIn("MaterialLibraries", dir(self.MaterialManager))
self.assertIn("Materials", dir(self.MaterialManager))
def testCalculiXSteel(self):
"""
Test a representative material card for CalculX Steel
As a well populated material card, the CalculiX Steel material is a good subject
for testing as many of the properties and API access methods as possible.
"""
steel = self.MaterialManager.getMaterial("92589471-a6cb-4bbc-b748-d425a17dea7d")
self.assertIsNotNone(steel)
self.assertEqual(steel.Name, "CalculiX-Steel")
@@ -53,8 +68,8 @@ class MaterialTestCases(unittest.TestCase):
self.assertTrue(steel.isPhysicalModelComplete(self.uuids.Density))
self.assertFalse(steel.isPhysicalModelComplete(self.uuids.IsotropicLinearElastic))
self.assertTrue(steel.isPhysicalModelComplete(self.uuids.Thermal))
self.assertFalse(steel.isPhysicalModelComplete(self.uuids.LinearElastic)) # Not in the model
self.assertTrue(steel.isAppearanceModelComplete(self.uuids.BasicRendering)) # inherited from Steel.FCMat
self.assertFalse(steel.isPhysicalModelComplete(self.uuids.LinearElastic))
self.assertTrue(steel.isAppearanceModelComplete(self.uuids.BasicRendering))
self.assertTrue(steel.hasPhysicalProperty("Density"))
self.assertTrue(steel.hasPhysicalProperty("BulkModulus"))
@@ -155,20 +170,27 @@ class MaterialTestCases(unittest.TestCase):
self.assertTrue(len(properties["SpecularColor"]) > 0)
self.assertTrue(len(properties["Transparency"]) > 0)
self.assertEqual(properties["Density"], parseQuantity("7900.00 kg/m^3").UserString)
self.assertEqual(properties["Density"],
parseQuantity("7900.00 kg/m^3").UserString)
# self.assertEqual(properties["BulkModulus"], "")
self.assertAlmostEqual(parseQuantity(properties["PoissonRatio"]).Value, parseQuantity("0.3").Value)
self.assertEqual(properties["YoungsModulus"], parseQuantity("210.00 GPa").UserString)
self.assertAlmostEqual(parseQuantity(properties["PoissonRatio"]).Value,
parseQuantity("0.3").Value)
self.assertEqual(properties["YoungsModulus"],
parseQuantity("210.00 GPa").UserString)
# self.assertEqual(properties["ShearModulus"], "")
self.assertEqual(properties["SpecificHeat"], parseQuantity("590.00 J/kg/K").UserString)
self.assertEqual(properties["ThermalConductivity"], parseQuantity("43.00 W/m/K").UserString)
self.assertEqual(properties["ThermalExpansionCoefficient"], parseQuantity("12.00 µm/m/K").UserString)
self.assertEqual(properties["SpecificHeat"],
parseQuantity("590.00 J/kg/K").UserString)
self.assertEqual(properties["ThermalConductivity"],
parseQuantity("43.00 W/m/K").UserString)
self.assertEqual(properties["ThermalExpansionCoefficient"],
parseQuantity("12.00 µm/m/K").UserString)
self.assertEqual(properties["AmbientColor"], "(0.0020, 0.0020, 0.0020, 1.0)")
self.assertEqual(properties["DiffuseColor"], "(0.0000, 0.0000, 0.0000, 1.0)")
self.assertEqual(properties["EmissiveColor"], "(0.0000, 0.0000, 0.0000, 1.0)")
self.assertAlmostEqual(parseQuantity(properties["Shininess"]).Value, parseQuantity("0.06").Value)
self.assertEqual(properties["SpecularColor"], "(0.9800, 0.9800, 0.9800, 1.0)")
self.assertAlmostEqual(parseQuantity(properties["Transparency"]).Value, parseQuantity("0").Value)
self.assertAlmostEqual(parseQuantity(properties["Transparency"]).Value,
parseQuantity("0").Value)
print("Density " + steel.getPhysicalValue("Density").UserString)
# print("BulkModulus " + properties["BulkModulus"])
@@ -177,7 +199,8 @@ class MaterialTestCases(unittest.TestCase):
# print("ShearModulus " + properties["ShearModulus"])
print("SpecificHeat " + steel.getPhysicalValue("SpecificHeat").UserString)
print("ThermalConductivity " + steel.getPhysicalValue("ThermalConductivity").UserString)
print("ThermalExpansionCoefficient " + steel.getPhysicalValue("ThermalExpansionCoefficient").UserString)
print("ThermalExpansionCoefficient " + \
steel.getPhysicalValue("ThermalExpansionCoefficient").UserString)
print("AmbientColor " + steel.getAppearanceValue("AmbientColor"))
print("DiffuseColor " + steel.getAppearanceValue("DiffuseColor"))
print("EmissiveColor " + steel.getAppearanceValue("EmissiveColor"))
@@ -199,12 +222,18 @@ class MaterialTestCases(unittest.TestCase):
self.assertAlmostEqual(steel.getAppearanceValue("Transparency"), 0.0)
def testMaterialsWithModel(self):
materials = self.MaterialManager.materialsWithModel('f6f9e48c-b116-4e82-ad7f-3659a9219c50') # IsotropicLinearElastic
materialsComplete = self.MaterialManager.materialsWithModelComplete('f6f9e48c-b116-4e82-ad7f-3659a9219c50') # IsotropicLinearElastic
"""
Test functions that return a list of models supporting specific material models
"""
# IsotropicLinearElastic
materials = self.MaterialManager.materialsWithModel('f6f9e48c-b116-4e82-ad7f-3659a9219c50')
materialsComplete = self.MaterialManager \
.materialsWithModelComplete('f6f9e48c-b116-4e82-ad7f-3659a9219c50')
self.assertTrue(len(materialsComplete) <= len(materials)) # Not all will be complete
materialsLinearElastic = self.MaterialManager.materialsWithModel('7b561d1d-fb9b-44f6-9da9-56a4f74d7536') # LinearElastic
materialsLinearElastic = self.MaterialManager \
.materialsWithModel('7b561d1d-fb9b-44f6-9da9-56a4f74d7536') # LinearElastic
# All LinearElastic models should be in IsotropicLinearElastic since it is inherited
self.assertTrue(len(materialsLinearElastic) <= len(materials))
@@ -212,22 +241,34 @@ class MaterialTestCases(unittest.TestCase):
self.assertIn(mat, materials)
def testMaterialByPath(self):
steel = self.MaterialManager.getMaterialByPath('Standard/Metal/Steel/CalculiX-Steel.FCMat', 'System')
"""
Test loading models by path
Valid models may have different prefixes
"""
steel = self.MaterialManager \
.getMaterialByPath('Standard/Metal/Steel/CalculiX-Steel.FCMat', 'System')
self.assertIsNotNone(steel)
self.assertEqual(steel.Name, "CalculiX-Steel")
self.assertEqual(steel.UUID, "92589471-a6cb-4bbc-b748-d425a17dea7d")
steel2 = self.MaterialManager.getMaterialByPath('/Standard/Metal/Steel/CalculiX-Steel.FCMat', 'System')
steel2 = self.MaterialManager \
.getMaterialByPath('/Standard/Metal/Steel/CalculiX-Steel.FCMat', 'System')
self.assertIsNotNone(steel2)
self.assertEqual(steel2.Name, "CalculiX-Steel")
self.assertEqual(steel2.UUID, "92589471-a6cb-4bbc-b748-d425a17dea7d")
steel3 = self.MaterialManager.getMaterialByPath('/System/Standard/Metal/Steel/CalculiX-Steel.FCMat', 'System')
steel3 = self.MaterialManager \
.getMaterialByPath('/System/Standard/Metal/Steel/CalculiX-Steel.FCMat', 'System')
self.assertIsNotNone(steel3)
self.assertEqual(steel3.Name, "CalculiX-Steel")
self.assertEqual(steel3.UUID, "92589471-a6cb-4bbc-b748-d425a17dea7d")
def testLists(self):
"""
Test API access to lists
"""
mat = self.MaterialManager.getMaterial("c6c64159-19c1-40b5-859c-10561f20f979")
self.assertIsNotNone(mat)
self.assertEqual(mat.Name, "Test Material")
@@ -238,27 +279,32 @@ class MaterialTestCases(unittest.TestCase):
self.assertTrue(mat.hasPhysicalProperty("TestList"))
list = mat.getPhysicalValue("TestList")
self.assertEqual(len(list), 6)
self.assertEqual(list[0], "Now is the time for all good men to come to the aid of the party")
self.assertEqual(list[1], "The quick brown fox jumps over the lazy dogs back")
self.assertEqual(list[2], "Lore Ipsum")
self.assertEqual(list[3], "Single quote '")
self.assertEqual(list[4], "Double quote \"")
self.assertEqual(list[5], "Backslash \\")
testList = mat.getPhysicalValue("TestList")
self.assertEqual(len(testList), 6)
self.assertEqual(testList[0],
"Now is the time for all good men to come to the aid of the party")
self.assertEqual(testList[1], "The quick brown fox jumps over the lazy dogs back")
self.assertEqual(testList[2], "Lore Ipsum")
self.assertEqual(testList[3], "Single quote '")
self.assertEqual(testList[4], "Double quote \"")
self.assertEqual(testList[5], "Backslash \\")
properties = mat.Properties
self.assertIn("TestList", properties)
self.assertTrue(len(properties["TestList"]) == 0)
def test2DArray(self):
"""
Test API access to 2D arrays
"""
mat = self.MaterialManager.getMaterial("c6c64159-19c1-40b5-859c-10561f20f979")
self.assertIsNotNone(mat)
self.assertEqual(mat.Name, "Test Material")
self.assertEqual(mat.UUID, "c6c64159-19c1-40b5-859c-10561f20f979")
self.assertTrue(mat.hasPhysicalModel(self.uuids.TestModel))
self.assertTrue(mat.isPhysicalModelComplete(self.uuids.TestModel))
self.assertFalse(mat.isPhysicalModelComplete(self.uuids.TestModel))
self.assertTrue(mat.hasPhysicalProperty("TestArray2D"))
@@ -328,7 +374,11 @@ class MaterialTestCases(unittest.TestCase):
with self.assertRaises(IndexError):
row = array.getRow(3)
def test2DArray(self):
def test3DArray(self):
"""
Test API access to 3D arrays
"""
mat = self.MaterialManager.getMaterial("c6c64159-19c1-40b5-859c-10561f20f979")
self.assertIsNotNone(mat)
self.assertEqual(mat.Name, "Test Material")
@@ -383,9 +433,11 @@ class MaterialTestCases(unittest.TestCase):
self.assertEqual(arrayData[3][0][0].UserString, parseQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getDepthValue(-1).UserString, parseQuantity("10.00 C").UserString)
self.assertEqual(array.getDepthValue(-1).UserString,
parseQuantity("10.00 C").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getDepthValue(3).UserString, parseQuantity("10.00 C").UserString)
self.assertEqual(array.getDepthValue(3).UserString,
parseQuantity("10.00 C").UserString)
self.assertEqual(array.getValue(0,0,0).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(0,0,1).UserString, parseQuantity("12.00 Pa").UserString)
@@ -399,16 +451,23 @@ class MaterialTestCases(unittest.TestCase):
self.assertEqual(array.getValue(2,2,1).UserString, parseQuantity("31.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(0,0,-1).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(0,0,-1).UserString,
parseQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(0,0,2).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(0,0,2).UserString,
parseQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(0,-1,0).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(0,-1,0).UserString,
parseQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(0,2,0).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(0,2,0).UserString,
parseQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(1,0,0).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(1,0,0).UserString,
parseQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(-1,0,0).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(-1,0,0).UserString,
parseQuantity("11.00 Pa").UserString)
with self.assertRaises(IndexError):
self.assertEqual(array.getValue(3,0,0).UserString, parseQuantity("11.00 Pa").UserString)
self.assertEqual(array.getValue(3,0,0).UserString,
parseQuantity("11.00 Pa").UserString)

View File

@@ -20,26 +20,32 @@
# USA *
#**************************************************************************
# import FreeCAD
from os import walk
"""
Test module for FreeCAD material models
"""
import unittest
import FreeCAD
import Material
parseQuantity = FreeCAD.Units.parseQuantity
# import locale
# locale.setpreferredencoding("UTF8")
class ModelTestCases(unittest.TestCase):
"""
Test class for FreeCAD material models
"""
def setUp(self):
""" Setup function to initialize test data """
self.ModelManager = Material.ModelManager()
self.uuids = Material.UUIDs()
def testModelManager(self):
""" Ensure we can access ModelManager member functions """
self.assertIn("ModelLibraries", dir(self.ModelManager))
self.assertIn("Models", dir(self.ModelManager))
def testUUIDs(self):
""" Verify the common UUIDs are defined and correct """
self.assertTrue(self.uuids.Father, "9cdda8b6-b606-4778-8f13-3934d8668e67")
self.assertTrue(self.uuids.MaterialStandard, "1e2c0088-904a-4537-925f-64064c07d700")
@@ -85,6 +91,7 @@ class ModelTestCases(unittest.TestCase):
self.assertTrue(self.uuids.TestModel, "34d0583d-f999-49ba-99e6-aa40bd5c3a6b")
def testModelLoad(self):
""" Test that the Density model has been loaded correctly """
density = self.ModelManager.getModel(self.uuids.Density)
self.assertIsNotNone(density)
self.assertEqual(density.Name, "Density")

View File

@@ -29,7 +29,6 @@
#include <Bnd_Box.hxx>
#include <BRep_Tool.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BOPAlgo_Builder.hxx>
#include <BRepAlgoAPI_Common.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
#include <BRepBndLib.hxx>
@@ -45,6 +44,7 @@
#include <TopoDS.hxx>
#include <TopoDS_Shape.hxx>
#endif
#include <BOPAlgo_Builder.hxx>
#include <Base/Console.h>
#include <Base/Parameter.h>

View File

@@ -32,6 +32,7 @@
#include <App/Application.h>
#include <Base/Quantity.h>
#include <Gui/MetaTypes.h>
#include <src/App/InitApplication.h>
#include <Mod/Material/App/MaterialLibrary.h>
#include <Mod/Material/App/MaterialManager.h>
@@ -46,10 +47,7 @@ class TestMaterialCards : public ::testing::Test {
protected:
static void SetUpTestSuite() {
if (App::Application::GetARGC() == 0) {
constexpr int argc = 1;
std::array<char*, argc> argv {"FreeCAD"};
App::Application::Config()["ExeName"] = "FreeCAD";
App::Application::init(argc, argv.data());
tests::initApplication();
}
}
@@ -78,8 +76,8 @@ protected:
TEST_F(TestMaterialCards, TestCopy)
{
EXPECT_NE(_modelManager, nullptr);
EXPECT_TRUE(_library);
ASSERT_NE(_modelManager, nullptr);
ASSERT_TRUE(_library);
// FAIL() << "Test library " << _library->getDirectoryPath().toStdString() << "\n";
auto testMaterial = _materialManager->getMaterial(_testMaterialUUID);
@@ -181,25 +179,25 @@ TEST_F(TestMaterialCards, TestCopy)
TEST_F(TestMaterialCards, TestColumns)
{
EXPECT_NE(_modelManager, nullptr);
EXPECT_TRUE(_library);
ASSERT_NE(_modelManager, nullptr);
ASSERT_TRUE(_library);
auto testMaterial = _materialManager->getMaterial(_testMaterialUUID);
EXPECT_TRUE(testMaterial->hasPhysicalProperty(QString::fromStdString("TestArray2D")));
auto array2d = testMaterial->getPhysicalProperty(QString::fromStdString("TestArray2D"))->getMaterialValue();
EXPECT_TRUE(array2d);
EXPECT_EQ(static_cast<Materials::Material2DArray &>(*array2d).columns(), 2);
EXPECT_EQ(dynamic_cast<Materials::Material2DArray &>(*array2d).columns(), 2);
EXPECT_TRUE(testMaterial->hasPhysicalProperty(QString::fromStdString("TestArray2D3Column")));
auto array2d3Column = testMaterial->getPhysicalProperty(QString::fromStdString("TestArray2D3Column"))->getMaterialValue();
EXPECT_TRUE(array2d3Column);
EXPECT_EQ(static_cast<Materials::Material2DArray &>(*array2d3Column).columns(), 3);
EXPECT_EQ(dynamic_cast<Materials::Material2DArray &>(*array2d3Column).columns(), 3);
EXPECT_TRUE(testMaterial->hasPhysicalProperty(QString::fromStdString("TestArray3D")));
auto array3d = testMaterial->getPhysicalProperty(QString::fromStdString("TestArray3D"))->getMaterialValue();
EXPECT_TRUE(array3d);
EXPECT_EQ(static_cast<Materials::Material3DArray &>(*array3d).columns(), 2);
EXPECT_EQ(dynamic_cast<Materials::Material3DArray &>(*array3d).columns(), 2);
}
// clang-format on

View File

@@ -42,22 +42,7 @@
class TestMaterialValue : public ::testing::Test {
protected:
static void SetUpTestSuite() {
// if (App::Application::GetARGC() == 0) {
// constexpr int argc = 1;
// std::array<char*, argc> argv {"FreeCAD"};
// App::Application::Config()["ExeName"] = "FreeCAD";
// App::Application::init(argc, argv.data());
// }
}
// void SetUp() override {
// _modelManager = new Materials::ModelManager();
// _materialManager = new Materials::MaterialManager();
// }
// void TearDown() override {}
// Materials::ModelManager* _modelManager;
// Materials::MaterialManager* _materialManager;
};
TEST_F(TestMaterialValue, TestNoneType)

View File

@@ -32,6 +32,7 @@
#include <App/Application.h>
#include <Base/Quantity.h>
#include <Gui/MetaTypes.h>
#include <src/App/InitApplication.h>
#include <Mod/Material/App/MaterialManager.h>
#include <Mod/Material/App/Model.h>
@@ -48,10 +49,7 @@ class TestMaterial : public ::testing::Test {
protected:
static void SetUpTestSuite() {
if (App::Application::GetARGC() == 0) {
constexpr int argc = 1;
std::array<char*, argc> argv {"FreeCAD"};
App::Application::Config()["ExeName"] = "FreeCAD";
App::Application::init(argc, argv.data());
tests::initApplication();
}
}
@@ -67,7 +65,7 @@ class TestMaterial : public ::testing::Test {
TEST_F(TestMaterial, TestInstallation)
{
EXPECT_NE(_modelManager, nullptr);
ASSERT_NE(_modelManager, nullptr);
// We should have loaded at least the system library
auto libraries = _materialManager->getMaterialLibraries();
@@ -80,6 +78,8 @@ TEST_F(TestMaterial, TestInstallation)
TEST_F(TestMaterial, TestMaterialsWithModel)
{
ASSERT_NE(_materialManager, nullptr);
auto materials = _materialManager->materialsWithModel(
QString::fromStdString("f6f9e48c-b116-4e82-ad7f-3659a9219c50")); // IsotropicLinearElastic
EXPECT_GT(materials->size(), 0);
@@ -93,14 +93,16 @@ TEST_F(TestMaterial, TestMaterialsWithModel)
// All LinearElastic models should be in IsotropicLinearElastic since it is inherited
EXPECT_LE(materialsLinearElastic->size(), materials->size());
for (auto itp = materialsLinearElastic->begin(); itp != materialsLinearElastic->end(); itp++) {
auto mat = itp->first;
for (auto itp : *materialsLinearElastic) {
auto mat = itp.first;
EXPECT_NO_THROW(materials->at(mat));
}
}
TEST_F(TestMaterial, TestMaterialByPath)
{
ASSERT_NE(_materialManager, nullptr);
auto steel = _materialManager->getMaterialByPath(
QString::fromStdString("Standard/Metal/Steel/CalculiX-Steel.FCMat"),
QString::fromStdString("System"));
@@ -223,6 +225,8 @@ QString parseQuantity(const char *string)
TEST_F(TestMaterial, TestCalculiXSteel)
{
ASSERT_NE(_materialManager, nullptr);
auto steel = _materialManager->getMaterial(QString::fromStdString("92589471-a6cb-4bbc-b748-d425a17dea7d"));
EXPECT_EQ(steel->getName(), QString::fromStdString("CalculiX-Steel"));
EXPECT_EQ(steel->getUUID(), QString::fromStdString("92589471-a6cb-4bbc-b748-d425a17dea7d"));
@@ -356,17 +360,17 @@ TEST_F(TestMaterial, TestColumns)
EXPECT_TRUE(testMaterial.hasPhysicalProperty(QString::fromStdString("TestArray2D")));
auto array2d = testMaterial.getPhysicalProperty(QString::fromStdString("TestArray2D"))->getMaterialValue();
EXPECT_TRUE(array2d);
EXPECT_EQ(static_cast<Materials::Material2DArray &>(*array2d).columns(), 2);
EXPECT_EQ(dynamic_cast<Materials::Material2DArray &>(*array2d).columns(), 2);
EXPECT_TRUE(testMaterial.hasPhysicalProperty(QString::fromStdString("TestArray2D3Column")));
auto array2d3Column = testMaterial.getPhysicalProperty(QString::fromStdString("TestArray2D3Column"))->getMaterialValue();
EXPECT_TRUE(array2d3Column);
EXPECT_EQ(static_cast<Materials::Material2DArray &>(*array2d3Column).columns(), 3);
EXPECT_EQ(dynamic_cast<Materials::Material2DArray &>(*array2d3Column).columns(), 3);
EXPECT_TRUE(testMaterial.hasPhysicalProperty(QString::fromStdString("TestArray3D")));
auto array3d = testMaterial.getPhysicalProperty(QString::fromStdString("TestArray3D"))->getMaterialValue();
EXPECT_TRUE(array3d);
EXPECT_EQ(static_cast<Materials::Material3DArray &>(*array3d).columns(), 2);
EXPECT_EQ(dynamic_cast<Materials::Material3DArray &>(*array3d).columns(), 2);
}
// clang-format on

View File

@@ -29,6 +29,7 @@
#include <QString>
#include <App/Application.h>
#include <src/App/InitApplication.h>
#include <Mod/Material/App/MaterialManager.h>
#include <Mod/Material/App/Model.h>
@@ -40,10 +41,7 @@ class TestModel : public ::testing::Test {
protected:
static void SetUpTestSuite() {
if (App::Application::GetARGC() == 0) {
constexpr int argc = 1;
std::array<char*, argc> argv {"FreeCAD"};
App::Application::Config()["ExeName"] = "FreeCAD";
App::Application::init(argc, argv.data());
tests::initApplication();
}
}
@@ -75,7 +73,7 @@ TEST_F(TestModel, TestResources)
TEST_F(TestModel, TestInstallation)
{
EXPECT_NE(_modelManager, nullptr);
ASSERT_NE(_modelManager, nullptr);
// We should have loaded at least the system library
auto libraries = _modelManager->getModelLibraries();
@@ -88,7 +86,7 @@ TEST_F(TestModel, TestInstallation)
TEST_F(TestModel, TestModelLoad)
{
EXPECT_NE(_modelManager, nullptr);
ASSERT_NE(_modelManager, nullptr);
auto density = _modelManager->getModel(QString::fromStdString("454661e5-265b-4320-8e6f-fcf6223ac3af"));
EXPECT_EQ(density->getName(), QString::fromStdString("Density"));
@@ -100,6 +98,8 @@ TEST_F(TestModel, TestModelLoad)
TEST_F(TestModel, TestModelByPath)
{
ASSERT_NE(_modelManager, nullptr);
auto linearElastic = _modelManager->getModelByPath(
QString::fromStdString("Mechanical/LinearElastic.yml"),
QString::fromStdString("System"));

View File

@@ -42,22 +42,7 @@
class TestModelProperties : public ::testing::Test {
protected:
static void SetUpTestSuite() {
// if (App::Application::GetARGC() == 0) {
// constexpr int argc = 1;
// std::array<char*, argc> argv {"FreeCAD"};
// App::Application::Config()["ExeName"] = "FreeCAD";
// App::Application::init(argc, argv.data());
// }
}
// void SetUp() override {
// _modelManager = new Materials::ModelManager();
// _materialManager = new Materials::MaterialManager();
// }
// void TearDown() override {}
// Materials::ModelManager* _modelManager;
// Materials::MaterialManager* _materialManager;
};
TEST_F(TestModelProperties, TestEmpty)