mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-17 06:06:00 -06:00
151 lines
2.7 KiB
C++
151 lines
2.7 KiB
C++
#include "Block.h"
|
|
#include "DXF.h"
|
|
|
|
DXFBlock::DXFBlock(DXF *d) : entities(this)
|
|
{
|
|
dxf = d;
|
|
if(dxf)
|
|
{
|
|
startHandle = dxf->GetNextHandle();
|
|
endHandle = dxf->GetNextHandle();
|
|
}
|
|
else
|
|
startHandle = endHandle = 0;
|
|
|
|
color = DXF::ByBlock;
|
|
layer = "0";
|
|
lineType = "ByBlock";
|
|
}
|
|
|
|
// write drawing to file
|
|
bool DXFBlock::Write(String const &name, Stream &s)
|
|
{
|
|
s << "0\nBLOCK\n";
|
|
s << "5\n" << Format64Hex(startHandle) << "\n";
|
|
s << "100\nAcDbEntity\n";
|
|
s << "8\n0\n";
|
|
s << "100\nAcDbBlockBegin\n";
|
|
s << "2\n" << ToCharset(CHARSET_WIN1252, name) << "\n";
|
|
s << "70\n0\n"; // attributes ???
|
|
s << "10\n0.0\n20\n0.0\n30\n0.0\n"; // shall we handle insertion base point ?
|
|
s << "3\n" << ToCharset(CHARSET_WIN1252, name) << "\n";
|
|
s << "1\n\n";
|
|
|
|
// write out entities
|
|
entities.WriteNoHeader(s);
|
|
|
|
// block end markers
|
|
s << "0\nENDBLK\n";
|
|
s << "5\n" << Format64Hex(endHandle) << "\n";
|
|
s << "100\nAcDbEntity\n";
|
|
s << "8\n0\n";
|
|
s << "100\nAcDbBlockEnd\n";
|
|
return true;
|
|
}
|
|
|
|
// push/pop Ucs
|
|
DXFBlock &DXFBlock::PushUcs(void)
|
|
{
|
|
transStack.Add(transMatrix);
|
|
return *this;
|
|
}
|
|
|
|
DXFBlock &DXFBlock::PopUcs(void)
|
|
{
|
|
if(transStack.GetCount())
|
|
transMatrix = transStack.Pop();
|
|
return *this;
|
|
}
|
|
|
|
// scales transformation matrix
|
|
DXFBlock &DXFBlock::ScaleUcs(double s)
|
|
{
|
|
transMatrix.Scale(s);
|
|
return *this;
|
|
}
|
|
|
|
// rotates transformation matrix
|
|
DXFBlock &DXFBlock::RotateUcs(double a)
|
|
{
|
|
transMatrix.Rotate(a);
|
|
return *this;
|
|
}
|
|
|
|
DXFBlock &DXFBlock::TranslateUcs(Pointf const &p)
|
|
{
|
|
transMatrix.Translate(p);
|
|
return *this;
|
|
}
|
|
|
|
DXFBlock &DXFBlock::TranslateUcs(double dx, double dy)
|
|
{
|
|
transMatrix.Translate(dx, dy);
|
|
return *this;
|
|
}
|
|
|
|
// sets/gets current layer
|
|
DXFBlock &DXFBlock::SetCurrentLayer(String const &l)
|
|
{
|
|
layer = l;
|
|
return *this;
|
|
}
|
|
|
|
DXFBlock &DXFBlock::PushLayer(String const &newLayer)
|
|
{
|
|
layerStack.Add(layer);
|
|
if(!newLayer.IsEmpty())
|
|
layer = newLayer;
|
|
return *this;
|
|
}
|
|
|
|
DXFBlock &DXFBlock::PopLayer(void)
|
|
{
|
|
if(layerStack.GetCount())
|
|
layer = layerStack.Pop();
|
|
return *this;
|
|
}
|
|
|
|
// sets/gets current linetype
|
|
DXFBlock &DXFBlock::SetCurrentLineType(String const &l)
|
|
{
|
|
lineType = l;
|
|
return *this;
|
|
}
|
|
|
|
DXFBlock &DXFBlock::PushLineType(String const &newLineType)
|
|
{
|
|
lineTypeStack.Add(lineType);
|
|
if(!newLineType.IsEmpty())
|
|
lineType = newLineType;
|
|
return *this;
|
|
}
|
|
|
|
DXFBlock &DXFBlock::PopLineType(void)
|
|
{
|
|
if(lineTypeStack.GetCount())
|
|
lineType = lineTypeStack.Pop();
|
|
return *this;
|
|
}
|
|
|
|
// sets/gets current color
|
|
DXFBlock &DXFBlock::SetCurrentColor(int c)
|
|
{
|
|
color = c;
|
|
return *this;
|
|
}
|
|
|
|
DXFBlock &DXFBlock::PushColor(int newColor)
|
|
{
|
|
colorStack.Add(color);
|
|
if(!IsNull(newColor))
|
|
color = newColor;
|
|
return *this;
|
|
}
|
|
|
|
DXFBlock &DXFBlock::PopColor(void)
|
|
{
|
|
if(colorStack.GetCount())
|
|
color = colorStack.Pop();
|
|
return *this;
|
|
}
|
|
|