File: vmtkentityrenumber.py

package info (click to toggle)
vmtk 1.0.1-3
  • links: PTS, VCS
  • area: non-free
  • in suites: jessie, jessie-kfreebsd
  • size: 8,632 kB
  • ctags: 8,076
  • sloc: cpp: 79,872; ansic: 31,817; python: 18,860; perl: 381; makefile: 118; sh: 15; tcl: 1
file content (87 lines) | stat: -rw-r--r-- 3,467 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/env python

import sys
from vmtk import pypes
import vtk

vmtkentityrenumber = 'VmtkEntityRenumber'

class VmtkEntityRenumber(pypes.pypeScript):
    def __init__(self):
        pypes.pypeScript.__init__(self)

        self.SetScriptName(vmtkentityrenumber)
        self.SetScriptDoc('Renumber cell entity id array.')

        self.Mesh = None
        self.CellEntityIdsArrayName = "CellEntityIds"
        self.CellEntityIdOffset = 0
        self.CellEntityIdRenumbering = []
        self.InteriorFacetsOffset = 0

        # Member info: name, cmdlinename, typename, num, default, desc[, defaultpipetoscript]
        self.SetInputMembers([
                ['Mesh', 'i', 'vtkUnstructuredGrid', 1, '',
                 'the input mesh', 'vmtkmeshreader'],
                ['CellEntityIdsArrayName', 'entityidsarray', 'str', 1, 'CellEntityIds',
                 'name of the array where entity ids have been stored'],
                ['CellEntityIdOffset', 'offset', 'int', 1, '',
                 'offset added to cell entity ids that are not mapped explicitly', ''],
                ['CellEntityIdRenumbering', 'renumbering', 'int', -1, '',
                 '[from1 to1] [from2 to2] ...', ''],
                ['InteriorFacetsOffset', 'interiorfacetsoffset', 'int', 1, '',
                 'offset added to ids of interior facets after renumbering mapping, to separate them from interior facets'],
                ])
        self.SetOutputMembers([
                ['Mesh', 'o', 'vtkUnstructuredGrid', 1, '',
                 'the output mesh', 'vmtkmeshwriter'],
                ['CellEntityIdsArrayName', 'entityidsarray', 'str', 1, 'CellEntityIds',
                 'name of the array where entity ids have been stored'],
                ])

    def Execute(self):
        if self.Mesh == None:
            self.PrintError('Error: No Mesh.')

        if len(self.CellEntityIdRenumbering) % 2 != 0:
            self.PrintError('Renumbering must have even length.')

        renumbering = {}
        for i in range(len(self.CellEntityIdRenumbering)/2):
            a = self.CellEntityIdRenumbering[2*i]
            b = self.CellEntityIdRenumbering[2*i+1]
            renumbering[a] = b

        cellids = self.Mesh.GetCellData().GetScalars(self.CellEntityIdsArrayName)
        for i in range(cellids.GetNumberOfTuples()):
            v = cellids.GetValue(i)

            # Renumber or add offset
            v = renumbering.get(v, v + self.CellEntityIdOffset)

            # TODO: This is triangles/tets only
            volumeTypes = (vtk.VTK_TETRA,)
            faceTypes = (vtk.VTK_TRIANGLE,)

            # Add offset if cell is an interior facet
            if self.InteriorFacetsOffset:
                if self.Mesh.GetCell(i).GetCellType() in faceTypes:
                    pIds = vtk.vtkIdList()
                    cIds = vtk.vtkIdList()
                    self.Mesh.GetCellPoints(i, pIds)
                    self.Mesh.GetCellNeighbors(i, pIds, cIds)

                    nIds = cIds.GetNumberOfIds()
                    if nIds == 2:
                        def getCellType(j):
                            return self.Mesh.GetCell(cIds.GetId(j)).GetCellType()
                        if all(getCellType(j) in volumeTypes for j in range(nIds)):
                            v += self.InteriorFacetsOffset

            cellids.SetValue(i, v)


if __name__ == '__main__':
    main = pypes.pypeMain()
    main.Arguments = sys.argv
    main.Execute()