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.
This commit is contained in:
Stefan Tröger 2016-10-03 12:06:32 +02:00 committed by wmayer
parent a79b48bbcc
commit 3a51404dd5
24 changed files with 147 additions and 105 deletions

View File

@ -1894,15 +1894,14 @@ DocumentObject * Document::addObject(const char* sType, const char* pObjectName,
string ObjectName;
if (!base)
return 0;
App::DocumentObject* pcObject = dynamic_cast<App::DocumentObject*>(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<App::DocumentObject*>(base);
pcObject->setDocument(this);
// do no transactions if we do a rollback!

View File

@ -37,7 +37,7 @@ EXTENSION_PROPERTY_SOURCE(App::DocumentObjectExtension, App::Extension)
DocumentObjectExtension::DocumentObjectExtension()
{
initExtension(App::DocumentObjectExtension::getClassTypeId());
initExtension(App::DocumentObjectExtension::getExtensionClassTypeId());
}
DocumentObjectExtension::~DocumentObjectExtension()

View File

@ -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)

View File

@ -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<MyExtension> 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);

View File

@ -130,14 +130,14 @@ public:
//returns first of type (or derived from) and throws otherwise
template<typename ExtensionT>
ExtensionT* getExtensionByType() {
return dynamic_cast<ExtensionT*>(getExtension(ExtensionT::getClassTypeId()));
return dynamic_cast<ExtensionT*>(getExtension(ExtensionT::getExtensionClassTypeId()));
};
//get all extensions which have the given base class
std::vector<Extension*> getExtensionsDerivedFrom(Base::Type type) const;
template<typename ExtensionT>
std::vector<ExtensionT*> getExtensionsDerivedFromType() const {
auto vec = getExtensionsDerivedFrom(ExtensionT::getClassTypeId());
auto vec = getExtensionsDerivedFrom(ExtensionT::getExtensionClassTypeId());
std::vector<ExtensionT*> typevec;
for(auto ext : vec)
typevec.push_back(dynamic_cast<ExtensionT*>(ext));

View File

@ -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());

View File

@ -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<DocumentObject*> grps = doc->getObjectsOfType(GeoFeatureGroupExtension::getClassTypeId());
std::vector<DocumentObject*> grps = doc->getObjectsOfType(GeoFeatureGroupExtension::getExtensionClassTypeId());
for (std::vector<DocumentObject*>::const_iterator it = grps.begin(); it != grps.end(); ++it) {
GeoFeatureGroupExtension* grp = (GeoFeatureGroupExtension*)(*it);
if ( indirect ) {

View File

@ -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());
}
};

View File

