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]);
198rapidxml::xml_node<>* Exponential::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
200 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"Exponential");
201 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
203 SaveCADProperties(doc, elementNode);
204 SaveControlNodes(doc, elementNode);
206 auto value = XMLParser::AppendNode(doc, elementNode,
"Value");
207 auto aValue = XMLParser::AppendNode(doc, value,
"A");
208 XMLParser::SetNodeValue(doc, aValue, m_aValue);
209 auto bValue = XMLParser::AppendNode(doc, value,
"B");
210 XMLParser::SetNodeValue(doc, bValue, m_bValue);
215bool Exponential::OpenElement(rapidxml::xml_node<>* elementNode)
217 if (!OpenCADProperties(elementNode))
return false;
218 if (!OpenControlNodes(elementNode))
return false;
221 auto value = elementNode->first_node(
"Value");
222 m_aValue = XMLParser::GetNodeValueDouble(value,
"A");
223 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 Element * GetCopy()
Get a the element copy.
virtual void DrawDC(wxPoint2DDouble translation, double scale, wxGraphicsContext *gc) const
Draw the element using GDI+.
virtual bool ShowForm(wxWindow *parent, Element *element)
Show element data form.
Node of a control element. This class manages the user interaction with the connection and control el...