File: edgeExtractor.py

package info (click to toggle)
esys-particle 2.3.5%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 13,132 kB
  • sloc: cpp: 81,480; python: 5,872; makefile: 1,259; sh: 313; perl: 225
file content (93 lines) | stat: -rw-r--r-- 3,303 bytes parent folder | download | duplicates (4)
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
88
89
90
91
92
93
#############################################################
##                                                         ##
## Copyright (c) 2003-2017 by The University of Queensland ##
## Centre for Geoscience Computing                         ##
## http://earth.uq.edu.au/centre-geoscience-computing      ##
##                                                         ##
## Primary Business: Brisbane, Queensland, Australia       ##
## Licensed under the Open Software License version 3.0    ##
## http://www.apache.org/licenses/LICENSE-2.0              ##
##                                                         ##
#############################################################

from esys.lsm.vis import core

import vtk as kwvtk

class EdgeExtractor(core.EdgeExtractor):
    def __init__(
        self,
        pointListMap    = lambda dataRecord: dataRecord.getPointList(),
        radiusListMap   = lambda dataRecord: 1.0,
        colorValListMap = lambda dataRecord: 0,
        radiusScale     = 1.0
    ):
        core.EdgeExtractor.__init__(
            self,
            pointListMap,
            radiusListMap,
            colorValListMap,
            radiusScale
        )

    def getResizedList(self, lst, newLen):
        if (not hasattr(lst, "__iter__")):
            newLst = [lst]
        else:
            newLst = list(lst)
        if (len(newLst) < newLen):
            newLst = newLst*((newLen//(len(newLst))) + 1)
        del newLst[newLen:]
        return newLst

    def getVtkIdList(self, idList):
        vtkIdList = kwvtk.vtkIdList()
        for id in idList:
            vtkIdList.InsertNextId(id)
        return vtkIdList

    def getVtkData(self, data):
        pts = kwvtk.vtkPoints()
        cls = kwvtk.vtkCellArray()
        radiusArray = kwvtk.vtkDoubleArray()
        radiusArray.SetName(self.getRadiusFieldName())
        radiusArray.SetNumberOfComponents(1)
        colorArray  = kwvtk.vtkDoubleArray()
        colorArray.SetName(self.getColorFieldName())
        colorArray.SetNumberOfComponents(1)

        ptIndex = 0
        for record in data:
            ptList = self.getPointList(record)
            numPts = len(ptList)
            radiusList = \
              self.getResizedList(self.getRadiusList(record), numPts)
            colorList  = \
              self.getResizedList(self.getColorValList(record), numPts)
            for i in range(0, numPts):
                pts.InsertNextPoint(ptList[i])
                radiusArray.InsertNextValue(radiusList[i]*self.getRadiusScale())
                colorArray.InsertNextValue(colorList[i])
            cls.InsertNextCell(self.getVtkIdList(list(range(ptIndex,ptIndex+numPts))))
            ptIndex += numPts

        vtkPolyData = kwvtk.vtkPolyData()
        vtkPolyData.SetPoints(pts)
        vtkPolyData.SetLines(cls)
        vtkPolyData.GetPointData().SetScalars(radiusArray)
        vtkPolyData.GetPointData().AddArray(colorArray)
        vtkPolyData.GetPointData().SetActiveScalars(radiusArray.GetName())

        return vtkPolyData

    def getColorFieldName(self):
        return "pointDataColorField"

    def getColorFieldComponentIndex(self):
        return 0

    def getRadiusFieldName(self):
        return "pointDataRadiusField"

    def getRadiusFieldComponentIndex(self):
        return 0