Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

281 lines
7.1 KiB
C++

#pragma once
#include <vector>
#include <set>
#include <map>
class CStakeRecord
{
public:
struct _Data_
{
// 桩号
CString stake;
// 插入点
AcGePoint3d pt;
// 字符串数据
CString sData;
// 功能节点
std::set<CString> features;
void clear() { sData.Empty(); features.clear(); stake.Empty(); pt = AcGePoint3d::kOrigin; }
};
typedef std::map<CString, AcGePoint3d> 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<CString> &stakes, const std::vector<CString> &data);
CStakeRecord(LPCTSTR head, const std::vector<CString> &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<CStakeRecord> &records);
void insertZDTable(AcDbObjectId &recId
, AcDbObjectIdArray &arrIDs
, std::vector<CStakeRecord> &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<std::pair<CString, CString>> &v);
}