Recursively convert lists of numbers to lists of floats. IFC C++ bindings require Python floats (not ints) for AGGREGATE OF DOUBLE attributes (e.g. DirectionRatios, Coordinates). JSON parsing produces ints for whole numbers like 0, which causes a TypeError at the binding level.
(obj)
| 149 | |
| 150 | |
| 151 | def _floatify_numeric_lists(obj): |
| 152 | """Recursively convert lists of numbers to lists of floats. |
| 153 | |
| 154 | IFC C++ bindings require Python floats (not ints) for AGGREGATE OF DOUBLE |
| 155 | attributes (e.g. DirectionRatios, Coordinates). JSON parsing produces ints |
| 156 | for whole numbers like 0, which causes a TypeError at the binding level. |
| 157 | """ |
| 158 | if isinstance(obj, dict): |
| 159 | return {k: _floatify_numeric_lists(v) for k, v in obj.items()} |
| 160 | if ( |
| 161 | isinstance(obj, list) |
| 162 | and obj |
| 163 | and all(isinstance(v, (int, float)) for v in obj) |
| 164 | and any(isinstance(v, float) for v in obj) |
| 165 | ): |
| 166 | return [float(v) for v in obj] |
| 167 | return obj |
| 168 | |
| 169 | |
| 170 | def _split_list(value_str: str) -> list[str]: |