19#include "../../forms/GainForm.h"
25 Node* nodeIn =
new Node(m_position + wxPoint2DDouble(-m_width / 2, 0), Node::NodeType::NODE_IN, m_borderSize);
26 nodeIn->StartMove(m_position);
27 Node* nodeOut =
new Node(m_position + wxPoint2DDouble(m_width / 2, 0), Node::NodeType::NODE_OUT, m_borderSize);
28 nodeOut->SetAngle(180.0);
29 nodeOut->StartMove(m_position);
30 m_nodeList.push_back(nodeIn);
31 m_nodeList.push_back(nodeOut);
37 if (m_gcText)
delete m_gcText;
38 for (
auto& node : m_nodeList) if (node) delete node;
45 gc->SetPen(*wxTRANSPARENT_PEN);
46 gc->SetBrush(wxBrush(guiColour->selection));
47 double borderSize = (m_borderSize * 2.0 + 1.0) / scale;
48 std::vector<wxPoint2DDouble> m_triSelectedPts;
50 m_triSelectedPts.push_back(m_triPts[0] - wxPoint2DDouble(borderSize / 2, borderSize / 1.5));
51 m_triSelectedPts.push_back(m_triPts[1] - wxPoint2DDouble(borderSize / 2, -borderSize / 1.5));
52 m_triSelectedPts.push_back(m_triPts[2] - wxPoint2DDouble(-borderSize, 0));
54 else if (m_angle == 90.0) {
55 m_triSelectedPts.push_back(m_triPts[0] - wxPoint2DDouble(borderSize / 1.5, borderSize / 2));
56 m_triSelectedPts.push_back(m_triPts[1] - wxPoint2DDouble(-borderSize / 1.5, borderSize / 2));
57 m_triSelectedPts.push_back(m_triPts[2] - wxPoint2DDouble(0, -borderSize));
59 else if (m_angle == 180.0) {
60 m_triSelectedPts.push_back(m_triPts[0] - wxPoint2DDouble(borderSize, 0));
61 m_triSelectedPts.push_back(m_triPts[1] - wxPoint2DDouble(-borderSize / 2, borderSize / 1.5));
62 m_triSelectedPts.push_back(m_triPts[2] - wxPoint2DDouble(-borderSize / 2, -borderSize / 1.5));
64 else if (m_angle == 270.0) {
65 m_triSelectedPts.push_back(m_triPts[0] - wxPoint2DDouble(0, borderSize));
66 m_triSelectedPts.push_back(m_triPts[1] - wxPoint2DDouble(-borderSize / 1.5, -borderSize / 2));
67 m_triSelectedPts.push_back(m_triPts[2] - wxPoint2DDouble(borderSize / 1.5, -borderSize / 2));
72 gc->SetPen(wxPen(guiColour->enabled, 1));
73 gc->SetBrush(guiColour->background);
78 m_gcText->
Draw(m_position + wxPoint2DDouble(-m_width / 2 + 2 + m_borderSize, -m_gcText->GetHeight() / 2), gc, 0, guiColour->text);
79 else if (m_angle == 90.0)
80 m_gcText->
Draw(m_position + wxPoint2DDouble(-m_gcText->GetWidth() / 2, -m_height / 2 + 2 + m_borderSize), gc, 0, guiColour->text);
81 else if (m_angle == 180.0)
82 m_gcText->
Draw(m_position + wxPoint2DDouble(m_width / 2 - m_gcText->GetWidth() - 2 - m_borderSize, -m_gcText->GetHeight() / 2), gc, 0, guiColour->text);
83 else if (m_angle == 270.0)
84 m_gcText->
Draw(m_position + wxPoint2DDouble(-m_gcText->GetWidth() / 2, m_height / 2 - m_gcText->GetHeight() - 2 - m_borderSize), gc, 0, guiColour->text);
86 gc->SetPen(*wxTRANSPARENT_PEN);
87 gc->SetBrush(guiColour->enabled);
94 form.CenterOnParent();
95 if (form.ShowModal() == wxID_OK) {
107 if (m_angle >= 360.0)
109 else if (m_angle < 0)
114 for (
auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) {
116 node->Rotate(clockwise);
120void Gain::SetValue(
double value)
124 if (std::abs(m_value) > 1e3 || std::abs(m_value) < 1e-3)
125 text = wxString::Format(
"%g", m_value);
132 m_gcText =
new GCText(text);
134 m_width = m_gcText->GetWidth() + 18 + 2 * m_borderSize;
135 m_height = m_gcText->GetHeight() + 18 + 2 * m_borderSize;
137 if (m_width > m_height)
147void Gain::UpdatePoints()
149 if (m_nodeList.size() != 0) {
150 if (m_angle == 0.0) {
151 m_triPts[0] = m_rect.GetLeftTop() + wxPoint2DDouble(m_borderSize, m_borderSize);
152 m_triPts[1] = m_rect.GetLeftBottom() + wxPoint2DDouble(m_borderSize, -m_borderSize);
153 m_triPts[2] = m_position + wxPoint2DDouble(m_width / 2 - m_borderSize, 0);
154 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-m_width / 2, 0));
155 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(m_width / 2 - 2, 0));
157 else if (m_angle == 90.0) {
158 m_triPts[0] = m_rect.GetLeftTop() + wxPoint2DDouble(m_borderSize, m_borderSize);
159 m_triPts[1] = m_rect.GetRightTop() + wxPoint2DDouble(-m_borderSize, m_borderSize);
160 m_triPts[2] = m_position + wxPoint2DDouble(0, m_height / 2 - m_borderSize);
161 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -m_height / 2));
162 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, m_height / 2 - 2));
164 else if (m_angle == 180.0) {
165 m_triPts[0] = m_position + wxPoint2DDouble(-m_width / 2 + m_borderSize, 0);
166 m_triPts[1] = m_rect.GetRightTop() + wxPoint2DDouble(-m_borderSize, m_borderSize);
167 m_triPts[2] = m_rect.GetRightBottom() + wxPoint2DDouble(-m_borderSize, -m_borderSize);
168 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(m_width / 2, 0));
169 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-m_width / 2 + 2, 0));
171 else if (m_angle == 270.0) {
172 m_triPts[0] = m_position + wxPoint2DDouble(0, -m_height / 2 + m_borderSize);
173 m_triPts[1] = m_rect.GetRightBottom() + wxPoint2DDouble(-m_borderSize, -m_borderSize);
174 m_triPts[2] = m_rect.GetLeftBottom() + wxPoint2DDouble(m_borderSize, -m_borderSize);
175 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, m_height / 2));
176 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, -m_height / 2 + 2));
187void Gain::SetFont(wxFont& font)
189 if (m_gcText) m_gcText->SetFont(font);
199 m_output = input[0] * m_value;
206 copy->m_gcText = m_gcText ? m_gcText->
GetCopy() :
nullptr;
217rapidxml::xml_node<>* Gain::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
219 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"Gain");
220 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
222 SaveCADProperties(doc, elementNode);
223 SaveControlNodes(doc, elementNode);
226 auto value = XMLParser::AppendNode(doc, elementNode,
"Value");
227 XMLParser::SetNodeValue(doc, value, m_value);
232bool Gain::OpenElement(rapidxml::xml_node<>* elementNode)
234 if (!OpenCADProperties(elementNode))
return false;
235 if (!OpenControlNodes(elementNode))
return false;
238 double value = XMLParser::GetNodeValueDouble(elementNode,
"Value");
Base class of all elements of the program. This class is responsible for manage graphical and his dat...
void SetPosition(const wxPoint2DDouble position)
Set the element position and update the rectangle.
virtual void DrawDCTriangle(std::vector< wxPoint2DDouble > points, wxGraphicsContext *gc) const
Draw rectangle.
static wxString StringFromDouble(double value, int minDecimal=1, int maxDecimals=13)
Convert a double value to string.
Class to draw text on Graphics Context using wxWidgets.
virtual GCText * GetCopy()
Get a deep text copy.
virtual void Draw(wxPoint2DDouble position, wxGraphicsContext *gc, double angle=0.0, wxColour colour= *wxBLACK) const
Draw the text in wxGraphicsContext.
virtual void SetText(wxString text)
Set correctly a new text string.
Provide an output multiplying the input by a constant.
virtual bool ShowForm(wxWindow *parent, Element *element, wxWindow *workspace=nullptr)
Show element data form.
virtual Element * GetCopy()
Get a the element copy.
virtual bool UpdateText()
Update the OpenGL text in the element (if present).
virtual bool Solve(double *input, double timeStep)
Multiply the input by a constant.
virtual void DrawDC(GUIColour *guiColour, wxPoint2DDouble translation, double scale, wxGraphicsContext *gc) const
Draw the element using GDI+.
virtual void Move(wxPoint2DDouble position)
Move the element other position.
virtual void Rotate(bool clockwise=true)
Rotate the element.
Node of a control element. This class manages the user interaction with the connection and control el...