Beispiel #1
0
        internal static List <SlicePolyLine3D> GetZIntersections(List <Triangle> triangles, float zcur)
        {
            try
            {
                SlicePolyLine3D s3d      = null;
                var             lstlines = new List <SlicePolyLine3D>();

                for (var triangleIndex = 0; triangleIndex < triangles.Count; triangleIndex++)
                {
                    var triangle = triangles[triangleIndex];
                    s3d = triangle.IntersectZPlane(zcur);
                    if (s3d != null)
                    {
                        s3d.Normal             = triangle.Normal;
                        s3d.TriangleConnection = triangle.Index;
                        lstlines.Add(s3d);
                    }
                }
                return(lstlines);
            }
            catch (Exception)
            {
                return(null);
            }
        }
 public static List <SlicePolyLine3D> GetZIntersections(List <Triangle> triangles, float zcur)
 {
     try
     {
         SlicePolyLine3D s3d      = null;
         var             lstlines = new List <SlicePolyLine3D>();
         foreach (var triangle in triangles)
         {
             s3d = triangle.IntersectZPlane(zcur);
             if (s3d != null)
             {
                 lstlines.Add(s3d);
             }
         }
         return(lstlines);
     }
     catch (Exception)
     {
         return(null);
     }
 }
        public static void RenderSliceToPolygons(Slices.Slice slice, Slices.RenderSliceInfo renderSlice)
        {
            var pixelValues = new byte[renderSlice.PrinterResolutionX * renderSlice.PrinterResolutionY];
            var pixelLength = pixelValues.Length;
            //        Array.Clear(pixelValues, 0, pixelLength);

            int          beginPixel      = 0;
            int          beginPixelOfRow = 0;
            int          endPixel        = 0;
            int          endPixelOfRow   = 0;
            SlicePoint2D p1;
            SlicePoint2D p2;

            //model points
            if (slice.ModelPoints.Count % 2 == 0)
            {
                for (int cnt = 0; cnt < slice.ModelPoints.Count; cnt += 2)      // increment by 2
                {
                    p1 = slice.ModelPoints[cnt];
                    p2 = slice.ModelPoints[cnt + 1];
                    if (p1.X > p2.X)     //flip over
                    {
                        var pTemp = p1;
                        p1 = p2;
                        p2 = pTemp;
                    }
                    p1.X++;

                    if (p1.X <= p2.X)
                    {
                        if (p2.Y >= 0 && p1.Y >= 0)
                        {
                            beginPixel      = (p1.Y * renderSlice.PrinterResolutionX + p1.X);
                            beginPixelOfRow = (((p1.Y) * renderSlice.PrinterResolutionX));
                            if (p1.X < 0)
                            {
                                beginPixel = (p1.Y * renderSlice.PrinterResolutionX);
                            }

                            //get end pixel of row
                            endPixel      = ((p2.Y * renderSlice.PrinterResolutionX + p2.X));
                            endPixelOfRow = (((p1.Y + 1) * renderSlice.PrinterResolutionX)) - 1;

                            if (endPixel > endPixelOfRow)
                            {
                                endPixel = endPixelOfRow;
                            }

                            if (pixelValues.Length - 1 >= beginPixel && beginPixel >= 0)
                            {
                                pixelValues[beginPixel] = 255;
                            }

                            if (p2.X < 0)
                            {
                                endPixel = ((p2.Y * renderSlice.PrinterResolutionX));
                            }

                            //fill color between begin and endpoints
                            if (pixelValues.Length - 1 >= endPixel && endPixel >= 0)
                            {
                                pixelValues[endPixel] = 255;

                                if (beginPixel < endPixel)
                                {
                                    for (var betweenPixel = beginPixel + 1; betweenPixel < endPixel; betweenPixel++)
                                    {
                                        if (betweenPixel >= 0)
                                        {
                                            pixelValues[betweenPixel] = 255;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (slice.SupportPoints.Count % 2 == 0)                          // is even
            {
                for (int cnt = 0; cnt < slice.SupportPoints.Count; cnt += 2) // increment by 2
                {
                    p1 = slice.SupportPoints[cnt];
                    p2 = slice.SupportPoints[cnt + 1];
                    if (p1.X > p2.X)     //flip over
                    {
                        var pTemp = p1;
                        p1 = p2;
                        p2 = pTemp;
                    }
                    p1.X++;

                    if (p1.X <= p2.X)
                    {
                        if (p2.Y >= 0 && p1.Y >= 0)
                        {
                            beginPixel      = (p1.Y * renderSlice.PrinterResolutionX + p1.X);
                            beginPixelOfRow = (((p1.Y) * renderSlice.PrinterResolutionX));
                            if (p1.X < 0)
                            {
                                beginPixel = (p1.Y * renderSlice.PrinterResolutionX);
                            }

                            //get end pixel of row
                            endPixel      = ((p2.Y * renderSlice.PrinterResolutionX + p2.X));
                            endPixelOfRow = (((p1.Y + 1) * renderSlice.PrinterResolutionX));

                            if (endPixel > endPixelOfRow)
                            {
                                endPixel = endPixelOfRow;
                            }

                            if (pixelValues.Length - 1 >= beginPixel && beginPixel >= 0)
                            {
                                pixelValues[beginPixel] = 255;
                            }

                            if (p2.X < 0)
                            {
                                endPixel = ((p2.Y * renderSlice.PrinterResolutionX));
                            }

                            if (pixelValues.Length - 1 >= endPixel && endPixel >= 0)
                            {
                                pixelValues[endPixel] = 255;

                                if (beginPixel < endPixel)
                                {
                                    for (var betweenPixel = beginPixel + 1; betweenPixel < endPixel; betweenPixel++)
                                    {
                                        if (betweenPixel >= 0)
                                        {
                                            pixelValues[betweenPixel] = 255;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            else      // flag error
            {
                Console.WriteLine("Row y=" + " odd # of points = " + slice.SupportPoints.Count + " - Model may have holes");
            }

            //convert pixel values to polylines
            for (var pixelRowIndex = 0; pixelRowIndex < renderSlice.PrinterResolutionY; pixelRowIndex++)
            {
                var beginRowIndex       = renderSlice.PrinterResolutionX * pixelRowIndex;
                var startOfPolygon      = false;
                var startOfPolygonIndex = 0;
                var endOfPolygonIndex   = 0;

                for (var pixelColumnIndex = 0; pixelColumnIndex < renderSlice.PrinterResolutionX; pixelColumnIndex++)
                {
                    if (pixelValues[beginRowIndex + pixelColumnIndex] == 255)
                    {
                        if (!startOfPolygon)
                        {
                            startOfPolygon      = true;
                            startOfPolygonIndex = pixelColumnIndex;
                        }
                    }
                    else if (pixelValues[beginRowIndex + pixelColumnIndex] == 0)
                    {
                        if (startOfPolygon)
                        {
                            endOfPolygonIndex = pixelColumnIndex;
                            startOfPolygon    = false;

                            //add polygon to return list
                            var slicePolygon = new SlicePolyLine3D();
                            slicePolygon.Points.Add(new Vector3(startOfPolygonIndex, pixelRowIndex, renderSlice.SliceHeight));
                            slicePolygon.Points.Add(new Vector3(endOfPolygonIndex, pixelRowIndex, renderSlice.SliceHeight));
                            SimulationPolyLines.Add(slicePolygon);
                        }
                    }
                }
            }



            lock (_totalProcessedSlicesLock)
            {
                TotalProcessedSlices++;
            }

            if (TotalProcessedSlices == TotalAmountSlices)
            {
                if (SimulationPrintJobCompleted != null)
                {
                    //convert polygons to vectors
                    STLModel           = new STLModel3D(STLModel3D.TypeObject.Model, true);
                    STLModel.Triangles = new TriangleInfoList();

                    var triangleIndex = 0;
                    var arrayIndex    = 0;
                    foreach (var polyLine in SimulationPolyLines)
                    {
                        if (polyLine != null)
                        {
                            var polygonCube = new Shapes.Cube(polyLine.Points[1].X - polyLine.Points[0].X + 1, polyLine.Points[1].Y - polyLine.Points[0].Y + 1, 1);
                            //Console.WriteLine(polygonCube.Center);
                            for (var cubeVertexIndex = 0; cubeVertexIndex < polygonCube.VertexArray.Length; cubeVertexIndex += 3)
                            {
                                var triangle = new Triangle();
                                triangle.Normal = polygonCube.VertexArray[cubeVertexIndex].Normal;

                                triangle.Vectors[0].Position = new Vector3(-48, -20, 0);
                                triangle.Vectors[0].Normal   = triangle.Vectors[1].Normal = triangle.Vectors[2].Normal = triangle.Normal;
                                triangle.Vectors[0].Color    = triangle.Vectors[1].Color = triangle.Vectors[2].Color = new Byte4()
                                {
                                    A = 128, B = 255
                                };
                                triangle.Vectors[1].Position = new Vector3(-48, -20, 0);
                                triangle.Vectors[2].Position = new Vector3(-48, -20, 0);


                                triangle.Vectors[0].Position += polygonCube.VertexArray[cubeVertexIndex].Position / 20;
                                triangle.Vectors[1].Position += polygonCube.VertexArray[cubeVertexIndex + 1].Position / 20;
                                triangle.Vectors[2].Position += polygonCube.VertexArray[cubeVertexIndex + 2].Position / 20;

                                //add 0 point
                                triangle.Vectors[0].Position += new Vector3(polyLine.Points[0].X / 20, polyLine.Points[0].Y / 20, polyLine.Points[0].Z);
                                triangle.Vectors[1].Position += new Vector3(polyLine.Points[0].X / 20, polyLine.Points[0].Y / 20, polyLine.Points[0].Z);
                                triangle.Vectors[2].Position += new Vector3(polyLine.Points[0].X / 20, polyLine.Points[0].Y / 20, polyLine.Points[0].Z);

                                if (triangleIndex > 33333)
                                {
                                    IsReadyForRendering = true;
                                    break;
                                    triangleIndex = 0;
                                    arrayIndex++;
                                    STLModel.Triangles.Add(new List <Triangle>());
                                }

                                triangleIndex++;
                                STLModel.Triangles[arrayIndex].Add(triangle);
                            }
                        }
                    }

                    IsReadyForRendering = true;
                    SimulationPrintJobCompleted(null, null);
                }
            }
        }