/* * @file test_creationclass.cpp */ /***************************************************************************** ** $Id: test_creationclass.cpp 8865 2008-02-04 18:54:02Z andrew $ ** ** This is part of the dxflib library ** Copyright (C) 2001 Andrew Mustun ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU Library General Public License as ** published by the Free Software Foundation. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ #include "test_creationclass.h" #include #include /** * Default constructor. */ Test_CreationClass::Test_CreationClass() { BlockObj newblock; newblock.drawflag = true; newblock.name = "entities"; myblock.push_back(newblock);//先插入一个空块,以供后面处理 } /** * Sample implementation of the method which handles layers. */ void Test_CreationClass::addLayer(const DL_LayerData& data) { //printf("LAYER: %s flags: %d\n", data.name.c_str(), data.flags); //printAttributes(); } /** * Sample implementation of the method which handles point entities. */ void Test_CreationClass::addPoint(const DL_PointData& data) { //printf("POINT (%6.3f, %6.3f, %6.3f)\n", // data.x, data.y, data.z); //printAttributes(); } /** * Sample implementation of the method which handles line entities. */ void Test_CreationClass::addLine(const DL_LineData& data) { DXFLine myline; myline.beginpoint = Point2D32f(data.x1, data.y1); myline.endpoint = Point2D32f(data.x2, data.y2); myblock[myblock.size() - 1].line.push_back(myline); } /** * Sample implementation of the method which handles arc entities. */ void Test_CreationClass::addArc(const DL_ArcData& data) { DXFArc myarc; myarc.centerpoint = Point2D32f(data.cx, data.cy); myarc.radius = data.radius; myarc.bangle = data.angle1; myarc.eangle = data.angle2; myblock[myblock.size() - 1].arc.push_back(myarc); /* printf("ARC (%6.3f, %6.3f, %6.3f) %6.3f, %6.3f, %6.3f\n", data.cx, data.cy, data.cz, data.radius, data.angle1, data.angle2); printAttributes();*/ } /** * Sample implementation of the method which handles circle entities. */ void Test_CreationClass::addCircle(const DL_CircleData& data) { DXFCircle mycircle; mycircle.centerpoint = Point2D32f(data.cx, data.cy); mycircle.radius = data.radius; myblock[myblock.size() - 1].circle.push_back(mycircle); } /** * Sample implementation of the method which handles polyline entities. * 多线实体起点标志位 */ void Test_CreationClass::addPolyline(const DL_PolylineData& data) { DXFPolyLineEntities mypolylineentities; mypolylineentities.isclose = data.flags;//闭合标志位,1表示闭合,0表示非闭合 myblock[myblock.size() - 1].polylineentities.push_back(mypolylineentities); } /** * Sample implementation of the method which handles vertices. * 顶点对像,描绘多线实体 */ void Test_CreationClass::addVertex(const DL_VertexData& data) { Point2D32f myvertex=Point2D32f(data.x, data.y); myblock[myblock.size() - 1].polylineentities[myblock[myblock.size() - 1].polylineentities.size() - 1].vertex.push_back(myvertex); } void Test_CreationClass::add3dFace(const DL_3dFaceData& data) { printf("3DFACE\n"); for (int i=0; i<4; i++) { printf(" corner %d: %6.3f %6.3f %6.3f\n", i, data.x[i], data.y[i], data.z[i]); } printAttributes(); } void Test_CreationClass::addSpline(const DL_SplineData&data) { Spline mySplineEnt; mySplineEnt.degree = data.degree; mySplineEnt.flags = data.flags; mySplineEnt.nControl =data.nControl; mySplineEnt.nFit =data.nFit; mySplineEnt.nKnots =data.nKnots; mySplineEnt.tangentStartX =data.tangentStartX; mySplineEnt.tangentStartY =data.tangentStartY; mySplineEnt.tangentStartZ =data.tangentStartZ; mySplineEnt.tangentEndX =data.tangentEndX; mySplineEnt.tangentEndY =data.tangentEndY; mySplineEnt.tangentEndZ =data.tangentEndZ; myblock[myblock.size() - 1].splineLst.push_back(mySplineEnt); } void Test_CreationClass::addControlPoint(const DL_ControlPointData&data) { int splineSize = myblock[myblock.size() - 1].splineLst.size(); Point3DW32f ctrPnt; ctrPnt.x = data.x; ctrPnt.y = data.y; ctrPnt.z = data.z; ctrPnt.w = data.w; myblock[myblock.size() - 1].splineLst[splineSize-1].ctrPntLst.push_back(ctrPnt); } void Test_CreationClass::addFitPoint(const DL_FitPointData&data) { int splineSize = myblock[myblock.size() - 1].splineLst.size(); Point3D32f fitPnt; fitPnt.x = data.x; fitPnt.y = data.y; fitPnt.z = data.z; myblock[myblock.size() - 1].splineLst[splineSize-1].fitPntLst.push_back(fitPnt); } void Test_CreationClass::addKnot(const DL_KnotData&data) { int splineSize = myblock[myblock.size() - 1].splineLst.size(); myblock[myblock.size() - 1].splineLst[splineSize-1].knotLst.push_back(data.k); } void Test_CreationClass::addText(const DL_TextData& data) { DXFText text; text.angle = data.angle; text.apx = data.apx; text.apy = data.apy; text.apz = data.apz; text.height = data.height; text.hJustification = data.hJustification; text.ipx = data.ipx; text.ipy = data.ipy; text.ipz = data.ipz; text.style = data.style; text.text = data.text; text.textGenerationFlags = data.textGenerationFlags; text.vJustification = data.vJustification; text.xScaleFactor = data.xScaleFactor; myblock[myblock.size() - 1].textLst.push_back(text); } void Test_CreationClass::addMText(const DL_MTextData& data) { DXFMText text; text.angle = data.angle; text.attachmentPoint = data.attachmentPoint; text.dirx = data.dirx; text.diry = data.diry; text.dirz = data.dirz; text.height = data.height; text.drawingDirection = data.drawingDirection; text.ipx = data.ipx; text.ipy = data.ipy; text.ipz = data.ipz; text.style = data.style; text.text = data.text; text.lineSpacingFactor = data.lineSpacingFactor; text.lineSpacingStyle = data.lineSpacingStyle; text.width = data.width; myblock[myblock.size() - 1].mtextLst.push_back(text); } void Test_CreationClass::addInsert(const DL_InsertData & data) { vector ::iterator itor;//容器迭代器 itor = myblock.begin(); while (itor != myblock.end()) { if (!itor->name.compare(data.name))//插入块名称比较,相同则表示插入该块 { itor->ipx = data.ipx; itor->ipy = data.ipy; itor->ipz = data.ipz; itor->sx = data.sx; itor->sy = data.sy; itor->sz = data.sz; itor->drawflag = true;//只有被插入的对象才进行绘制 break; } itor++; } } void Test_CreationClass::addBlock(const DL_BlockData & data) { myblock[myblock.size() - 1].name=data.name; myblock[myblock.size() - 1].drawflag = false; myblock[myblock.size() - 1].ipx = data.bpx; myblock[myblock.size() - 1].ipy = data.bpy; myblock[myblock.size() - 1].ipz = data.bpz; } void Test_CreationClass::endBlock()//因为dxflib没给出ENTITIES的标志位,为方便,将entitues也当成一个需要绘制的块进行处理,与正在的block的区别只在于块在插入的时候才绘制,而entities则一定会绘制 { BlockObj newblock; newblock.drawflag = true; newblock.name = "entities"; myblock.push_back(newblock); } void Test_CreationClass::printAttributes() { printf(" Attributes: Layer: %s, ", attributes.getLayer().c_str()); printf(" Color: "); if (attributes.getColor()==256) { printf("BYLAYER"); } else if (attributes.getColor()==0) { printf("BYBLOCK"); } else { printf("%d", attributes.getColor()); } printf(" Width: "); if (attributes.getWidth()==-1) { printf("BYLAYER"); } else if (attributes.getWidth()==-2) { printf("BYBLOCK"); } else if (attributes.getWidth()==-3) { printf("DEFAULT"); } else { printf("%d", attributes.getWidth()); } printf(" Type: %s\n", attributes.getLinetype().c_str()); }