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;
87void Gain::DrawDC(wxPoint2DDouble translation,
double scale, wxGraphicsContext* gc)
const
90 gc->SetPen(*wxTRANSPARENT_PEN);
91 gc->SetBrush(wxBrush(m_selectionColour));
92 double borderSize = (m_borderSize * 2.0 + 1.0) / scale;
93 std::vector<wxPoint2DDouble> m_triSelectedPts;
95 m_triSelectedPts.push_back(m_triPts[0] - wxPoint2DDouble(borderSize / 2, borderSize / 1.5));
96 m_triSelectedPts.push_back(m_triPts[1] - wxPoint2DDouble(borderSize / 2, -borderSize / 1.5));
97 m_triSelectedPts.push_back(m_triPts[2] - wxPoint2DDouble(-borderSize, 0));
99 else if (m_angle == 90.0) {
100 m_triSelectedPts.push_back(m_triPts[0] - wxPoint2DDouble(borderSize / 1.5, borderSize / 2));
101 m_triSelectedPts.push_back(m_triPts[1] - wxPoint2DDouble(-borderSize / 1.5, borderSize / 2));
102 m_triSelectedPts.push_back(m_triPts[2] - wxPoint2DDouble(0, -borderSize));
104 else if (m_angle == 180.0) {
105 m_triSelectedPts.push_back(m_triPts[0] - wxPoint2DDouble(borderSize, 0));
106 m_triSelectedPts.push_back(m_triPts[1] - wxPoint2DDouble(-borderSize / 2, borderSize / 1.5));
107 m_triSelectedPts.push_back(m_triPts[2] - wxPoint2DDouble(-borderSize / 2, -borderSize / 1.5));
109 else if (m_angle == 270.0) {
110 m_triSelectedPts.push_back(m_triPts[0] - wxPoint2DDouble(0, borderSize));
111 m_triSelectedPts.push_back(m_triPts[1] - wxPoint2DDouble(-borderSize / 1.5, -borderSize / 2));
112 m_triSelectedPts.push_back(m_triPts[2] - wxPoint2DDouble(borderSize / 1.5, -borderSize / 2));
122 gc->SetPen(wxPen(wxColour(0, 0, 0, 255), 1));
123 gc->SetBrush(wxBrush(wxColour(255, 255, 255, 255)));
128 m_gcText->
Draw(m_position + wxPoint2DDouble(-m_width / 2 + 2 + m_borderSize, -m_gcText->GetHeight() / 2), gc);
129 else if (m_angle == 90.0)
130 m_gcText->
Draw(m_position + wxPoint2DDouble(-m_gcText->GetWidth() / 2, -m_height / 2 + 2 + m_borderSize), gc);
131 else if (m_angle == 180.0)
132 m_gcText->
Draw(m_position + wxPoint2DDouble(m_width / 2 - m_gcText->GetWidth() - 2 - m_borderSize, -m_gcText->GetHeight() / 2), gc);
133 else if (m_angle == 270.0)
134 m_gcText->
Draw(m_position + wxPoint2DDouble(-m_gcText->GetWidth() / 2, m_height / 2 - m_gcText->GetHeight() - 2 - m_borderSize), gc);
136 gc->SetPen(*wxTRANSPARENT_PEN);
137 gc->SetBrush(wxBrush(wxColour(0, 0, 0, 255)));
144 form.CenterOnParent();
145 if (form.ShowModal() == wxID_OK) {
157 if (m_angle >= 360.0)
159 else if (m_angle < 0)
164 for (
auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) {
166 node->Rotate(clockwise);
170void Gain::SetValue(
double value)
174 if (std::abs(m_value) > 1e3 || std::abs(m_value) < 1e-3)
175 text = wxString::Format(
"%g", m_value);
182 m_gcText =
new GCText(text);
184 m_width = m_gcText->GetWidth() + 18 + 2 * m_borderSize;
185 m_height = m_gcText->GetHeight() + 18 + 2 * m_borderSize;
187 if (m_width > m_height)
197void Gain::UpdatePoints()
199 if (m_nodeList.size() != 0) {
200 if (m_angle == 0.0) {
201 m_triPts[0] = m_rect.GetLeftTop() + wxPoint2DDouble(m_borderSize, m_borderSize);
202 m_triPts[1] = m_rect.GetLeftBottom() + wxPoint2DDouble(m_borderSize, -m_borderSize);
203 m_triPts[2] = m_position + wxPoint2DDouble(m_width / 2 - m_borderSize, 0);
204 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-m_width / 2, 0));
205 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(m_width / 2 - 2, 0));
207 else if (m_angle == 90.0) {
208 m_triPts[0] = m_rect.GetLeftTop() + wxPoint2DDouble(m_borderSize, m_borderSize);
209 m_triPts[1] = m_rect.GetRightTop() + wxPoint2DDouble(-m_borderSize, m_borderSize);
210 m_triPts[2] = m_position + wxPoint2DDouble(0, m_height / 2 - m_borderSize);
211 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -m_height / 2));
212 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, m_height / 2 - 2));
214 else if (m_angle == 180.0) {
215 m_triPts[0] = m_position + wxPoint2DDouble(-m_width / 2 + m_borderSize, 0);
216 m_triPts[1] = m_rect.GetRightTop() + wxPoint2DDouble(-m_borderSize, m_borderSize);
217 m_triPts[2] = m_rect.GetRightBottom() + wxPoint2DDouble(-m_borderSize, -m_borderSize);
218 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(m_width / 2, 0));
219 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-m_width / 2 + 2, 0));
221 else if (m_angle == 270.0) {
222 m_triPts[0] = m_position + wxPoint2DDouble(0, -m_height / 2 + m_borderSize);
223 m_triPts[1] = m_rect.GetRightBottom() + wxPoint2DDouble(-m_borderSize, -m_borderSize);
224 m_triPts[2] = m_rect.GetLeftBottom() + wxPoint2DDouble(m_borderSize, -m_borderSize);
225 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, m_height / 2));
226 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, -m_height / 2 + 2));
243 m_output = input[0] * m_value;
252 copy->m_gcText = m_gcText->
GetCopy();
263rapidxml::xml_node<>* Gain::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
265 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"Gain");
266 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
268 SaveCADProperties(doc, elementNode);
269 SaveControlNodes(doc, elementNode);
272 auto value = XMLParser::AppendNode(doc, elementNode,
"Value");
273 XMLParser::SetNodeValue(doc, value, m_value);
278bool Gain::OpenElement(rapidxml::xml_node<>* elementNode)
280 if (!OpenCADProperties(elementNode))
return false;
281 if (!OpenControlNodes(elementNode))
return false;
284 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 Element * GetCopy()
Get a the element copy.
virtual bool UpdateText()
Update the OpenGL text in the element (if present).
virtual bool ShowForm(wxWindow *parent, Element *element)
Show element data form.
virtual bool Solve(double *input, double timeStep)
Multiply the input by a constant.
virtual void DrawDC(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...