예제 #1
0
        private WW.Math.Geometry.Polyline3D method_14(GraphicsConfig graphicsConfig)
        {
            double num1    = 2.0 * System.Math.PI / (double)graphicsConfig.NoOfArcLineSegments;
            double double2 = this.double_2;
            double double3 = this.double_3;

            if (double3 <= double2)
            {
                double3 += 2.0 * System.Math.PI;
            }
            Matrix4D transform = this.Transform;
            Vector3D vector3D0 = this.vector3D_0;

            vector3D0.Normalize();
            Vector3D vector3D = Vector3D.CrossProduct(this.vector3D_1, vector3D0);

            vector3D.Normalize();
            double length = this.vector3D_0.GetLength();
            double num2   = this.double_1 * length;

            WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D();
            for (; double2 < double3; double2 += num1)
            {
                WW.Math.Point3D point = (WW.Math.Point3D)(length * System.Math.Cos(double2) * vector3D0 + num2 * System.Math.Sin(double2) * vector3D);
                polyline3D.Add(transform.Transform(point));
            }
            polyline3D.Add(transform.Transform((WW.Math.Point3D)(length * System.Math.Cos(double3) * vector3D0 + num2 * System.Math.Sin(double3) * vector3D)));
            return(polyline3D);
        }
예제 #2
0
파일: DxfCircle.cs 프로젝트: 15831944/WW
        private WW.Math.Geometry.Polyline3D method_14(
            GraphicsConfig graphicsConfig,
            double startAngle,
            double endAngle)
        {
            double   num1 = 2.0 * System.Math.PI / (double)graphicsConfig.NoOfArcLineSegments;
            double   num2 = startAngle;
            Matrix4D denormalizationTransform = this.DenormalizationTransform;

            WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D();
            if ((endAngle - num2) / num1 < (double)graphicsConfig.NoOfArcLineSegmentsMinimum)
            {
                double lineSegmentsMinimum = (double)graphicsConfig.NoOfArcLineSegmentsMinimum;
                double a = (endAngle - num2) / lineSegmentsMinimum;
                if (!MathUtil.AreApproxEqual(a, 0.0))
                {
                    num1 = a;
                }
            }
            for (; num2 <= endAngle; num2 += num1)
            {
                WW.Math.Point2D point = new WW.Math.Point2D(System.Math.Cos(num2), System.Math.Sin(num2));
                polyline3D.Add(denormalizationTransform.TransformTo3D4x3(point));
            }
            polyline3D.Add(denormalizationTransform.TransformTo3D4x3(new WW.Math.Point2D(System.Math.Cos(endAngle), System.Math.Sin(endAngle))));
            return(polyline3D);
        }
예제 #3
0
        private void method_22(
            IList <WW.Math.Geometry.Polyline3D> polylines,
            int mNoOfSplineLineParts,
            int nNoOfSplineLineParts)
        {
            WW.Math.Point3D[,] point3DArray = this.method_23(mNoOfSplineLineParts, nNoOfSplineLineParts);
            int  length1            = point3DArray.GetLength(0);
            int  length2            = point3DArray.GetLength(1);
            bool closedInNdirection = this.ClosedInNDirection;

            for (int index1 = 0; index1 < length1; ++index1)
            {
                WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(closedInNdirection);
                polylines.Add(polyline3D);
                for (int index2 = 0; index2 < length2; ++index2)
                {
                    polyline3D.Add(point3DArray[index1, index2]);
                }
            }
            bool closedInMdirection = this.ClosedInMDirection;

            for (int index1 = 0; index1 < length2; ++index1)
            {
                WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(closedInMdirection);
                polylines.Add(polyline3D);
                for (int index2 = 0; index2 < length1; ++index2)
                {
                    polyline3D.Add(point3DArray[index2, index1]);
                }
            }
        }
