19#include "../../forms/LimiterForm.h"
25 m_width = m_height = 36.0;
26 Node* nodeIn =
new Node(m_position + wxPoint2DDouble(-18, 0), Node::NodeType::NODE_IN, m_borderSize);
27 nodeIn->StartMove(m_position);
28 Node* nodeOut =
new Node(m_position + wxPoint2DDouble(18, 0), Node::NodeType::NODE_OUT, m_borderSize);
29 nodeOut->SetAngle(180.0);
30 nodeOut->StartMove(m_position);
31 m_nodeList.push_back(nodeIn);
32 m_nodeList.push_back(nodeOut);
37 for (
auto& node : m_nodeList) if (node) delete node;
44 gc->SetPen(*wxTRANSPARENT_PEN);
45 gc->SetBrush(guiColour->selection);
46 double borderSize = (m_borderSize * 2.0 + 1.0) / scale;
47 gc->DrawRectangle(m_position.m_x - m_width / 2 - borderSize / 2, m_position.m_y - m_height / 2 - borderSize / 2, m_width + borderSize, m_height + borderSize);
49 gc->SetPen(wxPen(guiColour->enabled, 1));
50 gc->SetBrush(guiColour->background);
51 gc->DrawRectangle(m_position.m_x - m_width / 2, m_position.m_y - m_height / 2, m_width, m_height);
54 gc->SetPen(wxPen(guiColour->bus, 2));
55 gc->SetBrush(*wxTRANSPARENT_BRUSH);
56 wxPoint2DDouble limSymbol[4];
57 limSymbol[0] = m_position + wxPoint2DDouble(10, -10);
58 limSymbol[1] = m_position + wxPoint2DDouble(2, -10);
59 limSymbol[2] = m_position + wxPoint2DDouble(-2, 10);
60 limSymbol[3] = m_position + wxPoint2DDouble(-10, 10);
61 gc->StrokeLines(4, limSymbol);
63 gc->SetPen(*wxTRANSPARENT_PEN);
64 gc->SetBrush(guiColour->enabled);
71 limiter.CenterOnParent();
72 if (limiter.ShowModal() == wxID_OK) {
91 for (
auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) {
93 node->Rotate(clockwise);
97void Limiter::UpdatePoints()
100 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
101 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(18, 0));
103 else if (m_angle == 90.0) {
104 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -18));
105 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, 18));
107 else if (m_angle == 180.0) {
108 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(18, 0));
109 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
111 else if (m_angle == 270.0) {
112 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, 18));
113 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, -18));
117bool Limiter::Solve(
double* input,
double timeStep)
124 if (m_output > m_upLimit)
125 m_output = m_upLimit;
126 else if (m_output < m_lowLimit)
127 m_output = m_lowLimit;
138rapidxml::xml_node<>* Limiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
140 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"Limiter");
141 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
143 SaveCADProperties(doc, elementNode);
144 SaveControlNodes(doc, elementNode);
147 auto upLimit = XMLParser::AppendNode(doc, elementNode,
"UpperLimit");
148 XMLParser::SetNodeValue(doc, upLimit, m_upLimit);
149 auto lowLimit = XMLParser::AppendNode(doc, elementNode,
"LowerLimit");
150 XMLParser::SetNodeValue(doc, lowLimit, m_lowLimit);
155bool Limiter::OpenElement(rapidxml::xml_node<>* elementNode)
157 if (!OpenCADProperties(elementNode))
return false;
158 if (!OpenControlNodes(elementNode))
return false;
161 m_upLimit = XMLParser::GetNodeValueDouble(elementNode,
"UpperLimit");
162 m_lowLimit = XMLParser::GetNodeValueDouble(elementNode,
"LowerLimit");
virtual void StartMove(wxPoint2DDouble position)
Update the element attributes related to the movement.
Base class of all elements of the program. This class is responsible for manage graphical and his dat...
Limits the input value by superior and inferior values.
virtual bool ShowForm(wxWindow *parent, Element *element, wxWindow *workspace=nullptr)
Show element data form.
virtual Element * GetCopy()
Get a the element copy.
virtual void Rotate(bool clockwise=true)
Rotate the element.
virtual void DrawDC(GUIColour *guiColour, wxPoint2DDouble translation, double scale, wxGraphicsContext *gc) const
Draw the element using GDI+.
Node of a control element. This class manages the user interaction with the connection and control el...