#pragma once #include #include #include class CStakeRecord { public: struct _Data_ { // 桩号 CString stake; // 插入点 AcGePoint3d pt; // 字符串数据 CString sData; // 功能节点 std::set features; void clear() { sData.Empty(); features.clear(); stake.Empty(); pt = AcGePoint3d::kOrigin; } }; typedef std::map StakeInsPts; struct compare { compare(LPCTSTR psz) : shead(psz) {} bool operator () (const CStakeRecord &d) const { return d.m_sHead == shead; } CString shead; }; enum ERecType { // 坡度与距离记录 eGradRec = 0, // 普通数据记录 eStringRec, // 功能节点记录 eFeatureRec, // 里程节点记录 eMilestoneRec, }; public: CStakeRecord(): m_datas(0){} CStakeRecord(LPCTSTR head, const std::vector &stakes, const std::vector &data); CStakeRecord(LPCTSTR head, const std::vector &data); ~CStakeRecord() {} public: // 将数据输出,最后画一根线。返回线的Y // ptMax,ptMin为图框最大最小值 // preY 上一条记录的Y值 double draw(AcDbObjectId &id , const double &preY , const double &headW , const double &dLeft , const double &dMid , const double &dRight , const AcGeMatrix3d mat ); // 初始化文字插入点 void init(const StakeInsPts &dataSet); void setHeadString(LPCTSTR psz) { m_sHead = psz; } void setRecType(const ERecType &type) { m_type = type; } void addData(const _Data_ &data) { m_datas.push_back(data); } bool findData(const CString &stake, _Data_ *&data); static void setStaticValue(const double &dScale); // 生成表头文字 AcDbText* generateHeadText(); // 得到此行最大高度 double getMaxHeight(); private: // 生成垂直文字 AcDbText* generateText_V(LPCTSTR str, const float &dH, const float &dF, LPCTSTR style); // 生成水平文字 AcDbText* generateText_H(LPCTSTR str, const float &dH, const float &dF, LPCTSTR style); // 得到文字外围框 AcDbExtents getTextExtent(AcDbText *p); // 得到X方向上的最大宽度 double getHeadStringExtentX(); // 得到Y方向上的最大宽度 double getHeadStringExtentY(); // 计算正行数据的插入点 // y 为上一行数据的插入点Y值 void calcInsertPointY(const double &y, double &rowMaxH); public: // 数据 按列 std::vector<_Data_> m_datas; private: // 行头文字 CString m_sHead; // 行头文字的插入点 AcGePoint3d m_ptHead; // 记录类型 ERecType m_type; // 数据字高 static float m_dataTextHeight; // 数据宽度比例 static float m_dataTextFactor; // 数据文字样式 static CString m_dataTextStyle; // 行头字高 static float m_headTextHeight; // 行头宽度比例 static float m_headTextFactor; // 行头文字样式 static CString m_headTextStyle; public: // 文字与表格线间距 static double m_dTxtSpace; // 表头中文字与表格的间距 static double m_dHeadTblTxtSpace; }; namespace ZD_OUT { // 纵断数据 static CString SECTION_ZDSJ(_T("[zdsj]")); // 桩号 static CString KEY_STAKENO(_T("路中线桩号")); // 覆土 static CString KEY_SOIL(_T("管廊覆土")); // 外顶标高 static CString KEY_TOP_ELEV(_T("管廊外顶高程")); // 现状地面高程 static CString KEY_CURRENT_GROUND_ELEV(_T("现状地面高程")); // 设计地面高程 static CString KEY_DESIGN_GROUND_ELEV(_T("设计地面高程")); // 设计坡度与距离 static CString KEY_GRADE_DISTANCE(_T("设计坡度与距离")); // 所在管廊坡度 static CString KEY_GRADE(_T("所在管廊坡度")); // 所在管廊距离 static CString KEY_DISTANCE(_T("所在管廊距离")); // 功能节点 static CString KEY_FEATURE(_T("功能布置")); // 里程节点 static CString KEY_MILESTONE(_T("里程节点")); // 内底高程 static CString KEY_BOTTOM_INNER_ELEV(_T("管廊内底高程")); // 管廊桩号 static CString KEY_GL_STAKENO(_T("管廊里程")); // 覆土高度 static CString KEY_SOIL_ELEV(_T("覆土高度")); // 盾构体积 static CString KEY_SH_EW_VOL(_T("盾构体积")); // 节点GUID static CString KEY_NODE_GUID(_T("GUID")); // 表头 static LPCTSTR g_TableHead[] = { (LPCTSTR)ZD_OUT::KEY_STAKENO , (LPCTSTR)ZD_OUT::KEY_SOIL , (LPCTSTR)ZD_OUT::KEY_TOP_ELEV , (LPCTSTR)ZD_OUT::KEY_CURRENT_GROUND_ELEV , (LPCTSTR)ZD_OUT::KEY_DESIGN_GROUND_ELEV , (LPCTSTR)ZD_OUT::KEY_GRADE_DISTANCE , (LPCTSTR)ZD_OUT::KEY_FEATURE , (LPCTSTR)ZD_OUT::KEY_MILESTONE , (LPCTSTR)ZD_OUT::KEY_BOTTOM_INNER_ELEV , (LPCTSTR)ZD_OUT::KEY_GL_STAKENO , (LPCTSTR)ZD_OUT::KEY_SOIL_ELEV , (LPCTSTR)ZD_OUT::KEY_SH_EW_VOL }; // 表头文字高 static CString KEY_HEAD_H(_T("表头文字高")); // 表头文字样式 static CString KEY_HEAD_S(_T("表头文字样式")); // 表头文字宽度比例 static CString KEY_HEAD_W(_T("表头文字宽度比例")); // 数据文字高 static CString KEY_DATA_H(_T("数据文字高")); // 数据文字样式 static CString KEY_DATA_S(_T("数据文字样式")); // 数据文字宽度比例 static CString KEY_DATA_W(_T("数据文字宽度比例")); // 管廊桩号的起始桩号 static CString KEY_DATA_GL_STAKENO(_T("管廊桩号的起始桩号")); // 纵断网格 static CString SECTION_ZDWG(_T("[zdwg]")); // 标尺间距 static CString KEY_GRID_INTERVAL(_T("标尺间距")); // 刻度精度 static CString KEY_GRID_PREC(_T("刻度精度")); //刻度文字高 static CString KEY_GRID_H(_T("刻度文字高")); //刻度文字样式 static CString KEY_GRID_S(_T("刻度文字样式")); //刻度文字宽度比例 static CString KEY_GRID_W(_T("刻度文字宽度比例")); //比例文字高 static CString KEY_RATIO_W(_T("比例文字高")); //比例文字样式 static CString KEY_RATIO_S(_T("比例文字样式")); //比例文字宽度比例 static CString KEY_RATIO_H(_T("比例文字宽度比例")); //箭头宽度 static CString KEY_ARROW_W(_T("箭头宽度")); // 标尺宽度 static CString KEY_GRID_WH(_T("标尺宽度")); // 刻度与标尺间距 static CString KEY_GRID_TEXT_INTERVAL(_T("刻度与标尺间距")); // 纵断节点 static CString SECTION_ZDJD(_T("[zdjd]")); // 节点比例 static CString KEY_NODE_SCALE(_T("节点比例")); // 节点标注类型 桩号或管廊长度 static CString KEY_NODE_DIMTYPE(_T("节点标注类型")); // 是否标注变形缝 static CString KEY_BXFBZ_S(_T("标注变形缝")); // 引出标注 static CString SECTION_YCBZ(_T("[ycbz]")); // 引出字高 static CString KEY_YCBZ_H(_T("引出字高")); // 引出文字样式 static CString KEY_YCBZ_S(_T("引出文字样式")); // 其它设置 static CString SECTION_QTSZ(_T("[qtsz]")); // 里程/中心线 桩号间隔 static CString KEY_QTSZ_LCJG(_T("桩号间隔")); void getDataRecords(AcDbObjectIdArray &arrIDs , std::vector &records); void insertZDTable(AcDbObjectId &recId , AcDbObjectIdArray &arrIDs , std::vector &records , const AcGePoint3d &ptMin , const AcGePoint3d &ptMax , const bool &bEnd); void insertDimension(AcDbObjectId &recId); bool readConfiguration(); double getGridLeftPointDist(); CString getConfiguration(LPCTSTR key); void getConfiguration(std::vector> &v); }