#if !defined(__WALLIDENTIFY_H__) #define __WALLIDENTIFY_H__ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // 墙识别类 #define TOL_DIST 20 #define TOL_ANGLE 0.3*PI/180 #define MAX_WIDTH 800 #define MIN_WIDTH 0 #define IS_SINGLE FALSE class CSortData { public: // 设置误差条件 static void SetTolerence(double dDist, double dAngle); static void SetGridSize(double dX, double dY, double dZ); // 圆心误差,长度 static double m_dTolDist; // 方向角误差,弧度 static double m_dTolAngle; // 格子尺寸 static AcGePoint3d m_ptGridSize; }; ////////////////////////////////////////////////////////////////////////// class CSortLineData : public CSortData { public: CSortLineData(AcGePoint3d ptStart, AcGePoint3d ptEnd); // 计算与另一直线的重合度 double GetOverlap(const CSortLineData* pData); // 连接另一直线 void Connect(const CSortLineData* pData); // 实体 AcDbObjectId m_idEnt; // 起点 AcGePoint3d m_ptStart; // 终点 AcGePoint3d m_ptEnd; // 方向角度 double m_dAngle; // 到0,0点的垂直距离 double m_dDist; // 临时使用值 DWORD m_dwParam; double m_dParam; // 按方向顺序排序 static int DirectCompare(const void* pElem1, const void* pElem2); // 按前后->起点位置顺序排序 static int DistanceCompare(const void* pElem1, const void* pElem2); // 按[m_dParam]从大到小排序 static int ParamDecCompare(const void* pElem1, const void* pElem2); }; typedef AcArray CSortLineDataPtrArray; ////////////////////////////////////////////////////////////////////////// class CSortCircArcData : public CSortData { public: CSortCircArcData(AcGePoint3d ptCen, double dRadius, double dStartAngle, double dEndAngle); // 计算与另一圆弧的重合度 double GetOverlap(const CSortCircArcData* pData); // 连接另一圆弧 void Connect(const CSortCircArcData* pData); // 实体 AcDbObjectId m_idEnt; // 圆心 AcGePoint3d m_ptCenter; // 法向量 AcGeVector3d m_vtNormal; // 参考向量 AcGeVector3d m_vtRef; // 半径 double m_dRadius; // 圆心角 double m_dAngle; // 临时使用值 DWORD m_dwParam; double m_dParam; // 按[圆心->半径]顺序排序 static int CircArcDataCompare(const void* pElem1, const void* pElem2); // 按[m_dParam]从大到小排序 static int ParamDecCompare(const void* pElem1, const void* pElem2); }; typedef AcArray CSortCircArcDataPtrArray; class CWallData : public CObject { DECLARE_SERIAL(CWallData) public: // 墙线边数据 class tagWallSide { public: tagWallSide() : m_dAngle(0.0) {} // 是否为直墙边 BOOL isLinear() {return (!(fabs(m_dAngle) > 0.0));} // 直墙边的起点和终点 AcGePoint3d& startPoint() {return asPnt3d(m_ptVar[0]);} AcGePoint3d& endPoint() {return asPnt3d(m_ptVar[1]);} // 弧墙边的圆心和带半径长的参考向量 AcGePoint3d& center() {return asPnt3d(m_ptVar[0]);} AcGeVector3d& refVec() {return asVec3d(m_ptVar[1]);} double radius() {return refVec().length();} // 墙边实体 AcDbObjectId m_idCurve; // 弧墙边圆心角 double m_dAngle; // 墙边法向量 AcGeVector3d m_vtNormal; private: // 保存起始点/圆心带半径长的参考向量 ads_point m_ptVar[2]; }m_cSide1, m_cSide2; }; typedef AcArray CWallDataPtrArray; class TELAPI CWallIdentify : public CObject { DECLARE_DYNAMIC(ATSWallIdentify) public: CWallIdentify(); virtual ~CWallIdentify(); // 识别构件 virtual BOOL DoIdentify(DList &lstSeg); CWallDataPtrArray m_arpData; protected: // 创建墙线数据 void OnCreateCurveData(DList &lstSeg, CSortLineDataPtrArray& arpLines, CSortCircArcDataPtrArray& arpCircArcs); // 创建直线墙数据 void OnCreateLinearWallData(CSortLineDataPtrArray& arpLines); // 直线配对 void OnCalcLinePair(CSortLineData** pDataArray, int iCount); // 创建墙数据 void OnCreateLinePair(CSortLineData* pLine1, CSortLineData* pLine2 = NULL); // 调整近似直线的圆弧的圆心 void OnCorrectLinearArcData(CSortCircArcDataPtrArray& arpLinearArcs); // 创建弧线墙数据 void OnCreateCircArcWallData(CSortCircArcDataPtrArray& arpCircArcs); // 弧线配对 void OnCalcCircArcPair(CSortCircArcData** pDataArray, int iCount); // 创建墙数据 void OnCreateCircArcPair(CSortCircArcData* pArc1, CSortCircArcData* pArc2 = NULL); // 释放墙线数据 void Release(); }; #endif // !defined(__WALLIDENTIFY_H__)