Merge remote-tracking branch 'upstream/main' into UI-TaskPanels-cleanup-1

This commit is contained in:
marcuspollio
2024-05-20 09:14:08 +12:00
685 changed files with 148969 additions and 12441 deletions

View File

@@ -32,8 +32,8 @@ body:
label: Subproject(s) affected?
options:
- Addon Manager
- Arch
- Assembly
- BIM/Arch
- CAM/Path
- Core
- Draft

4
.github/labels.yml vendored
View File

@@ -18,9 +18,9 @@ Materials:
- changed-files:
- any-glob-to-any-file: ['src/Mod/Material/**/*']
WB Arch:
WB BIM:
- changed-files:
- any-glob-to-any-file: ['src/Mod/Arch/**/*']
- any-glob-to-any-file: ['src/Mod/BIM/**/*']
WB Assembly:
- changed-files:

View File

@@ -17,7 +17,7 @@ macro(CheckInterModuleDependencies)
endif(${dependent})
endfunction(REQUIRES_MODS)
REQUIRES_MODS(BUILD_ARCH BUILD_PART BUILD_MESH BUILD_DRAFT)
REQUIRES_MODS(BUILD_BIM BUILD_PART BUILD_MESH BUILD_DRAFT)
REQUIRES_MODS(BUILD_DRAFT BUILD_SKETCHER)
REQUIRES_MODS(BUILD_DRAWING BUILD_PART BUILD_SPREADSHEET)
REQUIRES_MODS(BUILD_FEM BUILD_PART)

View File

@@ -104,7 +104,7 @@ macro(InitializeFreeCADBuildOptions)
option(BUILD_SANDBOX "Build the FreeCAD Sandbox module which is only for testing purposes" OFF)
option(BUILD_TEMPLATE "Build the FreeCAD template module which is only for testing purposes" OFF)
option(BUILD_ADDONMGR "Build the FreeCAD addon manager module" ON)
option(BUILD_ARCH "Build the FreeCAD Architecture module" ON)
option(BUILD_BIM "Build the FreeCAD BIM module" ON)
option(BUILD_DRAFT "Build the FreeCAD draft module" ON)
option(BUILD_DRAWING "Build the FreeCAD drawing module" OFF)
option(BUILD_HELP "Build the FreeCAD help module" ON)

View File

@@ -89,7 +89,7 @@ macro(PrintFinalReport)
value(FREECAD_USE_PYBIND11)
value(FREECAD_USE_EXTERNAL_KDL)
value(BUILD_ADDONMGR)
value(BUILD_ARCH)
value(BUILD_BIM)
value(BUILD_ASSEMBLY)
value(BUILD_CLOUD)
value(BUILD_DRAFT)

View File

@@ -262,7 +262,9 @@ MACRO(PYSIDE_WRAP_RC outfiles)
# we follow the tool command with in-place sed.
ADD_CUSTOM_COMMAND(OUTPUT "${outfile}"
COMMAND "${PYSIDE_RCC_EXECUTABLE}" ${RCCOPTIONS} "${infile}" ${PY_ATTRIBUTE} -o "${outfile}"
COMMAND sed "/^# /d" "${outfile}" >"${outfile}.tmp" && mv "${outfile}.tmp" "${outfile}"
# The line below sometimes catches unwanted lines too - but there is no date in the file
# anymore with Qt5 RCC, so commenting it out for now...
#COMMAND sed "/^# /d" "${outfile}" >"${outfile}.tmp" && mv "${outfile}.tmp" "${outfile}"
MAIN_DEPENDENCY "${infile}"
)
endif()

View File

@@ -2027,6 +2027,7 @@ void Application::initTypes()
App::PropertyMagneticFluxDensity ::init();
App::PropertyMagnetization ::init();
App::PropertyMass ::init();
App::PropertyMoment ::init();
App::PropertyPressure ::init();
App::PropertyPower ::init();
App::PropertyShearModulus ::init();

View File

@@ -555,6 +555,17 @@ PropertyMass::PropertyMass()
setUnit(Base::Unit::Mass);
}
//**************************************************************************
// PropertyMoment
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TYPESYSTEM_SOURCE(App::PropertyMoment, App::PropertyQuantity)
PropertyMoment::PropertyMoment()
{
setUnit(Base::Unit::Moment);
}
//**************************************************************************
// PropertyPressure
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

View File

@@ -540,6 +540,19 @@ public:
~PropertyMass() override = default;
};
/** Moment property
* This is a property for representing moment. It is basically a float
* property. On the Gui it has a quantity like N*m.
*/
class AppExport PropertyMoment: public PropertyQuantity
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
PropertyMoment();
~PropertyMoment() override = default;
};
/** Pressure property
* This is a property for representing pressure. It basically a float
* property. On the Gui it has a quantity like Pa.

View File

@@ -623,6 +623,9 @@ QString Unit::getTypeString() const
if (*this == Unit::YoungsModulus) {
return QString::fromLatin1("YoungsModulus");
}
if (*this == Unit::Moment) {
return QString::fromLatin1("Moment");
}
return {};
}
@@ -664,6 +667,7 @@ const Unit Unit::MagneticFieldStrength (-1,0,0,1);
const Unit Unit::MagneticFlux (2,1,-2,-1);
const Unit Unit::MagneticFluxDensity (0,1,-2,-1);
const Unit Unit::Magnetization (-1,0,0,1);
const Unit Unit::Moment (2, 1, -2);
const Unit Unit::Pressure (-1,1,-2);
const Unit Unit::Power (2, 1, -3);
const Unit Unit::ShearModulus (-1,1,-2);

View File

@@ -155,6 +155,7 @@ public:
static const Unit Force;
static const Unit Work;
static const Unit Power;
static const Unit Moment;
static const Unit SpecificEnergy;
static const Unit ThermalConductivity;

View File

@@ -272,6 +272,24 @@ UnitsSchemaInternal::schemaTranslate(const Quantity& quant, double& factor, QStr
factor = 1e9;
}
}
// else if (unit == Unit::Moment) {
// if (UnitValue < 1e6) {
// unitString = QString::fromLatin1("mNm");
// factor = 1e3;
// }
// else if (UnitValue < 1e9) {
// unitString = QString::fromLatin1("Nm");
// factor = 1e6;
// }
// else if (UnitValue < 1e12) {
// unitString = QString::fromLatin1("kNm");
// factor = 1e9;
// }
// else {
// unitString = QString::fromLatin1("MNm");
// factor = 1e12;
// }
// }
else if (unit == Unit::Power) {
if (UnitValue < 1e6) {
unitString = QString::fromLatin1("mW");

View File

@@ -261,6 +261,24 @@ QString UnitsSchemaMKS::schemaTranslate(const Quantity& quant, double& factor, Q
factor = 1e9;
}
}
// else if (unit == Unit::Moment) {
// if (UnitValue < 1e6) {
// unitString = QString::fromLatin1("mNm");
// factor = 1e3;
// }
// else if (UnitValue < 1e9) {
// unitString = QString::fromLatin1("Nm");
// factor = 1e6;
// }
// else if (UnitValue < 1e12) {
// unitString = QString::fromLatin1("kNm");
// factor = 1e9;
// }
// else {
// unitString = QString::fromLatin1("MNm");
// factor = 1e12;
// }
// }
else if (unit == Unit::Power) {
if (UnitValue < 1e6) {
unitString = QString::fromLatin1("mW");

View File

@@ -19,6 +19,7 @@ Bas Ruigrok (Rexbas)
bejant
Benjamin Alterauge
Bernd Hahnebach
bgbsww
blobfish (tanderson69)
bluecd
Brad Collette (sliptonic)

View File

@@ -627,9 +627,10 @@ WorkbenchGroup::WorkbenchGroup ( Command* pcCmd, QObject * parent )
this, &WorkbenchGroup::onWorkbenchActivated);
}
QAction* WorkbenchGroup::getOrCreateAction(const QString& wbName) {
QAction* WorkbenchGroup::getOrCreateAction(const QString& wbName)
{
if (!actionByWorkbenchName.contains(wbName)) {
actionByWorkbenchName[wbName] = new QAction;
actionByWorkbenchName[wbName] = new QAction(QApplication::instance());
}
return actionByWorkbenchName[wbName];

View File

@@ -2,118 +2,85 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64"
height="64"
id="svg1306"
sodipodi:version="0.32"
inkscape:version="0.48.5 r10040"
sodipodi:docname="Feature.svg"
inkscape:export-filename="D:\Develop\Projekte\FreeCAD\FreeCAD_0.3\src\Gui\Icons\Feature.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
version="1.1">
<defs
id="defs1308" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.5494505"
inkscape:cx="72.683765"
inkscape:cy="35.721387"
inkscape:current-layer="g2989"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1600"
inkscape:window-height="837"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid2987"
empspacing="2"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata1311">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,48)">
<g
id="g2989"
transform="matrix(4.7497799,0,0,4.7497799,-3.7219756,-54.025163)">
<path
inkscape:connector-curvature="0"
id="path1316"
d="m 5.3216464,5.2686995 c -3.485356,0 -3.485356,0 -3.485356,0 l 0,0"
style="fill:none;stroke:#172a04;stroke-width:1.26321638;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1318"
d="m 5.3031397,7.3627233 c -3.485356,0 -3.485356,0 -3.485356,0 l 0,0"
style="fill:none;stroke:#172a04;stroke-width:1.26321638;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1320"
d="m 5.3031397,9.468084 c -3.485356,0 -3.485356,0 -3.485356,0 l 0,0"
style="fill:none;stroke:#172a04;stroke-width:1.26321638;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1322"
d="m 13.205238,3.5844109 c -3.4853557,0 -3.4853557,0 -3.4853557,0 l 0,0"
style="fill:none;stroke:#172a04;stroke-width:1.26321638;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1316-3"
d="m 5.3216466,5.2686995 c -3.4853561,0 -3.4853561,0 -3.4853561,0 l 0,0"
style="fill:none;stroke:#888a85;stroke-width:0.42107214;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1318-6"
d="m 5.3031399,7.3627233 c -3.4853561,0 -3.4853561,0 -3.4853561,0 l 0,0"
style="fill:none;stroke:#888a85;stroke-width:0.42107214;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1320-7"
d="m 5.3031399,9.468084 c -3.4853561,0 -3.4853561,0 -3.4853561,0 l 0,0"
style="fill:none;stroke:#888a85;stroke-width:0.42107214;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path1322-5"
d="m 13.205238,3.5844109 c -3.4853556,0 -3.4853556,0 -3.4853556,0 l 0,0"
style="fill:none;stroke:#888a85;stroke-width:0.42107214;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
<rect
y="2.3211944"
x="4.3627234"
height="11.368948"
width="6.316082"
id="rect1314"
style="fill:#00fe00;fill-opacity:1;stroke:#172a04;stroke-width:0.42107213999999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-linejoin:round" />
</g>
</g>
</svg>
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xml:space="preserve"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs2871"><linearGradient
id="linearGradient13"><stop
style="stop-color:#4e9a06;stop-opacity:1"
offset="0"
id="stop13" /><stop
style="stop-color:#8ae234;stop-opacity:1"
offset="1"
id="stop14" /></linearGradient><linearGradient
xlink:href="#linearGradient13"
id="linearGradient14"
x1="47.043949"
y1="59"
x2="17.043951"
y2="5"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2874"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:creator><cc:Agent><dc:title>[maxwxyz]</dc:title></cc:Agent></dc:creator><dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation><dc:publisher><cc:Agent><dc:title>FreeCAD</dc:title></cc:Agent></dc:publisher><dc:identifier>FreeCAD/src/</dc:identifier><dc:rights><cc:Agent><dc:title>FreeCAD LGPL2+</dc:title></cc:Agent></dc:rights><dc:date>2024</dc:date></cc:Work></rdf:RDF></metadata><g
id="layer3"
style="display:inline"><path
id="path9"
d="m 21.61553,19.019721 c -16.5277702,0 -16.5277702,0 -16.5277702,0 v 0"
style="fill:none;stroke:#0b1e23;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path10"
d="m 21.52777,28.950784 c -16.52777,0 -16.52777,0 -16.52777,0 v 0"
style="fill:none;stroke:#0b1e23;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path11"
d="m 21.52777,38.935614 c -16.52777,0 -16.52777,0 -16.52777,0 v 0"
style="fill:none;stroke:#0b1e23;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path12"
d="m 59,11.031858 c -16.527768,0 -16.527768,0 -16.527768,0 v 0"
style="fill:none;stroke:#0b1e23;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path1316"
d="m 21.615529,19.019722 c -16.5277697,0 -16.5277697,0 -16.5277697,0 v 0"
style="fill:none;stroke:#172a04;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path1318"
d="m 21.527769,28.950785 c -16.5277695,0 -16.5277695,0 -16.5277695,0 v 0"
style="fill:none;stroke:#172a04;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path1320"
d="m 21.527769,38.935614 c -16.5277695,0 -16.5277695,0 -16.5277695,0 v 0"
style="fill:none;stroke:#172a04;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path1322"
d="m 59,11.031858 c -16.527769,0 -16.527769,0 -16.527769,0 v 0"
style="fill:none;stroke:#172a04;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path1316-3"
d="m 21.61553,19.019722 c -16.5277702,0 -16.5277702,0 -16.5277702,0 v 0"
style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path1318-6"
d="m 21.52777,28.950785 c -16.52777,0 -16.52777,0 -16.52777,0 v 0"
style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path1320-7"
d="m 21.52777,38.935614 c -16.52777,0 -16.52777,0 -16.52777,0 v 0"
style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><path
id="path1322-5"
d="m 59,11.031858 c -16.527768,0 -16.527768,0 -16.527768,0 v 0"
style="fill:none;stroke:#d3d7cf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" /><rect
y="5.0409603"
x="17.068256"
height="53.918079"
width="29.951244"
id="rect1314"
style="fill:#8ae234;fill-opacity:1;stroke:#17230b;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
y="5"
x="17.043951"
height="54"
width="30"
id="rect9"
style="fill:url(#linearGradient14);fill-opacity:1;stroke:#8ae234;stroke-width:2.00315;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 19.048828,7.0039062 H 45.041016 V 56.996094 H 19.048828 Z"
transform="matrix(0.99837484,0,0,0.99848294,0.05200466,0.04854561)" /></g></svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -1,67 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg97" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs id="defs3">
<radialGradient id="radialGradient6719" xlink:href="#linearGradient5060" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(-2.7744 0 0 1.9697 112.76 -872.89)" r="117.14"/>
<linearGradient id="linearGradient5060">
<stop id="stop5062" offset="0"/>
<stop id="stop5064" stop-opacity="0" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient6717" xlink:href="#linearGradient5060" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(2.7744 0 0 1.9697 -1891.6 -872.89)" r="117.14"/>
<linearGradient id="linearGradient6715" y2="609.51" gradientUnits="userSpaceOnUse" x2="302.86" gradientTransform="matrix(2.7744 0 0 1.9697 -1892.2 -872.89)" y1="366.65" x1="302.86">
<stop id="stop5050" stop-opacity="0" offset="0"/>
<stop id="stop5056" offset=".5"/>
<stop id="stop5052" stop-opacity="0" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient238" gradientUnits="userSpaceOnUse" cy="37.518" cx="20.706" gradientTransform="matrix(1.055 -.027345 .17770 1.1909 -3.5722 -7.1253)" r="30.905">
<stop id="stop1790" stop-color="#202020" offset="0"/>
<stop id="stop1791" stop-color="#b9b9b9" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient491" y2="66.834" gradientUnits="userSpaceOnUse" x2="9.8981" gradientTransform="matrix(1.5168 0 0 .70898 -.87957 -1.3182)" y1="13.773" x1="6.2298">
<stop id="stop3984" stop-color="#fff" stop-opacity=".87629" offset="0"/>
<stop id="stop3985" stop-color="#fffffe" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient322" y2="46.689" gradientUnits="userSpaceOnUse" x2="12.854" gradientTransform="matrix(1.3175 0 0 .81626 -.87957 -1.3182)" y1="32.567" x1="13.036">
<stop id="stop320" stop-color="#fff" offset="0"/>
<stop id="stop321" stop-color="#fff" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient3104" y2="6.1803" gradientUnits="userSpaceOnUse" x2="15.515" y1="31.368" x1="18.113">
<stop id="stop3098" stop-color="#424242" offset="0"/>
<stop id="stop3100" stop-color="#777" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient9772" y2="32.05" gradientUnits="userSpaceOnUse" x2="22.065" y1="36.988" x1="22.176">
<stop id="stop9768" stop-color="#6194cb" offset="0"/>
<stop id="stop9770" stop-color="#729fcf" offset="1"/>
</linearGradient>
</defs>
<g id="layer1">
<g id="g6707" transform="matrix(.022624 0 0 .020868 43.383 36.37)">
<rect id="rect6709" opacity=".40206" height="478.36" width="1339.6" y="-150.7" x="-1559.3" fill="url(#linearGradient6715)"/>
<path id="path6711" opacity=".40206" d="m-219.62-150.68v478.33c142.88 0.9 345.4-107.17 345.4-239.2 0-132.02-159.44-239.13-345.4-239.13z" fill="url(#radialGradient6717)"/>
<path id="path6713" opacity=".40206" d="m-1559.3-150.68v478.33c-142.8 0.9-345.4-107.17-345.4-239.2 0-132.02 159.5-239.13 345.4-239.13z" fill="url(#radialGradient6719)"/>
</g>
<path id="path216" stroke-linejoin="round" d="m4.5218 38.687c0.0218 0.417 0.4599 0.833 0.8762 0.833h31.327c0.416 0 0.811-0.416 0.789-0.833l-0.936-27.226c-0.022-0.417-0.46-0.833-0.877-0.833h-13.27c-0.486 0-1.235-0.316-1.402-1.1066l-0.612-2.893c-0.155-0.7357-0.882-1.0379-1.298-1.0379h-14.779c-0.4162 0-0.8107 0.4163-0.7889 0.8326l0.9707 32.264z" stroke="url(#linearGradient3104)" stroke-linecap="round" fill="url(#radialGradient238)"/>
<path id="path9788" opacity=".11364" stroke-linejoin="round" d="m5.2266 22.562h30.265" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9784" opacity=".11364" stroke-linejoin="round" d="m5.0422 18.562h30.447" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9778" opacity=".11364" stroke-linejoin="round" d="m4.9807 12.562h30.507" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9798" opacity=".11364" stroke-linejoin="round" d="m5.3862 32.562h30.109" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9800" opacity=".11364" stroke-linejoin="round" d="m5.5091 34.562h29.988" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9782" opacity=".11364" stroke-linejoin="round" d="m5.0422 16.562h30.447" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9780" opacity=".11364" stroke-linejoin="round" d="m5.0114 14.562h30.478" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9776" opacity=".11364" stroke-linejoin="round" d="m4.9221 10.562h15.281" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9774" opacity=".11364" stroke-linejoin="round" d="m4.8738 8.5625h14.783" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9794" opacity=".11364" stroke-linejoin="round" d="m5.3247 28.562h30.169" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9792" opacity=".11364" stroke-linejoin="round" d="m5.2881 26.562h30.205" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9790" opacity=".11364" stroke-linejoin="round" d="m5.2266 24.562h30.265" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9786" opacity=".11364" stroke-linejoin="round" d="m5.1959 20.562h30.296" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9796" opacity=".11364" stroke-linejoin="round" d="m5.3247 30.562h30.169" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9802" opacity=".11364" stroke-linejoin="round" d="m5.5091 36.562h29.988" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path219" opacity=".45143" d="m6.0683 38.864c0.0164 0.312-0.1809 0.52-0.4985 0.416-0.3177-0.104-0.5368-0.312-0.5531-0.624l-0.9477-32.065c-0.0164-0.3118 0.1651-0.5004 0.4774-0.5004l14.422-0.0477c0.313 0 0.932 0.3005 1.133 1.3222l0.574 2.8159c-0.427-0.4656-0.419-0.48-0.638-1.1571l-0.406-1.2592c-0.219-0.7276-0.698-0.8319-1.01-0.8319h-12.888c-0.3122 0-0.5095 0.2082-0.4931 0.5204l0.938 31.515-0.1096-0.104z" display="block" fill="url(#linearGradient491)"/>
<g id="g220" fill-opacity=".75706" transform="matrix(1.0408 0 .054493 1.0408 -8.6702 2.6706)" fill="#fff">
<path id="path221" fill-opacity=".50847" fill="#fff" d="m42.417 8.5152c0.005-0.0971-0.128-0.247-0.235-0.247l-13.031-0.0021s0.911 0.5879 2.201 0.5962l11.054 0.071c0.011-0.2117 0.003-0.256 0.011-0.4181z"/>
</g>
<path id="path233" stroke-linejoin="round" d="m39.784 39.511c1.143-0.044 1.963-1.097 2.047-2.321 0.791-11.549 1.659-21.232 1.659-21.232 0.072-0.248-0.168-0.495-0.48-0.495h-34.371c-0.0004 0-1.8507 21.867-1.8507 21.867-0.1145 0.982-0.466 1.804-1.5498 2.183l34.546-0.002z" display="block" stroke="#3465a4" fill="url(#linearGradient9772)"/>
<path id="path304" opacity=".46591" d="m9.6202 16.464l32.791 0.065-1.574 20.002c-0.084 1.071-0.45 1.428-1.872 1.428-1.872 0-28.678-0.032-31.395-0.032 0.2335-0.321 0.3337-0.989 0.335-1.005l1.7152-20.458z" stroke="url(#linearGradient322)" stroke-linecap="round" stroke-width="1px" fill="none"/>
<path id="path323" d="m9.6202 16.223l-1.1666 15.643s8.2964-4.148 18.666-4.148 15.555-11.495 15.555-11.495h-33.055z" fill-opacity=".089286" fill-rule="evenodd" fill="#fff"/>
</g>
</svg>
<svg
width="64"
height="64"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xml:space="preserve"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs2871"><linearGradient
id="linearGradient8"><stop
style="stop-color:#3465a4;stop-opacity:1"
offset="0"
id="stop8" /><stop
style="stop-color:#729fcf;stop-opacity:1"
offset="1"
id="stop9" /></linearGradient><linearGradient
id="linearGradient5"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop19" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop20" /></linearGradient><linearGradient
id="swatch18"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop18" /></linearGradient><linearGradient
id="swatch15"><stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop15" /></linearGradient><linearGradient
id="linearGradient5-1"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop6" /></linearGradient><linearGradient
id="linearGradient3836-9"><stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" /><stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" /></linearGradient><linearGradient
xlink:href="#linearGradient8"
id="linearGradient9"
x1="32"
y1="64"
x2="32"
y2="14.419661"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2874"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:creator><cc:Agent><dc:title>[maxwxyz]</dc:title></cc:Agent></dc:creator><dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation><dc:publisher><cc:Agent><dc:title>FreeCAD</dc:title></cc:Agent></dc:publisher><dc:identifier>FreeCAD/src/</dc:identifier><dc:rights><cc:Agent><dc:title>FreeCAD LGPL2+</dc:title></cc:Agent></dc:rights><dc:date>2024</dc:date></cc:Work></rdf:RDF></metadata><g
id="layer3"
style="display:inline"><path
style="fill:#204a87;fill-opacity:1;stroke:#0c1522;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path4"
d="M 29.921921,10.073012 26.993293,6.1977395 C 26.21651,5.1698698 25.163057,4.5924975 24.064598,4.5924975 H 5.0714589 c -1.1437425,0 -2.0708717,1.2268134 -2.0708717,2.740257 V 58.484215 c 0,0.504481 0.309043,0.913419 0.6902905,0.913419 H 60.294706 c 0.381247,0 0.690291,-0.408938 0.690291,-0.913419 V 12.813269 c 0,-1.513445 -0.927129,-2.740257 -2.070872,-2.740257 z" /><path
style="fill:#204a87;fill-opacity:1;stroke:#3465a4;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path7"
d="M 5.2089844,6.5917969 H 24.064453 c 0.375444,0 0.874561,0.2026195 1.333984,0.8105468 l 3.527344,4.6699223 h 29.84961 c 0.0082,0.01044 0.01784,0.02289 0.02734,0.03711 0.01056,0.0158 0.02193,0.03237 0.0332,0.05273 0.08049,0.145363 0.148438,0.361331 0.148438,0.650391 V 57.398437 H 5 V 7.3320312 C 5,7.0436394 5.0678061,6.828994 5.1484375,6.6835937 c 0.011294,-0.020366 0.022609,-0.038859 0.033203,-0.054687 0.00953,-0.014245 0.019073,-0.026632 0.027344,-0.037109 z" /><path
style="fill:#729fcf;fill-opacity:1;stroke:#0c1522;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path6"
d="m 29.919347,14.419661 -2.927223,3.534545 C 26.215716,18.891703 25.16247,19.41831 24.064012,19.41831 H 3.0000008 l 0.015588,39.156085 c 2.171e-4,0.460126 0.3093777,0.833108 0.6906252,0.833108 h 56.603828 c 0.381248,0 0.690139,-0.372982 0.689957,-0.833108 L 60.983419,16.918986 C 60.982865,15.538609 60.055293,14.419661 58.91155,14.419661 H 29.919344 Z" /><path
style="fill:url(#linearGradient9);fill-opacity:1;stroke:#729fcf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path8"
d="m 30.861328,16.419922 h 28.050781 c 0,0 0.07225,0.463543 0.07227,0.5 L 59,57.408203 H 5.015625 L 5,21.417969 h 19.064453 c 1.756119,0 3.349555,-0.836095 4.46875,-2.1875 z" /></g></svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -4,484 +4,81 @@
<svg
width="64"
height="64"
id="svg11300"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xml:space="preserve"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs3">
<linearGradient
id="linearGradient3822">
<stop
style="stop-color:#729fcf;stop-opacity:1"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs2871"><linearGradient
id="linearGradient5"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop3824" />
<stop
style="stop-color:#204a87;stop-opacity:1"
id="stop19" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop3826" />
</linearGradient>
<radialGradient
xlink:href="#linearGradient5060"
id="radialGradient5031"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5060">
<stop
style="stop-color:black;stop-opacity:1;"
id="stop20" /></linearGradient><linearGradient
id="swatch18"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5062" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5064" />
</linearGradient>
<radialGradient
xlink:href="#linearGradient5060"
id="radialGradient5029"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
id="stop18" /></linearGradient><linearGradient
id="swatch15"><stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient5048"
id="linearGradient5027"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
x1="302.85715"
y1="366.64789"
x2="302.85715"
y2="609.50507" />
<linearGradient
id="linearGradient3284">
<stop
style="stop-color:#000000;stop-opacity:1;"
id="stop15" /></linearGradient><linearGradient
id="linearGradient5-1"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop3286" />
<stop
style="stop-color:#000000;stop-opacity:0;"
id="stop5" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop3288" />
</linearGradient>
<linearGradient
id="linearGradient3260">
<stop
style="stop-color:#204a87;stop-opacity:1;"
id="stop6" /></linearGradient><linearGradient
id="linearGradient3836-9"><stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3262" />
<stop
style="stop-color:#204a87;stop-opacity:0;"
id="stop3838-8" /><stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3264" />
</linearGradient>
<linearGradient
id="linearGradient3239">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop3241" />
<stop
style="stop-color:#d3d7cf;stop-opacity:1"
offset="1"
id="stop3243" />
</linearGradient>
<linearGradient
id="linearGradient11520">
<stop
id="stop11522"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop11524"
offset="1.0000000"
style="stop-color:#dcdcdc;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient11508">
<stop
id="stop11510"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop11512"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient11494">
<stop
id="stop11496"
offset="0"
style="stop-color:#ef2929;stop-opacity:1;" />
<stop
id="stop11498"
offset="1"
style="stop-color:#ef2929;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient11415">
<stop
id="stop11417"
offset="0.0000000"
style="stop-color:#204a87;stop-opacity:0.0000000;" />
<stop
style="stop-color:#204a87;stop-opacity:1.0000000;"
offset="0.50000000"
id="stop11423" />
<stop
id="stop11419"
offset="1"
style="stop-color:#204a87;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient11399">
<stop
id="stop11401"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop11403"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
gradientTransform="translate(-60.28571,-0.285714)"
y2="34.462429"
x2="43.615788"
y1="3.774456"
x1="15.82836"
gradientUnits="userSpaceOnUse"
id="linearGradient11425"
xlink:href="#linearGradient11415" />
<linearGradient
gradientTransform="translate(-60.57143,0)"
y2="39.033859"
x2="35.679932"
y1="9.3458843"
x1="9.6957054"
gradientUnits="userSpaceOnUse"
id="linearGradient11427"
xlink:href="#linearGradient11415" />
<linearGradient
y2="33.462429"
x2="26.758644"
y1="19.774456"
x1="13.267134"
gradientTransform="translate(-60.85714,0.428571)"
gradientUnits="userSpaceOnUse"
id="linearGradient11439"
xlink:href="#linearGradient11415" />
<radialGradient
r="8.5"
fy="39.142857"
fx="12.071428"
cy="39.142857"
cx="12.071428"
gradientTransform="matrix(1,0,0,0.487395,0,20.06483)"
gradientUnits="userSpaceOnUse"
id="radialGradient11441"
xlink:href="#linearGradient11399" />
<radialGradient
gradientTransform="matrix(1.243453,0,0,1.243453,-6.713754,-3.742847)"
gradientUnits="userSpaceOnUse"
r="3.8335035"
fy="15.048258"
fx="27.577173"
cy="15.048258"
cx="27.577173"
id="radialGradient11500"
xlink:href="#linearGradient11494" />
<radialGradient
r="3.8335035"
fy="16.049133"
fx="27.577173"
cy="16.049133"
cx="27.577173"
gradientTransform="matrix(1.243453,0,0,1.243453,-6.713754,-3.742847)"
gradientUnits="userSpaceOnUse"
id="radialGradient11504"
xlink:href="#linearGradient11494" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
r="6.5659914"
fy="44.565483"
fx="30.203562"
cy="44.565483"
cx="30.203562"
id="radialGradient11514"
xlink:href="#linearGradient11508" />
<radialGradient
gradientTransform="matrix(1.995058,0,0,1.995058,-24.32488,-35.70087)"
gradientUnits="userSpaceOnUse"
r="20.530962"
fy="35.87817"
fx="24.44569"
cy="35.87817"
cx="24.44569"
id="radialGradient11526"
xlink:href="#linearGradient11520" />
<radialGradient
r="6.5659914"
fy="44.565483"
fx="30.203562"
cy="44.565483"
cx="30.203562"
gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
gradientUnits="userSpaceOnUse"
id="radialGradient11532"
xlink:href="#linearGradient11508" />
<radialGradient
xlink:href="#linearGradient11508"
id="radialGradient1348"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
cx="30.203562"
cy="44.565483"
fx="30.203562"
fy="44.565483"
r="6.5659914" />
<radialGradient
xlink:href="#linearGradient11520"
id="radialGradient1350"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.995058,0,0,1.995058,-24.32488,-35.70087)"
cx="24.44569"
cy="35.87817"
fx="24.44569"
fy="35.87817"
r="20.530962" />
<radialGradient
xlink:href="#linearGradient11494"
id="radialGradient1352"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.243453,0,0,1.243453,-6.713754,-3.742847)"
cx="27.577173"
cy="16.049133"
fx="27.577173"
fy="16.049133"
r="3.8335035" />
<radialGradient
xlink:href="#linearGradient11494"
id="radialGradient1354"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.243453,0,0,1.243453,-6.713754,-3.742847)"
cx="27.577173"
cy="15.048258"
fx="27.577173"
fy="15.048258"
r="3.8335035" />
<radialGradient
xlink:href="#linearGradient11508"
id="radialGradient1356"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
cx="30.203562"
cy="44.565483"
fx="30.203562"
fy="44.565483"
r="6.5659914" />
<radialGradient
xlink:href="#linearGradient11520"
id="radialGradient1366"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.049266,0,0,2.049266,-25.65002,-37.31089)"
cx="24.44569"
cy="35.87817"
fx="24.44569"
fy="35.87817"
r="20.530962" />
<linearGradient
xlink:href="#linearGradient3239"
id="linearGradient3249"
gradientUnits="userSpaceOnUse"
x1="15.663794"
y1="5.1465507"
x2="27.11207"
y2="42.353451"
gradientTransform="matrix(1.3975903,0,0,1.3975902,-1.8915666,-17.192769)" />
<linearGradient
xlink:href="#linearGradient3260"
id="linearGradient3266"
x1="12.363961"
y1="11.394304"
x2="18.22703"
y2="17.58149"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3813389,0,0,1.3813389,-1.8428134,-16.461473)" />
<linearGradient
xlink:href="#linearGradient3260"
id="linearGradient3270"
gradientUnits="userSpaceOnUse"
x1="12.363961"
y1="11.394304"
x2="18.22703"
y2="17.58149"
gradientTransform="matrix(-1.3813389,0,0,1.3813389,65.842795,-16.461473)" />
<linearGradient
xlink:href="#linearGradient3260"
id="linearGradient3278"
gradientUnits="userSpaceOnUse"
x1="12.363961"
y1="11.394304"
x2="18.22703"
y2="17.58149"
gradientTransform="matrix(1.3813389,0,0,-1.3813389,-1.8428134,48.504624)" />
<linearGradient
xlink:href="#linearGradient3260"
id="linearGradient3280"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.3813389,0,0,-1.3813389,65.842795,48.504624)"
x1="12.363961"
y1="11.394304"
x2="18.22703"
y2="17.58149" />
<radialGradient
xlink:href="#linearGradient3284"
id="radialGradient3290"
cx="25.455845"
cy="43.403805"
fx="25.455845"
fy="43.403805"
r="20.682873"
gradientTransform="matrix(1,0,0,0.205128,0,34.50046)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient3822"
id="linearGradient3828"
x1="44"
y1="41"
x2="53"
y2="56"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="stop3840-1" /></linearGradient><linearGradient
xlink:href="#linearGradient3822-6-2"
id="linearGradient3834-3-0"
gradientUnits="userSpaceOnUse"
x1="48"
y1="54"
x2="46"
y2="42"
gradientTransform="rotate(180,34.5,29.5)" />
<linearGradient
id="linearGradient3822-6-2">
<stop
x1="37"
y1="62.628094"
x2="37"
y2="20"
gradientTransform="matrix(-1.325,0,0,-1.3262548,81.025,83.06081)" /><linearGradient
id="linearGradient3822-6-2"><stop
style="stop-color:#729fcf;stop-opacity:1"
offset="0"
id="stop3824-7-3" />
<stop
id="stop3824-7-3" /><stop
style="stop-color:#204a87;stop-opacity:1"
offset="1"
id="stop3826-5-7" />
</linearGradient>
</defs>
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="translate(0,16)">
<g
style="display:inline"
id="g5022"
transform="matrix(0.03152036,0,0,0.03344397,60.035325,37.041739)">
<rect
y="-150.69685"
x="-1559.2523"
height="478.35718"
width="1339.6335"
id="rect4173"
style="opacity:0.40206185;color:#000000;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" />
<path
id="path5058"
d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z"
style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z"
id="path5018" />
</g>
<rect
style="color:#000000;fill:url(#linearGradient3249);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.99999975999999990;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
id="rect2354"
width="58"
height="57.999996"
x="3"
y="-12.999999"
rx="2.5900114"
ry="2.5900111" />
<path
xlink:href="#rect2354"
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:2.07175946;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
id="path3247"
d="m 5.59375,-11.96875 c -0.8780988,0 -1.5625,0.684401 -1.5625,1.5625 l 0,52.8125 c 0,0.878099 0.6844012,1.5625 1.5625,1.5625 l 52.8125,0 c 0.878098,0 1.5625,-0.684402 1.5625,-1.5625 l 0,-52.8125 c 0,-0.878098 -0.684402,-1.5625 -1.5625,-1.5625 l -52.8125,0 z"
transform="matrix(0.96536313,0,0,0.96536312,1.10838,0.55418996)" />
<path
id="stop3826-5-7" /></linearGradient></defs><metadata
id="metadata2874"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:creator><cc:Agent><dc:title>[maxwxyz]</dc:title></cc:Agent></dc:creator><dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation><dc:publisher><cc:Agent><dc:title>FreeCAD</dc:title></cc:Agent></dc:publisher><dc:identifier>FreeCAD/src/</dc:identifier><dc:rights><cc:Agent><dc:title>FreeCAD LGPL2+</dc:title></cc:Agent></dc:rights><dc:date>2024</dc:date></cc:Work></rdf:RDF></metadata><g
id="layer3"
style="display:inline"><path
id="path3050-5-8"
d="M 12,2 V 39 H 52 V 2 C 38.666667,2 25.333333,2 12,2 Z"
style="fill:url(#linearGradient3834-3-0);fill-opacity:1;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
<path
d="M 5.5,7.4642865 V 56.535713 h 53 V 7.4642865 c -17.666666,0 -35.333334,0 -53,0 z"
style="fill:#729fcf;fill-opacity:1;stroke:#0b1521;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /><path
id="path14"
d="m 7.5,9.4648438 h 49 V 54.535156 h -49 z"
style="fill:url(#linearGradient3834-3-0);fill-opacity:1;stroke:#729fcf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /><path
style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#3465a4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="M 32,31.368447 9.6167373,52.533612"
id="path16" /><path
style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#3465a4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="M 32,31.368447 54.383263,52.533612"
id="path17" /><path
id="path3820-6-9"
d="M 50,5 32,20 14,5 14.15625,37 H 50 Z"
style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</svg>
d="M 56.427207,11.001926 32.000581,31.368931 7.5739563,11.001926"
style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /><path
id="path15"
d="M 54.480126,15.155737 32.000581,33.899259 9.564511,15.191985"
style="fill:none;stroke:#3465a4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /></g></svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -4,498 +4,81 @@
<svg
width="64"
height="64"
id="svg11300"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xml:space="preserve"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs3">
<linearGradient
id="linearGradient3822">
<stop
style="stop-color:#729fcf;stop-opacity:1"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs2871"><linearGradient
id="linearGradient5"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop3824" />
<stop
style="stop-color:#204a87;stop-opacity:1"
id="stop19" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop3826" />
</linearGradient>
<radialGradient
xlink:href="#linearGradient5060"
id="radialGradient5031"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5060">
<stop
style="stop-color:black;stop-opacity:1;"
id="stop20" /></linearGradient><linearGradient
id="swatch18"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5062" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5064" />
</linearGradient>
<radialGradient
xlink:href="#linearGradient5060"
id="radialGradient5029"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
id="stop18" /></linearGradient><linearGradient
id="swatch15"><stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient5048"
id="linearGradient5027"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
x1="302.85715"
y1="366.64789"
x2="302.85715"
y2="609.50507" />
<linearGradient
id="linearGradient3284">
<stop
style="stop-color:#000000;stop-opacity:1;"
id="stop15" /></linearGradient><linearGradient
id="linearGradient5-1"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop3286" />
<stop
style="stop-color:#000000;stop-opacity:0;"
id="stop5" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop3288" />
</linearGradient>
<linearGradient
id="linearGradient3260">
<stop
style="stop-color:#204a87;stop-opacity:1;"
id="stop6" /></linearGradient><linearGradient
id="linearGradient3836-9"><stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3262" />
<stop
style="stop-color:#204a87;stop-opacity:0;"
id="stop3838-8" /><stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3264" />
</linearGradient>
<linearGradient
id="linearGradient3239">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop3241" />
<stop
style="stop-color:#d3d7cf;stop-opacity:1"
offset="1"
id="stop3243" />
</linearGradient>
<linearGradient
id="linearGradient11520">
<stop
id="stop11522"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop11524"
offset="1.0000000"
style="stop-color:#dcdcdc;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient11508">
<stop
id="stop11510"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop11512"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient11494">
<stop
id="stop11496"
offset="0"
style="stop-color:#ef2929;stop-opacity:1;" />
<stop
id="stop11498"
offset="1"
style="stop-color:#ef2929;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient11415">
<stop
id="stop11417"
offset="0.0000000"
style="stop-color:#204a87;stop-opacity:0.0000000;" />
<stop
style="stop-color:#204a87;stop-opacity:1.0000000;"
offset="0.50000000"
id="stop11423" />
<stop
id="stop11419"
offset="1"
style="stop-color:#204a87;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient11399">
<stop
id="stop11401"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop11403"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
gradientTransform="translate(-60.28571,-0.285714)"
y2="34.462429"
x2="43.615788"
y1="3.774456"
x1="15.82836"
gradientUnits="userSpaceOnUse"
id="linearGradient11425"
xlink:href="#linearGradient11415" />
<linearGradient
gradientTransform="translate(-60.57143,0)"
y2="39.033859"
x2="35.679932"
y1="9.3458843"
x1="9.6957054"
gradientUnits="userSpaceOnUse"
id="linearGradient11427"
xlink:href="#linearGradient11415" />
<linearGradient
y2="33.462429"
x2="26.758644"
y1="19.774456"
x1="13.267134"
gradientTransform="translate(-60.85714,0.428571)"
gradientUnits="userSpaceOnUse"
id="linearGradient11439"
xlink:href="#linearGradient11415" />
<radialGradient
r="8.5"
fy="39.142857"
fx="12.071428"
cy="39.142857"
cx="12.071428"
gradientTransform="matrix(1,0,0,0.487395,0,20.06483)"
gradientUnits="userSpaceOnUse"
id="radialGradient11441"
xlink:href="#linearGradient11399" />
<radialGradient
gradientTransform="matrix(1.243453,0,0,1.243453,-6.713754,-3.742847)"
gradientUnits="userSpaceOnUse"
r="3.8335035"
fy="15.048258"
fx="27.577173"
cy="15.048258"
cx="27.577173"
id="radialGradient11500"
xlink:href="#linearGradient11494" />
<radialGradient
r="3.8335035"
fy="16.049133"
fx="27.577173"
cy="16.049133"
cx="27.577173"
gradientTransform="matrix(1.243453,0,0,1.243453,-6.713754,-3.742847)"
gradientUnits="userSpaceOnUse"
id="radialGradient11504"
xlink:href="#linearGradient11494" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
r="6.5659914"
fy="44.565483"
fx="30.203562"
cy="44.565483"
cx="30.203562"
id="radialGradient11514"
xlink:href="#linearGradient11508" />
<radialGradient
gradientTransform="matrix(1.995058,0,0,1.995058,-24.32488,-35.70087)"
gradientUnits="userSpaceOnUse"
r="20.530962"
fy="35.87817"
fx="24.44569"
cy="35.87817"
cx="24.44569"
id="radialGradient11526"
xlink:href="#linearGradient11520" />
<radialGradient
r="6.5659914"
fy="44.565483"
fx="30.203562"
cy="44.565483"
cx="30.203562"
gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
gradientUnits="userSpaceOnUse"
id="radialGradient11532"
xlink:href="#linearGradient11508" />
<radialGradient
xlink:href="#linearGradient11508"
id="radialGradient1348"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
cx="30.203562"
cy="44.565483"
fx="30.203562"
fy="44.565483"
r="6.5659914" />
<radialGradient
xlink:href="#linearGradient11520"
id="radialGradient1350"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.995058,0,0,1.995058,-24.32488,-35.70087)"
cx="24.44569"
cy="35.87817"
fx="24.44569"
fy="35.87817"
r="20.530962" />
<radialGradient
xlink:href="#linearGradient11494"
id="radialGradient1352"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.243453,0,0,1.243453,-6.713754,-3.742847)"
cx="27.577173"
cy="16.049133"
fx="27.577173"
fy="16.049133"
r="3.8335035" />
<radialGradient
xlink:href="#linearGradient11494"
id="radialGradient1354"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.243453,0,0,1.243453,-6.713754,-3.742847)"
cx="27.577173"
cy="15.048258"
fx="27.577173"
fy="15.048258"
r="3.8335035" />
<radialGradient
xlink:href="#linearGradient11508"
id="radialGradient1356"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
cx="30.203562"
cy="44.565483"
fx="30.203562"
fy="44.565483"
r="6.5659914" />
<radialGradient
xlink:href="#linearGradient11520"
id="radialGradient1366"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.049266,0,0,2.049266,-25.65002,-37.31089)"
cx="24.44569"
cy="35.87817"
fx="24.44569"
fy="35.87817"
r="20.530962" />
<linearGradient
xlink:href="#linearGradient3239"
id="linearGradient3249"
gradientUnits="userSpaceOnUse"
x1="15.663794"
y1="5.1465507"
x2="27.11207"
y2="42.353451"
gradientTransform="matrix(1.3975903,0,0,1.3975902,-1.8915666,-1.192769)" />
<linearGradient
xlink:href="#linearGradient3260"
id="linearGradient3266"
x1="12.363961"
y1="11.394304"
x2="18.22703"
y2="17.58149"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3813389,0,0,1.3813389,-1.8428134,-16.461473)" />
<linearGradient
xlink:href="#linearGradient3260"
id="linearGradient3270"
gradientUnits="userSpaceOnUse"
x1="12.363961"
y1="11.394304"
x2="18.22703"
y2="17.58149"
gradientTransform="matrix(-1.3813389,0,0,1.3813389,65.842795,-16.461473)" />
<linearGradient
xlink:href="#linearGradient3260"
id="linearGradient3278"
gradientUnits="userSpaceOnUse"
x1="12.363961"
y1="11.394304"
x2="18.22703"
y2="17.58149"
gradientTransform="matrix(1.3813389,0,0,-1.3813389,-1.8428134,48.504624)" />
<linearGradient
xlink:href="#linearGradient3260"
id="linearGradient3280"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.3813389,0,0,-1.3813389,65.842795,48.504624)"
x1="12.363961"
y1="11.394304"
x2="18.22703"
y2="17.58149" />
<radialGradient
xlink:href="#linearGradient3284"
id="radialGradient3290"
cx="25.455845"
cy="43.403805"
fx="25.455845"
fy="43.403805"
r="20.682873"
gradientTransform="matrix(1,0,0,0.205128,0,34.50046)"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient3822"
id="linearGradient3828"
x1="44"
y1="41"
x2="53"
y2="56"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient11494"
id="stop3840-1" /></linearGradient><linearGradient
xlink:href="#linearGradient3822-6-2"
id="linearGradient3834-3-0"
gradientUnits="userSpaceOnUse"
x1="48"
y1="54"
x2="25.519545"
y2="28.740286"
gradientTransform="rotate(180,34.5,37.5)" />
<linearGradient
id="linearGradient3822-6-2">
<stop
style="stop-color:#729fcf;stop-opacity:1"
x1="37"
y1="62.628094"
x2="37"
y2="20"
gradientTransform="matrix(-1.325,0,0,-1.3262548,81.025,83.06081)" /><linearGradient
id="linearGradient3822-6-2"><stop
style="stop-color:#fce94f;stop-opacity:1"
offset="0"
id="stop3824-7-3" />
<stop
style="stop-color:#204a87;stop-opacity:1"
id="stop3824-7-3" /><stop
style="stop-color:#c4a000;stop-opacity:1"
offset="1"
id="stop3826-5-7" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient3774"
id="linearGradient3780-9"
x1="30"
y1="-2"
x2="26"
y2="-26"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3774">
<stop
style="stop-color:#d3d7cf;stop-opacity:1"
offset="0"
id="stop3776" />
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="1"
id="stop3778" />
</linearGradient>
</defs>
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
style="display:inline"
id="g5022"
transform="matrix(0.03152036,0,0,0.03344397,60.035325,53.041739)">
<rect
y="-150.69685"
x="-1559.2523"
height="478.35718"
width="1339.6335"
id="rect4173"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.402062;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none" />
<path
id="path5058"
d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.402062;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.402062;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none"
d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z"
id="path5018" />
</g>
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient3249);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
id="rect2354"
width="58"
height="57.999996"
x="3"
y="3.000001"
rx="2.5900114"
ry="2.5900111" />
<path
xlink:href="#rect2354"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
id="path3247"
d="m 6.50838,5.0000002 c -0.8476842,0 -1.5083799,0.6606954 -1.5083799,1.5083798 V 57.49162 C 5.0000001,58.339304 5.6606958,59 6.50838,59 H 57.49162 C 58.339304,59 59,58.339303 59,57.49162 V 6.50838 C 59,5.6606966 58.339304,5.0000002 57.49162,5.0000002 Z" />
<path
id="path3050-5-8"
d="M 12,18 V 55 H 52 V 18 c -13.333333,0 -26.666667,0 -40,0 z"
style="fill:url(#linearGradient3834-3-0);fill-opacity:1;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
<path
id="path3820-6-9"
d="M 50,21 32,36 14,21 14.15625,53 H 50 Z"
style="fill:none;stroke:#cc0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</svg>
id="stop3826-5-7" /></linearGradient></defs><metadata
id="metadata2874"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:creator><cc:Agent><dc:title>[maxwxyz]</dc:title></cc:Agent></dc:creator><dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation><dc:publisher><cc:Agent><dc:title>FreeCAD</dc:title></cc:Agent></dc:publisher><dc:identifier>FreeCAD/src/</dc:identifier><dc:rights><cc:Agent><dc:title>FreeCAD LGPL2+</dc:title></cc:Agent></dc:rights><dc:date>2024</dc:date></cc:Work></rdf:RDF></metadata><g
id="layer3"
style="display:inline"><path
id="path3050-5-8"
d="M 5.5,7.4642865 V 56.535713 h 53 V 7.4642865 c -17.666666,0 -35.333334,0 -53,0 z"
style="fill:#fce94f;fill-opacity:1;stroke:#231f0b;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /><path
id="path14"
d="m 7.5,9.4648438 h 49 V 54.535156 h -49 z"
style="fill:url(#linearGradient3834-3-0);fill-opacity:1;stroke:#fce94f;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /><path
style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#c4a000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="M 32,31.368447 9.6167373,52.533612"
id="path16" /><path
style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#c4a000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="M 32,31.368447 54.383263,52.533612"
id="path17" /><path
id="path3820-6-9"
d="M 56.427207,11.001926 32.000581,31.368931 7.5739563,11.001926"
style="fill:none;stroke:#fce94f;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /><path
id="path15"
d="M 54.480126,15.155737 32.000581,33.899259 9.564511,15.191985"
style="fill:none;stroke:#c4a000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" /></g></svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -36,39 +36,6 @@
offset="1"
style="stop-color:#204a87;stop-opacity:1" />
</linearGradient>
<linearGradient
id="linearGradient2690">
<stop
style="stop-color:#c4d7eb;stop-opacity:1;"
offset="0"
id="stop2692" />
<stop
style="stop-color:#c4d7eb;stop-opacity:0;"
offset="1"
id="stop2694" />
</linearGradient>
<linearGradient
id="linearGradient2682">
<stop
style="stop-color:#3977c3;stop-opacity:1;"
offset="0"
id="stop2684" />
<stop
style="stop-color:#89aedc;stop-opacity:0;"
offset="1"
id="stop2686" />
</linearGradient>
<linearGradient
id="linearGradient2402">
<stop
style="stop-color:#729fcf;stop-opacity:1;"
offset="0"
id="stop2404" />
<stop
style="stop-color:#528ac5;stop-opacity:1;"
offset="1"
id="stop2406" />
</linearGradient>
<linearGradient
id="linearGradient2380">
<stop
@@ -80,130 +47,6 @@
offset="1"
id="stop2384" />
</linearGradient>
<linearGradient
id="linearGradient2871">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2873" />
<stop
style="stop-color:#3465a4;stop-opacity:1"
offset="1"
id="stop2875" />
</linearGradient>
<linearGradient
id="linearGradient2847">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2849" />
<stop
style="stop-color:#3465a4;stop-opacity:0;"
offset="1"
id="stop2851" />
</linearGradient>
<linearGradient
id="linearGradient2831">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2833" />
<stop
id="stop2855"
offset="0.33333334"
style="stop-color:#5b86be;stop-opacity:1;" />
<stop
style="stop-color:#83a8d8;stop-opacity:0;"
offset="1"
id="stop2835" />
</linearGradient>
<linearGradient
id="linearGradient2797">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2799" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2801" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient2831"
id="linearGradient1486"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,0.02150968,-18.214919)"
x1="13.478554"
y1="10.612206"
x2="15.419417"
y2="19.115122" />
<linearGradient
xlink:href="#linearGradient2847"
id="linearGradient1488"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.370336,0,0,-1.3589114,64.512944,44.464873)"
x1="37.128052"
y1="29.729605"
x2="37.065414"
y2="26.194071" />
<linearGradient
xlink:href="#linearGradient2797"
id="linearGradient1491"
gradientUnits="userSpaceOnUse"
x1="5.9649177"
y1="26.048164"
x2="52.854095"
y2="26.048164" />
<linearGradient
xlink:href="#linearGradient2797"
id="linearGradient1493"
gradientUnits="userSpaceOnUse"
x1="5.9649177"
y1="26.048164"
x2="52.854095"
y2="26.048164" />
<linearGradient
xlink:href="#linearGradient2871"
id="linearGradient1501"
gradientUnits="userSpaceOnUse"
x1="46.834816"
y1="45.264122"
x2="45.380436"
y2="50.939667" />
<linearGradient
xlink:href="#linearGradient3063"
id="linearGradient2386"
x1="42.703487"
y1="20.547306"
x2="26.605606"
y2="33.634254"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient2402"
id="linearGradient2408"
x1="18.935766"
y1="23.667896"
x2="53.588623"
y2="26.649363"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient2682"
id="linearGradient2688"
x1="36.713837"
y1="31.455952"
x2="37.124462"
y2="24.842253"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,-0.33380651,-16.948724)" />
<linearGradient
xlink:href="#linearGradient2690"
id="linearGradient2696"
x1="32.647972"
y1="30.748846"
x2="37.124462"
y2="24.842253"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,-0.33380651,-16.948724)" />
<linearGradient
xlink:href="#linearGradient2380"
id="linearGradient3034"
@@ -212,131 +55,6 @@
y1="20.134634"
x2="23.705669"
y2="34.083359" />
<linearGradient
xlink:href="#linearGradient2871"
id="linearGradient3036"
gradientUnits="userSpaceOnUse"
x1="46.834816"
y1="45.264122"
x2="45.380436"
y2="50.939667" />
<linearGradient
xlink:href="#linearGradient2402"
id="linearGradient3038"
gradientUnits="userSpaceOnUse"
x1="18.935766"
y1="23.667896"
x2="53.588623"
y2="26.649363" />
<linearGradient
xlink:href="#linearGradient2871"
id="linearGradient3040"
gradientUnits="userSpaceOnUse"
x1="46.834816"
y1="45.264122"
x2="45.380436"
y2="50.939667" />
<linearGradient
xlink:href="#linearGradient2831-7"
id="linearGradient1486-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,0.30396568,-17.325948)"
x1="13.478554"
y1="10.612206"
x2="15.419417"
y2="19.115122" />
<linearGradient
id="linearGradient2831-7">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2833-4" />
<stop
id="stop2855-0"
offset="0.33333334"
style="stop-color:#5b86be;stop-opacity:1;" />
<stop
style="stop-color:#83a8d8;stop-opacity:0;"
offset="1"
id="stop2835-9" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient2847-8"
id="linearGradient1488-4"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.370336,0,0,-1.3589114,64.7954,45.353844)"
x1="37.128052"
y1="29.729605"
x2="37.065414"
y2="26.194071" />
<linearGradient
id="linearGradient2847-8">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2849-8" />
<stop
style="stop-color:#3465a4;stop-opacity:0;"
offset="1"
id="stop2851-2" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient2380-5"
id="linearGradient2386-4"
x1="62.513836"
y1="36.061237"
x2="15.984863"
y2="20.60858"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient2380-5">
<stop
style="stop-color:#b9cfe7;stop-opacity:1"
offset="0"
id="stop2382-5" />
<stop
style="stop-color:#729fcf;stop-opacity:1"
offset="1"
id="stop2384-1" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient2380-5"
id="linearGradient3034-7"
gradientUnits="userSpaceOnUse"
x1="62.513836"
y1="36.061237"
x2="15.984863"
y2="20.60858" />
<linearGradient
id="linearGradient3895">
<stop
style="stop-color:#b9cfe7;stop-opacity:1"
offset="0"
id="stop3897" />
<stop
style="stop-color:#729fcf;stop-opacity:1"
offset="1"
id="stop3899" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient2797-1"
id="linearGradient3861-1"
gradientUnits="userSpaceOnUse"
x1="5.9649177"
y1="26.048164"
x2="52.854095"
y2="26.048164" />
<linearGradient
id="linearGradient2797-1">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2799-5" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2801-2" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient3063"
id="linearGradient3858"
@@ -345,50 +63,6 @@
y1="20.547306"
x2="26.605606"
y2="33.634254" />
<linearGradient
xlink:href="#linearGradient2831-2"
id="linearGradient1486-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,0.02150968,-18.214919)"
x1="13.478554"
y1="10.612206"
x2="15.419417"
y2="19.115122" />
<linearGradient
id="linearGradient2831-2">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2833-3" />
<stop
id="stop2855-1"
offset="0.33333334"
style="stop-color:#5b86be;stop-opacity:1;" />
<stop
style="stop-color:#83a8d8;stop-opacity:0;"
offset="1"
id="stop2835-6" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient2847-82"
id="linearGradient1488-8"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.370336,0,0,-1.3589114,64.512944,44.464873)"
x1="37.128052"
y1="29.729605"
x2="37.065414"
y2="26.194071" />
<linearGradient
id="linearGradient2847-82">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2849-7" />
<stop
style="stop-color:#3465a4;stop-opacity:0;"
offset="1"
id="stop2851-7" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient3063-2"
id="linearGradient3858-1"
@@ -427,14 +101,6 @@
offset="1"
id="stop2384-6" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient951"
id="linearGradient953"
x1="25.582823"
y1="38.607929"
x2="22.003767"
y2="11.384317"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient951"
id="linearGradient2999"
@@ -508,10 +174,6 @@
transform="matrix(0.76079494,0,0,0.76079494,16.86351,-3.1260111)">
<g
id="g3863">
<path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient1486);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1488);stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="m 27,-3.6915582 c 0,0 -12.247378,-0.8493196 -8.478954,13.4192502 H 7.986588 c 0,0 0.685168,-16.137073 19.013412,-13.4192502 z"
id="path2865" />
<g
id="g1878"
transform="matrix(-0.79349441,-0.66481753,-0.67040672,0.78687903,77.66003,0.94046451)"
@@ -519,7 +181,7 @@
<path
id="path1880"
d="M 44.306783,50.229694 C 62.821497,35.818859 49.664587,13.411704 22.462411,12.49765 L 22.113843,3.1515478 7.6245439,20.496754 22.714328,33.219189 c 0,0 -0.251917,-9.88122 -0.251917,-9.88122 18.82976,0.998977 32.981627,14.071729 21.844372,26.891725 z"
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient3034);fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.9334;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient3034);fill-opacity:1;fill-rule:nonzero;stroke:#0c1522;stroke-width:1.9334;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
</g>
<g
style="fill:none;stroke:#729fcf;stroke-width:0.732809;stroke-opacity:1"
@@ -534,10 +196,6 @@
<g
id="g3863-0"
transform="rotate(180,32.993294,14.5)">
<path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient1486-5);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1488-8);stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="m 27,-3.6915582 c 0,0 -12.247378,-0.8493196 -8.478954,13.4192502 H 7.986588 c 0,0 0.685168,-16.137073 19.013412,-13.4192502 z"
id="path2865-3" />
<g
id="g1878-6"
transform="matrix(-0.79349441,-0.66481753,-0.67040672,0.78687903,77.66003,0.94046451)"
@@ -545,7 +203,7 @@
<path
id="path1880-2"
d="M 44.306783,50.229694 C 62.821497,35.818859 49.664587,13.411704 22.462411,12.49765 L 22.113843,3.1515478 7.6245439,20.496754 22.714328,33.219189 c 0,0 -0.251917,-9.88122 -0.251917,-9.88122 18.82976,0.998977 32.981627,14.071729 21.844372,26.891725 z"
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient3034-4);fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.9334;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient3034-4);fill-opacity:1;fill-rule:nonzero;stroke:#0c1522;stroke-width:1.9334;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" />
</g>
<g
style="fill:none;stroke:#729fcf;stroke-width:0.732809;stroke-opacity:1"

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@@ -1,230 +1,73 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
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"
width="64"
height="64"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xml:space="preserve"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="90.000000"
inkscape:export-xdpi="90.000000"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
width="48px"
height="48px"
id="svg11300"
sodipodi:version="0.32"
inkscape:version="0.43+devel"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
sodipodi:docname="edit-redo.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<linearGradient
inkscape:collect="always"
id="linearGradient2240">
<stop
style="stop-color:#99b00b;stop-opacity:1;"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs2871"><linearGradient
id="linearGradient4"><stop
style="stop-color:#4e9a06;stop-opacity:1"
offset="0"
id="stop2242" />
<stop
style="stop-color:#99b00b;stop-opacity:0;"
id="stop4" /><stop
style="stop-color:#8ae234;stop-opacity:1"
offset="1"
id="stop2244" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2232">
<stop
style="stop-color:#788600;stop-opacity:1;"
id="stop7" /></linearGradient><linearGradient
id="linearGradient5"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop2234" />
<stop
style="stop-color:#788600;stop-opacity:0;"
id="stop19" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop2236" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4991">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
id="stop20" /></linearGradient><linearGradient
id="swatch18"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop4993" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop4995" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
id="stop18" /></linearGradient><linearGradient
id="swatch15"><stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient8668"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-5.825329e-14,16.87306)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient2187"
inkscape:collect="always">
<stop
id="stop2189"
id="stop15" /></linearGradient><linearGradient
id="linearGradient5-1"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop2191"
id="stop5" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2187"
id="linearGradient1764"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.813471e-16,-1.171926,1.171926,1.813471e-16,1.782801,54.10111)"
x1="17.060806"
y1="11.39502"
x2="12.624337"
y2="12.583769" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4991"
id="radialGradient4997"
cx="16.563837"
cy="11.132236"
fx="16.563837"
fy="11.132236"
r="19.0625"
gradientTransform="matrix(-1.290127e-2,1.685197,1.713082,1.311475e-2,-1.041499,-10.11571)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2232"
id="linearGradient2238"
x1="33"
y1="35.75"
x2="31.5"
y2="42.5"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2240"
id="linearGradient2246"
x1="33"
y1="35.75"
x2="31.5"
y2="42.5"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
stroke="#788600"
fill="#99b00b"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.25490196"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="4"
inkscape:cx="53.000477"
inkscape:cy="33.008096"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:showpageshadow="false"
inkscape:window-width="892"
inkscape:window-height="831"
inkscape:window-x="368"
inkscape:window-y="57" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
<dc:title>Edit Redo</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>edit</rdf:li>
<rdf:li>redo</rdf:li>
<rdf:li>again</rdf:li>
<rdf:li>reapply</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
transform="matrix(1.489736,0.000000,0.000000,-1.001252,-12.64716,75.31260)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.14117647;color:#000000;fill:url(#radialGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
style="opacity:1;color:#000000;fill:url(#linearGradient2246);fill-opacity:1.0;fill-rule:nonzero;stroke:url(#linearGradient2238);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
d="M 38.37476,45.034369 C -1.6510486,46.355509 4.6747954,12.29355 25.49479,12.49765 L 25.49479,3.1222396 L 42.143271,17.708819 L 25.49479,33.006349 C 25.49479,33.006349 25.49479,23.337969 25.49479,23.337969 C 11.43168,22.751999 7.3172614,44.770549 38.37476,45.034369 z "
id="path1432"
sodipodi:nodetypes="ccccccc" />
<path
sodipodi:nodetypes="ccccccc"
id="path2177"
d="M 16.92492,39.315519 C 5.2018204,33.235892 8.7371274,13.087489 26.5085,13.549959 L 26.5085,5.4508678 C 26.5085,5.4508678 40.556238,17.714589 40.556238,17.714589 L 26.5085,30.658617 C 26.5085,30.658617 26.5085,22.380979 26.5085,22.380979 C 11.66865,22.032709 12.34859,35.138579 16.92492,39.315519 z "
style="opacity:0.69886361;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1764);stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
<path
style="opacity:0.49431817;color:#000000;fill:url(#radialGradient4997);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 26.036989,4.5686095 L 36.723727,14.798241 C 29.786227,14.79824 32.036989,23.735424 25.911989,26.610424 L 25.974489,22.943609 C 10.786989,22.881109 11.661989,38.443609 22.724489,42.693609 C 3.6363414,37.811681 6.2869904,13.381109 25.911989,12.88111 L 26.036989,4.5686095 z "
id="path4989"
sodipodi:nodetypes="ccccccc" />
</g>
</svg>
id="stop6" /></linearGradient><linearGradient
id="linearGradient3836-9"><stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" /><stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" /></linearGradient><linearGradient
xlink:href="#linearGradient4"
id="linearGradient7"
x1="10.802491"
y1="49.560848"
x2="44.045834"
y2="16.298645"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2874"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:creator><cc:Agent><dc:title>[maxwxyz]</dc:title></cc:Agent></dc:creator><dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation><dc:publisher><cc:Agent><dc:title>FreeCAD</dc:title></cc:Agent></dc:publisher><dc:identifier>FreeCAD/src/</dc:identifier><dc:rights><cc:Agent><dc:title>FreeCAD LGPL2+</dc:title></cc:Agent></dc:rights><dc:date>2024</dc:date></cc:Work></rdf:RDF></metadata><g
id="layer3"
style="display:inline"><g
id="g3"><path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:#8be236;fill-opacity:1;fill-rule:nonzero;stroke:#17230b;stroke-width:2.00001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
d="M 35.188946,2.999885 59.668998,24.363222 35.188946,46.769639 v -14.5239 L 32.594298,32.13747 C 17.80677,31.523733 7.7082907,42.867752 10.161957,55.053544 c 0.409194,2.032201 1.170168,4.02883 2.277583,5.946877 C 7.4484877,56.355657 4.9709797,50.858917 4.4415777,45.502099 3.0749939,31.674148 14.485393,17.102714 32.456904,17.278199 l 2.732042,0.02641 z"
id="path1" /><path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient7);fill-opacity:1;fill-rule:nonzero;stroke:#8ae234;stroke-width:1.47883;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
d="m 35.335937,10.65625 14.400391,12.574219 -14.400391,13.1875 V 27.615234 L 32,27.474609 C 21.515464,27.039216 13.798628,34.189897 13.613281,42.847656 13.066901,41.466422 12.735455,40.068714 12.599609,38.693359 11.681352,29.396575 19.370531,19.319731 31.824219,19.441406 l 3.511718,0.03516 z"
id="path3"
transform="matrix(1.3528102,0,0,1.3520431,-10.61372,-7.0084028)" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -1,229 +1,73 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
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"
width="64"
height="64"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xml:space="preserve"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="90.000000"
inkscape:export-xdpi="90.000000"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
width="48px"
height="48px"
id="svg11300"
sodipodi:version="0.32"
inkscape:version="0.43+devel"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
sodipodi:docname="edit-undo.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<linearGradient
inkscape:collect="always"
id="linearGradient2326">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs2871"><linearGradient
id="linearGradient4"><stop
style="stop-color:#c4a000;stop-opacity:1"
offset="0"
id="stop2328" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
id="stop4" /><stop
style="stop-color:#fce94f;stop-opacity:1"
offset="1"
id="stop2330" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2316">
<stop
style="stop-color:#c4a000;stop-opacity:1;"
id="stop7" /></linearGradient><linearGradient
id="linearGradient5"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop2318" />
<stop
style="stop-color:#c4a000;stop-opacity:0;"
id="stop19" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop2320" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2308">
<stop
style="stop-color:#edd400;stop-opacity:1;"
id="stop20" /></linearGradient><linearGradient
id="swatch18"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop2310" />
<stop
style="stop-color:#edd400;stop-opacity:0;"
offset="1"
id="stop2312" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
id="stop18" /></linearGradient><linearGradient
id="swatch15"><stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient8668"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-6.227265e-14,16.87306)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient2187"
inkscape:collect="always">
<stop
id="stop2189"
id="stop15" /></linearGradient><linearGradient
id="linearGradient5-1"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop2191"
id="stop5" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2187"
id="linearGradient1764"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.813471e-16,-1.171926,-1.171926,1.813471e-16,46.17440,54.10111)"
x1="17.060806"
y1="11.39502"
x2="12.624337"
y2="12.583769" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2308"
id="linearGradient2314"
x1="26.5"
y1="34.25"
x2="26.25"
y2="43.571831"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2316"
id="linearGradient2322"
x1="26.5"
y1="34.25"
x2="26.25"
y2="43.571831"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2326"
id="radialGradient2332"
cx="15.09403"
cy="13.282721"
fx="15.09403"
fy="13.282721"
r="10.16466"
gradientTransform="matrix(2.496031,-1.151905e-16,1.061756e-16,2.300689,-25.12402,-17.82636)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
stroke="#c4a000"
fill="#edd400"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.25490196"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="37.420325"
inkscape:cy="-15.183692"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:showpageshadow="false"
inkscape:window-width="891"
inkscape:window-height="932"
inkscape:window-x="294"
inkscape:window-y="762" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
<dc:title>Edit Undo</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>edit</rdf:li>
<rdf:li>undo</rdf:li>
<rdf:li>revert</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
transform="matrix(-1.489736,0.000000,0.000000,-1.001252,60.60436,75.31260)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.14117647;color:#000000;fill:url(#radialGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
style="opacity:1;color:#000000;fill:url(#linearGradient2314);fill-opacity:1.0;fill-rule:nonzero;stroke:url(#linearGradient2322);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
d="M 9.582441,45.034369 C 49.608249,46.355509 43.282405,12.29355 22.462411,12.49765 L 22.462411,3.1222396 L 5.8139298,17.708819 L 22.462411,33.006349 C 22.462411,33.006349 22.462411,23.337969 22.462411,23.337969 C 36.525521,22.751999 40.639939,44.770549 9.582441,45.034369 z "
id="path1432"
sodipodi:nodetypes="ccccccc" />
<path
sodipodi:nodetypes="ccccccc"
id="path2177"
d="M 31.032281,39.315519 C 42.75538,33.235892 39.220073,13.087489 21.448701,13.549959 L 21.448701,5.4508678 C 21.448701,5.4508678 7.4009628,17.714589 7.4009628,17.714589 L 21.448701,30.658617 C 21.448701,30.658617 21.448701,22.380979 21.448701,22.380979 C 36.288551,22.032709 35.608611,35.138579 31.032281,39.315519 z "
style="opacity:0.69886361;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1764);stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
<path
style="opacity:0.51136364;color:#000000;fill:url(#radialGradient2332);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 6.6291261,17.682797 L 12.28598,23.074486 C 18.561553,22.897709 15.733126,16.710525 26.958446,13.616933 L 22.008699,12.998214 L 21.92031,4.3361562 L 6.6291261,17.682797 z "
id="path2324"
sodipodi:nodetypes="cccccc" />
</g>
</svg>
id="stop6" /></linearGradient><linearGradient
id="linearGradient3836-9"><stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" /><stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" /></linearGradient><linearGradient
xlink:href="#linearGradient4"
id="linearGradient7"
x1="10.802491"
y1="49.560848"
x2="44.045834"
y2="16.298645"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2874"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:creator><cc:Agent><dc:title>[maxwxyz]</dc:title></cc:Agent></dc:creator><dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation><dc:publisher><cc:Agent><dc:title>FreeCAD</dc:title></cc:Agent></dc:publisher><dc:identifier>FreeCAD/src/</dc:identifier><dc:rights><cc:Agent><dc:title>FreeCAD LGPL2+</dc:title></cc:Agent></dc:rights><dc:date>2024</dc:date></cc:Work></rdf:RDF></metadata><g
id="layer3"
style="display:inline"><g
id="g3"><path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke:#221e0c;stroke-width:2.00001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
d="M 28.811054,2.9998852 4.331002,24.363222 28.811054,46.769639 v -14.5239 l 2.594648,-0.108269 c 14.787528,-0.613737 24.886008,10.730282 22.432341,22.916074 -0.409194,2.032201 -1.170168,4.02883 -2.277583,5.946877 4.991053,-4.644764 7.468561,-10.141504 7.997963,-15.498322 1.366583,-13.827951 -10.043816,-28.399385 -28.015327,-28.2239 l -2.732042,0.02641 z"
id="path1" /><path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient7);fill-rule:nonzero;stroke:#fce94f;stroke-width:1.47883;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
d="m 35.335937,10.65625 14.400391,12.574219 -14.400391,13.1875 V 27.615234 L 32,27.474609 C 21.515464,27.039216 13.798628,34.189897 13.613281,42.847656 13.066901,41.466422 12.735455,40.068714 12.599609,38.693359 11.681352,29.396575 19.370531,19.319731 31.824219,19.441406 l 3.511718,0.03516 z"
id="path3"
transform="matrix(-1.3528102,0,0,1.3520431,74.61372,-7.0084018)" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -1,67 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg97" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs id="defs3">
<radialGradient id="radialGradient6719" xlink:href="#linearGradient5060" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(-2.7744 0 0 1.9697 112.76 -872.89)" r="117.14"/>
<linearGradient id="linearGradient5060">
<stop id="stop5062" offset="0"/>
<stop id="stop5064" stop-opacity="0" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient6717" xlink:href="#linearGradient5060" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(2.7744 0 0 1.9697 -1891.6 -872.89)" r="117.14"/>
<linearGradient id="linearGradient6715" y2="609.51" gradientUnits="userSpaceOnUse" x2="302.86" gradientTransform="matrix(2.7744 0 0 1.9697 -1892.2 -872.89)" y1="366.65" x1="302.86">
<stop id="stop5050" stop-opacity="0" offset="0"/>
<stop id="stop5056" offset=".5"/>
<stop id="stop5052" stop-opacity="0" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient238" gradientUnits="userSpaceOnUse" cy="37.518" cx="20.706" gradientTransform="matrix(1.055 -.027345 .17770 1.1909 -3.5722 -7.1253)" r="30.905">
<stop id="stop1790" stop-color="#202020" offset="0"/>
<stop id="stop1791" stop-color="#b9b9b9" offset="1"/>
</radialGradient>
<linearGradient id="linearGradient491" y2="66.834" gradientUnits="userSpaceOnUse" x2="9.8981" gradientTransform="matrix(1.5168 0 0 .70898 -.87957 -1.3182)" y1="13.773" x1="6.2298">
<stop id="stop3984" stop-color="#fff" stop-opacity=".87629" offset="0"/>
<stop id="stop3985" stop-color="#fffffe" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient322" y2="46.689" gradientUnits="userSpaceOnUse" x2="12.854" gradientTransform="matrix(1.3175 0 0 .81626 -.87957 -1.3182)" y1="32.567" x1="13.036">
<stop id="stop320" stop-color="#fff" offset="0"/>
<stop id="stop321" stop-color="#fff" stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient3104" y2="6.1803" gradientUnits="userSpaceOnUse" x2="15.515" y1="31.368" x1="18.113">
<stop id="stop3098" stop-color="#424242" offset="0"/>
<stop id="stop3100" stop-color="#777" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient9772" y2="32.05" gradientUnits="userSpaceOnUse" x2="22.065" y1="36.988" x1="22.176">
<stop id="stop9768" stop-color="#6194cb" offset="0"/>
<stop id="stop9770" stop-color="#729fcf" offset="1"/>
</linearGradient>
</defs>
<g id="layer1">
<g id="g6707" transform="matrix(.022624 0 0 .020868 43.383 36.37)">
<rect id="rect6709" opacity=".40206" height="478.36" width="1339.6" y="-150.7" x="-1559.3" fill="url(#linearGradient6715)"/>
<path id="path6711" opacity=".40206" d="m-219.62-150.68v478.33c142.88 0.9 345.4-107.17 345.4-239.2 0-132.02-159.44-239.13-345.4-239.13z" fill="url(#radialGradient6717)"/>
<path id="path6713" opacity=".40206" d="m-1559.3-150.68v478.33c-142.8 0.9-345.4-107.17-345.4-239.2 0-132.02 159.5-239.13 345.4-239.13z" fill="url(#radialGradient6719)"/>
</g>
<path id="path216" stroke-linejoin="round" d="m4.5218 38.687c0.0218 0.417 0.4599 0.833 0.8762 0.833h31.327c0.416 0 0.811-0.416 0.789-0.833l-0.936-27.226c-0.022-0.417-0.46-0.833-0.877-0.833h-13.27c-0.486 0-1.235-0.316-1.402-1.1066l-0.612-2.893c-0.155-0.7357-0.882-1.0379-1.298-1.0379h-14.779c-0.4162 0-0.8107 0.4163-0.7889 0.8326l0.9707 32.264z" stroke="url(#linearGradient3104)" stroke-linecap="round" fill="url(#radialGradient238)"/>
<path id="path9788" opacity=".11364" stroke-linejoin="round" d="m5.2266 22.562h30.265" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9784" opacity=".11364" stroke-linejoin="round" d="m5.0422 18.562h30.447" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9778" opacity=".11364" stroke-linejoin="round" d="m4.9807 12.562h30.507" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9798" opacity=".11364" stroke-linejoin="round" d="m5.3862 32.562h30.109" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9800" opacity=".11364" stroke-linejoin="round" d="m5.5091 34.562h29.988" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9782" opacity=".11364" stroke-linejoin="round" d="m5.0422 16.562h30.447" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9780" opacity=".11364" stroke-linejoin="round" d="m5.0114 14.562h30.478" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9776" opacity=".11364" stroke-linejoin="round" d="m4.9221 10.562h15.281" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9774" opacity=".11364" stroke-linejoin="round" d="m4.8738 8.5625h14.783" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9794" opacity=".11364" stroke-linejoin="round" d="m5.3247 28.562h30.169" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9792" opacity=".11364" stroke-linejoin="round" d="m5.2881 26.562h30.205" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9790" opacity=".11364" stroke-linejoin="round" d="m5.2266 24.562h30.265" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9786" opacity=".11364" stroke-linejoin="round" d="m5.1959 20.562h30.296" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9796" opacity=".11364" stroke-linejoin="round" d="m5.3247 30.562h30.169" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path9802" opacity=".11364" stroke-linejoin="round" d="m5.5091 36.562h29.988" stroke="#000" stroke-linecap="round" fill="#729fcf"/>
<path id="path219" opacity=".45143" d="m6.0683 38.864c0.0164 0.312-0.1809 0.52-0.4985 0.416-0.3177-0.104-0.5368-0.312-0.5531-0.624l-0.9477-32.065c-0.0164-0.3118 0.1651-0.5004 0.4774-0.5004l14.422-0.0477c0.313 0 0.932 0.3005 1.133 1.3222l0.574 2.8159c-0.427-0.4656-0.419-0.48-0.638-1.1571l-0.406-1.2592c-0.219-0.7276-0.698-0.8319-1.01-0.8319h-12.888c-0.3122 0-0.5095 0.2082-0.4931 0.5204l0.938 31.515-0.1096-0.104z" display="block" fill="url(#linearGradient491)"/>
<g id="g220" fill-opacity=".75706" transform="matrix(1.0408 0 .054493 1.0408 -8.6702 2.6706)" fill="#fff">
<path id="path221" fill-opacity=".50847" fill="#fff" d="m42.417 8.5152c0.005-0.0971-0.128-0.247-0.235-0.247l-13.031-0.0021s0.911 0.5879 2.201 0.5962l11.054 0.071c0.011-0.2117 0.003-0.256 0.011-0.4181z"/>
</g>
<path id="path233" stroke-linejoin="round" d="m39.784 39.511c1.143-0.044 1.963-1.097 2.047-2.321 0.791-11.549 1.659-21.232 1.659-21.232 0.072-0.248-0.168-0.495-0.48-0.495h-34.371c-0.0004 0-1.8507 21.867-1.8507 21.867-0.1145 0.982-0.466 1.804-1.5498 2.183l34.546-0.002z" display="block" stroke="#3465a4" fill="url(#linearGradient9772)"/>
<path id="path304" opacity=".46591" d="m9.6202 16.464l32.791 0.065-1.574 20.002c-0.084 1.071-0.45 1.428-1.872 1.428-1.872 0-28.678-0.032-31.395-0.032 0.2335-0.321 0.3337-0.989 0.335-1.005l1.7152-20.458z" stroke="url(#linearGradient322)" stroke-linecap="round" stroke-width="1px" fill="none"/>
<path id="path323" d="m9.6202 16.223l-1.1666 15.643s8.2964-4.148 18.666-4.148 15.555-11.495 15.555-11.495h-33.055z" fill-opacity=".089286" fill-rule="evenodd" fill="#fff"/>
</g>
</svg>
<svg
width="64"
height="64"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xml:space="preserve"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs2871"><linearGradient
id="linearGradient8"><stop
style="stop-color:#3465a4;stop-opacity:1"
offset="0"
id="stop8" /><stop
style="stop-color:#729fcf;stop-opacity:1"
offset="1"
id="stop9" /></linearGradient><linearGradient
id="linearGradient5"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop19" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop20" /></linearGradient><linearGradient
id="swatch18"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop18" /></linearGradient><linearGradient
id="swatch15"><stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop15" /></linearGradient><linearGradient
id="linearGradient5-1"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop6" /></linearGradient><linearGradient
id="linearGradient3836-9"><stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" /><stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" /></linearGradient><linearGradient
xlink:href="#linearGradient8"
id="linearGradient9"
x1="32"
y1="64"
x2="32"
y2="14.419661"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2874"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:creator><cc:Agent><dc:title>[maxwxyz]</dc:title></cc:Agent></dc:creator><dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation><dc:publisher><cc:Agent><dc:title>FreeCAD</dc:title></cc:Agent></dc:publisher><dc:identifier>FreeCAD/src/</dc:identifier><dc:rights><cc:Agent><dc:title>FreeCAD LGPL2+</dc:title></cc:Agent></dc:rights><dc:date>2024</dc:date></cc:Work></rdf:RDF></metadata><g
id="layer3"
style="display:inline"><path
style="fill:#204a87;fill-opacity:1;stroke:#0c1522;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path4"
d="M 29.921921,10.073012 26.993293,6.1977395 C 26.21651,5.1698698 25.163057,4.5924975 24.064598,4.5924975 H 5.0714589 c -1.1437425,0 -2.0708717,1.2268134 -2.0708717,2.740257 V 58.484215 c 0,0.504481 0.309043,0.913419 0.6902905,0.913419 H 60.294706 c 0.381247,0 0.690291,-0.408938 0.690291,-0.913419 V 12.813269 c 0,-1.513445 -0.927129,-2.740257 -2.070872,-2.740257 z" /><path
style="fill:#204a87;fill-opacity:1;stroke:#3465a4;stroke-width:2;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path7"
d="M 5.2089844,6.5917969 H 24.064453 c 0.375444,0 0.874561,0.2026195 1.333984,0.8105468 l 3.527344,4.6699223 h 29.84961 c 0.0082,0.01044 0.01784,0.02289 0.02734,0.03711 0.01056,0.0158 0.02193,0.03237 0.0332,0.05273 0.08049,0.145363 0.148438,0.361331 0.148438,0.650391 V 57.398437 H 5 V 7.3320312 C 5,7.0436394 5.0678061,6.828994 5.1484375,6.6835937 c 0.011294,-0.020366 0.022609,-0.038859 0.033203,-0.054687 0.00953,-0.014245 0.019073,-0.026632 0.027344,-0.037109 z" /><path
style="fill:#729fcf;fill-opacity:1;stroke:#0c1522;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path6"
d="m 29.919347,14.419661 -2.927223,3.534545 C 26.215716,18.891703 25.16247,19.41831 24.064012,19.41831 H 3.0000008 l 0.015588,39.156085 c 2.171e-4,0.460126 0.3093777,0.833108 0.6906252,0.833108 h 56.603828 c 0.381248,0 0.690139,-0.372982 0.689957,-0.833108 L 60.983419,16.918986 C 60.982865,15.538609 60.055293,14.419661 58.91155,14.419661 H 29.919344 Z" /><path
style="fill:url(#linearGradient9);fill-opacity:1;stroke:#729fcf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path8"
d="m 30.861328,16.419922 h 28.050781 c 0,0 0.07225,0.463543 0.07227,0.5 L 59,57.408203 H 5.015625 L 5,21.417969 h 19.064453 c 1.756119,0 3.349555,-0.836095 4.46875,-2.1875 z" /></g></svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -173,7 +173,6 @@
<file>Param_Text.svg</file>
<file>Param_UInt.svg</file>
<file>PolygonPick.svg</file>
<file>Python.svg</file>
<file>Std_CloseActiveWindow.svg</file>
<file>Std_CloseAllWindows.svg</file>
<file>Std_Export.svg</file>

View File

@@ -2,658 +2,85 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="90.000000"
inkscape:export-xdpi="90.000000"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
width="64"
height="64"
id="svg11300"
sodipodi:version="0.32"
inkscape:version="0.48.5 r10040"
sodipodi:docname="web-refresh.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1">
<defs
id="defs3">
<linearGradient
id="linearGradient3063">
<stop
id="stop3065"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xml:space="preserve"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
id="defs2871"><linearGradient
id="linearGradient5"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
style="stop-color:#729fcf;stop-opacity:1" />
<stop
id="stop3067"
id="stop19" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
style="stop-color:#204a87;stop-opacity:1" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective58" />
<linearGradient
inkscape:collect="always"
id="linearGradient2690">
<stop
style="stop-color:#c4d7eb;stop-opacity:1;"
id="stop20" /></linearGradient><linearGradient
id="swatch18"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop2692" />
<stop
style="stop-color:#c4d7eb;stop-opacity:0;"
offset="1"
id="stop2694" />
</linearGradient>
<linearGradient
id="linearGradient2682">
<stop
style="stop-color:#3977c3;stop-opacity:1;"
id="stop18" /></linearGradient><linearGradient
id="swatch15"><stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop2684" />
<stop
style="stop-color:#89aedc;stop-opacity:0;"
offset="1"
id="stop2686" />
</linearGradient>
<linearGradient
id="linearGradient2402">
<stop
style="stop-color:#729fcf;stop-opacity:1;"
id="stop15" /></linearGradient><linearGradient
id="linearGradient5-1"><stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop2404" />
<stop
style="stop-color:#528ac5;stop-opacity:1;"
id="stop5" /><stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop2406" />
</linearGradient>
<linearGradient
id="linearGradient2380">
<stop
style="stop-color:#729fcf;stop-opacity:1"
id="stop6" /></linearGradient><linearGradient
id="linearGradient3836-9"><stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop2382" />
<stop
style="stop-color:#3465a4;stop-opacity:1"
id="stop3838-8" /><stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop2384" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2871">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2873" />
<stop
style="stop-color:#3465a4;stop-opacity:1"
offset="1"
id="stop2875" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2847">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2849" />
<stop
style="stop-color:#3465a4;stop-opacity:0;"
offset="1"
id="stop2851" />
</linearGradient>
<linearGradient
id="linearGradient2831">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2833" />
<stop
id="stop2855"
offset="0.33333334"
style="stop-color:#5b86be;stop-opacity:1;" />
<stop
style="stop-color:#83a8d8;stop-opacity:0;"
offset="1"
id="stop2835" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2797">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2799" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2801" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2831"
id="linearGradient1486"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,0.02150968,-18.214919)"
x1="13.478554"
y1="10.612206"
x2="15.419417"
y2="19.115122" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2847"
id="linearGradient1488"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.370336,0,0,-1.3589114,64.512944,44.464873)"
x1="37.128052"
y1="29.729605"
x2="37.065414"
y2="26.194071" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2797"
id="linearGradient1491"
gradientUnits="userSpaceOnUse"
x1="5.9649177"
y1="26.048164"
x2="52.854095"
y2="26.048164" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2797"
id="linearGradient1493"
gradientUnits="userSpaceOnUse"
x1="5.9649177"
y1="26.048164"
x2="52.854095"
y2="26.048164" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2871"
id="linearGradient1501"
gradientUnits="userSpaceOnUse"
x1="46.834816"
y1="45.264122"
x2="45.380436"
y2="50.939667" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient1503"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,0,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3063"
id="linearGradient2386"
x1="42.703487"
y1="20.547306"
x2="26.605606"
y2="33.634254"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2402"
id="linearGradient2408"
x1="18.935766"
y1="23.667896"
x2="53.588623"
y2="26.649363"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2682"
id="linearGradient2688"
x1="36.713837"
y1="31.455952"
x2="37.124462"
y2="24.842253"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,-0.33380651,-16.948724)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2690"
id="linearGradient2696"
x1="32.647972"
y1="30.748846"
x2="37.124462"
y2="24.842253"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,-0.33380651,-16.948724)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2380"
id="linearGradient3034"
gradientUnits="userSpaceOnUse"
x1="41.791897"
y1="20.134634"
x2="23.705669"
y2="34.083359" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2871"
id="linearGradient3036"
gradientUnits="userSpaceOnUse"
x1="46.834816"
y1="45.264122"
x2="45.380436"
y2="50.939667" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2402"
id="linearGradient3038"
gradientUnits="userSpaceOnUse"
x1="18.935766"
y1="23.667896"
x2="53.588623"
y2="26.649363" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2871"
id="linearGradient3040"
gradientUnits="userSpaceOnUse"
x1="46.834816"
y1="45.264122"
x2="45.380436"
y2="50.939667" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2831-7"
id="linearGradient1486-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,0.30396568,-17.325948)"
x1="13.478554"
y1="10.612206"
x2="15.419417"
y2="19.115122" />
<linearGradient
id="linearGradient2831-7">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2833-4" />
<stop
id="stop2855-0"
offset="0.33333334"
style="stop-color:#5b86be;stop-opacity:1;" />
<stop
style="stop-color:#83a8d8;stop-opacity:0;"
offset="1"
id="stop2835-9" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2847-8"
id="linearGradient1488-4"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.370336,0,0,-1.3589114,64.7954,45.353844)"
x1="37.128052"
y1="29.729605"
x2="37.065414"
y2="26.194071" />
<linearGradient
inkscape:collect="always"
id="linearGradient2847-8">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2849-8" />
<stop
style="stop-color:#3465a4;stop-opacity:0;"
offset="1"
id="stop2851-2" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2380-5"
id="linearGradient2386-4"
x1="62.513836"
y1="36.061237"
x2="15.984863"
y2="20.60858"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient2380-5">
<stop
style="stop-color:#b9cfe7;stop-opacity:1"
offset="0"
id="stop2382-5" />
<stop
style="stop-color:#729fcf;stop-opacity:1"
offset="1"
id="stop2384-1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2380-5"
id="linearGradient3034-7"
gradientUnits="userSpaceOnUse"
x1="62.513836"
y1="36.061237"
x2="15.984863"
y2="20.60858" />
<linearGradient
id="linearGradient3895">
<stop
style="stop-color:#b9cfe7;stop-opacity:1"
offset="0"
id="stop3897" />
<stop
style="stop-color:#729fcf;stop-opacity:1"
offset="1"
id="stop3899" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2797-1"
id="linearGradient3861-1"
gradientUnits="userSpaceOnUse"
x1="5.9649177"
y1="26.048164"
x2="52.854095"
y2="26.048164" />
<linearGradient
inkscape:collect="always"
id="linearGradient2797-1">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2799-5" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2801-2" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3063"
id="linearGradient3858"
gradientUnits="userSpaceOnUse"
x1="42.703487"
y1="20.547306"
x2="26.605606"
y2="33.634254" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2831-2"
id="linearGradient1486-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.370336,0,0,1.3589114,0.02150968,-18.214919)"
x1="13.478554"
y1="10.612206"
x2="15.419417"
y2="19.115122" />
<linearGradient
id="linearGradient2831-2">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2833-3" />
<stop
id="stop2855-1"
offset="0.33333334"
style="stop-color:#5b86be;stop-opacity:1;" />
<stop
style="stop-color:#83a8d8;stop-opacity:0;"
offset="1"
id="stop2835-6" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2847-82"
id="linearGradient1488-8"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.370336,0,0,-1.3589114,64.512944,44.464873)"
x1="37.128052"
y1="29.729605"
x2="37.065414"
y2="26.194071" />
<linearGradient
inkscape:collect="always"
id="linearGradient2847-82">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2849-7" />
<stop
style="stop-color:#3465a4;stop-opacity:0;"
offset="1"
id="stop2851-7" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3063-2"
id="linearGradient3858-1"
gradientUnits="userSpaceOnUse"
x1="42.703487"
y1="20.547306"
x2="26.605606"
y2="33.634254" />
<linearGradient
id="linearGradient3063-2">
<stop
id="stop3065-6"
offset="0"
style="stop-color:#729fcf;stop-opacity:1" />
<stop
id="stop3067-0"
offset="1"
style="stop-color:#204a87;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="stop3840-1" /></linearGradient><linearGradient
xlink:href="#linearGradient2380-9"
id="linearGradient3034-4"
gradientUnits="userSpaceOnUse"
x1="26.221533"
y1="31.125586"
x2="46.731483"
y2="21.766298" />
<linearGradient
id="linearGradient2380-9">
<stop
y2="21.766298"
gradientTransform="matrix(0.82942185,0.69481004,0.70076106,-0.82237821,-14.689134,46.171259)" /><linearGradient
id="linearGradient2380-9"><stop
style="stop-color:#729fcf;stop-opacity:1"
offset="0"
id="stop2382-4" />
<stop
id="stop2382-4" /><stop
style="stop-color:#3465a4;stop-opacity:1"
offset="1"
id="stop2384-6" />
</linearGradient>
</defs>
<sodipodi:namedview
stroke="#3465a4"
fill="#729fcf"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.25490196"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9999996"
inkscape:cx="27.539797"
inkscape:cy="30.325235"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:showpageshadow="false"
inkscape:window-width="1600"
inkscape:window-height="837"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:snap-bbox="true"
inkscape:snap-nodes="false"
inkscape:snap-global="true"
inkscape:window-maximized="1">
<inkscape:grid
empspacing="2"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
type="xygrid"
id="grid3042" />
</sodipodi:namedview>
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title></dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>reload</rdf:li>
<rdf:li>refresh</rdf:li>
<rdf:li>view</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,16)">
<path
transform="matrix(-2.0414388,0,0,-1.3606128,83.542608,85.352711)"
d="m 40.481863,36.421127 c 0,4.637477 -7.004387,8.396894 -15.644737,8.396894 -8.64035,0 -15.6447375,-3.759417 -15.6447375,-8.396894 0,-4.637476 7.0043875,-8.396893 15.6447375,-8.396893 8.64035,0 15.644737,3.759417 15.644737,8.396893 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.38333333;color:#000000;fill:url(#radialGradient1503);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<g
id="g3863">
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:r_cy="true"
inkscape:r_cx="true"
id="path2865"
d="m 27,-3.6915582 c 0,0 -12.247378,-0.8493196 -8.478954,13.4192502 l -10.534458,0 c 0,0 0.685168,-16.137073 19.013412,-13.4192502 z"
style="color:#000000;fill:url(#linearGradient1486);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1488);stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible" />
<g
style="fill:url(#linearGradient3858);fill-opacity:1;stroke:#204a87;stroke-width:0.73280919000000000;stroke-opacity:1"
inkscape:r_cy="true"
inkscape:r_cx="true"
transform="matrix(-0.79349441,-0.66481753,-0.67040672,0.78687903,77.66003,0.94046451)"
id="g1878">
<path
inkscape:connector-curvature="0"
inkscape:r_cy="true"
inkscape:r_cx="true"
style="color:#000000;fill:url(#linearGradient3034);fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.93339872000000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
d="M 44.306783,50.229694 C 62.821497,35.818859 49.664587,13.411704 22.462411,12.49765 L 22.113843,3.1515478 7.6245439,20.496754 22.714328,33.219189 c 0,0 -0.251917,-9.88122 -0.251917,-9.88122 18.82976,0.998977 32.981627,14.071729 21.844372,26.891725 z"
id="path1880"
sodipodi:nodetypes="ccccccc" />
</g>
<g
id="g2805"
transform="matrix(-0.69686517,-0.58385766,-0.58876622,0.69105539,72.350404,1.0127423)"
inkscape:r_cx="true"
inkscape:r_cy="true"
style="fill:none;stroke:#729fcf;stroke-width:0.73280919;stroke-opacity:1">
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc"
id="path2807"
d="M 52.368857,42.344789 C 57.336994,33.465615 49.176003,12.601866 19.05552,12.672851 L 18.677956,5.6633463 7.4378077,19.282655 19.129354,29.167094 18.807724,20.554957 c 18.244937,0.381972 33.804002,9.457851 33.561133,21.789832 z"
style="color:#000000;fill:none;stroke:#729fcf;stroke-width:2.20148993;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:21;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
inkscape:r_cx="true"
inkscape:r_cy="true" />
</g>
</g>
<g
transform="matrix(-1,0,0,-1,65.986588,29)"
id="g3863-0">
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc"
inkscape:r_cy="true"
inkscape:r_cx="true"
id="path2865-3"
d="m 27,-3.6915582 c 0,0 -12.247378,-0.8493196 -8.478954,13.4192502 l -10.534458,0 c 0,0 0.685168,-16.137073 19.013412,-13.4192502 z"
style="color:#000000;fill:url(#linearGradient1486-5);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient1488-8);stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible" />
<g
style="fill:url(#linearGradient3858-1);fill-opacity:1;stroke:#204a87;stroke-width:0.73280919;stroke-opacity:1"
inkscape:r_cy="true"
inkscape:r_cx="true"
transform="matrix(-0.79349441,-0.66481753,-0.67040672,0.78687903,77.66003,0.94046451)"
id="g1878-6">
<path
inkscape:connector-curvature="0"
inkscape:r_cy="true"
inkscape:r_cx="true"
style="color:#000000;fill:url(#linearGradient3034-4);fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.93339872000000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
d="M 44.306783,50.229694 C 62.821497,35.818859 49.664587,13.411704 22.462411,12.49765 L 22.113843,3.1515478 7.6245439,20.496754 22.714328,33.219189 c 0,0 -0.251917,-9.88122 -0.251917,-9.88122 18.82976,0.998977 32.981627,14.071729 21.844372,26.891725 z"
id="path1880-2"
sodipodi:nodetypes="ccccccc" />
</g>
<g
id="g2805-4"
transform="matrix(-0.69686517,-0.58385766,-0.58876622,0.69105539,72.350404,1.0127423)"
inkscape:r_cx="true"
inkscape:r_cy="true"
style="fill:none;stroke:#729fcf;stroke-width:0.73280919;stroke-opacity:1">
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc"
id="path2807-5"
d="M 52.368857,42.344789 C 57.864671,33.591679 49.176003,12.601866 19.05552,12.672851 L 18.677956,5.6633463 7.4378077,19.282655 19.129354,29.167094 18.807724,20.554957 c 18.244937,0.381972 33.804002,9.457851 33.561133,21.789832 z"
style="color:#000000;fill:none;stroke:#729fcf;stroke-width:2.20148993;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:21;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
inkscape:r_cx="true"
inkscape:r_cy="true" />
</g>
</g>
</g>
</svg>
id="stop2384-6" /></linearGradient><linearGradient
xlink:href="#linearGradient2380-9"
id="linearGradient3034"
gradientUnits="userSpaceOnUse"
x1="41.791897"
y1="20.134634"
x2="23.705669"
y2="34.083359"
gradientTransform="matrix(-0.82942185,-0.69481004,-0.70076106,0.82237821,78.689134,17.828742)" /></defs><metadata
id="metadata2874"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:creator><cc:Agent><dc:title>[maxwxyz]</dc:title></cc:Agent></dc:creator><dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation><dc:publisher><cc:Agent><dc:title>FreeCAD</dc:title></cc:Agent></dc:publisher><dc:identifier>FreeCAD/src/</dc:identifier><dc:rights><cc:Agent><dc:title>FreeCAD LGPL2+</dc:title></cc:Agent></dc:rights><dc:date>2024</dc:date></cc:Work></rdf:RDF></metadata><g
id="layer3"
style="display:inline"><path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient3034);fill-opacity:1;fill-rule:nonzero;stroke:#0c1522;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="M 6.7411068,28.35175 C 1.4831503,3.6363838 28.09784,-5.6492191 51.300453,12.499428 L 58.138947,5.0555856 58.001843,29.387215 36.57066,29.365336 c 0,0 7.133319,-7.951066 7.133319,-7.951066 C 27.386121,9.1527 6.487378,10.070587 6.7411068,28.35175 Z"
id="path1880" /><path
id="path2807"
d="M 8.9327084,16.531664 C 10.778287,7.0872986 29.562949,-3.0013417 51.45955,15.429377 l 4.588842,-4.832097 -0.19413,16.695009 -14.599448,0.0047 5.534397,-6.0237 C 33.264206,10.416141 16.345195,7.4769202 8.9327084,16.531664 Z"
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:21;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" /><path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#linearGradient3034-4);fill-opacity:1;fill-rule:nonzero;stroke:#0c1522;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="M 57.258893,35.64825 C 62.516849,60.363616 35.90216,69.649219 12.699547,51.500572 l -6.8384943,7.443843 0.1371039,-24.33163 21.4311834,0.02188 c 0,0 -7.13332,7.951066 -7.13332,7.951066 16.317859,12.26157 37.216602,11.343683 36.962873,-6.93748 z"
id="path1880-2" /><path
id="path2807-5"
d="M 55.067292,47.468336 C 53.683665,57.143642 34.437051,67.001342 12.54045,48.570623 l -4.5888419,4.832097 0.19413,-16.695009 14.5994479,-0.0047 -5.534397,6.0237 c 13.525005,10.857147 30.444015,13.796366 37.856503,4.741623 z"
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:21;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" /></g></svg>

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -2282,7 +2282,7 @@ QListView::item:selected:!active,
QTableView::item:selected:!active,
QColumnView::item:selected:!active {
color: White;
background-color: #353535;
background-color: @ThemeAccentColor1;
}
QTreeView::item:!selected:hover,

View File

@@ -2269,7 +2269,7 @@ QListView::item:selected:!active,
QTableView::item:selected:!active,
QColumnView::item:selected:!active {
color: White;
background-color: #353535;
background-color: @ThemeAccentColor1;
}
QTreeView::item:!selected:hover,

View File

@@ -2274,7 +2274,7 @@ QListView::item:selected:!active,
QTableView::item:selected:!active,
QColumnView::item:selected:!active {
color: White;
background-color: #353535;
background-color: @ThemeAccentColor1;
}
QTreeView::item:!selected:hover,

View File

@@ -2290,7 +2290,7 @@ QListView::item:selected:!active,
QTableView::item:selected:!active,
QColumnView::item:selected:!active {
color: black;
background-color: #bfc1c0;
background-color: @ThemeAccentColor1;
}
QTreeView::item:!selected:hover,

View File

@@ -2281,7 +2281,7 @@ QListView::item:selected:!active,
QTableView::item:selected:!active,
QColumnView::item:selected:!active {
color: black;
background-color: #BABABA;
background-color: @ThemeAccentColor1;
}
QTreeView::item:!selected:hover,

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,270 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="64"
height="64"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
id="svg2963"
height="68.26667"
width="68.26667">
<defs
id="defs2871">
<linearGradient
id="linearGradient29">
<stop
style="stop-color:#204a87;stop-opacity:1"
offset="0"
id="stop29" />
<stop
style="stop-color:#729fcf;stop-opacity:1"
offset="1"
id="stop30" />
</linearGradient>
<linearGradient
id="linearGradient24">
<stop
id="stop23"
offset="0"
style="stop-color:#204a87;stop-opacity:1" />
<stop
id="stop24"
offset="1"
style="stop-color:#729fcf;stop-opacity:1" />
</linearGradient>
<linearGradient
id="linearGradient22">
<stop
id="stop21"
offset="0"
style="stop-color:#4e9a06;stop-opacity:1" />
<stop
id="stop22"
offset="1"
style="stop-color:#8ae234;stop-opacity:1" />
</linearGradient>
<linearGradient
id="linearGradient5">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop19" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop20" />
</linearGradient>
<linearGradient
id="swatch18">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop18" />
</linearGradient>
<linearGradient
id="swatch15">
<stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop15" />
</linearGradient>
<linearGradient
id="linearGradient5-1">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop6" />
</linearGradient>
<linearGradient
id="linearGradient3836-9">
<stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" />
<stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" />
</linearGradient>
<radialGradient
xlink:href="#linearGradient11"
id="radialGradient13"
cx="39.502319"
cy="40.726604"
fx="39.502319"
fy="40.726604"
r="22.062311"
gradientTransform="matrix(1.7937293,1.017333,-1.0383284,1.824402,12.77456,-63.360877)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient11">
<stop
style="stop-color:#729fcf;stop-opacity:1"
offset="0"
id="stop13" />
<stop
style="stop-color:#204a87;stop-opacity:1"
offset="1"
id="stop11" />
</linearGradient>
<linearGradient
id="linearGradient3377-3">
<stop
id="stop3379-8"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3381-3"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient4387">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop4389" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop4391" />
</linearGradient>
<linearGradient
id="linearGradient3836-0-6-92-4-0">
<stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-2-7-06-8-6" />
<stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-5-5-8-7-2" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient22"
id="linearGradient4516"
gradientUnits="userSpaceOnUse"
x1="14.577716"
y1="27.643585"
x2="50.611004"
y2="42.347919"
gradientTransform="matrix(0.91764667,0,0,0.91543299,7.4569649,-10.851524)" />
id="defs2965">
<linearGradient
id="linearGradient3354">
<stop
id="stop3356"
offset="0"
style="stop-color:#729fcf;stop-opacity:1" />
style="stop-color:#2157c7;stop-opacity:1;" />
<stop
id="stop3358"
offset="1"
style="stop-color:#204a87;stop-opacity:1" />
style="stop-color:#6daaff;stop-opacity:1;" />
</linearGradient>
<linearGradient
y2="31.92013"
x2="53.693264"
y1="45.023232"
x1="28.158932"
gradientTransform="matrix(0.91764667,0,0,0.91543299,5.5967063,-9.6079085)"
xlink:href="#linearGradient3354"
id="linearGradient4516"
gradientUnits="userSpaceOnUse"
id="linearGradient18"
xlink:href="#linearGradient24" />
x1="14.577716"
y1="27.643585"
x2="50.611004"
y2="42.347919" />
<linearGradient
gradientTransform="matrix(0.91764667,0,0,0.91543299,-34.434605,-11.375877)"
y2="34.816742"
x2="41.556858"
y1="47.53363"
x1="65.435036"
gradientTransform="translate(-39.003978,-11.048337)"
y2="42.347919"
x2="50.611004"
y1="27.643585"
x1="14.577716"
gradientUnits="userSpaceOnUse"
id="linearGradient14"
xlink:href="#linearGradient3354" />
<linearGradient
xlink:href="#linearGradient29"
id="linearGradient30"
x1="29.777794"
y1="35.716694"
x2="55.384754"
y2="14.091692"
gradientUnits="userSpaceOnUse" />
y2="42.347919"
x2="50.611004"
y1="27.643585"
x1="14.577716"
gradientTransform="translate(6.412284,2.3813801)"
gradientUnits="userSpaceOnUse"
id="linearGradient18"
xlink:href="#linearGradient3354" />
</defs>
<metadata
id="metadata2874">
id="metadata2968">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>[maxwxyz]</dc:title>
</cc:Agent>
</dc:creator>
<dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/</dc:identifier>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:date>2024</dc:date>
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer3"
style="display:inline">
<path
d="M 18.260795,61.000176 C 1.7864687,47.327689 1.5712439,37.276581 7.4738156,17.881577 10.514149,14.174495 15.337186,5.0777001 30.812411,3.2439598 11.081982,19.578959 16.471245,36.612767 22.896918,45.84763 c -4.058659,4.167818 -6.324466,8.717398 -4.636123,15.152546 z"
style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#0c1522;stroke-width:2.00001;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="path12" />
<path
id="path16"
style="display:inline;opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#0c1522;stroke-width:2.00001;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="M 39.80712,40.886165 C 39.347502,18.750404 43.027643,14.637758 50.918334,7.7286519 54.736143,9.018553 59.074083,12.861105 60.054063,15.930397 53.803846,23.917301 52.515998,35.730898 57.174803,58.979264 54.485196,50.098341 51.074626,40.861606 39.80712,40.886165 Z" />
<path
id="path28"
style="display:inline;opacity:1;fill:url(#linearGradient30);fill-opacity:1;fill-rule:evenodd;stroke:#729fcf;stroke-width:2.00001;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 51.318359,10.046875 c 2.664611,1.226923 5.342254,3.630329 6.441407,5.619141 -4.704254,6.607763 -6.335888,15.411672 -4.847657,29.220703 -2.549632,-3.157876 -6.050466,-5.445581 -11.125,-5.908203 -0.197725,-18.706008 2.787826,-22.928537 9.53125,-28.931641 z" />
<path
id="path24"
style="display:inline;opacity:1;fill:#8ae234;fill-opacity:1;fill-rule:evenodd;stroke:#17230b;stroke-width:2.00001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 22.896918,45.84763 C 10.507844,27.298201 19.418369,12.723127 30.812411,3.2439598 38.009021,2.2698045 45.343419,4.3228707 50.918334,7.7286519 40.938023,15.97348 39.70122,22.647624 39.80712,40.886165 34.254637,41.133337 27.673519,41.988373 22.896918,45.84763 Z" />
<path
id="path21"
style="opacity:1;fill:url(#linearGradient4516);fill-opacity:1;fill-rule:evenodd;stroke:#8ae234;stroke-width:1.93455;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 34.685547,5.0859375 c 4.3141,0.061386 8.542613,1.2198975 12.195312,3.0117188 C 38.840841,15.580985 37.559778,22.755428 37.558594,37.972656 33.070552,38.2911 27.950191,39.15602 23.683594,41.839844 14.12913,25.966693 21.656459,13.68295 31.611328,5.2363281 32.632653,5.1230644 33.659554,5.0713386 34.685547,5.0859375 Z"
transform="matrix(1.0338547,0,0,1.0338147,-1.0247137,-0.25384716)" />
<path
d="M 24.462891,6.7109375 C 11.291828,21.044915 15.087935,35.534635 20.701172,44.390625 18.167597,47.28992 16.422634,50.565513 16.210937,54.5 4.8313443,43.641922 4.991564,34.921511 9.9746094,18.4375 12.780553,14.921062 16.016896,9.4755874 24.462891,6.7109375 Z"
style="opacity:1;fill:url(#linearGradient14);fill-opacity:1;fill-rule:evenodd;stroke:#729fcf;stroke-width:1.93455;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
id="path26"
transform="matrix(1.0338547,0,0,1.0338147,-1.0247137,-0.25384716)" />
<path
style="fill:none;stroke:#0c1522;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 8.4851839,51.269783 C 11.811877,31.098625 44.97231,22.579841 54.52943,40.463301"
id="path839" />
<path
style="fill:none;stroke:#0c1522;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 4.0012601,37.976551 C 14.369364,18.537691 43.536681,16.009382 54.707116,29.842375"
id="path841" />
<path
style="fill:none;stroke:#0c1522;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 5.5280638,24.90186 C 20.261449,10.062113 39.319651,5.3312343 56.764105,21.582244"
id="path843" />
</g>
<path
d="M 0,45.166348 C 0,9.3101224 12.722328,19.50581 12.722328,3.3479809 18.762656,4.9062428 31.195442,4.155445 40.971688,5.3464369 34.515753,14.572984 26.922167,16.224589 20.790937,27.692639 17.368571,34.093945 16.934693,49.245484 17.088633,60.56706 9.541714,58.375045 6.542525,47.956465 0,45.166348 Z"
style="opacity:0.5;fill:url(#linearGradient14);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
id="path12" />
<path
id="path16"
style="opacity:0.5;fill:url(#linearGradient18);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="m 39.227193,63.245445 c 0,-28.490667 13.169517,-19.644505 19.865479,-50.031253 3.340856,3.885475 3.080531,7.216754 9.173998,6.901154 C 67.754828,37.553062 62.114048,47.747978 62.337496,68.26667 54.790577,66.074655 50.959088,61.515788 39.227193,63.245445 Z" />
<path
id="path21"
style="opacity:1;fill:url(#linearGradient4516);fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
d="M 17.088633,60.56706 C 16.484207,11.48631 29.101921,22.676059 40.971688,5.3464369 c 6.040328,1.5582619 12.080656,2.8516219 18.120984,7.8677551 -2.703442,10.674542 -5.56786,17.37902 -13.359277,27.368174 -4.464312,5.723567 -6.660142,11.341503 -6.506202,22.663079 -7.546919,1.155966 -15.596035,0.111732 -22.13856,-2.678385 z" />
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 145 KiB

228
src/Mod/AddonManager/Resources/icons/compact_view.svg Executable file → Normal file
View File

@@ -1,215 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="64"
height="64"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs2871">
<linearGradient
id="linearGradient5">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop19" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop20" />
</linearGradient>
<linearGradient
id="swatch18">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop18" />
</linearGradient>
<linearGradient
id="swatch15">
<stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop15" />
</linearGradient>
<linearGradient
id="linearGradient5-1">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop6" />
</linearGradient>
<linearGradient
id="linearGradient3836-9">
<stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" />
<stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" />
</linearGradient>
</defs>
<metadata
id="metadata2874">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>[maxwxyz]</dc:title>
</cc:Agent>
</dc:creator>
<dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/</dc:identifier>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:date>2024</dc:date>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer3"
style="display:inline">
<g
id="g6">
<rect
x="5"
y="8.6585369"
class="st0"
width="10.451612"
height="10.772984"
id="rect4"
style="fill:none;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<rect
x="5"
y="8.6585369"
class="st0"
width="10.451612"
height="10.772984"
id="rect1"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g5">
<rect
x="5"
y="26.61351"
class="st0"
width="10.451612"
height="10.772984"
id="rect5"
style="fill:none;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<rect
x="5"
y="26.61351"
class="st0"
width="10.451612"
height="10.772984"
id="rect2"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g4">
<rect
x="5"
y="44.568478"
class="st0"
width="10.451612"
height="10.772984"
id="rect6"
style="fill:none;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<rect
x="5"
y="44.568478"
class="st0"
width="10.451612"
height="10.772984"
id="rect3"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g1"
transform="translate(0,-1.7954979)">
<line
class="st1"
x1="24.161291"
y1="15.840527"
x2="59"
y2="15.840527"
id="line6"
style="fill:#eeeeec;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st1"
x1="24.161291"
y1="15.840527"
x2="59"
y2="15.840527"
id="line3"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g2"
transform="translate(0,-1.795496)">
<line
class="st1"
x1="24.161291"
y1="33.795498"
x2="59"
y2="33.795498"
id="line7"
style="fill:#eeeeec;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st1"
x1="24.161291"
y1="33.795498"
x2="59"
y2="33.795498"
id="line4"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g3"
transform="translate(0,-1.7954998)">
<line
class="st1"
x1="24.161291"
y1="51.750469"
x2="59"
y2="51.750469"
id="line8"
style="fill:#eeeeec;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st1"
x1="24.161291"
y1="51.750469"
x2="59"
y2="51.750469"
id="line5"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
</g>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;stroke:#000000;stroke-miterlimit:10;}
.st1{fill:none;stroke:#000000;stroke-miterlimit:10;}
</style>
<rect x="0.5" y="1.5" class="st0" width="3" height="3"/>
<rect x="0.5" y="6.5" class="st0" width="3" height="3"/>
<rect x="0.5" y="11.5" class="st0" width="3" height="3"/>
<line class="st1" x1="6" y1="3.5" x2="16" y2="3.5"/>
<line class="st1" x1="6" y1="8.5" x2="16" y2="8.5"/>
<line class="st1" x1="6" y1="13.5" x2="16" y2="13.5"/>
</svg>

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 829 B

230
src/Mod/AddonManager/Resources/icons/composite_view.svg Executable file → Normal file
View File

@@ -1,217 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="64"
height="64"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs2871">
<linearGradient
id="linearGradient5">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop19" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop20" />
</linearGradient>
<linearGradient
id="swatch18">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop18" />
</linearGradient>
<linearGradient
id="swatch15">
<stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop15" />
</linearGradient>
<linearGradient
id="linearGradient5-1">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop6" />
</linearGradient>
<linearGradient
id="linearGradient3836-9">
<stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" />
<stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" />
</linearGradient>
</defs>
<metadata
id="metadata2874">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>[maxwxyz]</dc:title>
</cc:Agent>
</dc:creator>
<dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/</dc:identifier>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:date>2024</dc:date>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer3"
style="display:inline">
<g
id="g18"
transform="translate(0,4)">
<line
class="st0"
x1="5"
y1="5"
x2="29.338028"
y2="5"
id="line8"
style="fill:none;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st0"
x1="5"
y1="5"
x2="29.338028"
y2="5"
id="line1"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g23"
transform="translate(0,-4)">
<line
class="st0"
x1="5"
y1="59"
x2="29.338028"
y2="59"
id="line12"
style="fill:none;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st0"
x1="5"
y1="59"
x2="29.338028"
y2="59"
id="line5"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g19">
<rect
x="37.938789"
y="5"
class="st1"
width="21.061209"
height="54"
id="rect12"
style="fill:none;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<rect
x="37.938789"
y="5"
class="st1"
width="21.061209"
height="54"
id="rect5"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g22"
transform="translate(0,-5.5)">
<line
class="st0"
x1="5"
y1="49"
x2="29.338028"
y2="49"
id="line13"
style="fill:none;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st0"
x1="5"
y1="49"
x2="29.338028"
y2="49"
id="line14"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g21"
transform="translate(0,-5)">
<line
class="st0"
x1="5"
y1="37"
x2="29.338028"
y2="37"
id="line15"
style="fill:none;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st0"
x1="5"
y1="37"
x2="29.338028"
y2="37"
id="line16"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g20"
transform="translate(0,-4.5)">
<line
class="st0"
x1="5"
y1="25"
x2="29.338028"
y2="25"
id="line17"
style="fill:none;stroke:#eeeeec;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st0"
x1="5"
y1="25"
x2="29.338028"
y2="25"
id="line18"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
</g>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 28.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;stroke:#000000;stroke-miterlimit:10;}
.st1{fill:none;stroke:#000000;stroke-width:0.9259;stroke-miterlimit:10;}
</style>
<line class="st0" x1="0.3" y1="1.5" x2="6.7" y2="1.5"/>
<line class="st0" x1="0.3" y1="4.5" x2="6.7" y2="4.5"/>
<line class="st0" x1="0.3" y1="7.5" x2="6.7" y2="7.5"/>
<line class="st0" x1="0.3" y1="10.5" x2="6.7" y2="10.5"/>
<line class="st0" x1="0.3" y1="13.5" x2="6.7" y2="13.5"/>
<rect x="9.5" y="1.5" class="st1" width="5" height="13"/>
</svg>

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 855 B

237
src/Mod/AddonManager/Resources/icons/expanded_view.svg Executable file → Normal file
View File

@@ -1,224 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="64"
height="64"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs2871">
<linearGradient
id="linearGradient5">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop19" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop20" />
</linearGradient>
<linearGradient
id="swatch18">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop18" />
</linearGradient>
<linearGradient
id="swatch15">
<stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop15" />
</linearGradient>
<linearGradient
id="linearGradient5-1">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop6" />
</linearGradient>
<linearGradient
id="linearGradient3836-9">
<stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" />
<stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" />
</linearGradient>
</defs>
<metadata
id="metadata2874">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>[maxwxyz]</dc:title>
</cc:Agent>
</dc:creator>
<dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/</dc:identifier>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:date>2024</dc:date>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer3"
style="display:inline">
<g
id="g31"
transform="matrix(2.2676716,0,0,2.2902699,-32.430797,-17.331585)"
style="stroke-width:0.4388">
<rect
x="16.5"
y="10.217391"
class="st0"
width="7.6086955"
height="7.6086955"
id="rect23"
style="fill:none;stroke:#eeeeec;stroke-width:2.6328;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<rect
x="16.5"
y="10.217391"
class="st0"
width="7.6086955"
height="7.6086955"
id="rect1"
style="fill:none;stroke:#000000;stroke-width:0.877603;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g26"
transform="matrix(1.8942363,0,0,1.9131132,-28.285362,-8.7368346)"
style="stroke-width:0.525306">
<line
class="st1"
x1="32.391304"
y1="9.73913"
x2="46.086956"
y2="9.73913"
id="line23"
style="fill:none;stroke:#eeeeec;stroke-width:3.15183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st1"
x1="32.391304"
y1="9.73913"
x2="46.086956"
y2="9.73913"
id="line1"
style="fill:none;stroke:#000000;stroke-width:1.05062;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g27"
transform="matrix(1.8942363,0,0,1.9131132,-28.285362,-11.523328)"
style="stroke-width:0.525306">
<line
class="st1"
x1="32.391304"
y1="16.304348"
x2="46.086956"
y2="16.304348"
id="line26"
style="fill:none;stroke:#eeeeec;stroke-width:3.15183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st1"
x1="32.391304"
y1="16.304348"
x2="46.086956"
y2="16.304348"
id="line4"
style="fill:none;stroke:#000000;stroke-width:1.05062;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g32"
transform="matrix(2.2676716,0,0,2.2902699,-32.430797,17.104453)"
style="stroke-width:0.4388">
<rect
x="16.5"
y="10.217391"
class="st0"
width="7.6086955"
height="7.6086955"
id="rect31"
style="fill:none;stroke:#eeeeec;stroke-width:2.6328;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<rect
x="16.5"
y="10.217391"
class="st0"
width="7.6086955"
height="7.6086955"
id="rect32"
style="fill:none;stroke:#000000;stroke-width:0.877603;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g33"
transform="matrix(1.8942363,0,0,1.9131132,-28.285362,25.699204)"
style="stroke-width:0.525306">
<line
class="st1"
x1="32.391304"
y1="9.73913"
x2="46.086956"
y2="9.73913"
id="line32"
style="fill:none;stroke:#eeeeec;stroke-width:3.15183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st1"
x1="32.391304"
y1="9.73913"
x2="46.086956"
y2="9.73913"
id="line33"
style="fill:none;stroke:#000000;stroke-width:1.05062;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
<g
id="g35"
transform="matrix(1.8942363,0,0,1.9131132,-28.285362,22.91271)"
style="stroke-width:0.525306">
<line
class="st1"
x1="32.391304"
y1="16.304348"
x2="46.086956"
y2="16.304348"
id="line34"
style="fill:none;stroke:#eeeeec;stroke-width:3.15183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
<line
class="st1"
x1="32.391304"
y1="16.304348"
x2="46.086956"
y2="16.304348"
id="line35"
style="fill:none;stroke:#000000;stroke-width:1.05062;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
</g>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;stroke:#000000;stroke-miterlimit:10;}
.st1{fill:none;stroke:#000000;stroke-miterlimit:10;}
</style>
<rect x="0.5" y="1.5" class="st0" width="5" height="5"/>
<line class="st1" x1="7" y1="2.5" x2="16" y2="2.5"/>
<line class="st1" x1="7" y1="10.5" x2="16" y2="10.5"/>
<line class="st1" x1="7" y1="13.5" x2="16" y2="13.5"/>
<rect x="0.5" y="9.5" class="st0" width="5" height="5"/>
<line class="st1" x1="7" y1="5.5" x2="16" y2="5.5"/>
</svg>

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 826 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 71 KiB

View File

@@ -2,263 +2,272 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="64"
height="64"
id="svg2869"
version="1.1"
viewBox="0 0 64 64"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px"
height="64px"
id="svg2568"
sodipodi:version="0.32"
inkscape:version="0.48.4 r9939"
sodipodi:docname="Part_Compound_DeepSOIC.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1"
inkscape:export-filename="/home/user/Downloads/cad/mystuff/icons/Part/mystuff/Part_Compound_5_32px.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs2871">
id="defs2570">
<linearGradient
id="linearGradient263">
id="linearGradient3864">
<stop
style="stop-color:#f57900;stop-opacity:1"
id="stop3866"
offset="0"
id="stop262" />
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
style="stop-color:#fcaf3e;stop-opacity:1"
id="stop3868"
offset="1"
id="stop263" />
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective2576" />
<linearGradient
id="linearGradient261">
id="linearGradient3377">
<stop
style="stop-color:#fcaf3e;stop-opacity:1"
id="stop3379"
offset="0"
id="stop261" />
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
style="stop-color:#f57900;stop-opacity:1"
id="stop3381"
offset="1"
id="stop260" />
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient223">
id="linearGradient3023">
<stop
style="stop-color:#f57900;stop-opacity:1"
id="stop3025"
offset="0"
id="stop223" />
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
style="stop-color:#fcaf3e;stop-opacity:1"
id="stop3027"
offset="1"
id="stop224" />
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3692"
cx="45.883327"
cy="28.869568"
fx="45.883327"
fy="28.869568"
r="19.467436"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient5">
id="linearGradient3030">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
id="stop3032"
offset="0"
id="stop19" />
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
id="stop3034"
offset="1"
id="stop20" />
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="swatch18">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop18" />
</linearGradient>
<linearGradient
id="swatch15">
<stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop15" />
</linearGradient>
<linearGradient
id="linearGradient5-1">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop6" />
</linearGradient>
<linearGradient
id="linearGradient3836-9">
<stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" />
<stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" />
</linearGradient>
<linearGradient
id="linearGradient3836-9-3">
<stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8-5" />
<stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1-6" />
</linearGradient>
<linearGradient
id="linearGradient2">
<stop
style="stop-color:#73d216;stop-opacity:1;"
offset="0"
id="stop1" />
<stop
style="stop-color:#8ae234;stop-opacity:1;"
offset="1"
id="stop2" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient261"
id="linearGradient251"
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3837"
gradientUnits="userSpaceOnUse"
x1="-129.76006"
y1="90.000977"
x2="-130.90988"
y2="78.959839" />
<linearGradient
xlink:href="#linearGradient263"
id="linearGradient252"
gradientTransform="matrix(0.98773287,-0.06324662,0.02642229,1.230404,-216.68819,-80.013158)"
cx="148.88333"
cy="81.869568"
fx="148.88333"
fy="81.869568"
r="19.467436" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3839"
gradientUnits="userSpaceOnUse"
x1="-146.05777"
y1="77.267624"
x2="-131.3138"
y2="77.218475" />
<linearGradient
xlink:href="#linearGradient223"
id="linearGradient259"
gradientTransform="matrix(0.69474204,0.27707782,-0.32964185,2.4645588,-139.05338,-247.09727)"
cx="135.38333"
cy="97.369568"
fx="135.38333"
fy="97.369568"
r="19.467436" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3841"
gradientUnits="userSpaceOnUse"
x1="-129.76006"
y1="90.000977"
x2="-128.52344"
y2="79.556641" />
<linearGradient
xlink:href="#linearGradient223"
id="linearGradient260"
gradientTransform="matrix(0.71303129,0,0,1.2312496,-173.62652,-89.498759)"
cx="45.883327"
cy="28.869568"
fx="45.883327"
fy="28.869568"
r="19.467436" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3804"
gradientUnits="userSpaceOnUse"
x1="-146.05777"
y1="77.267624"
x2="-126.61523"
y2="76.480469" />
<linearGradient
xlink:href="#linearGradient261"
id="linearGradient271"
gradientTransform="matrix(0.98773287,-0.06324662,0.02642229,1.230404,-216.68819,-80.013158)"
cx="148.88333"
cy="81.869568"
fx="148.88333"
fy="81.869568"
r="19.467436" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3806"
gradientUnits="userSpaceOnUse"
x1="-129.76006"
y1="90.000977"
x2="-129.63141"
y2="78.221756" />
<linearGradient
xlink:href="#linearGradient223"
id="linearGradient1"
gradientTransform="matrix(0.69474204,0.27707782,-0.32964185,2.4645588,-139.05338,-247.09727)"
cx="135.38333"
cy="97.369568"
fx="135.38333"
fy="97.369568"
r="19.467436" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3808"
gradientUnits="userSpaceOnUse"
x1="-146.05777"
y1="77.267624"
x2="-126.61523"
y2="76.480469" />
<linearGradient
xlink:href="#linearGradient261"
id="linearGradient8"
gradientUnits="userSpaceOnUse"
x1="-129.76006"
y1="90.000977"
x2="-129.63141"
y2="78.221756" />
<linearGradient
xlink:href="#linearGradient223"
id="linearGradient9"
gradientUnits="userSpaceOnUse"
x1="-146.05777"
y1="77.267624"
x2="-126.61523"
y2="76.480469" />
gradientTransform="matrix(0.71303129,0,0,1.2312496,-173.62652,-89.498759)"
cx="45.883327"
cy="28.869568"
fx="45.883327"
fy="28.869568"
r="19.467436" />
<filter
inkscape:collect="always"
id="filter3839">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="1.8876593"
id="feGaussianBlur3841" />
</filter>
<mask
maskUnits="userSpaceOnUse"
id="mask3847">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:none;filter:url(#filter3839)"
id="rect3849"
width="59.396984"
height="59.525551"
x="2.4427326"
y="2.4174275" />
</mask>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.7781746"
inkscape:cx="28.042409"
inkscape:cy="32.204268"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="990"
inkscape:window-x="-11"
inkscape:window-y="-11"
inkscape:window-maximized="1"
inkscape:object-nodes="true"
inkscape:snap-global="false" />
<metadata
id="metadata2874">
id="metadata2573">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>[maxwxyz]</dc:title>
</cc:Agent>
</dc:creator>
<dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/</dc:identifier>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:date>2024</dc:date>
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="g268"
style="display:inline;stroke-width:1.05234"
transform="matrix(0.91662138,-0.24560795,0.24628422,0.91914523,124.68485,-61.319611)">
<path
d="m -113.25195,68.765625 -26.72657,15.429687 7.96359,9.416205 z"
style="fill:#fcaf3e;fill-rule:evenodd;stroke:#22160c;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path264" />
<path
d="m -113.25195,68.765625 -42.36385,12.251953 15.63728,3.177734 z"
style="fill:#fcaf3e;fill-rule:evenodd;stroke:#22160c;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path265" />
<path
d="m -139.97326,84.192283 v 8.814454 l 5.00816,-2.883522 z"
style="fill:#f57900;fill-rule:evenodd;stroke:#22160c;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path266" />
<path
d="m -119.19922,74.021484 -12.88672,17.0625 -5.46679,-6.466797 z"
style="fill:url(#linearGradient271);fill-rule:evenodd;stroke:#fcaf3e;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path267" />
<path
d="M -125.28125,73.886719 -140.25,82.529297 -149.00781,80.75 Z"
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:url(#linearGradient1);fill-opacity:1;fill-rule:evenodd;stroke:#fcaf3e;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="path268" />
</g>
<g
id="g5"
style="display:inline;stroke-width:1.05234"
transform="matrix(0.91662138,-0.24560795,0.24628422,0.91914523,148.87574,-85.566978)">
<path
d="m -113.25195,68.765625 -26.72657,15.429687 7.96359,9.416205 z"
style="fill:#fcaf3e;fill-rule:evenodd;stroke:#22160c;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path1" />
<path
d="m -113.25195,68.765625 -42.36385,12.251953 15.63728,3.177734 z"
style="fill:#fcaf3e;fill-rule:evenodd;stroke:#22160c;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path2" />
<path
d="m -139.97326,84.192283 v 8.814454 l 5.00816,-2.883522 z"
style="fill:#f57900;fill-rule:evenodd;stroke:#22160c;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path3" />
<path
d="m -119.19922,74.021484 -12.88672,17.0625 -5.46679,-6.466797 z"
style="fill:url(#linearGradient8);fill-rule:evenodd;stroke:#fcaf3e;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="path4" />
<path
d="M -125.28125,73.886719 -140.25,82.529297 -149.00781,80.75 Z"
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:url(#linearGradient9);fill-opacity:1;fill-rule:evenodd;stroke:#fcaf3e;stroke-width:1.57851;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
id="path5" />
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<g
id="g3817"
mask="url(#mask3847)">
<g
id="g3804">
<g
id="g3794">
<path
inkscape:connector-curvature="0"
id="path3018"
d="m -18.909091,25.818182 4.272727,17 30.454546,-11.545455 z"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path3020"
d="M -14.636364,42.818182 15.818182,31.272727 -15.090909,28.545455 z"
style="fill:#e9a60a;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path3022"
d="m -18.909091,25.818182 4.272727,17 -0.454545,-14.272727 z"
style="fill:#4c390a;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path3024"
d="m -15.090909,28.545455 30.909091,2.727272 -34.727273,-5.454545 z"
style="fill:#2f240a;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
</g>
<use
x="0"
y="0"
xlink:href="#g3794"
id="use3800"
transform="translate(34.391471,-3.4973989)"
width="64"
height="64" />
<use
x="0"
y="0"
xlink:href="#use3800"
id="use3802"
transform="translate(33.517619,-3.2298738)"
width="64"
height="64" />
</g>
<use
height="64"
width="64"
transform="translate(5.4545455,20.636364)"
id="use3813"
xlink:href="#g3804"
y="0"
x="0" />
<use
height="64"
width="64"
transform="translate(-10.272727,-40.000001)"
id="use3815"
xlink:href="#use3813"
y="0"
x="0" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 46 KiB

178
src/Mod/AddonManager/Resources/icons/sort_ascending.svg Executable file → Normal file
View File

@@ -2,117 +2,81 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="64"
height="64"
id="svg2869"
width="16"
height="16"
viewBox="0 0 16 16"
version="1.1"
viewBox="0 0 64 64"
id="svg1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="ascending.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="64"
inkscape:cx="9"
inkscape:cy="7.40625"
inkscape:window-width="2560"
inkscape:window-height="1368"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
dotted="false"
gridanglex="30"
gridanglez="30"
visible="true" />
</sodipodi:namedview>
<defs
id="defs2871">
<linearGradient
id="linearGradient5">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop19" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop20" />
</linearGradient>
<linearGradient
id="swatch18">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop18" />
</linearGradient>
<linearGradient
id="swatch15">
<stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop15" />
</linearGradient>
<linearGradient
id="linearGradient5-1">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop6" />
</linearGradient>
<linearGradient
id="linearGradient3836-9">
<stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" />
<stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" />
</linearGradient>
id="defs1">
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Blur"
id="filter2"
x="-0.2"
y="-0.2"
width="1.4"
height="1.4">
<feGaussianBlur
stdDeviation="1 1"
result="blur"
id="feGaussianBlur2" />
</filter>
</defs>
<metadata
id="metadata2874">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>[maxwxyz]</dc:title>
</cc:Agent>
</dc:creator>
<dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/</dc:identifier>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:date>2024</dc:date>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer3"
style="display:inline">
<g
id="g4"
transform="matrix(-1,0,0,1,64,0)">
<path
d="M 11.224201,6.8878745 V 34.735474 H 2.9999307 L 15.336335,57.112233 27.672739,34.735474 H 19.44847 V 6.8878745 Z"
style="fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:100;stroke-dasharray:none;stroke-dashoffset:3.45"
id="path1" />
<path
d="m 44.551531,57.112126 v -27.8476 h -8.22427 L 48.663665,6.8877674 61.000069,29.264526 H 52.7758 v 27.8476 z"
style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:100;stroke-dasharray:none;stroke-dashoffset:3.45"
id="path2" />
<path
d="m 13.224609,8.8886719 h 4.22461 V 36.736328 h 6.835937 L 15.335938,52.96875 6.3867187,36.736328 h 6.8378903 z"
style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:#d3d7cf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:100;stroke-dasharray:none;stroke-dashoffset:3.45"
id="path3" />
<path
d="m 48.664062,11.03125 8.949219,16.232422 h -6.83789 v 27.847656 h -4.22461 V 27.263672 h -6.835937 z"
style="fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:100;stroke-dasharray:none;stroke-dashoffset:3.45"
id="path4" />
</g>
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
d="m 11,3 v 7 H 10 L 11.5,14.015625 13,10 H 12 V 3 Z"
style="fill-rule:evenodd;stroke-width:0.48;stroke-linecap:square;stroke-miterlimit:100;stroke-dashoffset:3.45;fill:#999999;fill-opacity:1"
id="path4" />
<path
d="m 5,13.015625 v -7 H 6 L 4.5,2 3,6.015625 h 1 v 7 z"
style="fill-rule:evenodd;stroke-width:0.48;stroke-linecap:square;stroke-miterlimit:100;stroke-dashoffset:3.45;fill:#000000;fill-opacity:1"
id="path4-0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

178
src/Mod/AddonManager/Resources/icons/sort_descending.svg Executable file → Normal file
View File

@@ -2,117 +2,81 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="64"
height="64"
id="svg2869"
width="16"
height="16"
viewBox="0 0 16 16"
version="1.1"
viewBox="0 0 64 64"
id="svg1"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="descending.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="64"
inkscape:cx="9"
inkscape:cy="7.40625"
inkscape:window-width="2560"
inkscape:window-height="1368"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
id="grid1"
units="px"
originx="0"
originy="0"
spacingx="1"
spacingy="1"
empcolor="#0099e5"
empopacity="0.30196078"
color="#0099e5"
opacity="0.14901961"
empspacing="5"
dotted="false"
gridanglex="30"
gridanglez="30"
visible="true" />
</sodipodi:namedview>
<defs
id="defs2871">
<linearGradient
id="linearGradient5">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop19" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop20" />
</linearGradient>
<linearGradient
id="swatch18">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop18" />
</linearGradient>
<linearGradient
id="swatch15">
<stop
style="stop-color:#3d0000;stop-opacity:1;"
offset="0"
id="stop15" />
</linearGradient>
<linearGradient
id="linearGradient5-1">
<stop
style="stop-color:#ef2929;stop-opacity:1;"
offset="0"
id="stop5" />
<stop
style="stop-color:#ef2929;stop-opacity:0;"
offset="1"
id="stop6" />
</linearGradient>
<linearGradient
id="linearGradient3836-9">
<stop
style="stop-color:#a40000;stop-opacity:1"
offset="0"
id="stop3838-8" />
<stop
style="stop-color:#ef2929;stop-opacity:1"
offset="1"
id="stop3840-1" />
</linearGradient>
id="defs1">
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Blur"
id="filter2"
x="-0.2"
y="-0.2"
width="1.4"
height="1.4">
<feGaussianBlur
stdDeviation="1 1"
result="blur"
id="feGaussianBlur2" />
</filter>
</defs>
<metadata
id="metadata2874">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>[maxwxyz]</dc:title>
</cc:Agent>
</dc:creator>
<dc:relation>https://www.freecad.org/wiki/index.php?title=Artwork</dc:relation>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/</dc:identifier>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:date>2024</dc:date>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer3"
style="display:inline">
<g
id="g4"
transform="matrix(1,0,0,-1,0,64)">
<path
d="M 11.224201,6.8878745 V 34.735474 H 2.9999307 L 15.336335,57.112233 27.672739,34.735474 H 19.44847 V 6.8878745 Z"
style="fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:100;stroke-dasharray:none;stroke-dashoffset:3.45"
id="path1" />
<path
d="m 44.551531,57.112126 v -27.8476 h -8.22427 L 48.663665,6.8877674 61.000069,29.264526 H 52.7758 v 27.8476 z"
style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:100;stroke-dasharray:none;stroke-dashoffset:3.45"
id="path2" />
<path
d="m 13.224609,8.8886719 h 4.22461 V 36.736328 h 6.835937 L 15.335938,52.96875 6.3867187,36.736328 h 6.8378903 z"
style="fill:#babdb6;fill-opacity:1;fill-rule:evenodd;stroke:#d3d7cf;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:100;stroke-dasharray:none;stroke-dashoffset:3.45"
id="path3" />
<path
d="m 48.664062,11.03125 8.949219,16.232422 h -6.83789 v 27.847656 h -4.22461 V 27.263672 h -6.835937 z"
style="fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:100;stroke-dasharray:none;stroke-dashoffset:3.45"
id="path4" />
</g>
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
d="m 11,3 v 7 H 10 L 11.5,14.015625 13,10 H 12 V 3 Z"
style="fill-rule:evenodd;stroke-width:0.48;stroke-linecap:square;stroke-miterlimit:100;stroke-dashoffset:3.45"
id="path4" />
<path
d="m 5,13.015625 v -7 H 6 L 4.5,2 3,6.015625 h 1 v 7 z"
style="fill-rule:evenodd;stroke-width:0.48;stroke-linecap:square;stroke-miterlimit:100;stroke-dashoffset:3.45;fill:#999999;fill-opacity:1"
id="path4-0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,71 +0,0 @@
#***************************************************************************
#* Copyright (c) 2011 Yorik van Havre <yorik@uncreated.net> *
#* *
#* 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 *
#* *
#***************************************************************************
__title__ = "FreeCAD Arch API"
__author__ = "Yorik van Havre"
__url__ = "https://www.freecad.org"
## \defgroup ARCH Arch
# \ingroup PYTHONWORKBENCHES
# \brief Architecture and BIM tools
#
# This module provides tools specialized in Building Information Modeling (BIM).
# such as convenience tools to build walls, windows or structures, and
# IFC import/export capabilities.
'''The Arch module provides tools specialized in BIM modeling.'''
import FreeCAD
if FreeCAD.GuiUp:
import FreeCADGui
FreeCADGui.updateLocale()
from ArchWall import *
from ArchFloor import *
from ArchFence import *
from ArchProject import *
from ArchSite import *
from ArchBuilding import *
from ArchStructure import *
from ArchProfile import *
from ArchCommands import *
from ArchSectionPlane import *
from ArchWindow import *
from ArchWindowPresets import *
from ArchAxis import *
from ArchAxisSystem import *
from ArchGrid import *
from ArchRoof import *
from ArchSpace import *
from ArchStairs import *
from ArchRebar import *
from ArchFrame import *
from ArchPanel import *
from ArchEquipment import *
from ArchCutPlane import *
from ArchMaterial import *
from ArchSchedule import *
from ArchPrecast import *
from ArchPipe import *
from ArchBuildingPart import *
from ArchReference import *
from ArchTruss import *
from ArchCurtainWall import *

View File

@@ -1,135 +0,0 @@
IF (BUILD_GUI)
PYSIDE_WRAP_RC(Arch_QRC_SRCS Resources/Arch.qrc)
ENDIF (BUILD_GUI)
SET(Arch_SRCS
Init.py
InitGui.py
ArchComponent.py
ArchIFC.py
ArchIFCView.py
ArchIFCSchema.py
ArchProject.py
ArchWall.py
importIFC.py
importIFClegacy.py
importIFCHelper.py
importIFCmulticore.py
exportIFCHelper.py
Arch.py
ArchBuilding.py
ArchFloor.py
ArchSite.py
ArchStructure.py
ArchCommands.py
ArchSectionPlane.py
importDAE.py
importOBJ.py
ArchWindow.py
ArchWindowPresets.py
ArchAxis.py
ArchAxisSystem.py
ArchGrid.py
ArchVRM.py
ArchRoof.py
ArchStairs.py
importWebGL.py
importJSON.py
ArchSpace.py
ArchRebar.py
TestArch.py
ArchFrame.py
ArchPanel.py
ArchEquipment.py
ArchCutPlane.py
ArchMaterial.py
ArchSchedule.py
ArchProfile.py
import3DS.py
ArchPrecast.py
importSH3D.py
ArchPipe.py
ArchNesting.py
ArchBuildingPart.py
ArchReference.py
ArchFence.py
OfflineRenderingUtils.py
exportIFC.py
ArchTruss.py
ArchCurtainWall.py
importSHP.py
exportIFCStructuralTools.py
ifc_objects.py
ifc_viewproviders.py
ArchSketchObject.py
)
SET(Dice3DS_SRCS
Dice3DS/__init__.py
Dice3DS/util.py
Dice3DS/dom3ds.py
)
SET(Arch_presets
Presets/profiles.csv
Presets/pset_definitions.csv
Presets/ifc_products_IFC2X3.json
Presets/ifc_products_IFC4.json
Presets/ifc_types_IFC2X3.json
Presets/ifc_types_IFC4.json
Presets/ifc_contexts_IFC2X3.json
Presets/ifc_contexts_IFC4.json
)
SOURCE_GROUP("" FILES ${Arch_SRCS})
SET(ArchGuiIcon_SVG
Resources/icons/ArchWorkbench.svg
)
ADD_CUSTOM_TARGET(Arch ALL
SOURCES ${Arch_SRCS} ${Arch_QRC_SRCS} ${Dice3DS_SRCS} ${Arch_presets} ${ArchGuiIcon_SVG}
)
fc_copy_sources(Arch "${CMAKE_BINARY_DIR}/Mod/Arch" ${Arch_SRCS})
fc_copy_sources(Arch "${CMAKE_BINARY_DIR}/Mod/Arch" ${Dice3DS_SRCS})
fc_copy_sources(Arch "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Arch" ${ArchGuiIcon_SVG})
fc_target_copy_resource(Arch
${CMAKE_SOURCE_DIR}/src/Mod/Arch
${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Arch
${Arch_presets}
)
IF (BUILD_GUI)
fc_target_copy_resource(Arch
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_BINARY_DIR}/Mod/Arch
Arch_rc.py)
ENDIF (BUILD_GUI)
INSTALL(
FILES
${Arch_SRCS}
${Arch_QRC_SRCS}
DESTINATION Mod/Arch
)
INSTALL(
FILES
${Dice3DS_SRCS}
DESTINATION Mod/Arch/Dice3DS
)
INSTALL(
DIRECTORY
Presets
DESTINATION
${CMAKE_INSTALL_DATADIR}/Mod/Arch
)
INSTALL(
FILES
${ArchGuiIcon_SVG}
DESTINATION
"${CMAKE_INSTALL_DATADIR}/Mod/Arch/Resources/icons"
)

View File

@@ -1,34 +0,0 @@
#***************************************************************************
#* Copyright (c) 2011 Yorik van Havre <yorik@uncreated.net> *
#* *
#* 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 *
#* *
#***************************************************************************
# add import/export types
FreeCAD.addImportType("Industry Foundation Classes (*.ifc *.IFC)","importIFC")
FreeCAD.addExportType("Industry Foundation Classes (*.ifc)","exportIFC")
FreeCAD.addExportType("Industry Foundation Classes - IFCJSON (*.ifcJSON)","exportIFC")
FreeCAD.addImportType("Wavefront OBJ - Arch module (*.obj *.OBJ)","importOBJ")
FreeCAD.addExportType("Wavefront OBJ - Arch module (*.obj)","importOBJ")
FreeCAD.addExportType("WebGL file (*.html)","importWebGL")
FreeCAD.addExportType("JavaScript Object Notation (*.json)","importJSON")
FreeCAD.addImportType("Collada (*.dae *.DAE)","importDAE")
FreeCAD.addExportType("Collada (*.dae)","importDAE")
FreeCAD.addImportType("3D Studio mesh (*.3ds *.3DS)","import3DS")
FreeCAD.addImportType("SweetHome3D XML export (*.zip *.ZIP)","importSH3D")
FreeCAD.addImportType("Shapefile (*.shp *.SHP)","importSHP")

View File

@@ -1,266 +0,0 @@
# ***************************************************************************
# * Copyright (c) 2011 Yorik van Havre <yorik@uncreated.net> *
# * *
# * 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 *
# * *
# ***************************************************************************
"""Initialization of the Arch workbench (graphical interface)."""
import os
import FreeCAD
import FreeCADGui
class ArchWorkbench(FreeCADGui.Workbench):
"""The Arch workbench definition."""
def __init__(self):
def QT_TRANSLATE_NOOP(context, text):
return text
__dirname__ = os.path.join(FreeCAD.getResourceDir(), "Mod", "Arch")
_tooltip = ("The Arch workbench is used to model "
"architectural components, and entire buildings")
self.__class__.Icon = os.path.join(__dirname__,
"Resources", "icons",
"ArchWorkbench.svg")
self.__class__.MenuText = QT_TRANSLATE_NOOP("Arch", "Arch")
self.__class__.ToolTip = QT_TRANSLATE_NOOP("Arch", _tooltip)
def Initialize(self):
"""When the workbench is first loaded."""
def QT_TRANSLATE_NOOP(context, text):
return text
import Draft_rc
import DraftTools
import DraftGui
import Arch_rc
import Arch
# Load Reinforcement WB translations
try:
import RebarTools
RebarTools.load_translations()
except Exception:
pass
from ArchStructure import _ArchStructureGroupCommand
from ArchAxis import _ArchAxisGroupCommand
from ArchPanel import CommandPanelGroup
from ArchMaterial import _ArchMaterialToolsCommand
from ArchPipe import _ArchPipeGroupCommand
stru_group = _ArchStructureGroupCommand
axis_group = _ArchAxisGroupCommand
pan_group = CommandPanelGroup
mat_group = _ArchMaterialToolsCommand
pipe_group = _ArchPipeGroupCommand
# Set up command lists
self.archtools = ["Arch_Wall",
([QT_TRANSLATE_NOOP("Workbench", "Structure tools")],
list(stru_group.GetCommands(stru_group))), # tuple len=2: submenu
("Arch_StructureTools", ), # tuple len=1: toolbar flyout
"Arch_Rebar_Submenu", # will be replaced or removed
"Arch_Rebar", # may be replaced
"Arch_CurtainWall",
"Arch_BuildingPart",
"Arch_Project",
"Arch_Site",
"Arch_Building",
"Arch_Floor",
"Arch_Reference",
"Arch_Window",
"Arch_Roof",
([QT_TRANSLATE_NOOP("Workbench", "Axis tools")],
list(axis_group.GetCommands(axis_group))),
("Arch_AxisTools", ),
"Arch_SectionPlane",
"Arch_Space",
"Arch_Stairs",
([QT_TRANSLATE_NOOP("Workbench", "Panel tools")],
list(pan_group.GetCommands(pan_group))),
("Arch_PanelTools", ),
"Arch_Equipment",
"Arch_Frame",
"Arch_Fence",
"Arch_Truss",
"Arch_Profile",
([QT_TRANSLATE_NOOP("Workbench", "Material tools")],
list(mat_group.GetCommands(mat_group))),
("Arch_MaterialTools", ),
"Arch_Schedule",
([QT_TRANSLATE_NOOP("Workbench", "Pipe tools")],
list(pipe_group.GetCommands(pipe_group))),
("Arch_PipeTools", ),
"Arch_CutPlane",
"Arch_Add",
"Arch_Remove",
"Arch_Survey"]
self.utilities = ["Arch_Component",
"Arch_CloneComponent",
"Arch_SplitMesh",
"Arch_MeshToShape",
"Arch_SelectNonSolidMeshes",
"Arch_RemoveShape",
"Arch_CloseHoles",
"Arch_MergeWalls",
"Arch_Check",
"Arch_ToggleIfcBrepFlag",
"Arch_3Views",
"Arch_IfcSpreadsheet",
"Arch_ToggleSubs"]
# Add the rebar tools from the Reinforcement addon, if available
try:
import RebarTools
except Exception:
del self.archtools[3] # remove "Arch_Rebar_Submenu"
else:
class RebarGroupCommand:
def GetCommands(self):
return tuple(RebarTools.RebarCommands + ["Arch_Rebar"])
def GetResources(self):
return {'MenuText': QT_TRANSLATE_NOOP("Arch_RebarTools", "Rebar tools"),
'ToolTip': QT_TRANSLATE_NOOP("Arch_RebarTools",
"Create various types of rebars, "
"including U-shaped, L-shaped, and stirrup")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
FreeCADGui.addCommand('Arch_RebarTools', RebarGroupCommand())
self.archtools[3] = ([QT_TRANSLATE_NOOP("Workbench", "Rebar tools")],
RebarTools.RebarCommands + ["Arch_Rebar"])
self.archtools[4] = ("Arch_RebarTools", )
# Set up Draft command lists
import draftutils.init_tools as it
self.draft_drawing_commands = it.get_draft_drawing_commands()
self.draft_annotation_commands = it.get_draft_annotation_commands()
self.draft_modification_commands = it.get_draft_modification_commands()
self.draft_utility_commands = it.get_draft_utility_commands_menu()
self.draft_context_commands = it.get_draft_context_commands()
self.draft_snap_commands = it.get_draft_snap_commands()
# Set up toolbars
it.init_toolbar(self,
QT_TRANSLATE_NOOP("Workbench", "Arch tools"),
self.archtools)
it.init_toolbar(self,
QT_TRANSLATE_NOOP("Workbench", "Draft creation tools"),
self.draft_drawing_commands)
it.init_toolbar(self,
QT_TRANSLATE_NOOP("Workbench", "Draft annotation tools"),
self.draft_annotation_commands)
it.init_toolbar(self,
QT_TRANSLATE_NOOP("Workbench", "Draft modification tools"),
self.draft_modification_commands)
it.init_toolbar(self,
QT_TRANSLATE_NOOP("Workbench", "Draft snap"),
self.draft_snap_commands)
# Set up menus
it.init_menu(self,
[QT_TRANSLATE_NOOP("Workbench", "&Arch"),
QT_TRANSLATE_NOOP("Workbench", "Utilities")],
self.utilities)
it.init_menu(self,
[QT_TRANSLATE_NOOP("Workbench", "&Arch")],
self.archtools)
it.init_menu(self,
[QT_TRANSLATE_NOOP("Workbench", "&Draft"),
QT_TRANSLATE_NOOP("Workbench", "Creation")],
self.draft_drawing_commands)
it.init_menu(self,
[QT_TRANSLATE_NOOP("Workbench", "&Draft"),
QT_TRANSLATE_NOOP("Workbench", "Annotation")],
self.draft_annotation_commands)
it.init_menu(self,
[QT_TRANSLATE_NOOP("Workbench", "&Draft"),
QT_TRANSLATE_NOOP("Workbench", "Modification")],
self.draft_modification_commands)
it.init_menu(self,
[QT_TRANSLATE_NOOP("Workbench", "&Draft"),
QT_TRANSLATE_NOOP("Workbench", "Utilities")],
self.draft_utility_commands)
FreeCADGui.addIconPath(":/icons")
FreeCADGui.addLanguagePath(":/translations")
# Set up preferences pages
if hasattr(FreeCADGui, "draftToolBar"):
if not hasattr(FreeCADGui.draftToolBar, "loadedArchPreferences"):
FreeCADGui.addPreferencePage(":/ui/preferences-arch.ui", QT_TRANSLATE_NOOP("QObject", "Arch"))
FreeCADGui.addPreferencePage(":/ui/preferences-archdefaults.ui", QT_TRANSLATE_NOOP("QObject", "Arch"))
FreeCADGui.draftToolBar.loadedArchPreferences = True
if not hasattr(FreeCADGui.draftToolBar, "loadedPreferences"):
from draftutils import params
params._param_observer_start()
FreeCADGui.addPreferencePage(":/ui/preferences-draft.ui", QT_TRANSLATE_NOOP("QObject", "Draft"))
FreeCADGui.addPreferencePage(":/ui/preferences-draftinterface.ui", QT_TRANSLATE_NOOP("QObject", "Draft"))
FreeCADGui.addPreferencePage(":/ui/preferences-draftsnap.ui", QT_TRANSLATE_NOOP("QObject", "Draft"))
FreeCADGui.addPreferencePage(":/ui/preferences-draftvisual.ui", QT_TRANSLATE_NOOP("QObject", "Draft"))
FreeCADGui.addPreferencePage(":/ui/preferences-drafttexts.ui", QT_TRANSLATE_NOOP("QObject", "Draft"))
FreeCADGui.draftToolBar.loadedPreferences = True
FreeCAD.Console.PrintLog('Loading Arch workbench, done.\n')
def Activated(self):
"""When entering the workbench."""
if hasattr(FreeCADGui, "draftToolBar"):
FreeCADGui.draftToolBar.Activated()
if hasattr(FreeCADGui, "Snapper"):
FreeCADGui.Snapper.show()
import WorkingPlane
WorkingPlane._view_observer_start()
FreeCAD.Console.PrintLog("Arch workbench activated.\n")
def Deactivated(self):
"""When leaving the workbench."""
if hasattr(FreeCADGui, "draftToolBar"):
FreeCADGui.draftToolBar.Deactivated()
if hasattr(FreeCADGui, "Snapper"):
FreeCADGui.Snapper.hide()
import WorkingPlane
WorkingPlane._view_observer_stop()
FreeCAD.Console.PrintLog("Arch workbench deactivated.\n")
def ContextMenu(self, recipient):
"""Define an optional custom context menu."""
self.appendContextMenu("Utilities", self.draft_context_commands)
def GetClassName(self):
"""Type of workbench."""
return "Gui::PythonWorkbench"
FreeCADGui.addWorkbench(ArchWorkbench)
# Preference pages for importing and exporting various file formats
# are independent of the loading of the workbench and can be loaded at startup
import Arch_rc
from PySide.QtCore import QT_TRANSLATE_NOOP
FreeCADGui.addPreferencePage(":/ui/preferences-ifc.ui", QT_TRANSLATE_NOOP("QObject", "Import-Export"))
FreeCADGui.addPreferencePage(":/ui/preferences-ifc-export.ui", QT_TRANSLATE_NOOP("QObject", "Import-Export"))
FreeCADGui.addPreferencePage(":/ui/preferences-dae.ui", QT_TRANSLATE_NOOP("QObject", "Import-Export"))
FreeCAD.__unit_test__ += ["TestArch"]

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -46,6 +46,9 @@
#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <gp_Circ.hxx>
#include <gp_Cylinder.hxx>
#include <gp_Sphere.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Face.hxx>

1139
src/Mod/BIM/Arch.py Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -34,9 +34,6 @@ if FreeCAD.GuiUp:
from draftutils.translate import translate
from pivy import coin
from PySide.QtCore import QT_TRANSLATE_NOOP
from ArchAxisSystem import _CommandAxisSystem
from ArchGrid import CommandArchGrid
else:
# \cond
def translate(ctxt,txt):
@@ -57,58 +54,6 @@ __url__ = "https://www.freecad.org"
# An axis is a collection of planar axes with a number/tag
def makeAxis(num=5,size=1000,name=None):
'''makeAxis([num],[size],[name]): makes an Axis set
based on the given number of axes and interval distances'''
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Axis")
obj.Label = name if name else translate("Arch","Axes")
_Axis(obj)
if FreeCAD.GuiUp:
_ViewProviderAxis(obj.ViewObject)
if num:
dist = []
angles = []
for i in range(num):
if i == 0:
dist.append(0)
else:
dist.append(float(size))
angles.append(float(0))
obj.Distances = dist
obj.Angles = angles
FreeCAD.ActiveDocument.recompute()
return obj
class _CommandAxis:
"the Arch Axis command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Axis',
'MenuText': QT_TRANSLATE_NOOP("Arch_Axis","Axis"),
'Accel': "A, X",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Axis","Creates a set of axes")}
def Activated(self):
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Axis"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeAxis()")
FreeCAD.ActiveDocument.commitTransaction()
def IsActive(self):
return not FreeCAD.ActiveDocument is None
class _Axis:
"The Axis object"
@@ -812,21 +757,3 @@ class _AxisTaskPanel:
QtGui.QApplication.translate("Arch", "Angle", None),
QtGui.QApplication.translate("Arch", "Label", None)])
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Axis',_CommandAxis())
FreeCADGui.addCommand('Arch_AxisSystem',_CommandAxisSystem())
FreeCADGui.addCommand('Arch_Grid',CommandArchGrid())
class _ArchAxisGroupCommand:
def GetCommands(self):
return tuple(['Arch_Axis','Arch_AxisSystem','Arch_Grid'])
def GetResources(self):
return { 'MenuText': QT_TRANSLATE_NOOP("Arch_AxisTools",'Axis tools'),
'ToolTip': QT_TRANSLATE_NOOP("Arch_AxisTools",'Axis tools')
}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
FreeCADGui.addCommand('Arch_AxisTools', _ArchAxisGroupCommand())

View File

@@ -48,55 +48,6 @@ __url__ = "https://www.freecad.org"
# An axis system is a collection of multiple axes
def makeAxisSystem(axes,name=None):
'''makeAxisSystem(axes,[name]): makes a system from the given list of axes'''
if not isinstance(axes,list):
axes = [axes]
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","AxisSystem")
obj.Label = name if name else translate("Arch","Axis System")
_AxisSystem(obj)
obj.Axes = axes
if FreeCAD.GuiUp:
_ViewProviderAxisSystem(obj.ViewObject)
FreeCAD.ActiveDocument.recompute()
return obj
class _CommandAxisSystem:
"the Arch Axis System command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Axis_System',
'MenuText': QT_TRANSLATE_NOOP("Arch_AxisSystem","Axis System"),
'Accel': "X, S",
'ToolTip': QT_TRANSLATE_NOOP("Arch_AxisSystem","Creates an axis system from a set of axes")}
def Activated(self):
if FreeCADGui.Selection.getSelection():
s = "["
for o in FreeCADGui.Selection.getSelection():
if Draft.getType(o) != "Axis":
FreeCAD.Console.PrintError(translate("Arch","Only axes must be selected")+"\n")
return
s += "FreeCAD.ActiveDocument."+o.Name+","
s += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Axis System"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeAxisSystem("+s+")")
FreeCAD.ActiveDocument.commitTransaction()
else:
FreeCAD.Console.PrintError(translate("Arch","Please select at least one axis")+"\n")
def IsActive(self):
return not FreeCAD.ActiveDocument is None
class _AxisSystem:
"The Axis System object"

View File

@@ -197,122 +197,6 @@ BuildingTypes = ['Undefined',
]
def makeBuildingPart(objectslist=None,baseobj=None,name=None):
'''makeBuildingPart([objectslist],[name]): creates a buildingPart including the
objects from the given list.'''
obj = FreeCAD.ActiveDocument.addObject("App::GeometryPython","BuildingPart")
#obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","BuildingPart")
obj.Label = name if name else translate("Arch","BuildingPart")
BuildingPart(obj)
obj.IfcType = "Building Element Part"
if FreeCAD.GuiUp:
ViewProviderBuildingPart(obj.ViewObject)
if objectslist:
obj.addObjects(objectslist)
return obj
def makeFloor(objectslist=None,baseobj=None,name=None):
"""overwrites ArchFloor.makeFloor"""
obj = makeBuildingPart(objectslist)
obj.Label = name if name else translate("Arch","Floor")
obj.IfcType = "Building Storey"
return obj
def makeBuilding(objectslist=None,baseobj=None,name=None):
"""overwrites ArchBuilding.makeBuilding"""
obj = makeBuildingPart(objectslist)
obj.Label = name if name else translate("Arch","Building")
obj.IfcType = "Building"
obj.addProperty("App::PropertyEnumeration","BuildingType","Building",QT_TRANSLATE_NOOP("App::Property","The type of this building"))
obj.BuildingType = BuildingTypes
if FreeCAD.GuiUp:
obj.ViewObject.ShowLevel = False
obj.ViewObject.ShowLabel = False
return obj
def convertFloors(floor=None):
"""convert the given Floor or Building (or all Arch Floors from the active document if none is given) into BuildingParts"""
todel = []
if floor:
objset = [floor]
else:
objset = FreeCAD.ActiveDocument.Objects
for obj in objset:
if Draft.getType(obj) in ["Floor","Building"]:
nobj = makeBuildingPart(obj.Group)
if Draft.getType(obj) == "Floor":
nobj.IfcType = "Building Storey"
else:
nobj.IfcType = "Building"
nobj.addProperty("App::PropertyEnumeration","BuildingType","Building",QT_TRANSLATE_NOOP("App::Property","The type of this building"))
nobj.BuildingType = BuildingTypes
label = obj.Label
for parent in obj.InList:
if hasattr(parent,"Group"):
if obj in parent.Group:
parent.addObject(nobj)
#g = parent.Group
#g.append(nobj)
#parent.Group = g
else:
print("Warning: couldn't add new object '"+label+"' to parent object '"+parent.Label+"'")
todel.append(obj.Name)
if obj.ViewObject:
obj.ViewObject.Proxy.Object = None # some bug makes this trigger even efter the object has been deleted...
obj.Label = obj.Label+" to delete" # in case FreeCAD doesn't allow 2 objs with same label
nobj.Label = label
for n in todel:
from DraftGui import todo
todo.delay(FreeCAD.ActiveDocument.removeObject,n)
class CommandBuildingPart:
"the Arch BuildingPart command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_BuildingPart',
'MenuText': QT_TRANSLATE_NOOP("Arch_BuildingPart","BuildingPart"),
'Accel': "B, P",
'ToolTip': QT_TRANSLATE_NOOP("Arch_BuildingPart","Creates a BuildingPart including selected objects")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
ss = "[ "
for o in sel:
ss += "FreeCAD.ActiveDocument." + o.Name + ", "
ss += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create BuildingPart"))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Draft")
FreeCADGui.addModule("WorkingPlane")
FreeCADGui.doCommand("obj = Arch.makeBuildingPart("+ss+")")
FreeCADGui.doCommand("obj.Placement = WorkingPlane.get_working_plane().get_placement()")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class BuildingPart(ArchIFC.IfcProduct):
@@ -335,7 +219,7 @@ class BuildingPart(ArchIFC.IfcProduct):
obj.addProperty("App::PropertyBool","HeightPropagate","Children",QT_TRANSLATE_NOOP("App::Property","If true, the height value propagates to contained objects if the height of those objects is set to 0"))
obj.HeightPropagate = True
if not "LevelOffset" in pl:
obj.addProperty("App::PropertyLength","LevelOffset","BuildingPart",QT_TRANSLATE_NOOP("App::Property","The level of the (0,0,0) point of this level"))
obj.addProperty("App::PropertyDistance","LevelOffset","BuildingPart",QT_TRANSLATE_NOOP("App::Property","The level of the (0,0,0) point of this level"))
if not "Area" in pl:
obj.addProperty("App::PropertyArea","Area", "BuildingPart",QT_TRANSLATE_NOOP("App::Property","The computed floor area of this floor"))
if not "Description" in pl:
@@ -1100,7 +984,3 @@ class ViewProviderBuildingPart:
f.close()
obj.SavedInventor = tf
os.remove(tf)
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_BuildingPart',CommandBuildingPart())

View File

@@ -1324,298 +1324,6 @@ def printWarning( message ):
if FreeCAD.GuiUp :
QtGui.QMessageBox.warning( None , "" , message )
# command definitions ###############################################
class _CommandAdd:
"the Arch Add command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Add',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Add","Add component"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Add","Adds the selected components to the active object")}
def IsActive(self):
return len(FreeCADGui.Selection.getSelection()) > 1
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if Draft.getType(sel[-1]) == "Space":
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Add space boundary"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.addSpaceBoundaries( FreeCAD.ActiveDocument."+sel[-1].Name+", FreeCADGui.Selection.getSelectionEx() )")
else:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Grouping"))
if not mergeCells(sel):
host = sel.pop()
ss = "["
for o in sel:
if len(ss) > 1:
ss += ","
ss += "FreeCAD.ActiveDocument."+o.Name
ss += "]"
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.addComponents("+ss+",FreeCAD.ActiveDocument."+host.Name+")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _CommandRemove:
"the Arch Add command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Remove',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Remove","Remove component"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Remove","Remove the selected components from their parents, or create a hole in a component")}
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if Draft.getType(sel[-1]) == "Space":
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Remove space boundary"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.removeSpaceBoundaries( FreeCAD.ActiveDocument."+sel[-1].Name+", FreeCADGui.Selection.getSelection() )")
else:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Ungrouping"))
if len(sel) > 1:
host = sel.pop()
ss = "["
for o in sel:
if len(ss) > 1:
ss += ","
ss += "FreeCAD.ActiveDocument."+o.Name
ss += "]"
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.removeComponents("+ss+",FreeCAD.ActiveDocument."+host.Name+")")
else:
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.removeComponents(FreeCAD.ActiveDocument."+sel[0].Name+")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _CommandSplitMesh:
"the Arch SplitMesh command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_SplitMesh',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_SplitMesh","Split Mesh"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_SplitMesh","Splits selected meshes into independent components")}
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
if FreeCADGui.Selection.getSelection():
sel = FreeCADGui.Selection.getSelection()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Split Mesh"))
for obj in sel:
n = obj.Name
nobjs = splitMesh(obj)
if len(nobjs) > 1:
g = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroup",n)
for o in nobjs:
g.addObject(o)
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _CommandMeshToShape:
"the Arch MeshToShape command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_MeshToShape',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_MeshToShape","Mesh to Shape"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_MeshToShape","Turns selected meshes into Part Shape objects")}
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
if FreeCADGui.Selection.getSelection():
f = FreeCADGui.Selection.getSelection()[0]
g = None
if f.isDerivedFrom("App::DocumentObjectGroup"):
g = f
FreeCADGui.Selection.clearSelection()
for o in f.OutList:
FreeCADGui.Selection.addSelection(o)
else:
if f.InList:
if f.InList[0].isDerivedFrom("App::DocumentObjectGroup"):
g = f.InList[0]
fast = params.get_param_arch("ConversionFast")
tol = params.get_param_arch("ConversionTolerance")
flat = params.get_param_arch("ConversionFlat")
cut = params.get_param_arch("ConversionCut")
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Mesh to Shape"))
for obj in FreeCADGui.Selection.getSelection():
newobj = meshToShape(obj,True,fast,tol,flat,cut)
if g and newobj:
g.addObject(newobj)
FreeCAD.ActiveDocument.commitTransaction()
class _CommandSelectNonSolidMeshes:
"the Arch SelectNonSolidMeshes command definition"
def GetResources(self):
return {'Pixmap': 'Arch_SelectNonManifold.svg',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_SelectNonSolidMeshes","Select non-manifold meshes"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_SelectNonSolidMeshes","Selects all non-manifold meshes from the document or from the selected groups")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
msel = []
if FreeCADGui.Selection.getSelection():
for o in FreeCADGui.Selection.getSelection():
if o.isDerivedFrom("App::DocumentObjectGroup"):
msel.extend(o.OutList)
if not msel:
msel = FreeCAD.ActiveDocument.Objects
sel = []
for o in msel:
if o.isDerivedFrom("Mesh::Feature"):
if (not o.Mesh.isSolid()) or o.Mesh.hasNonManifolds():
sel.append(o)
if sel:
FreeCADGui.Selection.clearSelection()
for o in sel:
FreeCADGui.Selection.addSelection(o)
class _CommandRemoveShape:
"the Arch RemoveShape command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_RemoveShape',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_RemoveShape","Remove Shape from Arch"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_RemoveShape","Removes cubic shapes from Arch components")}
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
removeShape(sel)
class _CommandCloseHoles:
"the Arch CloseHoles command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_CloseHoles',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_CloseHoles","Close holes"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_CloseHoles","Closes holes in open shapes, turning them solids")}
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
for o in FreeCADGui.Selection.getSelection():
s = closeHole(o.Shape)
if s:
o.Shape = s
class _CommandCheck:
"the Arch Check command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Check',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Check","Check"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Check","Checks the selected objects for problems")}
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
result = check(FreeCADGui.Selection.getSelection())
if not result:
FreeCAD.Console.PrintMessage(str(translate("Arch","All good! No problems found")))
else:
FreeCADGui.Selection.clearSelection()
for i in result:
FreeCAD.Console.PrintWarning("Object "+i[0].Name+" ("+i[0].Label+") "+i[1])
FreeCADGui.Selection.addSelection(i[0])
class _CommandSurvey:
"the Arch Survey command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Survey',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Survey","Survey"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Survey","Starts survey")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
FreeCADGui.addModule("Arch")
FreeCADGui.doCommandGui("Arch.survey()")
class _ToggleIfcBrepFlag:
"the Toggle IFC Brep flag command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_ToggleIfcBrepFlag',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_ToggleIfcBrepFlag","Toggle IFC Brep flag"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_ToggleIfcBrepFlag","Force an object to be exported as Brep or not")}
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
for o in FreeCADGui.Selection.getSelection():
toggleIfcBrepFlag(o)
class _CommandComponent:
"the Arch Component command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Component',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Component","Component"),
'Accel': "C, M",
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Component","Creates an undefined architectural component")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if sel:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Component"))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Draft")
FreeCADGui.Control.closeDialog()
for o in sel:
FreeCADGui.doCommand("obj = Arch.makeComponent(FreeCAD.ActiveDocument."+o.Name+")")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _CommandCloneComponent:
"the Arch Clone Component command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Component_Clone',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_CloneComponent","Clone component"),
'Accel': "C, C",
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_CloneComponent","Clones an object as an undefined architectural component")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if sel:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Component"))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Draft")
FreeCADGui.Control.closeDialog()
for o in sel:
FreeCADGui.doCommand("obj = Arch.cloneComponent(FreeCAD.ActiveDocument."+o.Name+")")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
def makeIfcSpreadsheet(archobj=None):
ifc_container = None
for obj in FreeCAD.ActiveDocument.Objects :
@@ -1641,69 +1349,3 @@ def makeIfcSpreadsheet(archobj=None):
else :
return ifc_spreadsheet
class _CommandIfcSpreadsheet:
"the Arch Schedule command definition"
def GetResources(self):
return {'Pixmap': 'Arch_Schedule',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_IfcSpreadsheet","Create IFC spreadsheet..."),
'Accel': "I, P",
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_IfcSpreadsheet","Creates a spreadsheet to store IFC properties of an object.")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create IFC properties spreadsheet"))
FreeCADGui.addModule("Arch")
FreeCADGui.Control.closeDialog()
if sel:
for o in sel:
FreeCADGui.doCommand("Arch.makeIfcSpreadsheet(FreeCAD.ActiveDocument."+o.Name+")")
else :
FreeCADGui.doCommand("Arch.makeIfcSpreadsheet()")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _ToggleSubs:
"the ToggleSubs command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_ToggleSubs',
'Accel' : 'Ctrl+Space',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_ToggleSubs","Toggle subcomponents"),
'ToolTip' : QtCore.QT_TRANSLATE_NOOP("Arch_ToggleSubs","Shows or hides the subcomponents of this object")}
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
mode = None
for obj in FreeCADGui.Selection.getSelection():
if hasattr(obj, "Subtractions"):
for sub in obj.Subtractions:
if not (Draft.getType(sub) in ["Window","Roof"]):
if mode is None:
# take the first sub as base
mode = sub.ViewObject.isVisible()
if mode:
sub.ViewObject.hide()
else:
sub.ViewObject.show()
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Add',_CommandAdd())
FreeCADGui.addCommand('Arch_Remove',_CommandRemove())
FreeCADGui.addCommand('Arch_SplitMesh',_CommandSplitMesh())
FreeCADGui.addCommand('Arch_MeshToShape',_CommandMeshToShape())
FreeCADGui.addCommand('Arch_SelectNonSolidMeshes',_CommandSelectNonSolidMeshes())
FreeCADGui.addCommand('Arch_RemoveShape',_CommandRemoveShape())
FreeCADGui.addCommand('Arch_CloseHoles',_CommandCloseHoles())
FreeCADGui.addCommand('Arch_Check',_CommandCheck())
FreeCADGui.addCommand('Arch_Survey',_CommandSurvey())
FreeCADGui.addCommand('Arch_ToggleIfcBrepFlag',_ToggleIfcBrepFlag())
FreeCADGui.addCommand('Arch_Component',_CommandComponent())
FreeCADGui.addCommand('Arch_CloneComponent',_CommandCloneComponent())
FreeCADGui.addCommand('Arch_IfcSpreadsheet',_CommandIfcSpreadsheet())
FreeCADGui.addCommand('Arch_ToggleSubs',_ToggleSubs())

View File

@@ -1994,7 +1994,7 @@ class ComponentTaskPanel:
self.psetdefs[row[0]] = row[1:]
self.psetkeys = [''.join(map(lambda x: x if x.islower() else " "+x, t[5:]))[1:] for t in self.psetdefs.keys()]
self.psetkeys.sort()
self.ifcEditor = FreeCADGui.PySideUic.loadUi(":/ui/DialogIfcProperties.ui")
self.ifcEditor = FreeCADGui.PySideUic.loadUi(":/ui/dialogIfcPropertiesRedux.ui")
# center the dialog over FreeCAD window
mw = FreeCADGui.getMainWindow()

View File

@@ -70,88 +70,6 @@ the facet is triangulated and receives a third mullion
"""
def makeCurtainWall(baseobj=None,name=None):
"""
makeCurtainWall([baseobj],[name]): Creates a curtain wall in the active document
"""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","CurtainWall")
obj.Label = name if name else translate("Arch","Curtain Wall")
CurtainWall(obj)
if FreeCAD.GuiUp:
ViewProviderCurtainWall(obj.ViewObject)
if baseobj:
obj.Base = baseobj
if FreeCAD.GuiUp:
baseobj.ViewObject.hide()
return obj
class CommandArchCurtainWall:
"the Arch Curtain Wall command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_CurtainWall',
'MenuText': QT_TRANSLATE_NOOP("Arch_CurtainWall","Curtain Wall"),
'Accel': "C, W",
'ToolTip': QT_TRANSLATE_NOOP("Arch_CurtainWall","Creates a curtain wall object from selected line or from scratch")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if len(sel) > 1:
FreeCAD.Console.PrintError(translate("Arch","Please select only one base object or none")+"\n")
elif len(sel) == 1:
# build on selection
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Curtain Wall"))
FreeCADGui.addModule("Draft")
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makeCurtainWall(FreeCAD.ActiveDocument."+FreeCADGui.Selection.getSelection()[0].Name+")")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
else:
# interactive line drawing
self.points = []
import WorkingPlane
WorkingPlane.get_working_plane()
if hasattr(FreeCADGui,"Snapper"):
FreeCADGui.Snapper.getPoint(callback=self.getPoint)
def getPoint(self,point=None,obj=None):
"""Callback for clicks during interactive mode"""
if point is None:
# cancelled
return
self.points.append(point)
if len(self.points) == 1:
FreeCADGui.Snapper.getPoint(last=self.points[0],callback=self.getPoint)
elif len(self.points) == 2:
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Curtain Wall"))
FreeCADGui.addModule("Draft")
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("base = Draft.makeLine(FreeCAD."+str(self.points[0])+",FreeCAD."+str(self.points[1])+")")
FreeCADGui.doCommand("obj = Arch.makeCurtainWall(base)")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class CurtainWall(ArchComponent.Component):
@@ -611,7 +529,3 @@ class ViewProviderCurtainWall(ArchComponent.ViewProviderComponent):
if self.areDifferentColors(colors,obj.ViewObject.DiffuseColor) or force:
obj.ViewObject.DiffuseColor = colors
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_CurtainWall',CommandArchCurtainWall())

View File

@@ -157,93 +157,3 @@ def cutComponentwithPlane(baseObj, cutterShp=None, side=0):
baseParent.addObject(cutObj)
cutObj.Base = baseObj
cutObj.Tool = obj
class _CommandCutPlane:
"the Arch CutPlane command definition"
def GetResources(self):
return {"Pixmap": "Arch_CutPlane",
"MenuText": QtCore.QT_TRANSLATE_NOOP("Arch_CutPlane", "Cut with plane"),
"ToolTip": QtCore.QT_TRANSLATE_NOOP("Arch_CutPlane", "Cut an object with a plane")}
def IsActive(self):
return len(FreeCADGui.Selection.getSelection()) > 1
def Activated(self):
baseObj, baseShp, cutterShp = _getShapes(FreeCADGui.Selection.getSelectionEx("", 0))
if baseObj is None:
FreeCAD.Console.PrintError(
translate("Arch", "Select two objects, an object to be cut and an object defining a cutting plane, in that order\n")
)
return
if baseShp is None:
FreeCAD.Console.PrintError(translate("Arch", "The first object does not have a shape\n"))
return
if cutterShp is None:
FreeCAD.Console.PrintError(translate("Arch", "The second object does not define a plane\n"))
return
panel=_CutPlaneTaskPanel()
FreeCADGui.Control.showDialog(panel)
class _CutPlaneTaskPanel:
def __init__(self):
_, self.base, self.cutter = _getShapes(FreeCADGui.Selection.getSelectionEx("", 0))
self.previewObj = FreeCAD.ActiveDocument.addObject("Part::Feature", "PreviewCutVolume")
self.previewObj.ViewObject.ShapeColor = (1.00, 0.00, 0.00)
self.previewObj.ViewObject.Transparency = 75
self.form = QtGui.QWidget()
self.form.setObjectName("TaskPanel")
self.grid = QtGui.QGridLayout(self.form)
self.grid.setObjectName("grid")
self.title = QtGui.QLabel(self.form)
self.grid.addWidget(self.title, 1, 0)
self.infoText = QtGui.QLabel(self.form)
self.grid.addWidget(self.infoText, 2, 0)
self.combobox = QtGui.QComboBox()
self.combobox.setCurrentIndex(0)
self.grid.addWidget(self.combobox, 2, 1)
QtCore.QObject.connect(self.combobox,QtCore.SIGNAL("currentIndexChanged(int)"), self.previewCutVolume)
self.retranslateUi(self.form)
self.previewCutVolume(self.combobox.currentIndex())
def isAllowedAlterSelection(self):
return False
def accept(self):
FreeCAD.ActiveDocument.removeObject(self.previewObj.Name)
side = self.combobox.currentIndex()
FreeCAD.ActiveDocument.openTransaction(translate("Arch", "Cutting"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("sels = FreeCADGui.Selection.getSelectionEx('', 0)")
FreeCADGui.doCommand("Arch.cutComponentwithPlane(sels, side=" + str(side) + ")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return True
def reject(self):
FreeCAD.ActiveDocument.removeObject(self.previewObj.Name)
FreeCAD.Console.PrintMessage("Cancel Cut Plane\n")
return True
def getStandardButtons(self):
return QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel
def previewCutVolume(self, i):
cutVolume = ArchCommands.getCutVolume(self.cutter, self.base)
if i == 1:
cutVolume = cutVolume[1]
else:
cutVolume = cutVolume[2]
if cutVolume:
self.previewObj.Shape = cutVolume
def retranslateUi(self, TaskPanel):
TaskPanel.setWindowTitle(translate("Arch", "Cut Plane"))
self.title.setText(translate("Arch", "Cut Plane options"))
self.infoText.setText(translate("Arch", "Which side to cut"))
self.combobox.addItems([translate("Arch", "Behind"), translate("Arch", "Front")])
if FreeCAD.GuiUp:
FreeCADGui.addCommand("Arch_CutPlane", _CommandCutPlane())

View File

@@ -49,27 +49,7 @@ else:
# or hydraulic appliances in a building
def makeEquipment(baseobj=None,placement=None,name=None):
"makeEquipment([baseobj],[placement],[name]): creates an equipment object from the given base object."
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Equipment")
obj.Label = name if name else translate("Arch","Equipment")
_Equipment(obj)
if baseobj:
if baseobj.isDerivedFrom("Mesh::Feature"):
obj.Mesh = baseobj
else:
obj.Base = baseobj
if placement:
obj.Placement = placement
if FreeCAD.GuiUp:
_ViewProviderEquipment(obj.ViewObject)
if baseobj:
baseobj.ViewObject.hide()
return obj
def createMeshView(obj,direction=FreeCAD.Vector(0,0,-1),outeronly=False,largestonly=False):
@@ -163,110 +143,6 @@ def createMeshView(obj,direction=FreeCAD.Vector(0,0,-1),outeronly=False,largesto
return shape
class _CommandEquipment:
"the Arch Equipment command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Equipment',
'MenuText': QT_TRANSLATE_NOOP("Arch_Equipment","Equipment"),
'Accel': "E, Q",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Equipment","Creates an equipment from a selected object (Part or Mesh)")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
s = FreeCADGui.Selection.getSelection()
if not s:
FreeCAD.Console.PrintError(translate("Arch","You must select a base shape object and optionally a mesh object"))
else:
base = ""
mesh = ""
if len(s) == 2:
if hasattr(s[0],'Shape'):
base = s[0].Name
elif s[0].isDerivedFrom("Mesh::Feature"):
mesh = s[0].Name
if hasattr(s[1],'Shape'):
if mesh:
base = s[1].Name
elif s[1].isDerivedFrom("Mesh::Feature"):
if base:
mesh = s[1].Name
else:
if hasattr(s[0],'Shape'):
base = s[0].Name
elif s[0].isDerivedFrom("Mesh::Feature"):
mesh = s[0].Name
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Equipment")))
FreeCADGui.addModule("Arch")
if base:
base = "FreeCAD.ActiveDocument." + base
FreeCADGui.doCommand("obj = Arch.makeEquipment(" + base + ")")
if mesh:
FreeCADGui.doCommand("obj.Mesh = FreeCAD.ActiveDocument." + mesh)
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
# get diffuse color info from base object
if base and hasattr(s[0].ViewObject,"DiffuseColor"):
FreeCADGui.doCommand("FreeCAD.ActiveDocument.Objects[-1].ViewObject.DiffuseColor = " + base + ".ViewObject.DiffuseColor")
return
class _Command3Views:
"the Arch 3Views command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_3Views',
'MenuText': QT_TRANSLATE_NOOP("Arch_3Views","3 views from mesh"),
'ToolTip': QT_TRANSLATE_NOOP("Arch_3Views","Creates 3 views (top, front, side) from a mesh-based object")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
s = FreeCADGui.Selection.getSelection()
if len(s) != 1:
FreeCAD.Console.PrintError(translate("Arch","You must select exactly one base object"))
else:
obj = s[0]
if not obj.isDerivedFrom("Mesh::Feature"):
FreeCAD.Console.PrintError(translate("Arch","The selected object must be a mesh"))
else:
if obj.Mesh.CountFacets > 1000:
msgBox = QtGui.QMessageBox()
msgBox.setText(translate("Arch","This mesh has more than 1000 facets."))
msgBox.setInformativeText(translate("Arch","This operation can take a long time. Proceed?"))
msgBox.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)
msgBox.setDefaultButton(QtGui.QMessageBox.Cancel)
ret = msgBox.exec_()
if ret == QtGui.QMessageBox.Cancel:
return
elif obj.Mesh.CountFacets >= 500:
FreeCAD.Console.PrintWarning(translate("Arch","The mesh has more than 500 facets. This will take a couple of minutes..."))
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create 3 views")))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Part")
FreeCADGui.doCommand("s1 = Arch.createMeshView(FreeCAD.ActiveDocument." + obj.Name + ",FreeCAD.Vector(0,0,-1),outeronly=False,largestonly=False)")
FreeCADGui.doCommand("Part.show(s1)")
FreeCADGui.doCommand("s2 = Arch.createMeshView(FreeCAD.ActiveDocument." + obj.Name + ",FreeCAD.Vector(1,0,0),outeronly=False,largestonly=False)")
FreeCADGui.doCommand("Part.show(s2)")
FreeCADGui.doCommand("s3 = Arch.createMeshView(FreeCAD.ActiveDocument." + obj.Name + ",FreeCAD.Vector(0,1,0),outeronly=False,largestonly=False)")
FreeCADGui.doCommand("Part.show(s3)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
class _Equipment(ArchComponent.Component):
@@ -428,7 +304,3 @@ class _ViewProviderEquipment(ArchComponent.ViewProviderComponent):
else:
self.coords.point.deleteValues(0)
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Equipment',_CommandEquipment())
FreeCADGui.addCommand('Arch_3Views', _Command3Views())

View File

@@ -374,61 +374,12 @@ class _ViewProviderFence(ArchComponent.ViewProviderComponent):
return colorsToUse[start:end]
class _CommandFence:
"the Arch Fence command definition"
def GetResources(self):
return {'Pixmap': 'Arch_Fence',
'MenuText': QT_TRANSLATE_NOOP("Arch_Fence", "Fence"),
'ToolTip': QT_TRANSLATE_NOOP("Arch_Fence", "Creates a fence object from a selected section, post and path")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if len(sel) != 3:
QtGui.QMessageBox.information(QtGui.QApplication.activeWindow(
), 'Arch Fence selection', 'Select a section, post and path in exactly this order to build a fence.')
return
section = sel[0]
post = sel[1]
path = sel[2]
makeFence(section, post, path)
def makeFence(section, post, path):
obj = FreeCAD.ActiveDocument.addObject(
'Part::FeaturePython', 'Fence')
_Fence(obj)
obj.Section = section
obj.Post = post
obj.Path = path
if FreeCAD.GuiUp:
_ViewProviderFence(obj.ViewObject)
hide(section)
hide(post)
hide(path)
FreeCAD.ActiveDocument.recompute()
return obj
def hide(obj):
if hasattr(obj, 'ViewObject') and obj.ViewObject:
obj.ViewObject.Visibility = False
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Fence', _CommandFence())
if __name__ == '__main__':
# For testing purposes. When someone runs the File as a macro a default fence will be generated

View File

@@ -48,55 +48,6 @@ __author__ = "Yorik van Havre"
__url__ = "https://www.freecad.org"
def makeFrame(baseobj,profile,name=None):
"""makeFrame(baseobj,profile,[name]): creates a frame object from a base sketch (or any other object
containing wires) and a profile object (an extrudable 2D object containing faces or closed wires)"""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Frame")
obj.Label = name if name else translate("Arch","Frame")
_Frame(obj)
if FreeCAD.GuiUp:
_ViewProviderFrame(obj.ViewObject)
if baseobj:
obj.Base = baseobj
if profile:
obj.Profile = profile
if FreeCAD.GuiUp:
profile.ViewObject.hide()
return obj
class _CommandFrame:
"the Arch Frame command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Frame',
'MenuText': QT_TRANSLATE_NOOP("Arch_Frame","Frame"),
'Accel': "F, R",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Frame","Creates a frame object from a planar 2D object (the extrusion path(s)) and a profile. Make sure objects are selected in that order.")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
s = FreeCADGui.Selection.getSelection()
if len(s) == 2:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Frame"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makeFrame(FreeCAD.ActiveDocument."+s[0].Name+",FreeCAD.ActiveDocument."+s[1].Name+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _Frame(ArchComponent.Component):
@@ -276,6 +227,3 @@ class _ViewProviderFrame(ArchComponent.ViewProviderComponent):
p = [self.Object.Profile]
return ArchComponent.ViewProviderComponent.claimChildren(self)+p
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Frame',_CommandFrame())

View File

@@ -47,44 +47,6 @@ __url__ = "https://www.freecad.org"
# This module provides tools to build grid systems
def makeGrid(name=None):
'''makeGrid([name]): makes a grid object'''
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Grid")
obj.Label = name if name else translate("Arch","Grid")
ArchGrid(obj)
if FreeCAD.GuiUp:
ViewProviderArchGrid(obj.ViewObject)
obj.ViewObject.Transparency = 85
FreeCAD.ActiveDocument.recompute()
return obj
class CommandArchGrid:
"the Arch Grid command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Grid',
'MenuText': QT_TRANSLATE_NOOP("Arch_Grid","Grid"),
'Accel': "A, X",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Grid","Creates a customizable grid object")}
def Activated(self):
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Grid"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeGrid()")
FreeCAD.ActiveDocument.commitTransaction()
def IsActive(self):
return not FreeCAD.ActiveDocument is None
class ArchGrid:
"The Grid object"

View File

@@ -35,14 +35,14 @@ from draftutils import params
ifcVersions = ["IFC4", "IFC2X3"]
IfcVersion = ifcVersions[params.get_param_arch("IfcVersion")]
with open(os.path.join(FreeCAD.getResourceDir(), "Mod", "Arch", "Presets",
with open(os.path.join(FreeCAD.getResourceDir(), "Mod", "BIM", "Presets",
"ifc_contexts_" + IfcVersion + ".json")) as f:
IfcContexts = json.load(f)
with open(os.path.join(FreeCAD.getResourceDir(), "Mod", "Arch", "Presets",
with open(os.path.join(FreeCAD.getResourceDir(), "Mod", "BIM", "Presets",
"ifc_products_" + IfcVersion + ".json")) as f:
IfcProducts = json.load(f)
with open(os.path.join(FreeCAD.getResourceDir(), "Mod", "Arch", "Presets",
with open(os.path.join(FreeCAD.getResourceDir(), "Mod", "BIM", "Presets",
"ifc_types_" + IfcVersion + ".json")) as f:
IfcTypes = json.load(f)

View File

@@ -47,134 +47,6 @@ __url__ = "https://www.freecad.org"
# This module provides tools to add materials to
# Arch objects
def makeMaterial(name=None,color=None,transparency=None):
'''makeMaterial([name],[color],[transparency]): makes an Material object'''
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("App::MaterialObjectPython","Material")
obj.Label = name if name else translate("Arch","Material")
_ArchMaterial(obj)
if FreeCAD.GuiUp:
_ViewProviderArchMaterial(obj.ViewObject)
getMaterialContainer().addObject(obj)
if color:
obj.Color = color[:3]
if len(color) > 3:
obj.Transparency = color[3]*100
if transparency:
obj.Transparency = transparency
return obj
def getMaterialContainer():
'''getMaterialContainer(): returns a group object to put materials in'''
for obj in FreeCAD.ActiveDocument.Objects:
if obj.Name == "MaterialContainer":
return obj
obj = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroupPython","MaterialContainer")
obj.Label = "Materials"
_ArchMaterialContainer(obj)
if FreeCAD.GuiUp:
_ViewProviderArchMaterialContainer(obj.ViewObject)
return obj
def makeMultiMaterial(name=None):
'''makeMultiMaterial([name]): makes an MultiMaterial object'''
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","MultiMaterial")
obj.Label = name if name else translate("Arch","MultiMaterial")
_ArchMultiMaterial(obj)
if FreeCAD.GuiUp:
_ViewProviderArchMultiMaterial(obj.ViewObject)
getMaterialContainer().addObject(obj)
return obj
def getDocumentMaterials():
'''getDocumentMaterials(): returns all the arch materials of the document'''
for obj in FreeCAD.ActiveDocument.Objects:
if obj.Name == "MaterialContainer":
mats = []
for o in obj.Group:
if o.isDerivedFrom("App::MaterialObjectPython"):
mats.append(o)
return mats
return []
class _CommandArchMaterial:
"the Arch Material command definition"
def GetResources(self):
return {'Pixmap': 'Arch_Material_Group',
'MenuText': QT_TRANSLATE_NOOP("Arch_Material","Material"),
'Accel': "M, T",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Material","Creates or edits the material definition of a selected object.")}
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create material"))
FreeCADGui.addModule("Arch")
FreeCADGui.Control.closeDialog()
FreeCADGui.doCommand("mat = Arch.makeMaterial()")
for obj in sel:
if hasattr(obj,"Material"):
FreeCADGui.doCommand("FreeCAD.ActiveDocument.getObject(\""+obj.Name+"\").Material = mat")
FreeCADGui.doCommandGui("mat.ViewObject.Document.setEdit(mat.ViewObject, 0)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
def IsActive(self):
if FreeCAD.ActiveDocument:
return True
else:
return False
class _CommandArchMultiMaterial:
"the Arch MultiMaterial command definition"
def GetResources(self):
return {'Pixmap': 'Arch_Material_Multi',
'MenuText': QT_TRANSLATE_NOOP("Arch_MultiMaterial","Multi-Material"),
'Accel': "M, T",
'ToolTip': QT_TRANSLATE_NOOP("Arch_MultiMaterial","Creates or edits multi-materials")}
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create multi-material"))
FreeCADGui.addModule("Arch")
FreeCADGui.Control.closeDialog()
FreeCADGui.doCommand("mat = Arch.makeMultiMaterial()")
for obj in sel:
if hasattr(obj,"Material"):
if not obj.isDerivedFrom("App::MaterialObject"):
FreeCADGui.doCommand("FreeCAD.ActiveDocument."+obj.Name+".Material = mat")
FreeCADGui.doCommandGui("mat.ViewObject.Document.setEdit(mat.ViewObject, 0)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
def IsActive(self):
if FreeCAD.ActiveDocument:
return True
else:
return False
class _ArchMaterialContainer:
@@ -1023,19 +895,3 @@ class _ArchMultiMaterialTaskPanel:
return True
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Material',_CommandArchMaterial())
FreeCADGui.addCommand('Arch_MultiMaterial',_CommandArchMultiMaterial())
class _ArchMaterialToolsCommand:
def GetCommands(self):
return tuple(['Arch_Material','Arch_MultiMaterial'])
def GetResources(self):
return { 'MenuText': QT_TRANSLATE_NOOP("Arch_MaterialTools",'Material tools'),
'ToolTip': QT_TRANSLATE_NOOP("Arch_MaterialTools",'Material tools')
}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
FreeCADGui.addCommand('Arch_MaterialTools', _ArchMaterialToolsCommand())

View File

@@ -70,309 +70,6 @@ Presets = [None,
def makePanel(baseobj=None,length=0,width=0,thickness=0,placement=None,name=None):
'''makePanel([baseobj],[length],[width],[thickness],[placement],[name]): creates a
panel element based on the given profile object and the given
extrusion thickness. If no base object is given, you can also specify
length and width for a simple cubic object.'''
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Panel")
obj.Label = name if name else translate("Arch","Panel")
_Panel(obj)
if FreeCAD.GuiUp:
_ViewProviderPanel(obj.ViewObject)
if baseobj:
obj.Base = baseobj
if FreeCAD.GuiUp:
obj.Base.ViewObject.hide()
if width:
obj.Width = width
if thickness:
obj.Thickness = thickness
if length:
obj.Length = length
return obj
def makePanelCut(panel,name=None):
"""makePanelCut(panel,[name]) : Creates a 2D view of the given panel
in the 3D space, positioned at the origin."""
view = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","PanelCut")
view.Label = name if name else translate("Arch","View of")+" "+panel.Label
PanelCut(view)
view.Source = panel
if FreeCAD.GuiUp:
ViewProviderPanelCut(view.ViewObject)
return view
def makePanelSheet(panels=[],name=None):
"""makePanelSheet([panels],[name]) : Creates a sheet with the given panel cuts
in the 3D space, positioned at the origin."""
sheet = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","PanelSheet")
sheet.Label = name if name else translate("Arch","PanelSheet")
PanelSheet(sheet)
if panels:
sheet.Group = panels
if FreeCAD.GuiUp:
ViewProviderPanelSheet(sheet.ViewObject)
return sheet
class CommandPanel:
"the Arch Panel command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Panel',
'MenuText': QT_TRANSLATE_NOOP("Arch_Panel","Panel"),
'Accel': "P, A",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Panel","Creates a panel object from scratch or from a selected object (sketch, wire, face or solid)")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
self.Length = params.get_param_arch("PanelLength")
self.Width = params.get_param_arch("PanelWidth")
self.Thickness = params.get_param_arch("PanelThickness")
self.Profile = None
self.continueCmd = False
self.rotated = False
sel = FreeCADGui.Selection.getSelection()
if sel:
if len(sel) == 1:
if Draft.getType(sel[0]) == "Panel":
return
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Panel")))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Draft")
for obj in sel:
FreeCADGui.doCommand("obj = Arch.makePanel(FreeCAD.ActiveDocument." + obj.Name + ",thickness=" + str(self.Thickness) + ")")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
# interactive mode
import WorkingPlane
WorkingPlane.get_working_plane()
self.points = []
self.tracker = DraftTrackers.boxTracker()
self.tracker.width(self.Width)
self.tracker.height(self.Thickness)
self.tracker.length(self.Length)
self.tracker.on()
FreeCADGui.Snapper.getPoint(callback=self.getPoint,movecallback=self.update,extradlg=self.taskbox())
def getPoint(self,point=None,obj=None):
"this function is called by the snapper when it has a 3D point"
self.tracker.finalize()
if point is None:
return
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Panel"))
FreeCADGui.addModule("Arch")
if self.Profile:
pr = Presets[self.Profile]
FreeCADGui.doCommand('p = Arch.makeProfile('+str(pr[2])+','+str(pr[3])+','+str(pr[4])+','+str(pr[5])+')')
FreeCADGui.doCommand('s = Arch.makePanel(p,thickness='+str(self.Thickness)+')')
#FreeCADGui.doCommand('s.Placement.Rotation = FreeCAD.Rotation(-0.5,0.5,-0.5,0.5)')
else:
FreeCADGui.doCommand('s = Arch.makePanel(length='+str(self.Length)+',width='+str(self.Width)+',thickness='+str(self.Thickness)+')')
FreeCADGui.doCommand('s.Placement.Base = '+DraftVecUtils.toString(point))
if self.rotated:
FreeCADGui.doCommand('s.Placement.Rotation = FreeCAD.Rotation(FreeCAD.Vector(1.00,0.00,0.00),90.00)')
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
if self.continueCmd:
self.Activated()
def taskbox(self):
"sets up a taskbox widget"
w = QtGui.QWidget()
ui = FreeCADGui.UiLoader()
w.setWindowTitle(translate("Arch","Panel options"))
grid = QtGui.QGridLayout(w)
# presets box
labelp = QtGui.QLabel(translate("Arch","Preset"))
valuep = QtGui.QComboBox()
fpresets = [" "]
for p in Presets[1:]:
fpresets.append(translate("Arch",p[0]))
valuep.addItems(fpresets)
grid.addWidget(labelp,0,0,1,1)
grid.addWidget(valuep,0,1,1,1)
# length
label1 = QtGui.QLabel(translate("Arch","Length"))
self.vLength = ui.createWidget("Gui::InputField")
self.vLength.setText(FreeCAD.Units.Quantity(self.Length,FreeCAD.Units.Length).UserString)
grid.addWidget(label1,1,0,1,1)
grid.addWidget(self.vLength,1,1,1,1)
# width
label2 = QtGui.QLabel(translate("Arch","Width"))
self.vWidth = ui.createWidget("Gui::InputField")
self.vWidth.setText(FreeCAD.Units.Quantity(self.Width,FreeCAD.Units.Length).UserString)
grid.addWidget(label2,2,0,1,1)
grid.addWidget(self.vWidth,2,1,1,1)
# height
label3 = QtGui.QLabel(translate("Arch","Thickness"))
self.vHeight = ui.createWidget("Gui::InputField")
self.vHeight.setText(FreeCAD.Units.Quantity(self.Thickness,FreeCAD.Units.Length).UserString)
grid.addWidget(label3,3,0,1,1)
grid.addWidget(self.vHeight,3,1,1,1)
# horizontal button
value5 = QtGui.QPushButton(translate("Arch","Rotate"))
grid.addWidget(value5,4,0,1,2)
# continue button
label4 = QtGui.QLabel(translate("Arch","Con&tinue"))
value4 = QtGui.QCheckBox()
value4.setObjectName("ContinueCmd")
value4.setLayoutDirection(QtCore.Qt.RightToLeft)
label4.setBuddy(value4)
self.continueCmd = params.get_param("ContinueMode")
value4.setChecked(self.continueCmd)
grid.addWidget(label4,5,0,1,1)
grid.addWidget(value4,5,1,1,1)
QtCore.QObject.connect(valuep,QtCore.SIGNAL("currentIndexChanged(int)"),self.setPreset)
QtCore.QObject.connect(self.vLength,QtCore.SIGNAL("valueChanged(double)"),self.setLength)
QtCore.QObject.connect(self.vWidth,QtCore.SIGNAL("valueChanged(double)"),self.setWidth)
QtCore.QObject.connect(self.vHeight,QtCore.SIGNAL("valueChanged(double)"),self.setThickness)
QtCore.QObject.connect(value4,QtCore.SIGNAL("stateChanged(int)"),self.setContinue)
QtCore.QObject.connect(value5,QtCore.SIGNAL("pressed()"),self.rotate)
return w
def update(self,point,info):
"this function is called by the Snapper when the mouse is moved"
if FreeCADGui.Control.activeDialog():
self.tracker.pos(point)
if self.rotated:
self.tracker.width(self.Thickness)
self.tracker.height(self.Width)
self.tracker.length(self.Length)
else:
self.tracker.width(self.Width)
self.tracker.height(self.Thickness)
self.tracker.length(self.Length)
def setWidth(self,d):
self.Width = d
params.set_param_arch("PanelWidth",d)
def setThickness(self,d):
self.Thickness = d
params.set_param_arch("PanelThickness",d)
def setLength(self,d):
self.Length = d
params.set_param_arch("PanelLength",d)
def setContinue(self,i):
self.continueCmd = bool(i)
params.set_param("ContinueMode", bool(i))
def setPreset(self,i):
if i > 0:
self.vLength.setText(FreeCAD.Units.Quantity(float(Presets[i][1]),FreeCAD.Units.Length).UserString)
self.vWidth.setText(FreeCAD.Units.Quantity(float(Presets[i][2]),FreeCAD.Units.Length).UserString)
self.vHeight.setText(FreeCAD.Units.Quantity(float(Presets[i][3]),FreeCAD.Units.Length).UserString)
def rotate(self):
self.rotated = not self.rotated
class CommandPanelCut:
"the Arch Panel Cut command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Panel_Cut',
'MenuText': QT_TRANSLATE_NOOP("Arch_Panel_Cut","Panel Cut"),
'Accel': "P, C",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Panel_Cut","Creates 2D views of selected panels")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
if FreeCADGui.Selection.getSelection():
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Panel Cut")))
FreeCADGui.addModule("Arch")
for obj in FreeCADGui.Selection.getSelection():
if Draft.getType(obj) == "Panel":
FreeCADGui.doCommand("Arch.makePanelCut(FreeCAD.ActiveDocument."+obj.Name+")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class CommandPanelSheet:
"the Arch Panel Sheet command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Panel_Sheet',
'MenuText': QT_TRANSLATE_NOOP("Arch_Panel_Sheet","Panel Sheet"),
'Accel': "P, S",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Panel_Sheet","Creates a 2D sheet which can contain panel cuts")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Panel Sheet")))
FreeCADGui.addModule("Arch")
if FreeCADGui.Selection.getSelection():
l = "["
for obj in FreeCADGui.Selection.getSelection():
l += "FreeCAD.ActiveDocument."+obj.Name+","
l += "]"
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
FreeCADGui.doCommand("__objs__ = "+l)
FreeCADGui.doCommand("Arch.makePanelSheet(__objs__)")
FreeCADGui.doCommand("del __objs__")
else:
FreeCADGui.doCommand("Arch.makePanelSheet()")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _Panel(ArchComponent.Component):
"The Panel object"
@@ -1394,190 +1091,4 @@ class SheetTaskPanel(ArchComponent.ComponentTaskPanel):
FreeCADGui.runCommand("Draft_Edit")
class CommandNest:
"the Arch Panel command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Nest',
'MenuText': QT_TRANSLATE_NOOP("Arch_Nest","Nest"),
'Accel': "N, E",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Nest","Nests a series of selected shapes in a container")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
FreeCADGui.Control.closeDialog()
FreeCADGui.Control.showDialog(NestTaskPanel())
class NestTaskPanel:
'''The TaskPanel for Arch Nest command'''
def __init__(self,obj=None):
import ArchNesting
self.form = FreeCADGui.PySideUic.loadUi(":/ui/ArchNest.ui")
self.form.progressBar.hide()
self.form.ButtonPreview.setEnabled(False)
self.form.ButtonStop.setEnabled(False)
QtCore.QObject.connect(self.form.ButtonContainer,QtCore.SIGNAL("pressed()"),self.getContainer)
QtCore.QObject.connect(self.form.ButtonShapes,QtCore.SIGNAL("pressed()"),self.getShapes)
QtCore.QObject.connect(self.form.ButtonRemove,QtCore.SIGNAL("pressed()"),self.removeShapes)
QtCore.QObject.connect(self.form.ButtonStart,QtCore.SIGNAL("pressed()"),self.start)
QtCore.QObject.connect(self.form.ButtonStop,QtCore.SIGNAL("pressed()"),self.stop)
QtCore.QObject.connect(self.form.ButtonPreview,QtCore.SIGNAL("pressed()"),self.preview)
self.shapes = []
self.container = None
self.nester = None
self.temps = []
def reject(self):
self.stop()
self.clearTemps()
return True
def accept(self):
self.stop()
self.clearTemps()
if self.nester:
FreeCAD.ActiveDocument.openTransaction("Nesting")
self.nester.apply()
FreeCAD.ActiveDocument.commitTransaction()
return True
def clearTemps(self):
for t in self.temps:
if FreeCAD.ActiveDocument.getObject(t.Name):
FreeCAD.ActiveDocument.removeObject(t.Name)
self.temps = []
def getContainer(self):
s = FreeCADGui.Selection.getSelection()
if len(s) == 1:
if hasattr(s[0],'Shape'):
if len(s[0].Shape.Faces) == 1:
if not (s[0] in self.shapes):
self.form.Container.clear()
self.addObject(s[0],self.form.Container)
self.container = s[0]
else:
FreeCAD.Console.PrintError(translate("Arch","This object has no face"))
if Draft.getType(s[0]) == "PanelSheet":
if hasattr(s[0],"Rotations"):
if s[0].Rotations:
self.form.Rotations.setText(str(s[0].Rotations))
def getShapes(self):
s = FreeCADGui.Selection.getSelection()
for o in s:
if hasattr(o,'Shape'):
if not o in self.shapes:
if o != self.container:
self.addObject(o,self.form.Shapes)
self.shapes.append(o)
def addObject(self,obj,form):
i = QtGui.QListWidgetItem()
i.setText(obj.Label)
i.setToolTip(obj.Name)
if hasattr(obj.ViewObject,"Proxy"):
if hasattr(obj.ViewObject.Proxy,"getIcon"):
i.setIcon(QtGui.QIcon(obj.ViewObject.Proxy.getIcon()))
elif hasattr(obj.ViewObject, "Icon"):
i.setIcon(QtGui.QIcon(obj.ViewObject.Icon))
else:
i.setIcon(QtGui.QIcon(":/icons/Part_3D_object.svg"))
form.addItem(i)
def removeShapes(self):
for i in self.form.Shapes.selectedItems():
o = FreeCAD.ActiveDocument.getObject(i.toolTip())
if o:
if o in self.shapes:
self.shapes.remove(o)
self.form.Shapes.takeItem(self.form.Shapes.row(i))
def setCounter(self,value):
self.form.progressBar.setValue(value)
def start(self):
self.clearTemps()
self.form.progressBar.setFormat("pass 1: %p%")
self.form.progressBar.setValue(0)
self.form.progressBar.show()
tolerance = self.form.Tolerance.value()
discretize = self.form.Subdivisions.value()
rotations = [float(x) for x in self.form.Rotations.text().split(",")]
import ArchNesting
ArchNesting.TOLERANCE = tolerance
ArchNesting.DISCRETIZE = discretize
ArchNesting.ROTATIONS = rotations
self.nester = ArchNesting.Nester()
self.nester.addContainer(self.container)
self.nester.addObjects(self.shapes)
self.nester.setCounter = self.setCounter
self.form.ButtonStop.setEnabled(True)
self.form.ButtonStart.setEnabled(False)
self.form.ButtonPreview.setEnabled(False)
QtGui.QApplication.processEvents()
result = self.nester.run()
self.form.progressBar.hide()
self.form.ButtonStart.setEnabled(True)
self.form.ButtonStop.setEnabled(False)
if result:
self.form.ButtonPreview.setEnabled(True)
def stop(self):
if self.nester:
self.nester.stop()
self.form.ButtonStart.setEnabled(True)
self.form.ButtonStop.setEnabled(False)
self.form.ButtonPreview.setEnabled(False)
self.form.progressBar.hide()
def preview(self):
self.clearTemps()
if self.nester:
t = self.nester.show()
if t:
self.temps.extend(t)
if FreeCAD.GuiUp:
class CommandPanelGroup:
def GetCommands(self):
return tuple(['Arch_Panel','Arch_Panel_Cut','Arch_Panel_Sheet','Arch_Nest'])
def GetResources(self):
return { 'MenuText': QT_TRANSLATE_NOOP("Arch_PanelTools",'Panel tools'),
'ToolTip': QT_TRANSLATE_NOOP("Arch_PanelTools",'Panel tools')
}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
FreeCADGui.addCommand('Arch_Panel',CommandPanel())
FreeCADGui.addCommand('Arch_Panel_Cut',CommandPanelCut())
FreeCADGui.addCommand('Arch_Panel_Sheet',CommandPanelSheet())
FreeCADGui.addCommand('Arch_Nest',CommandNest())
FreeCADGui.addCommand('Arch_PanelTools', CommandPanelGroup())

View File

@@ -49,132 +49,6 @@ __author__ = "Yorik van Havre"
__url__ = "https://www.freecad.org"
def makePipe(baseobj=None,diameter=0,length=0,placement=None,name=None):
"makePipe([baseobj],[diameter],[length],[placement],[name]): creates an pipe object from the given base object"
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj= FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Pipe")
obj.Label = name if name else translate("Arch","Pipe")
_ArchPipe(obj)
if FreeCAD.GuiUp:
_ViewProviderPipe(obj.ViewObject)
if baseobj:
baseobj.ViewObject.hide()
if baseobj:
obj.Base = baseobj
else:
if length:
obj.Length = length
else:
obj.Length = 1000
if diameter:
obj.Diameter = diameter
else:
obj.Diameter = params.get_param_arch("PipeDiameter")
if placement:
obj.Placement = placement
return obj
def makePipeConnector(pipes,radius=0,name=None):
"makePipeConnector(pipes,[radius],[name]): creates a connector between the given pipes"
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj= FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Connector")
obj.Label = name if name else translate("Arch","Connector")
_ArchPipeConnector(obj)
obj.Pipes = pipes
if not radius:
radius = pipes[0].Diameter
obj.Radius = radius
if FreeCAD.GuiUp:
_ViewProviderPipe(obj.ViewObject)
return obj
class _CommandPipe:
"the Arch Pipe command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Pipe',
'MenuText': QT_TRANSLATE_NOOP("Arch_Pipe","Pipe"),
'Accel': "P, I",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Pipe","Creates a pipe object from a given Wire or Line")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
s = FreeCADGui.Selection.getSelection()
if s:
for obj in s:
if hasattr(obj,'Shape'):
if len(obj.Shape.Wires) == 1:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Pipe"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makePipe(FreeCAD.ActiveDocument."+obj.Name+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
else:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Pipe"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makePipe()")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _CommandPipeConnector:
"the Arch Pipe command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_PipeConnector',
'MenuText': QT_TRANSLATE_NOOP("Arch_PipeConnector","Connector"),
'Accel': "P, C",
'ToolTip': QT_TRANSLATE_NOOP("Arch_PipeConnector","Creates a connector between 2 or 3 selected pipes")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
import Draft
s = FreeCADGui.Selection.getSelection()
if not (len(s) in [2,3]):
FreeCAD.Console.PrintError(translate("Arch","Please select exactly 2 or 3 Pipe objects")+"\n")
return
o = "["
for obj in s:
if Draft.getType(obj) != "Pipe":
FreeCAD.Console.PrintError(translate("Arch","Please select only Pipe objects")+"\n")
return
o += "FreeCAD.ActiveDocument."+obj.Name+","
o += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Connector"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makePipeConnector("+o+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _ArchPipe(ArchComponent.Component):
@@ -509,19 +383,3 @@ class _ArchPipeConnector(ArchComponent.Component):
pipe.Proxy.execute(pipe)
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Pipe',_CommandPipe())
FreeCADGui.addCommand('Arch_PipeConnector',_CommandPipeConnector())
class _ArchPipeGroupCommand:
def GetCommands(self):
return tuple(['Arch_Pipe','Arch_PipeConnector'])
def GetResources(self):
return { 'MenuText': QT_TRANSLATE_NOOP("Arch_PipeTools",'Pipe tools'),
'ToolTip': QT_TRANSLATE_NOOP("Arch_PipeTools",'Pipe tools')
}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
FreeCADGui.addCommand('Arch_PipeTools', _ArchPipeGroupCommand())

View File

@@ -777,14 +777,14 @@ class _PrecastTaskPanel:
def __init__(self):
import FreeCADGui
from PySide import QtCore,QtGui,QtSvgWidgets
from PySide import QtCore,QtGui,QtSvg
self.form = QtGui.QWidget()
self.grid = QtGui.QGridLayout(self.form)
self.PrecastTypes = ["Beam","I-Beam","Pillar","Panel","Slab","Stairs"]
self.SlabTypes = ["Champagne","Hat"]
# image display
self.preview = QtSvgWidgets.QSvgWidget(":/ui/ParametersBeam.svg")
self.preview = QtSvg.QSvgWidget(":/ui/ParametersBeam.svg")
self.preview.setMaximumWidth(200)
self.preview.setMinimumHeight(120)
self.grid.addWidget(self.preview,0,0,1,2)
@@ -1263,7 +1263,7 @@ class _DentsTaskPanel:
def __init__(self):
import FreeCADGui
from PySide import QtCore,QtGui,QtSvgWidgets
from PySide import QtCore,QtGui,QtSvg
self.form = QtGui.QWidget()
self.grid = QtGui.QGridLayout(self.form)
self.Rotations = ["N","S","E","O"]
@@ -1282,7 +1282,7 @@ class _DentsTaskPanel:
self.grid.addWidget(self.buttonRemove,2,1,1,1)
# image display
self.preview = QtSvgWidgets.QSvgWidget(":/ui/ParametersDent.svg")
self.preview = QtSvg.QSvgWidget(":/ui/ParametersDent.svg")
self.preview.setMaximumWidth(200)
self.preview.setMinimumHeight(120)
self.grid.addWidget(self.preview,3,0,1,2)

View File

@@ -55,9 +55,9 @@ else:
# Presets in the form: Class, Name, Profile type, [profile data]
# Search for profiles.csv in data/Mod/Arch/Presets and in the same folder as this file
# and in the user path
profilefiles = [os.path.join(FreeCAD.getResourceDir(),"Mod","Arch","Presets","profiles.csv"),
profilefiles = [os.path.join(FreeCAD.getResourceDir(),"Mod","BIM","Presets","profiles.csv"),
os.path.join(os.path.dirname(__file__),"Presets","profiles.csv"),
os.path.join(FreeCAD.getUserAppDataDir(),"Arch","profiles.csv")]
os.path.join(FreeCAD.getUserAppDataDir(),"BIM","profiles.csv")]
def readPresets():
@@ -85,150 +85,6 @@ def readPresets():
print("Could not open ",profilefile)
return Presets
def makeProfile(profile=[0,'REC','REC100x100','R',100,100]):
'''makeProfile(profile): returns a shape with the face defined by the profile data'''
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython",profile[2])
obj.Label = profile[2]
if profile[3]=="C":
_ProfileC(obj, profile)
elif profile[3]=="H":
_ProfileH(obj, profile)
elif profile[3]=="R":
_ProfileR(obj, profile)
elif profile[3]=="RH":
_ProfileRH(obj, profile)
elif profile[3]=="U":
_ProfileU(obj, profile)
elif profile[3]=="L":
_ProfileL(obj, profile)
elif profile[3]=="T":
_ProfileT(obj, profile)
else :
print("Profile not supported")
if FreeCAD.GuiUp:
ViewProviderProfile(obj.ViewObject)
return obj
class Arch_Profile:
"""The FreeCAD Arch_Profile command definition"""
def GetResources(self):
return {'Pixmap' : 'Arch_Profile',
'MenuText': QT_TRANSLATE_NOOP("Arch_Profile","Profile"),
'Accel': "P, F",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Profile","Creates a profile")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
self.Profile = None
self.Categories = []
self.Presets = readPresets()
for pre in self.Presets:
if pre[1] not in self.Categories:
self.Categories.append(pre[1])
FreeCADGui.Snapper.getPoint(callback=self.getPoint,extradlg=[self.taskbox()],title=translate("Arch","Create profile"))
def taskbox(self):
"sets up a taskbox widget"
w = QtGui.QWidget()
ui = FreeCADGui.UiLoader()
w.setWindowTitle(translate("Arch","Profile settings"))
grid = QtGui.QGridLayout(w)
# categories box
labelc = QtGui.QLabel(translate("Arch","Category"))
self.vCategory = QtGui.QComboBox()
self.vCategory.addItems([" "] + self.Categories)
grid.addWidget(labelc,1,0,1,1)
grid.addWidget(self.vCategory,1,1,1,1)
# presets box
labelp = QtGui.QLabel(translate("Arch","Preset"))
self.vPresets = QtGui.QComboBox()
self.pSelect = [None]
fpresets = [" "]
self.vPresets.addItems(fpresets)
grid.addWidget(labelp,2,0,1,1)
grid.addWidget(self.vPresets,2,1,1,1)
# connect slots
self.vCategory.currentIndexChanged.connect(self.setCategory)
self.vPresets.currentIndexChanged.connect(self.setPreset)
# restore preset
stored = params.get_param_arch("StructurePreset")
if stored:
if ";" in stored:
stored = stored.split(";")
if len(stored) >= 3:
if stored[1] in self.Categories:
self.vCategory.setCurrentIndex(1+self.Categories.index(stored[1]))
self.setCategory(1+self.Categories.index(stored[1]))
ps = [p[2] for p in self.pSelect]
if stored[2] in ps:
self.vPresets.setCurrentIndex(ps.index(stored[2]))
return w
def getPoint(self,point=None,obj=None):
"this function is called by the snapper when it has a 3D point"
if not point:
return
if not self.Profile:
return
pt = "FreeCAD.Vector("+str(point.x)+","+str(point.y)+","+str(point.z)+")"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Profile"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand('p = Arch.makeProfile('+str(self.Profile)+')')
FreeCADGui.doCommand('p.Placement.move('+pt+')')
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(p)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
def setCategory(self,i):
self.vPresets.clear()
if i == 0:
self.pSelect = [None]
self.vPresets.addItems([" "])
params.set_param_arch("StructurePreset","")
else:
self.pSelect = [p for p in self.Presets if p[1] == self.Categories[i-1]]
fpresets = []
for p in self.pSelect:
f = FreeCAD.Units.Quantity(p[4],FreeCAD.Units.Length).getUserPreferred()
d = params.get_param("Decimals",path="Units")
s1 = str(round(p[4]/f[1],d))
s2 = str(round(p[5]/f[1],d))
s3 = str(f[2])
fpresets.append(p[2]+" ("+s1+"x"+s2+s3+")")
self.vPresets.addItems(fpresets)
self.setPreset(0)
def setPreset(self,i):
self.Profile = None
elt = self.pSelect[i]
if elt:
p=elt[0]-1 # Presets indexes are 1-based
self.Profile = self.Presets[p]
params.set_param_arch("StructurePreset",";".join([str(i) for i in self.Profile]))
class _Profile(Draft._DraftObject):
@@ -611,6 +467,3 @@ class ProfileTaskPanel:
self.form.setWindowTitle(self.type+" "+QtGui.QApplication.translate("Arch", "Profile", None))
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Profile',Arch_Profile())

View File

@@ -48,89 +48,6 @@ __title__ = "FreeCAD Project"
__author__ = "Yorik van Havre"
__url__ = "https://www.freecad.org"
def makeProject(sites=None, name=None):
"""Create an Arch project.
If sites are provided, add them as children of the new project.
Parameters
----------
sites: list of <Part::FeaturePython>, optional
Sites to add as children of the project. Ultimately this could be
anything, however.
name: str, optional
The label for the project.
Returns
-------
<Part::FeaturePython>
The created project.
"""
if not FreeCAD.ActiveDocument:
return FreeCAD.Console.PrintError("No active document. Aborting\n")
import Part
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Project")
obj.Label = name if name else translate("Arch", "Project")
_Project(obj)
if FreeCAD.GuiUp:
_ViewProviderProject(obj.ViewObject)
if sites:
obj.Group = sites
return obj
class _CommandProject:
"""The command definition for the Arch workbench's gui tool, Arch Project.
A tool for creating Arch projects.
Creates a project from the objects selected by the user that have the Site
IfcType, if any.
Find documentation on the end user usage of Arch Project here:
https://wiki.freecad.org/Arch_Project
"""
def GetResources(self):
"""Return a dictionary with the visual aspects of the Arch Project tool."""
return {'Pixmap' : 'Arch_Project',
'MenuText': QT_TRANSLATE_NOOP("Arch_Project", "Project"),
'Accel': "P, O",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Project", "Creates a project entity aggregating the selected sites.")}
def IsActive(self):
"""Determine whether or not the Arch Project tool is active.
Inactive commands are indicated by a greyed-out icon in the menus and toolbars.
"""
return not FreeCAD.ActiveDocument is None
def Activated(self):
"""Executed when Arch Project is called.
Create a project from the objects selected by the user that have the
Site IfcType, if any.
"""
selection = FreeCADGui.Selection.getSelection()
siteobj = []
for obj in selection:
if hasattr(obj, "IfcType") and obj.IfcType == "Site":
siteobj.append(obj)
ss = "[ "
for o in siteobj:
ss += "FreeCAD.ActiveDocument." + o.Name + ", "
ss += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Project"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makeProject("+ss+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _Project(ArchIFC.IfcContext):
"""The project object.
@@ -219,6 +136,3 @@ class _ViewProviderProject(ArchIFCView.IfcContextView):
def onChanged(self,vobj,prop):
self.removeDisplaymodeChildNodes(vobj)
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Project', _CommandProject())

View File

@@ -39,6 +39,10 @@ else:
return txt
# \endcond
# for Rebar addon compatibility
from bimcommands import BimRebar
_CommandRebar = BimRebar.Arch_Rebar
## @package ArchRebar
# \ingroup ARCH
# \brief The Rebar object and tools
@@ -52,117 +56,6 @@ __author__ = "Yorik van Havre"
__url__ = "https://www.freecad.org"
def makeRebar(baseobj=None,sketch=None,diameter=None,amount=1,offset=None,name=None):
"""makeRebar([baseobj],[sketch],[diameter],[amount],[offset],[name]): adds a Reinforcement Bar object
to the given structural object, using the given sketch as profile."""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Rebar")
obj.Label = name if name else translate("Arch","Rebar")
_Rebar(obj)
if FreeCAD.GuiUp:
_ViewProviderRebar(obj.ViewObject)
if baseobj and sketch:
if hasattr(sketch,"AttachmentSupport"):
if sketch.AttachmentSupport:
if isinstance(sketch.AttachmentSupport,tuple):
if sketch.AttachmentSupport[0] == baseobj:
sketch.AttachmentSupport = None
elif sketch.AttachmentSupport == baseobj:
sketch.AttachmentSupport = None
obj.Base = sketch
if FreeCAD.GuiUp:
sketch.ViewObject.hide()
obj.Host = baseobj
elif sketch and not baseobj:
# a rebar could be based on a wire without the existence of a Structure
obj.Base = sketch
if FreeCAD.GuiUp:
sketch.ViewObject.hide()
obj.Host = None
elif baseobj and not sketch:
obj.Shape = baseobj.Shape
if diameter:
obj.Diameter = diameter
else:
obj.Diameter = params.get_param_arch("RebarDiameter")
obj.Amount = amount
obj.Document.recompute()
if offset is not None:
obj.OffsetStart = offset
obj.OffsetEnd = offset
else:
obj.OffsetStart = params.get_param_arch("RebarOffset")
obj.OffsetEnd = params.get_param_arch("RebarOffset")
obj.Mark = obj.Label
return obj
class _CommandRebar:
"the Arch Rebar command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Rebar',
'MenuText': QT_TRANSLATE_NOOP("Arch_Rebar","Custom Rebar"),
'Accel': "R, B",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Rebar","Creates a Reinforcement bar from the selected face of solid object and/or a sketch")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelectionEx()
if sel:
obj = sel[0].Object
if hasattr(obj,"Shape") and obj.Shape.Solids:
# this is our host object
if len(sel) > 1:
sk = sel[1].Object
if hasattr(sk,'Shape'):
if len(sk.Shape.Wires) == 1:
# we have a structure and a wire: create the rebar now
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Rebar"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeRebar(FreeCAD.ActiveDocument."+obj.Name+",FreeCAD.ActiveDocument."+sk.Name+")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
else:
# we have only a structure: open the sketcher
FreeCADGui.activateWorkbench("SketcherWorkbench")
FreeCADGui.runCommand("Sketcher_NewSketch")
FreeCAD.ArchObserver = ArchComponent.ArchSelectionObserver(obj,FreeCAD.ActiveDocument.Objects[-1],hide=False,nextCommand="Arch_Rebar")
FreeCADGui.Selection.addObserver(FreeCAD.ArchObserver)
return
elif hasattr(obj,'Shape'):
if len(obj.Shape.Wires) == 1:
# we have only a wire: extract its support object, if available, and make the rebar
support = "None"
if hasattr(obj,"AttachmentSupport"):
if obj.AttachmentSupport:
if len(obj.AttachmentSupport) != 0:
support = "FreeCAD.ActiveDocument."+obj.AttachmentSupport[0][0].Name
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Rebar"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeRebar("+support+",FreeCAD.ActiveDocument."+obj.Name+")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
FreeCAD.Console.PrintMessage(translate("Arch","Please select a base face on a structural object")+"\n")
FreeCADGui.Control.closeDialog()
FreeCADGui.Control.showDialog(ArchComponent.SelectionTaskPanel())
FreeCAD.ArchObserver = ArchComponent.ArchSelectionObserver(nextCommand="Arch_Rebar")
FreeCADGui.Selection.addObserver(FreeCAD.ArchObserver)
class _Rebar(ArchComponent.Component):
"A parametric reinforcement bar (rebar) object"
@@ -676,5 +569,3 @@ def getLengthOfRebar(rebar):
FreeCAD.Console.PrintError("Cannot calculate rebar length from its base object\n")
return None
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Rebar',_CommandRebar())

View File

@@ -52,29 +52,6 @@ else:
# another file.
def makeReference(filepath=None, partname=None, name=None):
"""makeReference([filepath],[partname],[name]): Creates an Arch Reference object"""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","ArchReference")
obj.Label = name if name else translate("Arch","External Reference")
ArchReference(obj)
if FreeCAD.GuiUp:
ViewProviderArchReference(obj.ViewObject)
if filepath:
obj.File = filepath
if partname:
obj.Part = partname
import Draft
Draft.select(obj)
return obj
class ArchReference:
"""The Arch Reference object"""
@@ -197,8 +174,8 @@ class ArchReference:
if not ifcfile:
return
try:
import ifc_tools
import ifc_generator
from nativeifc import ifc_tools
from nativeifc import ifc_generator
except:
t = translate("Arch","NativeIFC not available - unable to process IFC files")
FreeCAD.Console.PrintError(t+"\n")
@@ -244,7 +221,7 @@ class ArchReference:
"""returns IFC elements for this object"""
try:
import ifc_generator
from nativeifc import ifc_generator
except:
t = translate("Arch","NativeIFC not available - unable to process IFC files")
FreeCAD.Console.PrintError(t+"\n")
@@ -852,8 +829,8 @@ class ViewProviderArchReference:
"""Sets the coin node of this object from an IFC file"""
try:
import ifc_tools
import ifc_generator
from nativeifc import ifc_tools
from nativeifc import ifc_generator
except:
t = translate("Arch","NativeIFC not available - unable to process IFC files")
FreeCAD.Console.PrintError(t+"\n")
@@ -957,7 +934,7 @@ class ArchReferenceTaskPanel:
filters = "*.FCStd *.dxf"
# enable IFC support if NativeIFC is present
try:
import ifc_tools
from nativeifc import ifc_tools
except:
pass
else:
@@ -995,34 +972,4 @@ class ArchReferenceTaskPanel:
FreeCADGui.ActiveDocument.resetEdit()
class ArchReferenceCommand:
"the Arch Reference command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Reference',
'MenuText': QT_TRANSLATE_NOOP("Arch_Reference","External reference"),
'Accel': "E, X",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Reference","Creates an external reference object")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create external reference"))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("obj = Arch.makeReference()")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCADGui.doCommand("obj.ViewObject.Document.setEdit(obj.ViewObject, 0)")
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Reference', ArchReferenceCommand())

View File

@@ -144,107 +144,6 @@ def face_from_points(ptLst):
return Part.Face(wire)
def makeRoof(baseobj=None,
facenr=0,
angles=[45.0], run=[250.0], idrel=[-1], thickness=[50.0], overhang=[100.0],
name=None):
'''makeRoof(baseobj, [facenr], [angle], [name]): Makes a roof based on
a closed wire or an object.
You can provide a list of angles, run, idrel, thickness, overhang for
each edge in the wire to define the roof shape. The default for angle is
45 and the list is automatically completed to match the number of edges
in the wire.
If the base object is a solid the roof uses its shape.
'''
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Roof")
obj.Label = name if name else translate("Arch", "Roof")
baseWire = None
_Roof(obj)
if FreeCAD.GuiUp:
_ViewProviderRoof(obj.ViewObject)
if baseobj:
obj.Base = baseobj
if hasattr(obj.Base, "Shape"):
if obj.Base.Shape.Solids:
if FreeCAD.GuiUp:
obj.Base.ViewObject.hide()
else:
if (obj.Base.Shape.Faces and obj.Face):
baseWire = obj.Base.Shape.Faces[obj.Face-1].Wires[0]
if FreeCAD.GuiUp:
obj.Base.ViewObject.hide()
elif obj.Base.Shape.Wires:
baseWire = obj.Base.Shape.Wires[0]
if FreeCAD.GuiUp:
obj.Base.ViewObject.hide()
if baseWire:
if baseWire.isClosed():
if FreeCAD.GuiUp:
obj.Base.ViewObject.hide()
edges = Part.__sortEdges__(baseWire.Edges)
ln = len(edges)
obj.Angles = adjust_list_len(angles, ln, angles[0])
obj.Runs = adjust_list_len(run, ln, run[0])
obj.IdRel = adjust_list_len(idrel, ln, idrel[0])
obj.Thickness = adjust_list_len(thickness, ln, thickness[0])
obj.Overhang = adjust_list_len(overhang, ln, overhang[0])
obj.Face = facenr
return obj
class _CommandRoof:
'''the Arch Roof command definition'''
def GetResources(self):
return {"Pixmap" : "Arch_Roof",
"MenuText": QT_TRANSLATE_NOOP("Arch_Roof", "Roof"),
"Accel" : "R, F",
"ToolTip" : QT_TRANSLATE_NOOP("Arch_Roof", "Creates a roof object from the selected wire.")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelectionEx()
if sel:
sel = sel[0]
obj = sel.Object
FreeCADGui.Control.closeDialog()
if sel.HasSubObjects:
if "Face" in sel.SubElementNames[0]:
i = int(sel.SubElementNames[0][4:])
FreeCAD.ActiveDocument.openTransaction(translate("Arch", "Create Roof"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makeRoof(FreeCAD.ActiveDocument." + obj.Name + "," + str(i) + ")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
if hasattr(obj, "Shape"):
if obj.Shape.Wires:
FreeCAD.ActiveDocument.openTransaction(translate("Arch", "Create Roof"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makeRoof(FreeCAD.ActiveDocument." + obj.Name + ")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
else:
FreeCAD.Console.PrintMessage(translate("Arch", "Unable to create a roof"))
else:
FreeCAD.Console.PrintMessage(translate("Arch", "Please select a base object") + "\n")
FreeCADGui.Control.showDialog(ArchComponent.SelectionTaskPanel())
FreeCAD.ArchObserver = ArchComponent.ArchSelectionObserver(nextCommand = "Arch_Roof")
FreeCADGui.Selection.addObserver(FreeCAD.ArchObserver)
class _Roof(ArchComponent.Component):
'''The Roof object'''
@@ -1053,6 +952,3 @@ class _RoofTaskPanel:
QtGui.QApplication.translate("Arch", "Overhang (mm)", None),
QtGui.QApplication.translate("Arch", "Height (mm)", None)])
if FreeCAD.GuiUp:
FreeCADGui.addCommand("Arch_Roof", _CommandRoof())

View File

@@ -53,28 +53,6 @@ verbose = True # change this for silent recomputes
class CommandArchSchedule:
"the Arch Schedule command definition"
def GetResources(self):
return {'Pixmap': 'Arch_Schedule',
'MenuText': QT_TRANSLATE_NOOP("Arch_Schedule","Schedule"),
'ToolTip': QT_TRANSLATE_NOOP("Arch_Schedule","Creates a schedule to collect data from the model")}
def Activated(self):
if hasattr(self,"taskd"):
if self.taskd:
self.taskd.form.hide()
self.taskd = ArchScheduleTaskPanel()
def IsActive(self):
if FreeCAD.ActiveDocument:
return True
else:
return False
class _ArchScheduleDocObserver:
"doc observer to monitor all recomputes"
@@ -769,5 +747,3 @@ class ArchScheduleTaskPanel:
FreeCAD.ActiveDocument.recompute()
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Schedule',CommandArchSchedule())

View File

@@ -57,34 +57,6 @@ else:
ISRENDERING = False # flag to prevent concurrent runs of the coin renderer
def makeSectionPlane(objectslist=None,name=None):
"""makeSectionPlane([objectslist],[name]) : Creates a Section plane objects including the
given objects. If no object is given, the whole document will be considered."""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","Section")
obj.Label = name if name else translate("Arch","Section")
_SectionPlane(obj)
if FreeCAD.GuiUp:
_ViewProviderSectionPlane(obj.ViewObject)
if objectslist:
obj.Objects = objectslist
bb = FreeCAD.BoundBox()
for o in Draft.get_group_contents(objectslist):
if hasattr(o,"Shape") and hasattr(o.Shape,"BoundBox"):
bb.add(o.Shape.BoundBox)
import WorkingPlane
obj.Placement = WorkingPlane.get_working_plane().get_placement()
obj.Placement.Base = bb.Center
if FreeCAD.GuiUp:
margin = bb.XLength*0.1
obj.ViewObject.DisplayLength = bb.XLength+margin
obj.ViewObject.DisplayHeight = bb.YLength+margin
return obj
def getSectionData(source):
@@ -825,38 +797,6 @@ def closeViewer(name):
sw.close()
class _CommandSectionPlane:
"the Arch SectionPlane command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_SectionPlane',
'Accel': "S, E",
'MenuText': QT_TRANSLATE_NOOP("Arch_SectionPlane","Section Plane"),
'ToolTip': QT_TRANSLATE_NOOP("Arch_SectionPlane","Creates a section plane object, including the selected objects")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
ss = "["
for o in sel:
if len(ss) > 1:
ss += ","
ss += "FreeCAD.ActiveDocument."+o.Name
ss += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Section Plane"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("section = Arch.makeSectionPlane("+ss+")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _SectionPlane:
"A section plane object"
@@ -1398,5 +1338,3 @@ class SectionPlaneTaskPanel:
self.recenterButton.setText(QtGui.QApplication.translate("Arch", "Center", None))
self.recenterButton.setToolTip(QtGui.QApplication.translate("Arch", "Centers the plane on the objects in the list above", None))
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_SectionPlane',_CommandSectionPlane())

View File

@@ -61,31 +61,6 @@ __author__ = "Yorik van Havre"
__url__ = "https://www.freecad.org"
def makeSite(objectslist=None,baseobj=None,name=None):
'''makeBuilding([objectslist],[baseobj],[name]): creates a site including the
objects from the given list.'''
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
import Part
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Site")
obj.Label = name if name else translate("Arch","Site")
_Site(obj)
if FreeCAD.GuiUp:
_ViewProviderSite(obj.ViewObject)
if objectslist:
obj.Group = objectslist
if baseobj:
import Part
if isinstance(baseobj,Part.Shape):
obj.Shape = baseobj
else:
obj.Terrain = baseobj
return obj
def toNode(shape):
"""builds a linear pivy node from a shape"""
@@ -503,57 +478,6 @@ class Compass(object):
return coords
class _CommandSite:
"the Arch Site command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Site',
'MenuText': QT_TRANSLATE_NOOP("Arch_Site","Site"),
'Accel': "S, I",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Site","Creates a site including selected objects.")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
link = params.get_param_arch("FreeLinking")
siteobj = []
warning = False
for obj in sel:
if (Draft.getType(obj) == "Building") or (hasattr(obj,"IfcType") and obj.IfcType == "Building"):
siteobj.append(obj)
else:
if link:
siteobj.append(obj)
else:
warning = True
if warning:
message = translate( "Arch" , "Please either select only Building objects or nothing at all!\n\
Site is not allowed to accept any other object besides Building.\n\
Other objects will be removed from the selection.\n\
Note: You can change that in the preferences.")
ArchCommands.printMessage( message )
if sel and len(siteobj) == 0:
message = translate( "Arch" , "There is no valid object in the selection.\n\
Site creation aborted.") + "\n"
ArchCommands.printMessage( message )
else:
ss = "[ "
for o in siteobj:
ss += "FreeCAD.ActiveDocument." + o.Name + ", "
ss += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Site"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makeSite("+ss+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
@@ -1242,6 +1166,3 @@ class _ViewProviderSite:
return None
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Site',_CommandSite())

View File

@@ -172,33 +172,7 @@ else:
# Spaces define an open volume inside or outside a
# building, ie. a room.
def makeSpace(objects=None,baseobj=None,name=None):
"""makeSpace([objects],[baseobj],[name]): Creates a space object from the given objects.
Objects can be one document object, in which case it becomes the base shape of the space
object, or a list of selection objects as got from getSelectionEx(), or a list of tuples
(object, subobjectname)"""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Space")
obj.Label = name if name else translate("Arch","Space")
_Space(obj)
if FreeCAD.GuiUp:
_ViewProviderSpace(obj.ViewObject)
if baseobj:
objects = baseobj
if objects:
if not isinstance(objects,list):
objects = [objects]
if len(objects) == 1:
obj.Base = objects[0]
if FreeCAD.GuiUp:
objects[0].ViewObject.hide()
else:
obj.Proxy.addSubobjects(obj,objects)
return obj
def addSpaceBoundaries(space,subobjects):
@@ -222,42 +196,6 @@ def removeSpaceBoundaries(space,objects):
break
space.Boundaries = bounds
class _CommandSpace:
"the Arch Space command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Space',
'MenuText': QT_TRANSLATE_NOOP("Arch_Space","Space"),
'Accel': "S, P",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Space","Creates a space object from selected boundary objects")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Space"))
FreeCADGui.addModule("Arch")
sel = FreeCADGui.Selection.getSelection()
if sel:
FreeCADGui.Control.closeDialog()
if len(sel) == 1:
FreeCADGui.doCommand("obj = Arch.makeSpace(FreeCADGui.Selection.getSelection())")
else:
FreeCADGui.doCommand("obj = Arch.makeSpace(FreeCADGui.Selection.getSelectionEx())")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
else:
FreeCAD.Console.PrintMessage(translate("Arch","Please select a base object")+"\n")
FreeCADGui.Control.showDialog(ArchComponent.SelectionTaskPanel())
FreeCAD.ArchObserver = ArchComponent.ArchSelectionObserver(nextCommand="Arch_Space")
FreeCADGui.Selection.addObserver(FreeCAD.ArchObserver)
class _Space(ArchComponent.Component):
@@ -727,7 +665,7 @@ class _ViewProviderSpace(ArchComponent.ViewProviderComponent):
elif prop == "ShapeColor":
if hasattr(vobj,"ShapeColor"):
self.fmat.diffuseColor.setValue((vobj.ShapeColor[0],vobj.ShapeColor[1],vobj.ShapeColor[2]))
self.fmat = vobj.ShapeColor.getValue()
elif prop == "Transparency":
if hasattr(vobj,"Transparency"):
@@ -839,7 +777,3 @@ class SpaceTaskPanel(ArchComponent.ComponentTaskPanel):
break
self.obj.Boundaries = bounds
self.updateBoundaries()
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Space',_CommandSpace())

View File

@@ -51,197 +51,6 @@ else:
zeroMM = FreeCAD.Units.Quantity('0mm')
def makeStairs(baseobj=None,length=None,width=None,height=None,steps=None,name=None):
"""makeStairs([baseobj],[length],[width],[height],[steps],[name]): creates a Stairs
objects with given attributes."""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
stairs = []
additions = []
label = name if name else translate("Arch","Stairs")
def setProperty(obj,length,width,height,steps):
if length:
obj.Length = length
else:
obj.Length = params.get_param_arch("StairsLength")
if width:
obj.Width = width
else:
obj.Width = params.get_param_arch("StairsWidth")
if height:
obj.Height = height
else:
obj.Height = params.get_param_arch("StairsHeight")
if steps:
obj.NumberOfSteps = steps
obj.Structure = "Massive"
obj.StructureThickness = 150
obj.DownSlabThickness = 150
obj.UpSlabThickness = 150
obj.RailingOffsetLeft = 60
obj.RailingOffsetRight = 60
obj.RailingHeightLeft = 900
obj.RailingHeightRight = 900
if baseobj:
if not isinstance(baseobj,list):
baseobj = [baseobj]
lenSelection = len(baseobj)
if lenSelection > 1:
stair = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Stairs")
stair.Label = label
_Stairs(stair)
stairs.append(stair)
stairs[0].Label = label
i = 1
else:
i = 0
for baseobjI in baseobj:
stair = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Stairs")
stair.Label = label
_Stairs(stair)
stairs.append(stair)
stairs[i].Label = label
stairs[i].Base = baseobjI
if len(baseobjI.Shape.Edges) > 1:
stepsI = 1 #'landing' if 'multi-edges' currently
elif steps:
stepsI = steps
else:
stepsI = 20
setProperty(stairs[i],None,width,height,stepsI)
if i > 1:
additions.append(stairs[i])
stairs[i].LastSegment = stairs[i-1]
else:
if len(stairs) > 1: # i.e. length >1, have a 'master' staircase created
stairs[0].Base = stairs[1]
i += 1
if lenSelection > 1:
stairs[0].Additions = additions
else:
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Stairs")
obj.Label = label
_Stairs(obj)
setProperty(obj,length,width,height,steps)
stairs.append(obj)
if FreeCAD.GuiUp:
if baseobj:
for stair in stairs:
_ViewProviderStairs(stair.ViewObject)
else:
_ViewProviderStairs(obj.ViewObject)
if stairs:
for stair in stairs:
stair.recompute()
makeRailing(stairs)
# return stairs - all other functions expect one object as return value
return stairs[0]
else:
obj.recompute()
return obj
def makeRailing(stairs):
"simple make Railing function testing"
def makeRailingLorR(stairs,side="L"):
for stair in reversed(stairs):
if side == "L":
outlineLR = stair.OutlineLeft
outlineLRAll = stair.OutlineLeftAll
stairRailingLR = "RailingLeft"
elif side == "R":
outlineLR = stair.OutlineRight
outlineLRAll = stair.OutlineRightAll
stairRailingLR = "RailingRight"
if outlineLR or outlineLRAll:
lrRail = ArchPipe.makePipe(baseobj=None,diameter=0,length=0,placement=None,name=translate("Arch","Railing"))
if outlineLRAll:
setattr(stair, stairRailingLR, lrRail)
break
elif outlineLR:
setattr(stair, stairRailingLR, lrRail)
if stairs is None:
sel = FreeCADGui.Selection.getSelection()
sel0 = sel[0]
stairs = []
# TODO currently consider 1st selected object, then would tackle multiple objects?
if Draft.getType(sel[0]) == "Stairs":
stairs.append(sel0)
if Draft.getType(sel0.Base) == "Stairs":
stairs.append(sel0.Base)
additions = sel0.Additions
for additionsI in additions:
if Draft.getType(additionsI) == "Stairs":
stairs.append(additionsI)
else:
stairs.append(sel[0])
else:
print("No Stairs object selected")
return
makeRailingLorR(stairs,"L")
makeRailingLorR(stairs,"R")
class _CommandStairs:
"the Arch Stairs command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Stairs',
'MenuText': QT_TRANSLATE_NOOP("Arch_Stairs","Stairs"),
'Accel': "S, R",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Stairs","Creates a flight of stairs")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Stairs"))
FreeCADGui.addModule("Arch")
# a list of 'segment' / 'flight' of stairs
stairs = []
additions = []
if len(FreeCADGui.Selection.getSelection()) > 0:
n = []
nStr = ""
for obj in FreeCADGui.Selection.getSelection():
n.append(obj.Name) # would no longer use
if nStr != "":
nStr = nStr + ","
nStr = nStr + "FreeCAD.ActiveDocument." + obj.Name
FreeCADGui.doCommand("obj = Arch.makeStairs(baseobj=["+nStr+"])")
else:
FreeCADGui.doCommand("obj = Arch.makeStairs(steps="+str(params.get_param_arch("StairsSteps"))+")")
FreeCADGui.addModule("Draft")
for obj in stairs:
Draft.autogroup(obj) # seems not working?
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _Stairs(ArchComponent.Component):
@@ -1521,5 +1330,3 @@ class _ViewProviderStairs(ArchComponent.ViewProviderComponent):
return []
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Stairs',_CommandStairs())

View File

@@ -24,6 +24,7 @@ import FreeCAD,Draft,ArchComponent,DraftVecUtils,ArchCommands
from FreeCAD import Vector
import ArchProfile
from draftutils import params
from draftutils import gui_utils
if FreeCAD.GuiUp:
import FreeCADGui
@@ -342,7 +343,7 @@ class _CommandStructure:
self.bpoint = point
FreeCADGui.Snapper.getPoint(last=point,callback=self.getPoint,movecallback=self.update,extradlg=[self.taskbox(),self.precast.form,self.dents.form],title=translate("Arch","Next point")+":",mode="line")
return
self.tracker.finalize()
self.tracker.off()
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
horiz = True # determines the type of rotation to apply to the final object
@@ -410,6 +411,8 @@ class _CommandStructure:
FreeCADGui.doCommand("Draft.autogroup(s)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
gui_utils.end_all_events()
self.tracker.finalize()
if self.continueCmd:
self.Activated()

View File

@@ -51,86 +51,6 @@ rodmodes = ("/|/|/|",
"/|\\|/|\\",
)
def makeTruss(baseobj=None,name=None):
"""
makeTruss([baseobj],[name]): Creates a space object from the given object (a line)
"""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Truss")
obj.Label = name if name else translate("Arch","Truss")
Truss(obj)
if FreeCAD.GuiUp:
ViewProviderTruss(obj.ViewObject)
if baseobj:
obj.Base = baseobj
if FreeCAD.GuiUp:
baseobj.ViewObject.hide()
return obj
class CommandArchTruss:
"the Arch Truss command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_Truss',
'MenuText': QT_TRANSLATE_NOOP("Arch_Truss","Truss"),
'Accel': "T, U",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Truss","Creates a truss object from selected line or from scratch")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if len(sel) > 1:
FreeCAD.Console.PrintError(translate("Arch","Please select only one base object or none")+"\n")
elif len(sel) == 1:
# build on selection
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Truss"))
FreeCADGui.addModule("Draft")
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("obj = Arch.makeTruss(FreeCAD.ActiveDocument."+FreeCADGui.Selection.getSelection()[0].Name+")")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
else:
# interactive line drawing
self.points = []
import WorkingPlane
WorkingPlane.get_working_plane()
if hasattr(FreeCADGui,"Snapper"):
FreeCADGui.Snapper.getPoint(callback=self.getPoint)
def getPoint(self,point=None,obj=None):
"""Callback for clicks during interactive mode"""
if point is None:
# cancelled
return
self.points.append(point)
if len(self.points) == 1:
FreeCADGui.Snapper.getPoint(last=self.points[0],callback=self.getPoint)
elif len(self.points) == 2:
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Truss"))
FreeCADGui.addModule("Draft")
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("base = Draft.makeLine(FreeCAD."+str(self.points[0])+",FreeCAD."+str(self.points[1])+")")
FreeCADGui.doCommand("obj = Arch.makeTruss(base)")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class Truss(ArchComponent.Component):
@@ -407,6 +327,3 @@ class ViewProviderTruss(ArchComponent.ViewProviderComponent):
import Arch_rc
return ":/icons/Arch_Truss_Tree.svg"
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Truss',CommandArchTruss())

View File

@@ -59,151 +59,7 @@ __title__ = "FreeCAD Wall"
__author__ = "Yorik van Havre"
__url__ = "https://www.freecad.org"
def makeWall(baseobj=None,height=None,length=None,width=None,align=None,face=None,name=None):
"""Create a wall based on a given object, and returns the generated wall.
TODO: It is unclear what defines which units this function uses.
Parameters
----------
baseobj: <Part::PartFeature>, optional
The base object with which to build the wall. This can be a sketch, a
draft object, a face, or a solid. It can also be left as None.
height: float, optional
The height of the wall.
length: float, optional
The length of the wall. Not used if the wall is based off an object.
Will use Arch default if left empty.
width: float, optional
The width of the wall. Not used if the base object is a face. Will use
Arch default if left empty.
align: str, optional
Either "Center", "Left", or "Right". Effects the alignment of the wall
on its baseline.
face: int, optional
The index number of a face on the given baseobj, to base the wall on.
name: str, optional
The name to give to the created wall.
Returns
-------
<Part::FeaturePython>
Returns the generated wall.
Notes
-----
Creates a new <Part::FeaturePython> object, and turns it into a parametric wall
object. This <Part::FeaturePython> object does not yet have any shape.
The wall then uses the baseobj.Shape as the basis to extrude out a wall shape,
giving the new <Part::FeaturePython> object a shape.
It then hides the original baseobj.
"""
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Wall")
if name:
obj.Label = name
else:
obj.Label = translate("Arch","Wall")
_Wall(obj)
if FreeCAD.GuiUp:
_ViewProviderWall(obj.ViewObject)
if baseobj:
if hasattr(baseobj,'Shape') or baseobj.isDerivedFrom("Mesh::Feature"):
obj.Base = baseobj
else:
FreeCAD.Console.PrintWarning(str(translate("Arch","Walls can only be based on Part or Mesh objects")))
if face:
obj.Face = face
if length:
obj.Length = length
if width:
obj.Width = width
else:
obj.Width = params.get_param_arch("WallWidth")
if height:
obj.Height = height
else:
obj.Height = params.get_param_arch("WallHeight")
if align:
obj.Align = align
else:
obj.Align = ["Center","Left","Right"][params.get_param_arch("WallAlignment")]
if obj.Base and FreeCAD.GuiUp:
if Draft.getType(obj.Base) != "Space":
obj.Base.ViewObject.hide()
return obj
def joinWalls(walls,delete=False):
"""Join the given list of walls into one sketch-based wall.
Take the first wall in the list, and adds on the other walls in the list.
Return the modified first wall.
Setting delete to True, will delete the other walls. Only join walls
if the walls have the same width, height and alignment.
Parameters
----------
walls: list of <Part::FeaturePython>
List containing the walls to add to the first wall in the list. Walls must
be based off a base object.
delete: bool, optional
If True, deletes the other walls in the list.
Returns
-------
<Part::FeaturePython>
"""
import Part
if not walls:
return None
if not isinstance(walls,list):
walls = [walls]
if not areSameWallTypes(walls):
return None
deleteList = []
base = walls.pop()
if base.Base:
if base.Base.Shape.Faces:
return None
# Use ArchSketch if SketchArch add-on is present
if Draft.getType(base.Base) == "ArchSketch":
sk = base.Base
else:
try:
import ArchSketchObject
newSk=ArchSketchObject.makeArchSketch()
except:
if Draft.getType(base.Base) != "Sketcher::SketchObject":
newSk=FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject","WallTrace")
else:
newSk=None
if newSk:
sk = Draft.makeSketch(base.Base,autoconstraints=True, addTo=newSk)
base.Base = sk
else:
sk = base.Base
for w in walls:
if w.Base:
if not w.Base.Shape.Faces:
for e in w.Base.Shape.Edges:
l = e.Curve
if isinstance(l,Part.Line):
l = Part.LineSegment(e.Vertexes[0].Point,e.Vertexes[-1].Point)
sk.addGeometry(l)
deleteList.append(w.Name)
if delete:
for n in deleteList:
FreeCAD.ActiveDocument.removeObject(n)
FreeCAD.ActiveDocument.recompute()
base.ViewObject.show()
return base
def mergeShapes(w1,w2):
"""Not currently implemented.
@@ -265,447 +121,6 @@ def areSameWallTypes(walls):
return True
class _CommandWall:
"""The command definition for the Arch workbench's gui tool, Arch Wall.
A tool for creating Arch walls.
Create a wall from the object selected by the user. If no objects are
selected, enter an interactive mode to create a wall using selected points
to create a base.
Find documentation on the end user usage of Arch Wall here:
https://wiki.freecad.org/Arch_Wall
"""
def GetResources(self):
"""Returns a dictionary with the visual aspects of the Arch Wall tool."""
return {'Pixmap' : 'Arch_Wall',
'MenuText': QT_TRANSLATE_NOOP("Arch_Wall","Wall"),
'Accel': "W, A",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Wall","Creates a wall object from scratch or from a selected object (wire, face or solid)")}
def IsActive(self):
"""Determines whether or not the Arch Wall tool is active.
Inactive commands are indicated by a greyed-out icon in the menus and
toolbars.
"""
return not FreeCAD.ActiveDocument is None
def Activated(self):
"""Executed when Arch Wall is called.
Creates a wall from the object selected by the user. If no objects are
selected, enters an interactive mode to create a wall using selected
points to create a base.
"""
self.Align = ["Center","Left","Right"][params.get_param_arch("WallAlignment")]
self.MultiMat = None
self.Length = None
self.lengthValue = 0
self.continueCmd = False
self.Width = params.get_param_arch("WallWidth")
self.Height = params.get_param_arch("WallHeight")
self.JOIN_WALLS_SKETCHES = params.get_param_arch("joinWallSketches")
self.AUTOJOIN = params.get_param_arch("autoJoinWalls")
sel = FreeCADGui.Selection.getSelectionEx()
done = False
self.existing = []
self.wp = None
if sel:
# automatic mode
import Draft
if Draft.getType(sel[0].Object) != "Wall":
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Wall"))
FreeCADGui.addModule("Arch")
for selobj in sel:
if Draft.getType(selobj.Object) == "Space":
spacedone = False
if selobj.HasSubObjects:
if "Face" in selobj.SubElementNames[0]:
idx = int(selobj.SubElementNames[0][4:])
FreeCADGui.doCommand("obj = Arch.makeWall(FreeCAD.ActiveDocument."+selobj.Object.Name+",face="+str(idx)+")")
spacedone = True
if not spacedone:
FreeCADGui.doCommand('obj = Arch.makeWall(FreeCAD.ActiveDocument.'+selobj.Object.Name+')')
else:
FreeCADGui.doCommand('obj = Arch.makeWall(FreeCAD.ActiveDocument.'+selobj.Object.Name+')')
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
done = True
if not done:
# interactive mode
self.points = []
import WorkingPlane
self.wp = WorkingPlane.get_working_plane()
self.tracker = DraftTrackers.boxTracker()
FreeCAD.activeDraftCommand = self # register as a Draft command for auto grid on/off
FreeCADGui.Snapper.getPoint(callback=self.getPoint,
extradlg=self.taskbox(),
title=translate("Arch","First point of wall")+":")
def getPoint(self,point=None,obj=None):
"""Callback for clicks during interactive mode.
When method _CommandWall.Activated() has entered the interactive mode,
this callback runs when the user clicks.
Parameters
----------
point: <class 'Base.Vector'>
The point the user has selected.
obj: <Part::PartFeature>, optional
The object the user's cursor snapped to, if any.
"""
if obj:
if Draft.getType(obj) == "Wall":
if not obj in self.existing:
self.existing.append(obj)
if point is None:
self.tracker.finalize()
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
return
self.points.append(point)
if len(self.points) == 1:
self.tracker.width(self.Width)
self.tracker.height(self.Height)
self.tracker.on()
FreeCADGui.Snapper.getPoint(last=self.points[0],
callback=self.getPoint,
movecallback=self.update,
extradlg=self.taskbox(),
title=translate("Arch","Next point")+":",mode="line")
elif len(self.points) == 2:
import Part
l = Part.LineSegment(self.wp.get_local_coords(self.points[0]),
self.wp.get_local_coords(self.points[1]))
self.tracker.finalize()
FreeCAD.activeDraftCommand = None
FreeCADGui.Snapper.off()
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Wall"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand('import Part')
FreeCADGui.doCommand('trace=Part.LineSegment(FreeCAD.'+str(l.StartPoint)+',FreeCAD.'+str(l.EndPoint)+')')
if not self.existing:
# no existing wall snapped, just add a default wall
self.addDefault()
else:
if self.JOIN_WALLS_SKETCHES:
# join existing subwalls first if possible, then add the new one
w = joinWalls(self.existing)
if w:
if areSameWallTypes([w,self]):
FreeCADGui.doCommand('FreeCAD.ActiveDocument.'+w.Name+'.Base.addGeometry(trace)')
else:
# if not possible, add new wall as addition to the existing one
self.addDefault()
if self.AUTOJOIN:
FreeCADGui.doCommand('Arch.addComponents(FreeCAD.ActiveDocument.'+FreeCAD.ActiveDocument.Objects[-1].Name+',FreeCAD.ActiveDocument.'+w.Name+')')
else:
self.addDefault()
else:
# add new wall as addition to the first existing one
self.addDefault()
if self.AUTOJOIN:
FreeCADGui.doCommand('Arch.addComponents(FreeCAD.ActiveDocument.'+FreeCAD.ActiveDocument.Objects[-1].Name+',FreeCAD.ActiveDocument.'+self.existing[0].Name+')')
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
if self.continueCmd:
self.Activated()
def addDefault(self):
"""Create a wall using a line segment, with all parameters as the default.
Used solely by _CommandWall.getPoint() when the interactive mode has
selected two points.
Relies on the assumption that FreeCADGui.doCommand() has already
created a Part.LineSegment assigned as the variable "trace"
"""
FreeCADGui.addModule("Draft")
FreeCADGui.addModule("WorkingPlane")
FreeCADGui.doCommand("wp = WorkingPlane.get_working_plane()")
if params.get_param_arch("WallSketches"):
# Use ArchSketch if SketchArch add-on is present
try:
import ArchSketchObject
FreeCADGui.doCommand('import ArchSketchObject')
FreeCADGui.doCommand('base=ArchSketchObject.makeArchSketch()')
except:
FreeCADGui.doCommand('base=FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject","WallTrace")')
FreeCADGui.doCommand('base.Placement = wp.get_placement()')
FreeCADGui.doCommand('base.addGeometry(trace)')
else:
FreeCADGui.doCommand('base=Draft.make_line(trace)')
# The created line should not stay selected as this causes an issue in continue mode.
# Two walls would then be created based on the same line.
FreeCADGui.Selection.clearSelection()
FreeCADGui.doCommand('base.Placement = wp.get_placement()')
FreeCADGui.doCommand('FreeCAD.ActiveDocument.recompute()')
FreeCADGui.doCommand('wall = Arch.makeWall(base,width='+str(self.Width)+',height='+str(self.Height)+',align="'+str(self.Align)+'")')
FreeCADGui.doCommand('wall.Normal = wp.axis')
if self.MultiMat:
FreeCADGui.doCommand("wall.Material = FreeCAD.ActiveDocument."+self.MultiMat.Name)
FreeCADGui.doCommand("Draft.autogroup(wall)")
def update(self,point,info):
# info parameter is not used but needed for compatibility with the snapper
"""Callback for the mouse moving during the interactive mode.
Update the active dialog box to show the coordinates of the location of
the cursor. Also show the length the line would take, if the user
selected that point.
Parameters
----------
point: <class 'Base.Vector'>
The point the cursor is currently at, or has snapped to.
"""
if FreeCADGui.Control.activeDialog():
b = self.points[0]
n = self.wp.axis
bv = point.sub(b)
dv = bv.cross(n)
dv = DraftVecUtils.scaleTo(dv,self.Width/2)
if self.Align == "Center":
self.tracker.update([b,point])
elif self.Align == "Left":
self.tracker.update([b.add(dv),point.add(dv)])
else:
dv = dv.negative()
self.tracker.update([b.add(dv),point.add(dv)])
if self.Length:
self.Length.setText(FreeCAD.Units.Quantity(bv.Length,FreeCAD.Units.Length).UserString)
def taskbox(self):
"""Set up a simple gui widget for the interactive mode."""
w = QtGui.QWidget()
ui = FreeCADGui.UiLoader()
w.setWindowTitle(translate("Arch","Wall options"))
grid = QtGui.QGridLayout(w)
matCombo = QtGui.QComboBox()
matCombo.addItem(translate("Arch","Wall Presets..."))
matCombo.setToolTip(translate("Arch","This list shows all the MultiMaterials objects of this document. Create some to define wall types."))
self.multimats = []
self.MultiMat = None
for o in FreeCAD.ActiveDocument.Objects:
if Draft.getType(o) == "MultiMaterial":
self.multimats.append(o)
matCombo.addItem(o.Label)
if hasattr(FreeCAD,"LastArchMultiMaterial"):
for i,o in enumerate(self.multimats):
if o.Name == FreeCAD.LastArchMultiMaterial:
matCombo.setCurrentIndex(i+1)
self.MultiMat = o
grid.addWidget(matCombo,0,0,1,2)
label5 = QtGui.QLabel(translate("Arch","Length"))
self.Length = ui.createWidget("Gui::InputField")
self.Length.setText("0.00 mm")
grid.addWidget(label5,1,0,1,1)
grid.addWidget(self.Length,1,1,1,1)
label1 = QtGui.QLabel(translate("Arch","Width"))
value1 = ui.createWidget("Gui::InputField")
value1.setText(FreeCAD.Units.Quantity(self.Width,FreeCAD.Units.Length).UserString)
grid.addWidget(label1,2,0,1,1)
grid.addWidget(value1,2,1,1,1)
label2 = QtGui.QLabel(translate("Arch","Height"))
value2 = ui.createWidget("Gui::InputField")
value2.setText(FreeCAD.Units.Quantity(self.Height,FreeCAD.Units.Length).UserString)
grid.addWidget(label2,3,0,1,1)
grid.addWidget(value2,3,1,1,1)
label3 = QtGui.QLabel(translate("Arch","Alignment"))
value3 = QtGui.QComboBox()
items = [translate("Arch","Center"),translate("Arch","Left"),translate("Arch","Right")]
value3.addItems(items)
value3.setCurrentIndex(["Center","Left","Right"].index(self.Align))
grid.addWidget(label3,4,0,1,1)
grid.addWidget(value3,4,1,1,1)
label4 = QtGui.QLabel(translate("Arch","Con&tinue"))
value4 = QtGui.QCheckBox()
value4.setObjectName("ContinueCmd")
value4.setLayoutDirection(QtCore.Qt.RightToLeft)
label4.setBuddy(value4)
self.continueCmd = params.get_param("ContinueMode")
value4.setChecked(self.continueCmd)
grid.addWidget(label4,5,0,1,1)
grid.addWidget(value4,5,1,1,1)
label5 = QtGui.QLabel(translate("Arch","Use sketches"))
value5 = QtGui.QCheckBox()
value5.setObjectName("UseSketches")
value5.setLayoutDirection(QtCore.Qt.RightToLeft)
label5.setBuddy(value5)
value5.setChecked(params.get_param_arch("WallSketches"))
grid.addWidget(label5,6,0,1,1)
grid.addWidget(value5,6,1,1,1)
QtCore.QObject.connect(self.Length,QtCore.SIGNAL("valueChanged(double)"),self.setLength)
QtCore.QObject.connect(value1,QtCore.SIGNAL("valueChanged(double)"),self.setWidth)
QtCore.QObject.connect(value2,QtCore.SIGNAL("valueChanged(double)"),self.setHeight)
QtCore.QObject.connect(value3,QtCore.SIGNAL("currentIndexChanged(int)"),self.setAlign)
QtCore.QObject.connect(value4,QtCore.SIGNAL("stateChanged(int)"),self.setContinue)
QtCore.QObject.connect(value5,QtCore.SIGNAL("stateChanged(int)"),self.setUseSketch)
QtCore.QObject.connect(self.Length,QtCore.SIGNAL("returnPressed()"),value1.setFocus)
QtCore.QObject.connect(self.Length,QtCore.SIGNAL("returnPressed()"),value1.selectAll)
QtCore.QObject.connect(value1,QtCore.SIGNAL("returnPressed()"),value2.setFocus)
QtCore.QObject.connect(value1,QtCore.SIGNAL("returnPressed()"),value2.selectAll)
QtCore.QObject.connect(value2,QtCore.SIGNAL("returnPressed()"),self.createFromGUI)
QtCore.QObject.connect(matCombo,QtCore.SIGNAL("currentIndexChanged(int)"),self.setMat)
return w
def setMat(self,d):
"""Simple callback for the interactive mode gui widget to set material."""
if d == 0:
self.MultiMat = None
del FreeCAD.LastArchMultiMaterial
elif d <= len(self.multimats):
self.MultiMat = self.multimats[d-1]
FreeCAD.LastArchMultiMaterial = self.MultiMat.Name
def setLength(self,d):
"""Simple callback for the interactive mode gui widget to set length."""
self.lengthValue = d
def setWidth(self,d):
"""Simple callback for the interactive mode gui widget to set width."""
self.Width = d
self.tracker.width(d)
params.set_param_arch("WallWidth",d)
def setHeight(self,d):
"""Simple callback for the interactive mode gui widget to set height."""
self.Height = d
self.tracker.height(d)
params.set_param_arch("WallHeight",d)
def setAlign(self,i):
"""Simple callback for the interactive mode gui widget to set alignment."""
self.Align = ["Center","Left","Right"][i]
params.set_param_arch("WallAlignment",i)
def setContinue(self,i):
"""Simple callback to set if the interactive mode will restart when finished.
This allows for several walls to be placed one after another.
"""
self.continueCmd = bool(i)
params.set_param("ContinueMode", bool(i))
def setUseSketch(self,i):
"""Simple callback to set if walls should based on sketches."""
params.set_param_arch("WallSketches",bool(i))
def createFromGUI(self):
"""Callback to create wall by using the _CommandWall.taskbox()"""
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Wall"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand('wall = Arch.makeWall(length='+str(self.lengthValue)+',width='+str(self.Width)+',height='+str(self.Height)+',align="'+str(self.Align)+'")')
if self.MultiMat:
FreeCADGui.doCommand("wall.Material = FreeCAD.ActiveDocument."+self.MultiMat.Name)
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
if hasattr(FreeCADGui,"draftToolBar"):
FreeCADGui.draftToolBar.escape()
class _CommandMergeWalls:
"""The command definition for the Arch workbench's gui tool, Arch MergeWalls.
A tool for merging walls.
Join two or more walls by using the ArchWall.joinWalls() function.
Find documentation on the end user usage of Arch Wall here:
https://wiki.freecad.org/Arch_MergeWalls
"""
def GetResources(self):
"""Returns a dictionary with the visual aspects of the Arch MergeWalls tool."""
return {'Pixmap' : 'Arch_MergeWalls',
'MenuText': QT_TRANSLATE_NOOP("Arch_MergeWalls","Merge Walls"),
'ToolTip': QT_TRANSLATE_NOOP("Arch_MergeWalls","Merges the selected walls, if possible")}
def IsActive(self):
"""Determines whether or not the Arch MergeWalls tool is active.
Inactive commands are indicated by a greyed-out icon in the menus and
toolbars.
"""
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
"""Executed when Arch MergeWalls is called.
Call ArchWall.joinWalls() on walls selected by the user, with the
delete option enabled. If the user has selected a single wall, check to
see if the wall has any Additions that are walls. If so, merges these
additions to the wall, deleting the additions.
"""
walls = FreeCADGui.Selection.getSelection()
if len(walls) == 1:
if Draft.getType(walls[0]) == "Wall":
ostr = "FreeCAD.ActiveDocument."+ walls[0].Name
ok = False
for o in walls[0].Additions:
if Draft.getType(o) == "Wall":
ostr += ",FreeCAD.ActiveDocument." + o.Name
ok = True
if ok:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Merge Wall"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.joinWalls(["+ostr+"],delete=True)")
FreeCAD.ActiveDocument.commitTransaction()
return
else:
FreeCAD.Console.PrintWarning(translate("Arch","The selected wall contains no subwall to merge"))
return
else:
FreeCAD.Console.PrintWarning(translate("Arch","Please select only wall objects"))
return
for w in walls:
if Draft.getType(w) != "Wall":
FreeCAD.Console.PrintMessage(translate("Arch","Please select only wall objects"))
return
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Merge Walls"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.joinWalls(FreeCADGui.Selection.getSelection(),delete=True)")
FreeCAD.ActiveDocument.commitTransaction()
class _Wall(ArchComponent.Component):
"""The Wall object.
@@ -1061,7 +476,7 @@ class _Wall(ArchComponent.Component):
if Draft.getType(obj.Base) == "Wire":
#print "modifying p2"
obj.Base.End = p2
elif Draft.getType(obj.Base) in ["Sketcher::SketchObject", "ArchSketch"]:
elif Draft.getType(obj.Base) == "Sketcher::SketchObject":
try:
obj.Base.recompute() # Fix for the 'GeoId index out range' error.
obj.Base.movePoint(0, 2, obj.Base.Placement.inverse().multVec(p2))
@@ -1211,8 +626,11 @@ class _Wall(ArchComponent.Component):
if not height:
return None
if obj.Normal == Vector(0,0,0):
import DraftGeomUtils
normal = DraftGeomUtils.get_shape_normal(obj.Base.Shape)
if obj.Base:
baseshape = obj.Base.Shape
else:
baseshape = Part.makeLine((0,0,0),(length,0,0))
normal = DraftGeomUtils.get_shape_normal(baseshape)
if normal == None:
normal = Vector(0,0,1)
else:
@@ -1772,7 +1190,3 @@ class _ViewProviderWall(ArchComponent.ViewProviderComponent):
elif obj.Align == "Right":
obj.Align = "Left"
FreeCAD.ActiveDocument.recompute()
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Wall',_CommandWall())
FreeCADGui.addCommand('Arch_MergeWalls',_CommandMergeWalls())

View File

@@ -34,7 +34,7 @@ from draftutils.messages import _wrn
if FreeCAD.GuiUp:
import FreeCADGui
from PySide import QtCore, QtGui, QtSvgWidgets
from PySide import QtCore, QtGui, QtSvg
from draftutils.translate import translate
from PySide.QtCore import QT_TRANSLATE_NOOP
import draftguitools.gui_trackers as DraftTrackers
@@ -67,64 +67,7 @@ WindowOpeningModes = ["None","Arc 90","Arc 90 inv","Arc 45","Arc 45 inv","Arc 18
WindowPresets = ArchWindowPresets.WindowPresets
def makeWindow(baseobj=None,width=None,height=None,parts=None,name=None):
'''makeWindow(baseobj,[width,height,parts,name]): creates a window based on the
given base 2D object (sketch or draft).'''
if not FreeCAD.ActiveDocument:
FreeCAD.Console.PrintError("No active document. Aborting\n")
return
if baseobj:
if Draft.getType(baseobj) == "Window":
obj = Draft.clone(baseobj)
return obj
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Window")
_Window(obj)
if name:
obj.Label = name
else:
obj.Label = translate("Arch","Window")
if FreeCAD.GuiUp:
_ViewProviderWindow(obj.ViewObject)
if width:
obj.Width = width
if height:
obj.Height = height
if baseobj:
obj.Normal = baseobj.Placement.Rotation.multVec(FreeCAD.Vector(0,0,-1))
obj.Base = baseobj
if parts is not None:
obj.WindowParts = parts
else:
if baseobj:
if baseobj.getLinkedObject().isDerivedFrom("Part::Part2DObject"):
# create default component
if baseobj.Shape.Wires:
tp = "Frame"
if len(baseobj.Shape.Wires) == 1:
tp = "Solid panel"
i = 0
ws = ''
for w in baseobj.Shape.Wires:
if w.isClosed():
if ws: ws += ","
ws += "Wire" + str(i)
i += 1
obj.WindowParts = ["Default",tp,ws,"1","0"]
else:
# bind properties from base obj if existing
for prop in ["Height","Width","Subvolume","Tag","Description","Material"]:
for p in baseobj.PropertiesList:
if (p == prop) or p.endswith("_"+prop):
obj.setExpression(prop, baseobj.Name+"."+p)
if obj.Base and FreeCAD.GuiUp:
obj.Base.ViewObject.DisplayMode = "Wireframe"
obj.Base.ViewObject.hide()
from DraftGui import todo
todo.delay(recolorize,[obj.Document.Name,obj.Name])
return obj
def recolorize(attr): # names is [docname,objname]
@@ -147,416 +90,6 @@ def recolorize(attr): # names is [docname,objname]
class _CommandWindow:
"the Arch Window command definition"
def __init__(self):
self.doormode = False
def GetResources(self):
return {'Pixmap' : 'Arch_Window',
'MenuText': QT_TRANSLATE_NOOP("Arch_Window","Window"),
'Accel': "W, N",
'ToolTip': QT_TRANSLATE_NOOP("Arch_Window","Creates a window object from a selected object (wire, rectangle or sketch)")}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
self.sel = FreeCADGui.Selection.getSelection()
self.W1 = params.get_param_arch("WindowW1") # thickness of the fixed frame
if self.doormode:
self.Width = params.get_param_arch("DoorWidth")
self.Height = params.get_param_arch("DoorHeight")
else:
self.Width = params.get_param_arch("WindowWidth")
self.Height = params.get_param_arch("WindowHeight")
self.RemoveExternal = params.get_param_arch("archRemoveExternal")
self.Preset = 0
self.LibraryPreset = 0
self.Sill = 0
self.Include = True
self.baseFace = None
self.wparams = ["Width","Height","H1","H2","H3","W1","W2","O1","O2"]
self.wp = None
# autobuild mode
if FreeCADGui.Selection.getSelectionEx():
FreeCADGui.draftToolBar.offUi()
obj = self.sel[0]
if hasattr(obj,'Shape'):
if obj.Shape.Wires and (not obj.Shape.Solids) and (not obj.Shape.Shells):
FreeCADGui.Control.closeDialog()
host = None
if hasattr(obj,"AttachmentSupport"):
if obj.AttachmentSupport:
if isinstance(obj.AttachmentSupport,tuple):
host = obj.AttachmentSupport[0]
elif isinstance(obj.AttachmentSupport,list):
host = obj.AttachmentSupport[0][0]
else:
host = obj.AttachmentSupport
obj.AttachmentSupport = None # remove
elif Draft.isClone(obj,"Window"):
if obj.Objects[0].Inlist:
host = obj.Objects[0].Inlist[0]
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Window"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("win = Arch.makeWindow(FreeCAD.ActiveDocument."+obj.Name+")")
if host and self.Include:
FreeCADGui.doCommand("win.Hosts = [FreeCAD.ActiveDocument."+host.Name+"]")
siblings = host.Proxy.getSiblings(host)
sibs = [host]
for sibling in siblings:
if not sibling in sibs:
sibs.append(sibling)
FreeCADGui.doCommand("win.Hosts = win.Hosts+[FreeCAD.ActiveDocument."+sibling.Name+"]")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
# Try to detect an object to use as a window type - TODO we must make this safer
elif obj.Shape.Solids and (Draft.getType(obj) not in ["Wall","Structure","Roof"]):
# we consider the selected object as a type
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Window"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeWindow(FreeCAD.ActiveDocument."+obj.Name+")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
# interactive mode
import WorkingPlane
self.wp = WorkingPlane.get_working_plane()
self.tracker = DraftTrackers.boxTracker()
self.tracker.length(self.Width)
self.tracker.width(self.W1)
self.tracker.height(self.Height)
self.tracker.on()
FreeCAD.Console.PrintMessage(translate("Arch","Choose a face on an existing object or select a preset")+"\n")
FreeCADGui.Snapper.getPoint(callback=self.getPoint,movecallback=self.update,extradlg=self.taskbox())
#FreeCADGui.Snapper.setSelectMode(True)
def has_width_and_height_constraint(self, sketch):
width_found = False
height_found = False
for constr in sketch.Constraints:
if constr.Name == "Width":
width_found = True
elif constr.Name == "Height":
height_found = True
elif width_found and height_found:
break
return (width_found and height_found)
def getPoint(self,point=None,obj=None):
"this function is called by the snapper when it has a 3D point"
self.tracker.finalize()
if point is None:
return
# if something was selected, override the underlying object
if self.sel:
obj = self.sel[0]
point = point.add(FreeCAD.Vector(0,0,self.Sill))
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Window"))
FreeCADGui.doCommand("import math, FreeCAD, Arch, DraftGeomUtils, WorkingPlane")
FreeCADGui.doCommand("wp = WorkingPlane.get_working_plane()")
if self.baseFace is not None:
FreeCADGui.doCommand("face = FreeCAD.ActiveDocument." + self.baseFace[0].Name + ".Shape.Faces[" + str(self.baseFace[1]) + "]")
FreeCADGui.doCommand("pl = DraftGeomUtils.placement_from_face(face, vec_z = wp.axis)")
else:
FreeCADGui.doCommand("pl = FreeCAD.Placement()")
FreeCADGui.doCommand("pl.Rotation = FreeCAD.Rotation(wp.u, wp.axis, -wp.v, 'XZY')")
FreeCADGui.doCommand("pl.Base = FreeCAD.Vector(" + str(point.x) + ", " + str(point.y) + ", " + str(point.z) + ")")
if self.Preset >= len(WindowPresets):
# library object
col = FreeCAD.ActiveDocument.Objects
path = self.librarypresets[self.Preset - len(WindowPresets)][1]
FreeCADGui.doCommand("FreeCADGui.ActiveDocument.mergeProject('" + path + "')")
# find the latest added window
nol = FreeCAD.ActiveDocument.Objects
for o in nol[len(col):]:
if Draft.getType(o) == "Window":
if Draft.getType(o.Base) != "Sketcher::SketchObject":
_wrn(translate("Arch", "Window not based on sketch. Window not aligned or resized."))
self.Include = False
break
FreeCADGui.doCommand("win = FreeCAD.ActiveDocument.getObject('" + o.Name + "')")
FreeCADGui.doCommand("win.Base.Placement = pl")
FreeCADGui.doCommand("win.Normal = pl.Rotation.multVec(FreeCAD.Vector(0, 0, -1))")
FreeCADGui.doCommand("win.Width = " + str(self.Width))
FreeCADGui.doCommand("win.Height = " + str(self.Height))
FreeCADGui.doCommand("win.Base.recompute()")
if not self.has_width_and_height_constraint(o.Base):
_wrn(translate("Arch", "No Width and/or Height constraint in window sketch. Window not resized."))
break
else:
_wrn(translate("Arch", "No window found. Cannot continue."))
self.Include = False
else:
# preset
wp = ""
for p in self.wparams:
wp += p.lower() + "=" + str(getattr(self,p)) + ", "
FreeCADGui.doCommand("win = Arch.makeWindowPreset('" + WindowPresets[self.Preset] + "', " + wp + "placement=pl)")
if self.Include:
host = None
if self.baseFace is not None:
host = self.baseFace[0]
elif obj:
host = obj
if Draft.getType(host) in AllowedHosts:
FreeCADGui.doCommand("win.Hosts = [FreeCAD.ActiveDocument." + host.Name + "]")
siblings = host.Proxy.getSiblings(host)
for sibling in siblings:
FreeCADGui.doCommand("win.Hosts = win.Hosts + [FreeCAD.ActiveDocument." + sibling.Name + "]")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
def update(self,point,info):
"this function is called by the Snapper when the mouse is moved"
delta = FreeCAD.Vector(self.Width/2,self.W1/2,self.Height/2)
delta = delta.add(FreeCAD.Vector(0,0,self.Sill))
if self.baseFace is None:
rot = FreeCAD.Rotation(self.wp.u,self.wp.v,-self.wp.axis,"XZY")
self.tracker.setRotation(rot)
if info:
if "Face" in info['Component']:
import DraftGeomUtils
o = FreeCAD.ActiveDocument.getObject(info['Object'])
self.baseFace = [o,int(info['Component'][4:])-1]
#print("switching to ",o.Label," face ",self.baseFace[1])
f = o.Shape.Faces[self.baseFace[1]]
p = DraftGeomUtils.placement_from_face(f,vec_z=self.wp.axis,rotated=True)
rot = p.Rotation
self.tracker.setRotation(rot)
r = self.tracker.trans.rotation.getValue().getValue()
if r != (0,0,0,1):
delta = FreeCAD.Rotation(r[0],r[1],r[2],r[3]).multVec(FreeCAD.Vector(delta.x,-delta.y,-delta.z))
self.tracker.pos(point.add(delta))
def taskbox(self):
"sets up a taskbox widget"
w = QtGui.QWidget()
ui = FreeCADGui.UiLoader()
w.setWindowTitle(translate("Arch","Window options"))
grid = QtGui.QGridLayout(w)
# include box
include = QtGui.QCheckBox(translate("Arch","Auto include in host object"))
include.setChecked(True)
grid.addWidget(include,0,0,1,2)
QtCore.QObject.connect(include,QtCore.SIGNAL("stateChanged(int)"),self.setInclude)
# sill height
labels = QtGui.QLabel(translate("Arch","Sill height"))
values = ui.createWidget("Gui::InputField")
grid.addWidget(labels,1,0,1,1)
grid.addWidget(values,1,1,1,1)
QtCore.QObject.connect(values,QtCore.SIGNAL("valueChanged(double)"),self.setSill)
# check for Parts library and Arch presets
# because of the use of FreeCADGui.doCommand() backslashes in the
# paths in librarypresets need to be double escaped "\\\\", so let's
# use forward slashes instead...
self.librarypresets = []
librarypath = FreeCAD.ParamGet("User parameter:Plugins/parts_library").GetString("destination", "")
# librarypath should have only forward slashes already, but let's use replace() anyway just to be sure:
librarypath = librarypath.replace("\\", "/") + "/Architectural Parts"
presetdir = FreeCAD.getUserAppDataDir().replace("\\", "/") + "/Arch"
for path in [librarypath, presetdir]:
if os.path.isdir(path):
for wtype in ["Windows", "Doors"]:
wdir = path + "/" + wtype
if os.path.isdir(wdir):
for subtype in os.listdir(wdir):
subdir = wdir + "/" + subtype
if os.path.isdir(subdir):
for subfile in os.listdir(subdir):
if (os.path.isfile(subdir + "/" + subfile)
and subfile.lower().endswith(".fcstd")):
self.librarypresets.append([wtype + " - " + subtype + " - " + subfile[:-6],
subdir + "/" + subfile])
# presets box
labelp = QtGui.QLabel(translate("Arch","Preset"))
valuep = QtGui.QComboBox()
valuep.setMinimumContentsLength(6)
valuep.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
valuep.addItems(WindowPresets)
valuep.setCurrentIndex(self.Preset)
grid.addWidget(labelp,2,0,1,1)
grid.addWidget(valuep,2,1,1,1)
QtCore.QObject.connect(valuep,QtCore.SIGNAL("currentIndexChanged(int)"),self.setPreset)
for it in self.librarypresets:
valuep.addItem(it[0])
# image display
self.pic = QtGui.QLabel()
grid.addWidget(self.pic,3,0,1,2)
self.pic.setFixedHeight(128)
self.pic.hide()
# SVG display
self.im = QtSvgWidgets.QSvgWidget(":/ui/ParametersWindowFixed.svg")
self.im.setMaximumWidth(200)
self.im.setMinimumHeight(120)
grid.addWidget(self.im,4,0,1,2)
#self.im.hide()
# parameters
i = 5
for param in self.wparams:
lab = QtGui.QLabel(translate("Arch",param))
setattr(self,"val"+param,ui.createWidget("Gui::InputField"))
wid = getattr(self,"val"+param)
if param == "W1":
wid.setText(FreeCAD.Units.Quantity(self.W1,FreeCAD.Units.Length).UserString)
elif param == "Width":
wid.setText(FreeCAD.Units.Quantity(self.Width,FreeCAD.Units.Length).UserString)
elif param == "Height":
wid.setText(FreeCAD.Units.Quantity(self.Height,FreeCAD.Units.Length).UserString)
else:
n = params.get_param_arch("Window"+param)
wid.setText(FreeCAD.Units.Quantity(n,FreeCAD.Units.Length).UserString)
setattr(self,param,n)
grid.addWidget(lab,i,0,1,1)
grid.addWidget(wid,i,1,1,1)
i += 1
valueChanged = self.getValueChanged(param)
FreeCAD.wid = wid
QtCore.QObject.connect(getattr(self,"val"+param),QtCore.SIGNAL("valueChanged(double)"), valueChanged)
# restore saved states
if self.doormode:
i = params.get_param_arch("DoorPreset")
d = params.get_param_arch("DoorSill")
else:
i = params.get_param_arch("WindowPreset")
d = params.get_param_arch("WindowSill")
if i < valuep.count():
valuep.setCurrentIndex(i)
values.setText(FreeCAD.Units.Quantity(d,FreeCAD.Units.Length).UserString)
return w
def getValueChanged(self,p):
return lambda d : self.setParams(p, d)
def setSill(self,d):
self.Sill = d
if self.doormode:
params.set_param_arch("DoorSill",d)
else:
params.set_param_arch("WindowSill",d)
def setInclude(self,i):
self.Include = bool(i)
def setParams(self,param,d):
setattr(self,param,d)
self.tracker.length(self.Width)
self.tracker.height(self.Height)
self.tracker.width(self.W1)
prefix = "Door" if self.doormode and param in ("Width","Height") else "Window"
params.set_param_arch(prefix+param,d)
def setPreset(self,i):
self.Preset = i
if self.doormode:
params.set_param_arch("DoorPreset",i)
else:
params.set_param_arch("WindowPreset",i)
if i >= 0:
FreeCADGui.Snapper.setSelectMode(False)
self.tracker.length(self.Width)
self.tracker.height(self.Height)
self.tracker.width(self.W1)
self.tracker.on()
self.pic.hide()
self.im.show()
if i == 0:
self.im.load(":/ui/ParametersWindowFixed.svg")
elif i in [1,8]:
self.im.load(":/ui/ParametersWindowSimple.svg")
elif i in [2,4,7]:
self.im.load(":/ui/ParametersWindowDouble.svg")
elif i == 3:
self.im.load(":/ui/ParametersWindowStash.svg")
elif i == 5:
self.im.load(":/ui/ParametersDoorSimple.svg")
elif i == 6:
self.im.load(":/ui/ParametersDoorGlass.svg")
elif i == 9:
self.im.load(":/ui/ParametersOpening.svg")
else:
# From Library
self.im.hide()
path = self.librarypresets[i-len(WindowPresets)][1]
if path.lower().endswith(".fcstd"):
try:
import tempfile
import zipfile
except Exception:
pass
else:
zfile = zipfile.ZipFile(path)
files = zfile.namelist()
# check for meta-file if it's really a FreeCAD document
if files[0] == "Document.xml":
image="thumbnails/Thumbnail.png"
if image in files:
image = zfile.read(image)
thumbfile = tempfile.mkstemp(suffix='.png')[1]
thumb = open(thumbfile,"wb")
thumb.write(image)
thumb.close()
im = QtGui.QPixmap(thumbfile)
self.pic.setPixmap(im)
self.pic.show()
#for param in self.wparams:
# getattr(self,"val"+param).setEnabled(True)
else:
FreeCADGui.Snapper.setSelectMode(True)
self.tracker.off()
self.im.hide()
for param in self.wparams:
getattr(self,"val"+param).setEnabled(False)
class _Window(ArchComponent.Component):
"The Window object"
@@ -1841,5 +1374,4 @@ class _ArchWindowTaskPanel:
self.obj.ViewObject.Proxy.invertHinge()
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Window',_CommandWindow())

View File

@@ -501,14 +501,14 @@ def makeWindowPreset(windowtype,width,height,h1,h2,h3,w1,w2,o1,o2,placement=None
return (s,wp)
if windowtype in WindowPresets:
import ArchWindow
import Arch
default = makeSketch(windowtype,width,height,h1,h2,h3,w1,w2,o1,o2)
FreeCAD.ActiveDocument.recompute()
if default:
if placement:
default[0].Placement = placement
FreeCAD.ActiveDocument.recompute()
obj = ArchWindow.makeWindow(default[0],width,height,default[1])
obj = Arch.makeWindow(default[0],width,height,default[1])
obj.Preset = WindowPresets.index(windowtype)+1
obj.Frame = w2
obj.Offset = o1

103
src/Mod/BIM/BimSelect.py Normal file
View File

@@ -0,0 +1,103 @@
import FreeCAD
class CyclicSelectionObserver:
def addSelection(self, document, object, element, position):
import FreeCADGui
if not FreeCAD.ActiveDocument:
return
if not hasattr(FreeCAD, "CyclicSelectionObserver"):
return
FreeCADGui.Selection.removeSelection(FreeCAD.ActiveDocument.getObject(object))
FreeCADGui.Selection.removeObserver(FreeCAD.CyclicSelectionObserver)
del FreeCAD.CyclicSelectionObserver
preselection = FreeCADGui.Selection.getPreselection()
FreeCADGui.Selection.addSelection(
FreeCAD.ActiveDocument.getObject(preselection.Object.Name),
preselection.SubElementNames[0],
)
FreeCAD.ActiveDocument.recompute()
class CyclicObjectSelector:
def __init__(self):
self.selectableObjects = []
self.objectIndex = 0
def selectObject(self, event_callback):
import FreeCADGui
from pivy import coin
if not FreeCAD.ActiveDocument:
return
event = event_callback.getEvent()
if (
event.getState() != coin.SoMouseButtonEvent.DOWN
or not self.selectableObjects
):
return
pos = event.getPosition().getValue()
element_list = FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo(
(int(pos[0]), int(pos[1]))
)
if not element_list:
self.selectableObjects = []
if hasattr(FreeCAD, "CyclicSelectionObserver"):
FreeCADGui.Selection.removeObserver(FreeCAD.CyclicSelectionObserver)
del FreeCAD.CyclicSelectionObserver
return
FreeCAD.CyclicSelectionObserver = CyclicSelectionObserver()
FreeCADGui.Selection.addObserver(FreeCAD.CyclicSelectionObserver)
def cycleSelectableObjects(self, event_callback):
import FreeCADGui
if not FreeCAD.ActiveDocument:
return
event = event_callback.getEvent()
if not event.isKeyPressEvent(event, event.TAB):
return
pos = event.getPosition().getValue()
selectableObjects = FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo(
(int(pos[0]), int(pos[1]))
)
if not selectableObjects:
return
if self.selectableObjects != selectableObjects:
self.selectableObjects = selectableObjects
self.objectIndex = 0
elif self.objectIndex < len(self.selectableObjects) - 1:
self.objectIndex += 1
else:
self.objectIndex = 0
object_name = self.selectableObjects[self.objectIndex]["Object"]
subelement_name = self.selectableObjects[self.objectIndex]["Component"]
FreeCADGui.getMainWindow().showMessage(
"Cycle preselected (TAB): {} - {}".format(object_name, subelement_name), 0
)
FreeCADGui.Selection.setPreselection(
FreeCAD.ActiveDocument.getObject(object_name), subelement_name
)
class Setup:
def slotActivateDocument(self, doc):
from pivy import coin
cos = CyclicObjectSelector()
if doc and doc.ActiveView and hasattr(doc.ActiveView, "getSceneGraph"):
self.callback = doc.ActiveView.addEventCallbackPivy(
coin.SoMouseButtonEvent.getClassTypeId(), cos.selectObject
)
self.callback = doc.ActiveView.addEventCallbackPivy(
coin.SoKeyboardEvent.getClassTypeId(), cos.cycleSelectableObjects
)

225
src/Mod/BIM/BimStatusBar.py Normal file
View File

@@ -0,0 +1,225 @@
# -*- coding: utf8 -*-
# ***************************************************************************
# * *
# * Copyright (c) 2017 Yorik van Havre <yorik@uncreated.net> *
# * *
# * 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 *
# * *
# ***************************************************************************
"""This module contains FreeCAD commands for the BIM workbench"""
import os
import FreeCAD
import FreeCADGui
QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP
translate = FreeCAD.Qt.translate
# Status bar buttons
def setStatusIcons(show=True):
"shows or hides the BIM icons in the status bar"
import FreeCADGui
from PySide import QtCore, QtGui
nudgeLabelsI = [
translate("BIM", "Custom..."),
'1/16"',
'1/8"',
'1/4"',
'1"',
'6"',
"1'",
translate("BIM", "Auto"),
]
nudgeLabelsM = [
translate("BIM", "Custom..."),
"1 mm",
"5 mm",
"1 cm",
"5 cm",
"10 cm",
"50 cm",
translate("BIM", "Auto"),
]
def toggle(state):
FreeCADGui.runCommand("BIM_TogglePanels")
def toggleBimViews(state):
FreeCADGui.runCommand("BIM_Views")
def toggleBackground(state):
FreeCADGui.runCommand("BIM_Background")
def setNudge(action):
utext = action.text().replace("&", "")
if utext == nudgeLabelsM[0]:
# load dialog
form = FreeCADGui.PySideUic.loadUi(
os.path.join(os.path.dirname(__file__), "dialogNudgeValue.ui")
)
# center the dialog over FreeCAD window
mw = FreeCADGui.getMainWindow()
form.move(
mw.frameGeometry().topLeft() + mw.rect().center() - form.rect().center()
)
result = form.exec_()
if not result:
return
utext = form.inputField.text()
action.parent().parent().parent().setText(utext)
def toggleContextMenu(point):
# DISABLED - TODO need to find a way to add a context menu to a QAction...
FreeCADGui.BimToggleMenu = QtGui.QMenu()
for t in ["Report view", "Python console", "Selection view", "Combo View"]:
a = QtGui.QAction(t)
# a.setCheckable(True)
# a.setChecked(FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM").GetBool("toggle"+t.replace(" ",""),True))
FreeCADGui.BimToggleMenu.addAction(a)
pos = FreeCADGui.getMainWindow().cursor().pos()
FreeCADGui.BimToggleMenu.triggered.connect(toggleSaveSettings)
# QtCore.QObject.connect(FreeCADGui.BimToggleMenu,QtCore.SIGNAL("triggered(QAction *)"),toggleSaveSettings)
FreeCADGui.BimToggleMenu.popup(pos)
def toggleSaveSettings(action):
t = action.text()
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM").SetBool(
"toggle" + t.replace(" ", ""), action.isChecked()
)
if hasattr(FreeCADGui, "BimToggleMenu"):
del FreeCADGui.BimToggleMenu
# main code
mw = FreeCADGui.getMainWindow()
if mw:
st = mw.statusBar()
statuswidget = st.findChild(QtGui.QToolBar, "BIMStatusWidget")
if show:
if statuswidget:
statuswidget.show()
else:
statuswidget = QtGui.QToolBar()
statuswidget.setObjectName("BIMStatusWidget")
s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/General").GetInt("ToolbarIconSize", 24)
statuswidget.setIconSize(QtCore.QSize(s,s))
st.insertPermanentWidget(2, statuswidget)
# report panels toggle button
togglebutton = QtGui.QAction()
togglemenu = QtGui.QMenu()
for t in ["Toggle", "Report view", "Python console", "Selection view", "Combo View"]:
a = QtGui.QAction(t)
togglemenu.addAction(a)
togglemenu.triggered.connect(toggleSaveSettings)
togglebutton.setIcon(QtGui.QIcon(":/icons/BIM_TogglePanels.svg"))
togglebutton.setText("")
togglebutton.setToolTip(
translate("BIM", "Toggle report panels on/off (Ctrl+0)")
)
togglebutton.setCheckable(True)
rv = mw.findChild(QtGui.QWidget, "Python console")
if rv and rv.isVisible():
togglebutton.setChecked(True)
statuswidget.togglebutton = togglebutton
#togglebutton.setMenu(togglemenu)
togglebutton.triggered.connect(toggle)
statuswidget.addAction(togglebutton)
# bim views widget toggle button
from bimcommands import BimViews
bimviewsbutton = QtGui.QAction()
bimviewsbutton.setIcon(QtGui.QIcon(":/icons/BIM_Views.svg"))
bimviewsbutton.setText("")
bimviewsbutton.setToolTip(
translate("BIM", "Toggle BIM views panel on/off (Ctrl+9)")
)
bimviewsbutton.setCheckable(True)
if BimViews.findWidget():
bimviewsbutton.setChecked(True)
statuswidget.bimviewsbutton = bimviewsbutton
bimviewsbutton.triggered.connect(toggleBimViews)
statuswidget.addAction(bimviewsbutton)
# background toggle button
bgbutton = QtGui.QAction()
#bwidth = bgbutton.fontMetrics().boundingRect("AAAA").width()
#bgbutton.setMaximumWidth(bwidth)
bgbutton.setIcon(QtGui.QIcon(":/icons/BIM_Background.svg"))
bgbutton.setText("")
bgbutton.setToolTip(
translate(
"BIM", "Toggle 3D view background between simple and gradient"
)
)
statuswidget.bgbutton = bgbutton
bgbutton.triggered.connect(toggleBackground)
statuswidget.addAction(bgbutton)
# ifc widgets
try:
from nativeifc import ifc_status
except:
pass
else:
ifc_status.set_status_widget(statuswidget)
# nudge button
nudge = QtGui.QPushButton(nudgeLabelsM[-1])
nudge.setIcon(
QtGui.QIcon(":/icons/BIM_Nudge.svg"))
nudge.setFlat(True)
nudge.setToolTip(
translate(
"BIM",
"The value of the nudge movement (rotation is always 45°)."
"CTRL+arrows to move\nCTRL+, to rotate left"
"CTRL+. to rotate right\nCTRL+PgUp to extend extrusion"
"CTRL+PgDown to shrink extrusion"
"CTRL+/ to switch between auto and manual mode",
)
)
statuswidget.addWidget(nudge)
statuswidget.nudge = nudge
menu = QtGui.QMenu(nudge)
gnudge = QtGui.QActionGroup(menu)
for u in nudgeLabelsM:
a = QtGui.QAction(gnudge)
a.setText(u)
menu.addAction(a)
nudge.setMenu(menu)
gnudge.triggered.connect(setNudge)
statuswidget.nudgeLabelsI = nudgeLabelsI
statuswidget.nudgeLabelsM = nudgeLabelsM
statuswidget.show()
else:
if statuswidget is None:
# when switching workbenches, the toolbar sometimes "jumps"
# out of the status bar to any other dock area...
statuswidget = mw.findChild(QtGui.QToolBar, "BIMStatusWidget")
if statuswidget:
statuswidget.hide()
statuswidget.toggleViewAction().setVisible(False)

274
src/Mod/BIM/CMakeLists.txt Normal file
View File

@@ -0,0 +1,274 @@
IF (BUILD_GUI)
PYSIDE_WRAP_RC(Arch_QRC_SRCS Resources/Arch.qrc)
ENDIF (BUILD_GUI)
SET(Arch_SRCS
Init.py
InitGui.py
ArchComponent.py
ArchIFC.py
ArchIFCView.py
ArchIFCSchema.py
ArchProject.py
ArchWall.py
Arch.py
ArchSite.py
ArchStructure.py
ArchCommands.py
ArchSectionPlane.py
ArchWindow.py
ArchWindowPresets.py
ArchAxis.py
ArchAxisSystem.py
ArchGrid.py
ArchVRM.py
ArchRoof.py
ArchStairs.py
ArchSpace.py
ArchRebar.py
TestArch.py
ArchFrame.py
ArchPanel.py
ArchEquipment.py
ArchCutPlane.py
ArchMaterial.py
ArchSchedule.py
ArchProfile.py
ArchPrecast.py
ArchPipe.py
ArchNesting.py
ArchBuildingPart.py
ArchReference.py
ArchFence.py
OfflineRenderingUtils.py
ArchTruss.py
ArchCurtainWall.py
ArchSketchObject.py
BimSelect.py
BimStatusBar.py
)
SET(importers_SRCS
importers/__init__.py
importers/importIFC.py
importers/importIFClegacy.py
importers/importIFCHelper.py
importers/importIFCmulticore.py
importers/importDAE.py
importers/importOBJ.py
importers/importWebGL.py
importers/importJSON.py
importers/importSH3D.py
importers/import3DS.py
importers/importSHP.py
importers/importGBXML.py
importers/exportIFCStructuralTools.py
importers/exportIFC.py
importers/exportIFCHelper.py
)
SET(Dice3DS_SRCS
Dice3DS/__init__.py
Dice3DS/util.py
Dice3DS/dom3ds.py
)
SET(Arch_presets
Presets/profiles.csv
Presets/pset_definitions.csv
Presets/ifc_products_IFC2X3.json
Presets/ifc_products_IFC4.json
Presets/ifc_types_IFC2X3.json
Presets/ifc_types_IFC4.json
Presets/ifc_contexts_IFC2X3.json
Presets/ifc_contexts_IFC4.json
)
SET(bimcommands_SRCS
bimcommands/BimArchUtils.py
bimcommands/BimAxis.py
bimcommands/BimBackground.py
bimcommands/BimBeam.py
bimcommands/BimBox.py
bimcommands/BimBuilder.py
bimcommands/BimBuildingPart.py
bimcommands/BimClassification.py
bimcommands/BimClone.py
bimcommands/BimColumn.py
bimcommands/BimCommon.py
bimcommands/BimCompound.py
bimcommands/BimConvert.py
bimcommands/BimCopy.py
bimcommands/BimCurtainwall.py
bimcommands/BimCutPlane.py
bimcommands/BimCut.py
bimcommands/BimDiff.py
bimcommands/BimDimensions.py
bimcommands/BimDoor.py
bimcommands/BimEmptyTrash.py
bimcommands/BimEquipment.py
bimcommands/BimExamples.py
bimcommands/BimExtrude.py
bimcommands/BimFence.py
bimcommands/BimFrame.py
bimcommands/BimFuse.py
bimcommands/BimGlue.py
bimcommands/BimHelp.py
bimcommands/BimIfcElements.py
bimcommands/BimIfcExplorer.py
bimcommands/BimIfcProperties.py
bimcommands/BimIfcQuantities.py
bimcommands/BimImagePlane.py
bimcommands/BimLayers.py
bimcommands/BimLeader.py
bimcommands/BimLibrary.py
bimcommands/BimMaterial.py
bimcommands/BimMoveView.py
bimcommands/BimNudge.py
bimcommands/BimOffset.py
bimcommands/BimPanel.py
bimcommands/BimPipe.py
bimcommands/BimPreflight.py
bimcommands/BimProfile.py
bimcommands/BimProjectManager.py
bimcommands/BimProject.py
bimcommands/BimRebar.py
bimcommands/BimReextrude.py
bimcommands/BimReference.py
bimcommands/BimReorder.py
bimcommands/BimResetCloneColors.py
bimcommands/BimRewire.py
bimcommands/BimRoof.py
bimcommands/BimSchedule.py
bimcommands/BimSectionPlane.py
bimcommands/BimSetup.py
bimcommands/BimShape2DView.py
bimcommands/BimSimpleCopy.py
bimcommands/BimSite.py
bimcommands/BimSketch.py
bimcommands/BimSlab.py
bimcommands/BimSpace.py
bimcommands/BimStairs.py
bimcommands/BimTDPage.py
bimcommands/BimTDView.py
bimcommands/BimText.py
bimcommands/BimTogglePanels.py
bimcommands/BimTrash.py
bimcommands/BimTruss.py
bimcommands/BimTutorial.py
bimcommands/BimUnclone.py
bimcommands/BimUngroup.py
bimcommands/BimViews.py
bimcommands/BimWall.py
bimcommands/BimWelcome.py
bimcommands/BimWindow.py
bimcommands/BimWindows.py
bimcommands/BimWPCommands.py
bimcommands/__init__.py
)
SET(nativeifc_SRCS
nativeifc/ifc_commands.py
nativeifc/ifc_diff.py
nativeifc/ifc_generator.py
nativeifc/ifc_geometry.py
nativeifc/ifc_import.py
nativeifc/ifc_layers.py
nativeifc/ifc_materials.py
nativeifc/ifc_objects.py
nativeifc/ifc_observer.py
nativeifc/ifc_performance_test.py
nativeifc/ifc_preferences.py
nativeifc/ifc_psets.py
nativeifc/ifc_selftest.py
nativeifc/ifc_status.py
nativeifc/ifc_tools.py
nativeifc/ifc_tree.py
nativeifc/ifc_viewproviders.py
nativeifc/__init__.py
nativeifc/ifc_openshell.py
)
SOURCE_GROUP("" FILES ${Arch_SRCS})
SET(BIMGuiIcon_SVG
Resources/icons/BIMWorkbench.svg
)
ADD_CUSTOM_TARGET(BIM ALL
SOURCES ${Arch_SRCS}
${Arch_QRC_SRCS}
${Dice3DS_SRCS}
${Arch_presets}
${ArchGuiIcon_SVG}
${importers_SRCS}
${bimcommands_SRCS}
${nativeifc_SRCS}
${BIMGuiIcon_SVG}
)
fc_copy_sources(BIM "${CMAKE_BINARY_DIR}/Mod/BIM" ${Arch_SRCS})
fc_copy_sources(BIM "${CMAKE_BINARY_DIR}/Mod/BIM" ${Dice3DS_SRCS})
fc_copy_sources(BIM "${CMAKE_BINARY_DIR}/Mod/BIM" ${importers_SRCS})
fc_copy_sources(BIM "${CMAKE_BINARY_DIR}/Mod/BIM" ${bimcommands_SRCS})
fc_copy_sources(BIM "${CMAKE_BINARY_DIR}/Mod/BIM" ${nativeifc_SRCS})
fc_copy_sources(BIM "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/BIM" ${BIMGuiIcon_SVG})
fc_target_copy_resource(BIM
${CMAKE_SOURCE_DIR}/src/Mod/BIM
${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/BIM
${Arch_presets}
)
IF (BUILD_GUI)
fc_target_copy_resource(BIM
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_BINARY_DIR}/Mod/BIM
Arch_rc.py)
ENDIF (BUILD_GUI)
INSTALL(
FILES
${Arch_SRCS}
${Arch_QRC_SRCS}
DESTINATION Mod/BIM
)
INSTALL(
FILES
${Dice3DS_SRCS}
DESTINATION Mod/BIM/Dice3DS
)
INSTALL(
FILES
${importers_SRCS}
DESTINATION Mod/BIM/importers
)
INSTALL(
FILES
${bimcommands_SRCS}
DESTINATION Mod/BIM/bimcommands
)
INSTALL(
FILES
${nativeifc_SRCS}
DESTINATION Mod/BIM/nativeifc
)
INSTALL(
DIRECTORY
Presets
DESTINATION
${CMAKE_INSTALL_DATADIR}/Mod/BIM
)
INSTALL(
FILES
${BIMGuiIcon_SVG}
DESTINATION
"${CMAKE_INSTALL_DATADIR}/Mod/BIM/Resources/icons"
)

37
src/Mod/BIM/Init.py Normal file
View File

@@ -0,0 +1,37 @@
# ***************************************************************************
# * *
# * Copyright (c) 2022 Yorik van Havre <yorik@uncreated.net> *
# * *
# * 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 *
# * *
# ***************************************************************************
# add import/export types
FreeCAD.addExportType("Industry Foundation Classes (*.ifc)","importers.exportIFC")
# FreeCAD.addImportType("Industry Foundation Classes (*.ifc)","importIFC")
FreeCAD.addImportType("Industry Foundation Classes (*.ifc)", "nativeifc.ifc_import")
FreeCAD.addExportType("Industry Foundation Classes - IFCJSON (*.ifcJSON)","importers.exportIFC")
FreeCAD.addImportType("Wavefront OBJ - Arch module (*.obj *.OBJ)","importers.importOBJ")
FreeCAD.addExportType("Wavefront OBJ - Arch module (*.obj)","importers.importOBJ")
FreeCAD.addExportType("WebGL file (*.html)","importers.importWebGL")
FreeCAD.addExportType("JavaScript Object Notation (*.json)","importers.importJSON")
FreeCAD.addImportType("Collada (*.dae *.DAE)","importers.importDAE")
FreeCAD.addExportType("Collada (*.dae)","importers.importDAE")
FreeCAD.addImportType("3D Studio mesh (*.3ds *.3DS)","importers.import3DS")
FreeCAD.addImportType("SweetHome3D XML export (*.zip *.ZIP)","importers.importSH3D")
FreeCAD.addImportType("Shapefile (*.shp *.SHP)","importers.importSHP")

675
src/Mod/BIM/InitGui.py Normal file
View File

@@ -0,0 +1,675 @@
# ***************************************************************************
# * *
# * Copyright (c) 2017 Yorik van Havre <yorik@uncreated.net> *
# * *
# * 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 *
# * *
# ***************************************************************************
"""The BIM workbench"""
import os
import FreeCAD
import FreeCADGui
import Arch_rc
class BIMWorkbench(Workbench):
def __init__(self):
def QT_TRANSLATE_NOOP(context, text):
return text
bdir = os.path.join(FreeCAD.getResourceDir(), "Mod", "BIM")
tt = QT_TRANSLATE_NOOP("BIM","The BIM workbench is used to model buildings")
self.__class__.MenuText = QT_TRANSLATE_NOOP("BIM", "BIM")
self.__class__.ToolTip = tt
self.__class__.Icon = os.path.join(bdir,"Resources", "icons",
"BIMWorkbench.svg")
def Initialize(self):
# add translations and icon paths
FreeCADGui.addIconPath(":/icons")
FreeCADGui.addLanguagePath(":/translations")
# Create menus and toolbars
self.createTools()
# Load Arch & Draft preference pages
self.loadPreferences()
Log("Loading BIM module... done\n")
FreeCADGui.updateLocale()
def createTools(self):
"Create tolbars and menus"
def QT_TRANSLATE_NOOP(context, text):
return text
# Import Draft & BIM commands
import DraftTools
import bimcommands
from nativeifc import ifc_commands
# build menus and toolbars
self.draftingtools = [
"BIM_Sketch",
"Draft_Line",
"Draft_Wire",
"Draft_Circle",
"Draft_Arc",
"Draft_Arc_3Points",
"Draft_Fillet",
"Draft_Ellipse",
"Draft_Polygon",
"Draft_Rectangle",
"Draft_BSpline",
"Draft_BezCurve",
"Draft_CubicBezCurve",
"Draft_Point",
]
self.annotationtools = [
#"BIM_ImagePlane",
"BIM_Text",
"Draft_ShapeString",
"BIM_DimensionAligned",
"BIM_DimensionHorizontal",
"BIM_DimensionVertical",
"BIM_Leader",
"Draft_Label",
"Arch_Axis",
"Arch_AxisSystem",
"Arch_Grid",
"Arch_SectionPlane",
"Draft_Hatch",
"BIM_TDPage",
"BIM_TDView",
"BIM_Shape2DView",
]
self.bimtools = [
"BIM_Project",
"Arch_Site",
"Arch_Building",
"Arch_Level",
"Arch_Space",
"Separator",
"Arch_Wall",
"Arch_CurtainWall",
"BIM_Column",
"BIM_Beam",
"BIM_Slab",
"BIM_Door",
"Arch_Window",
"Arch_Pipe",
"Arch_PipeConnector",
"Arch_Stairs",
"Arch_Roof",
"Arch_Panel",
"Arch_Frame",
"Arch_Fence",
"Arch_Truss",
"Arch_Rebar",
]
self.generictools = [
"Arch_Profile",
"BIM_Box",
"BIM_Builder",
"Draft_Facebinder",
"BIM_Library",
"Arch_Component",
"Arch_Reference",
]
self.modify = [
"Draft_Move",
"BIM_Copy",
"Draft_Rotate",
"BIM_Clone",
"BIM_Unclone",
"Draft_Offset",
"BIM_Offset2D",
"Draft_Trimex",
"Draft_Join",
"Draft_Split",
"Draft_Scale",
"Draft_Stretch",
"BIM_Rewire",
"BIM_Glue",
"Draft_Upgrade",
"Draft_Downgrade",
"Draft_Draft2Sketch",
"Arch_CutPlane",
"Arch_Add",
"Arch_Remove",
"BIM_Reextrude",
"Draft_OrthoArray",
"Draft_PathArray",
"Draft_PointArray",
"Draft_Mirror",
"BIM_Extrude",
"BIM_Cut",
"BIM_Fuse",
"BIM_Common",
"BIM_Compound",
"BIM_SimpleCopy",
]
self.manage = [
"BIM_Setup",
"BIM_Views",
"BIM_ProjectManager",
"BIM_Windows",
"BIM_IfcElements",
"BIM_IfcQuantities",
"BIM_IfcProperties",
"BIM_Classification",
"BIM_Layers",
"BIM_Material",
"Arch_Schedule",
"BIM_Preflight",
"Draft_AnnotationStyleEditor",
]
self.utils = [
"BIM_TogglePanels",
"BIM_Trash",
"BIM_WPView",
"Draft_SelectGroup",
"Draft_Slope",
"Draft_WorkingPlaneProxy",
"Draft_AddConstruction",
"Arch_SplitMesh",
"Arch_MeshToShape",
"Arch_SelectNonSolidMeshes",
"Arch_RemoveShape",
"Arch_CloseHoles",
"Arch_MergeWalls",
"Arch_Check",
"Arch_ToggleIfcBrepFlag",
"Arch_ToggleSubs",
"Arch_Survey",
"BIM_Diff",
"BIM_IfcExplorer",
]
nudge = [
"BIM_Nudge_Switch",
"BIM_Nudge_Up",
"BIM_Nudge_Down",
"BIM_Nudge_Left",
"BIM_Nudge_Right",
"BIM_Nudge_RotateLeft",
"BIM_Nudge_RotateRight",
"BIM_Nudge_Extend",
"BIM_Nudge_Shrink",
]
# append BIM snaps
from draftutils import init_tools
self.snapbar = init_tools.get_draft_snap_commands()
self.snapmenu = self.snapbar + [
"BIM_SetWPTop",
"BIM_SetWPFront",
"BIM_SetWPSide",
]
# create generic tools command
class BIM_GenericTools:
def __init__(self, tools):
self.tools = tools
def GetCommands(self):
return self.tools
def GetResources(self):
t = QT_TRANSLATE_NOOP("BIM_GenericTools", "Generic 3D tools")
return { "MenuText": t, "ToolTip": t, "Icon": "BIM_Box"}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
FreeCADGui.addCommand("BIM_GenericTools", BIM_GenericTools(self.generictools))
self.bimtools.append("BIM_GenericTools")
# load rebar tools (Reinforcement addon)
try:
import RebarTools
except ImportError:
pass
else:
# create popup group for Rebar tools
class RebarGroupCommand:
def GetCommands(self):
return tuple(["Arch_Rebar"] + RebarTools.RebarCommands)
def GetResources(self):
return {
"MenuText": QT_TRANSLATE_NOOP(
"Arch_RebarTools", "Reinforcement tools"
),
"ToolTip": QT_TRANSLATE_NOOP(
"Arch_RebarTools", "Reinforcement tools"
),
"Icon": "Arch_Rebar",
}
def IsActive(self):
return not FreeCAD.ActiveDocument is None
FreeCADGui.addCommand("Arch_RebarTools", RebarGroupCommand())
self.bimtools[self.bimtools.index("Arch_Rebar")] = "Arch_RebarTools"
RebarTools.load_translations()
Log("Load Reinforcement Module...done\n")
if hasattr(RebarTools, "updateLocale"):
RebarTools.updateLocale()
#self.rebar = RebarTools.RebarCommands + ["Arch_Rebar"]
# try to load bimbots
try:
import bimbots
except ImportError:
pass
else:
class BIMBots:
def GetResources(self):
return bimbots.get_plugin_info()
def Activated(self):
bimbots.launch_ui()
FreeCADGui.addCommand("BIMBots", BIMBots())
self.utils.append("BIMBots")
# load Reporting
try:
import report
except ImportError:
pass
else:
if "Report_Create" in Gui.listCommands():
self.manage[self.manage.index("Arch_Schedule")] = "Report_Create"
# load webtools
try:
import BIMServer, Git, Sketchfab
except ImportError:
pass
else:
self.utils.extend(
[
"WebTools_Git",
"WebTools_BimServer",
"WebTools_Sketchfab",
]
)
# load flamingo
try:
import CommandsPolar, CommandsFrame, CommandsPipe
except ImportError:
flamingo = None
else:
flamingo = [
"frameIt",
"fillFrame",
"insertPath",
"insertSection",
"FrameLineManager",
"spinSect",
"reverseBeam",
"shiftBeam",
"pivotBeam",
"levelBeam",
"alignEdge",
"rotJoin",
"alignFlange",
"stretchBeam",
"extend",
"adjustFrameAngle",
"insertPipe",
"insertElbow",
"insertReduct",
"insertCap",
"insertFlange",
"insertUbolt",
"insertPypeLine",
"breakPipe",
"mateEdges",
"extend2intersection",
"extend1intersection",
"laydown",
"raiseup",
]
# load fasteners
try:
import FastenerBase, FastenersCmd
except ImportError:
fasteners = None
else:
fasteners = [
c
for c in FastenerBase.FSGetCommands("screws")
if not isinstance(c, tuple)
]
# load nativeifc tools
ifctools = ifc_commands.get_commands()
# create toolbars
t1 = QT_TRANSLATE_NOOP("Workbench", "Drafting tools")
t2 = QT_TRANSLATE_NOOP("Workbench", "Draft snap")
t3 = QT_TRANSLATE_NOOP("Workbench", "3D/BIM tools")
t4 = QT_TRANSLATE_NOOP("Workbench", "Annotation tools")
t5 = QT_TRANSLATE_NOOP("Workbench", "Modification tools")
t6 = QT_TRANSLATE_NOOP("Workbench", "Manage tools")
self.appendToolbar(t1, self.draftingtools)
self.appendToolbar(t2, self.snapbar)
self.appendToolbar(t3, self.bimtools)
self.appendToolbar(t4, self.annotationtools)
self.appendToolbar(t5, self.modify)
self.appendToolbar(t6, self.manage)
# create menus
t1 = QT_TRANSLATE_NOOP("Workbench", "&2D Drafting")
t2 = QT_TRANSLATE_NOOP("Workbench", "&3D/BIM")
t3 = QT_TRANSLATE_NOOP("Workbench", "Reinforcement tools")
t4 = QT_TRANSLATE_NOOP("Workbench", "&Annotation")
t5 = QT_TRANSLATE_NOOP("Workbench", "&Snapping")
t6 = QT_TRANSLATE_NOOP("Workbench", "&Modify")
t7 = QT_TRANSLATE_NOOP("Workbench", "&Manage")
t8 = QT_TRANSLATE_NOOP("Workbench", "&IFC")
t9 = QT_TRANSLATE_NOOP("Workbench", "&Flamingo")
t10 = QT_TRANSLATE_NOOP("Workbench", "&Fasteners")
t11 = QT_TRANSLATE_NOOP("Workbench", "&Utils")
t12 = QT_TRANSLATE_NOOP("Workbench", "Nudge")
#self.bimtools_menu = list(self.bimtools)
#if "Arch_RebarTools" in self.bimtools_menu:
# self.bimtools_menu.remove("Arch_RebarTools")
self.appendMenu(t1, self.draftingtools)
self.appendMenu(t2, self.bimtools)
#if self.rebar:
# self.appendMenu([t2, t3], self.rebar)
self.appendMenu(t4, self.annotationtools)
self.appendMenu(t5, self.snapmenu)
self.appendMenu(t6, self.modify)
self.appendMenu(t7, self.manage)
if ifctools:
self.appendMenu(t8, ifctools)
if flamingo:
self.appendMenu(t9, flamingo)
if fasteners:
self.appendMenu(t10, fasteners)
self.appendMenu(t11, self.utils)
self.appendMenu([t11, t12], nudge)
def loadPreferences(self):
"""Set up preferences pages"""
def QT_TRANSLATE_NOOP(context, text):
return text
t1 = QT_TRANSLATE_NOOP("QObject", "Arch")
t2 = QT_TRANSLATE_NOOP("QObject", "Draft")
FreeCADGui.addPreferencePage(":/ui/preferences-arch.ui", t1)
FreeCADGui.addPreferencePage(":/ui/preferences-archdefaults.ui", t1)
if hasattr(FreeCADGui, "draftToolBar"):
if hasattr(FreeCADGui.draftToolBar, "loadedPreferences"):
return
from draftutils import params
params._param_observer_start()
FreeCADGui.addPreferencePage(":/ui/preferences-draft.ui", t2)
FreeCADGui.addPreferencePage(":/ui/preferences-draftinterface.ui", t2)
FreeCADGui.addPreferencePage(":/ui/preferences-draftsnap.ui", t2)
FreeCADGui.addPreferencePage(":/ui/preferences-draftvisual.ui", t2)
FreeCADGui.addPreferencePage(":/ui/preferences-drafttexts.ui", t2)
FreeCADGui.draftToolBar.loadedPreferences = True
def setupMultipleObjectSelection(self):
import BimSelect
if hasattr(FreeCADGui, "addDocumentObserver") and not hasattr(
self, "BimSelectObserver"
):
self.BimSelectObserver = BimSelect.Setup()
FreeCADGui.addDocumentObserver(self.BimSelectObserver)
def Activated(self):
import WorkingPlane
from DraftGui import todo
import BimStatusBar
from nativeifc import ifc_observer
PARAMS = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM")
if hasattr(FreeCADGui, "draftToolBar"):
FreeCADGui.draftToolBar.Activated()
if hasattr(FreeCADGui, "Snapper"):
FreeCADGui.Snapper.show()
if hasattr(WorkingPlane, "_view_observer_start"):
WorkingPlane._view_observer_start()
if PARAMS.GetBool("FirstTime", True) and (not hasattr(FreeCAD, "TestEnvironment")):
todo.delay(FreeCADGui.runCommand, "BIM_Welcome")
todo.delay(BimStatusBar.setStatusIcons, True)
FreeCADGui.Control.clearTaskWatcher()
class BimWatcher:
def __init__(self, cmds, name, invert=False):
self.commands = cmds
self.title = name
self.invert = invert
def shouldShow(self):
if self.invert:
return (FreeCAD.ActiveDocument != None) and (
FreeCADGui.Selection.getSelection() != []
)
else:
return (FreeCAD.ActiveDocument != None) and (
not FreeCADGui.Selection.getSelection()
)
FreeCADGui.Control.addTaskWatcher(
[
BimWatcher(self.draftingtools + self.annotationtools, "2D geometry"),
BimWatcher(self.bimtools, "3D/BIM geometry"),
BimWatcher(self.modify, "Modify", invert=True),
]
)
# restore views widget if needed
if PARAMS.GetBool("RestoreBimViews", True):
from bimcommands import BimViews
w = BimViews.findWidget()
if not w:
FreeCADGui.runCommand("BIM_Views")
else:
w.show()
w.toggleViewAction().setVisible(True)
self.setupMultipleObjectSelection()
# add NativeIFC document observer
ifc_observer.add_observer()
# adding a Help menu manipulator
# https://github.com/FreeCAD/FreeCAD/pull/10933
class BIM_WBManipulator:
def modifyMenuBar(self):
return [
{"insert": "BIM_Examples", "menuItem": "Std_ReportBug", "after": ""},
{"insert": "BIM_Tutorial", "menuItem": "Std_ReportBug", "after": ""},
{"insert": "BIM_Help", "menuItem": "Std_ReportBug", "after": ""},
{"insert": "BIM_Welcome", "menuItem": "Std_ReportBug", "after": ""},
]
if not hasattr(Gui, "BIM_WBManipulator"):
Gui.BIM_WBManipulator = BIM_WBManipulator()
Gui.addWorkbenchManipulator(Gui.BIM_WBManipulator)
Log("BIM workbench activated\n")
def Deactivated(self):
from DraftGui import todo
import BimStatusBar
from bimcommands import BimViews
import WorkingPlane
from nativeifc import ifc_observer
PARAMS = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/BIM")
if hasattr(self, "BimSelectObserver"):
FreeCADGui.removeDocumentObserver(self.BimSelectObserver)
del self.BimSelectObserver
if hasattr(FreeCADGui, "draftToolBar"):
FreeCADGui.draftToolBar.Deactivated()
if hasattr(FreeCADGui, "Snapper"):
FreeCADGui.Snapper.hide()
if hasattr(WorkingPlane, "_view_observer_stop"):
WorkingPlane._view_observer_stop()
# print("Deactivating status icon")
todo.delay(BimStatusBar.setStatusIcons, False)
FreeCADGui.Control.clearTaskWatcher()
# store views widget state and vertical size
w = BimViews.findWidget()
PARAMS.SetBool("RestoreBimViews", bool(w))
if w:
PARAMS.SetInt("BimViewsSize", w.height())
w.hide()
w.toggleViewAction().setVisible(False)
# add NativeIFC document observer
ifc_observer.remove_observer()
# Ifc stuff
try:
from nativeifc import ifc_status
ifc_status.toggle_lock(False)
except:
pass
# remove manipulator
if hasattr(Gui, "BIM_WBManipulator"):
Gui.removeWorkbenchManipulator(Gui.BIM_WBManipulator)
del Gui.BIM_WBManipulator
Gui.activeWorkbench().reloadActive()
Log("BIM workbench deactivated\n")
def ContextMenu(self, recipient):
import DraftTools
translate = FreeCAD.Qt.translate
if recipient == "Tree":
groups = False
ungroupable = False
for o in FreeCADGui.Selection.getSelection():
if o.isDerivedFrom("App::DocumentObjectGroup") or o.hasExtension(
"App::GroupExtension"
):
groups = True
else:
groups = False
break
for o in FreeCADGui.Selection.getSelection():
for parent in o.InList:
if parent.isDerivedFrom(
"App::DocumentObjectGroup"
) or parent.hasExtension("App::GroupExtension"):
if o in parent.Group:
ungroupable = True
else:
ungroupable = False
break
if groups:
self.appendContextMenu("", ["Draft_SelectGroup"])
if ungroupable:
self.appendContextMenu("", ["BIM_Ungroup"])
if (len(FreeCADGui.Selection.getSelection()) == 1) and (
FreeCADGui.Selection.getSelection()[0].Name == "Trash"
):
self.appendContextMenu("", ["BIM_EmptyTrash"])
elif recipient == "View":
self.appendContextMenu(translate("BIM", "Snapping"), self.snapmenu)
if FreeCADGui.Selection.getSelection():
if FreeCADGui.Selection.getSelection()[0].Name != "Trash":
self.appendContextMenu("", ["BIM_Trash"])
self.appendContextMenu("", ["Draft_AddConstruction", "Draft_AddToGroup"])
allclones = False
for obj in FreeCADGui.Selection.getSelection():
if hasattr(obj, "CloneOf") and obj.CloneOf:
allclones = True
else:
allclones = False
break
if allclones:
self.appendContextMenu("", ["BIM_ResetCloneColors"])
if len(FreeCADGui.Selection.getSelection()) == 1:
obj = FreeCADGui.Selection.getSelection()[0]
if hasattr(obj, "Group"):
if obj.getTypeIdOfProperty("Group") == "App::PropertyLinkList":
self.appendContextMenu("", ["BIM_Reorder"])
if obj.isDerivedFrom("TechDraw::DrawView"):
self.appendContextMenu("", ["BIM_MoveView"])
def GetClassName(self):
return "Gui::PythonWorkbench"
FreeCADGui.addWorkbench(BIMWorkbench)
# Preference pages for importing and exporting various file formats
# are independent of the loading of the workbench and can be loaded at startup
def QT_TRANSLATE_NOOP(context, text):
return text
t = QT_TRANSLATE_NOOP("QObject", "Import-Export")
FreeCADGui.addPreferencePage(":/ui/preferences-ifc.ui", t)
FreeCADGui.addPreferencePage(":/ui/preferences-ifc-export.ui", t)
FreeCADGui.addPreferencePage(":/ui/preferences-dae.ui", t)
FreeCADGui.addPreferencePage(":/ui/preferencesNativeIFC.ui", t)
# Add unit tests
FreeCAD.__unit_test__ += ["TestArch"]
# The NativeIFC tests require internet connection and file download
# FreeCAD.__unit_test__ += ["nativeifc.ifc_selftest"]

Some files were not shown because too many files have changed in this diff Show More