Files
envi-code/SourceCode/Code2026/tg_shs/shs_kernal/DbDrawingName.cpp
T

1145 lines
31 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
/////////////////////////////////////////////
2026-09-28 15:28:50 +08:00
// TDbDrawingName custom object.
#include "StdAfx.h"
2026-10-04 00:04:20 +08:00
// sg add 120313,增加符号文字导出所在图层设置
2026-09-28 15:28:50 +08:00
extern int g_nSymbTextT3Layer;
2026-10-04 00:04:20 +08:00
// nVersion=1:5.0-7.0;nVersion=2:8.0的Beta1;nVersion=2:8.0的Beta2起
2026-09-28 15:28:50 +08:00
// Adesk::Int16 TDbDrawingName::g_nVersion = 1; // sg modify 090112
// Adesk::Int16 TDbDrawingName::g_nVersion = 2; // sg modify 090325
Adesk::Int16 TDbDrawingName::g_nVersion = 3;
ACRX_DXF_DEFINE_MEMBERS(ATSDrawingName, ATSEntity, AcDb::kDHL_CURRENT,
AcDb::kMReleaseCurrent, 1 ,ATS_DRAWINGNAME,
2026-10-04 00:04:20 +08:00
"ATS_DRAWINGNAME图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
2026-09-28 15:28:50 +08:00
IMPLEMENT_TENTBASE(TDbDrawingName);
#define DRAWINGNAME_REGIONPL _T("DNREGION")
// Constructor / Destructor
TDbDrawingName::TDbDrawingName()
{
m_dRotation = 0.0;
m_dNameHeight = 7.0;
m_dScaleHeight = 5.0;
m_dLineWidth = 0.7;
// m_dMultiple = 1.0;
m_dMultiple = 0.6; // modified by whl on 020613
2026-10-04 00:04:20 +08:00
// sg modify 120106,给“TS_DRAWINGNAME”独立出来一个文字样式
2026-09-28 15:28:50 +08:00
//m_idNameStyle = InitTextStyle(TS_STANDARD);
//m_idScaleStyle = InitTextStyle(TS_STANDARD);
m_idNameStyle = InitTextStyle(TS_DRAWINGNAME);
m_idScaleStyle = InitTextStyle(TS_DRAWINGNAME);
m_bShowScale = TRUE;
m_iDrawStyle = 1;
m_colorText = 7;
m_bShowRegion = FALSE;
}
Acad::ErrorStatus
TDbDrawingName::subGetClassID(CLSID* pClsid) const
{
return Acad::eOk;
}
Acad::ErrorStatus
TDbDrawingName::dwgInFields(AcDbDwgFiler* filer)
{
assertWriteEnabled();
Acad::ErrorStatus es;
if ((es = TDbEntity::dwgInFields(filer)) != Acad::eOk)
return es;
Adesk::Int16 version;
filer->readItem(&version);
if (version > g_nVersion)
return Acad::eMakeMeProxy;
// switch(version)
// {
// case 1:
// {
// AcGePoint3d ptLoc;
// filer->readItem(&ptLoc);
// m_ptLocation = ptLoc;
// ReadString(filer, m_szNameText);
// ReadString(filer, m_szScaleText);
// filer->readItem(&m_dRotation);
// filer->readItem(&m_dNameHeight);
// filer->readItem(&m_dScaleHeight);
// filer->readItem(&m_dLineWidth);
// filer->readItem(&m_dMultiple);
// filer->readItem(&m_idNameStyle);
// filer->readItem(&m_idScaleStyle);
// filer->readItem(&m_bShowScale);
// filer->readItem(&m_iDrawStyle);
// filer->readItem(&m_colorText);
// break;
// }
// default:
// assert(false);
// }
AcGePoint3d ptLoc; // sg modify 090112
filer->readItem(&ptLoc);
m_ptLocation = ptLoc;
ReadString(filer, m_szNameText);
ReadString(filer, m_szScaleText);
filer->readItem(&m_dRotation);
filer->readItem(&m_dNameHeight);
filer->readItem(&m_dScaleHeight);
filer->readItem(&m_dLineWidth);
filer->readItem(&m_dMultiple);
filer->readItem(&m_idNameStyle);
filer->readItem(&m_idScaleStyle);
filer->readItem(&m_bShowScale);
filer->readItem(&m_iDrawStyle);
filer->readItem(&m_colorText);
2026-10-04 00:04:20 +08:00
if (version > 1) // sg add 090112,8.0起
2026-09-28 15:28:50 +08:00
{
filer->readItem((AcGePoint3d *)&m_ptMidLoc);
2026-10-04 00:04:20 +08:00
if (version == 2) // sg add 090325,处理8.0的Beta1版本
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
GetCenterPtIncludeScale(); // 转化为Beta2中的包括比例部分的居中对齐点
// sg add 090325,8.0的BETA2起,将“文字转角”并入“布局转角”
2026-09-28 15:28:50 +08:00
m_nLayoutRotation = m_nLayoutRotation + m_dRotation;
m_dRotation = 0;
}
}
2026-10-04 00:04:20 +08:00
else // 处理8.0以前版本
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
GetBottomCenterPt(); // 将7.5中的m_ptLocation点转化为m_ptMidLoc
// sg add 090320,8.0的BETA2起,将“文字转角”并入“布局转角”
2026-09-28 15:28:50 +08:00
m_nLayoutRotation = m_nLayoutRotation + m_dRotation;
m_dRotation = 0;
}
return filer->filerStatus();
}
Acad::ErrorStatus
TDbDrawingName::dwgOutFields(AcDbDwgFiler* filer) const
{
assertReadEnabled();
if (!IsValid())
return Acad::eNotApplicable;
Acad::ErrorStatus es;
if ((es = TDbEntity::dwgOutFields(filer)) != Acad::eOk)
return es;
Adesk::Int16 version = g_nVersion;
// filer->writeItem(version);
2026-10-04 00:04:20 +08:00
if (g_nSaveTArchVer < 8) // 7.5及以前,版本号为1,sg modify 090112
2026-09-28 15:28:50 +08:00
filer->writeItem((Adesk::UInt16)1);
2026-10-04 00:04:20 +08:00
else // 8.0的BETA2,版本号为3
2026-09-28 15:28:50 +08:00
filer->writeItem(g_nVersion);
filer->writeItem(m_ptLocation.AsAcGePoint3d());
filer->writeItem(m_szNameText);
filer->writeItem(m_szScaleText);
filer->writeItem(m_dRotation);
filer->writeItem(m_dNameHeight);
filer->writeItem(m_dScaleHeight);
filer->writeItem(m_dLineWidth);
filer->writeItem(m_dMultiple);
filer->writeItem(m_idNameStyle);
filer->writeItem(m_idScaleStyle);
filer->writeItem(m_bShowScale);
filer->writeItem(m_iDrawStyle);
filer->writeItem(m_colorText);
if (g_nSaveTArchVer > 7) // sg add 090112
{
filer->writeItem(m_ptMidLoc.AsAcGePoint3d());
}
return filer->filerStatus();
}
Acad::ErrorStatus
TDbDrawingName::dxfInFields(AcDbDxfFiler* filer)
{
assertWriteEnabled();
Acad::ErrorStatus es = Acad::eOk;
resbuf rb;
if (TDbEntity::dxfInFields(filer) != Acad::eOk ||
!filer->atSubclassData(_T("TDbDrawingName")))
{
return filer->filerStatus();
}
Adesk::Int16 version;
filer->readItem(&rb);
if (rb.restype != AcDb::kDxfInt16)
{
filer->pushBackItem();
2026-10-04 00:04:20 +08:00
filer->setError(Acad::eInvalidDxfCode, _T("\n错误:需要组码%d(version)"), AcDb::kDxfInt16);
2026-09-28 15:28:50 +08:00
return filer->filerStatus();
}
version = rb.resval.rint;
if (version > g_nVersion)
return Acad::eMakeMeProxy;
while((es == Acad::eOk) && ((es = filer->readResBuf(&rb)) == Acad::eOk))
{
switch(rb.restype) {
case AcDb::kDxfXCoord:
m_ptLocation = asPnt3d(rb.resval.rpoint);
break;
case AcDb::kDxfText:
m_szNameText = rb.resval.rstring;
break;
case AcDb::kDxfText+1:
m_szScaleText = rb.resval.rstring;
break;
case AcDb::kDxfAngle:
m_dRotation = rb.resval.rreal;
break;
case AcDb::kDxfReal:
m_dNameHeight = rb.resval.rreal;
break;
case AcDb::kDxfReal+1:
m_dScaleHeight = rb.resval.rreal;
break;
case AcDb::kDxfReal+2:
m_dLineWidth = rb.resval.rreal;
break;
case AcDb::kDxfReal+3:
m_dMultiple = rb.resval.rreal;
break;
case AcDb::kDxfHardPointerId:
acdbGetObjectId(m_idNameStyle, rb.resval.rlname);
break;
case AcDb::kDxfHardPointerId+1:
acdbGetObjectId(m_idScaleStyle, rb.resval.rlname);
break;
case AcDb::kDxfBool:
m_bShowScale = rb.resval.rint;
break;
case AcDb::kDxfInt16+1:
m_iDrawStyle = rb.resval.rint;
break;
default:
filer->pushBackItem();
es = Acad::eEndOfFile;
break;
}
}
if (es != Acad::eEndOfFile)
return Acad::eInvalidResBuf;
return filer->filerStatus();
}
Acad::ErrorStatus
TDbDrawingName::dxfOutFields(AcDbDxfFiler* filer) const
{
assertReadEnabled();
if (!IsValid())
return Acad::eNotApplicable;
Acad::ErrorStatus es;
if ((es = TDbEntity::dxfOutFields(filer)) != Acad::eOk)
{
return es;
}
filer->writeItem(AcDb::kDxfSubclass, _T("TDbDrawingName"));
Adesk::UInt16 version = g_nVersion;
filer->writeInt16(AcDb::kDxfInt16, version);
filer->writePoint3d(AcDb::kDxfXCoord, m_ptLocation);
filer->writeString(AcDb::kDxfText, m_szNameText);
filer->writeString(AcDb::kDxfText+1, m_szScaleText);
filer->writeDouble(AcDb::kDxfAngle, m_dRotation);
filer->writeDouble(AcDb::kDxfReal, m_dNameHeight);
filer->writeDouble(AcDb::kDxfReal+1, m_dScaleHeight);
filer->writeDouble(AcDb::kDxfReal+2, m_dLineWidth);
filer->writeDouble(AcDb::kDxfReal+3, m_dMultiple);
filer->writeObjectId(AcDb::kDxfHardPointerId, m_idNameStyle);
filer->writeObjectId(AcDb::kDxfHardPointerId+1, m_idScaleStyle);
filer->writeInt16(AcDb::kDxfBool, m_bShowScale);
filer->writeInt16(AcDb::kDxfInt16+1, m_iDrawStyle);
return filer->filerStatus();
}
Acad::ErrorStatus TDbDrawingName::GetGripText(int idx, CString &cs) const
{
assertReadEnabled();
Acad::ErrorStatus es = Acad::eOk;
switch(idx) {
case 0:
2026-10-04 00:04:20 +08:00
cs = _T("移动图名标注");
2026-09-28 15:28:50 +08:00
break;
case 1:
2026-10-04 00:04:20 +08:00
cs = _T("移动比例位置");
2026-09-28 15:28:50 +08:00
break;
default:
es = Acad::eInvalidIndex;
break;
}
return es;
}
Acad::ErrorStatus
TDbDrawingName::subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
assertReadEnabled();
2026-10-04 00:04:20 +08:00
// gripPoints.append(m_ptLocation); // sg modify 090112,改为居中对齐点
2026-09-28 15:28:50 +08:00
gripPoints.append(m_ptMidLoc);
2026-10-04 00:04:20 +08:00
if (m_bShowScale) // 显示比例
2026-09-28 15:28:50 +08:00
{
XPoint ptScaleLoc = GetScaleLocation();
gripPoints.append(ptScaleLoc);
}
2026-10-04 00:04:20 +08:00
// add by hh 2013-10-15 增加区域线条夹点
2026-09-28 15:28:50 +08:00
TGGePoly2D poly;
if(GetRegionPoly(&poly))
{
for(int i = 0; i < poly.Length(); i++)
{
gripPoints.append(*(poly[i]));
}
}
// add end
return Acad::eOk;
}
Acad::ErrorStatus
TDbDrawingName::subGetOsnapPoints(AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const
{
assertReadEnabled();
Acad::ErrorStatus es = Acad::eNotApplicable;
switch(osnapMode) {
case AcDb::kOsModeIns:
{
2026-10-04 00:04:20 +08:00
// snapPoints.append(m_ptLocation); // sg modify 090112,改为居中对齐点
2026-09-28 15:28:50 +08:00
snapPoints.append(m_ptMidLoc);
2026-10-04 00:04:20 +08:00
if (m_bShowScale) // 显示比例
2026-09-28 15:28:50 +08:00
{
XPoint ptScaleLoc = GetScaleLocation();
snapPoints.append(ptScaleLoc);
}
es = Acad::eOk;
}
break;
default:
break;
}
return es;
}
Acad::ErrorStatus
TDbDrawingName::subMoveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
if (indices.length()==0 || offset.isZeroLength())
return Acad::eOk;
assertWriteEnabled();
TDbXDataMap* pXData = GetSpecialtyData();
AcGePoint3dArray arPts;
pXData->GetAt(DRAWINGNAME_REGIONPL, arPts);
for (int i = 0; i < indices.length(); i++)
{
int idx = indices[i];
switch(idx) {
case 0:
2026-10-04 00:04:20 +08:00
// m_ptLocation += offset; // sg modify 090112,改为居中对齐点
2026-09-28 15:28:50 +08:00
m_ptMidLoc += offset;
break;
case 1:
{
2026-10-04 00:04:20 +08:00
if (m_bShowScale) // 显示比例
2026-09-28 15:28:50 +08:00
{
AcGeVector3d vtUnit(AcGeVector3d::kXAxis);
2026-10-04 00:04:20 +08:00
// sg modify 090320,8.0起将文字转角并入布局转角
2026-09-28 15:28:50 +08:00
// vtUnit.rotateBy(m_dRotation + GetLayoutRotation(), AcGeVector3d::kZAxis);
vtUnit.rotateBy(GetLayoutRotation(), AcGeVector3d::kZAxis);
2026-10-04 00:04:20 +08:00
double dAngle = vtUnit.angleTo(offset); // 将变化量投影到布局转角方向
2026-09-28 15:28:50 +08:00
m_dMultiple += offset.length() * cos(dAngle) / GetPScale() / m_dNameHeight;
}
}
break;
default:
break;
}
2026-10-04 00:04:20 +08:00
// add by hh 2013-10-15 增加区域夹点的处理
2026-09-28 15:28:50 +08:00
if(0 != arPts.length())
{
if(m_bShowScale)
idx -= 2;
else
idx -= 1;
if(0 <= idx && idx < arPts.length())
{
arPts[idx] += offset;
SetRegionPoly(arPts);
}
}
// add end
}
return Acad::eOk;
}
Acad::ErrorStatus
TDbDrawingName::subTransformBy(const AcGeMatrix3d& xform)
{
assertWriteEnabled();
Acad::ErrorStatus es;
if ((es = TDbEntity::subTransformBy(xform)) != Acad::eOk)
return es;
2026-10-04 00:04:20 +08:00
// m_ptLocation.TransformBy(xform); // sg modify 090112,改为居中对齐点
2026-09-28 15:28:50 +08:00
m_ptMidLoc.TransformBy(xform);
2026-10-04 00:04:20 +08:00
// add by hh 2013-10-15 区域PL
2026-09-28 15:28:50 +08:00
TDbXDataMap* pXData = GetSpecialtyData();
if(NULL != pXData)
{
AcGePoint3dArray arPts;
if(pXData->GetAt(DRAWINGNAME_REGIONPL, arPts))
{
int nLen = arPts.length();
for(int i = 0; i < nLen; i++)
{
arPts[i].transformBy(xform);
}
SetRegionPoly(arPts);
}
}
// add end
2026-10-04 00:04:20 +08:00
// sg delete 090325,图名的位置点调整到整个符号的居中对齐,镜像时,不再需要调整
2026-09-28 15:28:50 +08:00
// AcGeVector3d vtRotation = GetVector();
// vtRotation.transformBy(xform);
// if (IsMirrorMatrix(xform))
// {
// AcGeVector3d vec = vtRotation;
// vec.rotateBy(Wcs2Ucs(0.0), AcGeVector3d::kZAxis);
// if (vec.x < 0.0)
// {
// m_ptLocation += vtRotation;
// vtRotation.negate();
// }
// else
// m_ptLocation -= m_dNameHeight * GetPScale() * vtRotation.perpVector();
// }
2026-10-04 00:04:20 +08:00
// modified by whl on 060707,只改变布局转角
2026-09-28 15:28:50 +08:00
// double dAngle = vtRotation.angleTo(AcGeVector3d::kXAxis);
// if (vtRotation.y < 0.0)
// dAngle = 2 * PI - dAngle;
// m_dRotation = dAngle - GetLayoutRotation();
return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
// sg add 090327,获取整个符号长度/线长(沿布局转角方向)
2026-09-28 15:28:50 +08:00
double TDbDrawingName::GetTotalLen() const
{
assertReadEnabled();
TDbText text;
text.setPropertiesFrom(this);
text.SetRotation(0.0);
text.SetAlignment(XExplodeDraw::kBottomLeft);
text.SetHeight(m_dNameHeight);
text.SetStyleId(m_idNameStyle);
2026-10-04 00:04:20 +08:00
text.SetText(m_szNameText); // 图名文字
2026-09-28 15:28:50 +08:00
text.SetLocation(XPoint());
double dNameX(0.0), dNameY(0.0);
text.GetExtents(&dNameX, &dNameY);
double dRet = dNameX;
2026-10-04 00:04:20 +08:00
if (m_bShowScale) // 显示比例
2026-09-28 15:28:50 +08:00
{
text.SetHeight(m_dScaleHeight);
text.SetStyleId(m_idScaleStyle);
2026-10-04 00:04:20 +08:00
text.SetText(m_szScaleText); // 比例文字
2026-09-28 15:28:50 +08:00
text.SetLocation(XPoint());
double dScaleX(0.0), dScaleY(0.0);
text.GetExtents(&dScaleX, &dScaleY);
dRet += m_dMultiple * m_dNameHeight * GetPScale() + dScaleX;
2026-10-04 00:04:20 +08:00
if (m_iDrawStyle == 0) // 传统样式
2026-09-28 15:28:50 +08:00
dRet += 0.2 * m_dScaleHeight * GetPScale();
}
2026-10-04 00:04:20 +08:00
else // 不显示比例
2026-09-28 15:28:50 +08:00
dRet += 0.2 * m_dNameHeight * GetPScale();
return dRet;
}
double TDbDrawingName::GetLineLen() const
{
assertReadEnabled();
TDbText text;
text.setPropertiesFrom(this);
text.SetRotation(0.0);
text.SetAlignment(XExplodeDraw::kBottomLeft);
text.SetHeight(m_dNameHeight);
text.SetStyleId(m_idNameStyle);
2026-10-04 00:04:20 +08:00
text.SetText(m_szNameText); // 图名文字
2026-09-28 15:28:50 +08:00
text.SetLocation(XPoint());
double dNameX(0.0), dNameY(0.0);
text.GetExtents(&dNameX, &dNameY);
double dRet = dNameX;
2026-10-04 00:04:20 +08:00
if (m_bShowScale && m_iDrawStyle==0) // 传统样式,显示比例
2026-09-28 15:28:50 +08:00
{
text.SetHeight(m_dScaleHeight);
text.SetStyleId(m_idScaleStyle);
2026-10-04 00:04:20 +08:00
text.SetText(m_szScaleText); // 比例文字
2026-09-28 15:28:50 +08:00
text.SetLocation(XPoint());
double dScaleX(0.0), dScaleY(0.0);
text.GetExtents(&dScaleX, &dScaleY);
dRet += m_dMultiple * m_dNameHeight * GetPScale() + dScaleX;
dRet += 0.2 * m_dScaleHeight * GetPScale();
}
2026-10-04 00:04:20 +08:00
else // 不显示比例
2026-09-28 15:28:50 +08:00
dRet += 0.2 * m_dNameHeight * GetPScale();
return dRet;
}
2026-10-04 00:04:20 +08:00
// 根据m_ptMidLoc点,计算“图名”、“比例”绘制点
XPoint TDbDrawingName::GetNameDrawPt() const // sg add 090325,图名绘制点
2026-09-28 15:28:50 +08:00
{
assertReadEnabled();
AcGeVector3d vtUnit(AcGeVector3d::kXAxis);
2026-10-04 00:04:20 +08:00
// 8.0起,文字转角并入布局转角
2026-09-28 15:28:50 +08:00
vtUnit.rotateBy(GetLayoutRotation(), AcGeVector3d::kZAxis);
XPoint ptRet;
double dDist = GetTotalLen() * 0.5;
ptRet = m_ptMidLoc - dDist * vtUnit;
return ptRet;
}
2026-10-04 00:04:20 +08:00
XPoint TDbDrawingName::GetScaleLocation() const // 比例绘制点
2026-09-28 15:28:50 +08:00
{
assertReadEnabled();
AcGeVector3d vtUnit(AcGeVector3d::kXAxis);
2026-10-04 00:04:20 +08:00
// sg modify 090320,8.0起将文字转角并入布局转角
2026-09-28 15:28:50 +08:00
// vtUnit.rotateBy(m_dRotation+GetLayoutRotation(), AcGeVector3d::kZAxis);
vtUnit.rotateBy(GetLayoutRotation(), AcGeVector3d::kZAxis);
TDbText text;
text.setPropertiesFrom(this);
text.SetRotation(0.0);
text.SetAlignment(XExplodeDraw::kBottomLeft);
text.SetHeight(m_dNameHeight);
text.SetStyleId(m_idNameStyle);
2026-10-04 00:04:20 +08:00
text.SetText(m_szNameText); // 图名
2026-09-28 15:28:50 +08:00
text.SetLocation(XPoint());
double dNameX(0.0), dNameY(0.0);
text.GetExtents(&dNameX, &dNameY);
2026-10-04 00:04:20 +08:00
// sg delete 090327,调用GetTotalLen函数处理
2026-09-28 15:28:50 +08:00
// text.SetAlignment(XExplodeDraw::kBottomLeft);
// text.SetHeight(m_dScaleHeight);
// text.SetStyleId(m_idScaleStyle);
2026-10-04 00:04:20 +08:00
// text.SetText(m_szScaleText); // 比例
2026-09-28 15:28:50 +08:00
// text.SetLocation(XPoint());
// double dScaleX(0.0), dScaleY(0.0);
// text.GetExtents(&dScaleX, &dScaleY);
XPoint ptRet;
double dDist = GetTotalLen() * 0.5; // sg add 090327
// ptRet = m_ptLocation + (dNameX + m_dMultiple * dNameY) * vtUnit; // sg modify 090112
ptRet = m_ptMidLoc + (dNameX + m_dMultiple*dNameY - dDist) * vtUnit;
return ptRet;
}
2026-10-04 00:04:20 +08:00
// 8.0的Beta2起,该函数未使用,原设计意图是处理镜像时,整个符号的位置点
2026-09-28 15:28:50 +08:00
AcGeVector3d TDbDrawingName::GetVector() const
{
AcGeVector3d vtUnit(AcGeVector3d::kXAxis);
2026-10-04 00:04:20 +08:00
// sg modify 090320,8.0起将文字转角并入布局转角
2026-09-28 15:28:50 +08:00
// vtUnit.rotateBy(m_dRotation+GetLayoutRotation(), AcGeVector3d::kZAxis);
vtUnit.rotateBy(GetLayoutRotation(), AcGeVector3d::kZAxis);
TDbText text;
text.setPropertiesFrom(this);
text.SetRotation(0.0);
text.SetAlignment(XExplodeDraw::kBottomLeft);
text.SetHeight(m_dNameHeight);
text.SetStyleId(m_idNameStyle);
2026-10-04 00:04:20 +08:00
text.SetText(m_szNameText); // 图名
2026-09-28 15:28:50 +08:00
XPoint ptNameLoc;
text.SetLocation(ptNameLoc);
double dNameX(0.0), dNameY(0.0);
text.GetExtents(&dNameX, &dNameY);
// vtRotation = dNameX * vtUnit; // sg delete 090113
AcGeVector3d vtRotation;
double dScaleX(0.0), dScaleY(0.0);
2026-10-04 00:04:20 +08:00
if (m_bShowScale) // 比例
2026-09-28 15:28:50 +08:00
{
XPoint ptScaleLoc;
ptScaleLoc.x = ptNameLoc.x + (dNameX * 0.5 + m_dMultiple * dNameY);
ptScaleLoc.y = ptNameLoc.y;
text.SetHeight(m_dScaleHeight);
text.SetStyleId(m_idScaleStyle);
text.SetText(m_szScaleText);
text.SetLocation(ptScaleLoc);
text.SetAlignment(XExplodeDraw::kBottomLeft); // sg add 090112
text.GetExtents(&dScaleX, &dScaleY);
// vtRotation += (m_dMultiple * dNameY + dScaleX) * vtUnit;
vtRotation = (m_dMultiple * dNameY + dScaleX) * vtUnit; // sg modify 090113
}
return vtRotation;
}
2026-10-04 00:04:20 +08:00
double TDbDrawingName::GetOffset() const // ExplodeOrDraw2d函数中调用
2026-09-28 15:28:50 +08:00
{
TDbText text;
text.setPropertiesFrom(this);
text.SetLayoutRotation(0);
text.SetRotation(0.0);
text.SetAlignment(XExplodeDraw::kBottomLeft);
text.SetHeight(m_dNameHeight);
text.SetStyleId(m_idNameStyle);
text.SetText(m_szNameText);
text.SetLocation(XPoint());
XPoint ptLow, ptUp;
text.GetExtents2d(ptLow, ptUp);
return -ptLow.y;
}
2026-10-04 00:04:20 +08:00
// sg add 090112,将7.5中的m_ptLocation点转化为m_ptMidLoc
2026-09-28 15:28:50 +08:00
void TDbDrawingName::GetBottomCenterPt()
{
assertWriteEnabled();
AcGeVector3d vtUnit(AcGeVector3d::kXAxis);
2026-10-04 00:04:20 +08:00
// sg modify 090320,8.0起将文字转角并入布局转角
2026-09-28 15:28:50 +08:00
// vtUnit.rotateBy(m_dRotation+GetLayoutRotation(), AcGeVector3d::kZAxis);
vtUnit.rotateBy(GetLayoutRotation(), AcGeVector3d::kZAxis);
double dDist = GetTotalLen() * 0.5; // sg modify 090327
m_ptMidLoc = m_ptLocation + dDist * vtUnit;
}
XPoint TDbDrawingName::GetBottomLeftPt() const
{
AcGeVector3d vtUnit(AcGeVector3d::kXAxis);
2026-10-04 00:04:20 +08:00
// sg modify 090320,8.0起将文字转角并入布局转角
2026-09-28 15:28:50 +08:00
// vtUnit.rotateBy(m_dRotation+GetLayoutRotation(), AcGeVector3d::kZAxis);
vtUnit.rotateBy(GetLayoutRotation(), AcGeVector3d::kZAxis);
double dDist = GetTotalLen() * 0.5; // sg modify 090327
XPoint ptRet = m_ptMidLoc - dDist * vtUnit;
return ptRet;
}
2026-10-04 00:04:20 +08:00
// sg add 090325,根据Beta1中的图名居中对齐点,得到Beta2中的包括比例部分的居中对齐点
2026-09-28 15:28:50 +08:00
void TDbDrawingName::GetCenterPtIncludeScale()
{
assertWriteEnabled();
AcGeVector3d vtUnit(AcGeVector3d::kXAxis);
vtUnit.rotateBy(GetLayoutRotation(), AcGeVector3d::kZAxis);
TDbText text;
text.setPropertiesFrom(this);
text.SetRotation(0.0);
text.SetAlignment(XExplodeDraw::kBottomLeft);
text.SetHeight(m_dNameHeight);
text.SetStyleId(m_idNameStyle);
text.SetText(m_szNameText);
text.SetLocation(XPoint());
double dNameX(0.0), dNameY(0.0);
text.GetExtents(&dNameX, &dNameY);
double dDist = (GetTotalLen() - dNameX) * 0.5;
m_ptMidLoc = m_ptMidLoc + dDist * vtUnit;
}
Acad::ErrorStatus TDbDrawingName::DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet,
BOOL *bErase)
{
2026-10-04 00:04:20 +08:00
// if (g_nSaveTArchVer < 7) // 7.0开始才有圆圈文字,sg modify 090729
if (g_nSaveTArchVer<7 && g_nSaveTArchVer>3) // 7.0开始才有圆圈文字
2026-09-28 15:28:50 +08:00
{
BOOL bHasCircle = FALSE;
long num = GetSubTextNum();
for (long i=0; i<num; i++)
{
TSubText* pSubText = GetSubText(i);
if (pSubText != NULL)
{
CString sText = pSubText->GetText();
delete pSubText;
if (sText.Find(_T("^C")) != -1)
{
bHasCircle = TRUE;
break;
}
}
}
2026-10-04 00:04:20 +08:00
// sg modify 091109,解决含有圆圈文字时,文字图层错误的问题
2026-09-28 15:28:50 +08:00
// if (bHasCircle)
// {
2026-10-04 00:04:20 +08:00
// XPushMemVar<BOOL> vTemp(XExplodeStream::m_bFullExplode, TRUE); // 完全分解
2026-09-28 15:28:50 +08:00
XPushMemVar<BOOL> vTemp(XExplodeStream::m_bFullExplode, bHasCircle);
XExplodeStream dc(entSet);
if (!OnExplodeOrDraw(dc))
return Acad::eOk;
Acad::ErrorStatus es = Acad::eOk;
dc.SetPropertiesFrom(this);
if (nDrawMode == DRAW_2D)
es = ExplodeOrDraw2d(dc);
else
es = ExplodeOrDraw3d(dc);
AcDbObjectId idLayer = ::InitLayer(LAY_TEXT, database());
2026-10-04 00:04:20 +08:00
for(i=0; i<entSet.length(); i++) // sg add 090729,解决导出T6后,图层不正常的问题
2026-09-28 15:28:50 +08:00
{
AcDbEntity *pEnt = (AcDbEntity*)entSet[i];
if (!!idLayer && pEnt!=NULL)
{
if (pEnt->isKindOf(TDbText::desc()))
{
TDbText *pText = TDbText::cast(pEnt);
2026-10-04 00:04:20 +08:00
// sg add 120313,分解出来的文字的图层和颜色要随“高级选项”中的设置来处理
2026-09-28 15:28:50 +08:00
if (g_nSymbTextT3Layer == 1)
{
pText->setLayer(idLayer);
pText->setColorIndex(colorIndex());
}
else
pText->setColorIndex(m_colorText);
}
else if (pEnt->isKindOf(AcDbText::desc()))
{
AcDbText *pText = AcDbText::cast(pEnt);
2026-10-04 00:04:20 +08:00
// sg add 120313,分解出来的文字的图层和颜色要随“高级选项”中的设置来处理
2026-09-28 15:28:50 +08:00
if (g_nSymbTextT3Layer == 1)
{
pText->setLayer(idLayer);
pText->setColorIndex(colorIndex());
}
else
pText->setColorIndex(m_colorText);
}
else if (pEnt->isKindOf(AcDbCircle::desc()))
{
AcDbCircle *pCircle = AcDbCircle::cast(pEnt);
2026-10-04 00:04:20 +08:00
// sg add 120313,分解出来的文字的图层和颜色要随“高级选项”中的设置来处理
2026-09-28 15:28:50 +08:00
if (g_nSymbTextT3Layer == 1)
{
pCircle->setLayer(idLayer);
pCircle->setColorIndex(colorIndex());
}
else
pCircle->setColorIndex(m_colorText);
}
2026-10-04 00:04:20 +08:00
// sg modify 091217,解决同时有钢筋符号和圆圈文字,导出T6图层、颜色错误
// 注:只有图名标注才可以这么做,因为图名标注中的显示线,是PLINE
2026-09-28 15:28:50 +08:00
else if (pEnt->isKindOf(AcDbLine::desc()))
{
AcDbLine *pLine = AcDbLine::cast(pEnt);
2026-10-04 00:04:20 +08:00
// sg add 120313,分解出来的文字的图层和颜色要随“高级选项”中的设置来处理
2026-09-28 15:28:50 +08:00
if (g_nSymbTextT3Layer == 1)
{
pLine->setLayer(idLayer);
pLine->setColorIndex(colorIndex());
}
else
pLine->setColorIndex(m_colorText);
}
}
}
if (bErase)
*bErase = TRUE;
return es;
// }
}
2026-10-04 00:04:20 +08:00
else if (g_nSaveTArchVer == 7) // sg add 090113,sg modify 090325,防止崩溃
2026-09-28 15:28:50 +08:00
{
TDbDrawingName *pDrawingName = NULL;
{
XPushMemVar<int> vTemp(g_nSaveTArchVer, _TCH_VERSION);
pDrawingName = (TDbDrawingName*)clone();
}
XPoint ptLoc = GetBottomLeftPt();
pDrawingName->SetLocation(ptLoc);
entSet.append(pDrawingName);
if (bErase)
*bErase = TRUE;
return Acad::eOk;
}
return TDbEntity::DownGradeSave(nDrawMode, entSet, bErase);
}
///////////////////////////////////////////////////////
Acad::ErrorStatus
TDbDrawingName::ExplodeOrDraw2d(XExplodeDraw &dc) const
{
assertReadEnabled();
if (!IsValid())
return Acad::eNotApplicable;
AcGeVector3d vtUnit(AcGeVector3d::kXAxis);
double layRotation = GetLayoutRotation();
2026-10-04 00:04:20 +08:00
// sg modify 090320,8.0起将文字转角并入布局转角
2026-09-28 15:28:50 +08:00
// vtUnit.rotateBy(m_dRotation + layRotation, AcGeVector3d::kZAxis);
vtUnit.rotateBy(layRotation, AcGeVector3d::kZAxis);
2026-10-04 00:04:20 +08:00
TDbText text; // 文字
2026-09-28 15:28:50 +08:00
text.setPropertiesFrom(this);
2026-10-04 00:04:20 +08:00
// sg add 120313,分解出来的文字的图层和颜色要随“高级选项”中的设置来处理
2026-09-28 15:28:50 +08:00
if (dc.IsExportTch4() && g_nSymbTextT3Layer==1)
{
text.setLayer(::InitLayer(LAY_TEXT, database()));
}
else
2026-10-04 00:04:20 +08:00
text.setColorIndex(m_colorText); // sg add 090608,文字和标注放在同一层,文字的颜色为白色
2026-09-28 15:28:50 +08:00
text.SetAlignment(XExplodeDraw::kBottomLeft);
text.SetHeight(m_dNameHeight);
text.SetStyleId(m_idNameStyle);
2026-10-04 00:04:20 +08:00
text.SetText(m_szNameText); // 图名
2026-09-28 15:28:50 +08:00
// XPoint ptNameLoc = m_ptLocation; // sg modify 090112
XPoint ptNameLoc = GetNameDrawPt();
text.SetLocation(ptNameLoc);
2026-10-04 00:04:20 +08:00
// sg delete 090320,8.0起将文字转角并入布局转角
2026-09-28 15:28:50 +08:00
// text.SetRotation(m_dRotation);
double dNameX = 0, dNameY = 0;
text.GetExtents(&dNameX, &dNameY);
if (dc.IsFullExplode())
{
TPushProperty vProp(&text, dc);
text.ExplodeOrDraw2d(dc);
}
else
dc.DrawEntity(text);
double dScaleX = 0, dScaleY = 0;
2026-10-04 00:04:20 +08:00
if (m_bShowScale) // 显示比例
2026-09-28 15:28:50 +08:00
{
// sg modify 090112
// XPoint ptScaleLoc = m_ptLocation + (dNameX + m_dMultiple * m_dNameHeight * GetPScale()) * vtUnit;
XPoint ptScaleLoc = GetScaleLocation();
text.SetHeight(m_dScaleHeight);
text.SetStyleId(m_idScaleStyle);
text.SetText(m_szScaleText);
text.SetLocation(ptScaleLoc);
text.GetExtents(&dScaleX, &dScaleY);
if (dc.IsFullExplode())
{
TPushProperty vProp(&text, dc);
text.ExplodeOrDraw2d(dc);
}
else
dc.DrawEntity(text);
}
// add by whl on 060313
if (dNameX < 1E-5)
dNameX = 100;
if (dScaleX < 1E-5)
dScaleX = 100;
2026-10-04 00:04:20 +08:00
// 下画线
2026-09-28 15:28:50 +08:00
// XPoint ptLeft = m_ptLocation; // sg modify 090112
// XPoint ptRight = m_ptLocation;
// double dScale = 1.0/5.0 * GetPScale();
2026-10-04 00:04:20 +08:00
// if (m_bShowScale && m_iDrawStyle==0) // 传统样式
2026-09-28 15:28:50 +08:00
// ptRight += (dTotalLen*0.5 + m_dScaleHeight*dScale) * vtUnit;
// else
// ptRight += (dTotalLen*0.5 + m_dNameHeight*dScale) * vtUnit;
2026-10-04 00:04:20 +08:00
XPoint ptLeft = ptNameLoc; // sg modify 090327,整个图名符号长度
2026-09-28 15:28:50 +08:00
XPoint ptRight = ptNameLoc + GetLineLen() * vtUnit;
XLine ln(ptLeft, ptRight);
ln.SetElevation(0.0);
ln = ln.Offset(GetOffset());
AcDbPolyline pline;
pline.setPropertiesFrom(this);
double dOffset = 2 * m_dLineWidth * GetPScale();
2026-10-04 00:04:20 +08:00
XLine lnThick = ln.Offset(dOffset); // 粗线
2026-09-28 15:28:50 +08:00
pline.addVertexAt(0, lnThick.StartPoint());
pline.addVertexAt(1, lnThick.EndPoint());
pline.setConstantWidth(m_dLineWidth * GetPScale());
dc.DrawEntity(pline);
2026-10-04 00:04:20 +08:00
if (m_iDrawStyle == 0) // 传统样式
2026-09-28 15:28:50 +08:00
{
2026-10-04 00:04:20 +08:00
XLine lnThin = ln.Offset(2 * dOffset); // 细线
2026-09-28 15:28:50 +08:00
pline.reset(Adesk::kFalse, 0);
pline.addVertexAt(0, lnThin.StartPoint());
pline.addVertexAt(1, lnThin.EndPoint());
pline.setConstantWidth(0.0);
dc.DrawEntity(pline);
}
2026-10-04 00:04:20 +08:00
// add by hh 2013-10-15 实体被选中时,绘制其轮廓区域
2026-09-28 15:28:50 +08:00
AcDbObjectId idMe = objectId();
BOOL bHighlight = !idMe;
if(bHighlight || IsShowRegion())
{
TGGePoly2D poly;
if(GetRegionPoly(&poly))
{
dc.DrawXPoly(poly);
}
}
return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
// sg add 110301,支持统一标高
2026-09-28 15:28:50 +08:00
bool TDbDrawingName::UnifyElevation(double dElevation)
{
assertWriteEnabled();
m_ptMidLoc.z = dElevation;
m_ptLocation.z = dElevation;
return true;
}
BOOL TDbDrawingName::IsValid() const
{
return TDbEntity::IsValid();
}
2026-10-04 00:04:20 +08:00
// 提供对格式刷的支持
2026-09-28 15:28:50 +08:00
void TDbDrawingName::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag)
{
assertWriteEnabled();
TDbEntity::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
TDbDrawingName *pSrc = TDbDrawingName::cast(pSrcEntity);
if (pSrc)
{
m_dRotation = pSrc->m_dRotation;
m_dNameHeight = pSrc->m_dNameHeight;
m_dScaleHeight = pSrc->m_dScaleHeight;
m_dLineWidth = pSrc->m_dLineWidth;
m_dMultiple = pSrc->m_dMultiple;
if (database()==NULL || pSrcEntity->database()==NULL ||
database()==pSrcEntity->database()) // add by whl on 060317
{
m_idNameStyle = pSrc->m_idNameStyle;
m_idScaleStyle = pSrc->m_idScaleStyle;
}
m_bShowScale = pSrc->m_bShowScale;
m_iDrawStyle = pSrc->m_iDrawStyle;
m_colorText = pSrc->m_colorText;
}
}
void TDbDrawingName::GetTips(DList<TObjInfoUnit> &lstInfo) const
{
2026-10-04 00:04:20 +08:00
lstInfo.Append(new TObjInfoUnit(_T("对象类型"), _T("图名标注")));
lstInfo.Append(new TObjInfoUnit(_T("图名内容"), m_szNameText));
lstInfo.Append(new TObjInfoUnit(_T("图名样式"), GetSymbolName(m_idNameStyle)));
lstInfo.Append(new TObjInfoUnit(_T("图名高度"), XString(_T("%.1fP"), m_dNameHeight)));
lstInfo.Append(new TObjInfoUnit(_T("比例内容"), m_szScaleText));
lstInfo.Append(new TObjInfoUnit(_T("比例样式"), GetSymbolName(m_idScaleStyle)));
lstInfo.Append(new TObjInfoUnit(_T("比例高度"), XString(_T("%.1fP"), m_dScaleHeight)));
// sg delete 090320,8.0起将文字转角并入布局转角
// lstInfo.Append(new TObjInfoUnit(_T("旋转角度"), XString(_T("%.0f"), m_dRotation*180/PI)));
2026-09-28 15:28:50 +08:00
}
const TCHAR *TDbDrawingName::GetDefaultLayer() const
{
//::InitLayer(LAY_OTHER_DIM);
//return LAY_OTHER_DIM;
::InitLayer(LAY_DRAWINGNAME_DIM);
return LAY_DRAWINGNAME_DIM;
}
int TDbDrawingName::ConvertText(TConvertTextPtr ptr, void *pData)
{
XString sText;
int nRet = ptr(m_szNameText, sText, pData);
if (nRet == RTNORM)
{
assertWriteEnabled();
m_szNameText = sText;
}
return nRet;
}
BOOL TDbDrawingName::GetText(int i,TDbText&text)const
{
if ((m_bShowScale&&i>=2) || (!m_bShowScale&&i>=1))
return FALSE;
TSubText* pSubText = GetSubText(i);
if (pSubText == NULL)
return FALSE;
if (pSubText->GetTextEntity() == NULL)
{
delete pSubText;
return FALSE;
}
text.copyFrom(pSubText->GetTextEntity());
delete pSubText;
return TRUE;
}
2026-10-04 00:04:20 +08:00
// 返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
2026-09-28 15:28:50 +08:00
TTextPosition
TDbDrawingName::FindSubText(const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange) const
{
TTextPosition pos;
if (!sSubText || !sSubText[0])
return pos;
TTextPosition posNext = posStart;
while(1)
{
TDbText text;
if (!GetText(posNext.m_nCookies, text))
break;
TTextPosition posFind = text.FindSubText(sSubText, posNext, pRange);
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;
}
2026-10-04 00:04:20 +08:00
// 返回下一次查找的开始位置
2026-09-28 15:28:50 +08:00
TTextPosition
TDbDrawingName::ReplaceSubText(const TTextPosition &posRep, const TCHAR *sRepText, TTextRange *pRange)
{
assertWriteEnabled();
TTextPosition posNext;
TDbText text;
if (!GetText(posRep.m_nCookies, text))
return posNext;
posNext = text.ReplaceSubText(posRep, sRepText, pRange);
int cookies = posRep.m_nCookies;
if (cookies == 0)
{
m_szNameText = text.GetText();
}
else if (cookies == 1)
{
m_szScaleText = text.GetText();
}
if (!posNext)
{
if (posNext.m_nCookies < (Adesk::UInt32)(GetSubTextNum()-1))
{
posNext.m_nCookies = posRep.m_nCookies+1;
posNext.m_nTextPos = 0;
}
}
return posNext;
}
void TDbDrawingName::SetSubText(long i, CString sText)
{
assertWriteEnabled();
if (i == 0)
m_szNameText = sText;
else
m_szScaleText = sText;
}
2026-10-04 00:04:20 +08:00
// 设置区域轮廓
2026-09-28 15:28:50 +08:00
void TDbDrawingName::SetRegionPoly(const AcGePoint3dArray& arPts)
{
assertWriteEnabled();
2026-10-04 00:04:20 +08:00
// 将数据保存到TDbXDataMap中
2026-09-28 15:28:50 +08:00
TDbXDataMap* pXData = GetSpecialtyData();
if(NULL != pXData)
{
pXData->RemoveAt(DRAWINGNAME_REGIONPL);
pXData->SetAt(DRAWINGNAME_REGIONPL, arPts);
}
}
2026-10-04 00:04:20 +08:00
// 取得区域Poly
2026-09-28 15:28:50 +08:00
BOOL TDbDrawingName::GetRegionPoly(TGGePoly2D* pPoly) const
{
assertReadEnabled();
TDbXDataMap* pXData = GetSpecialtyDataReadOnly();
if(NULL == pXData)
return FALSE;
AcGePoint3dArray arPts;
if(!pXData->GetAt(DRAWINGNAME_REGIONPL, arPts))
return FALSE;
int nLen = arPts.length();
if(2 >= nLen)
return FALSE;
if(NULL != pPoly)
{
pPoly->Reset();
for(int i = 0; i < arPts.length(); i++)
{
pPoly->AppendNode(arPts[i]);
}
2026-10-04 00:04:20 +08:00
pPoly->SetFlag(1); // 闭合
2026-09-28 15:28:50 +08:00
}
return TRUE;
}
void InitDbDrawingName(BOOL bTrue)
{
if (bTrue)
{
TDbDrawingName::rxInit();
acrxBuildClassHierarchy();
TDbDrawingName::InitMatchProtocol(TRUE);
}
else
{
TDbDrawingName::InitMatchProtocol(FALSE);
deleteAcRxClass(TDbDrawingName::desc());
}
}