Merge branch 'main' into CAM-Inspect-Fix

This commit is contained in:
Ian Abreu
2025-07-06 16:24:42 -04:00
27 changed files with 7102 additions and 4987 deletions

11695
pixi.lock

File diff suppressed because it is too large Load Diff

View File

@@ -31,8 +31,8 @@ matplotlib = "*"
nine = "*"
ninja = "*"
noqt5 = "*"
numpy = "*"
occt = "*"
numpy = ">=1.26,<1.27"
occt = ">=7.8,<7.9"
opencamlib = "*"
opencv = "*"
openssl = "*"
@@ -48,14 +48,14 @@ pyside6 = "*"
python = ">=3.11,<3.12"
pythonocc-core = "*"
pyyaml = "*"
qt6-main = ">=6.7,<6.8"
qt6-main = ">=6.8,<6.9"
requests = "*"
scipy = "*"
six = "*"
smesh = "*"
swig = "*"
sympy = "*"
tbb-devel = "*"
tbb-devel = ">=2022,<2023"
vtk = "*"
xerces-c = "*"
xlutils = "*"
@@ -145,6 +145,9 @@ sed = "*"
[target.win-64.dependencies]
pthreads-win32 = "*"
[pypi-dependencies]
freecad-stubs = "*"
## Qt 6 Configuration Presets
[target.linux-64.tasks]
configure = { cmd = [ "cmake", "-B", "build", "--preset", "conda-linux-debug", "-DBUILD_REVERSEENGINEERING=OFF" ], depends-on = ["initialize"], env={ CFLAGS="", CXXFLAGS="", DEBUG_CFLAGS="", DEBUG_CXXFLAGS="" }}

View File

@@ -527,6 +527,44 @@ inline void PyTypeCheck(PyObject** ptr, int (*method)(PyObject*), const char* ms
}
}
/**
* @brief Registers a C++ enum as a Python IntEnum in the specified module.
*
* This function dynamically creates a Python `IntEnum` class using the provided
* C++ enum entries and registers it under the given name within the specified
* Python module. It allows seamless integration of C++ enums into Python, making
* them accessible and usable in Python scripts.
*
* @tparam T The type of the enum values.
* @param module The Python module where the enum will be registered.
* @param name The name to be given to the Python IntEnum.
* @param entries A map of string keys to enum values, representing the enum definition.
*/
template <typename T>
void PyRegisterEnum(PyObject* module, const char* name, const std::map<const char*, T>& entries)
{
PyObject* pyEnumModule = PyImport_ImportModule("enum");
if (!pyEnumModule) {
return;
}
PyObject* pyConstantsDict = PyDict_New();
// Populate dictionary
for (const auto& [key, value] : entries) {
PyDict_SetItemString(pyConstantsDict, key, PyLong_FromLong(static_cast<int>(value)));
}
PyObject* pyEnumClass = PyObject_CallMethod(pyEnumModule, "IntEnum", "sO", name, pyConstantsDict);
Py_CLEAR(pyConstantsDict);
Py_CLEAR(pyEnumModule);
if (pyEnumClass && PyModule_AddObject(module, name, pyEnumClass) < 0) {
Py_CLEAR(pyEnumClass);
}
}
} // namespace Base

View File

@@ -139,6 +139,8 @@
#include "3Dconnexion/navlib/NavlibInterface.h"
#include "QtWidgets.h"
#include <Inventor/SoFCPlacementIndicatorKit.h>
#ifdef BUILD_TRACY_FRAME_PROFILER
#include <tracy/Tracy.hpp>
#endif
@@ -505,6 +507,17 @@ Application::Application(bool GUIenabled)
Gui::TaskView::TaskDialogPy::init_type();
registerUserInputEnumInPython(module);
Base::PyRegisterEnum<SoFCPlacementIndicatorKit::Part>(module, "PlacementIndicatorParts", {
{"Axes", SoFCPlacementIndicatorKit::Axes},
{"ArrowHeads", SoFCPlacementIndicatorKit::ArrowHeads},
{"Labels", SoFCPlacementIndicatorKit::Labels},
{"PlaneIndicator", SoFCPlacementIndicatorKit::PlaneIndicator},
{"OriginIndicator", SoFCPlacementIndicatorKit::OriginIndicator},
// common configurations
{"AllParts", SoFCPlacementIndicatorKit::AllParts},
{"AxisCross", SoFCPlacementIndicatorKit::AxisCross},
});
CommandActionPy::init_type();
Base::Interpreter().addType(CommandActionPy::type_object(), module, "CommandAction");

View File

@@ -2686,7 +2686,7 @@ public:
currentSelectionHandler = nullptr;
}
static QCursor makeCursor(QWidget* widget, const QSize& size, const char* svgFile, int hotX, int hotY)
static QCursor makeCursor([[maybe_unused]] QWidget* widget, const QSize& size, const char* svgFile, int hotX, int hotY)
{
qreal hotXF = hotX;
qreal hotYF = hotY;
@@ -2698,7 +2698,7 @@ public:
}
#endif
QPixmap px(Gui::BitmapFactory().pixmapFromSvg(svgFile, size));
return QCursor(px, hotXF, hotYF);
return QCursor(px, static_cast<int>(hotXF), static_cast<int>(hotYF));
}
};
}

