Skip to content

Commit 0f7bc23

Browse files
qianlishunfinetjul
authored andcommitted
fix(BFSConnectivityFilter): rename filter; add. ts; add screenshot; bfs use 'polyData.buildLinks'
1 parent f05cab8 commit 0f7bc23

6 files changed

Lines changed: 165 additions & 57 deletions

File tree

36.3 KB
Loading
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export const ExtractionMode = {
2+
ExtractionMode_ALL: 0,
3+
ExtractionMode_LARGEST: 1,
4+
ExtractionMode_SMALLEST: 2,
5+
ExtractionMode_CUSTOM: 3,
6+
};
7+
8+
export default {
9+
ExtractionMode,
10+
};

Sources/Filters/General/ConnectivityFilter/example/index.js renamed to Sources/Filters/General/BFSConnectivityFilter/example/index.js

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
55
import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
66
import vtkImageMarchingCubes from '@kitware/vtk.js/Filters/General/ImageMarchingCubes';
77
import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';
8-
import vtkConnectivityFilter from '@kitware/vtk.js/Filters/General/ConnectivityFilter';
98
import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';
109
import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';
10+
import vtkBFSConnectivityFilter from '@kitware/vtk.js/Filters/General/BFSConnectivityFilter';
11+
import Constants from '@kitware/vtk.js/Filters/General/BFSConnectivityFilter/Constants';
1112

1213
import GUI from 'lil-gui';
1314

