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); }
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; }