Merge branch 'master' into bugfix/path-tag-dressup-issue

This commit is contained in:
mlampert
2020-02-06 19:59:32 -08:00
committed by GitHub
64 changed files with 17878 additions and 4298 deletions
+2 -3
View File
@@ -776,9 +776,8 @@ Document* Application::openDocumentPrivate(const char * FileName,
if(!isMainDoc)
return 0;
std::stringstream str;
str << "The project '" << FileName << "' is already open!";
throw Base::FileSystemError(str.str().c_str());
return it->second;
}
std::string name;
+37 -10
View File
@@ -518,18 +518,34 @@ void Application::open(const char* FileName, const char* Module)
if (Module != 0) {
try {
// issue module loading
Command::doCommand(Command::App, "import %s", Module);
if(File.hasExtension("FCStd")) {
bool handled = false;
std::string filepath = File.filePath();
for(auto &v : d->documents) {
auto doc = v.second->getDocument();
std::string fi = Base::FileInfo(doc->FileName.getValue()).filePath();
if(filepath == fi) {
handled = true;
Command::doCommand(Command::App, "FreeCADGui.reload('%s')", doc->getName());
break;
}
}
if(!handled)
Command::doCommand(Command::App, "FreeCAD.openDocument('%s')", FileName);
} else {
// issue module loading
Command::doCommand(Command::App, "import %s", Module);
// load the file with the module
Command::doCommand(Command::App, "%s.open(u\"%s\")", Module, unicodepath.c_str());
// load the file with the module
Command::doCommand(Command::App, "%s.open(u\"%s\")", Module, unicodepath.c_str());
// ViewFit
if (!File.hasExtension("FCStd") && sendHasMsgToActiveView("ViewFit")) {
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath
("User parameter:BaseApp/Preferences/View");
if (hGrp->GetBool("AutoFitToView", true))
Command::doCommand(Command::Gui, "Gui.SendMsgToActiveView(\"ViewFit\")");
// ViewFit
if (sendHasMsgToActiveView("ViewFit")) {
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath
("User parameter:BaseApp/Preferences/View");
if (hGrp->GetBool("AutoFitToView", true))
Command::doCommand(Command::Gui, "Gui.SendMsgToActiveView(\"ViewFit\")");
}
}
// the original file name is required
@@ -2266,6 +2282,17 @@ App::Document *Application::reopen(App::Document *doc) {
|| d->testStatus(App::Document::PartialRestore) )
docs.push_back(d->FileName.getValue());
}
if(docs.empty()) {
Document *gdoc = getDocument(doc);
if(gdoc) {
setActiveDocument(gdoc);
if(!gdoc->setActiveView())
gdoc->setActiveView(0,View3DInventor::getClassTypeId());
}
return doc;
}
for(auto &file : docs)
App::GetApplication().openDocument(file.c_str(),false);
}
+2 -1
View File
@@ -264,7 +264,8 @@ public:
static PyObject* sOpen (PyObject *self,PyObject *args); // open Python scripts
static PyObject* sInsert (PyObject *self,PyObject *args); // open Python scripts
static PyObject* sExport (PyObject *self,PyObject *args);
static PyObject* sReload (PyObject *self,PyObject *args);
static PyObject* sReload (PyObject *self,PyObject *args); // reload FCStd file
static PyObject* sLoadFile (PyObject *self,PyObject *args); // open all types of files
static PyObject* sCoinRemoveAllChildren (PyObject *self,PyObject *args);
+38
View File
@@ -218,6 +218,13 @@ PyMethodDef Application::Methods[] = {
"reload(name) -> doc\n\n"
"Reload a partial opened document"},
{"loadFile", (PyCFunction) Application::sLoadFile, METH_VARARGS,
"loadFile(string=filename,[string=module]) -> None\n\n"
"Loads an arbitrary file by delegating to the given Python module:\n"
"* If no module is given it will be determined by the file extension.\n"
"* If more than one module can load a file the first one one will be taken.\n"
"* If no module exists to load the file an exception will be raised."},
{"coinRemoveAllChildren", (PyCFunction) Application::sCoinRemoveAllChildren, METH_VARARGS,
"Remove all children from a group node"},
@@ -1470,6 +1477,37 @@ PyObject* Application::sReload(PyObject * /*self*/, PyObject *args)
Py_Return;
}
PyObject* Application::sLoadFile(PyObject * /*self*/, PyObject *args)
{
char *path, *mod="";
if (!PyArg_ParseTuple(args, "s|s", &path, &mod)) // convert args: Python->C
return 0; // NULL triggers exception
PY_TRY {
Base::FileInfo fi(path);
if (!fi.isFile() || !fi.exists()) {
PyErr_Format(PyExc_IOError, "File %s doesn't exist.", path);
return 0;
}
std::string module = mod;
if (module.empty()) {
std::string ext = fi.extension();
std::vector<std::string> modules = App::GetApplication().getImportModules(ext.c_str());
if (modules.empty()) {
PyErr_Format(PyExc_IOError, "Filetype %s is not supported.", ext.c_str());
return 0;
}
else {
module = modules.front();
}
}
Application::Instance->open(path,mod);
Py_Return;
} PY_CATCH
}
PyObject* Application::sAddDocObserver(PyObject * /*self*/, PyObject *args)
{
PyObject* o;
+58
View File
@@ -111,6 +111,63 @@ bool StdCmdRandomColor::isActive(void)
}
//===========================================================================
// Std_SendToPythonConsole
//===========================================================================
DEF_STD_CMD_A(StdCmdSendToPythonConsole)
StdCmdSendToPythonConsole::StdCmdSendToPythonConsole()
:Command("Std_SendToPythonConsole")
{
// setting the
sGroup = QT_TR_NOOP("Edit");
sMenuText = QT_TR_NOOP("&Send to Python Console");
sToolTipText = QT_TR_NOOP("Sends the selected object to the Python console");
sWhatsThis = "Std_SendToPythonConsole";
sStatusTip = QT_TR_NOOP("Sends the selected object to the Python console");
sPixmap = "applications-python";
sAccel = "Ctrl+Shift+P";
}
bool StdCmdSendToPythonConsole::isActive(void)
{
return (Gui::Selection().size() == 1);
}
void StdCmdSendToPythonConsole::activated(int iMsg)
{
Q_UNUSED(iMsg);
const std::vector<Gui::SelectionObject> &sels = Gui::Selection().getSelectionEx("*",App::DocumentObject::getClassTypeId(),true,true);
if (sels.empty())
return;
const App::DocumentObject *obj = sels[0].getObject();
QString docname = QString::fromLatin1(obj->getDocument()->getName());
QString objname = QString::fromLatin1(obj->getNameInDocument());
try {
QString cmd = QString::fromLatin1("obj = App.getDocument(\"%1\").getObject(\"%2\")").arg(docname,objname);
Gui::Command::runCommand(Gui::Command::Gui,cmd.toLatin1());
if (sels[0].hasSubNames()) {
std::vector<std::string> subnames = sels[0].getSubNames();
if (obj->getPropertyByName("Shape")) {
QString subname = QString::fromLatin1(subnames[0].c_str());
cmd = QString::fromLatin1("shp = App.getDocument(\"%1\").getObject(\"%2\").Shape")
.arg(docname, objname);
Gui::Command::runCommand(Gui::Command::Gui,cmd.toLatin1());
cmd = QString::fromLatin1("elt = App.getDocument(\"%1\").getObject(\"%2\").Shape.%4")
.arg(docname,objname,subname);
Gui::Command::runCommand(Gui::Command::Gui,cmd.toLatin1());
}
}
}
catch (const Base::Exception& e) {
e.ReportException();
}
}
namespace Gui {
void CreateFeatCommands(void)
@@ -119,6 +176,7 @@ void CreateFeatCommands(void)
rcCmdMgr.addCommand(new StdCmdFeatRecompute());
rcCmdMgr.addCommand(new StdCmdRandomColor());
rcCmdMgr.addCommand(new StdCmdSendToPythonConsole());
}
} // namespace Gui
+17 -8
View File
@@ -312,7 +312,9 @@ NaviCubeImplementation::NaviCubeImplementation(
m_HiliteColor = QColor(170,226,247);
m_ButtonColor = QColor(226,233,239,128);
m_PickingFramebuffer = NULL;
m_CubeWidgetSize = 132;
m_CubeWidgetSize = (App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("View")->GetInt("NaviWidgetSize", 132));
m_Menu = createNaviCubeMenu();
}
@@ -372,7 +374,8 @@ GLuint NaviCubeImplementation::createCubeFaceTex(QtGLWidget* gl, float gap, floa
if (text) {
paint.setPen(Qt::white);
QFont sansFont(str("Helvetica"), 0.18 * texSize);
sansFont.setStretch(QFont::ExtraCondensed);
sansFont.setStretch(App::GetApplication().GetUserParameter().GetGroup("BaseApp")
->GetGroup("Preferences")->GetGroup("View")->GetInt("NaviFontStretch", 62));
paint.setFont(sansFont);
paint.drawText(QRect(0, 0, texSize, texSize), Qt::AlignCenter,qApp->translate("Gui::NaviCube",text));
}
@@ -677,12 +680,18 @@ void NaviCubeImplementation::initNaviCube(QtGLWidget* gl) {
if (labels.size() != 6) {
labels.clear();
labels.push_back("FRONT");
labels.push_back("REAR");
labels.push_back("TOP");
labels.push_back("BOTTOM");
labels.push_back("RIGHT");
labels.push_back("LEFT");
labels.push_back(App::GetApplication().GetUserParameter().GetGroup("BaseApp")
->GetGroup("Preferences")->GetGroup("View")->GetASCII("NaviTextFront", "FRONT"));
labels.push_back(App::GetApplication().GetUserParameter().GetGroup("BaseApp")
->GetGroup("Preferences")->GetGroup("View")->GetASCII("NaviTextRear", "REAR"));
labels.push_back(App::GetApplication().GetUserParameter().GetGroup("BaseApp")
->GetGroup("Preferences")->GetGroup("View")->GetASCII("NaviTextTop", "TOP"));
labels.push_back(App::GetApplication().GetUserParameter().GetGroup("BaseApp")
->GetGroup("Preferences")->GetGroup("View")->GetASCII("NaviTextBottom", "BOTTOM"));
labels.push_back(App::GetApplication().GetUserParameter().GetGroup("BaseApp")
->GetGroup("Preferences")->GetGroup("View")->GetASCII("NaviTextRight", "RIGHT"));
labels.push_back(App::GetApplication().GetUserParameter().GetGroup("BaseApp")
->GetGroup("Preferences")->GetGroup("View")->GetASCII("NaviTextLeft", "LEFT"));
}
float gap = 0.12f;
+6 -3
View File
@@ -495,7 +495,8 @@ void StdWorkbench::setupContextMenu(const char* recipient, MenuItem* item) const
if (Gui::Selection().countObjectsOfType(App::DocumentObject::getClassTypeId()) > 0) {
*item << "Separator" << "Std_SetAppearance" << "Std_ToggleVisibility"
<< "Std_ToggleSelectability" << "Std_TreeSelection"
<< "Std_RandomColor" << "Separator" << "Std_Delete";
<< "Std_RandomColor" << "Separator" << "Std_Delete"
<< "Std_SendToPythonConsole";
}
}
else if (strcmp(recipient,"Tree") == 0)
@@ -504,7 +505,8 @@ void StdWorkbench::setupContextMenu(const char* recipient, MenuItem* item) const
*item << "Std_ToggleVisibility" << "Std_ShowSelection" << "Std_HideSelection"
<< "Std_ToggleSelectability" << "Std_TreeSelectAllInstances" << "Separator"
<< "Std_SetAppearance" << "Std_RandomColor" << "Separator"
<< "Std_Cut" << "Std_Copy" << "Std_Paste" << "Std_Delete" << "Separator";
<< "Std_Cut" << "Std_Copy" << "Std_Paste" << "Std_Delete"
<< "Std_SendToPythonConsole" << "Separator";
}
}
}
@@ -534,7 +536,8 @@ MenuItem* StdWorkbench::setupMenuBar() const
edit->setCommand("&Edit");
*edit << "Std_Undo" << "Std_Redo" << "Separator" << "Std_Cut" << "Std_Copy"
<< "Std_Paste" << "Std_DuplicateSelection" << "Separator"
<< "Std_Refresh" << "Std_BoxSelection" << "Std_BoxElementSelection" << "Std_SelectAll" << "Std_Delete"
<< "Std_Refresh" << "Std_BoxSelection" << "Std_BoxElementSelection"
<< "Std_SelectAll" << "Std_Delete" << "Std_SendToPythonConsole"
<< "Separator" << "Std_Placement" /*<< "Std_TransformManip"*/ << "Std_Alignment"
<< "Std_Edit" << "Separator" << "Std_DlgPreferences";
+7 -1
View File
@@ -123,6 +123,7 @@ class CommandAddonManager:
self.dialog.buttonInstall.setIcon(QtGui.QIcon.fromTheme("download",QtGui.QIcon(":/icons/edit_OK.svg")))
self.dialog.buttonUpdateAll.setIcon(QtGui.QIcon(":/icons/button_valid.svg"))
self.dialog.buttonConfigure.setIcon(QtGui.QIcon(":/icons/preferences-system.svg"))
self.dialog.buttonClose.setIcon(QtGui.QIcon.fromTheme("close",QtGui.QIcon(":/icons/process-stop.svg")))
self.dialog.tabWidget.setTabIcon(0,QtGui.QIcon.fromTheme("folder",QtGui.QIcon(":/icons/folder.svg")))
self.dialog.tabWidget.setTabIcon(1,QtGui.QIcon(":/icons/applications-python.svg"))
@@ -143,6 +144,7 @@ class CommandAddonManager:
self.dialog.tabWidget.currentChanged.connect(self.switchtab)
self.dialog.listMacros.currentRowChanged.connect(self.show_macro)
self.dialog.buttonConfigure.clicked.connect(self.show_config)
self.dialog.buttonClose.clicked.connect(self.dialog.reject)
# allow to open links in browser
self.dialog.description.setOpenLinks(True)
@@ -274,7 +276,11 @@ class CommandAddonManager:
import AddonManager_rc
from PySide import QtGui
addonicon = QtGui.QIcon(":/icons/" + repo + "_workbench_icon.svg")
path = ":/icons/" + repo + "_workbench_icon.svg"
if QtCore.QFile.exists(path):
addonicon = QtGui.QIcon(path)
else:
addonicon = QtGui.QIcon(":/icons/document-package.svg")
if addonicon.isNull():
addonicon = QtGui.QIcon(":/icons/document-package.svg")
return addonicon
+13
View File
@@ -151,6 +151,19 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="buttonClose">
<property name="toolTip">
<string>Close the addons manager</string>
</property>
<property name="text">
<string>Close</string>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

