194 lines
4.4 KiB
C++
194 lines
4.4 KiB
C++
#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<CSortLineData*> 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<CSortCircArcData*> 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<CWallData*> CWallDataPtrArray;
|
|
|
|
|
|
class TELAPI CWallIdentify : public CObject
|
|
{
|
|
DECLARE_DYNAMIC(ATSWallIdentify)
|
|
|
|
public:
|
|
CWallIdentify();
|
|
virtual ~CWallIdentify();
|
|
|
|
// 识别构件
|
|
virtual BOOL DoIdentify(DList<XCurveSegment> &lstSeg);
|
|
|
|
CWallDataPtrArray m_arpData;
|
|
|
|
protected:
|
|
// 创建墙线数据
|
|
void OnCreateCurveData(DList<XCurveSegment> &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__)
|