diff options
author | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2018-01-03 19:01:57 -0200 |
---|---|---|
committer | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2018-01-03 19:01:57 -0200 |
commit | cef9e14b989a3ba19321e4fe215ada2ee3998037 (patch) | |
tree | 245a63164fcd4131c48ebd1883615d112b0b59e9 /Project/ControlElement.cpp | |
parent | 0c0280cfcf540f943fd2dbfdf7ac0304ea96a465 (diff) | |
download | PSP.git-cef9e14b989a3ba19321e4fe215ada2ee3998037.tar.gz PSP.git-cef9e14b989a3ba19321e4fe215ada2ee3998037.tar.xz PSP.git-cef9e14b989a3ba19321e4fe215ada2ee3998037.zip |
Some file hand. organization and generalization
Diffstat (limited to 'Project/ControlElement.cpp')
-rw-r--r-- | Project/ControlElement.cpp | 108 |
1 files changed, 99 insertions, 9 deletions
diff --git a/Project/ControlElement.cpp b/Project/ControlElement.cpp index 51f3a2a..f13836d 100644 --- a/Project/ControlElement.cpp +++ b/Project/ControlElement.cpp @@ -108,9 +108,7 @@ void ControlElement::DrawNodes() const for(auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) { Node* node = *it; DrawCircle(node->GetPosition(), node->GetRadius(), 10, GL_POLYGON); - if(node->GetNodeType() == Node::NODE_IN) { - DrawTriangle(node->GetInTrianglePts()); - } + if(node->GetNodeType() == Node::NODE_IN) { DrawTriangle(node->GetInTrianglePts()); } } } @@ -118,17 +116,13 @@ void ControlElement::StartMove(wxPoint2DDouble position) { m_moveStartPt = position; m_movePos = m_position; - for(int i = 0; i < (int)m_nodeList.size(); ++i) { - m_nodeList[i]->StartMove(position); - } + for(int i = 0; i < (int)m_nodeList.size(); ++i) { m_nodeList[i]->StartMove(position); } } void ControlElement::Move(wxPoint2DDouble position) { SetPosition(m_movePos + position - m_moveStartPt); - for(int i = 0; i < (int)m_nodeList.size(); ++i) { - m_nodeList[i]->Move(position); - } + for(int i = 0; i < (int)m_nodeList.size(); ++i) { m_nodeList[i]->Move(position); } } bool ControlElement::Solve(double* input, double timeStep) @@ -146,3 +140,99 @@ void ControlElement::ReplaceNode(Node* oldNode, Node* newNode) if(m_nodeList[i] == oldNode) m_nodeList[i] = newNode; } } + +void ControlElement::SaveControlNodes(rapidxml::xml_document<>& doc, + rapidxml::xml_node<>* nodesN, + std::vector<Node*> nodeList) +{ + int id = 0; + for(auto it = nodeList.begin(), itEnd = nodeList.end(); it != itEnd; ++it) { + Node* node = *it; + node->SetID(id); + auto nodeN = XMLParser::AppendNode(doc, nodesN, "Node"); + XMLParser::SetNodeAttribute(doc, nodeN, "ID", id); + auto nodePosition = XMLParser::AppendNode(doc, nodeN, "Position"); + auto posNodeX = XMLParser::AppendNode(doc, nodePosition, "X"); + XMLParser::SetNodeValue(doc, posNodeX, node->GetPosition().m_x); + auto posNodeY = XMLParser::AppendNode(doc, nodePosition, "Y"); + XMLParser::SetNodeValue(doc, posNodeY, node->GetPosition().m_y); + auto angle = XMLParser::AppendNode(doc, nodeN, "Angle"); + XMLParser::SetNodeValue(doc, angle, node->GetAngle()); + auto nodeType = XMLParser::AppendNode(doc, nodeN, "Type"); + XMLParser::SetNodeValue(doc, nodeType, node->GetNodeType()); + id++; + } +} + +ControlElement* ControlElement::GetControlElementFromID(std::vector<ControlElement*> elementList, int id) +{ + for(auto it = elementList.begin(), itEnd = elementList.end(); it != itEnd; ++it) { + ControlElement* element = *it; + if(element->GetID() == id) return element; + } + return NULL; +} + +bool ControlElement::OpenControlNodeList(rapidxml::xml_node<>* elementNode, std::vector<Node*>& nodeVector) +{ + auto nodeList = elementNode->first_node("NodeList"); + if(!nodeList) return false; + auto nodeN = nodeList->first_node("Node"); + while(nodeN) { + auto nodePosition = nodeN->first_node("Position"); + double nodePosX = XMLParser::GetNodeValueDouble(nodePosition, "X"); + double nodePosY = XMLParser::GetNodeValueDouble(nodePosition, "Y"); + double nodeAngle = XMLParser::GetNodeValueDouble(nodeN, "Angle"); + Node::NodeType nodeType = static_cast<Node::NodeType>(XMLParser::GetNodeValueInt(nodeN, "Type")); + Node* node = new Node(wxPoint2DDouble(nodePosX, nodePosY), nodeType, 2.0); + node->SetAngle(nodeAngle); + nodeVector.push_back(node); + nodeN = nodeN->next_sibling("Node"); + } + return true; +} + +void ControlElement::SaveControlNodes(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementNode) +{ + auto nodeList = XMLParser::AppendNode(doc, elementNode, "NodeList"); + int id = 0; + for(auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) { + Node* node = *it; + node->SetID(id); + auto nodeN = XMLParser::AppendNode(doc, nodeList, "Node"); + XMLParser::SetNodeAttribute(doc, nodeN, "ID", id); + auto nodePosition = XMLParser::AppendNode(doc, nodeN, "Position"); + auto posNodeX = XMLParser::AppendNode(doc, nodePosition, "X"); + XMLParser::SetNodeValue(doc, posNodeX, node->GetPosition().m_x); + auto posNodeY = XMLParser::AppendNode(doc, nodePosition, "Y"); + XMLParser::SetNodeValue(doc, posNodeY, node->GetPosition().m_y); + auto angle = XMLParser::AppendNode(doc, nodeN, "Angle"); + XMLParser::SetNodeValue(doc, angle, node->GetAngle()); + auto nodeType = XMLParser::AppendNode(doc, nodeN, "Type"); + XMLParser::SetNodeValue(doc, nodeType, node->GetNodeType()); + id++; + } +} + +bool ControlElement::OpenControlNodes(rapidxml::xml_node<>* elementNode) +{ + // Clear old nodes + for(auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) delete *it; + m_nodeList.clear(); + + auto nodeList = elementNode->first_node("NodeList"); + if(!nodeList) return false; + auto nodeN = nodeList->first_node("Node"); + while(nodeN) { + auto nodePosition = nodeN->first_node("Position"); + double nodePosX = XMLParser::GetNodeValueDouble(nodePosition, "X"); + double nodePosY = XMLParser::GetNodeValueDouble(nodePosition, "Y"); + double nodeAngle = XMLParser::GetNodeValueDouble(nodeN, "Angle"); + Node::NodeType nodeType = static_cast<Node::NodeType>(XMLParser::GetNodeValueInt(nodeN, "Type")); + Node* node = new Node(wxPoint2DDouble(nodePosX, nodePosY), nodeType, 2.0); + node->SetAngle(nodeAngle); + m_nodeList.push_back(node); + nodeN = nodeN->next_sibling("Node"); + } + return true; +} |