#include "stdafx.h" #include "TipWnd.h" #include "PipeElevationDlg.h" #include "DbWell.h" //*************************************************************************************************** // 单管标高 //*************************************************************************************************** extern void DimPipeElevation(Entity ent, XPoint ptLoc); void DoModifyPipeElevation(Entity entSel, XPoint ptPick) { CPoint ptDwgView; int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); /// ptPick = Ucs2Wcs(ptPick); acedCoordFromWorldToPixel(cvport, ptPick, ptDwgView); CTemporaryResourceOverride vTmp; CString csText; XPoint pt1, pt2; GetPipePoint(entSel, pt1, pt2); if(fabs(pt1.z - pt2.z) < _distSnap) csText.Format(_T("%.3f"), pt1.z/1000); else return; InitSheetHook(TRUE); CEdit *pEdit = new CEdit(); pEdit->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP |WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN, CRect(ptDwgView.x, ptDwgView.y,ptDwgView.x+100,ptDwgView.y +20), acedGetAcadDwgView(), IDC_USER_SHEET_EDIT); pEdit->SetWindowText(csText); int lenText = csText.GetLength(); pEdit->SetSel(0, lenText); pEdit->SetFocus(); int nKey, ret; ads_prompt(_T("\n请在编辑框内输入新的管线标高<回车键完成, ESC键退出>")); while(1){ ret = ads_getint(_T(""), &nKey); if(ret == RTNONE && g_nKey != 0) { if(g_nKey == VK_ESCAPE) break; if(g_nKey == VK_RETURN){ //|| g_nKey == VK_RBUTTON CString csTmp; pEdit->GetWindowText(csTmp); double nEle = _tstof(csTmp); OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe){ DList lstAttachment; pPipe->assertWriteEnabled(); pPipe->StartPoint().z = nEle*1000; pPipe->EndPoint().z = nEle*1000; pPipe->GetAttachments(lstAttachment); int len = lstAttachment.Length(); for(int m=0;mGetLocation(); ptLoc.z = nEle*1000; pValve->SetLocation(ptLoc); } OPENOBJ_END(); } } OPENOBJ_END(); // cet 2013.4.28 add 更新管线关联的标高标注 UpdateElevationDim(entSel); break; } } else if(ret == RTCAN) break; } InitSheetHook(FALSE); if(pEdit) pEdit->DestroyWindow(); delete pEdit; } void SetPipeElevation() { RBList rbMask(RTDXF0, _T("ATS_PIPE,ATS_DOUBLELINEPIPE"), 8, _T("*"), NULL); int type, oldcol(-1); XPoint pt1,pt2; CTipWnd *pTextDlg = NULL; Entity entTag; BOOL bFirst = TRUE; int pickbox; double dMeter(1); if(!DocGetMeterUnitDraw()) dMeter = 1000; PickSet ssAll(SS_FREE); VERIFY(xg_getvar(_T("PICKBOX"), &pickbox)==RTNORM); ads_prompt(_T("\n请选择管线(右键进行标高修改,左键对选中管线标高标注)<退出>:")); for (;;) { resbuf result; type = 2; if (ads_grread(5,&type,&result) != RTNORM) break; if (type != 5 && type!=3 && type!=12 && type!=11 && type!=25) { int dd = type; break; } pt1[0] = result.resval.rpoint[0]; pt1[1] = result.resval.rpoint[1]; pt1[2] = 0.0; if(type==11 || type==25) {//右键进行编辑 PickSet s(SS_FREE); if (ads_ssget(NULL,pt1,NULL,NULL,s) == RTNORM ) { entTag = s[0L]; if(!entTag.MatchBase(rbMask)) continue; if (pTextDlg) { pTextDlg->DestroyWindow(); delete pTextDlg; pTextDlg = NULL; } if(IsPipeVertical(entTag)){ CTemporaryResourceOverride vTemp; CPipeElevationDlg dlg; XPoint ps, pe; GetPipePoint(entTag, ps, pe); dlg.m_nS = ps.z/dMeter; dlg.m_nE = pe.z/dMeter; if(dlg.DoModal() != IDOK) return; ps.z = dlg.m_nS*dMeter; pe.z = dlg.m_nE*dMeter; OPENOBJ_BEGIN(entTag, AcDb::kForWrite, TDbPipe, pPipe); if(pPipe){ pPipe->SetStartPoint(ps); pPipe->SetEndPoint(pe); } OPENOBJ_END(); } else DoModifyPipeElevation(entTag, Ucs2Wcs(pt1)); } break; } else if(type == 3){ PickSet s(SS_FREE); if (ads_ssget(NULL,pt1,NULL,NULL,s) == RTNORM ) { entTag = s[0L]; if(!entTag.MatchBase(rbMask)) continue; if (pTextDlg) { pTextDlg->DestroyWindow(); delete pTextDlg; pTextDlg = NULL; } if(!IsPipeVertical(entTag)){ DimPipeElevation(entTag, Ucs2Wcs(pt1)); } } break; } if (ads_distance(pt1,pt2) > 0.1) { if (pTextDlg) { pTextDlg->DestroyWindow(); delete pTextDlg; pTextDlg = NULL; } PickSet s(SS_FREE); if (ads_ssget(NULL,pt1,NULL,NULL,s) != RTNORM ) { continue; } Groups g1(1), g0(0); ads_trans(XPoint(pt1), (resbuf *)&g1, (resbuf *)&g0, 0, pt1); // 构造WCS到Dcs的转换矩阵 AcGeMatrix3d transWcsToDcs; XPoint xAxesWcs(1,0,0), yAxesWcs(0,1,0), zAxesWcs(0,0,1), xAxesDcs, yAxesDcs, zAxesDcs; XPoint ptOrginWcs(0,0,0), ptOrginDcs(0,0,0); Groups fromWcs(0), toDcs(2); ads_trans(ptOrginWcs, (resbuf *)&fromWcs, (resbuf *)&toDcs, 0, ptOrginDcs); ads_trans(xAxesWcs, (resbuf *)&fromWcs, (resbuf *)&toDcs, 1, xAxesDcs); ads_trans(yAxesWcs, (resbuf *)&fromWcs, (resbuf *)&toDcs, 1, yAxesDcs); ads_trans(zAxesWcs, (resbuf *)&fromWcs, (resbuf *)&toDcs, 1, zAxesDcs); transWcsToDcs.setCoordSystem(ptOrginDcs, xAxesDcs, yAxesDcs, zAxesDcs); double nMinDist=0.0; Entity entNearest; long lCount=s.Length(); for(long i=0L; igetOsnapPoints(AcDb::kOsModeNear, 0, pt1, ptTemp, transWcsToDcs, points, ar); XPoint ptNear; if(!GetNearestPoint(points, pt1, ptNear)) continue; ptNear.z=pt1.z; double nDist=ptNear.Distance(pt1); if(!entNearest || nDist0) entNearest=s[0L]; if(!entNearest) continue; } DList lstInfo; if(entNearest.MatchBase(rbMask)){ XPoint ptS, ptE; GetPipePoint(entNearest, ptS, ptE); if(fabs(ptS.z - ptE.z) < _distSnap){ CBlockStruct *pInfo = new CBlockStruct(); pInfo->m_csRecord = _T("管线标高"); pInfo->m_csDesName.Format(_T("%.3f米"), ptS.z/dMeter); lstInfo.Append(pInfo); } else{ CBlockStruct *pInfo = new CBlockStruct(); pInfo->m_csRecord = _T("起点标高"); pInfo->m_csDesName.Format(_T("%.3f米"), ptS.z/dMeter); lstInfo.Append(pInfo); CBlockStruct *pInfo2 = new CBlockStruct(); pInfo2->m_csRecord = _T("终点标高"); pInfo2->m_csDesName.Format(_T("%.3f米"), ptE.z/dMeter); lstInfo.Append(pInfo2); OPENOBJ_BEGIN(entNearest, AcDb::kForRead, TDbPipe, pPipe); if(pPipe){ if(!pPipe->IsVertical()) { //有坡度的管线 double dGradient = pPipe->GetPipeGradient(); if(fabs(dGradient) > 0.00001) { CBlockStruct *pInfo3 = new CBlockStruct(); pInfo3->m_csRecord = _T("坡度:"); pInfo3->m_csDesName.Format(_T("%.3f"), dGradient); lstInfo.Append(pInfo3); AcGePoint3d ptNearPipe; pPipe->getClosestPointTo(pt1, AcGeVector3d::kZAxis, ptNearPipe); CBlockStruct *pInfo4 = new CBlockStruct(); pInfo4->m_csRecord = _T("管中标高"); pInfo4->m_csDesName.Format(_T("%.3f米"), ptNearPipe.z/dMeter); lstInfo.Append(pInfo4); double dDn = pPipe->GetDnDiameter(); CBlockStruct *pInfo5 = new CBlockStruct(); pInfo5->m_csRecord = _T("管底标高"); if(DocGetMeterUnitDraw()) pInfo5->m_csDesName.Format(_T("%.3f米"), ptNearPipe.z - dDn/2000.0); else pInfo5->m_csDesName.Format(_T("%.3f米"), ptNearPipe.z/dMeter - dDn/2000.0); lstInfo.Append(pInfo5); } } } OPENOBJ_END(); } } else continue; if(!pTextDlg){ CPoint pt; int cvport; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); acedCoordFromWorldToPixel(cvport, pt1, pt); acedGetAcadDwgView()->ClientToScreen(&pt); acedGetAcadFrame()->ScreenToClient(&pt); pTextDlg = new CTipWnd(); pTextDlg->Create(lstInfo, pt.x+pickbox*2, pt.y+pickbox*2, acedGetAcadFrame()); acedGetAcadDwgView()->SetFocus(); } } } if(pTextDlg){ pTextDlg->DestroyWindow(); delete pTextDlg; } SHads_command(RTSTR, _T(".REDRAW"), RTNONE); } //*************************************************************************************************** // 修改标高 //*************************************************************************************************** void EditElevation() { Entity entSel; RBList rbMask(RTDXF0, _T("ATS_ELEVATION"), 8, _T("*"), NULL); if(SelectEntity(_T("\n请选择要修改的标高<退出>:"), entSel, rbMask) != RTNORM) return; XString sText, sText2; double nLastElev(0); XPoint ptLast; OPENOBJ_BEGIN(entSel, AcDb::kForRead, TDbSymbElevation, pElev); if(pElev){ sText = pElev->GetText(); adsout << _T("\n标高文字<") << sText << _T(">: "); if(ads_getstring(0, _T(""), sText2)!=RTNORM || sText2 == sText || _tcsicmp(sText2, _T("")) == 0) return; if(pElev->upgradeOpen()==Acad::eOk) { pElev->SetText(sText2); ptLast = pElev->GetLocation(); nLastElev = _tstof(sText2); pElev->downgradeOpen(); } } OPENOBJ_END(); PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择需要联动修改的标高<退出>:"), ss, rbMask) != RTNORM) return; ss -= entSel; for(long i=0;iGetLocation(); XString sText1(_T("%.3f"), nLastElev+_AS_METER(ptLoc.y-ptLast.y)); pElev->SetText(sText1); } OPENOBJ_END(); } } //*************************************************************************************************** // 显示标高 //*************************************************************************************************** int g_bShowElevation = FALSE; int GetPipeEleState() { ads_retint(g_bShowElevation); return RTNORM; } int SetPipeEleState() { PostCommand(_T("xsbg "), false); return RTNORM; } void ShowPipeElevation() //显示标高 { RBList rbMaskPipe(RTDXF0, _T("ATS_PIPE,ATS_WELL"), 8, _T("*"), NULL); PickSet ss(SS_FREE); ss.Get(_T("X"), NULL, NULL, rbMaskPipe); int len = ss.Length(); g_bShowElevation = !g_bShowElevation; for(long i=0;iIsVertical()){ pPipe->DrawPropertyText(g_bShowElevation); } OPENOBJ_END(); OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbWell, pWell); if(pWell){ pWell->DrawPropertyText(g_bShowElevation); } OPENOBJ_END(); } SHads_command(RTSTR, _T("REGEN"), RTNONE); //更快一些 } //*************************************************************************************************** // 改变流向 //*************************************************************************************************** void ChangePipeDirection() { g_ssPickFirst.Free(); RBList rbMaskDim(RTDXF0, _T("ATS_ARROW"), NULL); RBList rbMask(RTDXF0, _T("ATS_PIPE"), 8, GetLayerNames(_T("管线")), NULL); PickSet ss(SS_FREE); if(SelectEntities(_T("\n请选择要改变流向的管线:<退出>"), ss, rbMask) != RTNORM) return; for(long i=0;iGetPipeGradient(); if(nGradient > 1) nGradient = 0; nLen = pPipe->Length(); // if(!DocGetMeterUnitDraw()) // nLen = nLen / 1000; AcDbObjectId idPipe = pPipe->objectId(); AcDbHandle handle = idPipe.handle(); TCHAR szHandle[17]=_T(""); handle.getIntoAsciiBuffer(szHandle); csPipeName = szHandle; TPipeSys::FlowDirection dir = pPipe->GetFlowDir(); if(dir == TPipeSys::kFromStart) pPipe->SetFlowDir(TPipeSys::kFromEnd); else pPipe->SetFlowDir(TPipeSys::kFromStart); } OPENOBJ_END(); // if(nGradient < 0.00001) // continue; XPoint ptStart, ptEnd, ptText; GetPipePoint(ent, ptStart, ptEnd, ptText); XPoint ptUcs = Wcs2Ucs(ptText); PickSet ss(SS_FREE); XPoint ptTemp1, ptTemp2; ptTemp1.x = ptUcs.x - nLen*1000; ptTemp1.y = ptUcs.y + nLen*1000; ptTemp2.x = ptUcs.x + nLen*1000; ptTemp2.y = ptUcs.y - nLen*1000; ptTemp1.z = 0; ptTemp2.z = 0; ss.Get(_T("C"), ptTemp1, ptTemp2, rbMaskDim); long len1 = ss.Length(); for(long j=0;jGetPoly2D(poly); if(poly.Length() == 2){ XPoint pt1 = *poly[0]; XPoint pt2 = *poly[1]; XPoly2D poly2; poly2.AppendNode(pt2); poly2.AppendNode(pt1); pDim->SetPoly2D(poly2); } } OPENOBJ_END(); } } } }