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;
82 gc->SetPen(*wxTRANSPARENT_PEN);
83 gc->SetBrush(wxBrush(m_selectionColour));
84 double borderSize = (m_borderSize * 2.0 + 1.0) / scale;
85 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);
87 gc->SetPen(*wxBLACK_PEN);
88 gc->SetBrush(*wxWHITE_BRUSH);
90 gc->DrawRectangle(m_position.m_x - m_width / 2, m_position.m_y - m_height / 2, m_width, m_height);
93 wxPoint2DDouble axis[4];
94 axis[0] = m_position + wxPoint2DDouble(-13, 13);
95 axis[1] = m_position + wxPoint2DDouble(13, 13);
96 axis[2] = m_position + wxPoint2DDouble(-13, -13);
97 axis[3] = m_position + wxPoint2DDouble(-13, 13);
98 gc->StrokeLines(2, &axis[0]);
99 gc->StrokeLines(2, &axis[2]);
101 gc->SetPen(wxPen(wxColour(0, 77, 255, 255), 2));
102 gc->SetBrush(*wxTRANSPARENT_BRUSH);
103 wxPoint2DDouble expSymbol[9];
104 expSymbol[0] = m_position + wxPoint2DDouble(-13, 13);
105 expSymbol[1] = m_position + wxPoint2DDouble(-6, 13);
106 expSymbol[2] = m_position + wxPoint2DDouble(2, 12);
107 expSymbol[3] = m_position + wxPoint2DDouble(4, 11);
108 expSymbol[4] = m_position + wxPoint2DDouble(6, 10);
109 expSymbol[5] = m_position + wxPoint2DDouble(8, 7);
110 expSymbol[6] = m_position + wxPoint2DDouble(11, -1);
111 expSymbol[7] = m_position + wxPoint2DDouble(12, -7);
112 expSymbol[8] = m_position + wxPoint2DDouble(13, -13);
113 gc->StrokeLines(9, expSymbol);
115 gc->SetPen(*wxTRANSPARENT_PEN);
116 gc->SetBrush(wxBrush(wxColour(0, 0, 0, 255)));
123 form.CenterOnParent();
124 if (form.ShowModal() == wxID_OK) {
136 if (m_angle >= 360.0)
138 else if (m_angle < 0)
143 for (
auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) {
145 node->Rotate(clockwise);
149void Exponential::UpdatePoints()
151 if (m_angle == 0.0) {
152 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
153 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(18, 0));
155 else if (m_angle == 90.0) {
156 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -18));
157 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, 18));
159 else if (m_angle == 180.0) {
160 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(18, 0));
161 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
163 else if (m_angle == 270.0) {
164 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, 18));
165 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, -18));
169void Exponential::GetValues(
double& aValue,
double& bValue)
175void Exponential::SetValues(
double aValue,
double bValue)
187 m_output = m_aValue * std::exp(m_bValue * input[0]);
197rapidxml::xml_node<>* Exponential::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
199 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"Exponential");
200 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
202 SaveCADProperties(doc, elementNode);
203 SaveControlNodes(doc, elementNode);
205 auto value = XMLParser::AppendNode(doc, elementNode,
"Value");
206 auto aValue = XMLParser::AppendNode(doc, value,
"A");
207 XMLParser::SetNodeValue(doc, aValue, m_aValue);
208 auto bValue = XMLParser::AppendNode(doc, value,
"B");
209 XMLParser::SetNodeValue(doc, bValue, m_bValue);
214bool Exponential::OpenElement(rapidxml::xml_node<>* elementNode)
216 if (!OpenCADProperties(elementNode))
return false;
217 if (!OpenControlNodes(elementNode))
return false;
220 auto value = elementNode->first_node(
"Value");
221 m_aValue = XMLParser::GetNodeValueDouble(value,
"A");
222 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 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.
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...