436 lines
9.8 KiB
C++
436 lines
9.8 KiB
C++
// 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<CString> 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<CString> vt;
|
|
for (int i=0; i<listBox.GetCount(); i++)
|
|
{
|
|
if (listBox.GetCheck(i))
|
|
{
|
|
CString str;
|
|
listBox.GetText(i, str);
|
|
vt.push_back(str);
|
|
}
|
|
}
|
|
pDbMgr->SetCompareLayer(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<iCount; i++)
|
|
{
|
|
listBox.SetCheck(i, bCheck);
|
|
}
|
|
}
|
|
|
|
void CDwgCompareDlg::OnBnClickedCheckAlllayer1()
|
|
{
|
|
UpdateData(TRUE);
|
|
CheckAllListItem(m_listLayer1, m_bAllLayer1);
|
|
}
|
|
|
|
void CDwgCompareDlg::OnBnClickedCheckAlllayer2()
|
|
{
|
|
UpdateData(TRUE);
|
|
CheckAllListItem(m_listLayer2, m_bAllLayer2);
|
|
}
|
|
|
|
BOOL CDwgCompareDlg::CalcRowAndCol(int iEntCount)
|
|
{
|
|
//假设实体是均匀分布,炸开之前
|
|
if (iEntCount <= 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (iEntCount < MAX_ENTCOUNT_ASONEAREA)//不分区
|
|
{
|
|
m_iRowCount = m_iColumnCount = 1;
|
|
return TRUE;
|
|
}
|
|
//使每个区域的实体数不多于MAX_ENTCOUNT_PERAREA
|
|
double n = iEntCount/MAX_ENTCOUNT_PERAREA; //计算所分区域数
|
|
m_iRowCount = m_iColumnCount = (int)sqrt(n);
|
|
double dCount = m_iRowCount;
|
|
//实体越多,分布可能越不均匀,炸开后实体可能增加比较明显,需要增加区域数
|
|
if (iEntCount>=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;
|
|
}
|