summaryrefslogtreecommitdiffstats
path: root/Project/Text.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Project/Text.cpp')
-rw-r--r--Project/Text.cpp136
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;
}