private static void TestWindrose(BoxAnchoring boxAnchoring)
 {
     CreateAndRender(r => {
         var b = r.Box(r.F(125, 125), "B", r.F(100, 100), borderWidth: 10, boxAnchoring: boxAnchoring,
                       textFont: new Font(FontFamily.GenericSansSerif, 30));
         r.Arrow(b.CenterBottom, r.F(150, 0), 4, text: "CenterBottom");
         r.Arrow(b.LowerLeft, r.F(0, 0), 4, text: "LowerLeft");
         r.Arrow(b.CenterLeft, r.F(0, 150), 4, text: "CenterLeft");
         r.Arrow(b.UpperLeft, r.F(0, 230), 4, text: "UpperLeft");
         r.Arrow(b.CenterTop, r.F(150, 230), 4, text: "CenterTop");
         r.Arrow(b.UpperRight, r.F(230, 230), 4, text: "UpperRight");
         r.Arrow(b.CenterRight, r.F(250, 150), 4, text: "CenterRight");
         r.Arrow(b.LowerRight, r.F(250, 0), 4, text: "LowerRight");
     }, new GlobalContext());
 }
Esempio n. 2
0
        public IBox Box([NotNull] VariableVector anchor, [CanBeNull] string text, [CanBeNull] VariableVector minDiagonal = null,
                        BoxAnchoring boxAnchoring         = BoxAnchoring.Center, [CanBeNull] Color?boxColor = null /*White*/, int connectors = 8,
                        double borderWidth                = 0, [CanBeNull] Color?borderColor = null /*Black*/,
                        BoxTextPlacement boxTextPlacement = BoxTextPlacement.Center, [CanBeNull] Font textFont = null /*___*/, [CanBeNull] Color?textColor = null /*Black*/,
                        double textPadding                = 0.2, int drawingOrder = 0, int fixingOrder = 100, [CanBeNull] string name = null, [CanBeNull] string htmlRef = null)
        {
            if (anchor == null)
            {
                throw new ArgumentNullException(nameof(anchor));
            }

            var boxBuilder = new BoxBuilder(_solver, anchor, new VariableVector((text ?? anchor.Name) + "./", _solver).Restrict(minDiagonal),
                                            boxAnchoring, boxColor ?? Color.White, borderWidth, borderColor ?? Color.Black, connectors,
                                            text ?? "", boxTextPlacement, textFont ?? _defaultTextFont, textColor ?? Color.Black, textPadding,
                                            _builders.Count, drawingOrder, fixingOrder, name, htmlRef);

            _builders.Add(boxBuilder);
            return(boxBuilder);
        }
