diff --git a/misc/devtools/include/inviwo/devtools/processors/eventlogger.h b/misc/devtools/include/inviwo/devtools/processors/eventlogger.h index 6ce22e91e..2f5ad0e63 100644 --- a/misc/devtools/include/inviwo/devtools/processors/eventlogger.h +++ b/misc/devtools/include/inviwo/devtools/processors/eventlogger.h @@ -55,7 +55,7 @@ namespace inviwo { -template +template class EventLogger : public Processor { public: EventLogger(); @@ -63,12 +63,14 @@ class EventLogger : public Processor { virtual void process() override; virtual const ProcessorInfo& getProcessorInfo() const override; - virtual void invokeEvent(Event* event) override; + virtual void propagateEvent(Event* event, Outport* source) override; private: - Inport inport_; - Outport outport_; + InportType inport_; + OutportType outport_; BoolCompositeProperty enable_; + BoolProperty logBefore_; + BoolProperty logAfter_; ButtonGroupProperty eventToggle_; static constexpr size_t eventCount = 7; @@ -83,12 +85,14 @@ class EventLogger : public Processor { BoolProperty enableOtherEvents_; }; -template -EventLogger::EventLogger() +template +EventLogger::EventLogger() : Processor() , inport_("inport", "The inport, only used for pass through."_help) , outport_("outport") , enable_("enable", "Enable Logging", "Enable or disable logging of events."_help, true) + , logBefore_{"logBefore", "Log Before", true} + , logAfter_{"logAfter", "Log After", false} , eventToggle_("eventToggle", "Toggle Events", {{"Set All", std::nullopt, "Enable logging of all event types", [this]() { @@ -123,7 +127,7 @@ EventLogger::EventLogger() addPort(inport_); addPort(outport_); addProperty(enable_); - enable_.addProperty(eventToggle_); + enable_.addProperties(logBefore_, logAfter_, eventToggle_); for (auto& p : enableEvents_) { enable_.addProperty(p); @@ -131,26 +135,36 @@ EventLogger::EventLogger() enable_.addProperty(enableOtherEvents_); } -template -void EventLogger::process() { +template +void EventLogger::process() { outport_.setData(inport_.getData()); } -template -void EventLogger::invokeEvent(Event* event) { - if (!enable_) return; +template +void EventLogger::propagateEvent(Event* event, Outport* source) { + if (enable_ && logBefore_) { + const auto it = eventMap_.find(event->hash()); + if ((it == eventMap_.end() && enableOtherEvents_.get()) || + (it != eventMap_.end() && it->second.get())) { + log::info("{:20} {}", getDisplayName(), *event); + } + } - const auto it = eventMap_.find(event->hash()); - if ((it == eventMap_.end() && enableOtherEvents_.get()) || - (it != eventMap_.end() && it->second.get())) { - log::info("{:25} {}", getDisplayName(), *event); + Processor::propagateEvent(event, source); + + if (enable_ && logAfter_) { + const auto it = eventMap_.find(event->hash()); + if ((it == eventMap_.end() && enableOtherEvents_.get()) || + (it != eventMap_.end() && it->second.get())) { + log::info("{:20} {}", getDisplayName(), *event); + } } } -template -const ProcessorInfo& EventLogger::getProcessorInfo() const { +template +const ProcessorInfo& EventLogger::getProcessorInfo() const { static const ProcessorInfo info{ - ProcessorTraits>::getProcessorInfo()}; + ProcessorTraits>::getProcessorInfo()}; return info; } diff --git a/misc/graphviz/src/graphvizsettings.cpp b/misc/graphviz/src/graphvizsettings.cpp index 4d5e2ebe1..61f405169 100644 --- a/misc/graphviz/src/graphvizsettings.cpp +++ b/misc/graphviz/src/graphvizsettings.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -158,8 +159,7 @@ void calculateLayout(StrBuffer& buff, ProcessorNetwork* net, const Func& func) { ivec2 center{0}; int count = 0; net->forEachProcessor([&](Processor* p) { - const std::string identifier{p->getIdentifier()}; - if (auto* n = agnode(G, const_cast(identifier.c_str()), 0)) { + if (auto* n = agnode(G, const_cast(SafeCStr{p->getIdentifier()}.c_str()), 0)) { const auto& coord = ND_coord(n); center += ivec2{coord.x, -coord.y}; ++count; @@ -174,8 +174,7 @@ void calculateLayout(StrBuffer& buff, ProcessorNetwork* net, const Func& func) { const dvec2 offset = oldCenter - newCenter; net->forEachProcessor([&](Processor* p) { - const std::string identifier{p->getIdentifier()}; - if (auto* n = agnode(G, const_cast(identifier.c_str()), 0)) { + if (auto* n = agnode(G, const_cast(SafeCStr{p->getIdentifier()}.c_str()), 0)) { const auto& coord = ND_coord(n); func(p, dvec2{coord.x, -coord.y} + offset); } diff --git a/misc/vtk/include/inviwo/vtk/ports/vtkinport.h b/misc/vtk/include/inviwo/vtk/ports/vtkinport.h index 62a9c08ad..4300972a7 100644 --- a/misc/vtk/include/inviwo/vtk/ports/vtkinport.h +++ b/misc/vtk/include/inviwo/vtk/ports/vtkinport.h @@ -44,6 +44,8 @@ namespace inviwo { namespace vtk { +class VtkOutport; + class IVW_MODULE_VTK_API VtkInport : public Inport { public: enum class Repeatable : std::uint8_t { Yes, No }; @@ -59,7 +61,12 @@ class IVW_MODULE_VTK_API VtkInport : public Inport { using type = vtkDataObject; virtual bool canConnectTo(const Port* port) const override; + virtual void connectTo(Outport* outport) override; + virtual void disconnectFrom(Outport* outport) override; + + virtual Outport* getConnectedOutport(size_t i) const override; virtual size_t getMaxNumberOfConnections() const override; + virtual size_t getNumberOfConnections() const override; virtual std::string_view getClassIdentifier() const override; virtual glm::uvec3 getColorCode() const override; virtual Document getInfo() const override; @@ -71,6 +78,7 @@ class IVW_MODULE_VTK_API VtkInport : public Inport { void setTypeId(int typeId); private: + std::vector outports_; int typeId_; Repeatable repeatable_; }; diff --git a/misc/vtk/src/ports/vtkinport.cpp b/misc/vtk/src/ports/vtkinport.cpp index be0003bf7..1b85019ed 100644 --- a/misc/vtk/src/ports/vtkinport.cpp +++ b/misc/vtk/src/ports/vtkinport.cpp @@ -90,14 +90,48 @@ bool VtkInport::canConnectTo(const Port* port) const { } return false; } + +void VtkInport::connectTo(Outport* outport) { + if (!outport) return; + if (isConnectedTo(outport)) return; + + if (auto* vtkOutport = dynamic_cast(outport)) { + if (getNumberOfConnections() + 1 > getMaxNumberOfConnections()) { + throw Exception("Trying to connect to a full port."); + } + outports_.push_back(vtkOutport); + + doConnectTo(outport); + } else { + throw Exception("Trying to connect incompatible ports."); + } +} +void VtkInport::disconnectFrom(Outport* outport) { + if (auto it = std::ranges::find_if(outports_, [&](VtkOutport* p) { return p == outport; }); + it != outports_.end()) { + + outports_.erase(it); + doDisconnectFrom(outport); + } +} + +Outport* VtkInport::getConnectedOutport(size_t i) const { + if (i < outports_.size()) { + return outports_[i]; + } else { + return nullptr; + } +} + size_t VtkInport::getMaxNumberOfConnections() const { return repeatable_ == Repeatable::Yes ? std::numeric_limits::max() : 1; } +size_t VtkInport::getNumberOfConnections() const { return outports_.size(); } + vtkDataObject* VtkInport::getData(size_t i) const { - if (i < connectedOutports_.size()) { - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-static-cast-downcast) - return static_cast(connectedOutports_[i])->getData(); + if (i < outports_.size()) { + return outports_[i]->getData(); } return nullptr; } @@ -153,8 +187,8 @@ int VtkInport::getTypeId() const { return typeId_; } void VtkInport::setTypeId(int typeId) { typeId_ = typeId; - std::vector portsToRemove = - util::copy_if(connectedOutports_, [&](auto port) { return !canConnectTo(port); }); + std::vector portsToRemove = + util::copy_if(outports_, [&](auto port) { return !canConnectTo(port); }); for (auto outport : portsToRemove) { getProcessor()->getNetwork()->removeConnection(outport, this); } diff --git a/tensorvis/tensorvisbase/include/inviwo/tensorvisbase/datastructures/invariantspace.h b/tensorvis/tensorvisbase/include/inviwo/tensorvisbase/datastructures/invariantspace.h index c3e854cb7..e56f943b9 100644 --- a/tensorvis/tensorvisbase/include/inviwo/tensorvisbase/datastructures/invariantspace.h +++ b/tensorvis/tensorvisbase/include/inviwo/tensorvisbase/datastructures/invariantspace.h @@ -51,8 +51,8 @@ struct IVW_MODULE_TENSORVISBASE_API InvariantSpace { else return data_[0]->size(); } - void addAxis(const std::string& identifier, std::vector* data, TensorFeature type) { - identifiers_.push_back(identifier); + void addAxis(std::string_view identifier, std::vector* data, TensorFeature type) { + identifiers_.emplace_back(identifier); metaDataTypes_.push_back(type); auto minmax = std::minmax_element(data->begin(), data->end()); @@ -64,7 +64,7 @@ struct IVW_MODULE_TENSORVISBASE_API InvariantSpace { template void addAxis(const tensor::MetaDataType* metaData, std::string_view name = "") { - identifiers_.push_back(name.empty() ? metaData->getDisplayName() : std::string{name}); + identifiers_.emplace_back(name.empty() ? metaData->getDisplayName() : name); metaDataTypes_.push_back(metaData->type_); minmax_.push_back({{metaData->getMinMax().first, metaData->getMinMax().second}});