/*****************************************************************//** * @file FITKFluidVTKGraphObjectModel.h * @brief Shape graph object 3D model for VTK graph widget. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 *********************************************************************/ #ifndef __FITKFLUIDVTKGRAPHOBJECTMODEL_H__ #define __FITKFLUIDVTKGRAPHOBJECTMODEL_H__ #include "FITKFluidVTKGraphObject3D.h" #include "FITKFluidVTKGraphAdaptorAPI.h" #include // Forward declaration class vtkPolyData; class vtkUnstructuredGrid; class vtkDataSet; class vtkDoubleArray; class FITKGraphActor; namespace Interface { class FITKAbsGeoCommand; class FITKGeometryMeshVS; class FITKVirtualTopoManager; } namespace Exchange { class FITKFluidVTKShapeColorMap; } namespace Exchange { class FITKFluidVTKGraphObjectSelect; } namespace Exchange { /** * @brief Shape graph object 3D model for VTK graph widget. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ class FITKFLUIDGRAPHADAPTORAPI FITKFluidVTKGraphObjectModel : public FITKFluidVTKGraphObject3D { // Regist FITKGraphRegist(FITKFluidVTKGraphObjectModel, FITKFluidVTKGraphObject3D); FITKCLASS(Exchange, FITKFluidVTKGraphObjectModel); public: /** * @brief Constructor. * @param modelData: The shape model data object need to exchange * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ FITKFluidVTKGraphObjectModel(Interface::FITKAbsGeoCommand* modelData); /** * @brief Destructor. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ ~FITKFluidVTKGraphObjectModel(); /** * @brief Update all graph actors.[override] * @param forceUpdate: Force update[default] * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-24 */ void update(bool forceUpdate = false) override; /** * @brief Show or hide graph object.[override] * @param visibility: The visibility of graph object * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-14 */ void setVisible(bool visibility) override; /** * @brief Show or hide the shape by the given type and flag.[override] * @param type: The shape type * @param visible: The visibility * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-14 */ void setViewMode(FITKFluidVTKCommons::ShapeMeshViewMode type, bool visible) override; /** * @brief Enable or disable transparent.[override] * @param isOn: Enable or disable * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-30 */ void setTransparent(bool isOn) override; /** * @brief Set the color for single edge, face or solid.[override] * @param color: The color * @param type: The shape mesh type * @param index: The shape id * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-11 */ void setColor(QColor color, FITKFluidVTKCommons::ShapeType type, int index) override; /** * @brief Highlight the graph actors.[override] * @param type: The shape type need to be highlighted[default] * @param color: The given color for highlighting this time[default] * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-23 */ void highlight(FITKFluidVTKCommons::ShapeType type = FITKFluidVTKCommons::ShapeTypeNone, QColor color = QColor()) override; /** * @brief Dis-highlight the graph actors.[override] * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-23 */ void disHighlight() override; /** * @brief Advanced highlight mode for highlighting part of the graph actors.[override] * @param type: The type of the model need to be highlighted * @param indice: The given indice of the model component need to be highlight * @param color: The given color for highlighting this time[default] * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-23 */ void advanceHighlight(FITKFluidVTKCommons::ShapeType type, QVector indice, QColor color = QColor()) override; /** * @brief Dis-highlight the graph actors if the graph object is in advanced highlighting mode.[override] * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-23 */ void disAdvanceHighlight() override; /** * @brief Get the number of components of the given type.[override] * @param type: The shape type * @return The count * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-22 */ int getNumberOf(FITKFluidVTKCommons::ShapeType type) override; // For picking. //@{ /** * @brief Set if the graph object pickable mode.[override] * @param mode: The pickable mode * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ void setPickMode(FITKFluidVTKCommons::ShapePickMode mode) override; /** * @brief Get the shape id by the given shape type and VTK cell id.[override] * @param vtkCellId: The VTK cell id in shape data * @param topAbsShapeType: The shape type of the given ID( the same as TopAbs_ShapeEnum ) * @return The shape id * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-19 */ int getShapeIdByVTKCellId(int vtkCellId, FITKFluidVTKCommons::ShapeAbsEnum topAbsShapeType) override; /** * @brief Get the VTK cell indice by the given shape type and shape id.[override] * @param shapeId: The shape id in shape data * @param topAbsShapeType: The shape type of the given ID( the same as TopAbs_ShapeEnum ) * @return The cell indice[const] * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ const QVector getVTKCellIdsByShapeId(int shapeId, FITKFluidVTKCommons::ShapeAbsEnum topAbsShapeType) override; /** * @brief Get the VTK cell indice by the given shape type and cell id in VTK.[override] * @param cellId: The cell id in VTK * @param topAbsShapeType: The shape type of the given ID( the same as TopAbs_ShapeEnum ) * @return The cell indice[const] * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ const QVector getVTKCellIdsByVTKCellId(int cellId, FITKFluidVTKCommons::ShapeAbsEnum topAbsShapeType) override; //@} // For highlighting. //@{ /** * @brief Get the VTK mesh grid by the given mesh type.[override] * @param type: The shape's VTK mesh type * @return The vtkDataSet object of the given type of mesh * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ vtkDataSet* getMesh(FITKFluidVTKCommons::ShapeType type) override; //@} // Test function //@{ /** * @brief Test function.[override] * @param details: The input information * @return Is success * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ bool test(QVariant& details) override; //@} private: /** * @brief Initialize. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ void init(); /** * @brief Convert the trianglation data to a vtkDataSet. * @return Is valid * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-08-12 */ bool meshVSToVtkDataSet(); // Split shape data and save the id map. //@{ /** * @brief Create the shape's vertice grid data. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-08-12 */ void createVertexGrid(); /** * @brief Create the shape's edge grid data. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-08-12 */ void createEdgeGrid(); /** * @brief Create the shape's face grid data. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-08-12 */ void createFaceGrid(); /** * @brief Create the shape's solid and face ID map. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ void initializeSolidFaceMap(); //@} /** * @brief Generate the data set by the shape data. * @return Is OK * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-24 */ bool generateDataSet(); /** * @brief Generate the shape with the vtkDataSet. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ void generateGraph(); /** * @brief Clear all data set. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-24 */ void clearData(); private: /** * @brief The shape data of the model. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-08-12 */ Interface::FITKGeometryMeshVS* m_triData{ nullptr }; /** * @brief The topo manager of the shape agent. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-08-13 */ Interface::FITKVirtualTopoManager* m_topoMgr{ nullptr }; // For colors. //@{ /** * @brief The color map key words for showing default model color.[const] * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-11 */ const QString c_defaultArrName = "Default"; /** * @brief The model extractor for normal or advanced highlight. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-23 */ FITKFluidVTKGraphObjectSelect* m_highlightSelector{ nullptr }; /** * @brief The color map for vertex data set. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-11 */ FITKFluidVTKShapeColorMap* m_colorMapVertex{ nullptr }; /** * @brief The color map for edge data set. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-11 */ FITKFluidVTKShapeColorMap* m_colorMapEdge{ nullptr }; /** * @brief The color map for face data set. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-11 */ FITKFluidVTKShapeColorMap* m_colorMapFace{ nullptr }; //@} /** * @brief The model vertice grid data for VTK. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ vtkUnstructuredGrid* m_gridVertex{ nullptr }; /** * @brief The model edges grid data for VTK. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ vtkUnstructuredGrid* m_gridEdge{ nullptr }; /** * @brief The model faces grid data for VTK. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ vtkPolyData* m_gridFace{ nullptr }; /** * @brief The normals for the face points.( For better visualization. ) * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-08-01 */ vtkDoubleArray* m_normalFacePoint{ nullptr }; /** * @brief The model actor for vertice. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ FITKGraphActor* m_fActorVertex{ nullptr }; /** * @brief The model actor for edges. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ FITKGraphActor* m_fActorEdge{ nullptr }; /** * @brief The model actor for faces. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-05 */ FITKGraphActor* m_fActorFace{ nullptr }; // For picking. //@{ // VTK -> Shape //@{ /** * @brief The id array for getting the vertex id of picked vertex cell. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ QVector m_cellIdVertexIdMap; /** * @brief The id array for getting the edge id of picked cell. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ QVector m_cellIdEdgeIdMap; /** * @brief The id array for getting the face id of picked cell. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ QVector m_cellIdFaceIdMap; //@} // Shape -> Shape ( Find children ) //@{ /** * @brief The ID hash for getting the solid id of the picked face cell. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ QHash m_faceSolidIdMap; // Shape -> VTK //@{ /** * @brief The id array for getting the cell id with vertex id. * The key is the shape id of vertex in indexed map, * the values are the VTK cell id in vtkDataSet. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ QHash m_vertexIdCellIdMap; /** * @brief The id array for getting the cell id with edge id. * The key is the shape id of edge in indexed map, * the values are the VTK cell id in vtkDataSet. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ QHash m_edgeIdCellIdMap; /** * @brief The solid and face id map. * The key is the shape id of solid in indexed map, * the values are the shape face ids in indexed map. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ QHash> m_solidFaceIdsHash; //@} /** * @brief The solid and face id map. * The key is the shape id of face in indexed map, * the values are the VTK cell ids in vtkDataSet. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-06-06 */ QHash> m_faceCellIdsHash; //@} //@} /** * @brief The hash code of the shape. * @author ChengHaotian (yeguangbaozi@foxmail.com) * @date 2024-07-25 */ int m_hashCode = -1; }; } // namespace Exchange #endif // __FITKFLUIDVTKGRAPHOBJECTMODEL_H__