Commit graph

651 commits

Author SHA1 Message Date
Candice Bentéjac
5710bf3ed3
Merge pull request #2657 from alicevision/dev/valueChangedPropagation
Node: Propagate attribute change via `valueChanged` signal
2025-02-14 11:04:26 +01:00
Yann Lanthony
0594f593f2 [core][graphIO] PartialSerializer: fix List/GroupAttribute link serialization
Ensure attribute input connection is serialized, even for List/GroupAttributes.
Note: while connecting GroupAttributes is not yet supported, this will benefit
this type of attribute once it is.
2025-02-06 18:19:19 +01:00
Yann Lanthony
724e7fb387 [core] Graph: add missing GraphModification
In `initFromTemplate`, ensure that Publish nodes removal are grouped
under the same graph modification to trigger updates only once.
2025-02-06 16:46:05 +01:00
Yann Lanthony
25094ac877 [core] Handle missing link nodes when deserializing edges
Avoid uncaught errors when deserializing edges in case linked
nodes are missing.
Handle missing nodes the same way missing attributes are dealt with.
2025-02-06 16:46:05 +01:00
Yann Lanthony
87fbcee06d [core][graphIO] Improve node type version handling
* Deserialization: Replace the logic that defaulted the node type version to "0.0" when unspecified,
and assume that unspecified version on a node is targetting current node type version.
* Serialization: Only serialize node type versions for which a version info is available.

* Test suites:
  * Add helper context manager to manually override the version of a given node type.
  * Add new unit tests to cover version conflicts handling is various scenarios.
2025-02-06 16:46:05 +01:00
Yann Lanthony
d9e59e330a [core] nodeFactory: fix auto-upgrade on certain compatibilty nodes
Add missing node upgrade statement to perform auto-upgrade on
CompatibilityNode when `internalFolder` is not set.
2025-02-06 16:46:05 +01:00
Yann Lanthony
e430368f15 [core] Graph: improve internal function naming 2025-02-06 16:46:05 +01:00
Yann Lanthony
0035dc56ae [core] Minor docstrings cleanup 2025-02-06 16:46:05 +01:00
Yann Lanthony
9794f43ed1 [core] Graph: improved uid conflicts evaluation on deserialization
At the end of the deserialization process, solve node uid conflicts iteratively by node depths,
and only replace the conflicting nodes with a CompatibilityNode.

Add new test suite for testing uid conflict handling.
2025-02-06 16:46:04 +01:00
Yann Lanthony
45ef4b592d [core] Graph: add replaceNode method
Factorize the logic of replacing a node with another one and re-creating
output edges into `Graph.replaceNode`  and `Graph._restoreOutEdges`.
2025-02-06 16:46:04 +01:00
Yann Lanthony
1cf0fc95ba [core][graphIO] Add "template" as an explicit key 2025-02-06 16:46:04 +01:00
Yann Lanthony
b07dd64c11 [core] Graph: cleanup unused methods 2025-02-06 16:46:04 +01:00
Yann Lanthony
bfc642e2dc [core] Add Graph.copy method
Add a new method to create a copy of a graph instance, relying on
chaining serialization and deserialization operations.
Add test suite to validate its behavior, and the underlying serialization processes.
2025-02-06 16:46:04 +01:00
Yann Lanthony
d54ba012a0 [ui] Refactor node pasting using graph partial serialization
Re-implement node pasting by relying on the graph partial serializer,
to serialize only the subset of selected nodes.
On pasting, use standard graph deserialization and import the content
of the serialized graph in the active graph instance.

