[CS2] Отлов события масштабирования объекта

Статус
Закрыто для дальнейших ответов.

ernesto.monde

Участник
Топикстартер
Сообщения
11
Реакции
0
Привет всем.

В основном я писал на официальный адобовский форум по InDesign, но к сожалению, там очень вялая переписка и ответа на свой вопрос я не получил.

Мне нужно отловить событе масштабирования (Scaling) для моего объекта. Как это сделать в СS3 - я знаю, и оно даже рабтает. (Нужно создать обсервер, подписаться на нужный протокол IID_ITRANSFORM_DOCUMENT и событие kScaleChangedMessage придёт).
Но проблемма в том, что это событие приходит в обсервер только в CS3. В СS2 в пределах этого протокола приходит только событие перемещения объекта по документу - отлавливал в дебажном ИнДизайне. Т.е. фактически архитектура отлова реализована, важно найти КАКОЙ протокол нужен для отлова события масштабирования.

Прошу сильно не пинать, но уже сделал перебор всех протоколов банальным подписыванием на каждый из них (целыми пачками) на все протоколы, которые нашёл в хидерах.

К сожалению, нормальной докуметации по CS2 найти нереально, то что и как работает в нём, можно найти только в докуметации по CS3, и то, только в разделе изменений.

Вобщем, если кто может подсказать где и как это отловить - буду очень признателен. Со своей стороны, обещаю, что свой опыт, полученный в процессе общения с ИнДизайном буду применять при ответах на вопросы форума.
 
Ответ: [CS2] Отлов события масштабирования объекта

Забыл сказать, платформа разработки - Windows, среда VS 2005 (w/o SP1), CS3 SDK Build458, CS2 SDK Build421
 
Ответ: [CS2] Отлов события масштабирования объекта

Какую команду вы пытаетесь отловить? kTransformPageItemsCmdBoss? Если да, то ее нет в ЦС2.
В ЦС2 есть kResizeItmsCmdBoss - то она не оповещает обсерверы.
Можете описать задачу подробнее?
 
Ответ: [CS2] Отлов события масштабирования объекта

Strizh сказал(а):
Какую команду вы пытаетесь отловить? kTransformPageItemsCmdBoss? Если да, то ее нет в ЦС2.
В ЦС2 есть kResizeItmsCmdBoss - то она не оповещает обсерверы.
Можете описать задачу подробнее?

Именно, kTransformPageItemsCmdBoss мне нужен. Только что поискал в СДК поиском фара - и правда нет.

Итак, я создаю на документе объект, отнаследованный от CGraphicFrameShape. В нём я создаю элементы, которые должны масштабироваться, когда пользователь выберет нужные ему значения масштаба (раздельно по X и Y либо вместе, если они привязаны).

Так вот, с помощью kTransformPageItemsCmdBoss в CS3 я этот процесс и отлавливаю в обсервере, который подписываю на соответсвующий протокол. И каково же было моё удивление, когда я собрал плагин с CS2 SDK и обнаружил, что комманда не приходит, хотя фрейм честно масштабируется.
В SDK CS3 я обнаружил заметки об изменениях в обработке комманд, но эти изменения касались только undoability:
... InDesign CS3 fundamentally changes the way commands and observers work with regard to undoable operations...

В CS3 я эти значения получаю в методе Update( ... ) обсервера:

ICommand* command = (ICommand*)changedBy;
bool16 isCommandDone = command->GetCommandState() == ICommand::kDone;

if (protocol == IID_ITRANSFORM_DOCUMENT)
{
if ( theChange == kScaleChangedMessage && !isCommandDone)
{
InterfacePtr<ITransform> xform(this, UseDefaultIID());

PMReal fXScale = xform->GetXScale();
PMReal fYScale = xform->GetYScale();​
}​
}

А уже потом от получнных значений пляшу.

Подскажите, какой механихм отлова сообщения о масштабирования в CS2, и, самое главное, какое оно - это сообщение?

Кстати, тольк что продебажился, приаттачился с студией к дебажному ИнДизайну, в окно Output пришла комманда kScaleObjectCmdBoss. Может она как-то поможет? Как её обработать?
 
Ответ: [CS2] Отлов события масштабирования объекта

Сдается мне, что вы, батенька, огород городите.
Покажите мне ресурсы из fr файла босса созданного вами пейжитема.
 
Ответ: [CS2] Отлов события масштабирования объекта

Вот:
Class
{
kMyPageItemBoss,
kSplineItemBoss,
{
IID_ISHAPE, kMyShapeImpl​
}
},
 
Ответ: [CS2] Отлов события масштабирования объекта

А почему бы не сделать так:

Class
{

kMyPageItemBoss,
kSplineItemBoss,
{

IID_ISHAPE, kMyShapeImpl,
IID_ITRANSFORM, kMyTransformImpl,

}

},

C++ code:

class CMyTransform : public CTransform
{
};

Ну и собственно все интересное будет тут

virtual void ScaleBy (const PMReal &xScale, const PMReal &yScale, const PMPoint &center, TransformAction transformAction=kTransformItemAndChildren)=0
Scale item with certain x/y values based on the given reference point.
 
Ответ: [CS2] Отлов события масштабирования объекта

Strizh сказал(а):
А почему бы не сделать так:
...

Попробовал.
Вылезли такие проблеммы: элемент на документе создаётся, но и выделить его, ни сделать ничего с ним нельзя. Может, что ещё что надо сделать?