View File

@@ -30,15 +30,6 @@ void Gui::registerUserInputEnumInPython(PyObject* module)
{
using enum Gui::InputHint::UserInput;
constexpr const char* name = "UserInput";
PyObject* py_enum_module = PyImport_ImportModule("enum");
if (!py_enum_module) {
return;
}
PyObject* py_constants_dict = PyDict_New();
// clang-format off
// this structure is repetition of each and every UserInput enum case
// it can be regenerated by copying and pasting all entries and performing one substitution:
@@ -202,17 +193,5 @@ void Gui::registerUserInputEnumInPython(PyObject* module)
};
// clang-format on
// Populate dictionary
for (const auto& [key, value] : userInputEntries) {
PyDict_SetItemString(py_constants_dict, key, PyLong_FromLong(static_cast<int>(value)));
}
PyObject* py_enum_class = PyObject_CallMethod(py_enum_module, "IntEnum", "sO", name, py_constants_dict);
Py_CLEAR(py_constants_dict);
Py_CLEAR(py_enum_module);
if (py_enum_class && PyModule_AddObject(module, name, py_enum_class) < 0) {
Py_CLEAR(py_enum_class);
}
Base::PyRegisterEnum(module, "UserInput", userInputEntries);
}

View File

@@ -451,7 +451,7 @@ MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags f)
this, &MainWindow::onSetActiveSubWindow);
#else
connect(d->windowMapper, &QSignalMapper::mappedObject,
this, [=](QObject* object) {
this, [=, this](QObject* object) {
onSetActiveSubWindow(qobject_cast<QWidget*>(object));
});
#endif

View File

@@ -22,9 +22,6 @@
<verstretch>2</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Adjust the orientation of the directional light source by dragging the handle with the mouse or use the spin boxes for fine tuning.</string>
</property>
<property name="title">
<string>Preview</string>
</property>

View File

@@ -1379,6 +1379,8 @@ QWidget* PropertyBoolItem::createEditor(QWidget* parent,
const std::function<void()>& /*method*/,
FrameOption /*frameOption*/) const
{
// The checkbox is basically artificial (it is not rendered). Other code handles the callback,
// etc.
auto checkbox = new QCheckBox(parent);
return checkbox;
}

View File

@@ -784,7 +784,7 @@ class _Roof(ArchComponent.Component):
faces.append(f)
else:
# TODO 2025.6.15: See github issue #21633: Find better way
# to test and maybe to split suface point up and down
# to test and maybe to split surface point up and down
# and extrude separately
# Not sure if it is pointing towards and/or above horizon

View File

@@ -132,11 +132,10 @@ class ViewProvider:
self.axs.axisLength.setValue(1.2)
# enum values for SoFCPlacementIndicatorKit
AXES = 1
LABELS = 4
ARROWHEADS = 8
self.axs.parts.setValue(AXES | LABELS | ARROWHEADS)
parts = FreeCADGui.PlacementIndicatorParts
self.axs.parts.setValue(
parts.Axes | parts.Labels | parts.ArrowHeads | parts.OriginIndicator
)
self.sep.addChild(self.axs)
self.switch.addChild(self.sep)

View File

@@ -31,26 +31,30 @@
using namespace MillSim;
// clang-format off
// NOLINTBEGIN(*-magic-numbers)
GuiItem guiItems[] = {
{eGuiItemSlider, 0, 0, 28, -80, 0},
{eGuiItemThumb, 0, 0, 328, -94, 1},
{eGuiItemPause, 0, 0, 28, -50, 'P', true},
{eGuiItemPlay, 0, 0, 28, -50, 'S', false},
{eGuiItemSingleStep, 0, 0, 68, -50, 'T'},
{eGuiItemSlower, 0, 0, 113, -50, ' '},
{eGuiItemFaster, 0, 0, 158, -50, 'F'},
{eGuiItemX, 0, 0, 208, -45, 0, false, 0},
{eGuiItem1, 0, 0, 230, -50, 0, false, 0},
{eGuiItem5, 0, 0, 230, -50, 0, true, 0},
{eGuiItem10, 0, 0, 230, -50, 0, true, 0},
{eGuiItem25, 0, 0, 230, -50, 0, true, 0},
{eGuiItem50, 0, 0, 230, -50, 0, true, 0},
{eGuiItemRotate, 0, 0, -140, -50, ' ', false, GUIITEM_CHECKABLE},
{eGuiItemPath, 0, 0, -100, -50, 'L', false, GUIITEM_CHECKABLE},
{eGuiItemAmbientOclusion, 0, 0, -60, -50, 'A', false, GUIITEM_CHECKABLE},
{eGuiItemView, 0, 0, -180, -50, 'V', false},
{eGuiItemHome, 0, 0, -220, -50, 'H'},
{.name=eGuiItemSlider, .vbo=0, .vao=0, .sx=28, .sy=-80, .actionKey=0, .hidden=false, .flags=0},
{.name=eGuiItemThumb, .vbo=0, .vao=0, .sx=328, .sy=-94, .actionKey=1, .hidden=false, .flags=0},
{.name=eGuiItemPause, .vbo=0, .vao=0, .sx=28, .sy=-50, .actionKey='P', .hidden=true, .flags=0},
{.name=eGuiItemPlay, .vbo=0, .vao=0, .sx=28, .sy=-50, .actionKey='S', .hidden=false, .flags=0},
{.name=eGuiItemSingleStep, .vbo=0, .vao=0, .sx=68, .sy=-50, .actionKey='T', .hidden=false, .flags=0},
{.name=eGuiItemSlower, .vbo=0, .vao=0, .sx=113, .sy=-50, .actionKey=' ', .hidden=false, .flags=0},
{.name=eGuiItemFaster, .vbo=0, .vao=0, .sx=158, .sy=-50, .actionKey='F', .hidden=false, .flags=0},
{.name=eGuiItemX, .vbo=0, .vao=0, .sx=208, .sy=-45, .actionKey=0, .hidden=false, .flags=0},
{.name=eGuiItem1, .vbo=0, .vao=0, .sx=230, .sy=-50, .actionKey=0, .hidden=false, .flags=0},
{.name=eGuiItem5, .vbo=0, .vao=0, .sx=230, .sy=-50, .actionKey=0, .hidden=true, .flags=0},
{.name=eGuiItem10, .vbo=0, .vao=0, .sx=230, .sy=-50, .actionKey=0, .hidden=true, .flags=0},
{.name=eGuiItem25, .vbo=0, .vao=0, .sx=230, .sy=-50, .actionKey=0, .hidden=true, .flags=0},
{.name=eGuiItem50, .vbo=0, .vao=0, .sx=230, .sy=-50, .actionKey=0, .hidden=true, .flags=0},
{.name=eGuiItemRotate, .vbo=0, .vao=0, .sx=-140, .sy=-50, .actionKey=' ', .hidden=false, .flags=GUIITEM_CHECKABLE},
{.name=eGuiItemPath, .vbo=0, .vao=0, .sx=-100, .sy=-50, .actionKey='L', .hidden=false, .flags=GUIITEM_CHECKABLE},
{.name=eGuiItemAmbientOclusion, .vbo=0, .vao=0, .sx=-60, .sy=-50, .actionKey='A', .hidden=false, .flags=GUIITEM_CHECKABLE},
{.name=eGuiItemView, .vbo=0, .vao=0, .sx=-180, .sy=-50, .actionKey='V', .hidden=false, .flags=0},
{.name=eGuiItemHome, .vbo=0, .vao=0, .sx=-220, .sy=-50, .actionKey='H', .hidden=false, .flags=0},
};
// NOLINTEND(*-magic-numbers)
// clang-format on
#define NUM_GUI_ITEMS (sizeof(guiItems) / sizeof(GuiItem))
#define TEX_SIZE 256

View File

@@ -107,9 +107,11 @@ protected:
std::vector<MillPathSegment*> MillPathSegments;
std::ostringstream mFpsStream;
MillMotion mZeroPos = {eNop, -1, 0, 0, 100, 0, 0, 0, 0};
MillMotion mCurMotion = {eNop, -1, 0, 0, 0, 0, 0, 0, 0};
MillMotion mDestMotion = {eNop, -1, 0, 0, 0, 0, 0, 0, 0};
// clang-format off
MillMotion mZeroPos = {.cmd=eNop, .tool=-1, .x=0, .y=0, .z=100, .i=0, .j=0, .k=0, .r=0, .retract_mode='\0', .retract_z=0.0};
MillMotion mCurMotion = {.cmd=eNop, .tool=-1, .x=0, .y=0, .z=0, .i=0, .j=0, .k=0, .r=0, .retract_mode='\0', .retract_z=0.0};
MillMotion mDestMotion = {.cmd=eNop, .tool=-1, .x=0, .y=0, .z=0, .i=0, .j=0, .k=0, .r=0, .retract_mode='\0', .retract_z=0.0};
// clang-format on
StockObject mStockObject;
SolidObject mBaseShape;

View File

@@ -427,39 +427,39 @@ class DraftToolBar:
QtWidgets.QSizePolicy.Expanding)
self.layout.addItem(spacerItem)
QtCore.QObject.connect(self.xValue,QtCore.SIGNAL("valueChanged(double)"),self.changeXValue)
QtCore.QObject.connect(self.yValue,QtCore.SIGNAL("valueChanged(double)"),self.changeYValue)
QtCore.QObject.connect(self.zValue,QtCore.SIGNAL("valueChanged(double)"),self.changeZValue)
QtCore.QObject.connect(self.lengthValue,QtCore.SIGNAL("valueChanged(double)"),self.changeLengthValue)
QtCore.QObject.connect(self.angleValue,QtCore.SIGNAL("valueChanged(double)"),self.changeAngleValue)
self.xValue.valueChanged.connect(self.changeXValue)
self.yValue.valueChanged.connect(self.changeYValue)
self.zValue.valueChanged.connect(self.changeZValue)
self.lengthValue.valueChanged.connect(self.changeLengthValue)
self.angleValue.valueChanged.connect(self.changeAngleValue)
if hasattr(self.angleLock, "checkStateChanged"): # Qt version >= 6.7.0
self.angleLock.checkStateChanged.connect(self.toggleAngle)
else: # Qt version < 6.7.0
QtCore.QObject.connect(self.angleLock,QtCore.SIGNAL("stateChanged(int)"),self.toggleAngle)
QtCore.QObject.connect(self.radiusValue,QtCore.SIGNAL("valueChanged(double)"),self.changeRadiusValue)
QtCore.QObject.connect(self.xValue,QtCore.SIGNAL("returnPressed()"),self.checkx)
QtCore.QObject.connect(self.yValue,QtCore.SIGNAL("returnPressed()"),self.checky)
QtCore.QObject.connect(self.lengthValue,QtCore.SIGNAL("returnPressed()"),self.checklength)
QtCore.QObject.connect(self.xValue,QtCore.SIGNAL("textEdited(QString)"),self.checkSpecialChars)
QtCore.QObject.connect(self.yValue,QtCore.SIGNAL("textEdited(QString)"),self.checkSpecialChars)
QtCore.QObject.connect(self.zValue,QtCore.SIGNAL("textEdited(QString)"),self.checkSpecialChars)
QtCore.QObject.connect(self.lengthValue,QtCore.SIGNAL("textEdited(QString)"),self.checkSpecialChars)
QtCore.QObject.connect(self.radiusValue,QtCore.SIGNAL("textEdited(QString)"),self.checkSpecialChars)
QtCore.QObject.connect(self.angleValue,QtCore.SIGNAL("textEdited(QString)"),self.checkSpecialChars)
QtCore.QObject.connect(self.zValue,QtCore.SIGNAL("returnPressed()"),self.validatePoint)
QtCore.QObject.connect(self.pointButton,QtCore.SIGNAL("clicked()"),self.validatePoint)
QtCore.QObject.connect(self.radiusValue,QtCore.SIGNAL("returnPressed()"),self.validatePoint)
QtCore.QObject.connect(self.angleValue,QtCore.SIGNAL("returnPressed()"),self.validatePoint)
QtCore.QObject.connect(self.textValue,QtCore.SIGNAL("textChanged()"),self.checkEnterText)
QtCore.QObject.connect(self.textOkButton,QtCore.SIGNAL("clicked()"),self.sendText)
QtCore.QObject.connect(self.zValue,QtCore.SIGNAL("returnPressed()"),self.setFocus)
self.angleLock.stateChanged.connect(self.toggleAngle)
self.radiusValue.valueChanged.connect(self.changeRadiusValue)
self.xValue.returnPressed.connect(self.checkx)
self.yValue.returnPressed.connect(self.checky)
self.lengthValue.returnPressed.connect(self.checklength)
self.xValue.textEdited.connect(self.checkSpecialChars)
self.yValue.textEdited.connect(self.checkSpecialChars)
self.zValue.textEdited.connect(self.checkSpecialChars)
self.lengthValue.textEdited.connect(self.checkSpecialChars)
self.radiusValue.textEdited.connect(self.checkSpecialChars)
self.angleValue.textEdited.connect(self.checkSpecialChars)
self.zValue.returnPressed.connect(self.validatePoint)
self.pointButton.clicked.connect(self.validatePoint)
self.radiusValue.returnPressed.connect(self.validatePoint)
self.angleValue.returnPressed.connect(self.validatePoint)
self.textValue.textChanged.connect(self.checkEnterText)
self.textOkButton.clicked.connect(self.sendText)
self.zValue.returnPressed.connect(self.setFocus)
QtCore.QObject.connect(self.finishButton,QtCore.SIGNAL("pressed()"),self.finish)
QtCore.QObject.connect(self.closeButton,QtCore.SIGNAL("pressed()"),self.closeLine)
QtCore.QObject.connect(self.wipeButton,QtCore.SIGNAL("pressed()"),self.wipeLine)
QtCore.QObject.connect(self.orientWPButton,QtCore.SIGNAL("pressed()"),self.orientWP)
QtCore.QObject.connect(self.undoButton,QtCore.SIGNAL("pressed()"),self.undoSegment)
QtCore.QObject.connect(self.selectButton,QtCore.SIGNAL("pressed()"),self.selectEdge)
self.finishButton.clicked.connect(self.finish)
self.closeButton.clicked.connect(self.closeLine)
self.wipeButton.clicked.connect(self.wipeLine)
self.orientWPButton.clicked.connect(self.orientWP)
self.undoButton.clicked.connect(self.undoSegment)
self.selectButton.clicked.connect(self.selectEdge)
if hasattr(self.continueCmd, "checkStateChanged"): # Qt version >= 6.7.0
self.continueCmd.checkStateChanged.connect(self.setContinue)
self.chainedModeCmd.checkStateChanged.connect(self.setChainedMode)
@@ -469,15 +469,13 @@ class DraftToolBar:
self.isGlobal.checkStateChanged.connect(self.setGlobal)
self.makeFace.checkStateChanged.connect(self.setMakeFace)
else: # Qt version < 6.7.0
QtCore.QObject.connect(self.continueCmd,QtCore.SIGNAL("stateChanged(int)"),self.setContinue)
QtCore.QObject.connect(self.chainedModeCmd,QtCore.SIGNAL("stateChanged(int)"),self.setChainedMode)
QtCore.QObject.connect(self.isCopy,QtCore.SIGNAL("stateChanged(int)"),self.setCopymode)
QtCore.QObject.connect(self.isSubelementMode, QtCore.SIGNAL("stateChanged(int)"), self.setSubelementMode)
QtCore.QObject.connect(self.isRelative,QtCore.SIGNAL("stateChanged(int)"),self.setRelative)
QtCore.QObject.connect(self.isGlobal,QtCore.SIGNAL("stateChanged(int)"),self.setGlobal)
QtCore.QObject.connect(self.makeFace,QtCore.SIGNAL("stateChanged(int)"),self.setMakeFace)
QtCore.QObject.connect(self.baseWidget,QtCore.SIGNAL("resized()"),self.relocate)
QtCore.QObject.connect(self.baseWidget,QtCore.SIGNAL("retranslate()"),self.retranslateUi)
self.continueCmd.stateChanged.connect(self.setContinue)
self.chainedModeCmd.stateChanged.connect(self.setChainedMode)
self.isCopy.stateChanged.connect(self.setCopymode)
self.isSubelementMode.stateChanged.connect(self.setSubelementMode)
self.isRelative.stateChanged.connect(self.setRelative)
self.isGlobal.stateChanged.connect(self.setGlobal)
self.makeFace.stateChanged.connect(self.setMakeFace)
def setupTray(self):
"""sets draft tray buttons up"""
@@ -500,10 +498,10 @@ class DraftToolBar:
self.autoGroupButton.setText(translate("draft", "None"))
self.autoGroupButton.setFlat(True)
QtCore.QObject.connect(self.wplabel,QtCore.SIGNAL("pressed()"),self.selectplane)
QtCore.QObject.connect(self.styleButton,QtCore.SIGNAL("pressed()"),self.setstyle)
QtCore.QObject.connect(self.constrButton,QtCore.SIGNAL("toggled(bool)"),self.toggleConstrMode)
QtCore.QObject.connect(self.autoGroupButton,QtCore.SIGNAL("pressed()"),self.runAutoGroup)
self.wplabel.clicked.connect(self.selectplane)
self.styleButton.clicked.connect(self.setstyle)
self.constrButton.toggled.connect(self.toggleConstrMode)
self.autoGroupButton.clicked.connect(self.runAutoGroup)
QtCore.QTimer.singleShot(2000,self.retranslateTray) # delay so translations get a chance to load
@@ -784,7 +782,7 @@ class DraftToolBar:
combo.addItem(translate("Draft", s), userData=s)
combo.setCurrentIndex(types.index(params.get_param("labeltype")))
l.addWidget(combo)
QtCore.QObject.connect(combo,QtCore.SIGNAL("currentIndexChanged(int)"),callback)
combo.currentIndexChanged.connect(callback)
self.pointUi(title=title, extra=w, icon="Draft_Label")
def extraUi(self):
@@ -921,13 +919,6 @@ class DraftToolBar:
self.radiusValue.setFocus()
self.radiusValue.selectAll()
def relocate(self):
"""relocates the right-aligned buttons depending on the toolbar size"""
if self.baseWidget.geometry().width() < 400:
self.layout.setDirection(QtWidgets.QBoxLayout.TopToBottom)
else:
self.layout.setDirection(QtWidgets.QBoxLayout.LeftToRight)
def makeDumbTask(self, extra=None, on_close_call=None):
"""create a dumb taskdialog to prevent deleting the temp object"""
class TaskPanel:
@@ -974,13 +965,9 @@ class DraftToolBar:
val = getattr(val, "value", val)
if val < 0:
if hasattr(self.isRelative, "checkStateChanged"): # Qt version >= 6.7.0
QtCore.QObject.disconnect(self.isRelative,
QtCore.SIGNAL("checkStateChanged(Qt::CheckState)"),
self.setRelative)
self.isRelative.checkStateChanged.disconnect(self.setRelative)
else: # Qt version < 6.7.0
QtCore.QObject.disconnect(self.isRelative,
QtCore.SIGNAL("stateChanged(int)"),
self.setRelative)
self.isRelative.stateChanged.disconnect(self.setRelative)
if val == -1:
self.isRelative.setChecked(True)
self.relativeMode = True
@@ -989,13 +976,9 @@ class DraftToolBar:
self.isRelative.setChecked(val)
self.relativeMode = val
if hasattr(self.isRelative, "checkStateChanged"): # Qt version >= 6.7.0
QtCore.QObject.disconnect(self.isRelative,
QtCore.SIGNAL("checkStateChanged(Qt::CheckState)"),
self.setRelative)
self.isRelative.checkStateChanged.connect(self.setRelative)
else: # Qt version < 6.7.0
QtCore.QObject.disconnect(self.isRelative,
QtCore.SIGNAL("stateChanged(int)"),
self.setRelative)
self.isRelative.stateChanged.connect(self.setRelative)
else:
params.set_param("RelativeMode", bool(val))
self.relativeMode = bool(val)
@@ -1457,7 +1440,7 @@ class DraftToolBar:
if not pos:
pos = FreeCADGui.getMainWindow().cursor().pos()
self.groupmenu.popup(pos)
QtCore.QObject.connect(self.groupmenu,QtCore.SIGNAL("triggered(QAction *)"),self.popupTriggered)
self.groupmenu.triggered.connect(self.popupTriggered)
def getIcon(self,iconpath):
return QtGui.QIcon(iconpath)
@@ -1541,7 +1524,7 @@ class DraftToolBar:
return
if not self.xValue.hasFocus():
return
self.x = d
self.x = d.Value
self.update_spherical_coords()
self.updateSnapper()
@@ -1550,7 +1533,7 @@ class DraftToolBar:
return
if not self.yValue.hasFocus():
return
self.y = d
self.y = d.Value
self.update_spherical_coords()
self.updateSnapper()
@@ -1559,7 +1542,7 @@ class DraftToolBar:
return
if not self.zValue.hasFocus():
return
self.z = d
self.z = d.Value
self.update_spherical_coords()
self.updateSnapper()
@@ -1568,14 +1551,14 @@ class DraftToolBar:
return
if not self.radiusValue.hasFocus():
return
self.radius = d
self.radius = d.Value
def changeLengthValue(self, d):
if self.display_point_active:
return
if not self.lengthValue.hasFocus():
return
self.lvalue = d
self.lvalue = d.Value
self.update_cartesian_coords()
self.updateSnapper()
@@ -1584,7 +1567,7 @@ class DraftToolBar:
return
if not self.angleValue.hasFocus():
return
self.avalue = d
self.avalue = d.Value
self.update_cartesian_coords()
self.updateSnapper()
if self.angleLock.isChecked():
@@ -1747,8 +1730,8 @@ class FacebinderTaskPanel:
self.delButton.setIcon(QtGui.QIcon(":/icons/Arch_Remove.svg"))
self.grid.addWidget(self.delButton, 3, 1, 1, 1)
QtCore.QObject.connect(self.addButton, QtCore.SIGNAL("clicked()"), self.addElement)
QtCore.QObject.connect(self.delButton, QtCore.SIGNAL("clicked()"), self.removeElement)
self.addButton.clicked.connect(self.addElement)
self.delButton.clicked.connect(self.removeElement)
self.update()
def isAllowedAlterSelection(self):

