diff --git a/src/basics/geometry3d/GbTriFaceMesh3D.cpp b/src/basics/geometry3d/GbTriFaceMesh3D.cpp index 61940c0d7a4bfaaf62ac51556ead5ca1573383fe..52be2335602dbe73cf096293fed4ea49afaa5cc6 100644 --- a/src/basics/geometry3d/GbTriFaceMesh3D.cpp +++ b/src/basics/geometry3d/GbTriFaceMesh3D.cpp @@ -1047,88 +1047,79 @@ void GbTriFaceMesh3D::readMeshFromSTLFile(string filename, bool removeRedundantN dummy = in.readString(); nr += 3; } - if (removeRedundantNodes) { + if (removeRedundantNodes) + { this->deleteRedundantNodes(); // dort wird autoamtisch calculateValues() aufgerufen } else { this->calculateValues(); } } -////////////////////////////////////////////////////////////////////////// -// void GbTriFaceMesh3D::writeMeshToSTLFile(string filename, bool isBinaryFormat) -//{ -// vector<GbTriFaceMesh3D::Vertex> *nodes = new vector<GbTriFaceMesh3D::Vertex>; -// vector<GbTriFaceMesh3D::TriFace> *triangles = new vector<GbTriFaceMesh3D::TriFace>; -// int nr=0; -// -// if (!isBinaryFormat) { -// ofstream out(filename.c_str()); -// if (!out.good()) -// { -// delete nodes; -// delete triangles; -// UB_THROW(UbException(UB_EXARGS, "Can not open STL file: "+filename)); -// } -// char title[80] = "ASCII"; -// std::string s0, s1; -// float n0, n1, n2, f0, f1, f2, f3, f4, f5, f6, f7, f8; -// out.write(title, 80); -// size_t size = nodes->size(); -// for (size_t i = 0; i < size) -// { -// out << nodes[i++] -// in >> s0; // facet || endsolid -// if (s0=="facet") { -// in >> s1 >> n0 >> n1 >> n2; // normal x y z -// in >> s0 >> s1; // outer loop -// in >> s0 >> f0 >> f1 >> f2; // vertex x y z -// in >> s0 >> f3 >> f4 >> f5; // vertex x y z -// in >> s0 >> f6 >> f7 >> f8; // vertex x y z -// in >> s0; // endloop -// in >> s0; // endfacet -// // Generate a new Triangle without Normal as 3 Vertices -// nodes->push_back(GbTriFaceMesh3D::Vertex(f0, f1, f2)); -// nodes->push_back(GbTriFaceMesh3D::Vertex(f3, f4, f5)); -// nodes->push_back(GbTriFaceMesh3D::Vertex(f6, f7, f8)); -// triangles->push_back(GbTriFaceMesh3D::TriFace(nr, nr+1, nr+2)); -// nr+=3; -// } -// else if (s0=="endsolid") { -// break; -// } -// } -// in.close(); -// } -// else { -// FILE *f = fopen(filename.c_str(), "rb"); -// if (!f) -// { -// delete nodes; -// delete triangles; -// UB_THROW(UbException(UB_EXARGS, "Can not open STL file: "+filename)); -// } -// char title[80]; -// int nFaces; -// fread(title, 80, 1, f); -// fread((void*)&nFaces, 4, 1, f); -// float v[12]; // normal=3, vertices=3*3 = 12 -// unsigned short uint16; -// // Every Face is 50 Bytes: Normal(3*float), Vertices(9*float), 2 Bytes Spacer -// for (size_t i=0; i<nFaces; ++i) { -// for (size_t j=0; j<12; ++j) { -// fread((void*)&v[j], sizeof(float), 1, f); -// } -// fread((void*)&uint16, sizeof(unsigned short), 1, f); // spacer between successive faces -// nodes->push_back(GbTriFaceMesh3D::Vertex(v[3], v[4], v[5])); -// nodes->push_back(GbTriFaceMesh3D::Vertex(v[6], v[7], v[8])); -// nodes->push_back(GbTriFaceMesh3D::Vertex(v[9], v[10], v[11])); -// triangles->push_back(GbTriFaceMesh3D::TriFace(nr, nr+1, nr+2)); -// nr+=3; -// } -// fclose(f); -// } -// -// GbTriFaceMesh3D* mesh = new GbTriFaceMesh3D(meshName, nodes, triangles, splitAlg, removeRedundantNodes); -// -// return mesh; -//} -////////////////////////////////////////////////////////////////////////// +/*======================================================================*/ +void GbTriFaceMesh3D::readMeshFromSTLFileBinary(string filename, bool removeRedundantNodes) +{ + //vector<GbTriFaceMesh3D::Vertex> *nodes = new vector<GbTriFaceMesh3D::Vertex>; + //vector<GbTriFaceMesh3D::TriFace> *triangles = new vector<GbTriFaceMesh3D::TriFace>; + int nr = 0; + + if (!true) { + ifstream in(filename.c_str()); + if (!in.good()) { + delete nodes; + delete triangles; + UB_THROW(UbException(UB_EXARGS, "Can not open STL file: " + filename)); + } + char title[80]; + std::string s0, s1; + float n0, n1, n2, f0, f1, f2, f3, f4, f5, f6, f7, f8; + in.read(title, 80); + while (!in.eof()) { + in >> s0; // facet || endsolid + if (s0 == "facet") { + in >> s1 >> n0 >> n1 >> n2; // normal x y z + in >> s0 >> s1; // outer loop + in >> s0 >> f0 >> f1 >> f2; // vertex x y z + in >> s0 >> f3 >> f4 >> f5; // vertex x y z + in >> s0 >> f6 >> f7 >> f8; // vertex x y z + in >> s0; // endloop + in >> s0; // endfacet + // Generate a new Triangle without Normal as 3 Vertices + nodes->push_back(GbTriFaceMesh3D::Vertex(f0, f1, f2)); + nodes->push_back(GbTriFaceMesh3D::Vertex(f3, f4, f5)); + nodes->push_back(GbTriFaceMesh3D::Vertex(f6, f7, f8)); + triangles->push_back(GbTriFaceMesh3D::TriFace(nr, nr + 1, nr + 2)); + nr += 3; + } else if (s0 == "endsolid") { + break; + } + } + in.close(); + } else { + FILE *f = fopen(filename.c_str(), "rb"); + if (!f) { + delete nodes; + delete triangles; + UB_THROW(UbException(UB_EXARGS, "Can not open STL file: " + filename)); + } + char title[80]; + int nFaces; + fread(title, 80, 1, f); + fread((void *)&nFaces, 4, 1, f); + float v[12]; // normal=3, vertices=3*3 = 12 + unsigned short uint16; + // Every Face is 50 Bytes: Normal(3*float), Vertices(9*float), 2 Bytes Spacer + for (size_t i = 0; i < nFaces; ++i) { + for (size_t j = 0; j < 12; ++j) { + fread((void *)&v[j], sizeof(float), 1, f); + } + fread((void *)&uint16, sizeof(unsigned short), 1, f); // spacer between successive faces + nodes->push_back(GbTriFaceMesh3D::Vertex(v[3], v[4], v[5])); + nodes->push_back(GbTriFaceMesh3D::Vertex(v[6], v[7], v[8])); + nodes->push_back(GbTriFaceMesh3D::Vertex(v[9], v[10], v[11])); + triangles->push_back(GbTriFaceMesh3D::TriFace(nr, nr + 1, nr + 2)); + nr += 3; + } + fclose(f); + } + this->calculateValues(); +} + diff --git a/src/basics/geometry3d/GbTriFaceMesh3D.h b/src/basics/geometry3d/GbTriFaceMesh3D.h index 5fd77cecac566c143cdc4e692389596c5a86dcac..7f574bdf0ca8ef4f5e1027e8021d6b3ad939c3f8 100644 --- a/src/basics/geometry3d/GbTriFaceMesh3D.h +++ b/src/basics/geometry3d/GbTriFaceMesh3D.h @@ -270,6 +270,7 @@ public: this->transX3 = transX3; } void readMeshFromSTLFile(std::string filename, bool removeRedundantNodes); + void readMeshFromSTLFileBinary(std::string filename, bool removeRedundantNodes); double getX1Minimum() override { diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp index c34dccf9feefee287106e04f7bbeee4b3a6b13b7..198a7c3a1b77b55cb9ffc62b6559e8532a6a8b08 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp @@ -248,15 +248,31 @@ void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) maxX1 -= 1; maxX2 -= 1; maxX3 -= 1; + int SWBi, SEBi, NEBi, NWBi, SWTi, SETi, NETi, NWTi; // cell vector erstellen for (int ix3 = minX3; ix3 <= maxX3; ix3++) { for (int ix2 = minX2; ix2 <= maxX2; ix2++) { for (int ix1 = minX1; ix1 <= maxX1; ix1++) { - if ((SWB = nodeNumbers(ix1, ix2, ix3)) >= 0 && (SEB = nodeNumbers(ix1 + 1, ix2, ix3)) >= 0 && - (NEB = nodeNumbers(ix1 + 1, ix2 + 1, ix3)) >= 0 && (NWB = nodeNumbers(ix1, ix2 + 1, ix3)) >= 0 && - (SWT = nodeNumbers(ix1, ix2, ix3 + 1)) >= 0 && (SET = nodeNumbers(ix1 + 1, ix2, ix3 + 1)) >= 0 && - (NET = nodeNumbers(ix1 + 1, ix2 + 1, ix3 + 1)) >= 0 && - (NWT = nodeNumbers(ix1, ix2 + 1, ix3 + 1)) >= 0) { + if ( + ( SWBi = nodeNumbers(ix1, ix2, ix3)) >= 0 + && (SEBi = nodeNumbers(ix1 + 1, ix2, ix3)) >= 0 + && (NEBi = nodeNumbers(ix1 + 1, ix2 + 1, ix3)) >= 0 + && (NWBi = nodeNumbers(ix1, ix2 + 1, ix3)) >= 0 + && (SWTi = nodeNumbers(ix1, ix2, ix3 + 1)) >= 0 + && (SETi = nodeNumbers(ix1 + 1, ix2, ix3 + 1)) >= 0 + && (NETi = nodeNumbers(ix1 + 1, ix2 + 1, ix3 + 1)) >= 0 + && (NWTi = nodeNumbers(ix1, ix2 + 1, ix3 + 1)) >= 0 + ) + { + SWB =SWBi; + SEB =SEBi; + NEB =NEBi; + NWB =NWBi; + SWT =SWTi; + SET =SETi; + NET =NETi; + NWT =NWTi; + cells.push_back(makeUbTuple(SWB, SEB, NEB, NWB, SWT, SET, NET, NWT)); } }