// DwgCompareDlg.cpp : 实现文件 // #include "stdafx.h" #include "DwgCompareDlg.h" // CDwgCompareDlg 对话框 IMPLEMENT_DYNAMIC(CDwgCompareDlg, CDialog) CDwgCompareDlg::CDwgCompareDlg(CWnd* pParent /*=NULL*/) : CDialog(CDwgCompareDlg::IDD, pParent) , m_strFile1(_T("")) , m_strFilePath1(_T("")) , m_strFile2(_T("")) , m_strFilePath2(_T("")) , m_bAllLayer1(TRUE) , m_bAllLayer2(TRUE) , m_iRowCount(800) , m_iColumnCount(800) , m_bCmpBlock(TRUE) , m_bCmpHatch(FALSE) , m_bCmpXref(FALSE) , iHeightDlg(0) , m_bCmpClosedLayer1(TRUE) , m_bCmpFrozenLayer1(TRUE) , m_bCmpLockedlayer1(TRUE) , m_bCmpClosedLayer2(TRUE) , m_bCmpFrozenLayer2(TRUE) , m_bCmpLockedlayer2(TRUE) , m_pDbMgr1(NULL) , m_pDbMgr2(NULL) , m_iType(0) { } CDwgCompareDlg::CDwgCompareDlg( CDwgCompareDbMgr * pMgr1, CDwgCompareDbMgr * pMgr2, int iType, CWnd* pParent /*= NULL*/ ) : CDialog(CDwgCompareDlg::IDD, pParent) , m_bAllLayer1(TRUE) , m_bAllLayer2(TRUE) , m_iRowCount(800) , m_iColumnCount(800) , m_bCmpBlock(TRUE) , m_bCmpHatch(FALSE) , m_bCmpXref(FALSE) , iHeightDlg(0) , m_bCmpClosedLayer1(TRUE) , m_bCmpFrozenLayer1(TRUE) , m_bCmpLockedlayer1(TRUE) , m_bCmpClosedLayer2(TRUE) , m_bCmpFrozenLayer2(TRUE) , m_bCmpLockedlayer2(TRUE) { m_pDbMgr1 = pMgr1; m_pDbMgr2= pMgr2; m_iType = iType; if ((iType==1 || iType==2) && pMgr1!=NULL && pMgr2!=NULL) { m_strFile1 = pMgr1->GetFileName(); m_strFilePath1 = pMgr1->GetFilePath(); m_strFile2 = pMgr2->GetFileName(); m_strFilePath2 = pMgr2->GetFilePath(); } } CDwgCompareDlg::~CDwgCompareDlg() { } void CDwgCompareDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_FILE11, m_strFilePath1); DDX_Text(pDX, IDC_EDIT_FILE22, m_strFilePath2); DDX_Control(pDX, IDC_LIST_LAYER1, m_listLayer1); DDX_Control(pDX, IDC_LIST_LAYER2, m_listLayer2); DDX_Check(pDX, IDC_CHECK_CMPBLOCK, m_bCmpBlock); DDX_Check(pDX, IDC_CHECK_ALLLAYER1, m_bAllLayer1); DDX_Check(pDX, IDC_CHECK_ALLLAYER2, m_bAllLayer2); DDX_Control(pDX, IDC_STATIC_POS, m_staticPos); DDX_Text(pDX, IDC_EDIT_ROWCOUNT, m_iRowCount); DDV_MinMaxDouble(pDX, m_iRowCount, 1, 2000); DDX_Text(pDX, IDC_EDIT_COLUMNCOUNT, m_iColumnCount); DDV_MinMaxDouble(pDX, m_iColumnCount, 1, 2000); DDX_Check(pDX, IDC_CHECK_CMPHATCH, m_bCmpHatch); DDX_Check(pDX, IDC_CHECK_CMPXREF, m_bCmpXref); DDX_Check(pDX, IDC_CHECK_CLOSEDLAYER1, m_bCmpClosedLayer1); DDX_Check(pDX, IDC_CHECK_FROZENLAYER1, m_bCmpFrozenLayer1); DDX_Check(pDX, IDC_CHECK_LOCKEDLAYER1, m_bCmpLockedlayer1); DDX_Check(pDX, IDC_CHECK_CLOSEDLAYER2, m_bCmpClosedLayer2); DDX_Check(pDX, IDC_CHECK_FROZENLAYER2, m_bCmpFrozenLayer2); DDX_Check(pDX, IDC_CHECK_LOCKEDLAYER2, m_bCmpLockedlayer2); } BEGIN_MESSAGE_MAP(CDwgCompareDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON_FILE1, OnBnClickedFile1) ON_BN_CLICKED(IDC_BUTTON_FILE2, OnBnClickedFile2) ON_BN_CLICKED(IDC_BUTTON_ADVANCE, OnBnClickedAdvance) ON_BN_CLICKED(IDOK, OnBnClickedOk) ON_BN_CLICKED(IDC_CHECK_ALLLAYER1, OnBnClickedCheckAlllayer1) ON_BN_CLICKED(IDC_CHECK_ALLLAYER2, OnBnClickedCheckAlllayer2) END_MESSAGE_MAP() BOOL CDwgCompareDlg::OnInitDialog() { CDialog::OnInitDialog(); CRect rect; GetWindowRect(rect); iHeightDlg = rect.Height(); ShowAdvance(FALSE); if (m_iType==1 || m_iType==2) { GetDlgItem(IDC_BUTTON_FILE1)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_FILE2)->EnableWindow(FALSE); //计算分块数,OnBnClickedFile1和OnBnClickedFile2只计算一个 CalcRowAndCol(m_pDbMgr1->InitEntCount()); InitLayerList(m_pDbMgr1, m_listLayer1); InitLayerList(m_pDbMgr2, m_listLayer2); UpdateData(FALSE); CheckAllListItem(m_listLayer1, m_bAllLayer1); CheckAllListItem(m_listLayer2, m_bAllLayer2); if (m_iType==1) { SetWindowText(_T("图纸部分比对")); } } if (m_iType==1) { SetWindowText(_T("图纸部分比对")); } EnableCmpButton(); return TRUE; } // CDwgCompareDlg 消息处理程序 void CDwgCompareDlg::OnBnClickedFile1() { UpdateData(TRUE); CString sName, sPath; if (!SelectFile(sName, sPath)) { return; } if (sPath.CompareNoCase(m_strFilePath1) == 0) { return; } m_strFile1 = sName; m_strFilePath1 = sPath; if (m_strFilePath1.CompareNoCase(m_strFilePath2) == 0) { AfxMessageBox(_T("和文件2相同,请选择其他文件!")); return; } clock_t startTime, finishTime; //计时 double duration; startTime = clock(); BOOL bFileLoadOk = TRUE; if (m_pDbMgr1==NULL || !m_pDbMgr1->LoadFile(m_strFile1, m_strFilePath1)) { bFileLoadOk = FALSE; m_strFile1.Empty(); m_strFilePath1.Empty(); AfxMessageBox(_T("文件加载失败,请检查文件版本和文件是否正确!")); } //计算分块数,OnBnClickedFile1和OnBnClickedFile2只计算一个 CalcRowAndCol(m_pDbMgr1->InitEntCount()); InitLayerList(m_pDbMgr1, m_listLayer1); UpdateData(FALSE); CheckAllListItem(m_listLayer1, m_bAllLayer1); EnableCmpButton(); finishTime = clock(); duration = (double)(finishTime - startTime) / CLOCKS_PER_SEC; m_timeLoadFile1 = 0; if (bFileLoadOk) { m_timeLoadFile1 = duration; acutPrintf(_T("\n文件1加载用时:%lf秒.."), duration); } } void CDwgCompareDlg::OnBnClickedFile2() { UpdateData(TRUE); CString sName, sPath; if (!SelectFile(sName, sPath)) { return; } if (sPath.CompareNoCase(m_strFilePath2) == 0) { return; } m_strFile2 = sName; m_strFilePath2 = sPath; if (m_strFilePath2.CompareNoCase(m_strFilePath1) == 0) { AfxMessageBox(_T("和文件1相同,请选择其他文件!")); return; } clock_t startTime, finishTime; //计时 double duration; startTime = clock(); BOOL bFileLoadOk = TRUE; if (m_pDbMgr2==NULL || !m_pDbMgr2->LoadFile(m_strFile2, m_strFilePath2)) { bFileLoadOk = FALSE; m_strFile2.Empty(); m_strFilePath2.Empty(); AfxMessageBox(_T("文件加载失败,请检查文件版本和文件是否正确!")); } InitLayerList(m_pDbMgr2, m_listLayer2); UpdateData(FALSE); CheckAllListItem(m_listLayer2, m_bAllLayer2); EnableCmpButton(); finishTime = clock(); duration = (double)(finishTime - startTime) / CLOCKS_PER_SEC; m_timeLoadFile2 = 0; if (bFileLoadOk) { m_timeLoadFile2 = duration; acutPrintf(_T("\n文件2加载用时:%lf秒.."), duration); } } BOOL CDwgCompareDlg::SelectFile( CString & strFile, CString & strPath ) { CFileDialog dlg(TRUE, _T("*.dwg"), strFile, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Drawing(*.dwg) |*.dwg||"), this); TCHAR strDlgTitle[] = _T("选择要比对的DWG文件"); dlg.m_ofn.lpstrTitle = strDlgTitle; if(dlg.DoModal()!=IDOK) { return FALSE; } strPath = dlg.GetPathName(); strFile = dlg.GetFileName(); return TRUE; } void CDwgCompareDlg::OnBnClickedAdvance() { CRect rectDlg; GetWindowRect(rectDlg); if (rectDlg.Height()==iHeightDlg) { ShowAdvance(FALSE); } else { ShowAdvance(TRUE); } } void CDwgCompareDlg::ShowAdvance(BOOL bShow) { CRect rect; GetWindowRect(rect); if (bShow) { rect.bottom = rect.top+iHeightDlg; MoveWindow(rect); return; } CRect rectPos; GetDlgItem(IDC_STATIC_POS)->GetWindowRect(rectPos); rect.bottom = rectPos.bottom; MoveWindow(rect); } void CDwgCompareDlg::InitLayerList(CDwgCompareDbMgr * pDbMgr, CCheckListBox & listBox) { if (pDbMgr==NULL) { return; } //清空当前 while(listBox.DeleteString(0) != LB_ERR){} std::vector vt; pDbMgr->GetAllLayer(vt); for (int i=0; i<(int)vt.size(); i++) { if (listBox.FindStringExact(0, vt[i]) == LB_ERR) { listBox.AddString(vt[i]); } } } void CDwgCompareDlg::OnBnClickedOk() { //比对条件 UpdateData(TRUE); m_pDbMgr1->m_bAllLayer = m_bAllLayer1; m_pDbMgr1->m_bCmpClosedLayer = m_bCmpClosedLayer1; m_pDbMgr1->m_bCmpFrozenLayer = m_bCmpFrozenLayer1; m_pDbMgr1->m_bCmpLockedlayer = m_bCmpLockedlayer1; m_pDbMgr2->m_bAllLayer = m_bAllLayer2; m_pDbMgr2->m_bCmpClosedLayer = m_bCmpClosedLayer2; m_pDbMgr2->m_bCmpFrozenLayer = m_bCmpFrozenLayer2; m_pDbMgr2->m_bCmpLockedlayer = m_bCmpLockedlayer2; /*if (!m_bAllLayer1) { SetCompareLayer(m_pDbMgr1, m_listLayer1); } if (!m_bAllLayer2) { SetCompareLayer(m_pDbMgr2, m_listLayer2); }*/ SetCompareLayer(m_pDbMgr1, m_listLayer1); SetCompareLayer(m_pDbMgr2, m_listLayer2); OnOK(); } void CDwgCompareDlg::SetCompareLayer(CDwgCompareDbMgr * pDbMgr, CCheckListBox & listBox) { if (pDbMgr==NULL) { return; } std::vector vt; for (int i=0; iSetCompareLayer(vt); } void CDwgCompareDlg::EnableCmpButton() { if (m_strFilePath1.IsEmpty() || m_strFilePath2.IsEmpty()) { GetDlgItem(IDOK)->EnableWindow(FALSE); return; } GetDlgItem(IDOK)->EnableWindow(TRUE); } BOOL CDwgCompareDlg::SetDbMgr( CDwgCompareDbMgr * pMgr1, CDwgCompareDbMgr * pMgr2 ) { if (pMgr1==NULL || pMgr2==NULL) { return FALSE; } m_pDbMgr1 = pMgr1; m_pDbMgr2 = pMgr2; return TRUE; } void CDwgCompareDlg::CheckAllListItem( CCheckListBox & listBox, BOOL bCheck ) { int iCount = listBox.GetCount(); for (int i=0; i=5000 && iEntCount<10000) { dCount *=1.5; } else if (iEntCount>=10000 && iEntCount<20000) { dCount *=2.0; } else if (iEntCount>=20000 && iEntCount<30000) { dCount *=2.8; } else if (iEntCount>=30000) { dCount *=4.0; } m_iRowCount = m_iColumnCount = (int)dCount; return TRUE; }