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]); }
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(); } }