Files
envi-code/SourceCode/Code2026/tg_shs/shs_TwtAnotate/SinglePipeElevation.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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();
}
}
}
}