예제 #4
0
        private WW.Math.Geometry.Polyline3D method_18(int power, int noOfSplineLineParts)
        {
            WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(this.Closed);
            int count = this.dxfVertex3DCollection_0.Count;

            if (count < power + 1)
            {
                return(this.method_17());
            }
            BSplineD bsplineD = new BSplineD(power, count, this.Closed);

            double[] result = new double[power + 1];
            double   maxU   = bsplineD.MaxU;
            int      num1   = noOfSplineLineParts + 1;
            double   num2   = maxU / (double)(num1 - 1);
            int      num3   = 0;
            double   u      = 0.0;

            while (num3 < num1)
            {
                int knotSpanIndex = bsplineD.GetKnotSpanIndex(u);
                bsplineD.EvaluateBasisFunctions(knotSpanIndex, u, result);
                WW.Math.Point3D zero = WW.Math.Point3D.Zero;
                for (int index = 0; index < power + 1; ++index)
                {
                    DxfVertex3D dxfVertex3D = this.dxfVertex3DCollection_0[(knotSpanIndex - power + index) % count];
                    zero += result[index] * (Vector3D)dxfVertex3D.Position;
                }
                polyline3D.Add(zero);
                ++num3;
                u += num2;
            }
            return(polyline3D);
        }
예제 #5
0
        private void method_13(IList <WW.Math.Geometry.Polyline3D> polylines)
        {
            foreach (DxfMeshFace dxfMeshFace in this.list_0)
            {
                int count = dxfMeshFace.Corners.Count;
                if (count > 0)
                {
                    DxfMeshFace.Corner corner1 = dxfMeshFace.Corners[0];
                    int num;
                    switch (count)
                    {
                    case 1:
                        WW.Math.Geometry.Polyline3D polyline3D1 = new WW.Math.Geometry.Polyline3D(new WW.Math.Point3D[1] {
                            corner1.Vertex.Position
                        });
                        polylines.Add(polyline3D1);
                        continue;

                    case 2:
                        num = 1;
                        break;

                    default:
                        num = count;
                        break;
                    }
                    for (int index = 0; index < num; ++index)
                    {
                        DxfMeshFace.Corner corner2 = dxfMeshFace.Corners[(index + 1) % count];
                        if (corner1.EdgeVisible)
                        {
                            WW.Math.Geometry.Polyline3D polyline3D2 = new WW.Math.Geometry.Polyline3D();
                            polylines.Add(polyline3D2);
                            if (corner1.Vertex != null)
                            {
                                polyline3D2.Add(corner1.Vertex.Position);
                            }
                            if (corner2.Vertex != null)
                            {
                                polyline3D2.Add(corner2.Vertex.Position);
                            }
                        }
                        corner1 = corner2;
                    }
                }
            }
        }
예제 #6
0
 private WW.Math.Geometry.Polyline3D method_13()
 {
     WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(this.Closed);
     foreach (DxfVertex3D dxfVertex3D in (DxfHandledObjectCollection <DxfVertex3D>) this.dxfVertex3DCollection_0)
     {
         polyline3D.Add(dxfVertex3D.Position);
     }
     return(polyline3D);
 }
예제 #7
0
        public Polyline3D ToPolyline3D()
        {
            Polyline3D polyline3D = new Polyline3D(this.Count, this.Closed);

            foreach (Vector4D vector4D in (List <Vector4D>) this)
            {
                polyline3D.Add(vector4D.ToPoint3D());
            }
            return(polyline3D);
        }
예제 #8
0
파일: Polyline3D.cs 프로젝트: 15831944/WW
        public Polyline3D GetReverse()
        {
            Polyline3D polyline3D = new Polyline3D(this.Count, this.Closed);

            for (int index = this.Count - 1; index >= 0; --index)
            {
                polyline3D.Add(this[index]);
            }
            return(polyline3D);
        }
예제 #9
0
파일: Polyline3D.cs 프로젝트: 15831944/WW
        public static Polyline3D GetSubPolyline(IList <Point3D> points, int start, int length)
        {
            Polyline3D polyline3D = new Polyline3D(length);
            int        num        = start + length;

            for (int index = start; index < num; ++index)
            {
                polyline3D.Add(points[index]);
            }
            return(polyline3D);
        }
예제 #10
0
        private WW.Math.Geometry.Polyline3D method_13()
        {
            WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(true);
            Matrix4D transform = this.Transform;

            polyline3D.Add(transform.Transform(this.list_0[0]));
            polyline3D.Add(transform.Transform(this.list_0[1]));
            if (this.list_0.Count == 3)
            {
                polyline3D.Add(transform.Transform(this.list_0[2]));
            }
            else
            {
                if (this.list_0[3] != this.list_0[0] && this.list_0[3] != this.list_0[2])
                {
                    polyline3D.Add(transform.Transform(this.list_0[3]));
                }
                polyline3D.Add(transform.Transform(this.list_0[2]));
            }
            return(polyline3D);
        }
