private void HandleLoopBoundsChanges(BoundsChangeMerger <Loop> boundsChanges)
        {
            foreach (var change in boundsChanges)
            {
                SMRect oldBounds = change.OldBounds;
                SMRect newBounds = change.NewBounds;
                // Don't move things on structure move.
                if (!change.IsResize)
                {
                    continue;
                }

                var   element  = change.TargetElement;
                float leftDiff = newBounds.Left - oldBounds.Left;
                float topDiff  = newBounds.Top - oldBounds.Top;
                foreach (BorderNode node in element.BorderNodes)
                {
                    if (BorderNode.GetBorderNodeDockingAxis(node.Docking) == BorderNodeDockingAxis.Horizontal)
                    {
                        node.Left -= leftDiff;
                    }
                    else
                    {
                        node.Top -= topDiff;
                    }
                }
                ViewElementOverlapHelper.PreventBorderNodeOverlap(element, g => ViewElementOverlapHelper.PreventBorderNodeOverlap(g));
                element.BorderNodes.ForEach(bn => bn.EnsureDocking());
            }
        }
Beispiel #2
0
        /// <summary>
        /// 获得一个边界点处的法向量
        /// </summary>
        /// <param name="node"></param>
        /// <param name="sumAverage"></param>
        /// <returns></returns>
        public Vector2 GetNormalVector(BorderNode node, int sumAverage)
        {
            if (sumAverage < 1)
            {
                sumAverage = 1;
            }

            Vector2    sumTang = Vector2.Zero;
            BorderNode cur     = node;

            for (int i = 0; i < sumAverage; i++)
            {
                cur = cur.pre;
            }
            for (int i = -sumAverage; i <= sumAverage; i++)
            {
                if (i == 0)
                {
                    i++;
                }

                cur = cur.next;
                Point   curPoint = cur.value.p;
                Point   prePoint = cur.pre.value.p;
                Vector2 tang     = new Vector2(curPoint.X - prePoint.X, curPoint.Y - prePoint.Y);
                tang.Normalize();
                tang    *= Right(Math.Abs(i), sumAverage);
                sumTang += tang;
            }
            Vector2 result = new Vector2(sumTang.Y, -sumTang.X);

            // sprite类中会进行标准化,此处略掉
            //result.Normalize();
            return(result);
        }
Beispiel #3
0
 /// <inheritdoc />
 public override SMSize GetDesiredBorderNodeSize(BorderNode borderNode)
 {
     if (borderNode is VariantMatchStructureSelector)
     {
         return(new SMSize(StockDiagramGeometries.GridSize * 4, StockDiagramGeometries.GridSize * 4));
     }
     return(base.GetDesiredBorderNodeSize(borderNode));
 }
Beispiel #4
0
 /// <inheritdoc />
 public override SMSize GetDesiredBorderNodeSize(BorderNode borderNode)
 {
     if (borderNode is BorrowTunnel ||
         borderNode is FlatSequenceTerminateLifetimeTunnel ||
         borderNode is LockTunnel ||
         borderNode is UnwrapOptionTunnel)
     {
         return(new SMSize(StockDiagramGeometries.GridSize * 4, StockDiagramGeometries.GridSize * 4));
     }
     return(base.GetDesiredBorderNodeSize(borderNode));
 }
Beispiel #5
0
 /// <inheritdoc />
 public override SMSize GetDesiredBorderNodeSize(BorderNode borderNode)
 {
     if (borderNode is LoopBorrowTunnel ||
         borderNode is LoopTerminateLifetimeTunnel ||
         borderNode is LoopConditionTunnel ||
         borderNode is LoopIterateTunnel)
     {
         return(new SMSize(StockDiagramGeometries.GridSize * 4, StockDiagramGeometries.GridSize * 4));
     }
     return(base.GetDesiredBorderNodeSize(borderNode));
 }
Beispiel #6
0
 private void RefreshBorder()
 {
     if (HasBorder)
     {
         BorderNode.Cleanup();
         BorderNode.DrawRect(
             new CCRect(0, 0, ContentSize.Width, ContentSize.Height),
             new CCColor4B(0, 0, 0),
             BorderSize,
             new CCColor4B(255, 255, 255));
     }
 }
