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

292 lines
11 KiB
C++

// = FileName: _DRAWTHUNDER3D_H__
// = Version: 1.0
// = Date: 2008/06/20
// = Description: 画三维和二维图
// = Maintainers:
// 版本号 时间 修改人 修改内容
#if !defined _DRAWTHUNDER3D_H__
#define _DRAWTHUNDER3D_H__
#if _MSC_VER > 1000
#pragma once
#endif
#define EXTRUDE_MAX_SIZE 100
#define EXTRUDE_ALONGPATH_MAX_SIZE 75
#include "CaculateResult.h"
class TGDrawThunder
{
public:
TGDrawThunder();
virtual ~TGDrawThunder();
typedef struct LinePtPair
{
AcGePoint3d pt1;
AcGePoint3d pt2;
} LINEPTPAIR;
typedef struct T3DNode
{
AcGePoint3d ptPro;
AcGePoint3d ptVF;
AcGePoint3d ptPort;
} T3DNODE;
typedef struct T3DCalcNode
{
CCaculateResult rstPro;
CCaculateResult rstVF;
CCaculateResult rstPort;
} T3DCALCNODE;
typedef std::map<int,AcDbVoidPtrArray> MapUnionLine;
typedef std::map<int,AcDbObjectIdArray> MapGrouping;
typedef std::map<AcDbObjectId,lstCltResult> MapThunderLineCltResult;
typedef std::map<AcDbObjectId,AcDbVoidPtrArray> MapThunderLinePtr;
typedef std::list<AcDbObjectIdArray> LstParallelTLine;
public:
static AcGePoint3d Mid2Point(const AcGePoint3d& pt1, const AcGePoint3d& pt2);
//画3D图
void DrawThunder3DArea(LPCTSTR pszGroupNo, lstCltResult& lstData, BOOL bPreview = FALSE);
void DrawThunder2DArea(const AcGeDoubleArray& arHeight, LPCTSTR pszGroupNo = NULL);
void DrawThunderLine(LPCTSTR pszGroupNo, const AcGeDoubleArray& arHeight);
// 三维预览调用
void DrawThunderLine(LPCTSTR pszGroupNo, const AcDbObjectIdArray& arID);
void DrawThunder2DArea(LPCTSTR pszGroupNo, const AcDbObjectIdArray& arID);
//显示层
void ShowLayer(LPCTSTR lpLayerName,BOOL bShow);
// 更改图层
void Set2dLayer(const CString& strLayer2d);
void Set3dLayer(const CString& strLayer3d);
//得到当前计算结果 返回最大列数
int GetNowCaculateResult(lstCltResult& lstData);
//生成3D对象
AcDb3dSolid* Create3DSolid(const CCaculateResult& result);
//生成2针的避雷区域
AcDb3dSolid* GetThunderAreaBy2Pin(const CCaculateResult& result1,const CCaculateResult& result2,BOOL bCheck = TRUE);
//生成3针的避雷区域
//生成2滚球实体
void GetSphereSolids(const AcGePoint3d& ptInsert1,const AcGePoint3d& ptInsert2,double dProRadius1,double dProRadius2,double dGroundRadius,AcDb3dSolid*& pCircleSolid1,AcDb3dSolid*& pCircleSolid2);
//生成3滚球实体
void Get3PeripheryPoints(const AcGePoint3d& ptInsert1,const AcGePoint3d& ptInsert2,const AcGePoint3d& ptInsert3,double dProRadius1,double dProRadius2,double dProRadius3,AcArray<AcGePoint3d>& arPtSec);
//得到圆最外围交点和最外围球
void GetSphereSolids(const AcArray<AcGePoint3d>& arPt,const AcGeDoubleArray& arRadius,double dGroundRadius,AcArray<AcDb3dSolid*>& arSolid,AcArray<AcGePoint3d>& arPtInter);
//生成2避雷针中间一块区域
AcDb3dSolid* Get2DIntersectionArea(const CCaculateResult& result1,const CCaculateResult& result2);
//生成3避雷针中间一块区域
AcDb3dSolid* Get3DIntersectionArea(const CCaculateResult& result1,const CCaculateResult& result2,const CCaculateResult& result3);
void Get3DIntersectionArea(lstCltResult& arResult,const AcArray<AcGePoint3d>& arPtInter,AcArray<AcDb3dSolid*>& arSolid);
//生成顶部球实体
AcDb3dSolid* GetTopSphereSolid(const CCaculateResult& result1,const CCaculateResult& result2,double dGroundRadius,AcGePoint3d* pt = NULL);
//生成避雷区域实体指针
void MakeThunderEntity(LPCTSTR pszGroupNo, lstCltResult& lstData, BOOL bPreview);
//生成3针形成的中间避雷区域实体
void Make3CenThunderEntity(LPCTSTR pszGroupNo, lstCltResult& lstData, BOOL bPreview, AcDbVoidPtrArray* pArPtr = NULL);
//生成顶部球体和中间区域
void GetTopSphereSolid(lstCltResult& arResult, AcDbVoidPtrArray& arTopPtr);
// 在避雷针的周围画圆
AcDbObjectId DrawCircleRingThunder(const CStringArray& arXData, AcGePoint3d& ptInsert, double dProHt);
void PickupSymbolBySpecGroupNO(PickSet& ssSymbol, LPCTSTR pszGroupNo);
// //得到3针滚球球心
BOOL Get3PinSphereCen(const AcGePoint3d& pt1,const AcGePoint3d& pt2,const AcGePoint3d& pt3,double dGroundRadius,const AcGeVector3d& vecParal,AcGePoint3d& ptCenter,double dProRadius);
//得到两圆圆心到交点连成的REG
AcDbRegion *GetRegionByCircle(const CCaculateResult& result1,const CCaculateResult& result2);
// 删除当前所有2d和3d实体
void DeleteAllEntities(LPCTSTR pszGroupNo = NULL);
void DrawThunderCircle(const AcGeDoubleArray& arProHeight, LPCTSTR pszGroupNo, const AcDbObjectIdArray& arID);
BOOL CheckHasRepeatNum(AcDbObjectIdArray& arID, AcDbObjectIdArray& arIDRepeated);
BOOL CalcThunderData(LPCTSTR pszGNo, const AcGeDoubleArray& arProHeight, const AcDbObjectIdArray& arID, lstCltResult& lstData);
AcDbObjectId CopyEnt(AcDbEntity* pEnt);
AcDbEntity* CopyEntPtr(AcDbEntity* pEnt);
void DeleteThunLineEntities(LPCTSTR pszGNo);
int CalcThunLineData(LPCTSTR pszGNo, const AcGeDoubleArray& arProHeight, const AcDbObjectIdArray& arID, MapThunderLineCltResult& mapData);
void DrawThunLine3D(LPCTSTR pszGNo, MapThunderLineCltResult& mapData, BOOL bPreview = FALSE);
BOOL CheckIsSuitToCreate(const AcDbObjectId& id1, lstCltResult& lstData1, const AcDbObjectId& id2, lstCltResult& lstData2);
BOOL CreateUnionRegion(const AcDbObjectId& id1,lstCltResult& lstData1,const AcDbObjectId& id2,lstCltResult& lstData2,AcDbVoidPtrArray& arSolids);
AcDb3dSolid* CreateUnion3DRegion(const AcDb3dSolid* pBaseSolid,CCaculateResult& data1,CCaculateResult& data2,AcDbCurve* pCve);
BOOL CheckPtIsOnLine(const AcGePoint3d& pt, AcDbPolyline* pLine);
BOOL CheckIsEqualLineTLine(const AcDbObjectId& id1,const AcDbObjectId& id2);
void ClassifyThunderLines(const AcDbObjectIdArray& arID, LstParallelTLine& lstID);
void GetThunderLineMaxPort(const AcDbObjectIdArray& arID, AcGePoint3d& ptS,AcGePoint3d& ptE);
BOOL GetSolidCopingLowPoint(AcDbEntity* pEnt, std::list<LINEPTPAIR>& lstPtPair, AcGePoint3d& ptOut);
AcDbLine* GetSolidExtrudePath(AcDb3dSolid* pSolid1, AcDb3dSolid* pSolid2, std::list<LINEPTPAIR>& lstPtPair);
AcGePoint3d GetArcMidPiont(AcDbArc* pArc, const AcGePoint3d& ptS, const AcGePoint3d& ptE);
AcDb3dSolid* ExtrudeSolid(AcDbRegion* pDepReg, const AcGeVector3d& vtDirTo, double dLength);
AcDb3dSolid* ExtrudeSolidAlongPath(AcDbRegion* pDepReg, AcDbCurve* pCve);
void EreaseObj(const AcDbObjectId& id);
void CalcLinePorts(AcDbRegion* pReg, AcDbCurve* pCve, AcGePoint3d& ptS, AcGePoint3d& ptE);
BOOL IntersectWith2Circle(AcDbCircle* pCir1, AcDbCircle* pCir2, AcGePoint3dArray& arPt);
AcDb3dSolid* CreateRepair3DSolid(AcDb3dSolid* pInt1,const CCaculateResult& pInt1Data1,const CCaculateResult& pInt1Data2,
AcDb3dSolid* pInt2,const CCaculateResult& pInt2Data1,const CCaculateResult& pInt2Data2);
BOOL CalcStretchPaht(AcDbEntity* pEnt1,const CCaculateResult& pInt1Data1,const CCaculateResult& pInt1Data2,
AcDbEntity* pEnt2,const CCaculateResult& pInt2Data1,const CCaculateResult& pInt2Data2,AcDbLine* pPath);
AcDb3dSolid* CreateBoolSubtractSolid(const AcDb3dSolid* pBaseSolid,CCaculateResult& data1,CCaculateResult& data2,AcDbCurve* pCve);
AcGeVector3d CalcRegionNormal(const AcGePoint3d& pt, AcDbRegion* pReg);
void ReleasePtrArray(AcDbVoidPtrArray& arPtr);
void ShowPtrArray(AcDbVoidPtrArray& arPtr);
AcDb3dSolid* CreateExtendSolid(const AcGePoint3dArray& arPts, const AcGeVector3d& vtDir, double dLength);
AcDbArc* GetSolidTopArcByLoop(AcDbEntity* pEnt, std::list<LINEPTPAIR>& lstPtPair);
AcDbArc* GetSolidTopArc(AcDb3dSolid* pSolid1,const CCaculateResult& result1,const CCaculateResult& result2);
void GetPlaneFromSpecFace(AcDbFace* pFace, const AcGePoint3d& ptOr, AcGePlane& plan);
AcDb3dSolid* GetSolidFromFace(AcDbFace* pFace, double dHeight);
AcDb3dSolid* CreateRemovedSolid(AcDb3dSolid* pSolid, const AcDbVoidPtrArray& arFace, const AcGePoint3d& ptOr);
void CreateSliceFace(AcDbArc* pMainArc, const AcGePoint3d& ptS1, AcDbArc* pSubArc, const AcGePoint3d& ptS2, AcDbVoidPtrArray& arFace);
BOOL BooleanOperSolid(AcDb3dSolid* pMainSolid, AcDb3dSolid* pSubSolid, AcDb::BoolOperType nType, const AcGeVector3d& vtDir, double dDist);
BOOL CheckPoint2LineVerFootPoint(AcDbLine* pLine, const AcGePoint3d& pt, AcGePoint3d& ptVF);
BOOL Get2LinePublicSegment(const AcDbObjectId& idLine, const AcDbObjectId& idLine2, T3DNODE& node1, T3DNODE& node2);
AcGePoint3d GetVFootLinePort(const AcGeVector3d& vtDir, AcDbLine* pLine);
BOOL GetCltResultByPosition(lstCltResult& lstSrc, const AcGePoint3d& ptPos, CCaculateResult& data);
BOOL FindSubArray(const AcDbObjectIdArray& arSrc, const AcDbObjectIdArray& arSub);
void AttachThunderData(lstCltResult& lstData1, lstCltResult& lstData2, T3DNODE& node1, T3DNODE& node2, T3DCALCNODE& data1, T3DCALCNODE& data2);
AcGeVector3d GetPubleSolidExDir(const AcDbObjectId& id, T3DCALCNODE& data1, T3DCALCNODE& data2);
AcDb3dSolid* CreatePublicSolid(AcDb3dSolid* pIntPubSolid, CCaculateResult& rst1, CCaculateResult& rst2, const AcGeVector3d& vtDir);
AcDb3dSolid* CreateScissorSolid(T3DCALCNODE& data, AcDb3dSolid* pPub, AcDb3dSolid* pPort, const AcGeVector3d& vtDir, double dLength);
void Create2PortsUnionSolids(LPCTSTR pszGNO, const AcDbObjectIdArray& arLine, MapThunderLineCltResult& mapData, AcDbVoidPtrArray& arSolids);
AcGePoint3d CalcSolidTopPoint(const CCaculateResult& result);
AcDbArc* GetArcSegmentFromCircle(AcDbCircle* pCir, const AcGePoint3d& ptS, const AcGePoint3d& ptE, BOOL bInferior = TRUE);
BOOL CreatePortUnionSolid(const AcDbObjectId& id1,lstCltResult& lstData1,const AcDbObjectId& id2,lstCltResult& lstData2,AcDbVoidPtrArray& arSolids);
bool DocGetMeterUnitDraw();
private:
//存放计算结果
lstCltResult m_lstResult; //计算结果
MapThunderLinePtr m_mapThunLinePtr; //单个避雷线生成的对象
MapUnionLine m_mapLineUnRegSolid; //用于生成避雷线联合reg的实体
AcDbVoidPtrArray m_arCollector; //用于添加到模型空间
AcDbVoidPtrArray m_arRegSolid; //用于生成reg的实体
AcDbVoidPtrArray m_arPreview; //存放预览对象
AcDbVoidPtrArray m_arLinePreview; //存放预览对象
CString m_strLayer2d;
CString m_strLayer3d;
int m_nSinglePinColorIndex;
int m_nMultiPinColorIndex;
};
class CTGTempTol
{
public:
CTGTempTol()
{
m_bPointPrec = FALSE;
m_bVctorPrec = FALSE;
InitEqualPrec();
}
CTGTempTol(double dPointPrec,double dVctorPrec)
{
SetPointEqualPrec(dPointPrec);
SetVctorEqualPrec(dVctorPrec);
}
virtual ~CTGTempTol()
{
if (m_bPointPrec)
{
AcGeContext::gTol.setEqualPoint(m_dPointPrec);
}
if (m_bVctorPrec)
{
AcGeContext::gTol.setEqualVector(m_dVctorPrec);
}
}
void InitEqualPrec()
{
m_dPointPrec = AcGeContext::gTol.equalPoint();
m_dVctorPrec = AcGeContext::gTol.equalVector();
}
void SetPointEqualPrec(double dPrec)
{
m_bPointPrec = TRUE;
m_dPointPrec = AcGeContext::gTol.equalPoint();
AcGeContext::gTol.setEqualPoint(dPrec);
}
void SetVctorEqualPrec(double dPrec)
{
m_bVctorPrec = TRUE;
m_dVctorPrec = AcGeContext::gTol.equalVector();
AcGeContext::gTol.setEqualVector(dPrec);
}
private:
double m_dPointPrec;
double m_dVctorPrec;
BOOL m_bPointPrec;
BOOL m_bVctorPrec;
};
#endif // !defined(AFX_DRAWTHUNDER3D_H__85FE280C_C438_4720_8B9D_F72E5EC6139F__INCLUDED_)