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()); } }
/// <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); }
/// <inheritdoc /> public override SMSize GetDesiredBorderNodeSize(BorderNode borderNode) { if (borderNode is VariantMatchStructureSelector) { return(new SMSize(StockDiagramGeometries.GridSize * 4, StockDiagramGeometries.GridSize * 4)); } return(base.GetDesiredBorderNodeSize(borderNode)); }
/// <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)); }
/// <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)); }
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)); } }
/// <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); }
/// <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)); }
protected override void VisitBorderNode(BorderNode borderNode) { AutoBorrowNodeFacade nodeFacade = AutoBorrowNodeFacade.GetNodeFacade(borderNode); nodeFacade.CreateBorrowAndTerminateLifetimeNodes(_lifetimeVariableAssociation); }
/// <inheritdoc /> protected override RectangleSides GetSidesForBorderNode(BorderNode borderNode) => borderNode is VariantMatchStructureSelector ? RectangleSides.Left : RectangleSides.All;
/// <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) { }
public FlatSequenceSimpleBorderNodeViewModel(BorderNode element, string foregroundUri) : base(element) { ForegroundUri = new ResourceUri(this, foregroundUri); }
protected abstract void VisitBorderNode(BorderNode borderNode);
/// <inheritdoc /> protected override RectangleSides GetSidesForBorderNode(BorderNode borderNode) => borderNode is OptionPatternStructureSelector ? RectangleSides.Left : RectangleSides.All;
protected abstract RectangleSides GetSidesForBorderNode(BorderNode borderNode);
protected override void VisitBorderNode(BorderNode borderNode) { AutoBorrowNodeFacade.GetNodeFacade(borderNode).FinalizeAutoBorrows(); }
/// <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; }
/// <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; }