예제 #11
0
 internal static void Extrude(
     WW.Cad.Drawing.Surface.Geometry geometry,
     WW.Math.Geometry.Polyline3D polyline,
     bool isSurface,
     Vector3D extrusion)
 {
     if (polyline.Count == 1)
     {
         WW.Math.Point3D start = polyline[0];
         geometry.Add((IPrimitive) new WW.Cad.Drawing.Surface.Segment(start, start + extrusion));
     }
     else if (polyline.Count == 2)
     {
         WW.Math.Point3D v0 = polyline[0];
         WW.Math.Point3D v1 = polyline[1];
         geometry.Add((IPrimitive) new Quad(v0, v1, v1 + extrusion, v0 + extrusion));
     }
     else if (isSurface)
     {
         Class940.smethod_22(geometry, (IList <WW.Math.Point3D>)polyline);
         WW.Math.Point3D             v1         = polyline[polyline.Count - 1];
         WW.Math.Point3D             v2         = v1 + extrusion;
         WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(polyline.Count, polyline.Closed);
         for (int index = 0; index < polyline.Count; ++index)
         {
             WW.Math.Point3D v0 = polyline[index];
             WW.Math.Point3D v3 = v0 + extrusion;
             polyline3D.Add(v3);
             geometry.Add((IPrimitive) new Quad(v0, v1, v2, v3));
             v1 = v0;
             v2 = v3;
         }
         Class940.smethod_22(geometry, (IList <WW.Math.Point3D>)polyline3D);
     }
     else
     {
         WW.Math.Point3D             v1         = polyline[polyline.Count - 1];
         WW.Math.Point3D             v2         = v1 + extrusion;
         WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(polyline.Count, polyline.Closed);
         for (int index = 0; index < polyline.Count; ++index)
         {
             WW.Math.Point3D v0 = polyline[index];
             WW.Math.Point3D v3 = v0 + extrusion;
             polyline3D.Add(v3);
             geometry.Add((IPrimitive) new Quad(v0, v1, v2, v3));
             v1 = v0;
             v2 = v3;
         }
     }
 }
예제 #12
0
파일: DxfWipeout.cs 프로젝트: 15831944/WW
        private WW.Math.Geometry.Polyline3D method_17(DrawContext.Surface context)
        {
            Polygon2D clipBoundary = this.GetClipBoundary((DrawContext)context);

            if (clipBoundary == null || clipBoundary.Count == 0)
            {
                return(new WW.Math.Geometry.Polyline3D());
            }
            Matrix4D matrix4D = this.method_15();

            WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(true);
            foreach (WW.Math.Point2D point in (List <WW.Math.Point2D>)clipBoundary)
            {
                polyline3D.Add(matrix4D.TransformTo3D(point));
            }
            return(polyline3D);
        }
예제 #13
0
        public override void DrawInternal(
            DrawContext.Wireframe context,
            IWireframeGraphicsFactory graphicsFactory)
        {
            if (this.list_0.Count <= 0)
            {
                return;
            }
            Polygon2D clipBoundary = this.GetClipBoundary((DrawContext)context);

            if (clipBoundary == null)
            {
                return;
            }
            Matrix4D             preTransform        = this.method_15();
            IClippingTransformer clippingTransformer = (IClippingTransformer)context.GetTransformer().Clone();

            clippingTransformer.SetPreTransform(preTransform);
            Matrix4D matrix = clippingTransformer.Matrix;

            WW.Math.Point3D point             = new WW.Math.Point3D(-0.5, -0.5, 0.0);
            Vector4D        transformedOrigin = matrix.TransformTo4D(point);
            Vector4D        transformedXAxis  = matrix.TransformTo4D(point + WW.Math.Vector3D.XAxis);
            Vector4D        transformedYAxis  = matrix.TransformTo4D(point + WW.Math.Vector3D.YAxis);

            WW.Math.Geometry.Polyline3D polyline = new WW.Math.Geometry.Polyline3D(true);
            foreach (WW.Math.Point2D point2D in (List <WW.Math.Point2D>)clipBoundary)
            {
                polyline.Add((WW.Math.Point3D)point2D);
            }
            IList <Polyline4D> polyline4DList = clippingTransformer.Transform(polyline, true);

            if (polyline4DList.Count <= 0)
            {
                return;
            }
            Polyline4D imageBoundary = polyline4DList[0];

            graphicsFactory.CreateImage(this, context, this.bool_2 ? imageBoundary : (Polyline4D)null, imageBoundary, transformedOrigin, transformedXAxis, transformedYAxis);
        }
