Reuse the location of a node when calling diagram.rebuildParts()?

Problem:

I have a select box and on change I get the selected option value, which contains a comma-separated string of node keys that should be visible (nodeKeysAreVisible=’key1;key2;key5…’)

           $("#cbTailoringGroups").change(
                function (event) {
                    nodeKeysAreVisible=$("#cbTailoringGroups").val();
                    diagram.requestUpdate();
                    diagram.rebuildParts();
                    //event.preventDefault();
                }
            );

The nodes (see JSON below) have a x-location and are grouped vertically (see screenshots):

The JSON looks like this:

  {
    "group": "Configuration Management",
    "loc": "3342 0",
    "phaseName": "Design Phase (PCP)",
    "key": "CM-SOP-16",
    "processStep": "System\/Component Review configuration set created"
  },

My Approach:

For this purpose I set the opacity value to 1 in the node-template (see below) when the key is appears in the string, otherwise to zero:

           // the node template describes how each Node should be constructed
            diagram.nodeTemplate =
              make(go.Node, "Auto",  // the Shape automatically fits around the TextBlock
                  new go.Binding("opacity", "",
                    function (data) {
                        
                        if (data.processStep === 'entfernen')
                        {
                            return 0;
                        }
                        else if ($("#cbTailoringGroups option:selected").text() == 'all')
                        {
                            return 1;
                        }
                        else if (nodeKeysAreVisible!==''&&nodeKeysAreVisible.indexOf(data.key)>-1)
                        {
                            return 1;
                        }
                        else 
                        {
                            return 0;
                        }

                        return 1;
                    }
                  ),
                new go.Binding("location", "loc", go.Point.parse),
                make(go.Shape, "RoundedRectangle",  // use this kind of figure for the Shape
                  // bind Shape.fill to Node.data.color
                  {fill: 'white'}),
                make(go.TextBlock,
                  { margin: 3, height: 80, textAlign: "center", font: "10pt Arial" },  // some room around the text
                  // bind TextBlock.text to Node.data.key
                  new go.Binding("width", "",
                    function (data)
                    {
                        return (data.processStep==='entfernen') ? 0 : 100;
                    }
                  ),
                  new go.Binding("text", "",
                    function (data)
                    { 
                        return (data.processStep) ? data.processStep : data.key;
                    }
                ))
              );

Problem with the approach:

The location binding is get lost when I change the option box and call diagram.rebuildParts().
All nodes are moving together after the select-box-change.
On diagram initialization is used isInitial=false – I saw there is s.th. like isOngoing=false but I do not know where to call it to prevent that the x-positions are destroyed?

Question:

How can I force that the nodes are still using their location “loc” from the JSON after calling “rebuildParts”?

Screenshots The problem with my approach:

This is before selecting the combobox:

This is after i have selected the combobox - all nodes have lost their x-coordinate:

Instead of calling rebuildParts, why not just call Diagram | GoJS API ?

This is exactly i was searching for walther! Thank you!

Question for the next step for this diagram

The next step of this diagram should be, that a “mouse hover” on a node will show a connection from the hovered node to another node. The connection should be an arrow with a description text on it in the middle. Is that possible with this approach? I want to store the connection-information in the linkDataArray with the description-text.

This sounds like a different question that deserves its own forum topic and screenshots.

Friend Wheel might be doing something similiar to what you want, with some obvious differences.