Files
envi-code/SourceCode/Code2026/CoreCommand/FSTZDlg.cpp
T
2026-09-28 15:28:50 +08:00

1405 lines
30 KiB
C++

#include "stdafx.h"
#include "StdArx.h"
#include "FSTZDlg.h"
#include "AecDbObjXDataMap.h"
#include "CoreTools.h"
#include "uiiado.h"
#include "NameDlg.h"
#include "LJCSDlg.h"
#include "AecDbEwFitting.h"
#include "AecDbEwPipeBase.h"
#include "AecDbX3dPartEntity.h"
#include "CZHZLDLG.h"
#ifndef ID_OBJLIST
#define ID_OBJLIST 341
#endif
#ifndef WM_ITEM_SEL
#define WM_ITEM_SEL (WM_USER+0x105)
#endif
extern DLLIMPEXP CString IDCreate();
extern BOOL GetLocalIP(CStringArray& arsIP);
IMPLEMENT_DYNAMIC(CFSTZDlg, CDialog)
CFSTZDlg::CFSTZDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFSTZDlg::IDD, pParent)
, m_sRem(_T("提资给结构"))
, m_sSendTo(_T("何工"))
, m_sProName(_T("结构"))
, m_sNameFr(_T("李工"))
, m_sProNameFr(_T("工艺给排水"))
, m_sMeIP(_T(""))
{
memset(m_nField,0,sizeof(BYTE)*4);
m_nField[0] = 192;
m_nField[1] = 168;
m_nField[2] = 1;
m_nField[3] = 99;
m_pMySQLDb = NULL;
//UIDataCache::Read(_T("%s%s%s%i%i%i%i"), _T("CFSTZDlg")
// , &m_sProName , &m_sSendTo , &m_sRem
// , &m_nField[0],&m_nField[1],&m_nField[2],&m_nField[3]);
}
CFSTZDlg::~CFSTZDlg()
{
//UIDataCache::Write(_T("%s%s%s%i%i%i%i"), _T("CFSTZDlg")
// , &m_sProName , &m_sSendTo , &m_sRem
// , &m_nField[0],&m_nField[1],&m_nField[2],&m_nField[3]);
if (m_pMySQLDb != NULL)
delete m_pMySQLDb;
}
void CFSTZDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST3, m_wndDXFList);
DDX_Text(pDX, IDC_EDIT3, m_sRem);
DDX_Control(pDX, IDC_IPADDRESS1, m_wndIPCtrl);
DDX_Text(pDX, IDC_EDIT1, m_sSendTo);
DDX_CBString(pDX, IDC_COMBO1, m_sProName);
DDX_Control(pDX, IDC_STATIC_OBJLST, m_wndObjFrm);
DDX_Text(pDX, IDC_EDIT2, m_sNameFr);
DDX_CBString(pDX, IDC_COMBO2, m_sProNameFr);
DDX_Control(pDX, IDC_COMBO1, m_wndProCombox);
DDX_Control(pDX, IDC_COMBO3, m_wndThisIpCombox);
DDX_CBString(pDX, IDC_COMBO3, m_sMeIP);
}
BEGIN_MESSAGE_MAP(CFSTZDlg, CDialog)
ON_BN_CLICKED(IDOK, &CFSTZDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON2, &CFSTZDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON5, &CFSTZDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON6, &CFSTZDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON3, &CFSTZDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CFSTZDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON8, &CFSTZDlg::OnBnClickedButton8)
ON_MESSAGE(WM_ITEM_SEL,&CFSTZDlg::OnItemSelected)
ON_MESSAGE( WM_ACAD_KEEPFOCUS, &CFSTZDlg::onAcadKeepFocus )
ON_BN_CLICKED(IDCANCEL, &CFSTZDlg::OnBnClickedCancel)
ON_WM_DESTROY()
ON_CBN_SELCHANGE(IDC_COMBO1, &CFSTZDlg::OnCbnSelchangeCombo1)
ON_CBN_SELCHANGE(IDC_COMBO2, &CFSTZDlg::OnCbnSelchangeCombo2)
ON_BN_CLICKED(IDC_BUTTON1, &CFSTZDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON13, &CFSTZDlg::OnBnClickedButton13)
END_MESSAGE_MAP()
LONG_PTR CFSTZDlg::onAcadKeepFocus( UINT_PTR, LONG_PTR)
{
POINT pt;
::GetCursorPos(&pt);
CRect rect;
GetWindowRect(&rect);
if(!(rect.PtInRect(pt)))
{
return FALSE;
}
return TRUE;
}
BOOL CFSTZDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmp;
if (!bmp.LoadBitmap (IDB_BITMAPPRIV))
{
AfxMessageBox(_T("Can't load bitmap: %x\n"), IDB_BITMAPPRIV);
ASSERT (FALSE);
return FALSE;
}
BITMAP bmpObj;
bmp.GetBitmap (&bmpObj);
UINT nFlags = ILC_COLOR24 | ILC_MASK;
m_imageList.Create (16, bmpObj.bmHeight, nFlags, 0, 0);
m_imageList.Add (&bmp, RGB (255, 0, 0));
m_wndDXFList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SINGLEROW);
m_wndDXFList.InsertColumn(0,_T("名称"),LVCFMT_LEFT,120);
m_wndDXFList.InsertColumn(1,_T("DXF"),LVCFMT_LEFT,160);
m_wndDXFList.SetImageList(&m_imageList,LVSIL_SMALL);
CRect rcFrameL;
m_wndObjFrm.GetWindowRect(rcFrameL);
ScreenToClient(rcFrameL);
m_wndObjFrm.ShowWindow(SW_HIDE);
m_wndObjList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP,CRect(0,0,0,0),this,ID_OBJLIST);
m_wndObjList.SetImageList(&m_imageList, LVSIL_SMALL);
m_wndObjList.SetImageSize(16,16);
m_wndObjList.SetDragStyle(FALSE);
m_wndObjList.SetEditStyle(FALSE);
m_wndObjList.SetExtendedStyle(0);
m_wndObjList.ModifyStyleEx(0,WS_EX_CLIENTEDGE);
m_wndObjList.SetExtendedStyle(LVS_EX_GRIDLINES);
if(m_wndObjList.GetSafeHwnd() != NULL)
{
m_wndObjList.MoveWindow(rcFrameL);
}
m_wndIPCtrl.SetAddress(m_nField[0],m_nField[1],m_nField[2],m_nField[3]);
InitObjListColumn();
InitMeIPCombox();
if ( !InitADOServer() )
{
return FALSE;
}
LoadLocalData();
if (m_wndDXFList.GetItemCount() == 0)
{
ShowDXFList();
}
UpdateData(FALSE);
return TRUE;
}
void CFSTZDlg::SaveLocalData()
{
CString sFileName;
sFileName.Format(_T("\\CFSTZDlg_%s.dat"),m_sProName);
CString sLocalFile = FilePath::GetSysDir() + sFileName;
CString sLn;
CStdioFile file;
if (file.Open(sLocalFile,CFile::modeCreate | CFile::modeWrite | CFile::typeText))
{
CString sLine;
file.WriteString(m_sRem);
file.WriteString(_T("\n"));
file.WriteString(m_sSendTo);
file.WriteString(_T("\n"));
file.WriteString(m_sProName);
file.WriteString(_T("\n"));
file.WriteString(m_sNameFr);
file.WriteString(_T("\n"));
file.WriteString(m_sProNameFr);
file.WriteString(_T("\n"));
//IPTo
for (int i = 0;i < 4;i++)
{
sLn.Format(_T("%d\n"),m_nField[i]);
file.WriteString(sLn);
}
file.Close();
}
//m_wndDXFList.InsertItem(0,_T("墙体"),1);
//m_wndDXFList.SetItemText(0,1,_T("AEC_DBWALL"));
CString sName,sDxf;
sFileName.Format(_T("\\CFSTZDlg_%s.lst"),m_sProName);
sLocalFile = FilePath::GetSysDir() + sFileName;
CStdioFile file2;
if (file2.Open(sLocalFile,CFile::modeCreate | CFile::modeWrite | CFile::typeText))
{
for (int i = 0;i < m_wndDXFList.GetItemCount();i++)
{
sName = m_wndDXFList.GetItemText(i,0);
sDxf = m_wndDXFList.GetItemText(i,1);
sLn.Format(_T("%s@%s\n"),sName,sDxf);
file2.WriteString(sLn);
}
file2.Close();
}
}
BOOL CFSTZDlg::LoadLocalData()
{
CString sFileName;
sFileName.Format(_T("\\CFSTZDlg_%s.dat"),m_sProName);
CString sLocalFile = FilePath::GetSysDir() + sFileName;
CString sLn,sTmp;
CStdioFile file;
if (file.Open(sLocalFile,CFile::modeRead | CFile::typeText))
{
file.ReadString(m_sRem);
m_sRem.TrimRight(_T('\n'));
file.ReadString(m_sSendTo);
m_sSendTo.TrimRight(_T('\n'));
file.ReadString(m_sProName);
m_sProName.TrimRight(_T('\n'));
file.ReadString(m_sNameFr);
m_sNameFr.TrimRight(_T('\n'));
file.ReadString(m_sProNameFr);
m_sProNameFr.TrimRight(_T('\n'));
for (int i = 0;i < 4;i++)
{
file.ReadString(sLn);
sLn.TrimRight(_T('\n'));
m_nField[i] = _ttoi(sLn);
}
m_wndIPCtrl.SetAddress(m_nField[0],m_nField[1],m_nField[2],m_nField[3]);
file.Close();
}
m_wndDXFList.DeleteAllItems();
CString sName,sDxf;
sFileName.Format(_T("\\CFSTZDlg_%s.lst"),m_sProName);
sLocalFile = FilePath::GetSysDir() + sFileName;
CStdioFile file2;
if (file2.Open(sLocalFile,CFile::modeRead | CFile::typeText))
{
int nPos = -1,nItem = -1;
while(file2.ReadString(sLn))
{
sLn.TrimRight(_T('\n'));
nPos = sLn.ReverseFind(_T('@'));
if (nPos != -1)
{
sName = sLn.Mid(0,nPos);
sDxf = sLn.Mid(nPos+1);
nItem = m_wndDXFList.InsertItem(m_wndDXFList.GetItemCount(),sName);
m_wndDXFList.SetItemText(nItem,1,sDxf);
}
}
file2.Close();
}
return TRUE;
}
BOOL CFSTZDlg::InitADOServer()
{
m_pMySQLDb = CLJCSDlg::GetSHEarthWormConnect();
return (m_pMySQLDb != NULL) ? TRUE : FALSE;
}
void CFSTZDlg::InitObjListColumn()
{
LPCTSTR lpszCols[] = {_T("名称"),_T("编号"),_T("句柄"),0};
int lnColumns[] = {140,140,0,0};
LV_COLUMN lvColumn;
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 120;
for(int i = 0; lpszCols[i]!=NULL; i++)
{
lvColumn.cx = lnColumns[i];
lvColumn.pszText = const_cast<LPTSTR>(lpszCols[i]);
m_wndObjList.InsertColumn(i,&lvColumn);
}
CList<int,int> listReadOnly;
listReadOnly.AddHead(0);
listReadOnly.AddHead(1);
listReadOnly.AddHead(2);
m_wndObjList.SetReadOnlyList(listReadOnly);
}
void CFSTZDlg::InitMeIPCombox()
{
CStringArray arIps;
GetLocalIP(arIps);
for (int i = 0;i < arIps.GetSize();i++)
{
m_wndThisIpCombox.AddString(arIps.GetAt(i));
}
if (arIps.GetSize() > 0)
{
m_wndThisIpCombox.SetCurSel(0);
m_sMeIP = arIps.GetAt(0);
}
}
void CFSTZDlg::OnBnClickedOk()
{
UpdateData();
if ( SendCobInfPackage() )
{
OnBnClickedButton6();
AfxMessageBox(_T("成功发送提资!"));
SaveLocalData();
EndDialog(IDOK);
}
}
void CFSTZDlg::ShowDXFList()
{
//例
m_wndDXFList.InsertItem(0,_T("墙体"),1);
m_wndDXFList.SetItemText(0,1,_T("AEC_DBWALL"));
m_wndDXFList.InsertItem(1,_T("板"),1);
m_wndDXFList.SetItemText(1,1,_T("AEC_DBSLAB"));
m_wndDXFList.InsertItem(2,_T("柱"),1);
m_wndDXFList.SetItemText(2,1,_T("AEC_DBCOLMN"));
m_wndDXFList.InsertItem(3,_T("梁"),1);
m_wndDXFList.SetItemText(3,1,_T("AEC_DBBEAM"));
m_wndDXFList.InsertItem(4,_T("洞口"),1);
m_wndDXFList.SetItemText(4,1,_T("AEC_X3DPART"));
m_wndDXFList.InsertItem(5,_T("套管"),1);
m_wndDXFList.SetItemText(5,1,_T("AEC_X3DPART"));
m_wndDXFList.InsertItem(6,_T("基础"),1);
m_wndDXFList.SetItemText(6,1,_T("AEC_X3DPART"));
}
//先检测是否有编号重复,或无编号设置,只限于AEC 实体
bool CFSTZDlg::CheckSnoValid(ads_name ss,Adesk::Int32 nLen)
{
ads_name ent;
AcDbObjectId id;
AcDbEntity* pEnt = NULL;
bool bRes = true;
CString sNo,sTip,sClass;
CStringList lstNos;
for(int ii = 0;ii < nLen;ii++)
{
acedSSName(ss,ii,ent);
acdbGetObjectId(id,ent);
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
sNo = _T("");
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
sNo = _T("");
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
if (sNo.IsEmpty())
{
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEntBase);
if (pFit != NULL)
{
sNo = pFit->GetGUID();
}
}
}
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
if (pCurBase != NULL)
{
sNo = _T("");
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
if (sNo.IsEmpty())
{
AecDbEwPipeBase* pPipe = AecDbEwPipeBase::cast(pCurBase);
if (pPipe != NULL)
{
sNo = pPipe->GetGUID();
}
}
}
sClass = pEnt->isA()->name();
pEnt->close();
if (!sNo.IsEmpty())
{
if (lstNos.Find(sNo) != NULL)
{
//acutPrintf(_T("\n%s:%s"),sNo,sClass);
sTip = _T("\n发现有编号重复的构件!不可以发送提资!\n构件协同是按编号管理构件数据包!\n如果发送提资,请先执行编号唯一!");
AfxMessageBox(sTip);
bRes = false;
break;
}
else
{
lstNos.AddTail(sNo);
}
}
}
}
return bRes;
}
//提取构件
void CFSTZDlg::OnBnClickedButton2()
{
//fe _T("AEC_EWFIT,AEC_XXXDOGHS")
CString sText,sClasDxf = _T("");
for (int i = 0;i < m_wndDXFList.GetItemCount();i++)
{
sText = m_wndDXFList.GetItemText(i,1);
sClasDxf += sText;
sClasDxf += _T(",");
}
sClasDxf.TrimRight(_T(','));
ShowWindow(SW_MINIMIZE);
AcAxDocLock lock;
struct resbuf* pRb = acutBuildList(RTDXF0, sClasDxf, 0);
ads_name ss,ent;
//LPCTSTR pszMsg[] = {_T("\n请选择要提提资的构件:"), _T("")};
int nRes = acedSSGet(NULL,NULL,NULL,pRb,ss);
acutRelRb(pRb);
if (nRes == RTNORM)
{
Adesk::Int32 nLen = 0;
acedSSLength(ss,&nLen);
//先检测是否有编号重复,或无编号设置,只限于AEC 实体
if (!CheckSnoValid(ss, nLen))
{
acedSSFree(ss);
ShowWindow(SW_NORMAL);
return;
}
//清空列表
OnBnClickedButton6();
CTreeItem * pRoot = NULL;
if (nLen > 0)
{
CItemInfo* lpRoot = new CItemInfo();
lpRoot->SetImage(4);
lpRoot->SetItemText(_T("提资构件"));
lpRoot->AddSubItemText("");
lpRoot->AddSubItemText("");
pRoot = m_wndObjList.InsertRootItem(lpRoot);
m_mapNameToRoot.SetAt(_T("提资构件"),pRoot);
}
AcDbObjectId id;
AcDbEntity* pEnt = NULL;
LPCTSTR pszDXF = NULL;
TCHAR szHanele[33];
CString sNo,sEntName;
memset(szHanele,0,sizeof(TCHAR) * 33);
for (int i = 0;i < nLen;i++)
{
acedSSName(ss,i,ent);
acdbGetObjectId(id,ent);
sEntName = _T("");
sNo = _T("");
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
pszDXF = pEnt->isA()->dxfName();
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
if (sNo.IsEmpty())
{
AecDbEwFitting* pFit = AecDbEwFitting::cast(pEntBase);
if (pFit != NULL)
{
sNo = pFit->GetGUID();
}
}
}
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
if (pCurBase != NULL)
{
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
if (sNo.IsEmpty())
{
AecDbEwPipeBase* pPipe = AecDbEwPipeBase::cast(pCurBase);
if (pPipe != NULL)
{
sNo = pPipe->GetGUID();
}
}
}
AecDbX3dPartEntity* pPart = AecDbX3dPartEntity::cast(pEnt);
if (pPart != NULL)
{
sEntName = pPart->GetName();
}
id.handle().getIntoAsciiBuffer(szHanele);
if (sNo.IsEmpty()) sNo = szHanele;
AddObjectList(pszDXF,sNo,szHanele,sEntName);
pEnt->close();
}
}
int nScroll = 0;
m_wndObjList.ExpandAll(pRoot,nScroll);
}
acedSSFree(ss);
ShowWindow(SW_NORMAL);
}
void CFSTZDlg::AddObjectList(LPCTSTR pszDXF,LPCTSTR pszNo,LPCTSTR pszHanele,LPCTSTR pszEntName)
{
CTreeItem * pRoot = NULL;
if ( !m_mapNameToRoot.Lookup(_T("提资构件"),(void*&)pRoot) )
{
return;
}
CString sDxf,sName = _T("");
for (int i = 0;i < m_wndDXFList.GetItemCount();i++)
{
sDxf = m_wndDXFList.GetItemText(i,1);
if (sDxf.CompareNoCase(pszDXF) == 0)
{
sName = m_wndDXFList.GetItemText(i,0);
if (pszEntName != NULL && _tcslen(pszEntName) > 0)
{
sName = pszEntName;
}
break;
}
}
if (sName.IsEmpty())
sName = pszDXF;
if (!sName.IsEmpty()) //找到
{
BOOL bFind = false;
CItemInfo* lpItem = NULL;
CItemInfo* lpParent= NULL;
CTreeItem * pParent = NULL;
//墙体目录
bFind = m_mapNameToRoot.Lookup(sName,(void*&)pParent);
if (!bFind)
{
lpParent = new CItemInfo();
lpParent->SetItemText(sName);
lpParent->SetImage(1);
lpParent->AddSubItemText(_T(""));
lpParent->AddSubItemText(_T(""));
pParent = m_wndObjList.InsertItem(pRoot,lpParent);
m_mapNameToRoot.SetAt(sName,pParent);
}
//墙体实体
if (pParent != NULL )
{
lpItem = new CItemInfo();
lpItem->SetItemText(sName);
lpItem->AddSubItemText(pszNo);
lpItem->AddSubItemText(pszHanele);
lpItem->SetImage(2);
m_wndObjList.InsertItem(pParent,lpItem);
}
}
}
//移除构件
void CFSTZDlg::OnBnClickedButton5()
{
AcAxDocLock lock;
AcDbObjectId id;
CString sHandle;
int nSel = m_wndObjList.GetSelectedItem();
if (nSel != -1)
{
CTreeItem* pItem = m_wndObjList.GetTreeItem(nSel);
if (pItem != NULL)
{
CItemInfo* pInf = m_wndObjList.GetData(pItem);
if (pInf != NULL)
{
sHandle = pInf->GetSubItem(1);
if (sHandle.IsEmpty())
{
AfxMessageBox(_T("当前选择不是构件对象!移除失败!"));
return;
}
AcDbHandle hd((const TCHAR*)sHandle);
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
{
m_wndObjList.DeleteItemEx(pItem,nSel);
}
}
}
}
}
//清空列表
void CFSTZDlg::OnBnClickedButton6()
{
m_wndObjList.DeleteAll();
m_mapNameToRoot.RemoveAll();
m_arLastPick.removeAll();
}
//添加类型
void CFSTZDlg::OnBnClickedButton3()
{
ShowWindow(SW_HIDE);
AcAxDocLock lock;
CString sDxf = _T(""),sName;
//选择实体
ads_name ent;
ads_point pt;
int nRes = acedEntSel(_T("\n请选择实体:"),ent,pt);
if (nRes == RTNORM)
{
AcDbObjectId id;
acdbGetObjectId(id,ent);
AcDbEntity* pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
sDxf = pEnt->isA()->dxfName();
pEnt->close();
}
}
if (!sDxf.IsEmpty())
{
CString sClasDxf = _T("");
for (int i = 0;i < m_wndDXFList.GetItemCount();i++)
{
sClasDxf = m_wndDXFList.GetItemText(i,1);
if (sClasDxf.CompareNoCase(sDxf) == 0)
{
AfxMessageBox(_T("选择的实体类型已经在列表中!"));
ShowWindow(SW_SHOW);
return;
}
}
CAcModuleResourceOverride resOverride;
CNameDlg dlg;
if (IDOK == dlg.DoModal() )
{
sName = dlg.m_sName;
int nitem = m_wndDXFList.InsertItem(m_wndDXFList.GetItemCount(),sName);
m_wndDXFList.SetItemText(nitem,1,sDxf);
}
}
SaveDxfList();
ShowWindow(SW_SHOW);
}
void CFSTZDlg::SaveDxfList()
{
CString sName,sDxf,sFileName,sLn,sLocalFile;
sFileName.Format(_T("\\CFSTZDlg_%s.lst"),m_sProName);
sLocalFile = FilePath::GetSysDir() + sFileName;
CStdioFile file2;
if (file2.Open(sLocalFile,CFile::modeCreate | CFile::modeWrite | CFile::typeText))
{
for (int i = 0;i < m_wndDXFList.GetItemCount();i++)
{
sName = m_wndDXFList.GetItemText(i,0);
sDxf = m_wndDXFList.GetItemText(i,1);
sLn.Format(_T("%s@%s\n"),sName,sDxf);
file2.WriteString(sLn);
}
file2.Close();
}
}
//移除类型
void CFSTZDlg::OnBnClickedButton4()
{
POSITION ps = m_wndDXFList.GetFirstSelectedItemPosition();
if (ps != NULL)
{
int nItem = m_wndDXFList.GetNextSelectedItem(ps);
if (nItem != -1)
{
m_wndDXFList.DeleteItem(nItem);
}
}
}
//例外添加
void CFSTZDlg::OnBnClickedButton8()
{
ShowWindow(SW_MINIMIZE);
AcAxDocLock lock;
CString sDxf = _T(""),sName,sNo = _T(""),sHandle,sEntName;
//选择实体
ads_name ent;
ads_point pt;
int nRes = acedEntSel(_T("\n请选择实体:"),ent,pt);
if (nRes == RTNORM)
{
AcDbObjectId id;
acdbGetObjectId(id,ent);
sEntName = _T("");
AcDbEntity* pEnt = NULL;
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
sDxf = pEnt->isA()->dxfName();
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
}
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
if (pCurBase != NULL)
{
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
}
AecDbX3dPartEntity* pPart = AecDbX3dPartEntity::cast(pEnt);
if (pPart != NULL)
{
sEntName = pPart->GetName();
}
TCHAR szHanele[17];
id.handle().getIntoAsciiBuffer(szHanele);
sHandle = szHanele;
pEnt->close();
}
}
BOOL bFind = FALSE;
if (!sDxf.IsEmpty())
{
CString sClasDxf = _T("");
for (int i = 0;i < m_wndDXFList.GetItemCount();i++)
{
sClasDxf = m_wndDXFList.GetItemText(i,1);
if (sClasDxf.CompareNoCase(sDxf) == 0)
{
bFind = TRUE;
}
}
if (!bFind)
{
CAcModuleResourceOverride resOverride;
CNameDlg dlg;
if (IDOK == dlg.DoModal() )
{
sName = dlg.m_sName;
int nitem = m_wndDXFList.InsertItem(m_wndDXFList.GetItemCount(),sName);
m_wndDXFList.SetItemText(nitem,1,sDxf);
}
else
{
ShowWindow(SW_NORMAL);
return;
}
}
//
if (sNo.IsEmpty())
{
AfxMessageBox(_T("选择的实体没有编号!不是基础构件!"));
ShowWindow(SW_SHOW);
return;
}
CTreeItem * pRoot = NULL;
m_mapNameToRoot.Lookup(_T("提资构件"),(void*&)pRoot);
m_wndObjList.SelectNode(pRoot);
int nScroll = 0;
m_wndObjList.Collapse(pRoot);
AddObjectList(sDxf,sNo,sHandle,sEntName);
m_wndObjList.ExpandAll(pRoot,nScroll);
}
ShowWindow(SW_NORMAL);
}
bool CFSTZDlg::GetChildIds(CTreeItem* pChild,AcDbObjectIdArray& arIds)
{
AcDbObjectId id;
CString sHandle,sName;
POSITION ps = NULL;
int nCount = 0;
ps = m_wndObjList.GetHeadPosition(pChild);
CTreeItem* pEntItem = NULL;
while( ps != NULL)
{
pEntItem = m_wndObjList.GetNextChild(pChild,ps);
//墙体
//{_T("名称"),_T("编号"),_T("句柄"),0};
CItemInfo* pInf = m_wndObjList.GetData(pEntItem);
if (pInf != NULL)
{
sHandle = pInf->GetSubItem(1);
AcDbHandle hd((const TCHAR*)sHandle);
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
{
sName = pInf->GetItemText();
if (sName.CompareNoCase(_T("洞口")) == 0 ||
sName.CompareNoCase(_T("开洞")) == 0 ||
sName.CompareNoCase(_T("套管")) == 0)//
{
//洞口套管wblock随墙体连带处理,不用单独
}
else
{
arIds.append(id);
nCount++;
}
}
}
}
return nCount > 0 ? true : false;
}
bool CFSTZDlg::SendCobInfPackage()
{
AcDbObjectIdArray arIds;
CTreeItem * pRoot = NULL;
m_mapNameToRoot.Lookup(_T("提资构件"),(void*&)pRoot);
if (pRoot == NULL)
return false;
POSITION ps = m_wndObjList.GetHeadPosition(pRoot);
CTreeItem* pChild = NULL;
while( ps != NULL)
{
pChild = m_wndObjList.GetNextChild(pRoot,ps);
//获取墙体目录下的对象
GetChildIds(pChild,arIds);
}
AcAxDocLock lock;
//创建协同Rec
AcDbObjectId idRecCob;
AcDbBlockTableRecord* pRec = NULL;
AcDbBlockTable* pTable = NULL;
if ( Acad::eOk == acdbCurDwg()->getBlockTable(pTable,AcDb::kForWrite) )
{
if (Acad::eOk == pTable->getAt(m_sProName,idRecCob))
{
if ( Acad::eOk == acdbOpenObject((AcDbObject*&)pRec,idRecCob,AcDb::kForRead) )
{
//清空分区
AcDbBlockTableRecordIterator* pIt = NULL;
pRec->newIterator(pIt);
if (pIt != NULL)
{
AcDbEntity* pEnt = NULL;
for (pIt->start();!pIt->done();pIt->step())
{
if ( Acad::eOk == pIt->getEntity(pEnt,AcDb::kForWrite) )
{
pEnt->erase();
pEnt->close();
}
}
delete pIt;
}
pRec->close();
}
}
else
{
pRec = new AcDbBlockTableRecord;
pRec->setName(m_sProName);
pRec->setOrigin(AcGePoint3d::kOrigin);
pTable->add(idRecCob,pRec);
pRec->close();
}
pTable->close();
}
CString sCobDwgFile = _T("");
CString sSysDir = FilePath::GetSysDir();
sSysDir.MakeLower();
sSysDir.Replace(_T("\\sys"),_T("\\temp"));
//写出成功
sSysDir += _T("\\");
sSysDir += m_sProName;
sSysDir += _T(".dwg");
if (idRecCob.isValid())
{
AcDbDatabase* pOutputDb = NULL;
//通过系统变量控制
Adesk::Int16 nVal = acdbCurDwg()->useri4();
acdbCurDwg()->setUseri4(KEY_NOPROTECT);
acdbCurDwg()->forceWblockDatabaseCopy();
if(Acad::eOk == acdbCurDwg()->wblock(pOutputDb,arIds,AcGePoint3d::kOrigin))
{
if ( Acad::eOk == pOutputDb->saveAs(sSysDir,true,AcDb::kDHL_1024) )
{
sCobDwgFile = sSysDir;
delete pOutputDb;
}
else
{
AfxMessageBox(_T("打包协同区失败!"));
delete pOutputDb;
return false;
}
}
/*
AcDbIdMapping pIdMap;
if(Acad::eOk == acdbCurDwg()->wblockCloneObjects(arIds,idRecCob,pIdMap))
{
AcDbDatabase* pCobDb = NULL;
if ( Acad::eOk == acdbCurDwg()->wblock(pCobDb,idRecCob) )
{
if ( Acad::eOk == pCobDb->saveAs(sSysDir,true,AcDb::kDHL_1024) )
{
sCobDwgFile = sSysDir;
}
else
{
AfxMessageBox(_T("打包协同区失败!"));
delete pCobDb;
return false;
}
delete pCobDb;
}
//删除协同区
if ( Acad::eOk == acdbOpenObject((AcDbObject*&)pRec,idRecCob,AcDb::kForWrite) )
{
pRec->erase();
pRec->close();
}
}*/
acdbCurDwg()->setUseri4(nVal);
}
if ( !UploadCobInf(sCobDwgFile) )
{
AfxMessageBox(_T("发送提资失败!请确认数据库是否连接!"));
return false;
}
return true;
}
BOOL CFSTZDlg::UploadCobInf(CString& sCobDwgFile)
{
if (sCobDwgFile.IsEmpty())
return FALSE;
CString sIpTo;
m_wndIPCtrl.GetAddress(m_nField[0],m_nField[1],m_nField[2],m_nField[3]);
sIpTo.Format(_T("%d.%d.%d.%d"),m_nField[0],m_nField[1],m_nField[2],m_nField[3]);
if (m_nField[0] == 0 && m_nField[1] == 0 &&
m_nField[2] == 0 && m_nField[3] == 0)
{
AfxMessageBox(_T("请填写发送地址!"));
return FALSE;
}
CString sIPMe,sGuid,sTime,sSQL;
if (m_sNameFr.IsEmpty())
{
AfxMessageBox(_T("请填写发送方名称!"));
return FALSE;
}
if (m_sProNameFr.IsEmpty())
{
AfxMessageBox(_T("请填写发送方专业!"));
return FALSE;
}
if (m_sSendTo.IsEmpty())
{
AfxMessageBox(_T("请填写接收方地址!"));
return FALSE;
}
if (m_sSendTo.IsEmpty())
{
AfxMessageBox(_T("请填写接收方专业!"));
return FALSE;
}
CTime tCur = CTime::GetCurrentTime();
sTime = tCur.Format(_T("%Y-%m-%d:%H-%M-%S"));
sGuid = IDCreate();
sIPMe = m_sMeIP;
/*acutPrintf(_T("\nNameFr=%s"),m_sNameFr);
acutPrintf(_T("\nProFr=%s"),m_sProNameFr);
acutPrintf(_T("\nIPFr=%s"),sIPMe);
acutPrintf(_T("\nSendTo = %s"),m_sSendTo);
acutPrintf(_T("\nProTo = %s"),m_sProName);
acutPrintf(_T("\nIPTo = %s"),sIpTo);
//类型
acutPrintf(_T("\nMsgType = %s"),_T("提资"));
acutPrintf(_T("\nRem = %s"),m_sRem);
acutPrintf(_T("\nDwgFile = %s"),sCobDwgFile);
acutPrintf(_T("\nGUID = %s"),sGuid);
acutPrintf(_T("\nMsgTime = %s"),sTime);
*/
//上传
BOOL bSuccess = FALSE;
sSQL.Format(_T("insert into AEC_Co_Msg (NameFr,ProFr,IPFr,SendTo,ProTo,IPTo,MsgType,Rem,GUID,pickup,DwgFile) values \
('%s','%s','%s','%s','%s','%s','%s','%s','%s',0,?)"),m_sNameFr,m_sProNameFr,sIPMe,m_sSendTo,m_sProName,
sIpTo,_T("提资"),m_sRem,sGuid);
if ( m_pMySQLDb->InsertBlob(sSQL,sCobDwgFile) > 0)
{
sSQL.Format(_T("update AEC_Co_Msg set DwgFile=? where GUID='%s'"),sGuid);
bSuccess = m_pMySQLDb->UpdateBlob(sSQL,sCobDwgFile);
if (bSuccess == 0)
bSuccess = TRUE;
}
CFileFind find;
if (find.FindFile(sCobDwgFile))
{
//::DeleteFile(sCobDwgFile);
}
return bSuccess;
}
LRESULT CFSTZDlg::OnItemSelected(WPARAM wp,LPARAM lp)
{
CPoint* pptPos = (CPoint*)lp;
int nSel = (int)pptPos->x;
int nSubItem = (int)pptPos->y;
CString sHandle;
CTreeItem* pItem = m_wndObjList.GetTreeItem(nSel);
if (pItem != NULL)
{
CItemInfo* pInf = m_wndObjList.GetData(pItem);
if (pInf != NULL)
{
sHandle = pInf->GetSubItem(1);
if (sHandle.IsEmpty())
{
//AfxMessageBox(_T("当前选择不是构件对象!"));
return 0L;
}
AcAxDocLock lock;
CString sNo,sDxf;
AcDbHandle hd((const TCHAR*)sHandle);
AcDbObjectId id;
if ( Acad::eOk == acdbCurDwg()->getAcDbObjectId(id,false,hd) )
{
//按照编号找到对应的实体,加亮选择
AcDbEntity* pEnt = NULL;
if ( Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
{
sDxf = pEnt->isA()->dxfName();
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
}
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEnt);
if (pCurBase != NULL)
{
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo);
}
pEnt->close();
}
//选择当前
if ( !sNo.IsEmpty() && !sDxf.IsEmpty() )
{
ads_name ss,ent;
struct resbuf* pRb = acutBuildList(RTDXF0, sDxf, 0);
if (pRb != NULL)
{
acedSSGet(_T("A"),NULL,NULL,pRb,ss);
acutRelRb(pRb);
Adesk::Int32 nLen = 0;
acedSSLength(ss,&nLen);
CString sNo2;
AcDbObjectId idT;
AcDbEntity* pEntT = NULL;
BOOL bFind = FALSE;
for (int i = 0;i < nLen;i++)
{
acedSSName(ss,i,ent);
acdbGetObjectId(idT,ent);
if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,idT,AcDb::kForRead))
{
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntT);
if (pEntBase != NULL)
{
pEntBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo2);
}
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntT);
if (pCurBase != NULL)
{
pCurBase->GetSpecialtyData(AcDb::kForRead)->GetAt(KEY_NO,sNo2);
}
pEntT->close();
}
if (sNo2.CompareNoCase(sNo) == 0)
{
bFind = TRUE;
break;
}
}
acedSSFree(ss);
UnColorLightThisPick();
if (bFind)
{
//加入选择集
ads_name ssPick;
acdbGetAdsName(ent, idT);
acedSSAdd(ent, NULL, ssPick);
acedSSSetFirst(ssPick, ssPick);
acedSSFree(ssPick);
m_arLastPick.append(idT);
ColorLightThisPick();
acedUpdateDisplay();
}
}
}
}
}
}
return 0L;
}
void CFSTZDlg::UnColorLightThisPick()
{
AcDbObjectId idT;
AcDbEntity* pEntT = NULL;
for (int i = 0;i < m_arLastPick.length();i++)
{
idT = m_arLastPick.at(i);
if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,idT,AcDb::kForWrite))
{
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntT);
if (pEntBase != NULL)
{
pEntBase->SetActive(false);
}
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntT);
if (pCurBase != NULL)
{
pCurBase->SetActive(false);
}
pEntT->close();
}
}
m_arLastPick.removeAll();
}
void CFSTZDlg::ColorLightThisPick()
{
AcDbObjectId idT;
AcDbEntity* pEntT = NULL;
for (int i = 0;i < m_arLastPick.length();i++)
{
idT = m_arLastPick.at(i);
if ( Acad::eOk == acdbOpenAcDbEntity(pEntT,idT,AcDb::kForWrite))
{
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEntT);
if (pEntBase != NULL)
{
pEntBase->SetActive(true);
}
AecDbCurveBase* pCurBase = AecDbCurveBase::cast(pEntT);
if (pCurBase != NULL)
{
pCurBase->SetActive(true);
}
pEntT->close();
}
}
}
void CFSTZDlg::OnBnClickedCancel()
{
//清空列表
OnBnClickedButton6();
EndDialog(IDOK);
}
BOOL CFSTZDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case IDCLOSE:
return TRUE;
default:
break;
}
return CDialog::OnCommand(wParam, lParam);
}
void CFSTZDlg::OnDestroy()
{
SaveLocalData();
m_wndObjList.DeleteAllItems();
CDialog::OnDestroy();
}
void CFSTZDlg::OnCbnSelchangeCombo1()
{
UpdateData();
LoadDxfFile();
}
void CFSTZDlg::OnCbnSelchangeCombo2()
{
}
void CFSTZDlg::LoadDxfFile()
{
int nPos = -1, nItem = -1;
CString sName, sDxf, sFileName, sLn, sLocalFile;
sFileName.Format(_T("\\CFSTZDlg_%s.lst"), m_sProName);
sLocalFile = FilePath::GetSysDir() + sFileName;
CStdioFile file2;
if (file2.Open(sLocalFile, CFile::modeRead | CFile::typeText))
{
m_wndDXFList.DeleteAllItems();
while (file2.ReadString(sLn))
{
sLn.TrimLeft();
sLn.TrimRight();
nPos = sLn.Find(_T('@'));
if (nPos != -1)
{
sName = sLn.Mid(0, nPos);
sDxf = sLn.Mid(nPos + 1);
nItem = m_wndDXFList.InsertItem(m_wndDXFList.GetItemCount(), sName);
m_wndDXFList.SetItemText(nItem, 1, sDxf);
}
}
file2.Close();
}
}
void CFSTZDlg::OnBnClickedButton1()
{
CAcModuleResourceOverride myResources;
CZHZLDLG dlg;
if (dlg.DoModal() == IDOK)
{
UpdateData();
m_sSendTo = dlg.m_sName;
int nSel = m_wndProCombox.FindString(0,dlg.m_sPro);
if (nSel != -1)
{
m_wndProCombox.SetCurSel(nSel);
CStringArray arVls;
CoreTools::SplitStrintToArray(dlg.m_sIP, arVls, _T('.'));
if (arVls.GetSize() >= 4)
{
m_nField[0] = _ttoi(arVls.GetAt(0));
m_nField[1] = _ttoi(arVls.GetAt(1));
m_nField[2] = _ttoi(arVls.GetAt(2));
m_nField[3] = _ttoi(arVls.GetAt(3));
m_wndIPCtrl.SetAddress(m_nField[0], m_nField[1], m_nField[2], m_nField[3]);
}
}
UpdateData(FALSE);
}
}
void CFSTZDlg::OnBnClickedButton13()
{
acedPostCommand(_T("PL_BHCZ "));
}