예제 #14
0
 public override void DrawInternal(
     DrawContext.Surface context,
     ISurfaceGraphicsFactory graphicsFactory)
 {
     if (this.list_0.Count <= 0)
     {
         return;
     }
     graphicsFactory.SetColor(context.GetPlotColor((DxfEntity)this));
     foreach (DxfMeshFace dxfMeshFace in this.list_0)
     {
         WW.Math.Geometry.Polyline3D boundary = new WW.Math.Geometry.Polyline3D(4);
         List <bool> edgeVisibleList          = new List <bool>(4);
         foreach (DxfMeshFace.Corner corner in dxfMeshFace.Corners)
         {
             if (corner.Vertex != null)
             {
                 boundary.Add(corner.Vertex.Position);
                 edgeVisibleList.Add(corner.EdgeVisible);
             }
         }
         Class940.smethod_18((DxfEntity)this, context, graphicsFactory, boundary, edgeVisibleList);
     }
 }
예제 #15
0
        public override void DrawInternal(
            DrawContext.Wireframe context,
            IWireframeGraphicsFactory2 graphicsFactory)
        {
            if (this.list_0.Count > 0)
            {
                Bounds2D             bounds2D            = this.method_14((DrawContext)context);
                Matrix4D             preTransform        = this.method_15();
                IClippingTransformer clippingTransformer = (IClippingTransformer)context.GetTransformer().Clone();
                clippingTransformer.SetPreTransform(preTransform);
                Vector4D?nullable1 = clippingTransformer.Transform(WW.Math.Point3D.Zero);
                Vector4D?nullable2 = clippingTransformer.Transform(WW.Math.Point3D.Zero + WW.Math.Vector3D.XAxis);
                Vector4D?nullable3 = clippingTransformer.Transform(WW.Math.Point3D.Zero + WW.Math.Vector3D.YAxis);
                if (this.ImageDef != null && nullable1.HasValue && (nullable2.HasValue && nullable3.HasValue))
                {
                    graphicsFactory.BeginGeometry((DxfEntity)this, context, ArgbColor.Empty, false, false, false, true);
                    graphicsFactory.CreateImage(this, bounds2D.Corner1, bounds2D.Corner2, nullable1.Value, nullable2.Value, nullable3.Value, context);
                    graphicsFactory.EndGeometry();
                }
            }
            if (this.ImageDef != null && !context.Config.DrawImageFrame)
            {
                return;
            }
            Polygon2D clipBoundary = this.GetClipBoundary((DrawContext)context);

            if (clipBoundary == null)
            {
                return;
            }
            Matrix4D             preTransform1        = this.method_15();
            IClippingTransformer clippingTransformer1 = (IClippingTransformer)context.GetTransformer().Clone();

            clippingTransformer1.SetPreTransform(preTransform1);
            WW.Math.Geometry.Polyline3D polyline1 = new WW.Math.Geometry.Polyline3D(true);
            foreach (WW.Math.Point2D point2D in (List <WW.Math.Point2D>)clipBoundary)
            {
                polyline1.Add((WW.Math.Point3D)point2D);
            }
            List <Polyline4D> polyline4DList = new List <Polyline4D>((IEnumerable <Polyline4D>)clippingTransformer1.Transform(polyline1, true));

            if (this.ImageDef == null)
            {
                graphicsFactory.BeginGeometry((DxfEntity)this, context, context.Config.BackColor, false, true, false, false);
                foreach (Polyline4D polyline2 in polyline4DList)
                {
                    graphicsFactory.CreatePolyline((DxfEntity)this, polyline2);
                }
                graphicsFactory.EndGeometry();
            }
            if (this.ImageDef != null && !context.Config.DrawImageFrame)
            {
                return;
            }
            graphicsFactory.BeginGeometry((DxfEntity)this, context, this.GetColor((DrawContext)context), false, false, true, true);
            foreach (Polyline4D polyline2 in polyline4DList)
            {
                graphicsFactory.CreatePolyline((DxfEntity)this, polyline2);
            }
            graphicsFactory.EndGeometry();
        }