+1
View File
@@ -410,6 +410,7 @@ def getColorFromStyledItem(styled_item):
if rgb_color is not None:
col = [rgb_color.Red, rgb_color.Green, rgb_color.Blue]
col.append(int(transparency) if transparency else 0)
col = tuple(col)
# print(col)
else:
col = None
+28 -14
View File
@@ -211,14 +211,22 @@ class DraftTaskPanel:
return False
class DraftToolBar:
"""main draft Toolbar"""
"""The Draft Task panel UI
Draft Toolbar is the main ui of the Draft Module. Once displayed as a
toolbar, now it define the ui of the Task Panel.
Toolbar become obsolete due to lack of manteinence and was disabled
by default in February 2020.
Draft Ui Commands call and get information such as point coordinates,
subcommands activation, continue mode, etc. from Task Panel Ui
"""
def __init__(self):
self.tray = None
self.sourceCmd = None
self.cancel = None
self.pointcallback = None
self.taskmode = Draft.getParam("UiMode",1)
#print("taskmode: ",str(self.taskmode))
self.taskmode = 1 # Draft.getParam("UiMode",1)
# taskmode = 0 was used by draft toolbar that is now obsolete.
# print("taskmode: ",str(self.taskmode))
self.paramcolor = Draft.getParam("color",255)>>8
self.color = QtGui.QColor(self.paramcolor)
self.facecolor = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/View").GetUnsigned("DefaultShapeColor",4294967295)>>8
@@ -262,7 +270,7 @@ class DraftToolBar:
self.tray.setParent(mw)
self.tray.hide()
else:
else: # self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
# create the draft Toolbar
self.draftWidget = QtGui.QDockWidget()
self.baseWidget = DraftDockWidget()
@@ -349,6 +357,7 @@ class DraftToolBar:
if not width:
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
inputfield.setSizePolicy(sizePolicy)
inputfield.setMinimumWidth(110)
else:
inputfield.setMaximumWidth(width)
layout.addWidget(inputfield)
@@ -509,6 +518,7 @@ class DraftToolBar:
# spacer
if not self.taskmode:
# self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding,
QtGui.QSizePolicy.Minimum)
else:
@@ -753,7 +763,7 @@ class DraftToolBar:
self.retranslateUi(self.baseWidget)
self.panel = DraftTaskPanel(self.baseWidget,extra)
todo.delay(FreeCADGui.Control.showDialog,self.panel)
else:
else: # self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
# create a dummy task to block the UI during the works
class dummy:
"""an empty dialog"""
@@ -945,7 +955,7 @@ class DraftToolBar:
if self.taskmode:
self.isTaskOn = False
self.baseWidget = QtGui.QWidget()
else:
else: # self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
self.setTitle(translate("draft", "None"))
self.labelx.setText(translate("draft", "X"))
self.hideXYZ()
@@ -1075,11 +1085,12 @@ class DraftToolBar:
if self.taskmode:
self.baseWidget.setWindowTitle(title)
self.baseWidget.setWindowIcon(QtGui.QIcon(":/icons/"+icon+".svg"))
else:
else: # self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
self.cmdlabel.setText(title)
def selectUi(self,extra=None,callback=None):
if not self.taskmode:
# self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
self.labelx.setText(translate("draft", "Pick Object"))
self.labelx.show()
self.makeDumbTask(extra,callback)
@@ -1437,6 +1448,7 @@ class DraftToolBar:
"""escapes the current command"""
self.continueMode = False
if not self.taskmode:
# self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
self.continueCmd.setChecked(False)
self.finish()
@@ -1850,10 +1862,12 @@ class DraftToolBar:
def show(self):
if not self.taskmode:
# self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
self.draftWidget.setVisible(True)
def hide(self):
if not self.taskmode:
# self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
self.draftWidget.setVisible(False)
def getXPM(self,iconname,size=16):
@@ -2008,7 +2022,7 @@ class DraftToolBar:
self.setWatchers()
if hasattr(self,"tray"):
self.tray.show()
else:
else: # self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
self.draftWidget.setVisible(True)
self.draftWidget.toggleViewAction().setVisible(True)
@@ -2021,7 +2035,7 @@ class DraftToolBar:
#self.tray = None
if hasattr(self,"tray"):
self.tray.hide()
else:
else: # self.taskmode == 0 Draft toolbar is obsolete and has been disabled (February 2020)
self.draftWidget.setVisible(False)
self.draftWidget.toggleViewAction().setVisible(False)
@@ -2389,12 +2403,12 @@ class ShapeStringTaskPanel:
ParamGroup = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Dialog")
if Flag == "Overwrite":
GroupContent = ParamGroup.GetContents()
Found = False
for ParamSet in GroupContent:
if ParamSet[1] == "DontUseNativeFontDialog":
Found = True
break
if GroupContent:
for ParamSet in GroupContent:
if ParamSet[1] == "DontUseNativeFontDialog":
Found = True
break
if Found == False:
ParamGroup.SetBool("DontUseNativeFontDialog", True) #initialize nonexisting one
+69 -113
View File
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>486</width>
<height>808</height>
<width>584</width>
<height>881</height>
</rect>
</property>
<property name="windowTitle">
@@ -17,7 +17,16 @@
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item>
@@ -32,59 +41,6 @@
<string>General Draft Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_19">
<property name="text">
<string>Draft interface mode</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="Gui::PrefComboBox" name="gui::prefcombobox_4">
<property name="toolTip">
<string>This is the UI mode in which the Draft module will work: Toolbar mode will place all Draft settings in a separate toolbar, while taskbar mode will use the FreeCAD Taskview system for all its user interaction</string>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<property name="prefEntry" stdset="0">
<cstring>UiMode</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<item>
<property name="text">
<string>Toolbar</string>
</property>
</item>
<item>
<property name="text">
<string>Taskview</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox_5">
<property name="toolTip">
@@ -515,15 +471,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutRelative</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -565,15 +521,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutContinue</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -615,15 +571,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutClose</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -667,15 +623,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutCopy</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -715,15 +671,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutSubelementMode</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -763,15 +719,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutFill</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -815,15 +771,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutExit</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -863,15 +819,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutSelectEdge</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -911,15 +867,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutAddHold</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -963,15 +919,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutLength</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -1011,15 +967,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutWipe</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -1059,15 +1015,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutSetWP</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -1111,15 +1067,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutCycleSnap</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -1169,15 +1125,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutSnap</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -1217,15 +1173,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutIncreaseRadius</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -1265,15 +1221,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutDecreaseRadius</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -1317,15 +1273,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutRestrictX</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -1365,15 +1321,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>inCommandShortcutRestrictY</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@@ -1413,15 +1369,15 @@ Values with differences below this value will be treated as same. This value wil
<property name="placeholderText">
<string/>
</property>
<property name="clearButtonEnabled">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>RestrictZ</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
<property name="clearButtonEnabled" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
+13
View File
@@ -0,0 +1,13 @@
2020 February
These files define the GuiCommands, that is, actions called in a graphical
way, either buttons, menu entries, or context commands.
These tools should be split from the big `DraftTools.py` module.
These tools are initialized by `InitGui.py`, and require the graphical
interface to exist.
Those commands that require a "task panel" call the respective module
and class in `drafttaskpanels/`.
+7
View File
@@ -0,0 +1,7 @@
2020 February
At the moment these object functions aren't used.
When the Draft tools are eventually split into individual modules,
the code of the object creation functions should be placed here.
+13
View File
@@ -0,0 +1,13 @@
2020 February
These files provide the logic behind the task panel of the GuiCommands
defined in `draftguitools/`.
The task panel graphical interface is properly defined in
the `Resources/ui/` files, which are made with QtCreator.
There are many commands which aren't defined in `draftguitools/`.
These are defined in the big `DraftGui.py` module, which needs to be split
into individual GuiCommands, and each should have its own dedicated
`.ui` file.
@@ -0,0 +1,7 @@
2020 February
At the moment these view providers aren't used at all.
When the Draft tools are eventually split into individual modules,
the code of the view providers should be placed here.
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 124 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 71 KiB

