private void deleteInvisibleNodes(GoLayoutForceDirectedNetwork net) { IList <GoLayoutForceDirectedNode> invisibleNodes = new List <GoLayoutForceDirectedNode>(); foreach (GoLayoutForceDirectedNode netNode in net.Nodes) { if (netNode.GoObject == null || !netNode.GoObject.Visible) { invisibleNodes.Add(netNode); } } foreach (var node in invisibleNodes) { net.DeleteNode(node); } IList <GoLayoutForceDirectedLink> invisibleLinks = new List <GoLayoutForceDirectedLink>(); foreach (GoLayoutForceDirectedLink netLink in net.Links) { if (netLink.GoObject == null || !netLink.GoObject.Visible) { invisibleLinks.Add(netLink); } } foreach (var Link in invisibleLinks) { net.DeleteLink(Link); } }
private void insertExternalNeighborLinks(IContainerNode parentContainerNode, GoLayoutForceDirectedNetwork net) { foreach (var childContainerNode in parentContainerNode.GetDirectChildren <IContainerNode>()) { foreach (var neighborhoodNode in childContainerNode.GetLinkedNodes <INeighborhoodNode>()) { if (!parentContainerNode.ContainsChildNode(neighborhoodNode, true)) { var otherContainerNode = neighborhoodNode.GetOtherContainerNode(childContainerNode); var nodeOnBoundary = new GoLayoutForceDirectedNode(); var pos = neighborhoodNode.Location; bool pointExists = GoObject.GetNearestIntersectionPoint(parentContainerNode.Bounds, otherContainerNode.Center, childContainerNode.Center, out pos); if (!pointExists) { continue; } //to be not deleted due to invisible node, seems to set also the position nodeOnBoundary.GoObject = neighborhoodNode as GoObject; nodeOnBoundary.IsFixed = true; nodeOnBoundary.UserFlags = NodeLayoutType.REMOTE_CONTAINER_BOUNDARY_NODE; //set Position after setting GoObject, because setting GoObject seems to set position nodeOnBoundary.Position = pos; net.AddNode(nodeOnBoundary); net.LinkNodes(net.FindNode(childContainerNode as GoObject), nodeOnBoundary, neighborhoodNode as GoObject); } } } }
private void PrintLinks(string prefix, GoLayoutForceDirectedNetwork net) { string text = ""; foreach (var netLink in net.Links) { text += NodeText(netLink.FromNode) + "-" + NodeText(netLink.ToNode) + "; "; } Console.WriteLine(prefix + " " + text + "\n"); }
private void PrintNodes(string prefix, GoLayoutForceDirectedNetwork net) { string text = ""; foreach (var netNode in net.Nodes) { text += NodeText(netNode) + NodePosition(netNode) + "; "; } Console.WriteLine(prefix + " " + text + "\n"); }
private void setNodeType(GoLayoutForceDirectedNetwork net, IList <IHasLayoutInfo> freeNodes) { foreach (GoLayoutForceDirectedNode netNode in net.Nodes) { IHasLayoutInfo hasLayoutInfo = netNode.GoObject as IHasLayoutInfo; if (hasLayoutInfo != null && netNode.UserFlags == 0) { netNode.IsFixed = hasLayoutInfo.LocationFixed || hasLayoutInfo.IsAnImplementationOf <PortNode>() || (freeNodes != null && !freeNodes.Contains(hasLayoutInfo)); netNode.UserFlags = hasLayoutInfo.UserFlags; // position linkless nodes by gravitational force (fix positioning seems not so easy because of moving bounds) if (netNode.LinksCount == 0) { netNode.UserFlags = NodeLayoutType.LINKLESS_NODE; //try to position linkless nodes by grav force, } } } }
private void replaceInnerNeighborhoodNodesByDirectLinks(IContainerBase containerBase, GoLayoutForceDirectedNetwork net) { // replace neighborhood nodes and neighbor links by direct links between the nodes they connect (ContainerNodes or PortNodes) foreach (var neighborHoodNode in containerBase.GetDirectChildren <INeighborhoodNode>()) { var fromLink = net.FindLink(neighborHoodNode.FirstNeighborLink as GoObject); var toLink = net.FindLink(neighborHoodNode.SecondNeighborLink as GoObject); if (fromLink == null || toLink == null) { continue; } var netLink = new GoLayoutForceDirectedLink { FromNode = fromLink.ToNode, ToNode = toLink.ToNode }; netLink.GoObject = neighborHoodNode as GoObject; netLink.Length = Config.BaseSpringLength * Config.RelativeSpringLengthOf[NodeLayoutType.CONTAINER_NODE, NodeLayoutType.CONTAINER_NODE].Value; netLink.Stiffness = Config.BaseSpringLength * Config.RelativeSpringStiffnessOf[NodeLayoutType.CONTAINER_NODE, NodeLayoutType.CONTAINER_NODE].Value; net.DeleteNode(neighborHoodNode as GoObject); net.AddLink(netLink); } }