예제 #1
0
        public static bool loadModelSTL_ascii(SimpleModel simpleModel, string filename, FMatrix3x3 matrix)
        {
            SimpleVolume vol = new SimpleVolume();
            using (StreamReader f = new StreamReader(filename))
            {
                // check for "SOLID"

                FPoint3 vertex = new FPoint3();
                int n = 0;
                Point3 v0 = new Point3(0, 0, 0);
                Point3 v1 = new Point3(0, 0, 0);
                Point3 v2 = new Point3(0, 0, 0);
                string line = f.ReadLine();
                Regex onlySingleSpaces = new Regex("\\s+", RegexOptions.Compiled);
                while (line != null)
                {
                    line = onlySingleSpaces.Replace(line, " ");
                    var parts = line.Trim().Split(' ');
                    if (parts[0].Trim() == "vertex")
                    {
                        vertex.x = Convert.ToDouble(parts[1]);
                        vertex.y = Convert.ToDouble(parts[2]);
                        vertex.z = Convert.ToDouble(parts[3]);

                        // change the scale from mm to micrometers
                        vertex *= 1000.0;

                        n++;
                        switch (n)
                        {
                            case 1:
                                v0 = matrix.apply(vertex);
                                break;

                            case 2:
                                v1 = matrix.apply(vertex);
                                break;

                            case 3:
                                v2 = matrix.apply(vertex);
                                vol.addFaceTriangle(v0, v1, v2);
                                n = 0;
                                break;
                        }
                    }
                    line = f.ReadLine();
                }
            }

            if (vol.faceTriangles.Count > 3)
            {
                simpleModel.volumes.Add(vol);
                return true;
            }

            return false;
        }
예제 #2
0
        public static bool loadModelFromFile(SimpleModel simpleModel, string filename, FMatrix3x3 matrix)
        {
            if (!loadModelSTL_ascii(simpleModel, filename, matrix))
            {
                return loadModelSTL_binary(simpleModel, filename, matrix);
            }

            return true;
        }
예제 #3
0
 public OptimizedModel(SimpleModel model)
 {
     for (int i = 0; i < model.volumes.Count; i++)
     {
         volumes.Add(new OptimizedVolume(model.volumes[i], this));
         if (MatterSlice.Canceled)
         {
             return;
         }
     }
 }
예제 #4
0
        static SimpleModel loadModelSTL_binary(string filename, FMatrix3x3 matrix)
        {
            SimpleModel m = new SimpleModel();

            using (FileStream stlStream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                // load it as a binary stl
                // skip the first 80 bytes
                // read in the number of triangles
                stlStream.Position = 0;
                BinaryReader br                = new BinaryReader(stlStream);
                byte[]       fileContents      = br.ReadBytes((int)stlStream.Length);
                int          currentPosition   = 80;
                uint         numTriangles      = System.BitConverter.ToUInt32(fileContents, currentPosition);
                long         bytesForNormals   = numTriangles * 3 * 4;
                long         bytesForVertices  = numTriangles * 3 * 4;
                long         bytesForAttributs = numTriangles * 2;
                currentPosition += 4;
                long numBytesRequiredForVertexData = currentPosition + bytesForNormals + bytesForVertices + bytesForAttributs;
                if (fileContents.Length < numBytesRequiredForVertexData || numTriangles < 4)
                {
                    stlStream.Close();
                    return(null);
                }

                m.volumes.Add(new SimpleVolume());
                SimpleVolume vol    = m.volumes[0];
                Point3[]     vector = new Point3[3];
                for (int i = 0; i < numTriangles; i++)
                {
                    // skip the normal
                    currentPosition += 3 * 4;
                    for (int j = 0; j < 3; j++)
                    {
                        vector[j] = new Point3(
                            System.BitConverter.ToSingle(fileContents, currentPosition + 0 * 4) * 1000,
                            System.BitConverter.ToSingle(fileContents, currentPosition + 1 * 4) * 1000,
                            System.BitConverter.ToSingle(fileContents, currentPosition + 2 * 4) * 1000);
                        currentPosition += 3 * 4;
                    }
                    currentPosition += 2; // skip the attribute

                    vol.addFaceTriangle(vector[2], vector[1], vector[0]);
                }
            }

            return(m);
        }
