// TVerticalSectionEdJig.cpp: implementation of the TVerticalSectionEdJig class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include #include #include #include #include "TVerticalSectionEdJig.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// //*************************************************************************************************** // 一分为二 //*************************************************************************************************** //绘制纵断面图 void DrawVerticalSection(DList &lstWellSys, int iScaleX, int iScaleY, double nGridScale, int iMode, double nDeepStart) { InitLayer(_T("0")); XPushVarStr clayer(_T("CLAYER"), _T("0")); XPoint ptIns, ptStart, ptEnd; xg_getvar(_T("VIEWCTR"), ptIns); ptIns = Ucs2Wcs(ptIns); PickSet ssDraw(SS_FREE); ssDraw.IncludeBegin(); TDbVerticalSection *pSect = new TDbVerticalSection; pSect->SetLayoutRotation(Ucs2Wcs(0.0)); pSect->SetInsert(ptIns); pSect->SetGridScale(nGridScale); pSect->SetScaleX(iScaleX); pSect->SetScaleY(iScaleY); pSect->SetCalcMode(iMode); pSect->SetTextHeight(g_nTwtDimHeight); pSect->SetTextStyleId(InitTwtTextStyle(g_csTwtDimStyle)); pSect->SetDoteLayer(InitLayer(LAY_TWT_DOTE)); pSect->SetWellDatas(lstWellSys); pSect->setColor(AcCmColor()); //随层 pSect->SetStartDeep(nDeepStart); pSect->SetTextLayer(InitLayer(LAY_TEXT)); pSect->SetGridLayer(InitGridLayer(LAY_TWT_GRID)); pSect->SetSectLayer(InitLayer(LAY_TWT_SECTION)); if(iMode == 3) pSect->SetSheetHead(g_csVerticalSectionHeadFeed); else pSect->SetSheetHead(g_csVerticalSectionHead); pSect->Calc(); double nHighEle = pSect->GetMaxDeep(); double nLowEle = pSect->GetMinDeep(); AcDbObjectId id = AddToCurrentSpace(pSect, Adesk::kTrue); ssDraw.IncludeEnd(); ssDraw.Redraw(2); ptIns = Wcs2Ucs(ptIns); actrTransactionManager->flushGraphics(); //acad 刷新 XPoint xp; if(DragMovePickSet(ssDraw, _T("\n请点取纵断面图位置<退出>: "), ptIns, xp) != RTNORM) ssDraw.Erase(); } void SplitVerticalSection() { Entity ent; RBList rbMask(RTDXF0, _T("ATS_VERTICALSECTION"), NULL); if(SelectEntity(_T("\n请选择纵断面图<退出>:"), ent, rbMask) != RTNORM) return; XPushVar vOsMode(_T("OSMODE"), 0); AcDbObjectId id = NULL; acdbGetObjectId(id, ent); TVerticalSectionEdJig jig(1); jig.SetSheetId(id); int nKeyIndex=0; int nCode=jig.DoIt(&nKeyIndex); if(nCode!=RTNORM) return; DList lstWellSys, lstWellSys1, lstWellSys2; XPoint pt = jig.m_ptResult; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbVerticalSection, pVS) if(pVS){ double nWidth(0), nHeight(0); XPoint ptTopLeft; int nCol=pVS->HitTestOnVS2(pt, nWidth, nHeight, ptTopLeft); double nStartDeep(0); pVS->GetWellDatas(lstWellSys); int nCount = lstWellSys.Length(); if(nCol < 2 || nCol > nCount-2)//从前,从后都不可以分割 return; BOOL bSplitIsWell = lstWellSys[nCol]->m_bIsWell;//从井分割还是从管 if(bSplitIsWell && lstWellSys[nCol]->m_csName == _T("HC")) { adsout << _T("不支持从化粪池切分!"); return; } int iPipeNum(0); for(int i= 0; iGetCalcMode() < 100) *pData = *lstWellSys[i]; else *pData = *lstWellSys[nCount-1-i]; if(i < nCol){ lstWellSys1.Append(pData); } else if(i > nCol){ lstWellSys2.Append(pData); } else if(i == nCol){ lstWellSys1.Append(pData); TWellData *pData2 = new TWellData; if (pVS->GetCalcMode() < 100) *pData2 = *lstWellSys[i]; else *pData2 = *lstWellSys[nCount-1-i]; lstWellSys2.Append(pData2); if(bSplitIsWell) nStartDeep = pData->m_nUpEle - pData->m_nDownEle; } else delete pData; // 如果从管中分割,就增加1个井,井名称叫:断管 if(i == nCol - 1 && !bSplitIsWell){ TWellData *pData2 = new TWellData; if (pVS->GetCalcMode() < 100) *pData2 = *lstWellSys[i]; else *pData2 = *lstWellSys[nCount-1-i]; pData2->m_csName = _T("断管"); lstWellSys2.Append(pData2); if (pVS->GetCalcMode() < 100) nStartDeep = pData2->m_nUpEle - pData2->m_nDownEle; } else if(i == nCol + 1 && !bSplitIsWell){ TWellData *pData2 = new TWellData; if (pVS->GetCalcMode() < 100) *pData2 = *lstWellSys[i]; else *pData2 = *lstWellSys[nCount-1-i]; pData2->m_csName = _T("断管"); lstWellSys1.Append(pData2); if (pVS->GetCalcMode() >= 100) nStartDeep = pData2->m_nUpEle - pData2->m_nDownEle; } } int nMode = pVS->GetCalcMode(); if (nMode >= 100)//倒的 { lstWellSys1.Reverse(); lstWellSys2.Reverse(); DrawVerticalSection(lstWellSys1, pVS->GetScaleX(), pVS->GetScaleY(), pVS->GetGridScale(), nMode, nStartDeep); DrawVerticalSection(lstWellSys2, pVS->GetScaleX(), pVS->GetScaleY(), pVS->GetGridScale(), nMode, pVS->GetStartDeep()); } else { DrawVerticalSection(lstWellSys1, pVS->GetScaleX(), pVS->GetScaleY(), pVS->GetGridScale(), nMode, pVS->GetStartDeep()); DrawVerticalSection(lstWellSys2, pVS->GetScaleX(), pVS->GetScaleY(), pVS->GetGridScale(), nMode, nStartDeep); } } OPENOBJ_END(); } //*************************************************************************************************** // 修改管井 //*************************************************************************************************** void ModifyVSData() { Entity ent; RBList rbMask(RTDXF0, _T("ATS_VERTICALSECTION"), NULL); if(SelectEntity(_T("\n请选择纵断面图<退出>:"), ent, rbMask) != RTNORM) return; XPushVar vOsMode(_T("OSMODE"), 0); AcDbObjectId id = NULL; acdbGetObjectId(id, ent); TVerticalSectionEdJig jig(1); jig.SetSheetId(id); int nKeyIndex=0; while(1){ jig.SetPrompt(_T("\n请点取要编辑的管线或井<退出>:")); int nCode=jig.DoIt(&nKeyIndex); if(nCode!=RTNORM) return; XPoint pt = jig.m_ptResult; OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbVerticalSection, pVS) if(pVS){ double nWidth(0), nHeight(0); XPoint ptTopLeft; int nCol=pVS->HitTestOnVS2(pt, nWidth, nHeight, ptTopLeft); if(nCol < 0) return; DList lstWellSys; pVS->GetWellDatas(lstWellSys); if (pVS->GetCalcMode() >= 100) nCol = lstWellSys.Length()-nCol-1; if(lstWellSys[0]->m_csName == _T("断管")) nCol = nCol +2; CString csPrompt; TCHAR szText[32]; if(lstWellSys[nCol]->m_bIsWell){ CString csNameWell = lstWellSys[nCol]->m_csName; double nEleUp = lstWellSys[nCol]->m_nUpEle; double nEleDown = lstWellSys[nCol]->m_nDownEle; double nEleDownFrond = lstWellSys[nCol]->m_nFrondDownEle; csPrompt.Format(_T("\n请给出设计地面标高(%.3f)<退出>:"), nEleUp); if(ads_getreal(csPrompt, &nEleUp) == RTNORM) lstWellSys[nCol]->m_nUpEle = nEleUp; if(csNameWell == "HC"){ double dPoolEleDown(0), dPoolEleUp(0); OPENOBJ_BEGIN(lstWellSys[nCol]->m_ID, AcDb::kForRead, TDbPump, pEquip); if(pEquip){ dPoolEleDown = pEquip->GetPumpRaise(); dPoolEleUp = pEquip->GetPumpQ(); } OPENOBJ_END(); csPrompt.Format(_T("\n请给出化粪池顶板标高(%.3f)<退出>:"), dPoolEleUp); ads_getreal(csPrompt, &dPoolEleUp); csPrompt.Format(_T("\n请给出化粪池底板标高(%.3f)<退出>:"), dPoolEleDown); ads_getreal(csPrompt, &dPoolEleDown); if(fabs(dPoolEleUp) > 0.001 && fabs(dPoolEleDown) > 0.001){ OPENOBJ_BEGIN(lstWellSys[nCol]->m_ID, AcDb::kForWrite, TDbPump, pEquip); if(pEquip){ pEquip->SetPumpRaise(dPoolEleDown); pEquip->SetPumpQ(dPoolEleUp); } OPENOBJ_END(); } } else if(pVS->GetCalcMode() != 3){ if(ads_getstring(NULL, _T("\n是否定义为跌水井?"), szText) == RTNORM){ if(_tcsicmp(szText, _T("Y")) == 0){ csPrompt.Format(_T("\n请给出跌水井井底标高(%.3f)<退出>:"), nEleDown); if(ads_getreal(csPrompt, &nEleDown) == RTNORM){ lstWellSys[nCol]->m_nDownEle = nEleDown; lstWellSys[nCol]->m_bIsDropWell = TRUE; } } else // cet 2013.2.27 add 将井设置为跌水井 { lstWellSys[nCol]->m_bIsDropWell = FALSE; } } } } else{ int iDn = lstWellSys[nCol]->m_iDn; double nI = lstWellSys[nCol]->m_nI; csPrompt.Format(_T("\n请给出本段管线管径(%d)<退出>:"), iDn); if(ads_getint(csPrompt, &iDn) == RTNORM) lstWellSys[nCol]->m_iDn = iDn; if(pVS->GetCalcMode() == 3){//给水系统 double nEle = lstWellSys[nCol-1]->m_nUpEle; double nDownEle = lstWellSys[nCol-1]->m_nDownEle; double dFeedDeep = nEle - nDownEle - (double)iDn/2000.0; csPrompt.Format(_T("\n请给出覆土厚度(%.3f)<退出>:"), dFeedDeep); if(ads_getreal(csPrompt, &dFeedDeep) == RTNORM){ nDownEle = nEle - dFeedDeep - (double)iDn/2000.0; lstWellSys[nCol-1]->m_nDownEle = nDownEle; double nEle2 = lstWellSys[nCol+1]->m_nUpEle; nDownEle = nEle2 - dFeedDeep - (double)iDn/2000.0; lstWellSys[nCol+1]->m_nFrondDownEle = nDownEle; } } else{ csPrompt.Format(_T("\n请给出本段管线坡度(%.4f)<退出>:"), nI); if(ads_getreal(csPrompt, &nI) == RTNORM) lstWellSys[nCol]->m_nI = nI; } } pVS->SetWellDatas(lstWellSys); pVS->Calc(); } OPENOBJ_END(); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// TVerticalSectionEdJig::TVerticalSectionEdJig(int iMode) { m_iMode = iMode; } TVerticalSectionEdJig::~TVerticalSectionEdJig() { } // 转换成ADS代码 int TVerticalSectionEdJig::GetRetCode(int retCode, int *kwordId) const { int ret = retCode; if (ret == AcEdJig::kCancel) ret = RTCAN; else if(ret == AcEdJig::kNull) ret = RTNONE; else if (ret <= 0) ret = RTNORM; else { if(kwordId) *kwordId = ret-1; ret = RTKWORD; } return ret; } // 开始执行拖动 int TVerticalSectionEdJig::DoIt(int *keyIndex) { int nRetCode=0; setDispPrompt(m_sPrompt); if(!!m_sKeyword && keyIndex) { INITGET_BEG(-1, m_sKeyword); try { nRetCode = drag(); } catch(...) { nRetCode=AcEdJig::kCancel; } INITGET_END(); } else { try { nRetCode = drag(); } catch(...) { nRetCode=AcEdJig::kCancel; } } nRetCode=GetRetCode(nRetCode, keyIndex); return nRetCode; } // 反馈 AcEdJig::DragStatus TVerticalSectionEdJig::sampler() { DragStatus stat; setUserInputControls((UserInputControls) (AcEdJig::kAccept3dCoordinates|AcEdJig::kNullResponseAccepted)); if (!!m_sKeyword) setKeywordList(m_sKeyword); else setKeywordList(NULL); XPoint ptTemp; stat = acquirePoint(ptTemp); if(stat == AcEdJig::kNormal) { if (ptTemp.Distance2d(m_ptResult)>_distSnap) { m_ptResult=ptTemp; } else return AcEdJig::kNoChange; } return stat; } void TVerticalSectionEdJig::UpdateRegion(XPoint ptTopLeft, double nWidth, double nHeight, double nAng) { XPoint ptBotLeft, ptBotRight, ptTopRight; ads_polar(ptTopLeft, nAng+PI/2, nHeight, ptBotLeft); ads_polar(ptBotLeft, nAng, nWidth, ptBotRight); ads_polar(ptTopLeft, nAng, nWidth, ptTopRight); m_entDraw.setPointAt(0, ptTopLeft); m_entDraw.setPointAt(1, ptBotLeft); m_entDraw.setPointAt(3, ptBotRight); m_entDraw.setPointAt(2, ptTopRight); } void TVerticalSectionEdJig::UpdateRegion2(XPoint ptTopLeft, double nWidth, double nHeight, double nAng) { XPoint ptBotLeft, ptBotRight, ptTopRight; ads_polar(ptTopLeft, nAng+PI, nWidth/4, ptTopLeft); ads_polar(ptTopLeft, nAng-PI/2, nHeight, ptBotLeft); ads_polar(ptBotLeft, nAng, nWidth/2, ptBotRight); ads_polar(ptTopLeft, nAng, nWidth/2, ptTopRight); m_entDraw.setPointAt(0, ptTopLeft); m_entDraw.setPointAt(1, ptBotLeft); m_entDraw.setPointAt(3, ptBotRight); m_entDraw.setPointAt(2, ptTopRight); } // 更新实体数据 Adesk::Boolean TVerticalSectionEdJig::update() { Adesk::Boolean bRet=Adesk::kTrue; ASSERT(!!m_idSheet); OPENOBJ_BEGIN(m_idSheet, AcDb::kForRead, TDbVerticalSection, pSheet) ASSERT(pSheet); double nWidth(0), nHeight(0); XPoint ptTopLeft; if(m_iMode == 0){ int nCol=pSheet->HitTestOnVS(m_ptResult, nWidth, nHeight, ptTopLeft); double dAng=pSheet->GetLayoutRotation(); if(nCol > -1) UpdateRegion(ptTopLeft, nWidth, nHeight, dAng); } else if(m_iMode == 1){ int nCol=pSheet->HitTestOnVS2(m_ptResult, nWidth, nHeight, ptTopLeft); double dAng=pSheet->GetLayoutRotation(); if(nCol > -1) UpdateRegion2(ptTopLeft, nWidth, nHeight, dAng); } OPENOBJ_END(); return bRet; } AcDbEntity* TVerticalSectionEdJig::entity() const { return (AcDbEntity *)(&m_entDraw); }