Skip to content

Commit

Permalink
Extensions: bring files in correct order
Browse files Browse the repository at this point in the history
  • Loading branch information
ickby authored and wwmayer committed Oct 8, 2016
1 parent a8d0acc commit c47c34e
Show file tree
Hide file tree
Showing 21 changed files with 576 additions and 274 deletions.
4 changes: 2 additions & 2 deletions src/App/Application.cpp
Expand Up @@ -98,8 +98,8 @@
#include "Annotation.h"
#include "MeasureDistance.h"
#include "Placement.h"
#include "GeoFeatureGroup.h"
#include "OriginGroup.h"
#include "GeoFeatureGroupExtension.h"
#include "OriginGroupExtension.h"
#include "Part.h"
#include "OriginFeature.h"
#include "Origin.h"
Expand Down
22 changes: 12 additions & 10 deletions src/App/CMakeLists.txt
Expand Up @@ -59,8 +59,8 @@ generate_from_xml(DocumentObjectExtensionPy)
generate_from_xml(GroupExtensionPy)
generate_from_xml(DocumentObjectGroupPy)
generate_from_xml(GeoFeaturePy)
#generate_from_xml(GeoFeatureGroupPy)
#generate_from_xml(OriginGroupPy)
generate_from_xml(GeoFeatureGroupExtensionPy)
generate_from_xml(OriginGroupExtensionPy)
generate_from_xml(PartPy)

generate_from_xml(ComplexGeoDataPy)
Expand All @@ -78,8 +78,8 @@ SET(FreeCADApp_XML_SRCS
DocumentObjectGroupPy.xml
DocumentObjectPy.xml
GeoFeaturePy.xml
# GeoFeatureGroupPy.xml
# OriginGroupPy.xml
GeoFeatureGroupExtensionPy.xml
OriginGroupExtensionPy.xml
PartPy.xml
DocumentPy.xml
PropertyContainerPy.xml
Expand All @@ -98,6 +98,7 @@ SET(Document_CPP_SRCS
DocumentObjectExtension.cpp
DocumentObjectExtensionPyImp.cpp
ExtensionContainerPyImp.cpp
GroupExtension.cpp
GroupExtensionPyImp.cpp
DocumentObjectFileIncluded.cpp
DocumentObjectGroup.cpp
Expand All @@ -111,10 +112,10 @@ SET(Document_CPP_SRCS
FeaturePython.cpp
FeatureTest.cpp
GeoFeature.cpp
# GeoFeatureGroupPyImp.cpp
GeoFeatureGroup.cpp
# OriginGroupPyImp.cpp
OriginGroup.cpp
GeoFeatureGroupExtensionPyImp.cpp
GeoFeatureGroupExtension.cpp
OriginGroupExtensionPyImp.cpp
OriginGroupExtension.cpp
PartPyImp.cpp
Part.cpp
Origin.cpp
Expand All @@ -136,6 +137,7 @@ SET(Document_HPP_SRCS
Document.h
DocumentObject.h
Extension.h
GroupExtension.h
DocumentObjectExtension.h
DocumentObjectFileIncluded.h
DocumentObjectGroup.h
Expand All @@ -149,8 +151,8 @@ SET(Document_HPP_SRCS
FeaturePythonPyImp.inl
FeatureTest.h
GeoFeature.h
GeoFeatureGroup.h
OriginGroup.h
GeoFeatureGroupExtension.h
OriginGroupExtension.h
Part.h
Origin.h
Path.h
Expand Down
159 changes: 0 additions & 159 deletions src/App/DocumentObjectGroup.cpp
Expand Up @@ -28,169 +28,11 @@

#include "DocumentObjectGroup.h"
#include "DocumentObjectGroupPy.h"
#include "GroupExtensionPy.h"
#include "Document.h"
#include "FeaturePythonPyImp.h"

using namespace App;

PROPERTY_SOURCE(App::GroupExtension, App::DocumentObjectExtension)

GroupExtension::GroupExtension()
{
initExtension(GroupExtension::getClassTypeId());

ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_Output),"List of referenced objects");
}

GroupExtension::~GroupExtension()
{
}

DocumentObject* GroupExtension::addObject(const char* sType, const char* pObjectName)
{
DocumentObject* obj = getExtendedObject()->getDocument()->addObject(sType, pObjectName);
if (obj) addObject(obj);
return obj;
}

void GroupExtension::addObject(DocumentObject* obj)
{
if (!hasObject(obj)) {
std::vector<DocumentObject*> grp = Group.getValues();
grp.push_back(obj);
Group.setValues(grp);
}
}

void GroupExtension::removeObject(DocumentObject* obj)
{
const std::vector<DocumentObject*> & grp = Group.getValues();
std::vector<DocumentObject*> newGrp;

std::remove_copy (grp.begin(), grp.end(), std::back_inserter (newGrp), obj);
if (grp.size() != newGrp.size()) {
Group.setValues (newGrp);
}
}

void GroupExtension::removeObjectsFromDocument()
{
const std::vector<DocumentObject*> & grp = Group.getValues();
// Use set so iterate on each linked object exactly one time (in case of multiple links to the same document)
std::set<DocumentObject*> grpSet (grp.begin(), grp.end());

for (std::set<DocumentObject*>::iterator it = grpSet.begin(); it != grpSet.end(); ++it) {
removeObjectFromDocument(*it);
}
}

void GroupExtension::removeObjectFromDocument(DocumentObject* obj)
{
// remove all children
if (obj->hasExtension(GroupExtension::getClassTypeId())) {
GroupExtension *grp = static_cast<GroupExtension*>(obj->getExtension(GroupExtension::getClassTypeId()));
// recursive call to remove all subgroups
grp->removeObjectsFromDocument();
}

getExtendedObject()->getDocument()->remObject(obj->getNameInDocument());
}

DocumentObject *GroupExtension::getObject(const char *Name) const
{
DocumentObject* obj = getExtendedObject()->getDocument()->getObject(Name);
if (obj && hasObject(obj))
return obj;
return 0;
}

bool GroupExtension::hasObject(const DocumentObject* obj, bool recursive) const
{
const std::vector<DocumentObject*>& grp = Group.getValues();
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()));
if (subGroup->hasObject (obj, recursive)) {
return true;
}
}
}

