Название: Синхронизировать property Отправлено: Igors от Ноябрь 07, 2013, 19:00 Добрый день
Занимаюсь прикруткой скриптов, и все вроде удачно "легло", но вылазит противная мелочевка (не вписывающаяся в общую схему :'(). Мои объекты мапируются в пытон переменные используя проперди, напр Код: py> obj.Geometry.Position.x = 100 Код: py>obj.Geometry.Yaw = 100 # так называется x ;-) Код: py> obj.Position.x = 100 Код: py> obj.Position.x = 100 Спасибо Название: Re: Синхронизировать property Отправлено: sergek от Ноябрь 12, 2013, 10:15 Но юзверю неинтересно все время набирать "Geometry" и редактировать скрипты при смене режима. Он хочет писать так Ваши пользователи желают странного :)Код: py> obj.Position.x = 100 Но можно сделать с использованием врапперов: Код: // прикладные классы Код: // врапперы прикладных классов Код: // регистрация прикладных классов Код: py>obj = Queer() Название: Re: Синхронизировать property Отправлено: Igors от Ноябрь 13, 2013, 11:38 Код: class GeometryWrapper : public QObject { Та же проблема приходит с др стороны. Код: class PositionWrapper : public QObject { Код: void py_set_x(Position* o, int value) Код: py> test = Position() Название: Re: Синхронизировать property Отправлено: sergek от Ноябрь 13, 2013, 18:19 Напрашивается так Как вариант, "p" сделать статическим членом Position, тогда все экземпляры Position будут иметь к нему доступ. Можно вообще сделать отдельный класс, собрать в нем статические данные и сделать его ответственным за обмен между скриптами и приложением. Будет у вас некий шлюз. Могу даже подарить название класса - ScriptGateway ;)Код: void py_set_x(Position* o, int value) Код: py> test = Position() Название: Re: Синхронизировать property Отправлено: Igors от Ноябрь 14, 2013, 01:22 Как вариант, "p" сделать статическим членом Position, тогда все экземпляры Position будут иметь к нему доступ. Можно вообще сделать отдельный класс, собрать в нем статические данные и сделать его ответственным за обмен между скриптами и приложением. Будет у вас некий шлюз. Могу даже подарить название класса - ScriptGateway ;) Так а что мне даст статический член?Код: py> test = Position() # это просто пытон-переменная, Название: Re: Синхронизировать property Отправлено: sergek от Ноябрь 14, 2013, 09:24 Так а что мне даст статический член? Здесь:Код: py> test = Position() А здесь: Код: void py_set_x(Position* o, int value) Ну, а по поводу Цитировать А что если данный экземпляр Geomеtry не имеет атрибута yaw? (а др экземпляр имеет). я и в первый раз ничего не понял...Название: Re: Синхронизировать property Отправлено: Igors от Ноябрь 14, 2013, 15:22 позволит выполнить DoModifyX(). Если p - статический, то DoModifyX() будет выполняться всегда, то что он должен делать ???я и в первый раз ничего не понял... Код: py> obj.Geometry.Position.x = 1 # Ок если obj имеет флаг "implicit" иначе должна быть ошибка А так все здорово и пытон очарователен, вот только эти противные "мелочи" :'( Название: Re: Синхронизировать property Отправлено: sergek от Ноябрь 15, 2013, 10:38 Если p - статический, то DoModifyX() будет выполняться всегда, то что он должен делать ??? хз. это ваша функция.Цитировать А так все здорово и пытон очарователен... На этой ноте и закончим.Название: Re: Синхронизировать property Отправлено: Igors от Ноябрь 15, 2013, 13:16 Если p - статический, то DoModifyX() будет выполняться всегда, то что он должен делать ??? хз. это ваша функция.На этой ноте и закончим. Да, видимо слишком специфично. Как-то сделал, не блеск, но работает. Спасибо за помощьНазвание: Re: Синхронизировать property Отправлено: sergek от Ноябрь 16, 2013, 10:37 Вот еще, может, пригодится - шаблон для изготовления врапперов, я использую его по принципу "copy/paste/replace":
Код: // шаблон декоратора. Наследует либо QObject, либо враппер базового класса Название: Re: Синхронизировать property Отправлено: Igors от Ноябрь 16, 2013, 11:47 Вот еще, может, пригодится - шаблон для изготовления врапперов, А как "запускаете сенокосилку"? Название: Re: Синхронизировать property Отправлено: sergek от Ноябрь 16, 2013, 16:48 Да простят меня... Ну так:
1. Нужен враппер для класса Geometry. 2. Добавляю в проект класс C++ с именем GeometryWrapper. 3. Вместо объявления класса копирую туда указанный шаблон, в .cpp удаляю конструктор (там остается только #include "geometrywrapper.h"). Можно вообще cpp удалить, если методы враппера тривиальные. 4. Подсчитываю, сколько нужно эмулировать простых свойств ($Property$), сколько свойств с типом классов ($PropertyType$). В шаблоне повторяю пары get/set столько, сколько насчитал. 5. Делаю контекстную замену $ClassType$ на Geometry. 6. Если Geometry наследует класс, для которого есть враппер, заменяю $BaseType$ на него, иначе -на QObject. 7. Для каждого свойства заменяю $Property$ в паре get/set на имя этого свойства, например на posx, posy, posz. 8. Если есть свойства с типом классов, заменяю $PropertyType$ на нужный класс, например, Position. Далее нужно зарегистрировать класс, для которого создан враппер. Последнее - у меня все простые свойства имеют тип QString. Если у вас не так, значит, делаем еще замену типов. Достоинство этого "метода" - тупость, а, значит, минимум ошибок. Можно и автоматизировать (кстати, в составе PythonQt есть генератор - не разбирался, может, и оно. Разберетесь - сообщите), но ради полсотни классов, для которых мне нужно было написать врапперы, было лень. пересчитал - оказалось, 70. нифига себе... Название: Re: Синхронизировать property Отправлено: Igors от Ноябрь 16, 2013, 19:21 но ради полсотни классов, для которых мне нужно было написать врапперы, было лень. пересчитал - оказалось, 70. нифига себе... У меня 3 (делал все на пропердях), поэтому автоматизация не так актуальна :) Да простят меня... Понял, не буду больше надоедать :) Спасибо |