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

672 lines
17 KiB
C++
Raw Permalink 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.
// THVDbSpace.cpp: implementation of the THVDbSpace class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "THVDbSpace.h"
#include "DbText.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
ACRX_DXF_DEFINE_MEMBERS(ATSHVDbSpace, ATSSpace, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
1, ATS_HVDBSPACE, "ATS_HVDBSPACE, 请下载上华软件|网址: www.shanghuasoft.com");
IMPLEMENT_TENTBASE(THVDbSpace);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
const Adesk::UInt8 THVDbSpace::g_nVersion = 1;
THVDbSpace::THVDbSpace()
{
m_nTextHeight = 3.0;
m_dAirColdLoad = 0;
m_dAirHeatLoad = 0;
m_dColdLoadNoAir = 0;
m_dHeatLoadNoAir = 0;
m_dHideColdLoad = 0;
m_dSummerHumLoad = 0;
m_dWinterHumLoad = 0;
int i(0);
for (i = 0; i < 3; i++)
{
m_arrayDim[i] = TRUE;
}
for (i = 3; i < /*12*/13; i++) // change by zh
{
m_arrayDim[i] = FALSE;
}
m_bExtSpace = FALSE;
}
THVDbSpace::~THVDbSpace()
{
}
// 是否标注某项,0~11见注释
void THVDbSpace::SetDim(BOOL bDim, int nNum)
{
assertWriteEnabled();
if ((nNum < 0) || (nNum > /*11*/12))// change by zh
{
return;
}
m_arrayDim[nNum] = bDim;
// add by hh 2013-5-9 是否标注新风量 写入到动态数据中
if(12 == nNum)
{
TEntityFields &fd = Fields();
fd.SFD(_T("THVS_NEWAIRDIM"), bDim);
}
}
BOOL THVDbSpace::IsDim(int nNum) const
{
if ((nNum < 0) || (nNum > /*11*/12))// change by zh
{
return FALSE;
}
return m_arrayDim[nNum];
}
// 获取标注内容
void THVDbSpace::GetDimString(XStringList &lstString) const
{
// add by hh 2011-04-26 使用上华选项中的房间面积精度
TDbConfig* pCfg = GetDwgGlobal(AcDb::kForRead);
CString sAreaFmt;
if(NULL == pCfg)
sAreaFmt = _T("%.2f");
else
{
sAreaFmt.Format(_T("%%.%df"), pCfg->GetSpaceAreaPrecision());
pCfg->close();
}
if (m_bExtSpace) // 最后的建筑面积
{
XString sDim;
// sDim << _T("建筑面积:") << XString(_T("%.2f"), m_nUseArea);
sDim << _T("建筑面积:") << XString(sAreaFmt, m_nUseArea);
if (m_bDimUnit) // 标注单位
{
sDim << _T("m^U2^U");
}
lstString.Append(tstrnew(sDim));
return;
}
XString sNum(256), sName(256);
sNum << _T("房间号:") << XString(_T("%s"), m_sCode);
lstString.Append(tstrnew(sNum));
sName << _T("房间名称:") << XString(_T("%s"), m_sName);
lstString.Append(tstrnew(sName));
XString sArea(256);
// sArea << _T("面积:") << XString(_T("%.2f"), m_nUseArea);
sArea << _T("面积:") << XString(sAreaFmt, m_nUseArea);
if (m_bDimUnit)
{
sArea << _T("m^U2^U");
}
lstString.Append(tstrnew(sArea));
XString sLoad3(256), sLoad4(256), sLoad5(256), sLoad6(256), sLoad7(256),
sLoad8(256), sLoad9(256), sLoad10(256), sLoad11(256), sLoad12(256); // add by zh 新风量显示
sLoad3 << _T("总冷负荷:") << XString(_T("%.0f"), m_dbColdLoad);
sLoad4 << _T("冷负荷(不含新风):") << XString(_T("%.0f"), m_dColdLoadNoAir);
sLoad5 << _T("新风冷负荷:") << XString(_T("%.0f"), m_dAirColdLoad);
sLoad6 << _T("潜热冷负荷:") << XString(_T("%.0f"), m_dHideColdLoad);
sLoad7 << _T("夏季湿负荷:") << XString(_T("%.2f"), m_dSummerHumLoad);
sLoad8 << _T("总热负荷:") << XString(_T("%.0f"), m_dbHeatLoad);
sLoad9 << _T("热负荷(不含新风):") << XString(_T("%.0f"), m_dHeatLoadNoAir);
sLoad10 << _T("新风热负荷:") << XString(_T("%.0f"), m_dAirHeatLoad);
sLoad11 << _T("冬季湿负荷:") << XString(_T("%.2f"), m_dWinterHumLoad);
sLoad12 << _T("新风量:") << XString(_T("%.0f"), GetNewAir()); // add by zh 新风量
if (m_bDimUnit)
{
sLoad3 << _T("W");
sLoad4 << _T("W");
sLoad5 << _T("W");
sLoad6 << _T("W");
sLoad7 << _T("kg/h");
sLoad8 << _T("W");
sLoad9 << _T("W");
sLoad10 << _T("W");
sLoad11 << _T("kg/h");
sLoad12 << _T("m^U3^U/h"); // add by zh 新风量单位
}
lstString.Append(tstrnew(sLoad3));
lstString.Append(tstrnew(sLoad4));
lstString.Append(tstrnew(sLoad5));
lstString.Append(tstrnew(sLoad6));
lstString.Append(tstrnew(sLoad7));
lstString.Append(tstrnew(sLoad8));
lstString.Append(tstrnew(sLoad9));
lstString.Append(tstrnew(sLoad10));
lstString.Append(tstrnew(sLoad11));
lstString.Append(tstrnew(sLoad12));// add by zh 新风量
}
//////////////////////////////////////////////////////////////////////
// Override TDbEntity
//////////////////////////////////////////////////////////////////////
Acad::ErrorStatus THVDbSpace::subGetClassID(CLSID* pClsid) const
{
return Acad::eOk;
}
void THVDbSpace::CopyPropertiesFrom(AcDbEntity* pSrc, unsigned gMatchFlag)
{
assertWriteEnabled();
TDbSpace::CopyPropertiesFrom(pSrc, gMatchFlag);
THVDbSpace *pSpace = THVDbSpace::cast(pSrc);
if (pSpace != NULL)
{
m_dAirColdLoad = pSpace->m_dAirColdLoad;
m_dAirHeatLoad = pSpace->m_dAirHeatLoad;
m_dColdLoadNoAir = pSpace->m_dColdLoadNoAir;
m_dHeatLoadNoAir = pSpace->m_dHeatLoadNoAir;
m_dHideColdLoad = pSpace->m_dHideColdLoad;
m_dSummerHumLoad = pSpace->m_dSummerHumLoad;
m_dWinterHumLoad = pSpace->m_dWinterHumLoad;
m_bDimUnit = pSpace->m_bDimUnit;
for (int i = 0; i < /*12*/13; i++)// change by zh 新风量
{
m_arrayDim[i] = pSpace->m_arrayDim[i];
}
}
}
//////////////////////////////////////////////////////////////////////
// 存储数据
//////////////////////////////////////////////////////////////////////
Acad::ErrorStatus THVDbSpace::dwgInFields(AcDbDwgFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es = TDbSpace::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;
}
pFiler->readItem(&m_dAirColdLoad);
pFiler->readItem(&m_dAirHeatLoad);
pFiler->readItem(&m_dColdLoadNoAir);
pFiler->readItem(&m_dHeatLoadNoAir);
pFiler->readItem(&m_dHideColdLoad);
pFiler->readItem(&m_dSummerHumLoad);
pFiler->readItem(&m_dWinterHumLoad);
//pFiler->readItem(&m_bExtSpace);
//pFiler->readItem(&m_bDimUnit);
FilerRead(pFiler, m_bExtSpace);
FilerRead(pFiler, m_bDimUnit);
for (Adesk::UInt8 i = 0; i < 12; i++)
{
//pFiler->readItem(&m_arrayDim[i]);
FilerRead(pFiler, m_arrayDim[i]);
}
// add by hh 2013-5-9 从动态数据中读取是否标注新风量
const TEntityFields &fd = GetFields();
fd.GFD(_T("THVS_NEWAIRDIM"), m_arrayDim[12]);
return pFiler->filerStatus();
}
Acad::ErrorStatus THVDbSpace::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es = TDbSpace::dwgOutFields(pFiler);
if (es != Acad::eOk)
{
return es;
}
pFiler->writeItem(g_nVersion);
pFiler->writeItem(m_dAirColdLoad);
pFiler->writeItem(m_dAirHeatLoad);
pFiler->writeItem(m_dColdLoadNoAir);
pFiler->writeItem(m_dHeatLoadNoAir);
pFiler->writeItem(m_dHideColdLoad);
pFiler->writeItem(m_dSummerHumLoad);
pFiler->writeItem(m_dWinterHumLoad);
//pFiler->writeItem(m_bExtSpace);
//pFiler->writeItem(m_bDimUnit);
FilerWrite(pFiler, m_bExtSpace);
FilerWrite(pFiler, m_bDimUnit);
for (Adesk::UInt8 i = 0; i < 12; i++)
{
//pFiler->writeItem(m_arrayDim[i]);
FilerWrite(pFiler, m_arrayDim[i]);
}
return pFiler->filerStatus();
}
Acad::ErrorStatus THVDbSpace::dxfInFields(AcDbDxfFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es = TDbSpace::dxfInFields(pFiler);
if (es != Acad::eOk)
{
return es;
}
if (!pFiler->atSubclassData(_T("THVDbSpace")))
{
return Acad::eBadDxfSequence;
}
resbuf rb;
while ((es == Acad::eOk)
&& ((es = pFiler->readResBuf(&rb)) == Acad::eOk))
{
switch (rb.restype) {
case AcDb::kDxfReal:
m_dAirColdLoad = rb.resval.rreal;
break;
case AcDb::kDxfReal+1:
m_dAirHeatLoad = rb.resval.rreal;
break;
case AcDb::kDxfReal+2:
m_dColdLoadNoAir = rb.resval.rreal;
break;
case AcDb::kDxfReal+3:
m_dHeatLoadNoAir = rb.resval.rreal;
break;
case AcDb::kDxfReal+4:
m_dHideColdLoad = rb.resval.rreal;
break;
case AcDb::kDxfReal+5:
m_dSummerHumLoad = rb.resval.rreal;
break;
case AcDb::kDxfReal+6:
m_dWinterHumLoad = rb.resval.rreal;
break;
// mcl changed by below. x64位下要求写入类型与参数code一致。否则房间对象设置标注负荷参数后,
// 选中房间会崩溃
// case AcDb::kDxfBool:
// m_bExtSpace = rb.resval.rint;
// break;
// case AcDb::kDxfBool+1:
// m_bDimUnit = rb.resval.rint;
// break;
// case AcDb::kDxfBool+2:
// m_arrayDim[0] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+3:
// m_arrayDim[1] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+4:
// m_arrayDim[2] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+5:
// m_arrayDim[3] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+6:
// m_arrayDim[4] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+7:
// m_arrayDim[5] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+8:
// m_arrayDim[6] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+9:
// m_arrayDim[7] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+10:
// m_arrayDim[8] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+11:
// m_arrayDim[9] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+12:
// m_arrayDim[10] = rb.resval.rint;
// break;
// case AcDb::kDxfBool+13:
// m_arrayDim[11] = rb.resval.rint;
// break;
case AcDb::kDxfInt8:
m_bExtSpace = rb.resval.rint;
break;
case AcDb::kDxfInt8+1:
m_bDimUnit = rb.resval.rint;
break;
case AcDb::kDxfInt8+2:
m_arrayDim[0] = rb.resval.rint;
break;
case AcDb::kDxfInt8+3:
m_arrayDim[1] = rb.resval.rint;
break;
case AcDb::kDxfInt8+4:
m_arrayDim[2] = rb.resval.rint;
break;
case AcDb::kDxfInt8+5:
m_arrayDim[3] = rb.resval.rint;
break;
case AcDb::kDxfInt8+6:
m_arrayDim[4] = rb.resval.rint;
break;
case AcDb::kDxfInt8+7:
m_arrayDim[5] = rb.resval.rint;
break;
case AcDb::kDxfInt8+8:
m_arrayDim[6] = rb.resval.rint;
break;
case AcDb::kDxfInt8+9:
m_arrayDim[7] = rb.resval.rint;
break;
case AcDb::kDxfInt8+10:
m_arrayDim[8] = rb.resval.rint;
break;
case AcDb::kDxfInt8+11:
m_arrayDim[9] = rb.resval.rint;
break;
case AcDb::kDxfInt8+12:
m_arrayDim[10] = rb.resval.rint;
break;
case AcDb::kDxfInt8+13:
m_arrayDim[11] = rb.resval.rint;
break;
default:
pFiler->pushBackItem();
es = Acad::eEndOfFile;
break;
}
}
if (es != Acad::eEndOfFile)
{
return Acad::eInvalidResBuf;
}
return pFiler->filerStatus();
}
Acad::ErrorStatus THVDbSpace::dxfOutFields(AcDbDxfFiler* pFiler) const
{
Acad::ErrorStatus es = TDbSpace::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = pFiler->writeItem(AcDb::kDxfSubclass, _T("THVDbSpace"));
assert(es == Acad::eOk);
pFiler->writeDouble(AcDb::kDxfReal, m_dAirColdLoad);
pFiler->writeDouble(AcDb::kDxfReal+1, m_dAirHeatLoad);
pFiler->writeDouble(AcDb::kDxfReal+2, m_dColdLoadNoAir);
pFiler->writeDouble(AcDb::kDxfReal+3, m_dHeatLoadNoAir);
pFiler->writeDouble(AcDb::kDxfReal+4, m_dHideColdLoad);
pFiler->writeDouble(AcDb::kDxfReal+5, m_dSummerHumLoad);
pFiler->writeDouble(AcDb::kDxfReal+6, m_dWinterHumLoad);
// mcl changed by below. x64位下要求写入类型与参数code一致。否则房间对象设置标注负荷参数后,
// 选中房间会崩溃
// pFiler->writeDouble(AcDb::kDxfBool, m_bExtSpace);
// pFiler->writeDouble(AcDb::kDxfBool+1, m_bDimUnit);
// pFiler->writeDouble(AcDb::kDxfBool+2, m_arrayDim[0]);
// pFiler->writeDouble(AcDb::kDxfBool+3, m_arrayDim[1]);
// pFiler->writeDouble(AcDb::kDxfBool+4, m_arrayDim[2]);
// pFiler->writeDouble(AcDb::kDxfBool+5, m_arrayDim[3]);
// pFiler->writeDouble(AcDb::kDxfBool+6, m_arrayDim[4]);
// pFiler->writeDouble(AcDb::kDxfBool+7, m_arrayDim[5]);
// pFiler->writeDouble(AcDb::kDxfBool+8, m_arrayDim[6]);
// pFiler->writeDouble(AcDb::kDxfBool+9, m_arrayDim[7]);
// pFiler->writeDouble(AcDb::kDxfBool+10, m_arrayDim[8]);
// pFiler->writeDouble(AcDb::kDxfBool+11, m_arrayDim[9]);
// pFiler->writeDouble(AcDb::kDxfBool+12, m_arrayDim[10]);
// pFiler->writeDouble(AcDb::kDxfBool+13, m_arrayDim[11]);
pFiler->writeUInt8(AcDb::kDxfInt8, m_bExtSpace);
pFiler->writeUInt8(AcDb::kDxfInt8+1, m_bDimUnit);
pFiler->writeUInt8(AcDb::kDxfInt8+2, m_arrayDim[0]);
pFiler->writeUInt8(AcDb::kDxfInt8+3, m_arrayDim[1]);
pFiler->writeUInt8(AcDb::kDxfInt8+4, m_arrayDim[2]);
pFiler->writeUInt8(AcDb::kDxfInt8+5, m_arrayDim[3]);
pFiler->writeUInt8(AcDb::kDxfInt8+6, m_arrayDim[4]);
pFiler->writeUInt8(AcDb::kDxfInt8+7, m_arrayDim[5]);
pFiler->writeUInt8(AcDb::kDxfInt8+8, m_arrayDim[6]);
pFiler->writeUInt8(AcDb::kDxfInt8+9, m_arrayDim[7]);
pFiler->writeUInt8(AcDb::kDxfInt8+10, m_arrayDim[8]);
pFiler->writeUInt8(AcDb::kDxfInt8+11, m_arrayDim[9]);
pFiler->writeUInt8(AcDb::kDxfInt8+12, m_arrayDim[10]);
pFiler->writeUInt8(AcDb::kDxfInt8+13, m_arrayDim[11]);
return pFiler->filerStatus();
}
//////////////////////////////////////////////////////////////////////
// 绘制
//////////////////////////////////////////////////////////////////////
Acad::ErrorStatus THVDbSpace::ExplodeOrDraw2d(XExplodeDraw &dc) const
{
assertReadEnabled();
// cet 2016.10.17 add 图层关闭时,实体不显示,不进行绘制(打印时,也不会绘制)
AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead);
if (player.openStatus() == Acad::eOk && player->isOff())
{
return Acad::eOk;
}
int i(0),
nCount(0); // 总共有多少个标注项目
for (i = 0; i < /*12*/13; i++) // change by zh 新风量
{
if (m_arrayDim[i])
{
nCount++;
}
}
double dSize = m_nTextHeight; // 字体高度:3
dSize *= GetPScale();
int nTmpNum = nCount/2;
AcGeDoubleArray aryLocation; // 标注位置偏移数组
if (nCount%2 == 0) // 偶数
{
for (i = 0; i < nTmpNum; i++) // 在m_ptLocation之上的部分
{
double dTmp = (nTmpNum-i) * 1.2 * dSize - 0.5 * dSize;
aryLocation.append(dTmp);
}
for (i = 0; i < nTmpNum; i++) // 在m_ptLocation之下的部分
{
double dTmp = (i * 1.2 + 0.5) * dSize * (-1);
aryLocation.append(dTmp);
}
}
else // 奇数
{
for (i = 0; i < nTmpNum; i++) // 在m_ptLocation之上的部分
{
double dTmp = (nTmpNum - i) * 1.2 * dSize;
aryLocation.append(dTmp);
}
aryLocation.append(0.0); // 在m_ptLocation
for (i = 0; i < nTmpNum; i++) // 在m_ptLocation之下的部分
{
double dTmp = (1 + i) * 1.2 * dSize * (-1);
aryLocation.append(dTmp);
}
}
TDbText text;
text.setPropertiesFrom(this);
text.SetMaskFlag(IsMask()); // 自动屏蔽
AcDbObjectId idStyle = m_idTextStyle; // 字体样式:_TCH_SPACE
assert(!!idStyle);
double dTextSize = m_nTextHeight; // 字体高度:3
text.SetHeight(dTextSize);
text.SetStyleId(idStyle);
text.SetAlignment(XExplodeDraw::kMiddleCenter); // 居中对齐
text.SetRotation(m_nRotation);
ads_matrix matRot;
m_ptLocation.GetRotationMatrix(Layout2Wcs(m_nRotation), matRot);
XStringList lstString;
GetDimString(lstString);
int j(0);
for (i = 0; i < nCount; i++) // 需要标注的项目
{
XPoint ptLoc = m_ptLocation;
ptLoc.y += aryLocation[i];
ptLoc.TransformBy(matRot);
text.SetLocation(ptLoc); // 确定标注位置
XString sDisp; // 标注内容
BOOL bFlag(TRUE); // 是否创建TDbText
if (m_bExtSpace) // 总建筑面积
{
sDisp = lstString[0];
}
else // 普通房间
{
while (j < /*12*/13) // 所有标主的项目 // change by zh 新风量
{
if (m_arrayDim[j]) // 需要标注
{
sDisp = lstString[j];
if (((j==0) || (j==1)) && (!g_bExplodeSubText) && (!sDisp))
{
j++;
bFlag = FALSE; // 不标注
break;
}
j++;
break;
}
j++;
}
}
if (bFlag) // 可以标注
{
text.SetText(sDisp);
if (dc.IsFullExplode())
{
text.ExplodeOrDraw2d(dc);
}
else
{
dc.DrawEntity(text);
}
}
}
AcDbObjectId idMe = objectId();
BOOL bHighlight = !idMe;
if (!bHighlight)
{
bHighlight = IsHighlight();
}
if (bHighlight || IsShowOutline())
{
dc << m_outline;
}
return Acad::eOk;
}
// 用于分析房间对象的文字编辑
BOOL StringAnalysis(const CString &src, CString &csName)
{
int nLen = src.GetLength();
if (nLen == 0)
{
return FALSE;
}
for (int i = 0; i < nLen; i++)
{
if (src[i] == _T(':'))
{
csName = src.Mid(i+1, nLen-1);
return TRUE;
}
}
return FALSE;
}
void THVDbSpace::SetSubText(long i, CString sText)
{
assertWriteEnabled();
if (!m_bExtSpace && (i==0 || i==1)) // 普通房间的名称或编号
{
CString csName; // “:”号右面的内容
BOOL bRet = StringAnalysis(sText, csName);
if (!bRet)
{
return;
}
if (i == 0)
{
if (m_arrayDim[0]) // 标注的是编号
{
SetCode(csName);
}
else if (m_arrayDim[1]) // 标注的是名称
{
SetName(csName);
}
}
else if (i == 1)
{
if (m_arrayDim[1]) // 标注的是名称
{
SetName(csName);
}
}
}
}
void InitHVDbSpace(BOOL bTrue)
{
if (bTrue)
{
THVDbSpace::rxInit();
THVDbSpace::InitMatchProtocol(TRUE);
}
else
{
THVDbSpace::InitMatchProtocol(FALSE);
deleteAcRxClass(THVDbSpace::desc());
}
}