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:
parent
a79b48bbcc
commit
3a51404dd5
|
@ -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!
|
||||
|
|
|
@ -37,7 +37,7 @@ EXTENSION_PROPERTY_SOURCE(App::DocumentObjectExtension, App::Extension)
|
|||
|
||||
DocumentObjectExtension::DocumentObjectExtension()
|
||||
{
|
||||
initExtension(App::DocumentObjectExtension::getClassTypeId());
|
||||
initExtension(App::DocumentObjectExtension::getExtensionClassTypeId());
|
||||
}
|
||||
|
||||
DocumentObjectExtension::~DocumentObjectExtension()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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 ) {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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 ) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderExtension, App::Extension)
|
|||
|
||||
ViewProviderExtension::ViewProviderExtension()
|
||||
{
|
||||
initExtension(Gui::ViewProviderExtension::getClassTypeId());
|
||||
initExtension(Gui::ViewProviderExtension::getExtensionClassTypeId());
|
||||
}
|
||||
|
||||
ViewProviderExtension::~ViewProviderExtension()
|
||||
|
|
|
@ -38,7 +38,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderGeoFeatureGroupExtension, Gui::ViewPr
|
|||
|
||||
ViewProviderGeoFeatureGroupExtension::ViewProviderGeoFeatureGroupExtension()
|
||||
{
|
||||
initExtension(ViewProviderGeoFeatureGroupExtension::getClassTypeId());
|
||||
initExtension(ViewProviderGeoFeatureGroupExtension::getExtensionClassTypeId());
|
||||
|
||||
pcGroupChildren = new SoGroup();
|
||||
pcGroupChildren->ref();
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ EXTENSION_PROPERTY_SOURCE(Gui::ViewProviderOriginGroupExtension, Gui::ViewProvid
|
|||
|
||||
ViewProviderOriginGroupExtension::ViewProviderOriginGroupExtension()
|
||||
{
|
||||
initExtension(ViewProviderOriginGroupExtension::getClassTypeId());
|
||||
initExtension(ViewProviderOriginGroupExtension::getExtensionClassTypeId());
|
||||
}
|
||||
|
||||
ViewProviderOriginGroupExtension::~ViewProviderOriginGroupExtension()
|
||||
|
|
|
@ -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 () )
|
||||
) ) );
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user