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

1470 lines
31 KiB
C++

#include "stdafx.h"
#include "shs_outdoor.h"
#include "SetDataSourceDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CSetDataSourceDlg::CSetDataSourceDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSetDataSourceDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSetDataSourceDlg)
m_nDataSourceType = 0;
m_nLandForm = 0;
//}}AFX_DATA_INIT
m_sDataType1 = _T("文字数字");
m_sDataType2 = _T("点对象Z坐标");
m_sDataType3 = _T("圆对象Z坐标");
m_sDataType4 = _T("图块Z坐标");
m_sDataType5 = _T("图块属性值");
m_sDataType6 = _T("上华标高");
m_dMinVal = 0.0;
m_dMaxVal = 0.0;
m_bChange = false;
m_bExternalBlock = false; // cet 2011.12.2 add
}
void CSetDataSourceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSetDataSourceDlg)
DDX_Control(pDX, IDC_COMBODATASOURCETYPE, m_comDataSouceType);
DDX_CBIndex(pDX, IDC_COMBODATASOURCETYPE, m_nDataSourceType);
DDX_Radio(pDX, IDC_LANDFORMRADIO, m_nLandForm);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSetDataSourceDlg, CDialog)
//{{AFX_MSG_MAP(CSetDataSourceDlg)
ON_BN_CLICKED(IDC_BTN_ADDDEL, OnBtnAddDelDataSource)
ON_CBN_SELCHANGE(IDC_COMBODATASOURCETYPE, OnSelchangeCombodatasourcetype)
ON_EN_CHANGE(IDC_EDT_MIN, OnChangeEdtMin)
ON_EN_CHANGE(IDC_EDT_MAX, OnChangeEdtMin)
ON_BN_CLICKED(IDC_BUTTON_DEL, OnButtonDel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
int CSetDataSourceDlg::GetDataSourceType()
{
CString sText = m_sDataTypeText;
int nSourceType = 0;
if (sText.CompareNoCase(m_sDataType1) == 0)
nSourceType = 0;
else if (sText.CompareNoCase(m_sDataType2) == 0)
nSourceType = 1;
else if (sText.CompareNoCase(m_sDataType3) == 0)
nSourceType = 2;
else if (sText.CompareNoCase(m_sDataType4) == 0)
nSourceType = 3;
else if (sText.CompareNoCase(m_sDataType5) == 0)
nSourceType = 4;
else if (sText.CompareNoCase(m_sDataType6) == 0)
nSourceType = 5;
return nSourceType;
}
void CSetDataSourceDlg::FiltrateDataSourceType(Entity ent)
{
if (ent.Is(_T("TEXT")) || ent.Is(_T("ATS_TEXT")))
{
m_nDataSourceType = 0;
m_bEnable = FALSE;
}
else if (ent.Is(_T("POINT")))
{
m_nDataSourceType = 1;
m_bEnable = FALSE;
}
else if (ent.Is(_T("CIRCLE")))
{
m_nDataSourceType = 2;
m_bEnable = FALSE;
}
else if (ent.Is(_T("INSERT")))
{
m_comDataSouceType.ResetContent();
m_comDataSouceType.AddString(m_sDataType4);
m_comDataSouceType.AddString(m_sDataType5);
m_bEnable = TRUE;
}
else if (ent.Is(_T("ATS_ELEVATION")))
{
m_nDataSourceType = 5;
m_bEnable = FALSE;
}
UpdateData(FALSE);
}
BOOL CSetDataSourceDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//过滤掉不需要的数据源类型
FiltrateDataSourceType(m_ent);
if (GetDlgItem(IDC_COMBODATASOURCETYPE) != NULL)
GetDlgItem(IDC_COMBODATASOURCETYPE)->EnableWindow(m_bEnable);
// cet 200.4.14 add
m_comDataSouceType.GetWindowText(m_sDataTypeText);
GetPickSet();
// GetMinMaxVal(m_ssAllOrigin); // cet 2010.5.20 del
GetMinMaxVal(m_ssAllCur); // cet 2010.5.20 add
UpDateEdt();
// cet 2011.12.2 add 外部参照中选择实体时禁用增减数据源按钮
if (m_bExternalBlock)
{
CWnd *pWnd = GetDlgItem(IDC_BTN_ADDDEL);
if (pWnd != NULL)
{
pWnd->EnableWindow(FALSE);
}
}
return TRUE;
}
void CSetDataSourceDlg::SetSelEntity(Entity ent)
{
m_ent = ent;
}
void CSetDataSourceDlg::OnOK()
{
UpdateData();
m_comDataSouceType.GetLBText(m_nDataSourceType,m_sDataTypeText);
CDialog::OnOK();
}
void CSetDataSourceDlg::OnBtnAddDelDataSource()
{
GetParent()->EnableWindow(TRUE);
GetParent()->SetFocus();
GetParent()->SetActiveWindow();
ShowWindow(SW_HIDE);
// 清除扩张数据"Del"为"1"的数据源
CleanDataSource(m_ssAllCur);
// 显示有效数据源
std::map<AcDbObjectId, Adesk::UInt16> mapColor;
Adesk::UInt16 nColor = 1;
for (long i = 0; i < m_ssAllCur.Length(); i++)
{
Entity s(m_ssAllCur[i]);
ChangeDataSoureColor(mapColor, s, nColor);
}
// cet 2012.2.13 modify 只增加数据源
// // 增减数据源
// TCHAR szKey[10];
// int nRet = 0;
// while (true)
// {
// INITGET_BEG(0, _T("A"));
// nRet = ads_getkword(_T("\n请选择标高数据源[增加标高(A)]<删除>:"), szKey);
// INITGET_END();
// RBList rbMask(RTDXF0, _T("INSERT,TEXT,POINT,CIRCLE,ATS_TEXT,ATS_ELEVATION"), NULL);
// Entity ent;
// if (nRet == RTNONE) // 删除数据源
// {
// while (SelectEntity(_T("\n请点取需要删除的标高数据源<退出>:"), ent, rbMask) == RTNORM)
// {
// if (m_ssAllCur.IsInclude(ent))
// {
// m_ssAllCur -= ent;
// WriteXdata(ent, _T("Del"), _T("1"));
// RecoverDataSoureColor(mapColor, ent);
// }
// }
// continue;
// }
// else if (nRet == RTNORM) // 增加数据源
// {
// if (szKey[0] == _T('A') || szKey[0] == _T('a'))
// {
// while (SelectEntity(_T("\n请点取需要增加的标高数据源<退出>:"), ent, rbMask) == RTNORM)
// {
// if (m_ssAllOrigin.IsInclude(ent))
// {
// m_ssAllCur += ent;
// WriteXdata(ent, _T("Del"), _T("0"));
// ChangeDataSoureColor(mapColor, ent, nColor);
// }
// }
// continue;
// }
// }
//
// break;
// }
RBList rbMask(RTDXF0, _T("INSERT,TEXT,POINT,CIRCLE,ATS_TEXT,ATS_ELEVATION"), NULL);
Entity ent;
while (SelectEntity(_T("\n请点取需要增加的标高数据源<退出>:"), ent, rbMask) == RTNORM)
{
if (m_ssAllOrigin.IsInclude(ent))
{
m_ssAllCur += ent;
WriteXdata(ent, _T("Del"), _T("0"));
ChangeDataSoureColor(mapColor, ent, nColor);
}
}
// 恢复数据源颜色
for (long j = 0; j < m_ssAllCur.Length(); j++)
{
Entity s(m_ssAllCur[i]);
RecoverDataSoureColor(mapColor, s);
}
//更新最大值最小值
long ii = m_ssAllCur.Length();
GetMinMaxVal(m_ssAllCur);
UpDateEdt();
GetParent()->EnableWindow(FALSE);
EnableWindow(TRUE);
SetActiveWindow();
ShowWindow(SW_SHOW);
}
void CSetDataSourceDlg::GetMinMaxVal(PickSet &ssAll)
{
double dEle = 0.0;
AcDbObjectId id = AcDbObjectId::kNull;
if (m_ent.Is(_T("ATS_TEXT")))
{
TDbText *pText = NULL;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pText, id, AcDb::kForRead);
if (pText != NULL)
{
CString strText = pText->GetText();
pText->close();
dEle = _tstof(strText);
if (i == 0)
{
m_dMinVal = dEle;
m_dMaxVal = dEle;
}
else
{
if (m_dMaxVal < dEle)
{
m_dMaxVal = dEle;
}
if (m_dMinVal > dEle)
{
m_dMinVal = dEle;
}
}
}
}
}
else if (m_ent.Is(_T("TEXT")))
{
AcDbText *pText = NULL;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pText, id, AcDb::kForRead);
if (pText != NULL)
{
CString strText = pText->textString();
pText->close();
dEle = _tstof(strText);
if (i == 0)
{
m_dMinVal = dEle;
m_dMaxVal = dEle;
}
else
{
if (m_dMaxVal < dEle)
{
m_dMaxVal = dEle;
}
if (m_dMinVal > dEle)
{
m_dMinVal = dEle;
}
}
}
}
}
else if (m_ent.Is(_T("POINT"))) // 点对象Z坐标
{
AcDbPoint *pPt = NULL;
XPoint ptVal;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pPt, id, AcDb::kForRead);
if(pPt != NULL)
{
ptVal = pPt->position();
pPt->close();
// cet 2011.12.2 add 外部参照中的实体需要进行转换
if (m_bExternalBlock)
{
ptVal.TransformBy(m_mat);
}
dEle = ptVal.z;
if (i == 0)
{
m_dMinVal = dEle;
m_dMaxVal = dEle;
}
else
{
if (m_dMaxVal < dEle)
{
m_dMaxVal = dEle;
}
if (m_dMinVal > dEle)
{
m_dMinVal = dEle;
}
}
}
}
}
else if (m_ent.Is(_T("CIRCLE"))) // 圆对象Z坐标
{
AcDbCircle *pCir = NULL;
XPoint ptVal;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pCir, id, AcDb::kForRead);
if(pCir != NULL)
{
ptVal = pCir->center();
pCir->close();
// cet 2011.12.2 add 外部参照中的实体需要进行转换
if (m_bExternalBlock)
{
ptVal.TransformBy(m_mat);
}
dEle = ptVal.z;
if (i == 0)
{
m_dMinVal = dEle;
m_dMaxVal = dEle;
}
else
{
if (m_dMaxVal < dEle)
{
m_dMaxVal = dEle;
}
if (m_dMinVal > dEle)
{
m_dMinVal = dEle;
}
}
}
}
}
else if (m_ent.Is(_T("INSERT")))
{
if (m_nDataSourceType == 0) // 图块Z坐标
{
AcDbBlockReference *pRef = NULL;
AcGePoint3d ptLoc;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pRef, id, AcDb::kForRead);
if (pRef != NULL)
{
ptLoc = pRef->position();
pRef->close();
// cet 2011.12.2 add 外部参照中的实体需要进行转换
if (m_bExternalBlock)
{
ptLoc.transformBy(m_mat);
}
dEle = ptLoc.z;
if (i == 0)
{
m_dMinVal = dEle;
m_dMaxVal = dEle;
}
else
{
if (m_dMaxVal < dEle)
{
m_dMaxVal = dEle;
}
if (m_dMinVal > dEle)
{
m_dMinVal = dEle;
}
}
}
}
}
else if (m_nDataSourceType == 1) // 图块属性值
{
AcDbBlockReference *pRef = NULL;
AcGePoint3d ptLoc;
CString strText;
int nAttCount = 0;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pRef, id, AcDb::kForRead);
if (pRef != NULL)
{
AcDbObjectIterator *pIterator = NULL;
pIterator = pRef->attributeIterator();
for (pIterator->start(); !pIterator->done(); pIterator->step())
{
//遍历块中实体
AcDbEntity *pEnt = NULL;
AcDbAttribute *pAtt = NULL;
AcDbObjectId att_id;
att_id = pIterator -> objectId();
acdbOpenAcDbEntity(pEnt, att_id, AcDb::kForRead);
pAtt = AcDbAttribute::cast(pEnt);
if(pAtt != NULL)
{
strText = pAtt->textString();
nAttCount++;
}
pEnt->close();
}
delete pIterator;
pRef->close();
dEle = _tstof(strText);
if (i == 0)
{
m_dMinVal = dEle;
m_dMaxVal = dEle;
}
else
{
if (m_dMaxVal < dEle)
{
m_dMaxVal = dEle;
}
if (m_dMinVal > dEle)
{
m_dMinVal = dEle;
}
}
}
}
}
}
else if (m_ent.Is(_T("ATS_ELEVATION"))) // 上华标高
{
CString strText;
TDbSymbElevation *pEle = NULL;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pEle, id, AcDb::kForRead);
if (pEle != NULL)
{
strText = pEle->GetText();
pEle->close();
dEle = _tstof(strText);
if (i == 0)
{
m_dMinVal = dEle;
m_dMaxVal = dEle;
}
else
{
if (m_dMaxVal < dEle)
{
m_dMaxVal = dEle;
}
if (m_dMinVal > dEle)
{
m_dMinVal = dEle;
}
}
}
}
}
}
void CSetDataSourceDlg::GetPickSet()
{
resbuf *rb = NULL;
TCHAR szLayerName[256];
m_ent.GetData(8,szLayerName);
PickSet ssAll(SS_FREE);
// 外部参照 cet 2011.12.2 add
if (m_bExternalBlock)
{
GetEntFromExternalBlk(ssAll);
int nType = GetDataSourceType();
FiltrateDataSource(ssAll, nType);
m_ssAllCur += ssAll;
CleanDataSource(m_ssAllCur);
m_ssAllOrigin += ssAll;
return;
}
if (m_ent.Is(_T("TEXT")) || m_ent.Is(_T("ATS_TEXT")))
{
rb = ads_buildlist(RTDXF0, _T("TEXT,ATS_TEXT"),8,szLayerName, NULL);
ssAll.Get(_T("X"), NULL, NULL, rb);
}
else if (m_ent.Is(_T("POINT")))
{
rb = ads_buildlist(RTDXF0, _T("POINT"), 8,szLayerName,NULL);
ssAll.Get(_T("X"), NULL, NULL, rb);
}
else if (m_ent.Is(_T("CIRCLE")))
{
rb = ads_buildlist(RTDXF0, _T("CIRCLE"),8,szLayerName, NULL);
ssAll.Get(_T("X"), NULL, NULL, rb);
}
else if (m_ent.Is(_T("ATS_ELEVATION")))
{
rb = ads_buildlist(RTDXF0, _T("ATS_ELEVATION"),8,szLayerName, NULL);
ssAll.Get(_T("X"), NULL, NULL, rb);
}
else if (m_ent.Is(_T("INSERT")))
{
TCHAR szBlkName[256];
m_ent.GetData(2,szBlkName);
rb = ads_buildlist(RTDXF0, _T("INSERT"),8,szLayerName, 2,szBlkName, NULL);
ssAll.Get(_T("X"), NULL, NULL, rb);
}
int nType = GetDataSourceType();
FiltrateDataSource(ssAll, nType);
m_ssAllCur += ssAll;
CleanDataSource(m_ssAllCur); // cet 2010.5.20 add
m_ssAllOrigin += ssAll;
}
void CSetDataSourceDlg::FiltrateDataSource(PickSet &ssAll, int nType, bool bCompare)
{
PickSet ssDel(SS_FREE);
double dEle = 0.0;
AcDbObjectId id = AcDbObjectId::kNull;
Adesk::UInt16 nColor = 0;
if (nType == 0) //文字数字
{
if (m_ent.Is(_T("ATS_TEXT")))
{
TDbText *pText = NULL;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pText, id, AcDb::kForRead);
if (pText != NULL)
{
CString strText = pText->GetText();
nColor = pText->colorIndex();
pText->close();
if (!IsValidNumber(strText))
{
ssDel += ssAll[i];
}
else
{
if (bCompare)
{
dEle = _tstof(strText);
if (!IsValidNumber(dEle))
{
ssDel += ssAll[i];
}
}
}
}
}
}
else if (m_ent.Is(_T("TEXT")))
{
AcDbText *pText = NULL;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pText, id, AcDb::kForRead);
if (pText != NULL)
{
CString strText = pText->textString();
nColor = pText->colorIndex();
pText->close();
if (!IsValidNumber(strText))
{
ssDel += ssAll[i];
}
else
{
if (bCompare)
{
dEle = _tstof(strText);
if (!IsValidNumber(dEle))
{
ssDel += ssAll[i];
}
}
}
}
}
}
}
else if (nType == 1) // 点对象Z坐标
{
AcDbPoint *pPt = NULL;
XPoint ptVal;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pPt, id, AcDb::kForRead);
if(pPt != NULL)
{
ptVal = pPt->position();
nColor = pPt->colorIndex();
pPt->close();
if (bCompare)
{
// cet 2011.12.2 add 外部参照中的实体需要进行转换
if (m_bExternalBlock)
{
ptVal.TransformBy(m_mat);
}
dEle = ptVal.z;
if (!IsValidNumber(dEle))
{
ssDel += ssAll[i];
}
}
}
}
}
else if (nType == 2) // 圆对象Z坐标
{
AcDbCircle *pCir = NULL;
XPoint ptVal;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pCir, id, AcDb::kForRead);
if(pCir != NULL)
{
ptVal = pCir->center();
nColor = pCir->colorIndex();
pCir->close();
if (bCompare)
{
// cet 2011.12.2 add 外部参照中的实体需要进行转换
if (m_bExternalBlock)
{
ptVal.TransformBy(m_mat);
}
dEle = ptVal.z;
if (!IsValidNumber(dEle))
{
ssDel += ssAll[i];
}
}
}
}
}
else if (nType == 3) // 图块Z坐标
{
AcDbBlockReference *pRef = NULL;
AcGePoint3d ptLoc;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pRef, id, AcDb::kForRead);
if (pRef != NULL)
{
ptLoc = pRef->position();
nColor = pRef->colorIndex();
pRef->close();
if (bCompare)
{
// cet 2011.12.2 add 外部参照中的实体需要进行转换
if (m_bExternalBlock)
{
ptLoc.transformBy(m_mat);
}
dEle = ptLoc.z;
if (!IsValidNumber(dEle))
{
ssDel += ssAll[i];
}
}
}
}
}
else if (nType == 4) // 图块属性值
{
AcDbBlockReference *pRef = NULL;
AcGePoint3d ptLoc;
CString strText;
int nAttCount = 0;
for (long i = 0; i < ssAll.Length(); i++)
{
nAttCount = 0;
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pRef, id, AcDb::kForRead);
if (pRef != NULL)
{
AcDbObjectIterator *pIterator = NULL;
pIterator = pRef->attributeIterator();
for (pIterator->start(); !pIterator->done(); pIterator->step())
{
//遍历块中实体
AcDbEntity *pEnt = NULL;
AcDbAttribute *pAtt = NULL;
AcDbObjectId att_id;
att_id = pIterator -> objectId();
acdbOpenAcDbEntity(pEnt, att_id, AcDb::kForRead);
pAtt = AcDbAttribute::cast(pEnt);
if(pAtt != NULL)
{
strText = pAtt->textString();
nColor = pAtt->colorIndex();
nAttCount++;
}
pEnt->close();
}
delete pIterator;
pRef->close();
if (nAttCount == 1) // 块包含一个属性字
{
if (!IsValidNumber(strText))
{
ssDel += ssAll[i];
}
else
{
if (bCompare)
{
dEle = _tstof(strText);
if (!IsValidNumber(dEle))
{
ssDel += ssAll[i];
}
}
}
}
else // 块包含多个或零个属性字
{
ssDel += ssAll[i];
}
}
}
}
else if (nType == 5) // 上华标高
{
CString strText;
TDbSymbElevation *pEle = NULL;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pEle, id, AcDb::kForRead);
if (pEle != NULL)
{
strText = pEle->GetText();
nColor = pEle->colorIndex();
pEle->close();
if (!IsValidNumber(strText))
{
ssDel += ssAll[i];
}
else
{
if (bCompare)
{
dEle = _tstof(strText);
if (!IsValidNumber(dEle))
{
ssDel += ssAll[i];
}
}
}
}
}
}
ssAll -= ssDel;
}
void CSetDataSourceDlg::FiltrateDataSource(int nType)
{
PickSet ssDel(SS_FREE);
double dEle = 0.0;
AcDbObjectId id = AcDbObjectId::kNull;
PickSet ssAll(SS_FREE);
ssAll += m_ssAllOrigin;
if (nType == 0) //文字数字
{
if (m_ent.Is(_T("ATS_TEXT")))
{
TDbText *pText = NULL;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pText, id, AcDb::kForRead);
if (pText != NULL)
{
CString strText = pText->GetText();
pText->close();
if (!IsValidNumber(strText))
{
ssDel += ssAll[i];
}
}
}
}
else if (m_ent.Is(_T("TEXT")))
{
AcDbText *pText = NULL;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pText, id, AcDb::kForRead);
if (pText != NULL)
{
CString strText = pText->textString();
pText->close();
if (!IsValidNumber(strText))
{
ssDel += ssAll[i];
}
}
}
}
}
else if (nType == 4) // 图块属性值
{
AcDbBlockReference *pRef = NULL;
AcGePoint3d ptLoc;
CString strText;
int nAttCount = 0;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pRef, id, AcDb::kForRead);
if (pRef != NULL)
{
AcDbObjectIterator *pIterator = NULL;
pIterator = pRef->attributeIterator();
for (pIterator->start(); !pIterator->done(); pIterator->step())
{
//遍历块中实体
AcDbEntity *pEnt = NULL;
AcDbAttribute *pAtt = NULL;
AcDbObjectId att_id;
att_id = pIterator -> objectId();
acdbOpenAcDbEntity(pEnt, att_id, AcDb::kForRead);
pAtt = AcDbAttribute::cast(pEnt);
if(pAtt != NULL)
{
strText = pAtt->textString();
nAttCount++;
}
pEnt->close();
}
delete pIterator;
pRef->close();
if (nAttCount == 1) // 块包含一个属性字
{
if (!IsValidNumber(strText))
{
ssDel += ssAll[i];
}
}
}
}
}
else if (nType == 5) // 上华标高
{
CString strText;
TDbSymbElevation *pEle = NULL;
for (long i = 0; i < ssAll.Length(); i++)
{
acdbGetObjectId(id, ssAll[i]);
acdbOpenObject(pEle, id, AcDb::kForRead);
if (pEle != NULL)
{
strText = pEle->GetText();
pEle->close();
if (!IsValidNumber(strText))
{
ssDel += ssAll[i];
}
}
}
}
m_ssAllOrigin -= ssDel;
}
bool CSetDataSourceDlg::IsValidNumber(const CString strText)
{
if (strText.IsEmpty())
{
return false;
}
bool bRet = true;
TCHAR ch;
for (int j = 0; j < strText.GetLength(); j++)
{
ch = strText.GetAt(j);
if ((ch < _T('0') || ch > _T('9')) &&
ch != _T('.') && ch != _T('-') && ch != _T('+'))
{
bRet = false;
break;
}
}
return bRet;
}
bool CSetDataSourceDlg::IsValidNumber(double dVal)
{
if (dVal >= m_dMinVal && dVal <= m_dMaxVal)
{
return true;
}
return false;
}
void CSetDataSourceDlg::GetPickSet(PickSet &ssAll)
{
ssAll += m_ssAllCur;
}
void CSetDataSourceDlg::OnSelchangeCombodatasourcetype()
{
UpdateData(TRUE);
GetMinMaxVal(m_ssAllOrigin);
UpDateEdt();
}
void CSetDataSourceDlg::OnChangeEdtMin()
{
if (m_bChange)
{
UpdateData(TRUE);
m_dMinVal = 0.0;
m_dMaxVal = 0.0;
CWnd *pWnd = NULL;
CString strTmp;
pWnd = GetDlgItem(IDC_EDT_MAX);
if (pWnd != NULL)
{
pWnd->GetWindowText(strTmp);
m_dMaxVal = _tstof(strTmp);
}
pWnd = GetDlgItem(IDC_EDT_MIN);
if (pWnd != NULL)
{
pWnd->GetWindowText(strTmp);
m_dMinVal = _tstof(strTmp);
}
if (m_dMaxVal > m_dMinVal)
{
m_comDataSouceType.GetWindowText(m_sDataTypeText);
int nType = GetDataSourceType();
PickSet ssAll(SS_FREE);
ssAll += m_ssAllOrigin;
FiltrateDataSource(ssAll, nType, true);
m_ssAllCur.Free();
m_ssAllCur += ssAll;
}
}
}
void CSetDataSourceDlg::ChangeDataSoureColor(std::map<AcDbObjectId,Adesk::UInt16> &mapOriginColor, Entity &ent, Adesk::UInt16 nColor)
{
Adesk::UInt16 nOriginColor = 0;
AcDbObjectId id = AcDbObjectId::kNull;
acdbGetObjectId(id, ent);
if (ent.Is(_T("ATS_TEXT")))
{
TDbText *pText = NULL;
acdbOpenObject(pText, id, AcDb::kForWrite);
if (pText != NULL)
{
nOriginColor = pText->colorIndex();
pText->setColorIndex(nColor);
pText->close();
}
}
else if (ent.Is(_T("TEXT")))
{
AcDbText *pText = NULL;
acdbOpenObject(pText, id, AcDb::kForWrite);
if (pText != NULL)
{
nOriginColor = pText->colorIndex();
pText->setColorIndex(nColor);
pText->close();
}
}
else if (ent.Is(_T("POINT"))) // 点对象Z坐标
{
AcDbPoint *pPt = NULL;
acdbOpenObject(pPt, id, AcDb::kForWrite);
if(pPt != NULL)
{
nOriginColor = pPt->colorIndex();
pPt->setColorIndex(nColor);
pPt->close();
}
}
else if (ent.Is(_T("CIRCLE"))) // 圆对象Z坐标
{
AcDbCircle *pCir = NULL;
acdbOpenObject(pCir, id, AcDb::kForWrite);
if(pCir != NULL)
{
nOriginColor = pCir->colorIndex();
pCir->setColorIndex(nColor);
pCir->close();
}
}
else if (ent.Is(_T("INSERT")))
{
if (m_nDataSourceType == 0) // 图块Z坐标
{
AcDbBlockReference *pRef = NULL;
acdbOpenObject(pRef, id, AcDb::kForWrite);
if (pRef != NULL)
{
nOriginColor = pRef->colorIndex();
pRef->setColorIndex(nColor);
AcDbObjectId idRec = pRef->blockTableRecord();
AcDbBlockTableRecord *pBlkTblRec = NULL;
acdbOpenObject(pBlkTblRec, idRec, AcDb::kForWrite);
if (pBlkTblRec != NULL)
{
AcDbBlockTableRecordIterator *pIter = NULL;
pBlkTblRec->newIterator(pIter);
AcDbEntity *pEnt = NULL;
for (pIter->start(); !pIter->done(); pIter->step())
{
Acad::ErrorStatus es = pIter->getEntity(pEnt, AcDb::kForWrite);
if (pEnt != NULL && es == Acad::eOk)
{
pEnt->setColorIndex(nColor);
pEnt->close();
}
}
delete pIter;
pIter = NULL;
pBlkTblRec->close();
}
pRef->close();
}
}
else if (m_nDataSourceType == 1) // 图块属性值
{
AcDbBlockReference *pRef = NULL;
Acad::ErrorStatus st = acdbOpenObject(pRef, id, AcDb::kForWrite);
if (pRef != NULL)
{
AcDbObjectIterator *pIterator = NULL;
pIterator = pRef->attributeIterator();
for (pIterator->start(); !pIterator->done(); pIterator->step())
{
//遍历块中实体
AcDbEntity *pEnt = NULL;
AcDbAttribute *pAtt = NULL;
AcDbObjectId att_id;
att_id = pIterator -> objectId();
acdbOpenAcDbEntity(pEnt, att_id, AcDb::kForWrite);
pAtt = AcDbAttribute::cast(pEnt);
if(pAtt != NULL)
{
nOriginColor = pAtt->colorIndex();
pAtt->setColorIndex(nColor);
}
pEnt->close();
}
delete pIterator;
pRef->close();
}
}
}
else if (ent.Is(_T("ATS_ELEVATION"))) // 上华标高
{
CString strText;
TDbSymbElevation *pEle = NULL;
Acad::ErrorStatus st = acdbOpenObject(pEle, id, AcDb::kForWrite);
if (pEle != NULL)
{
CString test = pEle->GetText();
nOriginColor = pEle->colorIndex();
pEle->setColorIndex(nColor);
pEle->close();
}
}
mapOriginColor.insert(std::make_pair(id, nOriginColor));
}
void CSetDataSourceDlg::RecoverDataSoureColor(std::map<AcDbObjectId, Adesk::UInt16> &mapOriginColor, Entity &ent)
{
Adesk::UInt16 nColor = 0;
AcDbObjectId id = AcDbObjectId::kNull;
acdbGetObjectId(id, ent);
std::map<AcDbObjectId, Adesk::UInt16>::iterator it;
for (it = mapOriginColor.begin(); it != mapOriginColor.end(); it++)
{
if ((*it).first == id)
{
nColor = (*it).second;
break;
}
}
if (it == mapOriginColor.end())
{
return;
}
if (ent.Is(_T("ATS_TEXT")))
{
TDbText *pText = NULL;
acdbOpenObject(pText, id, AcDb::kForWrite);
if (pText != NULL)
{
pText->setColorIndex(nColor);
pText->close();
}
}
else if (ent.Is(_T("TEXT")))
{
AcDbText *pText = NULL;
acdbOpenObject(pText, id, AcDb::kForWrite);
if (pText != NULL)
{
pText->setColorIndex(nColor);
pText->close();
}
}
else if (ent.Is(_T("POINT"))) // 点对象Z坐标
{
AcDbPoint *pPt = NULL;
acdbOpenObject(pPt, id, AcDb::kForWrite);
if(pPt != NULL)
{
pPt->setColorIndex(nColor);
pPt->close();
}
}
else if (ent.Is(_T("CIRCLE"))) // 圆对象Z坐标
{
AcDbCircle *pCir = NULL;
acdbOpenObject(pCir, id, AcDb::kForWrite);
if(pCir != NULL)
{
pCir->setColorIndex(nColor);
pCir->close();
}
}
else if (ent.Is(_T("INSERT")))
{
if (m_nDataSourceType == 0) // 图块Z坐标
{
AcDbBlockReference *pRef = NULL;
acdbOpenObject(pRef, id, AcDb::kForWrite);
if (pRef != NULL)
{ AcDbObjectId idRec = pRef->blockTableRecord();
pRef->setColorIndex(nColor);
AcDbBlockTableRecord *pBlkTblRec = NULL;
acdbOpenObject(pBlkTblRec, idRec, AcDb::kForWrite);
if (pBlkTblRec != NULL)
{
AcDbBlockTableRecordIterator *pIter = NULL;
pBlkTblRec->newIterator(pIter);
AcDbEntity *pEnt = NULL;
for (pIter->start(); !pIter->done(); pIter->step())
{
Acad::ErrorStatus es = pIter->getEntity(pEnt, AcDb::kForWrite);
if (pEnt != NULL && es == Acad::eOk)
{
pEnt->setColorIndex(nColor);
pEnt->close();
}
}
delete pIter;
pIter = NULL;
pBlkTblRec->close();
}
pRef->close();
}
}
else if (m_nDataSourceType == 1) // 图块属性值
{
AcDbBlockReference *pRef = NULL;
acdbOpenObject(pRef, id, AcDb::kForWrite);
if (pRef != NULL)
{
AcDbObjectIterator *pIterator = NULL;
pIterator = pRef->attributeIterator();
for (pIterator->start(); !pIterator->done(); pIterator->step())
{
//遍历块中实体
AcDbEntity *pEnt = NULL;
AcDbAttribute *pAtt = NULL;
AcDbObjectId att_id;
att_id = pIterator -> objectId();
acdbOpenAcDbEntity(pEnt, att_id, AcDb::kForWrite);
pAtt = AcDbAttribute::cast(pEnt);
if(pAtt != NULL)
{
pAtt->setColorIndex(nColor);
}
pEnt->close();
}
delete pIterator;
pRef->close();
}
}
}
else if (ent.Is(_T("ATS_ELEVATION"))) // 上华标高
{
CString strText;
TDbSymbElevation *pEle = NULL;
acdbOpenObject(pEle, id, AcDb::kForWrite);
if (pEle != NULL)
{
pEle->setColorIndex(nColor);
pEle->close();
}
}
}
void CSetDataSourceDlg::UpDateEdt()
{
m_bChange = false;
CString strTmp;
CWnd *pWnd = NULL;
pWnd = GetDlgItem(IDC_EDT_MIN);
if (pWnd != NULL)
{
strTmp.Format(_T("%.3f"), m_dMinVal);
strTmp.TrimRight(_T("0"));
strTmp.TrimRight(_T("."));
pWnd->SetWindowText(strTmp);
}
pWnd = GetDlgItem(IDC_EDT_MAX);
if (pWnd != NULL)
{
strTmp.Format(_T("%.3f"), m_dMaxVal);
strTmp.TrimRight(_T("0"));
strTmp.TrimRight(_T("."));
pWnd->SetWindowText(strTmp);
}
m_bChange = true;
UpdateData(FALSE);
}
void CSetDataSourceDlg::CleanDataSource(PickSet &ssAll)
{
CString strText;
PickSet ssDel(SS_FREE);
for (long i = 0; i < ssAll.Length(); i++)
{
strText = _T("");
strText = ReadXdata(ssAll[i], _T("Del"));
if (strText.Compare(_T("1")) == 0)
{
ssDel += ssAll[i];
}
}
ssAll -= ssDel;
}
void CSetDataSourceDlg::SetExternalBlk(Entity &ent)
{
m_entExternalBlk = ent;
}
void CSetDataSourceDlg::SetExternalBlk(bool bExternalBlk)
{
m_bExternalBlock = bExternalBlk;
}
void CSetDataSourceDlg::SetExnternalBlkMat(const AcGeMatrix3d &mat)
{
m_mat = mat;
}
void CSetDataSourceDlg::GetEntFromExternalBlk(PickSet &ss)
{
// 根据数据类型获取外部参照中的实体
AcDbObjectId idRef;
acdbGetObjectId(idRef, m_entExternalBlk);
AcDbBlockReference *pRef = NULL;
acdbOpenObject(pRef, idRef, AcDb::kForRead);
if (pRef)
{
AcDbObjectId idRec = pRef->blockTableRecord();
AcDbBlockTableRecord *pRec = NULL;
acdbOpenObject(pRec, idRec, AcDb::kForRead);
if (pRec)
{
AcDbBlockTableRecordIterator *pItr = NULL;
pRec->newIterator(pItr);
AcDbObjectId idEnt;
for (pItr->start(); !pItr->done(); pItr->step())
{
pItr->getEntityId(idEnt);
ads_name sname;
acdbGetAdsName(sname,idEnt);
Entity ent = sname;
if (m_ent.Is(_T("ATS_TEXT")) && ent.Is(_T("ATS_TEXT")))
{
ss += ent;
}
else if (m_ent.Is(_T("TEXT")) && ent.Is(_T("TEXT")))
{
ss += ent;
}
else if (m_ent.Is(_T("POINT")) && ent.Is(_T("POINT"))) // 点对象Z坐标
{
ss += ent;
}
else if (m_ent.Is(_T("CIRCLE")) && ent.Is(_T("CIRCLE"))) // 圆对象Z坐标
{
ss += ent;
}
else if (m_ent.Is(_T("INSERT")) && ent.Is(_T("INSERT")))
{
ss += ent;
}
else if (m_ent.Is(_T("ATS_ELEVATION")) && ent.Is(_T("ATS_ELEVATION"))) // 上华标高
{
ss += ent;
}
}
delete pItr;
pItr = NULL;
pRec->close();
}
pRef->close();
}
}
void CSetDataSourceDlg::OnButtonDel()
{
GetParent()->EnableWindow(TRUE);
GetParent()->SetFocus();
GetParent()->SetActiveWindow();
ShowWindow(SW_HIDE);
// 清除扩张数据"Del"为"1"的数据源
CleanDataSource(m_ssAllCur);
// 显示有效数据源
std::map<AcDbObjectId, Adesk::UInt16> mapColor;
Adesk::UInt16 nColor = 1;
for (long i = 0; i < m_ssAllCur.Length(); i++)
{
Entity s(m_ssAllCur[i]);
ChangeDataSoureColor(mapColor, s, nColor);
}
RBList rbMask(RTDXF0, _T("INSERT,TEXT,POINT,CIRCLE,ATS_TEXT,ATS_ELEVATION"), NULL);
Entity ent;
while (SelectEntity(_T("\n请点取需要删除的标高数据源<退出>:"), ent, rbMask) == RTNORM)
{
if (m_ssAllCur.IsInclude(ent))
{
m_ssAllCur -= ent;
WriteXdata(ent, _T("Del"), _T("1"));
RecoverDataSoureColor(mapColor, ent);
}
}
// 恢复数据源颜色
for (long j = 0; j < m_ssAllCur.Length(); j++)
{
Entity s(m_ssAllCur[i]);
RecoverDataSoureColor(mapColor, s);
}
//更新最大值最小值
long ii = m_ssAllCur.Length();
GetMinMaxVal(m_ssAllCur);
UpDateEdt();
GetParent()->EnableWindow(FALSE);
EnableWindow(TRUE);
SetActiveWindow();
ShowWindow(SW_SHOW);
}