Commit 011095a80c04584e83c8a6de3e57f6f2460ded59
1 parent
89f4d440
Exists in
master
and in
24 other branches
Converting polydata_utils to unix format
Showing
1 changed file
with
200 additions
and
200 deletions
Show diff stats
invesalius/data/polydata_utils.py
1 | -#-------------------------------------------------------------------------- | |
2 | -# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas | |
3 | -# Copyright: (C) 2001 Centro de Pesquisas Renato Archer | |
4 | -# Homepage: http://www.softwarepublico.gov.br | |
5 | -# Contact: invesalius@cti.gov.br | |
6 | -# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) | |
7 | -#-------------------------------------------------------------------------- | |
8 | -# Este programa e software livre; voce pode redistribui-lo e/ou | |
9 | -# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme | |
10 | -# publicada pela Free Software Foundation; de acordo com a versao 2 | |
11 | -# da Licenca. | |
12 | -# | |
13 | -# Este programa eh distribuido na expectativa de ser util, mas SEM | |
14 | -# QUALQUER GARANTIA; sem mesmo a garantia implicita de | |
15 | -# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | |
16 | -# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | |
17 | -# detalhes. | |
18 | -#-------------------------------------------------------------------------- | |
19 | - | |
20 | -import sys | |
21 | - | |
22 | -import vtk | |
23 | -import wx | |
24 | -from wx.lib.pubsub import pub as Publisher | |
25 | - | |
26 | -import vtk_utils as vu | |
27 | - | |
28 | -# Update progress value in GUI | |
29 | -UpdateProgress = vu.ShowProgress() | |
30 | - | |
31 | -def ApplyDecimationFilter(polydata, reduction_factor): | |
32 | - """ | |
33 | - Reduce number of triangles of the given vtkPolyData, based on | |
34 | - reduction_factor. | |
35 | - """ | |
36 | - # Important: vtkQuadricDecimation presented better results than | |
37 | - # vtkDecimatePro | |
38 | - decimation = vtk.vtkQuadricDecimation() | |
39 | - decimation.SetInputData(polydata) | |
40 | - decimation.SetTargetReduction(reduction_factor) | |
41 | - decimation.GetOutput().ReleaseDataFlagOn() | |
42 | - decimation.AddObserver("ProgressEvent", lambda obj, evt: | |
43 | - UpdateProgress(decimation, "Reducing number of triangles...")) | |
44 | - return decimation.GetOutput() | |
45 | - | |
46 | -def ApplySmoothFilter(polydata, iterations, relaxation_factor): | |
47 | - """ | |
48 | - Smooth given vtkPolyData surface, based on iteration and relaxation_factor. | |
49 | - """ | |
50 | - smoother = vtk.vtkSmoothPolyDataFilter() | |
51 | - smoother.SetInputData(polydata) | |
52 | - smoother.SetNumberOfIterations(iterations) | |
53 | - smoother.SetFeatureAngle(80) | |
54 | - smoother.SetRelaxationFactor(relaxation_factor) | |
55 | - smoother.FeatureEdgeSmoothingOn() | |
56 | - smoother.BoundarySmoothingOn() | |
57 | - smoother.GetOutput().ReleaseDataFlagOn() | |
58 | - smoother.AddObserver("ProgressEvent", lambda obj, evt: | |
59 | - UpdateProgress(smoother, "Smoothing surface...")) | |
60 | - | |
61 | - return smoother.GetOutput() | |
62 | - | |
63 | - | |
64 | - | |
65 | -def FillSurfaceHole(polydata): | |
66 | - """ | |
67 | - Fill holes in the given polydata. | |
68 | - """ | |
69 | - # Filter used to detect and fill holes. Only fill | |
70 | - print "Filling polydata" | |
71 | - filled_polydata = vtk.vtkFillHolesFilter() | |
72 | - filled_polydata.SetInputData(polydata) | |
73 | - filled_polydata.SetHoleSize(500) | |
74 | - return filled_polydata.GetOutput() | |
75 | - | |
76 | -def CalculateSurfaceVolume(polydata): | |
77 | - """ | |
78 | - Calculate the volume from the given polydata | |
79 | - """ | |
80 | - # Filter used to calculate volume and area from a polydata | |
81 | - measured_polydata = vtk.vtkMassProperties() | |
82 | - measured_polydata.SetInputData(polydata) | |
83 | - return measured_polydata.GetVolume() | |
84 | - | |
85 | -def CalculateSurfaceArea(polydata): | |
86 | - """ | |
87 | - Calculate the volume from the given polydata | |
88 | - """ | |
89 | - # Filter used to calculate volume and area from a polydata | |
90 | - measured_polydata = vtk.vtkMassProperties() | |
91 | - measured_polydata.SetInputData(polydata) | |
92 | - return measured_polydata.GetSurfaceArea() | |
93 | - | |
94 | -def Merge(polydata_list): | |
95 | - append = vtk.vtkAppendPolyData() | |
96 | - | |
97 | - for polydata in polydata_list: | |
98 | - triangle = vtk.vtkTriangleFilter() | |
99 | - triangle.SetInputData(polydata) | |
100 | - triangle.Update() | |
101 | - append.AddInputData(triangle.GetOutput()) | |
102 | - | |
103 | - append.Update() | |
104 | - clean = vtk.vtkCleanPolyData() | |
105 | - clean.SetInputData(append.GetOutput()) | |
106 | - clean.Update() | |
107 | - | |
108 | - return append.GetOutput() | |
109 | - | |
110 | -def Export(polydata, filename, bin=False): | |
111 | - writer = vtk.vtkXMLPolyDataWriter() | |
112 | - print filename, type(filename) | |
113 | - writer.SetFileName(filename.encode('utf-8')) | |
114 | - if bin: | |
115 | - writer.SetDataModeToBinary() | |
116 | - else: | |
117 | - writer.SetDataModeToAscii() | |
118 | - writer.SetInputData(polydata) | |
119 | - writer.Write() | |
120 | - | |
121 | -def Import(filename): | |
122 | - reader = vtk.vtkXMLPolyDataReader() | |
123 | - if isinstance(filename, unicode): | |
124 | - reader.SetFileName(filename.encode(wx.GetDefaultPyEncoding())) | |
125 | - else: | |
126 | - reader.SetFileName(filename) | |
127 | - reader.Update() | |
128 | - return reader.GetOutput() | |
129 | - | |
130 | -def JoinSeedsParts(polydata, point_id_list): | |
131 | - """ | |
132 | - The function require vtkPolyData and point id | |
133 | - from vtkPolyData. | |
134 | - """ | |
135 | - conn = vtk.vtkPolyDataConnectivityFilter() | |
136 | - conn.SetInputData(polydata) | |
137 | - conn.SetExtractionModeToPointSeededRegions() | |
138 | - UpdateProgress = vu.ShowProgress(1 + len(point_id_list)) | |
139 | - pos = 1 | |
140 | - for seed in point_id_list: | |
141 | - conn.AddSeed(seed) | |
142 | - UpdateProgress(pos, _("Analysing selected regions...")) | |
143 | - pos += 1 | |
144 | - | |
145 | - conn.AddObserver("ProgressEvent", lambda obj, evt: | |
146 | - UpdateProgress(conn, "Getting selected parts")) | |
147 | - conn.Update() | |
148 | - | |
149 | - result = vtk.vtkPolyData() | |
150 | - result.DeepCopy(conn.GetOutput()) | |
151 | - return result | |
152 | - | |
153 | -def SelectLargestPart(polydata): | |
154 | - """ | |
155 | - """ | |
156 | - UpdateProgress = vu.ShowProgress(1) | |
157 | - conn = vtk.vtkPolyDataConnectivityFilter() | |
158 | - conn.SetInputData(polydata) | |
159 | - conn.SetExtractionModeToLargestRegion() | |
160 | - conn.AddObserver("ProgressEvent", lambda obj, evt: | |
161 | - UpdateProgress(conn, "Getting largest part...")) | |
162 | - conn.Update() | |
163 | - | |
164 | - result = vtk.vtkPolyData() | |
165 | - result.DeepCopy(conn.GetOutput()) | |
166 | - return result | |
167 | - | |
168 | -def SplitDisconectedParts(polydata): | |
169 | - """ | |
170 | - """ | |
171 | - conn = vtk.vtkPolyDataConnectivityFilter() | |
172 | - conn.SetInputData(polydata) | |
173 | - conn.SetExtractionModeToAllRegions() | |
174 | - conn.Update() | |
175 | - | |
176 | - nregions = conn.GetNumberOfExtractedRegions() | |
177 | - | |
178 | - conn.SetExtractionModeToSpecifiedRegions() | |
179 | - conn.Update() | |
180 | - | |
181 | - polydata_collection = [] | |
182 | - | |
183 | - # Update progress value in GUI | |
184 | - progress = nregions -1 | |
185 | - if progress: | |
186 | - UpdateProgress = vu.ShowProgress(progress) | |
187 | - | |
188 | - for region in xrange(nregions): | |
189 | - conn.InitializeSpecifiedRegionList() | |
190 | - conn.AddSpecifiedRegion(region) | |
191 | - conn.Update() | |
192 | - | |
193 | - p = vtk.vtkPolyData() | |
194 | - p.DeepCopy(conn.GetOutput()) | |
195 | - | |
196 | - polydata_collection.append(p) | |
197 | - if progress: | |
198 | - UpdateProgress(region, _("Splitting disconnected regions...")) | |
199 | - | |
200 | - return polydata_collection | |
1 | +#-------------------------------------------------------------------------- | |
2 | +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas | |
3 | +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer | |
4 | +# Homepage: http://www.softwarepublico.gov.br | |
5 | +# Contact: invesalius@cti.gov.br | |
6 | +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) | |
7 | +#-------------------------------------------------------------------------- | |
8 | +# Este programa e software livre; voce pode redistribui-lo e/ou | |
9 | +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme | |
10 | +# publicada pela Free Software Foundation; de acordo com a versao 2 | |
11 | +# da Licenca. | |
12 | +# | |
13 | +# Este programa eh distribuido na expectativa de ser util, mas SEM | |
14 | +# QUALQUER GARANTIA; sem mesmo a garantia implicita de | |
15 | +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | |
16 | +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | |
17 | +# detalhes. | |
18 | +#-------------------------------------------------------------------------- | |
19 | + | |
20 | +import sys | |
21 | + | |
22 | +import vtk | |
23 | +import wx | |
24 | +from wx.lib.pubsub import pub as Publisher | |
25 | + | |
26 | +import vtk_utils as vu | |
27 | + | |
28 | +# Update progress value in GUI | |
29 | +UpdateProgress = vu.ShowProgress() | |
30 | + | |
31 | +def ApplyDecimationFilter(polydata, reduction_factor): | |
32 | + """ | |
33 | + Reduce number of triangles of the given vtkPolyData, based on | |
34 | + reduction_factor. | |
35 | + """ | |
36 | + # Important: vtkQuadricDecimation presented better results than | |
37 | + # vtkDecimatePro | |
38 | + decimation = vtk.vtkQuadricDecimation() | |
39 | + decimation.SetInputData(polydata) | |
40 | + decimation.SetTargetReduction(reduction_factor) | |
41 | + decimation.GetOutput().ReleaseDataFlagOn() | |
42 | + decimation.AddObserver("ProgressEvent", lambda obj, evt: | |
43 | + UpdateProgress(decimation, "Reducing number of triangles...")) | |
44 | + return decimation.GetOutput() | |
45 | + | |
46 | +def ApplySmoothFilter(polydata, iterations, relaxation_factor): | |
47 | + """ | |
48 | + Smooth given vtkPolyData surface, based on iteration and relaxation_factor. | |
49 | + """ | |
50 | + smoother = vtk.vtkSmoothPolyDataFilter() | |
51 | + smoother.SetInputData(polydata) | |
52 | + smoother.SetNumberOfIterations(iterations) | |
53 | + smoother.SetFeatureAngle(80) | |
54 | + smoother.SetRelaxationFactor(relaxation_factor) | |
55 | + smoother.FeatureEdgeSmoothingOn() | |
56 | + smoother.BoundarySmoothingOn() | |
57 | + smoother.GetOutput().ReleaseDataFlagOn() | |
58 | + smoother.AddObserver("ProgressEvent", lambda obj, evt: | |
59 | + UpdateProgress(smoother, "Smoothing surface...")) | |
60 | + | |
61 | + return smoother.GetOutput() | |
62 | + | |
63 | + | |
64 | + | |
65 | +def FillSurfaceHole(polydata): | |
66 | + """ | |
67 | + Fill holes in the given polydata. | |
68 | + """ | |
69 | + # Filter used to detect and fill holes. Only fill | |
70 | + print "Filling polydata" | |
71 | + filled_polydata = vtk.vtkFillHolesFilter() | |
72 | + filled_polydata.SetInputData(polydata) | |
73 | + filled_polydata.SetHoleSize(500) | |
74 | + return filled_polydata.GetOutput() | |
75 | + | |
76 | +def CalculateSurfaceVolume(polydata): | |
77 | + """ | |
78 | + Calculate the volume from the given polydata | |
79 | + """ | |
80 | + # Filter used to calculate volume and area from a polydata | |
81 | + measured_polydata = vtk.vtkMassProperties() | |
82 | + measured_polydata.SetInputData(polydata) | |
83 | + return measured_polydata.GetVolume() | |
84 | + | |
85 | +def CalculateSurfaceArea(polydata): | |
86 | + """ | |
87 | + Calculate the volume from the given polydata | |
88 | + """ | |
89 | + # Filter used to calculate volume and area from a polydata | |
90 | + measured_polydata = vtk.vtkMassProperties() | |
91 | + measured_polydata.SetInputData(polydata) | |
92 | + return measured_polydata.GetSurfaceArea() | |
93 | + | |
94 | +def Merge(polydata_list): | |
95 | + append = vtk.vtkAppendPolyData() | |
96 | + | |
97 | + for polydata in polydata_list: | |
98 | + triangle = vtk.vtkTriangleFilter() | |
99 | + triangle.SetInputData(polydata) | |
100 | + triangle.Update() | |
101 | + append.AddInputData(triangle.GetOutput()) | |
102 | + | |
103 | + append.Update() | |
104 | + clean = vtk.vtkCleanPolyData() | |
105 | + clean.SetInputData(append.GetOutput()) | |
106 | + clean.Update() | |
107 | + | |
108 | + return append.GetOutput() | |
109 | + | |
110 | +def Export(polydata, filename, bin=False): | |
111 | + writer = vtk.vtkXMLPolyDataWriter() | |
112 | + print filename, type(filename) | |
113 | + writer.SetFileName(filename.encode('utf-8')) | |
114 | + if bin: | |
115 | + writer.SetDataModeToBinary() | |
116 | + else: | |
117 | + writer.SetDataModeToAscii() | |
118 | + writer.SetInputData(polydata) | |
119 | + writer.Write() | |
120 | + | |
121 | +def Import(filename): | |
122 | + reader = vtk.vtkXMLPolyDataReader() | |
123 | + if isinstance(filename, unicode): | |
124 | + reader.SetFileName(filename.encode(wx.GetDefaultPyEncoding())) | |
125 | + else: | |
126 | + reader.SetFileName(filename) | |
127 | + reader.Update() | |
128 | + return reader.GetOutput() | |
129 | + | |
130 | +def JoinSeedsParts(polydata, point_id_list): | |
131 | + """ | |
132 | + The function require vtkPolyData and point id | |
133 | + from vtkPolyData. | |
134 | + """ | |
135 | + conn = vtk.vtkPolyDataConnectivityFilter() | |
136 | + conn.SetInputData(polydata) | |
137 | + conn.SetExtractionModeToPointSeededRegions() | |
138 | + UpdateProgress = vu.ShowProgress(1 + len(point_id_list)) | |
139 | + pos = 1 | |
140 | + for seed in point_id_list: | |
141 | + conn.AddSeed(seed) | |
142 | + UpdateProgress(pos, _("Analysing selected regions...")) | |
143 | + pos += 1 | |
144 | + | |
145 | + conn.AddObserver("ProgressEvent", lambda obj, evt: | |
146 | + UpdateProgress(conn, "Getting selected parts")) | |
147 | + conn.Update() | |
148 | + | |
149 | + result = vtk.vtkPolyData() | |
150 | + result.DeepCopy(conn.GetOutput()) | |
151 | + return result | |
152 | + | |
153 | +def SelectLargestPart(polydata): | |
154 | + """ | |
155 | + """ | |
156 | + UpdateProgress = vu.ShowProgress(1) | |
157 | + conn = vtk.vtkPolyDataConnectivityFilter() | |
158 | + conn.SetInputData(polydata) | |
159 | + conn.SetExtractionModeToLargestRegion() | |
160 | + conn.AddObserver("ProgressEvent", lambda obj, evt: | |
161 | + UpdateProgress(conn, "Getting largest part...")) | |
162 | + conn.Update() | |
163 | + | |
164 | + result = vtk.vtkPolyData() | |
165 | + result.DeepCopy(conn.GetOutput()) | |
166 | + return result | |
167 | + | |
168 | +def SplitDisconectedParts(polydata): | |
169 | + """ | |
170 | + """ | |
171 | + conn = vtk.vtkPolyDataConnectivityFilter() | |
172 | + conn.SetInputData(polydata) | |
173 | + conn.SetExtractionModeToAllRegions() | |
174 | + conn.Update() | |
175 | + | |
176 | + nregions = conn.GetNumberOfExtractedRegions() | |
177 | + | |
178 | + conn.SetExtractionModeToSpecifiedRegions() | |
179 | + conn.Update() | |
180 | + | |
181 | + polydata_collection = [] | |
182 | + | |
183 | + # Update progress value in GUI | |
184 | + progress = nregions -1 | |
185 | + if progress: | |
186 | + UpdateProgress = vu.ShowProgress(progress) | |
187 | + | |
188 | + for region in xrange(nregions): | |
189 | + conn.InitializeSpecifiedRegionList() | |
190 | + conn.AddSpecifiedRegion(region) | |
191 | + conn.Update() | |
192 | + | |
193 | + p = vtk.vtkPolyData() | |
194 | + p.DeepCopy(conn.GetOutput()) | |
195 | + | |
196 | + polydata_collection.append(p) | |
197 | + if progress: | |
198 | + UpdateProgress(region, _("Splitting disconnected regions...")) | |
199 | + | |
200 | + return polydata_collection | ... | ... |