Commit 49f29e8a authored by schultezub's avatar schultezub
Browse files

added sharing concept to properties

git-svn-id: https://camplinux.in.tum.de/svn/campvis/trunk@176 bb408c1c-ae56-11e1-83d9-df6b3e0c105e
parent b5ccf9de
...@@ -14,11 +14,11 @@ namespace TUMVis { ...@@ -14,11 +14,11 @@ namespace TUMVis {
} }
void AbstractProcessor::addDataHandle(const std::string& name, const DataHandle* dh) { void AbstractProcessor::addDataHandle(const std::string& name, const DataHandle* dh) {
_data.addDataHandle(name, dh); _dataContainer.addDataHandle(name, dh);
} }
const DataContainer& AbstractProcessor::getDataContainer() const { const DataContainer& AbstractProcessor::getDataContainer() const {
return _data; return _dataContainer;
} }
const InvalidationLevel& AbstractProcessor::getInvalidationLevel() const { const InvalidationLevel& AbstractProcessor::getInvalidationLevel() const {
......
...@@ -66,7 +66,7 @@ namespace TUMVis { ...@@ -66,7 +66,7 @@ namespace TUMVis {
/** /**
* Returns the local DataContainer of this Processor. * Returns the local DataContainer of this Processor.
* \returns Processor::_data * \return _dataContainer
**/ **/
const DataContainer& getDataContainer() const; const DataContainer& getDataContainer() const;
...@@ -100,7 +100,7 @@ namespace TUMVis { ...@@ -100,7 +100,7 @@ namespace TUMVis {
protected: protected:
DataContainer _data; ///< DataContainer containing local working set of data for this Processor DataContainer _dataContainer; ///< DataContainer containing local working set of data for this Processor
InvalidationLevel _invalidationLevel; ///< current invalidation level of this processor InvalidationLevel _invalidationLevel; ///< current invalidation level of this processor
PropertyCollection _properties; ///< PropertyCollection of this processor PropertyCollection _properties; ///< PropertyCollection of this processor
......
...@@ -29,4 +29,18 @@ namespace TUMVis { ...@@ -29,4 +29,18 @@ namespace TUMVis {
void AbstractProperty::setInvalidationLevel(const InvalidationLevel& il) { void AbstractProperty::setInvalidationLevel(const InvalidationLevel& il) {
_invalidationLevel = il; _invalidationLevel = il;
} }
void AbstractProperty::addSharedProperty(AbstractProperty* prop) {
tgtAssert(prop != 0, "Shared property must not be 0!");
_sharedProperties.insert(prop);
}
void AbstractProperty::removeSharedProperty(AbstractProperty* prop) {
tgtAssert(prop != 0, "Shared property must not be 0!");
_sharedProperties.erase(prop);
}
const std::set<AbstractProperty*>& AbstractProperty::getSharedProperties() const {
return _sharedProperties;
}
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "core/tools/invalidationlevel.h" #include "core/tools/invalidationlevel.h"
#include "core/tools/observer.h" #include "core/tools/observer.h"
#include <set>
#include <string> #include <string>
#include <vector> #include <vector>
...@@ -77,12 +78,43 @@ namespace TUMVis { ...@@ -77,12 +78,43 @@ namespace TUMVis {
void setInvalidationLevel(const InvalidationLevel& il); void setInvalidationLevel(const InvalidationLevel& il);
/**
* Adds the given property \a prop to the set of shared properties.
* All shared properties will be changed when this property changes.
* Overload in subclasses to make sure that shared properties are of the same type.
* \note Make sure not to build circular sharing or you will encounter endless loops!
* \param prop Property to add.
*/
virtual void addSharedProperty(AbstractProperty* prop);
/**
* Removes the given property \a prop from the set of shared properties.
* \param prop Property to remove.
*/
void removeSharedProperty(AbstractProperty* prop);
/**
* Returns the list of shared properties, which will be changed when this property changes.
* \note Property sharing only works in one direction, i.e. shared properties act as child properties.
* Make sure not to build circular sharing structures or you will encounter endless loops.
* \return _sharedProperties
*/
const std::set<AbstractProperty*>& getSharedProperties() const;
protected: protected:
// DO NOT REMOVE THE CONSTNESS OF _name. PropertyCollection relies on it! // DO NOT REMOVE THE CONSTNESS OF _name. PropertyCollection relies on it!
const std::string _name; ///< Property name (unchangable on purpose!) const std::string _name; ///< Property name (unchangable on purpose!)
std::string _title; ///< Property title (e.g. used for GUI) std::string _title; ///< Property title (e.g. used for GUI)
InvalidationLevel _invalidationLevel; ///< Invalidation level that this property triggers InvalidationLevel _invalidationLevel; ///< Invalidation level that this property triggers
/**
* List of shared properties that will be changed when this property changes.
* \note Property sharing only works in one direction, i.e. shared properties act as child properties.
* Make sure not to build circular sharing structures or you will encounter endless loops.
*/
std::set<AbstractProperty*> _sharedProperties;
static const std::string loggerCat_; static const std::string loggerCat_;
}; };
......
...@@ -34,6 +34,14 @@ namespace TUMVis { ...@@ -34,6 +34,14 @@ namespace TUMVis {
virtual ~GenericProperty(); virtual ~GenericProperty();
/**
* Adds the given property \a prop to the set of shared properties.
* All shared properties will be changed when this property changes.
* \note Make sure not to build circular sharing or you will encounter endless loops!
* \param prop Property to add, must be of the same type as this property.
*/
virtual void addSharedProperty(AbstractProperty* prop);
/** /**
* Returns the current value of this property. * Returns the current value of this property.
* \return _value * \return _value
...@@ -49,6 +57,7 @@ namespace TUMVis { ...@@ -49,6 +57,7 @@ namespace TUMVis {
protected: protected:
T _value; ///< value of the property T _value; ///< value of the property
static const std::string loggerCat_; static const std::string loggerCat_;
}; };
...@@ -66,6 +75,17 @@ namespace TUMVis { ...@@ -66,6 +75,17 @@ namespace TUMVis {
} }
template<typename T>
void TUMVis::GenericProperty<T>::addSharedProperty(AbstractProperty* prop) {
// make type check first, then call base method.
tgtAssert(prop != 0, "Shared property must not be 0!");
if (dynamic_cast< GenericProperty<T>* >(prop) == 0) {
tgtAssert(false, "Shared property must be of the same type as this property!");
return;
}
AbstractProperty::addSharedProperty(prop);
}
template<typename T> template<typename T>
const T TUMVis::GenericProperty<T>::getValue() const { const T TUMVis::GenericProperty<T>::getValue() const {
return _value; return _value;
...@@ -74,6 +94,14 @@ namespace TUMVis { ...@@ -74,6 +94,14 @@ namespace TUMVis {
template<typename T> template<typename T>
void TUMVis::GenericProperty<T>::setValue(const T& value) { void TUMVis::GenericProperty<T>::setValue(const T& value) {
_value = value; _value = value;
// TODO: think about the correct/reasonable order of observer notification
// thread-safety might play a role thereby...
for (std::set<AbstractProperty*>::iterator it = _sharedProperties.begin(); it != _sharedProperties.end(); ++it) {
// We ensure all shared properties to be of type GenericProperty<T> in the addSharedProperty overload.
// Hence, static_cast ist safe.
GenericProperty<T>* child = static_cast< GenericProperty<T>* >(*it);
child->setValue(value);
}
notifyObservers(PropertyObserverArgs(this, _invalidationLevel)); notifyObservers(PropertyObserverArgs(this, _invalidationLevel));
} }
......
...@@ -15,8 +15,9 @@ namespace TUMVis { ...@@ -15,8 +15,9 @@ namespace TUMVis {
MhdImageReader::MhdImageReader() MhdImageReader::MhdImageReader()
: AbstractProcessor() : AbstractProcessor()
, _url("url", "Image URL", "")
{ {
_properties.addProperty(&_url);
} }
MhdImageReader::~MhdImageReader() { MhdImageReader::~MhdImageReader() {
...@@ -24,7 +25,7 @@ namespace TUMVis { ...@@ -24,7 +25,7 @@ namespace TUMVis {
} }
void MhdImageReader::process() { void MhdImageReader::process() {
TextFileParser tfp(_url, true, "="); TextFileParser tfp(_url.getValue(), true, "=");
tfp.parse<TextFileParser::ItemSeparatorLines>(); tfp.parse<TextFileParser::ItemSeparatorLines>();
std::string url; std::string url;
...@@ -92,11 +93,11 @@ namespace TUMVis { ...@@ -92,11 +93,11 @@ namespace TUMVis {
// get raw image location: // get raw image location:
url = tfp.getString("ElementDataFile"); url = tfp.getString("ElementDataFile");
if (url == "LOCAL") { if (url == "LOCAL") {
url = _url; url = _url.getValue();
// find beginning of local data: // find beginning of local data:
tgt::File* file = FileSys.open(_url); tgt::File* file = FileSys.open(_url.getValue());
if (!file || !file->isOpen()) if (!file || !file->isOpen())
throw tgt::FileException("Could not open file " + _url + " for reading.", _url); throw tgt::FileException("Could not open file " + _url.getValue() + " for reading.", _url.getValue());
while (!file->eof()) { while (!file->eof()) {
std::string line = StringUtils::trim(file->getLine()); std::string line = StringUtils::trim(file->getLine());
...@@ -115,7 +116,7 @@ namespace TUMVis { ...@@ -115,7 +116,7 @@ namespace TUMVis {
// all parsing done - lets create the image: // all parsing done - lets create the image:
ImageDataDisk* image = new ImageDataDisk(url, dimensionality, size, pt, offset, e); ImageDataDisk* image = new ImageDataDisk(url, dimensionality, size, pt, offset, e);
_data.addData("output.image.read", image); _dataContainer.addData("output.image.read", image);
} }
catch (tgt::Exception& e) { catch (tgt::Exception& e) {
LERROR("Error while parsing MHD header: " << e.what()); LERROR("Error while parsing MHD header: " << e.what());
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <string> #include <string>
#include "core/pipeline/abstractprocessor.h" #include "core/pipeline/abstractprocessor.h"
#include "core/properties/genericproperty.h"
namespace TUMVis { namespace TUMVis {
/** /**
...@@ -30,7 +31,7 @@ namespace TUMVis { ...@@ -30,7 +31,7 @@ namespace TUMVis {
void parseHeader(); void parseHeader();
// TODO make this a property as soon as the property system exists // TODO make this a property as soon as the property system exists
std::string _url; GenericProperty<std::string> _url;
static const std::string loggerCat_; static const std::string loggerCat_;
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment