#include "stdafx.h" #include "globalFunc.h" #include "SetDataSourceDlg.h" #include "AecDbText.h" #include "AecDbSymbElevation.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); Entity ent; // 显示有效数据源 std::map mapColor; Adesk::UInt16 nColor = 1; for (long i = 0; i < m_ssAllCur.Length(); i++) { ent = m_ssAllCur[i]; ChangeDataSoureColor(mapColor, ent, 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 (GlobalFunc::SelectEntity(_T("\n请点取需要删除的标高数据源<退出>:"), ent, rbMask) == RTNORM) // { // if (m_ssAllCur.IsInclude(ent)) // { // m_ssAllCur -= ent; // GlobalFunc::WriteXdata(ent, _T("Del"), _T("1")); // RecoverDataSoureColor(mapColor, ent); // } // } // continue; // } // else if (nRet == RTNORM) // 增加数据源 // { // if (szKey[0] == _T('A') || szKey[0] == _T('a')) // { // while (GlobalFunc::SelectEntity(_T("\n请点取需要增加的标高数据源<退出>:"), ent, rbMask) == RTNORM) // { // if (m_ssAllOrigin.IsInclude(ent)) // { // m_ssAllCur += ent; // GlobalFunc::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); while (GlobalFunc::SelectEntity(_T("\n请点取需要增加的标高数据源<退出>:"), ent, rbMask) == RTNORM) { if (m_ssAllOrigin.IsInclude(ent)) { m_ssAllCur += ent; GlobalFunc::WriteXdata(ent, _T("Del"), _T("0")); ChangeDataSoureColor(mapColor, ent, nColor); } } // 恢复数据源颜色 for (long j = 0; j < m_ssAllCur.Length(); j++) { ent = m_ssAllCur[i]; RecoverDataSoureColor(mapColor, ent); } //更新最大值最小值 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"))) { AecXDbText *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; AecXDbSymbElevation *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"))) { AecXDbText *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; AecXDbSymbElevation *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"))) { AecXDbText *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; AecXDbSymbElevation *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 &mapOriginColor, Entity &ent, Adesk::UInt16 nColor) { Adesk::UInt16 nOriginColor = 0; AcDbObjectId id = AcDbObjectId::kNull; acdbGetObjectId(id, ent); if (ent.Is(_T("ATS_TEXT"))) { AecXDbText *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; AecXDbSymbElevation *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 &mapOriginColor, Entity &ent) { Adesk::UInt16 nColor = 0; AcDbObjectId id = AcDbObjectId::kNull; acdbGetObjectId(id, ent); std::map::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"))) { AecXDbText *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; AecXDbSymbElevation *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 = GlobalFunc::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); Entity ent; // 显示有效数据源 std::map mapColor; Adesk::UInt16 nColor = 1; for (long i = 0; i < m_ssAllCur.Length(); i++) { ent = m_ssAllCur[i]; ChangeDataSoureColor(mapColor, ent, nColor); } RBList rbMask(RTDXF0, _T("INSERT,TEXT,POINT,CIRCLE,ATS_TEXT,ATS_ELEVATION"), NULL); while (GlobalFunc::SelectEntity(_T("\n请点取需要删除的标高数据源<退出>:"), ent, rbMask) == RTNORM) { if (m_ssAllCur.IsInclude(ent)) { m_ssAllCur -= ent; GlobalFunc::WriteXdata(ent, _T("Del"), _T("1")); RecoverDataSoureColor(mapColor, ent); } } // 恢复数据源颜色 for (long j = 0; j < m_ssAllCur.Length(); j++) { ent = m_ssAllCur[j]; RecoverDataSoureColor(mapColor, ent); } //更新最大值最小值 long ii = m_ssAllCur.Length(); GetMinMaxVal(m_ssAllCur); UpDateEdt(); GetParent()->EnableWindow(FALSE); EnableWindow(TRUE); SetActiveWindow(); ShowWindow(SW_SHOW); }