예제 #16
0
        private void GetPolylines4D(
            DrawContext context,
            IClippingTransformer transformer,
            out IList <Polyline4D> polylines4D,
            out IList <IShape4D> shapes)
        {
            IList <WW.Math.Geometry.Polyline3D> polyline3DList = (IList <WW.Math.Geometry.Polyline3D>) new List <WW.Math.Geometry.Polyline3D>(4);
            IList <FlatShape4D> resultShapes = (IList <FlatShape4D>)null;
            int count = this.list_0.Count;

            if (count > 1)
            {
                bool flag = true;
                if (this.FirstEdgeInvisible)
                {
                    flag = false;
                }
                if (this.SecondEdgeInvisible)
                {
                    flag = false;
                }
                if (count > 2)
                {
                    if (this.ThirdEdgeInvisible)
                    {
                        flag = false;
                    }
                    if (count > 3 && this.FourthEdgeInvisible)
                    {
                        flag = false;
                    }
                }
                if (flag)
                {
                    WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(count, count > 2);
                    for (int index = 0; index < count; ++index)
                    {
                        polyline3D.Add(this.list_0[index]);
                    }
                    polyline3DList.Add(polyline3D);
                }
                else
                {
                    if (!this.FirstEdgeInvisible)
                    {
                        polyline3DList.Add(new WW.Math.Geometry.Polyline3D(new WW.Math.Point3D[2]
                        {
                            this.list_0[0],
                            this.list_0[1]
                        }));
                    }
                    if (count > 2)
                    {
                        if (!this.SecondEdgeInvisible)
                        {
                            polyline3DList.Add(new WW.Math.Geometry.Polyline3D(new WW.Math.Point3D[2]
                            {
                                this.list_0[1],
                                this.list_0[2]
                            }));
                        }
                        if (this.Points.Count == 3)
                        {
                            if (!this.ThirdEdgeInvisible)
                            {
                                polyline3DList.Add(new WW.Math.Geometry.Polyline3D(new WW.Math.Point3D[2]
                                {
                                    this.list_0[2],
                                    this.list_0[0]
                                }));
                            }
                        }
                        else if (this.Points.Count == 4)
                        {
                            if (!this.ThirdEdgeInvisible)
                            {
                                polyline3DList.Add(new WW.Math.Geometry.Polyline3D(new WW.Math.Point3D[2]
                                {
                                    this.list_0[2],
                                    this.list_0[3]
                                }));
                            }
                            if (!this.FourthEdgeInvisible)
                            {
                                polyline3DList.Add(new WW.Math.Geometry.Polyline3D(new WW.Math.Point3D[2]
                                {
                                    this.list_0[3],
                                    this.list_0[0]
                                }));
                            }
                        }
                    }
                }
                IList <WW.Math.Geometry.Polyline3D> polylines = (IList <WW.Math.Geometry.Polyline3D>) new List <WW.Math.Geometry.Polyline3D>(4);
                resultShapes = (IList <FlatShape4D>) new List <FlatShape4D>();
                DxfUtil.smethod_2(context.Config, polyline3DList, resultShapes, polylines, this.GetLineType(context), Vector3D.ZAxis, context.TotalLineTypeScale * this.LineTypeScale, transformer.LineTypeScaler);
            }
            polylines4D = DxfUtil.smethod_36(polyline3DList, false, transformer);
            shapes      = DxfUtil.smethod_37((ICollection <FlatShape4D>)resultShapes, transformer);
        }