Вобщем, я делал так:
Class
{
kMyPageItemBoss,
kSplineItemBoss,
{
IID_ISHAPE, kMyShapeImpl,
IID_ITRANSFORM, kMyTransformImpl,
}
},

задефайнил:
DECLARE_PMID(kImplementationIDSpace, kMyTransformImpl, kMyPrefix + 40)

В фабрике:
REGISTER_PMINTERFACE(MyTransform, kMyTransformImpl );

Плюсовая часть:

class MyTransform : public CTransform
{
public:
MyTransform(IPMUnknown * boss = nil);
virtual ~MyTransform();
virtual void ScaleBy (const PMReal& xScale, const PMReal& yScale, const PMPoint& center, TransformAction transformAction);​
};


CREATE_PMINTERFACE(MyTransform, kMyTransformImpl)

void MyTransform::ScaleBy (const PMReal& xScale, const PMReal& yScale, const PMPoint& center, TransformAction transformAction/)
{
TRACE("MyTransform::ScaleBy\n");​
}

MyTransform::MyTransform(IPMUnknown * boss)
:CTransform(boss)​
{
TRACE("MyTransform::MyTransform\n");​
}

MyTransform::~MyTransform()
{
TRACE("MyTransform::~MyTransform\n");​
}

Мне бы очень не хотелось писать обработчики выделения и т.д., поскольку ИнДизайн и сам неплохо справляется с этой задачей. Может как-то можно обойти появившуюся проблемму?

PS: В файлах заголовка я нашёл такой босс: kScaleItemCmdBoss

Может он мне чем-то поможет? Как мне с него что-нибудь поиметь?
 
Ответ: [CS2] Отлов события масштабирования объекта

По поводу второй части:

ScaleItemCmd
This command scales a collection of items by a specified percentage with respect to a given
point of origin.
ClassID: kScaleItemCmdBoss
ImplementationID: kScaleItemCmdImpl
Interfaces used by this Command:
IID_ICOMMAND
Notes: None.
IID_ISCALEITEMCMDDATA
Notes: None.
IID_IBOUNDSCHECKER
Notes: Used to ensure items remain within a specified area (for example, the pasteboard).
IID_IDYNAMICUPDATE
Notes: None.
IID_IBOUNDSDATA
Notes: None.
Observer Notification:
None
Responder Notification:
None
ItemList Input:
const UIDList theItemList = this->GetItemListReference();
ItemList Output:
None


Единственный вариант ловить эту команду через ICommandInterceptor.
 
Ответ: [CS2] Отлов события масштабирования объекта

А если kMyTransformImpl заменить на kPageItemTransformImpl будет выделение работать?
Еще бывает FactoryList.h цепляется после ребилда проэкта.
 
Ответ: [CS2] Отлов события масштабирования объекта

ScaleBy вызывается вообще?
 
Ответ: [CS2] Отлов события масштабирования объекта

Strizh сказал(а):
А если kMyTransformImpl заменить на kPageItemTransformImpl будет выделение работать?
Еще бывает FactoryList.h цепляется после ребилда проэкта.

Да, если подменить только в fr, то выделение работает...
 
Ответ: [CS2] Отлов события масштабирования объекта

Strizh сказал(а):
По поводу второй части:
...
Единственный вариант ловить эту команду через ICommandInterceptor.

А будет ли это работать с масштабированием? Ведь, если обратить внимание, это странная штука, по крайней мере в ИнДизайне:
она ведь постоянно 100% в неактивном состоянии, а меняется только когда выбрано соответствующее значение, потом комманда отрабатывает и опять в 100%.

В документации сказано, что ICommandInterceptor решает, будет ли обрабатываться комманда до того как она обработана:
A CommandInterceptor can be installed at the CommandProcessor in order to intercept any command before it is processed.
 
Ответ: [CS2] Отлов события масштабирования объекта

ernesto.monde сказал(а):
А будет ли это работать с масштабированием? Ведь, если обратить внимание, это странная штука, по крайней мере в ИнДизайне:
она ведь постоянно 100% в неактивном состоянии, а меняется только когда выбрано соответствующее значение, потом комманда отрабатывает и опять в 100%.
Значит плохо имплементирован CTransform, чего-то не хватает.

ernesto.monde сказал(а):
В документации сказано, что ICommandInterceptor решает, будет ли обрабатываться комманда до того как она обработана:
A CommandInterceptor can be installed at the CommandProcessor in order to intercept any command before it is processed.
Вы поменьше документации верьте и все будет хорошо. В документации вообще бОльшая часть Undocumented.

Вот и решите в ICommandInterceptor что команда БУДЕТ обработана, но успеете получить command->GetItemList() список итемов над которыми будет эта команда работать.
Стучите в аську (аська в профайле). Может обменяемся полезным опытом.
 
Ответ: [CS2] Отлов события масштабирования объекта

Кстати, меня ещё очень сильно интересует тот факт, что в хидерах к CS2 SDK есть kScaleChangedMessage, которое очень замечательно ловится в обсервере в CS3, если подписываться на протокол IID_ITRANSFORM_DOCUMENT, который тоже, кстати, в хидерах.
 
Ответ: [CS2] Отлов события масштабирования объекта

Strizh сказал(а):
Значит плохо имплементирован CTransform, чего-то не хватает.

В каком плане "плохо"? Мне нужно было все методы реализовать? Зачем? Там же методы виртуальные
 
Статус
Закрыто для дальнейших ответов.