Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

973 lines
23 KiB
C++

// LineNumDlg.cpp : implementation file
//
#include "stdafx.h"
#include "LineNumDlg.h"
#include "earthwormdef.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLineNumDlg dialog
CLineNumDlg::CLineNumDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLineNumDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLineNumDlg)
m_dCPressure = 1.0;
m_dCTemper = 100.0;
m_dDPressure = 1.0;
m_dDTemper = 100.0;
m_sEnd = _T("");
m_sInsMaterial = _T("");
m_sInsThinkness = _T("");
m_sMedium = _T("");
m_sPipeGA = _T("");
m_sPipeDn = _T("");
m_sPipeNum = _T("");
m_sPrjName = _T("");
m_sSpec = _T("");
m_sStart = _T("");
m_sTPipeDn = _T("");
m_iTPipeCount = 0;
//}}AFX_DATA_INIT
}
void CLineNumDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLineNumDlg)
DDX_Control(pDX, IDC_SELECTST, m_CtlStart);
DDX_Control(pDX, IDC_SELECTEND, m_CtlEnd);
DDX_Control(pDX, IDC_SPEC, m_CtlSpec);
DDX_Control(pDX, IDC_MEDIUM, m_CtlMedium);
DDX_Control(pDX, IDC_TPIPEDN, m_CtlTPipeDn);
DDX_Control(pDX, IDC_PRJNAME, m_CtlPrjName);
DDX_Control(pDX, IDC_PIPEDN, m_CtlPipeDn);
DDX_Control(pDX, IDC_LINENUMTREE, m_CtlLineNum);
DDX_Text(pDX, IDC_CPRESSURE, m_dCPressure);
DDX_Text(pDX, IDC_CTEMPER, m_dCTemper);
DDX_Text(pDX, IDC_DPRESSURE, m_dDPressure);
DDX_Text(pDX, IDC_DTEMPER, m_dDTemper);
DDX_Text(pDX, IDC_END, m_sEnd);
DDX_Text(pDX, IDC_INSMATERIAL, m_sInsMaterial);
DDX_Text(pDX, IDC_INSTHINKNESS, m_sInsThinkness);
DDX_CBString(pDX, IDC_MEDIUM, m_sMedium);
DDX_CBString(pDX, IDC_PIPEGA, m_sPipeGA);
DDX_CBString(pDX, IDC_PIPEDN, m_sPipeDn);
DDX_CBString(pDX, IDC_PIPENUM, m_sPipeNum);
DDX_CBString(pDX, IDC_PRJNAME, m_sPrjName);
DDX_CBString(pDX, IDC_SPEC, m_sSpec);
DDX_Text(pDX, IDC_START, m_sStart);
DDX_CBString(pDX, IDC_TPIPEDN, m_sTPipeDn);
DDX_Text(pDX, IDC_TPIPECOUNT, m_iTPipeCount);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLineNumDlg, CDialog)
//{{AFX_MSG_MAP(CLineNumDlg)
ON_NOTIFY(NM_CLICK, IDC_LINENUMTREE, OnClickLinenumtree)
ON_BN_CLICKED(IDC_SAVEDATE, OnSavedate)
ON_BN_CLICKED(IDC_SELECTST, OnSelectst)
ON_BN_CLICKED(IDC_SELECTEND, OnSelectend)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLineNumDlg message handlers
void CLineNumDlg::OnOK()
{
AcDbBlockTable* pTable = NULL;
if (Acad::eOk != acdbHostApplicationServices()->workingDatabase()->getBlockTable(pTable,AcDb::kForRead))
{
return;
}
AcDbBlockTableRecord* pTableRecord = NULL;
if (Acad::eOk !=pTable->getAt(ACDB_MODEL_SPACE,pTableRecord,AcDb::kForRead))
{
pTable->close();
return;
}
pTable->close();
AcDbBlockTableRecordIterator* pTRIterator = NULL;
if(Acad::eOk != pTableRecord->newIterator(pTRIterator))
{
pTableRecord->close();
return;
}
pTableRecord->close();
AcDbEntity* pEnt = NULL;
AecDbObjXDataMap objXData;
BOOL bFind;
CString sLineNum = _T("");
AcDbObjectId idTemp = NULL;
CMapStringToObjectId mapLineNum;
for (pTRIterator->start();!pTRIterator->done();pTRIterator->step())
{
if (Acad::eOk == pTRIterator->getEntity(pEnt,AcDb::kForRead))
{
if (objXData.Read(pEnt,PIDPIPE_APP))
{
sLineNum = _T("");
objXData.GetAt(PID_PIPE_LINENO,sLineNum);
if(sLineNum != _T(""))
{
bFind = mapLineNum.Lookup(sLineNum,idTemp);
if (bFind == 0)
{
idTemp = pEnt->objectId();
mapLineNum.SetAt(sLineNum,idTemp);
}
}
}
pEnt->close();
}
}
delete pTRIterator;
//循环将加入map的管号信息添加到Tree控件中
POSITION ps = NULL;
for (ps = mapLineNum.GetStartPosition();ps != NULL;)
{
mapLineNum.GetNextAssoc(ps,sLineNum,idTemp);
SetDateBase(m_sProjectName,sLineNum,idTemp);
}
int nRes = AfxMessageBox(_T("工艺信息已经传入BOM,是否启动BOM生成报表"),MB_YESNO);
if (nRes == IDYES)
{
CString sMtoexe,sMtoPath;
KTSetting::GetKTPsPath(sMtoexe);
sMtoPath = sMtoexe + _T("sys\\");
sMtoexe = sMtoPath;
sMtoexe += _T("KTBOM.exe");
::ShellExecute(acedGetAcadFrame()->m_hWnd,_T("open"),sMtoexe,NULL,sMtoPath,SW_SHOWNORMAL);
}
}
void CLineNumDlg::SetADOServer(CUIISQLiteServer * pADOServer)
{
this->m_pADOServer = pADOServer;
}
BOOL CLineNumDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
m_bmpBtn.LoadBitmap(IDB_SELECT);
m_CtlEnd.SetBitmap(m_bmpBtn);
m_CtlStart.SetBitmap(m_bmpBtn);
//获取初始化数据
AecDbObjXDataMap xDataMap;
PIDLineTools::ReSetPID(xDataMap);
if (!KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, xDataMap))
{
acedAlert(_T("\n系统没有初始化!"));
return FALSE;
}
xDataMap.GetAt(DOC_PIDPROJECT, m_sProjectName);
if (m_sProjectName ==_T(""))
{
acedAlert(_T("\n未获得项目名称!"));
return FALSE;
}
m_sPrjName = m_sProjectName;
m_CtlPrjName.AddString(m_sProjectName);
//遍历图纸将管号添加到tree中
HTREEITEM hChapter =m_CtlLineNum.InsertItem(m_sProjectName);
AcDbBlockTable* pTable = NULL;
if (Acad::eOk != acdbHostApplicationServices()->workingDatabase()->getBlockTable(pTable,AcDb::kForRead))
{
return FALSE;
}
AcDbBlockTableRecord* pTableRecord = NULL;
if (Acad::eOk !=pTable->getAt(ACDB_MODEL_SPACE,pTableRecord,AcDb::kForRead))
{
pTable->close();
return FALSE;
}
pTable->close();
AcDbBlockTableRecordIterator* pTRIterator = NULL;
if(Acad::eOk != pTableRecord->newIterator(pTRIterator))
{
pTableRecord->close();
return FALSE;
}
pTableRecord->close();
AcDbEntity* pEnt = NULL;
AecDbObjXDataMap objXData;
BOOL bFind;
CString sLineNum = _T("");
//CString sValue = _T("管线号");
AcDbObjectId idTemp = NULL;
for (pTRIterator->start();!pTRIterator->done();pTRIterator->step())
{
if (Acad::eOk == pTRIterator->getEntity(pEnt,AcDb::kForRead))
{
if (objXData.Read(pEnt,PIDPIPE_APP))
{
sLineNum = _T("");
objXData.GetAt(PID_PIPE_LINENO,sLineNum);
if(sLineNum != _T(""))
{
bFind = m_mapLineNum.Lookup(sLineNum,idTemp);
if (bFind == 0)
{
idTemp = pEnt->objectId();
m_mapLineNum.SetAt(sLineNum,idTemp);
}
}
}
pEnt->close();
}
}
delete pTRIterator;
//循环将加入map的管号信息添加到Tree控件中
POSITION ps = NULL;
for (ps = m_mapLineNum.GetStartPosition();ps != NULL;)
{
m_mapLineNum.GetNextAssoc(ps,sLineNum,idTemp);
m_CtlLineNum.InsertItem(sLineNum,hChapter,NULL);
}
m_CtlLineNum.SortChildren(hChapter);
m_CtlLineNum.Expand(hChapter,TVE_EXPAND);
//添加Dn数据到
SetDnData(m_CtlPipeDn);
SetDnData(m_CtlTPipeDn);
//添加该项目的等级名称
SetSpecData(m_CtlSpec,m_sProjectName);
//添加介质数据
SetMediumData(m_CtlMedium);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CLineNumDlg::SetDnData(CComboBox& CmbBox)
{
CString sSQL=_T(""),sText=_T("");
CStringArray arValue;
int nCount=0;
CUIIValueTable valueTable;
//传入等级数据
sSQL.Format(_T("SELECT [公制] FROM [AecDn] order by [公制]"));
valueTable.RemoveAll();
m_pADOServer->GetSelData(sSQL,valueTable,TRUE);
nCount = valueTable.GetTableLogicSize();
CmbBox.ResetContent();
for(int i = 0;i<nCount;i++)
{
arValue.RemoveAll();
valueTable.GetValueRecord(i,arValue);
sText = arValue.GetAt(0);
CmbBox.AddString(sText);
}
valueTable.RemoveAll();
if (nCount != 0)
{
CmbBox.SetCurSel(0);
}
}
void CLineNumDlg::SetSpecData(CComboBox& CmbBox,CString sPrjName)
{
CString sSQL=_T(""),sText=_T("");
CStringArray arValue;
int nCount = 0;
CUIIValueTable valueTable;
//传入等级数据
sSQL.Format(_T("SELECT [等级名称] FROM [AecSpecname] where [项目名称]='%s' order by [等级名称]"),sPrjName);
valueTable.RemoveAll();
m_pADOServer->GetSelData(sSQL,valueTable,TRUE);
nCount = valueTable.GetTableLogicSize();
CmbBox.ResetContent();
for(int i = 0;i<nCount;i++)
{
arValue.RemoveAll();
valueTable.GetValueRecord(i,arValue);
sText = arValue.GetAt(0);
CmbBox.AddString(sText);
}
valueTable.RemoveAll();
if (nCount !=0 )
{
CmbBox.SetCurSel(0);
}
}
void CLineNumDlg::OnClickLinenumtree(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
m_sLineNum = _T("");
CPoint pt;
::GetCursorPos(&pt);
m_CtlLineNum.ScreenToClient(&pt);
UINT uFlags;
HTREEITEM hSelectItem = m_CtlLineNum.HitTest(pt,&uFlags);
m_sLineNum = m_CtlLineNum.GetItemText(hSelectItem);
if (m_sLineNum != m_sProjectName)
{
//从数据库中将对应管号的内容
SetTechnics(m_sProjectName,m_sLineNum);
}
else
{
m_sLineNum = _T("");
}
*pResult = 0;
}
void CLineNumDlg::SetMediumData(CComboBox& CmbBox)
{
CString sSQL=_T(""),sText=_T("");
CStringArray arValue;
int nCount=0;
CUIIValueTable valueTable;
//传入等级数据
sSQL.Format(_T("SELECT [介质代号] FROM [AecFluid] order by [介质代号]"));
valueTable.RemoveAll();
m_pADOServer->GetSelData(sSQL,valueTable,TRUE);
nCount = valueTable.GetTableLogicSize();
CmbBox.ResetContent();
for(int i = 0;i<nCount;i++)
{
arValue.RemoveAll();
valueTable.GetValueRecord(i,arValue);
sText = arValue.GetAt(0);
CmbBox.AddString(sText);
}
valueTable.RemoveAll();
if (nCount != 0)
{
CmbBox.SetCurSel(0);
}
}
//
void CLineNumDlg::SetTechnics(CString sPrjName,CString sLineNum)
{
m_sPrjName = m_sProjectName;
m_sPipeNum = m_sLineNum;
m_sStart = _T("");
m_sEnd =_T("");
m_sSpec = _T("");
m_sPipeDn = _T("");
m_sMedium = _T("");
m_sPipeGA = _T("");
m_dDTemper = 0;
m_dCTemper = 0;
m_dDPressure =0;
m_dCPressure = 0;
m_sInsMaterial = _T("");
m_sInsThinkness = _T("");
m_sTPipeDn = _T("");
m_iTPipeCount = 0;
AcDbObjectId idTemp = NULL;
m_mapLineNum.Lookup(m_sLineNum,idTemp);
if (idTemp.isValid())
{
AecDbObjXDataMap objXData;
AcDbEntity* pEnt= NULL;
CString sTemp =_T("");
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idTemp,AcDb::kForRead))
{
if (objXData.Read(pEnt,PIDPIPE_APP))
{
m_sPrjName = sPrjName;
m_sPipeNum = sLineNum;
sTemp =_T("");//起始点
objXData.GetAt(PID_PIPE_START,sTemp);
m_sStart = sTemp;
sTemp =_T("");//末点
objXData.GetAt(PID_PIPE_END,sTemp);
m_sEnd = sTemp;
sTemp =_T("");//等级
objXData.GetAt(PID_PIPE_LEVEL,sTemp);
m_sSpec = sTemp;
sTemp =_T("");//公称直径
objXData.GetAt(PID_PIPE_DN,sTemp);
m_sPipeDn = sTemp;
sTemp =_T("");//介质
objXData.GetAt(PID_PIPE_MEDIA,sTemp);
m_sMedium = sTemp;
sTemp =_T("");//管道级别
objXData.GetAt(PID_PIPE_PIPEGA,sTemp);
m_sPipeGA = sTemp;
sTemp =_T("");//设计温度
objXData.GetAt(PID_PIPE_DTEMPER,sTemp);
m_dDTemper = _ttof(sTemp);
sTemp =_T("");//操作温度
objXData.GetAt(PID_PIPE_CTEMPER,sTemp);
m_dCTemper = _ttof(sTemp);
sTemp =_T("");//设计压力
objXData.GetAt(PID_PIPE_DPRESS,sTemp);
m_dDPressure = _ttof(sTemp);
sTemp =_T("");//操作压力
objXData.GetAt(PID_PIPE_CPRESS,sTemp);
m_dCPressure = _ttof(sTemp);
sTemp =_T("");//保温材料
objXData.GetAt(PID_PIPE_INSMAT,sTemp);
m_sInsMaterial = sTemp;
sTemp =_T("");//保温厚度
objXData.GetAt(PID_PIPE_INSTNK,sTemp);
m_sInsThinkness = sTemp;
sTemp =_T("");//伴热管公称直径
objXData.GetAt(PID_PIPE_TPDN,sTemp);
m_sTPipeDn = sTemp;
sTemp =_T("");//伴热管个数
objXData.GetAt(PID_PIPE_TPCOUNT,sTemp);
m_iTPipeCount = _ttoi(sTemp);
}
pEnt->close();
}
}
UpdateData(FALSE);
}
void CLineNumDlg::SetDateBase(CString sPrjName,CString sLineNum,AcDbObjectId idPipe)
{
//
CString sPipeNum =sLineNum;
CString sStart =_T("");
CString sEnd =_T("");
CString sSpec =_T("");
CString sPipeDn =_T("");
CString sMedium =_T("");
CString sPipeGA =_T("");
CString sInsMaterial =_T("");
CString sTPipeDn =_T("");
double dDTemper=0;
double dCTemper=0;
double dDPressure=0;
double dCPressure=0;
int iTPipeCount=0;
double dInsThinkness =0;
if (idPipe.isValid())
{
AecDbObjXDataMap objXData;
AcDbEntity* pEnt= NULL;
CString sTemp =_T("");
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idPipe,AcDb::kForRead))
{
if (objXData.Read(pEnt,PIDPIPE_APP))
{
sTemp =_T("");//起始点
objXData.GetAt(PID_PIPE_START,sTemp);
sStart = sTemp;
sTemp =_T("");//末点
objXData.GetAt(PID_PIPE_END,sTemp);
sEnd = sTemp;
sTemp =_T("");//等级
objXData.GetAt(PID_PIPE_LEVEL,sTemp);
sSpec = sTemp;
sTemp =_T("");//公称直径
objXData.GetAt(PID_PIPE_DN,sTemp);
sPipeDn = sTemp;
sTemp =_T("");//介质
objXData.GetAt(PID_PIPE_MEDIA,sTemp);
sMedium = sTemp;
sTemp =_T("");//管道级别
objXData.GetAt(PID_PIPE_PIPEGA,sTemp);
sPipeGA = sTemp;
sTemp =_T("");//设计温度
objXData.GetAt(PID_PIPE_DTEMPER,sTemp);
dDTemper = _ttof(sTemp);
sTemp =_T("");//操作温度
objXData.GetAt(PID_PIPE_CTEMPER,sTemp);
dCTemper = _ttof(sTemp);
sTemp =_T("");//设计压力
objXData.GetAt(PID_PIPE_DPRESS,sTemp);
dDPressure = _ttof(sTemp);
sTemp =_T("");//操作压力
objXData.GetAt(PID_PIPE_CPRESS,sTemp);
dCPressure = _ttof(sTemp);
sTemp =_T("");//保温材料
objXData.GetAt(PID_PIPE_INSMAT,sTemp);
sInsMaterial = sTemp;
sTemp =_T("");//保温厚度
objXData.GetAt(PID_PIPE_INSTNK,sTemp);
dInsThinkness = _ttof(sTemp);
sTemp =_T("");//伴热管公称直径
objXData.GetAt(PID_PIPE_TPDN,sTemp);
sTPipeDn = sTemp;
sTemp =_T("");//伴热管个数
objXData.GetAt(PID_PIPE_TPCOUNT,sTemp);
iTPipeCount = _ttoi(sTemp);
}
pEnt->close();
}
}
else
{
return;
}
//插入数据
CString sSQL=_T("");
int nCount = 0;
CUIIValueTable valueTable;
sSQL.Format(_T("SELECT * FROM [AecTechnics] where [项目名称] ='%s' and [管线名称] ='%s'"),sPrjName,sLineNum);
valueTable.RemoveAll();
m_pADOServer->GetSelData(sSQL,valueTable,TRUE);
nCount = valueTable.GetTableLogicSize();
if (nCount == 0)
{
sSQL.Format(_T("insert into [AecTechnics] ([项目名称],[管线名称],[起点],[终点],[管道等级],")
_T("[公称直径],[介质],[管道类别],[设计温度],[操作温度],")
_T("[设计压力],[操作压力],[保温材料],[保温厚度],[伴热公称直径],[伴热根数])")
_T(" values ('%s','%s','%s','%s','%s',")
_T("%d,'%s','%s',%g,%g,")
_T("%g,%g,'%s',%g,%d,%d)"),
sPrjName,sPipeNum,sStart,sEnd,sSpec,_ttoi(sPipeDn),
sMedium,sPipeGA,dDTemper,dCTemper,dDPressure,dCPressure,
sInsMaterial,dInsThinkness,_ttoi(sTPipeDn),iTPipeCount);
m_pADOServer->ExecuteSQL(sSQL);
AfxMessageBox(_T("数据插入成功!"));
}
else
{
sSQL.Format(_T("update [AecTechnics] set [起点] = '%s',[终点] = '%s',")
_T("[管道等级] = '%s',[公称直径] = %d,[介质]= '%s',[管道类别] = '%s',")
_T("[设计温度] = %g,[操作温度] = %g,[设计压力] = %g,[操作压力] = %g,")
_T("[保温材料]= '%s',[伴热公称直径] = %d,[伴热根数] = %d,[保温厚度] = %g")
_T(" where [项目名称] = '%s' and [管线名称] = '%s'"),
sStart,sEnd,sSpec,_ttoi(sPipeDn),
sMedium,sPipeGA,dDTemper,dCTemper,dDPressure,dCPressure,
sInsMaterial,_ttoi(sTPipeDn),iTPipeCount,dInsThinkness,sPrjName,sPipeNum);
m_pADOServer->ExecuteSQL(sSQL);
AfxMessageBox(_T("数据修改成功!"));
}
}
void CLineNumDlg::OnSavedate()
{
if(m_sLineNum != _T(""))
{
UpdateData(TRUE);
AcDbBlockTable* pTable = NULL;
if (Acad::eOk != acdbHostApplicationServices()->workingDatabase()->getBlockTable(pTable,AcDb::kForRead))
{
return;
}
AcDbBlockTableRecord* pTableRecord = NULL;
if (Acad::eOk !=pTable->getAt(ACDB_MODEL_SPACE,pTableRecord,AcDb::kForRead))
{
pTable->close();
return;
}
pTable->close();
AcDbBlockTableRecordIterator* pTRIterator = NULL;
if(Acad::eOk != pTableRecord->newIterator(pTRIterator))
{
pTableRecord->close();
return;
}
pTableRecord->close();
AcDbEntity* pEnt = NULL;
AecDbObjXDataMap objXData;
CString sLineNum = _T("");
AcDbObjectId idTemp = NULL;
bool bSaveOk = false;
for (pTRIterator->start();!pTRIterator->done();pTRIterator->step())
{
if (Acad::eOk == pTRIterator->getEntity(pEnt,AcDb::kForWrite))
{
if (pEnt->isKindOf(AcDbPolyline::desc()))
{
if (objXData.Read(pEnt,PIDPIPE_APP))
{
sLineNum = _T("");
objXData.GetAt(PID_PIPE_LINENO,sLineNum);
if(sLineNum == m_sLineNum)
{
objXData.SetAt(PID_PIPE_START,m_sStart);
objXData.SetAt(PID_PIPE_END,m_sEnd);
objXData.SetAt(PID_PIPE_LEVEL,m_sSpec);
objXData.SetAt(PID_PIPE_DN,m_sPipeDn);
objXData.SetAt(PID_PIPE_MEDIA,m_sMedium);
objXData.SetAt(PID_PIPE_PIPEGA,m_sPipeGA);
objXData.SetAt(PID_PIPE_DTEMPER,m_dDTemper);
objXData.SetAt(PID_PIPE_CTEMPER,m_dCTemper);
objXData.SetAt(PID_PIPE_DPRESS,m_dDPressure);
objXData.SetAt(PID_PIPE_CPRESS,m_dCPressure);
objXData.SetAt(PID_PIPE_INSMAT,m_sInsMaterial);
objXData.SetAt(PID_PIPE_INSTNK,m_sInsThinkness);
objXData.SetAt(PID_PIPE_TPDN,m_sTPipeDn);
objXData.SetAt(PID_PIPE_TPCOUNT,m_iTPipeCount);
objXData.Write(pEnt,PIDPIPE_APP);
bSaveOk = true;
}
}
}
pEnt->close();
}
}
delete pTRIterator;
if (bSaveOk)
{
AfxMessageBox(_T("写入选择实体完毕!"));
}
}
else
{
AfxMessageBox(_T("请首先选择管号!"));
}
}
void CLineNumDlg::OnSelectst()
{
CWnd * pWnd = acedGetAcadFrame();
this->EnableWindow(FALSE);
pWnd->EnableWindow(TRUE);
this->ShowWindow(SW_HIDE);
//选择实体
AcGePoint3d pt;
ads_name en;
AcDbObjectId idSelected = NULL;
AcDbObjectId idGroup = NULL;
AcDbObjectId idTemp = NULL;
AcDbObjectId idTip = NULL;
AcDbEntity* pEnt =NULL;
AecDbObjXDataMap objXData;
CString sContent = _T("");
int nRes = acedEntSel(_T("\n请选择实体:"),en,asDblArray(pt));
if (nRes == RTNORM)
{
if (Acad::eOk == acdbGetObjectId(idSelected,en))
{
idGroup = GetGroupId(idSelected);
// 通过组ID获得物体中材料点的信息
if (idGroup !=AcDbObjectId::kNull)
{
AcDbGroup* pGroup = NULL;
acdbOpenObject(pGroup,idGroup,AcDb::kForRead);
AcDbGroupIterator* pIter = pGroup->newIterator();
for(;!pIter->done();pIter->next())
{
idTemp = pIter->objectId();
if (objXData.Read(idTemp,_T("KTParamPart")))
{
objXData.GetAt(_T("点类型"),sContent);
if (sContent.CompareNoCase(_T("材料点"))==0)
{
objXData.GetAt(_T("名称"),sContent);
if (sContent.CompareNoCase(_T("设备"))==0)
{
idTip = idTemp;
break;
}
}
}
if (objXData.Read(idTemp,PIDPIPE_APP))
{
sContent = _T("");
objXData.GetAt(PID_PIPE_LINENO,sContent);
if(sContent != _T(""))
{
idTip = idTemp;
break;
}
}
}
delete pIter;
pGroup->close();
}
else
{
idTip = idSelected;
}
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, idTip, AcDb::kForRead))
{
if (objXData.Read(pEnt,_T("KTParamPart")))
{
objXData.GetAt(_T("设备位号"),sContent);
m_sStart = sContent;
}
//管子
if (objXData.Read(pEnt,PIDPIPE_APP))
{
sContent = _T("");
objXData.GetAt(PID_PIPE_LINENO,sContent);
if(sContent != _T(""))
{
m_sStart = sContent;
}
}
pEnt->close();
}
}
}
else
{
AfxMessageBox(_T("没有选中实体!"));
}
this->ShowWindow(SW_SHOW);
this->EnableWindow(TRUE);
this->UpdateData(FALSE);
}
AcDbObjectId CLineNumDlg::GetGroupId(AcDbObjectId objId)
{
AcDbObjectId persObjId;
AcDbObject *pEnt;
if (Acad::eOk != acdbOpenObject(pEnt, objId, AcDb::kForRead))
{
acutPrintf(_T("\n实体打开失败!"));
return AcDbObjectId::kNull;
}
AcDbDictionary *pGroup;
const AcDbVoidPtrArray *pReactors;
pReactors = pEnt->reactors();
if (pReactors == NULL)
{
acutPrintf(_T("\n该实体未编组!"));
pEnt->close();
return AcDbObjectId::kNull;
}
pEnt->close();
int length = pReactors->length();
void *pSomething;
for (int i = 0; i < length; ++i)
{
pSomething = (AcDbObject*) pReactors->at(i);
if (acdbIsPersistentReactor(pSomething)) {
// Every group reactor is a persistent reactor.
// Is this a reactor from a group?
persObjId = acdbPersistentReactorObjectId(pSomething);
AcDbObject *pReactor;
if (Acad::eOk != acdbOpenObject(pReactor, persObjId, AcDb::kForRead))
{
acutPrintf(_T("\n迭代器打开失败!"));
continue;
}
if (pReactor->isKindOf(AcDbGroup::desc())) {
// This is a group reactor. Get the group name.
AcDbObjectId groupId = pReactor->ownerId();
if (Acad::eOk != acdbOpenObject(pGroup, groupId, AcDb::kForRead))
{
acutPrintf(_T("\n组打开失败!"));
pReactor->close();
continue;
}
LPTSTR groupName;
if (Acad::eOk != (pGroup->nameAt(persObjId, groupName)))
{
acutPrintf(_T("\n获得组名失败!"));
pReactor->close();
pGroup->close();
continue;
}
pGroup->close();
}
pReactor->close();
}
}
return persObjId;
}
void CLineNumDlg::OnSelectend()
{
CWnd * pWnd = acedGetAcadFrame();
this->EnableWindow(FALSE);
pWnd->EnableWindow(TRUE);
this->ShowWindow(SW_HIDE);
//选择实体
AcGePoint3d pt;
ads_name en;
AcDbObjectId idSelected = NULL;
AcDbObjectId idGroup = NULL;
AcDbObjectId idTemp = NULL;
AcDbObjectId idTip = NULL;
AcDbEntity* pEnt =NULL;
AecDbObjXDataMap objXData;
CString sContent = _T("");
int nRes = acedEntSel(_T("\n请选择实体:"),en,asDblArray(pt));
if (nRes == RTNORM)
{
if (Acad::eOk == acdbGetObjectId(idSelected,en))
{
idGroup = GetGroupId(idSelected);
// 通过组ID获得物体中材料点的信息
if (idGroup !=AcDbObjectId::kNull)
{
AcDbGroup* pGroup = NULL;
acdbOpenObject(pGroup,idGroup,AcDb::kForRead);
AcDbGroupIterator* pIter = pGroup->newIterator();
for(;!pIter->done();pIter->next())
{
idTemp = pIter->objectId();
if (objXData.Read(idTemp,_T("KTParamPart")))
{
objXData.GetAt(_T("点类型"),sContent);
if (sContent.CompareNoCase(_T("材料点"))==0)
{
objXData.GetAt(_T("名称"),sContent);
if (sContent.CompareNoCase(_T("设备"))==0)
{
idTip = idTemp;
break;
}
}
}
if (objXData.Read(idTemp,PIDPIPE_APP))
{
sContent = _T("");
objXData.GetAt(PID_PIPE_LINENO,sContent);
if(sContent != _T(""))
{
idTip = idTemp;
break;
}
}
}
delete pIter;
pGroup->close();
}
else
{
idTip = idSelected;
}
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, idTip, AcDb::kForRead))
{
//设备
if (objXData.Read(pEnt,_T("KTParamPart")))
{
objXData.GetAt(_T("设备位号"),sContent);
m_sEnd = sContent;
}
//管子
if (objXData.Read(pEnt,PIDPIPE_APP))
{
sContent = _T("");
objXData.GetAt(PID_PIPE_LINENO,sContent);
if(sContent != _T(""))
{
m_sEnd = sContent;
}
}
pEnt->close();
}
}
}
else
{
AfxMessageBox(_T("没有选中实体!"));
}
this->ShowWindow(SW_SHOW);
this->EnableWindow(TRUE);
this->UpdateData(FALSE);
}