diff --git a/AneuMeshLoader.cpp b/AneuMeshLoader.cpp index b3a9c706020827fddb3f6140ff80e61b689df4a7..f4b5d47caca54bdfbc34633a3cddc4e917653a34 100644 --- a/AneuMeshLoader.cpp +++ b/AneuMeshLoader.cpp @@ -47,7 +47,7 @@ void AneuMeshLoader::loadMesh(const std::string& fileName, const std::string& fo Boundelement.push_back(std::move(temp)); } - file.close(); //!!! Файл и так закрывается в деструкторе ifstream и писать close в конце нет смысла + //!!! Файл и так закрывается в деструкторе ifstream и писать close в конце нет смысла } diff --git a/MeshLoader.cpp b/MeshLoader.cpp index 8d0547322a118c9394e29bb55ec29298f1a15d4d..0a837003731e1b83e4b680d855fabf0139c364bf 100644 --- a/MeshLoader.cpp +++ b/MeshLoader.cpp @@ -34,11 +34,11 @@ std::vector MeshLoader::getFiniteElementID(int _id1, int _id2, int _id3) { auto po = [&_id1, &_id2, &_id3, &res](const FiniteElement& elem) { if ((std::any_of(elem.NodeID.begin(), elem.NodeID.end(), - [&_id1](const int&id) {return id==_id1;})) && //!!! Нет смысла передавать int по ссылке + [_id1](const int id) {return id==_id1;})) && //!!! Нет смысла передавать int по ссылке (std::any_of(elem.NodeID.begin(), elem.NodeID.end(), - [&_id2](const int& id) {return id == _id2; })) && + [_id2](const int id) {return id == _id2; })) && (std::any_of(elem.NodeID.begin(), elem.NodeID.end(), - [&_id3](const int& id) {return id == _id3; }))) { + [_id3](const int id) {return id == _id3; }))) { res.push_back(elem.FiniteElementID); } }; @@ -52,9 +52,9 @@ std::vector MeshLoader::getFiniteElementEdge(int _id1, int _id2) { auto po = [&_id1, &_id2, &res](const FiniteElement& elem) { if ((std::any_of(elem.NodeID.begin(), elem.NodeID.end(), - [&_id1](const int& id) {return id == _id1; })) && //!!! Нет смысла передавать int по ссылке + [_id1](const int id) {return id == _id1; })) && //!!! Нет смысла передавать int по ссылке (std::any_of(elem.NodeID.begin(), elem.NodeID.end(), - [&_id2](const int& id) {return id == _id2; }))) { + [_id2](const int id) {return id == _id2; }))) { res.push_back(elem.FiniteElementID); } }; @@ -63,8 +63,8 @@ std::vector MeshLoader::getFiniteElementEdge(int _id1, int _id2) { return res; } -std::vector MeshLoader::getNodesByBorderID(int _id) { //!!! Метод должен возвращать id, а не узлы - std::set res; +std::vector MeshLoader::getNodesIDByBorderID(int _id) { //!!! Метод должен возвращать id, а не узлы + std::set res; auto cur = Boundelement.begin(); @@ -76,6 +76,27 @@ std::vector MeshLoader::getNodesByBorderID(int _id) { //!!! Метод д if (cur != Boundelement.end()) { for (const auto &nod : cur->NodeID) { Node nodeId = Nodes[nod-1]; + res.insert(nodeId.ID); + } + ++cur; + } + } + return std::vector(res.begin(), res.end()); +} + +std::vector MeshLoader::getNodesByBorderID(int _id) { + std::set res; + auto cur = Boundelement.begin(); + + + while (cur != Boundelement.end()) { + cur = std::find_if(cur, Boundelement.end(), [_id](const FiniteElement& elem) { + return elem.GeometryAreaID == _id; + } + ); + if (cur != Boundelement.end()) { + for (const auto& nod : cur->NodeID) { + Node nodeId = Nodes[nod - 1]; res.insert(nodeId); } ++cur; diff --git a/MeshLoader.h b/MeshLoader.h index 709ce100b7c379c0c921b8cb485bf947730d6642..1224f42464882c12177091bc0f418012bea4d126 100644 --- a/MeshLoader.h +++ b/MeshLoader.h @@ -25,6 +25,7 @@ public: std::vector getFiniteElementID(int, int, int); std::vector getFiniteElementEdge(int, int); + std::vector getNodesIDByBorderID(int); std::vector getNodesByBorderID(int); std::vector getFiniteElementIdSurface(int); diff --git a/StructDataType.cpp b/StructDataType.cpp index f36324fe2497e2cb70e30239b107070e099ec51b..8401c797640cb4a8d40b5ccaf3e8193d41f35298 100644 --- a/StructDataType.cpp +++ b/StructDataType.cpp @@ -18,6 +18,12 @@ std::ostream& operator<<(std::ostream& out, const std::vector& _node) { return out; }; +std::ostream& operator<<(std::ostream& out, const std::array& ar) { + for (const auto& coord : ar) + out << coord; + return out; +} + bool Node::operator<(const Node& node) const { return ID < node.ID; } diff --git a/StructDataType.h b/StructDataType.h index 87b09c49c93e822dbbe9391cd127685f128e0228..933c859fdedc4d9598acd97e2b456c71542c85d9 100644 --- a/StructDataType.h +++ b/StructDataType.h @@ -13,6 +13,7 @@ struct Node { friend std::ostream& operator<<(std::ostream&, const Node&); friend std::ostream& operator<<(std::ostream&, const std::vector&); + friend std::ostream& operator<<(std::ostream&, const std::array&); bool operator<(const Node& node) const; diff --git a/main.cpp b/main.cpp index f8ab1163706891e588285740d1a6c6bd294b0eaf..d4deb9cac643f2097b6d255b51dda51e04197057 100644 --- a/main.cpp +++ b/main.cpp @@ -5,11 +5,13 @@ #include #include #include - +#include #include "MeshLoader.h" #include "AneuMeshLoader.h" using namespace std; + + int main() { MeshLoader* l = new AneuMeshLoader(); //!!! Отлично. Где delete? try { @@ -40,14 +42,12 @@ int main() { std::ofstream fout("out", std::ios::app); - auto res1 = n | std::ranges::views::drop(10) + auto res1 = n | std::ranges::views::transform( + [](const Node& p) {return p.coordinate;} ) + | std::ranges::views::drop(10) | std::ranges::views::take(10); - std::ranges::copy(res1, std::ostream_iterator(fout, "\n")); - - //!!! В задании написано - выводить координаты (!) вершин, а не Node. - //!!! Где преобразование в pipeline из Node в std::array ? - + std::ranges::copy(res1, std::ostream_iterator>(fout, "\n")); std::cout << n; std::cout << "-------------------------------------" << std::endl;