Skip to content

Commit 61f53b4

Browse files
committed
MeasureGui: Revert temporary measure object creation
Reverts the temporary creation of measurement objects that was added in FreeCAD#15122
1 parent a9bff78 commit 61f53b4

File tree

2 files changed

+34
-86
lines changed

2 files changed

+34
-86
lines changed

src/Mod/Measure/Gui/TaskMeasure.cpp

+33-81
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
#include <Gui/Application.h>
3939
#include <Gui/BitmapFactory.h>
4040
#include <Gui/Control.h>
41-
#include <Gui/ViewProviderDocumentObject.h>
41+
#include <Gui/ViewProvider.h>
4242

4343
#include <QFormLayout>
4444
#include <QPushButton>
@@ -174,85 +174,36 @@ void TaskMeasure::enableAnnotateButton(bool state)
174174
btn->setEnabled(state);
175175
}
176176

177-
void TaskMeasure::setMeasureObject(Measure::MeasureBase* obj)
178-
{
179-
_mMeasureObject = obj;
180-
}
181-
182177

183-
App::DocumentObject* TaskMeasure::createObject(const App::MeasureType* measureType)
178+
Measure::MeasureBase* TaskMeasure::createObject(const App::MeasureType* measureType)
184179
{
185-
auto measureClass =
186-
measureType->isPython ? "Measure::MeasurePython" : measureType->measureObject;
187-
auto type = Base::Type::getTypeIfDerivedFrom(measureClass.c_str(),
188-
App::DocumentObject::getClassTypeId(),
189-
true);
190-
191-
if (type.isBad()) {
180+
App::Document* doc = App::GetApplication().getActiveDocument();
181+
if (!doc) {
192182
return nullptr;
193183
}
194184

195-
_mMeasureObject = static_cast<Measure::MeasureBase*>(type.createInstance());
196-
197-
// Create an instance of the python measure class, the classe's
198-
// initializer sets the object as proxy
199185
if (measureType->isPython) {
200186
Base::PyGILStateLocker lock;
201-
Py::Tuple args(1);
202-
args.setItem(0, Py::asObject(_mMeasureObject->getPyObject()));
203-
PyObject* result = PyObject_CallObject(measureType->pythonClass, args.ptr());
204-
Py_XDECREF(result);
205-
}
206-
207-
return static_cast<App::DocumentObject*>(_mMeasureObject);
208-
}
187+
auto pyMeasureClass = measureType->pythonClass;
209188

189+
// Create a MeasurePython instance
190+
auto featurePython = doc->addObject("Measure::MeasurePython", measureType->label.c_str());
191+
_mMeasureObject = (Measure::MeasureBase*)featurePython;
210192

211-
Gui::ViewProviderDocumentObject* TaskMeasure::createViewObject(App::DocumentObject* measureObj)
212-
{
213-
// Add view object
214-
auto vpName = measureObj->getViewProviderName();
215-
if ((vpName == nullptr) || (vpName[0] == '\0')) {
216-
return nullptr;
217-
}
218-
219-
auto vpType =
220-
Base::Type::getTypeIfDerivedFrom(vpName,
221-
Gui::ViewProviderDocumentObject::getClassTypeId(),
222-
true);
223-
if (vpType.isBad()) {
224-
return nullptr;
193+
// Create an instance of the pyMeasureClass, the classe's initializer sets the object as
194+
// proxy
195+
Py::Tuple args(1);
196+
args.setItem(0, Py::asObject(featurePython->getPyObject()));
197+
PyObject* result = PyObject_CallObject(pyMeasureClass, args.ptr());
198+
Py_XDECREF(result);
225199
}
226-
227-
auto vp = static_cast<Gui::ViewProviderDocumentObject*>(vpType.createInstance());
228-
229-
_mGuiDocument = Gui::Application::Instance->activeDocument();
230-
_mGuiDocument->setAnnotationViewProvider(vp->getTypeId().getName(), vp);
231-
vp->attach(measureObj);
232-
233-
// Init the position of the annotation
234-
static_cast<MeasureGui::ViewProviderMeasureBase*>(vp)->positionAnno(_mMeasureObject);
235-
236-
vp->updateView();
237-
vp->setActiveMode();
238-
239-
_mViewObject = vp;
240-
return vp;
241-
}
242-
243-
244-
void TaskMeasure::saveObject()
245-
{
246-
if (_mViewObject && _mGuiDocument) {
247-
_mGuiDocument->addViewProvider(_mViewObject);
248-
_mGuiDocument->takeAnnotationViewProvider(_mViewObject->getTypeId().getName());
249-
_mViewObject = nullptr;
200+
else {
201+
// Create measure object
202+
_mMeasureObject = (Measure::MeasureBase*)doc->addObject(measureType->measureObject.c_str(),
203+
measureType->label.c_str());
250204
}
251205

252-
_mDocument = App::GetApplication().getActiveDocument();
253-
_mDocument->addObject(_mMeasureObject,
254-
modeSwitch->currentIndex() != 0 ? modeSwitch->currentText().toLatin1()
255-
: QString().toLatin1());
206+
return _mMeasureObject;
256207
}
257208

258209

@@ -327,6 +278,9 @@ void TaskMeasure::update()
327278
createObject(measureType);
328279
}
329280

281+
// From here on we need a valid measure object
282+
assert(_mMeasureObject);
283+
330284
// we have a valid measure object so we can enable the annotate button
331285
enableAnnotateButton(true);
332286

@@ -336,15 +290,19 @@ void TaskMeasure::update()
336290
// Get result
337291
valueResult->setText(_mMeasureObject->getResultString());
338292

339-
createViewObject(_mMeasureObject);
340293

341-
// Must be after createViewObject!
342-
assert(_mViewObject);
343-
auto* prop = dynamic_cast<App::PropertyBool*>(_mViewObject->getPropertyByName("ShowDelta"));
294+
// Init the position of the annotation
295+
Gui::Document* guiDoc = Gui::Application::Instance->activeDocument();
296+
Gui::ViewProvider* viewObject = guiDoc->getViewProvider(_mMeasureObject);
297+
assert(viewObject);
298+
dynamic_cast<MeasureGui::ViewProviderMeasureBase*>(viewObject)->positionAnno(_mMeasureObject);
299+
300+
// Set the ShowDelta Property if it exists on the measurements view object
301+
auto* prop = dynamic_cast<App::PropertyBool*>(viewObject->getPropertyByName("ShowDelta"));
344302
setDeltaPossible(prop != nullptr);
345303
if (prop) {
346304
prop->setValue(showDelta->isChecked());
347-
_mViewObject->update(prop);
305+
viewObject->update(prop);
348306
}
349307
}
350308

