667 lines
19 KiB
C++
667 lines
19 KiB
C++
#include "StdAfx.h"
|
||
#include "LayFireExtinguisherDlg.h"
|
||
#include "FireExtinguisherJig.h"
|
||
#include "DbEquipment.h"
|
||
#include "DbFireExtinguisher.h"
|
||
|
||
|
||
extern XCurveSegment GetEntitySegByPt(XPoint &ptPick, Entity &entWall, AcGeMatrix3d &mat);
|
||
void FireExtinguisherEditCmd()
|
||
{
|
||
g_ssPickFirst.Free();
|
||
PickSet ss;
|
||
RBList rbMask(RTDXF0, _T("ATS_EQUIPMENT"), 8, LAY_TWT_EXTINGUISHER, NULL);
|
||
int nRet = 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, TDbFireExtinguisher, pFireExt);
|
||
if(pFireExt != NULL)
|
||
{
|
||
sBlkName = 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, TDbFireExtinguisher, pFireExt);
|
||
if(pFireExt != NULL)
|
||
{
|
||
sBlkName = dlg.GetSelBlkName();
|
||
AcDbObjectId id = 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(LoadDwbBlock(sDwb, sBlkNum, xsTmp) != RTNORM)
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
pFireExt->SetBlock2d(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(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;
|
||
}
|
||
// 图块大小
|
||
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;
|
||
}
|
||
|
||
bool GetBlkSize(const CString &sBlkName, const AcGeScale3d &scale, double &dWidth, double &dHeight)
|
||
{
|
||
AcDbObjectId idBlk = 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(LoadDwbBlock(sDwb, sBlkNum, xsTmp) != RTNORM)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// 重新获取图块id
|
||
idBlk = 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 = 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(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, TDbFireExtinguisher &fireExtinguisher)
|
||
{
|
||
// 灭火器数量
|
||
int nNum = dlg.GetCount();
|
||
|
||
if (nNum <= 0)
|
||
{
|
||
return;
|
||
}
|
||
TDbFireExtinguisher *pFireExtinguisher = new TDbFireExtinguisher;
|
||
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(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(GetBlkIdByName(sBlkName));
|
||
pFireExtinguisher->SetSpecificationType(dlg.m_nSpecificationType);
|
||
AcDbObjectId id = pFireExtinguisher->AddToCSpace(Adesk::kTrue);
|
||
}
|
||
|
||
void LayFireExtinguisher(Entity &entHydrant, TDbFireExtinguisher &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, TDbEquipment, 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 = Wcs2Ucs(dAngle);
|
||
dAngle = 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() * 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 = AngleRangeTo2PI(dAngle);
|
||
entPreview.SetDimTextPos(false);
|
||
}
|
||
dAngle = Ucs2Wcs(dAngle);
|
||
dAngle = 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() * DocGetPScale();
|
||
}
|
||
else
|
||
{
|
||
vtDir.rotateBy(PI/2, AcGeVector3d::kZAxis);
|
||
ptTextIns = ptIns + vtDir * dHeight2 * 1.2;
|
||
|
||
}
|
||
}
|
||
else // 单布
|
||
{
|
||
ptTextIns = ptIns + vtDir * dWidth2 * 0.7;
|
||
}
|
||
|
||
dAngle = 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;
|
||
XExplodeDraw::TextAlignment align = XExplodeDraw::kBottomCenter;
|
||
if (dAngUcs - 7 * PI / 4 < 0.001 && dAngUcs - PI * 3 / 4 > 0.001)
|
||
{
|
||
dAngUcs -= PI;
|
||
if (pDlg->GetLayDimType() == 1)
|
||
{
|
||
align = XExplodeDraw::kTopLeft;
|
||
}
|
||
else
|
||
{
|
||
align = XExplodeDraw::kTopCenter;
|
||
if (!entPreview.GetDimTextPos())
|
||
{
|
||
align = XExplodeDraw::kBottomCenter;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pDlg->GetLayDimType() == 1)
|
||
{
|
||
align = XExplodeDraw::kBottomLeft;
|
||
}
|
||
else
|
||
{
|
||
align = XExplodeDraw::kBottomCenter;
|
||
}
|
||
}
|
||
entPreview.SetTextRotation(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("ATS_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();
|
||
|
||
g_ssPickFirst.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();
|
||
}
|
||
|
||
TDbFireExtinguisher *pFireE = new TDbFireExtinguisher; // 预览灭火器对象,可用于创建灭火器
|
||
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("ATS_EQUIPMENT"), 8, LAY_EQUIP_HYDRANT, NULL);
|
||
PickSet ss(SS_FREE);
|
||
int nRet = 0;
|
||
TCHAR chKey;
|
||
nRet = 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(SelectEntity(_T("\n请选择表示范围的闭合PLINE:<退出>"), entPoly, rbMask2) != RTNORM)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
XPoly2D poly2(entPoly);
|
||
XPoint ptLow3, ptUp3;
|
||
poly2.GetExtend(ptLow3, ptUp3);;
|
||
poly2.TransUCS(Groups(0), Groups(1));
|
||
RBList rbFence = poly2.Fence();
|
||
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 = Ucs2Wcs(0.0);
|
||
pFireE->SetAngle(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 = 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 = 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 = SelectEntity1(0.3, _T("\n请拾取布置消火栓的外部参照、墙线、柱子、直线、弧线 <退出>"), entWall, ptPick, rbMask);
|
||
INITGET_END();
|
||
|
||
if (nRet != RTNORM && nRet != RTKWORD)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(entWall.Is(_T("INSERT")) && IsExternalBlock(entWall))
|
||
{
|
||
bBlk = true;
|
||
}
|
||
else
|
||
{
|
||
bBlk = false;
|
||
}
|
||
|
||
ptPick = Ucs2Wcs(ptPick);
|
||
XCurveSegment seg; // 得到点所在的线段
|
||
AcGeMatrix3d mat;
|
||
Entity ent = entWall;
|
||
seg = GetEntitySegByPt(ptPick, ent, mat);
|
||
if(!seg)
|
||
break;
|
||
|
||
double dAng = 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("ATS_TEXT")))
|
||
{
|
||
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 "));
|
||
}
|
||
|