#include "stdafx.h" #include "FindAndInsteadVPipeDimDlg.h" #include "DbVPipeDim.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //查替立编 zxl 2012.08.28 add void FindAndInsteadVPipeDim() { CTemporaryResourceOverride vTemp; // 命令执行期间保证只有一个对话框存在 if (CFindAndInsteadVPipeDimDlg::IsCreatedDlg()) { return; } CFindAndInsteadVPipeDimDlg *pDlg = new CFindAndInsteadVPipeDimDlg(acedGetAcadFrame()); pDlg->Create(IDD_FIND_INSTEAD_VPIPEDIM); pDlg->ClearData(); pDlg->ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); } bool CFindAndInsteadVPipeDimDlg::m_bCreatedDlg = false; CFindAndInsteadVPipeDimDlg::CFindAndInsteadVPipeDimDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CFindAndInsteadVPipeDimDlg::IDD, pParent) { //{{AFX_DATA_INIT(CFindAndInsteadVPipeDimDlg) m_sBefore1 = _T(""); m_sBefore2 = _T(""); m_sFloor1 = _T(""); m_sFloor2 = _T(""); m_sNum1 = _T(""); m_sNum2 = _T(""); m_nStyle = 0; m_nSearch = 0; m_nInstead = 0; //}}AFX_DATA_INIT m_bCreatedDlg = true; m_bFirstSearch = true; } void CFindAndInsteadVPipeDimDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CFindAndInsteadVPipeDimDlg) DDX_Control(pDX, IDC_BTN_SEARCH, m_wndBtnSearch); DDX_Text(pDX, IDC_EDIT_BEFORE1, m_sBefore1); DDX_Text(pDX, IDC_EDIT_BEFORE2, m_sBefore2); DDX_Text(pDX, IDC_EDIT_FLOOR1, m_sFloor1); DDX_Text(pDX, IDC_EDIT_FLOOR2, m_sFloor2); DDX_Text(pDX, IDC_EDIT_NUM1, m_sNum1); DDX_Text(pDX, IDC_EDIT_NUM2, m_sNum2); DDX_CBIndex(pDX, IDC_COMBO_FIND_STYLE, m_nStyle); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CFindAndInsteadVPipeDimDlg, CModelessDialog) //{{AFX_MSG_MAP(CFindAndInsteadVPipeDimDlg) ON_BN_CLICKED(IDC_BTN_INSTEAD_ALL, OnBtnInsteadAll) ON_BN_CLICKED(IDC_BTN_INSTEAD, OnBtnInstead) ON_BN_CLICKED(IDC_BTN_FIND, OnBtnFindNext) ON_CBN_SELCHANGE(IDC_COMBO_FIND_STYLE, OnSelchangeComboFindStyle) ON_BN_CLICKED(IDC_BTN_SEARCH, OnBtnSearch) ON_WM_CLOSE() ON_EN_CHANGE(IDC_EDIT_NUM1, OnChangeEditNum1) ON_EN_CHANGE(IDC_EDIT_FLOOR1, OnChangeEditFloor1) ON_EN_CHANGE(IDC_EDIT_BEFORE1, OnChangeEditBefore1) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CFindAndInsteadVPipeDimDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); CBitmap bitmap; if (bitmap.LoadBitmap(IDB_BITMAP_FIND)) { m_wndBtnSearch.SetBitmap(bitmap); bitmap.Detach(); } InitPickSet(); m_wndToolTip.Create(this); m_wndToolTip.AddTool( GetDlgItem(IDC_BTN_SEARCH), _T("选取对象")); m_wndToolTip.SetDelayTime(200); m_wndToolTip.Activate(TRUE); return TRUE; } void CFindAndInsteadVPipeDimDlg::InitPickSet() { RBList rbMask(RTDXF0, _T("ATS_VPIPEDIM"), NULL); m_ss.Get(_T("X"), NULL, NULL, rbMask); long len = m_ss.Length(); XStringList lstWellName, lstRepeat; for(long i=0;iGetDimTypeText(csHead); CString sSerial; pDim->GetDimVPipeNum(sSerial); CString csName,csFloor; pDim->GetVPipeFloorNum(csFloor); if (csFloor.IsEmpty()) csName.Format(_T("%s-%s"), csHead, sSerial); else csName.Format(_T("%s-%s-%s"), csHead,csFloor, sSerial); if(lstWellName.Index(csName, 0) < 0) lstWellName.Append(tstrnew(csName)); else lstRepeat.Append(tstrnew(csName)); } OPENOBJ_END(); } for(int j=0;jlockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true); UpdateData(TRUE); GetRightDims(); m_nSearch = m_ssRight.Length(); for (long l = 0l; l < m_ssRight.Length(); l++) { bool bIsInstead = false; Entity ent = m_ssRight[l]; OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbVPipeDim, pDim); if(pDim) { if (!m_sNum2.IsEmpty()) { AcDbObjectId id = pDim->GetVPipeId(); CString sNum; pDim->GetDimVPipeNum(sNum); if (sNum.Compare(m_sNum2) != 0) { pDim->SetDimVPipeNum(m_sNum2, id); bIsInstead = true; } } if (!m_sFloor2.IsEmpty()) { CString sFloor; pDim->GetVPipeFloorNum(sFloor); if (sFloor.Compare(m_sFloor2) != 0) { pDim->SetVPipeFloorNum(m_sFloor2); bIsInstead = true; } } if (!m_sBefore2.IsEmpty()) { CString sHead; pDim->GetDimTypeText(sHead); if (sHead.Compare(m_sBefore2) != 0) { pDim->SetDimTypeText(m_sBefore2); bIsInstead = true; } } if (bIsInstead) { m_nInstead++; } pDim->RenewDimLen(); pDim->Close(); } OPENOBJ_END(); } m_ssRight.Free(); AddNot(); acDocManager->unlockDocument(curDoc()); acedGetAcadDwgView()->SetFocus(); SetBtnStyle(); m_bFirstSearch = true; } void CFindAndInsteadVPipeDimDlg::OnBtnInstead() { acDocManager->lockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true); UpdateData(TRUE); AcDbObjectId id; acdbGetObjectId(id, m_ent); AcDbEntity *pEnt = NULL; Acad::ErrorStatus st = acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite); if (pEnt == NULL) { return; } TDbVPipeDim *pDim = NULL; bool bIsInstead = false; if (pEnt->isKindOf(TDbVPipeDim::desc())) { pDim = (TDbVPipeDim *)pEnt; if (!m_sNum2.IsEmpty()) { AcDbObjectId id = pDim->GetVPipeId(); CString sNum; pDim->GetDimVPipeNum(sNum); if (sNum.Compare(m_sNum2) != 0) { pDim->SetDimVPipeNum(m_sNum2, id); bIsInstead = true; } } if (!m_sFloor2.IsEmpty()) { CString sFloor; pDim->GetVPipeFloorNum(sFloor); if (sFloor.Compare(m_sFloor2) != 0) { pDim->SetVPipeFloorNum(m_sFloor2); bIsInstead = true; } } if (!m_sBefore2.IsEmpty()) { CString sHead; pDim->GetDimTypeText(sHead); if (sHead.Compare(m_sBefore2) != 0) { pDim->SetDimTypeText(m_sBefore2); bIsInstead = true; } } pDim->RenewDimLen(); pDim->Close(); } acDocManager->unlockDocument(curDoc()); acedGetAcadDwgView()->SetFocus(); if (bIsInstead) { m_nInstead++; } if (m_ssRight.Length() < 1) { AddNot(); GetRightDims(); } SetBtnStyle(); } void CFindAndInsteadVPipeDimDlg::SetBtnStyle() { CWnd *pWnd = GetDlgItem(IDC_BTN_INSTEAD); if (pWnd == NULL) { return; } if (m_ssRight.Length() > 0) { m_ent = m_ssRight[0l]; m_ssRight -= m_ent; m_nSearch++; SetSelEntBox(); SetDlgItemText(IDC_BTN_FIND, _T("查找下一个")); pWnd->EnableWindow(TRUE); } else { SetDlgItemText(IDC_BTN_FIND, _T("查找")); pWnd->EnableWindow(FALSE); Entity ent; m_ent = ent; } } void CFindAndInsteadVPipeDimDlg::AddNot() { CString sSearch, sInstead; sSearch.Format(_T("\n共找见%d个"), m_nSearch); sInstead.Format(_T("\n共替换%d个"), m_nInstead); CString sNot = _T("\n搜索完成:"); sNot += sSearch; sNot += sInstead; AfxMessageBox(sNot, MB_OK); m_nInstead = 0; m_nSearch = 0; } // 获取符合条件的编号 void CFindAndInsteadVPipeDimDlg::GetRightDims() { UpdateData(TRUE); if (m_ss.Length() < 1) { InitPickSet(); } for(long i = 0; i < m_ss.Length(); i++) { Entity ent = m_ss[i]; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbVPipeDim, pDim); if(pDim) { CString csHead, csSerial, csFloor; pDim->GetDimTypeText(csHead); pDim->GetVPipeFloorNum(csFloor); pDim->GetDimVPipeNum(csSerial); CString sFloorNum = m_sFloor1, sHeadNum = m_sBefore1, sNumber = m_sNum1; if (!(((!sHeadNum.IsEmpty() && csHead.Compare(sHeadNum) != 0)) || ((!sFloorNum.IsEmpty() && csFloor.Compare(sFloorNum) != 0)) || ((!sNumber.IsEmpty() && csSerial.Compare(sNumber) != 0) )) && !(sHeadNum.IsEmpty() && sFloorNum.IsEmpty() && sNumber.IsEmpty())) { m_ssRight += ent; } } OPENOBJ_END(); } } void CFindAndInsteadVPipeDimDlg::OnBtnFindNext() { UpdateData(TRUE); if (m_ssRight.Length() < 1) { if (m_bFirstSearch) { GetRightDims(); m_bFirstSearch = false; } else { AddNot(); GetRightDims(); return; } } UpdateData(FALSE); acedGetAcadDwgView()->SetFocus(); if (m_ssRight.Length() < 1) { AddNot(); } SetBtnStyle(); } void CFindAndInsteadVPipeDimDlg::SetSelEntBox()// 编号外包框 { AcDbObjectId id; acdbGetObjectId(id, m_ent); AcDbEntity *pEnt = NULL; acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead); if (pEnt == NULL) { return; } TDbVPipeDim *pDim = NULL; if (pEnt->isKindOf(TDbVPipeDim::desc())) { pDim = (TDbVPipeDim *)pEnt; } AcDbVoidPtrArray entArry; pEnt->explode(entArry); pEnt->close(); TDbText *pText = NULL; AcDbCircle *pCir = NULL; AcDbExtents ext; double dAngle = 0.0; AcDbEntity *pEntOther = NULL; for (int j = 0; j < entArry.length(); j++) { pEntOther = NULL; pEntOther = (AcDbEntity *)entArry[j]; if (pEntOther == NULL) { continue; } if (pEntOther->isKindOf(TDbText::desc())) { pText = (TDbText *)pEntOther; dAngle = pText->GetRotation(); pText->SetRotation(Wcs2Ucs(0.0)); pText->getGeomExtents(ext); break; } else if (pDim->GetDimType() == 1 && pEntOther->isKindOf(AcDbCircle::desc()))// 圆形标注 { pCir = (AcDbCircle *)pEntOther; pCir->getGeomExtents(ext); break; } } AcDbPolyline poly; AcDbPolyline *pPLine = &poly; XPoint ptMax, ptMin; ptMax = ext.maxPoint(); ptMin = ext.minPoint(); ptMax[2] = 0; ptMin[2] = 0; XPoint ptMaxLeft(ptMin[0], ptMax[1], 0); XPoint ptMinRight(ptMax[0], ptMin[1], 0); arxZoomTo(ptMin, 100*DocGetPScale(), 100*DocGetPScale()); pPLine->addVertexAt(0, ptMin); pPLine->addVertexAt(1, ptMinRight); pPLine->addVertexAt(2, ptMax); pPLine->addVertexAt(3, ptMaxLeft); pPLine->setClosed(Adesk::kTrue); if (pText != NULL) { AcGeMatrix3d mat; mat.setToRotation(dAngle - Wcs2Ucs(0.0), AcGeVector3d::kZAxis, pText->GetLocation()); poly.transformBy(mat); } ReleaseEntSet(entArry); AcGePoint3d pt1, pt2, pt3, pt4; poly.getPointAt(0, pt1); poly.getPointAt(1, pt2); poly.getPointAt(2, pt3); poly.getPointAt(3, pt4); XPoint pt11 = Wcs2Ucs(pt1), pt12 = Wcs2Ucs(pt2), pt13 = Wcs2Ucs(pt3), pt14 = Wcs2Ucs(pt4); ads_grdraw(pt11, pt12, 1, 0); ads_grdraw(pt12, pt13, 1, 0); ads_grdraw(pt13, pt14, 1, 0); ads_grdraw(pt11, pt14, 1, 0); } void CFindAndInsteadVPipeDimDlg::OnSelchangeComboFindStyle() { UpdateData(TRUE); if (m_nStyle == 1) { ShowWindow(SW_HIDE); if (!GetPickSetByCustom()) { m_nStyle = 0; } UpdateData(FALSE); } else { ShowWindow(SW_SHOW); InitPickSet(); } } bool CFindAndInsteadVPipeDimDlg::GetPickSetByCustom() { m_ss.Free(); m_ssRight.Free(); UpdateData(TRUE); RBList rbMask(RTDXF0, _T("ATS_VPIPEDIM"), NULL); if (SelectEntities(_T("\n请选择范围<退出>:"), m_ss, rbMask) != RTNORM) { ShowWindow(SW_SHOW); return false; } ShowWindow(SW_SHOW); return true; } void CFindAndInsteadVPipeDimDlg::OnBtnSearch() { ShowWindow(SW_HIDE); if (!GetPickSetByCustom()) { m_nStyle = 0; } else { m_nStyle = 1; } UpdateData(FALSE); } LONG_PTR CFindAndInsteadVPipeDimDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR) { return TRUE; } void CFindAndInsteadVPipeDimDlg::OnClose() { CModelessDialog::OnClose(); DestroyWindow(); delete this; m_bCreatedDlg = false; acedPostCommand(_T("\33\33")); } void CFindAndInsteadVPipeDimDlg::OnChangeEditNum1() { m_ssRight.Free(); m_bFirstSearch = true; m_nInstead = 0; m_nSearch = 0; } void CFindAndInsteadVPipeDimDlg::OnChangeEditFloor1() { m_ssRight.Free(); m_bFirstSearch = true; m_nInstead = 0; m_nSearch = 0; } void CFindAndInsteadVPipeDimDlg::OnChangeEditBefore1() { m_ssRight.Free(); m_bFirstSearch = true; m_nInstead = 0; m_nSearch = 0; } void CFindAndInsteadVPipeDimDlg::ClearData() { m_ss.Free(); m_ssRight.Free(); Entity ent; m_ent = ent; } bool CFindAndInsteadVPipeDimDlg::IsCreatedDlg() { return m_bCreatedDlg; } void CFindAndInsteadVPipeDimDlg::OnCancel() { CModelessDialog::OnCancel(); OnClose(); } BOOL CFindAndInsteadVPipeDimDlg::PreTranslateMessage(MSG* pMsg) { switch(pMsg->message) { case WM_MOUSEMOVE: m_wndToolTip.RelayEvent(pMsg); } return CModelessDialog::PreTranslateMessage(pMsg); }