#ifndef __OPENING_LABEL_DATA_H #define __OPENING_LABEL_DATA_H // Key、Value结构体 struct TARCH_EXP SOpeningLabelPair { SOpeningLabelPair() { sPurpose = _T(""); sSerialNum = _T(""); } SOpeningLabelPair(const CString &_sType, const CString &_sSerialNum) { sPurpose = _sType; sSerialNum = _sSerialNum; } CString sPurpose; // 用途 CString sSerialNum; // 编号 }; typedef CArray ArLabelPair; // Section和内容 struct TARCH_EXP SOpeningLabelGroup { SOpeningLabelGroup() { sLabel = _T(""); } CString sLabel; // 标签,Sort,Door,DoorWin...... ArLabelPair arLabelPair; // 内容 }; typedef CArray ArLabelData; // 数据表 // 关联文件的格式,以及各种数据的转化 class TARCH_EXP TLabelSetDataTable { friend class TOpeningLabelData; public: TLabelSetDataTable () {} ~TLabelSetDataTable() {Clear();} enum ESerialRule { eAccordSize = 0, eAccordNum = 1}; enum ECalWidthRule { eWallInboard = 0, eWallMiddle = 1, eWallOutboard = 2}; public: // 用等号对字符串执行拆分,并且去除空格,TAB static BOOL Split(const CString &sOri, CString &sLeft, CString &sRight); void AddLabel(SOpeningLabelGroup *pLabel); void Clear(); public: BOOL SetHyphenRule(const CString &sHyphen); BOOL GetHyphenRule() const { return m_bHyphen; } void SetHyphenRuleDirect(BOOL bTrue){ m_bHyphen = bTrue; } BOOL SetSerialRule(const CString &sRule); ESerialRule GetSerialRule() const { return m_eSerialRule; } void SetSerialRuleDirect(ESerialRule eRule) { m_eSerialRule = eRule; } BOOL SetRoundRule(const CString &sRound); BOOL GetRoundRule() const { return m_bTgRound; } void SetRoundRuleDirect(BOOL bTrue){ m_bTgRound = bTrue; } BOOL SetCalWidthRule(const CString &sRule); ECalWidthRule GetCalWidthRule() const { return m_eCalWidthRule; } void SetCalWidthDirect(ECalWidthRule eRule) { m_eCalWidthRule = eRule; } ArLabelData& GetLableData() { return m_arLabelData; } public: // label=>SLabelGroup SOpeningLabelGroup *GetLabelContent(const CString &sLabel) const; // 把dataTable中的数据拷贝到自己这里 void CopyFrom(const TLabelSetDataTable& dataTable); // 覆盖对应label中对应的数据 void CoverLabelData(const CString &sLabel, const ArLabelPair &arLabelPair); // 获取对应label中的数据 void GetLabelData(const CString &sLabel, ArLabelPair &arLabelPair) const; public: int Read(const CString &sFile); void Write(const CString &sFile) const; private: ArLabelData m_arLabelData; // 当前所读取的编号 ESerialRule m_eSerialRule; // 编号规则 BOOL m_bHyphen; // 连字符 BOOL m_bReaded; BOOL m_bTgRound; // 四舍五入 ECalWidthRule m_eCalWidthRule; // 窗宽计算位置 }; // 门窗编号配置文件OpeningLabel.ini的读写程序 class TARCH_EXP TOpeningLabelData { public: TOpeningLabelData(); ~TOpeningLabelData(); public: enum ESerialRule { kSize = 0, kNum = 1, }; enum ECalWidthRule { kInboard = 0, kMiddle = 1, kOutboard = 2}; public: CString m_csPrompt; // 错误提示信息,正确情况下为空 private: CString m_sFileName; // 文件名 TLabelSetDataTable m_allDatas; // 内容 public: // 提供下列公有接口 // 获得所有标签名称(不包括Sort) bool GetLabelArray(CStringArray &arLabel) const; // 根据给出的标签名称,获得子类型(即:用途,KEY) bool GetSubType(const CString &csKind, CStringArray &arSubType) const; // 根据给出的标签名称,获得子类型的编号(VAULE) bool GetSubLabelPrefix(const CString &csKind, CStringArray &arLabelPrefix) const; // 获得是否添加连字符 bool HasHypen() const; // 获得编号原则,按尺寸或者按数序 ESerialRule GetNumRule(); // 获得是否四舍五入 bool IsRound() const; // 获得窗宽计算位置的原则 ECalWidthRule GetCalWidthRule(); // 获得一个具体的标注值 bool GetOpeningLabel(const CString &csKind, const CString &csSubKind, CString &csLabel); // 根据编号,获得大类型(即:标签)和子类型(即:用途) void GetTypeByLabel(const CString &csPrefix, CStringArray &arCsLabel, CStringArray &ArCsSubType); // 获得所有类型,按顺序输出 bool GetAllOpeningType(CStringArray &aryAllSubType); public: // 由门窗类型名返回对应的label标记 static CString TypeToLabel(const CString &sType); static int GetLabelIndex(const CString &sLabel); public: // 控制读写 BOOL Read(TLabelSetDataTable &dataTable); BOOL Write(const TLabelSetDataTable &dataTable) const; }; #endif