23
23
#include " ../external/pybind11/include/pybind11/pybind11.h"
24
24
#include " ../external/pybind11/include/pybind11/stl.h"
25
25
#include " ../external/pybind11/include/pybind11/numpy.h"
26
+ #include " ../external/pybind11/include/pybind11/functional.h"
26
27
27
28
// See
28
29
// https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html#binding-stl-containers
@@ -51,7 +52,7 @@ Id initModule(py::module& m)
51
52
}
52
53
53
54
template <typename T = double >
54
- void setProp (const ObjId& id, const string& fname, T val)
55
+ void setProperty (const ObjId& id, const string& fname, T val)
55
56
{
56
57
Field<T>::set (id, fname, val);
57
58
}
@@ -71,50 +72,96 @@ py::array_t<T> getFieldNumpy(const ObjId& id, const string& fname)
71
72
return py::array_t <T>(v.size (), v.data ());
72
73
}
73
74
74
- py::object getFieldGeneric (const ObjId& oid, const string& fname)
75
+ py::object getPropertyValueFinfo (const ObjId& oid, const string& fname, const string& rttType )
75
76
{
76
- auto cinfo = oid.element ()->cinfo ();
77
- auto finfo = cinfo->findFinfo (fname);
78
-
79
- if (!finfo) {
80
- py::print (" Field " + fname + " is not found on " + oid.path ());
81
- return pybind11::none ();
82
- }
83
-
84
- string ftype = finfo->rttiType ();
85
- if (ftype == " double" )
77
+ if (rttType == " double" )
86
78
return pybind11::float_ (getProp<double >(oid, fname));
87
- else if (ftype == " float" )
79
+ else if (rttType == " float" )
88
80
return pybind11::float_ (getProp<double >(oid, fname));
89
- else if (ftype == " vector<double>" )
81
+ else if (rttType == " vector<double>" )
90
82
return py::cast (getProp<vector<double >>(oid, fname));
91
- else if (ftype == " string" )
83
+ else if (rttType == " string" )
92
84
return pybind11::str (getProp<string>(oid, fname));
93
- else if (ftype == " char" )
85
+ else if (rttType == " char" )
94
86
return pybind11::str (getProp<string>(oid, fname));
95
- else if (ftype == " int" )
87
+ else if (rttType == " int" )
96
88
return pybind11::int_ (getProp<int >(oid, fname));
97
- else if (ftype == " unsigned long" )
89
+ else if (rttType == " unsigned long" )
98
90
return pybind11::int_ (getProp<unsigned long >(oid, fname));
99
- else if (ftype == " unsigned int" )
91
+ else if (rttType == " unsigned int" )
100
92
return pybind11::int_ (getProp<unsigned int >(oid, fname));
101
- else if (ftype == " bool" )
93
+ else if (rttType == " bool" )
102
94
return pybind11::bool_ (getProp<bool >(oid, fname));
103
- else if (ftype == " Id" )
95
+ else if (rttType == " Id" )
104
96
return py::cast (getProp<Id>(oid, fname));
105
- else if (ftype == " ObjId" )
97
+ else if (rttType == " ObjId" )
106
98
return py::cast (getProp<ObjId>(oid, fname));
107
- else if (ftype == " Variable" )
99
+ else if (rttType == " Variable" )
108
100
return py::cast (getProp<Variable>(oid, fname));
109
- else if (ftype == " vector<Id>" )
101
+ else if (rttType == " vector<Id>" )
110
102
return py::cast (getProp<vector<Id>>(oid, fname));
111
- else if (ftype == " vector<ObjId>" )
103
+ else if (rttType == " vector<ObjId>" )
112
104
return py::cast (getProp<vector<ObjId>>(oid, fname));
105
+ py::print (" Warning: pymoose::getProperty::Warning: Unsupported type " + rttType);
106
+ return py::none ();
107
+ }
108
+
109
+ py::list getPropertyElementFinfo (const ObjId& objid, const string& fname)
110
+ {
111
+ auto oid = ObjId (objid.path () + ' /' + fname);
112
+ auto len = Field<unsigned int >::get (oid, " numField" );
113
+ assert (len >= 0 );
114
+ vector<ObjId> res (len);
115
+ for (size_t i = 0 ; i < len; i++)
116
+ res[i] = ObjId (oid.path (), oid.dataIndex , i);
117
+ return py::cast (res);
118
+ }
119
+
120
+ template <typename A, typename L>
121
+ py::object getLookValueFinfo (const ObjId& oid, const string& fname, const string& key)
122
+ {
123
+ return py::cast (LookupField<A, L>::get (oid, fname, key));
124
+ }
125
+
126
+ py::dict getPropertyLookValueFinfo (const ObjId& oid, const string& fname)
127
+ {
128
+ py::dict res;
129
+ auto v = [oid, fname](const string& key){
130
+ return LookupField<string, bool >::get (oid, fname, key);
131
+ };
132
+ return res;
133
+ }
113
134
114
- py::print (" Warning: pymoose::getFieldGeneric::Warning: Unsupported type " + ftype);
135
+ py::object getProperty (const ObjId& oid, const string& fname)
136
+ {
137
+ auto cinfo = oid.element ()->cinfo ();
138
+ auto finfo = cinfo->findFinfo (fname);
139
+
140
+ if (!finfo) {
141
+ py::print (" Field " + fname + " is not found on " + oid.path ());
142
+ return pybind11::none ();
143
+ }
144
+
145
+ string rttType = finfo->rttiType ();
146
+ string finfoType = cinfo->getFinfoType (finfo);
147
+
148
+ if (finfoType == " ValueFinfo" )
149
+ return getPropertyValueFinfo (oid, fname, rttType);
150
+ else if (finfoType == " FieldElementFinfo" )
151
+ return getPropertyElementFinfo (oid, fname);
152
+ else if (finfoType == " LookupValueFinfo" )
153
+ return getPropertyLookValueFinfo (oid, fname);
154
+
155
+ cout << " Searching for " << fname << " with rttType "
156
+ << rttType << " and type: " << finfoType << endl;
157
+
158
+
159
+ py::print (" Warning: pymoose::getProperty::Warning: Unsupported type " + rttType);
115
160
return pybind11::none ();
116
161
}
117
162
163
+
164
+
118
165
PYBIND11_MODULE (_cmoose, m)
119
166
{
120
167
m.doc () = R"moosedoc( moose module.)moosedoc" ;
@@ -161,18 +208,20 @@ PYBIND11_MODULE(_cmoose, m)
161
208
// Set/Get
162
209
// --------------------------------------------------------------------
163
210
// Overload of Field::set
164
- .def (" setField" , &setProp <double >)
165
- .def (" setField" , &setProp <double >)
166
- .def (" setField" , &setProp <vector<double >>)
167
- .def (" setField" , &setProp <std::string>)
168
- .def (" setField" , &setProp <bool >)
211
+ .def (" setField" , &setProperty <double >)
212
+ .def (" setField" , &setProperty <double >)
213
+ .def (" setField" , &setProperty <vector<double >>)
214
+ .def (" setField" , &setProperty <std::string>)
215
+ .def (" setField" , &setProperty <bool >)
169
216
170
217
// Overload for Field::get
171
- .def (" getField" , &getFieldGeneric)
218
+ .def (" getField" , &getProperty)
219
+
172
220
.def (" getElementField" , &getElementField)
173
221
.def (" getElementFieldItem" , &getElementFieldItem)
174
222
.def (" getNumpy" , &getFieldNumpy<double >)
175
223
224
+
176
225
// ---------------------------------------------------------------------
177
226
// Connect
178
227
// ---------------------------------------------------------------------
0 commit comments