Files
envi-code/SourceCode/Code2026/Dimension/dbGridSheet.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

4551 lines
116 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "AcDbObjectPtr.h"
#include "AcGiUtil.h"
#include "dbobjptr.h"
#include "dbGridSheet.h"
#include "layerdef.h"
#include "GeCurveInline.h"
#include "SHArray.h"
#include "AecDbMtext.h"
#include "TBlockGeomInfo.h"
AcDbObjectId InitBlock(const TCHAR *pszBlock, AcDbDatabase *pDb = NULL);
static int CompareRange(const GridRange *p1, const void *p2)
{
return (p1 != p2);
}
#define LSF_DEFAULT 0.4
Acad::ErrorStatus CalInsertParameters(const AcDbBlockReference *pBlkSrc, XPoint &ptNewBase, double *nRotation,
double *nSx, double *nSy, double *nSz, BlockGeomInfo info)
{
ads_matrix matRotOld, matMove, matScale, matRotNew, matTransform;
double nSizeX, nSizeY, nSizeZ, nRot;
XPoint ptBase, ptCen, ptNewCen;
VERIFY(GlobalFunc::GetBlockRefSizeInfo(pBlkSrc, ptBase, &nRot, ptCen, &nSizeX, &nSizeY, &nSizeZ) == RTNORM);
ptNewCen = info.m_ptCen;
ptNewCen.z += info.m_nSizeZ / 2.0;
// 绕旧中心旋转-nRotOld -> 绕旧中心Scale -> 平移到新中心 -> 旋转 RotNew
// or
// 绕旧中心旋转-nRotOld -> 绕旧中心Scale -> 旋转 RotNew -> 平移到新中心 (Current Method)
AcGeScale3d bScale = pBlkSrc->scaleFactors();
double sx = 1, sy = 1, sz = 1;
if (fabs(nSizeX) > 1.0E-6) bScale[0] *= (sx = info.m_nSizeX / nSizeX);
if (fabs(nSizeY) > 1.0E-6) bScale[1] *= (sy = info.m_nSizeY / nSizeY);
if (fabs(nSizeZ) > 1.0E-6) bScale[2] *= (sz = info.m_nSizeZ / nSizeZ);
ptCen.GetRotationMatrix(-nRot, matRotOld);
ptCen.GetScaleMatrix(sx, sy, sz, matScale);
ptCen.GetRotationMatrix(info.m_nRotation, matRotNew);
ptCen.GetMoveMatrix(ptNewCen, matMove);
GlobalFunc::MatrixMultiply(matTransform, matMove, matRotNew, matScale, matRotOld, NULL);
ptNewBase = ptBase.TransformAs(matTransform); //换算新的基点位置
*nRotation = info.m_nRotation;
*nSx = bScale[0];
*nSy = bScale[1];
*nSz = bScale[2];
return Acad::eOk;
}
void UpdateInsert(AcDbBlockReference *pInsert, BlockGeomInfo info, BOOL bUniScale)
{
XPoint ptNewBase;
double nNewRot;
AcGeScale3d scale;
if (CalInsertParameters(pInsert, ptNewBase, &nNewRot, &scale[0], &scale[1], &scale[2], info) != Acad::eOk)
return;
pInsert->setPosition(ptNewBase);
pInsert->setRotation(nNewRot);
if (bUniScale)
{
double dScale = min(scale[0], scale[1]);
pInsert->setScaleFactors(AcGeScale3d(dScale, dScale, dScale));
}
else
{
pInsert->setScaleFactors(scale);
}
}
////////////////////////////////////////////
// 方格的样式
//TArch5\6,1;TArch7,2
const Adesk::UInt8 GridStyle::g_nVersion = 2;
GridStyle::GridStyle()
{
m_nOverride = 0; //override parent's style (none)
m_nHorMode = AcDb::kTextLeft; // Specifies the horizontal text alignment
m_nVerMode = AcDb::kTextBase;
// AcDbHardPointerId m_idTextStyle; // Font
m_nTextColor = 0; //Controls the foreground(Text) color
m_bTextWrap = true; // Word wraps cell text when true
m_nLineSpaceFactor = LSF_DEFAULT; //自动换行时的行距系数(行距=系数*字高)
m_nTextHeight = 3.0;
m_nTextDirection = kRight;
}
GridStyle::GridStyle(const GridStyle &src)
{
*this = src;
}
GridStyle &
GridStyle::operator = (const GridStyle &src)
{
GlobalFunc::CopyObject(src, *this);
return *this;
}
Acad::ErrorStatus GridStyle::dwgInFields(AcDbDwgFiler* pFiler)
{
Adesk::UInt8 nVer = 0;
pFiler->readItem(&nVer);
if (nVer > g_nVersion) // Version is too new
return Acad::eMakeMeProxy;
pFiler->readItem(&m_nOverride);
if (m_nOverride & OF_HORMODE) {
Adesk::UInt8 align;
pFiler->readItem(&align);
m_nHorMode = (AcDb::TextHorzMode)align;
}
if (m_nOverride & OF_VERMODE) {
Adesk::UInt8 align;
pFiler->readItem(&align);
m_nVerMode = (AcDb::TextVertMode)align;
}
if (m_nOverride & OF_TEXTSTYLE) {
pFiler->readItem(&m_idTextStyle);
}
if (m_nOverride & OF_TEXTCOLOR) {
pFiler->readItem(&m_nTextColor);
}
if (m_nOverride & OF_TEXTWRAP) {
pFiler->readItem(&m_bTextWrap);
}
if (m_nOverride & OF_LINESPACE) {
pFiler->readItem(&m_nLineSpaceFactor);
}
if (m_nOverride & OF_TEXTHEIGHT) {
pFiler->readItem(&m_nTextHeight);
}
if (nVer > 1)
{
Adesk::UInt8 nDirection;
pFiler->readItem(&nDirection);
m_nTextDirection = (TextDirection)nDirection;
}
return pFiler->filerStatus();
}
Acad::ErrorStatus GridStyle::dwgOutFields(AcDbDwgFiler* pFiler) const
{
//if (g_nSaveTArchVer < 7)
// pFiler->writeItem((Adesk::UInt8)1);
//else
pFiler->writeItem(g_nVersion);
pFiler->writeItem(m_nOverride);
if (m_nOverride & OF_HORMODE)
pFiler->writeItem((Adesk::UInt8)m_nHorMode);
if (m_nOverride & OF_VERMODE)
pFiler->writeItem((Adesk::UInt8)m_nVerMode);
if (m_nOverride & OF_TEXTSTYLE)
pFiler->writeItem(m_idTextStyle);
if (m_nOverride & OF_TEXTCOLOR)
pFiler->writeItem(m_nTextColor);
if (m_nOverride & OF_TEXTWRAP)
pFiler->writeItem(m_bTextWrap);
if (m_nOverride & OF_LINESPACE)
pFiler->writeItem(m_nLineSpaceFactor);
if (m_nOverride & OF_TEXTHEIGHT)
pFiler->writeItem(m_nTextHeight);
//if (g_nSaveTArchVer > 6)
pFiler->writeItem((Adesk::UInt8)m_nTextDirection);
return pFiler->filerStatus();
}
void GridStyle::SetOverrideAll(BOOL bTrue)
{
if (bTrue) m_nOverride = (OF_HORMODE | OF_VERMODE | OF_TEXTSTYLE | OF_TEXTCOLOR |
OF_TEXTWRAP | OF_LINESPACE | OF_TEXTHEIGHT);
else m_nOverride = 0;
}
void GridStyle::SetFlagBit(int nFlag, BOOL bSet)
{
if (bSet) {
m_nOverride |= nFlag;
}
else {
m_nOverride &= ~nFlag;
}
}
void GridStyle::SetTextStyleId(AcDbObjectId id)
{
m_idTextStyle = id;
}
void GridStyle::SetTextColor(Adesk::UInt16 nColor)
{
m_nTextColor = nColor;
}
void GridStyle::SetTextWrap(BOOL bTrue)
{
m_bTextWrap = bTrue;
}
void GridStyle::SetLineSpaceFactor(double nFactor)
{
m_nLineSpaceFactor = nFactor;
}
void GridStyle::SetTextHeight(double h)
{
m_nTextHeight = h;
}
BOOL GridStyle::TestFlagBit(int nFlag) const
{
return ((m_nOverride & nFlag) != 0);
}
AcDbObjectId GridStyle::GetTextStyleId() const
{
return m_idTextStyle;
}
Adesk::UInt16 GridStyle::GetTextColor() const
{
return m_nTextColor;
}
BOOL GridStyle::IsTextWrap() const
{
return m_bTextWrap;
}
double GridStyle::GetLineSpaceFactor() const
{
return m_nLineSpaceFactor;
}
double GridStyle::GetTextHeight() const
{
return m_nTextHeight;
}
void GridStyle::SetVerMode(AcDb::TextVertMode nVerMode)
{
m_nVerMode = nVerMode;
}
void GridStyle::SetHorMode(AcDb::TextHorzMode nHorMode)
{
m_nHorMode = nHorMode;
}
AcDb::TextHorzMode
GridStyle::GetHorMode() const
{
return m_nHorMode;
}
AcDb::TextVertMode
GridStyle::GetVerMode() const
{
return m_nVerMode;
}
/////////////////////////////////////
// 分割线样式
const Adesk::UInt8 DividerStyle::g_nVersion = 1;
DividerStyle::DividerStyle()
{
m_nFlag = kParent;
m_nColor = 0;
//AcDbHardPointerId m_idLineType; //线型
m_nLineWidth = 0.0; //线宽
}
DividerStyle::DividerStyle(const DividerStyle &src)
{
*this = src;
}
DividerStyle &
DividerStyle::operator= (const DividerStyle &src)
{
GlobalFunc::CopyObject(src, *this);
return *this;
}
Acad::ErrorStatus DividerStyle::dwgInFields(AcDbDwgFiler* pFiler)
{
Adesk::UInt8 nVer = 0;
pFiler->readItem(&nVer);
if (nVer > g_nVersion) // Version is too new
return Acad::eMakeMeProxy;
Adesk::UInt8 nTemp;
pFiler->readItem(&nTemp);
m_nFlag = (TDividerFlag)nTemp;
if (m_nFlag == DividerStyle::kLocal) {
pFiler->readItem(&m_nColor);
pFiler->readItem(&m_idLineType);
pFiler->readItem(&m_nLineWidth);
}
return pFiler->filerStatus();
}
Acad::ErrorStatus DividerStyle::dwgOutFields(AcDbDwgFiler* pFiler) const
{
pFiler->writeItem(g_nVersion);
pFiler->writeItem((Adesk::UInt8)m_nFlag);
if (m_nFlag == DividerStyle::kLocal) {
pFiler->writeItem(m_nColor);
pFiler->writeItem(m_idLineType);
pFiler->writeItem(m_nLineWidth);
}
return pFiler->filerStatus();
}
DividerStyle::TDividerFlag
DividerStyle::GetDividerFlag() const
{
return m_nFlag;
}
double
DividerStyle::GetLineWidth() const
{
return m_nLineWidth;
}
AcDbObjectId
DividerStyle::GetLineTypeId() const
{
return m_idLineType;
}
Adesk::UInt16
DividerStyle::GetColor() const
{
return m_nColor;
}
void
DividerStyle::SetDividerFlag(TDividerFlag flag)
{
m_nFlag = flag;
}
void
DividerStyle::SetLineWidth(double nWidth)
{
m_nLineWidth = nWidth;
}
void
DividerStyle::SetLineTypeId(AcDbObjectId id)
{
m_idLineType = id;
}
void
DividerStyle::SetColor(Adesk::UInt16 nColor)
{
m_nColor = nColor;
}
////////////////////////////////
// 列定义
const Adesk::UInt8 SheetColumn::g_nVersion = 1;
SheetColumn::SheetColumn()
{
//m_gridStyle.m_nOverride = 0;
m_divider.m_nFlag = DividerStyle::kParent; // Divider style for right column border
m_bAllowSizing = true; // Enables interactive resizing for a column
m_nWidth = 0.0; //in Paper Unit
}
SheetColumn::SheetColumn(const SheetColumn &src)
{
*this = src;
}
SheetColumn &
SheetColumn::operator= (const SheetColumn &src)
{
GlobalFunc::CopyObject(src, *this);
return *this;
}
BOOL SheetColumn::IsValid() const
{
return (m_nWidth > 0.0);
}
Acad::ErrorStatus SheetColumn::dwgInFields(AcDbDwgFiler* pFiler)
{
Adesk::UInt8 nVer = 0;
pFiler->readItem(&nVer);
if (nVer > g_nVersion) // Version is too new
return Acad::eMakeMeProxy;
Acad::ErrorStatus es = m_gridStyle.dwgInFields(pFiler);
if (es != Acad::eOk)
return es;
es = m_divider.dwgInFields(pFiler);
if (es != Acad::eOk)
return es;
pFiler->readItem(&m_bAllowSizing);
pFiler->readItem(&m_nWidth);
return pFiler->filerStatus();
}
Acad::ErrorStatus SheetColumn::dwgOutFields(AcDbDwgFiler* pFiler) const
{
pFiler->writeItem(g_nVersion);
VERIFY(m_gridStyle.dwgOutFields(pFiler) == Acad::eOk);
VERIFY(m_divider.dwgOutFields(pFiler) == Acad::eOk);
pFiler->writeItem(m_bAllowSizing);
pFiler->writeItem(m_nWidth);
return pFiler->filerStatus();
}
//图纸单位
double SheetColumn::GetWidth() const
{
return m_nWidth;
}
//图纸单位
void SheetColumn::SetWidth(double w)
{
m_nWidth = w;
}
const DividerStyle &
SheetColumn::GetDividerStyle() const
{
return m_divider;
}
DividerStyle &
SheetColumn::GetDividerStyle()
{
return m_divider;
}
const GridStyle &
SheetColumn::GetGridStyle() const
{
return m_gridStyle;
}
GridStyle &
SheetColumn::GetGridStyle()
{
return m_gridStyle;
}
BOOL
SheetColumn::AllowSizing() const
{
return m_bAllowSizing;
}
void
SheetColumn::SetAllowSizing(BOOL bTrue)
{
m_bAllowSizing = bTrue;
}
void
SheetColumn::SeDividerStyle(const DividerStyle &style)
{
GlobalFunc::CopyObject(style, m_divider);
}
void SheetColumn::SetGridStyle(const GridStyle &style)
{
GlobalFunc::CopyObject(style, m_gridStyle);
}
///////////////////////////////
// 行定义
const Adesk::UInt8 SheetRow::g_nVersion = 1;
SheetRow::SheetRow()
{
m_divider.m_nFlag = DividerStyle::kParent; // Divider style for right column border
m_nHeightFlag = SheetRow::kParent; // Disable interactive resizing for row
m_nHeight = 0.0; //in Paper Unit
m_nVerMode = AcDb::kTextBase;
}
SheetRow::SheetRow(const SheetRow &src)
{
*this = src;
}
SheetRow &
SheetRow::operator= (const SheetRow &src)
{
GlobalFunc::CopyObject(src, *this);
return *this;
}
double SheetRow::GetHeight() const
{
return m_nHeight;
}
void SheetRow::SetHeight(double h)
{
m_nHeight = h;
}
SheetRow::TRowHeightStyle SheetRow::GetRowHeightStyle() const
{
return m_nHeightFlag;
}
void SheetRow::SetRowHeightStyle(SheetRow::TRowHeightStyle st)
{
m_nHeightFlag = st;
}
const DividerStyle &
SheetRow::GetDividerStyle() const
{
return m_divider;
}
DividerStyle &
SheetRow::GetDividerStyle()
{
return m_divider;
}
void SheetRow::SeDividerStyle(const DividerStyle &src)
{
GlobalFunc::CopyObject(src, m_divider);
}
Acad::ErrorStatus SheetRow::dwgInFields(AcDbDwgFiler* pFiler)
{
Adesk::UInt8 nVer = 0;
pFiler->readItem(&nVer);
if (nVer > g_nVersion) // Version is too new
return Acad::eMakeMeProxy;
Acad::ErrorStatus es = m_divider.dwgInFields(pFiler);
if (es != Acad::eOk)
return es;
Adesk::UInt8 nTemp;
pFiler->readItem(&nTemp);
m_nHeightFlag = (TRowHeightStyle)nTemp;
pFiler->readItem(&m_nHeight);
pFiler->readItem(&nTemp);
m_nVerMode = (AcDb::TextVertMode)nTemp;
return pFiler->filerStatus();
}
Acad::ErrorStatus SheetRow::dwgOutFields(AcDbDwgFiler* pFiler) const
{
pFiler->writeItem(g_nVersion);
VERIFY(m_divider.dwgOutFields(pFiler) == Acad::eOk);
pFiler->writeItem((Adesk::UInt8)m_nHeightFlag);
pFiler->writeItem(m_nHeight);
pFiler->writeItem((Adesk::UInt8)m_nVerMode);
return pFiler->filerStatus();
}
AcDb::TextVertMode
SheetRow::GetVerMode() const
{
return m_nVerMode;
}
void
SheetRow::SetVerMode(AcDb::TextVertMode nVerMode)
{
m_nVerMode = nVerMode;
}
///////////////////////////////////
// 单元格的定义
//TArch6:1,TArch7:2
const Adesk::UInt8 GridCell::g_nVersion = 2;
GridCell::GridCell()
{
//m_gridStyle.m_nOverride=0;
m_pRange = NULL;
//m_sText;
}
GridCell::GridCell(const GridCell &src)
{
*this = src;
}
GridCell &
GridCell::operator = (const GridCell &src)
{
GlobalFunc::CopyObject(src.m_gridStyle, m_gridStyle);
m_sText = src.m_sText;
m_idBlock = src.m_idBlock;
m_pRange = src.m_pRange;
return *this;
}
Acad::ErrorStatus GridCell::dwgInFields(AcDbDwgFiler* pFiler, const DList<GridRange> *ranges)
{
Adesk::UInt8 nVer = 0;
pFiler->readItem(&nVer);
if (nVer > g_nVersion) // Version is too new
return Acad::eMakeMeProxy;
Adesk::UInt16 nRange = 0;
pFiler->readItem(&nRange);
if (nRange == 0 || !ranges)
{
m_pRange = NULL;
Acad::ErrorStatus es = m_gridStyle.dwgInFields(pFiler);
if (es != Acad::eOk)
return es;
GlobalFunc::ReadString(pFiler, m_sText);
}
else
{
DList<GridRange> *pRangeList = (DList<GridRange> *)ranges;
m_pRange = (*pRangeList)[nRange - 1];
}
if (nVer > 1)
pFiler->readItem(&m_idBlock);
return pFiler->filerStatus();
}
Acad::ErrorStatus GridCell::dwgOutFields(AcDbDwgFiler* pFiler, const DList<GridRange> *ranges) const
{
//if (g_nSaveTArchVer < 7)
// pFiler->writeItem((Adesk::UInt8)1);
//else
pFiler->writeItem(g_nVersion);
Adesk::UInt16 nRange = 0;
if (m_pRange && ranges) {
DList<GridRange> *pRangeList = (DList<GridRange> *)ranges;
if (pRangeList->FindNode(m_pRange, CompareRange)) {
nRange = pRangeList->CurPosition() + 1;
}
}
pFiler->writeItem(nRange);
if (nRange == 0) {
VERIFY(m_gridStyle.dwgOutFields(pFiler) == Acad::eOk);
pFiler->writeString(m_sText);
}
//if (g_nSaveTArchVer > 6)
pFiler->writeItem(m_idBlock);
return pFiler->filerStatus();
}
BOOL GridCell::IsRange() const
{
return (m_pRange != NULL);
}
const GridStyle &
GridCell::GetGridStyle() const
{
if (m_pRange)
return m_pRange->GetGridStyle();
return m_gridStyle;
}
GridStyle &
GridCell::GetGridStyle()
{
if (m_pRange)
return m_pRange->GetGridStyle();
return m_gridStyle;
}
const TCHAR *GridCell::GetText() const
{
if (m_pRange)
return m_pRange->GetText();
return (const TCHAR *)m_sText;
}
void GridCell::SetText(const TCHAR *szText)
{
if (m_pRange)
m_pRange->SetText(szText);
m_sText = szText;
CellBlockInsert insert;
if (insert.ParserDesc(m_sText))
m_idBlock = InitBlock(insert.m_sBlockName);
else
m_idBlock = AcDbObjectId::kNull;
}
const GridRange *
GridCell::GetRange() const
{
return m_pRange;
}
void GridCell::SetGridStyle(const GridStyle &style)
{
if (m_pRange)
m_pRange->SetGridStyle(style);
GlobalFunc::CopyObject(style, m_gridStyle);
}
void GridCell::SetRange(GridRange *pRange)
{
m_pRange = pRange;
}
///////////////////////////////////
// 合并单元格的定义
// Modify on 2003/6/24,8位整数上升到16位整数
const Adesk::UInt8 GridRange::g_nVersion = 2;
GridRange::GridRange()
{
//m_gridStyle.m_nOverride=0;
m_nRow = m_nColumn = -1;
m_nRowMax = m_nColumnMax = -1;
//m_sText;
}
GridRange::GridRange(const GridRange &src)
{
*this = src;
}
GridRange &
GridRange::operator = (const GridRange &src)
{
GlobalFunc::CopyObject(src, *this);
SetRange((GridRange *)src.GetRange());
return *this;
}
BOOL GridRange::IsValid() const
{
BOOL bRet = (m_nRow >= 0 && m_nColumn >= 0);
bRet = (bRet && (m_nRowMax >= m_nRow && m_nColumnMax >= m_nColumn));
return bRet;
}
BOOL GridRange::IsCellar() const
{
return (m_nRow == m_nRowMax && m_nColumn == m_nColumnMax);
}
Acad::ErrorStatus GridRange::dwgInFields(AcDbDwgFiler* pFiler)
{
Acad::ErrorStatus es = GridCell::dwgInFields(pFiler);
if (es != Acad::eOk)
return es;
Adesk::UInt8 nVer = 0;
pFiler->readItem(&nVer);
if (nVer > g_nVersion) // Version is too new
return Acad::eMakeMeProxy;
//Acad::ErrorStatus es=m_gridStyle.dwgInFields(pFiler);
//if(es!=Acad::eOk)
// return es;
//ReadString(pFiler, m_sText);
if (nVer < 2) {
Adesk::UInt8 a1 = 0, a2 = 0, a3 = 0, a4 = 0;
pFiler->readItem(&a1);
pFiler->readItem(&a2);
pFiler->readItem(&a3);
pFiler->readItem(&a4);
m_nRow = a1;
m_nColumn = a2;
m_nRowMax = a3;
m_nColumnMax = a4;
}
else {
pFiler->readItem(&m_nRow);
pFiler->readItem(&m_nColumn);
pFiler->readItem(&m_nRowMax);
pFiler->readItem(&m_nColumnMax);
}
return pFiler->filerStatus();
}
Acad::ErrorStatus GridRange::dwgOutFields(AcDbDwgFiler* pFiler) const
{
VERIFY(GridCell::dwgOutFields(pFiler) == Acad::eOk);
//VERIFY(m_gridStyle.dwgOutFields(pFiler)==Acad::eOk);
//pFiler->writeString(m_sText);
//if (g_nSaveTArchVer == 5) {
// ASSERT(m_nRowMax <= 256 && m_nColumnMax <= 256);
// pFiler->writeItem((Adesk::UInt8)1);
// pFiler->writeItem((Adesk::UInt8)m_nRow);
// pFiler->writeItem((Adesk::UInt8)m_nColumn);
// pFiler->writeItem((Adesk::UInt8)m_nRowMax);
// pFiler->writeItem((Adesk::UInt8)m_nColumnMax);
//}
//else {
pFiler->writeItem(g_nVersion);
pFiler->writeItem(m_nRow);
pFiler->writeItem(m_nColumn);
pFiler->writeItem(m_nRowMax);
pFiler->writeItem(m_nColumnMax);
//}
return pFiler->filerStatus();
}
/*
const TCHAR *GridRange::GetText() const
{
return (const TCHAR *)m_sText;
}
*/
int GridRange::GetCoord(BOOL bIsRow) const
{
return (bIsRow ? m_nRow : m_nColumn);
}
int GridRange::GetCoordMax(BOOL bIsRow) const
{
return (bIsRow ? m_nRowMax : m_nColumnMax);
}
/*
void GridRange::SetText(const TCHAR *szText)
{
m_sText=szText;
}
*/
void GridRange::SetCoord(int nRow, int nCol)
{
m_nRow = nRow;
m_nColumn = nCol;
}
void GridRange::SetCoordMax(int nRow, int nCol)
{
m_nRowMax = nRow;
m_nColumnMax = nCol;
}
BOOL GridRange::Include(int nRow, int nCol) const
{
BOOL bRet = (nRow >= m_nRow && nRow <= m_nRowMax &&
nCol >= m_nColumn && nCol <= m_nColumnMax);
return bRet;
}
////////////////////////////////////
// 标题的定义
const Adesk::UInt8 SheetTitle::g_nVersion = 1;
SheetTitle::SheetTitle()
{
//XString m_sText;
m_gridStyle.SetFlagBit(OF_HORMODE | OF_TEXTHEIGHT, TRUE);
m_gridStyle.SetHorMode(AcDb::kTextCenter);
SetVerMode(AcDb::kTextVertMid);
m_bVisibility = TRUE;
//m_gridStyle.m_nOverride=0;
}
SheetTitle::SheetTitle(const SheetTitle &src)
{
*this = src;
}
SheetTitle &
SheetTitle::operator = (const SheetTitle &src)
{
GlobalFunc::CopyObject(src, *this);
return *this;
}
BOOL SheetTitle::IsVisible() const
{
return (m_bVisibility != 0);
}
void SheetTitle::SetVisible(BOOL bTrue)
{
m_bVisibility = bTrue;
}
Acad::ErrorStatus SheetTitle::dwgInFields(AcDbDwgFiler* pFiler)
{
Acad::ErrorStatus es = SheetRow::dwgInFields(pFiler);
if (es != Acad::eOk)
return es;
es = GridCell::dwgInFields(pFiler);
if (es != Acad::eOk)
return es;
Adesk::UInt8 nVer = 0;
pFiler->readItem(&nVer);
if (nVer > g_nVersion) // Version is too new
return Acad::eMakeMeProxy;
//VERIFY(m_gridStyle.dwgInFields(pFiler)==Acad::eOk);
//ReadString(pFiler, m_sText);
pFiler->readItem(&m_bVisibility);
return pFiler->filerStatus();
}
Acad::ErrorStatus SheetTitle::dwgOutFields(AcDbDwgFiler* pFiler) const
{
VERIFY(SheetRow::dwgOutFields(pFiler) == Acad::eOk);
VERIFY(GridCell::dwgOutFields(pFiler) == Acad::eOk);
pFiler->writeItem(g_nVersion);
//VERIFY(m_gridStyle.dwgOutFields(pFiler)==Acad::eOk);
//pFiler->writeString(m_sText);
pFiler->writeItem(m_bVisibility);
return pFiler->filerStatus();
}
/////////////////////////////////////////////////////////////
// 表格对象类
/////////////////////////////////////////////////////////////
// TArch5, T6Bet2:ver=2;T6B3:nVer=3, nVer=4
const Adesk::UInt8 CDbSheet::g_nVersion = 4;
ACRX_DXF_DEFINE_MEMBERS(CDbSheet, AecXDbEntityBaseEx, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
1, AEC_ZT_SHEET, "AEC_SHEET图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
CDbSheet::CDbSheet()
{
m_rowHeightStyle = SheetRow::kFixed;
m_gridStyle.SetOverrideAll(TRUE); //标准方格样式
m_border.m_nFlag = DividerStyle::kLocal; //表格外框的分割线样式
m_rowDivider.m_nFlag = DividerStyle::kLocal; //表格内部分割线样式
m_colDivider.m_nFlag = DividerStyle::kLocal;
//SheetTitle m_title; //标题
//DList<SheetColumn> m_columns; //列
//DList<SheetRow> m_rows; //行
//DList<GridCell> m_ranges; //单元格
m_pCells = NULL;
m_nRowHeight = 0.0; //标准行高
//表格本身的定位方式, 左上, 右上, 左下, 右下, 中间
m_nAlignment = AcGiDraw::kTopLeft;
//XPoint m_ptLocation; //定位点
m_nRotation = 0.0;
}
CDbSheet::~CDbSheet()
{
if (m_pCells)
delete[] m_pCells;
}
void CDbSheet::InitSheet(int nRow, int nCol, double nRowHeight, double nColWidth)
{
ASSERT(nRow > 0 && nCol > 0);
if (m_pCells)
delete[] m_pCells;
m_pCells = new GridCell[nRow * nCol];
m_columns.Reset();
m_rows.Reset();
m_ranges.Reset();
m_nRowHeight = nRowHeight;
for (int i = 0; i < nCol; i++) {
SheetColumn *pCol = new SheetColumn;
pCol->SetWidth(nColWidth);
pCol->SetGridStyle(m_gridStyle);
//pCol->SeDividerStyle(m_colDivider);
m_columns.Append(pCol);
}
for (i = 0; i < nRow; i++) {
SheetRow *pRow = new SheetRow;
pRow->SetHeight(nRowHeight);
pRow->SetVerMode(m_gridStyle.GetVerMode());
//pRow->SeDividerStyle(m_rowDivider);
m_rows.Append(pRow);
}
}
BOOL CDbSheet::IsValid() const
{
return (m_nRowHeight > 0.0 && m_rows.Length() && m_columns.Length());
}
// 提供对格式刷的支持
void CDbSheet::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag)
{
assertWriteEnabled();
AecXDbEntityBaseEx::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
CDbSheet *pSrc = CDbSheet::cast(pSrcEntity);
if (pSrc) {
m_gridStyle = pSrc->m_gridStyle; //标准方格样式
m_border = pSrc->m_border; //表格外框的分割线样式
m_rowDivider = pSrc->m_rowDivider; //行分割线样式
m_colDivider = pSrc->m_colDivider; //列分割线样式
m_nRowHeight = pSrc->m_nRowHeight; //标准行高
//表格本身的定位方式, 左上, 右上, 左下, 右下, 中间
m_nAlignment = pSrc->m_nAlignment;
// TArch6
m_rowHeightStyle = pSrc->m_rowHeightStyle;
}
}
// 从DWG读入数据:
Acad::ErrorStatus CDbSheet::dwgInFields(AcDbDwgFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dwgInFields(pFiler);
if (es != Acad::eOk) return es;
Adesk::UInt8 nVer;
pFiler->readItem(&nVer);
if (nVer > g_nVersion) {// Version is too new
return Acad::eMakeMeProxy;
}
es = m_gridStyle.dwgInFields(pFiler);
if (es != Acad::eOk) return es;
es = m_border.dwgInFields(pFiler);
if (es != Acad::eOk) return es;
es = m_rowDivider.dwgInFields(pFiler);
if (es != Acad::eOk) return es;
if (nVer > 1) {
es = m_colDivider.dwgInFields(pFiler);
if (es != Acad::eOk) return es;
}
es = m_title.dwgInFields(pFiler);
if (es != Acad::eOk) return es;
Adesk::UInt16 nColNum = 0;
m_columns.Reset();
if (nVer > 2) {
pFiler->readItem(&nColNum);
}
else {
Adesk::UInt8 nTemp = 0;
pFiler->readItem(&nTemp);
nColNum = nTemp;
}
for (Adesk::UInt16 iCol = 0; iCol < nColNum; iCol++) {
SheetColumn *pCol = new SheetColumn;
es = pCol->dwgInFields(pFiler);
if (es != Acad::eOk) {
delete pCol;
return es;
}
m_columns.Append(pCol);
}
m_rows.Reset();
Adesk::UInt16 nRowNum = 0;
if (nVer > 2) {
pFiler->readItem(&nRowNum);
}
else {
Adesk::UInt8 nTemp = 0;
pFiler->readItem(&nTemp);
nRowNum = nTemp;
}
for (Adesk::UInt16 iRow = 0; iRow < nRowNum; iRow++) {
SheetRow *pRow = new SheetRow;
es = pRow->dwgInFields(pFiler);
if (es != Acad::eOk) {
delete pRow;
return es;
}
m_rows.Append(pRow);
}
// 合并格
m_ranges.Reset();
Adesk::UInt16 nRangeNum;
pFiler->readItem(&nRangeNum);
for (Adesk::UInt16 iRange = 0; iRange < nRangeNum; iRange++) {
GridRange *pRange = new GridRange;
es = pRange->dwgInFields(pFiler);
if (es != Acad::eOk) {
delete pRange;
return es;
}
m_ranges.Append(pRange);
}
//单元格
if (m_pCells)
delete[] m_pCells;
ASSERT(nRowNum > 0 && nColNum > 0);
Adesk::UInt16 nCellNum = nRowNum * nColNum;
m_pCells = new GridCell[nCellNum];
for (Adesk::UInt16 iCell = 0; iCell < nCellNum; iCell++) {
es = m_pCells[iCell].dwgInFields(pFiler, &m_ranges);
if (es != Acad::eOk)
return es;
}
pFiler->readItem(&m_nRowHeight);
Adesk::UInt8 nAlign;
pFiler->readItem(&nAlign);
m_nAlignment = (AcGiDraw::TextAlignment)nAlign;
pFiler->readItem((AcGePoint3d *)&m_ptLocation);
m_ptLocation.z = 0;
pFiler->readItem(&m_nRotation);
if (nVer >= 4) {
Adesk::UInt8 nTemp;
pFiler->readItem(&nTemp);
m_rowHeightStyle = (SheetRow::TRowHeightStyle)nTemp;
}
return pFiler->filerStatus();
}
Acad::ErrorStatus CDbSheet::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dwgOutFields(pFiler);
if (es != Acad::eOk) return es;
//if (g_nSaveTArchVer == 5)
// pFiler->writeItem((Adesk::UInt8)2);
//else
pFiler->writeItem(g_nVersion);
VERIFY(m_gridStyle.dwgOutFields(pFiler) == Acad::eOk);
VERIFY(m_border.dwgOutFields(pFiler) == Acad::eOk);
VERIFY(m_rowDivider.dwgOutFields(pFiler) == Acad::eOk);
VERIFY(m_colDivider.dwgOutFields(pFiler) == Acad::eOk);
VERIFY(m_title.dwgOutFields(pFiler) == Acad::eOk);
Adesk::UInt16 nColNum = m_columns.Length();
//if (g_nSaveTArchVer == 5) {
// ASSERT(nColNum <= 256);
// pFiler->writeItem((Adesk::UInt8)nColNum);
//}
//else
pFiler->writeItem(nColNum);
for (Adesk::UInt16 iCol = 0; iCol < nColNum; iCol++) {
VERIFY(m_columns[iCol].dwgOutFields(pFiler) == Acad::eOk);
}
Adesk::UInt16 nRowNum = m_rows.Length();
//if (g_nSaveTArchVer == 5) {
// ASSERT(nRowNum <= 256);
// pFiler->writeItem((Adesk::UInt8)nRowNum);
//}
//else
pFiler->writeItem(nRowNum);
for (Adesk::UInt16 iRow = 0; iRow < nRowNum; iRow++) {
VERIFY(m_rows[iRow].dwgOutFields(pFiler) == Acad::eOk);
}
Adesk::UInt16 nRangeNum = m_ranges.Length();
pFiler->writeItem(nRangeNum);
for (Adesk::UInt16 iRange = 0; iRange < nRangeNum; iRange++) {
VERIFY(m_ranges[iRange].dwgOutFields(pFiler) == Acad::eOk);
}
Adesk::UInt16 nCellNum = nRowNum * nColNum;
for (Adesk::UInt16 iCell = 0; iCell < nCellNum; iCell++) {
VERIFY(m_pCells[iCell].dwgOutFields(pFiler, &m_ranges) == Acad::eOk);
}
pFiler->writeItem(m_nRowHeight);
pFiler->writeItem((Adesk::UInt8)m_nAlignment);
pFiler->writeItem((const AcGePoint3d &)m_ptLocation);
pFiler->writeItem(m_nRotation);
//if (g_nSaveTArchVer != 5) {
pFiler->writeItem((Adesk::UInt8)m_rowHeightStyle);
//}
return pFiler->filerStatus();
}
Acad::ErrorStatus CDbSheet::dxfInFields(AcDbDxfFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dxfInFields(pFiler);
if (es != Acad::eOk)
return es;
if (!pFiler->atSubclassData(_T("CDbSheet"))) {
return Acad::eBadDxfSequence;
}
pFiler->writePoint2d(AcDb::kDxfXCoord, m_ptLocation.AsAcGePoint2d());
pFiler->writeString(AcDb::kDxfText, (const TCHAR *)GetTitleText());
pFiler->writeDouble(AcDb::kDxfReal, m_nRowHeight);
pFiler->writeDouble(AcDb::kDxfAngle, m_nRotation);
pFiler->writeInt16(AcDb::kDxfInt16, (Adesk::Int16)GetRowNum());
pFiler->writeInt16(AcDb::kDxfInt16 + 1, (Adesk::Int16)GetColumnNum());
pFiler->writeInt16(AcDb::kDxfInt16 + 2, (Adesk::Int16)m_nAlignment);
int fieldsFlags = 0;
XPoint pt;
XString sText;
double nHeight, nRot;
int nAlign;
resbuf rb;
while ((es == Acad::eOk)
&& ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) {
switch (rb.restype) {
case AcDb::kDxfXCoord:
pt = rb.resval.rpoint;
fieldsFlags |= 0x01;
break;
case AcDb::kDxfText:
sText = rb.resval.rstring;
fieldsFlags |= 0x02;
break;
case AcDb::kDxfReal:
nHeight = rb.resval.rreal;
fieldsFlags |= 0x04;
break;
case AcDb::kDxfAngle:
nRot = rb.resval.rreal;
fieldsFlags |= 0x08;
break;
case AcDb::kDxfInt16:
fieldsFlags |= 0x10;
break;
case AcDb::kDxfInt16 + 1:
fieldsFlags |= 0x20;
break;
case AcDb::kDxfInt16 + 2:
fieldsFlags |= 0x40;
nAlign = rb.resval.rint;
break;
//fall through intentional
default:
// An unrecognized group. Push it back so that
// the subclass can read it again.
pFiler->pushBackItem();
es = Acad::eEndOfFile;
break;
}
}
if (es != Acad::eEndOfFile)
return Acad::eInvalidResBuf;
if (fieldsFlags & 0x01)
m_ptLocation = pt;
if (fieldsFlags & 0x02)
SetTitleText(sText);
if (fieldsFlags & 0x04)
m_nRowHeight = nHeight;
if (fieldsFlags & 0x08)
m_nRotation = nRot;
if (fieldsFlags & 0x40)
m_nAlignment = (AcGiDraw::TextAlignment)nAlign;
return pFiler->filerStatus();
}
Acad::ErrorStatus CDbSheet::dxfOutFields(AcDbDxfFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = pFiler->writeItem(AcDb::kDxfSubclass, _T("CDbSheet"));
assert(es == Acad::eOk);
pFiler->writePoint2d(AcDb::kDxfXCoord, m_ptLocation.AsAcGePoint2d());
pFiler->writeString(AcDb::kDxfText, (const TCHAR *)GetTitleText());
pFiler->writeDouble(AcDb::kDxfReal, m_nRowHeight);
pFiler->writeDouble(AcDb::kDxfAngle, m_nRotation);
pFiler->writeInt16(AcDb::kDxfInt16, (Adesk::Int16)GetRowNum());
pFiler->writeInt16(AcDb::kDxfInt16 + 1, (Adesk::Int16)GetColumnNum());
pFiler->writeInt16(AcDb::kDxfInt16 + 2, (Adesk::Int16)m_nAlignment);
return es;
}
// -----------------------------------------------------------------------
// Overriden functions for edit
// to do:
// 允许通过夹点改变边界
Acad::ErrorStatus CDbSheet::subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
assertReadEnabled();
gripPoints.append(m_ptLocation); //0
XPoint ptTopLeft = GetTopLeft(FALSE);
XPoint ext = GetExtents(FALSE, FALSE);
XPoint ptBotRight;
double nRotWcs = Layout2Wcs(m_nRotation);
ads_polar(ptTopLeft, nRotWcs - PI / 2, ext.y, ptBotRight);
ads_polar(XPoint(ptBotRight), nRotWcs, ext.x, ptBotRight);
gripPoints.append(ptBotRight); //1
int nColNum = GetColumnNum();
for (int iCol = 0; iCol < nColNum; iCol++) {
const SheetColumn &column = m_columns[iCol];
if (column.AllowSizing()) {
double nWidth = GetColumnsWidth(0, iCol, FALSE);
XPoint pt;
ads_polar(ptTopLeft, nRotWcs, nWidth, pt);
gripPoints.append(pt);
}
}
int nRowNum = GetRowNum();
for (int iRow = 0; iRow < nRowNum; iRow++) {
const SheetRow &row = m_rows[iRow];
if (row.GetRowHeightStyle() == SheetRow::kFree ||
row.GetRowHeightStyle() == SheetRow::kAtLeast ||
(row.GetRowHeightStyle() == SheetRow::kParent &&
(m_rowHeightStyle == SheetRow::kFree || m_rowHeightStyle == SheetRow::kAtLeast))
) {
double nHeight = GetRowsHeight(0, iRow, FALSE);
XPoint pt;
ads_polar(ptTopLeft, nRotWcs - PI / 2, nHeight, pt);
gripPoints.append(pt);
}
}
return Acad::eOk;
}
// stretch points is diffrent from grep points, with no midpoint included
Acad::ErrorStatus CDbSheet::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const
{
assertReadEnabled();
AcDbIntArray osnapModes;
AcDbIntArray geomIds;
return subGetGripPoints(stretchPoints, osnapModes, geomIds);
}
// Active when being rotated, scaled, moved, etc.
// Scale is disabled here
Acad::ErrorStatus CDbSheet::subTransformBy(const AcGeMatrix3d& xform)
{
assertWriteEnabled();
AcDbEntity::subTransformBy(xform);
ads_matrix mat;
GlobalFunc::AsAdsMatrix(xform, mat);
if (!g_Option::instance().g_bLayoutRotate) {
AcGeVector3d vt(cos(m_nRotation), sin(m_nRotation), 0.0);
vt.transformBy(xform);
m_nRotation = ads_angle(XPoint(), XPoint(vt[0], vt[1]));
}
m_ptLocation.TransformBy(mat);
return Acad::eOk;
}
// 功能: 夹点操作
Acad::ErrorStatus CDbSheet::subMoveGripPointsAt(
const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
XPoint vtOffset(offset[0], offset[1]);
if (indices.length() > 1) {
m_ptLocation += vtOffset;
return Acad::eOk;
}
double nRotWcs = Layout2Wcs(m_nRotation);
int idx = indices[0];
if (idx == 0) {
m_ptLocation += vtOffset;
}
else if (idx == 1) {
XVector3D vtRight(cos(nRotWcs), sin(nRotWcs));
XVector3D vtBot(cos(nRotWcs - PI / 2), sin(nRotWcs - PI / 2));
//double nWidthInc = (vtRight & vtOffset);
//double nHeightInc = (vtBot & vtOffset);
double nWidthInc = GlobalFunc::operator&(vtRight, vtOffset);
double nHeightInc = GlobalFunc::operator&(vtBot, vtOffset);
BOOL bIncTitle = m_title.IsVisible();
XPoint ptTopLeft = GetTopLeft(bIncTitle);
XPoint ext = GetExtents(bIncTitle, FALSE);
double xRatio = nWidthInc / ext.x + 1.0;
double yRatio = nHeightInc / ext.y + 1.0;
int nColNum = GetColumnNum();
for (int iCol = 0; iCol < nColNum; iCol++) {
SheetColumn &column = *m_columns[iCol];
column.m_nWidth *= xRatio;
column.m_gridStyle.m_nTextHeight *= yRatio;
}
m_gridStyle.m_nTextHeight *= yRatio;
int nRowNum = GetRowNum();
for (int iRow = 0; iRow < nRowNum; iRow++) {
SheetRow &row = *m_rows[iRow];
row.m_nHeight *= yRatio;
for (iCol = 0; iCol < nColNum; iCol++) {
GridCell *pCell = (*this)(iRow, iCol);
//GridStyle gridStyle;
//GlobalFunc::CopyObject(pCell->GetGridStyle(), gridStyle);
pCell->m_gridStyle.m_nTextHeight *= yRatio;
//pCell->SetGridStyle(gridStyle);
}
}
for (int n = 0; n < m_ranges.Length(); n++)
m_ranges[n]->m_gridStyle.m_nTextHeight *= yRatio;
m_nRowHeight *= yRatio;
m_title.m_nHeight *= yRatio;
m_title.m_gridStyle.m_nTextHeight *= yRatio;
}
else {
XVector3D vt(cos(nRotWcs), sin(nRotWcs));
//double nWidth = (vt & vtOffset);
double nWidth = GlobalFunc::operator&(vt, vtOffset);
int nColNum = GetColumnNum();
int iVert = 1;
for (int iCol = 0; iCol < nColNum; iCol++) {
SheetColumn &column = *m_columns[iCol];
if (column.AllowSizing()) {
iVert++;
if (idx == iVert) {
if (column.GetWidth() * GetPScale() + nWidth < g_Option::instance()._DIST_SNAP) { //Delete column
RemoveColumn(iCol);
}
else {
column.SetWidth(column.GetWidth() + nWidth / GetPScale());
CalculateRowHeight(0, GetRowNum() - 1);
}
return Acad::eOk;
}
}
}
XVector3D vt1(cos(nRotWcs - PI / 2), sin(nRotWcs - PI / 2));
//double nHeight = (vt1 & vtOffset);
double nHeight = GlobalFunc::operator&(vt1, vtOffset);
int nRowNum = GetRowNum();
for (int iRow = 0; iRow < nRowNum; iRow++) {
SheetRow &row = *m_rows[iRow];
if (row.GetRowHeightStyle() == SheetRow::kFree ||
row.GetRowHeightStyle() == SheetRow::kAtLeast ||
(row.GetRowHeightStyle() == SheetRow::kParent &&
(m_rowHeightStyle == SheetRow::kFree || m_rowHeightStyle == SheetRow::kAtLeast))
) {
iVert++;
if (idx == iVert) {
if (row.GetHeight() * GetPScale() + nHeight < g_Option::instance()._DIST_SNAP)
RemoveRow(iRow);
else {
double h = row.GetHeight() + nHeight / GetPScale();
if (row.GetRowHeightStyle() == SheetRow::kAtLeast ||
(row.GetRowHeightStyle() == SheetRow::kParent &&
m_rowHeightStyle == SheetRow::kAtLeast)
) {
if (h > GetRowHeight(TRUE))
row.SetHeight(h);
else
row.SetHeight(GetRowHeight(TRUE));
}
else
row.SetHeight(h);
}
return Acad::eOk;
}
}
}
}
return Acad::eOk;
}
// 功能: 夹点操作
Acad::ErrorStatus CDbSheet::subMoveStretchPointsAt(
const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
return subMoveGripPointsAt(indices, offset);
}
// 取得夹点说明
Acad::ErrorStatus CDbSheet::GetGripText(int i, CString &cs) const
{
Acad::ErrorStatus es = Acad::eOk;
if (i == 0) {
cs = _T("移动表格");
}
else if (i == 1) {
cs = _T("角点缩放");
}
else {
int nColNum = GetColumnNum();
int iVert = 1;
for (int iCol = 0; iCol < nColNum; iCol++) {
const SheetColumn &column = m_columns[iCol];
if (column.AllowSizing()) {
iVert++;
if (i == iVert) {
cs.Format(_T("移动第%d列"), iCol + 1);
return Acad::eOk;
}
}
}
int nRowNum = GetRowNum();
for (int iRow = 0; iRow < nRowNum; iRow++) {
const SheetRow &row = m_rows[iRow];
if (row.GetRowHeightStyle() == SheetRow::kFree ||
row.GetRowHeightStyle() == SheetRow::kAtLeast ||
(row.GetRowHeightStyle() == SheetRow::kParent &&
(m_rowHeightStyle == SheetRow::kFree || m_rowHeightStyle == SheetRow::kAtLeast))
) {
iVert++;
if (i == iVert) {
cs.Format(_T("移动第%d行"), iRow + 1);
if (row.GetRowHeightStyle() == SheetRow::kFree ||
(row.GetRowHeightStyle() == SheetRow::kParent &&
m_rowHeightStyle == SheetRow::kFree)
)
cs += _T("(自由移动)");
else
cs += _T("(不小于表格行高)");
return Acad::eOk;
}
}
}
}
return es;
}
DrawModeType CDbSheet::GetDrawType() const
{
return k2DOnly;
}
int CDbSheet::ConvertText(TConvertTextPtr ptr, void *pData)
{
assertWriteEnabled();
int nRow = GetRowNum();
int nCol = GetColumnNum();
int nCode = RTNONE;
XString sText;
nCode = ptr(m_title.m_sText, sText, pData);
if (nCode == RTNORM)
m_title.m_sText = sText;
for (int iRow = 0; iRow < nRow; iRow++) {
for (int iCol = 0; iCol < nCol; iCol++) {
GridCell &cell = m_pCells[iRow * nCol + iCol];
int nRet = ptr(cell.m_sText, sText, pData);
if (nRet == RTERROR)
nCode = nRet;
else if (nRet == RTNORM)
cell.m_sText = sText;
}
}
for (int i = 0; i < m_ranges.Length(); i++) {
GridRange *cell = m_ranges[i];
int nRet = ptr(cell->m_sText, sText, pData);
if (nRet == RTERROR)
nCode = nRet;
else if (nRet == RTNORM)
cell->m_sText = sText;
}
return nCode;
}
// 返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
TextPosition
CDbSheet::FindSubText(const TCHAR *sSubText, TextPosition &posStart, TextRange *pRange) const
{
TextPosition pos;
if (!sSubText || !sSubText[0])
return pos;
TextPosition posNext = posStart;
while (1) {
if ((int)posNext.m_nCookies >= (GetRowNum() * GetColumnNum() + m_ranges.Length() + 1))
break;
AecXDbText *pText = GetText(posNext.m_nCookies);
TextPosition posFind;
if (pText) {
posFind = pText->FindSubText(sSubText, posNext, pRange);
delete pText;
}
if (!posFind) {
posNext.m_nCookies++;
posNext.m_nTextPos = 0;
}
else {
posStart = posNext;
if (!posStart) {
posStart.m_nCookies++;
posStart.m_nTextPos = 0;
}
posFind.m_nCookies = posNext.m_nCookies;
pos = posFind;
break;
}
}
return pos;
}
// 返回下一次查找的开始位置
TextPosition
CDbSheet::ReplaceSubText(const TextPosition &posRep, const TCHAR *sRepText, TextRange *pRange)
{
assertWriteEnabled();
TextPosition posNext;
AecXDbText *pText = GetText(posRep.m_nCookies);
if (!pText)
return posNext;
posNext = pText->ReplaceSubText(posRep, sRepText, pRange);
int cookies = posRep.m_nCookies;
if (cookies == 0) {
SetTitleText(pText->GetText());
}
else {
cookies--;
int nRowNum = GetRowNum();
int nColNum = GetColumnNum();
if (cookies < nRowNum * nColNum) {
int nRow = cookies / nColNum;
int nCol = cookies - nRow * nColNum;
GridCell *cell = (*this)(nRow, nCol);
cell->SetText(pText->GetText());
}
else {
cookies -= nRowNum * nColNum;
if (cookies < m_ranges.Length())
m_ranges[cookies]->SetText(pText->GetText());
}
}
delete pText;
if (!posNext) {
posNext.m_nCookies = posRep.m_nCookies + 1;
posNext.m_nTextPos = 0;
}
return posNext;
}
/* * * * * * * * * * 取 动 态 属 性 显 示 数 据 的 函 数 * * * * * * * * * */
void CDbSheet::GetTips(DList<ObjInfoUnit> &lstInfo) const
{
lstInfo.Append(new ObjInfoUnit(_T("对象类型"), _T("表格")));
const TCHAR *pszTitle = m_title.IsVisible() ? _T("标题") : _T("标题(隐藏)");
lstInfo.Append(new ObjInfoUnit(pszTitle, m_title.GetText()));
XPoint ext = GetExtents(m_title.IsVisible() && m_title.GetDividerStyle().GetDividerFlag() != DividerStyle::kNone);
XString sHeight, sWidth, sRowHeight;
GlobalFunc::ftoa(ext.x, 1, sWidth);
GlobalFunc::ftoa(ext.y, 1, sHeight);
GlobalFunc::ftoa(GetRowHeight(), 1, sRowHeight);
sHeight << _T("P");
sWidth << _T("P");
sRowHeight << _T("P");
lstInfo.Append(new ObjInfoUnit(_T("标准行高"), sRowHeight));
lstInfo.Append(new ObjInfoUnit(_T("表格宽度"), sWidth));
lstInfo.Append(new ObjInfoUnit(_T("表格高度"), sHeight));
lstInfo.Append(new ObjInfoUnit(_T("行数"), XString(_T("%d"), GetRowNum())));
lstInfo.Append(new ObjInfoUnit(_T("列数"), XString(_T("%d"), GetColumnNum())));
}
Acad::ErrorStatus CDbSheet::Draw2d(AcGiDraw &dc) const
{
//TPushProperty vProp(this, dc);
//add on 20161017 图层关闭,不进行相关绘制,解决表格对象内有图块,当表格图层关闭,打印显示图块的问题。
AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead);
if (player.openStatus() == Acad::eOk && player->isOff())//对图层为空时,进行保护
{
return Acad::eOk;
}
//end add
assertReadEnabled();
int nGsMarker = 1;
//if (!objectId() && _tcsicmp(dc.Desc(), AcGiViewDraw::Descriptor()) == 0)
if (!objectId() && dc.GetCommonDraw())
nGsMarker = 0;
DrawBorder(dc, nGsMarker);
DrawTitle(dc, nGsMarker);
XPoint ptBase = GetTopLeft(FALSE);
DrawRowDivider(ptBase, dc, nGsMarker);
DrawColumnDivider(ptBase, dc, nGsMarker);
if (!!objectId())
DrawCellText(ptBase, dc, nGsMarker);
return Acad::eOk;
}
////////////////////////////////////////////////////////////////////
// 绘制表格的方法
// 绘制表格的外框
void CDbSheet::DrawBorder(AcGiDraw &dc, int &nGsMarker) const
{
AcDbPolyline pline;
XPoly2D polyBorder(1);
GetBorder(polyBorder);
GlobalFunc::PolyConvert(polyBorder, pline);
pline.setPropertiesFrom(this);
if (nGsMarker) {
dc.SetSelectionMarker(nGsMarker);
nGsMarker++;
//捕捉加速
//INT_PTR nQuickMarker = GetQuickMarker();
//if (nQuickMarker && nQuickMarker < (nGsMarker - 4) || nQuickMarker >= nGsMarker) //用于捕捉时加速
// return;
}
int nOldColor = dc.GetColor();
switch (m_border.m_nFlag) {
case DividerStyle::kLocal:
if (!!m_border.m_idLineType)
pline.setLinetype(m_border.m_idLineType);
if (m_border.m_nLineWidth > 0.0 && !!objectId())
pline.setConstantWidth(m_border.m_nLineWidth * GetPScale());
if (m_border.m_nColor > 0) {
dc.SetColor(m_border.GetColor());
pline.setColorIndex(m_border.GetColor());
}
//dc.Polyline(pline);
DrawPline(dc, pline);
break;
case DividerStyle::kParent:
//dc.Polyline(pline);
DrawPline(dc, pline);
break;
case DividerStyle::kNone:
default:
break;
}
dc.SetColor(nOldColor);
}
// 当Wrap和一行容纳不下时采用MText
void
CDbSheet::InitTextInBox(AecXDbText &text, XPoint ptTopLeft, double nBoxWidth, double nBoxHeight,
double nOffset, AcDb::TextHorzMode nHorMode, AcDb::TextVertMode nVerMode) const
{
BOOL bMText = text.isKindOf(AecXDbMText::desc());
XPoint ptAlign = ptTopLeft;
if (!bMText) {
AcGiDraw::TextAlignment align = GlobalFunc::GetTextAlignment(nHorMode, nVerMode);
switch (nHorMode) {
case AcDb::kTextLeft:
ptAlign.x += nOffset;
break;
case AcDb::kTextCenter:
case AcDb::kTextMid:
ptAlign.x += nBoxWidth / 2;
break;
case AcDb::kTextRight:
ptAlign.x += nBoxWidth;
ptAlign.x -= nOffset;
break;
default:
ptAlign.x += nOffset;
break;
}
switch (nVerMode) {
case AcDb::kTextBase:
case AcDb::kTextBottom:
ptAlign.y -= nBoxHeight;
ptAlign.y += nOffset;
if (align == AcGiDraw::kTextFit || align == AcGiDraw::kUnknown)
align = AcGiDraw::kLeft;
break;
case AcDb::kTextVertMid:
ptAlign.y -= nBoxHeight / 2;
if (align == AcGiDraw::kTextFit || align == AcGiDraw::kUnknown)
align = AcGiDraw::kMiddleLeft;
break;
case AcDb::kTextTop:
ptAlign.y -= nOffset;
if (align == AcGiDraw::kTextFit || align == AcGiDraw::kUnknown)
align = AcGiDraw::kTopLeft;
break;
default:
ASSERT(0);
}
text.SetAlignment(align);
text.SetLocation(ptAlign);
}
else {
AcGiDraw::TextAlignment align;
ptAlign.x += nOffset;
switch (nHorMode) {
case AcDb::kTextLeft:
align = AcGiDraw::kLeft;
break;
case AcDb::kTextCenter:
case AcDb::kTextMid:
align = AcGiDraw::kCenter;
break;
case AcDb::kTextRight:
align = AcGiDraw::kRight;
break;
case AcDb::kTextFit:
align = AcGiDraw::kTextFit;
break;
default:
ASSERT(0);
}
text.SetAlignment(align);
XPoint ext = text.GetExtents();
switch (nVerMode) {
case AcDb::kTextBase:
case AcDb::kTextBottom:
ptAlign.y -= nBoxHeight;
ptAlign.y += nOffset + ext.y;
break;
case AcDb::kTextVertMid:
ptAlign.y -= nBoxHeight / 2;
ptAlign.y += ext.y / 2;
break;
case AcDb::kTextTop:
ptAlign.y -= nOffset;
break;
default:
ASSERT(0);
}
text.SetLocation(ptAlign);
}
}
// 绘制标题, 包括文字和横线
// ptBase -- 标题上(IN)下(OUT)的第一左上角
void
CDbSheet::DrawTitle(AcGiDraw &dc, int &nGsMarker) const
{
if (!m_title.IsVisible())
return;
BOOL bIncludeTitle = (m_title.m_divider.m_nFlag != DividerStyle::kNone);
double nTitleHeight = GetTitleHeight(FALSE);
double nTitleWidth = GetSheetWidth(FALSE);
double nRotWcs = Layout2Wcs(m_nRotation);
//左上角为ptBase
XPoint ptBase = GetTopLeft(bIncludeTitle);
if (!bIncludeTitle)
ads_polar(XPoint(ptBase), nRotWcs + PI / 2, nTitleHeight, ptBase);
//INT_PTR nQuickMarker = GetQuickMarker();
BOOL bDrawText = TRUE;
if (nGsMarker) {
dc.SetSelectionMarker(nGsMarker);
nGsMarker++;
//捕捉时加速
//if (nQuickMarker && (nGsMarker - 1) != nQuickMarker)
// bDrawText = FALSE;
//else
bDrawText = TRUE;
}
else {
bDrawText = FALSE;
}
ads_matrix mat;
ptBase.GetRotationMatrix(nRotWcs, mat);
if (bDrawText && !!m_title.m_sText) { //绘制文字
double nOffset = GetTitleLineSpace(FALSE);
double nTextHeight = GetTitleTextHeight(TRUE);
AcDbObjectId idTextStyle = GetTitleTextStyle();
AecXDbText textLine;
textLine.setPropertiesFrom(this);
textLine.SetHeight(nTextHeight);
textLine.SetStyleId(idTextStyle);
textLine.SetText(m_title.m_sText);
const TCHAR *bHardMText = _tcschr(m_title.GetText(), _T('\n'));
AecXDbText *pDbText = NULL;
if (bHardMText ||
(textLine.GetExtents().x + nOffset * 2 > nTitleWidth && IsTitleWrapEnabled())
) {
AecXDbMText *pTextSeg = new AecXDbMText;
pDbText = pTextSeg;
pDbText->setPropertiesFrom(this);
AecXDbMText &textSeg = *pTextSeg;
textSeg.SetLineSpace(nOffset, FALSE);
textSeg.SetPageWidth(nTitleWidth - 2 * nOffset, FALSE);
}
else {
pDbText = new AecXDbText;
pDbText->setPropertiesFrom(this);
}
Adesk::UInt16 nColor = GetTitleTextColor();
int nOldColor = dc.GetColor();
if (nColor > 0) {
pDbText->setColorIndex(nColor);
dc.SetColor(nColor);
}
pDbText->SetHeight(nTextHeight);
pDbText->SetStyleId(idTextStyle);
pDbText->SetText(m_title.m_sText);
InitTextInBox(*pDbText, ptBase, nTitleWidth, nTitleHeight, nOffset,
GetTitleHorMode(), GetTitleVerMode());
XPoint ptLoc = pDbText->GetLocation();
ptLoc.TransformBy(mat);
pDbText->SetLocation(ptLoc);
pDbText->SetRotation(m_nRotation);
//if (dc.IsFullExplode())
// pDbText->ExplodeOrDraw2d(dc);
//else
//dc.DrawEntity(*pDbText);
DrawBaseEx(dc, *pDbText);
delete pDbText;
if (nColor > 0)
dc.SetColor(nOldColor);
}
ads_polar(XPoint(ptBase), nRotWcs - PI / 2, nTitleHeight, ptBase);
XPoint ptRight;
ads_polar(ptBase, nRotWcs, nTitleWidth, ptRight);
if (nGsMarker) {
dc.SetSelectionMarker(nGsMarker);
nGsMarker++;
//捕捉加速
//if (nQuickMarker && (nGsMarker - 1) != nQuickMarker)
// return;
}
int nOldColor = dc.GetColor();
AcDbPolyline pline;
pline.addVertexAt(0, ptBase);
pline.addVertexAt(1, ptRight);
pline.setPropertiesFrom(this);
const DividerStyle &divider = m_title.m_divider;
switch (divider.m_nFlag) {
case DividerStyle::kLocal:
case DividerStyle::kParent:
if (!!m_title.m_divider.m_idLineType)
pline.setLinetype(m_title.m_divider.m_idLineType);
if (m_title.m_divider.m_nLineWidth > 0.0 && !!objectId())
pline.setConstantWidth(m_title.m_divider.m_nLineWidth * GetPScale());
if (m_title.m_divider.m_nColor > 0) {
dc.SetColor(m_title.m_divider.m_nColor);
pline.setColorIndex(m_title.m_divider.m_nColor);
}
//dc.Polyline(pline);
DrawPline(dc, pline);
break;
case DividerStyle::kNone:
default:
break;
}
dc.SetColor(nOldColor);
}
// 绘制表格的行分割线
void
CDbSheet::DrawRowDivider(int nRow, XPoint ptLeft, AcGiDraw &dc) const
{
AcDbPolyline pline;
if (!InitRowDivider(pline, nRow))
return;
DList<XLine> lstSegments;
int nColNum = m_columns.Length();
double nScale = GetPScale();
XLine lnSeg;
XPoint ptFrom = ptLeft;
XPoint ptStart;
BOOL bStartValid = FALSE;
double nRotWcs = Layout2Wcs(m_nRotation);
for (int nCol = 0; nCol < nColNum; nCol++) {
const SheetColumn &column = m_columns[nCol];
double nColWidth = column.m_nWidth * nScale;
XPoint ptTo;
ads_polar(ptFrom, nRotWcs, nColWidth, ptTo);
if (HasRowDivider(nRow, nCol)) {
if (!bStartValid) {
bStartValid = TRUE;
ptStart = ptFrom;
}
if (nCol == nColNum - 1) {
lstSegments.Append(new XLine(ptStart, ptTo));
}
}
else if (bStartValid) {
lstSegments.Append(new XLine(ptStart, ptFrom));
bStartValid = FALSE;
}
ptFrom = ptTo;
}
for (int i = 0; i < lstSegments.Length(); i++) {
XLine *pLine = lstSegments[i];
if (i == 0) {
pline.addVertexAt(0, pLine->StartPoint());
pline.addVertexAt(1, pLine->EndPoint());
}
else {
pline.setPointAt(0, pLine->StartPoint());
pline.setPointAt(1, pLine->EndPoint());
}
//dc.Polyline(pline);
DrawPline(dc, pline);
}
}
// 绘制行分割线
void
CDbSheet::DrawRowDivider(XPoint ptBase, AcGiDraw &dc, int &nGsMarker) const
{
int nRowNum = m_rows.Length();
XPoint ptLeft = ptBase;
//INT_PTR nQuickMarker = GetQuickMarker();
double nRotWcs = Layout2Wcs(m_nRotation);
for (int n = 0; n < nRowNum - 1; n++) {
ads_polar(XPoint(ptLeft), nRotWcs - PI / 2, GetRowHeight(n, FALSE), ptLeft);
if (nGsMarker) {
dc.SetSelectionMarker(nGsMarker);
nGsMarker++;
//捕捉加速
//if (nQuickMarker && (nGsMarker - 1) != nQuickMarker)
// continue;//用于捕捉时加速
}
DrawRowDivider(n, ptLeft, dc);
};
}
// 绘制表格列分割线
void
CDbSheet::DrawColumnDivider(int nCol, XPoint ptTop, AcGiDraw &dc) const
{
AcDbPolyline pline;
if (!InitColumnDivider(pline, nCol))
return;
double nRotWcs = Layout2Wcs(m_nRotation);
DList<XLine> lstSegments;
int nRowNum = m_rows.Length();
double nScale = GetPScale();
XLine lnSeg;
XPoint ptFrom = ptTop;
XPoint ptStart;
BOOL bStartValid = FALSE;
for (int nRow = 0; nRow < nRowNum; nRow++) {
double nRowHeight = GetRowHeight(nRow, FALSE);
XPoint ptTo;
ads_polar(ptFrom, nRotWcs - PI / 2.0, nRowHeight, ptTo);
if (HasColumnDivider(nRow, nCol)) {
if (!bStartValid) {
bStartValid = TRUE;
ptStart = ptFrom;
}
if (nRow == nRowNum - 1) {
lstSegments.Append(new XLine(ptStart, ptTo));
}
}
else if (bStartValid) {
lstSegments.Append(new XLine(ptStart, ptFrom));
bStartValid = FALSE;
}
ptFrom = ptTo;
}
for (int i = 0; i < lstSegments.Length(); i++) {
XLine *pLine = lstSegments[i];
if (i == 0) {
pline.addVertexAt(0, pLine->StartPoint());
pline.addVertexAt(1, pLine->EndPoint());
}
else {
pline.setPointAt(0, pLine->StartPoint());
pline.setPointAt(1, pLine->EndPoint());
}
//dc.Polyline(pline);
DrawPline(dc, pline);
}
}
// 绘制表格列分割线
void
CDbSheet::DrawColumnDivider(XPoint ptBase, AcGiDraw &dc, int &nGsMarker) const
{
double nRotWcs = Layout2Wcs(m_nRotation);
int nColNum = m_columns.Length();
XPoint ptTop = ptBase;
//INT_PTR nQuickMarker = GetQuickMarker();
for (int n = 0; n < nColNum - 1; n++) {
ads_polar(XPoint(ptTop), nRotWcs, GetColumnWidth(n, FALSE), ptTop);
if (nGsMarker) {
dc.SetSelectionMarker(nGsMarker);
nGsMarker++;
//捕捉加速
//if (nQuickMarker && (nGsMarker - 1) != nQuickMarker)
// continue;//用于捕捉时加速
}
DrawColumnDivider(n, ptTop, dc);
};
}
// 绘制单元格的文本
void
CDbSheet::DrawRangeText(const GridRange &range, XPoint ptTopLeft, AcGiDraw &dc)const
{
BOOL bValid = (range.m_nRow >= 0 && range.m_nRow <= range.m_nRowMax &&
range.m_nColumn >= 0 && range.m_nColumn <= range.m_nColumnMax &&
range.m_nRowMax < GetRowNum() &&
range.m_nColumnMax < GetColumnNum());
if (!bValid)
return;
double x = GetColumnsWidth(0, range.m_nColumn - 1, FALSE);
double y = GetRowsHeight(0, range.m_nRow - 1, FALSE);
double w, h;
w = GetColumnsWidth(range.m_nColumn, range.m_nColumnMax, FALSE);
h = GetRowsHeight(range.m_nRow, range.m_nRowMax, FALSE);
double nRotWcs = Layout2Wcs(m_nRotation);
//左上角为ptBase
XPoint ptBase;
ads_polar(ptTopLeft, nRotWcs, x, ptBase);
ads_polar(XPoint(ptBase), nRotWcs - PI / 2, y, ptBase);
DrawCellText(range.GetText(), w, h, range.m_nRow, range.m_nColumn, ptBase, dc);
}
void
CDbSheet::DrawCellText(int nRow, int nCol, XPoint ptTopLeft, AcGiDraw &dc) const
{
const GridCell &cell = *(*this)(nRow, nCol);
if (cell.IsRange())
return;
double x = GetColumnsWidth(0, nCol - 1, FALSE);
double y = GetRowsHeight(0, nRow - 1, FALSE);
double w, h;
w = GetColumnWidth(nCol, FALSE);
h = GetRowHeight(nRow, FALSE);
double nRotWcs = Layout2Wcs(m_nRotation);
//左上角为ptBase
XPoint ptBase;
ads_polar(ptTopLeft, nRotWcs, x, ptBase);
ads_polar(XPoint(ptBase), nRotWcs - PI / 2, y, ptBase);
DrawCellText(cell.GetText(), w, h, nRow, nCol, ptBase, dc);
}
// sg add 101116,支持统一标高
bool CDbSheet::UnifyElevation(double dElevation)
{
assertWriteEnabled();
m_ptLocation.z = dElevation;
return true;
}
int AttribValue::FindByName(const AttribValue *p1, const void *p2)
{
return _tcsicmp(p1->m_sName, (const TCHAR *)p2);
}
BOOL CellBlockInsert::OutputDesc(XString &sDescOut) const
{
if (!m_sBlockName)
return FALSE;
XString sDesc(2048);
sDesc << _T("^B{");
sDesc << _T("BLOCK=") << m_sBlockName << _T(";");
sDesc << _T("FLAG=") << m_nControlFlag << _T(";");
if (!(m_nControlFlag & CBF_AUTOSIZE)) {
sDesc << _T("X=") << m_xValue << _T(";")
<< _T("Y=") << m_yValue << _T(";")
<< _T("Z=") << m_zValue << _T(";");
}
sDesc << _T("}");
if (m_nControlFlag & CBF_SHOW_ATTR) {
sDesc << _T("{");
for (int i = 0; i < m_lstAttribs.Length(); i++) {
const AttribValue &attr = m_lstAttribs[i];
sDesc << attr.m_sName << _T("=") << attr.m_sValue << _T(";");
}
sDesc << _T("}");
}
sDescOut = sDesc;
return TRUE;
}
BOOL CellBlockInsert::ParserDesc(const TCHAR *pszText)
{
if (!pszText)
return FALSE;
size_t nCharNum = _tcslen(pszText);
if (nCharNum > 4 && nCharNum < 2048);
else
return FALSE;
if (pszText[0] == _T('^') && pszText[1] == _T('B') && pszText[2] == _T('{'));
else
return FALSE;
const TCHAR *pEndBlock = _tcschr(pszText, _T('}'));
if (!pEndBlock)
return FALSE;
XString sBlockInfo(2048);
GlobalFunc::_StrCpy(sBlockInfo, &pszText[3], pEndBlock); //取图块描述
// 分析图块描述
TCHAR *pBegStat = sBlockInfo;
while (pBegStat && *pBegStat) {
XString sStatement(2048);
TCHAR *pEndStat = _tcschr(pBegStat, _T(';'));
if (!pEndStat)
break;
GlobalFunc::_StrCpy(sStatement, pBegStat, pEndStat);
TCHAR *pEqual = _tcschr(sStatement, _T('='));
if (!pEqual)
return FALSE;
XString sLeftValue(2048), sRightValue(2048);
GlobalFunc::_StrCpy(sLeftValue, sStatement, pEqual);
GlobalFunc::_StrCpy(sRightValue, pEqual + 1, NULL);
if (_tcsicmp(sLeftValue, _T("BLOCK")) == 0)
m_sBlockName = sRightValue;
else if (_tcsicmp(sLeftValue, _T("FLAG")) == 0)
m_nControlFlag = _ttoi(sRightValue);
else if (_tcsicmp(sLeftValue, _T("X")) == 0)
m_xValue = _tstof(sRightValue);
else if (_tcsicmp(sLeftValue, _T("Y")) == 0)
m_yValue = _tstof(sRightValue);
else if (_tcsicmp(sLeftValue, _T("Z")) == 0)
m_zValue = _tstof(sRightValue);
pBegStat = pEndStat + 1;
}
m_lstAttribs.Reset();
const TCHAR *pBegAttr = _tcschr(pEndBlock, _T('{'));
if (!pBegAttr)
return TRUE;
const TCHAR *pEndAttr = _tcschr(pBegAttr, _T('}'));
if (!pEndAttr)
return FALSE;
XString sAttrInfo(2048);
GlobalFunc::_StrCpy(sAttrInfo, pBegAttr + 1, pEndAttr);
pBegStat = sAttrInfo;
while (pBegStat && *pBegStat) {
XString sStatement(2048);
TCHAR *pEndStat = _tcschr(pBegStat, _T(';'));
if (!pEndStat)
break;
GlobalFunc::_StrCpy(sStatement, pBegStat, pEndStat);
TCHAR *pEqual = _tcschr(sStatement, _T('='));
if (!pEqual)
return FALSE;
XString sLeftValue(2048), sRightValue(2048);
GlobalFunc::_StrCpy(sLeftValue, sStatement, pEqual);
GlobalFunc::_StrCpy(sRightValue, pEqual + 1, NULL);
m_lstAttribs.Append(new AttribValue(sLeftValue, sRightValue));
pBegStat = pEndStat + 1;
}
return TRUE;
}
/*
static BOOL IsBlockInsert(const TCHAR *pszText, AcDbObjectId &idBlock, XPoint &sizeBlock)
{
if(!pszText)
return FALSE;
int nCharNum=strlen(pszText);
if(nCharNum>2 && nCharNum<256) {
if(pszText[0]==_T('^') && pszText[1]==_T('B')) {
TCHAR szBlockInfo[256]=_T("");
_tcscpy(szBlockInfo, &pszText[2]);
TCHAR *pSep=_tcschr(szBlockInfo, _T(':'));
TCHAR szBlockName[256]=_T(""), szSizeX[256]=_T(""), szSizeY[256]=_T("");
if(pSep) {
StrCpy(szBlockName, szBlockInfo, pSep);
pSep++;
TCHAR *pSep1=_tcschr(pSep, _T(':'));
if(pSep1) {
StrCpy(szSizeX, pSep, pSep1);
StrCpy(szSizeY, pSep1+1, NULL);
}
}
double nSizeX=_tstof(szSizeX), nSizeY=_tstof(szSizeY);
if(nSizeX<g_Option::instance()._DIST_SNAP || nSizeY<g_Option::instance()._DIST_SNAP)
return FALSE;
idBlock=InitBlock(szBlockName);
if(!idBlock)
return FALSE;
sizeBlock.x=nSizeX;
sizeBlock.y=nSizeY;
return TRUE;
}
}
return FALSE;
}
*/
// Modify on 2003/2/28
// 增加图块的插入
void CDbSheet::DrawCellText(const TCHAR *pszText, double w, double h, int nRow, int nCol, XPoint ptBase,
AcGiDraw &dc) const
{
//if(!pszText && pszText[0])//modified by whl on 070206
if (pszText == NULL || _tcslen(pszText) == 0)
return;
ads_matrix mat;
double nRotWcs = Layout2Wcs(m_nRotation);
ptBase.GetRotationMatrix(nRotWcs, mat);
AcDbObjectId idBlock;
//XPoint sizeBlock;
CellBlockInsert insert;
if (insert.ParserDesc(pszText))
idBlock = InitBlock(insert.m_sBlockName, database());
if (idBlock.isValid()) {
XPoint ptAlign = ptBase;
double nOffset = GetCellLineSpace(nRow, nCol, FALSE);
AcDb::TextHorzMode nHorMode = GetCellHorMode(nRow, nCol);
AcDb::TextVertMode nVerMode = GetCellVerMode(nRow, nCol);
AcGiDraw::TextAlignment align = GlobalFunc::GetTextAlignment(
nHorMode, nVerMode);
switch (nHorMode) {
case AcDb::kTextLeft:
ptAlign.x += nOffset;
break;
case AcDb::kTextCenter:
case AcDb::kTextMid:
ptAlign.x += w / 2;
break;
case AcDb::kTextRight:
ptAlign.x += w;
ptAlign.x -= nOffset;
break;
default:
ptAlign.x += w / 2;
break;
}
switch (nVerMode) {
case AcDb::kTextBase:
case AcDb::kTextBottom:
ptAlign.y -= h;
ptAlign.y += nOffset;
break;
case AcDb::kTextVertMid:
ptAlign.y -= h / 2;
break;
case AcDb::kTextTop:
ptAlign.y -= h;
break;
default:
ptAlign.y -= h / 2;
}
// ptInsert-单元格中心点
XPoint ptInsert = ptAlign;
ptInsert.TransformBy(mat);
ads_polar(ptBase, nRotWcs, w / 2.0, ptInsert);
ads_polar(XPoint(ptInsert), nRotWcs - PI / 2, h / 2.0, ptInsert);
AcDbBlockReference blkInsert(ptInsert, idBlock);
BlockGeomInfo info;
if (insert.m_nControlFlag & CBF_AUTOSIZE) {
info.m_nSizeX = max(w - 2 * nOffset, nOffset);
info.m_nSizeY = max(h - 2 * nOffset, nOffset);
if (insert.m_nControlFlag & CBF_EQUAL_SIDE)
info.m_nSizeX = info.m_nSizeY = min(info.m_nSizeX, info.m_nSizeY);
}
else if (insert.m_nControlFlag & CBF_INPUT_SCALE) {
info.SetFromInsert(&blkInsert);
info.m_nSizeX *= insert.m_xValue;
info.m_nSizeY *= insert.m_yValue;
info.m_nSizeZ *= insert.m_zValue;
}
else {
info.m_nSizeX = insert.m_xValue;
info.m_nSizeY = insert.m_yValue;
info.m_nSizeZ = insert.m_zValue;
}
info.m_ptCen = ptInsert;
info.m_nRotation = nRotWcs;
blkInsert.setPropertiesFrom(this);
//modify by xlc on 071101
//info.UpdateInsert(&blkInsert);
UpdateInsert(&blkInsert, info, insert.m_nControlFlag & CBF_UNISCALE);
if (insert.m_nControlFlag & CBF_UNISCALE) {
//del by xlc on 071101
//AcGeScale3d factors=blkInsert.scaleFactors();
//double nScale=min(factors[0], factors[1]);
//factors[0]=factors[1]=factors[2]=nScale;
//blkInsert.setScaleFactors(factors);
info.SetFromInsert(&blkInsert);
info.m_ptCen = ptInsert;
info.UpdateInsert(&blkInsert);
}
Adesk::UInt16 nColor = GetCellTextColor(nRow, nCol);
blkInsert.setColorIndex(nColor);
//blkInsert.setScaleFactors(scales);
BOOL bAcGi = false;
//if (g_nAcadVer > 15.0001)
//bAcGi = (_tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor()) == 0);
bAcGi = (dc.GetCommonDraw() != NULL);
if (bAcGi) {
OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock);
if (pBlock) {
AcGiSubEntityTraits &traits = dc.GetCommonDraw()->subEntityTraits();
AcDbObjectId idLayer = traits.layerId();
Adesk::UInt16 nColorOld = traits.color();
AcDbObjectId idLineType = traits.lineTypeId();
AcGeMatrix3d matTrans = GlobalFunc::BlockTransform(&blkInsert);
if (nColor > 0 && nColor < 256)
traits.setColor(nColor);
AcGiGeometry *geom = dc.GetCommonDraw()->rawGeometry();
geom->pushModelTransform(matTrans);
geom->draw(pBlock);
geom->popModelTransform();
traits.setLayer(idLayer);
traits.setColor(nColorOld);
traits.setLineType(idLineType);
}
OPENOBJ_END();
}
else {
int nOldColor = dc.GetColor();
dc.SetColor(nColor);
dc.DrawEntity(blkInsert);
dc.SetColor(nOldColor);
}
// 输出属性
AcGeMatrix3d matBlock = GlobalFunc::BlockTransform(&blkInsert);
OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock);
if (pBlock) {
AcDbBlockTableRecordIterator *pIter = NULL;
if (pBlock->newIterator(pIter) == Acad::eOk && pIter) {
for (pIter->start(); !pIter->done(); pIter->step()) {
AcDbObjectId idAtt;
pIter->getEntityId(idAtt);
OPENOBJ_BEGIN(idAtt, AcDb::kForRead, AcDbAttributeDefinition, pAttr);
if (pAttr) {
TCHAR *pTag = pAttr->tag();
if (pTag) {
AttribValue *pFind = insert.m_lstAttribs.FindNode(pTag, AttribValue::FindByName);
if (pFind) {
AecXDbText text;
text.setPropertiesFrom(this);
text.ConvertFrom(pAttr);
text.SetText(pFind->m_sValue);
text.setColorIndex(nColor);
XPoint ptLoc = text.GetLocation();
XPoint ptHeight;
ads_polar(ptLoc, nRotWcs + PI / 2, text.GetHeight(FALSE), ptHeight);
ptHeight.TransformBy(matBlock);
ptLoc.TransformBy(matBlock);
text.SetLocation(ptLoc);
text.SetHeight(ptLoc.Distance2d(ptHeight), FALSE);
//text.ExplodeOrDraw2d(dc);
DrawBaseEx(dc, text);
}
delete[] pTag;
}
}
OPENOBJ_END();
}
delete pIter;
}
}
OPENOBJ_END();
}
else { //绘制文字
double nOffset = GetCellLineSpace(nRow, nCol, FALSE);
double nTextHeight = GetCellTextHeight(nRow, nCol, TRUE);
AcDbObjectId idTextStyle = GetCellTextStyle(nRow, nCol);
AecXDbText textLine;
textLine.setPropertiesFrom(this); //Add this line on 2002/11/18
textLine.SetHeight(nTextHeight);
textLine.SetStyleId(idTextStyle);
textLine.SetText(pszText);
AecXDbText *pCellText = NULL;
const TCHAR *bHardMText = _tcschr(pszText, _T('\n'));
XPoint ptMyExt = textLine.GetExtents();
BOOL bOverWidth = (ptMyExt.x + nOffset * 2.0 > w);
BOOL bWrapEnabled = IsCellWrapEnabled(nRow, nCol);
if (bHardMText || (bOverWidth && bWrapEnabled)) {
pCellText = new AecXDbMText;
pCellText->setPropertiesFrom(this);
AecXDbMText &textSeg = *(AecXDbMText *)pCellText;
textSeg.SetLineSpace(nOffset, FALSE);
textSeg.SetPageWidth(w - 2 * nOffset, FALSE);
}
else {
pCellText = new AecXDbText;
pCellText->setPropertiesFrom(this);
}
Adesk::UInt16 nColor = GetCellTextColor(nRow, nCol);
int nOldColor = dc.GetColor();
if (nColor > 0) {
pCellText->setColorIndex(nColor);
dc.SetColor(nColor);
}
pCellText->SetHeight(nTextHeight);
pCellText->SetStyleId(idTextStyle);
pCellText->SetText(pszText);
InitTextInBox(*pCellText, ptBase, w, h, nOffset,
GetCellHorMode(nRow, nCol), GetCellVerMode(nRow, nCol));
XPoint ptLoc = pCellText->GetLocation();
ptLoc.TransformBy(mat);
pCellText->SetLocation(ptLoc);
pCellText->SetRotation(m_nRotation);
//if (dc.IsFullExplode())
// pCellText->ExplodeOrDraw2d(dc);
//else
// dc.DrawEntity(*pCellText);
DrawBaseEx(dc, *pCellText);
if (nColor > 0)
dc.SetColor(nOldColor);
delete pCellText;
}
}
// 绘制单元格文本
void
CDbSheet::DrawCellText(XPoint ptTopLeft, AcGiDraw &dc, int &nGsMarker) const
{
int nRowNum = GetRowNum();
int nColNum = GetColumnNum();
//INT_PTR nQuickMarker = GetQuickMarker();
for (int iRow = 0; iRow < nRowNum; iRow++) {
for (int iCol = 0; iCol < nColNum; iCol++) {
if (nGsMarker) {
dc.SetSelectionMarker(nGsMarker);
nGsMarker++;
//捕捉加速
//if (nQuickMarker && (nGsMarker - 1) != nQuickMarker)
// continue;//用于捕捉时加速
}
DrawCellText(iRow, iCol, ptTopLeft, dc);
}
}
int nLen = m_ranges.Length();
for (int i = 0; i < nLen; i++) {
if (nGsMarker) {
dc.SetSelectionMarker(nGsMarker);
nGsMarker++;
//捕捉加速
//if (nQuickMarker && (nGsMarker - 1) != nQuickMarker)
// continue;//用于捕捉时加速
}
DrawRangeText(m_ranges[i], ptTopLeft, dc);
}
}
SubText* CDbSheet::HitTestText(XPoint pt)const
{
long row = HitTestOnRow(pt), col = HitTestOnColumn(pt);
if (row == -1 && col >= 0 && col < GetColumnNum())
return GetSubText(0);
else if (row >= 0 && row < GetRowNum() && col >= 0 && col < GetColumnNum())
{
const GridCell* pCell = (*this)(row, col);
if (pCell->IsRange())
{
((DList<GridRange>&)m_ranges).FindNode(pCell->GetRange(), CompareRange);
return GetSubText(GetRowNum() * GetColumnNum() + 1 + m_ranges.CurPosition());
}
else
return GetSubText(row * GetColumnNum() + col + 1);
}
return NULL;
}
SubText* CDbSheet::GetSubText(long iText)const
{
GlobalFunc::PushMemVar<BOOL> vTemp(g_Option::instance().g_bExplodeSubText, TRUE);
AecXDbText* pText = GetText(iText);
if (pText == NULL)
return NULL;
SubText*pSubText = new SubText(objectId(), pText, iText);
pSubText->SetMultiLine(true);
if (iText != 0)//cell
pSubText->SetMenuType(5);
return pSubText;
}
void CDbSheet::SetSubText(long i, CString sText)
{
if (i == 0)
SetTitleText(sText);
else
{
i--;
assertWriteEnabled();
if (i < GetRowNum() * GetColumnNum())
{
long row = i / GetColumnNum(), col = i % GetColumnNum();
(*this)(row, col)->SetText(sText);
}
else
{
i -= GetRowNum() * GetColumnNum();
m_ranges[i]->SetText(sText);
}
}
}
long CDbSheet::GetNextSubTextIndex(long i, bool bVert, bool bPre)const
{
if (GetRowNum() == 0 || GetColumnNum() == 0)
return i;
long trueRowNum = GetRowNum() + m_title.IsVisible();
long curRow, curCol, curRowMax, curColMax;
long nextRow, nextCol;
if (i == 0)
{
curRow = curRowMax = 0;
curCol = curColMax = 0;
}
else
{
i--;
if (i < GetRowNum() * GetColumnNum())
{
curRow = curRowMax = i / GetColumnNum() + m_title.IsVisible();
curCol = curColMax = i % GetColumnNum();
}
else
{
i -= GetRowNum() * GetColumnNum();
const GridRange*pRange = &m_ranges[i];
curRow = pRange->GetCoord(TRUE) + m_title.IsVisible();
curCol = pRange->GetCoord(FALSE);
curRowMax = pRange->GetCoordMax(TRUE) + m_title.IsVisible();
curColMax = pRange->GetCoordMax(FALSE);
}
}
if (bVert)
{
if (bPre)
nextRow = (curRow - 1 + trueRowNum) % trueRowNum;
else
nextRow = (curRowMax + 1) % trueRowNum;
nextCol = curCol;
}
else
{
if (bPre)
nextCol = (curCol - 1 + GetColumnNum()) % GetColumnNum();
else
nextCol = (curColMax + 1) % GetColumnNum();
nextRow = curRow;
}
if (m_title.IsVisible())
{
if (nextRow == 0)
return 0;
else
nextRow--;
}
const GridCell* pCell = (*this)(nextRow, nextCol);
if (pCell->IsRange())
{
((DList<GridRange>&)m_ranges).FindNode(pCell->GetRange(), CompareRange);
return GetRowNum() * GetColumnNum() + 1 + m_ranges.CurPosition();
}
else
return nextRow * GetColumnNum() + nextCol + 1;
}
// cookies--0,标题
// 接着是正常的单元格
// 然后是合并单元格
AecXDbText * CDbSheet::GetText(Adesk::UInt32 cookies) const
{
AecXDbText *pDbText = NULL;
if (cookies == 0) //title
{
if (!m_title.m_sText && !g_Option::instance().g_bExplodeSubText)
return NULL;
BOOL bIncludeTitle = (m_title.m_divider.m_nFlag != DividerStyle::kNone);
double nTitleHeight = GetTitleHeight(FALSE);
double nTitleWidth = GetSheetWidth(FALSE);
//左上角为ptBase
XPoint ptBase = GetTopLeft(bIncludeTitle);
if (!bIncludeTitle)
ads_polar(XPoint(ptBase), Layout2Wcs(m_nRotation) + PI / 2, nTitleHeight, ptBase);
ads_matrix mat;
ptBase.GetRotationMatrix(Layout2Wcs(m_nRotation), mat);
double nOffset = GetTitleLineSpace(FALSE);
double nTextHeight = GetTitleTextHeight(TRUE);
AcDbObjectId idTextStyle = GetTitleTextStyle();
AecXDbText textLine;
textLine.setPropertiesFrom(this);
textLine.SetHeight(nTextHeight);
textLine.SetStyleId(idTextStyle);
textLine.SetText(m_title.m_sText);
TCHAR *bHardMText = (TCHAR*)_tcschr(m_title.GetText(), _T('\n'));
if (bHardMText ||
(textLine.GetExtents().x + nOffset * 2 > nTitleWidth && IsTitleWrapEnabled())
)
{
AecXDbMText *pTextSeg = new AecXDbMText;
pDbText = pTextSeg;
pDbText->setPropertiesFrom(this);
AecXDbMText &textSeg = *pTextSeg;
textSeg.SetLineSpace(nOffset, FALSE);
textSeg.SetPageWidth(nTitleWidth - 2 * nOffset, FALSE);
}
else
{
pDbText = new AecXDbText;
pDbText->setPropertiesFrom(this);
}
Adesk::UInt16 nColor = GetTitleTextColor();
if (nColor > 0)
pDbText->setColorIndex(nColor);
pDbText->SetHeight(nTextHeight);
pDbText->SetStyleId(idTextStyle);
pDbText->SetText(m_title.m_sText);
InitTextInBox(*pDbText, ptBase, nTitleWidth, nTitleHeight, nOffset,
GetTitleHorMode(), GetTitleVerMode());
XPoint ptLoc = pDbText->GetLocation();
ptLoc.TransformBy(mat);
pDbText->SetLocation(ptLoc);
pDbText->SetRotation(m_nRotation);
}
else
{
cookies--;
int nRowNum = GetRowNum();
int nColNum = GetColumnNum();
XPoint ptTopLeft = GetTopLeft(FALSE);
if ((int)cookies < nRowNum * nColNum) //cells array
{
int nRow = cookies / nColNum;
int nCol = cookies - (nRow * nColNum);
const GridCell &cell = *(*this)(nRow, nCol);
if (cell.IsRange())
return NULL;
double x = GetColumnsWidth(0, nCol - 1, FALSE);
double y = GetRowsHeight(0, nRow - 1, FALSE);
double w, h;
w = GetColumnWidth(nCol, FALSE);
h = GetRowHeight(nRow, FALSE);
//左上角为ptBase
XPoint ptBase;
ads_polar(ptTopLeft, Layout2Wcs(m_nRotation), x, ptBase);
ads_polar(XPoint(ptBase), Layout2Wcs(m_nRotation) - PI / 2, y, ptBase);
const TCHAR *pszText = cell.GetText();
if (!pszText[0] && !g_Option::instance().g_bExplodeSubText)
return NULL;
ads_matrix mat;
ptBase.GetRotationMatrix(Layout2Wcs(m_nRotation), mat);
double nOffset = GetCellLineSpace(nRow, nCol, FALSE);
double nTextHeight = GetCellTextHeight(nRow, nCol, TRUE);
AcDbObjectId idTextStyle = GetCellTextStyle(nRow, nCol);
AecXDbText textLine;
textLine.setPropertiesFrom(this);
textLine.SetHeight(nTextHeight);
textLine.SetStyleId(idTextStyle);
textLine.SetText(pszText);
TCHAR *bHardMText = (TCHAR*)_tcschr(pszText, _T('\n'));
if (bHardMText || (textLine.GetExtents().x + nOffset * 2.0 > w && IsCellWrapEnabled(nRow, nCol)))
{
pDbText = new AecXDbMText;
pDbText->setPropertiesFrom(this);
AecXDbMText &textSeg = *(AecXDbMText *)pDbText;
textSeg.SetLineSpace(nOffset, FALSE);
textSeg.SetPageWidth(w - 2 * nOffset, FALSE);
}
else
{
pDbText = new AecXDbText;
pDbText->setPropertiesFrom(this);
}
Adesk::UInt16 nColor = GetCellTextColor(nRow, nCol);
if (nColor > 0)
pDbText->setColorIndex(nColor);
pDbText->SetHeight(nTextHeight);
pDbText->SetStyleId(idTextStyle);
pDbText->SetText(pszText);
InitTextInBox(*pDbText, ptBase, w, h, nOffset,
GetCellHorMode(nRow, nCol), GetCellVerMode(nRow, nCol));
XPoint ptLoc = pDbText->GetLocation();
ptLoc.TransformBy(mat);
pDbText->SetLocation(ptLoc);
pDbText->SetRotation(m_nRotation);
}
else //ranges
{
cookies -= nRowNum * nColNum;
if ((int)cookies >= m_ranges.Length())
return NULL;
const GridRange &range = m_ranges[cookies];
const TCHAR *pszText = range.GetText();
if (!pszText[0] && !g_Option::instance().g_bExplodeSubText)
return NULL;
double x = GetColumnsWidth(0, range.m_nColumn - 1, FALSE);
double y = GetRowsHeight(0, range.m_nRow - 1, FALSE);
double w, h;
w = GetColumnsWidth(range.m_nColumn, range.m_nColumnMax, FALSE);
h = GetRowsHeight(range.m_nRow, range.m_nRowMax, FALSE);
//左上角为ptBase
XPoint ptBase;
ads_polar(ptTopLeft, Layout2Wcs(m_nRotation), x, ptBase);
ads_polar(XPoint(ptBase), Layout2Wcs(m_nRotation) - PI / 2, y, ptBase);
ads_matrix mat;
ptBase.GetRotationMatrix(Layout2Wcs(m_nRotation), mat);
int nRow = range.m_nRow;
int nCol = range.m_nColumn;
// 与正常单元格一样的处理方法
double nOffset = GetCellLineSpace(nRow, nCol, FALSE);
double nTextHeight = GetCellTextHeight(nRow, nCol, TRUE);
AcDbObjectId idTextStyle = GetCellTextStyle(nRow, nCol);
AecXDbText textLine;
textLine.setPropertiesFrom(this);
textLine.SetHeight(nTextHeight);
textLine.SetStyleId(idTextStyle);
textLine.SetText(pszText);
TCHAR *bHardMText = (TCHAR*)_tcschr(pszText, _T('\n'));
if (bHardMText || (textLine.GetExtents().x + nOffset * 2.0 > w && IsCellWrapEnabled(nRow, nCol)))
{
pDbText = new AecXDbMText;
pDbText->setPropertiesFrom(this);
AecXDbMText &textSeg = *(AecXDbMText *)pDbText;
textSeg.SetLineSpace(nOffset, FALSE);
textSeg.SetPageWidth(w - 2 * nOffset, FALSE);
}
else
{
pDbText = new AecXDbText;
pDbText->setPropertiesFrom(this);
}
Adesk::UInt16 nColor = GetCellTextColor(nRow, nCol);
if (nColor > 0)
pDbText->setColorIndex(nColor);
pDbText->SetHeight(nTextHeight);
pDbText->SetStyleId(idTextStyle);
pDbText->SetText(pszText);
InitTextInBox(*pDbText, ptBase, w, h, nOffset,
GetCellHorMode(nRow, nCol), GetCellVerMode(nRow, nCol));
XPoint ptLoc = pDbText->GetLocation();
ptLoc.TransformBy(mat);
pDbText->SetLocation(ptLoc);
pDbText->SetRotation(m_nRotation);
}
}
return pDbText;
}
// 对某一行初始化分割线的属性, 如果没有分割线则返回FALSE
BOOL CDbSheet::InitRowDivider(AcDbPolyline &pline, int nRow) const
{
const SheetRow &row = m_rows[nRow];
if (row.m_divider.m_nFlag == DividerStyle::kNone)
return FALSE;
const DividerStyle &divider = row.m_divider.m_nFlag == DividerStyle::kLocal ?
row.m_divider : m_rowDivider;
BOOL bRet = TRUE;
pline.setPropertiesFrom(this);
switch (divider.m_nFlag) {
case DividerStyle::kLocal:
if (!!divider.m_idLineType)
pline.setLinetype(divider.m_idLineType);
if (divider.m_nLineWidth > 0.0 && !!objectId())
pline.setConstantWidth(divider.m_nLineWidth * GetPScale());
if (divider.m_nColor > 0)
pline.setColorIndex(divider.m_nColor);
break;
case DividerStyle::kParent:
break;
case DividerStyle::kNone:
default:
bRet = FALSE;
break;
}
return bRet;
}
// 对某一列初始化分割线的属性, 如果没有分割线则返回FALSE
BOOL CDbSheet::InitColumnDivider(AcDbPolyline &pline, int nCol) const
{
const SheetColumn &column = m_columns[nCol];
if (column.m_divider.m_nFlag == DividerStyle::kNone)
return FALSE;
const DividerStyle &divider = column.m_divider.m_nFlag == DividerStyle::kLocal ?
column.m_divider : m_colDivider;
BOOL bRet = TRUE;
pline.setPropertiesFrom(this);
switch (divider.m_nFlag) {
case DividerStyle::kLocal:
if (!!divider.m_idLineType)
pline.setLinetype(divider.m_idLineType);
if (divider.m_nLineWidth > 0.0 && !!objectId())
pline.setConstantWidth(divider.m_nLineWidth * GetPScale());
if (divider.m_nColor > 0)
pline.setColorIndex(divider.m_nColor);
break;
case DividerStyle::kParent:
break;
case DividerStyle::kNone:
default:
bRet = FALSE;
break;
}
return bRet;
}
///////////////////////////////////////////////
// Helper Method
// 强制下级继承上级属性
void CDbSheet::DescInheriGridStyle()
{
assertWriteEnabled();
int nRowNum = GetRowNum();
int nColNum = GetColumnNum();
for (int iRow = 0; iRow < nRowNum; iRow++) {
SheetRow *pRow = m_rows[iRow];
pRow->m_nVerMode = AcDb::kTextBase;
}
for (int iCol = 0; iCol < nColNum; iCol++) {
SheetColumn *pCol = m_columns[iCol];
pCol->m_gridStyle.SetOverrideAll(FALSE);
}
for (iRow = 0; iRow < nRowNum; iRow++) {
for (iCol = 0; iCol < nColNum; iCol++) {
GridCell *pCell = (*this)(iRow, iCol);
GridStyle &grid = pCell->GetGridStyle();
grid.SetOverrideAll(FALSE);
}
}
}
// 下属行继承特性
void CDbSheet::DescInheritRowDivider(bool bIncludeRowHeight)
{
assertWriteEnabled();
int nRowNum = GetRowNum();
for (int iRow = 0; iRow < nRowNum; iRow++) {
SheetRow *pRow = m_rows[iRow];
pRow->m_divider.SetDividerFlag(DividerStyle::kParent);
if (bIncludeRowHeight) {
pRow->SetHeight(m_nRowHeight);
pRow->SetRowHeightStyle(SheetRow::kParent);
}
}
}
void CDbSheet::DescInheritColDivider()
{
assertWriteEnabled();
int nColNum = GetColumnNum();
for (int iCol = 0; iCol < nColNum; iCol++) {
m_columns[iCol]->m_divider.SetDividerFlag(DividerStyle::kParent);
}
}
void CDbSheet::DescInheritColGridStyle(int iCol)
{
assertWriteEnabled();
int nRowNum = GetRowNum();
for (int iRow = 0; iRow < nRowNum; iRow++) {
GridCell *pCell = (*this)(iRow, iCol);
GridStyle &grid = pCell->GetGridStyle();
BOOL bOver = grid.TestFlagBit(OF_VERMODE);
grid.SetOverrideAll(FALSE);
if (bOver) {
grid.SetFlagBit(OF_VERMODE, TRUE);
}
}
}
void CDbSheet::DescInheritRowGridStyle(int iRow)
{
assertWriteEnabled();
int nColNum = GetColumnNum();
for (int iCol = 0; iCol < nColNum; iCol++) {
GridCell *pCell = (*this)(iRow, iCol);
GridStyle &grid = pCell->GetGridStyle();
grid.SetFlagBit(OF_VERMODE, FALSE);
}
}
XPoint CDbSheet::Align2Base(XPoint ptAlign, XPoint ext) const
{
XPoint ptBase = AcGiDraw::Align2Base(m_nAlignment, ptAlign, ext);
ads_matrix mat;
ptAlign.GetRotationMatrix(Layout2Wcs(m_nRotation), mat);
ptBase.TransformBy(mat);
return ptBase;
}
XPoint CDbSheet::Base2Align(XPoint ptBase, XPoint ext) const
{
XPoint ptAlign = AcGiDraw::Base2Align(m_nAlignment, ptBase, ext);
ads_matrix mat;
ptBase.GetRotationMatrix(Layout2Wcs(m_nRotation), mat);
ptAlign.TransformBy(mat);
return ptAlign;
}
// 按行列取得单元格
GridCell * CDbSheet::operator () (int nRow, int nCol)
{
return &m_pCells[nRow * GetColumnNum() + nCol];
}
// 按行列取得单元格
const GridCell * CDbSheet::operator () (int nRow, int nCol) const
{
CDbSheet *pThis = (CDbSheet *)this;
return (*pThis)(nRow, nCol);
}
int CDbSheet::HitTestOnColumn(XPoint pt) const
{
pt.z = 0;
int nColNum = m_columns.Length();
XPoint ptTopLeft = GetTopLeft(FALSE);
double nColWidth = 0.0;
double nRotWcs = Layout2Wcs(m_nRotation);
for (int n = 0; n < nColNum; n++) {
XLine lnLeft(ptTopLeft, nRotWcs + PI / 2);
nColWidth = GetColumnWidth(n, FALSE);
ads_polar(XPoint(ptTopLeft), nRotWcs, nColWidth, ptTopLeft);
XLine lnRight(ptTopLeft, nRotWcs + PI / 2);
int nSide1 = lnLeft.OnWhichSide(pt);
int nSide2 = lnRight.OnWhichSide(pt);
if (nSide1 == OFFSET_LEFT && n == 0)
return COL_PREVFIRST;
if (nSide1 == OFFSET_RIGHT && nSide2 == OFFSET_LEFT)
{
double d1 = pt.Distance(&lnLeft), d2 = pt.Distance(&lnRight);
double distPre = (d1 + d2) / 20.0;
if (d1 < distPre || d2 < distPre)
return COL_NEXTLAST;
return n;
}
}
return COL_NEXTLAST;
}
int CDbSheet::HitTestOnRow(XPoint pt) const
{
pt.z = 0;
int nRowNum = m_rows.Length();
XPoint ptTopLeft = GetTopLeft(FALSE);
double nRotWcs = Layout2Wcs(m_nRotation);
for (int n = 0; n < nRowNum; n++) {
XLine lnUp(ptTopLeft, nRotWcs);
double nRowHeight = GetRowHeight(n, FALSE);
ads_polar(XPoint(ptTopLeft), nRotWcs - PI / 2, nRowHeight, ptTopLeft);
XLine lnDown(ptTopLeft, nRotWcs);
int nSide1 = lnUp.OnWhichSide(pt);
int nSide2 = lnDown.OnWhichSide(pt);
if (nSide1 == OFFSET_LEFT && n == 0)
{
double d = GetTitleHeight(FALSE);
double d1 = pt.Distance(&lnUp);
double d2 = d - d1;
double distPre = (d1 + d2) / 20.0;
if (d1 < distPre || d2 < distPre)
return COL_NEXTLAST;
return ROW_PREVFIRST;
}
if (nSide1 == OFFSET_RIGHT && nSide2 == OFFSET_LEFT)
{
double d1 = pt.Distance(&lnUp), d2 = pt.Distance(&lnDown);
double distPre = (d1 + d2) / 20.0;
if (d1 < distPre || d2 < distPre)
return COL_NEXTLAST;
return n;
}
}
return ROW_NEXTLAST;
}
const GridCell *
CDbSheet::HitTestOnCell(XPoint pt, int *pRow, int *pCol) const
{
pt.z = 0;
int nRowNum = GetRowNum();
int nColNum = GetColumnNum();
double nRotWcs = Layout2Wcs(m_nRotation);
for (int iRow = 0; iRow < nRowNum; iRow++) {
for (int iCol = 0; iCol < nColNum; iCol++) {
XPoint ptTopLeft = GetCellPoint(iRow, iCol);
XPoint szCell = GetCellSize(iRow, iCol, FALSE);
XPoint ptBotLeft, ptBotRight, ptTopRight;
ads_polar(ptTopLeft, nRotWcs, szCell.x, ptTopRight);
ads_polar(ptTopLeft, nRotWcs - PI / 2, szCell.y, ptBotLeft);
ads_polar(ptTopRight, nRotWcs - PI / 2, szCell.y, ptBotRight);
XPoly2D poly(1);
poly.AppendNode(ptTopLeft);
poly.AppendNode(ptBotLeft);
poly.AppendNode(ptBotRight);
poly.AppendNode(ptTopRight);
poly.SetElevation(0.0);
if ((pt & poly) == PR_INSIDE) {
if (pRow) *pRow = iRow;
if (pCol) *pCol = iCol;
return (*this)(iRow, iCol);
}
}
}
return NULL;
}
// 单元分解
BOOL CDbSheet::ExplodeCell(int nRow, int nCol)
{
assertWriteEnabled();
GridCell *pCell = (*this)(nRow, nCol);
if (!pCell || !pCell->GetRange())
return FALSE;
const GridRange *pRange = pCell->GetRange();
for (int iRow = pRange->GetCoord(TRUE); iRow <= pRange->GetCoordMax(TRUE); iRow++) {
for (int iCol = pRange->GetCoord(FALSE); iCol <= pRange->GetCoordMax(FALSE); iCol++) {
GridCell *pCell0 = (*this)(iRow, iCol);
if (pCell0) {
GlobalFunc::CopyObject(*(GridCell *)pRange, *pCell0);
pCell0->SetRange(NULL);
}
}
}
int nRanNum = m_ranges.Length();
for (int i = 0; i < nRanNum; i++) {
if (m_ranges[i] == pRange) {
m_ranges.Remove();
break;
}
}
return TRUE;
}
// 合并单元格
void
CDbSheet::MergeCells(int nRowFrom, int nColFrom, int nRowTo, int nColTo)
{
assertWriteEnabled();
if (nRowTo < nRowFrom || nColTo < nColFrom)
return;
if (nRowFrom == nRowTo && nColFrom == nColTo)
return;
GridRange *pRange = NULL;
GridCell *pMaster = (*this)(nRowFrom, nColFrom); //左上角
if (pMaster->IsRange()) {
pRange = (GridRange *)pMaster->GetRange();
ASSERT(pRange->GetCoord(TRUE) == nRowFrom &&
pRange->GetCoord(FALSE) == nColFrom);
ASSERT(pRange->GetCoordMax(TRUE) <= nRowTo);
ASSERT(pRange->GetCoordMax(FALSE) <= nColTo);
pRange->SetCoord(nRowFrom, nColFrom);
pRange->SetCoordMax(nRowTo, nColTo);
}
else {
pRange = new GridRange;
GlobalFunc::CopyObject(pMaster->m_gridStyle, pRange->m_gridStyle);
pRange->m_gridStyle.SetFlagBit(OF_HORMODE);
pRange->m_gridStyle.SetFlagBit(OF_VERMODE);
pRange->m_gridStyle.SetHorMode(AcDb::kTextCenter);
pRange->m_gridStyle.SetVerMode(AcDb::kTextVertMid);
pRange->SetText(pMaster->GetText());
pRange->SetCoord(nRowFrom, nColFrom);
pRange->SetCoordMax(nRowTo, nColTo);
m_ranges.Append(pRange);
}
for (int iRow = nRowFrom; iRow <= nRowTo; iRow++) {
for (int iCol = nColFrom; iCol <= nColTo; iCol++) {
GridCell *pSlaver = (*this)(iRow, iCol);
if (pSlaver->IsRange()) { //其他的合并单元格,则予以删除
const GridRange *pSlaverRange = pSlaver->GetRange();
if (pSlaverRange != pRange) {
if (m_ranges.FindNode(pSlaverRange, CompareRange))
m_ranges.Remove();
}
}
pSlaver->SetRange(pRange);
}
}
}
void
CDbSheet::CalculateRowHeight(int nRowFrom, int nRowTo)
{
assertWriteEnabled();
for (int i = nRowFrom; i <= nRowTo; i++)
CalculateRowHeight(i);
}
//当行的文字改变时, 重新计算行高
void
CDbSheet::CalculateRowHeight(int nRow)
{
assertWriteEnabled();
SheetRow *row = m_rows[nRow];
if (row->GetRowHeightStyle() == SheetRow::kAutomatic) {
int nColNum = GetColumnNum();
XPoint ptTopLeft = GetTopLeft(FALSE);
double nSizeHeight = 0.0; //row->GetHeight()*GetPScale();
for (int iCol = 0; iCol < nColNum; iCol++) {
double nOffset = GetCellLineSpace(nRow, iCol, FALSE);
const TCHAR *szText = (*this)(nRow, iCol)->GetText();
/*
AcDbObjectId idBlock;
XPoint sizeBlock;
if(IsBlockInsert(szText, idBlock, sizeBlock)) {
if(nSizeHeight<1.0E-3)
nSizeHeight= sizeBlock.y+nOffset*2.0;
else
nSizeHeight = max(nSizeHeight, sizeBlock.y+nOffset*2.0);
continue;
}*/
const AcDbVoidPtrArray *entSet;
AcGiViewDraw dc;
DrawCellText(nRow, iCol, ptTopLeft, dc);
entSet = _Get2DBuffer();
int nCount = entSet->length();
if (nCount > 0) {
AcDbEntity *pEnt = (AcDbEntity *)entSet->at(0);
if (pEnt->isKindOf(AecXDbText::desc())) {
AecXDbText *pText = (AecXDbText *)pEnt;
XPoint ext = pText->GetExtents();
if (nSizeHeight < 1.0E-3)
nSizeHeight = ext.y + nOffset * 2.0;
else
nSizeHeight = max(nSizeHeight, ext.y + nOffset * 2.0);
} /*else if(pEnt->isKindOf(AcDbBlockReference::desc())) {
BlockGeomInfo info;
info.SetFromInsert(AcDbBlockReference::cast(pEnt));
double nOffset=GetCellLineSpace(nRow, iCol, FALSE);
if(nSizeHeight<1.0E-3)
nSizeHeight= info.GetSizeY()+nOffset*2.0;
else
nSizeHeight = max(nSizeHeight, info.GetSizeY()+nOffset*2.0);
}*/
}
}
if (nSizeHeight > 1.0E-3)
row->SetHeight(nSizeHeight / GetPScale());
}
}
// 复制行内容和属性(包括单元格)
BOOL CDbSheet::CopyRow(int nSrc, int nDest)
{
//add by whl on 060223
if (nSrc < 0 || nSrc >= GetRowNum() ||
nDest < 0 || nDest >= GetRowNum())
return FALSE;
assertWriteEnabled();
SheetRow *rowSrc = m_rows[nSrc];
SheetRow *rowDest = m_rows[nDest];
GlobalFunc::CopyObject(*rowSrc, *rowDest);
int nColNum = GetColumnNum();
//add by xlc on 071224
SHArray<int> nPosArray; //记录合并单元格的位置数组
for (int i = 0; i < nColNum; i++) {
GridCell *cellSrc = (*this)(nSrc, i);
GridCell *cellDest = (*this)(nDest, i);
const GridRange *pRange = cellDest->GetRange();
const GridRange *pRangeSrc = cellSrc->GetRange();
const GridCell *pSrc = pRangeSrc ? (const GridCell *)pRangeSrc : (const GridCell *)cellSrc;
if (pRange)
GlobalFunc::CopyObject(*pSrc, *(GridCell *)pRange);
else GlobalFunc::CopyObject(*pSrc, *cellDest);
//add by xlc on 071224
if (pRangeSrc)
{
GridRange *pRange1 = (GridRange *)pRangeSrc;
int colIndexMin = pRange1->GetCoord(FALSE);
int colIndexMax = pRange1->GetCoordMax(FALSE);
int nNum = nPosArray.GetLength();
if (nNum < 1 || colIndexMin > nPosArray[nNum - 1])
{
nPosArray.AddTail(colIndexMin);
nPosArray.AddTail(colIndexMax);
}
}
}
//add by xlc on 071224
//合并单元格
for (i = 0; i < nPosArray.GetLength() - 1;)
{
MergeCells(nDest, nPosArray[i], nDest, nPosArray[i + 1]);
i = i + 2;
}
return TRUE;
}
// 交换列
BOOL CDbSheet::SwapColumn(int nSrc, int nDest)
{
assertWriteEnabled();
SheetColumn *colSrc = m_columns[nSrc];
SheetColumn *colDest = m_columns[nDest];
GlobalFunc::Exchange(*colSrc, *colDest);
int nRowNum = GetRowNum();
for (int i = nRowNum - 1; i >= 0; i--) {
GridCell *cellSrc = (*this)(i, nSrc);
GridCell *cellDest = (*this)(i, nDest);
const GridRange *pRangeSrc = cellSrc->GetRange();
const GridRange *pRangeDest = cellDest->GetRange();
GridCell cellTemp;
if (pRangeSrc) {
GlobalFunc::CopyObject(*(const GridCell *)pRangeSrc, cellTemp);
if (pRangeDest) {
if (i == pRangeSrc->GetCoord(TRUE))
GlobalFunc::CopyObject(*(const GridCell*)pRangeDest, *(GridCell *)pRangeSrc);
if (i == pRangeDest->GetCoord(TRUE))
GlobalFunc::CopyObject(cellTemp, *(GridCell *)pRangeDest);
}
else {
if (i == pRangeSrc->GetCoord(TRUE))
GlobalFunc::CopyObject(*cellDest, *(GridCell *)pRangeSrc);
GlobalFunc::CopyObject(cellTemp, *cellDest);
}
}
else {
GlobalFunc::CopyObject(*cellSrc, cellTemp);
if (pRangeDest) {
GlobalFunc::CopyObject(*(const GridCell*)pRangeDest, *cellSrc);
if (i == pRangeDest->GetCoord(TRUE))
GlobalFunc::CopyObject(cellTemp, *(GridCell *)pRangeDest);
}
else {
GlobalFunc::CopyObject(*cellDest, *cellSrc);
GlobalFunc::CopyObject(cellTemp, *cellDest);
}
}
cellSrc->SetRange((GridRange *)pRangeSrc);
cellDest->SetRange((GridRange *)pRangeDest);
}
return TRUE;
}
// 交换行
BOOL CDbSheet::SwapRow(int nSrc, int nDest)
{
assertWriteEnabled();
SheetRow *rowSrc = m_rows[nSrc];
SheetRow *rowDest = m_rows[nDest];
GlobalFunc::Exchange(*rowSrc, *rowDest);
int nColNum = GetColumnNum();
for (int i = nColNum - 1; i >= 0; i--) {
GridCell *cellSrc = (*this)(nSrc, i);
GridCell *cellDest = (*this)(nDest, i);
const GridRange *pRangeSrc = cellSrc->GetRange();
const GridRange *pRangeDest = cellDest->GetRange();
GridCell cellTemp;
if (pRangeSrc) {
GlobalFunc::CopyObject(*(const GridCell *)pRangeSrc, cellTemp);
if (pRangeDest) {
if (i == pRangeSrc->GetCoord(FALSE))
GlobalFunc::CopyObject(*(const GridCell*)pRangeDest, *(GridCell *)pRangeSrc);
if (i == pRangeDest->GetCoord(FALSE))
GlobalFunc::CopyObject(cellTemp, *(GridCell *)pRangeDest);
}
else {
if (i == pRangeSrc->GetCoord(FALSE))
GlobalFunc::CopyObject(*cellDest, *(GridCell *)pRangeSrc);
GlobalFunc::CopyObject(cellTemp, *cellDest);
}
}
else {
GlobalFunc::CopyObject(*cellSrc, cellTemp);
if (pRangeDest) {
GlobalFunc::CopyObject(*(const GridCell*)pRangeDest, *cellSrc);
if (i == pRangeDest->GetCoord(FALSE))
GlobalFunc::CopyObject(cellTemp, *(GridCell *)pRangeDest);
}
else {
GlobalFunc::CopyObject(*cellDest, *cellSrc);
GlobalFunc::CopyObject(cellTemp, *cellDest);
}
}
cellSrc->SetRange((GridRange *)pRangeSrc);
cellDest->SetRange((GridRange *)pRangeDest);
}
return TRUE;
}
// 排序
//-1代表最后一列
void CDbSheet::SortByColumn(int nKeyCol, BOOL bSortAscend, int nRowFrom, int nRowTo)
{
if (nRowTo < 0)
nRowTo = GetRowNum() - 1;
for (int i = nRowFrom; i <= nRowTo; i++) {
for (int j = nRowFrom; j < nRowTo; j++) {
GridCell *pCell1 = (*this)(i, nKeyCol);
GridCell *pCell2 = (*this)(j, nKeyCol);
int nCmp = _tcscmp(pCell1->GetText(), pCell2->GetText());
if ((bSortAscend && nCmp > 0) || (!bSortAscend && nCmp < 0))
SwapRow(i, j);
}
}
}
//-1代表最后一列
void CDbSheet::SortByColumns(const DList<int> &lstKeyCol, BOOL bSortAscend, int nRowFrom, int nRowTo)
{
if (nRowTo < 0)
nRowTo = GetRowNum() - 1;
int nColNum = lstKeyCol.Length();
for (int i = nRowFrom; i <= nRowTo; i++) {
for (int j = nRowFrom; j < nRowTo; j++) {
int nCmp = 0;
for (int n = 0; n < nColNum; n++) {
int nKeyCol = lstKeyCol[n];
GridCell *pCell1 = (*this)(i, nKeyCol);
GridCell *pCell2 = (*this)(j, nKeyCol);
int nCmp1 = _tcscmp(pCell1->GetText(), pCell2->GetText());
if (nCmp1 != 0) {
nCmp = nCmp1;
break;
}
}
if ((bSortAscend && nCmp > 0) || (!bSortAscend && nCmp < 0))
SwapRow(i, j);
}
}
}
// 删除列
void CDbSheet::RemoveColumn(int nCol)
{
assertWriteEnabled();
ASSERT(m_pCells);
int nRowNum = GetRowNum();
int nColNum = GetColumnNum();
if (nColNum <= 1)
return;
GridCell *pCellArray = new GridCell[nRowNum * (nColNum - 1)];
for (int iCol = 0; iCol < nCol; iCol++) {
for (int iRow = 0; iRow < nRowNum; iRow++) {
pCellArray[iRow * (nColNum - 1) + iCol] = m_pCells[iRow * nColNum + iCol];
}
}
for (iCol = nCol + 1; iCol < nColNum; iCol++) {
for (int iRow = 0; iRow < nRowNum; iRow++) {
pCellArray[iRow * (nColNum - 1) + iCol - 1] = m_pCells[iRow * nColNum + iCol];
}
}
delete[]m_pCells;
m_pCells = pCellArray;
m_columns.Remove(nCol);
int nRanNum = m_ranges.Length();
for (int iRan = 0; iRan < nRanNum; iRan++) {
GridRange *pRange = m_ranges[iRan];
if (pRange->GetCoord(FALSE) == pRange->GetCoordMax(FALSE) &&
pRange->GetCoord(FALSE) == nCol) { //整个单元格在列内
m_ranges.Remove();
nRanNum--;
iRan--;
}
else if (pRange->GetCoord(FALSE) > nCol) { //单元格在右边
ASSERT(pRange->GetCoordMax(FALSE) > nCol);
pRange->SetCoord(pRange->GetCoord(TRUE), pRange->GetCoord(FALSE) - 1);
pRange->SetCoordMax(pRange->GetCoordMax(TRUE), pRange->GetCoordMax(FALSE) - 1);
}
else if (pRange->GetCoord(FALSE) <= nCol && pRange->GetCoordMax(FALSE) >= nCol) {
// 跨越列
pRange->SetCoordMax(pRange->GetCoordMax(TRUE), pRange->GetCoordMax(FALSE) - 1);
if (pRange->IsCellar()) {
// 合并单元格退化为单元格
(*this)(pRange->GetCoord(TRUE), pRange->GetCoord(FALSE))->SetRange(NULL);
//add by whl on 040902,解决bug:删除列时原先的合并单元退化时丢文字
(*this)(pRange->GetCoord(TRUE), pRange->GetCoord(FALSE))->SetText(pRange->GetText());
m_ranges.Remove();
nRanNum--;
iRan--;
}
}
else {
ASSERT(pRange->GetCoordMax(FALSE) < nCol); //单元格在左边
ASSERT(pRange->GetCoord(FALSE) < nCol);
// 不发生任何改动
}
}
// 重新计算行高度
CalculateRowHeight(0, GetRowNum() - 1);
}
// 删除行
void CDbSheet::RemoveRow(int nRow)
{
assertWriteEnabled();
ASSERT(m_pCells);
int nRowNum = GetRowNum();
int nColNum = GetColumnNum();
if (nColNum < 1 || nRow < 0 || nRow >= nRowNum)
return;
GridCell *pCellArray = new GridCell[(nRowNum - 1) * nColNum];
for (int iRow = 0; iRow < nRow; iRow++) {
for (int iCol = 0; iCol < nColNum; iCol++) {
pCellArray[iRow * nColNum + iCol] = m_pCells[iRow * nColNum + iCol];
}
}
for (iRow = nRow + 1; iRow < nRowNum; iRow++) {
for (int iCol = 0; iCol < nColNum; iCol++) {
pCellArray[(iRow - 1) * nColNum + iCol] = m_pCells[iRow * nColNum + iCol];
}
}
delete[]m_pCells;
m_pCells = pCellArray;
m_rows.Remove(nRow);
int nRanNum = m_ranges.Length();
for (int iRan = 0; iRan < nRanNum; iRan++) {
GridRange *pRange = m_ranges[iRan];
if (pRange->GetCoord(TRUE) == pRange->GetCoordMax(TRUE) &&
pRange->GetCoord(TRUE) == nRow) { //单元范围在此行内
m_ranges.Remove();
nRanNum--;
iRan--;
}
else if (pRange->GetCoord(TRUE) > nRow) { //单元格在下边
ASSERT(pRange->GetCoordMax(TRUE) > nRow);
pRange->SetCoord(pRange->GetCoord(TRUE) - 1, pRange->GetCoord(FALSE));
pRange->SetCoordMax(pRange->GetCoordMax(TRUE) - 1, pRange->GetCoordMax(FALSE));
}
else if (pRange->GetCoord(TRUE) <= nRow && pRange->GetCoordMax(TRUE) >= nRow) {
// 跨越列
pRange->SetCoordMax(pRange->GetCoordMax(TRUE) - 1, pRange->GetCoordMax(FALSE));
if (pRange->IsCellar()) {
// 合并单元格退化为单元格
(*this)(pRange->GetCoord(TRUE), pRange->GetCoord(FALSE))->SetRange(NULL);
//add by whl on 040902,解决bug:删除行时原先的合并单元退化时丢文字
(*this)(pRange->GetCoord(TRUE), pRange->GetCoord(FALSE))->SetText(pRange->GetText());
m_ranges.Remove();
nRanNum--;
iRan--;
}
}
else {
ASSERT(pRange->GetCoordMax(TRUE) < nRow); //单元格在左边
ASSERT(pRange->GetCoord(TRUE) < nRow);
// 不发生任何改动
}
}
}
BOOL CDbSheet::AddRowAt(int i)
{
SheetRow row;
if (i >= 0 && i < GetRowNum()) {
GlobalFunc::CopyObject(*GetRow(i), row);
}
else {
row.SetHeight(m_nRowHeight);
row.SetRowHeightStyle(SheetRow::kParent);
row.SetVerMode(m_gridStyle.GetVerMode());
row.SeDividerStyle(m_rowDivider);
}
return AddRowAt(i, row);
}
// 增加第i行
BOOL CDbSheet::AddRowAt(int i, const SheetRow &row)
{
assertWriteEnabled();
ASSERT(i >= 0);
int nRowNum = GetRowNum();
int nColNum = GetColumnNum();
if (nColNum < 1)
return FALSE;
SheetRow *pRow = new SheetRow;
VERIFY(GlobalFunc::CopyObject(row, *pRow));
if (i < m_rows.Length()) {
m_rows[i];
m_rows.Insert(pRow);
}
else {
m_rows.Append(pRow);
}
GridCell *pCellArray = new GridCell[(nRowNum + 1) * nColNum];
for (int iRow = 0; iRow < i; iRow++) {
for (int iCol = 0; iCol < nColNum; iCol++) {
pCellArray[iRow * nColNum + iCol] = m_pCells[iRow * nColNum + iCol];
}
}
for (iRow = i; iRow < nRowNum; iRow++) {
for (int iCol = 0; iCol < nColNum; iCol++) {
pCellArray[(iRow + 1) * nColNum + iCol] = m_pCells[iRow * nColNum + iCol];
}
}
if (m_pCells)
delete[]m_pCells;
m_pCells = pCellArray;
int nRanNum = m_ranges.Length();
for (int iRan = 0; iRan < nRanNum; iRan++) {
GridRange *pRange = m_ranges[iRan];
if (pRange->GetCoord(TRUE) >= i) { //在新增行后面
//if(pRange->GetCoord(TRUE)>i)
pRange->SetCoord(pRange->GetCoord(TRUE) + 1, pRange->GetCoord(FALSE));
pRange->SetCoordMax(pRange->GetCoordMax(TRUE) + 1, pRange->GetCoordMax(FALSE));
}
else if (pRange->GetCoordMax(TRUE) >= i) { //跨越新增的行
pRange->SetCoordMax(pRange->GetCoordMax(TRUE) + 1, pRange->GetCoordMax(FALSE));
for (int idx = pRange->GetCoord(FALSE); idx <= pRange->GetCoordMax(FALSE); idx++) {
(*this)(i, idx)->SetRange(pRange);
}
}
}
return TRUE;
}
// 增加第i列
BOOL CDbSheet::AddColumnAt(int i)
{
SheetColumn col;
int nColNum = GetColumnNum();
if (i >= 0 && i < nColNum) {
GlobalFunc::CopyObject(*GetColumn(i), col);
}
else if (i == nColNum) {
GlobalFunc::CopyObject(*GetColumn(nColNum - 1), col);
}
else {
ASSERT(0);
/*
col.SetWidth(24.0);
col.SetGridStyle(m_gridStyle);
col.SeDividerStyle(m_colDivider);
*/
return FALSE;
}
return AddColumnAt(i, col);
}
BOOL CDbSheet::AddColumnAt(int i, const SheetColumn &column)
{
assertWriteEnabled();
ASSERT(i >= 0);
int nRowNum = GetRowNum();
int nColNum = GetColumnNum();
if (nRowNum <= 1)
return FALSE;
SheetColumn *pCol = new SheetColumn;
VERIFY(GlobalFunc::CopyObject(column, *pCol));
if (i < m_columns.Length()) {
m_columns[i];
m_columns.Insert(pCol);
}
else {
m_columns.Append(pCol);
}
// 复制已有的列
GridCell *pCellArray = new GridCell[nRowNum * (nColNum + 1)];
for (int iRow = 0; iRow < nRowNum; iRow++) {
for (int iCol = 0; iCol < i; iCol++) {
pCellArray[iRow * (nColNum + 1) + iCol] = m_pCells[iRow * nColNum + iCol];
}
for (iCol = i; iCol < nColNum; iCol++) {
pCellArray[iRow * (nColNum + 1) + iCol + 1] = m_pCells[iRow * nColNum + iCol];
}
}
if (m_pCells)
delete[]m_pCells;
m_pCells = pCellArray;
//
int nRanNum = m_ranges.Length();
for (int iRan = 0; iRan < nRanNum; iRan++) {
GridRange *pRange = m_ranges[iRan];
if (pRange->GetCoord(FALSE) >= i) { //单元格在新增列后面
pRange->SetCoord(pRange->GetCoord(TRUE), pRange->GetCoord(FALSE) + 1);
pRange->SetCoordMax(pRange->GetCoordMax(TRUE), pRange->GetCoordMax(FALSE) + 1);
}
else if (pRange->GetCoordMax(FALSE) >= i) { //单元格跨越新增的列
pRange->SetCoordMax(pRange->GetCoordMax(TRUE), pRange->GetCoordMax(FALSE) + 1);
for (int idx = pRange->GetCoord(TRUE); idx <= pRange->GetCoordMax(TRUE); idx++) {
(*this)(idx, i)->SetRange(pRange);
}
}
}
return TRUE;
}
//add by whl on 040903
void CDbSheet::Merge(CDbSheet*pSheet, bool bRowMerge)
{
assertWriteEnabled();
CDbSheet*pSheet1 = (CDbSheet*)(pSheet->clone());
DList<SheetColumn> &m_columns1 = pSheet1->m_columns;
DList<SheetRow> &m_rows1 = pSheet1->m_rows;
DList<GridRange> &m_ranges1 = pSheet1->m_ranges;
GridCell *m_pCells1 = pSheet1->m_pCells;
if (bRowMerge)
{
long newRowNum = GetRowNum() + pSheet->GetRowNum(), newColNum = max(GetColumnNum(), pSheet->GetColumnNum());
//复制单元格
GridCell *pNewCells = new GridCell[newRowNum * newColNum];
for (long i = 0; i < GetRowNum(); i++)
for (long j = 0; j < GetColumnNum(); j++)
pNewCells[i * newColNum + j] = m_pCells[i * GetColumnNum() + j];
for (i = 0; i < pSheet->GetRowNum(); i++)
for (long j = 0; j < pSheet->GetColumnNum(); j++)
pNewCells[(i + GetRowNum()) * newColNum + j] = m_pCells1[i * pSheet->GetColumnNum() + j];
delete[] m_pCells;
m_pCells = pNewCells;
//加列
for (i = GetColumnNum(); i < newColNum; i++)
m_columns.Append(new SheetColumn(*m_columns1[i]));
//调整并入合并单元记录
for (i = 0; i < m_ranges1.Length(); i++)
{
GridRange *pRange = m_ranges1[i];
pRange->SetCoord(pRange->GetCoord(TRUE) + GetRowNum(), pRange->GetCoord(FALSE));
pRange->SetCoordMax(pRange->GetCoordMax(TRUE) + GetRowNum(), pRange->GetCoordMax(FALSE));
}
m_ranges << m_ranges1;
//加行
m_rows << m_rows1;
}
else
{
long newRowNum = max(GetRowNum(), pSheet->GetRowNum()), newColNum = GetColumnNum() + pSheet->GetColumnNum();
//复制单元格
GridCell *pNewCells = new GridCell[newRowNum * newColNum];
for (long i = 0; i < GetRowNum(); i++)
for (long j = 0; j < GetColumnNum(); j++)
pNewCells[i * newColNum + j] = m_pCells[i * GetColumnNum() + j];
for (i = 0; i < pSheet->GetRowNum(); i++)
for (long j = 0; j < pSheet->GetColumnNum(); j++)
pNewCells[i * newColNum + j + GetColumnNum()] = m_pCells1[i * pSheet->GetColumnNum() + j];
delete[] m_pCells;
m_pCells = pNewCells;
//加行
for (i = GetRowNum(); i < newRowNum; i++)
m_rows.Append(new SheetRow(*m_rows1[i]));
//调整并入合并单元记录
for (i = 0; i < m_ranges1.Length(); i++)
{
GridRange *pRange = m_ranges1[i];
pRange->SetCoord(pRange->GetCoord(TRUE), pRange->GetCoord(FALSE) + GetColumnNum());
//modify by xlc on 071220
//pRange->SetCoordMax(pRange->GetCoordMax(TRUE)+GetRowNum(),pRange->GetCoordMax(FALSE)+GetColumnNum());
pRange->SetCoordMax(pRange->GetCoordMax(TRUE), pRange->GetCoordMax(FALSE) + GetColumnNum());
}
m_ranges << m_ranges1;
//加行
m_columns << m_columns1;
}
CalculateRowHeight(0, GetRowNum() - 1);
delete pSheet1;
}
/////////////////////////////////////////////////////////////////
// Properties
const DividerStyle&
CDbSheet::GetRowDivider() const
{
return m_rowDivider;
}
const DividerStyle&
CDbSheet::GetColDivider() const
{
return m_colDivider;
}
GridStyle &
CDbSheet::GetGridStyle()
{
return m_gridStyle;
}
DividerStyle &
CDbSheet::GetRowDivider()
{
return m_rowDivider;
}
DividerStyle &
CDbSheet::GetColDivider()
{
return m_colDivider;
}
DividerStyle &
CDbSheet::GetBorderStyle()
{
return m_border;
}
const DividerStyle &
CDbSheet::GetBorderStyle() const
{
return m_border;
}
int CDbSheet::GetRowNum() const
{
return m_rows.Length();
}
int CDbSheet::GetColumnNum() const
{
return m_columns.Length();
}
const SheetRow *
CDbSheet::GetRow(int nRow) const
{
return &m_rows[nRow];
}
const SheetColumn *
CDbSheet::GetColumn(int nCol) const
{
return &m_columns[nCol];
}
SheetRow *
CDbSheet::GetRow(int nRow)
{
return m_rows[nRow];
}
SheetColumn *
CDbSheet::GetColumn(int nCol)
{
return m_columns[nCol];
}
const GridStyle &
CDbSheet::GetGridStyle() const
{
return m_gridStyle;
}
void
CDbSheet::SetBorderStyle(const DividerStyle& src)
{
assertWriteEnabled();
GlobalFunc::CopyObject(src, m_border);
}
void
CDbSheet::SetRowDivider(const DividerStyle& src)
{
assertWriteEnabled();
GlobalFunc::CopyObject(src, m_rowDivider);
}
void
CDbSheet::SetColDivider(const DividerStyle& src)
{
assertWriteEnabled();
GlobalFunc::CopyObject(src, m_colDivider);
}
void CDbSheet::SetGridStyle(const GridStyle &src)
{
assertWriteEnabled();
GlobalFunc::CopyObject(src, m_gridStyle);
}
// 增加第i列
// 没有检查列的数目
BOOL CDbSheet::SetColumnAt(int i, const SheetColumn &column)
{
assertWriteEnabled();
ASSERT(i >= 0);
SheetColumn *pCol = m_columns[i];
VERIFY(GlobalFunc::CopyObject(column, *pCol));
return TRUE;
}
// 增加地i行
BOOL CDbSheet::SetRowAt(int i, const SheetRow &row)
{
assertWriteEnabled();
ASSERT(i >= 0);
SheetRow *pRow = m_rows[i];
VERIFY(GlobalFunc::CopyObject(row, *pRow));
return TRUE;
}
void CDbSheet::GetBorder(XPoly2D &polyBorder) const
{
double nRotWcs = Layout2Wcs(m_nRotation);
BOOL bIncludeTitle = (m_title.IsVisible() &&
m_title.GetDividerStyle().GetDividerFlag() != DividerStyle::kNone);
XPoint ptUpLeft = GetTopLeft(bIncludeTitle);
XPoint ext = GetExtents(bIncludeTitle, FALSE);
XPoint ptLowRight, ptUpRight, ptLowLeft;
ads_polar(ptUpLeft, nRotWcs - PI / 2, ext.y, ptLowLeft);
ads_polar(ptLowLeft, nRotWcs, ext.x, ptLowRight);
ads_polar(ptLowRight, nRotWcs + PI / 2, ext.y, ptUpRight);
polyBorder.Reset();
polyBorder.AppendNode(ptLowLeft);
polyBorder.AppendNode(ptLowRight);
polyBorder.AppendNode(ptUpRight);
polyBorder.AppendNode(ptUpLeft);
polyBorder.SetFlag(1);
//polyBorder.SetElevation(0.0);
}
// 取得表格大小
XPoint CDbSheet::GetExtents(BOOL bIncludeTitle, BOOL bAsPaperUnit) const
{
double nWidth = GetSheetWidth(bAsPaperUnit);
double nHeight = GetSheetHeight(bIncludeTitle, bAsPaperUnit);
return XPoint(nWidth, nHeight);
}
// 取得表格的高度
double CDbSheet::GetSheetHeight(BOOL bIncludeTitle, BOOL bAsPaperUnit) const
{
int nRowNum = m_rows.Length();
double nHeight = GetRowsHeight(0, nRowNum - 1, TRUE);
if (bIncludeTitle) nHeight += m_title.GetHeight();
if (!bAsPaperUnit) {
double nScale = GetPScale();
nHeight *= nScale;
}
return nHeight;
}
// 取得表格的宽度
double CDbSheet::GetSheetWidth(BOOL bAsPaperUnit) const
{
double nWidth = 0.0;
int nColNum = m_columns.Length();
for (int i = 0; i < nColNum; i++) {
const SheetColumn &column = m_columns[i];
nWidth += column.m_nWidth;
}
if (!bAsPaperUnit) {
double nScale = GetPScale();
nWidth *= nScale;
}
return nWidth;
}
// 取得连续几行的行高
double CDbSheet::GetRowsHeight(int nRowFrom, int nRowTo, BOOL bAsPaperUnit) const
{
double nHeight = 0.0;
for (int i = nRowFrom; i <= nRowTo; i++) {
nHeight += GetRowHeight(i, bAsPaperUnit);
}
return nHeight;
}
//取得连续几列的列宽
double CDbSheet::GetColumnsWidth(int nColFrom, int nColTo, BOOL bAsPaperUnit) const
{
double nWidth = 0.0;
for (int i = nColFrom; i <= nColTo; i++) {
nWidth += GetColumnWidth(i, bAsPaperUnit);
}
return nWidth;
}
// 得到某一行的高度
double CDbSheet::GetRowHeight(int nRow, BOOL bAsPaperUnit) const
{
ASSERT(nRow < m_rows.Length());
if (nRow >= m_rows.Length())
return 0.0;
const SheetRow &row = m_rows[nRow];
double nHeight = 0.0;
if (row.m_nHeightFlag == SheetRow::kParent &&
m_rowHeightStyle == SheetRow::kFixed)
nHeight = m_nRowHeight;
else
nHeight = row.m_nHeight;
if (!bAsPaperUnit)
nHeight *= GetPScale();
return nHeight;
}
// 取得某列的宽度
double CDbSheet::GetColumnWidth(int nCol, BOOL bAsPaperUnit) const
{
ASSERT(nCol < m_columns.Length());
const SheetColumn &column = m_columns[nCol];
double nWidth = column.m_nWidth;
if (!bAsPaperUnit)
nWidth *= GetPScale();
return nWidth;
}
// 取得某列的左上角点
XPoint CDbSheet::GetColumnPoint(int nCol) const
{
XPoint ptTopLeft = GetTopLeft(FALSE);
double nWidth = GetColumnsWidth(0, nCol - 1, FALSE);
ads_polar(XPoint(ptTopLeft), Layout2Wcs(m_nRotation), nWidth, ptTopLeft);
return ptTopLeft;
}
// 取得某行的左上角点
XPoint CDbSheet::GetRowPoint(int nRow) const
{
XPoint ptTopLeft = GetTopLeft(FALSE);
double nHeight = GetRowsHeight(0, nRow - 1, FALSE);
ads_polar(XPoint(ptTopLeft), Layout2Wcs(m_nRotation) - PI / 2, nHeight, ptTopLeft);
return ptTopLeft;
}
//取的表格的左上角点
XPoint CDbSheet::GetTopLeft(BOOL bIncludeTitle) const
{
XPoint ext = GetExtents(bIncludeTitle, FALSE);
XPoint ptLowLeft = Align2Base(GetLocation(), GetExtents(m_title.IsVisible(), FALSE));
XPoint ptTopLeft;
ads_polar(ptLowLeft, Layout2Wcs(m_nRotation) + PI / 2, ext.y, ptTopLeft);
return ptTopLeft;
}
// 取得表格位置
XPoint CDbSheet::GetLocation() const
{
return m_ptLocation;
}
// 取表格旋转角度
double CDbSheet::GetRotation() const
{
return m_nRotation;
}
// 取表格定位方式
AcGiDraw::TextAlignment
CDbSheet::GetAlignment() const
{
return m_nAlignment;
}
//取缺省的行高
double CDbSheet::GetRowHeight(BOOL bAsPaperUnit) const
{
double h = m_nRowHeight;
if (!bAsPaperUnit)
h *= GetPScale();
return h;
}
// 设置表格位置
void CDbSheet::SetLocation(XPoint pt)
{
assertWriteEnabled();
m_ptLocation = pt;
m_ptLocation.z = 0;
}
// 设置表格转角
void CDbSheet::SetRotation(double nRot)
{
assertWriteEnabled();
m_nRotation = nRot;
}
// 设置表格的定位对齐方式
void CDbSheet::SetAlignment(AcGiDraw::TextAlignment nAlign)
{
assertWriteEnabled();
m_nAlignment = nAlign;
}
//设置缺省的行高
void CDbSheet::SetRowHeight(double h, BOOL bAsPaperUnit)
{
assertWriteEnabled();
m_nRowHeight = h;
if (!bAsPaperUnit)
m_nRowHeight /= GetPScale();
}
//////////////////////////////////////////////////////////////////
// 单元格属性
XPoint
CDbSheet::GetCellSize(int nRow, int nCol, BOOL bAsPaperUnit) const
{
const GridCell &cell = *(*this)(nRow, nCol);
double w, h;
if (cell.IsRange()) {
const GridRange &range = *cell.GetRange();
w = GetColumnsWidth(range.m_nColumn, range.m_nColumnMax, bAsPaperUnit);
h = GetRowsHeight(range.m_nRow, range.m_nRowMax, bAsPaperUnit);
}
else {
w = GetColumnWidth(nCol, bAsPaperUnit);
h = GetRowHeight(nRow, bAsPaperUnit);
}
return XPoint(w, h);
}
XPoint
CDbSheet::GetCellPoint(int nRow, int nCol) const
{
const GridCell *pCell = (*this)(nRow, nCol);
if (pCell->IsRange()) {
nRow = pCell->GetRange()->GetCoord(TRUE);
nCol = pCell->GetRange()->GetCoord(FALSE);
}
double x = GetColumnsWidth(0, nCol - 1, FALSE);
double y = GetRowsHeight(0, nRow - 1, FALSE);
XPoint ptTopLeft = GetTopLeft(FALSE);
XPoint ptDest;
ads_polar(ptTopLeft, Layout2Wcs(m_nRotation), x, ptDest);
ads_polar(XPoint(ptDest), Layout2Wcs(m_nRotation) - PI / 2, y, ptDest);
return ptDest;
}
// 判断某单元格是否有底线
BOOL CDbSheet::HasRowDivider(int nRow, int nCol) const
{
const GridCell *pCell = (*this)(nRow, nCol);
if (!pCell)
return TRUE; //没有内容的单元格, 作为空的单元格, 有底线
BOOL bRet = TRUE;
if (pCell->IsRange() && nRow < pCell->GetRange()->m_nRowMax)
bRet = FALSE;
return bRet;
}
// 判断某单元格是否有右线
BOOL CDbSheet::HasColumnDivider(int nRow, int nCol) const
{
const GridCell *pCell = (*this)(nRow, nCol);
if (!pCell) //没有内容的单元格, 作为空的单元格, 有边线
return TRUE;
BOOL bRet = TRUE;
if (pCell->IsRange() && nCol < pCell->GetRange()->m_nColumnMax)
bRet = FALSE;
return bRet;
}
// 求单元格最终有效的属性样式
const GridStyle *
CDbSheet::GetCellGridStyle(int nRow, int nCol, int nOverFlag, BOOL *bLocal) const
{
const GridCell &cell = *(*this)(nRow, nCol);
const GridStyle &rStyle = cell.IsRange() ?
cell.GetRange()->m_gridStyle : cell.m_gridStyle;
return GetCellGridStyle(rStyle, nCol, nOverFlag, bLocal);
}
// 取得单元格最终的有效样式
const GridStyle *
CDbSheet::GetCellGridStyle(const GridStyle &rStyle, int nCol, int nOverFlag, BOOL*bLocal) const
{
const GridStyle *pGridStyle = NULL;
if (rStyle.m_nOverride & nOverFlag) {
pGridStyle = &rStyle;
if (bLocal) *bLocal = TRUE;
}
else {
if (bLocal) *bLocal = FALSE;
const SheetColumn &column = m_columns[nCol];
if (column.m_gridStyle.m_nOverride & nOverFlag)
pGridStyle = &column.m_gridStyle;
else if (m_gridStyle.m_nOverride & nOverFlag)
pGridStyle = &m_gridStyle;
}
return pGridStyle;
}
// 取得单元格的水平对齐方式
AcDb::TextHorzMode
CDbSheet::GetCellHorMode(int nRow, int nCol, BOOL *bLocal) const
{
const GridStyle *style = GetCellGridStyle(nRow, nCol, OF_HORMODE, bLocal);
ASSERT(style);
return style->m_nHorMode;
}
// 取得单元格的垂直对齐方式, 继承方式不同于其它
AcDb::TextVertMode
CDbSheet::GetCellVerMode(int nRow, int nCol, BOOL *bLocal) const
{
const GridCell &cell = *(*this)(nRow, nCol);
const GridStyle &rStyle = cell.IsRange() ?
cell.GetRange()->m_gridStyle : cell.m_gridStyle;
AcDb::TextVertMode nVerMode;
if (rStyle.m_nOverride & OF_VERMODE) {
nVerMode = rStyle.m_nVerMode;
if (bLocal) *bLocal = TRUE;
}
else {
nVerMode = m_rows[nRow].m_nVerMode;
if (nVerMode == AcDb::kTextBase) { //继承
nVerMode = m_gridStyle.GetVerMode();
}
if (bLocal) *bLocal = FALSE;
}
return nVerMode;
}
//取得单元格的文本行间距
double
CDbSheet::GetCellLineSpace(int nRow, int nCol, BOOL bAsPaperUnit) const
{
const GridStyle *style1 = GetCellGridStyle(nRow, nCol, OF_LINESPACE);
const GridStyle *style2 = GetCellGridStyle(nRow, nCol, OF_TEXTHEIGHT);
ASSERT(style1 && style2);
double nVal = style1->m_nLineSpaceFactor * style2->m_nTextHeight;
if (!bAsPaperUnit)
nVal *= GetPScale();
return nVal;
}
//取得单元格的文本行间距
double
CDbSheet::GetCellLineSpaceFactor(int nRow, int nCol, BOOL *bLocal) const
{
const GridStyle *style = GetCellGridStyle(nRow, nCol, OF_LINESPACE, bLocal);
ASSERT(style);
double nLineSpaceFactor = style->m_nLineSpaceFactor;
return nLineSpaceFactor;
}
// 取得单元格的文本高度
double
CDbSheet::GetCellTextHeight(int nRow, int nCol, BOOL bAsPaperUnit, BOOL *bLocal) const
{
const GridStyle *style = GetCellGridStyle(nRow, nCol, OF_TEXTHEIGHT, bLocal);
ASSERT(style);
double nHeight = style->m_nTextHeight;
if (!bAsPaperUnit)
nHeight *= GetPScale();
return nHeight;
}
// 取得单元格的文字样式
AcDbObjectId
CDbSheet::GetCellTextStyle(int nRow, int nCol, BOOL *bLocal) const
{
const GridStyle *style = GetCellGridStyle(nRow, nCol, OF_TEXTSTYLE, bLocal);
ASSERT(style);
AcDbObjectId idStyle = style->m_idTextStyle;
if (!idStyle)
idStyle = m_gridStyle.GetTextStyleId();
return idStyle;
}
// 取得单元格的文字颜色
Adesk::UInt16
CDbSheet::GetCellTextColor(int nRow, int nCol, BOOL *bLocal) const
{
const GridStyle *style = GetCellGridStyle(nRow, nCol, OF_TEXTCOLOR, bLocal);
ASSERT(style);
return style->m_nTextColor;
}
// 单元格文字是否自动换行
BOOL CDbSheet::IsCellWrapEnabled(int nRow, int nCol, BOOL *bLocal) const
{
const GridStyle *style = GetCellGridStyle(nRow, nCol, OF_TEXTWRAP, bLocal);
ASSERT(style);
return style->m_bTextWrap;
}
//////////////////////////////////////////////////////////////////
// 标题的属性
// 标题的属性为局部, 不继承
// 求标题最终有效的属性样式
const GridStyle *
CDbSheet::GetTitleGridStyle(int nOverFlag, BOOL *bLocal) const
{
const GridStyle *pGridStyle = NULL;
pGridStyle = &m_title.m_gridStyle;
if (bLocal) *bLocal = TRUE;
/*
if(m_title.m_gridStyle.m_nOverride&nOverFlag) {
pGridStyle=&m_title.m_gridStyle;
if(bLocal) *bLocal=TRUE;
} else if(m_gridStyle.m_nOverride&nOverFlag) {
pGridStyle=&m_gridStyle;
if(bLocal) *bLocal=FALSE;
}*/
return pGridStyle;
}
// 标题的高度
double CDbSheet::GetTitleHeight(BOOL bAsPaperUnit) const
{
double nHeight = m_title.m_nHeight;
if (!bAsPaperUnit)
nHeight *= GetPScale();
return nHeight;
}
// 标题文字的水平对齐方式
AcDb::TextHorzMode
CDbSheet::GetTitleHorMode(BOOL *bLocal) const
{
const GridStyle *style = GetTitleGridStyle(OF_HORMODE, bLocal);
ASSERT(style);
return style->m_nHorMode;
}
// 取得单元格的垂直对齐方式
AcDb::TextVertMode
CDbSheet::GetTitleVerMode(BOOL *bLocal) const
{
const GridStyle *style = GetTitleGridStyle(OF_VERMODE, bLocal);
ASSERT(style);
return style->GetVerMode();
}
// 标题的文字行间距
double CDbSheet::GetTitleLineSpace(BOOL bAsPaperUnit) const
{
double nTextHeight = GetTitleTextHeight(bAsPaperUnit);
const GridStyle *style = GetTitleGridStyle(OF_LINESPACE);
double nLineSpaceFactor = (style ? style->m_nLineSpaceFactor : LSF_DEFAULT);
return (nTextHeight * nLineSpaceFactor);
}
// 标题的文字行间距
double CDbSheet::GetTitleLineSpaceFactor(BOOL *bLocal) const
{
const GridStyle *style = GetTitleGridStyle(OF_LINESPACE, bLocal);
double nLineSpaceFactor = (style ? style->m_nLineSpaceFactor : LSF_DEFAULT);
return nLineSpaceFactor;
}
// 标题的文字高度
double CDbSheet::GetTitleTextHeight(BOOL bAsPaperUnit, BOOL *bLocal) const
{
const GridStyle *style = GetTitleGridStyle(OF_TEXTHEIGHT, bLocal);
ASSERT(style);
double nHeight = style->m_nTextHeight;
if (!bAsPaperUnit)
nHeight *= GetPScale();
return nHeight;
}
// 标题的文字样式
AcDbObjectId CDbSheet::GetTitleTextStyle(BOOL *bLocal) const
{
const GridStyle *style = GetTitleGridStyle(OF_TEXTSTYLE, bLocal);
ASSERT(style);
AcDbObjectId idStyle = style->m_idTextStyle;
if (!idStyle)
idStyle = m_gridStyle.GetTextStyleId();
return idStyle;
}
Adesk::UInt16 CDbSheet::GetTitleTextColor(BOOL *bLocal) const
{
const GridStyle *style = GetTitleGridStyle(OF_TEXTCOLOR, bLocal);
ASSERT(style);
return style->GetTextColor();
}
// 标题文字是否自动换行
BOOL CDbSheet::IsTitleWrapEnabled(BOOL *bLocal) const
{
const GridStyle *style = GetTitleGridStyle(OF_TEXTWRAP, bLocal);
ASSERT(style);
return style->m_bTextWrap;
}
// 取得标题文本
const TCHAR *CDbSheet::GetTitleText() const
{
return (const TCHAR *)m_title.m_sText;
}
// 设置标题文本
void CDbSheet::SetTitleText(const TCHAR *szText)
{
assertWriteEnabled();
m_title.m_sText = szText;
}
void CDbSheet::SetTitleHeight(double h, BOOL bAsPaperUnit)
{
assertWriteEnabled();
if (!bAsPaperUnit)
h /= GetPScale();
m_title.SetHeight(h);
}
void CDbSheet::SetTitleGridStyle(const GridStyle &gridStyle)
{
assertWriteEnabled();
m_title.SetGridStyle(gridStyle);
}
const SheetTitle &
CDbSheet::GetTitle() const
{
return m_title;
}
SheetTitle&
CDbSheet::GetTitle()
{
return m_title;
}
const TCHAR* CDbSheet::GetDefaultLayer()const
{
return LAY_SHEET;
}
void InitDbSheet(BOOL bTrue)
{
if (bTrue) {
CDbSheet::rxInit();
acrxBuildClassHierarchy();
//CDbSheet::InitMatchProtocol(TRUE);
}
else {
//CDbSheet::InitMatchProtocol(FALSE);
deleteAcRxClass(CDbSheet::desc());
}
}