View File

@@ -882,8 +882,8 @@ CmdFemConstraintSpring::CmdFemConstraintSpring()
{
sAppModule = "Fem";
sGroup = QT_TR_NOOP("Fem");
sMenuText = QT_TR_NOOP("Spring Constraint");
sToolTipText = QT_TR_NOOP("Creates a spring acting on a face");
sMenuText = QT_TR_NOOP("Spring Boundary Condition");
sToolTipText = QT_TR_NOOP("Creates a spring boundary condition on a face");
sWhatsThis = "FEM_ConstraintSpring";
sStatusTip = sToolTipText;
sPixmap = "FEM_ConstraintSpring";

View File

@@ -593,7 +593,6 @@ private:
void onOperatorsActivated(int index);
private:
QWidget* proxy;
std::unique_ptr<Ui_TaskPostCalculator> ui;
};

View File

@@ -38,7 +38,7 @@
<item row="0" column="1">
<widget class="QLabel" name="Type">
<property name="text">
<string>Ressonance frequencies</string>
<string>Resonant frequencies</string>
</property>
</widget>
</item>

View File

@@ -731,9 +731,7 @@ class _MeshClear(CommandManager):
def __init__(self):
super().__init__()
self.menutext = Qt.QT_TRANSLATE_NOOP("FEM_MeshClear", "Clear FEM Mesh")
self.tooltip = Qt.QT_TRANSLATE_NOOP(
"FEM_MeshClear", "Clears the mesh of an FEM mesh object"
)
self.tooltip = Qt.QT_TRANSLATE_NOOP("FEM_MeshClear", "Clears the mesh of a FEM mesh object")
self.is_active = "with_femmesh"
def Activated(self):

