From Colin McDonald, "Attached is an update to the dxf plugin which adds rudimentary support for

text entities.
"
This commit is contained in:
Robert Osfield 2008-10-07 13:06:53 +00:00
parent ff8c6aa32b
commit af30f0769a
4 changed files with 236 additions and 6 deletions

View File

@ -29,6 +29,7 @@ RegisterEntityProxy<dxfVertex> g_dxfVertex;
RegisterEntityProxy<dxfPolyline> g_dxfPolyline; RegisterEntityProxy<dxfPolyline> g_dxfPolyline;
RegisterEntityProxy<dxfLWPolyline> g_dxfLWPolyline; RegisterEntityProxy<dxfLWPolyline> g_dxfLWPolyline;
RegisterEntityProxy<dxfInsert> g_dxfInsert; RegisterEntityProxy<dxfInsert> g_dxfInsert;
RegisterEntityProxy<dxfText> g_dxfText;
void void
dxfBasicEntity::assign(dxfFile* , codeValue& cv) dxfBasicEntity::assign(dxfFile* , codeValue& cv)
@ -732,7 +733,7 @@ dxfInsert::drawScene(scene* sc)
// (with the files I have, the results are equal to Voloview, // (with the files I have, the results are equal to Voloview,
// and better than Deep Exploration and Lightwave). // and better than Deep Exploration and Lightwave).
// sanity check (useful when no block remains after all SOLIDS, TEXT, ... have been filtered out) // sanity check (useful when no block remains after all unsupported entities have been filtered out)
if (!_block) if (!_block)
return; return;
@ -771,6 +772,147 @@ dxfInsert::drawScene(scene* sc)
} }
void
dxfText::assign(dxfFile* dxf, codeValue& cv)
{
switch (cv._groupCode) {
case 1:
_string = cv._string;
break;
case 10:
_point1.x() = cv._double;
break;
case 20:
_point1.y() = cv._double;
break;
case 30:
_point1.z() = cv._double;
break;
case 11:
_point2.x() = cv._double;
break;
case 21:
_point2.y() = cv._double;
break;
case 31:
_point2.z() = cv._double;
break;
case 40:
_height = cv._double;
break;
case 41:
_xscale = cv._double;
break;
case 50:
_rotation = cv._double;
break;
case 71:
_flags = cv._int;
break;
case 72:
_hjustify = cv._int;
break;
case 73:
_vjustify = cv._int;
break;
case 210:
_ocs.x() = cv._double;
break;
case 220:
_ocs.y() = cv._double;
break;
case 230:
_ocs.z() = cv._double;
break;
default:
dxfBasicEntity::assign(dxf, cv);
break;
}
}
void
dxfText::drawScene(scene* sc)
{
osgText::Text::AlignmentType align;
Matrixd m;
getOCSMatrix(_ocs, m);
sc->ocs(m);
ref_ptr<osgText::Text> _text = new osgText::Text;
_text->setText(_string);
_text->setCharacterSize( _height, 1.0/_xscale );
_text->setFont("arial.ttf");
Quat qr( DegreesToRadians(_rotation), Z_AXIS );
if ( _flags & 2 ) qr = Quat( PI, Y_AXIS ) * qr;
if ( _flags & 4 ) qr = Quat( PI, X_AXIS ) * qr;
_text->setAxisAlignment(osgText::Text::USER_DEFINED_ROTATION);
_text->setRotation(qr);
if ( _hjustify != 0 || _vjustify !=0 ) _point1 = _point2;
switch (_vjustify) {
case 3:
switch (_hjustify) {
case 2:
align = osgText::Text::RIGHT_TOP;
break;
case 1:
align = osgText::Text::CENTER_TOP;
break;
default:
align = osgText::Text::LEFT_TOP;
}
break;
case 2:
switch (_hjustify) {
case 2:
align = osgText::Text::RIGHT_CENTER;
break;
case 1:
align = osgText::Text::CENTER_CENTER;
break;
default:
align = osgText::Text::LEFT_CENTER;
}
break;
case 1:
switch (_hjustify) {
case 2:
align = osgText::Text::RIGHT_BOTTOM;
break;
case 1:
align = osgText::Text::CENTER_BOTTOM;
break;
default:
align = osgText::Text::LEFT_BOTTOM;
}
break;
default:
switch (_hjustify) {
case 2:
align = osgText::Text::RIGHT_BOTTOM_BASE_LINE;
break;
case 1:
align = osgText::Text::CENTER_BOTTOM_BASE_LINE;
break;
default:
align = osgText::Text::LEFT_BOTTOM_BASE_LINE;
}
break;
}
_text->setAlignment(align);
sc->addText(getLayer(), _color, _point1, _text.get());
sc->ocs_clear();
}
// static // static
void void

View File

