diff --git a/src/App/Document.cpp b/src/App/Document.cpp index b042326cf..b3b27b4b8 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 9976fde10..526bda776 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 d99f0b49a..0cf176d62 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 2ac4787ea..10816a14f 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 240c45c79..dc6e42b88 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 afe3e386c..627a70113 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 243aed3f7..d37b80ca2 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 f26382c62..31f22eb3d 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 391fd7efb..dc6c518b6 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 c99a5a8a1..398dcfc30 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 302ea76b1..82acaa8c5 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 6c6545ae0..3729ed29d 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 4b6156e95..e8a2a2d84 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 2003e0c56..d315d452e 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 bfe49baa6..7183d6b6b 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 1b92e9c6e..f3901153b 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 56ff1f040..913131ce4 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 feaf339df..a8bbe86b6 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 1dd44aba3..3c708c4c9 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 2ee8d94c7..67b61af9a 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 6217b1b8d..6f025e64b 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 3def916dc..a86b98a3c 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 f19ae9655..a5cb7edad 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 ad285b0be..ee97e0811 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 () ) ) ) ); }