465 lines
14 KiB
C++
465 lines
14 KiB
C++
#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<AcDbObjectId> lstAttachment;
|
|
pPipe->assertWriteEnabled();
|
|
pPipe->StartPoint().z = nEle*1000;
|
|
pPipe->EndPoint().z = nEle*1000;
|
|
pPipe->GetAttachments(lstAttachment);
|
|
int len = lstAttachment.Length();
|
|
for(int m=0;m<len;m++){
|
|
AcDbObjectId idTmp = *lstAttachment[m];
|
|
OPENOBJ_BEGIN(idTmp, AcDb::kForWrite, TDbPipeAttachment, pValve);
|
|
if(pValve){
|
|
XPoint ptLoc = pValve->GetLocation();
|
|
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; i<lCount; i++) {
|
|
Entity ent=s[i];
|
|
if(!ent.MatchBase(rbMask))
|
|
continue;
|
|
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
|
|
if(!pEnt)
|
|
continue;
|
|
AcGePoint3dArray points;
|
|
XPoint ptTemp;
|
|
AcDbIntArray ar;
|
|
pEnt->getOsnapPoints(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 || nDist<nMinDist) {
|
|
entNearest=ent;
|
|
nMinDist=nDist;
|
|
}
|
|
OPENOBJ_END();
|
|
}
|
|
if(!entNearest) {
|
|
if(lCount>0)
|
|
entNearest=s[0L];
|
|
if(!entNearest)
|
|
continue;
|
|
}
|
|
DList<CBlockStruct> 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;i<ss.Length();i++){
|
|
Entity ent = ss[i];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSymbElevation, pElev);
|
|
if(pElev){
|
|
XPoint ptLoc = pElev->GetLocation();
|
|
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;i<ss.Length();i++){
|
|
Entity ent = ss[i];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbPipe, pPipe);
|
|
if(pPipe && !pPipe->IsVertical()){
|
|
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;i<ss.Length();i++){
|
|
Entity ent = ss[i];
|
|
double nLen(0);
|
|
CString csPipeName;
|
|
double nGradient(0);
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbPipe, pPipe);
|
|
if(pPipe){
|
|
nGradient = pPipe->GetPipeGradient();
|
|
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;j<len1;j++){
|
|
Entity entTmp = ss[j];
|
|
CString csTmp = ReadXdata(entTmp, _T("TG-BINDPIPE"));
|
|
if(csPipeName == csTmp){
|
|
OPENOBJ_BEGIN(entTmp, AcDb::kForWrite, TDbSymbArrow, pDim);
|
|
if(pDim){
|
|
XPoly2D poly;
|
|
pDim->GetPoly2D(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();
|
|
}
|
|
}
|
|
}
|
|
}
|