Simplify the positioning of pasted nodes to only consider mouse position
or center of the graph, which works well for the major variety of use-cases.
Compute the offset to apply to imported nodes by using the de-serialized
graph content's bounding box.
2025-02-06 16:46:04 +01:00
Yann Lanthony
f8f03b0bd5 [core] Graph: improve uid conflicts check on deserialization
Only perform uid check when we have both a serialized and a computed
UID.
If the node has not been serialized with a UID, it means that it does not
expect to match a specific value on deserialization.
2025-02-06 16:46:04 +01:00
Yann Lanthony
6b75dcb356 [core][graphIO] Introduce PartialGraphSerializer
Add a new serializer class to manage partial graph serialization logic,
ensuring to remove link expressions on attributes refering to nodes
that are not in the subset of nodes to serialize.
2025-02-06 16:46:04 +01:00
Yann Lanthony
01d67eb33d [graphIO] Introduce graph serializer classes
Move the serialization logic to dedicated serializer classes.
Implement both `GraphSerializer` and `TemplateGraphSerializer`
to cover for the existing serialization use-cases.
2025-02-06 16:46:04 +01:00
Yann Lanthony
a665200c38 [core] Introducing new graphIO module
Move Graph.IO internal class to its own module, and rename it to `GraphIO`.
This avoid nested classes within the core Graph class, and starts decoupling
the management of graph's IO from the logic of the graph itself.
2025-02-06 16:46:04 +01:00
Yann Lanthony
3064cb9b35 [core] CompatibilityNode: do not use link expressions as default values for unknown File attributes
When creating a compatibility description for an unknown attribute, do not
consider a link expression as the default value for a File attribute.
This is breaking how the link expression solving system works, as it's resetting
the attribute to its default value after applying the link.
If that expression is kept as the default value, it can be re-evaluated several
times incorrectly.
Added a test case that was failing before that change to illustrate the issue.
2025-02-06 16:46:04 +01:00
Yann Lanthony
4aec741a89 [core] Graph: add importGraphContent API
Extract the logic of importing the content of a graph within a graph instance from
the graph loading logic.
Add `Graph.importGraphContent` and `Graph.importGraphContentFromFile`
methods.
Use the deserialization API to load the content in another temporary graph instance,
to handle the renaming of nodes using the Graph API, rather than manipulating
entries in a raw dictionnary.
2025-02-06 16:46:04 +01:00
Yann Lanthony
7eab289d30 [core] Graph: initial refactoring of graph loading API and logic
* API
Instead of having a single `load` function that exposes in its API
some elements only applicable to initializing a graph from a templates,
split it into 2 distinct functions: `load` and `initFromTemplate`.
Apply those changes to users of the API (UI, CLI), and simplify Graph
wrapper classes to better align with those concepts.

