protected NShape CreateDrawPath() { NShape shape = new NShape(); shape.Init2DShape(); NGraphicsPath path = new NGraphicsPath(); path.AddRectangle(0, 0, 0.5, 0.5); path.AddEllipse(0.5, 0.5, 0.5, 0.5); // the draw path command draws a path inside a relative or absolute rect inside the shape coordinate system. // The following draws a path that contains a rectangle and an ellipse that fills the shape. NDrawPath drawPath = new NDrawPath(0, 0, 1, 1, path); shape.Geometry.AddRelative(drawPath); return(shape); }
/// <summary> /// Creates a custom shape that is essentially a group consisting of three other shapes each with different filling. /// You need to use groups to have shapes that mix different fill, or stroke styles. /// </summary> /// <returns></returns> protected NShape CreateCoffeeCupShape() { // create the points and paths from which the shape consits NPoint[] cupPoints = new NPoint[] { new NPoint(45, 268), new NPoint(63, 331), new NPoint(121, 331), new NPoint(140, 268) }; NGraphicsPath handleGraphicsPath = new NGraphicsPath(); handleGraphicsPath.AddClosedCurve(new NPoint[] { new NPoint(175, 295), new NPoint(171, 278), new NPoint(140, 283), new NPoint(170, 290), new NPoint(128, 323) }, 1); NGraphicsPath steamGraphicsPath = new NGraphicsPath(); steamGraphicsPath.AddCubicBeziers(new NPoint[] { new NPoint(92, 270), new NPoint(53, 163), new NPoint(145, 160), new NPoint(86, 50), new NPoint(138, 194), new NPoint(45, 145), new NPoint(92, 270) }); steamGraphicsPath.CloseFigure(); // calculate some bounds NRectangle handleBounds = handleGraphicsPath.ExactBounds; NRectangle cupBounds = NGeometry2D.GetBounds(cupPoints); NRectangle steamBounds = steamGraphicsPath.ExactBounds; NRectangle geometryBounds = NRectangle.Union(cupBounds, handleBounds, steamBounds); // normalize the points and paths by transforming them to relative coordinates NRectangle normalRect = new NRectangle(0, 0, 1, 1); NMatrix transform = NMatrix.CreateBoundsStretchMatrix(geometryBounds, normalRect); transform.TransformPoints(cupPoints); handleGraphicsPath.Transform(transform); steamGraphicsPath.Transform(transform); // create the cup shape NDrawPolygon cupPolygon = new NDrawPolygon(normalRect, cupPoints); cupPolygon.Relative = true; NShape cupShape = new NShape(); cupShape.Init2DShape(); cupShape.Geometry.Fill = new NColorFill(NColor.Brown); cupShape.Geometry.Add(cupPolygon); cupShape.SetBounds(geometryBounds); // create the cup handle NDrawPath handlePath = new NDrawPath(normalRect, handleGraphicsPath); handlePath.Relative = true; NShape handleShape = new NShape(); handleShape.Init2DShape(); handleShape.Geometry.Fill = new NColorFill(NColor.LightSalmon); handleShape.Geometry.Add(handlePath); handleShape.SetBounds(geometryBounds); // create the steam NDrawPath steamPath = new NDrawPath(steamGraphicsPath.Bounds, steamGraphicsPath); steamPath.Relative = true; NShape steamShape = new NShape(); steamShape.Init2DShape(); steamShape.Geometry.Fill = new NColorFill(new NColor(50, 122, 122, 122)); steamShape.Geometry.Add(steamPath); steamShape.SetBounds(geometryBounds); // group the shapes as a single group NGroup group; NBatchGroup batch = new NBatchGroup(m_DrawingDocument); batch.Build(cupShape, handleShape, steamShape); batch.Group(null, out group); // alter some properties of the group group.SelectionMode = ENGroupSelectionMode.GroupOnly; group.SnapToShapes = false; return(group); }