Files
envi-code/SourceCode/Code2026/ThunderProof/ThunderLineSetDlg.cpp
T
2026-09-28 15:28:50 +08:00

732 lines
16 KiB
C++

#include "stdafx.h"
#include "ThunderLineSetDlg.h"
#include "ThunderCmdGroup.h"
#include "GroupHelp.h"
#include "ProHeightHelp.h"
#include "TThunderInsertPreviewJig.h"
#include "ThunderXData.h"
#include "dbxutil.h"
#include "dbgroup.h"
CThunderLineSetDlg::CThunderLineSetDlg(CWnd* pParent /*=NULL*/)
: CDialog(CThunderLineSetDlg::IDD, pParent)
{
m_bValid = FALSE;
m_bTipChange = FALSE;
m_nUseType = eCreate;
m_strPinHeight = _T("25");
}
CThunderLineSetDlg::~CThunderLineSetDlg()
{
}
void CThunderLineSetDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CThunderLineSetDlg)
DDX_Control(pDX, IDC_SPIN2, m_wndSpinNum);
DDX_Control(pDX, IDC_SPIN1, m_wndSpinGroup);
DDX_Control(pDX, IDC_LST_PROHEIGHT, m_LstData);
DDX_Control(pDX, IDC_INFOR, m_wndStcInfor);
DDX_Control(pDX, IDC_EDT_NUM, m_wndEdtNum);
DDX_Control(pDX, IDC_EDT_LINEHEIGHT, m_wndEdtLineH);
DDX_Text(pDX,IDC_EDT_LINEHEIGHT,m_strPinHeight);
DDX_Control(pDX, IDC_EDT_GROUP, m_wndEdtGroup);
DDX_Control(pDX, IDC_COM_RADIUS, m_cmbRadius);
DDX_Control(pDX, IDC_BUT_HELP2, m_btnLineHHelp);
DDX_Control(pDX, IDC_BUT_HELP, m_btnGroupHelp);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CThunderLineSetDlg, CDialog)
//{{AFX_MSG_MAP(CThunderLineSetDlg)
ON_BN_CLICKED(IDC_BUT_HELP, OnButGroupHelp)
ON_BN_CLICKED(IDC_BUT_HELP2, OnBtnLineHHelp)
ON_EN_CHANGE(IDC_EDT_GROUP, OnChangeEdtGroup)
ON_EN_CHANGE(IDC_EDT_NUM, OnChangeEdtNum)
ON_WM_CTLCOLOR()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus)
ON_BN_CLICKED(IDOK,OnBnClickedOk)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON1, &CThunderLineSetDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CThunderLineSetDlg::OnBnClickedButton2)
END_MESSAGE_MAP()
LONG_PTR CThunderLineSetDlg::OnAcadKeepFocus(UINT_PTR, LONG_PTR)
{
CPoint pt;
GetCursorPos(&pt);
CRect rc;
GetWindowRect(&rc);
return (rc.PtInRect(pt) ? TRUE : FALSE);
}
// 对话框的非模式形式
BOOL CThunderLineSetDlg::DoModeless()
{
if (!Create(IDD_DRAW_THUNDER_LINE))
{
return FALSE;
}
ShowWindow(SW_SHOW);
return TRUE;
}
BOOL CThunderLineSetDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ReadDlgData();
// 保护高度
m_LstData.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SINGLEROW);
m_LstData.InsertColumn(0,_T("编号"),LVCFMT_LEFT,120);
m_LstData.InsertColumn(1,_T("保护高度"),LVCFMT_LEFT,200);
m_LstData.SetColumnItemData(1,NULL,ET_Edit);
InitProHeight();
CString sLineH;
m_wndEdtLineH.GetWindowText(sLineH);
if (sLineH.IsEmpty())
{
m_wndEdtLineH.SetWindowText(_T("25"));
}
CString sGNo,sNum;
AcDbIntArray arNum;
m_wndEdtGroup.GetWindowText(sGNo);
ThunderContainer->GetTLineNumArrayBySpecGroup(sGNo,arNum);
int nLastNum = 0;
for (int k = 0;k < arNum.length();k++)
{
if (arNum[k] > nLastNum)
{
nLastNum = arNum[k];
}
}
sNum.Format(_T("%d"),nLastNum+1);
m_wndEdtNum.SetWindowText(sNum);
m_wndSpinGroup.SetRange32(SPNMIN,SPNMAX);
m_wndSpinNum.SetRange32(SPNMIN,SPNMAX);
m_bitTip.LoadBitmap(IDB_BITMAPHELP);
m_btnGroupHelp.SetBitmap(HBITMAP(m_bitTip));
m_btnLineHHelp.SetBitmap(HBITMAP(m_bitTip));
if(m_nUseType == eEdit)
{
//如果是编辑修改
SetWindowText(_T("改避雷线"));
CThunderXData thunderXData;
CString sNum,sGroup,sHeight,sGRadius;
thunderXData.GetXData(m_idThunderLine,KEY_LINE_PRO_RADIUS,sGRadius);
thunderXData.GetXData(m_idThunderLine,KEY_LINE_HEIGHT,sHeight);
thunderXData.GetXData(m_idThunderLine,KEY_LINE_GROUP_NO,sGroup);
thunderXData.GetXData(m_idThunderLine,TEL_ORDER_NUMBER,sNum);
int nIndex = m_cmbRadius.FindString(0,sGRadius);
m_cmbRadius.SetCurSel(nIndex);
m_wndEdtNum.SetWindowText(sNum);
m_wndEdtGroup.SetWindowText(sGroup);
m_wndEdtLineH.SetWindowText(sHeight);
m_wndStcInfor.ShowWindow(SW_HIDE);
GetDlgItem(IDOK)->ShowWindow(SW_SHOW);
GetDlgItem(IDCANCEL)->ShowWindow(SW_SHOW);
}
m_bValid = TRUE;
return TRUE;
}
void CThunderLineSetDlg::InitProHeight()
{
CThunderXData xd;
AcGeDoubleArray arProH;
if (m_nUseType == eCreate)
{
if (!xd.GetProtectHeightFromReg(arProH, KEY_THUNDERLINE_PH))
{
arProH.append(15.0);
}
}
else if (m_nUseType == eEdit)
{
xd.GetProtectHeightFromObjEx(m_idThunderLine, arProH);
}
long lIndex = -1;
CString sTmp;
for (int i = 0;i < arProH.length();++i)
{
lIndex = m_LstData.GetItemCount();
sTmp.Format(_T("%d"),lIndex + 1);
m_LstData.InsertItem(lIndex,sTmp);
sTmp.Format(_T("%g"), arProH[i]);
m_LstData.SetItemText(lIndex,1,sTmp);
}
}
void CThunderLineSetDlg::OnButGroupHelp()
{
CAcModuleResourceOverride myResources;
CGroupHelp hlpDlg;
hlpDlg.DoModal();
}
void CThunderLineSetDlg::OnBtnLineHHelp()
{
CAcModuleResourceOverride myResources;
CProHeightHelp hlpDlg;
hlpDlg.DoModal();
}
void CThunderLineSetDlg::OnChangeEdtGroup()
{
if (!m_bValid)
{
return;
}
CString sGNo,strTip;
m_wndEdtGroup.GetWindowText(sGNo);
if (_ttoi(sGNo) < 1)
{
strTip.Format(_T("组号最小为1"));
m_bTipChange = TRUE;
PostErrorToCue(strTip);
return;
}
// 避雷针编号
AcGeIntArray arNum;
ThunderContainer->GetTLineNumArrayBySpecGroup(sGNo, arNum);
if (arNum.length() > 0)
{
CString sNum;
sNum.Format(_T("%d"), arNum.last()+1);
m_wndEdtNum.SetWindowText(sNum);
}
else
{
m_wndEdtNum.SetWindowText(_T("1"));
}
}
void CThunderLineSetDlg::OnChangeEdtNum()
{
if (!m_bValid)
{
return;
}
CString sCurNo,sOldGNo,strTip;
m_wndEdtNum.GetWindowText(sCurNo);
m_wndEdtGroup.GetWindowText(sOldGNo);
if (_ttoi(sCurNo) < 1)
{
strTip.Format(_T("编号最小为1"));
m_bTipChange = TRUE;
PostErrorToCue(strTip);
return;
}
BOOL bValid = FALSE;
AcGeIntArray arNum;
ThunderContainer->GetTLineNumArrayBySpecGroup(sOldGNo, arNum);
int nPos;
if (!arNum.find(_ttoi(sCurNo),nPos))
{
bValid = TRUE;
}
if (m_nUseType == eEdit)
{
CThunderXData thunderXdata;
CString sNum;
thunderXdata.GetXData(m_idThunderLine,TEL_ORDER_NUMBER,sNum);
if (!sNum.CompareNoCase(sCurNo))
{
bValid = TRUE;
}
}
if (!bValid)
{
// 提示错误(显示错误提示 + 隐藏更新和取消按钮)
strTip.Format(_T("组%s中编号%s已存在"), sOldGNo,sCurNo);
m_bTipChange = TRUE;
if (m_nUseType)
{
m_wndStcInfor.ShowWindow(SW_SHOW);
GetDlgItem(IDOK)->ShowWindow(SW_HIDE);
GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE);
}
PostErrorToCue(strTip);
}
else
{
// 清除错误提示(显示更新和取消按钮 + 隐藏错误提示)
strTip.Format(_T("组%s中编号%s可以使用"), sOldGNo,sCurNo);
m_bTipChange = FALSE;
if (m_nUseType == eEdit)
{
m_wndStcInfor.ShowWindow(SW_HIDE);
GetDlgItem(IDOK)->ShowWindow(SW_SHOW);
GetDlgItem(IDCANCEL)->ShowWindow(SW_SHOW);
}
PostErrorToCue(strTip);
}
}
void CThunderLineSetDlg::PostErrorToCue(LPCTSTR pszError)
{
m_wndStcInfor.SetWindowText(pszError);
}
void CThunderLineSetDlg::SetThunderDraw2d(CDrawThunderTools* pThundDraw)
{
m_pDrawThunder = pThundDraw;
}
bool CThunderLineSetDlg::DocGetMeterUnitDraw()
{
struct resbuf rb;
acedGetVar(_T("INSUNITS"),&rb);
if (rb.resval.rint == AcDb::kUnitsMeters)
{
return true;
}
return false;
}
BOOL CThunderLineSetDlg::DrawThunderLine(AcDbObjectId& idOut)
{
//读取设置
CString sWidth;
double dWidth;
CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
if (regProp.GetValue(KEY_LINETHINK,sWidth))
{
dWidth = _tstof(sWidth);
}
else
{
dWidth = 0.0;
}
int SinglePinColorIndex = 1;
regProp.GetValue(KEY_SINGLEPRO_COLOR,SinglePinColorIndex);
CString sKeyTip;
sKeyTip = _T("P A");
int nRet = -1;
ads_point ptAds;
BOOL bFixAngle = FALSE;
double dFixAngle = 0.0;
INITGET_BEG(0, sKeyTip);
nRet = acedGetPoint(0,_T("\n 请拾取避雷线起始点[平行于参照避雷线(P)/指定角度0~360(A)]<P>:"),ptAds);
INITGET_END();
if(nRet == RTKWORD || nRet == RTNONE)
{
TCHAR szKey[32];
memset(szKey,0,32);
ads_getinput(szKey);
CString sKeyword = szKey;
if (nRet == RTNONE)
sKeyword.Empty();
if (sKeyword.IsEmpty() || sKeyword.CompareNoCase(_T("P")) == 0) // 选择参照避雷线
{
// 选择避雷线取其旋转角度
Entity ent;
RBList rb = ads_buildlist(RTDXF0,_T("LWPOLYLINE"),8,LAY_EL_LIGHTNING_LINE,NULL);
if (SelectEntity(_T("\n 请选择参照的避雷线<退出>:"), ent, rb) != RTNORM)
{
return FALSE;
}
OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDbPolyline,pLine);
if (pLine != NULL)
{
AcGePoint3d ptS,ptE;
pLine->getStartPoint(ptS);
pLine->getEndPoint(ptE);
AcGeVector3d vtDir = ptE - ptS;
dFixAngle = vtDir.angleTo(AcGeVector3d::kXAxis);
double dFixAngle1 = vtDir.angleTo(AcGeVector3d::kYAxis);
if (dFixAngle1 > PI/2)
{
dFixAngle = PI - dFixAngle;
}
}
OPENOBJ_END();
bFixAngle = TRUE;
if (acedGetPoint(0,_T("\n 请拾取避雷线起始点<退出>:"),ptAds) != RTNORM)
{
return FALSE;
}
}
else if (sKeyword.CompareNoCase(_T("A")) == 0)// 指定避雷线角度
{
// 输入角度
if (acedGetReal(_T("\n 请输入避雷线角度<退出>:"), &dFixAngle) != RTNORM)
{
return FALSE;
}
bFixAngle = TRUE;
if (acedGetPoint(0,_T("\n 请拾取避雷线起始点<退出>:"),ptAds) != RTNORM)
{
return FALSE;
}
}
}
else if(nRet == RTCAN) // 退出
{
return FALSE;
}
CString sGroupNo;
m_wndEdtGroup.GetWindowText(sGroupNo);
if (_ttoi(sGroupNo) < 1)
{
AfxMessageBox(_T("避雷线组号应大于0!"));
return TRUE;
}
CString sNum;
m_wndEdtNum.GetWindowText(sNum);
if (_ttoi(sNum) < 1)
{
AfxMessageBox(_T("避雷线编号应大于0!"));
return TRUE;
}
CString sGroup,sGRadius,sHeight;
m_wndEdtGroup.GetWindowText(sGroup);
m_wndEdtLineH.GetWindowText(sHeight);
m_cmbRadius.GetWindowText(sGRadius);
if (_tstof(sHeight) >= 2*_tstof(sGRadius))
{
AfxMessageBox(_T("避雷线高度应小于两倍的滚球半径!"));
return TRUE;
}
if (m_bTipChange)
{
return TRUE;
}
acdbUcs2Wcs(ptAds, ptAds, false);
AcGePoint3d ptInsert = asPnt3d(ptAds);
AcDbPolyline* pLine = new AcDbPolyline;
pLine->addVertexAt(0,ptInsert.convert2d(AcGePlane::kXYPlane));
pLine->addVertexAt(1,ptInsert.convert2d(AcGePlane::kXYPlane));
pLine->setNormal(AcGeVector3d::kZAxis);
pLine->setConstantWidth(dWidth);
pLine->setLayer(LAY_EL_LIGHTNING_LINE);
pLine->setColorIndex(SinglePinColorIndex);
TThunderLinePreviewJig jig(pLine);
jig.SetFixAngleState(bFixAngle);
jig.SetFixAngleValue(dFixAngle);
jig.setDispPrompt(_T("\n 请点取避雷线结束点<退出>:"));
if (jig.DoIt() != RTNORM)
{
if (pLine != NULL)
{
delete pLine;
pLine = NULL;
}
return FALSE;
}
AcGePoint3d ptLast = jig.GetLastPoint();
CString sTmp;
m_wndEdtLineH.GetWindowText(sTmp);
double dscale = 1.0;
if (!DocGetMeterUnitDraw())
{
dscale *= 1000;
}
pLine->setElevation(_tstof(sTmp)*dscale);
ptInsert.z = _tstof(sTmp)*dscale;
ptLast.z = _tstof(sTmp)*dscale;
// 避雷线
idOut = AddToCurrentSpace(pLine,Adesk::kTrue);
if (!idOut.isValid())
{
return FALSE;
}
CThunderXData xd;
OPENOBJ_BEGIN(idOut,AcDb::kForWrite,AcDbEntity,pEnt);
if (pEnt != NULL)
{
xd.SetXData(pEnt,KEY_LINE_PRO_RADIUS,sGRadius);
xd.SetXData(pEnt,KEY_LINE_HEIGHT,sHeight);
xd.SetXData(pEnt,KEY_LINE_GROUP_NO,sGroup);
xd.SetXData(pEnt,TEL_ORDER_NUMBER,sNum);
}
OPENOBJ_END();
ThunderContainer->AppendThunderLine(sGroup, idOut);
AcGeDoubleArray arProHeight;
GetCurentProHeight(arProHeight);
if (m_pDrawThunder != NULL)
{
m_pDrawThunder->DrawThunderLine(sGroup,arProHeight);
}
xd.SetProtectHeightToReg(arProHeight, KEY_THUNDERLINE_PH);
CString sNO;
sNO.Format(_T("%d"), _ttoi(sNum)+1);
m_wndEdtNum.SetWindowText(sNO);
return TRUE;
}
void CThunderLineSetDlg::GetCurentProHeight(AcGeDoubleArray& arProHeight)
{
CString sData;
arProHeight.setLogicalLength(0);
for (long i = 0;i < m_LstData.GetItemCount();++i)
{
sData = m_LstData.GetItemText(i,1);
arProHeight.append(_tstof(sData));
}
}
HBRUSH CThunderLineSetDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (IDC_INFOR == pWnd->GetDlgCtrlID())
{
if (m_bTipChange)
{
pDC->SetTextColor(RGB(255,0,0));
}
else
{
pDC->SetTextColor(RGB(0, 0, 0));
}
}
return hbr;
}
void CThunderLineSetDlg::SetUseType(int nUseType)
{
m_nUseType = nUseType;
}
void CThunderLineSetDlg::SetCurrectThunderLine(const AcDbObjectId& idThunderLine)
{
m_idThunderLine = idThunderLine;
}
void CThunderLineSetDlg::OnBnClickedOk()
{
CString sNum,sGroup,sHeight,sGRadius,sOldGroup;
CThunderXData thunderXData;
AcGeDoubleArray arProHeight,arOldHeight;
CString sProH;
thunderXData.GetProtectHeightFromObjEx(m_idThunderLine,arOldHeight);
thunderXData.GetXData(m_idThunderLine,KEY_LINE_GROUP_NO,sOldGroup);
int i = 0;
for (i = 0;i < m_LstData.GetItemCount();i++)
{
sProH = m_LstData.GetItemText(i,1);
if (_tstof(sProH) > 0)
{
arProHeight.append(_tstof(sProH));
}
}
m_cmbRadius.GetWindowText(sGRadius);
m_wndEdtNum.GetWindowText(sNum);
m_wndEdtGroup.GetWindowText(sGroup);
m_wndEdtLineH.GetWindowText(sHeight);
AcGePoint3d ptS,ptE;
OPENOBJ_BEGIN(m_idThunderLine,AcDb::kForWrite,AcDbPolyline,pLine);
if (pLine)
{
double dLineH = _tstof(sHeight)*1000;
AcGeVector3d vtNor = pLine->normal();
pLine->getStartPoint(ptS);
pLine->getEndPoint(ptE);
AcGePlane plane(AcGePoint3d::kOrigin,vtNor);
pLine->setPointAt(0,ptS.convert2d(plane));
pLine->setPointAt(1,ptE.convert2d(plane));
pLine->setElevation(dLineH);
}
OPENOBJ_END();
if (_tstof(sGroup) == _tstof(sOldGroup)) // 组号没有改变
{
int npos = 0;
for (i = 0;i < arOldHeight.length();i++)
{
//过滤 修改/删除 的保护高度
if (!arProHeight.find(arOldHeight[i],npos))
{
ThunderContainer->AppendRemoveLineProHeight(sGroup,arOldHeight[i]);
}
}
ThunderContainer->AppendLineProHeight(sGroup, arProHeight);
}
else // 改变组号
{
thunderXData.SetXData(m_idThunderLine, KEY_LINE_GROUP_NO, sGroup);
// 将该针从原组中移除
AcGeDoubleArray arOldPro;
thunderXData.GetProtectHeightFromObjEx(m_idThunderLine, arOldPro);
ThunderContainer->RemoveThunderLine(sOldGroup, m_idThunderLine);
ThunderContainer->AppendLineProHeight(sOldGroup, arOldPro);
// 将该针添加到新组
ThunderContainer->AppendThunderLine(sGroup, m_idThunderLine);
ThunderContainer->AppendLineProHeight(sGroup, arProHeight);
}
thunderXData.SetProtectHeightToObjEx(m_idThunderLine, arProHeight);
thunderXData.SetXData(m_idThunderLine,KEY_LINE_PRO_RADIUS,sGRadius);
thunderXData.SetXData(m_idThunderLine,KEY_LINE_HEIGHT,sHeight);
thunderXData.SetXData(m_idThunderLine,TEL_ORDER_NUMBER,sNum);
// 重绘
CThunderCmdGroup::bExecute = TRUE;
CDialog::OnOK();
}
void CThunderLineSetDlg::ReadDlgData()
{
//读取设置
CString sGroup;
CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.GetValue(KEY_LINE_GROUP_NO,sGroup); //线宽
if (!sGroup.IsEmpty())
{
m_wndEdtGroup.SetWindowText(sGroup);
}
else
m_wndEdtGroup.SetWindowText(_T("1"));
int npos = 0;
regProp.GetValue(_T("LINE_RADIUS"),npos);
m_cmbRadius.SetCurSel(npos);
CString sLineH;
regProp.GetValue(_T("LINE_HEIGHT"),sLineH);
m_wndEdtLineH.SetWindowText(sLineH);
}
void CThunderLineSetDlg::SaveDlgData()
{
//保存设置
CString sGroup;
m_wndEdtGroup.GetWindowText(sGroup);
CRegProperty regProp(GetRegLocation(), TEL_OBJECTKEY);
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.SetValue(KEY_LINE_GROUP_NO,sGroup); //最后组号
int npos = m_cmbRadius.GetCurSel();
regProp.SetValue(_T("LINE_RADIUS"),npos);
CString sLineH;
m_wndEdtLineH.GetWindowText(sLineH);
regProp.SetValue(_T("LINE_HEIGHT"),sLineH);
}
void CThunderLineSetDlg::OnClose()
{
CDialog::OnClose();
acedPostCommand(_T("\33\33"));
}
void CThunderLineSetDlg::PostNcDestroy()
{
CDialog::PostNcDestroy();
}
void CThunderLineSetDlg::OnDestroy()
{
if(m_nUseType == eCreate)
{
SaveDlgData();
}
CDialog::OnDestroy();
}
void CThunderLineSetDlg::OnBnClickedButton1()
{
UpdateData();
int nCnt = m_LstData.GetItemCount();
CString sTxt;
sTxt.Format(_T("%d"),nCnt + 1);
m_LstData.InsertItem(nCnt,sTxt);
double dH = _ttof(m_strPinHeight);
dH -= 1;
sTxt.Format(_T("%d"),(int)(dH));
m_LstData.SetItemText(nCnt,1,sTxt);
for (int i = 0;i < m_LstData.GetItemCount();i++)
{
sTxt.Format(_T("%d"),i + 1);
m_LstData.SetItemText(i,0,sTxt);
}
}
void CThunderLineSetDlg::OnBnClickedButton2()
{
POSITION ps = m_LstData.GetFirstSelectedItemPosition();
if (ps != NULL)
{
int nItem = m_LstData.GetNextSelectedItem(ps);
if (nItem != -1)
{
m_LstData.DeleteItem(nItem);
CString sTxt;
for (int i = 0;i < m_LstData.GetItemCount();i++)
{
sTxt.Format(_T("%d"),i + 1);
m_LstData.SetItemText(i,0,sTxt);
}
}
}
}