Files
envi-code/SourceCode/Code2026/tg_shs/shs_TwtKernal/FloorHoleOperation.cpp
T

600 lines
14 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#include "StdAfx.h"
#include "FloorHoleOperation.h"
#include "FloorHoleDlg.h"
#include "dbxutil.h"
#include "TFloorHoleLabelEdJig.h"
#include "dbray.h"
#include "DbEquipment.h"
void InsFloorHole()
{
CTemporaryResourceOverride vTemp;
//打开楼板洞设置对话框
CFloorHoleDlg floorHoleDlg(0,acedGetAcadFrame());
floorHoleDlg.Create(IDD_FLOOR_BASE);
floorHoleDlg.ShowWindow(SW_SHOW);
CFloorHoleOperation floorHoleOperation;
while (TRUE)
{
RBList rbMask = ads_buildlist(RTDXF0, _T("LINE"), NULL);
Entity entBaseLine1 , entBaseLine2, entWall;
XPoint ptBaseLine1, ptBaseLine2;
int nDist1 = 0, nDist2 = 0;
int dRet = SelectEntity1(_T("\n请选择基准线<自由布置>:"), entBaseLine1,ptBaseLine1,rbMask);
acdbUcs2Wcs(ptBaseLine1,ptBaseLine1,false);
ptBaseLine1 = asPnt3d(ptBaseLine1);
ads_point ptPick;
AcGePoint3d ptPick3d;
if ( dRet == RTNORM)
{
if (acedGetInt(_T("\n请输入楼板洞距基准线距离<退出>:"), &nDist1) != RTNORM)
{
continue;
}
if (SelectEntity1(_T("\n请选择基准线:"), entBaseLine2,ptBaseLine2,rbMask) != RTNORM)
{
continue;
}
acdbUcs2Wcs(ptBaseLine2,ptBaseLine2,false);
ptBaseLine2 = asPnt3d(ptBaseLine2);
if (acedGetInt(_T("\n请输入楼板洞距基准线距离<退出>:"), &nDist2) != RTNORM)
{
continue;
}
if (floorHoleOperation.CalcInsertPoint(floorHoleDlg, entBaseLine1, nDist1, entBaseLine2, nDist2, ptBaseLine1, ptBaseLine2))
{
floorHoleOperation.AddHole(floorHoleDlg, floorHoleOperation.m_ptInsert);
floorHoleOperation.AddLabel(floorHoleDlg, floorHoleOperation.m_ptInsert);
floorHoleOperation.AddDimLabel(floorHoleDlg, floorHoleOperation.m_ptBaseLine2, floorHoleOperation.m_ptInsert);
floorHoleOperation.AddDimLabel(floorHoleDlg, floorHoleOperation.m_ptBaseLine1, floorHoleOperation.m_ptInsert);
}
else
{
continue;
}
}
else if (dRet == RTNONE)
{
if(acedGetPoint(NULL,_T("\n请楼板洞插入位置<退出>"), ptPick) != RTNORM)
break;
ptPick3d = asPnt3d(ptPick);
ptPick3d = Ucs2Wcs(ptPick3d);
floorHoleOperation.AddHole(floorHoleDlg, ptPick3d);
floorHoleOperation.AddLabel(floorHoleDlg, ptPick3d);
}
else
{
break;
}
}
if (!floorHoleDlg.IsDestroy())
{
floorHoleDlg.DestroyWindow();
}
}
void MoveFlooorHole()
{
CFloorHoleOperation floorHoleOperation;
floorHoleOperation.MoveFloorHole();
}
CFloorHoleOperation::CFloorHoleOperation()
{
m_dLen1 = 0.0;
m_dLen2 = 0.0;
m_dRotation = Ucs2Wcs(0.0);
}
CFloorHoleOperation::~CFloorHoleOperation()
{
}
BOOL CFloorHoleOperation::AddHole(CFloorHoleDlg &floorHoleDlg, AcGePoint3d ptIns)
{
AcDbObjectId id2d = NULL;
CString sBlkName;
AcGeScale3d scale;
if (floorHoleDlg.m_nType == 0)
{
sBlkName = floorHoleDlg.m_wndArcHoleDlg.m_strInsBlkName;
scale.set(floorHoleDlg.getRadius() * 2, floorHoleDlg.getRadius() * 2, floorHoleDlg.getRadius() * 2);
}
else
{
sBlkName = floorHoleDlg.m_wndRectHoleDlg.m_strInsBlkName;
CString strW, strH;
floorHoleDlg.m_wndRectHoleDlg.m_cmbW.GetWindowText(strW);
floorHoleDlg.m_wndRectHoleDlg.m_cmbH.GetWindowText(strH);
scale.set(_tstof(strW), _tstof(strH), 1);
}
id2d = GetBlkIdByName(sBlkName);
if (!id2d.isValid())
{
return FALSE;
}
AcDbBlockReference *pRef = new AcDbBlockReference(ptIns, id2d);
// AcGeScale3d scale(floorHoleDlg.getRadius() * 2);
pRef->setScaleFactors(scale);
pRef->setRotation(m_dRotation);
pRef->setLayer(InitLayer(LAY_TWT_HOLE));
AcDbObjectId idRef = AddToCurrentSpace(pRef, Adesk::kTrue);
// ZXL 2013.07.10 ADD 添加扩展数据
ads_name ent;
acdbGetAdsName(ent, idRef);
CString sSpecType;
if (floorHoleDlg.m_nType == 0)
{
floorHoleDlg.m_wndArcHoleDlg.m_cmbDiameter.GetWindowText(sSpecType);
sSpecType = _T("%%c") + sSpecType;
}
else
{
CString strW, strH;
floorHoleDlg.m_wndRectHoleDlg.m_cmbW.GetWindowText(strW);
floorHoleDlg.m_wndRectHoleDlg.m_cmbH.GetWindowText(strH);
sSpecType = strW + _T("×") + strH;
}
WriteXdata(ent, _T("SpecType"), sSpecType);
acedUpdateDisplay();
actrTransactionManager->flushGraphics();
return TRUE;
}
BOOL CFloorHoleOperation::AddLabel(CFloorHoleDlg &floorHoleDlg, AcGePoint3d ptStart)
{
TDbSymbMultiLeader *pLeader = new TDbSymbMultiLeader;
if (pLeader != NULL)
{
CString strSuperscript, strSubscript;
if (floorHoleDlg.m_nType == 0)
{
strSuperscript = floorHoleDlg.getSuperscript();
strSubscript = floorHoleDlg.getSubscript();
}
else
{
floorHoleDlg.m_wndRectHoleDlg.m_cmbSuperscript.GetWindowText(strSuperscript);
floorHoleDlg.m_wndRectHoleDlg.m_edtSubscript.GetWindowText(strSubscript);
}
XPointList lstVertexes;
lstVertexes.Append(new XPoint(ptStart));
pLeader->SetLeaderVertexes(lstVertexes);
pLeader->SetLeaderPoint(ptStart);
pLeader->SetLayoutRotation(Ucs2Wcs(0.0));
pLeader->SetArrow(TDbSymbMultiLeader::kNone);
pLeader->SetTextAlign(TDbSymbMultiLeader::kAtMiddle);
AcDbObjectId idTextStyle = InitTwtTextStyle(g_csTwtDimStyle);
pLeader->SetTextStyleId(idTextStyle);
pLeader->SetTextLayerId(InitLayer(LAY_TEXT));
pLeader->SetTextHeight(g_nVPipeHeight);
pLeader->SetText1(strSuperscript);
pLeader->SetText2(strSubscript);
pLeader->SetTextBaseLen(pLeader->GetDefaultTextBaseLen() + 1);
TFloorHoleLabelEdJig jig(pLeader);
jig.SetDlgPtr(&floorHoleDlg);
jig.SetOperCode(TLeaderEdJig::kLeader);
jig.SetPrompt(_T("\n输入引线位置<退出>: "));
if(jig.DoIt()==RTNORM)
{
XPoint ptPick2 = pLeader->GetLeaderPoint();
lstVertexes.Reset();
lstVertexes.Append(new XPoint(ptStart));
pLeader->SetLeaderVertexes(lstVertexes);
pLeader->AddToCSpace(Adesk::kFalse);
pLeader->setLayer(LAY_VPIPE_DIM);
pLeader->close();
}
else
{
delete pLeader;
return Adesk::kFalse;
}
}
return Adesk::kTrue;
}
BOOL CFloorHoleOperation::CalcInsertPoint(CFloorHoleDlg &floorHoleDlg, Entity entBaseLine1, double nDist1, Entity entBaseLine2, double nDist2, XPoint ptBaseLine1, XPoint ptBaseLine2)
{
AcDbLine line1;
AcDbObjectId idLine1 = AcDbObjectId::kNull;
acdbGetObjectId(idLine1, entBaseLine1);
if (idLine1.isNull())
{
return FALSE;
}
AcDbLine *pLine1 = NULL;
acdbOpenObject(pLine1, idLine1, AcDb::kForRead);
if (pLine1 != NULL)
{
line1.setStartPoint(pLine1->startPoint());
line1.setEndPoint(pLine1->endPoint());
pLine1->close();
}
else
{
return FALSE;
}
AcDbLine line2;
AcDbObjectId idLine2 = AcDbObjectId::kNull;
acdbGetObjectId(idLine2, entBaseLine2);
if (idLine2.isNull())
{
return FALSE;
}
AcDbLine *pLine2 = NULL;
acdbOpenObject(pLine2, idLine2, AcDb::kForRead);
if (pLine2 != NULL)
{
line2.setStartPoint(pLine2->startPoint());
line2.setEndPoint(pLine2->endPoint());
pLine2->close();
}
else
{
return FALSE;
}
AcGePoint3dArray arPt;
line1.intersectWith(&line2, AcDb::kExtendBoth, arPt);
double dAng1 = 0.0, dAng2 = 0.0;
if (arPt.length() == 1)
{
AcGeVector3d vtr1 = ptBaseLine1 - arPt[0];
AcGeVector3d vtr2 = ptBaseLine2 - arPt[0];
vtr1.normalize();
vtr2.normalize();
// zxl 2013.07.09 add
dAng1 = vtr1.angleTo(AcGeVector3d::kXAxis, AcGeVector3d::kZAxis);
if (dAng1 >= PI)
{
dAng1 = fabs(dAng1 - PI * 2);
}
if (dAng1 > PI / 2)
{
dAng1 = fabs(dAng1 - PI);
}
dAng2 = vtr2.angleTo(AcGeVector3d::kXAxis, AcGeVector3d::kZAxis);
if (dAng2 >= PI)
{
dAng2 = fabs(dAng2 - PI * 2);
}
if (dAng2 > PI / 2)
{
dAng2 = fabs(dAng2 - PI);
}
double dAng = vtr1.angleTo(vtr2, AcGeVector3d::kZAxis);
if (dAng >= PI)
{
dAng = fabs(dAng - PI * 2);
}
if (dAng > PI / 2)
{
dAng = fabs(dAng - PI);
}
if (floorHoleDlg.m_nType == 1 && fabs(fabs(dAng) - PI / 2) > 0.001)
{
acedPrompt(_T("\n两根基线没有正交,请重新选择!"));
return FALSE;
}
if (floorHoleDlg.m_nType == 1)
{
CString strW, strH;
floorHoleDlg.m_wndRectHoleDlg.m_cmbW.GetWindowText(strW);
floorHoleDlg.m_wndRectHoleDlg.m_cmbH.GetWindowText(strH);
if (dAng2 - dAng1 > 0.001)
{
nDist2 += _tstof(strW) / 2;
nDist1 += _tstof(strH) / 2;
m_dLen1 = _tstof(strH) / 2;
m_dLen2 = _tstof(strW) / 2;
}
else if (dAng1 - dAng2 > 0.001)
{
nDist2 += _tstof(strH) / 2;
nDist1 += _tstof(strW) / 2;
m_dLen1 = _tstof(strW) / 2;
m_dLen2 = _tstof(strH) / 2;
}
else if (fabs(dAng2 - dAng1) < 0.001)
{
if ((vtr1[0] > 0 && vtr1[1] < 0) || (vtr1[0] < 0 && vtr1[1] > 0))
{
nDist2 += _tstof(strW) / 2;
nDist1 += _tstof(strH) / 2;
m_dLen1 = _tstof(strH) / 2;
m_dLen2 = _tstof(strW) / 2;
}
else
{
nDist2 += _tstof(strH) / 2;
nDist1 += _tstof(strW) / 2;
m_dLen1 = _tstof(strW) / 2;
m_dLen2 = _tstof(strH) / 2;
}
}
}
vtr1 = vtr1 * nDist2;
vtr2 = vtr2 * nDist1;
m_ptInsert = vtr1 + vtr2 + arPt[0];
}
else
{
return FALSE;
}
acdbOpenObject(pLine1, idLine1, AcDb::kForRead);
acdbOpenObject(pLine2, idLine2, AcDb::kForRead);
AcGePoint3d ptLine1, ptLine2;
if (pLine1 != NULL && pLine2 != NULL)
{
pLine2->getClosestPointTo(m_ptInsert, ptLine2);
m_ptBaseLine2 = ptLine2;
pLine1->getClosestPointTo(m_ptInsert, ptLine1);
m_ptBaseLine1 = ptLine1;
if (floorHoleDlg.m_nType == 1)
{
XPoint ptLoc = m_ptInsert, ptBase;
if (dAng2 - dAng1 > 0.001)
{
ptBase = m_ptBaseLine2;
}
else if (dAng1 - dAng2 > 0.001)
{
ptBase = m_ptBaseLine1;
}
m_dRotation = ads_angle(ptLoc, ptBase);
if (fabs(dAng2 - dAng1) < 0.001)
{
m_dRotation = - PI / 4;
}
}
pLine1->close();
pLine2->close();
}
else
{
if (pLine1 != NULL)
{
pLine1->close();
}
if (pLine2 != NULL)
{
pLine2->close();
}
return FALSE;
}
return TRUE;
}
void CFloorHoleOperation::AddDimLabel(CFloorHoleDlg &floorHoleDlg, XPoint ptStart, XPoint ptEnd)
{
XPoint ptLst;
if (floorHoleDlg.m_nType == 1)
{
AcGeVector3d vt = ptEnd - ptStart;
vt.normalize();
double dLen = 0.0;
if (ptStart.Distance2d(m_ptBaseLine1) < 0.001)
{
dLen = m_dLen1;
}
else
{
dLen = m_dLen2;
}
ptEnd = ptEnd - vt * dLen;
ptLst = ptEnd + vt * dLen * 2;
}
double m_dScale = 2.0;
TDbDimension2* pDim = new TDbDimension2;
pDim->setLayer(InitLayer(LAY_DIM));
pDim->SetPScale(g_nVPipeHeight*20);
pDim->SetLocation(ptStart);
pDim->SetStyleId(InitDimStyle(DS_LINEAR));
pDim->SetRotation(ads_angle(ptEnd, ptStart));
pDim->SetLayoutRotation(Ucs2Wcs(0.0));
CString sLabel;
pDim->AddSegment(ptStart);
pDim->AddSegment(ptEnd);
if (floorHoleDlg.m_nType == 1)
{
pDim->AddSegment(ptLst);
}
double dDist2DimLine = 0.0;
pDim->SetDist2DimLine(dDist2DimLine, FALSE);
TDimensionEdJig jig(pDim, _T("\n请点取尺寸线位置<退出>:"));
jig.m_nFlag=1;
if(jig.doIt() != RTNORM){
delete pDim;
return;
}
dDist2DimLine = pDim->GetDist2DimLine(FALSE);
AddToModelSpace(pDim, Adesk::kTrue);
}
void CFloorHoleOperation::MoveFloorHole()
{
g_ssPickFirst.Free();
XPushVar<int> vOrthoMode(_T("ORTHOMODE"), 1); //f8
RBList rbMask(RTDXF0, _T("INSERT"), 8, LAY_TWT_HOLE, NULL);
PickSet ss(SS_FREE);
if(SelectEntities(_T("\n请选择需要移动的设备<退出>"), ss, rbMask) != RTNORM)
{
return;
}
XPoint ptIns, ptTemp;
double x,y,z;
XPointList lstPT;
ss.GetExtend(ptIns, &x, &y, &z);
AcDbBlockReference *pRef = NULL;
AcDbObjectId idEnt = AcDbObjectId::kNull;
XPoint ptLoc;
for(long i = 0; i < ss.Length(); i++)
{
Entity ent = ss[i];
acdbGetObjectId(idEnt, ent);
if (idEnt.isValid())
{
acdbOpenObject(pRef, idEnt, AcDb::kForRead);
if (pRef != NULL)
{
ptLoc = pRef->position();
lstPT.NewAppend(ptLoc);
pRef->close();
}
}
}
XPoint ptUcs = Wcs2Ucs(ptIns);
ptUcs.z = 0;
int nRet = DragPickSet1(ss, ptUcs);
if(nRet != RTNORM)
return;
for(i = 0; i < ss.Length(); i++)
{
Entity ent = ss[i];
acdbGetObjectId(idEnt, ent);
if (!idEnt.isValid())
{
continue;
}
acdbOpenObject(pRef, idEnt, AcDb::kForRead);
if (pRef != NULL)
{
ptLoc = pRef->position();
PickSet ssDim(SS_FREE);
RBList rbMaskDim(RTDXF0, _T("ATS_DIMENSION2"), NULL);
XPoint ptOldLoc = *lstPT[i];
if(fabs(ptLoc.z - ptOldLoc.z) > 0.01)
{
ptLoc.z = ptOldLoc.z;
}
pRef->close();
ptOldLoc.z = 0;
GetPointPickSet(ptOldLoc, ssDim, rbMaskDim, 650);
long lenDim = ssDim.Length();
for(long i = 0; i < lenDim; i++)
{
Entity entDim = ssDim[i];
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbDimension2, pDim);
if(pDim)
{
AcGeVector3d vectTmp = ptLoc - ptOldLoc;
AcGePoint3dArray gripPoints;
AcDbIntArray osnapModes;
AcDbIntArray geomIds;
pDim->getGripPoints(gripPoints,osnapModes,geomIds);
int ptlen = gripPoints.length();
double dDist = pDim->GetDist2DimLine(FALSE);
int nIndex;
int n = 0;
for (n = 0; n < ptlen; n++)
{
XPoint pti = gripPoints[n];
double dDistTemp = ptOldLoc.Distance(pti);
if (fabs(fabs(dDist) - dDistTemp) < 1E-3)
{
nIndex = n;
break;
}
}
for (n = 0; n < ptlen; n++)
{
XPoint pti = gripPoints[n];
if(pti == ptOldLoc)
{
AcDbIntArray indices;
indices.append(n);
pDim->moveGripPointsAt(indices, vectTmp);
indices.setLogicalLength(0);
indices.append(nIndex);
pDim->moveGripPointsAt(indices, vectTmp);
break;
}
}
}
OPENOBJ_END();
}
RBList rbMaskLabel(RTDXF0, _T("ATS_MULTILEADER"), NULL);
ptOldLoc.z = 0;
GetPointPickSet(ptOldLoc, ssDim, rbMaskLabel, 650);
long lenLabel = ssDim.Length();
if (lenLabel == 1)
{
Entity entDim = ssDim[0L];
OPENOBJ_BEGIN(entDim, AcDb::kForWrite, TDbSymbMultiLeader, pLeader);
if(pLeader)
{
AcGeVector3d vectTmp(ptLoc.x - ptOldLoc.x, ptLoc.y - ptOldLoc.y, 0);
AcGeMatrix3d mat;
mat.setToTranslation(vectTmp);
pLeader->transformBy(mat);
}
OPENOBJ_END();
}
}
}
}