Commit ac56cedc3582840918ca2c8859961e17524b8b7c
1 parent
3a497a13
Exists in
inv3.0.1
Surface area (#37)
* Calculating surface area * remove prints * Updating surface info when overwriting surface * Calculating area when selecting greatest surface, select surface or separate all surfaces * Copying area when duplicating surface
Showing
2 changed files
with
43 additions
and
22 deletions
Show diff stats
invesalius/data/surface.py
... | ... | @@ -59,7 +59,8 @@ class Surface(): |
59 | 59 | self.polydata = '' |
60 | 60 | self.colour = '' |
61 | 61 | self.transparency = const.SURFACE_TRANSPARENCY |
62 | - self.volume = 0 | |
62 | + self.volume = 0.0 | |
63 | + self.area = 0.0 | |
63 | 64 | self.is_shown = 1 |
64 | 65 | if not name: |
65 | 66 | self.name = const.SURFACE_NAME_PATTERN %(self.index+1) |
... | ... | @@ -81,6 +82,7 @@ class Surface(): |
81 | 82 | 'transparency': self.transparency, |
82 | 83 | 'visible': bool(self.is_shown), |
83 | 84 | 'volume': self.volume, |
85 | + 'area': self.area, | |
84 | 86 | } |
85 | 87 | plist_filename = filename + '.plist' |
86 | 88 | #plist_filepath = os.path.join(dir_temp, filename + '.plist') |
... | ... | @@ -100,6 +102,10 @@ class Surface(): |
100 | 102 | self.transparency = sp['transparency'] |
101 | 103 | self.is_shown = sp['visible'] |
102 | 104 | self.volume = sp['volume'] |
105 | + try: | |
106 | + self.area = sp['area'] | |
107 | + except KeyError: | |
108 | + self.area = 0.0 | |
103 | 109 | self.polydata = pu.Import(os.path.join(dirpath, sp['polydata'])) |
104 | 110 | Surface.general_index = max(Surface.general_index, self.index) |
105 | 111 | |
... | ... | @@ -164,7 +170,8 @@ class SurfaceManager(): |
164 | 170 | name = new_name, |
165 | 171 | colour = original_surface.colour, |
166 | 172 | transparency = original_surface.transparency, |
167 | - volume = original_surface.volume) | |
173 | + volume = original_surface.volume, | |
174 | + area = original_surface.area) | |
168 | 175 | |
169 | 176 | def OnRemove(self, pubsub_evt): |
170 | 177 | selected_items = pubsub_evt.data |
... | ... | @@ -240,7 +247,7 @@ class SurfaceManager(): |
240 | 247 | |
241 | 248 | def CreateSurfaceFromPolydata(self, polydata, overwrite=False, |
242 | 249 | name=None, colour=None, |
243 | - transparency=None, volume=None): | |
250 | + transparency=None, volume=None, area=None): | |
244 | 251 | normals = vtk.vtkPolyDataNormals() |
245 | 252 | normals.SetInputData(polydata) |
246 | 253 | normals.SetFeatureAngle(80) |
... | ... | @@ -290,7 +297,7 @@ class SurfaceManager(): |
290 | 297 | session.ChangeProject() |
291 | 298 | |
292 | 299 | # The following lines have to be here, otherwise all volumes disappear |
293 | - if not volume: | |
300 | + if not volume or not area: | |
294 | 301 | triangle_filter = vtk.vtkTriangleFilter() |
295 | 302 | triangle_filter.SetInputData(polydata) |
296 | 303 | triangle_filter.Update() |
... | ... | @@ -299,18 +306,22 @@ class SurfaceManager(): |
299 | 306 | measured_polydata.SetInputConnection(triangle_filter.GetOutputPort()) |
300 | 307 | measured_polydata.Update() |
301 | 308 | volume = measured_polydata.GetVolume() |
309 | + area = measured_polydata.GetSurfaceArea() | |
302 | 310 | surface.volume = volume |
311 | + surface.area = area | |
303 | 312 | print ">>>>", surface.volume |
304 | 313 | else: |
305 | 314 | surface.volume = volume |
315 | + surface.area = area | |
316 | + | |
306 | 317 | self.last_surface_index = surface.index |
307 | 318 | |
308 | 319 | Publisher.sendMessage('Load surface actor into viewer', actor) |
309 | 320 | |
310 | 321 | Publisher.sendMessage('Update surface info in GUI', |
311 | - (surface.index, surface.name, | |
312 | - surface.colour, surface.volume, | |
313 | - surface.transparency)) | |
322 | + (surface.index, surface.name, | |
323 | + surface.colour, surface.volume, | |
324 | + surface.area, surface.transparency)) | |
314 | 325 | return surface.index |
315 | 326 | |
316 | 327 | def OnCloseProject(self, pubsub_evt): |
... | ... | @@ -329,9 +340,9 @@ class SurfaceManager(): |
329 | 340 | proj = prj.Project() |
330 | 341 | surface = proj.surface_dict[index] |
331 | 342 | Publisher.sendMessage('Update surface info in GUI', |
332 | - (index, surface.name, | |
333 | - surface.colour, surface.volume, | |
334 | - surface.transparency)) | |
343 | + (index, surface.name, | |
344 | + surface.colour, surface.volume, | |
345 | + surface.area, surface.transparency)) | |
335 | 346 | self.last_surface_index = index |
336 | 347 | if surface.is_shown: |
337 | 348 | self.ShowActor(index, True) |
... | ... | @@ -377,8 +388,8 @@ class SurfaceManager(): |
377 | 388 | # The following lines have to be here, otherwise all volumes disappear |
378 | 389 | Publisher.sendMessage('Update surface info in GUI', |
379 | 390 | (surface.index, surface.name, |
380 | - surface.colour, surface.volume, | |
381 | - surface.transparency)) | |
391 | + surface.colour, surface.volume, | |
392 | + surface.area, surface.transparency)) | |
382 | 393 | if not surface.is_shown: |
383 | 394 | self.ShowActor(key, False) |
384 | 395 | |
... | ... | @@ -727,7 +738,9 @@ class SurfaceManager(): |
727 | 738 | # measured_polydata.ReleaseDataFlagOn() |
728 | 739 | measured_polydata.SetInputData(to_measure) |
729 | 740 | volume = float(measured_polydata.GetVolume()) |
741 | + area = float(measured_polydata.GetSurfaceArea()) | |
730 | 742 | surface.volume = volume |
743 | + surface.area = area | |
731 | 744 | self.last_surface_index = surface.index |
732 | 745 | del measured_polydata |
733 | 746 | del to_measure |
... | ... | @@ -745,6 +758,7 @@ class SurfaceManager(): |
745 | 758 | Publisher.sendMessage('Update surface info in GUI', |
746 | 759 | (surface.index, surface.name, |
747 | 760 | surface.colour, surface.volume, |
761 | + surface.area, | |
748 | 762 | surface.transparency)) |
749 | 763 | |
750 | 764 | #When you finalize the progress. The bar is cleaned. | ... | ... |
invesalius/gui/data_notebook.py
... | ... | @@ -765,12 +765,14 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): |
765 | 765 | self.InsertColumn(0, "", wx.LIST_FORMAT_CENTER) |
766 | 766 | self.InsertColumn(1, _("Name")) |
767 | 767 | self.InsertColumn(2, _(u"Volume (mm³)")) |
768 | - self.InsertColumn(3, _("Transparency"), wx.LIST_FORMAT_RIGHT) | |
768 | + self.InsertColumn(3, _(u"Area (mm²)")) | |
769 | + self.InsertColumn(4, _("Transparency"), wx.LIST_FORMAT_RIGHT) | |
769 | 770 | |
770 | 771 | self.SetColumnWidth(0, 25) |
771 | 772 | self.SetColumnWidth(1, 85) |
772 | 773 | self.SetColumnWidth(2, 85) |
773 | - self.SetColumnWidth(3, 80) | |
774 | + self.SetColumnWidth(3, 85) | |
775 | + self.SetColumnWidth(4, 80) | |
774 | 776 | |
775 | 777 | def __init_image_list(self): |
776 | 778 | self.imagelist = wx.ImageList(16, 16) |
... | ... | @@ -830,7 +832,8 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): |
830 | 832 | name = pubsub_evt.data[1] |
831 | 833 | colour = pubsub_evt.data[2] |
832 | 834 | volume = "%.3f"%pubsub_evt.data[3] |
833 | - transparency = "%d%%"%(int(100*pubsub_evt.data[4])) | |
835 | + area = "%.3f"%pubsub_evt.data[4] | |
836 | + transparency = "%d%%"%(int(100*pubsub_evt.data[5])) | |
834 | 837 | |
835 | 838 | if index not in self.surface_list_index: |
836 | 839 | image = self.CreateColourBitmap(colour) |
... | ... | @@ -840,25 +843,29 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): |
840 | 843 | self.surface_list_index[index] = image_index |
841 | 844 | |
842 | 845 | if (index in index_list) and index_list: |
843 | - self.UpdateItemInfo(index, name, volume, transparency, colour) | |
846 | + self.UpdateItemInfo(index, name, volume, area, transparency, colour) | |
844 | 847 | else: |
845 | - self.InsertNewItem(index, name, volume, transparency, colour) | |
848 | + self.InsertNewItem(index, name, volume, area, transparency, colour) | |
849 | + else: | |
850 | + self.UpdateItemInfo(index, name, volume, area, transparency, colour) | |
846 | 851 | |
847 | 852 | def InsertNewItem(self, index=0, label="Surface 1", volume="0 mm3", |
848 | - transparency="0%%", colour=None): | |
853 | + area="0 mm2", transparency="0%%", colour=None): | |
849 | 854 | self.InsertStringItem(index, "") |
850 | 855 | self.SetStringItem(index, 1, label, |
851 | 856 | imageId = self.surface_list_index[index]) |
852 | 857 | self.SetStringItem(index, 2, volume) |
853 | - self.SetStringItem(index, 3, transparency) | |
858 | + self.SetStringItem(index, 3, area) | |
859 | + self.SetStringItem(index, 4, transparency) | |
854 | 860 | self.SetItemImage(index, 1) |
855 | 861 | |
856 | 862 | def UpdateItemInfo(self, index=0, label="Surface 1", volume="0 mm3", |
857 | - transparency="0%%", colour=None): | |
863 | + area="0 mm2", transparency="0%%", colour=None): | |
858 | 864 | self.SetStringItem(index, 1, label, |
859 | 865 | imageId = self.surface_list_index[index]) |
860 | 866 | self.SetStringItem(index, 2, volume) |
861 | - self.SetStringItem(index, 3, transparency) | |
867 | + self.SetStringItem(index, 3, area) | |
868 | + self.SetStringItem(index, 4, transparency) | |
862 | 869 | self.SetItemImage(index, 1) |
863 | 870 | |
864 | 871 | def CreateColourBitmap(self, colour): |
... | ... | @@ -889,7 +896,7 @@ class SurfacesListCtrlPanel(wx.ListCtrl, listmix.TextEditMixin): |
889 | 896 | index and value. |
890 | 897 | """ |
891 | 898 | index, value = pubsub_evt.data |
892 | - self.SetStringItem(index, 3, "%d%%"%(int(value*100))) | |
899 | + self.SetStringItem(index, 4, "%d%%"%(int(value*100))) | |
893 | 900 | |
894 | 901 | def EditSurfaceColour(self, pubsub_evt): |
895 | 902 | """ | ... | ... |