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

215 lines
7.0 KiB
C++

#include "stdafx.h"
#include "resource.h"
#include "TgAs.h"
static const TCHAR *sMsgPrompt[]={
#include "statics.hpp"
};
int GridFrame(const TCHAR *pExt);
int DbfGridFrame(const TCHAR *pszFile);
//extern AcDbObjectId TARCH_IMPEXP GetBlockExtension(const TCHAR *szBlockName);
extern BOOL TARCH_IMPEXP StrToIntList(const TCHAR * pszDesc, DList<int> &lstResult);
/////////////////////////////////////////
// 把房间实体的数据写到磁盘去 <dwg>.sp
//
//UnUsed
int SaveSpaceData()
{
int bDwgTitled=0;
xg_getvar(_T("DWGTITLED"), &bDwgTitled);
if (!bDwgTitled) {
adsout << /*UMSG*/ _T("\n由于当前图尚未命名, 因此房间数据没有保存到磁盘文件!");
return RTERROR;
}
PickSet ssSpaces(SS_FREE);
RBList spaceMask(RTDXF0, _T("ROOM"), NULL);
ssSpaces.Get(_T("X"), NULL, NULL, spaceMask);
XString sFileSp, sTemplate(256);
MakeFullPath(_T(".sp"), sFileSp);
//if (!FindFile(sFileSp)) {
//sTemplate << g_sAppPath << _T("space.tem");
if (!FindFile(_T("space.tem"), sTemplate)) {
adsout << /*UMSG*/ _T("\n找不到文件'") << sTemplate << _T("'");
return RTERROR;
} else {
if (!CT_cp_file(sTemplate, sFileSp)) {
adsout << /*UMSG*/ _T("不能拷贝生成文件'") << sFileSp << _T("'");
return RTERROR;
}
}
//}
CodeBase db;
XDbfTable *pTable=db.Open(sFileSp);
if (!pTable) {
adsout << /*UMSG*/ _T("\n不能打开数据库文件'") << sFileSp << _T("'");
return RTERROR;
}
////////////////////////////////////////////////////
// 并统计楼层数据库中的 usearea, occuarea, ceilarea, extwall, intwall, usevolume, ewinhole, edoorhole
double nUseArea=0, nOccuArea=0, nCeilArea=0, nExtWall=0, nIntWall=0, nUseVolume=0, nExtWin=0, nExtDoor=0;
long lCount = ssSpaces.Length();
for(long i=0L; i<lCount; i++) {
Entity e=ssSpaces[i];
XDbObject obj(e, AcDb::kForRead);
if (!obj) continue;
TDbSpace *pSpace = TDbSpace::cast(obj.m_pObject);
ASSERT(pSpace);
pTable->AppendBegin();
SET_FIELD(pTable, _T("code"), pSpace->m_sCode);
SET_FIELD(pTable, _T("name"), pSpace->m_sName);
SET_FIELD(pTable, _T("height"), pSpace->m_nHeight);
SET_FIELD(pTable, _T("usearea"), pSpace->m_nUseArea);
SET_FIELD(pTable, _T("ceilarea"), pSpace->m_nCeilArea);
SET_FIELD(pTable, _T("occuarea"), pSpace->m_nOccuArea);
SET_FIELD(pTable, _T("wallsurf"), pSpace->m_nWallSurfArea);
SET_FIELD(pTable, _T("ewallarea"), pSpace->m_nExtWallArea);
SET_FIELD(pTable, _T("ewinhole"), pSpace->m_nExtWinArea);
SET_FIELD(pTable, _T("edoorhole"), pSpace->m_nExtDoorArea);
SET_FIELD(pTable, _T("usevolume"), pSpace->GetUseVolume());
SET_FIELD(pTable, _T("perimeter"), pSpace->m_nPerimeter);
SET_FIELD(pTable, _T("kickboard"), pSpace->m_nKickboardLength);
pTable->AppendEnd();
if (pSpace->m_sCode==_T("0")) {//ExtSpace
nExtWall += pSpace->m_nExtWallArea;
} else {
nUseArea += pSpace->m_nUseArea;
nOccuArea += pSpace->m_nOccuArea;
nCeilArea += pSpace->m_nCeilArea;
nIntWall += pSpace->m_nWallSurfArea;
nUseVolume += pSpace->GetUseVolume();
nExtWin += pSpace->m_nExtWinArea;
nExtDoor += pSpace->m_nExtDoorArea;
}
}
///////////////////////////////////////////////////////////////////////
// Static Following: balarea, wallvolume coluvolume holevolume holesurf
// Balcony is to be finished
// wallvolume, holevolume, holesurf
double nWallVolume=0, nHoleVolume=0, nHoleSurf=0;
PickSet ssWall(SS_FREE);
RBList mask(RTDXF0, _T("TCH_WALL"), NULL);
if (ssWall.Get(_T("X"), NULL, NULL, mask)==RTNORM) {
long lWallCount=ssWall.Length();
for(long idx=0L; idx<lWallCount; idx++) {
Entity ent=ssWall[idx];
XDbObject obj(ent, AcDb::kForRead);
if (!obj) continue;
TDbWall *pDbWall=TDbWall::cast(obj.m_pObject);
ASSERT(pDbWall);
nHoleVolume += _AS_CUMETER(pDbWall->GetHoleVolume());
nHoleSurf += _AS_SQMETER(pDbWall->GetHoleSurfaceArea());
nWallVolume += _AS_CUMETER(pDbWall->GetSegVolume()) - _AS_CUMETER(pDbWall->GetHoleVolume());
}
}
// coluvolume
double nColuVolume=0;
PickSet ssColu(SS_FREE);
RBList maskColu(RTDXF0, _T("TCH_COLUMN"), NULL);
if (ssColu.Get(_T("X"), NULL, NULL, maskColu)==RTNORM) {
long lCount=ssColu.Length();
for(long idx=0L; idx<lCount; idx++) {
Entity ent=ssColu[idx];
XDbObject obj(ent, AcDb::kForRead);
if (!obj) continue;
TDbColumn *pDbColu=TDbColumn::cast(obj.m_pObject);
ASSERT(pDbColu);
XPoly2D poly(1);
pDbColu->GetOutline(poly);
nColuVolume += _AS_SQMETER(poly.Area())*_AS_METER(pDbColu->GetHeight());
}
}
GridFrame(_T(".sp"));
// Save to Dbf
// 取得项目数据库
XString sProjectDbf;
if (GetProjectDbf(sProjectDbf)!=RTNORM) {
adsout << /*UMSG*/_T("\n不能创建项目数据库, 请把当前图存到一目录(项目)下!");
return RTERROR;
}
pTable=db.Open(sProjectDbf);
XString sCurDwg;
AT_GetCurDwg(sCurDwg);
_tcsupr(sCurDwg);
if (pTable && pTable->MoveTo(_T("dwgfile"), sCurDwg, CMP_INSENSITIVE)) {
SET_FIELD(pTable, _T("usearea"), nUseArea);
SET_FIELD(pTable, _T("ceilarea"), nCeilArea);
SET_FIELD(pTable, _T("occuarea"), nOccuArea);
// balcony here, to be finished
SET_FIELD(pTable, _T("extwall"), nExtWall);
SET_FIELD(pTable, _T("intwall"), nIntWall);
SET_FIELD(pTable, _T("usevolume"), nUseVolume);
SET_FIELD(pTable, _T("wallvolume"), nWallVolume);
SET_FIELD(pTable, _T("coluvolume"), nColuVolume);
SET_FIELD(pTable, _T("holevolume"), nHoleVolume);
SET_FIELD(pTable, _T("holesurf"), nHoleSurf);
SET_FIELD(pTable, _T("ewinhole"), nExtWin);
SET_FIELD(pTable, _T("edoorhole"), nExtDoor);
}
DbfGridFrame(sProjectDbf);
return RTNORM;
}
//extern int SpaceArea();
/////////////////////////////////////////////////////////////////////////
// 统计功能,UnUsed
// 1. 建立/更新房间信息
// 2. 更新磁盘上的数据
void Statics()
{
//if (SpaceArea()==RTNORM)
SaveSpaceData();
//return RTNORM;
}
// extern TARCH_IMPEXP void OpenDwgWithCurNls(CString &csFileName);
///////////////////////////////////////////////////////
// 打开dwg文件时自动转换码表
void OpenEx()
{
XString fileName;
xg_getvar(_T("DWGPREFIX"), fileName);
//modify by xlc on 090917 2010平台消除tg5lib时去掉了dbf文件打开
#if ADS<18
if (GetFileDia(fileName, 0, _T("dwg;dwt;dxf;dbf"), _T("输入文件名称"))!=RTNORM)
#else
if (GetFileDia(fileName, 0, _T("dwg;dwt;dxf"), _T("输入文件名称"))!=RTNORM)
#endif
return;
CString csFileName = fileName;
// If there is no file extension, try _T(".DWG")
if ( csFileName.Find(_T('.')) == -1 ) {
csFileName += _T(".DWG");
} else {
XPathParser paser(fileName);
if (_tcsicmp(paser.m_sExt, _T(".dbf"))==0) {
#if ADS<18
DbfGridFrame(csFileName);
#endif
return; // dwt
}
}
OpenDwgWithCurNls(csFileName);
}