/// <summary> /// Sets desired location for fake pins</summary> private void MeasureFakePins(IEnumerable <GroupPin> pinNodes, MeasurePinNode measureParts, Point offset, bool inputSide) { //int maximumNameWidth = 0; if (pinNodes.Any()) { //var subGraph = m_graph.As<Group>(); //using (Graphics g = AdaptedControl.CreateGraphics()) { //g.Transform = m_transformAdapter.Transform; if ((measureParts & MeasurePinNode.DesiredLocation) != 0) { // a floating pin node maps to a subnode and its pin index, needed to sort by both var pinList = pinNodes.OrderBy(x => x.InternalElement.Position.Y) .ThenBy(x => x.InternalElement.PinDisplayOrder(x.InternalPinIndex, inputSide)).ToList(); //bool initialOrder = pinList.All(n => n.PinY == int.MinValue); //if (initialOrder && subGraph.DefaultPinOrder == Group.PinOrderStyle.DepthFirst) //{ // int topY = pinNodes.Min(x => x.GroupPin.InternalModule.Position.Y); // foreach (var fakePinNode in pinList) // { // fakePinNode.DesiredLocation = new Point(offset.X, topY + offset.Y + fakePinNode.GroupPin.Index * (PinNodeHeight + PinNodeMargin)); // } //} //else { foreach (var fakePinNode in pinList) { int pinOffset = GetPinOffset(fakePinNode.InternalElement, fakePinNode.InternalPinIndex, inputSide); fakePinNode.DesiredLocation = new Point(offset.X, fakePinNode.InternalElement.Bounds.Location.Y + pinOffset - 8); } // ensure the minimum margin between pin nodes( avoid overlapping among the pin nodes) int lastY = pinList[0].DesiredLocation.Y; for (int i = 1; i < pinList.Count; ++i) { var pin = pinList[i]; int delta = pin.DesiredLocation.Y - lastY - (CircuitGroupPinInfo.FloatingPinNodeHeight + CircuitGroupPinInfo.FloatingPinNodeMargin); if (delta < 0) // distance is less than the minimum interval for the current floating pin { // adjust the desired location to have a safe margin below the preceding floating pin pinList[i].DesiredLocation = new Point(0, pinList[i].DesiredLocation.Y - delta); } lastY = pin.DesiredLocation.Y; } } } //if (measureParts.HasFlag(MeasurePinNode.MaximumNameWidth)) //{ // foreach (var fakePinNode in pinNodes) // { // SizeF nameSize = g.MeasureString(fakePinNode.SubGraphPin.Name, m_subGraphRenderer.GetElementFont(fakePinNode, g)); // if (nameSize.Width > maximumNameWidth) // maximumNameWidth = (int) (nameSize.Width+ 0.5) + PinNodeMargin; // } //} } } //return maximumNameWidth; }
/// <summary> /// Set desired location for fake pins</summary> private void MeasureFakePins(IEnumerable<GroupPin> pinNodes, MeasurePinNode measureParts, Point offset, bool inputSide) { //int maximumNameWidth = 0; if (pinNodes.Any()) { //var subGraph = m_graph.As<Group>(); //using (Graphics g = AdaptedControl.CreateGraphics()) { //g.Transform = m_transformAdapter.Transform; if ( (measureParts & MeasurePinNode.DesiredLocation) !=0) { // a floating pin node maps to a subnode and its pin index, needed to sort by both var pinList = pinNodes.OrderBy(x => x.InternalElement.Position.Y) .ThenBy(x => x.InternalElement.PinDisplayOrder(x.InternalPinIndex, inputSide)).ToList(); //bool initialOrder = pinList.All(n => n.PinY == int.MinValue); //if (initialOrder && subGraph.DefaultPinOrder == Group.PinOrderStyle.DepthFirst) //{ // int topY = pinNodes.Min(x => x.GroupPin.InternalModule.Position.Y); // foreach (var fakePinNode in pinList) // { // fakePinNode.DesiredLocation = new Point(offset.X, topY + offset.Y + fakePinNode.GroupPin.Index * (PinNodeHeight + PinNodeMargin)); // } //} //else { foreach (var fakePinNode in pinList) { int pinOffset = GetPinOffset(fakePinNode.InternalElement, fakePinNode.InternalPinIndex, inputSide); fakePinNode.DesiredLocation = new Point( offset.X, fakePinNode.InternalElement.Bounds.Location.Y + pinOffset - 8); } // ensure the minimum margin between pin nodes( avoid overlapping among the pin nodes) int lastY = pinList[0].DesiredLocation.Y; for (int i = 1; i < pinList.Count; ++i) { var pin = pinList[i]; int delta = pin.DesiredLocation.Y - lastY - (CircuitGroupPinInfo.FloatingPinNodeHeight + CircuitGroupPinInfo.FloatingPinNodeMargin); if (delta < 0) // distance is less than the minimum interval for the current floating pin { // adjust the desired location to have a safe margin below the preceding floating pin pinList[i].DesiredLocation = new Point(0, pinList[i].DesiredLocation.Y - delta); } lastY = pin.DesiredLocation.Y; } } } //if (measureParts.HasFlag(MeasurePinNode.MaximumNameWidth)) //{ // foreach (var fakePinNode in pinNodes) // { // SizeF nameSize = g.MeasureString(fakePinNode.SubGraphPin.Name, m_subGraphRenderer.GetElementFont(fakePinNode, g)); // if (nameSize.Width > maximumNameWidth) // maximumNameWidth = (int) (nameSize.Width+ 0.5) + PinNodeMargin; // } //} } } //return maximumNameWidth; }