return false;
}

bool GroupExtension::isChildOf(const GroupExtension* group) const
{
const std::vector<DocumentObject*>& grp = group->Group.getValues();
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()))))
return true;
}
}

return false;
}

std::vector<DocumentObject*> GroupExtension::getObjects() const
{
return Group.getValues();
}

std::vector<DocumentObject*> GroupExtension::getObjectsOfType(const Base::Type& typeId) const
{
std::vector<DocumentObject*> type;
const std::vector<DocumentObject*>& grp = Group.getValues();
for (std::vector<DocumentObject*>::const_iterator it = grp.begin(); it != grp.end(); ++it) {
if ( (*it)->getTypeId().isDerivedFrom(typeId))
type.push_back(*it);
}

return type;
}

int GroupExtension::countObjectsOfType(const Base::Type& typeId) const
{
int type=0;
const std::vector<DocumentObject*>& grp = Group.getValues();
for (std::vector<DocumentObject*>::const_iterator it = grp.begin(); it != grp.end(); ++it) {
if ( (*it)->getTypeId().isDerivedFrom(typeId))
type++;
}

return type;
}

DocumentObject* GroupExtension::getGroupOfObject(const DocumentObject* obj)
{
const Document* doc = obj->getDocument();
std::vector<DocumentObject*> grps = doc->getObjectsOfType(GroupExtension::getClassTypeId());
for (std::vector<DocumentObject*>::const_iterator it = grps.begin(); it != grps.end(); ++it) {
GroupExtension* grp = (GroupExtension*)(*it);
if (grp->hasObject(obj))
return *it;
}

return 0;
}

PyObject* GroupExtension::getExtensionPyObject(void) {

if (ExtensionPythonObject.is(Py::_None())){
// ref counter is set to 1
auto grp = new GroupExtensionPy(this);
ExtensionPythonObject = Py::Object(grp,true);
}
return Py::new_reference_to(ExtensionPythonObject);
}



PROPERTY_SOURCE_WITH_EXTENSIONS(App::DocumentObjectGroup, App::DocumentObject, (App::GroupExtension))

