| 818 | } |
| 819 | |
| 820 | void apply_operator_props_to_python_instance(const std::string& operator_id, |
| 821 | const vis::op::OperatorProperties& props, |
| 822 | nb::object instance) { |
| 823 | const auto* schemas = vis::op::propertySchemas().getSchema(operator_id); |
| 824 | if (!schemas || !instance.is_valid() || instance.is_none()) { |
| 825 | return; |
| 826 | } |
| 827 | |
| 828 | for (const auto& schema : *schemas) { |
| 829 | if (!props.has(schema.name)) { |
| 830 | continue; |
| 831 | } |
| 832 | |
| 833 | try { |
| 834 | switch (schema.type) { |
| 835 | case vis::op::PropertyType::BOOL: |
| 836 | if (const auto value = props.get<bool>(schema.name)) { |
| 837 | nb::setattr(instance, schema.name.c_str(), nb::bool_(*value)); |
| 838 | } |
| 839 | break; |
| 840 | case vis::op::PropertyType::INT: |
| 841 | if (const auto value = props.get<int>(schema.name)) { |
| 842 | nb::setattr(instance, schema.name.c_str(), nb::int_(*value)); |
| 843 | } |
| 844 | break; |
| 845 | case vis::op::PropertyType::FLOAT: |
| 846 | if (const auto value = props.get<float>(schema.name)) { |
| 847 | nb::setattr(instance, schema.name.c_str(), nb::float_(*value)); |
| 848 | } |
| 849 | break; |
| 850 | case vis::op::PropertyType::STRING: |
| 851 | case vis::op::PropertyType::ENUM: |
| 852 | if (const auto value = props.get<std::string>(schema.name)) { |
| 853 | nb::setattr(instance, schema.name.c_str(), nb::str(value->c_str())); |
| 854 | } |
| 855 | break; |
| 856 | case vis::op::PropertyType::FLOAT_VECTOR: { |
| 857 | nb::list values; |
| 858 | if (schema.size && *schema.size == 3) { |
| 859 | if (const auto value = props.get<glm::vec3>(schema.name)) { |
| 860 | values.append(nb::float_(value->x)); |
| 861 | values.append(nb::float_(value->y)); |
| 862 | values.append(nb::float_(value->z)); |
| 863 | nb::setattr(instance, schema.name.c_str(), values); |
| 864 | } |
| 865 | } else if (const auto value = props.get<std::vector<float>>(schema.name)) { |
| 866 | for (float item : *value) { |
| 867 | values.append(nb::float_(item)); |
| 868 | } |
| 869 | nb::setattr(instance, schema.name.c_str(), values); |
| 870 | } |
| 871 | break; |
| 872 | } |
| 873 | case vis::op::PropertyType::INT_VECTOR: { |
| 874 | if (const auto value = props.get<std::vector<int>>(schema.name)) { |
| 875 | nb::list values; |
| 876 | for (int item : *value) { |
| 877 | values.append(nb::int_(item)); |