예제 #1
0
        /// <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;
        }
예제 #2
0
        /// <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;
        }