From a1932eec23589ed67d824873b37de3e83a09cd24 Mon Sep 17 00:00:00 2001 From: Thales1330 Date: Tue, 3 Jan 2017 19:03:12 -0200 Subject: Text element optimizated, but buggy Element/parent search buggy --- Project/Text.cpp | 102 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 53 insertions(+), 49 deletions(-) (limited to 'Project/Text.cpp') diff --git a/Project/Text.cpp b/Project/Text.cpp index 05915f7..e3a5e7e 100644 --- a/Project/Text.cpp +++ b/Project/Text.cpp @@ -20,8 +20,8 @@ Text::Text() Text::Text(wxPoint2DDouble position) : Element() { + m_position = position; SetText(m_text); - SetPosition(position); } Text::~Text() {} @@ -51,26 +51,21 @@ void Text::Draw(wxPoint2DDouble translation, double scale) } // Draw text (layer 2) + glEnable(GL_TEXTURE_2D); glColor4d(0.0, 0.0, 0.0, 1.0); if(!m_isMultlineText) { // Only one line - wxGLString glString(m_text); - glString.setFont(wxFont(m_fontSize, wxFONTFAMILY_ROMAN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); - glString.consolidate(&dc); - glString.bind(); - glString.render(m_position.m_x, m_position.m_y); + m_glString->bind(); + m_glString->render(m_position.m_x, m_position.m_y); } else { // Multiples lines - wxGLStringArray glStringArray; - // Fill the string array. - for(int i = 0; i < (int)m_multlineText.size(); i++) glStringArray.addString(m_multlineText[i]); - glStringArray.setFont(wxFont(m_fontSize, wxFONTFAMILY_ROMAN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); - glStringArray.consolidate(&dc); - glStringArray.bind(); + m_glStringArray->bind(); // The text will be printed centralized. - for(int i = 0; i < (int)m_multlineText.size(); i++) { - glStringArray.get(i).render(m_position.m_x, m_position.m_y - m_height / 2.0 + - glStringArray.get(i).getheight() * double(i) + glStringArray.get(i).getheight() / 2.0); + double lineHeight = m_height / (double)m_numberOfLines; + for(int i = 0; i < m_numberOfLines; i++) { + m_glStringArray->get(i).render( + m_position.m_x, m_position.m_y - m_height / 2.0 + lineHeight / 2.0 + lineHeight * double(i)); } } + glDisable(GL_TEXTURE_2D); glPopMatrix(); } @@ -83,46 +78,56 @@ bool Text::Intersects(wxRect2DDouble rect) const void Text::SetText(wxString text) { + glEnable(GL_TEXTURE_2D); m_text = text; + wxFont font(m_fontSize, wxFONTFAMILY_ROMAN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); - // Creating a glString to get the text size. - int numberOfLines = m_text.Freq('\n') + 1; - if(numberOfLines == 1) { // Only one line - m_isMultlineText = false; - wxGLString glString(m_text); - glString.setFont(wxFont(m_fontSize, wxFONTFAMILY_ROMAN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); - wxScreenDC dc; - glString.consolidate(&dc); - glString.bind(); + wxScreenDC dc; + if(m_glString) { + delete m_glString; + m_glString = NULL; + } + if(m_glStringArray) { + delete m_glStringArray; + m_glStringArray = NULL; + } - m_width = glString.getWidth(); - m_height = glString.getheight(); + m_numberOfLines = m_text.Freq('\n') + 1; + if(m_numberOfLines == 1) { // Only one line + m_isMultlineText = false; + m_glString = new wxGLString(m_text); + m_glString->setFont(font); + m_glString->consolidate(&dc); + m_width = m_glString->getWidth(); + m_height = m_glString->getheight(); } else { m_isMultlineText = true; - m_multlineText.clear(); - wxString text = m_text; - double w = 0.0, h = 0.0; - for(int i = 0; i < numberOfLines; ++i) { - wxString nextLine; - wxString currentLine = text.BeforeFirst('\n', &nextLine); - text = nextLine; - m_multlineText.push_back(currentLine); + m_glStringArray = new wxGLStringArray(); + dc.SetFont(font); - wxGLString glString(currentLine); - glString.setFont(wxFont(m_fontSize, wxFONTFAMILY_ROMAN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); - wxScreenDC dc; - glString.consolidate(&dc); - glString.bind(); + int w = 0, h = 0; + wxString multText = m_text; + for(int i = 0; i < m_numberOfLines; ++i) { + wxString nextLine; + wxString currentLine = multText.BeforeFirst('\n', &nextLine); + multText = nextLine; + m_glStringArray->addString(currentLine); - if(w < glString.getWidth()) w = glString.getWidth(); // Get the major width. - h = glString.getheight(); + wxSize size = dc.GetTextExtent(currentLine); + if(size.GetWidth() > w) w = size.GetWidth(); + h += size.GetHeight(); } + + m_glStringArray->setFont(font); + m_glStringArray->consolidate(&dc); + m_width = w; - m_height = h * (double)numberOfLines; + m_height = h; } // Update text rectangle. SetPosition(m_position); + glDisable(GL_TEXTURE_2D); } void Text::Rotate(bool clockwise) @@ -149,6 +154,7 @@ void Text::UpdateText(double systemPowerBase) { switch(m_elementType) { case TYPE_NONE: + SetText(m_text); break; case TYPE_BUS: { Bus* bus = (Bus*)m_element; @@ -833,8 +839,7 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(reativePower, m_decimalPlaces) + " p.u."); } case UNIT_VAr: { - SetText( - wxString::FromDouble(reativePower * systemPowerBase, m_decimalPlaces) + " VAr"); + SetText(wxString::FromDouble(reativePower * systemPowerBase, m_decimalPlaces) + " VAr"); } case UNIT_kVAr: { SetText(wxString::FromDouble(reativePower * systemPowerBase / 1e3, m_decimalPlaces) + @@ -872,8 +877,7 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(reativePower, m_decimalPlaces) + " p.u."); } case UNIT_VAr: { - SetText( - wxString::FromDouble(reativePower * systemPowerBase, m_decimalPlaces) + " VAr"); + SetText(wxString::FromDouble(reativePower * systemPowerBase, m_decimalPlaces) + " VAr"); } case UNIT_kVAr: { SetText(wxString::FromDouble(reativePower * systemPowerBase / 1e3, m_decimalPlaces) + @@ -897,7 +901,7 @@ void Text::UpdateText(double systemPowerBase) Element* Text::GetCopy() { - Text* copy = new Text(); - *copy = *this; - return copy; + Text* copy = new Text(); + *copy = *this; + return copy; } -- cgit From b6f96ca48bc156898df79deba63d270b393fb150 Mon Sep 17 00:00:00 2001 From: Thales1330 Date: Thu, 5 Jan 2017 19:31:28 -0200 Subject: Text bugs fixed --- Project/Text.cpp | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) (limited to 'Project/Text.cpp') diff --git a/Project/Text.cpp b/Project/Text.cpp index e3a5e7e..5168329 100644 --- a/Project/Text.cpp +++ b/Project/Text.cpp @@ -24,7 +24,11 @@ Text::Text(wxPoint2DDouble position) SetText(m_text); } -Text::~Text() {} +Text::~Text() +{ + if(m_glString) delete m_glString; + if(m_glStringArray) delete m_glStringArray; +} bool Text::Contains(wxPoint2DDouble position) const { wxPoint2DDouble ptR = RotateAtPosition(position, -m_angle); @@ -105,7 +109,8 @@ void Text::SetText(wxString text) m_glStringArray = new wxGLStringArray(); dc.SetFont(font); - int w = 0, h = 0; + m_width = 0.0; + m_height = 0.0; wxString multText = m_text; for(int i = 0; i < m_numberOfLines; ++i) { wxString nextLine; @@ -114,15 +119,12 @@ void Text::SetText(wxString text) m_glStringArray->addString(currentLine); wxSize size = dc.GetTextExtent(currentLine); - if(size.GetWidth() > w) w = size.GetWidth(); - h += size.GetHeight(); + if(size.GetWidth() > m_width) m_width = size.GetWidth(); + m_height += size.GetHeight(); } m_glStringArray->setFont(font); m_glStringArray->consolidate(&dc); - - m_width = w; - m_height = h; } // Update text rectangle. @@ -157,7 +159,7 @@ void Text::UpdateText(double systemPowerBase) SetText(m_text); break; case TYPE_BUS: { - Bus* bus = (Bus*)m_element; + Bus* bus = static_cast(m_element); if(bus) { BusElectricalData data = bus->GetEletricalData(); double baseVoltage = data.nominalVoltage; @@ -289,7 +291,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_SYNC_GENERATOR: { - SyncGenerator* syncGenerator = (SyncGenerator*)m_element; + SyncGenerator* syncGenerator = static_cast(m_element); if(syncGenerator) { SyncGeneratorElectricalData data = syncGenerator->GetPUElectricalData(systemPowerBase); double baseVoltage = data.nominalVoltage; @@ -384,7 +386,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_LINE: { - Line* line = (Line*)m_element; + Line* line = static_cast(m_element); if(line) { LineElectricalData data = line->GetElectricalData(); double baseVoltage = data.nominalVoltage; @@ -510,7 +512,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_TRANSFORMER: { - Transformer* transformer = (Transformer*)m_element; + Transformer* transformer = static_cast(m_element); if(transformer) { TransformerElectricalData data = transformer->GetElectricalData(); double baseVoltage[2] = { data.primaryNominalVoltage, data.secondaryNominalVoltage }; @@ -652,12 +654,12 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_LOAD: { - Load* load = (Load*)m_element; + Load* load = static_cast(m_element); if(load) { LoadElectricalData data = load->GetPUElectricalData(systemPowerBase); std::complex sPower(data.activePower, data.reactivePower); if(data.loadType == CONST_IMPEDANCE && load->IsOnline()) { - std::complex v = ((Bus*)load->GetParentList()[0])->GetEletricalData().voltage; + std::complex v = static_cast(load->GetParentList()[0])->GetEletricalData().voltage; sPower = std::pow(std::abs(v), 2) * sPower; } switch(m_dataType) { @@ -711,7 +713,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_SYNC_MOTOR: { - SyncMotor* syncMotor = (SyncMotor*)m_element; + SyncMotor* syncMotor = static_cast(m_element); if(syncMotor) { SyncMotorElectricalData data = syncMotor->GetPUElectricalData(systemPowerBase); std::complex sPower(data.activePower, data.reactivePower); @@ -766,7 +768,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_IND_MOTOR: { - IndMotor* indMotor = (IndMotor*)m_element; + IndMotor* indMotor = static_cast(m_element); if(indMotor) { IndMotorElectricalData data = indMotor->GetPUElectricalData(systemPowerBase); std::complex sPower(data.activePower, data.reactivePower); @@ -821,12 +823,12 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_CAPACITOR: { - Capacitor* capacitor = (Capacitor*)m_element; + Capacitor* capacitor = static_cast(m_element); if(capacitor) { CapacitorElectricalData data = capacitor->GetPUElectricalData(systemPowerBase); double reativePower = -data.reactivePower; if(capacitor->IsOnline()) { - std::complex v = ((Bus*)capacitor->GetParentList()[0])->GetEletricalData().voltage; + std::complex v = static_cast(capacitor->GetParentList()[0])->GetEletricalData().voltage; reativePower *= std::pow(std::abs(v), 2); } switch(m_dataType) { @@ -859,12 +861,12 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_INDUCTOR: { - Inductor* inductor = (Inductor*)m_element; + Inductor* inductor = static_cast(m_element); if(inductor) { InductorElectricalData data = inductor->GetPUElectricalData(systemPowerBase); double reativePower = data.reactivePower; if(inductor->IsOnline()) { - std::complex v = ((Bus*)inductor->GetParentList()[0])->GetEletricalData().voltage; + std::complex v = static_cast(inductor->GetParentList()[0])->GetEletricalData().voltage; reativePower *= std::pow(std::abs(v), 2); } switch(m_dataType) { @@ -903,5 +905,9 @@ Element* Text::GetCopy() { Text* copy = new Text(); *copy = *this; + // The pointers to wxGLString must be different or can cause crashes. + copy->m_glString = NULL; + copy->m_glStringArray = NULL; + copy->SetText(copy->m_text); return copy; } -- cgit