summaryrefslogtreecommitdiffstats
path: root/Project
diff options
context:
space:
mode:
authorThales1330 <thaleslima.ufu@gmail.com>2016-12-29 14:07:52 -0200
committerThales1330 <thaleslima.ufu@gmail.com>2016-12-29 14:07:52 -0200
commit3750a0691f4975045647f3f70d8215fb1884e6fb (patch)
tree3d5dbd283f31004cc6ef826c2b75d5e5ed9d9f27 /Project
parentd792fcf7b2a5862ac86ee69aa86021b5637ca8ee (diff)
downloadPSP.git-3750a0691f4975045647f3f70d8215fb1884e6fb.tar.gz
PSP.git-3750a0691f4975045647f3f70d8215fb1884e6fb.tar.xz
PSP.git-3750a0691f4975045647f3f70d8215fb1884e6fb.zip
Text element paste bug corrected
Diffstat (limited to 'Project')
-rw-r--r--Project/Capacitor.cpp35
-rw-r--r--Project/Element.cpp11
-rw-r--r--Project/Element.h75
-rw-r--r--Project/ElementDataObject.cpp28
-rw-r--r--Project/ElementDataObject.h6
-rw-r--r--Project/Inductor.cpp37
-rw-r--r--Project/PowerFlow.cpp8
-rw-r--r--Project/Project.mk5
-rw-r--r--Project/Release/Bus.cpp.obin51482 -> 51482 bytes
-rw-r--r--Project/Release/BusForm.cpp.obin119105 -> 119004 bytes
-rw-r--r--Project/Release/Capacitor.cpp.obin51864 -> 51864 bytes
-rw-r--r--Project/Release/Element.cpp.obin161927 -> 161826 bytes
-rw-r--r--Project/Release/ElementForm.cpp.obin565883 -> 565564 bytes
-rw-r--r--Project/Release/GeneratorStabForm.cpp.obin104287 -> 104202 bytes
-rw-r--r--Project/Release/IndMotor.cpp.obin44699 -> 44699 bytes
-rw-r--r--Project/Release/IndMotorForm.cpp.obin87201 -> 87116 bytes
-rw-r--r--Project/Release/Inductor.cpp.obin51732 -> 51732 bytes
-rw-r--r--Project/Release/Line.cpp.obin170414 -> 170313 bytes
-rw-r--r--Project/Release/LineForm.cpp.obin101213 -> 101112 bytes
-rw-r--r--Project/Release/Load.cpp.obin50527 -> 50527 bytes
-rw-r--r--Project/Release/LoadForm.cpp.obin86826 -> 86741 bytes
-rw-r--r--Project/Release/MainFrame.cpp.obin155605 -> 155520 bytes
-rw-r--r--Project/Release/MainFrameBase.cpp.obin238256 -> 238171 bytes
-rw-r--r--Project/Release/PSP-UFU.exebin4459899 -> 4451624 bytes
-rw-r--r--Project/Release/PowerFlow.cpp.obin43132 -> 31888 bytes
-rw-r--r--Project/Release/ReactiveShuntElementForm.cpp.obin93200 -> 93115 bytes
-rw-r--r--Project/Release/SwitchingForm.cpp.obin107131 -> 107046 bytes
-rw-r--r--Project/Release/SyncGenerator.cpp.obin50365 -> 50365 bytes
-rw-r--r--Project/Release/SyncMachineForm.cpp.obin123830 -> 123729 bytes
-rw-r--r--Project/Release/SyncMotor.cpp.obin47540 -> 47540 bytes
-rw-r--r--Project/Release/Text.cpp.obin110498 -> 110498 bytes
-rw-r--r--Project/Release/TextForm.cpp.obin165928 -> 165817 bytes
-rw-r--r--Project/Release/Transformer.cpp.obin57842 -> 57842 bytes
-rw-r--r--Project/Release/TransformerForm.cpp.obin108771 -> 108670 bytes
-rw-r--r--Project/Release/Workspace.cpp.obin224123 -> 224878 bytes
-rw-r--r--Project/Release/main.cpp.obin29146 -> 29146 bytes
-rw-r--r--Project/Release/wxmsw310u_gcc_64x.dllbin27581981 -> 27079299 bytes
-rw-r--r--Project/Release/wxmsw310u_gl_gcc_64x.dllbin2634306 -> 2634306 bytes
-rw-r--r--Project/Workspace.cpp1852
39 files changed, 969 insertions, 1088 deletions
diff --git a/Project/Capacitor.cpp b/Project/Capacitor.cpp
index b8d4a7c..a4320c9 100644
--- a/Project/Capacitor.cpp
+++ b/Project/Capacitor.cpp
@@ -1,19 +1,26 @@
#include "ReactiveShuntElementForm.h"
#include "Capacitor.h"
-Capacitor::Capacitor() : Shunt() {}
-Capacitor::Capacitor(wxString name) : Shunt() { m_electricalData.name = name; }
+Capacitor::Capacitor()
+ : Shunt()
+{
+}
+Capacitor::Capacitor(wxString name)
+ : Shunt()
+{
+ m_electricalData.name = name;
+}
Capacitor::~Capacitor() {}
bool Capacitor::AddParent(Element* parent, wxPoint2DDouble position)
{
if(parent) {
m_parentList.push_back(parent);
wxPoint2DDouble parentPt =
- parent->RotateAtPosition(position, -parent->GetAngle()); // Rotate click to horizontal position.
- parentPt.m_y = parent->GetPosition().m_y; // Centralize on bus.
- parentPt = parent->RotateAtPosition(parentPt, parent->GetAngle()); // Rotate back.
+ parent->RotateAtPosition(position, -parent->GetAngle()); // Rotate click to horizontal position.
+ parentPt.m_y = parent->GetPosition().m_y; // Centralize on bus.
+ parentPt = parent->RotateAtPosition(parentPt, parent->GetAngle()); // Rotate back.
- m_position = parentPt + wxPoint2DDouble(0.0, 100.0); // Shifts the position to the down of the bus.
+ m_position = parentPt + wxPoint2DDouble(0.0, 100.0); // Shifts the position to the down of the bus.
m_width = 40;
m_height = 30;
m_rect = wxRect2DDouble(m_position.m_x - m_width / 2.0, m_position.m_y - m_height / 2.0, m_width, m_height);
@@ -26,7 +33,7 @@ bool Capacitor::AddParent(Element* parent, wxPoint2DDouble position)
m_inserted = true;
wxRect2DDouble genRect(0, 0, 0, 0);
- m_switchRect.push_back(genRect); // Push a general rectangle.
+ m_switchRect.push_back(genRect); // Push a general rectangle.
UpdateSwitches();
return true;
@@ -37,9 +44,11 @@ bool Capacitor::AddParent(Element* parent, wxPoint2DDouble position)
void Capacitor::Draw(wxPoint2DDouble translation, double scale) const
{
OpenGLColour elementColour;
- if(m_online) elementColour = m_onlineElementColour;
- else elementColour = m_offlineElementColour;
-
+ if(m_online)
+ elementColour = m_onlineElementColour;
+ else
+ elementColour = m_offlineElementColour;
+
if(m_inserted) {
std::vector<wxPoint2DDouble> capPts;
capPts.push_back(wxPoint2DDouble(m_position.m_x - m_width / 2.0, m_position.m_y - m_height / 2.0));
@@ -156,7 +165,7 @@ CapacitorElectricalData Capacitor::GetPUElectricalData(double systemPowerBase)
Element* Capacitor::GetCopy()
{
- Capacitor* copy = new Capacitor();
- *copy = *this;
- return copy;
+ Capacitor* copy = new Capacitor();
+ *copy = *this;
+ return copy;
}
diff --git a/Project/Element.cpp b/Project/Element.cpp
index be93cc5..4de5ebd 100644
--- a/Project/Element.cpp
+++ b/Project/Element.cpp
@@ -11,9 +11,7 @@ Element::Element()
m_powerFlowArrowColour.SetRGBA(1.0, 0.51, 0.0, 1.0);
}
-Element::~Element()
-{
-}
+Element::~Element() {}
void Element::SetPosition(const wxPoint2DDouble position)
{
@@ -466,12 +464,9 @@ void OpenGLColour::SetRGBA(GLdouble red, GLdouble green, GLdouble blue, GLdouble
rgba[3] = alpha;
}
-OpenGLColour::OpenGLColour()
-{
- SetRGBA(1.0, 1.0, 1.0, 1.0);
-}
+OpenGLColour::OpenGLColour() { SetRGBA(1.0, 1.0, 1.0, 1.0); }
OpenGLColour::OpenGLColour(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)
{
- SetRGBA(red, green, blue, alpha);
+ SetRGBA(red, green, blue, alpha);
}
diff --git a/Project/Element.h b/Project/Element.h
index d5443de..67e0762 100644
--- a/Project/Element.h
+++ b/Project/Element.h
@@ -11,8 +11,7 @@
#include <wx/log.h>
-enum PickboxID
-{
+enum PickboxID {
ID_PB_NONE = 0,
ID_PB_RIGHT,
ID_PB_LEFT,
@@ -22,8 +21,7 @@ enum PickboxID
ID_PB_LEFT_TOP
};
-enum ContextMenuID
-{
+enum ContextMenuID {
ID_EDIT_BUS = 0,
ID_EDIT_LINE,
ID_EDIT_TRANSFORMER,
@@ -42,8 +40,7 @@ enum ContextMenuID
ID_DELETE
};
-enum ElectricalUnit
-{
+enum ElectricalUnit {
UNIT_PU = 0,
UNIT_V,
UNIT_kV,
@@ -66,8 +63,7 @@ enum ElectricalUnit
UNIT_RADIAN
};
-enum FaultData
-{
+enum FaultData {
FAULT_THREEPHASE = 0,
FAULT_2LINE,
FAULT_2LINE_GROUND,
@@ -77,42 +73,30 @@ enum FaultData
FAULT_LINE_C
};
-enum SwitchingType
-{
- SW_INSERT = 0,
- SW_REMOVE
-};
+enum SwitchingType { SW_INSERT = 0, SW_REMOVE };
-enum PowerFlowDirection
-{
- PF_NONE = 0,
- PF_TO_BUS,
- PF_TO_ELEMENT,
- PF_BUS1_TO_BUS2,
- PF_BUS2_TO_BUS1
-};
+enum PowerFlowDirection { PF_NONE = 0, PF_TO_BUS, PF_TO_ELEMENT, PF_BUS1_TO_BUS2, PF_BUS2_TO_BUS1 };
-struct SwitchingData
-{
+struct SwitchingData {
std::vector<SwitchingType> swType;
std::vector<double> swTime;
};
class OpenGLColour
{
- public:
+public:
OpenGLColour();
OpenGLColour(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
virtual ~OpenGLColour() {}
void SetRGBA(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
const GLdouble* GetRGBA() const { return rgba; }
- protected:
+protected:
GLdouble rgba[4];
};
class Element
{
- public:
+public:
Element();
virtual ~Element();
@@ -159,9 +143,8 @@ class Element
virtual void RemoveParent(Element* parent) {}
virtual void ReplaceParent(Element* oldParent, Element* newParent);
virtual void RotateNode(Element* parent, bool clockwise = true) {}
- virtual wxPoint2DDouble GetSwitchPoint(Element* parent,
- wxPoint2DDouble parentPoint,
- wxPoint2DDouble secondPoint) const;
+ virtual wxPoint2DDouble
+ GetSwitchPoint(Element* parent, wxPoint2DDouble parentPoint, wxPoint2DDouble secondPoint) const;
virtual bool SwitchesContains(wxPoint2DDouble position) const;
virtual void UpdateSwitches();
virtual void DrawSwitches() const;
@@ -174,27 +157,23 @@ class Element
virtual wxCursor GetBestPickboxCursor() const { return wxCURSOR_ARROW; }
virtual void ResetPickboxes() { m_activePickboxID = ID_PB_NONE; }
virtual void ResetNodes() { m_activeNodeID = 0; }
- virtual wxPoint2DDouble WorldToScreen(wxPoint2DDouble translation,
- double scale,
- double offsetX = 0.0,
- double offsetY = 0.0) const;
+ virtual wxPoint2DDouble
+ WorldToScreen(wxPoint2DDouble translation, double scale, double offsetX = 0.0, double offsetY = 0.0) const;
virtual wxPoint2DDouble WorldToScreen(wxPoint2DDouble position,
- wxPoint2DDouble translation,
- double scale,
- double offsetX = 0.0,
- double offsetY = 0.0) const;
- virtual bool RotatedRectanglesIntersects(wxRect2DDouble rect1,
- wxRect2DDouble rect2,
- double angle1,
- double angle2) const;
+ wxPoint2DDouble translation,
+ double scale,
+ double offsetX = 0.0,
+ double offsetY = 0.0) const;
+ virtual bool
+ RotatedRectanglesIntersects(wxRect2DDouble rect1, wxRect2DDouble rect2, double angle1, double angle2) const;
virtual void DrawCircle(wxPoint2DDouble position, double radius, int numSegments, GLenum mode = GL_LINE_LOOP) const;
virtual void DrawArc(wxPoint2DDouble position,
- double radius,
- double initAngle,
- double finalAngle,
- int numSegments,
- GLenum mode = GL_LINE_LOOP) const;
+ double radius,
+ double initAngle,
+ double finalAngle,
+ int numSegments,
+ GLenum mode = GL_LINE_LOOP) const;
virtual void DrawRectangle(wxPoint2DDouble position, double width, double height, GLenum mode = GL_QUADS) const;
virtual void DrawRectangle(wxPoint2DDouble* points, GLenum mode = GL_QUADS) const;
virtual void DrawTriangle(std::vector<wxPoint2DDouble> points, GLenum mode = GL_TRIANGLES) const;
@@ -225,7 +204,7 @@ class Element
// Static methods
static wxString StringFromDouble(double value, int minDecimal = 1);
- protected:
+protected:
std::vector<Element*> m_parentList;
wxRect2DDouble m_rect;
@@ -268,4 +247,4 @@ class Element
SwitchingData m_swData;
};
-#endif // ELEMENT_H
+#endif // ELEMENT_H
diff --git a/Project/ElementDataObject.cpp b/Project/ElementDataObject.cpp
index ff2feed..a5ac165 100644
--- a/Project/ElementDataObject.cpp
+++ b/Project/ElementDataObject.cpp
@@ -1,25 +1,27 @@
#include "ElementDataObject.h"
-ElementDataObject::ElementDataObject() : wxDataObjectSimple(wxDataFormat("PSPCopy"))
+ElementDataObject::ElementDataObject()
+ : wxDataObjectSimple(wxDataFormat("PSPCopy"))
{
m_elementsLists = new ElementsLists();
}
-ElementDataObject::ElementDataObject(std::vector<Element*> elementList) : wxDataObjectSimple(wxDataFormat("PSPCopy"))
+ElementDataObject::ElementDataObject(std::vector<Element*> elementList)
+ : wxDataObjectSimple(wxDataFormat("PSPCopy"))
{
m_elementsLists = new ElementsLists();
if(elementList.size() > 0) {
- // Separate buses (parents) from the rest of the elements (childs).
- for(auto it = elementList.begin(), itEnd = elementList.end(); it != itEnd; ++it) {
- Element* copy = (*it)->GetCopy();
- if(copy) {
- if(typeid(*copy) == typeid(Bus))
- m_elementsLists->parentList.push_back((Bus*)copy);
- else
- m_elementsLists->elementList.push_back(copy);
- }
- }
- }
+ // Separate buses (parents) from the rest of the elements (childs).
+ for(auto it = elementList.begin(), itEnd = elementList.end(); it != itEnd; ++it) {
+ Element* copy = (*it)->GetCopy();
+ if(copy) {
+ if(typeid(*copy) == typeid(Bus))
+ m_elementsLists->parentList.push_back((Bus*)copy);
+ else
+ m_elementsLists->elementList.push_back(copy);
+ }
+ }
+ }
}
ElementDataObject::~ElementDataObject() {}
diff --git a/Project/ElementDataObject.h b/Project/ElementDataObject.h
index 37b1cbe..646e76c 100644
--- a/Project/ElementDataObject.h
+++ b/Project/ElementDataObject.h
@@ -5,21 +5,21 @@
#include <wx/dataobj.h>
struct ElementsLists {
- std::vector<Element*> elementList;
+ std::vector<Element*> elementList;
std::vector<Bus*> parentList;
};
class ElementDataObject : public wxDataObjectSimple
{
public:
- ElementDataObject();
+ ElementDataObject();
ElementDataObject(std::vector<Element*> elementList);
~ElementDataObject();
size_t GetDataSize() const override;
bool GetDataHere(void* buf) const override;
bool SetData(size_t len, const void* buf) override;
-
+
ElementsLists* GetElementsLists() { return m_elementsLists; }
protected:
diff --git a/Project/Inductor.cpp b/Project/Inductor.cpp
index ffce7d9..b3f80d9 100644
--- a/Project/Inductor.cpp
+++ b/Project/Inductor.cpp
@@ -1,19 +1,26 @@
#include "ReactiveShuntElementForm.h"
#include "Inductor.h"
-Inductor::Inductor() : Shunt() {}
-Inductor::Inductor(wxString name) : Shunt() { m_electricalData.name = name; }
+Inductor::Inductor()
+ : Shunt()
+{
+}
+Inductor::Inductor(wxString name)
+ : Shunt()
+{
+ m_electricalData.name = name;
+}
Inductor::~Inductor() {}
bool Inductor::AddParent(Element* parent, wxPoint2DDouble position)
{
if(parent) {
m_parentList.push_back(parent);
wxPoint2DDouble parentPt =
- parent->RotateAtPosition(position, -parent->GetAngle()); // Rotate click to horizontal position.
- parentPt.m_y = parent->GetPosition().m_y; // Centralize on bus.
- parentPt = parent->RotateAtPosition(parentPt, parent->GetAngle()); // Rotate back.
+ parent->RotateAtPosition(position, -parent->GetAngle()); // Rotate click to horizontal position.
+ parentPt.m_y = parent->GetPosition().m_y; // Centralize on bus.
+ parentPt = parent->RotateAtPosition(parentPt, parent->GetAngle()); // Rotate back.
- m_position = parentPt + wxPoint2DDouble(0.0, 100.0); // Shifts the position to the down of the bus.
+ m_position = parentPt + wxPoint2DDouble(0.0, 100.0); // Shifts the position to the down of the bus.
m_width = 20.0;
m_height = 70.0;
m_rect = wxRect2DDouble(m_position.m_x - m_width / 2.0, m_position.m_y - m_height / 2.0, m_width, m_height);
@@ -26,7 +33,7 @@ bool Inductor::AddParent(Element* parent, wxPoint2DDouble position)
m_inserted = true;
wxRect2DDouble genRect(0, 0, 0, 0);
- m_switchRect.push_back(genRect); // Push a general rectangle.
+ m_switchRect.push_back(genRect); // Push a general rectangle.
UpdateSwitches();
return true;
@@ -37,9 +44,11 @@ bool Inductor::AddParent(Element* parent, wxPoint2DDouble position)
void Inductor::Draw(wxPoint2DDouble translation, double scale) const
{
OpenGLColour elementColour;
- if(m_online) elementColour = m_onlineElementColour;
- else elementColour = m_offlineElementColour;
-
+ if(m_online)
+ elementColour = m_onlineElementColour;
+ else
+ elementColour = m_offlineElementColour;
+
if(m_inserted) {
if(m_selected) {
glLineWidth(1.5 + m_borderSize * 2.0);
@@ -144,13 +153,13 @@ InductorElectricalData Inductor::GetPUElectricalData(double systemPowerBase)
default:
break;
}
-
+
return data;
}
Element* Inductor::GetCopy()
{
- Inductor* copy = new Inductor();
- *copy = *this;
- return copy;
+ Inductor* copy = new Inductor();
+ *copy = *this;
+ return copy;
}
diff --git a/Project/PowerFlow.cpp b/Project/PowerFlow.cpp
index 023ce26..c94d8d8 100644
--- a/Project/PowerFlow.cpp
+++ b/Project/PowerFlow.cpp
@@ -278,13 +278,5 @@ bool PowerFlow::RunGaussSeidel(double systemPowerBase,
UpdateElementsPowerFlow(voltage, power, oldBusType, reactiveLimit, systemPowerBase);
- wxString str = "";
- for(auto itb = m_busList.begin(); itb != m_busList.end(); itb++) {
- Bus* bus = *itb;
- BusElectricalData data = bus->GetEletricalData();
- str += wxString::Format("%.5f/_%.2f\n", std::abs(data.voltage), wxRadToDeg(std::arg(data.voltage)));
- }
- wxLogMessage(str);
-
return true;
}
diff --git a/Project/Project.mk b/Project/Project.mk
index e1411d9..6d4aebd 100644
--- a/Project/Project.mk
+++ b/Project/Project.mk
@@ -14,7 +14,7 @@ CurrentFilePath :=
CurrentFileFullPath :=
User :=Thales
Date :=29/12/2016
-CodeLitePath :="C:/Program Files (x86)/CodeLite"
+CodeLitePath :="C:/Program Files/CodeLite"
LinkerName :=C:/TDM-GCC-64/bin/g++.exe
SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC
ObjectSuffix :=.o
@@ -61,8 +61,7 @@ AS := C:/TDM-GCC-64/bin/as.exe
##
## User defined environment variables
##
-CodeLiteDir:=C:\Program Files (x86)\CodeLite
-UNIT_TEST_PP_SRC_DIR:=C:\UnitTest++-1.3
+CodeLiteDir:=C:\Program Files\CodeLite
WXWIN:=C:\wxWidgets-3.1.0
WXCFG:=gcc_dll\mswu
Objects0=$(IntermediateDirectory)/main.cpp$(ObjectSuffix) $(IntermediateDirectory)/win_resources.rc$(ObjectSuffix) $(IntermediateDirectory)/Text.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElementDataObject.cpp$(ObjectSuffix) $(IntermediateDirectory)/ArtMetro.cpp$(ObjectSuffix) $(IntermediateDirectory)/wxGLString.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrame.cpp$(ObjectSuffix) $(IntermediateDirectory)/Workspace.cpp$(ObjectSuffix) $(IntermediateDirectory)/FileHanding.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrameBitmaps.cpp$(ObjectSuffix) \
diff --git a/Project/Release/Bus.cpp.o b/Project/Release/Bus.cpp.o
index b23e8eb..a8b586f 100644
--- a/Project/Release/Bus.cpp.o
+++ b/Project/Release/Bus.cpp.o
Binary files differ
diff --git a/Project/Release/BusForm.cpp.o b/Project/Release/BusForm.cpp.o
index cc6b454..028f7ff 100644
--- a/Project/Release/BusForm.cpp.o
+++ b/Project/Release/BusForm.cpp.o
Binary files differ
diff --git a/Project/Release/Capacitor.cpp.o b/Project/Release/Capacitor.cpp.o
index 739e951..7ce764b 100644
--- a/Project/Release/Capacitor.cpp.o
+++ b/Project/Release/Capacitor.cpp.o
Binary files differ
diff --git a/Project/Release/Element.cpp.o b/Project/Release/Element.cpp.o
index b11b443..866bd66 100644
--- a/Project/Release/Element.cpp.o
+++ b/Project/Release/Element.cpp.o
Binary files differ
diff --git a/Project/Release/ElementForm.cpp.o b/Project/Release/ElementForm.cpp.o
index 2fbdd20..a6cbbf8 100644
--- a/Project/Release/ElementForm.cpp.o
+++ b/Project/Release/ElementForm.cpp.o
Binary files differ
diff --git a/Project/Release/GeneratorStabForm.cpp.o b/Project/Release/GeneratorStabForm.cpp.o
index 95fb64a..51022f9 100644
--- a/Project/Release/GeneratorStabForm.cpp.o
+++ b/Project/Release/GeneratorStabForm.cpp.o
Binary files differ
diff --git a/Project/Release/IndMotor.cpp.o b/Project/Release/IndMotor.cpp.o
index e196bcb..672e91e 100644
--- a/Project/Release/IndMotor.cpp.o
+++ b/Project/Release/IndMotor.cpp.o
Binary files differ
diff --git a/Project/Release/IndMotorForm.cpp.o b/Project/Release/IndMotorForm.cpp.o
index 57bcd39..9d803e3 100644
--- a/Project/Release/IndMotorForm.cpp.o
+++ b/Project/Release/IndMotorForm.cpp.o
Binary files differ
diff --git a/Project/Release/Inductor.cpp.o b/Project/Release/Inductor.cpp.o
index 4c50d11..e7c996a 100644
--- a/Project/Release/Inductor.cpp.o
+++ b/Project/Release/Inductor.cpp.o
Binary files differ
diff --git a/Project/Release/Line.cpp.o b/Project/Release/Line.cpp.o
index e91c5e1..ba713e2 100644
--- a/Project/Release/Line.cpp.o
+++ b/Project/Release/Line.cpp.o
Binary files differ
diff --git a/Project/Release/LineForm.cpp.o b/Project/Release/LineForm.cpp.o
index 020011d..298d75a 100644
--- a/Project/Release/LineForm.cpp.o
+++ b/Project/Release/LineForm.cpp.o
Binary files differ
diff --git a/Project/Release/Load.cpp.o b/Project/Release/Load.cpp.o
index 846317d..f38aae6 100644
--- a/Project/Release/Load.cpp.o
+++ b/Project/Release/Load.cpp.o
Binary files differ
diff --git a/Project/Release/LoadForm.cpp.o b/Project/Release/LoadForm.cpp.o
index 4fb2a0e..2072699 100644
--- a/Project/Release/LoadForm.cpp.o
+++ b/Project/Release/LoadForm.cpp.o
Binary files differ
diff --git a/Project/Release/MainFrame.cpp.o b/Project/Release/MainFrame.cpp.o
index 6889907..a7639f0 100644
--- a/Project/Release/MainFrame.cpp.o
+++ b/Project/Release/MainFrame.cpp.o
Binary files differ
diff --git a/Project/Release/MainFrameBase.cpp.o b/Project/Release/MainFrameBase.cpp.o
index ec938af..3cf1c3e 100644
--- a/Project/Release/MainFrameBase.cpp.o
+++ b/Project/Release/MainFrameBase.cpp.o
Binary files differ
diff --git a/Project/Release/PSP-UFU.exe b/Project/Release/PSP-UFU.exe
index bf9a5a4..c66b8dc 100644
--- a/Project/Release/PSP-UFU.exe
+++ b/Project/Release/PSP-UFU.exe
Binary files differ
diff --git a/Project/Release/PowerFlow.cpp.o b/Project/Release/PowerFlow.cpp.o
index 73590b6..670fffe 100644
--- a/Project/Release/PowerFlow.cpp.o
+++ b/Project/Release/PowerFlow.cpp.o
Binary files differ
diff --git a/Project/Release/ReactiveShuntElementForm.cpp.o b/Project/Release/ReactiveShuntElementForm.cpp.o
index af53698..951d7f8 100644
--- a/Project/Release/ReactiveShuntElementForm.cpp.o
+++ b/Project/Release/ReactiveShuntElementForm.cpp.o
Binary files differ
diff --git a/Project/Release/SwitchingForm.cpp.o b/Project/Release/SwitchingForm.cpp.o
index 453f2e9..00668c4 100644
--- a/Project/Release/SwitchingForm.cpp.o
+++ b/Project/Release/SwitchingForm.cpp.o
Binary files differ
diff --git a/Project/Release/SyncGenerator.cpp.o b/Project/Release/SyncGenerator.cpp.o
index f594135..ec0e7ae 100644
--- a/Project/Release/SyncGenerator.cpp.o
+++ b/Project/Release/SyncGenerator.cpp.o
Binary files differ
diff --git a/Project/Release/SyncMachineForm.cpp.o b/Project/Release/SyncMachineForm.cpp.o
index 4976057..8239d77 100644
--- a/Project/Release/SyncMachineForm.cpp.o
+++ b/Project/Release/SyncMachineForm.cpp.o
Binary files differ
diff --git a/Project/Release/SyncMotor.cpp.o b/Project/Release/SyncMotor.cpp.o
index df88b3c..c882bf6 100644
--- a/Project/Release/SyncMotor.cpp.o
+++ b/Project/Release/SyncMotor.cpp.o
Binary files differ
diff --git a/Project/Release/Text.cpp.o b/Project/Release/Text.cpp.o
index 5006c69..2f2c0b8 100644
--- a/Project/Release/Text.cpp.o
+++ b/Project/Release/Text.cpp.o
Binary files differ
diff --git a/Project/Release/TextForm.cpp.o b/Project/Release/TextForm.cpp.o
index 69a7459..6881ff3 100644
--- a/Project/Release/TextForm.cpp.o
+++ b/Project/Release/TextForm.cpp.o
Binary files differ
diff --git a/Project/Release/Transformer.cpp.o b/Project/Release/Transformer.cpp.o
index fa97dd1..449b86c 100644
--- a/Project/Release/Transformer.cpp.o
+++ b/Project/Release/Transformer.cpp.o
Binary files differ
diff --git a/Project/Release/TransformerForm.cpp.o b/Project/Release/TransformerForm.cpp.o
index 045aaf1..58055cf 100644
--- a/Project/Release/TransformerForm.cpp.o
+++ b/Project/Release/TransformerForm.cpp.o
Binary files differ
diff --git a/Project/Release/Workspace.cpp.o b/Project/Release/Workspace.cpp.o
index 62ae383..d2d4a85 100644
--- a/Project/Release/Workspace.cpp.o
+++ b/Project/Release/Workspace.cpp.o
Binary files differ
diff --git a/Project/Release/main.cpp.o b/Project/Release/main.cpp.o
index e27c6a6..9925528 100644
--- a/Project/Release/main.cpp.o
+++ b/Project/Release/main.cpp.o
Binary files differ
diff --git a/Project/Release/wxmsw310u_gcc_64x.dll b/Project/Release/wxmsw310u_gcc_64x.dll
index 6a09726..ca43121 100644
--- a/Project/Release/wxmsw310u_gcc_64x.dll
+++ b/Project/Release/wxmsw310u_gcc_64x.dll
Binary files differ
diff --git a/Project/Release/wxmsw310u_gl_gcc_64x.dll b/Project/Release/wxmsw310u_gl_gcc_64x.dll
index 61ac9c7..f9e60dd 100644
--- a/Project/Release/wxmsw310u_gl_gcc_64x.dll
+++ b/Project/Release/wxmsw310u_gl_gcc_64x.dll
Binary files differ
diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp
index 70416b6..2894ed2 100644
--- a/Project/Workspace.cpp
+++ b/Project/Workspace.cpp
@@ -26,8 +26,8 @@ Camera::Camera()
Camera::~Camera() {}
wxPoint2DDouble Camera::ScreenToWorld(wxPoint2DDouble screenCoords) const
{
- return wxPoint2DDouble(screenCoords.m_x / m_scale - m_translation.m_x,
- screenCoords.m_y / m_scale - m_translation.m_y);
+ return wxPoint2DDouble(
+ screenCoords.m_x / m_scale - m_translation.m_x, screenCoords.m_y / m_scale - m_translation.m_y);
}
void Camera::SetTranslation(wxPoint2DDouble screenPoint)
@@ -55,8 +55,12 @@ wxPoint2DDouble Camera::GetMousePosition(bool worldCoords) const
}
// Workspace
-Workspace::Workspace() : WorkspaceBase(NULL) {}
-Workspace::Workspace(wxWindow* parent, wxString name, wxStatusBar* statusBar) : WorkspaceBase(parent)
+Workspace::Workspace()
+ : WorkspaceBase(NULL)
+{
+}
+Workspace::Workspace(wxWindow* parent, wxString name, wxStatusBar* statusBar)
+ : WorkspaceBase(parent)
{
m_name = name;
m_statusBar = statusBar;
@@ -65,18 +69,18 @@ Workspace::Workspace(wxWindow* parent, wxString name, wxStatusBar* statusBar) :
m_selectionRect = wxRect2DDouble(0, 0, 0, 0);
for(int i = 0; i < NUM_ELEMENTS; ++i) {
- m_elementNumber[i] = 1;
- }
+ m_elementNumber[i] = 1;
+ }
- const int widths[4] = {-3, -1, 100, 100};
+ const int widths[4] = { -3, -1, 100, 100 };
m_statusBar->SetStatusWidths(4, widths);
}
Workspace::~Workspace()
{
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- if(*it) delete *it;
- }
+ if(*it) delete *it;
+ }
m_elementList.clear();
if(m_camera) delete m_camera;
}
@@ -88,22 +92,22 @@ void Workspace::OnPaint(wxPaintEvent& event)
SetViewport();
// Set GLCanvas scale and translation.
- glScaled(m_camera->GetScale(), m_camera->GetScale(), 0.0); // Scale
- glTranslated(m_camera->GetTranslation().m_x, m_camera->GetTranslation().m_y, 0.0); // Translation
+ glScaled(m_camera->GetScale(), m_camera->GetScale(), 0.0); // Scale
+ glTranslated(m_camera->GetTranslation().m_x, m_camera->GetTranslation().m_y, 0.0); // Translation
// Draw
// Elements
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- element->Draw(m_camera->GetTranslation(), m_camera->GetScale());
- }
+ Element* element = *it;
+ element->Draw(m_camera->GetTranslation(), m_camera->GetScale());
+ }
// Texts
for(auto it = m_textList.begin(); it != m_textList.end(); ++it) {
- Text* text = *it;
- text->Draw(m_camera->GetTranslation(), m_camera->GetScale());
- }
+ Text* text = *it;
+ text->Draw(m_camera->GetTranslation(), m_camera->GetScale());
+ }
// Selection rectangle
glLineWidth(1.0);
@@ -122,14 +126,14 @@ void Workspace::OnPaint(wxPaintEvent& event)
glVertex2d(m_selectionRect.m_x + m_selectionRect.m_width, m_selectionRect.m_y);
glEnd();
- glFlush(); // Sends all pending information directly to the GPU.
+ glFlush(); // Sends all pending information directly to the GPU.
m_glCanvas->SwapBuffers();
event.Skip();
}
void Workspace::SetViewport()
{
- glClearColor(1.0, 1.0, 1.0, 1.0); // White background.
+ glClearColor(1.0, 1.0, 1.0, 1.0); // White background.
glClear(GL_COLOR_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
@@ -156,103 +160,95 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event)
{
bool foundElement = false;
if(m_mode == MODE_INSERT_TEXT || m_mode == MODE_PASTE) {
- m_mode = MODE_EDIT;
- }
- else if(m_mode == MODE_INSERT || m_mode == MODE_DRAG_INSERT || m_mode == MODE_DRAG_INSERT_TEXT)
- {
- // Get the last element inserted on the list.
- Element* newElement = *(m_elementList.end() - 1);
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- // Clicked in any element.
- if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- // Click at a bus.
- if(typeid(*element) == typeid(Bus)) {
- // Select the bus.
- element->SetSelected();
- foundElement = true; // Element found.
- // Add the new element's parent. If the element being inserted returns true, back to
- // edit mode.
- if(newElement->AddParent(element, m_camera->ScreenToWorld(event.GetPosition()))) {
- ValidateElementsVoltages();
- m_mode = MODE_EDIT;
- }
- }
- }
- }
- // The line element can have an indefined number of points.
- if(!foundElement) {
- if(typeid(*newElement) == typeid(Line)) {
- newElement->AddPoint(m_camera->ScreenToWorld(event.GetPosition()));
- }
- }
- foundElement = true;
- }
- else
- {
- bool clickPickbox = false;
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- element->ResetPickboxes(); // Reset pickbox state.
-
- // Set movement initial position (not necessarily will be moved).
- element->StartMove(m_camera->ScreenToWorld(event.GetPosition()));
-
- // Click in selected element node.
- if(element->NodeContains(m_camera->ScreenToWorld(event.GetPosition())) != 0 &&
- element->IsSelected())
- {
- m_mode = MODE_MOVE_NODE;
- foundElement = true;
- }
-
- // Click in an element.
- else if(element->Contains(m_camera->ScreenToWorld(event.GetPosition())))
- {
- if(!foundElement) {
- // Select and show pickbox.
- element->SetSelected();
- element->ShowPickbox();
- foundElement = true;
- }
- // If pickbox contains the click, move the pickbox
- if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
- m_mode = MODE_MOVE_PICKBOX;
- clickPickbox = true;
- }
- // If didn't found a pickbox, move the element
- if(!clickPickbox) {
- m_mode = MODE_MOVE_ELEMENT;
- }
- }
-
- // Click in a switch.
- else if(element->SwitchesContains(m_camera->ScreenToWorld(event.GetPosition())))
- {
- element->SetOnline(element->IsOnline() ? false : true);
- }
- }
-
- // Text element
- for(auto it = m_textList.begin(); it != m_textList.end(); it++) {
- Text* text = *it;
-
- text->StartMove(m_camera->ScreenToWorld(event.GetPosition()));
-
- if(text->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- if(!foundElement) {
- text->SetSelected();
- m_mode = MODE_MOVE_ELEMENT;
- foundElement = true;
- }
- }
- }
- }
+ m_mode = MODE_EDIT;
+ } else if(m_mode == MODE_INSERT || m_mode == MODE_DRAG_INSERT || m_mode == MODE_DRAG_INSERT_TEXT) {
+ // Get the last element inserted on the list.
+ Element* newElement = *(m_elementList.end() - 1);
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ // Clicked in any element.
+ if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ // Click at a bus.
+ if(typeid(*element) == typeid(Bus)) {
+ // Select the bus.
+ element->SetSelected();
+ foundElement = true; // Element found.
+ // Add the new element's parent. If the element being inserted returns true, back to
+ // edit mode.
+ if(newElement->AddParent(element, m_camera->ScreenToWorld(event.GetPosition()))) {
+ ValidateElementsVoltages();
+ m_mode = MODE_EDIT;
+ }
+ }
+ }
+ }
+ // The line element can have an indefined number of points.
+ if(!foundElement) {
+ if(typeid(*newElement) == typeid(Line)) {
+ newElement->AddPoint(m_camera->ScreenToWorld(event.GetPosition()));
+ }
+ }
+ foundElement = true;
+ } else {
+ bool clickPickbox = false;
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ element->ResetPickboxes(); // Reset pickbox state.
+
+ // Set movement initial position (not necessarily will be moved).
+ element->StartMove(m_camera->ScreenToWorld(event.GetPosition()));
+
+ // Click in selected element node.
+ if(element->NodeContains(m_camera->ScreenToWorld(event.GetPosition())) != 0 && element->IsSelected()) {
+ m_mode = MODE_MOVE_NODE;
+ foundElement = true;
+ }
+
+ // Click in an element.
+ else if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ if(!foundElement) {
+ // Select and show pickbox.
+ element->SetSelected();
+ element->ShowPickbox();
+ foundElement = true;
+ }
+ // If pickbox contains the click, move the pickbox
+ if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ m_mode = MODE_MOVE_PICKBOX;
+ clickPickbox = true;
+ }
+ // If didn't found a pickbox, move the element
+ if(!clickPickbox) {
+ m_mode = MODE_MOVE_ELEMENT;
+ }
+ }
+
+ // Click in a switch.
+ else if(element->SwitchesContains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ element->SetOnline(element->IsOnline() ? false : true);
+ }
+ }
+
+ // Text element
+ for(auto it = m_textList.begin(); it != m_textList.end(); it++) {
+ Text* text = *it;
+
+ text->StartMove(m_camera->ScreenToWorld(event.GetPosition()));
+
+ if(text->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ if(!foundElement) {
+ text->SetSelected();
+ m_mode = MODE_MOVE_ELEMENT;
+ foundElement = true;
+ }
+ }
+ }
+ }
if(!foundElement) {
- m_mode = MODE_SELECTION_RECT;
- m_startSelRect = m_camera->ScreenToWorld(event.GetPosition());
- }
+ m_mode = MODE_SELECTION_RECT;
+ m_startSelRect = m_camera->ScreenToWorld(event.GetPosition());
+ }
Redraw();
UpdateStatusBar();
@@ -265,67 +261,64 @@ void Workspace::OnLeftDoubleClick(wxMouseEvent& event)
bool redraw = false;
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
-
- // Click in an element.
- if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- bool elementIsBus = false;
- Bus oldBus;
- if(typeid(*element) == typeid(Bus)) {
- elementIsBus = true;
- oldBus = *(Bus*)element;
- }
- element->ShowForm(this, element);
- elementEdited = true;
- redraw = true;
-
- // If the edited element is a bus and was changed the nominal voltage, this voltage must be
- // propagated through the lines
- if(elementIsBus) {
- // The voltage was changed
- if(oldBus.GetEletricalData().nominalVoltage !=
- ((Bus*)element)->GetEletricalData().nominalVoltage ||
- oldBus.GetEletricalData().nominalVoltageUnit !=
- ((Bus*)element)->GetEletricalData().nominalVoltageUnit)
- {
- // Check if the lines has this bus as parent
- for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) {
- Element* child = *it;
-
- bool elementIsParent = false;
- if(typeid(*child) == typeid(Line)) {
- for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Element* parent = child->GetParentList()[i];
- if(parent == element) {
- // TODO: Ask the user if he wants to change all
- // voltages
- ValidateBusesVoltages(element);
- elementIsParent = true;
- }
- }
- }
- if(elementIsParent) break;
- }
- }
- ValidateElementsVoltages();
- }
- }
-
- // Click in a switch.
- else if(element->SwitchesContains(m_camera->ScreenToWorld(event.GetPosition())))
- {
- element->SetOnline(element->IsOnline() ? false : true);
- }
- }
+ Element* element = *it;
+
+ // Click in an element.
+ if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ bool elementIsBus = false;
+ Bus oldBus;
+ if(typeid(*element) == typeid(Bus)) {
+ elementIsBus = true;
+ oldBus = *(Bus*)element;
+ }
+ element->ShowForm(this, element);
+ elementEdited = true;
+ redraw = true;
+
+ // If the edited element is a bus and was changed the nominal voltage, this voltage must be
+ // propagated through the lines
+ if(elementIsBus) {
+ // The voltage was changed
+ if(oldBus.GetEletricalData().nominalVoltage != ((Bus*)element)->GetEletricalData().nominalVoltage ||
+ oldBus.GetEletricalData().nominalVoltageUnit !=
+ ((Bus*)element)->GetEletricalData().nominalVoltageUnit) {
+ // Check if the lines has this bus as parent
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) {
+ Element* child = *it;
+
+ bool elementIsParent = false;
+ if(typeid(*child) == typeid(Line)) {
+ for(int i = 0; i < (int)child->GetParentList().size(); i++) {
+ Element* parent = child->GetParentList()[i];
+ if(parent == element) {
+ // TODO: Ask the user if he wants to change all
+ // voltages
+ ValidateBusesVoltages(element);
+ elementIsParent = true;
+ }
+ }
+ }
+ if(elementIsParent) break;
+ }
+ }
+ ValidateElementsVoltages();
+ }
+ }
+
+ // Click in a switch.
+ else if(element->SwitchesContains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ element->SetOnline(element->IsOnline() ? false : true);
+ }
+ }
// Text element
for(auto it = m_textList.begin(); it != m_textList.end(); ++it) {
- Text* text = *it;
- if(text->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- text->ShowForm(this, m_elementList);
- redraw = true;
- }
- }
+ Text* text = *it;
+ if(text->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ text->ShowForm(this, m_elementList);
+ redraw = true;
+ }
+ }
if(elementEdited) UpdateTextElements();
if(redraw) Redraw();
}
@@ -334,33 +327,33 @@ void Workspace::OnRightClickDown(wxMouseEvent& event)
{
bool redraw = false;
if(m_mode == MODE_EDIT) {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- if(element->IsSelected()) {
- // Show context menu.
- if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- element->ShowPickbox(false);
- wxMenu menu;
- if(element->GetContextMenu(menu)) {
- menu.SetClientData(element);
- menu.Connect(wxEVT_COMMAND_MENU_SELECTED,
- wxCommandEventHandler(Workspace::OnPopupClick), NULL, this);
- PopupMenu(&menu);
- redraw = true;
- }
- element->ResetPickboxes();
-
- if(redraw) {
- Redraw();
- redraw = false;
- }
- // If the last element was removed using the menu, we must leave the "search for" to
- // prevent error.
- break;
- }
- }
- }
- }
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ // Show context menu.
+ if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ element->ShowPickbox(false);
+ wxMenu menu;
+ if(element->GetContextMenu(menu)) {
+ menu.SetClientData(element);
+ menu.Connect(
+ wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(Workspace::OnPopupClick), NULL, this);
+ PopupMenu(&menu);
+ redraw = true;
+ }
+ element->ResetPickboxes();
+
+ if(redraw) {
+ Redraw();
+ redraw = false;
+ }
+ // If the last element was removed using the menu, we must leave the "search for" to
+ // prevent error.
+ break;
+ }
+ }
+ }
+ }
}
void Workspace::OnLeftClickUp(wxMouseEvent& event)
@@ -373,110 +366,98 @@ void Workspace::OnLeftClickUp(wxMouseEvent& event)
auto itnp = m_elementList.begin();
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
-
- // The user was moving a pickbox.
- if(m_mode == MODE_MOVE_PICKBOX) {
- // Catch only the element that have the pickbox shown.
- if(element->IsPickboxShown()) {
- // If the element is a bus, check if a node is outside.
- if(typeid(*element) == typeid(Bus)) {
- // Get all the bus children.
- for(int i = 0; i < (int)m_elementList.size(); i++) {
- Element* child = m_elementList[i];
- for(int j = 0; j < (int)child->GetParentList().size(); j++) {
- Element* parent = child->GetParentList()[j];
- // The child have a parent that is the element.
- if(parent == element) {
- child->UpdateNodes();
- }
- }
- }
- }
- }
- }
-
- if(m_mode == MODE_SELECTION_RECT) {
- if(element->Intersects(m_selectionRect)) {
- element->SetSelected();
- }
- else
- {
- element->SetSelected(false);
- }
- }
- else if(m_mode == MODE_MOVE_NODE)
- {
- if(element->IsSelected()) {
- for(int i = 0; i < (int)m_elementList.size(); i++) {
- Element* parent = m_elementList[i];
- if(typeid(*parent) == typeid(Bus)) {
- if(element->SetNodeParent(parent)) {
- findNewParent = true;
- itnp = it;
- element->ResetNodes();
- break;
- }
- }
- }
- // element->ResetNodes();
- }
- }
- else
- {
- // Deselect
- if(!event.ControlDown()) {
- if(!element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- element->SetSelected(false);
- }
- }
-
- if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
- foundPickbox = true;
- }
- else
- {
- element->ShowPickbox(false);
- element->ResetPickboxes();
- }
- }
- }
+ Element* element = *it;
+
+ // The user was moving a pickbox.
+ if(m_mode == MODE_MOVE_PICKBOX) {
+ // Catch only the element that have the pickbox shown.
+ if(element->IsPickboxShown()) {
+ // If the element is a bus, check if a node is outside.
+ if(typeid(*element) == typeid(Bus)) {
+ // Get all the bus children.
+ for(int i = 0; i < (int)m_elementList.size(); i++) {
+ Element* child = m_elementList[i];
+ for(int j = 0; j < (int)child->GetParentList().size(); j++) {
+ Element* parent = child->GetParentList()[j];
+ // The child have a parent that is the element.
+ if(parent == element) {
+ child->UpdateNodes();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(m_mode == MODE_SELECTION_RECT) {
+ if(element->Intersects(m_selectionRect)) {
+ element->SetSelected();
+ } else {
+ element->SetSelected(false);
+ }
+ } else if(m_mode == MODE_MOVE_NODE) {
+ if(element->IsSelected()) {
+ for(int i = 0; i < (int)m_elementList.size(); i++) {
+ Element* parent = m_elementList[i];
+ if(typeid(*parent) == typeid(Bus)) {
+ if(element->SetNodeParent(parent)) {
+ findNewParent = true;
+ itnp = it;
+ element->ResetNodes();
+ break;
+ }
+ }
+ }
+ // element->ResetNodes();
+ }
+ } else {
+ // Deselect
+ if(!event.ControlDown()) {
+ if(!element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ element->SetSelected(false);
+ }
+ }
+
+ if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ foundPickbox = true;
+ } else {
+ element->ShowPickbox(false);
+ element->ResetPickboxes();
+ }
+ }
+ }
// Text element
for(auto it = m_textList.begin(); it != m_textList.end(); it++) {
- Text* text = *it;
- if(m_mode == MODE_SELECTION_RECT) {
- if(text->Intersects(m_selectionRect)) {
- text->SetSelected();
- }
- else
- {
- text->SetSelected(false);
- }
- }
- else if(!event.ControlDown())
- {
- if(!text->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- text->SetSelected(false);
- }
- }
- }
+ Text* text = *it;
+ if(m_mode == MODE_SELECTION_RECT) {
+ if(text->Intersects(m_selectionRect)) {
+ text->SetSelected();
+ } else {
+ text->SetSelected(false);
+ }
+ } else if(!event.ControlDown()) {
+ if(!text->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ text->SetSelected(false);
+ }
+ }
+ }
if(findNewParent) {
- std::rotate(itnp, itnp + 1, m_elementList.end());
- updateVoltages = true;
- }
+ std::rotate(itnp, itnp + 1, m_elementList.end());
+ updateVoltages = true;
+ }
if(!foundPickbox) {
- SetCursor(wxCURSOR_ARROW);
- }
+ SetCursor(wxCURSOR_ARROW);
+ }
if(m_mode != MODE_INSERT) {
- m_mode = MODE_EDIT;
- }
+ m_mode = MODE_EDIT;
+ }
if(updateVoltages) {
- ValidateElementsVoltages();
- }
+ ValidateElementsVoltages();
+ }
m_selectionRect = wxRect2DDouble(0, 0, 0, 0);
Redraw();
UpdateStatusBar();
@@ -485,151 +466,125 @@ void Workspace::OnLeftClickUp(wxMouseEvent& event)
void Workspace::OnMouseMotion(wxMouseEvent& event)
{
bool redraw = false;
- switch(m_mode)
- {
- case MODE_INSERT:
- {
- Element* newElement = *(m_elementList.end() - 1); // Get the last element in the list.
- newElement->SetPosition(m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- }
- break;
-
- case MODE_INSERT_TEXT:
- {
- Text* newText = *(m_textList.end() - 1);
- newText->SetPosition(m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- }
- break;
-
- case MODE_DRAG:
- case MODE_DRAG_INSERT:
- case MODE_DRAG_INSERT_TEXT:
- {
- m_camera->SetTranslation(event.GetPosition());
- redraw = true;
- }
- break;
-
- case MODE_EDIT:
- {
- bool foundPickbox = false;
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- if(element->IsSelected()) {
- // Show element pickbox (when it has) if the mouse is over the selected object.
- if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- element->ShowPickbox();
- redraw = true;
-
- // If the mouse is over a pickbox set correct mouse cursor.
- if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
- foundPickbox = true;
- SetCursor(element->GetBestPickboxCursor());
- }
- else if(!foundPickbox)
- {
- SetCursor(wxCURSOR_ARROW);
- element->ResetPickboxes();
- }
- }
- else if(!foundPickbox)
- {
- if(element->IsPickboxShown()) redraw = true;
-
- element->ShowPickbox(false);
- element->ResetPickboxes();
- SetCursor(wxCURSOR_ARROW);
- }
- }
- }
- }
- break;
-
- case MODE_MOVE_NODE:
- {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- if(element->IsSelected()) {
- element->MoveNode(NULL, m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- }
- }
- }
- break;
-
- case MODE_MOVE_PICKBOX:
- {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- if(element->IsSelected()) {
- element->MovePickbox(m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- }
- }
- }
- break;
-
- case MODE_MOVE_ELEMENT:
- case MODE_PASTE:
- {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- // Parent's element moving...
- for(int i = 0; i < (int)element->GetParentList().size(); i++) {
- Element* parent = element->GetParentList()[i];
- if(parent) {
- if(parent->IsSelected()) {
- element->MoveNode(parent,
- m_camera->ScreenToWorld(event.GetPosition()));
- }
- }
- }
- if(element->IsSelected()) {
- element->Move(m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- }
- }
- // Text element motion
- for(auto it = m_textList.begin(); it != m_textList.end(); it++) {
- Text* text = *it;
- if(text->IsSelected()) {
- text->Move(m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- }
- }
- }
- break;
-
- case MODE_SELECTION_RECT:
- {
- wxPoint2DDouble currentPos = m_camera->ScreenToWorld(event.GetPosition());
- double x, y, w, h;
- if(currentPos.m_x < m_startSelRect.m_x) {
- x = currentPos.m_x;
- w = m_startSelRect.m_x - currentPos.m_x;
- }
- else
- {
- x = m_startSelRect.m_x;
- w = currentPos.m_x - m_startSelRect.m_x;
- }
- if(currentPos.m_y < m_startSelRect.m_y) {
- y = currentPos.m_y;
- h = m_startSelRect.m_y - currentPos.m_y;
- }
- else
- {
- y = m_startSelRect.m_y;
- h = currentPos.m_y - m_startSelRect.m_y;
- }
-
- m_selectionRect = wxRect2DDouble(x, y, w, h);
- redraw = true;
- }
- break;
- }
+ switch(m_mode) {
+ case MODE_INSERT: {
+ Element* newElement = *(m_elementList.end() - 1); // Get the last element in the list.
+ newElement->SetPosition(m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ } break;
+
+ case MODE_INSERT_TEXT: {
+ Text* newText = *(m_textList.end() - 1);
+ newText->SetPosition(m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ } break;
+
+ case MODE_DRAG:
+ case MODE_DRAG_INSERT:
+ case MODE_DRAG_INSERT_TEXT: {
+ m_camera->SetTranslation(event.GetPosition());
+ redraw = true;
+ } break;
+
+ case MODE_EDIT: {
+ bool foundPickbox = false;
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ // Show element pickbox (when it has) if the mouse is over the selected object.
+ if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ element->ShowPickbox();
+ redraw = true;
+
+ // If the mouse is over a pickbox set correct mouse cursor.
+ if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ foundPickbox = true;
+ SetCursor(element->GetBestPickboxCursor());
+ } else if(!foundPickbox) {
+ SetCursor(wxCURSOR_ARROW);
+ element->ResetPickboxes();
+ }
+ } else if(!foundPickbox) {
+ if(element->IsPickboxShown()) redraw = true;
+
+ element->ShowPickbox(false);
+ element->ResetPickboxes();
+ SetCursor(wxCURSOR_ARROW);
+ }
+ }
+ }
+ } break;
+
+ case MODE_MOVE_NODE: {
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ element->MoveNode(NULL, m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ }
+ }
+ } break;
+
+ case MODE_MOVE_PICKBOX: {
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ element->MovePickbox(m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ }
+ }
+ } break;
+
+ case MODE_MOVE_ELEMENT:
+ case MODE_PASTE: {
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ // Parent's element moving...
+ for(int i = 0; i < (int)element->GetParentList().size(); i++) {
+ Element* parent = element->GetParentList()[i];
+ if(parent) {
+ if(parent->IsSelected()) {
+ element->MoveNode(parent, m_camera->ScreenToWorld(event.GetPosition()));
+ }
+ }
+ }
+ if(element->IsSelected()) {
+ element->Move(m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ }
+ }
+ // Text element motion
+ for(auto it = m_textList.begin(); it != m_textList.end(); it++) {
+ Text* text = *it;
+ if(text->IsSelected()) {
+ text->Move(m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ }
+ }
+ } break;
+
+ case MODE_SELECTION_RECT: {
+ wxPoint2DDouble currentPos = m_camera->ScreenToWorld(event.GetPosition());
+ double x, y, w, h;
+ if(currentPos.m_x < m_startSelRect.m_x) {
+ x = currentPos.m_x;
+ w = m_startSelRect.m_x - currentPos.m_x;
+ } else {
+ x = m_startSelRect.m_x;
+ w = currentPos.m_x - m_startSelRect.m_x;
+ }
+ if(currentPos.m_y < m_startSelRect.m_y) {
+ y = currentPos.m_y;
+ h = m_startSelRect.m_y - currentPos.m_y;
+ } else {
+ y = m_startSelRect.m_y;
+ h = currentPos.m_y - m_startSelRect.m_y;
+ }
+
+ m_selectionRect = wxRect2DDouble(x, y, w, h);
+ redraw = true;
+ } break;
+ }
if(redraw) Redraw();
m_camera->UpdateMousePosition(event.GetPosition());
@@ -641,18 +596,13 @@ void Workspace::OnMiddleDown(wxMouseEvent& event)
{
// Set to drag mode.
if(m_mode != MODE_INSERT && m_mode != MODE_INSERT_TEXT && m_mode != MODE_DRAG_INSERT &&
- m_mode != MODE_DRAG_INSERT_TEXT)
- {
- m_mode = MODE_DRAG;
- }
- else if(m_mode == MODE_INSERT_TEXT)
- {
- m_mode = MODE_DRAG_INSERT_TEXT;
- }
- else
- {
- m_mode = MODE_DRAG_INSERT;
- }
+ m_mode != MODE_DRAG_INSERT_TEXT) {
+ m_mode = MODE_DRAG;
+ } else if(m_mode == MODE_INSERT_TEXT) {
+ m_mode = MODE_DRAG_INSERT_TEXT;
+ } else {
+ m_mode = MODE_DRAG_INSERT;
+ }
m_camera->StartTranslation(m_camera->ScreenToWorld(event.GetPosition()));
UpdateStatusBar();
}
@@ -660,28 +610,23 @@ void Workspace::OnMiddleDown(wxMouseEvent& event)
void Workspace::OnMiddleUp(wxMouseEvent& event)
{
if(m_mode != MODE_INSERT && m_mode != MODE_INSERT_TEXT && m_mode != MODE_DRAG_INSERT &&
- m_mode != MODE_DRAG_INSERT_TEXT)
- {
- // Set to edit mode back.
- m_mode = MODE_EDIT;
- }
- else if(m_mode == MODE_DRAG_INSERT_TEXT)
- {
- m_mode = MODE_INSERT_TEXT;
- }
- else if(m_mode == MODE_DRAG_INSERT)
- {
- m_mode = MODE_INSERT;
- }
+ m_mode != MODE_DRAG_INSERT_TEXT) {
+ // Set to edit mode back.
+ m_mode = MODE_EDIT;
+ } else if(m_mode == MODE_DRAG_INSERT_TEXT) {
+ m_mode = MODE_INSERT_TEXT;
+ } else if(m_mode == MODE_DRAG_INSERT) {
+ m_mode = MODE_INSERT;
+ }
UpdateStatusBar();
}
void Workspace::OnScroll(wxMouseEvent& event)
{
if(event.GetWheelRotation() > 0)
- m_camera->SetScale(event.GetPosition(), +0.05);
+ m_camera->SetScale(event.GetPosition(), +0.05);
else
- m_camera->SetScale(event.GetPosition(), -0.05);
+ m_camera->SetScale(event.GetPosition(), -0.05);
UpdateStatusBar();
Redraw();
@@ -694,189 +639,154 @@ void Workspace::OnKeyDown(wxKeyEvent& event)
char key = event.GetUnicodeKey();
if(key != WXK_NONE) {
- switch(key)
- {
- case WXK_ESCAPE: // Cancel operations.
- {
- if(m_mode == MODE_INSERT) {
- m_elementList.pop_back(); // Removes the last element being inserted.
- m_mode = MODE_EDIT;
- Redraw();
- }
- else if(m_mode == MODE_INSERT_TEXT)
- {
- m_textList.pop_back();
- m_mode = MODE_EDIT;
- Redraw();
- }
- }
- break;
- case WXK_DELETE: // Delete selected elements
- {
- DeleteSelectedElements();
- }
- break;
- case 'A':
- {
- if(!insertingElement) {
- Text* newBus = new Text(m_camera->ScreenToWorld(event.GetPosition()));
- m_textList.push_back(newBus);
- m_mode = MODE_INSERT_TEXT;
- m_statusBar->SetStatusText(_("Insert Text: Click to insert, ESC to cancel."));
- Redraw();
- }
- }
- case 'F':
- {
- if(event.GetModifiers() == wxMOD_SHIFT) {
- Fit();
- }
- }
- break;
- case 'R': // Rotate the selected elements.
- {
- RotateSelectedElements(event.GetModifiers() != wxMOD_SHIFT);
- }
- break;
- case 'B': // Insert a bus.
- {
- if(!insertingElement) {
- Bus* newBus = new Bus(m_camera->ScreenToWorld(event.GetPosition()),
- wxString::Format(_("Bus %d"), GetElementNumber(ID_BUS)));
- IncrementElementNumber(ID_BUS);
- m_elementList.push_back(newBus);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Bus: Click to insert, ESC to cancel."));
- Redraw();
- }
- }
- break;
- case 'L':
- {
- if(!insertingElement) {
- if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a load.
- Load* newLoad =
- new Load(wxString::Format(_("Load %d"), GetElementNumber(ID_LOAD)));
- IncrementElementNumber(ID_LOAD);
- m_elementList.push_back(newLoad);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(
- _("Insert Load: Click on a buses, ESC to cancel."));
- }
- else
- { // Insert a power line.
- Line* newLine =
- new Line(wxString::Format(_("Line %d"), GetElementNumber(ID_LINE)));
- IncrementElementNumber(ID_LINE);
- m_elementList.push_back(newLine);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(
- _("Insert Line: Click on two buses, ESC to cancel."));
- }
- Redraw();
- }
- }
- break;
- case 'T': // Insert a transformer.
- {
- if(!insertingElement) {
- Transformer* newTransformer = new Transformer(
- wxString::Format(_("Transformer %d"), GetElementNumber(ID_TRANSFORMER)));
- IncrementElementNumber(ID_TRANSFORMER);
- m_elementList.push_back(newTransformer);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(
- _("Insert Transformer: Click on two buses, ESC to cancel."));
- Redraw();
- }
- }
- break;
- case 'G': // Insert a generator.
- {
- if(!insertingElement) {
- SyncGenerator* newGenerator = new SyncGenerator(
- wxString::Format(_("Generator %d"), GetElementNumber(ID_SYNCGENERATOR)));
- IncrementElementNumber(ID_SYNCGENERATOR);
- m_elementList.push_back(newGenerator);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Generator: Click on a buses, ESC to cancel."));
- Redraw();
- }
- }
- break;
- case 'I':
- {
- if(!insertingElement) {
- if(event.GetModifiers() == wxMOD_SHIFT) { // Insert an inductor.
- Inductor* newInductor = new Inductor(
- wxString::Format(_("Inductor %d"), GetElementNumber(ID_INDUCTOR)));
- IncrementElementNumber(ID_INDUCTOR);
- m_elementList.push_back(newInductor);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(
- _("Insert Inductor: Click on a buses, ESC to cancel."));
- }
- else // Insert an induction motor.
- {
- IndMotor* newIndMotor = new IndMotor(wxString::Format(
- _("Induction motor %d"), GetElementNumber(ID_INDMOTOR)));
- IncrementElementNumber(ID_INDMOTOR);
- m_elementList.push_back(newIndMotor);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(
- _("Insert Induction Motor: Click on a buses, ESC to cancel."));
- }
- Redraw();
- }
- }
- break;
- case 'K': // Insert a synchronous condenser.
- {
- if(!insertingElement) {
- SyncMotor* newSyncCondenser = new SyncMotor(wxString::Format(
- _("Synchronous condenser %d"), GetElementNumber(ID_SYNCMOTOR)));
- IncrementElementNumber(ID_SYNCMOTOR);
- m_elementList.push_back(newSyncCondenser);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(
- _("Insert Synchronous Condenser: Click on a buses, ESC to cancel."));
- Redraw();
- }
- }
- break;
- case 'C':
- {
- if(!insertingElement) {
- if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a capacitor.
- Capacitor* newCapacitor = new Capacitor(
- wxString::Format(_("Capacitor %d"), GetElementNumber(ID_CAPACITOR)));
- IncrementElementNumber(ID_CAPACITOR);
- m_elementList.push_back(newCapacitor);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(
- _("Insert Capacitor: Click on a buses, ESC to cancel."));
- Redraw();
- }
- else if(event.GetModifiers() == wxMOD_CONTROL)
- { // Copy.
- CopySelection();
- }
- }
- }
- break;
- case 'V':
- {
- if(!insertingElement) {
- if(event.GetModifiers() == wxMOD_CONTROL) {
- Paste();
- }
- }
- }
- break;
- default:
- break;
- }
- }
+ switch(key) {
+ case WXK_ESCAPE: // Cancel operations.
+ {
+ if(m_mode == MODE_INSERT) {
+ m_elementList.pop_back(); // Removes the last element being inserted.
+ m_mode = MODE_EDIT;
+ Redraw();
+ } else if(m_mode == MODE_INSERT_TEXT) {
+ m_textList.pop_back();
+ m_mode = MODE_EDIT;
+ Redraw();
+ }
+ } break;
+ case WXK_DELETE: // Delete selected elements
+ {
+ DeleteSelectedElements();
+ } break;
+ case 'A': {
+ if(!insertingElement) {
+ Text* newBus = new Text(m_camera->ScreenToWorld(event.GetPosition()));
+ m_textList.push_back(newBus);
+ m_mode = MODE_INSERT_TEXT;
+ m_statusBar->SetStatusText(_("Insert Text: Click to insert, ESC to cancel."));
+ Redraw();
+ }
+ }
+ case 'F': {
+ if(event.GetModifiers() == wxMOD_SHIFT) {
+ Fit();
+ }
+ } break;
+ case 'R': // Rotate the selected elements.
+ {
+ RotateSelectedElements(event.GetModifiers() != wxMOD_SHIFT);
+ } break;
+ case 'B': // Insert a bus.
+ {
+ if(!insertingElement) {
+ Bus* newBus = new Bus(m_camera->ScreenToWorld(event.GetPosition()),
+ wxString::Format(_("Bus %d"), GetElementNumber(ID_BUS)));
+ IncrementElementNumber(ID_BUS);
+ m_elementList.push_back(newBus);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Bus: Click to insert, ESC to cancel."));
+ Redraw();
+ }
+ } break;
+ case 'L': {
+ if(!insertingElement) {
+ if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a load.
+ Load* newLoad = new Load(wxString::Format(_("Load %d"), GetElementNumber(ID_LOAD)));
+ IncrementElementNumber(ID_LOAD);
+ m_elementList.push_back(newLoad);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Load: Click on a buses, ESC to cancel."));
+ } else { // Insert a power line.
+ Line* newLine = new Line(wxString::Format(_("Line %d"), GetElementNumber(ID_LINE)));
+ IncrementElementNumber(ID_LINE);
+ m_elementList.push_back(newLine);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Line: Click on two buses, ESC to cancel."));
+ }
+ Redraw();
+ }
+ } break;
+ case 'T': // Insert a transformer.
+ {
+ if(!insertingElement) {
+ Transformer* newTransformer =
+ new Transformer(wxString::Format(_("Transformer %d"), GetElementNumber(ID_TRANSFORMER)));
+ IncrementElementNumber(ID_TRANSFORMER);
+ m_elementList.push_back(newTransformer);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Transformer: Click on two buses, ESC to cancel."));
+ Redraw();
+ }
+ } break;
+ case 'G': // Insert a generator.
+ {
+ if(!insertingElement) {
+ SyncGenerator* newGenerator =
+ new SyncGenerator(wxString::Format(_("Generator %d"), GetElementNumber(ID_SYNCGENERATOR)));
+ IncrementElementNumber(ID_SYNCGENERATOR);
+ m_elementList.push_back(newGenerator);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Generator: Click on a buses, ESC to cancel."));
+ Redraw();
+ }
+ } break;
+ case 'I': {
+ if(!insertingElement) {
+ if(event.GetModifiers() == wxMOD_SHIFT) { // Insert an inductor.
+ Inductor* newInductor =
+ new Inductor(wxString::Format(_("Inductor %d"), GetElementNumber(ID_INDUCTOR)));
+ IncrementElementNumber(ID_INDUCTOR);
+ m_elementList.push_back(newInductor);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Inductor: Click on a buses, ESC to cancel."));
+ } else // Insert an induction motor.
+ {
+ IndMotor* newIndMotor =
+ new IndMotor(wxString::Format(_("Induction motor %d"), GetElementNumber(ID_INDMOTOR)));
+ IncrementElementNumber(ID_INDMOTOR);
+ m_elementList.push_back(newIndMotor);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Induction Motor: Click on a buses, ESC to cancel."));
+ }
+ Redraw();
+ }
+ } break;
+ case 'K': // Insert a synchronous condenser.
+ {
+ if(!insertingElement) {
+ SyncMotor* newSyncCondenser =
+ new SyncMotor(wxString::Format(_("Synchronous condenser %d"), GetElementNumber(ID_SYNCMOTOR)));
+ IncrementElementNumber(ID_SYNCMOTOR);
+ m_elementList.push_back(newSyncCondenser);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Synchronous Condenser: Click on a buses, ESC to cancel."));
+ Redraw();
+ }
+ } break;
+ case 'C': {
+ if(!insertingElement) {
+ if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a capacitor.
+ Capacitor* newCapacitor =
+ new Capacitor(wxString::Format(_("Capacitor %d"), GetElementNumber(ID_CAPACITOR)));
+ IncrementElementNumber(ID_CAPACITOR);
+ m_elementList.push_back(newCapacitor);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Capacitor: Click on a buses, ESC to cancel."));
+ Redraw();
+ } else if(event.GetModifiers() == wxMOD_CONTROL) { // Copy.
+ CopySelection();
+ }
+ }
+ } break;
+ case 'V': {
+ if(!insertingElement) {
+ if(event.GetModifiers() == wxMOD_CONTROL) {
+ Paste();
+ }
+ }
+ } break;
+ default:
+ break;
+ }
+ }
UpdateStatusBar();
event.Skip();
@@ -884,34 +794,31 @@ void Workspace::OnKeyDown(wxKeyEvent& event)
void Workspace::UpdateStatusBar()
{
- switch(m_mode)
- {
- case MODE_DRAG:
- {
- m_statusBar->SetStatusText(_("MODE: DRAG"), 1);
- }
- break;
-
- case MODE_INSERT:
- case MODE_INSERT_TEXT:
- case MODE_DRAG_INSERT:
- case MODE_DRAG_INSERT_TEXT:
- {
- m_statusBar->SetStatusText(_("MODE: INSERT"), 1);
- }
- break;
-
- case MODE_MOVE_ELEMENT:
- case MODE_MOVE_PICKBOX:
- case MODE_MOVE_NODE:
- case MODE_SELECTION_RECT:
- case MODE_EDIT:
- {
- m_statusBar->SetStatusText(wxT(""));
- m_statusBar->SetStatusText(_("MODE: EDIT"), 1);
- }
- break;
- }
+ switch(m_mode) {
+ case MODE_DRAG: {
+ m_statusBar->SetStatusText(_("MODE: DRAG"), 1);
+ } break;
+
+ case MODE_PASTE: {
+ m_statusBar->SetStatusText(_("MODE: PASTE"), 1);
+ }
+
+ case MODE_INSERT:
+ case MODE_INSERT_TEXT:
+ case MODE_DRAG_INSERT:
+ case MODE_DRAG_INSERT_TEXT: {
+ m_statusBar->SetStatusText(_("MODE: INSERT"), 1);
+ } break;
+
+ case MODE_MOVE_ELEMENT:
+ case MODE_MOVE_PICKBOX:
+ case MODE_MOVE_NODE:
+ case MODE_SELECTION_RECT:
+ case MODE_EDIT: {
+ m_statusBar->SetStatusText(wxT(""));
+ m_statusBar->SetStatusText(_("MODE: EDIT"), 1);
+ } break;
+ }
m_statusBar->SetStatusText(wxString::Format(_("ZOOM: %d%%"), (int)(m_camera->GetScale() * 100.0)), 2);
m_statusBar->SetStatusText(
@@ -923,123 +830,106 @@ void Workspace::OnPopupClick(wxCommandEvent& event)
{
wxMenu* menu = (wxMenu*)event.GetEventObject();
Element* element = (Element*)menu->GetClientData();
- switch(event.GetId())
- {
- case ID_EDIT_BUS:
- {
- wxMessageBox("Edit bus!");
- }
- break;
- case ID_EDIT_LINE:
- {
- wxMessageBox("Edit line!");
- }
- break;
- case ID_EDIT_TRANSFORMER:
- {
- wxMessageBox("Edit transformer!");
- }
- break;
- case ID_LINE_ADD_NODE:
- {
- Line* line = (Line*)element;
- line->AddNode(m_camera->GetMousePosition());
- Redraw();
- }
- break;
- case ID_LINE_REMOVE_NODE:
- {
- Line* line = (Line*)element;
- line->RemoveNode(m_camera->GetMousePosition());
- Redraw();
- }
- break;
- case ID_ROTATE_CLOCK:
- {
- element->Rotate();
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* iElement = *it;
- // Parent's element rotating...
- for(int i = 0; i < (int)iElement->GetParentList().size(); i++) {
- Element* parent = iElement->GetParentList()[i];
- if(parent == element) {
- iElement->RotateNode(parent);
- }
- }
- }
- Redraw();
- }
- break;
- case ID_ROTATE_COUNTERCLOCK:
- {
- element->Rotate(false);
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* iElement = *it;
- // Parent's element rotating...
- for(int i = 0; i < (int)iElement->GetParentList().size(); i++) {
- Element* parent = iElement->GetParentList()[i];
- if(parent == element) {
- iElement->RotateNode(parent, false);
- }
- }
- }
- Redraw();
- }
- break;
- case ID_DELETE:
- {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* iElement = *it;
-
- if(element == iElement) {
- for(auto itp = m_elementList.begin(); itp != m_elementList.end(); ++itp) {
- Element* child = *itp;
- // Parent's element being deleted...
- for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Element* parent = child->GetParentList()[i];
- if(parent == element) {
- child->RemoveParent(parent);
- }
- }
- }
- m_elementList.erase(it--);
- }
- }
- }
- break;
- }
+ switch(event.GetId()) {
+ case ID_EDIT_BUS: {
+ wxMessageBox("Edit bus!");
+ } break;
+ case ID_EDIT_LINE: {
+ wxMessageBox("Edit line!");
+ } break;
+ case ID_EDIT_TRANSFORMER: {
+ wxMessageBox("Edit transformer!");
+ } break;
+ case ID_LINE_ADD_NODE: {
+ Line* line = (Line*)element;
+ line->AddNode(m_camera->GetMousePosition());
+ Redraw();
+ } break;
+ case ID_LINE_REMOVE_NODE: {
+ Line* line = (Line*)element;
+ line->RemoveNode(m_camera->GetMousePosition());
+ Redraw();
+ } break;
+ case ID_ROTATE_CLOCK: {
+ element->Rotate();
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* iElement = *it;
+ // Parent's element rotating...
+ for(int i = 0; i < (int)iElement->GetParentList().size(); i++) {
+ Element* parent = iElement->GetParentList()[i];
+ if(parent == element) {
+ iElement->RotateNode(parent);
+ }
+ }
+ }
+ Redraw();
+ } break;
+ case ID_ROTATE_COUNTERCLOCK: {
+ element->Rotate(false);
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* iElement = *it;
+ // Parent's element rotating...
+ for(int i = 0; i < (int)iElement->GetParentList().size(); i++) {
+ Element* parent = iElement->GetParentList()[i];
+ if(parent == element) {
+ iElement->RotateNode(parent, false);
+ }
+ }
+ }
+ Redraw();
+ } break;
+ case ID_DELETE: {
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* iElement = *it;
+
+ if(element == iElement) {
+ for(auto itp = m_elementList.begin(); itp != m_elementList.end(); ++itp) {
+ Element* child = *itp;
+ // Parent's element being deleted...
+ for(int i = 0; i < (int)child->GetParentList().size(); i++) {
+ Element* parent = child->GetParentList()[i];
+ if(parent == element) {
+ child->RemoveParent(parent);
+ }
+ }
+ }
+ m_elementList.erase(it--);
+ }
+ }
+ } break;
+ }
}
void Workspace::RotateSelectedElements(bool clockwise)
{
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- // Parent's element rotating...
- for(int i = 0; i < (int)element->GetParentList().size(); i++) {
- Element* parent = element->GetParentList()[i];
- if(parent) { // Check if parent is not null
- if(parent->IsSelected()) {
- element->RotateNode(parent, clockwise);
- // Update the positions used on motion action, the element will not be necessarily
- // moved.
- element->StartMove(m_camera->GetMousePosition());
- }
- }
- }
- if(element->IsSelected()) {
- element->Rotate(clockwise);
- element->StartMove(m_camera->GetMousePosition());
- }
- }
+ Element* element = *it;
+ // Parent's element rotating...
+ for(int i = 0; i < (int)element->GetParentList().size(); i++) {
+ Element* parent = element->GetParentList()[i];
+ if(parent) { // Check if parent is not null
+ if(parent->IsSelected()) {
+ element->RotateNode(parent, clockwise);
+ // Update the positions used on motion action, the element will not be necessarily
+ // moved.
+ element->StartMove(m_camera->GetMousePosition());
+ }
+ }
+ }
+ if(element->IsSelected()) {
+ element->Rotate(clockwise);
+ element->StartMove(m_camera->GetMousePosition());
+ }
+ }
// Rotate text element
for(auto it = m_textList.begin(); it != m_textList.end(); it++) {
- Text* text = *it;
- if(text->IsSelected()) {
- text->Rotate(clockwise);
- text->StartMove(m_camera->GetMousePosition());
- }
- }
+ Text* text = *it;
+ if(text->IsSelected()) {
+ text->Rotate(clockwise);
+ text->StartMove(m_camera->GetMousePosition());
+ }
+ }
Redraw();
}
@@ -1047,55 +937,55 @@ void Workspace::DeleteSelectedElements()
{
// Don't set the end of the list at the loop's begin.
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
-
- if(element->IsSelected()) {
- for(auto itp = m_elementList.begin(); itp != m_elementList.end(); ++itp) {
- Element* child = *itp;
- // Parent's element being deleted...
- for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Element* parent = child->GetParentList()[i];
- if(parent == element) {
- child->RemoveParent(parent);
- }
- }
- }
-
- for(auto itt = m_textList.begin(); itt != m_textList.end(); ++itt) {
- Text* text = *itt;
- if(text->GetElement() == element) m_textList.erase(itt--);
- }
-
- m_elementList.erase(it--);
- }
- }
+ Element* element = *it;
+
+ if(element->IsSelected()) {
+ for(auto itp = m_elementList.begin(); itp != m_elementList.end(); ++itp) {
+ Element* child = *itp;
+ // Parent's element being deleted...
+ for(int i = 0; i < (int)child->GetParentList().size(); i++) {
+ Element* parent = child->GetParentList()[i];
+ if(parent == element) {
+ child->RemoveParent(parent);
+ }
+ }
+ }
+
+ for(auto itt = m_textList.begin(); itt != m_textList.end(); ++itt) {
+ Text* text = *itt;
+ if(text->GetElement() == element) m_textList.erase(itt--);
+ }
+
+ m_elementList.erase(it--);
+ }
+ }
for(auto it = m_textList.begin(); it != m_textList.end(); ++it) {
- Text* text = *it;
- if(text->IsSelected()) m_textList.erase(it--);
- }
+ Text* text = *it;
+ if(text->IsSelected()) m_textList.erase(it--);
+ }
Redraw();
}
bool Workspace::GetElementsCorners(wxPoint2DDouble& leftUpCorner,
- wxPoint2DDouble& rightDownCorner,
- std::vector<Element*> elementList)
+ wxPoint2DDouble& rightDownCorner,
+ std::vector<Element*> elementList)
{
if(elementList.size() == 0) return false;
elementList[0]->CalculateBoundaries(leftUpCorner, rightDownCorner);
for(auto it = elementList.begin() + 1, itEnd = elementList.end(); it != itEnd; it++) {
- Element* element = *it;
- wxPoint2DDouble leftUp;
- wxPoint2DDouble rightDown;
- element->CalculateBoundaries(leftUp, rightDown);
- if(leftUp.m_x < leftUpCorner.m_x) leftUpCorner.m_x = leftUp.m_x;
- if(leftUp.m_y < leftUpCorner.m_y) leftUpCorner.m_y = leftUp.m_y;
- if(rightDown.m_x > rightDownCorner.m_x) rightDownCorner.m_x = rightDown.m_x;
- if(rightDown.m_y > rightDownCorner.m_y) rightDownCorner.m_y = rightDown.m_y;
- }
+ Element* element = *it;
+ wxPoint2DDouble leftUp;
+ wxPoint2DDouble rightDown;
+ element->CalculateBoundaries(leftUp, rightDown);
+ if(leftUp.m_x < leftUpCorner.m_x) leftUpCorner.m_x = leftUp.m_x;
+ if(leftUp.m_y < leftUpCorner.m_y) leftUpCorner.m_y = leftUp.m_y;
+ if(rightDown.m_x > rightDownCorner.m_x) rightDownCorner.m_x = rightDown.m_x;
+ if(rightDown.m_y > rightDownCorner.m_y) rightDownCorner.m_y = rightDown.m_y;
+ }
return true;
}
@@ -1105,8 +995,8 @@ void Workspace::Fit()
wxPoint2DDouble rightDownCorner(0, 0);
std::vector<Element*> elementList = m_elementList;
for(auto it = m_textList.begin(), itEnd = m_textList.end(); it != itEnd; ++it) {
- elementList.push_back(*it);
- }
+ elementList.push_back(*it);
+ }
if(!GetElementsCorners(leftUpCorner, rightDownCorner, elementList)) return;
int width = 0.0;
@@ -1133,29 +1023,28 @@ void Workspace::ValidateBusesVoltages(Element* initialBus)
ElectricalUnit nominalVoltageUnit = ((Bus*)initialBus)->GetEletricalData().nominalVoltageUnit;
for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) {
- Element* child = *it;
-
- if(typeid(*child) == typeid(Line)) {
- if(child->GetParentList()[0] && child->GetParentList()[1]) {
- BusElectricalData data1 = ((Bus*)child->GetParentList()[0])->GetEletricalData();
- BusElectricalData data2 = ((Bus*)child->GetParentList()[1])->GetEletricalData();
-
- if(data1.nominalVoltage != data2.nominalVoltage ||
- data1.nominalVoltageUnit != data2.nominalVoltageUnit)
- {
- data1.nominalVoltage = nominalVoltage;
- data2.nominalVoltage = nominalVoltage;
- data1.nominalVoltageUnit = nominalVoltageUnit;
- data2.nominalVoltageUnit = nominalVoltageUnit;
-
- ((Bus*)child->GetParentList()[0])->SetElectricalData(data1);
- ((Bus*)child->GetParentList()[1])->SetElectricalData(data2);
-
- it = m_elementList.begin(); // Restart search.
- }
- }
- }
- }
+ Element* child = *it;
+
+ if(typeid(*child) == typeid(Line)) {
+ if(child->GetParentList()[0] && child->GetParentList()[1]) {
+ BusElectricalData data1 = ((Bus*)child->GetParentList()[0])->GetEletricalData();
+ BusElectricalData data2 = ((Bus*)child->GetParentList()[1])->GetEletricalData();
+
+ if(data1.nominalVoltage != data2.nominalVoltage ||
+ data1.nominalVoltageUnit != data2.nominalVoltageUnit) {
+ data1.nominalVoltage = nominalVoltage;
+ data2.nominalVoltage = nominalVoltage;
+ data1.nominalVoltageUnit = nominalVoltageUnit;
+ data2.nominalVoltageUnit = nominalVoltageUnit;
+
+ ((Bus*)child->GetParentList()[0])->SetElectricalData(data1);
+ ((Bus*)child->GetParentList()[1])->SetElectricalData(data2);
+
+ it = m_elementList.begin(); // Restart search.
+ }
+ }
+ }
+ }
// ValidateElementsVoltages();
}
@@ -1163,19 +1052,19 @@ void Workspace::ValidateBusesVoltages(Element* initialBus)
void Workspace::ValidateElementsVoltages()
{
for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) {
- Element* child = *it;
-
- std::vector<double> nominalVoltage;
- std::vector<ElectricalUnit> nominalVoltageUnit;
- for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Bus* parent = (Bus*)child->GetParentList()[i];
- if(parent) {
- nominalVoltage.push_back(parent->GetEletricalData().nominalVoltage);
- nominalVoltageUnit.push_back(parent->GetEletricalData().nominalVoltageUnit);
- }
- }
- child->SetNominalVoltage(nominalVoltage, nominalVoltageUnit);
- }
+ Element* child = *it;
+
+ std::vector<double> nominalVoltage;
+ std::vector<ElectricalUnit> nominalVoltageUnit;
+ for(int i = 0; i < (int)child->GetParentList().size(); i++) {
+ Bus* parent = (Bus*)child->GetParentList()[i];
+ if(parent) {
+ nominalVoltage.push_back(parent->GetEletricalData().nominalVoltage);
+ nominalVoltageUnit.push_back(parent->GetEletricalData().nominalVoltageUnit);
+ }
+ }
+ child->SetNominalVoltage(nominalVoltage, nominalVoltageUnit);
+ }
}
bool Workspace::RunPowerFlow()
@@ -1183,9 +1072,9 @@ bool Workspace::RunPowerFlow()
PowerFlow pf(m_elementList);
bool result = pf.RunGaussSeidel();
if(!result) {
- wxMessageDialog msgDialog(this, pf.GetErrorMessage(), _("Error"), wxOK | wxCENTRE | wxICON_ERROR);
- msgDialog.ShowModal();
- }
+ wxMessageDialog msgDialog(this, pf.GetErrorMessage(), _("Error"), wxOK | wxCENTRE | wxICON_ERROR);
+ msgDialog.ShowModal();
+ }
UpdateTextElements();
Redraw();
@@ -1196,9 +1085,9 @@ bool Workspace::RunPowerFlow()
void Workspace::UpdateTextElements()
{
for(auto it = m_textList.begin(); it != m_textList.end(); ++it) {
- Text* text = *it;
- text->UpdateText(100e6);
- }
+ Text* text = *it;
+ text->UpdateText(100e6);
+ }
}
void Workspace::CopySelection()
@@ -1207,24 +1096,24 @@ void Workspace::CopySelection()
// The buses need to be numerated to associate the child's parents to the copies.
int busNumber = 0;
for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) {
- Element* element = *it;
- if(typeid(*element) == typeid(Bus)) {
- Bus* bus = (Bus*)element;
- auto data = bus->GetEletricalData();
- data.number = busNumber;
- bus->SetElectricalData(data);
- busNumber++;
- }
- if(element->IsSelected()) {
- selectedElements.push_back(element);
- }
- }
+ Element* element = *it;
+ if(typeid(*element) == typeid(Bus)) {
+ Bus* bus = (Bus*)element;
+ auto data = bus->GetEletricalData();
+ data.number = busNumber;
+ bus->SetElectricalData(data);
+ busNumber++;
+ }
+ if(element->IsSelected()) {
+ selectedElements.push_back(element);
+ }
+ }
for(auto it = m_textList.begin(), itEnd = m_textList.end(); it != itEnd; ++it) {
- Text* text = *it;
- if(text->IsSelected()) {
- selectedElements.push_back(text);
- }
- }
+ Text* text = *it;
+ if(text->IsSelected()) {
+ selectedElements.push_back(text);
+ }
+ }
ElementDataObject* dataObject = new ElementDataObject(selectedElements);
wxTheClipboard->SetData(dataObject);
wxTheClipboard->Close();
@@ -1233,110 +1122,117 @@ void Workspace::CopySelection()
bool Workspace::Paste()
{
if(wxTheClipboard->Open()) {
- ElementDataObject dataObject;
-
- if(wxTheClipboard->IsSupported(wxDataFormat("PSPCopy"))) {
- if(!wxTheClipboard->GetData(dataObject)) {
- wxMessageDialog dialog(this, _("It was not possible to paste from clipboard."), _("Error"),
- wxOK | wxCENTER | wxICON_ERROR, wxDefaultPosition);
- dialog.ShowModal();
- wxTheClipboard->Close();
- return false;
- }
- }
- else
- {
- wxTheClipboard->Close();
- return false;
- }
- wxTheClipboard->Close();
-
- UnselectAll();
-
- std::vector<Element*> pastedElements;
- ElementsLists* elementsLists = dataObject.GetElementsLists();
-
- // Paste buses (parents).
- auto parentList = elementsLists->parentList;
- std::vector<Bus*> pastedBusList; // To set new parents;
- for(auto it = parentList.begin(), itEnd = parentList.end(); it != itEnd; ++it) {
- Element* copy = (*it)->GetCopy();
- if(copy) {
- pastedElements.push_back((Bus*)copy);
- pastedBusList.push_back((Bus*)copy);
- m_elementList.push_back((Bus*)copy);
- }
- }
-
- // Paste other elements.
- auto elementLists = elementsLists->elementList;
- for(auto it = elementLists.begin(), itEnd = elementLists.end(); it != itEnd; ++it) {
- Element* copy = (*it)->GetCopy();
- if(copy) {
- // Check if is text element
- if(typeid(*copy) == typeid(Text)) {
- pastedElements.push_back(copy);
- m_textList.push_back((Text*)copy);
- }
- else
- {
- // Change the parent if copied, otherwise remove it.
- for(int j = 0; j < (int)copy->GetParentList().size(); j++) {
- Bus* currentParent = (Bus*)copy->GetParentList()[j];
- if(currentParent) {
- int parentNumber = currentParent->GetEletricalData().number;
- bool parentCopied = false;
- for(int k = 0; k < (int)pastedBusList.size(); k++) {
- Bus* newParent = pastedBusList[k];
- if(parentNumber == newParent->GetEletricalData().number)
- copy->ReplaceParent(currentParent, newParent);
- }
- if(!parentCopied) copy->RemoveParent(currentParent);
- }
- }
-
- pastedElements.push_back(copy);
- m_elementList.push_back(copy);
- }
- }
- }
-
- // Move elements (and nodes) to the mouse position.
- // The start position it's the center of the pasted objects.
- wxPoint2DDouble leftUpCorner, rightDownCorner;
- GetElementsCorners(leftUpCorner, rightDownCorner, pastedElements);
- wxPoint2DDouble startPosition = (leftUpCorner + rightDownCorner) / 2.0;
- for(auto it = pastedElements.begin(), itEnd = pastedElements.end(); it != itEnd; ++it) {
- Element* element = *it;
- element->StartMove(startPosition);
- element->Move(m_camera->GetMousePosition());
- for(int i = 0; i < (int)element->GetParentList().size(); i++) {
- Element* parent = element->GetParentList()[i];
- element->MoveNode(parent, m_camera->GetMousePosition());
- }
- }
- }
- else
- {
- wxMessageDialog dialog(this, _("It was not possible to paste from clipboard."), _("Error"),
- wxOK | wxCENTER | wxICON_ERROR, wxDefaultPosition);
- dialog.ShowModal();
- return false;
- }
+ ElementDataObject dataObject;
+
+ if(wxTheClipboard->IsSupported(wxDataFormat("PSPCopy"))) {
+ if(!wxTheClipboard->GetData(dataObject)) {
+ wxMessageDialog dialog(this, _("It was not possible to paste from clipboard."), _("Error"),
+ wxOK | wxCENTER | wxICON_ERROR, wxDefaultPosition);
+ dialog.ShowModal();
+ wxTheClipboard->Close();
+ return false;
+ }
+ } else {
+ wxTheClipboard->Close();
+ return false;
+ }
+ wxTheClipboard->Close();
+
+ UnselectAll();
+
+ std::vector<Element*> pastedElements;
+ ElementsLists* elementsLists = dataObject.GetElementsLists();
+
+ // Paste buses (parents).
+ auto parentList = elementsLists->parentList;
+ std::vector<Bus*> pastedBusList; // To set new parents;
+ for(auto it = parentList.begin(), itEnd = parentList.end(); it != itEnd; ++it) {
+ Element* copy = (*it)->GetCopy();
+ if(copy) {
+ pastedElements.push_back((Bus*)copy);
+ pastedBusList.push_back((Bus*)copy);
+ m_elementList.push_back((Bus*)copy);
+ }
+ }
+
+ // Paste other elements.
+ auto elementLists = elementsLists->elementList;
+ for(auto it = elementLists.begin(), itEnd = elementLists.end(); it != itEnd; ++it) {
+ Element* copy = (*it)->GetCopy();
+ if(copy) {
+ // Check if is text element
+ if(typeid(*copy) == typeid(Text)) {
+ Text* text = (Text*)copy;
+ // Check if element associated with the text exists.
+ bool elementExist = false;
+ for(int i = 0; i < (int)m_elementList.size(); i++) {
+ if(text->GetElement() == m_elementList[i]) {
+ elementExist = true;
+ break;
+ }
+ }
+ if(elementExist) {
+ pastedElements.push_back(copy);
+ m_textList.push_back((Text*)copy);
+ }
+ } else {
+ // Change the parent if copied, otherwise remove it.
+ for(int j = 0; j < (int)copy->GetParentList().size(); j++) {
+ Bus* currentParent = (Bus*)copy->GetParentList()[j];
+ if(currentParent) {
+ int parentNumber = currentParent->GetEletricalData().number;
+ bool parentCopied = false;
+ for(int k = 0; k < (int)pastedBusList.size(); k++) {
+ Bus* newParent = pastedBusList[k];
+ if(parentNumber == newParent->GetEletricalData().number)
+ copy->ReplaceParent(currentParent, newParent);
+ }
+ if(!parentCopied) copy->RemoveParent(currentParent);
+ }
+ }
+
+ pastedElements.push_back(copy);
+ m_elementList.push_back(copy);
+ }
+ }
+ }
+
+ // Move elements (and nodes) to the mouse position.
+ // The start position it's the center of the pasted objects.
+ wxPoint2DDouble leftUpCorner, rightDownCorner;
+ GetElementsCorners(leftUpCorner, rightDownCorner, pastedElements);
+ wxPoint2DDouble startPosition = (leftUpCorner + rightDownCorner) / 2.0;
+ for(auto it = pastedElements.begin(), itEnd = pastedElements.end(); it != itEnd; ++it) {
+ Element* element = *it;
+ element->StartMove(startPosition);
+ element->Move(m_camera->GetMousePosition());
+ for(int i = 0; i < (int)element->GetParentList().size(); i++) {
+ Element* parent = element->GetParentList()[i];
+ element->MoveNode(parent, m_camera->GetMousePosition());
+ }
+ }
+ } else {
+ wxMessageDialog dialog(this, _("It was not possible to paste from clipboard."), _("Error"),
+ wxOK | wxCENTER | wxICON_ERROR, wxDefaultPosition);
+ dialog.ShowModal();
+ return false;
+ }
Redraw();
m_mode = MODE_PASTE;
+ m_statusBar->SetStatusText(_("Click to paste."));
+ UpdateStatusBar();
return true;
}
void Workspace::UnselectAll()
{
for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; it++) {
- Element* element = *it;
- element->SetSelected(false);
- }
+ Element* element = *it;
+ element->SetSelected(false);
+ }
for(auto it = m_textList.begin(), itEnd = m_textList.end(); it != itEnd; it++) {
- Text* text = *it;
- text->SetSelected(false);
- }
+ Text* text = *it;
+ text->SetSelected(false);
+ }
}