summaryrefslogtreecommitdiffstats
path: root/Project/ControlElement.cpp
diff options
context:
space:
mode:
authorThales Lima Oliveira <thaleslima.ufu@gmail.com>2018-01-03 19:01:57 -0200
committerThales Lima Oliveira <thaleslima.ufu@gmail.com>2018-01-03 19:01:57 -0200
commitcef9e14b989a3ba19321e4fe215ada2ee3998037 (patch)
tree245a63164fcd4131c48ebd1883615d112b0b59e9 /Project/ControlElement.cpp
parent0c0280cfcf540f943fd2dbfdf7ac0304ea96a465 (diff)
downloadPSP.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.cpp108
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;
+}