public override bool GetBool(object dataHolder) { if (dataHolder is INodeLabelLayout) { var node = layoutGraph.GetOwner((INodeLabelLayout)dataHolder); if (layoutGraph is CopiedLayoutGraph) { bool[] selectedLabels = selectedLabelsAtItemProvider.Get(node) as bool[]; if (selectedLabels != null) { var nodeLabelLayouts = layoutGraph.GetLabelLayout(node); for (int i = 0; i < nodeLabelLayouts.Length; i++) { var nodeLabelLayout = nodeLabelLayouts[i]; if (nodeLabelLayout == dataHolder && selectedLabels.Length > i) { return(selectedLabels[i]); } } } } } else if (dataHolder is IEdgeLabelLayout) { var edge = layoutGraph.GetOwner((IEdgeLabelLayout)dataHolder); if (layoutGraph is CopiedLayoutGraph) { bool[] selectedLabels = selectedLabelsAtItemProvider.Get(edge) as bool[]; if (selectedLabels != null) { var edgeLabelLayouts = layoutGraph.GetLabelLayout(edge); for (int i = 0; i < edgeLabelLayouts.Length; i++) { var edgeLabelLayout = edgeLabelLayouts[i]; if (edgeLabelLayout == dataHolder && selectedLabels.Length > i) { return(selectedLabels[i]); } } } } } return(false); }
/// <inheritdoc/> public virtual double GetProfit(LabelCandidate candidate) { if (candidate.Owner is IEdgeLabelLayout) { return(1); } double profit = 0; INodeLabelLayout nl = (INodeLabelLayout)candidate.Owner; var node = graph.GetOwner(nl); var nodeLayout = graph.GetLayout(node); var candidateLayout = candidate.BoundingBox; var isLeft = candidateLayout.X + candidateLayout.Width / 2 < nodeLayout.X; var isRight = candidateLayout.X + candidateLayout.Width / 2 > (nodeLayout.X + nodeLayout.Width); var isTop = candidateLayout.Y + candidateLayout.Height / 2 < nodeLayout.Y; var isBottom = candidateLayout.Y + candidateLayout.Height / 2 > (nodeLayout.Y + nodeLayout.Height); var horizontalCenter = !isLeft && !isRight; var verticalCenter = !isTop && !isBottom; if (horizontalCenter && verticalCenter) { // candidate is in center -> don't use return(0); } else if (horizontalCenter || verticalCenter) { profit = 0.95; } else { // diagonal candidates get a bit less profit profit = 0.9; } foreach (var edge in node.Edges) { var portLocation = edge.Source == node?graph.GetSourcePointRel(edge) : graph.GetTargetPointRel(edge); if (Math.Abs(portLocation.X) > Math.Abs(portLocation.Y)) { // edge at left or right if (portLocation.X < 0 && isLeft || portLocation.X > 0 && isRight) { if (isTop || isBottom) { profit -= 0.03; } else { // edge at same side as candidate profit -= 0.2; } } else if (horizontalCenter) { // candidate is close to the edge but not on the same side profit -= 0.01; } } else { // edge at top or bottom if (portLocation.Y < 0 && isTop || portLocation.Y > 0 && isBottom) { if (isLeft || isRight) { profit -= 0.03; } else { profit -= 0.2; } } else if (verticalCenter) { // candidate is close to the edge but not on the same side profit -= 0.01; } } } return(Math.Max(0, profit)); }
/// <inheritdoc/> public override bool GetBool(object dataHolder) { return(nonTreeEdgeDp.GetBool(graph.GetOwner((IEdgeLabelLayout)dataHolder))); }