#ifndef DATAMODEL_H #define DATAMODEL_H #include "Serialization.h" #include "ShipInfo.h" #include #include "../../Infrastructure.Data/Model/Geometry_M.h" // 更新路径 #include "../../Infrastructure.Data/Model/Hull_M.h" #define REGISTER_MODE(name) {#name, DisplayMode3D_M::name} #define UNREGISTER_MODE(name) {DisplayMode3D_M::name, #name} enum DisplayMode3D_M { None_enum = 0, Point_enum = 0x1, Curve_enum = 0x2, Surface_enum = 0x4, Solid_enum = 0x8, MainDeck_enum = 0x10, Shell_enum = 0x20, Deck_enum = 0x40, Bound_enum = 0x80, Subdiv_enum = 0x100, OpenCargoRegion_enum = 0x200, Space_enum = 0x400, Appendage_enum = 0x800, FrameRuler_enum = 0x1000, Hull_enum = 0x2000, MainHull_enum = 0x4000, SpaceUnit_enum = 0x8000, DisplayMode3D_M_ALL, }; // 文本域变量 class DocumentVar { public: bool m_IsUpdateLinkage = false; }; class DATAMANAGER_DLL_API_EXPORTS ModelData : public Serialization { public: ModelData(); ~ModelData(); virtual int fromXml(const pugi::xml_node node); virtual int toXml(pugi::xml_node node); static const int ARRAY_SIZE_NORMAL = 256; void setPrjName(QString name); void setWorkNO(QString no); void setDesigner(QString _t); void setOwner(QString own); void setSignature(QString _t); void setCalDate(QString _t); QString getPrjName(); QString getWorkNO(); QString getDesigner(); QString getOwner(); QString getSignature(); QString getCalDate(); const ShipInfo_M& getShipInfo(); int getShipType(); std::string getShipTypeString(); void setShipType(int t); void setShipType(std::string t); void setNavArea(vector &vData); vector getNavArea(); QStringList getNavAreaEX(); int getSelfPropelled(); void setSelfPropelled(int t); void setX0Pos(int _t); int getX0Pos(); double getF0X(); void setF0X(double _t); double getSt0X(); void setSt0X(double t); int getStationSize(); int getShipFrame(); int getiFrame(); double getLpp(); // 垂线间长 double getLoa(); // 总长 double getL(); // 规范船长 double getLw(); // 设计水线长 double getB(); // 型宽 double getD(); // 型深 double getT(); // 设计吃水 double getTMax(); // 结构吃水 int getNOe(); // 主机台数 double getNe(); // 单机功率 double getDisp(); // 排水量 double getCb(); // 方形系数 double getV(); // 设计航速 double getDensity(); // 水的密度 double getLe(); // 最大船长Le void setLpp(double t); // 垂线间长 void setLoa(double t); // 总长 void setL(double t); // 规范船长 void setLw(double t); // 设计水线长 void setB(double t); // 型宽 void setD(double t); // 型深 void setT(double t); // 设计吃水 void setTMax(double t); // 结构吃水 void setNOe(int t); // 主机台数 void setNe(double t); // 单机功率 void setDisp(double t); // 排水量 void setCb(double t); // 方形系数 void setV(double t); // 设计航速 void setDensity(double t); // 水的密度 void setLe(double t); void setNavSection(vector &vData); vector getNavSection(); QStringList getNavSectionEx(); // 将字符串转换为枚举值(带异常抛出) static DisplayMode3D_M parseDisplayModel3D_M(const QString &value) { static const QMap mapping = { REGISTER_MODE(Point_enum), REGISTER_MODE(Curve_enum), REGISTER_MODE(Surface_enum), REGISTER_MODE(Solid_enum), REGISTER_MODE(MainDeck_enum), REGISTER_MODE(Shell_enum), REGISTER_MODE(Deck_enum), REGISTER_MODE(Bound_enum), REGISTER_MODE(Subdiv_enum), REGISTER_MODE(OpenCargoRegion_enum), REGISTER_MODE(Space_enum), REGISTER_MODE(Appendage_enum), REGISTER_MODE(FrameRuler_enum), REGISTER_MODE(Hull_enum), REGISTER_MODE(MainHull_enum), REGISTER_MODE(SpaceUnit_enum)}; auto it = mapping.find(value); if (it != mapping.end()) { return it.value(); } throw std::invalid_argument("Invalid display mode string: " + value.toStdString()); } // 将枚举值转成字符串(带异常抛出) static QString deParseDisplayModel3D_M(const DisplayMode3D_M &value) { static const QMap deMapping = { UNREGISTER_MODE(Point_enum), UNREGISTER_MODE(Curve_enum), UNREGISTER_MODE(Surface_enum), UNREGISTER_MODE(Solid_enum), UNREGISTER_MODE(MainDeck_enum), UNREGISTER_MODE(Shell_enum), UNREGISTER_MODE(Deck_enum), UNREGISTER_MODE(Bound_enum), UNREGISTER_MODE(Subdiv_enum), UNREGISTER_MODE(OpenCargoRegion_enum), UNREGISTER_MODE(Space_enum), UNREGISTER_MODE(Appendage_enum), UNREGISTER_MODE(FrameRuler_enum), UNREGISTER_MODE(Hull_enum), UNREGISTER_MODE(MainHull_enum), UNREGISTER_MODE(SpaceUnit_enum)}; auto it = deMapping.find(value); if (it != deMapping.end()) { return it.value(); } return ""; // throw std::invalid_argument("Invalid display mode string: " + value.toStdString()); } std::vector> &getPoint3DModel() { return m_Points; } std::vector> &getCurveModle() { return m_Curves; } std::vector> &getSurfaces() { return m_Surfaces; } std::vector> &getSolids() { return m_Solids; } std::vector> &getFrames() { return m_Frames; } std::vector> &getStation() { return m_Station; } std::vector> &getWaterlinePos() { return m_WaterlinePos; } std::vector> &getButtocklinePos() { return m_ButtocklinePos; } std::vector> &getHulls() { return m_Hulls; } std::vector> &getSpaces() { return m_Spaces; } std::vector> &getAppendages() { return m_Appendages; } void insertPoint3D(Point3D_M& data); void insertCurve(Curve_M& data); void insertSurface(Surface_M& data); void insertSolid(Solid_M& data); void insertHulls(Hull_M& data); void insertSpace(Space_M& data); void insertAppendages(Appendage_M& data); std::vector deleteObjByID(std::vector ids); void clearData(); private: int ovmFromXml(const pugi::xml_node node); int docFromXml(const pugi::xml_node node); int shipFromXml(const pugi::xml_node node); int frameFromXml(const pugi::xml_node node); int stationFromXml(const pugi::xml_node node); int waterlinePosFromXml(const pugi::xml_node node); int buttocklinePosFromXml(const pugi::xml_node node); int calWaterPosFromXml(const pugi::xml_node node); int calSecPosFromXml(const pugi::xml_node node); int calHeelPosFromXml(const pugi::xml_node node); int calTrimPosFromXml(const pugi::xml_node node); int maxIDFromXml(const pugi::xml_node node); int maxNameFromXml(const pugi::xml_node node); int elementFromXml(const pugi::xml_node node); int point3DFromXml(const pugi::xml_node node); int curveFromXml(const pugi::xml_node node); int surfaceFromXml(const pugi::xml_node node); int solidFromXml(const pugi::xml_node node); int mdsFromXml(const pugi::xml_node node); int shellSurfFromXml(const pugi::xml_node node); int hullFromXml(const pugi::xml_node node); int deckSurfFromXml(const pugi::xml_node node); int boundSurfFromXml(const pugi::xml_node node); int subdivSurfFromXml(const pugi::xml_node node); int ocrFromXml(const pugi::xml_node node); int spaceFromXml(const pugi::xml_node node); int appendAgeFromXml(const pugi::xml_node node); int materialFromXml(const pugi::xml_node node); int plateTypeFromXml(const pugi::xml_node node); int beamTypeFromXml(const pugi::xml_node node); int sectionFromXml(const pugi::xml_node node); int scNodeFromXml(const pugi::xml_node node); int scBeamFromXml(const pugi::xml_node node); int scPlateFromXml(const pugi::xml_node node); int scLoopFromXml(const pugi::xml_node node); int scpFromXml(const pugi::xml_node node); int sslFromXml(const pugi::xml_node node); int ovmToXml(pugi::xml_node node); int docToXml(pugi::xml_node node); int shipToXml(pugi::xml_node node); int frameToXml(pugi::xml_node node); int stationToXml(pugi::xml_node node); int waterlinePosToXml(pugi::xml_node node); int buttocklinePosToXml(pugi::xml_node node); int calWaterPosToXml(pugi::xml_node node); int calSecPosToXml(pugi::xml_node node); int calHeelPosToXml(pugi::xml_node node); int calTrimPosToXml(pugi::xml_node node); int maxIDToXml(pugi::xml_node node); int maxNameToXml(pugi::xml_node node); int elementToXml(pugi::xml_node node); int point3DToXml(pugi::xml_node node); int curveToXml(pugi::xml_node node); int surfaceToXml(pugi::xml_node node); int solidToXml(pugi::xml_node node); int mdsToXml(pugi::xml_node node); int shellSurfToXml(pugi::xml_node node); int hullToXml(pugi::xml_node node); int deckSurfToXml(pugi::xml_node node); int boundSurfToXml(pugi::xml_node node); int subdivSurfToXml(pugi::xml_node node); int ocrToXml(pugi::xml_node node); int spaceToXml(pugi::xml_node node); int appendAgeToXml(pugi::xml_node node); int materialToXml(pugi::xml_node node); int plateTypeToXml(pugi::xml_node node); int beamTypeToXml(pugi::xml_node node); int sectionToXml(pugi::xml_node node); int scNodeToXml(pugi::xml_node node); int scBeamToXml(pugi::xml_node node); int scPlateToXml(pugi::xml_node node); int scLoopToXml(pugi::xml_node node); int scpToXml(pugi::xml_node node); int sslToXml(pugi::xml_node node); public: static int GetObjectIDByName(const std::string &name); static IModel *GetObjectByID(int id); static IModel* GetObjectByName(const std::string &name); static std::vector GetAllObject(); static std::vector GetAllObject(DisplayMode3D_M type); void deleteObj(IModel* Obj); void deleteObjs(std::vector* pObjs); void insertObjs(std::vector* pObjs); void insertObj(IModel* pObj); //删除不需要的 //增加需要 并做更新到map void UpdateModelMaps(vector* discardData, vector* usingData); void UpdateModelMaps(); void UpdateModelMaps(E_GEO_3D_OBJ_TYPE type); DisplayMode3D_M getDisplayMode3DType(E_GEO_3D_OBJ_TYPE type); void UpdateModelMaps(DisplayMode3D_M type); void UpdateMaxID(); void CheckMaxID(); private: // 图形对象是否可见 // 点、线、面、体、主体等显示与隐藏 std::vector> m_ObjectVisibleMode; // 保留插入顺序 // 文档域变量 DocumentVar m_DocumentVar; // 船舶基本数据 ShipInfo_M m_ShipInfo; std::vector> m_Frames; std::vector> m_Station; std::vector> m_WaterlinePos; std::vector> m_ButtocklinePos; std::vector> m_CalWaterPos; std::vector> m_CalSecPos; std::vector> m_CalHeelPos; std::vector> m_CalTrimPos; // 模型数据 std::vector> m_MaxIDs; std::vector> m_MaxNames; std::vector> m_Points; std::vector> m_Curves; std::vector> m_Surfaces; std::vector> m_Solids; std::vector> m_MainDeckSurfs; std::vector> m_ShellSurfs; std::vector> m_Hulls; std::vector> m_DeckSurfs; std::vector> m_BoundSurfs; std::vector> m_SubdivSurfs; std::vector> m_OpenCargoRegions; std::vector> m_Spaces; std::vector> m_Appendages; //static int GetObjectByName(const std::string &name); // static QMap> modelMaps; // QMap m_Materials; // QMap m_PlateTypes; // QMap m_BeamTypes; // QMap m_Sections; // QMap m_ScNodes; // QMap m_ScBeams; // QMap m_ScPlates; // QMap m_ScLoops; // QMap m_ScCharactPlates; // QMap m_ScShapeLines; }; struct GroupStruct_Data { GroupStruct_Data() { m_strName = ""; m_strId = ""; m_type = E_GEO_3D_OBJ_TYPE_SIZE; } ~GroupStruct_Data() { } std::string getName() const { return m_strName; } std::string getId() const { return m_strId; } E_GEO_3D_OBJ_TYPE getType() const { return m_type; } // Setter functions void setName(const std::string& str) { m_strName = str; } void setId(const std::string& id) { m_strId = id; } void setType(E_GEO_3D_OBJ_TYPE type) { m_type = type; } private: std::string m_strName; std::string m_strId; E_GEO_3D_OBJ_TYPE m_type; }; class DATAMANAGER_DLL_API_EXPORTS GroupStruct : public Serialization { public: GroupStruct(); ~GroupStruct(); virtual int fromXml(const pugi::xml_node node); virtual int toXml(pugi::xml_node node); int dataFromXml(const pugi::xml_node node, std::unordered_map>& _Point3DGroup_tmp, E_GEO_3D_OBJ_TYPE type); private: std::unordered_map> m_Point3DGroup; std::unordered_map> m_CurveGroup; std::unordered_map> m_SurfaceGroup; std::unordered_map> m_SolidGroup; }; #endif