*/
RS_Text::RS_Text(RS_EntityContainer * parent, const RS_TextData & d): RS_EntityContainer(parent), data(d)
{
- usedTextHeight = 0.0;
- usedTextWidth = 0.0;
- setText(data.text);
+ usedTextHeight = 0.0;
+ usedTextWidth = 0.0;
+ setText(data.text);
}
/*virtual*/ RS_Text::~RS_Text()
*/
int RS_Text::getNumberOfLines()
{
- int c=1;
+ int c = 1;
- for (int i=0; i<(int)data.text.length(); ++i) {
- if (data.text.at(i).unicode()==0x0A) {
- c++;
- }
- }
+ for(int i=0; i<(int)data.text.length(); ++i)
+ {
+ if (data.text.at(i).unicode() == 0x0A)
+ {
+ c++;
+ }
+ }
- return c;
+ return c;
}
/**
*/
void RS_Text::update()
{
- RS_DEBUG->print("RS_Text::update");
-
- clear();
-
- if (isUndone()) {
- return;
- }
-
- usedTextWidth = 0.0;
- usedTextHeight = 0.0;
-
- RS_Font* font = RS_FONTLIST->requestFont(data.style);
-
- if (font==NULL) {
- return;
- }
-
- Vector letterPos = Vector(0.0, -9.0);
- Vector letterSpace = Vector(font->getLetterSpacing(), 0.0);
- Vector space = Vector(font->getWordSpacing(), 0.0);
- int lineCounter = 0;
-
- // Every single text line gets stored in this entity container
- // so we can move the whole line around easely:
- RS_EntityContainer* oneLine = new RS_EntityContainer(this);
-
- // First every text line is created with
- // alignement: top left
- // angle: 0
- // height: 9.0
- // Rotation, scaling and centering is done later
-
- // For every letter:
- for (int i=0; i<(int)data.text.length(); ++i) {
- switch (data.text.at(i).unicode()) {
- case 0x0A:
- // line feed:
- updateAddLine(oneLine, lineCounter++);
- oneLine = new RS_EntityContainer(this);
- letterPos = Vector(0.0, -9.0);
- break;
-
- case 0x20:
- // Space:
- letterPos+=space;
- break;
-
- case 0x5C: {
- // code (e.g. \S, \P, ..)
- i++;
- int ch = data.text.at(i).unicode();
- switch (ch) {
- case 'P':
- updateAddLine(oneLine, lineCounter++);
- oneLine = new RS_EntityContainer(this);
- letterPos = Vector(0.0, -9.0);
- break;
-
- case 'S': {
- QString up;
- QString dw;
- //letterPos += letterSpace;
-
- // get upper string:
- i++;
- while (data.text.at(i).unicode()!='^' &&
- //data.text.at(i).unicode()!='/' &&
- data.text.at(i).unicode()!='\\' &&
- //data.text.at(i).unicode()!='#' &&
- i<(int)data.text.length()) {
- up += data.text.at(i);
- i++;
- }
-
- i++;
-
- if (data.text.at(i-1).unicode()=='^' &&
- data.text.at(i).unicode()==' ') {
- i++;
- }
-
- // get lower string:
- while (data.text.at(i).unicode()!=';' &&
- i<(int)data.text.length()) {
- dw += data.text.at(i);
- i++;
- }
-
- // add texts:
- RS_Text* upper =
- new RS_Text(
- oneLine,
- RS_TextData(letterPos + Vector(0.0,9.0),
- 4.0, 100.0, RS2::VAlignTop,
- RS2::HAlignLeft,
- RS2::LeftToRight, RS2::Exact,
- 1.0, up, data.style,
- 0.0, RS2::Update));
- upper->setLayer(NULL);
- upper->setPen(RS_Pen(RS2::FlagInvalid));
- oneLine->addEntity(upper);
-
- RS_Text* lower =
- new RS_Text(
- oneLine,
- RS_TextData(letterPos+Vector(0.0,4.0),
- 4.0, 100.0, RS2::VAlignTop,
- RS2::HAlignLeft,
- RS2::LeftToRight, RS2::Exact,
- 1.0, dw, data.style,
- 0.0, RS2::Update));
- lower->setLayer(NULL);
- lower->setPen(RS_Pen(RS2::FlagInvalid));
- oneLine->addEntity(lower);
-
- // move cursor:
- upper->calculateBorders();
- lower->calculateBorders();
-
- double w1 = upper->getSize().x;
- double w2 = lower->getSize().x;
-
- if (w1>w2) {
- letterPos += Vector(w1, 0.0);
- } else {
- letterPos += Vector(w2, 0.0);
- }
- letterPos += letterSpace;
- }
- break;
-
- default:
- break;
- }
- }
- break;
-
- default: {
- // One Letter:
- if (font->findLetter(QString(data.text.at(i))) != NULL) {
-
- RS_DEBUG->print("RS_Text::update: insert a "
- "letter at pos: %f/%f", letterPos.x, letterPos.y);
-
- RS_InsertData d(QString(data.text.at(i)),
- letterPos,
- Vector(1.0, 1.0),
- 0.0,
- 1,1, Vector(0.0,0.0),
- font->getLetterList(), RS2::NoUpdate);
-
- RS_Insert* letter = new RS_Insert(this, d);
- Vector letterWidth;
- letter->setPen(RS_Pen(RS2::FlagInvalid));
- letter->setLayer(NULL);
- letter->update();
- letter->forcedCalculateBorders();
-
- // until 2.0.4.5:
- //letterWidth = Vector(letter->getSize().x, 0.0);
- // from 2.0.4.6:
- letterWidth = Vector(letter->getMax().x-letterPos.x, 0.0);
-
- oneLine->addEntity(letter);
-
- // next letter position:
- letterPos += letterWidth;
- letterPos += letterSpace;
- }
- }
- break;
- }
- }
-
- updateAddLine(oneLine, lineCounter);
- usedTextHeight -= data.height*data.lineSpacingFactor*1.6
- - data.height;
- forcedCalculateBorders();
-
- RS_DEBUG->print("RS_Text::update: OK");
+ RS_DEBUG->print("RS_Text::update");
+
+ clear();
+
+ if (isUndone())
+ return;
+
+ usedTextWidth = 0.0;
+ usedTextHeight = 0.0;
+
+ RS_Font * font = RS_FONTLIST->requestFont(data.style);
+
+ if (font == NULL)
+ return;
+
+ Vector letterPos = Vector(0.0, -9.0);
+ Vector letterSpace = Vector(font->getLetterSpacing(), 0.0);
+ Vector space = Vector(font->getWordSpacing(), 0.0);
+ int lineCounter = 0;
+
+ // Every single text line gets stored in this entity container
+ // so we can move the whole line around easely:
+ RS_EntityContainer * oneLine = new RS_EntityContainer(this);
+
+ // First every text line is created with
+ // alignement: top left
+ // angle: 0
+ // height: 9.0
+ // Rotation, scaling and centering is done later
+
+ // For every letter:
+ for(int i=0; i<(int)data.text.length(); ++i)
+ {
+ switch (data.text.at(i).unicode())
+ {
+ case 0x0A:
+ // line feed:
+ updateAddLine(oneLine, lineCounter++);
+ oneLine = new RS_EntityContainer(this);
+ letterPos = Vector(0.0, -9.0);
+ break;
+
+ case 0x20:
+ // Space:
+ letterPos += space;
+ break;
+
+ case 0x5C:
+ {
+ // code (e.g. \S, \P, ..)
+ i++;
+ int ch = data.text.at(i).unicode();
+
+ switch (ch)
+ {
+ case 'P':
+ updateAddLine(oneLine, lineCounter++);
+ oneLine = new RS_EntityContainer(this);
+ letterPos = Vector(0.0, -9.0);
+ break;
+
+ case 'S':
+ {
+ QString up;
+ QString dw;
+ //letterPos += letterSpace;
+
+ // get upper string:
+ i++;
+ while (data.text.at(i).unicode() != '^'
+ && data.text.at(i).unicode() != '\\'
+ && i < (int)data.text.length())
+ {
+ up += data.text.at(i);
+ i++;
+ }
+
+ i++;
+
+ if (data.text.at(i - 1).unicode() == '^'
+ && data.text.at(i).unicode() == ' ')
+ {
+ i++;
+ }
+
+ // get lower string:
+ while (data.text.at(i).unicode() != ';' && i < (int)data.text.length())
+ {
+ dw += data.text.at(i);
+ i++;
+ }
+
+ // add texts:
+ RS_Text * upper = new RS_Text(oneLine,
+ RS_TextData(letterPos + Vector(0.0, 9.0),
+ 4.0, 100.0, RS2::VAlignTop,
+ RS2::HAlignLeft,
+ RS2::LeftToRight, RS2::Exact,
+ 1.0, up, data.style,
+ 0.0, RS2::Update));
+ upper->setLayer(NULL);
+ upper->setPen(RS_Pen(RS2::FlagInvalid));
+ oneLine->addEntity(upper);
+
+ RS_Text * lower = new RS_Text(oneLine,
+ RS_TextData(letterPos+Vector(0.0, 4.0),
+ 4.0, 100.0, RS2::VAlignTop,
+ RS2::HAlignLeft,
+ RS2::LeftToRight, RS2::Exact,
+ 1.0, dw, data.style,
+ 0.0, RS2::Update));
+ lower->setLayer(NULL);
+ lower->setPen(RS_Pen(RS2::FlagInvalid));
+ oneLine->addEntity(lower);
+
+ // move cursor:
+ upper->calculateBorders();
+ lower->calculateBorders();
+
+ double w1 = upper->getSize().x;
+ double w2 = lower->getSize().x;
+
+ if (w1 > w2)
+ letterPos += Vector(w1, 0.0);
+ else
+ letterPos += Vector(w2, 0.0);
+
+ letterPos += letterSpace;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ break;
+
+ default:
+ {
+ // One Letter:
+ if (font->findLetter(QString(data.text.at(i))) != NULL)
+ {
+ RS_DEBUG->print("RS_Text::update: insert a "
+ "letter at pos: %f/%f", letterPos.x, letterPos.y);
+
+ RS_InsertData d(QString(data.text.at(i)), letterPos, Vector(1.0, 1.0),
+ 0.0, 1,1, Vector(0.0, 0.0), font->getLetterList(), RS2::NoUpdate);
+
+ RS_Insert * letter = new RS_Insert(this, d);
+ letter->setPen(RS_Pen(RS2::FlagInvalid));
+ letter->setLayer(NULL);
+ letter->update();
+ letter->forcedCalculateBorders();
+
+ // until 2.0.4.5:
+ //letterWidth = Vector(letter->getSize().x, 0.0);
+ // from 2.0.4.6:
+ Vector letterWidth = Vector(letter->getMax().x - letterPos.x, 0.0);
+
+ oneLine->addEntity(letter);
+
+ // next letter position:
+ letterPos += letterWidth;
+ letterPos += letterSpace;
+ }
+ }
+ break;
+ }
+ }
+
+ updateAddLine(oneLine, lineCounter);
+ usedTextHeight -= data.height * data.lineSpacingFactor * 1.6 - data.height;
+ forcedCalculateBorders();
+
+ RS_DEBUG->print("RS_Text::update: OK");
}
/**
*/
void RS_Text::updateAddLine(RS_EntityContainer* textLine, int lineCounter)
{
- RS_DEBUG->print("RS_Text::updateAddLine: width: %f", textLine->getSize().x);
+ RS_DEBUG->print("RS_Text::updateAddLine: width: %f", textLine->getSize().x);
//textLine->forcedCalculateBorders();
- //RS_DEBUG->print("RS_Text::updateAddLine: width 2: %f", textLine->getSize().x);
+ //RS_DEBUG->print("RS_Text::updateAddLine: width 2: %f", textLine->getSize().x);
- // Move to correct line position:
- textLine->move(Vector(0.0, -9.0 * lineCounter
- * data.lineSpacingFactor * 1.6));
+ // Move to correct line position:
+ textLine->move(Vector(0.0, -9.0 * lineCounter * data.lineSpacingFactor * 1.6));
textLine->forcedCalculateBorders();
Vector textSize = textLine->getSize();
RS_DEBUG->print("RS_Text::updateAddLine: width 2: %f", textSize.x);
- // Horizontal Align:
- switch (data.halign) {
- case RS2::HAlignCenter:
- RS_DEBUG->print("RS_Text::updateAddLine: move by: %f", -textSize.x/2.0);
- textLine->move(Vector(-textSize.x/2.0, 0.0));
- break;
+ // Horizontal Align:
+ switch (data.halign)
+ {
+ case RS2::HAlignCenter:
+ RS_DEBUG->print("RS_Text::updateAddLine: move by: %f", -textSize.x / 2.0);
+ textLine->move(Vector(-textSize.x / 2.0, 0.0));
+ break;
- case RS2::HAlignRight:
- textLine->move(Vector(-textSize.x, 0.0));
- break;
+ case RS2::HAlignRight:
+ textLine->move(Vector(-textSize.x, 0.0));
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
- // Vertical Align:
- double vSize = getNumberOfLines()*9.0*data.lineSpacingFactor*1.6
- - (9.0*data.lineSpacingFactor*1.6 - 9.0);
+ // Vertical Align:
+ double vSize = getNumberOfLines() * 9.0 * data.lineSpacingFactor * 1.6 - (9.0 * data.lineSpacingFactor * 1.6 - 9.0);
- switch (data.valign) {
- case RS2::VAlignMiddle:
- textLine->move(Vector(0.0, vSize/2.0));
- break;
+ switch (data.valign)
+ {
+ case RS2::VAlignMiddle:
+ textLine->move(Vector(0.0, vSize / 2.0));
+ break;
- case RS2::VAlignBottom:
- textLine->move(Vector(0.0, vSize));
- break;
+ case RS2::VAlignBottom:
+ textLine->move(Vector(0.0, vSize));
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
- // Scale:
- textLine->scale(Vector(0.0,0.0),
- Vector(data.height/9.0, data.height/9.0));
+ // Scale:
+ textLine->scale(Vector(0.0, 0.0), Vector(data.height / 9.0, data.height / 9.0));
- textLine->forcedCalculateBorders();
+ textLine->forcedCalculateBorders();
- // Update actual text size (before rotating, after scaling!):
- if (textLine->getSize().x>usedTextWidth) {
- usedTextWidth = textLine->getSize().x;
- }
+ // Update actual text size (before rotating, after scaling!):
+ if (textLine->getSize().x > usedTextWidth)
+ usedTextWidth = textLine->getSize().x;
- usedTextHeight += data.height*data.lineSpacingFactor*1.6;
+ usedTextHeight += data.height * data.lineSpacingFactor * 1.6;
- // Rotate:
- textLine->rotate(Vector(0.0,0.0), data.angle);
+ // Rotate:
+ textLine->rotate(Vector(0.0, 0.0), data.angle);
- // Move:
- textLine->move(data.insertionPoint);
- textLine->setPen(RS_Pen(RS2::FlagInvalid));
- textLine->setLayer(NULL);
- textLine->forcedCalculateBorders();
+ // Move:
+ textLine->move(data.insertionPoint);
+ textLine->setPen(RS_Pen(RS2::FlagInvalid));
+ textLine->setLayer(NULL);
+ textLine->forcedCalculateBorders();
- addEntity(textLine);
+ addEntity(textLine);
}
Vector RS_Text::getInsertionPoint()
void RS_Text::move(Vector offset)
{
- data.insertionPoint.move(offset);
- update();
+ data.insertionPoint.move(offset);
+ update();
}
void RS_Text::rotate(Vector center, double angle)
{
- data.insertionPoint.rotate(center, angle);
- data.angle = RS_Math::correctAngle(data.angle+angle);
- update();
+ data.insertionPoint.rotate(center, angle);
+ data.angle = RS_Math::correctAngle(data.angle + angle);
+ update();
}
void RS_Text::scale(Vector center, Vector factor)
{
- data.insertionPoint.scale(center, factor);
- data.width*=factor.x;
- data.height*=factor.x;
- update();
+ data.insertionPoint.scale(center, factor);
+ data.width *= factor.x;
+ data.height *= factor.x;
+ update();
}
void RS_Text::mirror(Vector axisPoint1, Vector axisPoint2)
{
- data.insertionPoint.mirror(axisPoint1, axisPoint2);
- //double ang = axisPoint1.angleTo(axisPoint2);
- bool readable = RS_Math::isAngleReadable(data.angle);
-
- Vector vec;
- vec.setPolar(1.0, data.angle);
- vec.mirror(Vector(0.0,0.0), axisPoint2-axisPoint1);
- data.angle = vec.angle();
-
- bool corr;
- data.angle = RS_Math::makeAngleReadable(data.angle, readable, &corr);
-
- if (corr) {
- if (data.halign==RS2::HAlignLeft) {
- data.halign=RS2::HAlignRight;
- } else if (data.halign==RS2::HAlignRight) {
- data.halign=RS2::HAlignLeft;
- }
- } else {
- if (data.valign==RS2::VAlignTop) {
- data.valign=RS2::VAlignBottom;
- } else if (data.valign==RS2::VAlignBottom) {
- data.valign=RS2::VAlignTop;
- }
- }
- update();
+ data.insertionPoint.mirror(axisPoint1, axisPoint2);
+ //double ang = axisPoint1.angleTo(axisPoint2);
+ bool readable = RS_Math::isAngleReadable(data.angle);
+
+ Vector vec;
+ vec.setPolar(1.0, data.angle);
+ vec.mirror(Vector(0.0, 0.0), axisPoint2 - axisPoint1);
+ data.angle = vec.angle();
+
+ bool corr;
+ data.angle = RS_Math::makeAngleReadable(data.angle, readable, &corr);
+
+ if (corr)
+ {
+ if (data.halign == RS2::HAlignLeft)
+ {
+ data.halign = RS2::HAlignRight;
+ }
+ else if (data.halign == RS2::HAlignRight)
+ {
+ data.halign = RS2::HAlignLeft;
+ }
+ }
+ else
+ {
+ if (data.valign == RS2::VAlignTop)
+ {
+ data.valign = RS2::VAlignBottom;
+ }
+ else if (data.valign == RS2::VAlignBottom)
+ {
+ data.valign = RS2::VAlignTop;
+ }
+ }
+
+ update();
}
bool RS_Text::hasEndpointsWithinWindow(Vector /*v1*/, Vector /*v2*/)
{
- return false;
+ return false;
}
-
-
/**
* Implementations must stretch the given range of the entity
* by the given offset.
*/
-void RS_Text::stretch(Vector firstCorner,
- Vector secondCorner,
- Vector offset) {
-
- if (getMin().isInWindow(firstCorner, secondCorner) &&
- getMax().isInWindow(firstCorner, secondCorner)) {
-
- move(offset);
- }
+void RS_Text::stretch(Vector firstCorner, Vector secondCorner, Vector offset)
+{
+ if (getMin().isInWindow(firstCorner, secondCorner)
+ && getMax().isInWindow(firstCorner, secondCorner))
+ move(offset);
}
-
-
/**
* Dumps the point's data to stdout.
*/
-std::ostream& operator << (std::ostream& os, const RS_Text& p) {
- os << " Text: " << p.getData() << "\n";
- return os;
+std::ostream & operator<<(std::ostream & os, const RS_Text & p)
+{
+ os << " Text: " << p.getData() << "\n";
+ return os;
}
-