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

370 lines
11 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 "OpeningValidation.h"
#include "Resource.h"
#include "OpeningValidateDlg.h"
#include "OpeningLabelData.h"
TOpeningValidation::TOpeningValidation()
{
m_nFlag=0;
m_nWidth=0;
m_nHeight=0;
}
BOOL TOpeningValidation::ValidateLabel(const TDbOpening *pOpening)
{
if (m_nFlag)
return FALSE;
// sg modify 110228,根据8.5需求,将类别改成类型
// if (_tcsicmp(m_sKind, pOpening->GetKindString())!=0)
if (_tcsicmp(m_sKind, pOpening->GetSubKind())!=0)
return FALSE;
if (fabs(m_nWidth-pOpening->GetWidth())>_DIST_SNAP ||
fabs(m_nHeight-pOpening->GetHeight())>_DIST_SNAP)
return FALSE;
XString sDwb2d, sDwg2d, sDwb3d, sDwg3d;
pOpening->GetStyle2dName(sDwb2d, sDwg2d);
pOpening->GetStyle3dName(sDwb3d, sDwg3d);
XString sStyle2d, sStyle3d;
if (!sDwb2d || !sDwg2d)
sStyle2d=_T("");
else
sStyle2d = XString(_T("%s(%s)"), (const TCHAR *)sDwb2d, (const TCHAR *)sDwg2d);
if (!sDwb3d || !sDwg3d)
sStyle3d=_T("");
else
sStyle3d = XString(_T("%s(%s)"), (const TCHAR *)sDwb3d, (const TCHAR *)sDwg3d);
if (_tcsicmp(m_sStyle2d, sStyle2d)!=0 ||
_tcsicmp(m_sStyle3d, sStyle3d)!=0)
return FALSE;
return TRUE;
}
// 必须是驻留DWG
void TOpeningValidation::Validate(const TDbOpening *pOpening)
{
AcDbObjectId id = pOpening->objectId();
if (!id)
return;
if (m_idArray.isEmpty())
{
m_nFlag=0;
m_sLabel=pOpening->GetLabel();
// sg modify 110228,根据8.5需求,将类别改成类型
// m_sKind=pOpening->GetKindString();
m_sKind=pOpening->GetSubKind();
m_opKind=pOpening->GetKind();
m_nWidth=pOpening->GetWidth();
m_nHeight=pOpening->GetHeight();
XString sDwb2d, sDwg2d, sDwb3d, sDwg3d;
pOpening->GetStyle2dName(sDwb2d, sDwg2d);
pOpening->GetStyle3dName(sDwb3d, sDwg3d);
if (!sDwb2d || !sDwg2d)
m_sStyle2d=_T("");
else
m_sStyle2d = XString(_T("%s(%s)"), (const TCHAR *)sDwb2d, (const TCHAR *)sDwg2d);
if (!sDwb3d || !sDwg3d)
m_sStyle3d=_T("");
else
m_sStyle3d = XString(_T("%s(%s)"), (const TCHAR *)sDwb3d, (const TCHAR *)sDwg3d);
}
else
{
if (_tcsicmp(m_sLabel, pOpening->GetLabel())!=0)
return;
// sg modify 110228,根据8.5需求,将类别改成类型
//if (_tcsicmp(m_sKind, pOpening->GetKindString())!=0) {
if (_tcsicmp(m_sKind, pOpening->GetSubKind())!=0) {
m_nFlag |= OVF_KIND;
m_sKind=_T("<冲突>");
}
if (fabs(m_nWidth-pOpening->GetWidth())>_DIST_SNAP)
m_nFlag |= OVF_WIDTH;
if (fabs(m_nHeight-pOpening->GetHeight())>_DIST_SNAP)
m_nFlag |= OVF_HEIGHT;
XString sDwb2d, sDwg2d, sDwb3d, sDwg3d;
pOpening->GetStyle2dName(sDwb2d, sDwg2d);
pOpening->GetStyle3dName(sDwb3d, sDwg3d);
XString sStyle2d, sStyle3d;
if (!sDwb2d || !sDwg2d)
sStyle2d=_T("");
else
sStyle2d = XString(_T("%s(%s)"), (const TCHAR *)sDwb2d, (const TCHAR *)sDwg2d);
if (!sDwb3d || !sDwg3d)
sStyle3d=_T("");
else
sStyle3d = XString(_T("%s(%s)"), (const TCHAR *)sDwb3d, (const TCHAR *)sDwg3d);
if (_tcsicmp(m_sStyle2d, sStyle2d)!=0) {
m_nFlag |= OVF_STYLE2D;
m_sStyle2d=_T("<冲突>");
}
if (_tcsicmp(m_sStyle3d, sStyle3d)!=0) {
m_nFlag |= OVF_STYLE3D;
m_sStyle3d=_T("<冲突>");
}
}
m_idArray.append(id);
}
int TOpeningValidation::CompareForFindByCode(const TOpeningValidation *p1, const void *pv2)
{
const TCHAR *p2=(const TCHAR *)pv2;
return _tcsicmp(p1->m_sLabel, p2);
}
static const TCHAR *g_szOpKind[]={_T("子母门"), _T("门"), _T("门连窗"), _T("弧窗"), _T("转角窗"), _T("窗")};//modified by fxj 090622 门联窗-》门连窗
// 从OpeningLabel.ini文件中,得到所有门窗的标注,并按顺序返回
static void GetAllOpeningLabelInIniFile(CStringArray &arLabels)
{
TOpeningLabelData data;
CString csSection;
CStringArray arSectionName, arTempLabels;
data.GetLabelArray(arSectionName); // 获得所有标签名
int nSize = arSectionName.GetSize(),
nLabelSize = 0;
for (int i=0; i<nSize; i++)
{
csSection = arSectionName[i];
data.GetSubType(csSection, arTempLabels); // 获得类型
nLabelSize = arTempLabels.GetSize();
for (int j=0; j<nLabelSize; j++)
{
csSection = arTempLabels[j];
arLabels.InsertAt(0, csSection);
arTempLabels.RemoveAt(0);
nLabelSize--;
j--;
}
}
}
// sg modify 110228,根据8.5需求,将类别改成类型
static int GetSeqCode(const TCHAR *szKind)
{
// int nSeqCode=-1;
// for(int i=0;i<ELEMENTS(g_szOpKind);i++)
//{
// if (_tcscmp(szKind, g_szOpKind[i])==0) {
// nSeqCode=i;
// break;
// }
// }
// return nSeqCode;
CStringArray arLabels;
GetAllOpeningLabelInIniFile(arLabels);
int nSeqCode = -1,
nSize = arLabels.GetSize();
for (int i=0; i<nSize; i++)
{
if (_tcscmp(szKind, arLabels[i]) == 0)
{
nSeqCode = i;
break;
}
}
return nSeqCode;
}
int TOpeningValidation::CompareForSort(const TOpeningValidation *p1, const TOpeningValidation *p2)
{
int nSeqCode1=GetSeqCode(p1->m_sKind);
int nSeqCode2=GetSeqCode(p2->m_sKind);
if (nSeqCode1>nSeqCode2)
return -1;
else if (nSeqCode1<nSeqCode2)
return 1;
return _tcsicmp(p1->m_sLabel, p2->m_sLabel);
}
void TOpeningValidateTable::GetValidLabels(TOpeningData::OpeningKind opKind, XStringList &lstLabels) const
{
lstLabels.Reset();
int nLen=Length();
for(int i=0; i<nLen; i++) {
const TOpeningValidation &entry=(*this)[i];
if (entry.m_opKind==opKind && entry.m_nFlag==0 && !!entry.m_sLabel)
lstLabels.Append(tstrnew(entry.m_sLabel));
}
}
void TOpeningValidateTable::Validate(const TDbOpening *pOpening)
{
const TCHAR *pszLabel=pOpening->GetLabel();
TOpeningValidation *pEntry=FindNode(pszLabel, TOpeningValidation::CompareForFindByCode);
if (!pEntry) {
pEntry=new TOpeningValidation;
Append(pEntry);
}
pEntry->Validate(pOpening);
}
BOOL TOpeningValidateTable::ValidateLabel(const TDbOpening *pOpening)
{
const TCHAR *pszLabel=pOpening->GetLabel();
TOpeningValidation *pEntry=FindNode(pszLabel, TOpeningValidation::CompareForFindByCode);
if (!pEntry) {
return TRUE;
}
if (pEntry->m_nFlag)
return FALSE;
return pEntry->ValidateLabel(pOpening);
}
extern void GetOpeningIdList(DList<AcDbDatabase> &dbList, DList<AcDbObjectId> &idList) ;
// sg delete 110224,8.5起改用新命令,命令函数体移植到OpeningCheck.cpp中
////忽略转角窗,电梯门,隔断门
//void ValidateOpening()
//{
// /*
// PickSet ss(SS_FREE);
// RBList mask(RTDXF0, _T("TCH_OPENING"), NULL);
// if (ss.Get(_T("X"), NULL, NULL, mask)!=RTNORM)
// return;
// */
// DList<AcDbDatabase> dbList;
// DList<AcDbObjectId> ss;
// GetOpeningIdList(dbList, ss);
// if (!ss)
// return;
//
// TOpeningValidateTable opTable;
// int lCount=ss.Length();
// for(int i=0; i<lCount; i++) {
// AcDbObjectId &ent=*ss[i];
// OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbOpening, pOpening);
// if (pOpening && pOpening->GetKind()!=TOpeningData::OP_CORNWIN &&
// //pOpening->GetKind()!=TOpeningData::OP_HOLE &&
// !(pOpening->m_nOpStyle&OPS_LIFTDOOR) && !(pOpening->m_nOpStyle&OPS_LVTRY))
// opTable.Validate(pOpening);
// OPENOBJ_END();
// }
// opTable.QuickSort(TOpeningValidation::CompareForSort);
//
// //modify by xlc on 080918
// //COpeningValidateDlg dlg(&opTable, acedGetAcadFrame());
// COpeningValidateNewDlg dlg(&opTable, acedGetAcadFrame());
// {
// CAcModuleResourceOverride vTemp;
// dlg.DoModal();
// }
//}
//批量改名
void BatNameOpening()
{
Entity ent;
if (SelectEntity(_T("\n选择已经编号的参考门窗<退出>:"),ent,RBList(RTDXF0,_T("TCH_OPENING"),NULL))!=RTNORM)
return;
DList<AcDbDatabase> dbList;
DList<AcDbObjectId> ss;
GetOpeningIdList(dbList, ss);
if (!ss)
return;
TOpeningValidation group;
XString sLabel;
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbOpening, pOpening);
if (pOpening!=NULL)
{
group.Validate(pOpening);
sLabel=pOpening->GetLabel();
}
OPENOBJ_END();
int lCount=ss.Length();
int count=0;
for(int i=0; i<lCount; i++)
{
AcDbObjectId &ent=*ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbOpening, pOpening);
if (group.ValidateLabel(pOpening))//同类门窗
{
pOpening->assertWriteEnabled();
if (sLabel!=pOpening->GetLabel())
{
count++;
pOpening->SetLabel(sLabel);
}
}
OPENOBJ_END();
}
if (count>0)
adsout<<_T("共有")<<count<<_T("个与参照门窗尺寸、样式相同的门窗被编号为")<<sLabel;
else
adsout<<_T("未找到与参照门窗尺寸、样式相同且编号不同的门窗");
}
BOOL ValidateLabel(TDbOpening &op)
{
const TCHAR *szLabel=op.GetLabel();
if (!szLabel || !szLabel[0])
return TRUE;
/*
PickSet ss(SS_FREE);
RBList mask(RTDXF0, _T("TCH_OPENING"), NULL);
if (ss.Get(_T("X"), NULL, NULL, mask)!=RTNORM)
return TRUE;
*/
DList<AcDbDatabase> dbList;
DList<AcDbObjectId> ss;
GetOpeningIdList(dbList, ss);
if (!ss)
return TRUE;
TOpeningValidateTable opTable;
int lCount=ss.Length();
for(int i=0; i<lCount; i++) {
AcDbObjectId &ent=*ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbOpening, pOpening);
//if (pOpening && pOpening->GetKind()!=TOpeningData::OP_CORNWIN &&
//pOpening->GetKind()!=TOpeningData::OP_HOLE &&
// !(pOpening->m_nOpStyle&OPS_LIFTDOOR) && !(pOpening->m_nOpStyle&OPS_LVTRY))
if (pOpening)
opTable.Validate(pOpening);
OPENOBJ_END();
}
return opTable.ValidateLabel(&op);
}
BOOL ValidateLabelInCurDwg(TDbOpening &op)
{
const TCHAR *szLabel=op.GetLabel();
if (!szLabel || !szLabel[0])
return TRUE;
DList<AcDbObjectId> ss;
GetEntFromBlockByDxf(ss, _T("TCH_OPENING"));
TOpeningValidateTable opTable;
int lCount=ss.Length();
for(int i=0; i<lCount; i++) {
AcDbObjectId &ent=*ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbOpening, pOpening);
//if (pOpening && pOpening->GetKind()!=TOpeningData::OP_CORNWIN &&
//pOpening->GetKind()!=TOpeningData::OP_HOLE &&
// !(pOpening->m_nOpStyle&OPS_LIFTDOOR) && !(pOpening->m_nOpStyle&OPS_LVTRY))
if (pOpening)
opTable.Validate(pOpening);
OPENOBJ_END();
}
return opTable.ValidateLabel(&op);
}