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);
            }
        }
        protected override float SpringLength(GoLayoutForceDirectedLink pLink)
        {
            GoLayoutForceDirectedNode pFromNode = pLink.FromNode;
            int fromGroup = pFromNode.UserFlags;
            GoLayoutForceDirectedNode pToNode = pLink.ToNode;
            int toGroup = pToNode.UserFlags;

            if (fromGroup >= 0 && fromGroup < NUMBER_OF_GROUPS && toGroup >= 0 && toGroup < NUMBER_OF_GROUPS &&
                Config.RelativeSpringLengthOf[fromGroup, toGroup].HasValue)
            {
                float length         = Config.BaseSpringLength * Config.RelativeSpringLengthOf[fromGroup, toGroup].Value;
                float fromSizefactor = pFromNode.Width / 150F * pFromNode.Height / 50F;
                float toSizefactor   = pToNode.Width / 150F * pToNode.Height / 50F;
                float sizefactor     = (float)(Math.Sqrt(fromSizefactor + toSizefactor));
                if (sizefactor > 40)
                {
                    sizefactor = 40F;
                }

                return(length * sizefactor);
            }
            return(Config.BaseSpringLength);
        }