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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*****************************************************************//**
* @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