/****************************************************************************** ** libDXFrw - Library to read/write DXF files (ascii & binary) ** ** ** ** Copyright (C) 2011-2015 José F. Soriano, 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 "intern/dxfreader.h" #include "intern/drw_dbg.h" #include "../vmisc/diagnostic.h" //! Calculate arbitrary axis /*! * Calculate arbitrary axis for apply extrusions * @author Rallaz */ void DRW_Entity::calculateAxis(DRW_Coord extPoint){ //Follow the arbitrary DXF definitions for extrusion axes. if (fabs(extPoint.x) < 0.015625 && fabs(extPoint.y) < 0.015625) { //If we get here, implement Ax = Wy x N where Wy is [0,1,0] per the DXF spec. //The cross product works out to Wy.y*N.z-Wy.z*N.y, Wy.z*N.x-Wy.x*N.z, Wy.x*N.y-Wy.y*N.x //Factoring in the fixed values for Wy gives N.z,0,-N.x extAxisX.x = extPoint.z; extAxisX.y = 0; extAxisX.z = -extPoint.x; } else { //Otherwise, implement Ax = Wz x N where Wz is [0,0,1] per the DXF spec. //The cross product works out to Wz.y*N.z-Wz.z*N.y, Wz.z*N.x-Wz.x*N.z, Wz.x*N.y-Wz.y*N.x //Factoring in the fixed values for Wz gives -N.y,N.x,0. extAxisX.x = -extPoint.y; extAxisX.y = extPoint.x; extAxisX.z = 0; } extAxisX.unitize(); //Ay = N x Ax 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 arbitrary axis /*! * apply extrusion in a point using arbitrary axis (previous calculated) * @author Rallaz */ void DRW_Entity::extrudePoint(DRW_Coord extPoint, DRW_Coord *point) const{ 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; } bool DRW_Entity::parseCode(int code, dxfReader *reader){ switch (code) { case 5: handle = static_cast(reader->getHandleString()); break; case 330: parentHandle = static_cast(reader->getHandleString()); break; case 8: layer = reader->getUtf8String(); break; case 6: lineType = reader->getUtf8String(); break; case 62: color = reader->getInt32(); break; case 370: lWeight = DRW_LW_Conv::dxfInt2lineWidth(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 = static_cast(reader->getInt32()); break; case 102: parseDxfGroups(code, reader); break; case 1000: case 1001: case 1002: case 1003: case 1004: case 1005: extData.push_back(new DRW_Variant(code, reader->getString())); break; case 1010: case 1011: case 1012: case 1013: curr = new DRW_Variant(); curr->addCoord(); curr->setCoordX(reader->getDouble()); curr->code = code; extData.push_back(curr); break; case 1020: case 1021: case 1022: case 1023: if (curr) curr->setCoordY(reader->getDouble()); break; case 1030: case 1031: case 1032: case 1033: if (curr) curr->setCoordZ(reader->getDouble()); curr=nullptr; break; case 1040: case 1041: case 1042: extData.push_back(new DRW_Variant(code, reader->getDouble() )); break; case 1070: case 1071: extData.push_back(new DRW_Variant(code, reader->getInt32() )); break; default: break; } return true; } //parses dxf 102 groups to read entity bool DRW_Entity::parseDxfGroups(int code, dxfReader *reader){ std::list ls; DRW_Variant curr; int nc; std::string appName= reader->getString(); if (!appName.empty() && appName.at(0)== '{'){ curr.addString(appName.substr(1, static_cast(appName.size()-1))); curr.code = code; ls.push_back(curr); while (code !=102 && appName.at(0)== '}'){ reader->readRec(&nc); curr.code = code; if (code == 330 || code == 360) curr.addInt(reader->getHandleString()); else { switch (reader->type) { case dxfReader::STRING: curr.addString(reader->getString()); break; case dxfReader::INT32: case dxfReader::INT64: curr.addInt(reader->getInt32()); break; case dxfReader::DOUBLE: curr.addDouble(reader->getDouble()); break; case dxfReader::BOOL: curr.addInt(reader->getInt32()); break; default: break; } } ls.push_back(curr); } } appData.push_back(ls); return true; } 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_ASTMNotch::parseCode(int code, dxfReader *reader) { switch (code) { case 50: angle = reader->getDouble(); break; default: DRW_Point::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) { //NOTE: Commenting these out causes the the arcs being tested to be located //on the other side of the y axis (all x dimensions are negated). 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::applyExtrusion(){ DRW_Circle::applyExtrusion(); if(haveExtrusion){ // If the extrusion vector has a z value less than 0, the angles for the arc // have to be mirrored since DXF files use the right hand rule. // Note that the following code only handles the special case where there is a 2D // drawing with the z axis heading into the paper (or rather screen). An arbitrary // extrusion axis (with x and y values greater than 1/64) may still have issues. if (fabs(extPoint.x) < 0.015625 && fabs(extPoint.y) < 0.015625 && extPoint.z < 0.0) { staangle=M_PI-staangle; endangle=M_PI-endangle; double temp = staangle; staangle=endangle; endangle=temp; } } } void DRW_Arc::parseCode(int code, dxfReader *reader){ switch (code) { case 50: staangle = reader->getDouble()/ ARAD; break; case 51: endangle = reader->getDouble()/ ARAD; 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_Ellipse::applyExtrusion(){ if (haveExtrusion) { calculateAxis(extPoint); extrudePoint(extPoint, &secPoint); double intialparam = staparam; if (extPoint.z < 0.){ staparam = M_PIx2 - endparam; endparam = M_PIx2 - intialparam; } } } //if ratio > 1 minor axis are greather than major axis, correct it void DRW_Ellipse::correctAxis(){ bool complete = false; if (DRW_FuzzyComparePossibleNulls(staparam, endparam)) { staparam = 0.0; endparam = M_PIx2; //2*M_PI; complete = true; } if (ratio > 1){ if ( fabs(endparam - staparam - M_PIx2) < 1.0e-10) complete = true; double incX = secPoint.x; secPoint.x = -(secPoint.y * ratio); secPoint.y = incX*ratio; ratio = 1/ratio; if (!complete){ if (staparam < M_PI_2) staparam += M_PI *2; if (endparam < M_PI_2) endparam += M_PI *2; endparam -= M_PI_2; staparam -= M_PI_2; } } } //parts are the number of vertex to split polyline, default 128 void DRW_Ellipse::toPolyline(DRW_Polyline *pol, int parts){ double radMajor, radMinor, cosRot, sinRot, incAngle, curAngle; radMajor = sqrt(secPoint.x*secPoint.x + secPoint.y*secPoint.y); radMinor = radMajor*ratio; //calculate sin & cos of included angle incAngle = atan2(secPoint.y, secPoint.x); cosRot = cos(incAngle); sinRot = sin(incAngle); incAngle = M_PIx2 / parts; curAngle = staparam; int i = static_cast(curAngle / incAngle); do { if (curAngle > endparam) { curAngle = endparam; i = parts+2; } double cosCurr = cos(curAngle); double sinCurr = sin(curAngle); double x = basePoint.x + (cosCurr*cosRot*radMajor) - (sinCurr*sinRot*radMinor); double y = basePoint.y + (cosCurr*sinRot*radMajor) + (sinCurr*cosRot*radMinor); pol->addVertex( DRW_Vertex(x, y, 0.0, 0.0)); curAngle = (++i)*incAngle; } while (iflags = 1; } pol->layer = this->layer; pol->lineType = this->lineType; pol->color = this->color; pol->lWeight = this->lWeight; pol->extPoint = this->extPoint; } 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->getInt32(); break; default: DRW_Trace::parseCode(code, reader); break; } } void DRW_Block::parseCode(int code, dxfReader *reader){ switch (code) { case 2: name = reader->getUtf8String(); 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->getUtf8String(); break; case 41: xscale = reader->getDouble(); break; case 42: yscale = reader->getDouble(); break; case 43: zscale = reader->getDouble(); break; case 50: angle = reader->getDouble(); angle = angle/ARAD; //convert to radian 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 39: thickness = reader->getDouble(); break; case 43: width = reader->getDouble(); break; case 70: flags = reader->getInt32(); break; case 90: vertexnum = reader->getInt32(); vertlist.reserve(static_cast(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 = static_cast(reader->getInt32()); break; case 73: alignV = static_cast(reader->getInt32()); break; case 1: text = reader->getUtf8String(); break; case 7: style = reader->getUtf8String(); break; default: DRW_Line::parseCode(code, reader); break; } } void DRW_MText::parseCode(int code, dxfReader *reader){ switch (code) { case 1: text += reader->getString(); text = reader->toUtf8String(text); break; case 11: hasXAxisVec = true; DRW_Text::parseCode(code, reader); break; case 3: text += reader->getString(); break; case 44: interlin = reader->getDouble(); break; case 71: { // Attachment point Attach a = static_cast(reader->getInt32()); QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wswitch-default") switch(a) { case TopLeft: alignV = VTop; alignH = HLeft; break; case TopCenter: alignV = VTop; alignH = HCenter; break; case TopRight: alignV = VTop; alignH = HRight; break; case MiddleLeft: alignV = VMiddle; alignH = HLeft; break; case MiddleCenter: alignV = VMiddle; alignH = HCenter; break; case MiddleRight: alignV = VMiddle; alignH = HRight; break; case BottomLeft: alignV = VBottom; alignH = HLeft; break; case BottomCenter: alignV = VBottom; alignH = HCenter; break; case BottomRight: alignV = VBottom; alignH = HRight; break; } QT_WARNING_POP } break; case 72: // To prevent redirection to DRW_Text::parseCode. // This code meaning is different for MTEXT. // Actually: Drawing direction break; case 73: // To prevent redirection to DRW_Text::parseCode. // This code meaning is different for MTEXT. // Actually: Mtext line spacing style break; default: DRW_Text::parseCode(code, reader); break; } } void DRW_MText::updateAngle(){ if (hasXAxisVec) { angle = atan2(secPoint.y, secPoint.x)*180/M_PI; } } 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->getUtf8String(); 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()/ARAD; else if (ellipse) ellipse->staparam = reader->getDouble()/ARAD; break; case 51: if (arc) arc->endangle = reader->getDouble()/ARAD; else if (ellipse) ellipse->endparam = reader->getDouble()/ARAD; 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(static_cast(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: normalVec.x = reader->getDouble(); break; case 220: normalVec.y = reader->getDouble(); break; case 230: normalVec.z = reader->getDouble(); break; case 12: tgStart.x = reader->getDouble(); break; case 22: tgStart.y = reader->getDouble(); break; case 32: tgStart.z = reader->getDouble(); break; case 13: tgEnd.x = reader->getDouble(); break; case 23: tgEnd.y = reader->getDouble(); break; case 33: tgEnd.z = 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: weightlist.push_back(reader->getDouble()); break; default: DRW_Entity::parseCode(code, reader); break; } } void DRW_Image::parseCode(int code, dxfReader *reader){ switch (code) { case 12: vVector.x = reader->getDouble(); break; case 22: vVector.y = reader->getDouble(); break; case 32: vVector.z = reader->getDouble(); break; case 13: sizeu = reader->getDouble(); break; case 23: sizev = reader->getDouble(); break; case 340: ref = static_cast(reader->getHandleString()); 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_Dimension::parseCode(int code, dxfReader *reader){ switch (code) { case 1: text = reader->getUtf8String(); break; case 2: name = reader->getString(); break; case 3: style = reader->getUtf8String(); break; case 70: type = reader->getInt32(); break; case 71: align = reader->getInt32(); break; case 72: linesty = reader->getInt32(); break; case 10: defPoint.x = reader->getDouble(); break; case 20: defPoint.y = reader->getDouble(); break; case 30: defPoint.z = reader->getDouble(); break; case 11: textPoint.x = reader->getDouble(); break; case 21: textPoint.y = reader->getDouble(); break; case 31: textPoint.z = reader->getDouble(); 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 42: actual = reader->getDouble(); hasActual = not qFuzzyIsNull(actual); 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; case 210: 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_Leader::parseCode(int code, dxfReader *reader){ switch (code) { case 3: style = reader->getUtf8String(); 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: annotHandle = static_cast(reader->getHandleString()); 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; } } void DRW_Viewport::parseCode(int code, dxfReader *reader){ switch (code) { case 40: pswidth = reader->getDouble(); break; case 41: psheight = reader->getDouble(); break; case 68: vpstatus = reader->getInt32(); break; case 69: vpID = reader->getInt32(); break; case 12: { centerPX = reader->getDouble(); break; } case 22: centerPY = reader->getDouble(); break; default: DRW_Point::parseCode(code, reader); break; } }