38
38
#include < Gui/Application.h>
39
39
#include < Gui/BitmapFactory.h>
40
40
#include < Gui/Control.h>
41
- #include < Gui/ViewProviderDocumentObject .h>
41
+ #include < Gui/ViewProvider .h>
42
42
43
43
#include < QFormLayout>
44
44
#include < QPushButton>
@@ -174,85 +174,36 @@ void TaskMeasure::enableAnnotateButton(bool state)
174
174
btn->setEnabled (state);
175
175
}
176
176
177
- void TaskMeasure::setMeasureObject (Measure::MeasureBase* obj)
178
- {
179
- _mMeasureObject = obj;
180
- }
181
-
182
177
183
- App::DocumentObject * TaskMeasure::createObject (const App::MeasureType* measureType)
178
+ Measure::MeasureBase * TaskMeasure::createObject (const App::MeasureType* measureType)
184
179
{
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) {
192
182
return nullptr ;
193
183
}
194
184
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
199
185
if (measureType->isPython ) {
200
186
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 ;
209
188
189
+ // Create a MeasurePython instance
190
+ auto featurePython = doc->addObject (" Measure::MeasurePython" , measureType->label .c_str ());
191
+ _mMeasureObject = (Measure::MeasureBase*)featurePython;
210
192
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);
225
199
}
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 ());
250
204
}
251
205
252
- _mDocument = App::GetApplication ().getActiveDocument ();
253
- _mDocument->addObject (_mMeasureObject,
254
- modeSwitch->currentIndex () != 0 ? modeSwitch->currentText ().toLatin1 ()
255
- : QString ().toLatin1 ());
206
+ return _mMeasureObject;
256
207
}
257
208
258
209
@@ -327,6 +278,9 @@ void TaskMeasure::update()
327
278
createObject (measureType);
328
279
}
329
280
281
+ // From here on we need a valid measure object
282
+ assert (_mMeasureObject);
283
+
330
284
// we have a valid measure object so we can enable the annotate button
331
285
enableAnnotateButton (true );
332
286
@@ -336,15 +290,19 @@ void TaskMeasure::update()
336
290
// Get result
337
291
valueResult->setText (_mMeasureObject->getResultString ());
338
292
339
- createViewObject (_mMeasureObject);
340
293
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" ));
344
302
setDeltaPossible (prop != nullptr );
345
303
if (prop) {
346
304
prop->setValue (showDelta->isChecked ());
347
- _mViewObject ->update (prop);
305
+ viewObject ->update (prop);
348
306
}
349
307
}
350
308
@@ -385,7 +343,6 @@ void TaskMeasure::invoke()
385
343
386
344
bool TaskMeasure::apply ()
387
345
{
388
- saveObject ();
389
346
ensureGroup (_mMeasureObject);
390
347
_mMeasureObject = nullptr ;
391
348
reset ();
@@ -428,13 +385,8 @@ void TaskMeasure::removeObject()
428
385
return ;
429
386
}
430
387
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 ;
438
390
}
439
391
440
392
bool TaskMeasure::hasSelection ()
0 commit comments