示例#1
0
        void TestValue(bool selector)
        {
            ValX v1 = new ValX();
            RefX v2 = new RefX();

            Change(selector ? (IfcX)v1 : (IfcX)v2);

            void Change(IfcX x) => x.Change();
        }
示例#2
0
        /// <summary>
        /// Common code for rendering a marker once the orientation angle has been calculated
        /// </summary>
        /// <param name="fAngle"></param>
        /// <param name="pRenderer"></param>
        /// <param name="pOwner"></param>
        /// <param name="pMarkerPoint"></param>
        private void RenderPart2(float fAngle, ISvgRenderer pRenderer, SvgVisualElement pOwner, PointF pMarkerPoint)
        {
            using (var pRenderPen = CreatePen(pOwner, pRenderer))
            {
                using (var markerPath = GetClone(pOwner))
                {
                    using (var transMatrix = new Matrix())
                    {
                        transMatrix.Translate(pMarkerPoint.X, pMarkerPoint.Y);
                        if (Orient.IsAuto)
                        {
                            transMatrix.Rotate(fAngle);
                        }
                        else
                        {
                            transMatrix.Rotate(Orient.Angle);
                        }
                        switch (MarkerUnits)
                        {
                        case SvgMarkerUnits.strokeWidth:
                            transMatrix.Translate(AdjustForViewBoxWidth(-RefX.ToDeviceValue(pRenderer, UnitRenderingType.Horizontal, this) *
                                                                        pOwner.StrokeWidth.ToDeviceValue(pRenderer, UnitRenderingType.Other, this)),
                                                  AdjustForViewBoxHeight(-RefY.ToDeviceValue(pRenderer, UnitRenderingType.Vertical, this) *
                                                                         pOwner.StrokeWidth.ToDeviceValue(pRenderer, UnitRenderingType.Other, this)));
                            break;

                        case SvgMarkerUnits.userSpaceOnUse:
                            transMatrix.Translate(-RefX.ToDeviceValue(pRenderer, UnitRenderingType.Horizontal, this),
                                                  -RefY.ToDeviceValue(pRenderer, UnitRenderingType.Vertical, this));
                            break;
                        }
                        markerPath.Transform(transMatrix);
                        if (pRenderPen != null)
                        {
                            pRenderer.DrawPath(pRenderPen, markerPath);
                        }

                        SvgPaintServer pFill     = this.Children.First().Fill;
                        SvgFillRule    pFillRule = FillRule;                                                            // TODO: What do we use the fill rule for?
                        float          fOpacity  = FillOpacity;

                        if (pFill != null)
                        {
                            using (var pBrush = pFill.GetBrush(this, pRenderer, fOpacity))
                            {
                                pRenderer.FillPath(pBrush, markerPath);
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        public override XmlElement GenerateNode(ref XmlDocument doc)
        {
            var        ci         = CultureInfo.InvariantCulture;
            XmlElement markerNode = doc.CreateElement(string.Empty, tag, string.Empty);

            SetNodeIdAttribute(ref markerNode, ref ci);
            if (MarkerWidth != 0)
            {
                markerNode.SetAttribute("markerWidth", MarkerWidth.ToString(ci));
            }
            if (MarkerHeight != 0)
            {
                markerNode.SetAttribute("markerHeight", MarkerHeight.ToString(ci));
            }
            if (Orient != null)
            {
                markerNode.SetAttribute("orient", Orient);
            }
            if (RefX != 0)
            {
                markerNode.SetAttribute("refX", RefX.ToString(ci));
            }
            if (RefY != 0)
            {
                markerNode.SetAttribute("refY", RefY.ToString(ci));
            }
            if (ViewBox != null)
            {
                markerNode.SetAttribute("viewBox", ViewBox);
            }
            SetCommonNodeAttributes(ref markerNode, ref ci);
            foreach (SvgElement elem in elements)
            {
                if (elem.CanGenerateValidSvgCode())
                {
                    markerNode.AppendChild(elem.GenerateNode(ref doc));
                }
            }
            return(markerNode);
        }
示例#4
0
        void TestArrayCast()
        {
            var intArr = new int[3];
            var refArr = new RefX[3];
            var valArr = new ValX[3];

            Console.WriteLine("Array casts: "
                              + (((object)intArr) is object[])
                              + "," + (((object)intArr) is ValueType[])
                              + "," + (((object)refArr) is object[])
                              + "," + (((object)refArr) is ValueType[])
                              + "," + (((object)valArr) is object[])
                              + "," + (((object)valArr) is ValueType[]));
            try
            {
                var objArr = (IfcX[])((object)valArr);
            }
            catch (Exception e)
            {
                Console.WriteLine("Caught exception " + e.GetType());
            }
        }
示例#5
0
        void TestArrayCast()
        {
            var intArr = new int[3];
            var refArr = new RefX[3];
            var valArr = new ValX[3];

            Console.WriteLine("Array casts: "
                              + (((object)intArr) is object[])
                              + "," + (((object)intArr) is ValueType[])
                              + "," + (((object)refArr) is object[])
                              + "," + (((object)refArr) is ValueType[])
                              + "," + (((object)valArr) is object[])
                              + "," + (((object)valArr) is ValueType[]));
            try
            {
                var objArr = (IfcX[])((object)valArr);
            }
            catch (Exception e)
            {
                Console.WriteLine("Caught exception " + e.GetType());
            }

            // test generic cast

            var tupleArray = new Tuple <int, string>[3] {
                new Tuple <int, string>(1, "one"),
                new Tuple <int, string>(2, "two"),
                new Tuple <int, string>(3, "three"),
            };
            var tupleEnum =
                ((System.Collections.Generic.IEnumerable <Tuple <int, string> >)tupleArray)
                .GetEnumerator();

            while (tupleEnum.MoveNext())
            {
                System.Console.Write(tupleEnum.Current);
            }
            System.Console.WriteLine();
        }
示例#6
0
        /// <summary>
        /// Common code for rendering a marker once the orientation angle has been calculated
        /// </summary>
        /// <param name="fAngle"></param>
        /// <param name="pRenderer"></param>
        /// <param name="pOwner"></param>
        /// <param name="pMarkerPoint"></param>
        private void RenderPart2(float fAngle, ISvgRenderer pRenderer, SvgVisualElement pOwner, PointF pMarkerPoint)
        {
            using (var pRenderPen = CreatePen(pOwner, pRenderer))
            {
                using (var markerPath = GetClone(pOwner, pRenderer))
                {
                    using (var transMatrix = new Matrix())
                    {
                        transMatrix.Translate(pMarkerPoint.X, pMarkerPoint.Y);
                        if (Orient.IsAuto)
                        {
                            transMatrix.Rotate(fAngle);
                        }
                        else
                        {
                            transMatrix.Rotate(Orient.Angle);
                        }
                        switch (MarkerUnits)
                        {
                        case SvgMarkerUnits.StrokeWidth:
                            if (ViewBox.Width > 0 && ViewBox.Height > 0)
                            {
                                transMatrix.Scale(MarkerWidth, MarkerHeight);
                                var strokeWidth = pOwner.StrokeWidth.ToDeviceValue(pRenderer, UnitRenderingType.Other, this);
                                transMatrix.Translate(AdjustForViewBoxWidth(-RefX.ToDeviceValue(pRenderer, UnitRenderingType.Horizontal, this) *
                                                                            strokeWidth),
                                                      AdjustForViewBoxHeight(-RefY.ToDeviceValue(pRenderer, UnitRenderingType.Vertical, this) *
                                                                             strokeWidth));
                            }
                            else
                            {
                                // SvgMarkerUnits.UserSpaceOnUse
                                // TODO: We know this isn't correct.
                                //        But use this until the TODOs from AdjustForViewBoxWidth and AdjustForViewBoxHeight are done.
                                //  MORE see Unit Test "MakerEndTest.TestArrowCodeCreation()"
                                transMatrix.Translate(-RefX.ToDeviceValue(pRenderer, UnitRenderingType.Horizontal, this),
                                                      -RefY.ToDeviceValue(pRenderer, UnitRenderingType.Vertical, this));
                            }
                            break;

                        case SvgMarkerUnits.UserSpaceOnUse:
                            transMatrix.Translate(-RefX.ToDeviceValue(pRenderer, UnitRenderingType.Horizontal, this),
                                                  -RefY.ToDeviceValue(pRenderer, UnitRenderingType.Vertical, this));
                            break;
                        }

                        if (MarkerElement != null && MarkerElement.Transforms != null)
                        {
                            using (var matrix = MarkerElement.Transforms.GetMatrix())
                                transMatrix.Multiply(matrix);
                        }
                        markerPath.Transform(transMatrix);
                        if (pRenderPen != null)
                        {
                            pRenderer.DrawPath(pRenderPen, markerPath);
                        }

                        SvgPaintServer pFill     = this.Children.First().Fill;
                        SvgFillRule    pFillRule = FillRule; // TODO: What do we use the fill rule for?

                        if (pFill != null)
                        {
                            using (var pBrush = pFill.GetBrush(this, pRenderer, FixOpacityValue(FillOpacity)))
                            {
                                pRenderer.FillPath(pBrush, markerPath);
                            }
                        }
                    }
                }
            }
        }
示例#7
0
        void TestLoadStore()
        {
            var intArr = new int[5];
            var refArr = new RefX[5];
            var valArr = new ValX[5];

            /*
             * Console.WriteLine("RefX castable to IfcArray? " + (refArr is IfcX[])
             + "," + (refArr is System.Collections.Generic.IList<IfcX>));
             + Console.WriteLine("ValX castable to IfcArray? " + (valArr is IfcX[])
             + "," + (valArr is System.Collections.Generic.IList<IfcX>));
             */

            intArr[3] = 10;
            refArr[3] = new RefX {
                x = 20
            };
            valArr[3] = new ValX {
                x = 30
            };

            var ref3 = refArr[3];
            var val3 = valArr[3];

            Change(refArr[3]);
            Change(valArr[3]);
            ref3.x *= 2;
            val3.x *= 2;

            Console.Write(ref3.x + "," + val3.x + "," + intArr[3] + "," + refArr[3].x + "," + valArr[3].x);
            valArr[4] = val3;
            val3      = default(ValX);
            Console.Write(" AND " + valArr[4].Print());

            valArr[3].Change();
            Console.Write(" AND " + valArr[3].Print());

            IfcX ifc3 = valArr[3];

            ifc3.Change();
            Console.Write(" AND " + valArr[3].Print());

            var ifcArr = new IfcX[3];

            ifcArr[1] = valArr[3];
            ifcArr[1].Change();
            Console.Write(" AND " + valArr[3].Print());

            void Change(IfcX x) => x.Change();

            TestGeneric <RefX>();
            TestGeneric <ValX>();
            Console.WriteLine();

            TestGeneric2 <int>();
            TestGeneric2 <bool>();
            TestGeneric2 <Exception>();
            Console.WriteLine();

            //

            object valBox  = valArr[1];
            IfcX   valBox2 = (IfcX)valBox;
            IfcX   valBox3 = valArr[1];
            ValX   valBox4 = (ValX)valBox;

            ((ValX)valBox).Change();
            valBox2.Change();
            Console.WriteLine("BOX " + valArr[1].Print() + " , " + ((IfcX)valBox).Print() + " , " + valBox2.Print() + " , " + valBox3.Print() + " , " + valBox4.Print());

            // test invalid store

            try { ((object[])(new Version[4]))[0] = new ValX(); }
            catch (Exception e) { Console.WriteLine(e.GetType()); }

            void TestGeneric <T>() where T : IfcX, new()
            {
                T[] arr = new T[5];
                arr[3] = new T();
                var x = arr[3];

                x.Change();
                arr[3].Change();
                Console.Write(" ; " + x.Print() + " vs " + arr[3].Print());
            }

            void TestGeneric2 <T>()
            {
                T[] arr = new T[5];
                arr[3] = default(T);
                foreach (var e in arr)
                {
                    Console.Write("[" + (e == null ? "null" : e.ToString()) + "]");
                }
            }
        }