292 lines
11 KiB
C++
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_)
|