From 773ae5ace49f8e18fc11ff4fb1892b632cc16ac8 Mon Sep 17 00:00:00 2001 From: Dmitrii Yakovlev Date: Sat, 5 Nov 2022 21:51:57 +0300 Subject: [PATCH] #commit5 --- AneuMeshLoader.cpp | 2 +- MeshLoader.cpp | 35 ++++++++++++++++++++++++++++------- MeshLoader.h | 1 + StructDataType.cpp | 6 ++++++ StructDataType.h | 1 + main.cpp | 14 +++++++------- 6 files changed, 44 insertions(+), 15 deletions(-) diff --git a/AneuMeshLoader.cpp b/AneuMeshLoader.cpp index b3a9c70..f4b5d47 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 8d05473..0a83700 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 709ce10..1224f42 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 f36324f..8401c79 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 87b09c4..933c859 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 f8ab116..d4deb9c 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; -- GitLab