// = 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 MapUnionLine; typedef std::map MapGrouping; typedef std::map MapThunderLineCltResult; typedef std::map MapThunderLinePtr; typedef std::list 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& arPtSec); //得到圆最外围交点和最外围球 void GetSphereSolids(const AcArray& arPt,const AcGeDoubleArray& arRadius,double dGroundRadius,AcArray& arSolid,AcArray& 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& arPtInter,AcArray& 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& lstPtPair, AcGePoint3d& ptOut); AcDbLine* GetSolidExtrudePath(AcDb3dSolid* pSolid1, AcDb3dSolid* pSolid2, std::list& 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& 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_)