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;
68void Limiter::DrawDC(wxPoint2DDouble translation,
double scale, wxGraphicsContext* gc)
const
71 gc->SetPen(*wxTRANSPARENT_PEN);
72 gc->SetBrush(wxBrush(m_selectionColour));
73 double borderSize = (m_borderSize * 2.0 + 1.0) / scale;
74 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);
76 gc->SetPen(wxPen(wxColour(0, 0, 0, 255), 1));
77 gc->SetBrush(wxBrush(wxColour(255, 255, 255, 255)));
78 gc->DrawRectangle(m_position.m_x - m_width / 2, m_position.m_y - m_height / 2, m_width, m_height);
81 gc->SetPen(wxPen(wxColour(0, 77, 255, 255), 2));
82 gc->SetBrush(*wxTRANSPARENT_BRUSH);
83 wxPoint2DDouble limSymbol[4];
84 limSymbol[0] = m_position + wxPoint2DDouble(10, -10);
85 limSymbol[1] = m_position + wxPoint2DDouble(2, -10);
86 limSymbol[2] = m_position + wxPoint2DDouble(-2, 10);
87 limSymbol[3] = m_position + wxPoint2DDouble(-10, 10);
88 gc->StrokeLines(4, limSymbol);
90 gc->SetPen(*wxTRANSPARENT_PEN);
91 gc->SetBrush(*wxBLACK_BRUSH);
98 limiter.CenterOnParent();
99 if (limiter.ShowModal() == wxID_OK) {
111 if (m_angle >= 360.0)
113 else if (m_angle < 0)
118 for (
auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) {
120 node->Rotate(clockwise);
124void Limiter::UpdatePoints()
126 if (m_angle == 0.0) {
127 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
128 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(18, 0));
130 else if (m_angle == 90.0) {
131 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -18));
132 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, 18));
134 else if (m_angle == 180.0) {
135 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(18, 0));
136 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
138 else if (m_angle == 270.0) {
139 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, 18));
140 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, -18));
144bool Limiter::Solve(
double* input,
double timeStep)
151 if (m_output > m_upLimit)
152 m_output = m_upLimit;
153 else if (m_output < m_lowLimit)
154 m_output = m_lowLimit;
165rapidxml::xml_node<>* Limiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
167 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"Limiter");
168 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
170 SaveCADProperties(doc, elementNode);
171 SaveControlNodes(doc, elementNode);
174 auto upLimit = XMLParser::AppendNode(doc, elementNode,
"UpperLimit");
175 XMLParser::SetNodeValue(doc, upLimit, m_upLimit);
176 auto lowLimit = XMLParser::AppendNode(doc, elementNode,
"LowerLimit");
177 XMLParser::SetNodeValue(doc, lowLimit, m_lowLimit);
182bool Limiter::OpenElement(rapidxml::xml_node<>* elementNode)
184 if (!OpenCADProperties(elementNode))
return false;
185 if (!OpenControlNodes(elementNode))
return false;
188 m_upLimit = XMLParser::GetNodeValueDouble(elementNode,
"UpperLimit");
189 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(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...