Exemple #1
0
        // FIXME another example of type switching.  Cant put d2d code on other side of bridge in eg UGeometryBase abstraction
        //       and also, using a factory to create the UGeometryBase will make d2d specific versions.
        // IDEA  This is possible:  Use factory (DI?) and check the Uxxx instances when passed to this type of class, and recreate
        //       a portion of the Uxxx if it doesnt match D2D?  Factory could be configured for d2d/ogl etc.  This links in with cacheing
        //       code too? Not sure if this will static compile :/ thats kinda the point...  we'd need the Uxxx.ICreateStuff to be a specific
        //       D2D interface...could subclass... would check if(ICreateStuff is D2DCreator) as d2dcreator else Icreatestuff=new d2dcreator...
        void AppendGeometry(ref GraphicsPath path, UGeometryBase geo, NoForms.Common.Point start) // ref GraphicsPath will allow us to recreate it if we want with new.
        {
            if (geo is UArcBase)
            {
                System.Drawing.PointF[] pts;
                if (geo is UArc)
                {
                    UArc arc = geo as UArc;
                    pts = (geo.Retreive <SDGDraw>(() =>
                    {
                        var elInput = new GeometryLib.Ellipse_Input(start.X, start.Y, arc.endPoint.X, arc.endPoint.Y, arc.arcSize.width, arc.arcSize.height, arc.rotation);
                        var elSolution = new List <GeometryLib.Ellipse_Output>(GeometryLib.Ellipse.Get_X0Y0(elInput)).ToArray();
                        GeometryLib.Ellipse.SampleArc(elInput, elSolution, arc.reflex, arc.sweepClockwise, arc.resolution, out pts);
                        return(new disParr(pts));
                    }) as disParr).pts;
                }
                //else if (geo is UEasyArc)
                //{
                //    var arc = geo as UEasyArc;
                //    pts = (geo.Retreive<SDGDraw>(() =>
                //    {
                //        return new disParr(new List<System.Drawing.PointF>(EllipseLib.EasyEllipse.Generate(new EllipseLib.EasyEllipse.EasyEllipseInput()
                //        {
                //            rotation = arc.rotation,
                //            start_x = start.X,
                //            start_y = start.Y,
                //            rx = arc.arcSize.width,
                //            ry = arc.arcSize.height,
                //            t1 = arc.startAngle,
                //            t2 = arc.endAngle,
                //            resolution = arc.resolution
                //        })).ToArray());
                //    }) as disParr).pts;
                //}
                else
                {
                    throw new NotImplementedException();
                }

                // clone the data
                List <PointF> opts  = new List <PointF>(path.PointCount > 0 ? path.PathPoints : new PointF[0]);
                List <byte>   otyps = new List <byte>(path.PointCount > 0 ? path.PathTypes : new byte[0]);

                // do the types
                if (otyps.Count == 0 || otyps[otyps.Count - 1] != (byte)PathPointType.Start)
                {
                    otyps.Add((byte)PathPointType.Start);
                    opts.Add(SDGTr.trF(start));
                }
                for (int i = 0; i < pts.Length; i++)
                {
                    otyps.Add((byte)PathPointType.Line); // try to interpolate a bit?
                }
                // append new data
                opts.AddRange(pts);

                // Replace the path via reference
                path = new GraphicsPath(opts.ToArray(), otyps.ToArray(), path.FillMode);
            }
            else if (geo is ULine)
            {
                ULine line = geo as ULine;
                path.AddLine(SDGTr.trF(start), SDGTr.trF(line.endPoint));
            }
            else if (geo is UBeizer)
            {
                UBeizer beizer = geo as UBeizer;
                path.AddBezier(SDGTr.trF(start), SDGTr.trF(beizer.controlPoint1), SDGTr.trF(beizer.controlPoint2), SDGTr.trF(beizer.endPoint));
            }
            else
            {
                throw new NotImplementedException();
            }
        }
Exemple #2
0
        public void PlotGeoElement(ref Point start, UGeometryBase g, UBrush b, bool doublepoints)
        {
            setVC(b, start.X, start.Y);
            System.Drawing.PointF[] pts = new System.Drawing.PointF[0];
            var lst = start;

            if (g is ULine)
            {
                var l = g as ULine;
                pts = new System.Drawing.PointF[] { new System.Drawing.PointF(l.endPoint.X, l.endPoint.Y) };
            }
            else if (g is UBeizer)
            {
                UBeizer bez = g as UBeizer;
                var     p1  = new System.Drawing.PointF(start.X, start.Y);
                var     p2  = new System.Drawing.PointF(bez.controlPoint1.X, bez.controlPoint1.Y);
                var     p3  = new System.Drawing.PointF(bez.controlPoint2.X, bez.controlPoint2.Y);
                var     p4  = new System.Drawing.PointF(bez.endPoint.X, bez.endPoint.Y);
                pts = (g.Retreive <OTKDraw>(() => new disParr(Common.Bezier.Get2D(p1, p2, p3, p4, bez.resolution))) as disParr).pts;
            }
            else if (g is UArc)
            {
                UArc arc = g as UArc;
                pts = (g.Retreive <OTKDraw>(() =>
                {
                    var elInput = new GeometryLib.Ellipse_Input(lst.X, lst.Y, arc.endPoint.X, arc.endPoint.Y, arc.arcSize.width, arc.arcSize.height, arc.rotation);
                    var elSolution = new List <GeometryLib.Ellipse_Output>(GeometryLib.Ellipse.Get_X0Y0(elInput)).ToArray();
                    GeometryLib.Ellipse.SampleArc(elInput, elSolution, arc.reflex, arc.sweepClockwise, arc.resolution, out pts);
                    return(new disParr(pts));
                }) as disParr).pts;
            }
            //else if (g is UEasyArc)
            //{
            //    var arc = g as UEasyArc;
            //    pts = (g.Retreive<OTKDraw>(() =>
            //        {
            //            return new disParr(new List<System.Drawing.PointF>(EllipseLib.EasyEllipse.Generate(new EllipseLib.EasyEllipse.EasyEllipseInput()
            //                                {
            //                                    rotation = arc.rotation,
            //                                    start_x = lst.X,
            //                                    start_y = lst.Y,
            //                                    rx = arc.arcSize.width,
            //                                    ry = arc.arcSize.height,
            //                                    t1 = arc.startAngle,
            //                                    t2 = arc.endAngle,
            //                                    resolution = arc.resolution
            //                                })).ToArray());
            //        }) as disParr).pts;
            //}

            else
            {
                throw new NotImplementedException();
            }
            Point?sp = null;
            int   i  = 0;

            for (i = 0; i < pts.Length - 1; i++)
            {
                var p = pts[i];
                sp = new Point(p.X, p.Y);
                setVC(b, p.X, p.Y); // end last line here
                if (doublepoints)
                {
                    setVC(b, p.X, p.Y);              // start of new line
                }
            }
            if (pts.Length > 0)
            {
                sp = new Point(pts[i].X, pts[i].Y);
                setVC(b, pts[i].X, pts[i].Y); // end last line here
            }
            if (sp != null)
            {
                start.X = sp.Value.X;
                start.Y = sp.Value.Y;
            }
        }