Files
envi-code/SourceCode/Code2026/tg_shs/shs_public/DwgCompareDlg.cpp
T
2026-09-28 15:28:50 +08:00

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;
}