Exemplo n.º 1
0
        public void Export_SwitchYZ_False()
        {
            var originalMesh = new MeshGeometry3D
            {
                Positions       = { new Point3D(0, 1, 0) },
                Normals         = { new Vector3D(0, 1, 0) },
                TriangleIndices = { 0, 0, 0 }
            };

            byte[] buffer;

            using (var memory = new MemoryStream())
                using (var writer = new StreamWriter(memory))
                {
                    var exporter = new ObjExporter();
                    exporter.SwitchYZ      = false;
                    exporter.ExportNormals = true;
                    exporter.ExportMesh(writer, originalMesh, Transform3D.Identity);

                    writer.Flush();
                    buffer = memory.ToArray();
                }

            Model3DGroup modelGroup;

            using (var memory = new MemoryStream(buffer))
            {
                var reader = new ObjReader();
                reader.SwitchYZ = false;
                modelGroup      = reader.Read(memory);
            }

            var model3D   = (GeometryModel3D)modelGroup.Children[0];
            var modelMesh = (MeshGeometry3D)model3D.Geometry;

            Assert.AreEqual(originalMesh.Positions[0], modelMesh.Positions[0]);
            Assert.AreEqual(originalMesh.Normals[0], modelMesh.Normals[0]);
        }
Exemplo n.º 2
0
        public void Export(MeshGeometryModel3D[] modelList, string filename, string texturePath = "", bool exportTexture = false)
        {
            var path = Path.GetDirectoryName(filename);

            var objFile = filename;

            var mtlFile = path + @"\" + Path.GetFileNameWithoutExtension(filename) + ".mtl";

            int offset = 0;

            var objWriter = new StreamWriter(objFile);

            StreamWriter mtlWriter = null;

            if (exportTexture)
            {
                mtlWriter = new StreamWriter(mtlFile);
            }

            if (exportTexture)
            {
                objWriter.WriteLine("mtllib " + Path.GetFileName(mtlFile));
                objWriter.WriteLine();
            }

            objWriter.WriteLine("o " + Path.GetFileNameWithoutExtension(filename));

            var translate = -findPointOfGravity(modelList);

            foreach (var element in modelList)
            {
                var modelName = IfcViewerWrapper.GetValidPathName(element.Name);

                var tmpFile = path + @"\" + modelName + ".obj";

                List <string> vList  = new List <string>();
                List <string> vtList = new List <string>();
                List <string> vnList = new List <string>();

                List <string> fList = new List <string>();

                var exp = new ObjExporter(tmpFile);
                exp.ExportNormals = true;

                exp.ExportMesh((MeshGeometry3D)element.Geometry, Transform3D.Identity);
                exp.Close();

                using (StreamReader sr = File.OpenText(tmpFile))
                {
                    string s = "";
                    while ((s = sr.ReadLine()) != null)
                    {
                        switch (s.Split(' ')[0])
                        {
                        case "v":
                            var e  = s.Split(' ');
                            var sl = "v " + (Convert.ToDouble(e[1]) + translate.X) + " " + (-Convert.ToDouble(e[3]) + translate.Y) + " " + (Convert.ToDouble(e[2]) + translate.Z);
                            vList.Add(sl);
                            break;

                        case "vt":
                            vtList.Add(s);
                            break;

                        case "vn":
                            vnList.Add(s);
                            break;

                        case "f":
                            var split = s.Split(' ');
                            var st    = "f ";
                            for (int i = 3; i > 0; i--)
                            {
                                var ad = split[i].Split('/');
                                st += (Convert.ToInt32(ad[0]) + offset) + "/" +
                                      (Convert.ToInt32(ad[2]) + offset) +
                                      "/" + (Convert.ToInt32(ad[1]) + offset) + " ";
                            }
                            fList.Add(st);
                            break;
                        }
                    }
                }

                File.Delete(tmpFile);

                var tmpMtlFile = Path.GetFileName(tmpFile).Split('.');
                tmpMtlFile[tmpMtlFile.Length - 1] = "mtl";
                File.Delete(Path.GetDirectoryName(tmpFile) + @"\" + String.Join(".", tmpMtlFile));

                offset += vList.Count;

                objWriter.WriteLine();
                objWriter.WriteLine("g " + modelName);

                foreach (var line in vList)
                {
                    objWriter.WriteLine(line);
                }

                foreach (var line in vtList)
                {
                    objWriter.WriteLine(line);
                }

                foreach (var line in vnList)
                {
                    objWriter.WriteLine(line);
                }

                if (exportTexture)
                {
                    objWriter.WriteLine();
                    objWriter.WriteLine("usemtl material_" + modelName);
                }

                foreach (var f in fList)
                {
                    objWriter.WriteLine(f);
                }

                if (exportTexture)
                {
                    mtlWriter.WriteLine("newmtl material_" + modelName + "\n" +
                                        "Ks 0.000 0.000 0.000     # black (off)" + "\n" +
                                        "map_Kd " + modelName + ".jpg" + "\n");
                }

                var textureFile = texturePath + @"\" + modelName + ".jpg";

                if (!texturePath.Equals("") && File.Exists(textureFile))
                {
                    File.Copy(textureFile, path + @"\" + Path.GetFileName(textureFile));
                }
            }

            objWriter.Close();

            if (exportTexture)
            {
                mtlWriter.Close();
            }
        }