diff options
27 files changed, 1341 insertions, 1219 deletions
diff --git a/.codelite/.tern-port b/.codelite/.tern-port index 8bce046..f742d98 100644 --- a/.codelite/.tern-port +++ b/.codelite/.tern-port @@ -1 +1 @@ -54474
\ No newline at end of file +57978
\ No newline at end of file diff --git a/.codelite/PSP.session b/.codelite/PSP.session index a8caf5e..bc383b3 100644 --- a/.codelite/PSP.session +++ b/.codelite/PSP.session @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> <Session Name="C:\Users\Thales\Documents\GitHub\PSP\PSP.workspace"> - <int Value="0" Name="m_selectedTab"/> + <int Value="6" Name="m_selectedTab"/> <wxString Value="C:\Users\Thales\Documents\GitHub\PSP\PSP.workspace" Name="m_workspaceName"/> <TabInfoArray Name="TabInfoArray"> <TabInfo> <wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\Workspace.cpp" Name="FileName"/> - <int Value="958" Name="FirstVisibleLine"/> - <int Value="985" Name="CurrentLine"/> + <int Value="514" Name="FirstVisibleLine"/> + <int Value="534" Name="CurrentLine"/> <wxArrayString Name="Bookmarks"/> <IntVector Name="CollapsedFolds"/> </TabInfo> @@ -19,22 +19,22 @@ </TabInfo> <TabInfo> <wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\Element.cpp" Name="FileName"/> - <int Value="320" Name="FirstVisibleLine"/> - <int Value="344" Name="CurrentLine"/> + <int Value="351" Name="FirstVisibleLine"/> + <int Value="379" Name="CurrentLine"/> <wxArrayString Name="Bookmarks"/> <IntVector Name="CollapsedFolds"/> </TabInfo> <TabInfo> <wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\Element.h" Name="FileName"/> - <int Value="157" Name="FirstVisibleLine"/> - <int Value="184" Name="CurrentLine"/> + <int Value="0" Name="FirstVisibleLine"/> + <int Value="9" Name="CurrentLine"/> <wxArrayString Name="Bookmarks"/> <IntVector Name="CollapsedFolds"/> </TabInfo> <TabInfo> <wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\LineForm.cpp" Name="FileName"/> - <int Value="81" Name="FirstVisibleLine"/> - <int Value="82" Name="CurrentLine"/> + <int Value="183" Name="FirstVisibleLine"/> + <int Value="158" Name="CurrentLine"/> <wxArrayString Name="Bookmarks"/> <IntVector Name="CollapsedFolds"/> </TabInfo> @@ -47,15 +47,15 @@ </TabInfo> <TabInfo> <wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\MainFrame.cpp" Name="FileName"/> - <int Value="206" Name="FirstVisibleLine"/> - <int Value="234" Name="CurrentLine"/> + <int Value="213" Name="FirstVisibleLine"/> + <int Value="236" Name="CurrentLine"/> <wxArrayString Name="Bookmarks"/> <IntVector Name="CollapsedFolds"/> </TabInfo> <TabInfo> <wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\TransformerForm.cpp" Name="FileName"/> - <int Value="70" Name="FirstVisibleLine"/> - <int Value="86" Name="CurrentLine"/> + <int Value="106" Name="FirstVisibleLine"/> + <int Value="0" Name="CurrentLine"/> <wxArrayString Name="Bookmarks"/> <IntVector Name="CollapsedFolds"/> </TabInfo> @@ -68,15 +68,15 @@ </TabInfo> <TabInfo> <wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\Transformer.h" Name="FileName"/> - <int Value="48" Name="FirstVisibleLine"/> - <int Value="67" Name="CurrentLine"/> + <int Value="45" Name="FirstVisibleLine"/> + <int Value="53" Name="CurrentLine"/> <wxArrayString Name="Bookmarks"/> <IntVector Name="CollapsedFolds"/> </TabInfo> <TabInfo> <wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\Transformer.cpp" Name="FileName"/> - <int Value="219" Name="FirstVisibleLine"/> - <int Value="240" Name="CurrentLine"/> + <int Value="0" Name="FirstVisibleLine"/> + <int Value="5" Name="CurrentLine"/> <wxArrayString Name="Bookmarks"/> <IntVector Name="CollapsedFolds"/> </TabInfo> diff --git a/.codelite/PSP.tags b/.codelite/PSP.tags Binary files differindex d1aaa4b..67ea337 100644 --- a/.codelite/PSP.tags +++ b/.codelite/PSP.tags diff --git a/.codelite/compilation.db b/.codelite/compilation.db Binary files differindex 6ec24d1..e97ed34 100644 --- a/.codelite/compilation.db +++ b/.codelite/compilation.db diff --git a/.codelite/compile_commands.json b/.codelite/compile_commands.json index d5d94bb..ba59d01 100644 --- a/.codelite/compile_commands.json +++ b/.codelite/compile_commands.json @@ -1,21 +1,9 @@ [{ "directory": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project", - "command": "C:/TDM-GCC-64/bin/g++.exe -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -I. -I. -MG -MP -MT./Release/Transformer.cpp.o -MF./Release/Transformer.cpp.o.d -MM Transformer.cpp", - "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\Transformer.cpp" + "command": "C:/TDM-GCC-64/bin/g++.exe -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -I. -I. -MG -MP -MT./Release/MainFrame.cpp.o -MF./Release/MainFrame.cpp.o.d -MM MainFrame.cpp", + "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\MainFrame.cpp" }, { "directory": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project", "command": "C:/TDM-GCC-64/bin/g++.exe -c C:/Users/Thales/Documents/GitHub/PSP/Project/MainFrame.cpp -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -o ./Release/MainFrame.cpp.o -I. -I.", "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\MainFrame.cpp" - }, { - "directory": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project", - "command": "C:/TDM-GCC-64/bin/g++.exe -c C:/Users/Thales/Documents/GitHub/PSP/Project/Workspace.cpp -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -o ./Release/Workspace.cpp.o -I. -I.", - "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\Workspace.cpp" - }, { - "directory": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project", - "command": "C:/TDM-GCC-64/bin/g++.exe -c C:/Users/Thales/Documents/GitHub/PSP/Project/Transformer.cpp -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -o ./Release/Transformer.cpp.o -I. -I.", - "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\Transformer.cpp" - }, { - "directory": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project", - "command": "C:/TDM-GCC-64/bin/g++.exe -c C:/Users/Thales/Documents/GitHub/PSP/Project/TransformerForm.cpp -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -o ./Release/TransformerForm.cpp.o -I. -I.", - "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\TransformerForm.cpp" }]
\ No newline at end of file diff --git a/.codelite/refactoring.db b/.codelite/refactoring.db Binary files differindex 7a37da8..db76a0b 100644 --- a/.codelite/refactoring.db +++ b/.codelite/refactoring.db diff --git a/Project/Element.cpp b/Project/Element.cpp index 2efc482..7c69e18 100644 --- a/Project/Element.cpp +++ b/Project/Element.cpp @@ -14,9 +14,9 @@ void Element::DrawCircle(wxPoint2DDouble position, double radius, int numSegment { glBegin(mode); for(int i = 0; i < numSegments; i++) { - double theta = 2.0 * 3.1415926 * double(i) / double(numSegments); - glVertex2f(radius * std::cos(theta) + position.m_x, radius * std::sin(theta) + position.m_y); - } + double theta = 2.0 * 3.1415926 * double(i) / double(numSegments); + glVertex2f(radius * std::cos(theta) + position.m_x, radius * std::sin(theta) + position.m_y); + } glEnd(); } @@ -31,9 +31,9 @@ void Element::DrawArc(wxPoint2DDouble position, double finalAngRad = wxDegToRad(finalAngle); glBegin(mode); for(int i = 0; i <= numSegments; i++) { - double theta = initAngRad + (finalAngRad - initAngRad) * double(i) / double(numSegments); - glVertex2f(radius * std::cos(theta) + position.m_x, radius * std::sin(theta) + position.m_y); - } + double theta = initAngRad + (finalAngRad - initAngRad) * double(i) / double(numSegments); + glVertex2f(radius * std::cos(theta) + position.m_x, radius * std::sin(theta) + position.m_y); + } glEnd(); } @@ -41,8 +41,8 @@ void Element::DrawTriangle(std::vector<wxPoint2DDouble> points, GLenum mode) con { glBegin(mode); for(int i = 0; i < 3; i++) { - glVertex2d(points[i].m_x, points[i].m_y); - } + glVertex2d(points[i].m_x, points[i].m_y); + } glEnd(); } @@ -70,8 +70,8 @@ void Element::DrawLine(std::vector<wxPoint2DDouble> points, GLenum mode) const { glBegin(mode); for(auto it = points.begin(); it != points.end(); ++it) { - glVertex2d((*it).m_x, (*it).m_y); - } + glVertex2d((*it).m_x, (*it).m_y); + } glEnd(); } @@ -163,18 +163,18 @@ bool Element::RotatedRectanglesIntersects(wxRect2DDouble rect1, double radAngle2 = wxDegToRad(angle2); for(int i = 0; i < 4; i++) { - rect1Corners[i] = - wxPoint2DDouble(std::cos(radAngle1) * (rect1Corners[i].m_x - rect1Center.m_x) - - std::sin(radAngle1) * (rect1Corners[i].m_y - rect1Center.m_y) + rect1Center.m_x, - std::sin(radAngle1) * (rect1Corners[i].m_x - rect1Center.m_x) + - std::cos(radAngle1) * (rect1Corners[i].m_y - rect1Center.m_y) + rect1Center.m_y); - - rect2Corners[i] = - wxPoint2DDouble(std::cos(radAngle2) * (rect2Corners[i].m_x - rect2Center.m_x) - - std::sin(radAngle2) * (rect2Corners[i].m_y - rect2Center.m_y) + rect2Center.m_x, - std::sin(radAngle2) * (rect2Corners[i].m_x - rect2Center.m_x) + - std::cos(radAngle2) * (rect2Corners[i].m_y - rect2Center.m_y) + rect2Center.m_y); - } + rect1Corners[i] = + wxPoint2DDouble(std::cos(radAngle1) * (rect1Corners[i].m_x - rect1Center.m_x) - + std::sin(radAngle1) * (rect1Corners[i].m_y - rect1Center.m_y) + rect1Center.m_x, + std::sin(radAngle1) * (rect1Corners[i].m_x - rect1Center.m_x) + + std::cos(radAngle1) * (rect1Corners[i].m_y - rect1Center.m_y) + rect1Center.m_y); + + rect2Corners[i] = + wxPoint2DDouble(std::cos(radAngle2) * (rect2Corners[i].m_x - rect2Center.m_x) - + std::sin(radAngle2) * (rect2Corners[i].m_y - rect2Center.m_y) + rect2Center.m_x, + std::sin(radAngle2) * (rect2Corners[i].m_x - rect2Center.m_x) + + std::cos(radAngle2) * (rect2Corners[i].m_y - rect2Center.m_y) + rect2Center.m_y); + } //[Ref] http://www.gamedev.net/page/resources/_/technical/game-programming/2d-rotated-rectangle-collision-r2604 @@ -186,25 +186,25 @@ bool Element::RotatedRectanglesIntersects(wxRect2DDouble rect1, wxPoint2DDouble rect1ProjPts[4][4]; // [axis][corner] wxPoint2DDouble rect2ProjPts[4][4]; // [axis][corner] for(int i = 0; i < 4; i++) { - double den = axis[i].m_x * axis[i].m_x + axis[i].m_y * axis[i].m_y; - for(int j = 0; j < 4; j++) { - double m_rectProj = (rect1Corners[j].m_x * axis[i].m_x + rect1Corners[j].m_y * axis[i].m_y) / den; - double rectProj = (rect2Corners[j].m_x * axis[i].m_x + rect2Corners[j].m_y * axis[i].m_y) / den; + double den = axis[i].m_x * axis[i].m_x + axis[i].m_y * axis[i].m_y; + for(int j = 0; j < 4; j++) { + double m_rectProj = (rect1Corners[j].m_x * axis[i].m_x + rect1Corners[j].m_y * axis[i].m_y) / den; + double rectProj = (rect2Corners[j].m_x * axis[i].m_x + rect2Corners[j].m_y * axis[i].m_y) / den; - rect1ProjPts[i][j] = wxPoint2DDouble(m_rectProj * axis[i].m_x, m_rectProj * axis[i].m_y); - rect2ProjPts[i][j] = wxPoint2DDouble(rectProj * axis[i].m_x, rectProj * axis[i].m_y); - } - } + rect1ProjPts[i][j] = wxPoint2DDouble(m_rectProj * axis[i].m_x, m_rectProj * axis[i].m_y); + rect2ProjPts[i][j] = wxPoint2DDouble(rectProj * axis[i].m_x, rectProj * axis[i].m_y); + } + } // Calculate the scalar value to identify the max and min values on projections double rect1Scalar[4][4]; //[axis][corner] double rect2Scalar[4][4]; //[axis][corner] for(int i = 0; i < 4; i++) { - for(int j = 0; j < 4; j++) { - rect1Scalar[i][j] = rect1ProjPts[i][j].m_x * axis[i].m_x + rect1ProjPts[i][j].m_y * axis[i].m_y; - rect2Scalar[i][j] = rect2ProjPts[i][j].m_x * axis[i].m_x + rect2ProjPts[i][j].m_y * axis[i].m_y; - } - } + for(int j = 0; j < 4; j++) { + rect1Scalar[i][j] = rect1ProjPts[i][j].m_x * axis[i].m_x + rect1ProjPts[i][j].m_y * axis[i].m_y; + rect2Scalar[i][j] = rect2ProjPts[i][j].m_x * axis[i].m_x + rect2ProjPts[i][j].m_y * axis[i].m_y; + } + } // Identify the max and min scalar values double rect1Min[4]; double rect1Max[4]; @@ -212,24 +212,24 @@ bool Element::RotatedRectanglesIntersects(wxRect2DDouble rect1, double rect2Max[4]; for(int i = 0; i < 4; i++) { - rect1Max[i] = rect1Scalar[i][0]; - rect2Max[i] = rect2Scalar[i][0]; - rect1Min[i] = rect1Scalar[i][0]; - rect2Min[i] = rect2Scalar[i][0]; + rect1Max[i] = rect1Scalar[i][0]; + rect2Max[i] = rect2Scalar[i][0]; + rect1Min[i] = rect1Scalar[i][0]; + rect2Min[i] = rect2Scalar[i][0]; - for(int j = 1; j < 4; j++) { - if(rect1Max[i] < rect1Scalar[i][j]) rect1Max[i] = rect1Scalar[i][j]; - if(rect2Max[i] < rect2Scalar[i][j]) rect2Max[i] = rect2Scalar[i][j]; + for(int j = 1; j < 4; j++) { + if(rect1Max[i] < rect1Scalar[i][j]) rect1Max[i] = rect1Scalar[i][j]; + if(rect2Max[i] < rect2Scalar[i][j]) rect2Max[i] = rect2Scalar[i][j]; - if(rect1Min[i] > rect1Scalar[i][j]) rect1Min[i] = rect1Scalar[i][j]; - if(rect2Min[i] > rect2Scalar[i][j]) rect2Min[i] = rect2Scalar[i][j]; - } - } + if(rect1Min[i] > rect1Scalar[i][j]) rect1Min[i] = rect1Scalar[i][j]; + if(rect2Min[i] > rect2Scalar[i][j]) rect2Min[i] = rect2Scalar[i][j]; + } + } // Check if any segment don't overlap for(int i = 0; i < 4; i++) { - if(!(rect2Min[i] <= rect1Max[i] && rect2Max[i] >= rect1Min[i])) return false; - } + if(!(rect2Min[i] <= rect1Max[i] && rect2Max[i] >= rect1Min[i])) return false; + } return true; } @@ -247,40 +247,37 @@ void Element::DrawSwitches() const { int i = 0; for(auto it = m_parentList.begin(); it != m_parentList.end(); it++) { - Element* parent = *it; - if(parent) { - if(m_online) { - glColor4d(0.0, 0.4, 0.0, 1.0); // green - } - else - { - glColor4d(1.0, 0.1, 0.1, 1.0); // red - } - - glPushMatrix(); - glTranslated(m_switchRect[i].GetPosition().m_x + m_switchSize / 2.0, - m_switchRect[i].GetPosition().m_y + m_switchSize / 2.0, 0.0); - glRotated(parent->GetAngle(), 0.0, 0.0, 1.0); - glTranslated(-m_switchRect[i].GetPosition().m_x - m_switchSize / 2.0, - -m_switchRect[i].GetPosition().m_y - m_switchSize / 2.0, 0.0); - - DrawRectangle( - m_switchRect[i].GetPosition() + wxPoint2DDouble(m_switchSize / 2.0, m_switchSize / 2.0), - m_switchSize, m_switchSize); - - glPopMatrix(); - } - i++; - } + Element* parent = *it; + if(parent) { + if(m_online) { + glColor4d(0.0, 0.4, 0.0, 1.0); // green + } else { + glColor4d(1.0, 0.1, 0.1, 1.0); // red + } + + glPushMatrix(); + glTranslated(m_switchRect[i].GetPosition().m_x + m_switchSize / 2.0, + m_switchRect[i].GetPosition().m_y + m_switchSize / 2.0, 0.0); + glRotated(parent->GetAngle(), 0.0, 0.0, 1.0); + glTranslated(-m_switchRect[i].GetPosition().m_x - m_switchSize / 2.0, + -m_switchRect[i].GetPosition().m_y - m_switchSize / 2.0, 0.0); + + DrawRectangle(m_switchRect[i].GetPosition() + wxPoint2DDouble(m_switchSize / 2.0, m_switchSize / 2.0), + m_switchSize, m_switchSize); + + glPopMatrix(); + } + i++; + } } bool Element::SwitchesContains(wxPoint2DDouble position) const { for(int i = 0; i < (int)m_switchRect.size(); i++) { - if(m_parentList[i]) { - if(m_switchRect[i].Contains(position)) return true; - } - } + if(m_parentList[i]) { + if(m_switchRect[i].Contains(position)) return true; + } + } return false; } @@ -288,8 +285,8 @@ void Element::SetOnline(bool online) { // Check if any parent is null. for(auto it = m_parentList.begin(); it != m_parentList.end(); it++) { - if(!(*it)) return; - } + if(!(*it)) return; + } m_online = online; } @@ -317,50 +314,76 @@ void Element::CalculateBoundaries(wxPoint2DDouble& leftUp, wxPoint2DDouble& righ m_rect.GetRightTop()}; // Rotate corners. for(int i = 0; i < 4; ++i) { - rectCorner[i] = RotateAtPosition(rectCorner[i], m_angle); - } + rectCorner[i] = RotateAtPosition(rectCorner[i], m_angle); + } leftUp = rectCorner[0]; rightBottom = rectCorner[0]; for(int i = 1; i < 4; ++i) { - if(rectCorner[i].m_x < leftUp.m_x) leftUp.m_x = rectCorner[i].m_x; - if(rectCorner[i].m_y < leftUp.m_y) leftUp.m_y = rectCorner[i].m_y; - if(rectCorner[i].m_x > rightBottom.m_x) rightBottom.m_x = rectCorner[i].m_x; - if(rectCorner[i].m_y > rightBottom.m_y) rightBottom.m_y = rectCorner[i].m_y; - } + if(rectCorner[i].m_x < leftUp.m_x) leftUp.m_x = rectCorner[i].m_x; + if(rectCorner[i].m_y < leftUp.m_y) leftUp.m_y = rectCorner[i].m_y; + if(rectCorner[i].m_x > rightBottom.m_x) rightBottom.m_x = rectCorner[i].m_x; + if(rectCorner[i].m_y > rightBottom.m_y) rightBottom.m_y = rectCorner[i].m_y; + } // Check points list boundaries. for(int i = 0; i < (int)m_pointList.size(); i++) { - if(m_pointList[i].m_x < leftUp.m_x) leftUp.m_x = m_pointList[i].m_x; - if(m_pointList[i].m_y < leftUp.m_y) leftUp.m_y = m_pointList[i].m_y; - if(m_pointList[i].m_x > rightBottom.m_x) rightBottom.m_x = m_pointList[i].m_x; - if(m_pointList[i].m_y > rightBottom.m_y) rightBottom.m_y = m_pointList[i].m_y; - } + if(m_pointList[i].m_x < leftUp.m_x) leftUp.m_x = m_pointList[i].m_x; + if(m_pointList[i].m_y < leftUp.m_y) leftUp.m_y = m_pointList[i].m_y; + if(m_pointList[i].m_x > rightBottom.m_x) rightBottom.m_x = m_pointList[i].m_x; + if(m_pointList[i].m_y > rightBottom.m_y) rightBottom.m_y = m_pointList[i].m_y; + } } bool Element::DoubleFromString(wxWindow* parent, wxString strValue, double& value, wxString errorMsg) { - double dValue = 0.0; - - if(!strValue.ToDouble(&dValue)) { - wxMessageDialog msgDialog(parent, errorMsg, _("Error"), wxOK|wxCENTRE|wxICON_ERROR); - msgDialog.ShowModal(); - return false; - } - - value = dValue; - return true; + double dValue = 0.0; + + if(!strValue.ToDouble(&dValue)) { + wxMessageDialog msgDialog(parent, errorMsg, _("Error"), wxOK | wxCENTRE | wxICON_ERROR); + msgDialog.ShowModal(); + return false; + } + + value = dValue; + return true; } bool Element::IntFromString(wxWindow* parent, wxString strValue, int& value, wxString errorMsg) { - long int iValue = 0; - - if(!strValue.ToLong(&iValue)) { - wxMessageDialog msgDialog(parent, errorMsg, _("Error"), wxOK|wxCENTRE|wxICON_ERROR); - msgDialog.ShowModal(); - return false; - } - - value = iValue; - return true; + long int iValue = 0; + + if(!strValue.ToLong(&iValue)) { + wxMessageDialog msgDialog(parent, errorMsg, _("Error"), wxOK | wxCENTRE | wxICON_ERROR); + msgDialog.ShowModal(); + return false; + } + + value = iValue; + return true; +} + +wxString Element::StringFromDouble(double value, int minDecimal) +{ + wxString str = wxString::FromCDouble(value, 13); + int cutNumber = 0; + int numDecimal = 0; + bool foundCut = false; + for(int i = (int)str.length() - 1; i >= 0; i--) { + if(str[i] != '0' && !foundCut) { + cutNumber = i; + foundCut = true; + } + if(str[i] == '.') { + numDecimal = i; + break; + } + } + + wxString formatedStr = ""; + if(cutNumber - numDecimal > minDecimal) + formatedStr = wxString::FromDouble(value, cutNumber - numDecimal); + else + formatedStr = wxString::FromDouble(value, minDecimal); + + return formatedStr; } diff --git a/Project/Element.h b/Project/Element.h index 17a8902..51cb588 100644 --- a/Project/Element.h +++ b/Project/Element.h @@ -7,6 +7,8 @@ #include <wx/menu.h> #include <GL/gl.h> +#include <wx/log.h> + enum PickboxID { ID_PB_NONE = 0, @@ -185,6 +187,9 @@ class Element virtual void SetNominalVoltage(std::vector<double> nominalVoltage, std::vector<ElectricalUnit> nominalVoltageUnit) {} virtual void SetSwitchingData(SwitchingData data) { m_swData = data; } virtual SwitchingData GetSwitchingData() { return m_swData; } + + //Static methods + static wxString StringFromDouble(double value, int minDecimal = 1); protected: std::vector<Element*> m_parentList; diff --git a/Project/LineForm.cpp b/Project/LineForm.cpp index 79fe9c7..3c288b1 100644 --- a/Project/LineForm.cpp +++ b/Project/LineForm.cpp @@ -27,7 +27,7 @@ LineForm::LineForm(wxWindow* parent, Line* line) : LineFormBase(parent) m_textCtrlName->SetValue(data.name); - wxString nominalVoltageStr = wxString::FromDouble(data.nominalVoltage); + wxString nominalVoltageStr = Line::StringFromDouble(data.nominalVoltage); switch(data.nominalVoltageUnit) { case UNIT_V: { nominalVoltageStr += " V"; @@ -40,7 +40,7 @@ LineForm::LineForm(wxWindow* parent, Line* line) : LineFormBase(parent) } m_staticTextNominalVoltageValue->SetLabel(nominalVoltageStr); - m_textCtrlNominalPower->SetValue(wxString::FromDouble(data.nominalPower)); + m_textCtrlNominalPower->SetValue(Line::StringFromDouble(data.nominalPower)); switch(data.nominalPowerUnit) { case UNIT_VA: { m_choiceNominalPower->SetSelection(0); @@ -55,7 +55,7 @@ LineForm::LineForm(wxWindow* parent, Line* line) : LineFormBase(parent) break; } - m_textCtrlResistance->SetValue(wxString::FromDouble(data.resistance)); + m_textCtrlResistance->SetValue(Line::StringFromDouble(data.resistance)); switch(data.resistanceUnit) { case UNIT_PU: { m_choiceResistance->SetSelection(0); @@ -70,7 +70,7 @@ LineForm::LineForm(wxWindow* parent, Line* line) : LineFormBase(parent) break; } - m_textCtrlReactance->SetValue(wxString::FromDouble(data.indReactance)); + m_textCtrlReactance->SetValue(Line::StringFromDouble(data.indReactance)); switch(data.indReactanceUnit) { case UNIT_PU: { m_choiceReactance->SetSelection(0); @@ -85,7 +85,7 @@ LineForm::LineForm(wxWindow* parent, Line* line) : LineFormBase(parent) break; } - m_textCtrlSusceptance->SetValue(wxString::FromDouble(data.capSusceptance)); + m_textCtrlSusceptance->SetValue(Line::StringFromDouble(data.capSusceptance)); switch(data.capSusceptanceUnit) { case UNIT_PU: { m_choiceSusceptance->SetSelection(0); @@ -100,12 +100,12 @@ LineForm::LineForm(wxWindow* parent, Line* line) : LineFormBase(parent) break; } - m_textCtrlLineSize->SetValue(wxString::FromDouble(data.lineSize)); + m_textCtrlLineSize->SetValue(Line::StringFromDouble(data.lineSize)); m_checkUseLinePower->SetValue(data.useLinePower); - m_textCtrlZeroResistance->SetValue(wxString::FromDouble(data.zeroResistance)); - m_textCtrlZeroReactance->SetValue(wxString::FromDouble(data.zeroIndReactance)); - m_textCtrlZeroSusceptance->SetValue(wxString::FromDouble(data.zeroCapSusceptance)); + m_textCtrlZeroResistance->SetValue(Line::StringFromDouble(data.zeroResistance)); + m_textCtrlZeroReactance->SetValue(Line::StringFromDouble(data.zeroIndReactance)); + m_textCtrlZeroSusceptance->SetValue(Line::StringFromDouble(data.zeroCapSusceptance)); } LineForm::~LineForm() {} diff --git a/Project/MainFrame.cpp b/Project/MainFrame.cpp index aedf7a8..e06dc64 100644 --- a/Project/MainFrame.cpp +++ b/Project/MainFrame.cpp @@ -22,10 +22,10 @@ MainFrame::~MainFrame() { // if(m_artMetro) delete m_artMetro; if(m_addElementsMenu) { - m_addElementsMenu->Disconnect(wxEVT_COMMAND_MENU_SELECTED, - wxCommandEventHandler(MainFrame::OnAddElementsClick), NULL, this); - delete m_addElementsMenu; - } + m_addElementsMenu->Disconnect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainFrame::OnAddElementsClick), + NULL, this); + delete m_addElementsMenu; + } } void MainFrame::Init() { @@ -138,8 +138,8 @@ void MainFrame::OnDeleteClick(wxRibbonButtonBarEvent& event) { Workspace* workspace = (Workspace*)m_auiNotebook->GetCurrentPage(); if(workspace) { - workspace->DeleteSelectedElements(); - } + workspace->DeleteSelectedElements(); + } } void MainFrame::OnDisableSolutionClick(wxRibbonButtonBarEvent& event) { @@ -160,35 +160,34 @@ void MainFrame::OnFitClick(wxRibbonButtonBarEvent& event) { Workspace* workspace = (Workspace*)m_auiNotebook->GetCurrentPage(); if(workspace) { - workspace->Fit(); - } + workspace->Fit(); + } } void MainFrame::OnMoveClick(wxRibbonButtonBarEvent& event) { Workspace* workspace = (Workspace*)m_auiNotebook->GetCurrentPage(); if(workspace) { - auto elementList = workspace->GetElementList(); - // Calculate the average position of selected elements. - wxPoint2DDouble averagePos(0, 0); - int numSelElements = 0; - for(auto it = elementList.begin(); it != elementList.end(); it++) { - Element* element = *it; - if(element->IsSelected()) { - averagePos += element->GetPosition(); - numSelElements++; - } - } - averagePos = - wxPoint2DDouble(averagePos.m_x / double(numSelElements), averagePos.m_y / double(numSelElements)); - // Set the move position to the average of selected elements. - for(auto it = elementList.begin(); it != elementList.end(); it++) { - Element* element = *it; - if(element->IsSelected()) { - element->StartMove(averagePos); - } - } - workspace->SetWorkspaceMode(MODE_MOVE_ELEMENT); - } + auto elementList = workspace->GetElementList(); + // Calculate the average position of selected elements. + wxPoint2DDouble averagePos(0, 0); + int numSelElements = 0; + for(auto it = elementList.begin(); it != elementList.end(); it++) { + Element* element = *it; + if(element->IsSelected()) { + averagePos += element->GetPosition(); + numSelElements++; + } + } + averagePos = wxPoint2DDouble(averagePos.m_x / double(numSelElements), averagePos.m_y / double(numSelElements)); + // Set the move position to the average of selected elements. + for(auto it = elementList.begin(); it != elementList.end(); it++) { + Element* element = *it; + if(element->IsSelected()) { + element->StartMove(averagePos); + } + } + workspace->SetWorkspaceMode(MODE_MOVE_ELEMENT); + } } void MainFrame::OnOpenClick(wxRibbonButtonBarEvent& event) {} void MainFrame::OnPSPGuideClick(wxRibbonButtonBarEvent& event) {} @@ -209,101 +208,82 @@ void MainFrame::OnAddElementsClick(wxCommandEvent& event) Workspace* workspace = (Workspace*)m_auiNotebook->GetCurrentPage(); if(workspace) { - if(workspace->GetWorkspaceMode() != MODE_INSERT) { - auto elementList = workspace->GetElementList(); - wxString statusBarText = ""; - bool newElement = false; + if(workspace->GetWorkspaceMode() != MODE_INSERT) { + auto elementList = workspace->GetElementList(); + wxString statusBarText = ""; + bool newElement = false; - switch(event.GetId()) - { - case ID_ADDMENU_BUS: - { - Bus* newBus = - new Bus(wxPoint2DDouble(0, 0), - wxString::Format(_("Bus %d"), workspace->GetElementNumber(ID_BUS))); - workspace->IncrementElementNumber(ID_BUS); - elementList.push_back(newBus); - statusBarText = _("Insert Bus: Click to insert, ESC to cancel."); - newElement = true; - } - break; - case ID_ADDMENU_LINE: - { - Line* newLine = - new Line(wxString::Format(_("Line %d"), workspace->GetElementNumber(ID_LINE))); - elementList.push_back(newLine); - workspace->IncrementElementNumber(ID_LINE); - statusBarText = _("Insert Line: Click on two buses, ESC to cancel."); - newElement = true; - } - break; - case ID_ADDMENU_TRANSFORMER: - { - Transformer* newTransformer = new Transformer(); - elementList.push_back(newTransformer); - statusBarText = _("Insert Transformer: Click on two buses, ESC to cancel."); - newElement = true; - } - break; - case ID_ADDMENU_GENERATOR: - { - SyncGenerator* newGenerator = new SyncGenerator( - wxString::Format(_("Bus %d"), workspace->GetElementNumber(ID_SYNCGENERATOR))); - workspace->IncrementElementNumber(ID_SYNCGENERATOR); - elementList.push_back(newGenerator); - statusBarText = _("Insert Generator: Click on a buses, ESC to cancel."); - newElement = true; - } - break; - case ID_ADDMENU_LOAD: - { - Load* newLoad = new Load(); - elementList.push_back(newLoad); - statusBarText = _("Insert Load: Click on a buses, ESC to cancel."); - newElement = true; - } - break; - case ID_ADDMENU_CAPACITOR: - { - Capacitor* newCapacitor = new Capacitor(); - elementList.push_back(newCapacitor); - statusBarText = _("Insert Capacitor: Click on a buses, ESC to cancel."); - newElement = true; - } - break; - case ID_ADDMENU_INDUCTOR: - { - Inductor* newInductor = new Inductor(); - elementList.push_back(newInductor); - statusBarText = _("Insert Inductor: Click on a buses, ESC to cancel."); - newElement = true; - } - break; - case ID_ADDMENU_INDMOTOR: - { - IndMotor* newIndMotor = new IndMotor(); - elementList.push_back(newIndMotor); - statusBarText = _("Insert Induction Motor: Click on a buses, ESC to cancel."); - newElement = true; - } - break; - case ID_ADDMENU_SYNCCOMP: - { - SyncMotor* newSyncCondenser = new SyncMotor(); - elementList.push_back(newSyncCondenser); - statusBarText = _("Insert Synchronous Condenser: Click on a buses, ESC to cancel."); - newElement = true; - } - break; - } - if(newElement) { - workspace->SetElementList(elementList); - workspace->SetWorkspaceMode(MODE_INSERT); - workspace->SetStatusBarText(statusBarText); - workspace->Redraw(); - } - } - } + switch(event.GetId()) { + case ID_ADDMENU_BUS: { + Bus* newBus = new Bus(wxPoint2DDouble(0, 0), + wxString::Format(_("Bus %d"), workspace->GetElementNumber(ID_BUS))); + workspace->IncrementElementNumber(ID_BUS); + elementList.push_back(newBus); + statusBarText = _("Insert Bus: Click to insert, ESC to cancel."); + newElement = true; + } break; + case ID_ADDMENU_LINE: { + Line* newLine = new Line(wxString::Format(_("Line %d"), workspace->GetElementNumber(ID_LINE))); + elementList.push_back(newLine); + workspace->IncrementElementNumber(ID_LINE); + statusBarText = _("Insert Line: Click on two buses, ESC to cancel."); + newElement = true; + } break; + case ID_ADDMENU_TRANSFORMER: { + Transformer* newTransformer = + new Transformer(wxString::Format(_("Transformer %d"), workspace->GetElementNumber(ID_TRANSFORMER))); + workspace->IncrementElementNumber(ID_TRANSFORMER); + elementList.push_back(newTransformer); + statusBarText = _("Insert Transformer: Click on two buses, ESC to cancel."); + newElement = true; + } break; + case ID_ADDMENU_GENERATOR: { + SyncGenerator* newGenerator = + new SyncGenerator(wxString::Format(_("Bus %d"), workspace->GetElementNumber(ID_SYNCGENERATOR))); + workspace->IncrementElementNumber(ID_SYNCGENERATOR); + elementList.push_back(newGenerator); + statusBarText = _("Insert Generator: Click on a buses, ESC to cancel."); + newElement = true; + } break; + case ID_ADDMENU_LOAD: { + Load* newLoad = new Load(); + elementList.push_back(newLoad); + statusBarText = _("Insert Load: Click on a buses, ESC to cancel."); + newElement = true; + } break; + case ID_ADDMENU_CAPACITOR: { + Capacitor* newCapacitor = new Capacitor(); + elementList.push_back(newCapacitor); + statusBarText = _("Insert Capacitor: Click on a buses, ESC to cancel."); + newElement = true; + } break; + case ID_ADDMENU_INDUCTOR: { + Inductor* newInductor = new Inductor(); + elementList.push_back(newInductor); + statusBarText = _("Insert Inductor: Click on a buses, ESC to cancel."); + newElement = true; + } break; + case ID_ADDMENU_INDMOTOR: { + IndMotor* newIndMotor = new IndMotor(); + elementList.push_back(newIndMotor); + statusBarText = _("Insert Induction Motor: Click on a buses, ESC to cancel."); + newElement = true; + } break; + case ID_ADDMENU_SYNCCOMP: { + SyncMotor* newSyncCondenser = new SyncMotor(); + elementList.push_back(newSyncCondenser); + statusBarText = _("Insert Synchronous Condenser: Click on a buses, ESC to cancel."); + newElement = true; + } break; + } + if(newElement) { + workspace->SetElementList(elementList); + workspace->SetWorkspaceMode(MODE_INSERT); + workspace->SetStatusBarText(statusBarText); + workspace->Redraw(); + } + } + } } void MainFrame::NotebookPageClosed(wxAuiNotebookEvent& event) { @@ -314,26 +294,26 @@ void MainFrame::NotebookPageClosing(wxAuiNotebookEvent& event) { auto it = m_workspaceList.begin(); while(it != m_workspaceList.end()) { - if(*it == m_auiNotebook->GetCurrentPage()) { - // delete *it; //Memory leak? - m_workspaceList.erase(it); - break; - } - it++; - } + if(*it == m_auiNotebook->GetCurrentPage()) { + // delete *it; //Memory leak? + m_workspaceList.erase(it); + break; + } + it++; + } event.Skip(); } void MainFrame::OnRotClockClick(wxRibbonButtonBarEvent& event) { Workspace* workspace = (Workspace*)m_auiNotebook->GetCurrentPage(); if(workspace) { - workspace->RotateSelectedElements(); - } + workspace->RotateSelectedElements(); + } } void MainFrame::OnRotCounterClockClick(wxRibbonButtonBarEvent& event) { Workspace* workspace = (Workspace*)m_auiNotebook->GetCurrentPage(); if(workspace) { - workspace->RotateSelectedElements(false); - } + workspace->RotateSelectedElements(false); + } } diff --git a/Project/Project.mk b/Project/Project.mk index 6d2a336..7d2eaa2 100644 --- a/Project/Project.mk +++ b/Project/Project.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=Thales -Date :=17/10/2016 +Date :=18/10/2016 CodeLitePath :="C:/Program Files/CodeLite" LinkerName :=C:/TDM-GCC-64/bin/g++.exe SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC diff --git a/Project/Release/Element.cpp.o b/Project/Release/Element.cpp.o Binary files differindex 9af96aa..4b4f63d 100644 --- a/Project/Release/Element.cpp.o +++ b/Project/Release/Element.cpp.o diff --git a/Project/Release/Element.cpp.o.d b/Project/Release/Element.cpp.o.d index 1799c00..53eb1b7 100644 --- a/Project/Release/Element.cpp.o.d +++ b/Project/Release/Element.cpp.o.d @@ -130,7 +130,9 @@ Release/Element.cpp.o: Element.cpp Element.h \ C:/wxWidgets-3.1.0/include/wx/msw/bitmap.h \ C:/wxWidgets-3.1.0/include/wx/ownerdrw.h \ C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h \ - C:/wxWidgets-3.1.0/include/wx/msw/menu.h + C:/wxWidgets-3.1.0/include/wx/msw/menu.h \ + C:/wxWidgets-3.1.0/include/wx/log.h \ + C:/wxWidgets-3.1.0/include/wx/generic/logg.h Element.h: @@ -399,3 +401,7 @@ C:/wxWidgets-3.1.0/include/wx/ownerdrw.h: C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h: C:/wxWidgets-3.1.0/include/wx/msw/menu.h: + +C:/wxWidgets-3.1.0/include/wx/log.h: + +C:/wxWidgets-3.1.0/include/wx/generic/logg.h: diff --git a/Project/Release/LineForm.cpp.o b/Project/Release/LineForm.cpp.o Binary files differindex 4795e74..ebf71f9 100644 --- a/Project/Release/LineForm.cpp.o +++ b/Project/Release/LineForm.cpp.o diff --git a/Project/Release/LineForm.cpp.o.d b/Project/Release/LineForm.cpp.o.d index 051263c..10b8ad0 100644 --- a/Project/Release/LineForm.cpp.o.d +++ b/Project/Release/LineForm.cpp.o.d @@ -223,7 +223,9 @@ Release/LineForm.cpp.o: LineForm.cpp LineForm.h ElementForm.h \ C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h \ C:/wxWidgets-3.1.0/include/wx/ownerdrw.h \ C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h \ - C:/wxWidgets-3.1.0/include/wx/msw/menu.h Bus.h BusForm.h + C:/wxWidgets-3.1.0/include/wx/msw/menu.h \ + C:/wxWidgets-3.1.0/include/wx/log.h \ + C:/wxWidgets-3.1.0/include/wx/generic/logg.h Bus.h BusForm.h LineForm.h: @@ -691,6 +693,10 @@ C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h: C:/wxWidgets-3.1.0/include/wx/msw/menu.h: +C:/wxWidgets-3.1.0/include/wx/log.h: + +C:/wxWidgets-3.1.0/include/wx/generic/logg.h: + Bus.h: BusForm.h: diff --git a/Project/Release/MainFrame.cpp.o b/Project/Release/MainFrame.cpp.o Binary files differindex a0e5599..5865350 100644 --- a/Project/Release/MainFrame.cpp.o +++ b/Project/Release/MainFrame.cpp.o diff --git a/Project/Release/MainFrame.cpp.o.d b/Project/Release/MainFrame.cpp.o.d index f9579f0..d82df04 100644 --- a/Project/Release/MainFrame.cpp.o.d +++ b/Project/Release/MainFrame.cpp.o.d @@ -222,7 +222,36 @@ Release/MainFrame.cpp.o: MainFrame.cpp MainFrame.h \ C:/wxWidgets-3.1.0/include/wx/statbox.h \ C:/wxWidgets-3.1.0/include/wx/msw/statbox.h \ C:/wxWidgets-3.1.0/include/wx/statline.h \ - C:/wxWidgets-3.1.0/include/wx/msw/statline.h Element.h Line.h LineForm.h \ + C:/wxWidgets-3.1.0/include/wx/msw/statline.h \ + C:/wxWidgets-3.1.0/include/wx/propgrid/manager.h \ + C:/wxWidgets-3.1.0/include/wx/propgrid/propgrid.h \ + C:/wxWidgets-3.1.0/include/wx/scrolwin.h \ + C:/wxWidgets-3.1.0/include/wx/generic/scrolwin.h \ + C:/wxWidgets-3.1.0/include/wx/recguard.h \ + C:/wxWidgets-3.1.0/include/wx/propgrid/property.h \ + C:/wxWidgets-3.1.0/include/wx/propgrid/propgriddefs.h \ + C:/wxWidgets-3.1.0/include/wx/hashset.h \ + C:/wxWidgets-3.1.0/include/wx/tokenzr.h \ + C:/wxWidgets-3.1.0/include/wx/propgrid/propgridiface.h \ + C:/wxWidgets-3.1.0/include/wx/propgrid/propgridpagestate.h \ + C:/wxWidgets-3.1.0/include/wx/propgrid/props.h \ + C:/wxWidgets-3.1.0/include/wx/propgrid/editors.h \ + C:/wxWidgets-3.1.0/include/wx/listbox.h \ + C:/wxWidgets-3.1.0/include/wx/msw/listbox.h \ + C:/wxWidgets-3.1.0/include/wx/valtext.h \ + C:/wxWidgets-3.1.0/include/wx/toolbar.h \ + C:/wxWidgets-3.1.0/include/wx/tbarbase.h \ + C:/wxWidgets-3.1.0/include/wx/msw/toolbar.h \ + C:/wxWidgets-3.1.0/include/wx/headerctrl.h \ + C:/wxWidgets-3.1.0/include/wx/headercol.h \ + C:/wxWidgets-3.1.0/include/wx/msw/headerctrl.h \ + C:/wxWidgets-3.1.0/include/wx/propgrid/advprops.h \ + C:/wxWidgets-3.1.0/include/wx/spinbutt.h \ + C:/wxWidgets-3.1.0/include/wx/range.h \ + C:/wxWidgets-3.1.0/include/wx/msw/spinbutt.h \ + C:/wxWidgets-3.1.0/include/wx/listctrl.h \ + C:/wxWidgets-3.1.0/include/wx/listbase.h \ + C:/wxWidgets-3.1.0/include/wx/msw/listctrl.h Element.h Line.h LineForm.h \ Branch.h Transformer.h SyncGenerator.h GeneratorForm.h Machines.h \ IndMotor.h SyncMotor.h Load.h Shunt.h Inductor.h Capacitor.h @@ -692,6 +721,64 @@ C:/wxWidgets-3.1.0/include/wx/statline.h: C:/wxWidgets-3.1.0/include/wx/msw/statline.h: +C:/wxWidgets-3.1.0/include/wx/propgrid/manager.h: + +C:/wxWidgets-3.1.0/include/wx/propgrid/propgrid.h: + +C:/wxWidgets-3.1.0/include/wx/scrolwin.h: + +C:/wxWidgets-3.1.0/include/wx/generic/scrolwin.h: + +C:/wxWidgets-3.1.0/include/wx/recguard.h: + +C:/wxWidgets-3.1.0/include/wx/propgrid/property.h: + +C:/wxWidgets-3.1.0/include/wx/propgrid/propgriddefs.h: + +C:/wxWidgets-3.1.0/include/wx/hashset.h: + +C:/wxWidgets-3.1.0/include/wx/tokenzr.h: + +C:/wxWidgets-3.1.0/include/wx/propgrid/propgridiface.h: + +C:/wxWidgets-3.1.0/include/wx/propgrid/propgridpagestate.h: + +C:/wxWidgets-3.1.0/include/wx/propgrid/props.h: + +C:/wxWidgets-3.1.0/include/wx/propgrid/editors.h: + +C:/wxWidgets-3.1.0/include/wx/listbox.h: + +C:/wxWidgets-3.1.0/include/wx/msw/listbox.h: + +C:/wxWidgets-3.1.0/include/wx/valtext.h: + +C:/wxWidgets-3.1.0/include/wx/toolbar.h: + +C:/wxWidgets-3.1.0/include/wx/tbarbase.h: + +C:/wxWidgets-3.1.0/include/wx/msw/toolbar.h: + +C:/wxWidgets-3.1.0/include/wx/headerctrl.h: + +C:/wxWidgets-3.1.0/include/wx/headercol.h: + +C:/wxWidgets-3.1.0/include/wx/msw/headerctrl.h: + +C:/wxWidgets-3.1.0/include/wx/propgrid/advprops.h: + +C:/wxWidgets-3.1.0/include/wx/spinbutt.h: + +C:/wxWidgets-3.1.0/include/wx/range.h: + +C:/wxWidgets-3.1.0/include/wx/msw/spinbutt.h: + +C:/wxWidgets-3.1.0/include/wx/listctrl.h: + +C:/wxWidgets-3.1.0/include/wx/listbase.h: + +C:/wxWidgets-3.1.0/include/wx/msw/listctrl.h: + Element.h: Line.h: diff --git a/Project/Release/PSP-UFU.exe b/Project/Release/PSP-UFU.exe Binary files differindex fd2cacc..417014e 100644 --- a/Project/Release/PSP-UFU.exe +++ b/Project/Release/PSP-UFU.exe diff --git a/Project/Release/Transformer.cpp.o b/Project/Release/Transformer.cpp.o Binary files differindex 9c1cc7f..4f2b47b 100644 --- a/Project/Release/Transformer.cpp.o +++ b/Project/Release/Transformer.cpp.o diff --git a/Project/Release/Transformer.cpp.o.d b/Project/Release/Transformer.cpp.o.d index 5f86156..498668e 100644 --- a/Project/Release/Transformer.cpp.o.d +++ b/Project/Release/Transformer.cpp.o.d @@ -223,7 +223,9 @@ Release/Transformer.cpp.o: Transformer.cpp TransformerForm.h \ C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h \ C:/wxWidgets-3.1.0/include/wx/ownerdrw.h \ C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h \ - C:/wxWidgets-3.1.0/include/wx/msw/menu.h Bus.h BusForm.h + C:/wxWidgets-3.1.0/include/wx/msw/menu.h \ + C:/wxWidgets-3.1.0/include/wx/log.h \ + C:/wxWidgets-3.1.0/include/wx/generic/logg.h Bus.h BusForm.h TransformerForm.h: @@ -689,6 +691,10 @@ C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h: C:/wxWidgets-3.1.0/include/wx/msw/menu.h: +C:/wxWidgets-3.1.0/include/wx/log.h: + +C:/wxWidgets-3.1.0/include/wx/generic/logg.h: + Bus.h: BusForm.h: diff --git a/Project/Release/TransformerForm.cpp.o b/Project/Release/TransformerForm.cpp.o Binary files differindex 8860e67..15c729d 100644 --- a/Project/Release/TransformerForm.cpp.o +++ b/Project/Release/TransformerForm.cpp.o diff --git a/Project/Release/TransformerForm.cpp.o.d b/Project/Release/TransformerForm.cpp.o.d index 8832fbb..bd7542a 100644 --- a/Project/Release/TransformerForm.cpp.o.d +++ b/Project/Release/TransformerForm.cpp.o.d @@ -223,7 +223,9 @@ Release/TransformerForm.cpp.o: TransformerForm.cpp TransformerForm.h \ C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h \ C:/wxWidgets-3.1.0/include/wx/ownerdrw.h \ C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h \ - C:/wxWidgets-3.1.0/include/wx/msw/menu.h Bus.h BusForm.h + C:/wxWidgets-3.1.0/include/wx/msw/menu.h \ + C:/wxWidgets-3.1.0/include/wx/log.h \ + C:/wxWidgets-3.1.0/include/wx/generic/logg.h Bus.h BusForm.h TransformerForm.h: @@ -691,6 +693,10 @@ C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h: C:/wxWidgets-3.1.0/include/wx/msw/menu.h: +C:/wxWidgets-3.1.0/include/wx/log.h: + +C:/wxWidgets-3.1.0/include/wx/generic/logg.h: + Bus.h: BusForm.h: diff --git a/Project/Release/Workspace.cpp.o b/Project/Release/Workspace.cpp.o Binary files differindex 1d9efa4..645488c 100644 --- a/Project/Release/Workspace.cpp.o +++ b/Project/Release/Workspace.cpp.o diff --git a/Project/Transformer.cpp b/Project/Transformer.cpp index 31a987b..57614bb 100644 --- a/Project/Transformer.cpp +++ b/Project/Transformer.cpp @@ -2,68 +2,67 @@ #include "Transformer.h" Transformer::Transformer() : Branch() {} +Transformer::Transformer(wxString name) : Branch() { m_electricalData.name = name; } Transformer::~Transformer() {} bool Transformer::AddParent(Element* parent, wxPoint2DDouble position) { if(parent) { - // First bus. - if(m_parentList.size() == 0) { - m_position = position; - 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. - m_pointList.push_back(parentPt); // First point - m_pointList.push_back(GetSwitchPoint(parent, parentPt, m_position)); - - wxRect2DDouble genRect(0,0,0,0); - m_switchRect.push_back(genRect); - - return false; - } - // Second bus. - else if(parent != m_parentList[0]) - { - 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. - - // Get the average between the two bus points. - m_position = wxPoint2DDouble((m_pointList[0].m_x + parentPt.m_x) / 2.0, - (m_pointList[0].m_y + parentPt.m_y) / 2.0); - // Set the transformer rectangle. - m_width = 70.0; - m_height = 40.0; - m_rect = wxRect2DDouble(m_position.m_x - m_width / 2.0, m_position.m_y - m_height / 2.0, m_width, - m_height); - // Set the "side" points. - m_pointList.push_back(wxPoint2DDouble(m_rect.GetPosition() + wxPoint2DDouble(-10, m_height / 2.0))); - m_pointList.push_back( - wxPoint2DDouble(m_rect.GetPosition() + wxPoint2DDouble(m_width + 10, m_height / 2.0))); - - // Set first switch point. - wxPoint2DDouble secondPoint = parentPt; - if(m_pointList.size() > 2) { - secondPoint = m_pointList[2]; - } - m_pointList[1] = GetSwitchPoint(m_parentList[0], m_pointList[0], secondPoint); - - // Set the second switch point. - m_pointList.push_back(GetSwitchPoint(parent, parentPt, m_pointList[m_pointList.size() - 1])); - - m_pointList.push_back(parentPt); // Last point. - m_inserted = true; - - wxRect2DDouble genRect(0,0,0,0); - m_switchRect.push_back(genRect); - UpdateSwitches(); - - return true; - } - } + // First bus. + if(m_parentList.size() == 0) { + m_position = position; + 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. + m_pointList.push_back(parentPt); // First point + m_pointList.push_back(GetSwitchPoint(parent, parentPt, m_position)); + + wxRect2DDouble genRect(0, 0, 0, 0); + m_switchRect.push_back(genRect); + + return false; + } + // Second bus. + else if(parent != m_parentList[0]) { + 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. + + // Get the average between the two bus points. + m_position = + wxPoint2DDouble((m_pointList[0].m_x + parentPt.m_x) / 2.0, (m_pointList[0].m_y + parentPt.m_y) / 2.0); + // Set the transformer rectangle. + m_width = 70.0; + m_height = 40.0; + m_rect = wxRect2DDouble(m_position.m_x - m_width / 2.0, m_position.m_y - m_height / 2.0, m_width, m_height); + // Set the "side" points. + m_pointList.push_back(wxPoint2DDouble(m_rect.GetPosition() + wxPoint2DDouble(-10, m_height / 2.0))); + m_pointList.push_back( + wxPoint2DDouble(m_rect.GetPosition() + wxPoint2DDouble(m_width + 10, m_height / 2.0))); + + // Set first switch point. + wxPoint2DDouble secondPoint = parentPt; + if(m_pointList.size() > 2) { + secondPoint = m_pointList[2]; + } + m_pointList[1] = GetSwitchPoint(m_parentList[0], m_pointList[0], secondPoint); + + // Set the second switch point. + m_pointList.push_back(GetSwitchPoint(parent, parentPt, m_pointList[m_pointList.size() - 1])); + + m_pointList.push_back(parentPt); // Last point. + m_inserted = true; + + wxRect2DDouble genRect(0, 0, 0, 0); + m_switchRect.push_back(genRect); + UpdateSwitches(); + + return true; + } + } return false; } @@ -76,70 +75,70 @@ bool Transformer::Contains(wxPoint2DDouble position) const void Transformer::Draw(wxPoint2DDouble translation, double scale) const { if(m_inserted) { - // Draw selection (layer 1). - if(m_selected) { - // Push the current matrix on stack. - glLineWidth(1.5 + m_borderSize * 2.0); - glColor4d(0.0, 0.5, 1.0, 0.5); - DrawLine(m_pointList); - glPushMatrix(); - // Rotate the matrix around the object position. - glTranslated(m_position.m_x, m_position.m_y, 0.0); - glRotated(m_angle, 0.0, 0.0, 1.0); - glTranslated(-m_position.m_x, -m_position.m_y, 0.0); - - DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(20.0, 20.0), 20 + (m_borderSize + 1.5) / scale, - 20, GL_POLYGON); - DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(50.0, 20.0), 20 + (m_borderSize + 1.5) / scale, - 20, GL_POLYGON); - - glPopMatrix(); - - // Draw nodes selection. - if(m_pointList.size() > 0) { - DrawCircle(m_pointList[0], 5.0 + m_borderSize / scale, 10, GL_POLYGON); - if(m_inserted) { - DrawCircle(m_pointList[m_pointList.size() - 1], 5.0 + m_borderSize / scale, 10, GL_POLYGON); - } - } - } - - // Draw transformer (layer 2). - // Transformer line - glLineWidth(1.5); - glColor4d(0.2, 0.2, 0.2, 1.0); - DrawLine(m_pointList); - - // Draw nodes. - if(m_pointList.size() > 0) { - glColor4d(0.2, 0.2, 0.2, 1.0); - DrawCircle(m_pointList[0], 5.0, 10, GL_POLYGON); - if(m_inserted) { - DrawCircle(m_pointList[m_pointList.size() - 1], 5.0, 10, GL_POLYGON); - } - } - - DrawSwitches(); - - // Push the current matrix on stack. - glPushMatrix(); - // Rotate the matrix around the object position. - glTranslated(m_position.m_x, m_position.m_y, 0.0); - glRotated(m_angle, 0.0, 0.0, 1.0); - glTranslated(-m_position.m_x, -m_position.m_y, 0.0); - - glColor4d(1.0, 1.0, 1.0, 1.0); - DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(20.0, 20.0), 20, 20, GL_POLYGON); - DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(50.0, 20.0), 20, 20, GL_POLYGON); - - glColor4d(0.2, 0.2, 0.2, 1.0); - DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(20.0, 20.0), 20, 20); - DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(50.0, 20.0), 20, 20); - - DrawPoint(m_rect.GetPosition(), 8.0 * scale); - - glPopMatrix(); - } + // Draw selection (layer 1). + if(m_selected) { + // Push the current matrix on stack. + glLineWidth(1.5 + m_borderSize * 2.0); + glColor4d(0.0, 0.5, 1.0, 0.5); + DrawLine(m_pointList); + glPushMatrix(); + // Rotate the matrix around the object position. + glTranslated(m_position.m_x, m_position.m_y, 0.0); + glRotated(m_angle, 0.0, 0.0, 1.0); + glTranslated(-m_position.m_x, -m_position.m_y, 0.0); + + DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(20.0, 20.0), 20 + (m_borderSize + 1.5) / scale, 20, + GL_POLYGON); + DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(50.0, 20.0), 20 + (m_borderSize + 1.5) / scale, 20, + GL_POLYGON); + + glPopMatrix(); + + // Draw nodes selection. + if(m_pointList.size() > 0) { + DrawCircle(m_pointList[0], 5.0 + m_borderSize / scale, 10, GL_POLYGON); + if(m_inserted) { + DrawCircle(m_pointList[m_pointList.size() - 1], 5.0 + m_borderSize / scale, 10, GL_POLYGON); + } + } + } + + // Draw transformer (layer 2). + // Transformer line + glLineWidth(1.5); + glColor4d(0.2, 0.2, 0.2, 1.0); + DrawLine(m_pointList); + + // Draw nodes. + if(m_pointList.size() > 0) { + glColor4d(0.2, 0.2, 0.2, 1.0); + DrawCircle(m_pointList[0], 5.0, 10, GL_POLYGON); + if(m_inserted) { + DrawCircle(m_pointList[m_pointList.size() - 1], 5.0, 10, GL_POLYGON); + } + } + + DrawSwitches(); + + // Push the current matrix on stack. + glPushMatrix(); + // Rotate the matrix around the object position. + glTranslated(m_position.m_x, m_position.m_y, 0.0); + glRotated(m_angle, 0.0, 0.0, 1.0); + glTranslated(-m_position.m_x, -m_position.m_y, 0.0); + + glColor4d(1.0, 1.0, 1.0, 1.0); + DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(20.0, 20.0), 20, 20, GL_POLYGON); + DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(50.0, 20.0), 20, 20, GL_POLYGON); + + glColor4d(0.2, 0.2, 0.2, 1.0); + DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(20.0, 20.0), 20, 20); + DrawCircle(m_rect.GetPosition() + wxPoint2DDouble(50.0, 20.0), 20, 20); + + DrawPoint(m_rect.GetPosition(), 8.0 * scale); + + glPopMatrix(); + } } bool Transformer::Intersects(wxRect2DDouble rect) const @@ -150,16 +149,16 @@ bool Transformer::Intersects(wxRect2DDouble rect) const void Transformer::Rotate(bool clockwise) { - double rotAngle = m_rotationAngle; - if(!clockwise) rotAngle = -m_rotationAngle; - + double rotAngle = m_rotationAngle; + if(!clockwise) rotAngle = -m_rotationAngle; + m_angle += rotAngle; if(m_angle >= 360.0) m_angle = 0.0; // Rotate all the points, except the switches and buses points. for(int i = 2; i < (int)m_pointList.size() - 2; i++) { - m_pointList[i] = RotateAtPosition(m_pointList[i], rotAngle); - } + m_pointList[i] = RotateAtPosition(m_pointList[i], rotAngle); + } } void Transformer::Move(wxPoint2DDouble position) @@ -168,15 +167,15 @@ void Transformer::Move(wxPoint2DDouble position) // Move all the points, except the switches and buses points. for(int i = 2; i < (int)m_pointList.size() - 2; i++) { - m_pointList[i] = m_movePts[i] + position - m_moveStartPt; - } + m_pointList[i] = m_movePts[i] + position - m_moveStartPt; + } if(!m_parentList[0]) { - m_pointList[0] = m_movePts[0] + position - m_moveStartPt; - } + m_pointList[0] = m_movePts[0] + position - m_moveStartPt; + } if(!m_parentList[1]) { - m_pointList[m_pointList.size() - 1] = m_movePts[m_pointList.size() - 1] + position - m_moveStartPt; - } + m_pointList[m_pointList.size() - 1] = m_movePts[m_pointList.size() - 1] + position - m_moveStartPt; + } UpdateSwitchesPosition(); } @@ -184,30 +183,25 @@ void Transformer::Move(wxPoint2DDouble position) void Transformer::MoveNode(Element* parent, wxPoint2DDouble position) { if(parent) { - // First bus. - if(parent == m_parentList[0]) { - m_pointList[0] = m_movePts[0] + position - m_moveStartPt; - } - // Second bus. - else if(parent == m_parentList[1]) - { - m_pointList[m_pointList.size() - 1] = m_movePts[m_pointList.size() - 1] + position - m_moveStartPt; - } - } - else - { - if(m_activeNodeID == 1) { - m_pointList[0] = m_movePts[0] + position - m_moveStartPt; - m_parentList[0] = NULL; - m_online = false; - } - else if(m_activeNodeID == 2) - { - m_pointList[m_pointList.size() - 1] = m_movePts[m_pointList.size() - 1] + position - m_moveStartPt; - m_parentList[1] = NULL; - m_online = false; - } - } + // First bus. + if(parent == m_parentList[0]) { + m_pointList[0] = m_movePts[0] + position - m_moveStartPt; + } + // Second bus. + else if(parent == m_parentList[1]) { + m_pointList[m_pointList.size() - 1] = m_movePts[m_pointList.size() - 1] + position - m_moveStartPt; + } + } else { + if(m_activeNodeID == 1) { + m_pointList[0] = m_movePts[0] + position - m_moveStartPt; + m_parentList[0] = NULL; + m_online = false; + } else if(m_activeNodeID == 2) { + m_pointList[m_pointList.size() - 1] = m_movePts[m_pointList.size() - 1] + position - m_moveStartPt; + m_parentList[1] = NULL; + m_online = false; + } + } // Recalculate switches positions UpdateSwitchesPosition(); @@ -223,7 +217,7 @@ void Transformer::StartMove(wxPoint2DDouble position) bool Transformer::GetContextMenu(wxMenu& menu) { menu.Append(ID_EDIT_TRANSFORMER, _("Edit tranformer")); - GeneralMenuItens(menu); + GeneralMenuItens(menu); return true; } @@ -231,9 +225,9 @@ bool Transformer::ShowForm(wxWindow* parent, Element* element) { TransformerForm* transfForm = new TransformerForm(parent, this); if(transfForm->ShowModal() == wxID_OK) { - transfForm->Destroy(); - return true; - } + transfForm->Destroy(); + return true; + } transfForm->Destroy(); return false; } @@ -243,8 +237,7 @@ void Transformer::SetNominalVoltage(std::vector<double> nominalVoltage, std::vec if(nominalVoltage.size() == 1) { m_electricalData.primaryNominalVoltage = nominalVoltage[0]; m_electricalData.primaryNominalVoltageUnit = nominalVoltageUnit[0]; - } - else if(nominalVoltage.size() == 2) { + } else if(nominalVoltage.size() == 2) { m_electricalData.primaryNominalVoltage = nominalVoltage[0]; m_electricalData.primaryNominalVoltageUnit = nominalVoltageUnit[0]; m_electricalData.secondaryNominalVoltage = nominalVoltage[1]; diff --git a/Project/Transformer.h b/Project/Transformer.h index fb23618..86d4cf7 100644 --- a/Project/Transformer.h +++ b/Project/Transformer.h @@ -51,6 +51,7 @@ class Transformer : public Branch { public: Transformer(); + Transformer(wxString name); virtual ~Transformer(); virtual bool AddParent(Element* parent, wxPoint2DDouble position); diff --git a/Project/TransformerForm.cpp b/Project/TransformerForm.cpp index 96c4faa..3d87a13 100644 --- a/Project/TransformerForm.cpp +++ b/Project/TransformerForm.cpp @@ -2,49 +2,50 @@ #include "SwitchingForm.h" #include "Transformer.h" -TransformerForm::TransformerForm(wxWindow* parent, Transformer* transformer) - : TransformerFormBase(parent) +TransformerForm::TransformerForm(wxWindow* parent, Transformer* transformer) : TransformerFormBase(parent) { m_choiceResistance->SetString(1, L'\u03A9'); m_choiceReactance->SetString(1, L'\u03A9'); - + SetSize(GetBestSize()); Layout(); - + m_parent = parent; m_transformer = transformer; - + TransformerElectricalData data = transformer->GetElectricalData(); - + m_textCtrlName->SetValue(data.name); - - wxString nominalVoltageStr = wxString::FromDouble(data.primaryNominalVoltage); + + wxString primVoltStr = Transformer::StringFromDouble(data.primaryNominalVoltage); switch(data.primaryNominalVoltageUnit) { case UNIT_V: { - nominalVoltageStr += " V"; + primVoltStr += " V"; } break; case UNIT_kV: { - nominalVoltageStr += " kV"; + primVoltStr += " kV"; } break; default: break; } - nominalVoltageStr += " / " + wxString::FromDouble(data.secondaryNominalVoltage); + wxString secVoltStr = Transformer::StringFromDouble(data.secondaryNominalVoltage); switch(data.secondaryNominalVoltageUnit) { case UNIT_V: { - nominalVoltageStr += " V"; + secVoltStr += " V"; } break; case UNIT_kV: { - nominalVoltageStr += " kV"; + secVoltStr += " kV"; } break; default: break; } - m_staticTextNominalVoltageValue->SetLabel(nominalVoltageStr); + m_staticTextNominalVoltageValue->SetLabel(wxString::Format("%s / %s", primVoltStr, secVoltStr)); + m_choiceBaseVoltage->SetString(0, primVoltStr); + m_choiceBaseVoltage->SetString(1, secVoltStr); m_choiceBaseVoltage->SetSelection(data.baseVoltage); - - m_textCtrlNominalPower->SetValue(wxString::FromDouble(data.nominalPower)); + + m_textCtrlNominalPower->SetValue(Transformer::StringFromDouble(data.nominalPower)); switch(data.nominalPowerUnit) { case UNIT_VA: { m_choiceNominalPower->SetSelection(0); @@ -58,8 +59,8 @@ TransformerForm::TransformerForm(wxWindow* parent, Transformer* transformer) default: break; } - - m_textCtrlResistance->SetValue(wxString::FromDouble(data.resistance)); + + m_textCtrlResistance->SetValue(Transformer::StringFromDouble(data.resistance)); switch(data.resistanceUnit) { case UNIT_PU: { m_choiceResistance->SetSelection(0); @@ -71,7 +72,7 @@ TransformerForm::TransformerForm(wxWindow* parent, Transformer* transformer) break; } - m_textCtrlReactance->SetValue(wxString::FromDouble(data.indReactance)); + m_textCtrlReactance->SetValue(Transformer::StringFromDouble(data.indReactance)); switch(data.indReactanceUnit) { case UNIT_PU: { m_choiceReactance->SetSelection(0); @@ -82,28 +83,24 @@ TransformerForm::TransformerForm(wxWindow* parent, Transformer* transformer) default: break; } - + m_choiceConnection->SetSelection(data.connection); + + m_textCtrlTurnRatio->SetValue(Transformer::StringFromDouble(data.turnsRatio)); + m_textCtrlPhaseShift->SetValue(Transformer::StringFromDouble(data.phaseShift)); - m_textCtrlTurnRatio->SetValue(wxString::FromDouble(data.turnsRatio)); - m_textCtrlPhaseShift->SetValue(wxString::FromDouble(data.phaseShift)); - - m_textCtrlZeroResistance->SetValue(wxString::FromDouble(data.zeroResistance)); - m_textCtrlZeroReactance->SetValue(wxString::FromDouble(data.zeroIndReactance)); - m_textCtrlPrimResistance->SetValue(wxString::FromDouble(data.primaryGrndResistance)); - m_textCtrlPrimReactance->SetValue(wxString::FromDouble(data.primaryGrndReactance)); - m_textCtrlSecResistance->SetValue(wxString::FromDouble(data.secondaryGrndResistance)); - m_textCtrlSecReactance->SetValue(wxString::FromDouble(data.secondaryGrndReactance)); -} + m_checkUseTransformerPower->SetValue(data.useTransformerPower); -TransformerForm::~TransformerForm() -{ + m_textCtrlZeroResistance->SetValue(Transformer::StringFromDouble(data.zeroResistance)); + m_textCtrlZeroReactance->SetValue(Transformer::StringFromDouble(data.zeroIndReactance)); + m_textCtrlPrimResistance->SetValue(Transformer::StringFromDouble(data.primaryGrndResistance)); + m_textCtrlPrimReactance->SetValue(Transformer::StringFromDouble(data.primaryGrndReactance)); + m_textCtrlSecResistance->SetValue(Transformer::StringFromDouble(data.secondaryGrndResistance)); + m_textCtrlSecReactance->SetValue(Transformer::StringFromDouble(data.secondaryGrndReactance)); } -void TransformerForm::OnCancelButtonClick(wxCommandEvent& event) -{ - EndModal(wxID_CANCEL); -} +TransformerForm::~TransformerForm() {} +void TransformerForm::OnCancelButtonClick(wxCommandEvent& event) { EndModal(wxID_CANCEL); } void TransformerForm::OnOKButtonClick(wxCommandEvent& event) { if(ValidateData()) EndModal(wxID_OK); @@ -120,5 +117,115 @@ void TransformerForm::OnStabilityButtonClick(wxCommandEvent& event) bool TransformerForm::ValidateData() { + TransformerElectricalData data; + + data.name = m_textCtrlName->GetValue(); + data.baseVoltage = m_choiceBaseVoltage->GetSelection(); + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlNominalPower->GetValue(), data.nominalPower, + _("Value entered incorrectly in the field \"Nominal power\"."))) + return false; + switch(m_choiceNominalPower->GetSelection()) { + case 0: { + data.nominalPowerUnit = UNIT_VA; + } break; + case 1: { + data.nominalPowerUnit = UNIT_kVA; + } break; + case 2: { + data.nominalPowerUnit = UNIT_MVA; + } break; + } + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlResistance->GetValue(), data.resistance, + _("Value entered incorrectly in the field \"Resistance\"."))) + return false; + switch(m_choiceResistance->GetSelection()) { + case 0: { + data.resistanceUnit = UNIT_PU; + } break; + case 1: { + data.resistanceUnit = UNIT_OHM; + } break; + } + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlReactance->GetValue(), data.indReactance, + _("Value entered incorrectly in the field \"Indutive reactance\"."))) + return false; + switch(m_choiceReactance->GetSelection()) { + case 0: { + data.indReactanceUnit = UNIT_PU; + } break; + case 1: { + data.indReactanceUnit = UNIT_OHM; + } break; + } + + switch(m_choiceConnection->GetSelection()) { + case 0: { + data.connection = GWYE_GWYE; + } break; + case 1: { + data.connection = WYE_GWYE; + } break; + case 2: { + data.connection = GWYE_WYE; + } break; + case 3: { + data.connection = WYE_WYE; + } break; + case 4: { + data.connection = DELTA_GWYE; + } break; + case 5: { + data.connection = DELTA_WYE; + } break; + case 6: { + data.connection = GWYE_DELTA; + } break; + case 7: { + data.connection = WYE_DELTA; + } break; + case 8: { + data.connection = DELTA_DELTA; + } break; + } + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlTurnRatio->GetValue(), data.turnsRatio, + _("Value entered incorrectly in the field \"Turns ratio\"."))) + return false; + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlPhaseShift->GetValue(), data.phaseShift, + _("Value entered incorrectly in the field \"Phase shift\"."))) + return false; + + data.useTransformerPower = m_checkUseTransformerPower->GetValue(); + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlZeroResistance->GetValue(), data.zeroResistance, + _("Value entered incorrectly in the field \"Zero sequence resistance\"."))) + return false; + + if(!m_transformer->DoubleFromString( + m_parent, m_textCtrlZeroReactance->GetValue(), data.zeroIndReactance, + _("Value entered incorrectly in the field \"Zero sequence indutive reactance\"."))) + return false; + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlPrimResistance->GetValue(), data.primaryGrndResistance, + _("Value entered incorrectly in the field \"Primary ground resistance\"."))) + return false; + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlPrimReactance->GetValue(), data.primaryGrndReactance, + _("Value entered incorrectly in the field \"Primary ground reactance\"."))) + return false; + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlSecResistance->GetValue(), data.secondaryGrndResistance, + _("Value entered incorrectly in the field \"Secondary ground resistance\"."))) + return false; + + if(!m_transformer->DoubleFromString(m_parent, m_textCtrlSecReactance->GetValue(), data.secondaryGrndReactance, + _("Value entered incorrectly in the field \"Secondary ground reactance\"."))) + return false; + + m_transformer->SetElectricaData(data); return true; } diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index 229e39e..836071b 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -60,8 +60,8 @@ 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}; m_statusBar->SetStatusWidths(4, widths); @@ -70,8 +70,8 @@ Workspace::Workspace(wxWindow* parent, wxString name, wxStatusBar* statusBar) : 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; } @@ -90,9 +90,9 @@ void Workspace::OnPaint(wxPaintEvent& event) // 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()); + } // Selection rectangle glLineWidth(1.0); @@ -145,83 +145,78 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) { bool foundElement = false; if(m_mode == MODE_INSERT || m_mode == MODE_DRAG_INSERT) { - // 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()))) { - 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); - } - } - } + // 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); + } + } + } 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(); @@ -231,88 +226,86 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) void Workspace::OnLeftDoubleClick(wxMouseEvent& event) { 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); - - // 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; - } - } - } - } - - // 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); + + // 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); + } + } } 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) @@ -321,87 +314,85 @@ void Workspace::OnLeftClickUp(wxMouseEvent& event) // the selection rectangle. bool foundPickbox = false; bool findNewParent = false; + bool updateVoltages = false; 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(); + } + } + } if(findNewParent) { - std::rotate(itnp, itnp + 1, m_elementList.end()); - } + 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(); + } m_selectionRect = wxRect2DDouble(0, 0, 0, 0); Redraw(); UpdateStatusBar(); @@ -410,133 +401,109 @@ 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_DRAG: - case MODE_DRAG_INSERT: - { - 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: - { - 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; - } - } - } - 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_DRAG: + case MODE_DRAG_INSERT: { + 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: { + 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; + } + } + } 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()); @@ -548,33 +515,29 @@ void Workspace::OnMiddleDown(wxMouseEvent& event) { // Set to drag mode. if(m_mode != MODE_INSERT && m_mode != MODE_DRAG_INSERT) { - m_mode = MODE_DRAG; - } - else - { - m_mode = MODE_DRAG_INSERT; - } + m_mode = MODE_DRAG; + } else { + m_mode = MODE_DRAG_INSERT; + } m_camera->StartTranslation(m_camera->ScreenToWorld(event.GetPosition())); UpdateStatusBar(); } void Workspace::OnMiddleUp(wxMouseEvent& event) { if(m_mode != MODE_INSERT && m_mode != MODE_DRAG_INSERT) { - // Set to edit mode back. - m_mode = MODE_EDIT; - } - else if(m_mode == MODE_DRAG_INSERT) - { - m_mode = MODE_INSERT; - } + // Set to edit mode back. + m_mode = MODE_EDIT; + } 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(); @@ -584,148 +547,124 @@ 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(); - } - } - break; - case WXK_DELETE: // Delete selected elements - { - DeleteSelectedElements(); - } - break; - 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(m_mode != MODE_INSERT) { - 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(m_mode != MODE_INSERT) { - if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a load. - Load* newLoad = new 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(m_mode != MODE_INSERT) { - Transformer* newTransformer = new 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(m_mode != MODE_INSERT) { - 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(m_mode != MODE_INSERT) { - if(event.GetModifiers() == wxMOD_SHIFT) { // Insert an inductor. - Inductor* newInductor = new 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(); - 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(m_mode != MODE_INSERT) { - SyncMotor* newSyncCondenser = new 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(m_mode != MODE_INSERT) { - if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a capacitor. - Capacitor* newCapacitor = new Capacitor(); - m_elementList.push_back(newCapacitor); - m_mode = MODE_INSERT; - m_statusBar->SetStatusText( - _("Insert Capacitor: Click on a buses, ESC to cancel.")); - Redraw(); - } - } - } - 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(); + } + } break; + case WXK_DELETE: // Delete selected elements + { + DeleteSelectedElements(); + } break; + 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(m_mode != MODE_INSERT) { + 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(m_mode != MODE_INSERT) { + if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a load. + Load* newLoad = new 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(m_mode != MODE_INSERT) { + 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(m_mode != MODE_INSERT) { + 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(m_mode != MODE_INSERT) { + if(event.GetModifiers() == wxMOD_SHIFT) { // Insert an inductor. + Inductor* newInductor = new 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(); + 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(m_mode != MODE_INSERT) { + SyncMotor* newSyncCondenser = new 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(m_mode != MODE_INSERT) { + if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a capacitor. + Capacitor* newCapacitor = new Capacitor(); + m_elementList.push_back(newCapacitor); + m_mode = MODE_INSERT; + m_statusBar->SetStatusText(_("Insert Capacitor: Click on a buses, ESC to cancel.")); + Redraw(); + } + } + } break; + default: + break; + } + } UpdateStatusBar(); event.Skip(); @@ -733,32 +672,25 @@ 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_DRAG_INSERT: - { - 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_INSERT: + case MODE_DRAG_INSERT: { + 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( @@ -770,174 +702,157 @@ 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()); + } + } Redraw(); } void Workspace::DeleteSelectedElements() { 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); - } - } - } - 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); + } + } + } + m_elementList.erase(it--); + } + } Redraw(); } void Workspace::Fit() { if(m_elementList.size() > 0) { - wxPoint2DDouble leftUpCorner(0, 0); - wxPoint2DDouble rightDownCorner(0, 0); - m_elementList[0]->CalculateBoundaries(leftUpCorner, rightDownCorner); - - for(auto it = m_elementList.begin() + 1; it != m_elementList.end(); 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; - } - - int width = 0.0; - int height = 0.0; - GetSize(&width, &height); - - double scaleX = double(width) / (rightDownCorner.m_x - leftUpCorner.m_x); - double scaleY = double(height) / (rightDownCorner.m_y - leftUpCorner.m_y); - - double scale = scaleX < scaleY ? scaleX : scaleY; - if(scale > m_camera->GetZoomMax()) scale = m_camera->GetZoomMax(); - if(scale < m_camera->GetZoomMin()) scale = m_camera->GetZoomMin(); - - m_camera->SetScale(scale); - - m_camera->StartTranslation(leftUpCorner); - m_camera->SetTranslation(wxPoint2DDouble(0, 0)); - Redraw(); - } + wxPoint2DDouble leftUpCorner(0, 0); + wxPoint2DDouble rightDownCorner(0, 0); + m_elementList[0]->CalculateBoundaries(leftUpCorner, rightDownCorner); + + for(auto it = m_elementList.begin() + 1; it != m_elementList.end(); 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; + } + + int width = 0.0; + int height = 0.0; + GetSize(&width, &height); + + double scaleX = double(width) / (rightDownCorner.m_x - leftUpCorner.m_x); + double scaleY = double(height) / (rightDownCorner.m_y - leftUpCorner.m_y); + + double scale = scaleX < scaleY ? scaleX : scaleY; + if(scale > m_camera->GetZoomMax()) scale = m_camera->GetZoomMax(); + if(scale < m_camera->GetZoomMin()) scale = m_camera->GetZoomMin(); + + m_camera->SetScale(scale); + + m_camera->StartTranslation(leftUpCorner); + m_camera->SetTranslation(wxPoint2DDouble(0, 0)); + Redraw(); + } } void Workspace::ValidateBusesVoltages(Element* initialBus) @@ -946,47 +861,46 @@ 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. - } - } - } - } - - ValidateElementsVoltages(); + 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(); } void Workspace::ValidateElementsVoltages() { for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) { - Element* child = *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); + 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); - } + } } |