Merge branch 'main' into CAM-Inspect-Fix
This commit is contained in:
11
pixi.toml
11
pixi.toml
@@ -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="" }}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -593,7 +593,6 @@ private:
|
||||
void onOperatorsActivated(int index);
|
||||
|
||||
private:
|
||||
QWidget* proxy;
|
||||
std::unique_ptr<Ui_TaskPostCalculator> ui;
|
||||
};
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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"]) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user