+3
View File
@@ -43,6 +43,7 @@ SET(FemExamples_SRCS
femexamples/material_multiple_twoboxes.py
femexamples/material_nl_platewithhole.py
femexamples/rc_wall_2d.py
femexamples/thermomech_bimetall.py
femexamples/thermomech_flow1d.py
femexamples/thermomech_spine.py
)
@@ -56,6 +57,7 @@ SET(FemExampleMeshes_SRCS
femexamples/meshes/mesh_contact_tube_tube_tria3.py
femexamples/meshes/mesh_rc_wall_2d_tria6.py
femexamples/meshes/mesh_platewithhole_tetra10.py
femexamples/meshes/mesh_thermomech_bimetall_tetra10.py
femexamples/meshes/mesh_thermomech_flow1d_seg3.py
femexamples/meshes/mesh_thermomech_spine_tetra10.py
)
@@ -193,6 +195,7 @@ SET(FemTestsCcx_SRCS
femtest/data/ccx/Flow1D_thermomech_expected_values
femtest/data/ccx/Flow1D_thermomech_inout_nodes.txt
femtest/data/ccx/Flow1D_thermomech.FCStd
femtest/data/ccx/thermomech_bimetall.inp
)
SET(FemTestsElmer_SRCS
-1
View File
@@ -67,7 +67,6 @@
<file>icons/fem-solver-analysis-frequency.svg</file>
<file>icons/fem-solver-analysis-static.svg</file>
<file>icons/fem-solver-analysis-thermomechanical.svg</file>
<file>icons/fem-solver-cfd.svg</file>
<file>icons/fem-solver-control.svg</file>
<file>icons/fem-solver-elmer.svg</file>
<file>icons/fem-solver-inp-editor.svg</file>
@@ -1,70 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64px" height="64px" id="svg2860" sodipodi:version="0.32" inkscape:version="0.48.5 r10040" sodipodi:docname="fem-cfd-analysis.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.1">
<defs id="defs2862">
<linearGradient inkscape:collect="always" id="linearGradient3768">
<stop style="stop-color:#edd400;stop-opacity:1;" offset="0" id="stop3770"/>
<stop style="stop-color:#edd400;stop-opacity:0;" offset="1" id="stop3772"/>
</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"/>
<radialGradient inkscape:collect="always" xlink:href="#linearGradient3377" id="radialGradient3703" gradientUnits="userSpaceOnUse" cx="135.38333" cy="97.369568" fx="135.38333" fy="97.369568" r="19.467436" gradientTransform="matrix(0.97435,0.2250379,-0.4623105,2.0016728,48.487554,-127.99883)"/>
<linearGradient id="linearGradient3377">
<stop id="stop3379" offset="0" style="stop-color:#faff2b;stop-opacity:1;"/>
<stop id="stop3381" offset="1" style="stop-color:#ffaa00;stop-opacity:1;"/>
</linearGradient>
<radialGradient inkscape:collect="always" xlink:href="#linearGradient3377" id="radialGradient3705" gradientUnits="userSpaceOnUse" cx="148.88333" cy="81.869568" fx="148.88333" fy="81.869568" r="19.467436" gradientTransform="matrix(1.3852588,-5.1367833e-2,3.7056289e-2,0.9993132,-60.392403,7.7040438)"/>
<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="perspective2868"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3768" id="linearGradient3774" x1="43" y1="37" x2="31" y2="7" gradientUnits="userSpaceOnUse"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3768" id="linearGradient3788" gradientUnits="userSpaceOnUse" x1="43" y1="37" x2="31" y2="7"/>
</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="36.77016" inkscape:cy="28.804499" inkscape:current-layer="layer1" showgrid="true" inkscape:document-units="px" inkscape:grid-bbox="true" inkscape:window-width="1600" inkscape:window-height="837" inkscape:window-x="0" inkscape:window-y="27" inkscape:window-maximized="1" inkscape:snap-nodes="false" inkscape:snap-bbox="true">
<inkscape:grid type="xygrid" id="grid2993" empspacing="2" visible="true" enabled="true" snapvisiblegridlinesonly="true"/>
</sodipodi:namedview>
<metadata id="metadata2865">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
<dc:creator>
<cc:Agent>
<dc:title>[qingfengxia]</dc:title>
</cc:Agent>
</dc:creator>
<dc:title>fem-cfd-analysis</dc:title>
<dc:date>2016-08-10</dc:date>
<dc:relation>http://www.freecadweb.org/wiki/index.php?title=Artwork</dc:relation>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/Mod/</dc:identifier>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<cc:license>https://www.gnu.org/copyleft/lesser.html</cc:license>
<dc:contributor>
<cc:Agent>
<dc:title>[agryson] Alexander Gryson</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer">
<g transform="matrix(1.3636193,0,0,1.6799586,-14.455353,-39.135338)" style="font-size:22.03626633000000012px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ef2929;fill-opacity:1;stroke:#a40000;stroke-width:1.32139944999999992;stroke-linejoin:round;font-family:Bitstream Vera Sans" id="text2991">
<path d="m 25.755667,44.466664 0,2.291858 c -0.731686,-0.681447 -1.513571,-1.190748 -2.345657,-1.527905 -0.824936,-0.337129 -1.70366,-0.505701 -2.636174,-0.505715 -1.836363,1.4e-5 -3.242322,0.563115 -4.217879,1.689303 -0.975568,1.119041 -1.46335,2.740197 -1.463346,4.863473 -4e-6,2.116119 0.487778,3.737275 1.463346,4.863473 0.975557,1.119031 2.381516,1.678545 4.217879,1.678544 0.932514,10e-7 1.811238,-0.16857 2.636174,-0.505715 0.832086,-0.337142 1.613971,-0.846443 2.345657,-1.527906 l 0,2.270338 c -0.760379,0.516476 -1.56737,0.903832 -2.420976,1.162069 -0.846456,0.258237 -1.743113,0.387356 -2.689974,0.387356 -2.431743,0 -4.347003,-0.742432 -5.745784,-2.227298 -1.398789,-1.492036 -2.098181,-3.525654 -2.09818,-6.100861 -1e-6,-2.582364 0.699391,-4.615983 2.09818,-6.100861 1.398781,-1.492023 3.314041,-2.238042 5.745784,-2.238058 0.961207,1.6e-5 1.865038,0.129135 2.711494,0.387356 0.853605,0.25108 1.653423,0.631263 2.399456,1.140549" id="path3777" inkscape:connector-curvature="0" style="fill:#ef2929;stroke:#a40000;stroke-width:1.32139944999999992;stroke-linejoin:round"/>
<path d="m 29.134275,43.229276 9.23199,0 0,1.829182 -7.058491,0 0,4.734354 6.369858,0 0,1.829183 -6.369858,0 0,7.671805 -2.173499,0 0,-16.064524" id="path3779" inkscape:connector-curvature="0" style="fill:#ef2929;stroke:#a40000;stroke-width:1.32139944999999992;stroke-linejoin:round"/>
<path d="m 44.00445,45.015419 0,12.492239 2.625414,0 c 2.21653,10e-7 3.837686,-0.502127 4.863473,-1.506386 1.032937,-1.004252 1.549412,-2.589542 1.549425,-4.755874 -1.3e-5,-2.151969 -0.516488,-3.726498 -1.549425,-4.723594 -1.025787,-1.004243 -2.646943,-1.506371 -4.863473,-1.506385 l -2.625414,0 m -2.173499,-1.786143 4.465357,0 c 3.113186,1.6e-5 5.397869,0.649196 6.854053,1.947541 1.456158,1.291201 2.184243,3.314059 2.184259,6.068581 -1.6e-5,2.768885 -0.731688,4.802504 -2.195019,6.100861 -1.463358,1.298362 -3.744453,1.947541 -6.843293,1.947541 l -4.465357,0 0,-16.064524" id="path3781" inkscape:connector-curvature="0" style="fill:#ef2929;stroke:#a40000;stroke-width:1.32139944999999992;stroke-linejoin:round"/>
</g>
<g id="g3783" transform="matrix(0.81056367,0,0,0.83951051,6.0401219,0.58006947)">
<g id="text3014" style="font-size:54.47337341px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffff00;fill-opacity:1;stroke:#302b00;stroke-width:2.42450643;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:4.1;font-family:DejaVu Serif;-inkscape-font-specification:DejaVu Serif" transform="scale(1.0450343,0.95690641)">
<path id="path3764" style="stroke:#302b00;stroke-width:2.42450643" d="m 21.750465,28.45671 14.575883,0 L 29.038407,9.5718981 21.750465,28.45671 m -11.224494,14.389695 0,-2.819423 3.484381,0 14.15031,-36.891879 4.468519,0 14.176908,36.891879 3.909954,0 0,2.819423 -14.442892,0 0,-2.819423 4.415323,0 -3.324791,-8.724251 -16.703749,0 -3.324791,8.724251 4.362125,0 0,2.819423 -11.171297,0" inkscape:connector-curvature="0"/>
</g>
<path sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path3766" d="M 45,37 32,6" style="fill:#edd400;stroke:url(#linearGradient3788);stroke-width:1.21225321px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.9 KiB

+22 -51
View File
@@ -207,6 +207,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -227,22 +230,22 @@
</widget>
</item>
<item>
<widget class="QSpinBox" name="sb_displacement_factor">
<widget class="QDoubleSpinBox" name="sb_displacement_factor">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="inputMethodHints">
<set>Qt::ImhFormattedNumbersOnly</set>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
<property name="maximum">
<number>1000000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="value">
<property name="decimals">
<number>1</number>
</property>
<property name="maximum">
<double>1000000.000000000000000</double>
</property>
</widget>
</item>
</layout>
@@ -260,21 +263,21 @@
</widget>
</item>
<item>
<widget class="QSpinBox" name="sb_displacement_factor_max">
<widget class="QDoubleSpinBox" name="sb_displacement_factor_max">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="inputMethodHints">
<set>Qt::ImhFormattedNumbersOnly</set>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="maximum">
<number>1000000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="value">
<number>100</number>
<double>1000000.000000000000000</double>
</property>
</widget>
</item>
@@ -304,7 +307,7 @@
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;P1-P3 # Stress intensity stress equation. Available values are numpy array format. Calculation np.function can be used on available values. &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
@@ -437,22 +440,6 @@ p, li { white-space: pre-wrap; }
</hint>
</hints>
</connection>
<connection>
<sender>cb_show_displacement</sender>
<signal>toggled(bool)</signal>
<receiver>sb_displacement_factor</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>112</x>
<y>240</y>
</hint>
<hint type="destinationlabel">
<x>124</x>
<y>269</y>
</hint>
</hints>
</connection>
<connection>
<sender>cb_show_displacement</sender>
<signal>toggled(bool)</signal>
@@ -469,22 +456,6 @@ p, li { white-space: pre-wrap; }
</hint>
</hints>
</connection>
<connection>
<sender>cb_show_displacement</sender>
<signal>toggled(bool)</signal>
<receiver>sb_displacement_factor_max</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>161</x>
<y>237</y>
</hint>
<hint type="destinationlabel">
<x>159</x>
<y>302</y>
</hint>
</hints>
</connection>
<connection>
<sender>cb_show_displacement</sender>
<signal>toggled(bool)</signal>
+4
View File
@@ -129,6 +129,7 @@ gf()
./bin/FreeCADCmd --run-test "femtest.app.test_ccxtools.TestCcxTools.test_static_constraint_contact_solid_solid"
./bin/FreeCADCmd --run-test "femtest.app.test_ccxtools.TestCcxTools.test_static_material_multiple"
./bin/FreeCADCmd --run-test "femtest.app.test_ccxtools.TestCcxTools.test_static_material_nonlinar"
./bin/FreeCADCmd --run-test "femtest.app.test_ccxtools.TestCcxTools.test_thermomech_bimetall"
./bin/FreeCADCmd --run-test "femtest.app.test_ccxtools.TestCcxTools.test_thermomech_flow1D_analysis"
./bin/FreeCADCmd --run-test "femtest.app.test_ccxtools.TestCcxTools.test_thermomech_spine_analysis"
./bin/FreeCADCmd --run-test "femtest.app.test_common.TestFemCommon.test_adding_refshaps"
@@ -183,6 +184,9 @@ unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromName("femtest.a
import unittest
unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromName("femtest.app.test_ccxtools.TestCcxTools.test_static_material_nonlinar"))
import unittest
unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromName("femtest.app.test_ccxtools.TestCcxTools.test_thermomech_bimetall"))
import unittest
unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromName("femtest.app.test_ccxtools.TestCcxTools.test_thermomech_flow1D_analysis"))
@@ -89,6 +89,8 @@ def setup(doc=None, solvertype="ccxtools"):
BooleanFrag = BOPTools.SplitFeatures.makeBooleanFragments(name='BooleanFragments')
BooleanFrag.Objects = [upper_tube, force_point]
if FreeCAD.GuiUp:
upper_tube.ViewObject.hide()
compound = doc.addObject("Part::Compound", "Compound")
compound.Links = [BooleanFrag, lower_tube]
@@ -33,6 +33,7 @@ setup()
import FreeCAD
import Part
import ObjectsFem
import Fem
from FreeCAD import Vector, Rotation
@@ -55,7 +56,7 @@ def setup(doc=None, solvertype="ccxtools"):
# parts
# bottom box
bottom_box_obj = doc.addObject("Part::Box", "TopBox")
bottom_box_obj = doc.addObject("Part::Box", "BottomBox")
bottom_box_obj.Length = 100
bottom_box_obj.Width = 25
bottom_box_obj.Height = 500
@@ -64,31 +65,20 @@ def setup(doc=None, solvertype="ccxtools"):
Rotation(0, 0, 0),
Vector(0, 0, 0),
)
doc.recompute()
# top half cylinder
top_cylinder_obj = doc.addObject("Part::Cylinder", "BottomCylinder")
top_cylinder_obj.Radius = 30
top_cylinder_obj.Height = 500
top_cylinder_obj.Placement = FreeCAD.Placement(
# top half cylinder, https://forum.freecadweb.org/viewtopic.php?f=18&t=43001#p366111
top_halfcyl_obj = doc.addObject("Part::Cylinder", "TopHalfCylinder")
top_halfcyl_obj.Radius = 30
top_halfcyl_obj.Height = 500
top_halfcyl_obj.Angle = 180
top_halfcyl_sh = Part.getShape(top_halfcyl_obj, '', needSubElement=False, refine=True)
top_halfcyl_obj.Shape = top_halfcyl_sh
top_halfcyl_obj.Placement = FreeCAD.Placement(
Vector(0, -42, 0),
Rotation(0, 90, 0),
Vector(0, 0, 0),
)
top_box_obj = doc.addObject("Part::Box", "BottomBox")
top_box_obj.Length = 600
top_box_obj.Width = 100
top_box_obj.Height = 100
top_box_obj.Placement = FreeCAD.Placement(
Vector(-10, -142, -52),
Rotation(0, 0, 0),
Vector(0, 0, 0),
)
top_halfcyl_obj = doc.addObject("Part::Cut", "BottomHalfCylinder")
top_halfcyl_obj.Base = top_cylinder_obj
top_halfcyl_obj.Tool = top_box_obj
if FreeCAD.GuiUp:
top_cylinder_obj.ViewObject.hide()
top_box_obj.ViewObject.hide()
doc.recompute()
# all geom fusion
@@ -97,7 +87,6 @@ def setup(doc=None, solvertype="ccxtools"):
if FreeCAD.GuiUp:
bottom_box_obj.ViewObject.hide()
top_halfcyl_obj.ViewObject.hide()
doc.recompute()
if FreeCAD.GuiUp:
@@ -156,14 +145,14 @@ def setup(doc=None, solvertype="ccxtools"):
(all_geom_fusion_obj, "Face5"),
(all_geom_fusion_obj, "Face6"),
(all_geom_fusion_obj, "Face8"),
(all_geom_fusion_obj, "Face10"),
(all_geom_fusion_obj, "Face9"),
]
# constraint pressure
con_pressure = analysis.addObject(
ObjectsFem.makeConstraintPressure(doc, name="ConstraintPressure")
)[0]
con_pressure.References = [(all_geom_fusion_obj, "Face9")]
con_pressure.References = [(all_geom_fusion_obj, "Face10")]
con_pressure.Pressure = 100.0 # Pa ? = 100 Mpa ?
con_pressure.Reversed = False
+19 -1
View File
@@ -38,10 +38,10 @@ doc = run_constraint_contact_solid_solid()
doc = run_material_nl_platewithhole()
doc = run_material_multiple_twoboxes()
doc = run_rcwall2d()
doc = run_thermomech_bimetall()
doc = run_thermomech_flow1d()
doc = run_thermomech_spine()
doc = run_ccx_cantilevernodeload("calculix")
doc = run_ccx_cantilevernodeload("ccxtools")
doc = run_ccx_cantilevernodeload("z88")
@@ -250,6 +250,21 @@ def run_rcwall2d(solver=None, base_name=None):
return doc
def run_thermomech_bimetall(solver=None, base_name=None):
from .thermomech_bimetall import setup
doc = setup()
if base_name is None:
base_name = "Thermomech_Bimetall"
if solver is not None:
base_name += "_" + solver
run_analysis(doc, base_name)
doc.recompute()
return doc
def run_thermomech_flow1d(solver=None, base_name=None):
from .thermomech_flow1d import setup
@@ -286,8 +301,11 @@ def run_all():
run_ccx_cantileverfaceload()
run_ccx_cantilevernodeload()
run_ccx_cantileverprescribeddisplacement()
run_constraint_contact_shell_shell()
run_constraint_contact_solid_solid()
run_material_nl_platewithhole()
run_material_multiple_twoboxes()
run_rcwall2d()
run_thermomech_bimetall()
run_thermomech_flow1d()
run_thermomech_spine()
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,193 @@
# ***************************************************************************
# * Copyright (c) 2020 Bernd Hahnebach <[email protected]> *
# * *
# * This file is part of the FreeCAD CAx development system. *
# * *
# * 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. *
# * *
# * FreeCAD is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with FreeCAD; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
# thermomechanical bimetall
# https://forum.freecadweb.org/viewtopic.php?f=18&t=43040&start=10#p366664
# analytical solution 7.05 mm deflection in the invar material direction
# see post in the forum link
# this file has 7.15 mm max deflection
# to run the example use:
"""
from femexamples.thermomech_bimetall import setup
setup()
"""
import FreeCAD
import ObjectsFem
import Fem
from FreeCAD import Vector, Rotation
import BOPTools.SplitFeatures
mesh_name = "Mesh" # needs to be Mesh to work with unit tests
def init_doc(doc=None):
if doc is None:
doc = FreeCAD.newDocument()
return doc
def setup(doc=None, solvertype="ccxtools"):
# setup model
if doc is None:
doc = init_doc()
# parts
# bottom box
bottom_box_obj = doc.addObject("Part::Box", "BottomBox")
bottom_box_obj.Length = 100
bottom_box_obj.Width = 5
bottom_box_obj.Height = 1
# top box
top_box_obj = doc.addObject("Part::Box", "TopBox")
top_box_obj.Length = 100
top_box_obj.Width = 5
top_box_obj.Height = 1
top_box_obj.Placement = FreeCAD.Placement(
Vector(0, 0, 1),
Rotation(0, 0, 0),
Vector(0, 0, 0),
)
doc.recompute()
# all geom boolean fragment
all_geom_boolfrag_obj = BOPTools.SplitFeatures.makeBooleanFragments(name='BooleanFragments')
all_geom_boolfrag_obj.Objects = [bottom_box_obj, top_box_obj]
if FreeCAD.GuiUp:
bottom_box_obj.ViewObject.hide()
top_box_obj.ViewObject.hide()
doc.recompute()
if FreeCAD.GuiUp:
import FreeCADGui
FreeCADGui.ActiveDocument.activeView().viewAxonometric()
FreeCADGui.SendMsgToActiveView("ViewFit")
# analysis
analysis = ObjectsFem.makeAnalysis(doc, "Analysis")
# solver
if solvertype == "calculix":
solver_object = analysis.addObject(
ObjectsFem.makeSolverCalculix(doc, "SolverCalculiX")
)[0]
elif solvertype == "ccxtools":
solver_object = analysis.addObject(
ObjectsFem.makeSolverCalculixCcxTools(doc, "CalculiXccxTools")
)[0]
solver_object.WorkingDir = u""
if solvertype == "calculix" or solvertype == "ccxtools":
solver_object.AnalysisType = "thermomech"
solver_object.GeometricalNonlinearity = "linear"
solver_object.ThermoMechSteadyState = True
# solver_object.MatrixSolverType = "default"
solver_object.MatrixSolverType = "spooles" # thomas
solver_object.SplitInputWriter = False
solver_object.IterationsThermoMechMaximum = 2000
# solver_object.IterationsControlParameterTimeUse = True # thermomech spine
# material
material_obj_bottom = analysis.addObject(
ObjectsFem.makeMaterialSolid(doc, "MaterialCopper")
)[0]
mat = material_obj_bottom.Material
mat["Name"] = "Copper"
mat["YoungsModulus"] = "130000 MPa"
mat["PoissonRatio"] = "0.354"
mat["SpecificHeat"] = "385 J/kg/K"
mat["ThermalConductivity"] = "200 W/m/K"
mat["ThermalExpansionCoefficient"] = "0.00002 m/m/K"
material_obj_bottom.Material = mat
material_obj_bottom.References = [(all_geom_boolfrag_obj, "Solid1")]
analysis.addObject(material_obj_bottom)
material_obj_top = analysis.addObject(
ObjectsFem.makeMaterialSolid(doc, "MaterialInvar")
)[0]
mat = material_obj_top.Material
mat["Name"] = "Invar"
mat["YoungsModulus"] = "137000 MPa"
mat["PoissonRatio"] = "0.28"
mat["SpecificHeat"] = "510 J/kg/K"
mat["ThermalConductivity"] = "13 W/m/K"
mat["ThermalExpansionCoefficient"] = "0.0000012 m/m/K"
material_obj_top.Material = mat
material_obj_top.References = [(all_geom_boolfrag_obj, "Solid2")]
analysis.addObject(material_obj_top)
# constraint fixed
con_fixed = analysis.addObject(
ObjectsFem.makeConstraintFixed(doc, "ConstraintFixed")
)[0]
con_fixed.References = [
(all_geom_boolfrag_obj, "Face1"),
(all_geom_boolfrag_obj, "Face7"),
]
# constraint initial temperature
constraint_initialtemp = analysis.addObject(
ObjectsFem.makeConstraintInitialTemperature(doc, "ConstraintInitialTemperature")
)[0]
constraint_initialtemp.initialTemperature = 273.0
# constraint temperature
constraint_temperature = analysis.addObject(
ObjectsFem.makeConstraintTemperature(doc, "ConstraintTemperature")
)[0]
constraint_temperature.References = [
(all_geom_boolfrag_obj, "Face1"),
(all_geom_boolfrag_obj, "Face2"),
(all_geom_boolfrag_obj, "Face3"),
(all_geom_boolfrag_obj, "Face4"),
(all_geom_boolfrag_obj, "Face5"),
(all_geom_boolfrag_obj, "Face7"),
(all_geom_boolfrag_obj, "Face8"),
(all_geom_boolfrag_obj, "Face9"),
(all_geom_boolfrag_obj, "Face10"),
(all_geom_boolfrag_obj, "Face11"),
]
constraint_temperature.Temperature = 373.0
constraint_temperature.CFlux = 0.0
# mesh
from .meshes.mesh_thermomech_bimetall_tetra10 import create_nodes, create_elements
fem_mesh = Fem.FemMesh()
control = create_nodes(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating nodes.\n")
control = create_elements(fem_mesh)
if not control:
FreeCAD.Console.PrintError("Error on creating elements.\n")
femmesh_obj = analysis.addObject(
doc.addObject("Fem::FemMeshObject", mesh_name)
)[0]
femmesh_obj.FemMesh = fem_mesh
doc.recompute()
return doc
@@ -203,7 +203,9 @@ class _TaskPanelFemMaterial:
# get all available materials (fill self.materials, self.cards and self.icons)
from materialtools.cardutils import import_materials as getmats
self.materials, self.cards, self.icons = getmats()
# Note: import_materials(category="Solid", ...),
# category default to Solid, but must be given for FluidMaterial to be imported
self.materials, self.cards, self.icons = getmats(self.obj.Category)
# fill the material comboboxes with material cards
self.add_cards_to_combo_box()
@@ -217,16 +217,9 @@ class _TaskPanelFemResultShow:
QtCore.SIGNAL("valueChanged(int)"),
self.hsb_disp_factor_changed
)
QtCore.QObject.connect(
self.form.sb_displacement_factor,
QtCore.SIGNAL("valueChanged(int)"),
self.sb_disp_factor_changed
)
QtCore.QObject.connect(
self.form.sb_displacement_factor_max,
QtCore.SIGNAL("valueChanged(int)"),
self.sb_disp_factor_max_changed
)
self.form.sb_displacement_factor.valueChanged.connect(self.sb_disp_factor_changed)
self.form.sb_displacement_factor_max.valueChanged.connect(self.sb_disp_factor_max_changed)
# user defined equation
QtCore.QObject.connect(
@@ -247,11 +240,8 @@ class _TaskPanelFemResultShow:
self.restore_initial_result_dialog()
# initialize scale factor for show displacement
scale_factor = get_displacement_scale_factor(self.result_obj)
self.form.sb_displacement_factor_max.setValue(10. * scale_factor)
self.form.sb_displacement_factor.setValue(scale_factor)
self.form.hsb_displacement_factor.setValue(scale_factor)
diggits_scale_factor = len(str(abs(int(scale_factor))))
new_max_factor = 10 ** diggits_scale_factor
self.form.sb_displacement_factor_max.setValue(new_max_factor)
def restore_result_dialog(self):
try:
@@ -302,8 +292,8 @@ class _TaskPanelFemResultShow:
df = FreeCAD.FEM_dialog["disp_factor"]
dfm = FreeCAD.FEM_dialog["disp_factor_max"]
self.form.hsb_displacement_factor.setMaximum(dfm)
self.form.hsb_displacement_factor.setValue(df)
# self.form.hsb_displacement_factor.setMaximum(dfm)
# self.form.hsb_displacement_factor.setValue(df)
self.form.sb_displacement_factor_max.setValue(dfm)
self.form.sb_displacement_factor.setValue(df)
except:
@@ -322,9 +312,10 @@ class _TaskPanelFemResultShow:
FreeCAD.FEM_dialog = {
"results_type": "None",
"show_disp": False,
"disp_factor": 0,
"disp_factor_max": 100
"disp_factor": 0.,
"disp_factor_max": 100.
}
self.form.sb_displacement_factor_max.setValue(100.) # init non standard values
def getStandardButtons(self):
return int(QtGui.QDialogButtonBox.Close)
@@ -545,7 +536,7 @@ class _TaskPanelFemResultShow:
def update_displacement(self, factor=None):
if factor is None:
if FreeCAD.FEM_dialog["show_disp"]:
factor = self.form.hsb_displacement_factor.value()
factor = self.form.sb_displacement_factor.value()
else:
factor = 0.0
self.mesh_obj.ViewObject.applyDisplacement(factor)
@@ -566,16 +557,32 @@ class _TaskPanelFemResultShow:
QtGui.QApplication.restoreOverrideCursor()
def hsb_disp_factor_changed(self, value):
self.form.sb_displacement_factor.setValue(value)
self.form.sb_displacement_factor.setValue(
value / 100. * self.form.sb_displacement_factor_max.value()
)
self.update_displacement()
def sb_disp_factor_max_changed(self, value):
FreeCAD.FEM_dialog["disp_factor_max"] = value
self.form.hsb_displacement_factor.setMaximum(value)
if value < self.form.sb_displacement_factor.value():
self.form.sb_displacement_factor.setValue(value)
if value == 0.:
self.form.hsb_displacement_factor.setValue(0)
else:
self.form.hsb_displacement_factor.setValue(
round(self.form.sb_displacement_factor.value() / value * 100.)
)
def sb_disp_factor_changed(self, value):
FreeCAD.FEM_dialog["disp_factor"] = value
self.form.hsb_displacement_factor.setValue(value)
if value > self.form.sb_displacement_factor_max.value():
self.form.sb_displacement_factor.setValue(self.form.sb_displacement_factor_max.value())
if self.form.sb_displacement_factor_max.value() == 0.:
self.form.hsb_displacement_factor.setValue(0.)
else:
self.form.hsb_displacement_factor.setValue(
round(value / self.form.sb_displacement_factor_max.value() * 100.)
)
def disable_empty_result_buttons(self):
""" disable radio buttons if result does not exists in result object"""
+4 -1
View File
@@ -52,7 +52,10 @@ def get_femnodes_by_femobj_with_references(
node_set = get_femnodes_by_references(femmesh, femobj["Object"].References)
# FreeCAD.Console.PrintMessage("node_set_nogroup: {}\n".format(node_set))
return node_set
# use set for node sets to be sure all nodes are unique
# use sorted to be sure the order is the same on different runs
# be aware a sorted set returns a list, because set are not sorted by default
return sorted(set(node_set))
# ************************************************************************************************
+6
View File
@@ -123,6 +123,12 @@ class FemInputWriter():
self.femelement_edges_table = {}
self.femelement_count_test = True
# use set for node sets to be sure all nodes are unique
# use sorted to be sure the order is the same on different runs
# be aware a sorted set returns a list, because set are not sorted by default
# - done in return value of meshtools.get_femnodes_by_femobj_with_references
# might be appropriate for element sets too
def get_constraints_fixed_nodes(self):
# get nodes
for femobj in self.fixed_objects:
+28 -8
View File
@@ -24,7 +24,6 @@
# ***************************************************************************/
import unittest
import sys
from os.path import join
@@ -168,12 +167,14 @@ class TestCcxTools(unittest.TestCase):
"FEM_ccx_constraint_contact_solid_solid",
)
"""
# test input file writing
self.input_file_writing_test(
test_name=test_name,
base_name=base_name,
analysis_dir=analysis_dir,
)
"""
# ********************************************************************************************
def test_static_material_multiple(
@@ -211,13 +212,32 @@ class TestCcxTools(unittest.TestCase):
)
# test input file writing
if sys.version_info.major >= 3:
# https://forum.freecadweb.org/viewtopic.php?f=18&t=42821
self.input_file_writing_test(
test_name=test_name,
base_name=base_name,
analysis_dir=analysis_dir,
)
self.input_file_writing_test(
test_name=test_name,
base_name=base_name,
analysis_dir=analysis_dir,
)
# ********************************************************************************************
def test_thermomech_bimetall(
self
):
# set up
from femexamples.thermomech_bimetall import setup
setup(self.active_doc, "ccxtools")
test_name = "thermomech bimetall"
base_name = "thermomech_bimetall"
analysis_dir = testtools.get_unit_test_tmp_dir(
self.temp_dir,
"FEM_ccx_thermomech_bimetall"
)
# test input file writing
self.input_file_writing_test(
test_name=test_name,
base_name=base_name,
analysis_dir=analysis_dir,
)
# ********************************************************************************************
def test_thermomech_flow1D_analysis(
@@ -4346,15 +4346,22 @@ Evolumes
20,
21,
22,
1561,
1562,
1563,
1564,
1565,
1566,
1567,
1568,
1569,
91,
92,
93,
94,
95,
96,
97,
98,
99,
164,
165,
166,
167,
168,
274,
366,
559,
560,
561,
@@ -4373,15 +4380,6 @@ Evolumes
574,
575,
576,
91,
92,
93,
94,
95,
96,
97,
98,
99,
649,
650,
651,
@@ -4394,20 +4392,6 @@ Evolumes
658,
659,
660,
164,
165,
166,
167,
168,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
727,
728,
729,
@@ -4426,8 +4410,24 @@ Evolumes
742,
743,
744,
274,
366,
1210,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1561,
1562,
1563,
1564,
1565,
1566,
1567,
1568,
1569,
***********************************************************
** Surfaces for contact constraint
@@ -5359,9 +5359,9 @@ RF
***********************************************************
** CalculiX Input file
** written by write_footer function
** written by --> FreeCAD 0.19.19441 (Git)
** written on --> Sat Feb 1 13:08:12 2020
** file name --> Constraint_Contact_Solid_Solid.FCStd
** written by --> FreeCAD 0.19.19463 (Git)
** written on --> Mon Feb 3 23:28:02 2020
** file name -->
** analysis name --> Analysis
**
**
+15 -15
View File
@@ -1174,6 +1174,18 @@ Evolumes
10,
11,
12,
52,
53,
54,
58,
59,
60,
64,
65,
66,
67,
68,
69,
273,
274,
275,
@@ -1199,18 +1211,6 @@ Evolumes
295,
296,
297,
52,
53,
54,
58,
59,
60,
64,
65,
66,
67,
68,
69,
***********************************************************
** Materials
@@ -1293,9 +1293,9 @@ RF
***********************************************************
** CalculiX Input file
** written by write_footer function
** written by --> FreeCAD 0.17.13310 (Git)
** written on --> Tue Feb 20 07:42:43 2018
** file name --> multimat.fcstd
** written by --> FreeCAD 0.19.19432 (Git)
** written on --> Fri Jan 31 08:06:05 2020
** file name -->
** analysis name --> Analysis
**
**
+122 -122
View File
@@ -19788,126 +19788,7 @@ Evolumes
7,
8,
11,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
250,
1274,
1275,
1276,
1277,
1278,
1279,
1280,
1281,
1282,
1283,
1284,
1285,
1286,
1287,
1288,
1289,
1290,
1291,
1292,
1293,
1294,
1295,
1296,
1297,
1298,
1299,
1300,
1301,
1302,
1303,
1304,
1305,
1306,
1307,
1308,
1309,
1310,
1311,
1312,
1313,
1314,
1315,
1316,
1317,
1318,
1319,
1320,
1321,
1322,
1323,
1324,
1325,
1326,
1327,
1328,
1329,
409,
410,
411,
@@ -19986,6 +19867,125 @@ Evolumes
484,
485,
486,
1211,
1212,
1213,
1214,
1215,
1216,
1217,
1218,
1219,
1220,
1221,
1222,
1223,
1224,
1225,
1226,
1227,
1228,
1229,
1230,
1231,
1232,
1233,
1234,
1235,
1236,
1237,
1238,
1239,
1240,
1241,
1242,
1243,
1244,
1245,
1246,
1247,
1248,
1249,
1250,
1251,
1252,
1253,
1254,
1255,
1256,
1257,
1258,
1259,
1260,
1261,
1262,
1263,
1264,
1265,
1266,
1267,
1268,
1269,
1270,
1271,
1272,
1273,
1274,
1275,
1276,
1277,
1278,
1279,
1280,
1281,
1282,
1283,
1284,
1285,
1286,
1287,
1288,
1289,
1290,
1291,
1292,
1293,
1294,
1295,
1296,
1297,
1298,
1299,
1300,
1301,
1302,
1303,
1304,
1305,
1306,
1307,
1308,
1309,
1310,
1311,
1312,
1313,
1314,
1315,
1316,
1317,
1318,
1319,
1320,
1321,
1322,
1323,
1324,
1325,
1326,
1327,
1328,
1329,
***********************************************************
** Materials
@@ -20130,9 +20130,9 @@ RF
***********************************************************
** CalculiX Input file
** written by write_footer function
** written by --> FreeCAD 0.19.19295 (Git)
** written on --> Sun Jan 19 12:59:27 2020
** file name --> Nonlinear_material_plate_with_hole.FCStd
** written by --> FreeCAD 0.19.19432 (Git)
** written on --> Fri Jan 31 08:04:49 2020
** file name -->
** analysis name --> Analysis
**
**
File diff suppressed because it is too large Load Diff
+9 -9
View File
@@ -503,47 +503,47 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject):
if self.fixed_constraints:
for c in self.fixed_constraints:
if len(c["Object"].References) == 0:
message += "At least one constraint fixed has an empty reference.\n"
message += "{} has empty references.".format(c["Object"].Name)
# displacement
if self.displacement_constraints:
for di in self.displacement_constraints:
if len(di["Object"].References) == 0:
message += "At least one constraint displacement has an empty reference.\n"
message += "{} has empty references.".format(c["Object"].Name)
# plane rotation
if self.planerotation_constraints:
for c in self.planerotation_constraints:
if len(c["Object"].References) == 0:
message += "At least one constraint plane rotation has an empty reference.\n"
message += "{} has empty references.".format(c["Object"].Name)
# contact
if self.contact_constraints:
for c in self.contact_constraints:
if len(c["Object"].References) == 0:
message += "At least one constraint contact has an empty reference.\n"
message += "{} has empty references.".format(c["Object"].Name)
# transform
if self.transform_constraints:
for c in self.transform_constraints:
if len(c["Object"].References) == 0:
message += "At least one constraint transform has an empty reference.\n"
message += "{} has empty references.".format(c["Object"].Name)
# pressure
if self.pressure_constraints:
for c in self.pressure_constraints:
if len(c["Object"].References) == 0:
message += "At least one constraint pressure has an empty reference.\n"
message += "{} has empty references.".format(c["Object"].Name)
# force
if self.force_constraints:
for c in self.force_constraints:
if len(c["Object"].References) == 0:
message += "At least one constraint force has an empty reference.\n"
message += "{} has empty references.".format(c["Object"].Name)
# temperature
if self.temperature_constraints:
for c in self.temperature_constraints:
if len(c["Object"].References) == 0:
message += "At least one constraint temperature has an empty reference.\n"
message += "{} has empty references.".format(c["Object"].Name)
# heat flux
if self.heatflux_constraints:
for c in self.heatflux_constraints:
if len(c["Object"].References) == 0:
message += "At least one constraint heat flux has an empty reference.\n"
message += "{} has empty references.".format(c["Object"].Name)
# beam section
if self.beam_sections:
if self.shell_thicknesses:
+1 -1
View File
@@ -45,7 +45,7 @@ SET (FluidMaterial_Files
FluidMaterial/None.FCMat
FluidMaterial/Air.FCMat
FluidMaterial/Water.FCMat
FluidMaterial/Readme.txt
FluidMaterial/Readme.md
)
SOURCE_GROUP("MatLib" FILES ${FluidMaterial_Files})
+8 -3
View File
@@ -1,17 +1,22 @@
[FCMat]
[General]
Name = Air
Description = Standard air properties at 20 Degrees Celsius and 1 atm
MolarMass = 28.965
Father = Gas
[Fluidic]
Density = 1.20 kg/m^3
DynamicViscosity = 1.80e-5 kg/m/s
KinematicViscosity = 1.511e-5 m^2/s
VolumetricThermalExpansionCoefficient = 3.43e-3 m/m/K
; PrandtlNumber is a nondimension number for CFD simulation
PrandtlNumber = 0.7
[Thermal]
SpecificHeat = 1.005 J/kg/K
ThermalConductivity = 0.0257 W/m/K
; volumetric expansion coeff of ideal gas depends on temperature and pressure
VolumetricThermalExpansionCoefficient = 3.43e-3 m/m/K
[Electrical]
RelativePermittivity = 1.00059
; at 18°C and 50Hz
+8 -4
View File
@@ -1,12 +1,16 @@
[FCdMat]
Name = None
Description = None
; None means nothing, as the starting point of making a new fluid material
[General]
Name = None
Description = "None"
[Fluidic]
Density = 0 kg/m^3
DynamicViscosity = 0 kg/m/s
KinematicViscosity = 0 m^2/s
VolumetricThermalExpansionCoefficient = 0 m/m/K
[Thermal]
SpecificHeat = 0 J/kg/K
ThermalConductivity = 0 W/m/K
ThermalExpansionCoefficient = 0 um/m/K
VolumetricThermalExpansionCoefficient = 0 m/m/K
+36
View File
@@ -0,0 +1,36 @@
# FreeCAD fluid material library
It's intended to gather the most common fluid properties, water, air, which are useful for other modules and workbenches.
## User defined material
To prevent the database from becoming inefficiently large it is only limited to commonly used variables at 20 degrees Celsius at 1 atm.
Users can defined new material, either in Fem material card editor, or directly generate textual material file, * .FCMat, see example in this folder.
To enable new material, go to FreeCAD menu "Edit->Preference..." Cfd preference page (select on the left panel) and switch to materiai tab on the right.
Browse to your material folder, and save/apply this preference, new material will be Material with same name as FreeCAD material has higher priority,
so user defined` Water` material will not appear in Fem material task panel's dropbox list, just give it a different name!
### Edit material value
Please verify the fluid material properties before use. It aims to serve as a quick reference and does not aim to be an extended look up table.
## Add new material to Material module
1. follow examples in material folders to create new material file
2. stick to the meta data definition in `src/Mod/Material/Templatematerial.yml` for property name
3. add the file name into the `src/Mod/Material/CMakeLists.txt` , so the new files can be installed to the properly place during compiling and installation.
## Change log
CfdOF module authored 5 material types, values are taken from FM White (2011) Fluid Mechanics.
Currently, 3 (Water, Air, None) are merged into Fem module and maintained by Cfd module author, Qingfeng Xia
@@ -1,7 +0,0 @@
This is the FreeCAD simple fluid material library
data is taken from matweb
currently only water and air at the standard condition (20C and 1 atm) is prepared for testing
CSIR team is working on CfdFluidMaterial in CFD workbench to support more complex fluid material
+14 -6
View File
@@ -1,16 +1,24 @@
[FCdMat]
; see meta data definition in the file: src/Mod/Material/Templatematerial.yml
[General]
Name = Water
Description = Standard distilled water properties at 20 Degrees Celsius and 1 atm
MolarMass = 18
Father = Gas
ReferenceSource = ''
[Fluidic]
Density = 998 kg/m^3
DynamicViscosity = 1.003e-3 kg/m/s
KinematicViscosity = 1.005 m^2/s
DynamicViscosity = 1.003e-3 kg/m/s
KinematicViscosity = 1.005e-6 m^2/s
; PrandtlNumber is a nondimension number for CFD simulation
PrandtlNumber = 7.56
[Thermal]
SpecificHeat = 4182 J/kg/K
ThermalConductivity = 0.591 W/m/K
; https://en.wikipedia.org/wiki/Water
VolumetricThermalExpansionCoefficient = 2.07e-4 m/m/K
SpecificHeat = 4.182 J/kg/K
ThermalConductivity = 0.591 W/m/K
[Electrical]
RelativePermittivity = 80.0
; at 20°C and 50Hz
+26 -1
View File
@@ -745,13 +745,38 @@ std::vector<unsigned long> MeshKernel::GetFacetPoints(const std::vector<unsigned
points.push_back(p0);
points.push_back(p1);
points.push_back(p2);
}
}
std::sort(points.begin(), points.end());
points.erase(std::unique(points.begin(), points.end()), points.end());
return points;
}
std::vector<unsigned long> MeshKernel::GetPointFacets(const std::vector<unsigned long>& points) const
{
_aclPointArray.ResetFlag(MeshPoint::TMP0);
_aclFacetArray.ResetFlag(MeshFacet::TMP0);
for (std::vector<unsigned long>::const_iterator pI = points.begin(); pI != points.end(); ++pI)
_aclPointArray[*pI].SetFlag(MeshPoint::TMP0);
// mark facets if at least one corner point is marked
for (MeshFacetArray::_TConstIterator pF = _aclFacetArray.begin(); pF != _aclFacetArray.end(); ++pF) {
const MeshPoint &rclP0 = _aclPointArray[pF->_aulPoints[0]];
const MeshPoint &rclP1 = _aclPointArray[pF->_aulPoints[1]];
const MeshPoint &rclP2 = _aclPointArray[pF->_aulPoints[2]];
if (rclP0.IsFlag(MeshPoint::TMP0) ||
rclP1.IsFlag(MeshPoint::TMP0) ||
rclP2.IsFlag(MeshPoint::TMP0)) {
pF->SetFlag(MeshFacet::TMP0);
}
}
std::vector<unsigned long> facets;
MeshAlgorithm(*this).GetFacetsFlag(facets, MeshFacet::TMP0);
return facets;
}
std::vector<unsigned long> MeshKernel::HasFacets (const MeshPointIterator &rclIter) const
{
unsigned long i, ulPtInd = rclIter.Position();
+2
View File
@@ -125,6 +125,8 @@ public:
unsigned long &rclP1, unsigned long &rclP2) const;
/** Returns the point indices of the given facet indices. */
std::vector<unsigned long> GetFacetPoints(const std::vector<unsigned long>&) const;
/** Returns the facet indices that share the given point indices. */
std::vector<unsigned long> GetPointFacets(const std::vector<unsigned long>&) const;
/** Returns the indices of the neighbour facets of the given facet index. */
inline void GetFacetNeighbours (unsigned long ulIndex, unsigned long &rulNIdx0,
unsigned long &rulNIdx1, unsigned long &rulNIdx2) const;
+12 -2
View File
@@ -1348,6 +1348,8 @@ void CmdPartMakeFace::activated(int iMsg)
{
Q_UNUSED(iMsg);
auto sketches = Gui::Selection().getObjectsOfType(App::DocumentObject::getClassTypeId(),0,3);
if(sketches.empty())
return;
openCommand("Make face");
try {
@@ -1636,7 +1638,10 @@ CmdPartOffset::CmdPartOffset()
void CmdPartOffset::activated(int iMsg)
{
Q_UNUSED(iMsg);
App::DocumentObject* shape = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()).front();
auto shapes = getSelection().getObjectsOfType(Part::Feature::getClassTypeId(),0,3);
if(shapes.empty())
return;
App::DocumentObject* shape = shapes.front();
std::string offset = getUniqueObjectName("Offset");
openCommand("Make Offset");
@@ -1685,7 +1690,10 @@ CmdPartOffset2D::CmdPartOffset2D()
void CmdPartOffset2D::activated(int iMsg)
{
Q_UNUSED(iMsg);
App::DocumentObject* shape = getSelection().getObjectsOfType(Part::Feature::getClassTypeId(),0,3).front();
auto shapes = getSelection().getObjectsOfType(Part::Feature::getClassTypeId(),0,3);
if(shapes.empty())
return;
App::DocumentObject* shape = shapes.front();
std::string offset = getUniqueObjectName("Offset2D");
openCommand("Make 2D Offset");
@@ -2153,6 +2161,8 @@ void CmdColorPerFace::activated(int iMsg)
if (getActiveGuiDocument()->getInEdit())
getActiveGuiDocument()->resetEdit();
std::vector<App::DocumentObject*> sel = Gui::Selection().getObjectsOfType(Part::Feature::getClassTypeId());
if(sel.empty())
return;
Gui::ViewProvider* vp = Gui::Application::Instance->getViewProvider(sel.front());
// FIXME: Need a way to force 'Color' edit mode
// #0000477: Proper interface for edit modes of view provider
@@ -47,6 +47,7 @@ grbl_post.export(object, "/path/to/file.ncc")
OUTPUT_COMMENTS = True # default output of comments in output gCode file
OUTPUT_HEADER = True # default output header in output gCode file
OUTPUT_LINE_NUMBERS = False # default doesn't output line numbers in output gCode file
OUTPUT_BCNC = False # default doesn't add bCNC operation block headers in output gCode file
SHOW_EDITOR = True # default show the resulting file dialog output in GUI
PRECISION = 3 # Default precision for metric (see http://linuxcnc.org/docs/2.7/html/gcode/overview.html#_g_code_best_practices)
TRANSLATE_DRILL_CYCLES = False # If true, G81, G82 & G83 are translated in G0/G1 moves
@@ -97,6 +98,8 @@ parser.add_argument('--inches', action='store_true', help='Convert o
parser.add_argument('--tool-change', action='store_true', help='Insert M6 for all tool changes')
parser.add_argument('--wait-for-spindle', type=int, default=0, help='Wait for spindle to reach desired speed after M3 / M4, default=0')
parser.add_argument('--return-to', default='', help='Move to the specified coordinates at the end, e.g. --return-to=0,0')
parser.add_argument('--bcnc', action='store_true', help='Add Job operations as bCNC block headers. Consider suppressing existing comments: Add argument --no-comments')
parser.add_argument('--no-bcnc', action='store_true', help='suppress bCNC block header output (default)')
TOOLTIP_ARGS = parser.format_help()
@@ -135,6 +138,7 @@ def processArguments(argstring):
global OUTPUT_TOOL_CHANGE
global SPINDLE_WAIT
global RETURN_TO
global OUTPUT_BCNC
try:
args = parser.parse_args(shlex.split(argstring))
@@ -177,6 +181,10 @@ def processArguments(argstring):
if len(RETURN_TO) != 2:
RETURN_TO = None
print("--return-to coordinates must be specified as <x>,<y>, ignoring")
if args.bcnc:
OUTPUT_BCNC = True
if args.no_bcnc:
OUTPUT_BCNC = False
except Exception as e:
@@ -243,6 +251,10 @@ def export(objectslist, filename, argstring):
return
# do the pre_op
if OUTPUT_BCNC:
gcode += linenumber() + "(Block-name: " + obj.Label + ")\n"
gcode += linenumber() + "(Block-expand: 0)\n"
gcode += linenumber() + "(Block-enable: 1)\n"
if OUTPUT_COMMENTS:
gcode += linenumber() + "(Begin operation: " + obj.Label + ")\n"
for line in PRE_OPERATION.splitlines(True):
@@ -258,6 +270,10 @@ def export(objectslist, filename, argstring):
gcode += linenumber() + line
# do the post_amble
if OUTPUT_BCNC:
gcode += linenumber() + "(Block-name: post_amble)\n"
gcode += linenumber() + "(Block-expand: 0)\n"
gcode += linenumber() + "(Block-enable: 1)\n"
if OUTPUT_COMMENTS:
gcode += linenumber() + "(Begin postamble)\n"
for line in POSTAMBLE.splitlines(True):
+40
View File
@@ -328,6 +328,45 @@ bool CmdSketcherLeaveSketch::isActive(void)
return false;
}
DEF_STD_CMD_A(CmdSketcherStopOperation)
CmdSketcherStopOperation::CmdSketcherStopOperation()
: Command("Sketcher_StopOperation")
{
sAppModule = "Sketcher";
sGroup = QT_TR_NOOP("Sketcher");
sMenuText = QT_TR_NOOP("Stop operation");
sToolTipText = QT_TR_NOOP("Stop current operation");
sWhatsThis = "Sketcher_StopOperation";
sStatusTip = sToolTipText;
sPixmap = "process-stop";
eType = 0;
}
void CmdSketcherStopOperation::activated(int iMsg)
{
Q_UNUSED(iMsg);
Gui::Document *doc = getActiveGuiDocument();
if (doc) {
SketcherGui::ViewProviderSketch* vp = dynamic_cast<SketcherGui::ViewProviderSketch*>(doc->getInEdit());
if (vp) {
vp->purgeHandler();
}
}
}
bool CmdSketcherStopOperation::isActive(void)
{
Gui::Document *doc = getActiveGuiDocument();
if (doc) {
SketcherGui::ViewProviderSketch* vp = dynamic_cast<SketcherGui::ViewProviderSketch*>(doc->getInEdit());
if (vp)
return true;
}
return false;
}
DEF_STD_CMD_A(CmdSketcherReorientSketch)
CmdSketcherReorientSketch::CmdSketcherReorientSketch()
@@ -872,6 +911,7 @@ void CreateSketcherCommands(void)
rcCmdMgr.addCommand(new CmdSketcherNewSketch());
rcCmdMgr.addCommand(new CmdSketcherEditSketch());
rcCmdMgr.addCommand(new CmdSketcherLeaveSketch());
rcCmdMgr.addCommand(new CmdSketcherStopOperation());
rcCmdMgr.addCommand(new CmdSketcherReorientSketch());
rcCmdMgr.addCommand(new CmdSketcherMapSketch());
rcCmdMgr.addCommand(new CmdSketcherViewSketch());
@@ -401,6 +401,7 @@ void ViewProviderSketch::deactivateHandler()
std::vector<Base::Vector2d> editCurve;
editCurve.clear();
drawEdit(editCurve); // erase any line
resetPositionText();
edit->sketchHandler->deactivated(this);
edit->sketchHandler->unsetCursor();
delete(edit->sketchHandler);
+1
View File
@@ -90,6 +90,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const
addSketcherWorkbenchVirtualSpace(*virtualspace);
addSketcherWorkbenchSketchActions( *sketch );
*sketch << "Sketcher_StopOperation";
*sketch << geom
<< cons
<< consaccel
+2 -2
View File
@@ -20,10 +20,10 @@
#* *
#***************************************************************************
import FreeCAD,sys
import FreeCADGui,sys
# MRU will be given before this script is run
rf=FreeCAD.ParamGet("User parameter:BaseApp/Preferences/RecentFiles")
FreeCAD.loadFile(rf.GetString("MRU"+str(MRU)))
FreeCADGui.loadFile(rf.GetString("MRU"+str(MRU)))
from StartPage import StartPage
StartPage.postStart()
+2 -2
View File
@@ -283,8 +283,8 @@ int DrawViewBalloon::prefEnd(void) const
Base::Reference<ParameterGrp> hGrp = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->
GetGroup("Mod/TechDraw/Decorations");
int length = hGrp->GetFloat("BalloonArrow", 5.0);
return length;
int end = hGrp->GetInt("BalloonArrow", 0);
return end;
}
/*
+3 -3
View File
@@ -1132,7 +1132,7 @@ CmdTechDrawArchView::CmdTechDrawArchView()
{
// setting the Gui eye-candy
sGroup = QT_TR_NOOP("TechDraw");
sMenuText = QT_TR_NOOP("Insert Section Plane");
sMenuText = QT_TR_NOOP("Insert Arch Workbench Object");
sToolTipText = QT_TR_NOOP("Insert a View of a Section Plane from Arch Workbench");
sWhatsThis = "TechDraw_NewArch";
sStatusTip = sToolTipText;
@@ -1241,7 +1241,7 @@ CmdTechDrawExportPageSVG::CmdTechDrawExportPageSVG()
: Command("TechDraw_ExportPageSVG")
{
sGroup = QT_TR_NOOP("File");
sMenuText = QT_TR_NOOP("Export page as SVG");
sMenuText = QT_TR_NOOP("Export Page as SVG");
sToolTipText = sMenuText;
sWhatsThis = "TechDraw_ExportPageSVG";
sStatusTip = sToolTipText;
@@ -1285,7 +1285,7 @@ CmdTechDrawExportPageDXF::CmdTechDrawExportPageDXF()
: Command("TechDraw_ExportPageDXF")
{
sGroup = QT_TR_NOOP("File");
sMenuText = QT_TR_NOOP("Export page as DXF");
sMenuText = QT_TR_NOOP("Export Page as DXF");
sToolTipText = sMenuText;
sWhatsThis = "TechDraw_ExportPageDXF";
sStatusTip = sToolTipText;
File diff suppressed because it is too large Load Diff
+238 -232
View File
@@ -6,12 +6,12 @@
<rect>
<x>0</x>
<y>0</y>
<width>558</width>
<height>609</height>
<width>440</width>
<height>500</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -28,7 +28,7 @@
<property name="toolTip">
<string/>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QGroupBox" name="gbScale">
<property name="sizePolicy">
@@ -40,7 +40,7 @@
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
<height>113</height>
</size>
</property>
<property name="maximumSize">
@@ -70,7 +70,7 @@
</sizepolicy>
</property>
<property name="toolTip">
<string>Default scale type for new Views</string>
<string>Default scale for new views</string>
</property>
<property name="prefEntry" stdset="0">
<cstring>DefaultScaleType</cstring>
@@ -85,12 +85,12 @@
</item>
<item>
<property name="text">
<string>Custom</string>
<string>Auto</string>
</property>
</item>
<item>
<property name="text">
<string>Auto</string>
<string>Custom</string>
</property>
</item>
</widget>
@@ -104,7 +104,7 @@
</sizepolicy>
</property>
<property name="toolTip">
<string>Default scale for new Views if Scale Type is Custom</string>
<string>Default scale for views if Scale Type is Custom</string>
</property>
<property name="statusTip">
<string/>
@@ -113,7 +113,7 @@
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="decimals">
<number>4</number>
<number>2</number>
</property>
<property name="value">
<double>1.000000000000000</double>
@@ -153,7 +153,7 @@
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="decimals">
<number>4</number>
<number>2</number>
</property>
<property name="value">
<double>1.000000000000000</double>
@@ -208,225 +208,10 @@
</layout>
</widget>
</item>
<item row="2" column="0">
<widget class="QGroupBox" name="gb_SizeAdj">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Size Adjustments</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QGridLayout" name="gridLayout_3" columnstretch="1,0,1">
<item row="1" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="pdsbCenterScale">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Size of CenterMarks. Multiplier of Vertex size.</string>
</property>
<property name="accessibleName">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="value">
<double>0.500000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>CenterMarkScale</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/TechDraw/Decorations</cstring>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="pdsbToleranceScale">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Tolerance font size adjustment. Multiplier of Dimension text size.</string>
</property>
<property name="accessibleName">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="value">
<double>0.500000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>TolSizeAdjust</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/TechDraw/Dimensions</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Vertex Scale</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Center Mark Scale</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="lbl_LabelFont">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Tolerance Text Scale</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Template Edit Mark</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="pdsbVertexScale">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Scale of Vertex dots. Multiplies line weight.</string>
</property>
<property name="accessibleName">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="value">
<double>5.000000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>VertexScale</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/TechDraw/General</cstring>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="pdsbTemplateMark">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Size of Template Field Edit click handles in mm&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="value">
<double>3.000000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>TemplateDotSize</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/TechDraw/General</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="gb_Selection">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -434,7 +219,7 @@
<property name="minimumSize">
<size>
<width>0</width>
<height>150</height>
<height>113</height>
</size>
</property>
<property name="baseSize">
@@ -546,7 +331,7 @@
</size>
</property>
<property name="toolTip">
<string>Size of selection area around edges.</string>
<string>Size of selection area around edges</string>
</property>
<property name="statusTip">
<string/>
@@ -586,7 +371,7 @@
</size>
</property>
<property name="toolTip">
<string>Selection area around Center Marks</string>
<string>Selection area around center marks</string>
</property>
<property name="statusTip">
<string/>
@@ -623,6 +408,227 @@
</layout>
</widget>
</item>
<item row="2" column="0">
<widget class="QGroupBox" name="gb_SizeAdj">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>141</height>
</size>
</property>
<property name="title">
<string>Size Adjustments</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QGridLayout" name="gridLayout_3" columnstretch="1,0,1">
<item row="1" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="pdsbCenterScale">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Size of center marks. Multiplier of vertex size.</string>
</property>
<property name="accessibleName">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="value">
<double>0.500000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>CenterMarkScale</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/TechDraw/Decorations</cstring>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="pdsbToleranceScale">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Tolerance font size adjustment. Multiplier of dimension font size.</string>
</property>
<property name="accessibleName">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="value">
<double>0.500000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>TolSizeAdjust</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/TechDraw/Dimensions</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Vertex Scale</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Center Mark Scale</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="lbl_LabelFont">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Tolerance Text Scale</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Template Edit Mark</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="pdsbVertexScale">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Scale of vertex dots. Multiplier of line width.</string>
</property>
<property name="accessibleName">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="value">
<double>5.000000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>VertexScale</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/TechDraw/General</cstring>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="pdsbTemplateMark">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Size of template field click handles in mm</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="value">
<double>3.000000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>TemplateDotSize</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/TechDraw/General</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_12">
<property name="font">
@@ -649,8 +655,8 @@
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
<width>17</width>
<height>48</height>
</size>
</property>
</spacer>
File diff suppressed because it is too large Load Diff
+18 -18
View File
@@ -6,20 +6,20 @@
<rect>
<x>0</x>
<y>0</y>
<width>521</width>
<height>500</height>
<width>440</width>
<height>268</height>
</rect>
</property>
<property name="windowTitle">
<string>TechDraw Advanced</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QGroupBox" name="gbDim">
<property name="minimumSize">
<size>
<width>0</width>
<height>150</height>
<height>141</height>
</size>
</property>
<property name="title">
@@ -240,21 +240,8 @@ can be a performance penalty in complex models.</string>
</layout>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<widget class="QLabel" name="label_17">
<property name="font">
<font>
<pointsize>12</pointsize>
@@ -272,6 +259,19 @@ can be a performance penalty in complex models.</string>
</property>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
+26 -32
View File
@@ -6,12 +6,12 @@
<rect>
<x>0</x>
<y>0</y>
<width>558</width>
<height>500</height>
<width>441</width>
<height>333</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -19,7 +19,7 @@
<property name="minimumSize">
<size>
<width>0</width>
<height>400</height>
<height>0</height>
</size>
</property>
<property name="windowTitle">
@@ -28,32 +28,7 @@
<property name="toolTip">
<string/>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="2" column="0">
<widget class="QLabel" name="label_12">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
<italic>true</italic>
</font>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string>Items in italics are default values for new objects. They have no effect on existing objects.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QGroupBox" name="gbMisc">
<property name="sizePolicy">
@@ -65,7 +40,7 @@
<property name="minimumSize">
<size>
<width>0</width>
<height>150</height>
<height>225</height>
</size>
</property>
<property name="maximumSize">
@@ -397,7 +372,26 @@
</layout>
</widget>
</item>
<item row="3" column="0">
<item row="1" column="0">
<widget class="QLabel" name="label_20">
<property name="font">
<font>
<pointsize>12</pointsize>
<italic>true</italic>
</font>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string>Items in italics are default values for new objects. They have no effect on existing objects.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
+59 -47
View File
@@ -22,23 +22,26 @@
#include "PreCompiled.h"
#ifndef _PreComp_
#include <BRep_Builder.hxx>
#include <TopoDS_Compound.hxx>
# include <TopoDS_Shape.hxx>
# include <TopoDS_Edge.hxx>
# include <TopoDS.hxx>
# include <BRepAdaptor_Curve.hxx>
# include <Precision.hxx>
#include <BRep_Builder.hxx>
#include <TopoDS_Compound.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <Precision.hxx>
# include <QGraphicsScene>
# include <QGraphicsSceneMouseEvent>
# include <QGraphicsItem>
# include <QPainter>
# include <QPaintDevice>
# include <QSvgGenerator>
#include <QRegExp>
#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsItem>
#include <QPainter>
#include <QPaintDevice>
#include <QSvgGenerator>
#include <QRegExp>
#include <QTextDocument>
#include <QTextFrame>
#include <QTextBlock>
# include <math.h>
# include <math.h>
#endif
#include <App/Application.h>
@@ -77,7 +80,8 @@ using namespace TechDrawGui;
//**************************************************************
QGIRichAnno::QGIRichAnno(QGraphicsItem* myParent,
TechDraw::DrawRichAnno* anno)
TechDraw::DrawRichAnno* anno) :
m_isExporting(false)
{
setHandlesChildEvents(false);
setAcceptHoverEvents(false);
@@ -192,41 +196,49 @@ void QGIRichAnno::setTextItem()
{
// Base::Console().Message("QGIRA::setTextItem() - %s\n",getViewName());
TechDraw::DrawRichAnno* annoFeat = getFeature();
//convert point font sizes to (Rez,mm) font sizes
QRegExp rxFontSize(QString::fromUtf8("font-size:([0-9]*)pt;"));
QString inHtml = QString::fromUtf8(annoFeat->AnnoText.getValue());
QString match;
double mmPerPoint = 0.353;
double sizeConvert = Rez::getRezFactor() * mmPerPoint;
int pos = 0;
QStringList findList;
QStringList replList;
while ((pos = rxFontSize.indexIn(inHtml, pos)) != -1) {
QString found = rxFontSize.cap(0);
findList << found;
QString qsOldSize = rxFontSize.cap(1);
QString repl = found;
double newSize = qsOldSize.toDouble();
newSize = newSize * sizeConvert;
QString qsNewSize = QString::number(newSize, 'f', 2);
repl.replace(qsOldSize,qsNewSize);
replList << repl;
pos += rxFontSize.matchedLength();
}
QString outHtml = inHtml;
int iRepl = 0;
//TODO: check list for duplicates?
for ( ; iRepl < findList.size(); iRepl++) {
outHtml = outHtml.replace(findList[iRepl], replList[iRepl]);
//don't do this multiplication if exporting to SVG as other apps interpret
//font sizes differently from QGraphicsTextItem (?)
if (!getExporting()) {
//convert point font sizes to (Rez,mm) font sizes
QRegExp rxFontSize(QString::fromUtf8("font-size:([0-9]*)pt;"));
QString match;
double mmPerPoint = 0.353;
double sizeConvert = Rez::getRezFactor() * mmPerPoint;
int pos = 0;
QStringList findList;
QStringList replList;
while ((pos = rxFontSize.indexIn(inHtml, pos)) != -1) {
QString found = rxFontSize.cap(0);
findList << found;
QString qsOldSize = rxFontSize.cap(1);
QString repl = found;
double newSize = qsOldSize.toDouble();
newSize = newSize * sizeConvert;
QString qsNewSize = QString::number(newSize, 'f', 2);
repl.replace(qsOldSize,qsNewSize);
replList << repl;
pos += rxFontSize.matchedLength();
}
QString outHtml = inHtml;
int iRepl = 0;
//TODO: check list for duplicates?
for ( ; iRepl < findList.size(); iRepl++) {
outHtml = outHtml.replace(findList[iRepl], replList[iRepl]);
}
m_text->setTextWidth(Rez::guiX(annoFeat->MaxWidth.getValue()));
m_text->setHtml(outHtml);
} else {
//TODO: fix line spacing. common solutions (style sheet,
// QTextBlock::setLineHeight(150, QTextBlockFormat::ProportionalHeight)) don't help
double realWidth = m_text->boundingRect().width();
m_text->setTextWidth(realWidth);
m_text->setHtml(inHtml);
}
m_text->setHtml(outHtml);
m_text->setTextWidth(Rez::guiX(annoFeat->MaxWidth.getValue()));
// m_text->showBox(annoFeat->ShowFrame.getValue());
if (annoFeat->ShowFrame.getValue()) {
QRectF r = m_text->boundingRect().adjusted(1,1,-1,-1);
m_rect->setPen(rectPen());
+5
View File
@@ -80,6 +80,9 @@ public:
virtual TechDraw::DrawRichAnno* getFeature(void);
QPen rectPen() const;
void setExporting(bool b) { m_isExporting = b; }
bool getExporting(void) { return m_isExporting; }
public Q_SLOTS:
/* void textDragging(void);*/
@@ -92,6 +95,8 @@ protected:
virtual QVariant itemChange( GraphicsItemChange change,
const QVariant &value ) override;
bool m_isExporting;
protected:
/* QGMText* m_text;*/
QGCustomText* m_text;
+4
View File
@@ -763,9 +763,13 @@ void QGVPage::setExporting(bool enable)
QList<QGraphicsItem*> sceneItems = scene()->items();
for (auto& qgi:sceneItems) {
QGIViewPart* qgiPart = dynamic_cast<QGIViewPart *>(qgi);
QGIRichAnno* qgiRTA = dynamic_cast<QGIRichAnno *>(qgi);
if(qgiPart) {
qgiPart->setExporting(enable);
}
if (qgiRTA) {
qgiRTA->setExporting(enable);
}
}
}
@@ -1,141 +1,546 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="64" height="64" id="svg249" sodipodi:version="0.32" inkscape:version="0.48.5 r10040" sodipodi:docname="preferences-techdraw.svg" inkscape:export-filename="/home/jimmac/gfx/novell/pdes/trunk/docs/BIGmime-text.png" inkscape:export-xdpi="240.00000" inkscape:export-ydpi="240.00000" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.1">
<defs id="defs3">
<linearGradient id="linearGradient5048">
<stop style="stop-color:black;stop-opacity:0;" 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"/>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
id="svg249"
height="64"
width="64">
<defs
id="defs3">
<linearGradient
id="linearGradient5048">
<stop
id="stop5050"
offset="0"
style="stop-color:black;stop-opacity:0;" />
<stop
style="stop-color:black;stop-opacity:1;"
offset="0.5"
id="stop5056" />
<stop
id="stop5052"
offset="1"
style="stop-color:black;stop-opacity:0;" />
</linearGradient>
<linearGradient inkscape:collect="always" id="linearGradient4542">
<stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop4544"/>
<stop style="stop-color:#000000;stop-opacity:0;" offset="1" id="stop4546"/>
<linearGradient
id="linearGradient4542">
<stop
id="stop4544"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop4546"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<radialGradient inkscape:collect="always" xlink:href="#linearGradient4542" id="radialGradient4548" cx="24.306795" cy="42.07798" fx="24.306795" fy="42.07798" r="15.821514" gradientTransform="matrix(1,0,0,0.284916,0,30.08928)" gradientUnits="userSpaceOnUse"/>
<linearGradient id="linearGradient15662">
<stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.0000000" id="stop15664"/>
<stop style="stop-color:#f8f8f8;stop-opacity:1.0000000;" offset="1.0000000" id="stop15666"/>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.284916,0,30.08928)"
r="15.821514"
fy="42.07798"
fx="24.306795"
cy="42.07798"
cx="24.306795"
id="radialGradient4548"
xlink:href="#linearGradient4542" />
<linearGradient
id="linearGradient15662">
<stop
id="stop15664"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop15666"
offset="1.0000000"
style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient gradientUnits="userSpaceOnUse" fy="64.567902" fx="20.892099" r="5.257" cy="64.567902" cx="20.892099" id="aigrd3">
<stop id="stop15573" style="stop-color:#F0F0F0" offset="0"/>
<stop id="stop15575" style="stop-color:#9a9a9a;stop-opacity:1.0000000;" offset="1.0000000"/>
<radialGradient
id="aigrd3"
cx="20.892099"
cy="64.567902"
r="5.257"
fx="20.892099"
fy="64.567902"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15573" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15575" />
</radialGradient>
<radialGradient gradientUnits="userSpaceOnUse" fy="114.5684" fx="20.892099" r="5.256" cy="114.5684" cx="20.892099" id="aigrd2">
<stop id="stop15566" style="stop-color:#F0F0F0" offset="0"/>
<stop id="stop15568" style="stop-color:#9a9a9a;stop-opacity:1.0000000;" offset="1.0000000"/>
<radialGradient
id="aigrd2"
cx="20.892099"
cy="114.5684"
r="5.256"
fx="20.892099"
fy="114.5684"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15566" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15568" />
</radialGradient>
<linearGradient id="linearGradient269">
<stop style="stop-color:#a3a3a3;stop-opacity:1.0000000;" offset="0.0000000" id="stop270"/>
<stop style="stop-color:#4c4c4c;stop-opacity:1.0000000;" offset="1.0000000" id="stop271"/>
<linearGradient
id="linearGradient269">
<stop
id="stop270"
offset="0.0000000"
style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
<stop
id="stop271"
offset="1.0000000"
style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient id="linearGradient259">
<stop style="stop-color:#fafafa;stop-opacity:1.0000000;" offset="0.0000000" id="stop260"/>
<stop style="stop-color:#bbbbbb;stop-opacity:1.0000000;" offset="1.0000000" id="stop261"/>
<linearGradient
id="linearGradient259">
<stop
id="stop260"
offset="0.0000000"
style="stop-color:#fafafa;stop-opacity:1.0000000;" />
<stop
id="stop261"
offset="1.0000000"
style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient id="linearGradient12512">
<stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.0000000" id="stop12513"/>
<stop style="stop-color:#fff520;stop-opacity:0.89108908;" offset="0.50000000" id="stop12517"/>
<stop style="stop-color:#fff300;stop-opacity:0.0000000;" offset="1.0000000" id="stop12514"/>
<linearGradient
id="linearGradient12512">
<stop
id="stop12513"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop12517"
offset="0.50000000"
style="stop-color:#fff520;stop-opacity:0.89108908;" />
<stop
id="stop12514"
offset="1.0000000"
style="stop-color:#fff300;stop-opacity:0.0000000;" />
</linearGradient>
<radialGradient inkscape:collect="always" xlink:href="#linearGradient12512" id="radialGradient278" gradientUnits="userSpaceOnUse" cx="55" cy="125" fx="55" fy="125" r="14.375"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient5048-7" id="linearGradient5027-1" 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="linearGradient5048-7">
<stop style="stop-color:black;stop-opacity:0;" offset="0" id="stop5050-4"/>
<stop id="stop5056-0" offset="0.5" style="stop-color:black;stop-opacity:1;"/>
<stop style="stop-color:black;stop-opacity:0;" offset="1" id="stop5052-9"/>
<radialGradient
r="14.375"
fy="125"
fx="55"
cy="125"
cx="55"
gradientUnits="userSpaceOnUse"
id="radialGradient278"
xlink:href="#linearGradient12512" />
<linearGradient
y2="609.50507"
x2="302.85715"
y1="366.64789"
x1="302.85715"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
gradientUnits="userSpaceOnUse"
id="linearGradient5027-1"
xlink:href="#linearGradient5048-7" />
<linearGradient
id="linearGradient5048-7">
<stop
id="stop5050-4"
offset="0"
style="stop-color:black;stop-opacity:0;" />
<stop
style="stop-color:black;stop-opacity:1;"
offset="0.5"
id="stop5056-0" />
<stop
id="stop5052-9"
offset="1"
style="stop-color:black;stop-opacity:0;" />
</linearGradient>
<radialGradient inkscape:collect="always" xlink:href="#linearGradient5060-8" id="radialGradient5029-4" 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 inkscape:collect="always" id="linearGradient5060-8">
<stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop5062-8"/>
<stop style="stop-color:black;stop-opacity:0;" offset="1" id="stop5064-2"/>
<radialGradient
r="117.14286"
fy="486.64789"
fx="605.71429"
cy="486.64789"
cx="605.71429"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
gradientUnits="userSpaceOnUse"
id="radialGradient5029-4"
xlink:href="#linearGradient5060-8" />
<linearGradient
id="linearGradient5060-8">
<stop
id="stop5062-8"
offset="0"
style="stop-color:black;stop-opacity:1;" />
<stop
id="stop5064-2"
offset="1"
style="stop-color:black;stop-opacity:0;" />
</linearGradient>
<radialGradient r="117.14286" fy="486.64789" fx="605.71429" cy="486.64789" cx="605.71429" gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" gradientUnits="userSpaceOnUse" id="radialGradient3277" xlink:href="#linearGradient5060-8" inkscape:collect="always"/>
<radialGradient r="86.70845" fy="35.736916" fx="33.966679" cy="35.736916" cx="33.966679" gradientTransform="matrix(1.3213634,0,0,1.4243677,-18.082716,-65.975171)" gradientUnits="userSpaceOnUse" id="radialGradient15658-4" xlink:href="#linearGradient259-5" inkscape:collect="always"/>
<linearGradient id="linearGradient259-5">
<stop style="stop-color:#fafafa;stop-opacity:1.0000000;" offset="0.0000000" id="stop260-5"/>
<stop style="stop-color:#bbbbbb;stop-opacity:1.0000000;" offset="1.0000000" id="stop261-1"/>
<radialGradient
xlink:href="#linearGradient5060-8"
id="radialGradient3277"
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" />
<radialGradient
xlink:href="#linearGradient259-5"
id="radialGradient15658-4"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3213634,0,0,1.4243677,-18.082716,-65.975171)"
cx="33.966679"
cy="35.736916"
fx="33.966679"
fy="35.736916"
r="86.70845" />
<linearGradient
id="linearGradient259-5">
<stop
id="stop260-5"
offset="0.0000000"
style="stop-color:#fafafa;stop-opacity:1.0000000;" />
<stop
id="stop261-1"
offset="1.0000000"
style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient r="37.751713" fy="37.388847" fx="3.3431637" cy="37.388847" cx="3.3431637" gradientTransform="matrix(1.3320666,0,0,1.4129236,-13.469186,-65.090761)" gradientUnits="userSpaceOnUse" id="radialGradient15656-7" xlink:href="#linearGradient269-1" inkscape:collect="always"/>
<linearGradient id="linearGradient269-1">
<stop style="stop-color:#a3a3a3;stop-opacity:1.0000000;" offset="0.0000000" id="stop270-1"/>
<stop style="stop-color:#4c4c4c;stop-opacity:1.0000000;" offset="1.0000000" id="stop271-5"/>
<radialGradient
xlink:href="#linearGradient269-1"
id="radialGradient15656-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3320666,0,0,1.4129236,-13.469186,-65.090761)"
cx="3.3431637"
cy="37.388847"
fx="3.3431637"
fy="37.388847"
r="37.751713" />
<linearGradient
id="linearGradient269-1">
<stop
id="stop270-1"
offset="0.0000000"
style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
<stop
id="stop271-5"
offset="1.0000000"
style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient r="38.158695" fy="7.2678967" fx="8.1435566" cy="7.2678967" cx="8.1435566" gradientTransform="matrix(1.2992848,0,0,1.378488,-12.78616,-64.242471)" gradientUnits="userSpaceOnUse" id="radialGradient15668-2" xlink:href="#linearGradient15662-7" inkscape:collect="always"/>
<linearGradient id="linearGradient15662-7">
<stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.0000000" id="stop15664-6"/>
<stop style="stop-color:#f8f8f8;stop-opacity:1.0000000;" offset="1.0000000" id="stop15666-1"/>
<radialGradient
xlink:href="#linearGradient15662-7"
id="radialGradient15668-2"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.2992848,0,0,1.378488,-12.78616,-64.242471)"
cx="8.1435566"
cy="7.2678967"
fx="8.1435566"
fy="7.2678967"
r="38.158695" />
<linearGradient
id="linearGradient15662-7">
<stop
id="stop15664-6"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop15666-1"
offset="1.0000000"
style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient inkscape:collect="always" xlink:href="#aigrd2-2" id="radialGradient2283-4" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.229703,0,0,0.229703,4.613529,3.979808)" cx="20.892099" cy="114.5684" fx="20.892099" fy="114.5684" r="5.256"/>
<radialGradient gradientUnits="userSpaceOnUse" fy="114.5684" fx="20.892099" r="5.256" cy="114.5684" cx="20.892099" id="aigrd2-2">
<stop id="stop15566-3" style="stop-color:#F0F0F0" offset="0"/>
<stop id="stop15568-2" style="stop-color:#9a9a9a;stop-opacity:1.0000000;" offset="1.0000000"/>
<radialGradient
r="5.256"
fy="114.5684"
fx="20.892099"
cy="114.5684"
cx="20.892099"
gradientTransform="matrix(0.229703,0,0,0.229703,4.613529,3.979808)"
gradientUnits="userSpaceOnUse"
id="radialGradient2283-4"
xlink:href="#aigrd2-2" />
<radialGradient
id="aigrd2-2"
cx="20.892099"
cy="114.5684"
r="5.256"
fx="20.892099"
fy="114.5684"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15566-3" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15568-2" />
</radialGradient>
<radialGradient inkscape:collect="always" xlink:href="#aigrd3-1" id="radialGradient2285-2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.229703,0,0,0.229703,4.613529,3.979808)" cx="20.892099" cy="64.567902" fx="20.892099" fy="64.567902" r="5.257"/>
<radialGradient gradientUnits="userSpaceOnUse" fy="64.567902" fx="20.892099" r="5.257" cy="64.567902" cx="20.892099" id="aigrd3-1">
<stop id="stop15573-6" style="stop-color:#F0F0F0" offset="0"/>
<stop id="stop15575-8" style="stop-color:#9a9a9a;stop-opacity:1.0000000;" offset="1.0000000"/>
<radialGradient
r="5.257"
fy="64.567902"
fx="20.892099"
cy="64.567902"
cx="20.892099"
gradientTransform="matrix(0.229703,0,0,0.229703,4.613529,3.979808)"
gradientUnits="userSpaceOnUse"
id="radialGradient2285-2"
xlink:href="#aigrd3-1" />
<radialGradient
id="aigrd3-1"
cx="20.892099"
cy="64.567902"
r="5.257"
fx="20.892099"
fy="64.567902"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15573-6" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15575-8" />
</radialGradient>
<radialGradient r="117.14286" fy="486.64789" fx="605.71429" cy="486.64789" cx="605.71429" gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" gradientUnits="userSpaceOnUse" id="radialGradient3187" xlink:href="#linearGradient5060-8" inkscape:collect="always"/>
<radialGradient inkscape:collect="always" xlink:href="#aigrd2-7" id="radialGradient2283" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.229703,0,0,0.229703,4.613529,3.979808)" cx="20.892099" cy="114.5684" fx="20.892099" fy="114.5684" r="5.256"/>
<radialGradient gradientUnits="userSpaceOnUse" fy="114.5684" fx="20.892099" r="5.256" cy="114.5684" cx="20.892099" id="aigrd2-7">
<stop id="stop15566-4" style="stop-color:#F0F0F0" offset="0"/>
<stop id="stop15568-27" style="stop-color:#9a9a9a;stop-opacity:1.0000000;" offset="1.0000000"/>
<radialGradient
xlink:href="#linearGradient5060-8"
id="radialGradient3187"
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" />
<radialGradient
r="5.256"
fy="114.5684"
fx="20.892099"
cy="114.5684"
cx="20.892099"
gradientTransform="matrix(0.229703,0,0,0.229703,4.613529,3.979808)"
gradientUnits="userSpaceOnUse"
id="radialGradient2283"
xlink:href="#aigrd2-7" />
<radialGradient
id="aigrd2-7"
cx="20.892099"
cy="114.5684"
r="5.256"
fx="20.892099"
fy="114.5684"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15566-4" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15568-27" />
</radialGradient>
<radialGradient inkscape:collect="always" xlink:href="#aigrd3-7" id="radialGradient2285" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.229703,0,0,0.229703,4.613529,3.979808)" cx="20.892099" cy="64.567902" fx="20.892099" fy="64.567902" r="5.257"/>
<radialGradient gradientUnits="userSpaceOnUse" fy="64.567902" fx="20.892099" r="5.257" cy="64.567902" cx="20.892099" id="aigrd3-7">
<stop id="stop15573-9" style="stop-color:#F0F0F0" offset="0"/>
<stop id="stop15575-3" style="stop-color:#9a9a9a;stop-opacity:1.0000000;" offset="1.0000000"/>
<radialGradient
r="5.257"
fy="64.567902"
fx="20.892099"
cy="64.567902"
cx="20.892099"
gradientTransform="matrix(0.229703,0,0,0.229703,4.613529,3.979808)"
gradientUnits="userSpaceOnUse"
id="radialGradient2285"
xlink:href="#aigrd3-7" />
<radialGradient
id="aigrd3-7"
cx="20.892099"
cy="64.567902"
r="5.257"
fx="20.892099"
fy="64.567902"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15573-9" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15575-3" />
</radialGradient>
<radialGradient r="38.158695" fy="7.2678967" fx="8.1435566" cy="7.2678967" cx="8.1435566" gradientTransform="matrix(1.3004371,0,0,1.4315028,-12.790082,-64.443403)" gradientUnits="userSpaceOnUse" id="radialGradient15668" xlink:href="#linearGradient15662-1" inkscape:collect="always"/>
<linearGradient id="linearGradient15662-1">
<stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.0000000" id="stop15664-9"/>
<stop style="stop-color:#f8f8f8;stop-opacity:1.0000000;" offset="1.0000000" id="stop15666-8"/>
<radialGradient
xlink:href="#linearGradient15662-1"
id="radialGradient15668"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3004371,0,0,1.4315028,-12.790082,-64.443403)"
cx="8.1435566"
cy="7.2678967"
fx="8.1435566"
fy="7.2678967"
r="38.158695" />
<linearGradient
id="linearGradient15662-1">
<stop
id="stop15664-9"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop15666-8"
offset="1.0000000"
style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient r="86.70845" fy="35.736916" fx="33.966679" cy="35.736916" cx="33.966679" gradientTransform="matrix(1.3225497,0,0,1.4752117,-18.091663,-66.151728)" gradientUnits="userSpaceOnUse" id="radialGradient15658" xlink:href="#linearGradient259-6" inkscape:collect="always"/>
<linearGradient id="linearGradient259-6">
<stop style="stop-color:#fafafa;stop-opacity:1.0000000;" offset="0.0000000" id="stop260-50"/>
<stop style="stop-color:#bbbbbb;stop-opacity:1.0000000;" offset="1.0000000" id="stop261-2"/>
<radialGradient
xlink:href="#linearGradient259-6"
id="radialGradient15658"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3225497,0,0,1.4752117,-18.091663,-66.151728)"
cx="33.966679"
cy="35.736916"
fx="33.966679"
fy="35.736916"
r="86.70845" />
<linearGradient
id="linearGradient259-6">
<stop
id="stop260-50"
offset="0.0000000"
style="stop-color:#fafafa;stop-opacity:1.0000000;" />
<stop
id="stop261-2"
offset="1.0000000"
style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient r="37.751713" fy="37.388847" fx="3.3431637" cy="37.388847" cx="3.3431637" gradientTransform="matrix(1.3332625,0,0,1.4633592,-13.473992,-65.235757)" gradientUnits="userSpaceOnUse" id="radialGradient15656" xlink:href="#linearGradient269-8" inkscape:collect="always"/>
<linearGradient id="linearGradient269-8">
<stop style="stop-color:#a3a3a3;stop-opacity:1.0000000;" offset="0.0000000" id="stop270-6"/>
<stop style="stop-color:#4c4c4c;stop-opacity:1.0000000;" offset="1.0000000" id="stop271-0"/>
<radialGradient
xlink:href="#linearGradient269-8"
id="radialGradient15656"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3332625,0,0,1.4633592,-13.473992,-65.235757)"
cx="3.3431637"
cy="37.388847"
fx="3.3431637"
fy="37.388847"
r="37.751713" />
<linearGradient
id="linearGradient269-8">
<stop
id="stop270-6"
offset="0.0000000"
style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
<stop
id="stop271-0"
offset="1.0000000"
style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient5048-2" 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="linearGradient5048-2">
<stop style="stop-color:black;stop-opacity:0;" offset="0" id="stop5050-48"/>
<stop id="stop5056-6" offset="0.5" style="stop-color:black;stop-opacity:1;"/>
<stop style="stop-color:black;stop-opacity:0;" offset="1" id="stop5052-5"/>
<linearGradient
y2="609.50507"
x2="302.85715"
y1="366.64789"
x1="302.85715"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
gradientUnits="userSpaceOnUse"
id="linearGradient5027"
xlink:href="#linearGradient5048-2" />
<linearGradient
id="linearGradient5048-2">
<stop
id="stop5050-48"
offset="0"
style="stop-color:black;stop-opacity:0;" />
<stop
style="stop-color:black;stop-opacity:1;"
offset="0.5"
id="stop5056-6" />
<stop
id="stop5052-5"
offset="1"
style="stop-color:black;stop-opacity:0;" />
</linearGradient>
<radialGradient inkscape:collect="always" 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 inkscape:collect="always" id="linearGradient5060">
<stop style="stop-color:black;stop-opacity:1;" offset="0" id="stop5062"/>
<stop style="stop-color:black;stop-opacity:0;" offset="1" id="stop5064"/>
<radialGradient
r="117.14286"
fy="486.64789"
fx="605.71429"
cy="486.64789"
cx="605.71429"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
gradientUnits="userSpaceOnUse"
id="radialGradient5029"
xlink:href="#linearGradient5060" />
<linearGradient
id="linearGradient5060">
<stop
id="stop5062"
offset="0"
style="stop-color:black;stop-opacity:1;" />
<stop
id="stop5064"
offset="1"
style="stop-color:black;stop-opacity:0;" />
</linearGradient>
<radialGradient r="117.14286" fy="486.64789" fx="605.71429" cy="486.64789" cx="605.71429" gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" gradientUnits="userSpaceOnUse" id="radialGradient3277-0" xlink:href="#linearGradient5060" inkscape:collect="always"/>
<radialGradient r="117.14286" fy="486.64789" fx="605.71429" cy="486.64789" cx="605.71429" gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" gradientUnits="userSpaceOnUse" id="radialGradient3255" xlink:href="#linearGradient5060" inkscape:collect="always"/>
<linearGradient inkscape:collect="always" xlink:href="#linearGradient3775" id="linearGradient3781" x1="10" y1="39.999996" x2="53" y2="25.999996" gradientUnits="userSpaceOnUse" gradientTransform="translate(-48,3.8e-6)"/>
<linearGradient inkscape:collect="always" id="linearGradient3775">
<stop style="stop-color:#d3d7cf;stop-opacity:1;" offset="0" id="stop3777"/>
<stop style="stop-color:#ffffff;stop-opacity:1" offset="1" id="stop3779"/>
<radialGradient
xlink:href="#linearGradient5060"
id="radialGradient3277-0"
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" />
<radialGradient
xlink:href="#linearGradient5060"
id="radialGradient3255"
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
gradientTransform="translate(-48,3.8e-6)"
gradientUnits="userSpaceOnUse"
y2="25.999996"
x2="53"
y1="39.999996"
x1="10"
id="linearGradient3781"
xlink:href="#linearGradient3775" />
<linearGradient
id="linearGradient3775">
<stop
id="stop3777"
offset="0"
style="stop-color:#d3d7cf;stop-opacity:1;" />
<stop
id="stop3779"
offset="1"
style="stop-color:#ffffff;stop-opacity:1" />
</linearGradient>
</defs>
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="0.32941176" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="9.7389301" inkscape:cx="0.68208017" inkscape:cy="29.558421" inkscape:current-layer="layer2" showgrid="true" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:window-width="1920" inkscape:window-height="1137" inkscape:window-x="0" inkscape:window-y="27" inkscape:showpageshadow="false" inkscape:window-maximized="1">
<inkscape:grid type="xygrid" id="grid3817" empspacing="2" visible="true" enabled="true" snapvisiblegridlinesonly="true"/>
</sodipodi:namedview>
<metadata id="metadata4">
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work rdf:about="">
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>[agryson] Alexander Gryson</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://agryson.net</dc:source>
<cc:license rdf:resource="https://www.gnu.org/copyleft/lesser.html"/>
<cc:license
rdf:resource="https://www.gnu.org/copyleft/lesser.html" />
<dc:title>preferences-techdraw</dc:title>
<dc:date>2016-01-19</dc:date>
<dc:relation>http://www.freecadweb.org/wiki/index.php?title=Artwork</dc:relation>
@@ -152,7 +557,7 @@
</dc:rights>
<dc:contributor>
<cc:Agent>
<dc:title/>
<dc:title />
<dc:title>[agryson] Alexander Gryson</dc:title>
</cc:Agent>
<cc:Agent>
@@ -165,32 +570,104 @@
</cc:Agent>
</dc:contributor>
</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: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 inkscape:label="Shadow" id="layer6" inkscape:groupmode="layer" transform="translate(0,16)"/>
<g id="layer1" inkscape:label="Base" inkscape:groupmode="layer" style="display:inline" transform="translate(0,16)"/>
<g inkscape:groupmode="layer" id="layer4" inkscape:label="new" style="display:inline" transform="translate(0,16)"/>
<g inkscape:groupmode="layer" id="layer2" inkscape:label="Template" transform="translate(0,16)">
<rect style="fill:#d3d7cf;fill-opacity:1;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" id="rect2987" width="45.999996" height="58.000004" x="-38.999996" y="3" transform="matrix(0,-1,1,0,0,0)"/>
<rect style="fill:url(#linearGradient3781);fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" id="rect2987-1" width="41.999996" height="54.000004" x="-36.999996" y="5" transform="matrix(0,-1,1,0,0,0)"/>
<rect style="color:#000000;fill:none;stroke:#555753;stroke-width:2;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;enable-background:accumulate" id="rect3894" width="50" height="38" x="7" y="-3"/>
<rect style="color:#000000;fill:none;stroke:#555753;stroke-width:1.99999976;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;enable-background:accumulate" id="rect4664" width="23.999994" height="12.000004" x="33" y="23"/>
<path style="fill:none;stroke:#555753;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" d="m 37,27 15.398794,0 0,0" id="path4666" inkscape:connector-curvature="0"/>
<path style="fill:none;stroke:#555753;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" d="m 37,31 15.642526,0 0,0" id="path4666-7" inkscape:connector-curvature="0"/>
<path style="fill:none;stroke:#888a85;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 13,7 0,18" id="path3896" inkscape:connector-curvature="0"/>
<path style="fill:none;stroke:#888a85;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 25,7 0,18" id="path3898" inkscape:connector-curvature="0"/>
<path style="fill:none;stroke:#888a85;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="m 19,13 18,0" id="path3900" inkscape:connector-curvature="0"/>
<path style="fill:none;stroke:#888a85;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 19,1 37,1" id="path3902" inkscape:connector-curvature="0"/>
<path sodipodi:type="arc" style="fill:none;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.6" id="path3101" sodipodi:cx="19" sodipodi:cy="25" sodipodi:rx="6" sodipodi:ry="6" d="m 25,25 c 0,3.313708 -2.686292,6 -6,6 -3.313708,0 -6,-2.686292 -6,-6 0,-3.313708 2.686292,-6 6,-6 3.313708,0 6,2.686292 6,6 z" transform="translate(0,-18)"/>
<path sodipodi:type="arc" style="fill:none;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.6" id="path3101-3" sodipodi:cx="19" sodipodi:cy="25" sodipodi:rx="6" sodipodi:ry="6" d="m 25,25 c 0,3.313708 -2.686292,6 -6,6 -3.313708,0 -6,-2.686292 -6,-6 0,-3.313708 2.686292,-6 6,-6 3.313708,0 6,2.686292 6,6 z" transform="translate(18,-18)"/>
<path sodipodi:type="arc" style="fill:none;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.6" id="path3101-6" sodipodi:cx="19" sodipodi:cy="25" sodipodi:rx="6" sodipodi:ry="6" d="m 25,25 c 0,3.313708 -2.686292,6 -6,6 -3.313708,0 -6,-2.686292 -6,-6 0,-3.313708 2.686292,-6 6,-6 3.313708,0 6,2.686292 6,6 z"/>
<g
transform="translate(0,16)"
id="layer6" />
<g
transform="translate(0,16)"
style="display:inline"
id="layer1" />
<g
transform="translate(0,16)"
style="display:inline"
id="layer4" />
<g
transform="translate(0,16)"
id="layer2">
<rect
transform="matrix(0,-1,1,0,0,0)"
y="3"
x="-38.999996"
height="58.000004"
width="45.999996"
id="rect2987"
style="fill:#d3d7cf;fill-opacity:1;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
<rect
transform="matrix(0,-1,1,0,0,0)"
y="5"
x="-36.999996"
height="54.000004"
width="41.999996"
id="rect2987-1"
style="fill:url(#linearGradient3781);fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
<rect
y="-3"
x="7"
height="38"
width="50"
id="rect3894"
style="color:#000000;fill:none;stroke:#555753;stroke-width:2;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;enable-background:accumulate" />
<rect
y="23"
x="33"
height="12.000004"
width="23.999994"
id="rect4664"
style="color:#000000;fill:none;stroke:#555753;stroke-width:1.99999976;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;enable-background:accumulate" />
<path
id="path4666"
d="m 37,27 15.398794,0 0,0"
style="fill:none;stroke:#555753;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
id="path4666-7"
d="m 37,31 15.642526,0 0,0"
style="fill:none;stroke:#555753;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
id="path3896"
d="m 13,7 0,18"
style="fill:none;stroke:#888a85;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path3898"
d="m 25,7 0,18"
style="fill:none;stroke:#888a85;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path3900"
d="m 19,13 18,0"
style="fill:none;stroke:#888a85;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
id="path3902"
d="M 19,1 37,1"
style="fill:none;stroke:#888a85;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
transform="translate(0,-18)"
d="m 25,25 c 0,3.313708 -2.686292,6 -6,6 -3.313708,0 -6,-2.686292 -6,-6 0,-3.313708 2.686292,-6 6,-6 3.313708,0 6,2.686292 6,6 z"
id="path3101"
style="fill:none;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.6" />
<path
transform="translate(18,-18)"
d="m 25,25 c 0,3.313708 -2.686292,6 -6,6 -3.313708,0 -6,-2.686292 -6,-6 0,-3.313708 2.686292,-6 6,-6 3.313708,0 6,2.686292 6,6 z"
id="path3101-3"
style="fill:none;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.6" />
<path
d="m 25,25 c 0,3.313708 -2.686292,6 -6,6 -3.313708,0 -6,-2.686292 -6,-6 0,-3.313708 2.686292,-6 6,-6 3.313708,0 6,2.686292 6,6 z"
id="path3101-6"
style="fill:none;stroke:#2e3436;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.6" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB