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;
166rapidxml::xml_node<>* Limiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
168 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"Limiter");
169 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
171 SaveCADProperties(doc, elementNode);
172 SaveControlNodes(doc, elementNode);
175 auto upLimit = XMLParser::AppendNode(doc, elementNode,
"UpperLimit");
176 XMLParser::SetNodeValue(doc, upLimit, m_upLimit);
177 auto lowLimit = XMLParser::AppendNode(doc, elementNode,
"LowerLimit");
178 XMLParser::SetNodeValue(doc, lowLimit, m_lowLimit);
183bool Limiter::OpenElement(rapidxml::xml_node<>* elementNode)
185 if (!OpenCADProperties(elementNode))
return false;
186 if (!OpenControlNodes(elementNode))
return false;
189 m_upLimit = XMLParser::GetNodeValueDouble(elementNode,
"UpperLimit");
190 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)
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...