protected override void OnRender(DrawingContext drawingContext) { refreshOfffsetLines(); var _itemBrush = new SolidColorBrush(Color.FromArgb(128, 255, 64, 64)); var _itemPen = new Pen(Brushes.DarkRed, 1.0); var _cutPen = new Pen(Brushes.Blue, 2.0); var itemPoints = TransformedShapeDefinition.ToArray(); var geometry = CreatePathFigure(itemPoints); drawingContext.DrawGeometry(_itemBrush, _itemPen, geometry); var offsetLines = OffsetLines.ToArray(); var offsetGeometry = CreatePathFigure(offsetLines); drawingContext.DrawGeometry(null, _cutPen, offsetGeometry); }
private IEnumerable <Point4Dmm> templatedCutPoints() { //find top/bottom templates var definitionPoints = TransformedShapeDefinition.ToArray(); definitionPoints = addHorizontalKerf(definitionPoints).ToArray(); double minHorizontalCoord, maxHorizontalCoord, minVerticalCoord; int minHorizontalIndex, maxHorizontalIndex, minVerticalIndex; findBoxPoints(definitionPoints, out minHorizontalCoord, out maxHorizontalCoord, out minVerticalCoord, out minHorizontalIndex, out maxHorizontalIndex, out minVerticalIndex); var templateMinMax = new List <Point4Dmm>(); var templateMaxMin = new List <Point4Dmm>(); var isMinMax = true; for (var i = minHorizontalIndex; i < minHorizontalIndex + definitionPoints.Length; ++i) { var pointIndex = i % definitionPoints.Length; var point = definitionPoints[pointIndex]; if (isMinMax) { //first template points templateMinMax.Add(point); } if (pointIndex == maxHorizontalIndex) { isMinMax = false; } if (!isMinMax) { //second template points templateMaxMin.Add(point); } } //distinguish which template is top, and which bottom var isMinMaxTop = minHorizontalIndex > minVerticalIndex && minVerticalIndex < maxHorizontalIndex; if (minHorizontalIndex == minVerticalIndex || maxHorizontalIndex == minVerticalIndex) { throw new NotImplementedException("Degenerated shape, probably not good for templated cut"); } templateMaxMin.Reverse();// the template was drawn in the opposite direction var topTemplate = isMinMaxTop ? templateMinMax : templateMaxMin; var bottomTemplate = isMinMaxTop ? templateMaxMin : templateMinMax; //define template scaffold points var startPoint = topTemplate.First(); var endPoint = topTemplate.Last(); var margin = 30; var marginTop = 55; var syncMargin = 5; var topLineC2 = minVerticalCoord - marginTop; //TODO load from shape settings var entryC1 = minHorizontalCoord - margin; //TODO load from shape settings var finishC1 = maxHorizontalCoord + margin; //TODO load from shape settings var entryScaffoldPoint = new Point4Dmm(entryC1, startPoint.V, entryC1, startPoint.Y); var syncEntryScaffoldPoint = new Point4Dmm(startPoint.U - syncMargin, startPoint.V, startPoint.X - syncMargin, startPoint.Y); var aboveEntryScaffoldPoint = new Point4Dmm(entryC1, topLineC2, entryC1, topLineC2); var finishScaffoldPoint = new Point4Dmm(finishC1, endPoint.V, finishC1, endPoint.Y); var syncFinishScaffoldPoint = new Point4Dmm(endPoint.U + syncMargin, endPoint.V, endPoint.X + syncMargin, endPoint.Y); var aboveFinishScaffoldPoint = new Point4Dmm(finishC1, topLineC2, finishC1, topLineC2); //construct the cut var points = new List <Point4Dmm>(); //bottom template first points.Add(entryScaffoldPoint); points.Add(syncEntryScaffoldPoint); points.AddRange(bottomTemplate); points.Add(syncFinishScaffoldPoint); points.Add(finishScaffoldPoint); points.Add(aboveFinishScaffoldPoint); points.Add(aboveEntryScaffoldPoint); points.Add(entryScaffoldPoint); points.Add(syncEntryScaffoldPoint); //top template cut points.AddRange(topTemplate); points.Add(syncFinishScaffoldPoint); points.Add(finishScaffoldPoint); points.Add(aboveFinishScaffoldPoint); points.Add(aboveEntryScaffoldPoint); points.Add(entryScaffoldPoint); //entry point at the end is implicit (shape is closed) return(points); }