19#include "../../forms/ExponentialForm.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);
35Exponential::~Exponential()
37 for (
auto& node : m_nodeList) if (node) delete node;
44 gc->SetPen(*wxTRANSPARENT_PEN);
45 gc->SetBrush(wxBrush(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);
52 gc->DrawRectangle(m_position.m_x - m_width / 2, m_position.m_y - m_height / 2, m_width, m_height);
55 wxPoint2DDouble axis[4];
56 axis[0] = m_position + wxPoint2DDouble(-13, 13);
57 axis[1] = m_position + wxPoint2DDouble(13, 13);
58 axis[2] = m_position + wxPoint2DDouble(-13, -13);
59 axis[3] = m_position + wxPoint2DDouble(-13, 13);
60 gc->StrokeLines(2, &axis[0]);
61 gc->StrokeLines(2, &axis[2]);
63 gc->SetPen(wxPen(guiColour->bus, 2));
64 gc->SetBrush(*wxTRANSPARENT_BRUSH);
65 wxPoint2DDouble expSymbol[9];
66 expSymbol[0] = m_position + wxPoint2DDouble(-13, 13);
67 expSymbol[1] = m_position + wxPoint2DDouble(-6, 13);
68 expSymbol[2] = m_position + wxPoint2DDouble(2, 12);
69 expSymbol[3] = m_position + wxPoint2DDouble(4, 11);
70 expSymbol[4] = m_position + wxPoint2DDouble(6, 10);
71 expSymbol[5] = m_position + wxPoint2DDouble(8, 7);
72 expSymbol[6] = m_position + wxPoint2DDouble(11, -1);
73 expSymbol[7] = m_position + wxPoint2DDouble(12, -7);
74 expSymbol[8] = m_position + wxPoint2DDouble(13, -13);
75 gc->StrokeLines(9, expSymbol);
77 gc->SetPen(*wxTRANSPARENT_PEN);
78 gc->SetBrush(guiColour->enabled);
85 form.CenterOnParent();
86 if (form.ShowModal() == wxID_OK) {
100 else if (m_angle < 0)
105 for (
auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) {
107 node->Rotate(clockwise);
111void Exponential::UpdatePoints()
113 if (m_angle == 0.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 == 90.0) {
118 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -18));
119 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, 18));
121 else if (m_angle == 180.0) {
122 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(18, 0));
123 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
125 else if (m_angle == 270.0) {
126 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, 18));
127 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, -18));
131void Exponential::GetValues(
double& aValue,
double& bValue)
137void Exponential::SetValues(
double aValue,
double bValue)
149 m_output = m_aValue * std::exp(m_bValue * input[0]);
159rapidxml::xml_node<>* Exponential::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
161 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"Exponential");
162 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
164 SaveCADProperties(doc, elementNode);
165 SaveControlNodes(doc, elementNode);
167 auto value = XMLParser::AppendNode(doc, elementNode,
"Value");
168 auto aValue = XMLParser::AppendNode(doc, value,
"A");
169 XMLParser::SetNodeValue(doc, aValue, m_aValue);
170 auto bValue = XMLParser::AppendNode(doc, value,
"B");
171 XMLParser::SetNodeValue(doc, bValue, m_bValue);
176bool Exponential::OpenElement(rapidxml::xml_node<>* elementNode)
178 if (!OpenCADProperties(elementNode))
return false;
179 if (!OpenControlNodes(elementNode))
return false;
182 auto value = elementNode->first_node(
"Value");
183 m_aValue = XMLParser::GetNodeValueDouble(value,
"A");
184 m_bValue = XMLParser::GetNodeValueDouble(value,
"B");
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...
Generates an output following an exponential function.
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+.
virtual bool Solve(double *input, double timeStep)
Calculates the exponential.
virtual bool ShowForm(wxWindow *parent, Element *element, wxWindow *workspace=nullptr)
Show element data form.
virtual Element * GetCopy()
Get a the element copy.
Node of a control element. This class manages the user interaction with the connection and control el...