예제 #17
0
        internal static void Extrude(
            DxfEntity entity,
            DrawContext.Surface context,
            ISurfaceGraphicsFactory graphicsFactory,
            WW.Math.Geometry.Polyline3D polyline,
            bool isSurface,
            Vector3D extrusion)
        {
            Interface41 transformer = context.GetTransformer();

            if (polyline.Count == 1)
            {
                WW.Math.Point3D start     = polyline[0];
                Segment4D       segment4D = DxfUtil.smethod_50(new Segment3D(start, start + extrusion), transformer);
                graphicsFactory.CreateSegment(segment4D.Start, segment4D.End);
            }
            else if (polyline.Count == 2)
            {
                WW.Math.Point3D point3D1 = polyline[0];
                WW.Math.Point3D point3D2 = polyline[1];
                Polyline4D      boundary = DxfUtil.smethod_46(new WW.Math.Geometry.Polyline3D(true, new WW.Math.Point3D[4] {
                    point3D1, point3D2, point3D2 + extrusion, point3D1 + extrusion
                }), transformer);
                Class940.smethod_20(entity, context, graphicsFactory, boundary, (List <bool>)null);
            }
            else if (isSurface)
            {
                Polyline4D boundary1 = DxfUtil.smethod_46(polyline, transformer);
                Class940.smethod_20(entity, context, graphicsFactory, boundary1, (List <bool>)null);
                WW.Math.Point3D             point3D1  = polyline[polyline.Count - 1];
                WW.Math.Point3D             point3D2  = point3D1 + extrusion;
                WW.Math.Geometry.Polyline3D polyline1 = new WW.Math.Geometry.Polyline3D(polyline.Count, polyline.Closed);
                for (int index = 0; index < polyline.Count; ++index)
                {
                    WW.Math.Point3D point3D3 = polyline[index];
                    WW.Math.Point3D point3D4 = point3D3 + extrusion;
                    polyline1.Add(point3D4);
                    Polyline4D boundary2 = DxfUtil.smethod_46(new WW.Math.Geometry.Polyline3D(true, new WW.Math.Point3D[4] {
                        point3D3, point3D1, point3D2, point3D4
                    }), transformer);
                    Class940.smethod_20(entity, context, graphicsFactory, boundary2, (List <bool>)null);
                    point3D1 = point3D3;
                    point3D2 = point3D4;
                }
                Polyline4D boundary3 = DxfUtil.smethod_46(polyline1, transformer);
                Class940.smethod_20(entity, context, graphicsFactory, boundary3, (List <bool>)null);
            }
            else
            {
                WW.Math.Point3D             point3D1   = polyline[polyline.Count - 1];
                WW.Math.Point3D             point3D2   = point3D1 + extrusion;
                WW.Math.Geometry.Polyline3D polyline3D = new WW.Math.Geometry.Polyline3D(polyline.Count, polyline.Closed);
                for (int index = 0; index < polyline.Count; ++index)
                {
                    WW.Math.Point3D point3D3 = polyline[index];
                    WW.Math.Point3D point3D4 = point3D3 + extrusion;
                    polyline3D.Add(point3D4);
                    Polyline4D boundary = DxfUtil.smethod_46(new WW.Math.Geometry.Polyline3D(true, new WW.Math.Point3D[4] {
                        point3D3, point3D1, point3D2, point3D4
                    }), transformer);
                    Class940.smethod_20(entity, context, graphicsFactory, boundary, (List <bool>)null);
                    point3D1 = point3D3;
                    point3D2 = point3D4;
                }
            }
        }
