19#include "../../forms/RateLimiterForm.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);
35RateLimiter::~RateLimiter()
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(guiColour->enabled);
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->SetBrush(*wxTRANSPARENT_BRUSH);
55 wxPoint2DDouble axis[4];
56 axis[0] = m_position + wxPoint2DDouble(-13, 0);
57 axis[1] = m_position + wxPoint2DDouble(13, 0);
58 axis[2] = m_position + wxPoint2DDouble(0, -13);
59 axis[3] = m_position + wxPoint2DDouble(0, 13);
60 gc->StrokeLines(2, &axis[0]);
61 gc->StrokeLines(2, &axis[2]);
63 gc->SetPen(wxPen(guiColour->bus, 2));
64 wxPoint2DDouble limSymbol[2];
65 limSymbol[0] = m_position + wxPoint2DDouble(10, -10);
66 limSymbol[1] = m_position + wxPoint2DDouble(-10, 10);
67 gc->StrokeLines(2, limSymbol);
69 gc->SetPen(*wxTRANSPARENT_PEN);
70 gc->SetBrush(guiColour->enabled);
77 form.CenterOnParent();
78 if (form.ShowModal() == wxID_OK) {
97 for (
auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) {
99 node->Rotate(clockwise);
103void RateLimiter::UpdatePoints()
105 if (m_angle == 0.0) {
106 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
107 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(18, 0));
109 else if (m_angle == 90.0) {
110 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -18));
111 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, 18));
113 else if (m_angle == 180.0) {
114 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(18, 0));
115 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
117 else if (m_angle == 270.0) {
118 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, 18));
119 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, -18));
129 double rate = (input[0] - m_output) / timeStep;
131 bool reachLimit =
false;
132 if (rate > m_upLimit) {
136 else if (rate < m_lowLimit) {
142 m_output += rate * timeStep;
154rapidxml::xml_node<>* RateLimiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
156 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"RateLimiter");
157 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
159 SaveCADProperties(doc, elementNode);
160 SaveControlNodes(doc, elementNode);
163 auto upLimit = XMLParser::AppendNode(doc, elementNode,
"UpperLimit");
164 XMLParser::SetNodeValue(doc, upLimit, m_upLimit);
165 auto lowLimit = XMLParser::AppendNode(doc, elementNode,
"LowerLimit");
166 XMLParser::SetNodeValue(doc, lowLimit, m_lowLimit);
171bool RateLimiter::OpenElement(rapidxml::xml_node<>* elementNode)
173 if (!OpenCADProperties(elementNode))
return false;
174 if (!OpenControlNodes(elementNode))
return false;
177 m_upLimit = XMLParser::GetNodeValueDouble(elementNode,
"UpperLimit");
178 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...
Node of a control element. This class manages the user interaction with the connection and control el...
Limits the rising and/or falling rate.
virtual void Rotate(bool clockwise=true)
Rotate the element.
virtual Element * GetCopy()
Get a the element copy.
virtual bool Solve(double *input, double timeStep)
Calculate the rate and limits it if exceeds.
virtual void DrawDC(GUIColour *guiColour, wxPoint2DDouble translation, double scale, wxGraphicsContext *gc) const
Draw the element using GDI+.
virtual bool ShowForm(wxWindow *parent, Element *element, wxWindow *workspace=nullptr)
Show element data form.