* Deserialization
Reduce the cognitive complexity of the deserizalization process
by splitting it into more atomic functions, while maintaining the
current behavior.
2025-02-06 16:46:04 +01:00
Yann Lanthony
c883c53397 [core] Refactor nodeFactory function
Rewrite `nodeFactory` to reduce cognitive complexity,
while preserving the current behavior.
2025-02-06 16:46:04 +01:00
Yann Lanthony
025e0e3322 [core] Move nodeFactory to its own module 2025-02-06 16:46:04 +01:00
Yann Lanthony
37a813e08a [core] Propagate Attribute.valueChanged to the owning Node through a Slot
Connecting the valueChanged signal to a lambda causes performance
issues with a large number of attributes when using the Pyside backend.
Connecting that signal to an intermediate Slot part of the Attribute class
improves performance dramatically.
Note: This has no comparable impact on the standalone backend.
2025-02-05 11:54:49 +01:00
Yann Lanthony
1aea45efa3 [core] Node: Propagate attribute change via valueChanged signal
Propagate attribute value changes downstream using `valueChanged` signal
emission, instead of calling `_onAttributeChanged` directly.
This does not change the current core behavior, but it triggers the
property notification signal when in UI mode.
This makes changes happening upstream properly reflected in downstream nodes.
2025-01-21 18:55:59 +01:00
waaake
3f47c54595 [ui] Application: Changing the current project refreshes the NodeEditor to reset the current Tab index 2024-12-31 09:56:48 +05:30
waaake
535f2f06b3 [core] Graph: Introduced 'isSaving' flag
The 'isSaving' flag is a way to identify if the project is currently being saved and serves as a way to correctly distinguish whether the current filepath change is due to a save or a new scene or a load operation
2024-12-30 10:25:56 +05:30
Yann Lanthony
a0398c45c0
[core] Graph: fix Graph.load missing return value
Add missing return statement for the load function, used by the UI to determine whether the load was successful.
2024-12-11 14:10:43 +01:00
Fabien Castan
b5dda4efd0
Merge pull request #2592 from alicevision/dev/splitDescModule
Split `meshroom.core.desc` module into a package with submodules
2024-11-23 12:39:33 +00:00
Fabien Castan
66e3dd409d
Merge pull request #2599 from alicevision/dev/qt6.6
Qt6.6.3 / PySide6.6.3.1 upgrade
2024-11-22 12:39:09 +00:00
Yann Lanthony
b0808f9040
[core] Fix errorneous docstring
Co-authored-by: Vivek <vivek_ve@outlook.com>
2024-11-18 10:07:02 +01:00
Yann Lanthony
61d35904ba [core] Discard attribute callbacks during graph loading 2024-11-14 19:11:08 +01:00
Yann Lanthony
c09a0d2327 [core] Add 'strictCompatibility' mode for loadGraph function
Provide a way to control how to handle node compatibility issues
when loading a Graph with the `strictCompatibility` parameter.
Introduce a new error type, GraphCompatibilityError, to be raised
when loading a Graph with compatibility issues with strictCompatibility enabled.
2024-11-14 19:11:08 +01:00
Candice Bentéjac
fb5a882074 [qt6][core] Don't store SignalInstance in dict for node computations
When converting the `StatusData` to a dictionary, only data attributes
should be stored in said dictionary. With Qt6, the `objectNameChanged`
signal, of type `SignalInstance`, is added to the dictionary. It needs
to be removed manually as it is not JSON-serializable. Otherwise,
the nodes cannot be computed anymore.
2024-11-07 18:13:19 +01:00
Yann Lanthony
c36cf99f77 Merge branches 'dev/split/descAttribute', 'dev/split/descNode', 'dev/split/descComputation' and 'dev/split/descModule' into dev/split/coreDescModule 2024-10-30 18:46:50 +01:00
Yann Lanthony
631fd423e0 [core] Update desc module 2024-10-30 18:46:29 +01:00
Yann Lanthony
fbba37e510 [core] Split desc module 2024-10-30 18:43:38 +01:00
Yann Lanthony
0df531c467 [core] Update desc.computation 2024-10-30 18:42:50 +01:00
Yann Lanthony
a973974373 [core] Split desc.computation 2024-10-30 18:42:20 +01:00
Yann Lanthony
82e6f65ea7 [core] Update desc.node 2024-10-30 18:41:43 +01:00
Yann Lanthony
4055d25e72 [core] Split desc.node 2024-10-30 18:41:11 +01:00
Yann Lanthony
d5c151c7db [core] Update desc.attribute 2024-10-30 18:39:31 +01:00
Yann Lanthony
027fc2cb27 [core] Split desc.attribute 2024-10-30 18:38:58 +01:00
Yann Lanthony
4686b0d85a [core] Attribute: remove emitSignals logic on value setting
With valueChanged signal being connected outside of the
Attribute's constructor, the emitSignals logic is not required to prevent
early valueChanged propagation.
2024-10-28 12:25:15 +01:00
Yann Lanthony
8e3b9873d9 [core] Clean-up unused code 2024-10-28 12:19:04 +01:00
Yann Lanthony
ae9ae9b11f [core] Fix connection between uncomputed output and attribute with callback 2024-10-26 23:40:21 +02:00
Yann Lanthony
0231fdc1df [core] Discard nested attribute for valueChange callback lookup 2024-10-26 23:36:26 +02:00
Yann Lanthony
7fdb5cc734 [core] Handle attribute valueChanged callback at the Node level
Move the attributeChanged callback logic within Node, as this
is a Node level mecanism (callbacks being declared on the node desc).

This commit also moves the attribute valueChanged signal outside of
the Attribute's constructor.
This seems to be the root cause to undesired side-effects breaking Qt's evaluation
system, data model access and consequently Meshroom's UI.
2024-10-26 23:35:15 +02:00
Candice Bentéjac
ff8c063597 [core] Node: Do not automatically upgrade unknown nodes in templates 2024-10-04 18:56:34 +02:00
Candice Bentéjac
04b36781d9 [core] Check folder is valid before loading templates from it 2024-09-27 11:23:44 +02:00