I am actually using the GoSubGraph component to arrange my nodes.
This GoSubGraph can contains other GoSubgraphs, links, nodes, etc recursively.
When I perform the layout on a doc with several GoSubGraph containing inners GoSubGraph the operation is very slow, can you give me the best practices to improve the layout mechanism.
The goal of our application is to create conditional nodes as IF nodes (the ones display in the picture). Those nodes are composed of two branches, and several links to build the node design. The links and points used for the node design are set manually every time the layout is called. We also want to synchronise the height of the two branches. When the user adds a node in a branch the other one has to adapt it’s size, this is also made when the layout is called.
To realize the layout we have to browse recursively all the nodes to call their layout method, in order to refresh the design components.
The layout is made as following:
foreach (GoObject obj in coll)
{
GoSubGraph sg = obj as GoSubGraph;
if (sg != null)
{
if (sg.IsExpanded)
{
LayoutGraph(sg, doc);
}
}
}
GoLayoutLayeredDigraph layout = new GoLayoutLayeredDigraph();
layout.Document = doc;
layout.DirectionOption = GoLayoutDirection.Down;
layout.Network = layout.CreateNetwork();
layout.Network.AddNodesAndLinksFromCollection(coll, true);
layout.PerformLayout();
There is also code in the GoSubGraph and branches to set the position of the different design objects.
Looks like you got that Layout code out of SubGraphApp. If I construct an “equivalent” graph in the SubGraphApp sample (similar set of nodes and subgraphs), the Layout is done by the time the mouse goes up on the click to do the Layout.
So I guess I'd recommend setting some breakpoints, perhaps at the "PerformLayout()" call and see if something pops out...
We haven’t time enough to change totally our layout architecture. We have base our diagram on SwimLane sample.
We have found a little part of the reason for the slowness (expand/collapse SubGraph) : each subGraph is calling the Doc.Layout() if the SubGraph is or not expanded…!
As Bishop said, we want to create a workflow of actions, we have also a main GoBranch (starting by a GoNode “Start” and ending with a GoNode “End”), a lot of GoNodes (each containing at least a XML string) plugged on the GoBranch. But one of our “Node” can be a conditional node like IF/WHILE, therefore we use a GoSubGraph with 1 or more branches (IF = 2 branches, one for then part and the other for the “else” part)…
You don’t want to call Layout on a SubGraph that is Collapsed. Note the SubGraphApp sample has a flag (myLayoutExpandsAll) that controls whether LayoutSubGraphs should expand all the subgraphs while doing the layout.