Esempio n. 3
0
            public BoxBuilder([NotNull] SimpleConstraintSolver solver,
                              [NotNull] VariableVector anchor, [NotNull] VariableVector diagonal,
                              BoxAnchoring boxAnchoring, Color color,
                              double borderWidth, Color borderColor, int connectors, string text,
                              BoxTextPlacement boxTextPlacement, Font textFont, Color textColor, double textPadding,
                              int creationOrder, int drawingOrder, int fixingOrder,
                              string name, [CanBeNull] string htmlRef) : base(creationOrder, drawingOrder, fixingOrder)
            {
                _solver = solver;
                Name    = name ?? anchor.Name;

                _anchor   = anchor;
                _textBox  = new VariableVector(Name + ".TXT", _solver);
                _diagonal = diagonal.AlsoNamed(Name + "./").Restrict(_textBox);

                var halfDiagonal   = diagonal / 2;
                var halfHorizontal = halfDiagonal.Horizontal();
                var halfVertical   = halfDiagonal.Vertical();
                var vertical       = diagonal.Vertical();
                var horizontal     = diagonal.Horizontal();

                switch (boxAnchoring)
                {
                case BoxAnchoring.Center:
                    _center       = anchor;
                    _lowerLeft    = anchor - halfDiagonal;
                    _centerLeft   = anchor - halfHorizontal;
                    _upperLeft    = anchor + ~halfDiagonal;
                    _centerTop    = anchor + halfVertical;
                    _upperRight   = anchor + halfDiagonal;
                    _centerRight  = anchor + halfHorizontal;
                    _lowerRight   = anchor + !halfDiagonal;
                    _centerBottom = anchor - halfVertical;
                    break;

                case BoxAnchoring.LowerLeft:
                    _center       = anchor + halfDiagonal;
                    _lowerLeft    = anchor;
                    _centerLeft   = anchor + halfVertical;
                    _upperLeft    = anchor + vertical;
                    _centerTop    = _upperLeft + halfHorizontal;
                    _upperRight   = anchor + diagonal;
                    _centerRight  = _centerLeft + horizontal;
                    _lowerRight   = anchor + horizontal;
                    _centerBottom = anchor + halfHorizontal;
                    break;

                case BoxAnchoring.CenterLeft:
                    _center       = anchor + halfHorizontal;
                    _lowerLeft    = anchor - halfVertical;
                    _centerLeft   = anchor;
                    _upperLeft    = anchor + halfVertical;
                    _centerTop    = anchor + halfDiagonal;
                    _upperRight   = _centerTop + halfHorizontal;
                    _centerRight  = anchor + horizontal;
                    _lowerRight   = _centerRight - halfVertical;
                    _centerBottom = anchor + !halfDiagonal;
                    break;

                case BoxAnchoring.UpperLeft:
                    _center       = anchor - ~halfDiagonal;
                    _lowerLeft    = anchor - vertical;
                    _centerLeft   = anchor - halfVertical;
                    _upperLeft    = anchor;
                    _centerTop    = anchor + halfHorizontal;
                    _upperRight   = anchor + horizontal;
                    _centerRight  = _upperRight - halfVertical;
                    _lowerRight   = anchor - ~diagonal;
                    _centerBottom = anchor + new VariableVector(null, diagonal.X / 2, -diagonal.Y);
                    break;

                case BoxAnchoring.CenterTop:
                    _center       = anchor - halfVertical;
                    _lowerLeft    = _center - halfDiagonal;
                    _centerLeft   = anchor - halfDiagonal;
                    _upperLeft    = anchor - halfHorizontal;
                    _centerTop    = anchor;
                    _upperRight   = anchor + halfHorizontal;
                    _centerRight  = anchor + !halfDiagonal;
                    _lowerRight   = _centerRight - halfVertical;
                    _centerBottom = anchor - vertical;
                    break;

                case BoxAnchoring.UpperRight:
                    _center       = anchor - halfDiagonal;
                    _lowerLeft    = anchor - diagonal;
                    _centerLeft   = anchor + new VariableVector(null, -diagonal.X, diagonal.Y / -2);
                    _upperLeft    = anchor - horizontal;
                    _centerTop    = anchor - halfHorizontal;
                    _upperRight   = anchor;
                    _centerRight  = anchor - halfVertical;
                    _lowerRight   = anchor - vertical;
                    _centerBottom = anchor + new VariableVector(null, diagonal.X / -2, -diagonal.Y);
                    break;

                case BoxAnchoring.CenterRight:
                    _center       = anchor - halfHorizontal;
                    _lowerLeft    = _center - halfDiagonal;
                    _centerLeft   = anchor - horizontal;
                    _upperLeft    = anchor + new VariableVector(null, -diagonal.X, diagonal.Y / 2);
                    _centerTop    = anchor + ~halfDiagonal;
                    _upperRight   = anchor + halfVertical;
                    _centerRight  = anchor;
                    _lowerRight   = anchor - halfVertical;
                    _centerBottom = anchor - halfDiagonal;
                    break;

                case BoxAnchoring.LowerRight:
                    _center       = anchor + ~halfDiagonal;
                    _lowerLeft    = anchor - horizontal;
                    _centerLeft   = anchor + new VariableVector(null, -diagonal.X, diagonal.Y / 2);
                    _upperLeft    = anchor + ~diagonal;
                    _centerTop    = anchor + new VariableVector(null, diagonal.X / -2, diagonal.Y);
                    _upperRight   = anchor + vertical;
                    _centerRight  = anchor + halfVertical;
                    _lowerRight   = anchor;
                    _centerBottom = anchor - halfHorizontal;
                    break;

                case BoxAnchoring.CenterBottom:
                    _center       = anchor + halfVertical;
                    _lowerLeft    = anchor - halfHorizontal;
                    _centerLeft   = anchor + ~halfDiagonal;
                    _upperLeft    = _centerLeft + halfVertical;
                    _centerTop    = anchor + vertical;
                    _upperRight   = _centerTop + halfHorizontal;
                    _centerRight  = anchor + halfDiagonal;
                    _lowerRight   = anchor + halfHorizontal;
                    _centerBottom = anchor;
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(boxAnchoring), boxAnchoring, null);
                }

                _center       = _center.AlsoNamed(Name + "CC");
                _lowerLeft    = _lowerLeft.AlsoNamed(Name + ".LL");
                _centerLeft   = _centerLeft.AlsoNamed(Name + ".CL");
                _upperLeft    = _upperLeft.AlsoNamed(Name + ".UL");
                _centerTop    = _centerTop.AlsoNamed(Name + ".CT");
                _upperRight   = _upperRight.AlsoNamed(Name + ".UR");
                _centerRight  = _centerRight.AlsoNamed(Name + ".CR");
                _lowerRight   = _lowerRight.AlsoNamed(Name + ".LR");
                _centerBottom = _centerBottom.AlsoNamed(Name + ".CB");

                _upperRight.SetY(_centerTop.Y);
                _upperRight.SetY(_upperLeft.Y);
                _centerTop.SetY(_upperLeft.Y);
                _centerRight.SetY(_center.Y);
                _centerRight.SetY(_centerLeft.Y);
                _center.SetY(_centerLeft.Y);
                _lowerRight.SetY(_centerBottom.Y);
                _lowerRight.SetY(_lowerLeft.Y);
                _centerBottom.SetY(_lowerLeft.Y);

                // Simple stuff
                _color            = color;
                _borderWidth      = (float)borderWidth;
                _text             = text.Split('\r', '\n');
                _boxTextPlacement = boxTextPlacement;
                _textColor        = textColor;
                _textPadding      = textPadding;
                _htmlRef          = htmlRef;
                _textFont         = textFont;
                _borderColor      = borderColor;
                _sectorAngle      = 2 * Math.PI / connectors;
            }