Salome HOME
Merge from BR_PARAVIS_DEV 29Dec09
[modules/paravis.git] / getwrapclasses.py
1 import paraview, os
2 import string
3 import re
4
5 classeslistsm = []
6 classeslistvtk = []
7
8 if os.name == "posix":
9     from libvtkPVServerCommonPython import *
10     from libvtkPVServerManagerPython import *
11 else:
12     from vtkPVServerCommonPython import *
13     from vtkPVServerManagerPython import *
14
15 l1 = dir()
16 for a in l1:
17     if a.startswith("vtk") and (len(a) > 3):
18         classeslistsm.append(a)
19         
20 from paraview.vtk import *
21 l2 = dir()
22
23 for a in l2:
24     if (a not in l1) and a.startswith("vtk"):
25         classeslistvtk.append(a)
26
27 pvhome = os.environ.get('PVHOME')
28 pvversion = os.environ.get('PVVERSION')
29 wrap_dir="include/paraview-"+pvversion
30
31 dic=dict();
32 pv_classes_new=classeslistsm
33 while len(pv_classes_new):
34     pv_classes_cur=pv_classes_new
35     pv_classes_new=[]
36     for c in pv_classes_cur:
37         filename=pvhome+"/"+wrap_dir+"/"+c+".h"
38         if os.path.isfile(filename):
39             c_new=[]
40             f=open(filename)
41             for line in f:
42                 if re.match('\s*/',line) is None:
43                     if re.match('\s*public\s*:',line):
44                         continue
45
46                     m=re.match('\s*class\s+(vtk\w+)\s*;',line)
47                     if m is not None:
48                         cn=m.group(1)
49                         if cn not in dic.keys() and cn not in pv_classes_new and cn in classeslistvtk:
50                             pv_classes_new.append(cn)
51                             continue
52
53                     m=re.match('\s*struct\s+(vtk\w+)\s*;',line)
54                     if m is not None:
55                         cn=m.group(1)
56                         if cn not in dic.keys() and cn not in pv_classes_new and cn in classeslistvtk:
57                             pv_classes_new.append(cn)
58                             continue
59
60                     m=re.match('\s*#include\s+"(vtk\w+)\.h"',line)
61                     if m is not None:
62                         cn=m.group(1)
63                         if cn not in dic.keys() and cn not in pv_classes_new and cn in classeslistvtk:
64                             pv_classes_new.append(cn)
65                             continue
66
67                     cm=re.findall('public\s+(vtk\w+)',line)
68                     if len(cm) == 0:
69                         continue
70                     for cn in cm:
71                         if cn not in dic.keys() and cn not in pv_classes_new:
72                             pv_classes_new.append(cn)
73                         if cn not in c_new:
74                             c_new.append(cn)
75             f.close()
76             dic[c]=[0, c_new]
77
78 pv_classes_sort=[]
79
80 def collect_dic(cc):
81     ret=[]
82     for c in cc:
83         if len(dic[c][1]) and dic[c][0] == 0:
84              ret+=collect_dic(dic[c][1])
85         if dic[c][0] == 0:
86             ret.append(c)
87             dic[c][0]=1
88     return ret
89
90 pv_classes_sort=collect_dic(dic.keys())
91
92 awidl='WRAP_IDL = '
93 awsk='WRAP_SK_FILES = '
94 awhh='WRAP_IDL_I_HH = '
95 awcc='WRAP_IDL_I_CC = '
96
97 fprefix='PARAVIS_Gen_'
98 fidl='.idl'
99 fsk='SK.cc'
100 fhh='_i.hh'
101 fcc='_i.cc'
102
103 idl_am=open('idl/wrap.am','w')
104 idl_i_am=open('src/PVGUI/wrap.am','w')
105
106 wrap_h=open('idl/vtkWrapIDL.h','w')
107 wrap_h.write('const char* wrapped_classes[] = {\n')
108
109 wrap_cxx=open('src/PVGUI/PARAVIS_CreateClass.cxx','w')
110 wrap_cxx.write('#include <iostream>\n')
111 wrap_cxx.write('#include <QString>\n')
112 wrap_cxx.write('#include "PARAVIS_Gen_i.hh"\n')
113
114 for c in pv_classes_sort:
115     widl=fprefix+c+fidl
116     wsk=fprefix+c+fsk
117     whh=fprefix+c+fhh
118     wcc=fprefix+c+fcc
119     awidl+=' ' + widl
120     awsk+=' ' + wsk
121     awhh+=' ' + whh
122     awcc+=' ' + wcc
123
124     idl_am.write(widl+': vtkWrapIDL')
125     for cc in dic[c][1]:
126         idl_am.write(' '+fprefix+cc+fidl)
127     idl_am.write('\n')
128     idl_am.write('\t@./vtkWrapIDL '+pvhome+'/'+wrap_dir+'/'+c+'.h $(top_srcdir)/idl/hints 0 $@\n')
129     idl_am.write('\n')
130
131
132     idl_i_am.write(whh+': vtkWrapIDL_HH')
133     for cc in dic[c][1]:
134         idl_i_am.write(' '+fprefix+cc+fhh)
135     idl_i_am.write('\n')
136     idl_i_am.write('\t@./vtkWrapIDL_HH '+pvhome+'/'+wrap_dir+'/'+c+'.h $(top_srcdir)/idl/hints 0 $@\n')
137     idl_i_am.write('\n')
138
139     idl_i_am.write(wcc+': vtkWrapIDL_CC $(WRAP_IDL_I_HH)')
140     for cc in dic[c][1]:
141         idl_i_am.write(' '+fprefix+cc+fcc)
142     idl_i_am.write('\n')
143     idl_i_am.write('\t@./vtkWrapIDL_CC '+pvhome+'/'+wrap_dir+'/'+c+'.h $(top_srcdir)/idl/hints 0 $@\n')
144     idl_i_am.write('\n')
145
146     wrap_h.write('"'+c+'",\n')
147
148     wrap_cxx.write('#include "'+fprefix+c+fhh+'"\n')
149
150 idl_am.write(awidl+'\n')
151 idl_am.write('\n')
152 idl_am.write(awsk+'\n')
153
154 idl_i_am.write(awhh+'\n')
155 idl_i_am.write('\n')
156 idl_i_am.write(awcc+'\n')
157 idl_i_am.write('\n')
158 idl_i_am.write('BUILT_SOURCES = $(WRAP_IDL_I_HH) $(WRAP_IDL_I_CC)\n')
159
160 wrap_h.write('""\n};\n')
161
162 wrap_cxx.write('\n')
163 wrap_cxx.write('PARAVIS::PARAVIS_Base_i* CreateInstance(::vtkObjectBase* Inst, const QString& theClassName)\n')
164 wrap_cxx.write('{\n')
165 for i in range(len(pv_classes_sort)-1,-1,-1):
166     c=pv_classes_sort[i]
167     wrap_cxx.write('    if(theClassName == "'+c+'" || (Inst != NULL && Inst->IsA("'+c+'")))\n')
168     wrap_cxx.write('      return new PARAVIS::'+c+'_i();\n')
169 wrap_cxx.write('\n')
170 wrap_cxx.write('    cerr << "The class " << theClassName.toStdString() << " is not created!" << endl;\n')
171 wrap_cxx.write('    return new PARAVIS::PARAVIS_Base_i();\n')
172 wrap_cxx.write('}\n')
173
174 idl_am.close()
175 idl_i_am.close()
176 wrap_h.close()
177 wrap_cxx.close()
178