/// <summary> /// Adds a mapper with a <see cref="PreferredPlacementDescriptor"/> that matches the given settings to the mapper /// registry of the given graph. In addition, sets the label model of all edge labels to free since that model /// can realizes any label placement calculated by a layout algorithm. /// </summary> public LayoutData CreateLabelingLayoutData( IGraph graph, EnumLabelPlacementAlongEdge placeAlongEdge, EnumLabelPlacementSideOfEdge sideOfEdge, EnumLabelPlacementOrientation orientation, double distanceToEdge) { var descriptor = CreatePreferredPlacementDescriptor( placeAlongEdge, sideOfEdge, orientation, distanceToEdge ); // change to a free edge label model to support integrated edge labeling var model = new FreeEdgeLabelModel(); foreach (var label in graph.GetEdgeLabels()) { if (!(label.LayoutParameter.Model is FreeEdgeLabelModel)) { graph.SetLabelLayoutParameter(label, model.FindBestParameter(label, model, label.GetLayout())); } } var layoutData = new GenericLayoutData(); layoutData.AddItemMapping(LayoutGraphAdapter.EdgeLabelLayoutPreferredPlacementDescriptorDpKey, new ItemMapping <ILabel, PreferredPlacementDescriptor>(label => descriptor)); return(layoutData); }
/// <summary> /// Adds a mapper with a <see cref="PreferredPlacementDescriptor"/> that matches the given settings to the mapper /// registry of the given graph. In addition, sets the label model of all edge labels to free since that model /// can realizes any label placement calculated by a layout algorithm. /// </summary> public static void AddPreferredPlacementDescriptor( IGraph graph, EnumLabelPlacementAlongEdge placeAlongEdge, EnumLabelPlacementSideOfEdge sideOfEdge, EnumLabelPlacementOrientation orientation, double distanceToEdge) { var model = new FreeEdgeLabelModel(); var descriptor = CreatePreferredPlacementDescriptor(placeAlongEdge, sideOfEdge, orientation, distanceToEdge); graph.MapperRegistry.CreateConstantMapper <ILabel, PreferredPlacementDescriptor>( LayoutGraphAdapter.EdgeLabelLayoutPreferredPlacementDescriptorDpKey, descriptor); foreach (ILabel label in graph.GetEdgeLabels()) { graph.SetLabelLayoutParameter( label, model.FindBestParameter(label, model, label.GetLayout())); } }
/// <summary> /// Creates a new <see cref="PreferredPlacementDescriptor"/> that matches the given settings. /// </summary> public PreferredPlacementDescriptor CreatePreferredPlacementDescriptor( EnumLabelPlacementAlongEdge placeAlongEdge, EnumLabelPlacementSideOfEdge sideOfEdge, EnumLabelPlacementOrientation orientation, double distanceToEdge) { var descriptor = new PreferredPlacementDescriptor(); switch (sideOfEdge) { case EnumLabelPlacementSideOfEdge.Anywhere: descriptor.SideOfEdge = LabelPlacements.Anywhere; break; case EnumLabelPlacementSideOfEdge.OnEdge: descriptor.SideOfEdge = LabelPlacements.OnEdge; break; case EnumLabelPlacementSideOfEdge.Left: descriptor.SideOfEdge = LabelPlacements.LeftOfEdge; break; case EnumLabelPlacementSideOfEdge.Right: descriptor.SideOfEdge = LabelPlacements.RightOfEdge; break; case EnumLabelPlacementSideOfEdge.LeftOrRight: descriptor.SideOfEdge = LabelPlacements.LeftOfEdge | LabelPlacements.RightOfEdge; break; } switch (placeAlongEdge) { case EnumLabelPlacementAlongEdge.Anywhere: descriptor.PlaceAlongEdge = LabelPlacements.Anywhere; break; case EnumLabelPlacementAlongEdge.AtSourcePort: descriptor.PlaceAlongEdge = LabelPlacements.AtSourcePort; break; case EnumLabelPlacementAlongEdge.AtTargetPort: descriptor.PlaceAlongEdge = LabelPlacements.AtTargetPort; break; case EnumLabelPlacementAlongEdge.AtSource: descriptor.PlaceAlongEdge = LabelPlacements.AtSource; break; case EnumLabelPlacementAlongEdge.AtTarget: descriptor.PlaceAlongEdge = LabelPlacements.AtTarget; break; case EnumLabelPlacementAlongEdge.Centered: descriptor.PlaceAlongEdge = LabelPlacements.AtCenter; break; } switch (orientation) { case EnumLabelPlacementOrientation.Parallel: descriptor.Angle = 0.0d; descriptor.AngleReference = LabelAngleReferences.RelativeToEdgeFlow; break; case EnumLabelPlacementOrientation.Orthogonal: descriptor.Angle = Math.PI / 2; descriptor.AngleReference = LabelAngleReferences.RelativeToEdgeFlow; break; case EnumLabelPlacementOrientation.Horizontal: descriptor.Angle = 0.0d; descriptor.AngleReference = LabelAngleReferences.Absolute; break; case EnumLabelPlacementOrientation.Vertical: descriptor.Angle = Math.PI / 2; descriptor.AngleReference = LabelAngleReferences.Absolute; break; } descriptor.DistanceToEdge = distanceToEdge; return(descriptor); }