예제 #18
0
파일: DxfInsert.cs 프로젝트: 15831944/WW
        private DxfInsert.Enum44 method_16(
            Matrix4D insertionTransform,
            DxfInsert.Interface46 drawHandler)
        {
            if (drawHandler.InsertCellDrawContext.Config.UseSpatialFilters)
            {
                DxfSpatialFilter spatialFilter = this.SpatialFilter;
                if (spatialFilter != null && spatialFilter.ClipBoundaryDisplayEnabled)
                {
                    Polygon2D clipPolygon = spatialFilter.GetClipBoundaryPolygon();
                    if (clipPolygon.Count < 3)
                    {
                        return(DxfInsert.Enum44.const_1);
                    }
                    if (clipPolygon.GetArea() < 0.0)
                    {
                        clipPolygon = clipPolygon.GetReverse();
                    }
                    Matrix4D         boundaryTransform     = spatialFilter.ClipBoundaryTransform;
                    Matrix4D         transform             = insertionTransform * this.Block.BaseTransformation * spatialFilter.InverseInsertionTransform;
                    Matrix4D         inverse1              = boundaryTransform.GetInverse();
                    Matrix4D         clipBoundaryTransform = transform * inverse1;
                    DxfInsert.Enum44 enum44;
                    if (clipPolygon.IsConvex())
                    {
                        List <BlinnClipper4D.ClipPlane> clipPlaneList = new List <BlinnClipper4D.ClipPlane>();
                        WW.Math.Point2D  point2D             = clipPolygon[clipPolygon.Count - 1];
                        WW.Math.Vector3D boundaryPlaneNormal = spatialFilter.ClipBoundaryPlaneNormal;
                        Matrix4D         inverse2            = transform.GetInverse();
                        inverse2.Transpose();
                        foreach (WW.Math.Point2D point in (List <WW.Math.Point2D>)clipPolygon)
                        {
                            Vector2D v = point - point2D;
                            BlinnClipper4D.ClipPlane clipPlane = new BlinnClipper4D.ClipPlane(WW.Math.Vector3D.CrossProduct(inverse1.TransformTo3D(v), boundaryPlaneNormal), inverse1.TransformTo3D(point));
                            clipPlane.TransformBy(transform, inverse2);
                            clipPlaneList.Add(clipPlane);
                            point2D = point;
                        }
                        BoundsCalculator boundsCalculator = new BoundsCalculator();
                        boundsCalculator.GetBounds(drawHandler.InsertCellDrawContext.Model, (IEnumerable <DxfEntity>) this.Block.Entities, insertionTransform * this.Block.BaseTransformation);
                        switch (new BlinnClipper4D((ICollection <BlinnClipper4D.ClipPlane>)clipPlaneList).TryIsInside(boundsCalculator.Bounds))
                        {
                        case InsideTestResult.Inside:
                            enum44 = DxfInsert.Enum44.const_2;
                            break;

                        case InsideTestResult.Outside:
                            enum44 = DxfInsert.Enum44.const_0;
                            break;

                        default:
                            enum44 = DxfInsert.Enum44.const_3;
                            break;
                        }
                        if (enum44 == DxfInsert.Enum44.const_3)
                        {
                            Class808 class808 = new Class808((ICollection <BlinnClipper4D.ClipPlane>)clipPlaneList);
                            class808.imethod_0(insertionTransform.GetInverse());
                            GraphicsConfig config = drawHandler.InsertCellDrawContext.Config;
                            ModelSpaceClippingTransformer clippingTransformer = new ModelSpaceClippingTransformer(Matrix4D.Identity, (Interface32)class808, config.ShapeFlattenEpsilon, config.ShapeFlattenEpsilonForBoundsCalculation);
                            drawHandler.InsertCellDrawContext.vmethod_0((IClippingTransformer)clippingTransformer);
                        }
                    }
                    else
                    {
                        Class455         class455         = new Class455(clipBoundaryTransform, clipPolygon, false);
                        BoundsCalculator boundsCalculator = new BoundsCalculator();
                        boundsCalculator.GetBounds(drawHandler.InsertCellDrawContext.Model, (IEnumerable <DxfEntity>) this.Block.Entities, insertionTransform * this.Block.BaseTransformation);
                        switch (class455.TryIsInside(boundsCalculator.Bounds))
                        {
                        case InsideTestResult.Inside:
                            enum44 = DxfInsert.Enum44.const_2;
                            break;

                        case InsideTestResult.Outside:
                            enum44 = DxfInsert.Enum44.const_0;
                            break;

                        default:
                            enum44 = DxfInsert.Enum44.const_3;
                            break;
                        }
                        if (enum44 == DxfInsert.Enum44.const_3)
                        {
                            Matrix4D inverse2 = insertionTransform.GetInverse();
                            class455.imethod_0(inverse2);
                            GraphicsConfig config = drawHandler.InsertCellDrawContext.Config;
                            ModelSpaceClippingTransformer clippingTransformer = new ModelSpaceClippingTransformer(Matrix4D.Identity, (Interface32)class455, config.ShapeFlattenEpsilon, config.ShapeFlattenEpsilonForBoundsCalculation);
                            drawHandler.InsertCellDrawContext.vmethod_0((IClippingTransformer)clippingTransformer);
                        }
                    }
                    if ((!spatialFilter.ClipBoundaryDisplayEnabled || drawHandler.InsertCellDrawContext.Model.Header.ExternalReferenceClippingBoundaryType == WW.Cad.Model.SimpleLineType.Off ? 0 : (this.IsEntityVisibleInContext(drawHandler.InsertCellDrawContext, true) ? 1 : 0)) != 0)
                    {
                        WW.Math.Geometry.Polyline3D polygon = new WW.Math.Geometry.Polyline3D(clipPolygon.Count);
                        foreach (WW.Math.Point2D point in (List <WW.Math.Point2D>)clipPolygon)
                        {
                            polygon.Add(clipBoundaryTransform.TransformTo3D(point));
                        }
                        polygon.Closed = true;
                        drawHandler.Draw(polygon);
                    }
                    return(enum44);
                }
            }
            return(DxfInsert.Enum44.const_1);
        }