COMPASSi/trunk/code/projects/ReadDXF/test_creationclass.cpp

270 lines
8.2 KiB
C++
Raw Permalink Normal View History

2025-06-25 15:06:42 +08:00
/*
* @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 <iostream>
#include <stdio.h>
/**
* 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<BlockObj> ::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());
}