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

672 lines
19 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "StdAfx.h"
#include "LayFireExtinguisherDlg.h"
#include "FireExtinguisherJig.h"
#include "DbEquipment.h"
#include "DbFireExtinguisher.h"
#include "AcDbObjectPtr.h"
#include "globalFunc.h"
#include "layerdef.h"
#include "RBGroups.h"
extern AcDbObjectId InitLayer(const TCHAR *szLayer, AcDbDatabase *pDb = NULL);
extern XCurveSegment GetEntitySegByPt(XPoint &ptPick, Entity &entWall, AcGeMatrix3d &mat);
void FireExtinguisherEditCmd()
{
GlobalFunc::DocGetPickFirst().Free();
PickSet ss;
RBList rbMask(RTDXF0, _T("AEC_ZT_EQUIPMENT"), 8, LAY_TWT_EXTINGUISHER, NULL);
int nRet = GlobalFunc::SelectEntities(_T("\n请选择要修改的灭火器:<退出>"), ss, rbMask);
if (nRet != RTNORM)
{
return;
}
CTemporaryResourceOverride vTemp;
CLayFireExtinguisherDlg dlg(2);
dlg.SetPickset(ss);
dlg.DoModal();
}
int EditFireExtinguisher(AcDbObjectId id)
{
if(!id)
return RTERROR;
CString sBlkName, sPec;
int nNum = 0;
double dScale = 0.0;
double dRadius = 0.0;
bool bDim = false;
bool bAutoScale = true;
AcDbObjectId idTextStyle;
double dTextHeight = 0.0;
CString sGrade;
int nScaleType = 0;
int nSpecType = -1;
OPENOBJ_BEGIN(id, AcDb::kForRead, CDbFireExtinguisher, pFireExt);
if(pFireExt != NULL)
{
sBlkName = GlobalFunc::GetBlkNameById(pFireExt->GetBlock2d());
sPec = pFireExt->GetSpec();
nNum = pFireExt->GetNum();
dScale = pFireExt->GetScale();
dRadius = pFireExt->GetProtectRadius();
bDim = pFireExt->GetIsDim();
idTextStyle = pFireExt->GetTextStyleId();
dTextHeight = pFireExt->GetTextHeight();
sGrade = pFireExt->GetGrade();
nScaleType = pFireExt->GetScaleType();
nSpecType = pFireExt->GetSpecificationType();
}
OPENOBJ_END();
CTemporaryResourceOverride vTemp;
CLayFireExtinguisherDlg dlg(1);
dlg.SetScale(dScale);
dlg.SetTextHeight(dTextHeight);
dlg.m_sProtectRadius.Format(_T("%.2f"), dRadius);
if (dlg.m_sProtectRadius.Find(_T(".")) > -1)
{
dlg.m_sProtectRadius.TrimRight(_T("0"));
dlg.m_sProtectRadius.TrimRight(_T("."));
}
dlg.SetCount(nNum);
dlg.GetSpecTypeByBlkName(sBlkName);
dlg.m_sSpecification = sPec;
dlg.m_sGrade = sGrade;
dlg.m_nScale = nScaleType;
dlg.m_nSpecificationType = nSpecType;
if (bDim)
{
dlg.m_nDimType = 0;
}
else
{
dlg.m_nDimType = 1;
}
OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle);
ASSERT(pStyle);
const TCHAR* pName = NULL;
if (pStyle->getName(pName) == Acad::eOk && pName != NULL)
dlg.m_sTextStyle = pName;
OPENOBJ_END();
if (dlg.DoModal() != IDOK)
{
return RTNORM;
}
OPENOBJ_BEGIN(id, AcDb::kForWrite, CDbFireExtinguisher, pFireExt);
if(pFireExt != NULL)
{
sBlkName = dlg.GetSelBlkName();
AcDbObjectId id = GlobalFunc::GetBlkIdByName(sBlkName);
if (!id.isValid())
{
CString sBlkNum;
CString sDwb = g_csDwbPath + _T("TwtSys");
int nIndex = sBlkName.ReverseFind(_T('$'));
if (nIndex != -1)
{
int nSize = sBlkName.GetLength();
sBlkNum = sBlkName.Right(nSize - nIndex - 1);
}
XString xsTmp;
if(GlobalFunc::LoadDwbBlock(sDwb, sBlkNum, xsTmp) != RTNORM)
{
return false;
}
}
pFireExt->SetBlock2d(GlobalFunc::GetBlkIdByName(sBlkName));
pFireExt->SetSpec(dlg.m_sSpecification);
pFireExt->SetNum(dlg.GetCount());
double dScale = dlg.GetScale();
pFireExt->SetScale(dScale);
pFireExt->SetProtectRadius(_tstof(dlg.m_sProtectRadius));
pFireExt->SetIsDim(dlg.IsDim() ? true : false);
pFireExt->SetTextStyleId(GlobalFunc::GetTextStyleId(dlg.m_sTextStyle));
pFireExt->SetTextHeight(_tstof(dlg.m_sTextHeight));
pFireExt->SetGrade(dlg.m_sGrade);
pFireExt->SetScaleType(dlg.m_nScale);
pFireExt->SetSpecificationType(dlg.m_nSpecificationType);
}
OPENOBJ_END();
return 1;
}
// 图块大小
static void GetBlkSize(const AcDbObjectId &idBlk, const AcGeScale3d &scale, double &dWidth, double &dHeight)
{
AcGePoint3d ptIns = AcGePoint3d::kOrigin;
AcDbBlockReference blkRef(ptIns, idBlk);
blkRef.setScaleFactors(scale);
AcDbExtents extent;
blkRef.getGeomExtents(extent);
AcGePoint3d ptMin = extent.minPoint();
AcGePoint3d ptMax = extent.maxPoint();
dWidth = ptMax.x - ptMin.x;
dHeight = ptMax.y - ptMin.y;
}
static bool GetBlkSize(const CString &sBlkName, const AcGeScale3d &scale, double &dWidth, double &dHeight)
{
AcDbObjectId idBlk = GlobalFunc::GetBlockIdFromString(sBlkName);
if (idBlk.isNull())
{
// 加载灭火器图块
CString sDwb = g_csDwbPath + _T("TwtSys");
CString sBlkNum;
int nIndex = sBlkName.ReverseFind(_T('$'));
if (nIndex != -1)
{
int nSize = sBlkName.GetLength();
sBlkNum = sBlkName.Right(nSize - nIndex - 1);
}
XString xsTmp;
if(GlobalFunc::LoadDwbBlock(sDwb, sBlkNum, xsTmp) != RTNORM)
{
return false;
}
// 重新获取图块id
idBlk = GlobalFunc::GetBlockIdFromString(sBlkName);
if (idBlk.isNull())
{
return false;
}
}
GetBlkSize(idBlk, scale, dWidth, dHeight);
return true;
}
// 图块插入点距图块0度时外包框底边的距离 cet 2013.4.8 add
double GetPtinsToExtentBottomDist(const CString &sBlkName)
{
AcDbObjectId idBlk = GlobalFunc::GetBlockIdFromString(sBlkName);
if (idBlk.isNull())
{
// 加载灭火器图块
CString sDwb = g_csDwbPath + _T("TwtSys");
CString sBlkNum;
int nIndex = sBlkName.ReverseFind(_T('$'));
if (nIndex != -1)
{
int nSize = sBlkName.GetLength();
sBlkNum = sBlkName.Right(nSize - nIndex - 1);
}
XString xsTmp;
if(GlobalFunc::LoadDwbBlock(sDwb, sBlkNum, xsTmp) != RTNORM)
{
return 0.0;
}
return GetPtinsToExtentBottomDist(sBlkName);
}
AcGePoint3d ptIns = AcGePoint3d::kOrigin;
AcDbBlockReference blkRef(ptIns, idBlk);
AcDbExtents extent;
if (blkRef.getGeomExtents(extent) != Acad::eOk)
{
return 0.0;
}
return fabs(extent.minPoint().y);
}
void AddToCurSpace(CLayFireExtinguisherDlg &dlg, CDbFireExtinguisher &fireExtinguisher)
{
// 灭火器数量
int nNum = dlg.GetCount();
if (nNum <= 0)
{
return;
}
CDbFireExtinguisher *pFireExtinguisher = new CDbFireExtinguisher;
pFireExtinguisher->SetNum(nNum);
CString sBlkName = dlg.GetSelBlkName();
//插入点
int nLayDimType = dlg.GetLayDimType();
pFireExtinguisher->SetLayType(nLayDimType);
AcGePoint3d ptIns = fireExtinguisher.GetLocation();
pFireExtinguisher->SetLocation(ptIns);
CString sProtectRadius, sSpecification;
sProtectRadius.Format(_T("%.3f"), fireExtinguisher.GetProtectRadius());
pFireExtinguisher->SetProtectRadius(_tstof(sProtectRadius));
sSpecification = dlg.GetSpecification();
pFireExtinguisher->SetSpec(sSpecification);
pFireExtinguisher->setLayer(InitLayer(LAY_TWT_EXTINGUISHER));
// 文字
pFireExtinguisher->SetIsDim(dlg.IsDim() ? true : false);
pFireExtinguisher->SetDimTextPos(fireExtinguisher.GetDimTextPos());
pFireExtinguisher->SetTextStyleId(GlobalFunc::GetTextStyleId(dlg.GetTextStyle()));
pFireExtinguisher->SetTextHeight(dlg.GetTextHeight());
double dScale = fireExtinguisher.GetScale();
double dAngle = fireExtinguisher.GetAngle();
pFireExtinguisher->SetAngle(dAngle);
pFireExtinguisher->SetScale(dScale);
pFireExtinguisher->SetScaleType(dlg.m_nScale);
pFireExtinguisher->SetGrade(dlg.m_sGrade);
pFireExtinguisher->SetTextRotation(fireExtinguisher.GetTextRotation());
pFireExtinguisher->SetTextAlignment(fireExtinguisher.GetTextAlignment());
pFireExtinguisher->SetLabelLoc(fireExtinguisher.GetLabelLoc());
pFireExtinguisher->SetTextLayer(InitLayer(LAY_TWT_EXTINGUISHER_TEXT));
pFireExtinguisher->SetBlock2d(GlobalFunc::GetBlkIdByName(sBlkName));
pFireExtinguisher->SetSpecificationType(dlg.m_nSpecificationType);
GlobalFunc::AddToCurrentSpace(pFireExtinguisher, Adesk::kTrue);
//AcDbObjectId id = pFireExtinguisher->AddToCSpace(Adesk::kTrue);
}
void LayFireExtinguisher(Entity &entHydrant, CDbFireExtinguisher &entPreview, CLayFireExtinguisherDlg *pDlg)
{
if (pDlg == NULL)
{
return;
}
// 消火栓出入点,角度,尺寸
AcDbObjectId idBlock2d;
XPoint ptLoc;
double dScaleX = 0.0, dScaleY = 0.0, dAngle = 0.0;
BOOL bMirrorX = FALSE;
OPENOBJ_BEGIN(entHydrant, AcDb::kForRead, CDbEquipment, pEuip);
if (pEuip != NULL)
{
idBlock2d = pEuip->GetBlock2d();
//ptLoc = pEuip->GetLocation();// zxl 2013.12.25 modify 改为设备基点,自动比例时,灭火器也要按照对应比例
ptLoc = pEuip->GetInsert();
if (pEuip->IsAutoScale())
{
dScaleX = pEuip->GetScale() * pEuip->GetPScale() / 100;
dScaleY = pEuip->GetYScale() * pEuip->GetPScale() / 100;
}
else
{
dScaleX = pEuip->GetScale();
dScaleY = pEuip->GetYScale();
}
dAngle = pEuip->GetAngle();
bMirrorX = pEuip->IsMirrorByX();
}
OPENOBJ_END();
if (idBlock2d.isNull() && !ptLoc)
{
return;
}
double dWidth = 0.0, dHeight = 0.0;
AcGeScale3d scale(dScaleX, dScaleY, 1);
GetBlkSize(idBlock2d, scale, dWidth, dHeight);
// 布置灭火器
entPreview.SetDimTextPos(true);
if (bMirrorX) // 沿x轴镜像
{
dAngle += PI;
}
AcGeVector3d vtDir = AcGeVector3d::kXAxis;
vtDir.rotateBy(dAngle + PI/2, AcGeVector3d::kZAxis);
dAngle = GlobalFunc::Wcs2Ucs(dAngle);
dAngle = GlobalFunc::AngleRangeTo2PI(dAngle);
double dDist = 0.0;
// 考虑图块插入点距图块外包框底边的高差 cet 2013.4.8 add
double dScale = pDlg->GetScale() /** DocGetPScale() / 100*/; // 指定比例 cet 2013.4.8 modify // zxl 2013.12.25 modify
if (pDlg->m_nScale == 0)
{
dScale = pDlg->GetScale() * GlobalFunc::DocGetPScale() / 100;
}
dDist = GetPtinsToExtentBottomDist(pDlg->GetSelBlkName()) * dScale;
CString sBlkName = pDlg->GetSelBlkName();
double dWidth2 = 0.0, dHeight2 = 0.0;
double dTemp = pDlg->GetScale();
AcGeScale3d scale2(dScale, dScale, 1);
if (!GetBlkSize(sBlkName, scale2, dWidth2, dHeight2))
{
return;
}
entPreview.SetDimTextPos(true);
if (dAngle > PI / 2 + 0.001 && dAngle < PI * 1.5 + 0.001 && pDlg->GetLayPos() == 1) // [PI, PI * 2)
{
dDist = dHeight2 - dDist; // 180度旋转图块,移动距离
dAngle += PI;
dAngle = GlobalFunc::AngleRangeTo2PI(dAngle);
entPreview.SetDimTextPos(false);
}
dAngle = GlobalFunc::Ucs2Wcs(dAngle);
dAngle = GlobalFunc::AngleRangeTo2PI(dAngle);
entPreview.SetAngle(dAngle);
AcGePoint3d ptIns = ptLoc + vtDir * (dHeight * 0.5 + dDist); // 灭火器与消火栓间距为消火栓宽度的高度的一半 // cet 2013.4.8 moidfy 紧贴消火栓
entPreview.SetLocation(ptIns);
XPoint ptTextIns;
vtDir = AcGeVector3d::kXAxis;
vtDir.rotateBy(dAngle, AcGeVector3d::kZAxis);
if (pDlg->GetLayDimType() == 0) // 按数量布置
{
if (!entPreview.GetDimTextPos())
{
vtDir.rotateBy(-PI/2, AcGeVector3d::kZAxis);
ptTextIns = ptIns + vtDir * pDlg->GetTextHeight() * GlobalFunc::DocGetPScale();
}
else
{
vtDir.rotateBy(PI/2, AcGeVector3d::kZAxis);
ptTextIns = ptIns + vtDir * dHeight2 * 1.2;
}
}
else // 单布
{
ptTextIns = ptIns + vtDir * dWidth2 * 0.7;
}
dAngle = GlobalFunc::Wcs2Ucs(dAngle);
if(pDlg->GetLayDimType() != 0)
{
if (dAngle - 7 * PI / 4 < 0.001 && dAngle - PI * 3 / 4 > 0.001)
{
ptTextIns = ptIns - vtDir * dWidth2 * 0.7;
}
else
{
ptTextIns = ptIns + vtDir * dWidth2 * 0.7;
}
}
double dAngUcs = dAngle;
AcGiViewDraw::TextAlignment align = AcGiViewDraw::kBottomCenter;
if (dAngUcs - 7 * PI / 4 < 0.001 && dAngUcs - PI * 3 / 4 > 0.001)
{
dAngUcs -= PI;
if (pDlg->GetLayDimType() == 1)
{
align = AcGiViewDraw::kTopLeft;
}
else
{
align = AcGiViewDraw::kTopCenter;
if (!entPreview.GetDimTextPos())
{
align = AcGiViewDraw::kBottomCenter;
}
}
}
else
{
if (pDlg->GetLayDimType() == 1)
{
align = AcGiViewDraw::kBottomLeft;
}
else
{
align = AcGiViewDraw::kBottomCenter;
}
}
entPreview.SetTextRotation(GlobalFunc::Ucs2Wcs(dAngUcs));
entPreview.SetTextAlignment(align);
entPreview.SetLabelLoc(ptTextIns);
entPreview.SetLayType(pDlg->GetLayDimType());
entPreview.SetScale(pDlg->GetScale()); // 原始大小
AddToCurSpace(*pDlg, entPreview); // 将灭火器插入当前模型空间
}
// 当前图纸上所有灭火器 cet 2013.4.22 add
void GetCurAllFireExtinguisher(PickSet &ss)
{
RBList rbMask(RTDXF0, _T("AEC_ZT_EQUIPMENT"), 8, LAY_TWT_EXTINGUISHER, NULL);
acedSSGet(_T("A"), NULL, NULL, rbMask, ss);
}
void LayFireExtinguisher()
{
// 获得图纸上所有灭火器 cet 2013.4.22 add
PickSet ss(SS_FREE);
GetCurAllFireExtinguisher(ss);
int n = ss.Length();
GlobalFunc::DocGetPickFirst().Free();
CTemporaryResourceOverride vTemp;
static CLayFireExtinguisherDlg *pLayFireExtinguisherDlg = NULL;
if (pLayFireExtinguisherDlg == NULL)
{
pLayFireExtinguisherDlg = new CLayFireExtinguisherDlg(IDD_LAY_FIRE_EXTINGUISHER, acedGetAcadFrame());
pLayFireExtinguisherDlg->SetFireExtinguisher(ss);
pLayFireExtinguisherDlg->Create(IDD_LAY_FIRE_EXTINGUISHER, acedGetAcadFrame());
pLayFireExtinguisherDlg->ShowWindow(SW_SHOW);
}
else
{
pLayFireExtinguisherDlg->SetFireExtinguisher(ss);
pLayFireExtinguisherDlg->ReStartForLay(FALSE);
pLayFireExtinguisherDlg->SetFocus();
}
CDbFireExtinguisher *pFireE = new CDbFireExtinguisher; // 预览灭火器对象,可用于创建灭火器
PickSet ssAdd(SS_FREE); // 执行命令过程中产生的灭火器 cet 2013.4.22 add
PickSet ssCir(SS_FREE); // 保护半径显示的圆 cet 2013.4.22 add
while(true)
{
pLayFireExtinguisherDlg->UpdateData(TRUE);
int nLayType = pLayFireExtinguisherDlg->GetLayType(); // 布置方式
if (nLayType == 0) // 框选
{
RBList rbMask(RTDXF0, _T("AEC_ZT_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL);
PickSet ss(SS_FREE);
int nRet = 0;
TCHAR chKey;
nRet = GlobalFunc::SelectEntities(_T("\n请选择消火栓的范围{选取闭合PLINE(P)}<退出>:"), ss, rbMask, _T("P"), chKey);
if (nRet == RTKWORD) // 闭合PLINE
{
Entity entPoly;
RBList rbMask2(RTDXF0, _T("LWPOLYLINE"), 8, _T("*"), NULL);
if(GlobalFunc::SelectEntity(_T("\n请选择表示范围的闭合PLINE:<退出>"), entPoly, rbMask2) != RTNORM)
{
continue;
}
XPoly2D poly2(entPoly);
XPoint ptLow3, ptUp3;
poly2.GetExtend(ptLow3, ptUp3);;
poly2.TransUCS(RBGroups(0), RBGroups(1));
RBList rbFence = poly2.Fence();
GlobalFunc::AssureInCurrentView_New(ptLow3, ptUp3);
ss.Get(_T("CP"), rbFence, NULL, rbMask);
}
else if (nRet != RTNORM) // 退出
{
break;
}
ssAdd.IncludeBegin(); // 开始记录命令过程中产生的灭火器 cet 2013.4.22 add
pFireE->SetProtectRadius(pLayFireExtinguisherDlg->GetProtectRadius());
pLayFireExtinguisherDlg->UpdateData(TRUE);
int nLen = ss.Length();
for (long i = 0; i < nLen; ++i)
{
Entity ent(ss[i]);
LayFireExtinguisher(ent, *pFireE, pLayFireExtinguisherDlg);
}
// 更新当前灭火器数量 cet 2013.4.22 add
ssAdd.IncludeEnd();
nLen = ssAdd.Length();
if (ssAdd.Length() > 0)
{
pLayFireExtinguisherDlg->ShowProtectRadius(ssAdd);
ssAdd.Free();
}
}
else if (nLayType == 1)
// 任意布置
{
double dScale = pLayFireExtinguisherDlg->GetScale(), dAngle = GlobalFunc::Ucs2Wcs(0.0);
pFireE->SetAngle(GlobalFunc::Ucs2Wcs(0.0));
RANDOM_1:
FireExtinguisherJig jig(pLayFireExtinguisherDlg, pFireE);
//pFireE->ShowProtectRadius(true); // 显示保护半径 cet 2013.4.22 add
jig.SetKeyWord(_T("A E D 1 2 3 4 5 6 7 8 9 = - 0"));
jig.SetTipPrompt(_T("\n请指定灭火器的插入点 [90度旋转(A) /放大(E)/缩小(D)/2具(2)/3具(3)/4具(4)/5具(5)]<退出>"));
int nRet = jig.doIt();
if (nRet == RTKWORD)
{
int nKeyIndex = jig.GetKeyWordIndex();
if (nKeyIndex == 0) // A
{
dAngle += PI / 2;
dAngle = GlobalFunc::AngleRangeTo2PI(dAngle);
jig.SetRotate(dAngle);
}
else if (nKeyIndex == 1) // E
{
dScale += 0.5;
jig.SetScale(dScale);
pLayFireExtinguisherDlg->SetScale(dScale);
pLayFireExtinguisherDlg->UpdateData(FALSE);
}
else if (nKeyIndex == 2) // D
{
if (dScale > 0.5)
{
dScale -= 0.5;
jig.SetScale(dScale);
pLayFireExtinguisherDlg->SetScale(dScale);
pLayFireExtinguisherDlg->UpdateData(FALSE);
}
}
else if (nKeyIndex >= 3 && nKeyIndex <= 11) // 1 - 9
{
pLayFireExtinguisherDlg->SetCount(nKeyIndex - 2);
pLayFireExtinguisherDlg->UpdateData(FALSE);
}
else if (nKeyIndex == 12) // = 代表加
{
int nCount = pLayFireExtinguisherDlg->GetCount();
pLayFireExtinguisherDlg->SetCount(++nCount);
pLayFireExtinguisherDlg->UpdateData(FALSE);
}
else if (nKeyIndex == 13) // - 代表减
{
int nCount = pLayFireExtinguisherDlg->GetCount();
pLayFireExtinguisherDlg->SetCount(nCount > 1 ? --nCount : 1);
pLayFireExtinguisherDlg->UpdateData(FALSE);
}
// 将0作为关键字不进行任何操作,原因防止等待用户输入点时,键入0并回车后,选中一点插入灭火器
// 此点非用户有意选中
goto RANDOM_1;
}
else if (nRet == RTCAN || nRet == RTNONE || nRet == RTERROR)
{
break;
}
ssAdd.IncludeBegin(); // 开始记录命令过程中产生的灭火器 cet 2013.4.22 add
AddToCurSpace(*pLayFireExtinguisherDlg, *pFireE);
// 更新当前灭火器数量 cet 2013.4.22 add
ssAdd.IncludeEnd();
if (ssAdd.Length() > 0)
{
pLayFireExtinguisherDlg->ShowProtectRadius(ssAdd);
ssAdd.Free();
}
goto RANDOM_1;
}
else// 沿线
{
double dScale = pLayFireExtinguisherDlg->GetScale(), dAngle = GlobalFunc::Ucs2Wcs(0.0);
bool bBlk = false;
XPoint ptPick;
Entity entWall;
RANDOM_2:
RBList rbMask = ads_buildlist( -4, _T("<or"), RTDXF0, _T("INSERT"), RTDXF0, _T("LWPOLYLINE"), RTDXF0, _T("LINE"), RTDXF0, _T("ARC"), RTDXF0, _T("ATS_WALL"), RTDXF0, _T("ATS_COLUMN"),
-4, _T("or>"), NULL);
int nRet(0);
if (!bBlk)
{
INITGET_BEG(0, _T("R "));
nRet = GlobalFunc::SelectEntity1(0.3, _T("\n请拾取布置消火栓的外部参照、直线、弧线 <退出>"), entWall, ptPick, rbMask);
INITGET_END();
if (nRet != RTNORM && nRet != RTKWORD)
{
break;
}
}
if(entWall.Is(_T("INSERT")) && GlobalFunc::IsExternalBlock(entWall))
{
bBlk = true;
}
else
{
bBlk = false;
}
ptPick = GlobalFunc::Ucs2Wcs(ptPick);
XCurveSegment seg; // 得到点所在的线段
AcGeMatrix3d mat;
Entity ent = entWall;
seg = GetEntitySegByPt(ptPick, ent, mat);
if(!seg)
break;
double dAng = GlobalFunc::GetInsRotate(ptPick, seg);
pFireE->SetAngle(dAng);
pFireE->SetLocation(ptPick);
FireExtinguisherJig jig(pLayFireExtinguisherDlg, pFireE, 1);
jig.m_ptOnLine = ptPick;
jig.SetKeyWord(_T("A E D 1 2 3 4 5 6 7 8 9 = - 0"));
jig.SetTipPrompt(_T("\n请指定灭火器的方向:<退出>"));
nRet = jig.doIt();
if (nRet == RTCAN || nRet == RTNONE || nRet == RTERROR)
{
break;
}
ssAdd.IncludeBegin(); // 开始记录命令过程中产生的灭火器 cet 2013.4.22 add
AddToCurSpace(*pLayFireExtinguisherDlg, *pFireE);
// 更新当前灭火器数量 cet 2013.4.22 add
ssAdd.IncludeEnd();
long nLen = ssAdd.Length();
PickSet ssDel;
for (long i = 0; i < nLen; ++i)
{
if (ssAdd[i].Is(_T("AEC_DANHTEXT")))
{
ssDel += ssAdd[i];
}
}
ssAdd -= ssDel;
if (ssAdd.Length() > 0)
{
ss += ssAdd;
pLayFireExtinguisherDlg->SetFireExtinguisher(ss);
pLayFireExtinguisherDlg->ShowProtectRadius(ssAdd);
ssAdd.Free();
}
goto RANDOM_2;
}
}
if (pFireE != NULL)
{
delete pFireE;
pFireE = NULL;
}
if (!pLayFireExtinguisherDlg->IsReStartForLay())
{
pLayFireExtinguisherDlg->DeleteProtectRadius(); // cet 2013.4.22 add 删除保护半径
pLayFireExtinguisherDlg->DestroyWindow();
delete pLayFireExtinguisherDlg;
pLayFireExtinguisherDlg = NULL;
acedUpdateDisplay();
actrTransactionManager->flushGraphics();
}
//PostCommand(_T("REGEN "));
}