View File

@@ -180,12 +180,23 @@ void MaterialYamlEntry::addToTree(
QString author = yamlValue(yamlModel["General"], "Author", "");
QString license = yamlValue(yamlModel["General"], "License", "");
QString description = yamlValue(yamlModel["General"], "Description", "");
QString sourceReference = yamlValue(yamlModel["General"], "ReferenceSource", "");
QString sourceURL = yamlValue(yamlModel["General"], "SourceURL", "");
std::shared_ptr<Material> finalModel =
std::make_shared<Material>(library, directory, uuid, name);
finalModel->setAuthor(author);
finalModel->setLicense(license);
finalModel->setDescription(description);
finalModel->setReference(sourceReference);
finalModel->setURL(sourceURL);
if (yamlModel["General"]["Tags"]) {
auto tags = readList(yamlModel["General"]["Tags"]);
for (auto tag : *tags) {
finalModel->addTag(tag.toString());
}
}
// Add inheritance list
if (yamlModel["Inherits"]) {

View File

@@ -699,6 +699,19 @@ void Material::removeUUID(QSet<QString>& uuidList, const QString& uuid)
uuidList.remove(uuid);
}
void Material::addTag(const QString& tag)
{
auto trimmed = tag.trimmed();
if (!trimmed.isEmpty()) {
_tags.insert(trimmed);
}
}
void Material::removeTag(const QString& tag)
{
_tags.remove(tag);
}
void Material::addPhysical(const QString& uuid)
{
if (hasPhysicalModel(uuid)) {
@@ -1327,6 +1340,12 @@ void Material::saveGeneral(QTextStream& stream) const
if (!_reference.isEmpty()) {
stream << " ReferenceSource: \"" << MaterialValue::escapeString(_reference) << "\"\n";
}
if (!_tags.isEmpty()) {
stream << " Tags:\n";
for (auto tag : _tags) {
stream << " - \"" << tag << "\"\n";
}
}
}
void Material::saveInherits(QTextStream& stream) const

View File

@@ -282,13 +282,11 @@ public:
{
_editState = ModelEdit_None;
}
void addTag(const QString& tag)
void addTag(const QString& tag);
void removeTag(const QString& tag);
bool hasTag(const QString& tag)
{
Q_UNUSED(tag);
}
void removeTag(const QString& tag)
{
Q_UNUSED(tag);
return _tags.contains(tag);
}
void addPhysical(const QString& uuid);
void removePhysical(const QString& uuid);

View File

@@ -99,7 +99,7 @@
<widget class="QComboBox" name="comboBoxCont">
<item>
<property name="text">
<string>Do not change continous mode</string>
<string>Do not change continuous mode</string>
</property>
</item>

View File

@@ -1684,7 +1684,7 @@ CmdSketcherSplit::CmdSketcherSplit()
sAppModule = "Sketcher";
sGroup = "Sketcher";
sMenuText = QT_TR_NOOP("Split Edge");
sToolTipText = QT_TR_NOOP("Splits an edge into 2 segements while preserving constraints");
sToolTipText = QT_TR_NOOP("Splits an edge into 2 segments while preserving constraints");
sWhatsThis = "Sketcher_Split";
sStatusTip = sToolTipText;
sPixmap = "Sketcher_Split";

View File

@@ -287,7 +287,6 @@ void QGIViewPart::drawAllFaces(void)
std::vector<LineSet> lineSets = fGeom->getTrimmedLines(iFace);
if (!lineSets.empty()) {
// this face has geometric hatch lines
newFace->clearLineSets();
for (auto& ls : lineSets) {
newFace->addLineSet(ls);
}

View File

@@ -112,7 +112,6 @@ void QGIViewSection::drawSectionFace()
newFace->setLineWeight(sectionVp->WeightPattern.getValue());
std::vector<TechDraw::LineSet> lineSets = section->getDrawableLines(i);
if (!lineSets.empty()) {
newFace->clearLineSets();
for (auto& ls: lineSets) {
newFace->addLineSet(ls);
}

View File

@@ -80,7 +80,7 @@ public:
int prefHighlightStyle(void);
std::vector<App::DocumentObject*> claimChildren(void) const override;
void fixSceneDependencies();
void fixSceneDependencies() override;
TechDraw::DrawViewPart* getViewObject() const override;
TechDraw::DrawViewPart* getViewPart() const;

View File

@@ -152,7 +152,10 @@ class TaskFillTemplateFields:
self.la.addWidget(t1, 0, 0)
self.cb1 = QtGui.QCheckBox(updateCb)
self.cb1.setObjectName(key)
self.cb1.setChecked(QtCore.Qt.Checked)
if hasattr(self.cb1, "setCheckState"):
self.cb1.setCheckState(QtCore.Qt.Checked)
else:
self.cb1.setChecked(QtCore.Qt.Checked)
self.la.addWidget(self.cb1, 0, 1)
u1 = QtGui.QLabel(updateTxt)
self.la.addWidget(u1, 0, 2)
@@ -169,7 +172,10 @@ class TaskFillTemplateFields:
self.la.addWidget(t2, 1, 0)
self.cb2 = QtGui.QCheckBox(updateCb)
self.cb2.setObjectName(key)
self.cb2.setChecked(QtCore.Qt.Checked)
if hasattr(self.cb2, "setCheckState"):
self.cb2.setCheckState(QtCore.Qt.Checked)
else:
self.cb2.setChecked(QtCore.Qt.Checked)
self.la.addWidget(self.cb2, 1, 1)
u2 = QtGui.QLabel(updateTxt)
self.la.addWidget(u2, 1, 2)
@@ -189,7 +195,10 @@ class TaskFillTemplateFields:
self.la.addWidget(t3, 2, 0)
self.cb3 = QtGui.QCheckBox(updateCb)
self.cb3.setObjectName(key)
self.cb3.setChecked(QtCore.Qt.Checked)
if hasattr(self.cb3, "setCheckState"):
self.cb3.setCheckState(QtCore.Qt.Checked)
else:
self.cb3.setChecked(QtCore.Qt.Checked)
self.la.addWidget(self.cb3, 2, 1)
u3 = QtGui.QLabel(updateTxt)
self.la.addWidget(u3, 2, 2)
@@ -206,7 +215,10 @@ class TaskFillTemplateFields:
self.la.addWidget(t4, 3, 0)
self.cb4 = QtGui.QCheckBox(updateCb)
self.cb4.setObjectName(key)
self.cb4.setChecked(QtCore.Qt.Checked)
if hasattr(self.cb4, "setCheckState"):
self.cb4.setCheckState(QtCore.Qt.Checked)
else:
self.cb4.setChecked(QtCore.Qt.Checked)
self.la.addWidget(self.cb4, 3, 1)
u4 = QtGui.QLabel(updateTxt)
self.la.addWidget(u4, 3, 2)
@@ -223,7 +235,10 @@ class TaskFillTemplateFields:
self.la.addWidget(t5, 4, 0)
self.cb5 = QtGui.QCheckBox(updateCb)
self.cb5.setObjectName(key)
self.cb5.setChecked(QtCore.Qt.Checked)
if hasattr(self.cb5, "setCheckState"):
self.cb5.setCheckState(QtCore.Qt.Checked)
else:
self.cb5.setChecked(QtCore.Qt.Checked)
self.la.addWidget(self.cb5, 4, 1)
u5 = QtGui.QLabel(updateTxt)
self.la.addWidget(u5, 4, 2)
@@ -240,7 +255,10 @@ class TaskFillTemplateFields:
self.la.addWidget(t6, 5, 0)
self.cb6 = QtGui.QCheckBox(updateCb)
self.cb6.setObjectName(key)
self.cb6.setChecked(QtCore.Qt.Checked)
if hasattr(self.cb6, "setCheckState"):
self.cb6.setCheckState(QtCore.Qt.Checked)
else:
self.cb6.setChecked(QtCore.Qt.Checked)
self.la.addWidget(self.cb6, 5, 1)
u6 = QtGui.QLabel(updateTxt)
self.la.addWidget(u6, 5, 2)
@@ -257,7 +275,10 @@ class TaskFillTemplateFields:
self.la.addWidget(t7, 6, 0)
self.cb7 = QtGui.QCheckBox(updateCb)
self.cb7.setObjectName(key)
self.cb7.setChecked(QtCore.Qt.Checked)
if hasattr(self.cb7, "setCheckState"):
self.cb7.setCheckState(QtCore.Qt.Checked)
else:
self.cb7.setChecked(QtCore.Qt.Checked)
self.la.addWidget(self.cb7, 6, 1)
u7 = QtGui.QLabel(updateTxt)
self.la.addWidget(u7, 6, 2)
@@ -303,7 +324,10 @@ class TaskFillTemplateFields:
self.la.addWidget(t8, 7, 0)
self.cb8 = QtGui.QCheckBox(updateCb)
self.cb8.setObjectName(key)
self.cb8.setChecked(QtCore.Qt.Checked)
if hasattr(self.cb8, "setCheckState"):
self.cb8.setCheckState(QtCore.Qt.Checked)
else:
self.cb8.setChecked(QtCore.Qt.Checked)
self.la.addWidget(self.cb8, 7, 1)
u8 = QtGui.QLabel(updateTxt)
self.la.addWidget(u8, 7, 2)
@@ -350,7 +374,10 @@ class TaskFillTemplateFields:
"Update All",
)
)
self.cbAll.setChecked(QtCore.Qt.Checked)
if hasattr(self.cbAll, "setCheckState"):
self.cbAll.setCheckState(QtCore.Qt.Checked)
else:
self.cbAll.setChecked(QtCore.Qt.Checked)
self.la.addWidget(self.cbAll, 8, 1)
self.cbAll.clicked.connect(self.on_cbAll_clicked)
@@ -391,11 +418,17 @@ class TaskFillTemplateFields:
def on_cbAll_clicked(self):
if self.cbAll.isChecked():
for cbEach in self.checkBoxList:
cbEach.setChecked(QtCore.Qt.Checked)
if hasattr(cbEach, "setCheckState"):
cbEach.setCheckState(QtCore.Qt.Checked)
else:
cbEach.setChecked(QtCore.Qt.Checked)
self.button.setEnabled(True)
else:
for cbEach in self.checkBoxList:
cbEach.setChecked(QtCore.Qt.Unchecked)
if hasattr(cbEach, "setCheckState"):
cbEach.setCheckState(QtCore.Qt.Checked)
else:
cbEach.setChecked(QtCore.Qt.Checked)
self.button.setEnabled(False)
def on_cb1_clicked(self):