@ -24,6 +24,7 @@
#include <osg/Vec3d> #include <osg/Vec3d>
#include <osg/Node> #include <osg/Node>
#include <osg/Matrixd> #include <osg/Matrixd>
#include <osgText/Text>
#include "dxfBlock.h" #include "dxfBlock.h"
@ -250,6 +251,40 @@ protected:
osg::Vec3d _ocs; osg::Vec3d _ocs;
}; };
class dxfText : public dxfBasicEntity
{
public:
dxfText() :
_string(""),
_point1(0,0,0),
_point2(0,0,0),
_height(1),
_xscale(1),
_rotation(0),
_flags(0),
_hjustify(0),
_vjustify(0),
_ocs(0,0,1) {}
virtual ~dxfText() {}
virtual dxfBasicEntity* create() { return new dxfText; }
virtual const char* name() { return "TEXT"; }
virtual void assign(dxfFile* dxf, codeValue& cv);
virtual void drawScene(scene* sc);
protected:
std::string _string; // 1
osg::Vec3d _point1; // 10,20,30
osg::Vec3d _point2; // 11,21,31
osg::Vec3d _ocs; // 210,220,230
double _height; // 40
double _xscale; // 41
double _rotation; // 50
int _flags; // 71
int _hjustify; // 72
int _vjustify; // 73
};
class dxfEntity : public osg::Referenced class dxfEntity : public osg::Referenced
{ {
public: public:

View File

@ -169,6 +169,30 @@ void scene::addQuads(const std::string & l, unsigned short color, std::vector<Ve
} }
void scene::addText(const std::string & l, unsigned short color, Vec3d & point, osgText::Text *text)
{
dxfLayer* layer = _layerTable->findOrCreateLayer(l);
if (layer->getFrozen()) return;
sceneLayer* ly = findOrCreateSceneLayer(l);
// Apply the scene settings to the text size and rotation
Vec3d pscene(addVertex(point));
Vec3d xvec = addVertex( point + (text->getRotation() * X_AXIS) ) - pscene;
Vec3d yvec = addVertex( point + (text->getRotation() * Y_AXIS) ) - pscene;
text->setCharacterSize( text->getCharacterHeight()*yvec.length(), text->getCharacterAspectRatio()*yvec.length()/xvec.length() );
Matrix qm = _r * _m;
Vec3d t, s;
Quat ro, so;
qm.decompose( t, ro, s, so );
text->setRotation( text->getRotation() * ro );
sceneLayer::textInfo ti( correctedColorIndex(l,color), pscene, text );
ly->_textList.push_back(ti);
}
unsigned short unsigned short
scene::correctedColorIndex(const std::string & l, unsigned short color) scene::correctedColorIndex(const std::string & l, unsigned short color)
{ {

View File

@ -25,6 +25,7 @@
#include <osg/Geometry> #include <osg/Geometry>
#include <osg/Geode> #include <osg/Geode>
#include <osg/Vec3d> #include <osg/Vec3d>
#include <osgText/Text>
#include <osgUtil/SmoothingVisitor> #include <osgUtil/SmoothingVisitor>
class dxfLayerTable; class dxfLayerTable;
@ -105,12 +106,12 @@ osg::Geometry* createQuadGeometry( osg::Vec3Array* vertices, osg::Vec3Array* nor
} }
static inline static inline
osg::Geode* createModel(const std::string & name, osg::Geometry* geom) osg::Geode* createModel(const std::string & name, osg::Drawable* drawable)
{ {
osg::Geode* geom_geode = new osg::Geode; osg::Geode* geode = new osg::Geode;
geom_geode->addDrawable(geom); geode->addDrawable(drawable);
geom_geode->setName(name); geode->setName(name);
return geom_geode; return geode;
} }
@ -145,6 +146,7 @@ public:
osgLines(root, b); osgLines(root, b);
osgTriangles(root, b); osgTriangles(root, b);
osgQuads(root, b); osgQuads(root, b);
osgText(root, b);
} }
MapVListList _linestrips; MapVListList _linestrips;
MapVList _lines; MapVList _lines;
@ -153,6 +155,18 @@ public:
MapVList _quads; MapVList _quads;
MapVList _quadnorms; MapVList _quadnorms;
struct textInfo
{
textInfo(short int color, osg::Vec3 point, osgText::Text *text) :
_color(color), _point(point), _text(text) {};
short int _color;
osg::Vec3d _point;
osg::ref_ptr<osgText::Text> _text;
};
typedef std::vector<textInfo> TextList;
TextList _textList;
protected: protected:
std::string _name; std::string _name;
@ -236,6 +250,19 @@ protected:
} }
} }
} }
void osgText(osg::Group* root, bounds &b)
{
if (_textList.size()) {
for (TextList::iterator titr = _textList.begin();
titr != _textList.end(); ++titr) {
titr->_text->setColor(getColor(titr->_color));
osg::Vec3d v1=titr->_point;
osg::Vec3 v2(v1.x() - b._min.x(), v1.y() - b._min.y(), v1.z() - b._min.z());
titr->_text->setPosition(v2);
root->addChild(createModel(_name, titr->_text.get()));
}
}
}
}; };
@ -292,6 +319,8 @@ public:
void addLineLoop(const std::string & l, unsigned short color, std::vector<osg::Vec3d> & vertices); void addLineLoop(const std::string & l, unsigned short color, std::vector<osg::Vec3d> & vertices);
void addTriangles(const std::string & l, unsigned short color, std::vector<osg::Vec3d> & vertices, bool inverted=false); void addTriangles(const std::string & l, unsigned short color, std::vector<osg::Vec3d> & vertices, bool inverted=false);
void addQuads(const std::string & l, unsigned short color, std::vector<osg::Vec3d> & vertices, bool inverted=false); void addQuads(const std::string & l, unsigned short color, std::vector<osg::Vec3d> & vertices, bool inverted=false);
void addText(const std::string & l, unsigned short color, osg::Vec3d & point, osgText::Text *text);
osg::Group* scene2osg() osg::Group* scene2osg()
{ {
osg::Group* root = NULL; osg::Group* root = NULL;