From 3a51404dd541b0b46e66e885abdf017244bc6724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Mon, 3 Oct 2016 12:06:32 +0200 Subject: [PATCH] Extenions: Drop virtual inheritance Due to problems onthe windows platform the virtual inheritance approach must be dropped. NExt to the already reimplemented proeprty interface the Type interface is reimplemented too. This change allows to revert some earlier changes. --- src/App/Document.cpp | 5 +- src/App/DocumentObjectExtension.cpp | 2 +- src/App/Extension.cpp | 23 +++++++- src/App/Extension.h | 57 ++++++++++++++++--- src/App/ExtensionContainer.h | 4 +- src/App/ExtensionContainerPyImp.cpp | 4 +- src/App/GeoFeatureGroupExtension.cpp | 4 +- src/App/GeoFeatureGroupExtension.h | 2 +- src/App/GroupExtension.cpp | 17 +++--- src/App/GroupExtensionPyImp.cpp | 2 +- src/App/OriginGroupExtension.cpp | 8 ++- src/App/PreCompiled.h | 2 - src/App/PropertyContainer.cpp | 1 + src/App/PropertyContainer.h | 25 +------- src/Base/BaseClass.h | 28 +++++---- src/Base/Persistence.h | 6 +- src/Gui/Application.cpp | 38 ++++++------- src/Gui/Document.cpp | 5 +- src/Gui/TreeView.cpp | 5 +- src/Gui/ViewProviderExtension.cpp | 2 +- .../ViewProviderGeoFeatureGroupExtension.cpp | 2 +- src/Gui/ViewProviderGroupExtension.cpp | 4 +- src/Gui/ViewProviderOriginGroupExtension.cpp | 2 +- src/Mod/PartDesign/Gui/Utils.cpp | 4 +- 24 files changed, 147 insertions(+), 105 deletions(-) diff --git a/src/App/Document.cpp b/src/App/Document.cpp index b042326cfb..b3b27b4b80 100644 --- a/src/App/Document.cpp +++ b/src/App/Document.cpp @@ -1894,15 +1894,14 @@ DocumentObject * Document::addObject(const char* sType, const char* pObjectName, string ObjectName; if (!base) return 0; - - App::DocumentObject* pcObject = dynamic_cast(base); - if (!pcObject) { + if (!base->getTypeId().isDerivedFrom(App::DocumentObject::getClassTypeId())) { delete base; std::stringstream str; str << "'" << sType << "' is not a document object type"; throw Base::TypeError(str.str()); } + App::DocumentObject* pcObject = static_cast(base); pcObject->setDocument(this); // do no transactions if we do a rollback! diff --git a/src/App/DocumentObjectExtension.cpp b/src/App/DocumentObjectExtension.cpp index 9976fde101..526bda7764 100644 --- a/src/App/DocumentObjectExtension.cpp +++ b/src/App/DocumentObjectExtension.cpp @@ -37,7 +37,7 @@ EXTENSION_PROPERTY_SOURCE(App::DocumentObjectExtension, App::Extension) DocumentObjectExtension::DocumentObjectExtension() { - initExtension(App::DocumentObjectExtension::getClassTypeId()); + initExtension(App::DocumentObjectExtension::getExtensionClassTypeId()); } DocumentObjectExtension::~DocumentObjectExtension() diff --git a/src/App/Extension.cpp b/src/App/Extension.cpp index d99f0b49ab..0cf176d626 100644 --- a/src/App/Extension.cpp +++ b/src/App/Extension.cpp @@ -37,12 +37,17 @@ /* We do not use a standart property macro for type initiation. The reason is that we have the first * PropertyData in the extension chain, there is no parent property data. */ -TYPESYSTEM_SOURCE_P(App::Extension); +EXTENSION_TYPESYSTEM_SOURCE_P(App::Extension); const App::PropertyData * App::Extension::extensionGetPropertyDataPtr(void){return &propertyData;} const App::PropertyData & App::Extension::extensionGetPropertyData(void) const{return propertyData;} App::PropertyData App::Extension::propertyData; void App::Extension::init(void){ - initSubclass(App::Extension::classTypeId, "App::Extension" , "Base::Persistence", &(App::Extension::create) ); + + assert(Extension::classTypeId == Base::Type::badType() && "don't init() twice!"); + + /* Set up entry in the type system. */ + Extension::classTypeId = Base::Type::createType(Base::Type::badType(), "App::Extension", + Extension::create); } using namespace App; @@ -161,6 +166,20 @@ void Extension::extensionGetPropertyMap(std::map< std::string, Property* >& Map) extensionGetPropertyData().getPropertyMap(this, Map); } +void Extension::initExtensionSubclass(Base::Type& toInit, const char* ClassName, const char* ParentName, + Base::Type::instantiationMethod method) { + + // dont't init twice! + assert(toInit == Base::Type::badType()); + // get the parent class + Base::Type parentType(Base::Type::fromName(ParentName)); + // forgot init parent! + assert(parentType != Base::Type::badType() ); + + // create the new type + toInit = Base::Type::createType(parentType, ClassName, method); +} + namespace App { EXTENSION_PROPERTY_SOURCE_TEMPLATE(App::ExtensionPython, App::ExtensionPython::Inherited) diff --git a/src/App/Extension.h b/src/App/Extension.h index 2ac4787ead..10816a14f1 100644 --- a/src/App/Extension.h +++ b/src/App/Extension.h @@ -32,10 +32,44 @@ namespace App { class ExtensionContainer; + +/// define Extension types +#define EXTENSION_TYPESYSTEM_HEADER() \ +public: \ + static Base::Type getExtensionClassTypeId(void); \ + virtual Base::Type getExtensionTypeId(void) const; \ + static void init(void);\ + static void *create(void);\ +private: \ + static Base::Type classTypeId +/// define to implement a subclass of Base::BaseClass +#define EXTENSION_TYPESYSTEM_SOURCE_P(_class_) \ +Base::Type _class_::getExtensionClassTypeId(void) { return _class_::classTypeId; } \ +Base::Type _class_::getExtensionTypeId(void) const { return _class_::classTypeId; } \ +Base::Type _class_::classTypeId = Base::Type::badType(); \ +void * _class_::create(void){\ + return new _class_ ();\ +} + +/// define to implement a subclass of Base::BaseClass +#define EXTENSION_TYPESYSTEM_SOURCE(_class_, _parentclass_) \ +EXTENSION_TYPESYSTEM_SOURCE_P(_class_);\ +void _class_::init(void){\ + initExtensionSubclass(_class_::classTypeId, #_class_ , #_parentclass_, &(_class_::create) ); \ +} + +#define EXTENSION_TYPESYSTEM_SOURCE_TEMPLATE(_class_) \ +template<> Base::Type _class_::classTypeId = Base::Type::badType(); \ +template<> Base::Type _class_::getExtensionClassTypeId(void) { return _class_::classTypeId; } \ +template<> Base::Type _class_::getExtensionTypeId(void) const { return _class_::classTypeId; } \ +template<> void * _class_::create(void){\ + return new _class_ ();\ +} + // init property stuff #define EXTENSION_PROPERTY_HEADER(_class_) \ - TYPESYSTEM_HEADER(); \ + EXTENSION_TYPESYSTEM_HEADER(); \ protected: \ static const App::PropertyData * extensionGetPropertyDataPtr(void); \ virtual const App::PropertyData &extensionGetPropertyData(void) const; \ @@ -43,22 +77,22 @@ private: \ static App::PropertyData propertyData #define EXTENSION_PROPERTY_SOURCE(_class_, _parentclass_) \ -TYPESYSTEM_SOURCE_P(_class_);\ +EXTENSION_TYPESYSTEM_SOURCE_P(_class_);\ const App::PropertyData * _class_::extensionGetPropertyDataPtr(void){return &propertyData;} \ const App::PropertyData & _class_::extensionGetPropertyData(void) const{return propertyData;} \ App::PropertyData _class_::propertyData; \ void _class_::init(void){\ - initSubclass(_class_::classTypeId, #_class_ , #_parentclass_, &(_class_::create) ); \ + initExtensionSubclass(_class_::classTypeId, #_class_ , #_parentclass_, &(_class_::create) ); \ _class_::propertyData.parentPropertyData = _parentclass_::extensionGetPropertyDataPtr();\ } #define EXTENSION_PROPERTY_SOURCE_TEMPLATE(_class_, _parentclass_) \ -TYPESYSTEM_SOURCE_TEMPLATE(_class_);\ +EXTENSION_TYPESYSTEM_SOURCE_TEMPLATE(_class_);\ template<> App::PropertyData _class_::propertyData = App::PropertyData(); \ template<> const App::PropertyData * _class_::extensionGetPropertyDataPtr(void){return &propertyData;} \ template<> const App::PropertyData & _class_::extensionGetPropertyData(void) const{return propertyData;} \ template<> void _class_::init(void){\ - initSubclass(_class_::classTypeId, #_class_ , #_parentclass_, &(_class_::create) ); \ + initExtensionSubclass(_class_::classTypeId, #_class_ , #_parentclass_, &(_class_::create) ); \ _class_::propertyData.parentPropertyData = _parentclass_::extensionGetPropertyDataPtr();\ } @@ -86,7 +120,7 @@ template<> void _class_::init(void){\ * MyExtension::MyExtension() { * * EXTENSION_ADD_PROPERTY(MyProp, (0)) * - * initExtension(MyExtension::getClassTypeId()); + * initExtension(MyExtension::getExtensionClassTypeId()); * } * typedef ExtensionPythonT MyExtensionPython; * @endcode @@ -161,7 +195,7 @@ template<> void _class_::init(void){\ * exension creators responsibility to ensure full implementation. * */ -class AppExport Extension : public virtual Base::Persistence +class AppExport Extension { //The cass does not have properties itself, but it is important to provide the property access @@ -210,6 +244,15 @@ public: /// get the Group of a named Property virtual const char* extensionGetPropertyDocumentation(const char *name) const; //@} + + /** @name TypeHandling */ + //@{ + bool isDerivedFrom(const Base::Type type) const {return getExtensionTypeId().isDerivedFrom(type);} +protected: + static void initExtensionSubclass(Base::Type &toInit,const char* ClassName, const char *ParentName, + Base::Type::instantiationMethod method=0); + //@} + protected: void initExtension(Base::Type type); diff --git a/src/App/ExtensionContainer.h b/src/App/ExtensionContainer.h index 240c45c79e..dc6e42b882 100644 --- a/src/App/ExtensionContainer.h +++ b/src/App/ExtensionContainer.h @@ -130,14 +130,14 @@ public: //returns first of type (or derived from) and throws otherwise template ExtensionT* getExtensionByType() { - return dynamic_cast(getExtension(ExtensionT::getClassTypeId())); + return dynamic_cast(getExtension(ExtensionT::getExtensionClassTypeId())); }; //get all extensions which have the given base class std::vector getExtensionsDerivedFrom(Base::Type type) const; template std::vector getExtensionsDerivedFromType() const { - auto vec = getExtensionsDerivedFrom(ExtensionT::getClassTypeId()); + auto vec = getExtensionsDerivedFrom(ExtensionT::getExtensionClassTypeId()); std::vector typevec; for(auto ext : vec) typevec.push_back(dynamic_cast(ext)); diff --git a/src/App/ExtensionContainerPyImp.cpp b/src/App/ExtensionContainerPyImp.cpp index afe3e386cf..627a701131 100644 --- a/src/App/ExtensionContainerPyImp.cpp +++ b/src/App/ExtensionContainerPyImp.cpp @@ -110,7 +110,7 @@ PyObject* ExtensionContainerPy::hasExtension(PyObject *args) { //get the extension type asked for Base::Type extension = Base::Type::fromName(type); - if(extension.isBad() || !extension.isDerivedFrom(App::Extension::getClassTypeId())) { + if(extension.isBad() || !extension.isDerivedFrom(App::Extension::getExtensionClassTypeId())) { std::stringstream str; str << "No extension found of type '" << type << "'" << std::ends; throw Py::Exception(Base::BaseExceptionFreeCADError,str.str()); @@ -133,7 +133,7 @@ PyObject* ExtensionContainerPy::addExtension(PyObject *args) { //get the extension type asked for Base::Type extension = Base::Type::fromName(type); - if(extension.isBad() || !extension.isDerivedFrom(App::Extension::getClassTypeId())) { + if(extension.isBad() || !extension.isDerivedFrom(App::Extension::getExtensionClassTypeId())) { std::stringstream str; str << "No extension found of type '" << type << "'" << std::ends; throw Py::Exception(Base::BaseExceptionFreeCADError,str.str()); diff --git a/src/App/GeoFeatureGroupExtension.cpp b/src/App/GeoFeatureGroupExtension.cpp index 243aed3f77..d37b80ca2b 100644 --- a/src/App/GeoFeatureGroupExtension.cpp +++ b/src/App/GeoFeatureGroupExtension.cpp @@ -45,7 +45,7 @@ EXTENSION_PROPERTY_SOURCE(App::GeoFeatureGroupExtension, App::GroupExtension) GeoFeatureGroupExtension::GeoFeatureGroupExtension(void) { - initExtension(GeoFeatureGroupExtension::getClassTypeId()); + initExtension(GeoFeatureGroupExtension::getExtensionClassTypeId()); EXTENSION_ADD_PROPERTY(Placement,(Base::Placement())); } @@ -128,7 +128,7 @@ bool GeoFeatureGroupExtension::geoHasObject (const DocumentObject* obj) const { DocumentObject* GeoFeatureGroupExtension::getGroupOfObject(const DocumentObject* obj, bool indirect) { const Document* doc = obj->getDocument(); - std::vector grps = doc->getObjectsOfType(GeoFeatureGroupExtension::getClassTypeId()); + std::vector grps = doc->getObjectsOfType(GeoFeatureGroupExtension::getExtensionClassTypeId()); for (std::vector::const_iterator it = grps.begin(); it != grps.end(); ++it) { GeoFeatureGroupExtension* grp = (GeoFeatureGroupExtension*)(*it); if ( indirect ) { diff --git a/src/App/GeoFeatureGroupExtension.h b/src/App/GeoFeatureGroupExtension.h index f26382c621..31f22eb3d7 100644 --- a/src/App/GeoFeatureGroupExtension.h +++ b/src/App/GeoFeatureGroupExtension.h @@ -71,7 +71,7 @@ public: /// Returns true if the given DocumentObject is DocumentObjectGroup but not GeoFeatureGroup static bool isNonGeoGroup(const DocumentObject* obj) { - return obj->hasExtension(GroupExtension::getClassTypeId()); + return obj->hasExtension(GroupExtension::getExtensionClassTypeId()); } }; diff --git a/src/App/GroupExtension.cpp b/src/App/GroupExtension.cpp index 391fd7efb3..dc6c518b64 100644 --- a/src/App/GroupExtension.cpp +++ b/src/App/GroupExtension.cpp @@ -38,7 +38,7 @@ EXTENSION_PROPERTY_SOURCE(App::GroupExtension, App::DocumentObjectExtension) GroupExtension::GroupExtension() { - initExtension(GroupExtension::getClassTypeId()); + initExtension(GroupExtension::getExtensionClassTypeId()); EXTENSION_ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_Output),"List of referenced objects"); } @@ -96,8 +96,8 @@ void GroupExtension::removeObjectsFromDocument() void GroupExtension::removeObjectFromDocument(DocumentObject* obj) { // remove all children - if (obj->hasExtension(GroupExtension::getClassTypeId())) { - GroupExtension *grp = static_cast(obj->getExtension(GroupExtension::getClassTypeId())); + if (obj->hasExtension(GroupExtension::getExtensionClassTypeId())) { + GroupExtension *grp = static_cast(obj->getExtension(GroupExtension::getExtensionClassTypeId())); // recursive call to remove all subgroups grp->removeObjectsFromDocument(); @@ -120,8 +120,9 @@ bool GroupExtension::hasObject(const DocumentObject* obj, bool recursive) const for (std::vector::const_iterator it = grp.begin(); it != grp.end(); ++it) { if (*it == obj) { return true; - } else if ( recursive && (*it)->hasExtension(GroupExtension::getClassTypeId()) ) { - App::GroupExtension *subGroup = static_cast ((*it)->getExtension(GroupExtension::getClassTypeId())); + } else if ( recursive && (*it)->hasExtension(GroupExtension::getExtensionClassTypeId()) ) { + App::GroupExtension *subGroup = static_cast ( + (*it)->getExtension(GroupExtension::getExtensionClassTypeId())); if (subGroup->hasObject (obj, recursive)) { return true; @@ -138,8 +139,8 @@ bool GroupExtension::isChildOf(const GroupExtension* group) const for (std::vector::const_iterator it = grp.begin(); it != grp.end(); ++it) { if (*it == getExtendedObject()) return true; - if ((*it)->hasExtension(GroupExtension::getClassTypeId())) { - if (this->isChildOf(static_cast((*it)->getExtension(GroupExtension::getClassTypeId())))) + if ((*it)->hasExtension(GroupExtension::getExtensionClassTypeId())) { + if (this->isChildOf(static_cast((*it)->getExtension(GroupExtension::getExtensionClassTypeId())))) return true; } @@ -180,7 +181,7 @@ int GroupExtension::countObjectsOfType(const Base::Type& typeId) const DocumentObject* GroupExtension::getGroupOfObject(const DocumentObject* obj) { const Document* doc = obj->getDocument(); - std::vector grps = doc->getObjectsOfType(GroupExtension::getClassTypeId()); + std::vector grps = doc->getObjectsOfType(GroupExtension::getExtensionClassTypeId()); for (std::vector::const_iterator it = grps.begin(); it != grps.end(); ++it) { GroupExtension* grp = (GroupExtension*)(*it); if (grp->hasObject(obj)) diff --git a/src/App/GroupExtensionPyImp.cpp b/src/App/GroupExtensionPyImp.cpp index c99a5a8a18..398dcfc30a 100644 --- a/src/App/GroupExtensionPyImp.cpp +++ b/src/App/GroupExtensionPyImp.cpp @@ -76,7 +76,7 @@ PyObject* GroupExtensionPy::addObject(PyObject *args) PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add a group object to itself"); return NULL; } - if (docObj->getDocumentObjectPtr()->hasExtension(GroupExtension::getClassTypeId())) { + if (docObj->getDocumentObjectPtr()->hasExtension(GroupExtension::getExtensionClassTypeId())) { App::GroupExtension* docGrp = docObj->getDocumentObjectPtr()->getExtensionByType(); if (docGrp->hasObject(getGroupExtensionPtr()->getExtendedObject())) { PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add a group object to a child group"); diff --git a/src/App/OriginGroupExtension.cpp b/src/App/OriginGroupExtension.cpp index 302ea76b15..82acaa8c51 100644 --- a/src/App/OriginGroupExtension.cpp +++ b/src/App/OriginGroupExtension.cpp @@ -39,7 +39,7 @@ EXTENSION_PROPERTY_SOURCE(App::OriginGroupExtension, App::GeoFeatureGroupExtensi OriginGroupExtension::OriginGroupExtension () { - initExtension(OriginGroupExtension::getClassTypeId()); + initExtension(OriginGroupExtension::getExtensionClassTypeId()); EXTENSION_ADD_PROPERTY_TYPE ( Origin, (0), 0, App::Prop_Hidden, "Origin linked to the group" ); } @@ -67,9 +67,11 @@ App::Origin *OriginGroupExtension::getOrigin () const { App::DocumentObject *OriginGroupExtension::getGroupOfObject (const DocumentObject* obj, bool indirect) { const Document* doc = obj->getDocument(); - std::vector grps = doc->getObjectsWithExtension ( OriginGroupExtension::getClassTypeId() ); + std::vector grps = doc->getObjectsWithExtension ( OriginGroupExtension::getExtensionClassTypeId() ); for (auto grpObj: grps) { - OriginGroupExtension* grp = dynamic_cast (grpObj->getExtension(OriginGroupExtension::getClassTypeId())); + OriginGroupExtension* grp = dynamic_cast (grpObj->getExtension( + OriginGroupExtension::getExtensionClassTypeId())); + if(!grp) throw Base::TypeError("Wrong type in origin group extenion"); if ( indirect ) { diff --git a/src/App/PreCompiled.h b/src/App/PreCompiled.h index 6c6545ae0e..3729ed29d6 100644 --- a/src/App/PreCompiled.h +++ b/src/App/PreCompiled.h @@ -33,7 +33,6 @@ #pragma warning( disable : 4275 ) #pragma warning( disable : 4503 ) #pragma warning( disable : 4786 ) // specifier longer then 255 chars -#pragma warning( disable : 4250 ) // virtual inheritance warning #endif @@ -86,7 +85,6 @@ #include #include - #endif //_PreComp_ #endif // APP_PRECOMPILED_H diff --git a/src/App/PropertyContainer.cpp b/src/App/PropertyContainer.cpp index 4b6156e952..e8a2a2d844 100644 --- a/src/App/PropertyContainer.cpp +++ b/src/App/PropertyContainer.cpp @@ -51,6 +51,7 @@ TYPESYSTEM_SOURCE(App::PropertyContainer,Base::Persistence); // here the implemataion! description should take place in the header file! PropertyContainer::PropertyContainer() { + propertyData.parentPropertyData = 0; } PropertyContainer::~PropertyContainer() diff --git a/src/App/PropertyContainer.h b/src/App/PropertyContainer.h index 2003e0c56d..d315d452e6 100644 --- a/src/App/PropertyContainer.h +++ b/src/App/PropertyContainer.h @@ -101,7 +101,7 @@ struct AppExport PropertyData /** Base class of all classes with properties */ -class AppExport PropertyContainer: public virtual Base::Persistence +class AppExport PropertyContainer: public Base::Persistence { TYPESYSTEM_HEADER(); @@ -271,27 +271,4 @@ template<> void _class_::init(void){\ } // namespace App - -/** - * Overload of freecads base class cast for all cases without any virtual inheritance - */ -template T * freecad_dynamic_cast(App::PropertyContainer* t) -{ - if (t && t->isDerivedFrom(T::getClassTypeId())) - return static_cast(t); - else - return nullptr; -} - -/** - * See explaination above - */ -template const T * freecad_dynamic_cast(const App::PropertyContainer* t) -{ - if (t && t->isDerivedFrom(T::getClassTypeId())) - return static_cast(t); - else - return nullptr; -} - #endif // APP_PROPERTYCONTAINER_H diff --git a/src/Base/BaseClass.h b/src/Base/BaseClass.h index bfe49baa67..7183d6b6b1 100644 --- a/src/Base/BaseClass.h +++ b/src/Base/BaseClass.h @@ -104,25 +104,29 @@ public: }; /** - * Template that works just like dynamic_cast, but expects the argument to - * inherit from Base::BaseClass. Note thst for base class this is exactly the same as a dynamic_cast. - * The reason for that is that it is not possible to static_cast base to anything in the inheritance - * chain after PropertyContainer. The reason for this is the used virtual inheritance. - * However, the function can be overload for different cast between objects in the inheritnce - * chain after PropertyContainer, for example from DocumentObject to all its derived types- - * - */ + * Template that works just like dynamic_cast, but expects the argument to + * inherit from Base::BaseClass. + * + */ template T * freecad_dynamic_cast(Base::BaseClass * t) { - return dynamic_cast(t); + if (t && t->isDerivedFrom(T::getClassTypeId())) + return static_cast(t); + else + return 0; } - + /** - * See explaination above + * Template that works just like dynamic_cast, but expects the argument to + * inherit from a const Base::BaseClass. + * */ template const T * freecad_dynamic_cast(const Base::BaseClass * t) { - return dynamic_cast(t); + if (t && t->isDerivedFrom(T::getClassTypeId())) + return static_cast(t); + else + return 0; } diff --git a/src/Base/Persistence.h b/src/Base/Persistence.h index 1b92e9c6ee..f3901153bf 100644 --- a/src/Base/Persistence.h +++ b/src/Base/Persistence.h @@ -48,7 +48,7 @@ public: * It is not meant to have the exact size, it is more or less an estimation * which runs fast! Is it two bytes or a GB? */ - virtual unsigned int getMemSize (void) const; + virtual unsigned int getMemSize (void) const = 0; /** This method is used to save properties to an XML document. * A good example you'll find in PropertyStandard.cpp, e.g. the vector: * \code @@ -65,7 +65,7 @@ public: * is written. This means closing tags and writing UTF-8. * @see Base::Writer */ - virtual void Save (Writer &/*writer*/) const; + virtual void Save (Writer &/*writer*/) const = 0; /** This method is used to restore properties from an XML document. * It uses the XMLReader class, which bases on SAX, to read the in Save() * written information. Again the Vector as an example: @@ -81,7 +81,7 @@ public: * } * \endcode */ - virtual void Restore(XMLReader &/*reader*/); + virtual void Restore(XMLReader &/*reader*/) = 0; /** This method is used to save large amounts of data to a binary file. * Sometimes it makes no sense to write property data as XML. In case the * amount of data is too big or the data type has a more effective way to diff --git a/src/Gui/Application.cpp b/src/Gui/Application.cpp index 56ff1f040c..913131ce44 100644 --- a/src/Gui/Application.cpp +++ b/src/Gui/Application.cpp @@ -277,27 +277,27 @@ FreeCADGui_subgraphFromObject(PyObject * /*self*/, PyObject *args) SoNode* node = 0; try { Base::BaseClass* base = static_cast(Base::Type::createInstanceByName(vp.c_str(), true)); - //throws if dynamic_cast fails, hence no check needed - std::unique_ptr vp(dynamic_cast(base)); + if (base && base->getTypeId().isDerivedFrom(Gui::ViewProviderDocumentObject::getClassTypeId())) { + std::unique_ptr vp(static_cast(base)); + std::map Map; + obj->getPropertyMap(Map); + vp->attach(obj); + for (std::map::iterator it = Map.begin(); it != Map.end(); ++it) { + vp->updateData(it->second); + } - std::map Map; - obj->getPropertyMap(Map); - vp->attach(obj); - for (std::map::iterator it = Map.begin(); it != Map.end(); ++it) { - vp->updateData(it->second); + std::vector modes = vp->getDisplayModes(); + if (!modes.empty()) + vp->setDisplayMode(modes.front().c_str()); + node = vp->getRoot()->copy(); + node->ref(); + std::string type = "So"; + type += node->getTypeId().getName().getString(); + type += " *"; + PyObject* proxy = 0; + proxy = Base::Interpreter().createSWIGPointerObj("pivy.coin", type.c_str(), (void*)node, 1); + return Py::new_reference_to(Py::Object(proxy, true)); } - - std::vector modes = vp->getDisplayModes(); - if (!modes.empty()) - vp->setDisplayMode(modes.front().c_str()); - node = vp->getRoot()->copy(); - node->ref(); - std::string type = "So"; - type += node->getTypeId().getName().getString(); - type += " *"; - PyObject* proxy = 0; - proxy = Base::Interpreter().createSWIGPointerObj("pivy.coin", type.c_str(), (void*)node, 1); - return Py::new_reference_to(Py::Object(proxy, true)); } catch (const Base::Exception& e) { if (node) node->unref(); diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index feaf339dfb..a8bbe86b6a 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -420,10 +420,9 @@ void Document::slotNewObject(const App::DocumentObject& Obj) setModified(true); Base::BaseClass* base = static_cast(Base::Type::createInstanceByName(cName.c_str(),true)); if (base) { - pcProvider = dynamic_cast(base); // type not derived from ViewProviderDocumentObject!!! - assert(pcProvider); - + assert(base->getTypeId().isDerivedFrom(Gui::ViewProviderDocumentObject::getClassTypeId())); + pcProvider = static_cast(base); d->_ViewProviderMap[&Obj] = pcProvider; try { diff --git a/src/Gui/TreeView.cpp b/src/Gui/TreeView.cpp index 1dd44aba30..3c708c4c97 100644 --- a/src/Gui/TreeView.cpp +++ b/src/Gui/TreeView.cpp @@ -71,9 +71,8 @@ void TreeView::mouseDoubleClickEvent (QMouseEvent * event) if (!view) return; getMainWindow()->setActiveWindow(view); } - else { - auto* vp = dynamic_cast(item); - if (vp && vp->doubleClicked() == false) + else if (item->getTypeId().isDerivedFrom(ViewProvider::getClassTypeId())) { + if (static_cast(item)->doubleClicked() == false) QTreeView::mouseDoubleClickEvent(event); } } diff --git a/src/Gui/ViewProviderExtension.cpp b/src/Gui/ViewProviderExtension.cpp index 2ee8d94c7d..67b61af9a3 100644 --- a/src/Gui/ViewProviderExtension.cpp +++ b/src/Gui/ViewProviderExtension.cpp @@ -37,7 +37,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderExtension, App::Extension) ViewProviderExtension::ViewProviderExtension() { - initExtension(Gui::ViewProviderExtension::getClassTypeId()); + initExtension(Gui::ViewProviderExtension::getExtensionClassTypeId()); } ViewProviderExtension::~ViewProviderExtension() diff --git a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp index 6217b1b8db..6f025e64ba 100644 --- a/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp +++ b/src/Gui/ViewProviderGeoFeatureGroupExtension.cpp @@ -38,7 +38,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGeoFeatureGroupExtension, Gui::ViewPr ViewProviderGeoFeatureGroupExtension::ViewProviderGeoFeatureGroupExtension() { - initExtension(ViewProviderGeoFeatureGroupExtension::getClassTypeId()); + initExtension(ViewProviderGeoFeatureGroupExtension::getExtensionClassTypeId()); pcGroupChildren = new SoGroup(); pcGroupChildren->ref(); diff --git a/src/Gui/ViewProviderGroupExtension.cpp b/src/Gui/ViewProviderGroupExtension.cpp index 3def916dc4..a86b98a3c8 100644 --- a/src/Gui/ViewProviderGroupExtension.cpp +++ b/src/Gui/ViewProviderGroupExtension.cpp @@ -44,7 +44,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGroupExtension, Gui::ViewProviderExte ViewProviderGroupExtension::ViewProviderGroupExtension() : visible(false) { - initExtension(ViewProviderGroupExtension::getClassTypeId()); + initExtension(ViewProviderGroupExtension::getExtensionClassTypeId()); } @@ -83,7 +83,7 @@ bool ViewProviderGroupExtension::extensionCanDropObject(App::DocumentObject* obj return false; //group into group? - if (obj->hasExtension(App::GroupExtension::getClassTypeId())) + if (obj->hasExtension(App::GroupExtension::getExtensionClassTypeId())) if (group->isChildOf(obj->getExtensionByType())) return false; diff --git a/src/Gui/ViewProviderOriginGroupExtension.cpp b/src/Gui/ViewProviderOriginGroupExtension.cpp index f19ae96553..a5cb7edad5 100644 --- a/src/Gui/ViewProviderOriginGroupExtension.cpp +++ b/src/Gui/ViewProviderOriginGroupExtension.cpp @@ -48,7 +48,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderOriginGroupExtension, Gui::ViewProvid ViewProviderOriginGroupExtension::ViewProviderOriginGroupExtension() { - initExtension(ViewProviderOriginGroupExtension::getClassTypeId()); + initExtension(ViewProviderOriginGroupExtension::getExtensionClassTypeId()); } ViewProviderOriginGroupExtension::~ViewProviderOriginGroupExtension() diff --git a/src/Mod/PartDesign/Gui/Utils.cpp b/src/Mod/PartDesign/Gui/Utils.cpp index ad285b0be8..ee97e08110 100644 --- a/src/Mod/PartDesign/Gui/Utils.cpp +++ b/src/Mod/PartDesign/Gui/Utils.cpp @@ -238,8 +238,8 @@ bool isPartDesignAwareObjecta (App::DocumentObject *obj, bool respectGroups = fa PartDesign::Body::isAllowed ( obj ) || obj->isDerivedFrom ( PartDesign::Body::getClassTypeId () ) || ( respectGroups && ( - obj->hasExtension (App::GeoFeatureGroupExtension::getClassTypeId () ) || - obj->hasExtension (App::GroupExtension::getClassTypeId () ) + obj->hasExtension (App::GeoFeatureGroupExtension::getExtensionClassTypeId () ) || + obj->hasExtension (App::GroupExtension::getExtensionClassTypeId () ) ) ) ); }