// 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;iGetSelData(sSQL,valueTable,TRUE); nCount = valueTable.GetTableLogicSize(); CmbBox.ResetContent(); for(int i = 0;iGetSelData(sSQL,valueTable,TRUE); nCount = valueTable.GetTableLogicSize(); CmbBox.ResetContent(); for(int i = 0;iclose(); } } 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); }