@@ -385,7 +343,6 @@ void TaskMeasure::invoke()
385343

386344
bool TaskMeasure::apply()
387345
{
388-
saveObject();
389346
ensureGroup(_mMeasureObject);
390347
_mMeasureObject = nullptr;
391348
reset();
@@ -428,13 +385,8 @@ void TaskMeasure::removeObject()
428385
return;
429386
}
430387

431-
if (_mViewObject && _mGuiDocument) {
432-
_mGuiDocument->removeAnnotationViewProvider(_mViewObject->getTypeId().getName());
433-
_mViewObject = nullptr;
434-
}
435-
436-
delete _mMeasureObject;
437-
setMeasureObject(nullptr);
388+
_mMeasureObject->getDocument()->removeObject(_mMeasureObject->getNameInDocument());
389+
_mMeasureObject = nullptr;
438390
}
439391

440392
bool TaskMeasure::hasSelection()

src/Mod/Measure/Gui/TaskMeasure.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,13 @@ class TaskMeasure: public TaskView::TaskDialog, public Gui::SelectionObserver
6565
bool hasSelection();
6666
void clearSelection();
6767
bool eventFilter(QObject* obj, QEvent* event) override;
68-
void setMeasureObject(Measure::MeasureBase* obj);
6968

7069
private:
7170
void onSelectionChanged(const Gui::SelectionChanges& msg) override;
7271

7372
App::Document* _mDocument = nullptr;
7473
Gui::Document* _mGuiDocument = nullptr;
7574
Measure::MeasureBase* _mMeasureObject = nullptr;
76-
Gui::ViewProviderDocumentObject* _mViewObject = nullptr;
7775

7876
QLineEdit* valueResult {nullptr};
7977
QComboBox* modeSwitch {nullptr};
@@ -86,9 +84,7 @@ class TaskMeasure: public TaskView::TaskDialog, public Gui::SelectionObserver
8684
void setModeSilent(App::MeasureType* mode);
8785
App::MeasureType* getMeasureType();
8886
void enableAnnotateButton(bool state);
89-
App::DocumentObject* createObject(const App::MeasureType* measureType);
90-
Gui::ViewProviderDocumentObject* createViewObject(App::DocumentObject* measureObj);
91-
void saveObject();
87+
Measure::MeasureBase* createObject(const App::MeasureType* measureType);
9288
void ensureGroup(Measure::MeasureBase* measurement);
9389
void setDeltaPossible(bool possible);
9490

0 commit comments

Comments
 (0)