//--------------------------------------------------------------------------------------------------------- /// <summary> /// Обновление данных геометрии /// </summary> //--------------------------------------------------------------------------------------------------------- public override void Update() { CCadSegment current_figure = mSegments[0]; mGraphicsPath.StartFigure(); Int32 current_new_figure = 0; for (Int32 i = 0; i < mSegments.Count; i++) { CCadSegment current_segment = mSegments[i]; // Если новая фигура if (current_segment.IsNewFigure && current_new_figure != i) { // Закрывает текущую фигуру mGraphicsPath.CloseFigure(); // Открываем новую фигуру mGraphicsPath.StartFigure(); current_figure = current_segment; current_new_figure = i; } switch (current_segment.SegmentType) { case TCadSegmentType.Points: { CCadSegmentPoints points = current_segment as CCadSegmentPoints; mGraphicsPath.AddLines(points.Points.ConvertToDrawingPointsF()); } break; case TCadSegmentType.Line: { CCadSegmentLine line = current_segment as CCadSegmentLine; //mGraphicsPath.AddLine(line.StartPoint, line.EndPoint); } break; case TCadSegmentType.Arc: { CCadSegmentArc arc = current_segment as CCadSegmentArc; mGraphicsPath.AddArc(arc.BasePoint.X, arc.BasePoint.Y, arc.RadiusX * 2, arc.RadiusY * 2, arc.RotationAngle, 12); } break; case TCadSegmentType.Bezier: break; default: break; } } //mBoundsRect = new Rect2Df(mGraphicsPath.GetBounds()); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Обновление данных геометрии /// </summary> //--------------------------------------------------------------------------------------------------------- public override void Update() { using (StreamGeometryContext sgc = mGeometry.Open()) { CCadSegment current_figure = mSegments[0]; sgc.BeginFigure(current_figure.BasePoint, current_figure.IsFilled, current_figure.IsClosed); Int32 current_new_figure = 0; for (Int32 i = 0; i < mSegments.Count; i++) { CCadSegment current_segment = mSegments[i]; // Если новая фигура if (current_segment.IsNewFigure && current_new_figure != i) { // Закрывает текущую фигуру // Открываем новую фигуру sgc.BeginFigure(current_segment.BasePoint, current_segment.IsFilled, current_segment.IsClosed); current_figure = current_segment; current_new_figure = i; } switch (current_segment.SegmentType) { case TCadSegmentType.Points: { CCadSegmentPoints points = current_segment as CCadSegmentPoints; sgc.PolyLineTo(points.Points.ConvertToWindowsPoints(), mIsStroked, true); } break; case TCadSegmentType.Line: { CCadSegmentLine line = current_segment as CCadSegmentLine; sgc.LineTo(line.EndPoint, mIsStroked, true); } break; case TCadSegmentType.Arc: { CCadSegmentArc arc = current_segment as CCadSegmentArc; sgc.ArcTo(arc.EndPoint, new Size(arc.RadiusX, arc.RadiusY), arc.RotationAngle, arc.IsLargeArc, arc.IsClockwiseDirection ? SweepDirection.Clockwise : SweepDirection.Counterclockwise, mIsStroked, true); } break; case TCadSegmentType.Bezier: break; default: break; } } // Закрывает текущую фигуру sgc.Close(); } mBoundsRect = new Rect2Df(mGeometry.Bounds); }
//--------------------------------------------------------------------------------------------------------- /// <summary> /// Обновление данных геометрии /// </summary> //--------------------------------------------------------------------------------------------------------- public override void Update() { XDisposer.SafeDispose(ref mD2DGeometry); mD2DGeometry = new Direct2D.PathGeometry(XDirect2DManager.D2DFactory); mD2DGeometrySink = mD2DGeometry.Open(); CCadSegment current_figure = mSegments[0]; mD2DGeometrySink.BeginFigure(current_figure.BasePoint.ToRawVector2(), current_figure.IsFilled ? Direct2D.FigureBegin.Filled : Direct2D.FigureBegin.Hollow); Int32 current_new_figure = 0; for (Int32 i = 0; i < mSegments.Count; i++) { CCadSegment current_segment = mSegments[i]; // Если новая фигура if (current_segment.IsNewFigure && current_new_figure != i) { // Закрывает текущую фигуру mD2DGeometrySink.EndFigure(current_figure.IsClosed ? Direct2D.FigureEnd.Closed : Direct2D.FigureEnd.Open); // Открываем новую фигуру mD2DGeometrySink.BeginFigure(current_segment.BasePoint.ToRawVector2(), current_segment.IsFilled ? Direct2D.FigureBegin.Filled : Direct2D.FigureBegin.Hollow); current_figure = current_segment; current_new_figure = i; } switch (current_segment.SegmentType) { case TCadSegmentType.Points: { CCadSegmentPoints points = current_segment as CCadSegmentPoints; mD2DGeometrySink.AddLines(points.Points.ConvertToDirect2DRawVectors()); } break; case TCadSegmentType.Line: { CCadSegmentLine line = current_segment as CCadSegmentLine; mD2DGeometrySink.AddLine(line.EndPoint.ToRawVector2()); } break; case TCadSegmentType.Arc: { CCadSegmentArc arc = current_segment as CCadSegmentArc; Direct2D.ArcSegment arc_segment = new Direct2D.ArcSegment(); arc_segment.ArcSize = arc.mIsLargeArc ? Direct2D.ArcSize.Large : Direct2D.ArcSize.Small; arc_segment.Point = arc.mEndPoint.ToRawVector2(); arc_segment.RotationAngle = arc.mRotationAngle; arc_segment.Size = new Size2F(arc.mRadiusX, arc.mRadiusY); arc_segment.SweepDirection = arc.mIsClockwiseDirection ? Direct2D.SweepDirection.Clockwise : Direct2D.SweepDirection.CounterClockwise; mD2DGeometrySink.AddArc(arc_segment); } break; case TCadSegmentType.Bezier: break; default: break; } } // Закрывает текущую фигуру mD2DGeometrySink.EndFigure(current_figure.IsClosed ? Direct2D.FigureEnd.Closed : Direct2D.FigureEnd.Open); mD2DGeometrySink.Close(); XDisposer.SafeDispose(ref mD2DGeometrySink); mBoundsRect = mD2DGeometry.GetWidenedBounds(2).ToRect(); }