Files
envi-code/SourceCode/Code2026/ThunderProof/LableThunderBX.cpp
T

972 lines
23 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#include "stdafx.h"
#include "LableThunderBX.h"
#include "ThunderXData.h"
#include "ktsetting.h"
CLableThunderBX::CLableThunderBX(void)
{
m_bFold = FALSE;
}
CLableThunderBX::~CLableThunderBX(void)
{
}
bool CLableThunderBX::DocGetMeterUnitDraw()
{
struct resbuf rb;
acedGetVar(_T("INSUNITS"),&rb);
if (rb.resval.rint == AcDb::kUnitsMeters)
{
return true;
}
return false;
}
void CLableThunderBX::LablePntBX()
{
int nUnionHeight = 1, nDis = 1, nProRange = 1;
CString sTextHeight;
CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.GetValue(KEY_UNIONPRO_HEIGHT,nUnionHeight);
regProp.GetValue(KEY_SPACE_BETWEEN,nDis);
regProp.GetValue(KEY_HORPRO_RANGE,nProRange);
regProp.GetValue(KEY_FONTLABLE_HEIGHT,sTextHeight);
// 获取选取的圆的圆心点
AcGePoint3d ptFir;
AcDbObjectId idCircle1;
if (!GetSelectCircleCenter(_T("\n 请选择第一个保护圆<退出>:"), ptFir, idCircle1))
{
return;
}
AcGePoint3d ptSec;
AcDbObjectId idCircle2;
if (!GetSelectCircleCenter(_T("\n 请选择第二个保护圆<退出>:"), ptSec, idCircle2))
{
return;
}
CString sTemp,sTemp2;
CThunderXData thunderXData;
thunderXData.GetXData(idCircle1,TEL_GROUP_NO,sTemp);
thunderXData.GetXData(idCircle2,TEL_GROUP_NO,sTemp2);
if (_ttoi(sTemp2) != _ttoi(sTemp))
{
AfxMessageBox(_T("请选择同一组的2个圆"));
return;
}
double dProH1 = 1,dProH2 = 2;
thunderXData.GetXData(idCircle1,TEL_CURRENT_PROHEIGHT,sTemp);
dProH1 = _tstof(sTemp);
thunderXData.GetXData(idCircle2,TEL_CURRENT_PROHEIGHT,sTemp);
dProH2 = _tstof(sTemp);
if (dProH1 > 0 && fabs(dProH1-dProH2) > 1e-3)
{
AfxMessageBox(_T("请选择同一保护高度的2个圆"));
return;
}
// 获取避雷针ID
AcDbObjectId idThunder1, idThunder2;
if (!thunderXData.GetEntityIdFromExData(idCircle1, idThunder1, TEL_THUNDER_ID))
{
acutPrintf(_T("请确保两避雷针都在屏幕范围内!"));
return;
}
if (!thunderXData.GetEntityIdFromExData(idCircle2, idThunder2, TEL_THUNDER_ID))
{
acutPrintf(_T("请确保两避雷针都在屏幕范围内!"));
return;
}
CStringArray arsXData1, arsXData2;
// 获取避雷针扩展数据
if (!thunderXData.GetBaseInformationExData(idThunder1, arsXData1, TEL_THUNDER_BASEINFOR))
{
return;
}
if (!thunderXData.GetBaseInformationExData(idThunder2, arsXData2, TEL_THUNDER_BASEINFOR))
{
return;
}
double dScale = 1.0;
if (!DocGetMeterUnitDraw())
dScale *= 1000.0;
double dProHeight = dProH1;
ptFir.z = dProHeight*dScale;
ptSec.z = dProHeight*dScale;
double dDis = ptFir.distanceTo(ptSec);
double dHeight1 = 0.0, dGroundRadius = 0.0, dHeight2 = 0.0;
if (arsXData1.GetSize() < 1) return;
dHeight1 = _tstof(arsXData1.GetAt(CThunderXData::eXDataPinHeight));
if (arsXData2.GetSize() < 1) return;
dHeight2 = _tstof(arsXData2.GetAt(CThunderXData::eXDataPinHeight));
double dTemp = 0.0;
AcGePoint3d ptTemp;
// 交换两针高,dHeight1矮针的高度
if (dHeight1 > dHeight2)
{
dTemp = dHeight1;
dHeight1 = dHeight2;
dHeight2 = dTemp;
ptTemp = ptFir;
ptFir = ptSec;
ptSec = ptTemp;
}
dGroundRadius = _tstof(arsXData2.GetAt(CThunderXData::eXDataPinRadius));
if (fabs(dHeight1 - dHeight2) < 0.01)
{
if (dDis >= 2 * pow(dHeight2 * dScale * (2 * dGroundRadius * dScale -
dHeight2 * dScale), 0.5))
{
return;
}
}
else
{
if (dDis >= pow(dHeight1 * dScale * (2 * dGroundRadius * dScale -
dHeight1 * dScale), 0.5) +
pow(dHeight2 * dScale * (2 * dGroundRadius * dScale -
dHeight2 * dScale), 0.5))
{
return;
}
}
// 计算d1
double d1 = ((dGroundRadius - dHeight2)*(dGroundRadius - dHeight2) -
(dGroundRadius - dHeight1)*(dGroundRadius - dHeight1) +
(dDis/dScale)*(dDis/dScale))/ (2 * dDis/dScale);
d1 = fabs(d1);
double dBx1 = sqrt(dHeight1 * (2 * dGroundRadius - dHeight1) - d1 * d1);
double dBx2 = sqrt(dProHeight * (2 * dGroundRadius - dProHeight));
double dBx = dBx1 - dBx2;
if (dBx < 0.0)
{
acutPrintf(_T("\n 不存在联合保护区域!"));
return;
}
// 获取区域边界点
AcGePoint3d ptReg;
if (!GetSelectRegionPoint(ptReg))
{
return;
}
if (fabs(ptReg.z-dProHeight*dScale) > 1e-3)
{
AfxMessageBox(_T("请选择同一保护高度的联合区域"));
return;
}
// 避雷针距离D向量
AcGeVector3d vtD = ptSec - ptFir;
AcDbLine* dLine = new AcDbLine(ptFir, ptSec);
// 获取在直线D上的投影点,用于确定向量
AcGePoint3d ptPro;
if (dLine->getClosestPointTo(ptReg, ptPro, Adesk::kTrue) != Acad::eOk)
{
delete dLine;
return;
}
// bx 向量
AcGePoint3d ptBxBeg;
dLine->getPointAtDist(d1 * dScale, ptBxBeg);
AcGeVector3d vtBxLine = ptReg - ptPro;
vtBxLine.normalize();
vtBxLine *= dBx * dScale;
AcGePoint3d ptBxEnd = ptBxBeg + vtBxLine;
AcDbLine* BxLine = new AcDbLine(ptBxBeg, ptBxEnd);
KTSetting::InitLayer(LAY_EL_THUNDER_DIM);
dLine->setLayer(LAY_EL_THUNDER_DIM);
AddToCurrentSpace(dLine, Adesk::kTrue);
BxLine->setLayer(LAY_EL_THUNDER_DIM);
AddToCurrentSpace(BxLine, Adesk::kTrue);
CString sTextHx = _T("");
CString sTextD = _T("");
CString sTextBx = _T("");
CString sTextDandHx = _T("");
XPoint ptHxS,ptHxE,ptBxS,ptBxE;
ptBxS = ptBxEnd;
AcGeVector3d vtBxText = ptFir - ptSec;
if (vtBxText.angleTo(AcGeVector3d::kXAxis) < PI/2)
{
vtBxText = ptSec - ptFir;
}
if (nDis && nUnionHeight)
{
sTextDandHx.Format(_T("D = %.2f, hx = %.2f"), dDis / dScale, dProHeight);
if (!sTextDandHx.IsEmpty())
{
// 画D,hx
DrawBxText(ptFir, ptSec, sTextDandHx, ptBxEnd - ptBxBeg);
}
}
else if (nDis)
{
sTextD.Format(_T("D = %.2fm"), dDis / dScale);
if (!sTextD.IsEmpty())
{
//画D
DrawBxText(ptFir, ptSec, sTextD,ptBxEnd - ptBxBeg);
}
}
else if (nUnionHeight)
{
sTextHx.Format(_T("hx = %.2fm"), dProHeight);
if (!sTextHx.IsEmpty())
{
// 画Hx
DrawBxText(ptFir, ptSec, sTextHx, ptBxEnd - ptBxBeg);
/*
// 旧版位置方向
// double dTextHight = _tstof(sTextHeight);
// double dPScale = DocGetPScale();
// if (dTextHight < 1.0E-6)
// {
// dTextHight = 3.0;
// }
// double dTextHxLen = sTextHx.GetLength()*dTextHight*dPScale;
//
// //确定HX注释文字的起始点
// vtBxText.normalize();
// ptHxE = ptBxS;
// ptHxS = ptBxS + vtBxText*dTextHxLen;
//
// DrawBxText(ptHxS, ptHxE, sTextHx, ptBxEnd - ptBxBeg);
*/
}
}
// 画Bx
if (nProRange)
{
sTextBx.Format(_T("bx = %.2fm"), dBx);
if (!sTextBx.IsEmpty())
{
DrawBxText(ptBxBeg, ptBxEnd, sTextBx, ptFir - ptSec);
/*
// 旧版位置方向
// double dTextHight = _tstof(sTextHeight);
// double dPScale = DocGetPScale();
// if (dTextHight < 1.0E-6)
// {
// dTextHight = 3.0;
// }
// double dTextBxLen = sTextBx.GetLength()*dTextHight*dPScale;
// double dTextHxLen = sTextHx.GetLength()*dTextHight*dPScale;
//
// //确定BX和HX注释文字的起始点
// vtBxText.normalize();
// ptBxE = ptBxS - vtBxText*dTextBxLen;
//
// DrawBxText(ptBxS,ptBxE,sTextBx,ptBxEnd - ptBxBeg);
*/
}
}
}
void CLableThunderBX::LabeLineBX()
{
//
int nUnionHeight = 1, nDis = 1, nProRange = 1;
CString sTextHeight;
CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.GetValue(KEY_UNIONPRO_HEIGHT,nUnionHeight);
regProp.GetValue(KEY_SPACE_BETWEEN,nDis);
regProp.GetValue(KEY_HORPRO_RANGE,nProRange);
regProp.GetValue(KEY_FONTLABLE_HEIGHT,sTextHeight);
//
RBList rbMask = ads_buildlist(RTDXF0, _T("LWPOLYLINE"), 8, LAY_EL_LIGHTNING_LINE, NULL);
Entity ent1,ent2;
CThunderXData thunderXdata;
if(SelectEntity(_T("\n请选择第一个避雷线:<退出>"),ent1,rbMask) != RTNORM)
{
return ;
}
if(SelectEntity(_T("\n请选择第二个避雷线:<退出>"),ent2,rbMask) != RTNORM)
{
return ;
}
CString sGroup1 = _T(""),sGroup2 = _T("");
double dProH1 = 0.0,dProH2 = 0.0;
double dLineH1 = 0.0,dLineH2 = 0.0;
double dRadius = 0.0;
AcGePoint3d ptS1,ptE1,ptS2,ptE2;
CString sLineH,sRadius;
AcDbPolyline* pLine = NULL;
OPENOBJ_BEGIN(ent1,AcDb::kForRead,AcDbEntity,pEnt1);
if (pEnt1)
{
thunderXdata.GetXData(pEnt1,KEY_LINE_GROUP_NO,sGroup1);
thunderXdata.GetXData(pEnt1,KEY_LINE_HEIGHT,sLineH);
thunderXdata.GetXData(pEnt1,KEY_LINE_PRO_RADIUS,sRadius);
dRadius = _tstof(sRadius);
dLineH1 = _tstof(sLineH);
if (pLine = AcDbPolyline::cast(pEnt1))
{
pLine->getStartPoint(ptS1);
pLine->getEndPoint(ptE1);
}
}
OPENOBJ_END();
pLine = NULL;
OPENOBJ_BEGIN(ent2,AcDb::kForRead,AcDbEntity,pEnt2);
if (pEnt2)
{
thunderXdata.GetXData(pEnt2,KEY_LINE_GROUP_NO,sGroup2);
thunderXdata.GetXData(pEnt2,KEY_LINE_HEIGHT,sLineH);
dLineH2 = _tstof(sLineH);
if (pLine = AcDbPolyline::cast(pEnt2))
{
pLine->getStartPoint(ptS2);
pLine->getEndPoint(ptE2);
}
}
OPENOBJ_END();
if (sGroup1.CompareNoCase(sGroup2))
{
::AfxMessageBox(_T("\n请选择同一组的2个避雷线!"));
return;
}
if (sGroup2.IsEmpty())
{
AfxMessageBox(_T("\n所选非避雷线,请选择2条避雷线!"));
}
//
Entity entPro;
XPoint ptPick;
RBList rbPro = ads_buildlist(RTDXF0, _T("REGION"), 8, LAY_EL_THUNDER_2D, NULL);
int nRet = SelectEntity1(_T("\n请选择联合保护区域(面域):<退出>"),entPro,ptPick,rbPro);
if (nRet != RTNORM)
{
return ;
}
double dProH = 0.0;
OPENOBJ_BEGIN(entPro,AcDb::kForRead,AcDbEntity,pPro);
if (pPro)
{
CString sProH;
thunderXdata.GetXData(pPro,TEL_CURRENT_PROHEIGHT,sProH);
dProH = _tstof(sProH);
}
OPENOBJ_END();
AcGePoint3d ptFrist,ptSecond;
if (ptS1.distanceTo(ptPick) > ptE1.distanceTo(ptPick))
{
ptFrist = ptE1;
}
else
ptFrist = ptS1;
if (ptS2.distanceTo(ptPick) > ptE2.distanceTo(ptPick))
{
ptSecond = ptE2;
}
else
ptSecond = ptS2;
double dScale = 1.0;
if (!DocGetMeterUnitDraw())
dScale *= 1000.0;
ptFrist.z = dProH*dScale;
ptSecond.z = dProH*dScale;
double dDis = ptFrist.distanceTo(ptSecond);
// 交换两针高,dLineH1矮针的高度
if (dLineH1 > dLineH2)
{
double dTemp = dLineH1;
dLineH1 = dLineH2;
dLineH2 = dTemp;
AcGePoint3d ptTemp = ptFrist;
ptFrist = ptSecond;
}
if (fabs(dLineH1 - dLineH2) < 0.01)
{
if (dDis >= 2 * pow(dLineH1 * dScale * (2 * dRadius * dScale -
dLineH1 * dScale), 0.5))
{
return;
}
}
else
{
if (dDis >= pow(dLineH1 * dScale * (2 * dRadius * dScale -
dLineH1 * dScale), 0.5) +
pow(dLineH2 * dScale * (2 * dRadius * dScale -
dLineH2 * dScale), 0.5))
{
return;
}
}
// 计算d1
double d1 = ((dRadius - dLineH2)*(dRadius - dLineH2) -
(dRadius - dLineH1)*(dRadius - dLineH1) +
(dDis/dScale)*(dDis/dScale))/ (2 * dDis/dScale);
d1 = fabs(d1);
double dBx1 = sqrt(dLineH1 * (2 * dRadius - dLineH1) - d1 * d1);
double dBx2 = sqrt(dProH * (2 * dRadius - dProH));
double dBx = dBx1 - dBx2;
if (dBx < 0.0)
{
acutPrintf(_T("\n 不存在联合保护区域!"));
return;
}
//开始绘制
// 避雷针距离D向量
AcGeVector3d vtD = ptSecond - ptFrist;
AcDbLine* dLine = new AcDbLine(ptFrist, ptSecond);
// 获取在直线D上的投影点,用于确定向量
AcGePoint3d ptPro;
if (dLine->getClosestPointTo(ptPick, ptPro, Adesk::kTrue) != Acad::eOk)
{
delete dLine;
return;
}
// bx 向量
AcGePoint3d ptBxBeg;
dLine->getPointAtDist(d1 * dScale, ptBxBeg);
ptPick.z = ptPro.z;
AcGeVector3d vtBxLine = ptPick - ptPro;
vtBxLine.normalize();
vtBxLine *= dBx * dScale;
AcGePoint3d ptBxEnd = ptBxBeg + vtBxLine;
AcDbLine* BxLine = new AcDbLine(ptBxBeg, ptBxEnd);
KTSetting::InitLayer(LAY_EL_THUNDER_DIM);
dLine->setLayer(LAY_EL_THUNDER_DIM);
AddToCurrentSpace(dLine, Adesk::kTrue);
BxLine->setLayer(LAY_EL_THUNDER_DIM);
AddToCurrentSpace(BxLine, Adesk::kTrue);
// 绘制
CString sTextHx = _T("");
CString sTextD = _T("");
CString sTextBx = _T("");
CString sTextDandHx = _T("");
XPoint ptHxS,ptHxE,ptBxS,ptBxE;
ptBxS = ptBxEnd;
AcGeVector3d vtBxText = ptFrist - ptSecond;
if (vtBxText.angleTo(AcGeVector3d::kXAxis) < PI/2)
{
vtBxText = ptSecond - ptFrist;
}
if (nDis && nUnionHeight)
{
sTextDandHx.Format(_T("D = %.2f, hx = %.2f"), dDis/dScale, dProH);
if (!sTextDandHx.IsEmpty())
{
// 画D,hx
DrawBxText(ptFrist, ptSecond, sTextDandHx, ptBxEnd - ptBxBeg);
}
}
else if (nDis)
{
sTextD.Format(_T("D = %.2fm"), dDis / dScale);
if (!sTextD.IsEmpty())
{
// 画D
DrawBxText(ptFrist, ptSecond, sTextD,ptBxEnd - ptBxBeg);
}
}
else if (nUnionHeight)
{
sTextHx.Format(_T("hx = %.2fm"), dProH);
if (!sTextHx.IsEmpty())
{
// 画Hx
DrawBxText(ptFrist, ptSecond, sTextHx, ptBxEnd - ptBxBeg);
/*
// 旧版位置方向
// double dTextHight = _tstof(sTextHeight);
// double dPScale = DocGetPScale();
// if (dTextHight < 1.0E-6)
// {
// dTextHight = 3.0;
// }
// double dTextHxLen = sTextHx.GetLength()*dTextHight*dPScale;
//
// // 确定BX和HX注释文字的起始点
// vtBxText.normalize();
// ptHxE = ptBxS;
// ptHxS = ptBxS + vtBxText*dTextHxLen;
//
// DrawBxText(ptHxS, ptHxE, sTextHx, ptBxEnd - ptBxBeg);
*/
}
}
// 画Bx
if (nProRange)
{
sTextBx.Format(_T("bx = %.2fm"), dBx);
if (!sTextBx.IsEmpty())
{
DrawBxText(ptBxBeg, ptBxEnd ,sTextBx, ptFrist - ptSecond);
/*
// 旧版位置方向
// double dTextHight = _tstof(sTextHeight);
// double dPScale = DocGetPScale();
// if (dTextHight < 1.0E-6)
// {
// dTextHight = 3.0;
// }
// double dTextBxLen = sTextBx.GetLength()*dTextHight*dPScale;
//
// //确定BX和HX注释文字的起始点
// vtBxText.normalize();
// ptBxE = ptBxS - vtBxText*dTextBxLen;
//
// DrawBxText(ptBxS,ptBxE,sTextBx,ptBxEnd - ptBxBeg);
*/
}
}
}
void CLableThunderBX::LableFoldPntBX()
{
m_bFold = TRUE;
// 获取数据1 避雷针属性
int nUnionHeight = 1, nDis = 1, nProRange = 1;
CString sTextHeight;
CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.GetValue(KEY_FOLD_SPACE_BETWEEN,nDis);
regProp.GetValue(KEY_FOLD_UNIONPRO_HEIGHT,nUnionHeight);
regProp.GetValue(KEY_FOLD_HORPRO_RANGE,nProRange);
regProp.GetValue(KEY_FOLD_FONTLABLE_HEIGHT,sTextHeight);
// 获取圆心
AcGePoint3d ptFir;
AcDbObjectId idCircle1;
if (!GetSelectCircleCenter(_T("\n 请选择第一个保护圆<退出>:"), ptFir, idCircle1))
{
return;
}
AcGePoint3d ptSec;
AcDbObjectId idCircle2;
if (!GetSelectCircleCenter(_T("\n 请选择第二个保护圆<退出>:"), ptSec, idCircle2))
{
return;
}
CThunderXData thunderXData;
CString sTemp,sTemp2;
thunderXData.GetXData(idCircle1,TEL_GROUP_NO,sTemp);
thunderXData.GetXData(idCircle2,TEL_GROUP_NO,sTemp2);
if (_ttoi(sTemp2) != _ttoi(sTemp))
{
// 判断是否同组圆
AfxMessageBox(_T("请选择同一组的2个圆"));
return;
}
// 是否同一保护高度
double dProH1 = 1,dProH2 = 2;
thunderXData.GetXData(idCircle1, KEY_FOLD_CURRENT_PROHEIGHT, sTemp);
dProH1 = _tstof(sTemp);
thunderXData.GetXData(idCircle2, KEY_FOLD_CURRENT_PROHEIGHT, sTemp);
dProH2 = _tstof(sTemp);
if (dProH1 > 0 && fabs(dProH1-dProH2) > 1e-3)
{
AfxMessageBox(_T("请选择同一保护高度的2个圆"));
return;
}
// 获取避雷针ID,是否同一屏幕内 ?
AcDbObjectId idThunder1, idThunder2;
if (!thunderXData.GetEntityIdFromExData(idCircle1, idThunder1, KEY_FOLD_THUNDER_ID))
{
acutPrintf(_T("请确保两避雷针都在屏幕范围内!"));
return;
}
if (!thunderXData.GetEntityIdFromExData(idCircle2, idThunder2, KEY_FOLD_THUNDER_ID))
{
acutPrintf(_T("请确保两避雷针都在屏幕范围内!"));
return;
}
// 获取扩展数据?
CStringArray arsXData1, arsXData2;
if (!thunderXData.GetBaseInformationExData(idThunder1, arsXData1, TEL_THUNDER_BASEINFOR))
{
return;
}
if (!thunderXData.GetBaseInformationExData(idThunder2, arsXData2, TEL_THUNDER_BASEINFOR))
{
return;
}
// 计算
double dScale = 1.0;
if(!DocGetMeterUnitDraw())
{
dScale *= 1000.0;
}
double dProHeight = dProH1; // 保护高度
ptFir.z = dProHeight*dScale;
ptSec.z = dProHeight*dScale;
double dDis = ptFir.distanceTo(ptSec) / dScale; // 两针距离
double dHeight1 = 0.0, dHeight2 = 0.0; // 针高
if (arsXData1.GetSize() < 1)
{
return;
}
dHeight1 = _tstof(arsXData1.GetAt(CThunderXData::eXFoldPinHeight));
if (arsXData2.GetSize() < 1)
{
return;
}
dHeight2 = _tstof(arsXData2.GetAt(CThunderXData::eXFoldPinHeight));
double dTemp = 0.0;
AcGePoint3d ptTemp;
// 交换两针高,dHeight1为矮针的高度
if (dHeight1 > dHeight2)
{
dTemp = dHeight1;
dHeight1 = dHeight2;
dHeight2 = dTemp;
ptTemp = ptFir;
ptFir = ptSec;
ptSec = ptTemp;
}
CFoldToolKit* pToolKit = CFoldToolKit::Instance();
double dBx = 0.0; // Bx
if (!pToolKit->CalcFoldBx(dHeight1, dHeight2, dDis, dProHeight, dBx))
{
acutPrintf(_T("\n 不存在联合保护区域!"));
return;
}
// 获取区域边界点
AcGePoint3d ptReg;
if (!GetSelectRegionPoint(ptReg))
{
return;
}
ptReg.z = dProH1*dScale; //dProH1*dScale dProHeight*dScale ptSec.z
if (fabs(ptReg.z-dProHeight*dScale) > 1e-3)
{
AfxMessageBox(_T("请选择同一保护高度的联合区域"));
return;
}
// 避雷针距离D向量
AcGeVector3d vtD = ptSec - ptFir;
AcDbLine* dLine = new AcDbLine(ptFir, ptSec); // 两针间直线
// 获取在直线D上的投影点,用于确定向量
AcGePoint3d ptPro;
if (dLine->getClosestPointTo(ptReg, ptPro, Adesk::kTrue) != Acad::eOk)
{
delete dLine;
return;
}
// 计算d1
double d1 = 0.0;
if (dHeight1 != dHeight2)
{
// 不等高
double dDisX = pToolKit->CalcEffectDist(dHeight1, dHeight2, dDis, dProHeight);
d1 = dDisX / 2;
}
else
{
// 等高(d1 = 两针连线一半)
double dR1 = 0.0, dR2 = 0.0;
OPENOBJ_BEGIN(idCircle1, AcDb::kForRead, AcDbCircle, pCircle1);
if (pCircle1 != NULL)
{
dR1 = pCircle1->radius();
}
OPENOBJ_END();
OPENOBJ_BEGIN(idCircle2, AcDb::kForRead, AcDbCircle, pCircle2);
if (pCircle2 != NULL)
{
dR2 = pCircle2->radius();
}
OPENOBJ_END();
d1 = (dR2 - dHeight2)*(dR2 - dHeight2) - (dR1 - dHeight1)*(dR1 - dHeight1) + dDis / 2;
d1 = fabs(d1);
}
// bx 向量
AcGePoint3d ptBxBeg; // Bx线起点
dLine->getPointAtDist(d1 * dScale, ptBxBeg);
AcGeVector3d vtBxLine = ptReg - ptPro;
vtBxLine.normalize();
vtBxLine *= dBx * dScale; // Bx大小
AcGePoint3d ptBxEnd = ptBxBeg + vtBxLine; // Bx线终点
AcDbLine* BxLine = new AcDbLine(ptBxBeg, ptBxEnd);
KTSetting::InitLayer(LAY_EL_THUNDER_DIM);
dLine->setLayer(LAY_EL_THUNDER_DIM);
AddToCurrentSpace(dLine, Adesk::kTrue);
BxLine->setLayer(LAY_EL_THUNDER_DIM);
AddToCurrentSpace(BxLine, Adesk::kTrue);
// 绘制
CString sTextHx = _T("");
CString sTextD = _T("");
CString sTextBx = _T("");
CString sTextDandHx = _T("");
XPoint ptHxS,ptHxE,ptBxS,ptBxE;
ptBxS = ptBxEnd;
AcGeVector3d vtBxText = ptFir - ptSec;
if (vtBxText.angleTo(AcGeVector3d::kXAxis) < PI/2)
{
vtBxText = ptSec - ptFir;
}
if (nDis && nUnionHeight)
{
sTextDandHx.Format(_T("D = %.2fm, hx = %.2fm"), dDis, dProHeight);
if (!sTextDandHx.IsEmpty())
{
// 画D,hx
DrawBxText(ptFir, ptSec, sTextDandHx, ptBxEnd - ptBxBeg);
}
}
else if (nDis)
{
sTextD.Format(_T("D = %.2fm"), dDis);
if (!sTextD.IsEmpty())
{
// 画D
DrawBxText(ptFir, ptSec, sTextD, ptBxEnd - ptBxBeg);
}
}
else if (nUnionHeight)
{
sTextHx.Format(_T("hx = %.2fm"), dProHeight);
if (!sTextHx.IsEmpty())
{
// 画Hx
DrawBxText(ptFir, ptSec, sTextHx, ptBxEnd - ptBxBeg);
/*
// 旧版位置方向
// double dTextHight = _tstof(sTextHeight);
// double dPScale = DocGetPScale();
// if (dTextHight < 1.0E-6)
// {
// dTextHight = 3.0;
// }
// double dTextHxLen = sTextHx.GetLength()*dTextHight*dPScale;
//
// //确定HX注释文字的起始点
// vtBxText.normalize();
// ptHxE = ptBxS;
// ptHxS = ptBxS + vtBxText*dTextHxLen * 2;
//
// DrawBxText(ptHxS, ptHxE, sTextHx, ptBxEnd - ptBxBeg);
*/
}
}
if (nProRange)
{
sTextBx.Format(_T("bx = %.2fm"), dBx);
if (!sTextBx.IsEmpty())
{
// 画Bx
DrawBxText(ptBxBeg, ptBxEnd, sTextBx, ptFir - ptSec);
/*
// 旧版位置方向
// double dTextHight = _tstof(sTextHeight);
// double dPScale = DocGetPScale();
// if (dTextHight < 1.0E-6)
// {
// dTextHight = 3.0;
// }
// double dTextBxLen = sTextBx.GetLength()*dTextHight*dPScale;
//
// //确定BX和HX注释文字的起始点
// vtBxText.normalize();
// ptBxE = ptBxS - vtBxText*dTextBxLen * 2;
//
// DrawBxText(ptBxS,ptBxE,sTextBx, ptBxEnd - ptBxBeg);
*/
}
}
}
void CLableThunderBX::LabeFoldLineBX()
{
// 获取数据1 避雷针属性
// 获取避雷线
// 判断是否同组
// 计算
// 绘制
}
// 由Entity(ads_name)获取圆中心点, ID
bool CLableThunderBX::GetSelectCircleCenter(LPCTSTR pszSelTip, AcGePoint3d& ptGetCent, AcDbObjectId& idCircle)
{
if (pszSelTip == NULL)
{
return false;
}
Entity ent;
//RBList rbMask = ads_buildlist(RTDXF0, _T("CIRCLE"), 8, LAY_EL_THUNDER_2D, NULL);
RBList rbMask = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("CIRCLE"), 8, LAY_EL_THUNDER_2D, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("CIRCLE"), 8, LAY_EL_THUNDER, -4, _T("and>"),
-4, _T("or>"), NULL);
if(SelectEntity(pszSelTip, ent, rbMask) != RTNORM)
{
return false;
}
// 获取id
bool bRet = false;
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbCircle, pCircle);
if(pCircle)
{
ptGetCent = pCircle->center();
idCircle = pCircle->objectId();
bRet = true;
}
OPENOBJ_END();
return bRet;
}
// 判断选择的是否为区域并返回选择点
bool CLableThunderBX::GetSelectRegionPoint(AcGePoint3d& ptReg)
{
Entity ent;
XPoint ptTemp;
//RBList rbMask1 = ads_buildlist(RTDXF0, _T("REGION, LWPOLYLINE"), 8, LAY_EL_THUNDER_2D, NULL);
//RBList rbFoldMask(RTDXF0, _T("LWPOLYLINE"), 8, LAY_EL_THUNDER_2D, NULL);
RBList rbMask1 = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("REGION"), 8, LAY_EL_THUNDER_2D, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("LWPOLYLINE"), 8, LAY_EL_THUNDER_2D, -4, _T("and>"),
-4, _T("or>"), NULL);
CThunderXData thunderData;
AcDbPolyline* pLine = NULL;
if (SelectEntity1(_T("\n 请选择两保护圆之间的保护区域<退出>: "), ent, ptTemp, rbMask1) != RTNORM)
{
// 判断PLine是否是折线法联合保护线
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
if (pEnt != NULL && (pLine = AcDbPolyline::cast(pEnt)) != NULL)
{
m_csGroup.Empty();
thunderData.GetXData((AcDbEntity*)pLine, KEY_FOLD_GROUP_NO, m_csGroup);
}
OPENOBJ_END();
if (m_csGroup.IsEmpty())
{
return false;
}
}
// 区域选择点
ptReg = Ucs2Wcs(ptTemp);
return true;
}
// 绘制标注bx文
void CLableThunderBX::DrawBxText(const AcGePoint3d& ptST,const AcGePoint3d& ptEn,LPCTSTR pszDimName,const AcGeVector3d& vtDim)
{
if (pszDimName == NULL)
{
acutPrintf(_T("\n 标注名称不能为空!"));
return;
}
CString sTextValue = pszDimName;
int nColorIndex = 256;
CString sTextHeight;
CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
sTextHeight = _T("3.0");
if (m_bFold)
{
regProp.GetValue(KEY_FOLD_FONTLABLE_HEIGHT,sTextHeight);
regProp.GetValue(KEY_FOLD_FONTLABLE_COLOR,nColorIndex);
}
else
{
regProp.GetValue(KEY_FONTLABLE_HEIGHT,sTextHeight);
regProp.GetValue(KEY_FONTLABLE_COLOR,nColorIndex);
}
AcGePoint3d ptFirst(ptST.x,ptST.y,0);
AcGePoint3d ptEnd(ptEn.x,ptEn.y,0);
AcGePoint3d ptPosition;
AcGeVector3d vec = ptEnd - ptFirst;
AcGeVector3d vecH = vec/2;
AcGeVector3d vecV = vtDim;
vecV.normalize();
vecV *= DocGetPScale() * (_tstof(sTextHeight) + 1);
double dAng = vec.angleTo(AcGeVector3d::kXAxis);
if (vec.angleTo(AcGeVector3d::kYAxis) > PI/2)
dAng = 2 * PI - dAng;
if (vec.angleTo(AcGeVector3d::kXAxis) > PI/2)
dAng += PI;
AcDbObjectId idStyle = KTSetting::InitTextStyle(_T("Pipe_Dim"));
ptPosition = ptFirst + vecH;
ptPosition -= vecV;
AcDbObjectId idLay = KTSetting::InitLayer(EL_TEXT);
AcDbText* pTextR = new AcDbText(Ucs2Wcs(ptPosition),sTextValue,idStyle,_tstof(sTextHeight)*DocGetPScale(),dAng);
pTextR->setHorizontalMode(AcDb::kTextMid);
pTextR->setAlignmentPoint(ptPosition);
pTextR->setLayer(idLay);
pTextR->setColorIndex(nColorIndex);
AddToCurrentSpace(pTextR,Adesk::kTrue);
}