Beispiel #7
0
        /// <inheritdoc />
        public override IBorderNodeGuide GetGuide(BorderNode borderNode)
        {
            var                      max    = GetMaxXYForBorderNode(this, borderNode);
            RectangleSides           sides  = GetSidesForBorderNode(borderNode);
            var                      height = max.Y + borderNode.Height + OuterBorderThickness.Bottom;
            var                      width  = max.X + borderNode.Width + OuterBorderThickness.Right;
            RectangleBorderNodeGuide guide  = new RectangleBorderNodeGuide(
                new SMRect(0, 0, width, height),
                sides,
                BorderNodeDocking.None,
                OuterBorderThickness,
                GetAvoidRects(borderNode));

            guide.EdgeOverflow = StockDiagramGeometries.StandardTunnelOffsetForStructures;
            return(guide);
        }
Beispiel #8
0
        /// <inheritdoc />
        /// <remarks>Adapted from NationalInstruments.VI.SourceModel.Loop.GetGuide.</remarks>
        public override IBorderNodeGuide GetGuide(BorderNode borderNode)
        {
            var loopTerminateLifetimeTunnel = borderNode as LoopTerminateLifetimeTunnel;

            if (loopTerminateLifetimeTunnel != null)
            {
                var height = GetMaxXYForBorderNode(this, borderNode).Y + borderNode.Height + OuterBorderThickness.Bottom;
                List <BorderNode> except = new List <BorderNode>()
                {
                    (BorderNode)loopTerminateLifetimeTunnel.BeginLifetimeTunnel,
                    loopTerminateLifetimeTunnel
                };
                return(new TerminateLifetimeTunnelGuide(
                           new SMRect(0, 0, Width, height),
                           loopTerminateLifetimeTunnel,
                           OuterBorderThickness,
                           BorderNodes.Except(except).Select(node => node.Bounds))
                {
                    EdgeOverflow = StockDiagramGeometries.StandardTunnelOffsetForStructures
                });
            }
            else if (borderNode is LoopBorrowTunnel || borderNode is LoopConditionTunnel || borderNode is LoopIterateTunnel)
            {
                var height = GetMaxXYForBorderNode(this, borderNode).Y + borderNode.Height + OuterBorderThickness.Bottom;
                // TerminateLifetimeTunnels do all the moving, but this guide ensures the left node is not out of place or on the wrong docking side.
                RectangleBorderNodeGuide guide = new RectangleBorderNodeGuide(
                    new SMRect(0, 0, Width, height),
                    RectangleSides.Left,
                    BorderNodeDocking.None,
                    OuterBorderThickness,
                    BorderNodes.Where(node => node != borderNode).Select(node => node.Bounds));
                guide.EdgeOverflow = StockDiagramGeometries.StandardTunnelOffsetForStructures;
                return(guide);
            }
            return(base.GetGuide(borderNode));
        }
Beispiel #9
0
        protected override void VisitBorderNode(BorderNode borderNode)
        {
            AutoBorrowNodeFacade nodeFacade = AutoBorrowNodeFacade.GetNodeFacade(borderNode);

            nodeFacade.CreateBorrowAndTerminateLifetimeNodes(_lifetimeVariableAssociation);
        }
Beispiel #10
0
 /// <inheritdoc />
 protected override RectangleSides GetSidesForBorderNode(BorderNode borderNode) => borderNode is VariantMatchStructureSelector
     ? RectangleSides.Left
     : RectangleSides.All;
Beispiel #11
0
        /// <summary>
        /// 按逆时针方向获得边界圈
        /// </summary>
        /// <param name="first"></param>
        /// <returns></returns>
        private BorderCircleList BuildCircle(BorderPoint first)
        {
            BorderCircleList result = new BorderCircleList();

            BorderNode firstNode = new BorderNode(first);

            result.AddLast(firstNode);

            Point prePoint = new Point();
            Point curPoint = firstNode.value.p;

            try
            {
                //set the prePoint at the first time!
                SetPrePointFirstTime(firstNode.value.p, ref prePoint);


                bool linked = false;
                while (!linked)
                {
                    bool findNext = false;

                    foreach (Point p in SurroundQueue(curPoint, prePoint))
                    {
                        if (borderMap[p.X, p.Y] && p != prePoint)
                        {
                            findNext = true;

                            if (p == firstNode.value.p)
                            {
                                linked = true;
                                result.LinkLastAndFirst();
                                break;
                            }

                            result.AddLast(new BorderPoint(p));
                            prePoint = curPoint;
                            curPoint = p;
                            break;
                        }
                    }
                    if (!findNext)
                    {
#if SHOWERROR
                        //ShowDataToConsole();
                        //ShowCurListResult( result );
#endif
                        throw new BorderBulidException(curPoint, prePoint, borderMap);
                    }
                }
            }
            // 如果此处出现异常,往往是导入的图片不能满足要求。
            // 将在输出中打印出图片上具体出错的位置。
            // 需要重新修改图片以正常使用。
            catch (BorderBulidException e)
            {
#if SHOWERROR
                //ShowDataToConsole();
                //ShowCurListResult( result );
#endif
                throw e;
                //return result;
            }
            return(result);
        }
 protected FlatSequenceBorderNodeViewModel(BorderNode element) : base(element)
 {
 }
