// SpecJumpDlg.cpp : implementation file // #include "stdafx.h" #include "Resource.h" #include "SpecJumpDlg.h" #include "EarThwormDef.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CSpecJumpDlg dialog CSpecJumpDlg::CSpecJumpDlg(CWnd* pParent /*=NULL*/) : CDialog(CSpecJumpDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSpecJumpDlg) m_sSpecLeft = _T(""); m_sSpecRight = _T(""); //}}AFX_DATA_INIT } void CSpecJumpDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSpecJumpDlg) DDX_Control(pDX, IDC_SELECTST, m_CtlStart); DDX_Control(pDX, IDC_SELECTEND, m_CtlEnd); DDX_Text(pDX, IDC_SPECLEFT, m_sSpecLeft); DDX_Text(pDX, IDC_SPECRIGHT, m_sSpecRight); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSpecJumpDlg, CDialog) //{{AFX_MSG_MAP(CSpecJumpDlg) ON_BN_CLICKED(IDC_SELECTST, OnSelectst) ON_BN_CLICKED(IDC_SELECTEND, OnSelectend) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSpecJumpDlg message handlers void CSpecJumpDlg::OnOK() { // TODO: Add extra validation here UpdateData(TRUE); CDialog::OnOK(); } void CSpecJumpDlg::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; CString sContent = _T(""); AecDbObjXDataMap objXData; 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,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,PIDPIPE_APP)) { sContent = _T(""); objXData.GetAt(PID_PIPE_LEVEL,sContent); if(sContent != _T("")) { m_sSpecLeft = sContent; } } pEnt->close(); } } } this->ShowWindow(SW_SHOW); this->EnableWindow(TRUE); this->UpdateData(FALSE); } void CSpecJumpDlg::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; CString sContent = _T(""); AecDbObjXDataMap objXData; 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,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,PIDPIPE_APP)) { sContent = _T(""); objXData.GetAt(PID_PIPE_LEVEL,sContent); if(sContent != _T("")) { m_sSpecRight = sContent; } } pEnt->close(); } } } this->ShowWindow(SW_SHOW); this->EnableWindow(TRUE); this->UpdateData(FALSE); } BOOL CSpecJumpDlg::OnInitDialog() { CDialog::OnInitDialog(); m_bmpBtn.LoadBitmap(IDB_SELECT); m_CtlEnd.SetBitmap(m_bmpBtn); m_CtlStart.SetBitmap(m_bmpBtn); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } AcDbObjectId CSpecJumpDlg::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; }