Marsik Posted February 28 Share Posted February 28 Здравствуйте, как можно менять местами и удалять элементы в PROP_ARRAY_STRUCT ? Link to comment
cash-metall Posted February 28 Share Posted February 28 к сожалению у ComponentVariableArray нет методов для удаления и свапа параметров, т.к. в основном он планировался просто как read-only обертка над PropertyParameter сделать это можно через дополнительные функции. чтото типа такого BlobPtr saveParameterToBlob(const PropertyParameterPtr &p) { if (!p) return BlobPtr(); BlobPtr blob = Unigine::Blob::create(); p->saveState(blob); return blob; } bool restoreParameterFromBlob(const PropertyParameterPtr &p, const BlobPtr &blob) { if (!p || !blob) return false; blob->seekSet(0); p->resetValue(); return p->restoreState(blob); } void swap_parameters(const PropertyParameterPtr &p1, const PropertyParameterPtr &p2) { if (p1 && p2) { BlobPtr data1 = saveParameterToBlob(p1); BlobPtr data2 = saveParameterToBlob(p2); restoreParameterFromBlob(p1, data2); restoreParameterFromBlob(p2, data1); } } void swap_parameters_from_array(const PropertyParameterPtr ¶m_ptr, int index1, int index2) { if (!param_ptr || param_ptr->getType() != Property::PARAMETER_ARRAY) return; int array_size = param_ptr->getArraySize(); if (index1 >= array_size || index1 < 0 || index2 >= array_size || index2 < 0) return; PropertyParameterPtr p1 = param_ptr->getChild(index1); PropertyParameterPtr p2= param_ptr->getChild(index2); swap_parameters(p1, p2); } void remove_parameter_from_array(const PropertyParameterPtr ¶m_ptr, int index) { if (index < 0) return; if (!param_ptr || param_ptr->getType() != Property::PARAMETER_ARRAY) return; int array_size = param_ptr->getArraySize(); if (index >= array_size) return; int new_array_size = array_size - 1; if (new_array_size == 0) { // Exceptional case, when it's no necessary to do anything. param_ptr->setArraySize(0); return; } for (int i = index+1; i < array_size; i++) { PropertyParameterPtr p1 = param_ptr->getChild(index); PropertyParameterPtr p2= param_ptr->getChild(index-1); swap_parameters(p1, p2); } param_ptr->setArraySize(new_array_size); } int AppSystemLogic::init() { remove_parameter_from_array(prop_array_struct->getParameter(), 4); // удалить 4й элемент swap_parameters_from_array(prop_array_struct->getParameter(), 1,2); // поменять местами 1 и 2 элемент return 1; } Link to comment
Marsik Posted February 28 Author Share Posted February 28 @cash-metall Спасибо большое за ответ. Там в коде есть ошибка, ниже исправленный код. BlobPtr saveParameterToBlob(const PropertyParameterPtr &p) { if (!p) return BlobPtr(); BlobPtr blob = Unigine::Blob::create(); p->saveState(blob); return blob; } bool restoreParameterFromBlob(const PropertyParameterPtr &p, const BlobPtr &blob) { if (!p || !blob) return false; blob->seekSet(0); p->resetValue(); return p->restoreState(blob); } void swap_parameters(const PropertyParameterPtr &p1, const PropertyParameterPtr &p2) { if (p1 && p2) { BlobPtr data1 = saveParameterToBlob(p1); BlobPtr data2 = saveParameterToBlob(p2); restoreParameterFromBlob(p1, data2); restoreParameterFromBlob(p2, data1); } } void swap_parameters_from_array(const PropertyParameterPtr ¶m_ptr, int index1, int index2) { if (!param_ptr || param_ptr->getType() != Property::PARAMETER_ARRAY) return; int array_size = param_ptr->getArraySize(); if (index1 >= array_size || index1 < 0 || index2 >= array_size || index2 < 0) return; PropertyParameterPtr p1 = param_ptr->getChild(index1); PropertyParameterPtr p2= param_ptr->getChild(index2); swap_parameters(p1, p2); } void remove_parameter_from_array(const PropertyParameterPtr ¶m_ptr, int index) { if (index < 0) return; if (!param_ptr || param_ptr->getType() != Property::PARAMETER_ARRAY) return; int array_size = param_ptr->getArraySize(); if (index >= array_size) return; int new_array_size = array_size - 1; if (new_array_size == 0) { // Exceptional case, when it's no necessary to do anything. param_ptr->setArraySize(0); return; } for (int i = index+1; i < array_size; i++) { PropertyParameterPtr p1 = param_ptr->getChild(i); PropertyParameterPtr p2= param_ptr->getChild(i-1); swap_parameters(p1, p2); } param_ptr->setArraySize(new_array_size); } int AppSystemLogic::init() { remove_parameter_from_array(prop_array_struct->getParameter(), 4); // удалить 4й элемент swap_parameters_from_array(prop_array_struct->getParameter(), 1,2); // поменять местами 1 и 2 элемент return 1; } 1 Link to comment
cash-metall Posted March 1 Share Posted March 1 да, действительно, вы правы PropertyParameterPtr p1 = param_ptr->getChild(i); PropertyParameterPtr p2= param_ptr->getChild(i-1); спасибо! 1 Link to comment
Recommended Posts