Beispiel #13
0
 public FlatSequenceSimpleBorderNodeViewModel(BorderNode element, string foregroundUri) : base(element)
 {
     ForegroundUri = new ResourceUri(this, foregroundUri);
 }
Beispiel #14
0
 protected abstract void VisitBorderNode(BorderNode borderNode);
 /// <inheritdoc />
 protected override RectangleSides GetSidesForBorderNode(BorderNode borderNode) => borderNode is OptionPatternStructureSelector
     ? RectangleSides.Left
     : RectangleSides.All;
Beispiel #16
0
 protected abstract RectangleSides GetSidesForBorderNode(BorderNode borderNode);
Beispiel #17
0
 protected override void VisitBorderNode(BorderNode borderNode)
 {
     AutoBorrowNodeFacade.GetNodeFacade(borderNode).FinalizeAutoBorrows();
 }
Beispiel #18
0
        /// <summary>
        /// 按逆时针方向获得边界圈
        /// </summary>
        /// <param name="first"></param>
        /// <returns></returns>
        private BorderCircleList BuildCircle ( BorderPoint first )
        {
            BorderCircleList result = new BorderCircleList();

            BorderNode firstNode = new BorderNode( first );
            result.AddLast( firstNode );

            Point prePoint = new Point();
            Point curPoint = firstNode.value.p;

            try
            {
                //set the prePoint at the first time!
                SetPrePointFirstTime( firstNode.value.p, ref prePoint );


                bool linked = false;
                while (!linked)
                {
                    bool findNext = false;

                    foreach (Point p in SurroundQueue( curPoint, prePoint ))
                    {
                        if (borderMap[p.X, p.Y] && p != prePoint)
                        {
                            findNext = true;

                            if (p == firstNode.value.p)
                            {
                                linked = true;
                                result.LinkLastAndFirst();
                                break;
                            }

                            result.AddLast( new BorderPoint( p ) );
                            prePoint = curPoint;
                            curPoint = p;
                            break;
                        }
                    }
                    if (!findNext)
                    {
#if SHOWERROR
                        //ShowDataToConsole();
                        //ShowCurListResult( result );
#endif
                        throw new BorderBulidException( curPoint, prePoint, borderMap );
                    }
                }

            }
            // 如果此处出现异常,往往是导入的图片不能满足要求。
            // 将在输出中打印出图片上具体出错的位置。
            // 需要重新修改图片以正常使用。
            catch (BorderBulidException e)
            {
#if SHOWERROR
                //ShowDataToConsole();
                //ShowCurListResult( result );
#endif
                throw e;
                //return result;
            }
            return result;
        }
Beispiel #19
0
        /// <summary>
        /// 获得一个边界点处的法向量
        /// </summary>
        /// <param name="node"></param>
        /// <param name="sumAverage"></param>
        /// <returns></returns>
        public Vector2 GetNormalVector ( BorderNode node, int sumAverage )
        {
            if (sumAverage < 1)
                sumAverage = 1;

            Vector2 sumTang = Vector2.Zero;
            BorderNode cur = node;
            for (int i = 0; i < sumAverage; i++)
            {
                cur = cur.pre;
            }
            for (int i = -sumAverage; i <= sumAverage; i++)
            {
                if (i == 0) i++;

                cur = cur.next;
                Point curPoint = cur.value.p;
                Point prePoint = cur.pre.value.p;
                Vector2 tang = new Vector2( curPoint.X - prePoint.X, curPoint.Y - prePoint.Y );
                tang.Normalize();
                tang *= Right( Math.Abs( i ), sumAverage );
                sumTang += tang;
            }
            Vector2 result = new Vector2( sumTang.Y, -sumTang.X );
            // sprite类中会进行标准化,此处略掉
            //result.Normalize();
            return result;
        }