/****************************************************************************** ** libDXFrw - Library to read/write DXF files (ascii & binary) ** ** ** ** Copyright (C) 2011 Rallaz, rallazz@gmail.com ** ** ** ** This library is free software, licensed under the terms of the GNU ** ** General Public License as published by the Free Software Foundation, ** ** either version 2 of the License, or (at your option) any later version. ** ** You should have received a copy of the GNU General Public License ** ** along with this program. If not, see . ** ******************************************************************************/ #include #include "drw_entities.h" #include "dxfreader.h" //! Calculate arbitary axis /*! * Calculate arbitary axis for aplly extrusions * @author Rallaz */ void DRW_Entity::calculateAxis(DRW_Coord extPoint){ if (fabs(extPoint.x) < 0.015625 && fabs(extPoint.y) < 0.015625) { extAxisX.x = extPoint.z; extAxisX.y = 0; extAxisX.z = -extPoint.x; } else { extAxisX.x = -extPoint.y; extAxisX.y = extPoint.x; extAxisX.z = 0; } extAxisX.unitize(); extAxisY.x = (extPoint.y * extAxisX.z) - (extAxisX.y * extPoint.z); extAxisY.y = (extPoint.z * extAxisX.x) - (extAxisX.z * extPoint.x); extAxisY.z = (extPoint.x * extAxisX.y) - (extAxisX.x * extPoint.y); extAxisY.unitize(); } //! Extrude a point using arbitary axis /*! * apply extrusion in a point using arbitary axis (previous calculated) * @author Rallaz */ void DRW_Entity::extrudePoint(DRW_Coord extPoint, DRW_Coord *point){ double px, py, pz; px = (extAxisX.x*point->x)+(extAxisY.x*point->y)+(extPoint.x*point->z); py = (extAxisX.y*point->x)+(extAxisY.y*point->y)+(extPoint.y*point->z); pz = (extAxisX.z*point->x)+(extAxisY.z*point->y)+(extPoint.z*point->z); point->x = px; point->y = py; point->z = pz; } void DRW_Entity::parseCode(int code, dxfReader *reader){ switch (code) { case 5: handle = reader->getString(); break; case 330: handleBlock = reader->getString(); break; case 8: layer = reader->getString(); break; case 6: lineType = reader->getString(); break; case 62: color = reader->getInt32(); break; case 370: // lWeight = (DRW::LWEIGHT)reader->getInt32(); //RLZ: TODO as integer or enum?? lWeight = reader->getInt32(); break; case 48: ltypeScale = reader->getDouble(); break; case 60: visible = reader->getBool(); break; case 420: color24 = reader->getInt32(); break; case 430: colorName = reader->getString(); break; case 67: space = reader->getInt32(); break; default: break; } } void DRW_Point::parseCode(int code, dxfReader *reader){ switch (code) { case 10: basePoint.x = reader->getDouble(); break; case 20: basePoint.y = reader->getDouble(); break; case 30: basePoint.z = reader->getDouble(); break; case 39: thickness = reader->getDouble(); break; case 210: haveExtrusion = true; extPoint.x = reader->getDouble(); break; case 220: extPoint.y = reader->getDouble(); break; case 230: extPoint.z = reader->getDouble(); break; default: DRW_Entity::parseCode(code, reader); break; } } void DRW_Line::parseCode(int code, dxfReader *reader){ switch (code) { case 11: secPoint.x = reader->getDouble(); break; case 21: secPoint.y = reader->getDouble(); break; case 31: secPoint.z = reader->getDouble(); break; default: DRW_Point::parseCode(code, reader); break; } } void DRW_Circle::applyExtrusion(){ if (haveExtrusion) { calculateAxis(extPoint); extrudePoint(extPoint, &basePoint); } } void DRW_Circle::parseCode(int code, dxfReader *reader){ switch (code) { case 40: radious = reader->getDouble(); break; default: DRW_Point::parseCode(code, reader); break; } } void DRW_Arc::parseCode(int code, dxfReader *reader){ switch (code) { case 50: staangle = reader->getDouble(); break; case 51: endangle = reader->getDouble(); break; default: DRW_Circle::parseCode(code, reader); break; } } void DRW_Ellipse::parseCode(int code, dxfReader *reader){ switch (code) { case 40: ratio = reader->getDouble(); break; case 41: staparam = reader->getDouble(); break; case 42: endparam = reader->getDouble(); break; default: DRW_Line::parseCode(code, reader); break; } } void DRW_Trace::applyExtrusion(){ if (haveExtrusion) { calculateAxis(extPoint); extrudePoint(extPoint, &basePoint); extrudePoint(extPoint, &secPoint); extrudePoint(extPoint, &thirdPoint); extrudePoint(extPoint, &fourPoint); } } void DRW_Trace::parseCode(int code, dxfReader *reader){ switch (code) { case 12: thirdPoint.x = reader->getDouble(); break; case 22: thirdPoint.y = reader->getDouble(); break; case 32: thirdPoint.z = reader->getDouble(); break; case 13: fourPoint.x = reader->getDouble(); break; case 23: fourPoint.y = reader->getDouble(); break; case 33: fourPoint.z = reader->getDouble(); break; default: DRW_Line::parseCode(code, reader); break; } } void DRW_Solid::parseCode(int code, dxfReader *reader){ DRW_Trace::parseCode(code, reader); } void DRW_3Dface::parseCode(int code, dxfReader *reader){ switch (code) { case 70: invisibleflag = reader->getDouble(); break; default: DRW_Trace::parseCode(code, reader); break; } } void DRW_Block::parseCode(int code, dxfReader *reader){ switch (code) { case 2: name = reader->getString(); break; case 70: flags = reader->getInt32(); break; default: DRW_Point::parseCode(code, reader); break; } } void DRW_Insert::parseCode(int code, dxfReader *reader){ switch (code) { case 2: name = reader->getString(); break; case 41: xscale = reader->getDouble(); break; case 42: yscale = reader->getDouble(); break; case 43: zscale = reader->getDouble(); break; case 50: angle = reader->getDouble(); break; case 70: colcount = reader->getInt32(); break; case 71: rowcount = reader->getInt32(); break; case 44: colspace = reader->getDouble(); break; case 45: rowspace = reader->getDouble(); break; default: DRW_Point::parseCode(code, reader); break; } } void DRW_LWPolyline::applyExtrusion(){ if (haveExtrusion) { calculateAxis(extPoint); for (unsigned int i=0; ix, vert->y, elevation); extrudePoint(extPoint, &v); vert->x = v.x; vert->y = v.y; } } } void DRW_LWPolyline::parseCode(int code, dxfReader *reader){ switch (code) { case 10: { vertex = new DRW_Vertex2D(); vertlist.push_back(vertex); vertex->x = reader->getDouble(); break; } case 20: if(vertex != NULL) vertex->y = reader->getDouble(); break; case 40: if(vertex != NULL) vertex->stawidth = reader->getDouble(); break; case 41: if(vertex != NULL) vertex->endwidth = reader->getDouble(); break; case 42: if(vertex != NULL) vertex->bulge = reader->getDouble(); break; case 38: elevation = reader->getDouble(); break; case 43: width = reader->getDouble(); break; case 70: flags = reader->getInt32(); break; case 90: vertexnum = reader->getInt32(); vertlist.reserve(vertexnum); break; case 210: haveExtrusion = true; extPoint.x = reader->getDouble(); break; case 220: extPoint.y = reader->getDouble(); break; case 230: extPoint.z = reader->getDouble(); break; default: DRW_Entity::parseCode(code, reader); break; } } void DRW_Text::parseCode(int code, dxfReader *reader){ switch (code) { case 40: height = reader->getDouble(); break; case 41: widthscale = reader->getDouble(); break; case 50: angle = reader->getDouble(); break; case 51: oblique = reader->getDouble(); break; case 71: textgen = reader->getInt32(); break; case 72: alignH = (DRW::HAlign)reader->getInt32(); break; case 73: alignV = (DRW::VAlign)reader->getInt32(); break; case 1: text = reader->getString(); break; case 7: style = reader->getString(); break; default: DRW_Line::parseCode(code, reader); break; } } void DRW_MText::parseCode(int code, dxfReader *reader){ switch (code) { case 1: text += reader->getString(); break; case 3: text += reader->getString(); break; case 44: interlin = reader->getDouble(); break; default: DRW_Text::parseCode(code, reader); break; } } void DRW_Polyline::parseCode(int code, dxfReader *reader){ switch (code) { case 70: flags = reader->getInt32(); break; case 40: defstawidth = reader->getDouble(); break; case 41: defendwidth = reader->getDouble(); break; case 71: vertexcount = reader->getInt32(); break; case 72: facecount = reader->getInt32(); break; case 73: smoothM = reader->getInt32(); break; case 74: smoothN = reader->getInt32(); break; case 75: curvetype = reader->getInt32(); break; default: DRW_Point::parseCode(code, reader); break; } } void DRW_Vertex::parseCode(int code, dxfReader *reader){ switch (code) { case 70: flags = reader->getInt32(); break; case 40: stawidth = reader->getDouble(); break; case 41: endwidth = reader->getDouble(); break; case 42: bulge = reader->getDouble(); break; case 50: tgdir = reader->getDouble(); break; case 71: vindex1 = reader->getInt32(); break; case 72: vindex2 = reader->getInt32(); break; case 73: vindex3 = reader->getInt32(); break; case 74: vindex4 = reader->getInt32(); break; case 91: identifier = reader->getInt32(); break; default: DRW_Point::parseCode(code, reader); break; } } void DRW_Hatch::parseCode(int code, dxfReader *reader){ switch (code) { case 2: name = reader->getString(); break; case 70: solid = reader->getInt32(); break; case 71: associative = reader->getInt32(); break; case 72: /*edge type*/ if (ispol){ //if is polyline is a as_bulge flag break; } else if (reader->getInt32() == 1){ //line addLine(); } else if (reader->getInt32() == 2){ //arc addArc(); } else if (reader->getInt32() == 3){ //elliptic arc addEllipse(); } else if (reader->getInt32() == 4){ //spline addSpline(); } break; case 10: if (pt) pt->basePoint.x = reader->getDouble(); else if (pline) { plvert = pline->addVertex(); plvert->x = reader->getDouble(); } break; case 20: if (pt) pt->basePoint.y = reader->getDouble(); else if (plvert) plvert ->y = reader->getDouble(); break; case 11: if (line) line->secPoint.x = reader->getDouble(); else if (ellipse) ellipse->secPoint.x = reader->getDouble(); break; case 21: if (line) line->secPoint.y = reader->getDouble(); else if (ellipse) ellipse->secPoint.y = reader->getDouble(); break; case 40: if (arc) arc->radious = reader->getDouble(); else if (ellipse) ellipse->ratio = reader->getDouble(); break; case 41: scale = reader->getDouble(); break; case 42: if (plvert) plvert ->bulge = reader->getDouble(); break; case 50: if (arc) arc->staangle = reader->getDouble(); else if (ellipse) ellipse->staparam = reader->getDouble(); break; case 51: if (arc) arc->endangle = reader->getDouble(); else if (ellipse) ellipse->endparam = reader->getDouble(); break; case 52: angle = reader->getDouble(); break; case 73: if (arc) arc->isccw = reader->getInt32(); else if (pline) pline->flags = reader->getInt32(); break; case 75: hstyle = reader->getInt32(); break; case 76: hpattern = reader->getInt32(); break; case 77: doubleflag = reader->getInt32(); break; case 78: deflines = reader->getInt32(); break; case 91: loopsnum = reader->getInt32(); looplist.reserve(loopsnum); break; case 92: loop = new DRW_HatchLoop(reader->getInt32()); looplist.push_back(loop); if (reader->getInt32() & 2) { ispol = true; clearEntities(); pline = new DRW_LWPolyline; loop->objlist.push_back(pline); } else ispol = false; break; case 93: if (pline) pline->vertexnum = reader->getInt32(); else loop->numedges = reader->getInt32();//aqui reserve break; case 98: //seed points ?? clearEntities(); break; default: DRW_Point::parseCode(code, reader); break; } } void DRW_Spline::parseCode(int code, dxfReader *reader){ switch (code) { case 210: ex = reader->getDouble(); break; case 220: ey = reader->getDouble(); break; case 230: ez = reader->getDouble(); break; case 12: tgsx = reader->getDouble(); break; case 22: tgsy = reader->getDouble(); break; case 32: tgsz = reader->getDouble(); break; case 13: tgex = reader->getDouble(); break; case 23: tgey = reader->getDouble(); break; case 33: tgez = reader->getDouble(); break; case 70: flags = reader->getInt32(); break; case 71: degree = reader->getInt32(); break; case 72: nknots = reader->getInt32(); break; case 73: ncontrol = reader->getInt32(); break; case 74: nfit = reader->getInt32(); break; case 42: tolknot = reader->getDouble(); break; case 43: tolcontrol = reader->getDouble(); break; case 44: tolfit = reader->getDouble(); break; case 10: { controlpoint = new DRW_Coord(); controllist.push_back(controlpoint); controlpoint->x = reader->getDouble(); break; } case 20: if(controlpoint != NULL) controlpoint->y = reader->getDouble(); break; case 30: if(controlpoint != NULL) controlpoint->z = reader->getDouble(); break; case 11: { fitpoint = new DRW_Coord(); fitlist.push_back(fitpoint); fitpoint->x = reader->getDouble(); break; } case 21: if(fitpoint != NULL) fitpoint->y = reader->getDouble(); break; case 31: if(fitpoint != NULL) fitpoint->z = reader->getDouble(); break; case 40: knotslist.push_back(reader->getDouble()); break; // case 41: // break; default: DRW_Entity::parseCode(code, reader); break; } } void DRW_Image::parseCode(int code, dxfReader *reader){ switch (code) { case 12: vx = reader->getDouble(); break; case 22: vy = reader->getDouble(); break; case 32: vz = reader->getDouble(); break; case 13: sizeu = reader->getDouble(); break; case 23: sizev = reader->getDouble(); break; case 340: ref = reader->getString(); break; case 280: clip = reader->getInt32(); break; case 281: brightness = reader->getInt32(); break; case 282: contrast = reader->getInt32(); break; case 283: fade = reader->getInt32(); break; default: DRW_Line::parseCode(code, reader); break; } } void DRW_DimensionData::parseCode(int code, dxfReader *reader){ switch (code) { case 1: text = reader->getString(); break; case 2: name = reader->getString(); break; case 3: style = reader->getString(); break; case 70: type = reader->getInt32(); break; case 71: align = reader->getInt32(); break; case 72: linesty = reader->getInt32(); break; case 12: clonePoint.x = reader->getDouble(); break; case 22: clonePoint.y = reader->getDouble(); break; case 32: clonePoint.z = reader->getDouble(); break; case 13: def1.x = reader->getDouble(); break; case 23: def1.y = reader->getDouble(); break; case 33: def1.z = reader->getDouble(); break; case 14: def2.x = reader->getDouble(); break; case 24: def2.y = reader->getDouble(); break; case 34: def2.z = reader->getDouble(); break; case 15: circlePoint.x = reader->getDouble(); break; case 25: circlePoint.y = reader->getDouble(); break; case 35: circlePoint.z = reader->getDouble(); break; case 16: arcPoint.x = reader->getDouble(); break; case 26: arcPoint.y = reader->getDouble(); break; case 36: arcPoint.z = reader->getDouble(); break; case 41: linefactor = reader->getDouble(); break; case 53: rot = reader->getDouble(); break; case 50: angle = reader->getDouble(); break; case 52: oblique = reader->getDouble(); break; case 40: length = reader->getDouble(); break; /* case 51: hdir = reader->getDouble(); break;*/ default: DRW_Line::parseCode(code, reader); break; } } void DRW_Leader::parseCode(int code, dxfReader *reader){ switch (code) { case 3: style = reader->getString(); break; case 71: arrow = reader->getInt32(); break; case 72: leadertype = reader->getInt32(); break; case 73: flag = reader->getInt32(); break; case 74: hookline = reader->getInt32(); break; case 75: hookflag = reader->getInt32(); break; case 76: vertnum = reader->getInt32(); break; case 77: coloruse = reader->getInt32(); break; case 40: textheight = reader->getDouble(); break; case 41: textwidth = reader->getDouble(); break; case 10: { vertexpoint = new DRW_Coord(); vertexlist.push_back(vertexpoint); vertexpoint->x = reader->getDouble(); break; } case 20: if(vertexpoint != NULL) vertexpoint->y = reader->getDouble(); break; case 30: if(vertexpoint != NULL) vertexpoint->z = reader->getDouble(); break; case 340: handle = reader->getString(); break; case 210: extrusionPoint.x = reader->getDouble(); break; case 220: extrusionPoint.y = reader->getDouble(); break; case 230: extrusionPoint.z = reader->getDouble(); break; case 211: horizdir.x = reader->getDouble(); break; case 221: horizdir.y = reader->getDouble(); break; case 231: horizdir.z = reader->getDouble(); break; case 212: offsetblock.x = reader->getDouble(); break; case 222: offsetblock.y = reader->getDouble(); break; case 232: offsetblock.z = reader->getDouble(); break; case 213: offsettext.x = reader->getDouble(); break; case 223: offsettext.y = reader->getDouble(); break; case 233: offsettext.z = reader->getDouble(); break; default: DRW_Entity::parseCode(code, reader); break; } }