15+
const { ExtractionMode } = Constants;
16+
1417
function createVTKImageData(typedArray, dims, dataType, spacing) {
1518
const data = vtkImageData.newInstance();
1619
const [width, height, depth] = dims;
@@ -83,10 +86,15 @@ function generateTestVolumeData(size) {
8386
// Standard rendering code setup
8487
// ----------------------------------------------------------------------------
8588

86-
const connectivityOptions = ['All Regions', 'Largest', 'Smallest', 'Custom'];
89+
const extractionModeOptions = [
90+
'ExtractionMode_ALL',
91+
'ExtractionMode_LARGEST',
92+
'ExtractionMode_SMALLEST',
93+
'ExtractionMode_CUSTOM',
94+
];
8795
const params = {
8896
IsoValue: 100.0,
89-
ExtractionMode: connectivityOptions[0],
97+
ExtractionMode: extractionModeOptions[0],
9098
CustomRegionIndex: 0,
9199
};
92100

@@ -120,16 +128,16 @@ const mCubes = vtkImageMarchingCubes.newInstance({
120128
});
121129
mCubes.setInputData(imageData);
122130

123-
const connectivityFilter = vtkConnectivityFilter.newInstance();
124-
connectivityFilter.setInputConnection(mCubes.getOutputPort());
125-
connectivityFilter.setExtractionModeToAll();
131+
const bfsFilter = vtkBFSConnectivityFilter.newInstance();
132+
bfsFilter.setInputConnection(mCubes.getOutputPort());
133+
bfsFilter.setExtractionModeToAll();
126134

127-
mapper.setInputConnection(connectivityFilter.getOutputPort());
135+
mapper.setInputConnection(bfsFilter.getOutputPort());
128136

129137
// ----------------------------------------------------------------------------
130138
// UI control handling
131139
// ----------------------------------------------------------------------------
132-
const gui = new GUI();
140+
const gui = new GUI({ width: 300 });
133141

134142
gui
135143
.add(params, 'IsoValue', 0, 255, 1)
@@ -142,14 +150,14 @@ gui
142150
let customIndexController;
143151

144152
gui
145-
.add(params, 'ExtractionMode', connectivityOptions)
146-
.name('Connectivity Extraction Mode')
147-
.onChange((v) => {
148-
const index = connectivityOptions.indexOf(v);
149-
if (connectivityFilter) {
150-
connectivityFilter.setExtractionMode(index);
151-
if (index === 3) {
152-
const count = connectivityFilter.getRegionsCount();
153+
.add(params, 'ExtractionMode', extractionModeOptions)
154+
.name('Mode')
155+
.onChange((value) => {
156+
if (bfsFilter) {
157+
const mode = ExtractionMode[value];
158+
bfsFilter.set({ extractionMode: mode });
159+
if (mode === ExtractionMode.ExtractionMode_CUSTOM) {
160+
const count = bfsFilter.getRegionsCount();
153161
console.log(`Total regions count: ${count}`);
154162
customIndexController.max(count - 1);
155163
customIndexController.show(true);
@@ -164,8 +172,8 @@ customIndexController = gui
164172
.add(params, 'CustomRegionIndex', 0, 1, 1)
165173
.name('Custom Region Index')
166174
.onChange((v) => {
167-
if (connectivityFilter) {
168-
connectivityFilter.setExtractionIndex(Number(v));
175+
if (bfsFilter) {
176+
bfsFilter.setExtractionIndex(Number(v));
169177
renderWindow.render();
170178
}
171179
});
@@ -185,6 +193,6 @@ renderWindow.render();
185193
// modify objects in your browser's developer console:
186194
// -----------------------------------------------------------
187195

188-
global.filter = connectivityFilter;
196+
global.filter = bfsFilter;
189197
global.mapper = mapper;
190198
global.actor = actor;
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { vtkAlgorithm, vtkObject } from '../../../interfaces';
2+
3+
export enum ExtractionMode {
4+
ExtractionMode_ALL,
5+
ExtractionMode_LARGEST,
6+
ExtractionMode_SMALLEST,
7+
ExtractionMode_CUSTOM,
8+
}
9+
10+
/**
11+
*
12+
*/
13+
export interface IBFSConnectivityFilterInitialValues {
14+
extractionMode?: ExtractionMode;
15+
extractionIndex?: number;
16+
regionsCount?: number;
17+
}
18+
19+
type vtkBFSConnectivityFilterBase = vtkObject & vtkAlgorithm;
20+
21+
export interface vtkBFSConnectivityFilter extends vtkBFSConnectivityFilterBase {
22+
23+
/**
24+
* Get the ExtractionMode.
25+
*/
26+
getExtractionMode(): ExtractionMode;
27+
28+
/**
29+
* Get the extractionIndex.
30+
*/
31+
getExtractionIndex(): number;
32+
33+
/**
34+
* Get the count of regions.
35+
*/
36+
getRegionsCount(): number;
37+
38+
/**
39+
*
40+
* @param inData
41+
* @param outData
42+
*/
43+
requestData(inData: any, outData: any): void;
44+
45+
/**
46+
* Set the extractionMode to extract the required connected regions
47+
* @param {ExtractionMode} extractionMode
48+
*/
49+
setExtractionMode(extractionMode: ExtractionMode): boolean;
50+
51+
/**
52+
* Set the index to extract regions. should be 0 ~ regionsCount-1.
53+
* @param {Number} extractionIndex
54+
*/
55+
setExtractionIndex(extractionIndex: number): boolean;
56+
57+
/**
58+
* @param {Number} regionsCount
59+
*/
60+
setRegionsCount(regionsCount: number): boolean;
61+
62+
}
63+
64+
/**
65+
* Method used to decorate a given object (publicAPI+model) with vtkBFSConnectivityFilter characteristics.
66+
*
67+
* @param publicAPI object on which methods will be bounds (public)
68+
* @param model object on which data structure will be bounds (protected)
69+
* @param {IBFSConnectivityFilterInitialValues} [initialValues] (default: {})
70+
*/
71+
export function extend(
72+
publicAPI: object,
73+
model: object,
74+
initialValues?: IBFSConnectivityFilterInitialValues
75+
): void;
76+
77+
/**
78+
* Method used to create a new instance of vtkBFSConnectivityFilter
79+
* @param {IBFSConnectivityFilterInitialValues} [initialValues] for pre-setting some of its content
80+
*/
81+
export function newInstance(
82+
initialValues?: IBFSConnectivityFilterInitialValues
83+
): vtkBFSConnectivityFilter;
84+
85+
/**
86+
* vtkBFSConnectivityFilter - Use BFS to find connected regions and extract regions
87+
* After searching for connected regions, set extractionMode(All, Largest, smallest)
88+
* or (Custom) and extractionIndex to extract the required connected regions.
89+
* The input output of the filter is polygonal data.
90+
*/
91+
export declare const vtkBFSConnectivityFilter: {
92+
newInstance: typeof newInstance;
93+
extend: typeof extend;
94+
};
95+
export default vtkBFSConnectivityFilter;

Sources/Filters/General/ConnectivityFilter/index.js renamed to Sources/Filters/General/BFSConnectivityFilter/index.js

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,25 @@ import macro from 'vtk.js/Sources/macros';
22
import vtkPoints from 'vtk.js/Sources/Common/Core/Points';
33
import vtkCellArray from 'vtk.js/Sources/Common/Core/CellArray';
44
import vtkPolyData from 'vtk.js/Sources/Common/DataModel/PolyData';
5+
import Constants from './Constants';
6+
7+
const { ExtractionMode } = Constants;
58

69
function runBFS(polyData) {
10+
if (!polyData.getLinks()) {
11+
polyData.buildLinks();
12+
}
713
const polys = polyData.getPolys().getData();
814
const numCells = polyData.getNumberOfCells();
9-
const numPoints = polyData.getNumberOfPoints();
1015

11-
// CellToPoints mapping
12-
const cellToPoints = new Array(numCells);
1316
const cellOffsets = new Uint32Array(numCells);
1417
let offset = 0;
1518
for (let i = 0; i < numCells; i++) {
1619
cellOffsets[i] = offset;
1720
const n = polys[offset];
18-
cellToPoints[i] = polys.subarray(offset + 1, offset + 1 + n);
1921
offset += n + 1;
2022
}
2123

22-
// PointToCells mapping
23-
const pointToCells = Array.from({ length: numPoints }, () => []);
24-
for (let i = 0; i < numCells; i++) {
25-
const pts = cellToPoints[i];
26-
for (let j = 0; j < pts.length; j++) {
27-
pointToCells[pts[j]].push(i);
28-
}
29-
}
30-
3124
const visited = new Uint8Array(numCells);
3225
const regions = [];
3326

@@ -40,9 +33,9 @@ function runBFS(polyData) {
4033
while (head < queue.length) {
4134
const cellId = queue[head++];
4235
component.push(cellId);
43-
const pts = cellToPoints[cellId];
36+
const pts = polyData.getCellPoints(cellId).cellPointIds;
4437
for (let j = 0; j < pts.length; j++) {
45-
const neighborCells = pointToCells[pts[j]];
38+
const neighborCells = polyData.getPointCells(pts[j]);
4639
for (let k = 0; k < neighborCells.length; k++) {
4740
const neighborId = neighborCells[k];
4841
if (!visited[neighborId]) {
@@ -58,15 +51,8 @@ function runBFS(polyData) {
5851
return { regions, cellOffsets };
5952
}
6053

61-
const ExtractionMode = {
62-
All: 0,
63-
Largest: 1,
64-
Smallest: 2,
65-
Custom: 3,
66-
};
67-
68-
function vtkConnectivityFilter(publicAPI, model) {
69-
model.classHierarchy.push('vtkConnectivityFilter');
54+
function vtkBFSConnectivityFilter(publicAPI, model) {
55+
model.classHierarchy.push('vtkBFSConnectivityFilter');
7056

7157
publicAPI.requestData = (inData, outData) => {
7258
const input = inData[0];
@@ -75,7 +61,7 @@ function vtkConnectivityFilter(publicAPI, model) {
7561
return;
7662
}
7763

78-
console.time(`ConnectivityFilter`);
64+
console.time(`BFSConnectivityFilter`);
7965

8066
const output = outData[0] || vtkPolyData.newInstance();
8167

@@ -89,11 +75,13 @@ function vtkConnectivityFilter(publicAPI, model) {
8975

9076
// 3. select region
9177
let cells = null;
92-
if (model.extractionMode === ExtractionMode.All) {
78+
if (model.extractionMode === ExtractionMode.ExtractionMode_ALL) {
9379
cells = sortRegions.flatMap((arr) => Array.from(arr));
94-
} else if (model.extractionMode === ExtractionMode.Smallest) {
80+
} else if (
81+
model.extractionMode === ExtractionMode.ExtractionMode_SMALLEST
82+
) {
9583
cells = sortRegions[sortRegions.length - 1];
96-
} else if (model.extractionMode === ExtractionMode.Custom) {
84+
} else if (model.extractionMode === ExtractionMode.ExtractionMode_CUSTOM) {
9785
if (
9886
model.extractionIndex >= 0 &&
9987
model.extractionIndex < model.regionsCount
@@ -153,30 +141,34 @@ function vtkConnectivityFilter(publicAPI, model) {
153141

154142
outData[0] = output;
155143

156-
console.timeEnd(`ConnectivityFilter`);
144+
console.timeEnd(`BFSConnectivityFilter`);
157145
};
158146

159147
publicAPI.setExtractionModeToAll = () => {
160-
publicAPI.setExtractionMode(ExtractionMode.All);
148+
publicAPI.setExtractionMode(ExtractionMode.ExtractionMode_ALL);
161149
};
162150

163151
publicAPI.setExtractionModeToLargest = () => {
164-
publicAPI.setExtractionMode(ExtractionMode.Largest);
152+
publicAPI.setExtractionMode(ExtractionMode.ExtractionMode_LARGEST);
165153
};
166154

167155
publicAPI.setExtractionModeToSmallest = () => {
168-
publicAPI.setExtractionMode(ExtractionMode.Smallest);
156+
publicAPI.setExtractionMode(ExtractionMode.ExtractionMode_SMALLEST);
169157
};
170158

171159
publicAPI.setExtractionModeToCustom = () => {
172-
publicAPI.setExtractionMode(ExtractionMode.Custom);
160+
publicAPI.setExtractionMode(ExtractionMode.ExtractionMode_CUSTOM);
173161
};
174162

175163
publicAPI.getRegionsCount = () => model.regionsCount;
164+
165+
publicAPI.setRegionsCount = () => {
166+
console.log('can not set RegionsCount');
167+
};
176168
}
177169

178170
const DEFAULT_VALUES = {
179-
extractionMode: ExtractionMode.All,
171+
extractionMode: ExtractionMode.ExtractionMode_ALL,
180172
extractionIndex: 0,
181173
regionsCount: 0,
182174
};
@@ -193,9 +185,12 @@ export function extend(publicAPI, model, initialValues = {}) {
193185
'regionsCount',
194186
]);
195187

196-
vtkConnectivityFilter(publicAPI, model);
188+
vtkBFSConnectivityFilter(publicAPI, model);
197189
}
198190

199-
export const newInstance = macro.newInstance(extend, 'vtkConnectivityFilter');
191+
export const newInstance = macro.newInstance(
192+
extend,
193+
'vtkBFSConnectivityFilter'
194+
);
200195

201196
export default { newInstance, extend };

Sources/Filters/General/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import vtkAppendPolyData from './AppendPolyData';
2+
import vtkBFSConnectivityFilter from './BFSConnectivityFilter';
23
import vtkCalculator from './Calculator';
34
import vtkClipClosedSurface from './ClipClosedSurface';
45
import vtkClosedPolyLineToSurfaceFilter from './ClosedPolyLineToSurfaceFilter';
@@ -21,10 +22,10 @@ import vtkTriangleFilter from './TriangleFilter';
2122
import vtkTubeFilter from './TubeFilter';
2223
import vtkWarpScalar from './WarpScalar';
2324
import vtkWindowedSincPolyDataFilter from './WindowedSincPolyDataFilter';
24-
import vtkConnectivityFilter from './ConnectivityFilter';
2525

2626
export default {
2727
vtkAppendPolyData,
28+
vtkBFSConnectivityFilter,
2829
vtkCalculator,
2930
vtkClipClosedSurface,
3031
vtkClosedPolyLineToSurfaceFilter,
@@ -47,5 +48,4 @@ export default {
4748
vtkTubeFilter,
4849
vtkWarpScalar,
4950
vtkWindowedSincPolyDataFilter,
50-
vtkConnectivityFilter,
5151
};

0 commit comments

Comments
 (0)