Files
create/src/Mod
Abdullah Tahiri 2686f51c57 Checking for Document Restoring when extension has a null property
==================================================================

The problem:

OriginGroupExtension::OriginGroupExtension () {

    initExtensionType(OriginGroupExtension::getExtensionClassTypeId());

    EXTENSION_ADD_PROPERTY_TYPE ( Origin, (0), 0, App::Prop_Hidden, "Origin linked to the group" );
}

initializes the Origin property to null.

Then Document::Restore => readObjects => addObject => slotNewObject => ViewProviderDocumentObject::updateView => ViewProviderBody::updateData => ViewProviderGeometryObject::updateData =>
ViewProviderDocumentObject::updateData => ViewProvider::updateData => ViewProviderOriginGroupExtension::extensionUpdateData => updateOriginSize() => OriginGroupExtension::getOrigin,

the latter throws an exception because the origin property is null.

Afterwards, the origin property is initialized during Document::Restore => readObjects => ExtensionContainer::Restore() => PropertyContainer::Restore() => App::PropertyLink::Restore()
=> App::PropertyLink::setValue() => Property::hasSetValue, which triggers an onChange: Body::onChanged => BodyBase::onChanged => Feature::onChanged => DocumentObject::onChanged =>
Document::onChangedProperty => Document::slotChangedObject => ViewProviderOriginGroupExtension::slotChangedObjectGui => ViewProviderOriginGroupExtension::updateOriginSize =>
OriginGroupExtension::getOrigin,

now, the latter that is the same that was throwing the exception and generating the error message above, does not throw anymore because Origin has been initialized.

When creating a new object, isNew==true; whereas when loading a file, isNew==false. Therefore, when loading a file setupObject is not executed. SetupObject, effectively initializes
the extension via: Body::setupObject => DocumentObject::setupObject => OriginGroupExtension::onExtendedSetupObject.

DocumentObject * Document::addObject(const char* sType, const char* pObjectName, bool isNew)
{
    [more code here]
    // Call the object-specific initialization
    if (!d->undoing && !d->rollback && isNew) {
        pcObject->setupObject ();
    }
    [more code here]

As DocumentObject code is generic for all objects (workbenches), by design it was chosen to initialize the object only if new. Therefore a object or an extension of a object being restored,
between the addition (addObject) and the restoring of the properties, must by design expect it not to be initialized.

The solution:

Making use of the Restore flag at document level (the one at object level is not sufficient), no exception regarding the null property is reported during document restoring.

Ticket:
https://freecadweb.org/tracker/view.php?id=2530

fixes #2530
2017-05-30 13:01:45 +02:00
..
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2016-09-23 21:28:53 +02:00
2017-03-08 20:39:38 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-04-28 18:49:11 +02:00
2017-05-25 10:04:05 -03:00
2017-03-15 10:30:50 -03:00
2017-05-26 23:28:08 +02:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-05-25 10:04:05 -03:00
2017-04-17 16:20:44 +02:00