DocumentObjectGroup::DocumentObjectGroup(void): DocumentObject(), GroupExtension() {
Expand All @@ -215,7 +57,6 @@ PyObject *DocumentObjectGroup::getPyObject()
// Python feature ---------------------------------------------------------

namespace App {
PROPERTY_SOURCE_TEMPLATE(App::GroupExtensionPython, App::GroupExtension)

/// @cond DOXERR
PROPERTY_SOURCE_TEMPLATE(App::DocumentObjectGroupPython, App::DocumentObjectGroup)
Expand Down
70 changes: 1 addition & 69 deletions src/App/DocumentObjectGroup.h
Expand Up @@ -27,81 +27,13 @@
#include "FeaturePython.h"
#include "DocumentObject.h"
#include "PropertyLinks.h"
#include "DocumentObjectExtension.h"
#include "GroupExtension.h"
#include <vector>


namespace App
{
class DocumentObjectGroup;
class GroupExtensionPy;

class AppExport GroupExtension : public DocumentObjectExtension
{
PROPERTY_HEADER(App::GroupExtension);

public:
/// Constructor
GroupExtension(void);
virtual ~GroupExtension();

/** @name Object handling */
//@{
/** Adds an object of \a sType with \a pObjectName to the document this group belongs to and
* append it to this group as well.
*/
DocumentObject *addObject(const char* sType, const char* pObjectName);
/* Adds the object \a obj to this group.
*/
void addObject(DocumentObject* obj);
/** Removes an object from this group.
*/
void removeObject(DocumentObject* obj);
/** Removes all children objects from this group and the document.
*/
void removeObjectsFromDocument();
/** Returns the object of this group with \a Name. If the group doesn't have such an object 0 is returned.
* @note This method might return 0 even if the document this group belongs to contains an object with this name.
*/
DocumentObject *getObject(const char* Name) const;
/**
* Checks whether the object \a obj is part of this group.
* @param obj the object to check for.
* @param recursive if true check also if the obj is child of some sub group (default is false).
*/
bool hasObject(const DocumentObject* obj, bool recursive=false) const;
/**
* Checks whether this group object is a child (or sub-child)
* of the given group object.
*/
bool isChildOf(const GroupExtension*) const;
/** Returns a list of all objects this group does have.
*/
std::vector<DocumentObject*> getObjects() const;
/** Returns a list of all objects of \a typeId this group does have.
*/
std::vector<DocumentObject*> getObjectsOfType(const Base::Type& typeId) const;
/** Returns the number of objects of \a typeId this group does have.
*/
int countObjectsOfType(const Base::Type& typeId) const;
/** Returns the object group of the document which the given object \a obj is part of.
* In case this object is not part of a group 0 is returned.
*/
static DocumentObject* getGroupOfObject(const DocumentObject* obj);
//@}

virtual PyObject* getExtensionPyObject(void);

/// Properties
PropertyLinkList Group;

private:
void removeObjectFromDocument(DocumentObject*);
};

//no virtual functions to override, simple derivative is enough
typedef App::ExtensionPython<App::GroupExtension> GroupExtensionPython;

class DocumentObjectGroup : public DocumentObject, public GroupExtension {

PROPERTY_HEADER_WITH_EXTENSIONS(App::DocumentObjectGroup);
Expand Down
Expand Up @@ -29,7 +29,7 @@

#include <App/Document.h>

#include "GeoFeatureGroup.h"
#include "GeoFeatureGroupExtension.h"
//#include "GeoFeatureGroupPy.h"
//#include "FeaturePythonPyImp.h"

Expand Down
File renamed without changes.
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<GenerateModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="generateMetaModel_Module.xsd">
<PythonExport
Father="DocumentObjectGroupPy"
Name="GeoFeatureGroupPy"
Twin="GeoFeatureGroup"
TwinPointer="GeoFeatureGroup"
Include="App/GeoFeatureGroup.h"
Father="GroupExtensionPy"
Name="GeoFeatureGroupExtensionPy"
Twin="GeoFeatureGroupExtension"
TwinPointer="GeoFeatureGroupExtension"
Include="App/GeoFeatureGroupExtension.h"
Namespace="App"
FatherInclude="App/DocumentObjectGroupPy.h"
FatherNamespace="App">
FatherInclude="App/GroupExtensionPy.h"
FatherNamespace="App">
<Documentation>
<Author Licence="LGPL" Name="Werner Mayer" EMail="wmayer@users.sourceforge.net" />
<UserDocu>This class handles placeable group of document objects</UserDocu>
Expand Down

0 comments on commit c47c34e

Please sign in to comment.