예제 #5
0
        public void SetPositionAndSize(SimpleModel model, long xCenter_um, long yCenter_um, long zClip_um, bool centerObjectInXy)
        {
            minXYZ_um = model.minXYZ_um();
            maxXYZ_um = model.maxXYZ_um();

            if (centerObjectInXy)
            {
                Point3 modelXYCenterZBottom_um = new Point3((minXYZ_um.x + maxXYZ_um.x) / 2, (minXYZ_um.y + maxXYZ_um.y) / 2, minXYZ_um.z);
                modelXYCenterZBottom_um -= new Point3(xCenter_um, yCenter_um, zClip_um);
                for (int i = 0; i < volumes.Count; i++)
                {
                    for (int n = 0; n < volumes[i].vertices.Count; n++)
                    {
                        volumes[i].vertices[n].position -= modelXYCenterZBottom_um;
                    }
                }

                minXYZ_um -= modelXYCenterZBottom_um;
                maxXYZ_um -= modelXYCenterZBottom_um;
            }
            else // we still need to put in the bottom clip
            {
                // Ofset by bed center and correctly position in z
                Point3 modelZBottom_um = new Point3(-xCenter_um, -yCenter_um, minXYZ_um.z - zClip_um);
                for (int i = 0; i < volumes.Count; i++)
                {
                    for (int n = 0; n < volumes[i].vertices.Count; n++)
                    {
                        volumes[i].vertices[n].position -= modelZBottom_um;
                    }
                }

                minXYZ_um -= modelZBottom_um;
                maxXYZ_um -= modelZBottom_um;
            }

            size_um = maxXYZ_um - minXYZ_um;
        }
예제 #6
0
        private static bool loadModelSTL_binary(SimpleModel simpleModel, string filename, FMatrix3x3 matrix)
        {
            SimpleVolume vol = new SimpleVolume();
            using (FileStream stlStream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                // load it as a binary stl
                // skip the first 80 bytes
                // read in the number of triangles
                stlStream.Position = 0;
                BinaryReader br = new BinaryReader(stlStream);
                byte[] fileContents = br.ReadBytes((int)stlStream.Length);
                int currentPosition = 80;
                uint numTriangles = System.BitConverter.ToUInt32(fileContents, currentPosition);
                long bytesForNormals = numTriangles * 3 * 4;
                long bytesForVertices = numTriangles * 3 * 4;
                long bytesForAttributs = numTriangles * 2;
                currentPosition += 4;
                long numBytesRequiredForVertexData = currentPosition + bytesForNormals + bytesForVertices + bytesForAttributs;
                if (fileContents.Length < numBytesRequiredForVertexData || numTriangles < 4)
                {
                    stlStream.Close();
                    return false;
                }

                Point3[] vector = new Point3[3];
                for (int i = 0; i < numTriangles; i++)
                {
                    // skip the normal
                    currentPosition += 3 * 4;
                    for (int j = 0; j < 3; j++)
                    {
                        vector[j] = new Point3(
                            System.BitConverter.ToSingle(fileContents, currentPosition + 0 * 4) * 1000,
                            System.BitConverter.ToSingle(fileContents, currentPosition + 1 * 4) * 1000,
                            System.BitConverter.ToSingle(fileContents, currentPosition + 2 * 4) * 1000);
                        currentPosition += 3 * 4;
                    }
                    currentPosition += 2; // skip the attribute

                    vol.addFaceTriangle(vector[2], vector[1], vector[0]);
                }
            }

            if (vol.faceTriangles.Count > 3)
            {
                simpleModel.volumes.Add(vol);
                return true;
            }

            return false;
        }