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

394 lines
6.7 KiB
C++

#ifndef __TGFOLDDEF_H__
#define __TGFOLDDEF_H__
#if _MSC_VER > 1000
#pragma once
#endif
//折线法避雷数据定义
typedef struct XFoldThunder
{
int m_nGroup; //组号
int m_nNo; //编号
double m_dHeight; //避雷针高度
AcGePoint3d m_ptPos; //插入点
AcGeDoubleArray m_arProHeight; //保护高度
AcDbObjectId m_Id; //避雷针ID
}XFoldThunder;
//弧线
typedef struct XFoldProArc
{
AcGePoint3d m_ptCenter; //圆心
AcGePoint3d m_ptS; //绑定的起点,用于圆弧求交时确定结果取值
double m_dR; //半径
double m_dAngleS; //起始角度
double m_dAngleE; //终止角度
BOOL ConverToArc(XArc& pArc)
{
if (m_dR > 1e-3)
{
pArc.SetRadius(m_dR);
pArc.SetStarAngle(m_dAngleS);
pArc.SetEndAngle(m_dAngleE);
pArc.SetCenterPt(m_ptCenter);
return TRUE;
}
return FALSE;
}
}XFoldProArc;
//半边折线
typedef struct XHalfFoldLine
{
int m_nNo; //关联避雷针编号
AcGePoint3d m_ptS; //切点
XFoldProArc m_ArcS; //起点关联弧线
BOOL m_bValid; //半边是否有效
BOOL GetCntArc(XArc& pArc)
{
return m_ArcS.ConverToArc(pArc);
}
}XHalfFoldLine;
//折线
typedef struct TGFoldProLine
{
XHalfFoldLine m_LinePart1;
XHalfFoldLine m_LinePart2;
AcGePoint3d m_ptTurn; //折点
BOOL m_bValid;
XHalfFoldLine& GetHalfFoldLine(int nIndex)
{
if (nIndex == 1)
{
return m_LinePart1;
}
return m_LinePart2;
}
void GetProLineNo(int& nNo1,int& nNo2)
{
nNo1 = m_LinePart1.m_nNo;
nNo2 = m_LinePart2.m_nNo;
}
void GetStartPtByNo(int nNo,AcGePoint3d& ptS)
{
if (m_LinePart1.m_nNo == nNo)
{
ptS = m_LinePart1.m_ptS;
}
if (m_LinePart2.m_nNo == nNo)
{
ptS = m_LinePart2.m_ptS;
}
}
void SetStartPtByNo(int nNo,const AcGePoint3d& ptS)
{
if (m_LinePart1.m_nNo == nNo)
{
m_LinePart1.m_ptS = ptS;
}
if (m_LinePart2.m_nNo == nNo)
{
m_LinePart2.m_ptS = ptS;
}
}
void SetAnotherPt(int nNo,const AcGePoint3d& ptS)
{
if (m_LinePart1.m_nNo != nNo)
{
m_LinePart1.m_ptS = ptS;
}
if (m_LinePart2.m_nNo != nNo)
{
m_LinePart2.m_ptS = ptS;
}
}
AcGePoint3d GetTangentPoint(int nThunderNo)
{
if (m_LinePart1.m_nNo == nThunderNo)
{
return m_LinePart1.m_ptS;
}
if (m_LinePart2.m_nNo == nThunderNo)
{
return m_LinePart2.m_ptS;
}
return AcGePoint3d::kOrigin;
}
void InvalidArcByNo(int nNo)
{
if (m_LinePart1.m_nNo == nNo)
{
m_LinePart1.m_ArcS.m_dR = 0.0;
}
if (m_LinePart2.m_nNo == nNo)
{
m_LinePart2.m_ArcS.m_dR = 0.0;
}
}
void InvalidHalfByNo(int nNo)
{
if (m_LinePart1.m_nNo == nNo)
{
m_LinePart1.m_bValid = FALSE;
}
if (m_LinePart2.m_nNo == nNo)
{
m_LinePart2.m_bValid = FALSE;
}
}
void InvalidAnothHalf(int nNo)
{
if (m_LinePart1.m_nNo != nNo)
{
m_LinePart1.m_bValid = FALSE;
}
if (m_LinePart2.m_nNo != nNo)
{
m_LinePart2.m_bValid = FALSE;
}
}
void GetArcByNo(int nNo,XFoldProArc& arc)
{
if (m_LinePart1.m_nNo == nNo)
{
arc = m_LinePart1.m_ArcS;
}
if (m_LinePart2.m_nNo == nNo)
{
arc = m_LinePart2.m_ArcS;
}
}
void SetArcByNo(int nNo,const XFoldProArc& arc)
{
if (m_LinePart1.m_nNo == nNo)
{
m_LinePart1.m_ArcS = arc;
}
if (m_LinePart2.m_nNo == nNo)
{
m_LinePart2.m_ArcS = arc;
}
}
void ConverToPL(AcDbPolyline* pLine)
{
if (pLine == NULL)
{
return;
}
XPoint ptS1,ptS2,ptTurn;
int nPos = 0;
if (m_LinePart1.m_bValid)
{
ptS1 = m_LinePart1.m_ptS;
pLine->addVertexAt(nPos,ptS1.AsAcGePoint2d());
++nPos;
}
ptTurn = m_ptTurn;
pLine->addVertexAt(nPos,ptTurn.AsAcGePoint2d());
++nPos;
if (m_LinePart2.m_bValid)
{
ptS2 = m_LinePart2.m_ptS;
pLine->addVertexAt(nPos,ptS2.AsAcGePoint2d());
}
}
}TGFoldProLine,*PFoldProLine;
typedef struct TGFOLDNO
{
int m_nNo1;
int m_nNo2;
bool operator == (const TGFOLDNO& FoldNo) const
{
if ((m_nNo1 == FoldNo.m_nNo1 && m_nNo2 == FoldNo.m_nNo2) ||
(m_nNo1 == FoldNo.m_nNo2 && m_nNo2 == FoldNo.m_nNo1))
{
return true;
}
return false;
}
bool operator != (const TGFOLDNO& FoldNo) const
{
if ((m_nNo1 == FoldNo.m_nNo1 && m_nNo2 == FoldNo.m_nNo2) ||
(m_nNo1 == FoldNo.m_nNo2 && m_nNo2 == FoldNo.m_nNo1))
{
return false;
}
return true;
}
bool operator < (const TGFOLDNO& FoldNo) const
{
if (m_nNo1 + m_nNo2 < FoldNo.m_nNo1 + FoldNo.m_nNo2)
{
return true;
}
else if (m_nNo1 + m_nNo2 == FoldNo.m_nNo1 + FoldNo.m_nNo2)
{
if ((*this) != FoldNo)
{
if (m_nNo1 < FoldNo.m_nNo1)
{
return true;
}
}
}
return false;
}
}TGFOLDNO;
typedef struct PairProLine
{
PFoldProLine m_pProline1;
PFoldProLine m_pProline2;
}PAIRPROLINE;
typedef struct FoldCalcResult
{
double m_dEffectD; //有效距离
double m_dBx; //BX
double m_dY; //Y
double m_dH0; //h0
}FoldCalcResult;
typedef std::vector<XFoldThunder> FOLDPINLST;
typedef std::map<int,FOLDPINLST> FOLDPINGROUP;
inline BOOL IsExist(const XFoldThunder& thunder,const FOLDPINLST& arLst,int& nPos)
{
for (int i = 0;i < arLst.size();i++)
{
if (thunder.m_Id == arLst[i].m_Id)
{
nPos = i;
return TRUE;
}
}
nPos = -1;
return FALSE;
}
inline BOOL IsExist(const XFoldThunder& thunder,const FOLDPINLST& arLst)
{
for (int i = 0;i < arLst.size();i++)
{
if (thunder.m_Id == arLst[i].m_Id)
{
return TRUE;
}
}
return FALSE;
}
inline BOOL IsExist(std::map<TGFOLDNO,std::vector<PFoldProLine> >& arPre,const TGFOLDNO& FoldNo)
{
std::map<TGFOLDNO,std::vector<PFoldProLine> >::iterator itor;
for (itor = arPre.begin();itor != arPre.end();++itor)
{
if (itor->first == FoldNo)
{
return TRUE;
}
}
return FALSE;
}
inline BOOL IsEqual(const AcDbObjectIdArray& arIds1,const AcDbObjectIdArray& arIds2)
{
if (arIds1.length() != arIds2.length())
{
return FALSE;
}
int nPos = 0;
int i = 0;
for (i = 0;i < arIds1.length();++i)
{
if (!arIds2.find(arIds1[i],nPos))
{
return FALSE;
}
}
for (i = 0;i < arIds2.length();++i)
{
if (!arIds1.find(arIds2[i],nPos))
{
return FALSE;
}
}
return TRUE;
}
inline BOOL IsExist(const std::vector<AcDbObjectIdArray>& arSrc,const AcDbObjectIdArray& arIds)
{
if (arIds.length() == 0)
{
return TRUE;
}
for (int i = 0;i < arSrc.size();++i)
{
if (IsEqual(arSrc[i],arIds))
{
return TRUE;
}
}
return FALSE;
}
#define FOLD_BLOCK_SIGN _T("00000112")
inline AcGePoint3d Mid(AcGePoint3d ptGe1, AcGePoint3d ptGe2)
{
return AcGePoint3d((ptGe1.x + ptGe2.x) / 2.0,(ptGe1.y + ptGe2.y) / 2.0,(ptGe1.z + ptGe2.z) / 2.0);
}
inline void SortDoubleArray(AcGeDoubleArray& arEls)
{
std::list<double> arDtmp;
int i = 0;
for (i = 0;i < arEls.length();++i)
{
arDtmp.push_back(arEls[i]);
}
arDtmp.sort();
arEls.setLogicalLength(0);
std::list<double>::iterator itor;
for (itor = arDtmp.begin();itor != arDtmp.end();++itor)
{
arEls.append(*itor);
}
}
#endif