@ -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<GroupExtension*>(obj->getExtension(GroupExtension::getClassTypeId()));
if (obj->hasExtension(GroupExtension::getExtensionClassTypeId())) {
GroupExtension *grp = static_cast<GroupExtension*>(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<DocumentObject*>::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<App::GroupExtension *> ((*it)->getExtension(GroupExtension::getClassTypeId()));
} else if ( recursive && (*it)->hasExtension(GroupExtension::getExtensionClassTypeId()) ) {
App::GroupExtension *subGroup = static_cast<App::GroupExtension *> (
(*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<DocumentObject*>::const_iterator it = grp.begin(); it != grp.end(); ++it) {
if (*it == getExtendedObject())
return true;
if ((*it)->hasExtension(GroupExtension::getClassTypeId())) {
if (this->isChildOf(static_cast<GroupExtension*>((*it)->getExtension(GroupExtension::getClassTypeId()))))
if ((*it)->hasExtension(GroupExtension::getExtensionClassTypeId())) {
if (this->isChildOf(static_cast<GroupExtension*>((*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<DocumentObject*> grps = doc->getObjectsOfType(GroupExtension::getClassTypeId());
std::vector<DocumentObject*> grps = doc->getObjectsOfType(GroupExtension::getExtensionClassTypeId());
for (std::vector<DocumentObject*>::const_iterator it = grps.begin(); it != grps.end(); ++it) {
GroupExtension* grp = (GroupExtension*)(*it);
if (grp->hasObject(obj))

View File

@ -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<GroupExtension>();
if (docGrp->hasObject(getGroupExtensionPtr()->getExtendedObject())) {
PyErr_SetString(Base::BaseExceptionFreeCADError, "Cannot add a group object to a child group");

View File

@ -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<DocumentObject*> grps = doc->getObjectsWithExtension ( OriginGroupExtension::getClassTypeId() );
std::vector<DocumentObject*> grps = doc->getObjectsWithExtension ( OriginGroupExtension::getExtensionClassTypeId() );
for (auto grpObj: grps) {
OriginGroupExtension* grp = dynamic_cast <OriginGroupExtension* >(grpObj->getExtension(OriginGroupExtension::getClassTypeId()));
OriginGroupExtension* grp = dynamic_cast <OriginGroupExtension* >(grpObj->getExtension(
OriginGroupExtension::getExtensionClassTypeId()));
if(!grp) throw Base::TypeError("Wrong type in origin group extenion");
if ( indirect ) {

View File

@ -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 <boost/filesystem/operations.hpp>
#include <boost/filesystem/exception.hpp>
#endif //_PreComp_
#endif // APP_PRECOMPILED_H

View File

@ -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()

View File

@ -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<typename T> T * freecad_dynamic_cast(App::PropertyContainer* t)
{
if (t && t->isDerivedFrom(T::getClassTypeId()))
return static_cast<T*>(t);
else
return nullptr;
}
/**
* See explaination above
*/
template<typename T> const T * freecad_dynamic_cast(const App::PropertyContainer* t)
{
if (t && t->isDerivedFrom(T::getClassTypeId()))
return static_cast<const T*>(t);
else
return nullptr;
}
#endif // APP_PROPERTYCONTAINER_H

View File

@ -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<typename T> T * freecad_dynamic_cast(Base::BaseClass * t)
{
return dynamic_cast<T*>(t);
if (t && t->isDerivedFrom(T::getClassTypeId()))
return static_cast<T*>(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<typename T> const T * freecad_dynamic_cast(const Base::BaseClass * t)
{
return dynamic_cast<const T*>(t);
if (t && t->isDerivedFrom(T::getClassTypeId()))
return static_cast<const T*>(t);
else
return 0;
}

View File

@ -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

View File

@ -277,27 +277,27 @@ FreeCADGui_subgraphFromObject(PyObject * /*self*/, PyObject *args)
SoNode* node = 0;
try {
Base::BaseClass* base = static_cast<Base::BaseClass*>(Base::Type::createInstanceByName(vp.c_str(), true));
//throws if dynamic_cast fails, hence no check needed
std::unique_ptr<Gui::ViewProviderDocumentObject> vp(dynamic_cast<Gui::ViewProviderDocumentObject*>(base));
if (base && base->getTypeId().isDerivedFrom(Gui::ViewProviderDocumentObject::getClassTypeId())) {
std::unique_ptr<Gui::ViewProviderDocumentObject> vp(static_cast<Gui::ViewProviderDocumentObject*>(base));
std::map<std::string, App::Property*> Map;
obj->getPropertyMap(Map);
vp->attach(obj);
for (std::map<std::string, App::Property*>::iterator it = Map.begin(); it != Map.end(); ++it) {
vp->updateData(it->second);
}
std::map<std::string, App::Property*> Map;
obj->getPropertyMap(Map);
vp->attach(obj);
for (std::map<std::string, App::Property*>::iterator it = Map.begin(); it != Map.end(); ++it) {
vp->updateData(it->second);
std::vector<std::string> 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<std::string> 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();

View File

@ -420,10 +420,9 @@ void Document::slotNewObject(const App::DocumentObject& Obj)
setModified(true);
Base::BaseClass* base = static_cast<Base::BaseClass*>(Base::Type::createInstanceByName(cName.c_str(),true));
if (base) {
pcProvider = dynamic_cast<ViewProviderDocumentObject*>(base);
// type not derived from ViewProviderDocumentObject!!!
assert(pcProvider);
assert(base->getTypeId().isDerivedFrom(Gui::ViewProviderDocumentObject::getClassTypeId()));
pcProvider = static_cast<ViewProviderDocumentObject*>(base);
d->_ViewProviderMap[&Obj] = pcProvider;
try {

View File

@ -71,9 +71,8 @@ void TreeView::mouseDoubleClickEvent (QMouseEvent * event)
if (!view) return;
getMainWindow()->setActiveWindow(view);
}
else {
auto* vp = dynamic_cast<ViewProvider*>(item);
if (vp && vp->doubleClicked() == false)
else if (item->getTypeId().isDerivedFrom(ViewProvider::getClassTypeId())) {
if (static_cast<ViewProvider*>(item)->doubleClicked() == false)
QTreeView::mouseDoubleClickEvent(event);
}
}

View File

@ -37,7 +37,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderExtension, App::Extension)
ViewProviderExtension::ViewProviderExtension()
{
initExtension(Gui::ViewProviderExtension::getClassTypeId());
initExtension(Gui::ViewProviderExtension::getExtensionClassTypeId());
}
ViewProviderExtension::~ViewProviderExtension()

View File

@ -38,7 +38,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGeoFeatureGroupExtension, Gui::ViewPr
ViewProviderGeoFeatureGroupExtension::ViewProviderGeoFeatureGroupExtension()
{
initExtension(ViewProviderGeoFeatureGroupExtension::getClassTypeId());
initExtension(ViewProviderGeoFeatureGroupExtension::getExtensionClassTypeId());
pcGroupChildren = new SoGroup();
pcGroupChildren->ref();

View File

@ -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<App::GroupExtension>()))
return false;

View File

@ -48,7 +48,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderOriginGroupExtension, Gui::ViewProvid
ViewProviderOriginGroupExtension::ViewProviderOriginGroupExtension()
{
initExtension(ViewProviderOriginGroupExtension::getClassTypeId());
initExtension(ViewProviderOriginGroupExtension::getExtensionClassTypeId());
}
ViewProviderOriginGroupExtension::~ViewProviderOriginGroupExtension()

View File

@ -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 () )
) ) );
}