From b9529a97adfaeb93f9404bed6108ee6b87e53dfb Mon Sep 17 00:00:00 2001 From: Peter Steneteg Date: Thu, 2 Apr 2026 09:30:13 +0200 Subject: [PATCH 1/4] DevTools: eventlogger added option to log before and after --- .../inviwo/devtools/processors/eventlogger.h | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) 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; } From cf5e514db3538878cc7bf15d03e4748c0e61ae1b Mon Sep 17 00:00:00 2001 From: Peter Steneteg Date: Fri, 8 May 2026 18:34:46 +0200 Subject: [PATCH 2/4] Various: update for core getIdentifier() string -> string_view change # Conflicts: # misc/graphviz/src/graphvizsettings.cpp # misc/vtk/src/processors/volumetovtk.cpp # tensorvis/tensorvisbase/include/inviwo/tensorvisbase/datastructures/invariantspace.h --- misc/graphviz/src/graphvizsettings.cpp | 7 +++---- .../inviwo/tensorvisbase/datastructures/invariantspace.h | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) 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/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}}); From ccf2aabe818ea082087843441fafdce1d89f33a8 Mon Sep 17 00:00:00 2001 From: Peter Steneteg Date: Thu, 13 Aug 2026 15:01:51 +0200 Subject: [PATCH 3/4] VTK: port update to core changes --- misc/vtk/include/inviwo/vtk/ports/vtkinport.h | 8 ++++ misc/vtk/src/ports/vtkinport.cpp | 42 +++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) 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..e23da1dc6 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; } @@ -154,7 +188,7 @@ 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); }); + util::copy_if(outports_, [&](auto port) { return !canConnectTo(port); }); for (auto outport : portsToRemove) { getProcessor()->getNetwork()->removeConnection(outport, this); } From 2e4c713cb5cd5e4bca0a54e88191129913707044 Mon Sep 17 00:00:00 2001 From: Peter Steneteg Date: Thu, 13 Aug 2026 15:59:08 +0200 Subject: [PATCH 4/4] VTK: port update to core changes --- misc/vtk/src/ports/vtkinport.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/vtk/src/ports/vtkinport.cpp b/misc/vtk/src/ports/vtkinport.cpp index e23da1dc6..1b85019ed 100644 --- a/misc/vtk/src/ports/vtkinport.cpp +++ b/misc/vtk/src/ports/vtkinport.cpp @@ -187,7 +187,7 @@ int VtkInport::getTypeId() const { return typeId_; } void VtkInport::setTypeId(int typeId) { typeId_ = typeId; - std::vector portsToRemove = + std::vector portsToRemove = util::copy_if(outports_, [&](auto port) { return !canConnectTo(port); }); for (auto outport : portsToRemove) { getProcessor()->getNetwork()->removeConnection(outport, this);