You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
6.3 KiB
C

/*****************************************************************//**
* @file FITKShellFeatureEdges.h
* @brief The feature edges and boundary edges filter.
*
* @author ChengHaotian (yeguangbaozi@foxmail.com)
* @date 2024-05-16
*********************************************************************/
#ifndef FITKSHELLFEATUREEDGES_H
#define FITKSHELLFEATUREEDGES_H
#include "vtkPolyDataAlgorithm.h"
#include "FITKVTKAlgorithmAPI.h"
#include <map>
#include <vector>
#include <array>
#include <QMap>
#include <QVector>
class vtkIncrementalPointLocator;
/**
* @brief Override vtkFeatureEdges.
* @author ChengHaotian (yeguangbaozi@foxmail.com)
* @date 2024-03-25
*/
class FITKVTKALGORITHMAPI FITKShellFeatureEdges : public vtkPolyDataAlgorithm
{
public:
vtkTypeMacro(FITKShellFeatureEdges, vtkPolyDataAlgorithm );
void PrintSelf( ostream& os, vtkIndent indent ) override;
/**
* Construct object with feature angle = 30; all types of edges extracted
* and colored.
*/
static FITKShellFeatureEdges* New( );
//@{
/**
* Turn on/off the extraction of boundary edges.
*/
vtkSetMacro( BoundaryEdges, vtkTypeBool );
vtkGetMacro( BoundaryEdges, vtkTypeBool );
vtkBooleanMacro( BoundaryEdges, vtkTypeBool );
//@}
//@{
/**
* Turn on/off the extraction of feature edges.
*/
vtkSetMacro( FeatureEdges, vtkTypeBool );
vtkGetMacro( FeatureEdges, vtkTypeBool );
vtkBooleanMacro( FeatureEdges, vtkTypeBool );
//@}
//@{
/**
* Specify the feature angle for extracting feature edges.
*/
vtkSetClampMacro( FeatureAngle, double, 0.0, 180.0 );
vtkGetMacro( FeatureAngle, double );
//@}
//@{
/**
* Turn on/off the extraction of non-manifold edges.
*/
vtkSetMacro( NonManifoldEdges, vtkTypeBool );
vtkGetMacro( NonManifoldEdges, vtkTypeBool );
vtkBooleanMacro( NonManifoldEdges, vtkTypeBool );
//@}
//@{
/**
* Turn on/off the extraction of manifold edges.
*/
vtkSetMacro( ManifoldEdges, vtkTypeBool );
vtkGetMacro( ManifoldEdges, vtkTypeBool );
vtkBooleanMacro( ManifoldEdges, vtkTypeBool );
//@}
//@{
/**
* Turn on/off the coloring of edges by type.
*/
vtkSetMacro( Coloring, vtkTypeBool );
vtkGetMacro( Coloring, vtkTypeBool );
vtkBooleanMacro( Coloring, vtkTypeBool );
/**
*
*/
vtkSetMacro( PassThroughIds, vtkTypeBool );
vtkGetMacro( PassThroughIds, vtkTypeBool );
vtkBooleanMacro( PassThroughIds, vtkTypeBool );
//@}
//@{
/**
* Set / get a spatial locator for merging points. By
* default an instance of vtkMergePoints is used.
*/
void SetLocator( vtkIncrementalPointLocator* locator );
vtkGetObjectMacro( Locator, vtkIncrementalPointLocator );
//@}
/**
* Create default locator. Used to create one when none is specified.
*/
void CreateDefaultLocator( );
/**
* Return MTime also considering the locator.
*/
vtkMTimeType GetMTime( ) override;
//@{
/**
* Set/get the desired precision for the output types. See the documentation
* for the vtkAlgorithm::DesiredOutputPrecision enum for an explanation of
* the available precision settings.
*/
vtkSetMacro( OutputPointsPrecision, int );
vtkGetMacro( OutputPointsPrecision, int );
//@}
/**
* @brief 线
* @return 线
* @param ptID
* @author xiewenxi (xwx14@qq.com)
* @date 2023-09-14
*/
const std::vector< int >& getLinesByPt( int ptID ) const;
/**
* @brief
* @return id
* @param
* @author xiewenxi (xwx14@qq.com)
* @date 2023-10-30
*/
const std::vector< int >& getEdgeCells(int iEdgeCellID,bool* b ) const;
//const std::map< int, std::vector< int > >& getEdgeCellMap( ) const;
/**
* @brief 线
* @return 线
* @param
* @author xiewenxi (xwx14@qq.com)
* @date 2023-10-31
*/
const QVector< int >& getSurCellEdge( int iCell,bool* b=nullptr ) const;
int getSurfacePointIDByEdgePointID( int edgePointID );
///**
// * @brief 根据线单元索引获取原始表面中该线的索引。
// * @param edgeCellId线单元索引
// * @param surfaceCellId原始表面单元索引[引用]
// * @return 表面单元中该线的索引
// * @author ChengHaotian (yeguangbaozi@foxmail.com)
// * @date 2024-04-23
// */
//int getEdgeIndex(int edgeCellId, int& surfaceCellId);
protected:
FITKShellFeatureEdges( );
~FITKShellFeatureEdges( ) override;
// Usual data generation method
int RequestData( vtkInformation*, vtkInformationVector**, vtkInformationVector* ) override;
int RequestUpdateExtent( vtkInformation*, vtkInformationVector**, vtkInformationVector* ) override;
// 特征角度edge两侧的面单元大于此角度的会被定义为特征edge
double FeatureAngle;
vtkTypeBool BoundaryEdges;
vtkTypeBool FeatureEdges;
vtkTypeBool NonManifoldEdges;
vtkTypeBool ManifoldEdges;
vtkTypeBool Coloring;
QMap< int, QVector< int > > _surEdegeIDMap;
//// 线单元与原始表面单元与索引映射。
//// Key为线单元索引
//// Value 1 为线单元所属原始表面单元索引
//// Value 2 为线单元在原始表面单元内索引(第几条边)
//QHash<int, QPair<int, int>> m_edgeSurfaceHash;
/// <记录特征节点ID与面节点ID映射
QMap< int, int > _edgeSurfacePointIDMap;
// 是否需要记录原id,包括单元id与节点id
vtkTypeBool PassThroughIds;
int OutputPointsPrecision;
vtkIncrementalPointLocator* Locator;
// 用于记录每个点对应的线key为输入polyData的点idvalue为输出polyData的线单元编号
std::map< int, std::vector< int > > _ptLines;
std::vector< int > _nullVec = {};
std::map< int, std::vector< int > > _edgeSurCell={};
private:
FITKShellFeatureEdges( const FITKShellFeatureEdges& ) = delete;
void operator=( const FITKShellFeatureEdges& ) = delete;
};
#endif // FITKSHELLFEATUREEDGES_H