#pragma once #include "resource.h" #include #include #include "GlwCAcUiDialog.h" class TBuildInfomationDlg; class TRedLine { friend TBuildInfomationDlg; private: AcDbObjectId m_id; std::vector m_RedSegs; TGGePoly3D m_RedlinePoly, m_BacklinePoly, m_LightBuildPoly, m_BuildPoly; std::vector m_colorLines; AcGePoint3d m_ptCloses; // 退线方向边与退线最近边的交点 AcGePoint3d m_ptOther; // 退线方向边的另一点 AcGeVector3d m_vtCloses; // 最近边的方向,由m_ptCloses点指向最近边的另一点 AcGeVector3d m_vtOther; // 与方向边相交的另一边的方向,由 m_ptOther点指向另一点(具体看下图) AcGeVector3d m_vtDirect; // 方向边方向,由 m_ptCloses指向m_ptOther // 围成轻建筑曲线的主要三根线段,分别与退线的other,closes两线段平等,与direct线段重合 AcGeLineSeg3d m_segLightCloses; AcGeLineSeg3d m_segLightOther; AcGeLineSeg3d m_segLightDirect; // 围成建筑曲线的主要四根线段 AcGeLineSeg3d m_segBuildCloses; AcGeLineSeg3d m_segBuildOther; AcGeLineSeg3d m_segBuildCloses1; // 与退线方向边平行 AcGeLineSeg3d m_segBuildOther1; // 与退线方向边平行 /************************************************************************ segOther segCloses | | ^ | | ^ m_vtOther| | | | m_vtCloses | | |_______________________| segDirect ************************************************************************/ int m_idxDirect, m_idxCloses, m_idxOther; // 建筑物方向,建筑物靠近的边儿, 和与方向边相交的另一边(具体位置看上图) int m_nUpAtuoNum; // 地上机动停车数量 int m_nUpBikeNum; // 地上非机动车数量 double m_dGreen; // 绿化率 double m_dVolume; // 容积率 double m_dBuildDensity; // 建筑密度 double m_dUpBuildArea; // 地上面积 double m_dDownBuildArea; // 地下面积 double m_dBacklineRed, m_dBacklineYellow, m_dBacklineGreen, m_dBacklineCyan, m_dBacklineBlue, m_dBacklineMagenta, m_dBacklineWhite;// 退线长度 double m_dRedlineArea, m_dBackLineArea; // 场地红线面积,退线面积 double m_dFootLength; // 步行街长度 bool m_b3Floor; // 三层方案? 否为四层方案 AcGePoint3d m_ptInsertFootDim; // 插入步行街标注的位置 AcGePoint3d m_ptInsertLightDim1; // 插入轻资产标注的位置 AcGePoint3d m_ptInsertLightDim2; // 插入轻资产标注的位置 std::pair m_DimA1; std::pair m_DimA2; std::pair m_DimB; std::pair m_DimH1; std::pair m_DimH2; public: TRedLine():m_id(AcDbObjectId::kNull), m_RedSegs(0), m_idxCloses(-1), m_idxDirect(-1), m_idxOther(-1), m_nUpAtuoNum(0), m_nUpBikeNum(0), m_dGreen(.0), m_dVolume(.0), m_dBuildDensity(.0), m_dUpBuildArea(.0), m_dDownBuildArea(.0), m_dBacklineRed(10.), m_dBacklineYellow(10.), m_dBacklineGreen(10.), m_dBacklineCyan(10.), m_dBacklineBlue(10.), m_dBacklineMagenta(10.), m_dBacklineWhite(10.), m_dRedlineArea(.0), m_dBackLineArea(.0), m_dFootLength(0.), m_b3Floor(false), m_ptInsertLightDim1(AcGePoint3d::kOrigin), m_ptInsertFootDim(AcGePoint3d::kOrigin){} public: AcGeLineSeg3d GetBLDirectSeg(); AcGeLineSeg3d GetBLClosesSeg(); AcGeLineSeg3d GetBLOtherSeg(); void CalcBackLine(); double CalcNo3Step(); bool CalcNo4Step(); // 算出围成S1面积的曲线 bool CalcLightBuildPoly(const double &a, const double &h2, const double &S1, double &h1); // 算出围成S2面积的曲线 bool CalcBuildPoly(const double &a, const double &h1, const double &h2, const double &S1, const double &S2, double &b); void CalcCurtainPoly(const double &b, const double &h1); void CalcDim(); private: double GetBacklineValue(const int &idx); AcGeLineSeg3d GetSegByIdx(const int &idx, const TGGePoly3D &poly); }; class TBuildInfomationDlg : public CModelessDialog { DECLARE_DYNAMIC(TBuildInfomationDlg) enum { IDD = IDD_DIALOG_DLWD}; public: TBuildInfomationDlg(CWnd* pParent = NULL); // standard constructor virtual ~TBuildInfomationDlg(); virtual BOOL OnInitDialog(); private: void ShowBackLineCtrl(); void BeforSelectRedline(); void AfterSelectRedline(); void RemoveColorLine(); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support DECLARE_MESSAGE_MAP() afx_msg void OnBnClickedButtonSelect(); afx_msg void OnBnClickedButtonCalc(); afx_msg void OnDestroy(); afx_msg void OnClose(); afx_msg HBRUSH OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor); afx_msg LONG_PTR OnAcadKeepFocus(UINT_PTR, LONG_PTR); private: TRedLine m_redline; std::vector m_cwnds; public: afx_msg void OnEnKillfocusEdit(); };