diff options
Diffstat (limited to 'Project/Text.cpp')
-rw-r--r-- | Project/Text.cpp | 136 |
1 files changed, 73 insertions, 63 deletions
diff --git a/Project/Text.cpp b/Project/Text.cpp index 05915f7..5168329 100644 --- a/Project/Text.cpp +++ b/Project/Text.cpp @@ -20,11 +20,15 @@ Text::Text() Text::Text(wxPoint2DDouble position) : Element() { + m_position = position; SetText(m_text); - SetPosition(position); } -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); @@ -51,26 +55,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 +82,54 @@ 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(); + m_width = 0.0; + m_height = 0.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() > m_width) m_width = size.GetWidth(); + m_height += size.GetHeight(); } - m_width = w; - m_height = h * (double)numberOfLines; + + m_glStringArray->setFont(font); + m_glStringArray->consolidate(&dc); } // Update text rectangle. SetPosition(m_position); + glDisable(GL_TEXTURE_2D); } void Text::Rotate(bool clockwise) @@ -149,9 +156,10 @@ void Text::UpdateText(double systemPowerBase) { switch(m_elementType) { case TYPE_NONE: + SetText(m_text); break; case TYPE_BUS: { - Bus* bus = (Bus*)m_element; + Bus* bus = static_cast<Bus*>(m_element); if(bus) { BusElectricalData data = bus->GetEletricalData(); double baseVoltage = data.nominalVoltage; @@ -283,7 +291,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_SYNC_GENERATOR: { - SyncGenerator* syncGenerator = (SyncGenerator*)m_element; + SyncGenerator* syncGenerator = static_cast<SyncGenerator*>(m_element); if(syncGenerator) { SyncGeneratorElectricalData data = syncGenerator->GetPUElectricalData(systemPowerBase); double baseVoltage = data.nominalVoltage; @@ -378,7 +386,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_LINE: { - Line* line = (Line*)m_element; + Line* line = static_cast<Line*>(m_element); if(line) { LineElectricalData data = line->GetElectricalData(); double baseVoltage = data.nominalVoltage; @@ -504,7 +512,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_TRANSFORMER: { - Transformer* transformer = (Transformer*)m_element; + Transformer* transformer = static_cast<Transformer*>(m_element); if(transformer) { TransformerElectricalData data = transformer->GetElectricalData(); double baseVoltage[2] = { data.primaryNominalVoltage, data.secondaryNominalVoltage }; @@ -646,12 +654,12 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_LOAD: { - Load* load = (Load*)m_element; + Load* load = static_cast<Load*>(m_element); if(load) { LoadElectricalData data = load->GetPUElectricalData(systemPowerBase); std::complex<double> sPower(data.activePower, data.reactivePower); if(data.loadType == CONST_IMPEDANCE && load->IsOnline()) { - std::complex<double> v = ((Bus*)load->GetParentList()[0])->GetEletricalData().voltage; + std::complex<double> v = static_cast<Bus*>(load->GetParentList()[0])->GetEletricalData().voltage; sPower = std::pow(std::abs(v), 2) * sPower; } switch(m_dataType) { @@ -705,7 +713,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_SYNC_MOTOR: { - SyncMotor* syncMotor = (SyncMotor*)m_element; + SyncMotor* syncMotor = static_cast<SyncMotor*>(m_element); if(syncMotor) { SyncMotorElectricalData data = syncMotor->GetPUElectricalData(systemPowerBase); std::complex<double> sPower(data.activePower, data.reactivePower); @@ -760,7 +768,7 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_IND_MOTOR: { - IndMotor* indMotor = (IndMotor*)m_element; + IndMotor* indMotor = static_cast<IndMotor*>(m_element); if(indMotor) { IndMotorElectricalData data = indMotor->GetPUElectricalData(systemPowerBase); std::complex<double> sPower(data.activePower, data.reactivePower); @@ -815,12 +823,12 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_CAPACITOR: { - Capacitor* capacitor = (Capacitor*)m_element; + Capacitor* capacitor = static_cast<Capacitor*>(m_element); if(capacitor) { CapacitorElectricalData data = capacitor->GetPUElectricalData(systemPowerBase); double reativePower = -data.reactivePower; if(capacitor->IsOnline()) { - std::complex<double> v = ((Bus*)capacitor->GetParentList()[0])->GetEletricalData().voltage; + std::complex<double> v = static_cast<Bus*>(capacitor->GetParentList()[0])->GetEletricalData().voltage; reativePower *= std::pow(std::abs(v), 2); } switch(m_dataType) { @@ -833,8 +841,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) + @@ -854,12 +861,12 @@ void Text::UpdateText(double systemPowerBase) } } break; case TYPE_INDUCTOR: { - Inductor* inductor = (Inductor*)m_element; + Inductor* inductor = static_cast<Inductor*>(m_element); if(inductor) { InductorElectricalData data = inductor->GetPUElectricalData(systemPowerBase); double reativePower = data.reactivePower; if(inductor->IsOnline()) { - std::complex<double> v = ((Bus*)inductor->GetParentList()[0])->GetEletricalData().voltage; + std::complex<double> v = static_cast<Bus*>(inductor->GetParentList()[0])->GetEletricalData().voltage; reativePower *= std::pow(std::abs(v), 2); } switch(m_dataType) { @@ -872,8 +879,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 +903,11 @@ void Text::UpdateText(double systemPowerBase) Element* Text::GetCopy() { - Text* copy = new Text(); - *copy = *this; - return copy; + 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; } |