Тема: Превью и диалог с настройками при вставке Xref.

Сейчас мой код имеет следующий вид:

...
cGePoint3d pIns;            
AcGeScale3d pScale(1,1,1);    
double pRot = 0;
int res = acedGetPoint(0 ,_ADT("\nУкажите точку вставки: "), asDblArray(pIns));                
if (res == RTNORM)
{
        acdbUcs2Wcs(asDblArray(pIns), asDblArray(pIns),false);
    acedGetReal(_ADT("\nМасштаб по X <1> : "), &pScale.sx);
    acedGetReal(_ADT("\nМасштаб по Y <1> : "), &pScale.sy);
    acedGetReal(_ADT("\nМасштаб по Z <1> : "), &pScale.sz);
    acedGetAngle(asDblArray(pIns), _ADT("\nУгол поворота <0> : "), &pRot);
    AcDbObjectId btrId;
    Acad::ErrorStatus es = acedXrefAttach(Xref, XrefFileName, &btrId, NULL, &pIns, &pScale,&pRot);            
...

Т.е. сначала я прошу задать местро вставки, затем - параметры.
Необходимо поменять порядок и как минимум при выборе места использовать превью документа, который вставляется (так, как это происходит через меню AutoCAD Insert->External Reference...). Вызов диалога свойств вставки  - опционально.
Подскажите, пожалуйста, позволяет ли ObjectARX использовать стандартный диалог с настройками вставки и отображать превью при выборе места вставки.

Re: Превью и диалог с настройками при вставке Xref.

Стандартный диалог использовать нельзя (если конечно не запускать команду _XREF), но можно написать самому. По поводу превью, посмотри пример BlockView в ObjectARX SDK Samples.

Re: Превью и диалог с настройками при вставке Xref.

Спасибо, Александр.

Re: Превью и диалог с настройками при вставке Xref.

Александр, Вы советуете использовать CGsPreviewCtrl для такого превью? Т.е. сделать диалог и перемещать  его за курсором?

Re: Превью и диалог с настройками при вставке Xref.

> equilibrium
Вообще-то намного проще сначала вставить внешнюю ссылку (acedXrefAttach в месте положения курсора), а потом таскать ее за курсором пока пользователь не укажет куда именно ее вставить. Плюс возможно включить обработку ключевых слов для масштабирования и поворота.

Re: Превью и диалог с настройками при вставке Xref.

Намного. Спасибо.

Re: Превью и диалог с настройками при вставке Xref.

> equilibrium
Посмотри при помощи ARXDBG (реакторы), что делает AutoCAD при команде _XREF - это поможет тебе сделать свой аналог.

Re: Превью и диалог с настройками при вставке Xref.

Подскажите, пожалуйста, где включаются эти реакторы. Я воспользовался приложением из примеров SDK 2006. Нашел только закладку в опциях, там такой настройки нет.

Re: Превью и диалог с настройками при вставке Xref.

> equilibrium
Один из двух вариантов:
1) В контекстном меню пункт ARXDBG
2) Команда ArxDbgReactors

Re: Превью и диалог с настройками при вставке Xref.

Я включил Event и Editor реакторы, но мне, к сожалению, не понятно, каким образом реализована вставка Xref в AutoCAD. Записи в логе аналогичны записям при вызове acedXrefAttach.
Есть следующие 2 варианта:
1) сделать документу Cut/Paste и тогда он "прилипнет к курсору", пока не будет указана точка ставки, но "приклеивание" это не такое, как при стандартной вставке внешней ссылки: например, если на вставляемом документе прямоугольник, то после Paste его стороны лежат по линиям перекрестия курсора.
2) сделать acedXrefAttach, затем отслеживать перемещение курсора, делая acedXrefDettach/acedXrefAttach до нажатия левой кнопки мыши. Здесь вопрос о накладных расходах, не будет ли это слишком медленно, если вставляемый документ велик?

Re: Превью и диалог с настройками при вставке Xref.

Оба варианта не годятся.
Вместо них предлагаю два других (оба требуют предварительно вставить при помощи acedXrefAttach внешнюю ссылку и создать для нее AcDbBlockReference):
1) acedDragGen для этой AcDbBlockReference
2) Использование класса AcEdJig
Второй вариант сложнее, но предпочтительней.

Re: Превью и диалог с настройками при вставке Xref.

Я неправильно сформулировал свой первый вариант. Необходимо вставить внешнюю ссылку, затем вырезать ее в буфер, сделать Paste и тогда ее можно будет переместить.
Ваши варианты уверен, будут работать и работать правильно, но в то же время решение в моем первом варианте кажется самым простым. Подскажите, пожалуйста, если вдруг я что-то упустил, если с чем-то при реализации возникнут проблемы. Спасибо.

Re: Превью и диалог с настройками при вставке Xref.

А как ты собираешься реализовывать Copy/Paste? Использовать команды _copyclip/ _pasteclip? Тогда зачем городить огород если можно сразу запустить команду _.-xref. Хотя это не наш метод... AcGeJig - вот наш метод.

Re: Превью и диалог с настройками при вставке Xref.

Упс. AcEdJig - наш метод.

Re: Превью и диалог с настройками при вставке Xref.

Я не могу использовать _.-xref, так как путь к документу для вставки должен получить из другого приложения.
К сожалению, время на это задание ограничено, поэтому был выбран описанный выше вариант.
Да, я собираюсь использовать команды copyclip/pasteclip. Осталось выделить только что вставленный Xref. Пытался сделать это командой

_.select last

Но выделение работает не так, как я ожидал.

Re: Превью и диалог с настройками при вставке Xref.

equilibrium пишет:

Я не могу использовать _.-xref, так как путь к документу для вставки должен получить из другого приложения.

Ну и что? В момент когда ты использовал acedXrefAttach ты уже знал путь к xref-файлу. Так что тебе мешает использовать этот же путь в команде _XREF?

Re: Превью и диалог с настройками при вставке Xref.

Александр Ривилис пишет:

Ну и что? В момент когда ты использовал acedXrefAttach ты уже знал путь к xref-файлу. Так что тебе мешает использовать этот же путь в команде _XREF?

Наверное то, что я не знаю, как передать путь к документу в команду.

_.-xref Attach path //неверный вариант

Re: Превью и диалог с настройками при вставке Xref.

> equilibrium
Во-первых, FILEDIA в 0 чтобы запрос пути был в командной строке.
Во вторых, все "\\" в пути заменить на "/"
В третьих, почему это вариант неверный?

Re: Превью и диалог с настройками при вставке Xref.

Александр Ривилис пишет:

В третьих, почему это вариант неверный?

Потому что команда не отработала. Выполнял ее следующим образом:

ADCHAR cmd[_MAX_FNAME + 1];
sprintf(cmd, _ADT("(command \"_.-xref\" \"Attach %s\") "), Xref);
acDocManagerPtr()->sendStringToExecute(curDoc(), cmd, true, false, false);

Попробую обнулить FILEDIA и снова выполнить -xref. Спасибо за подсказку.

Re: Превью и диалог с настройками при вставке Xref.

> equilibrium
Так у тебя ничего не получится. acDocManagerPtr()->sendStringToExecute выполняется ассинхронно к твоему приложению. Ты работаешь в контексте приложения или в контексте документа? Если в контексте документа используй acedCommand вместо acDocManagerPtr()->sendStringToExecute

Re: Превью и диалог с настройками при вставке Xref.

Попробовал, как Вы посоветовали:

acedCommand(RTSTR, "_.setvar", RTSTR, "FILEDIA", RTSTR, "0", RTNONE);    
acedCommand(RTSTR, "_.-xref", RTSTR, "Attach", RTSTR, Xref, RTSTR, ""|,RTNONE);

После выполнения -xref летит исключение. Необходимо задать параметры вставки:

Specify insertion point or [Scale/X/Y/Z/Rotate/PScale/PX/PY/PZ/PRotate]:

Как поступить в данной ситуации - не знаю. При вводе вручную можно задавать каждый из параметров сколько будет угодно - после ввода вновь появляется данный запрос. Если просто нажать enter - получаем следующее сообщение

Point or option keyword required.

Каким образом задать координаты точки вставки и поворота в данном случае? Какой еще коварный ввод от меня подтребуется?
Врядли предусмотрено включать/выключать отображение диалогов в процессе выполнения команды, но неплохим вариантом был бы и показ диалога для задания этих параметров.

Re: Превью и диалог с настройками при вставке Xref.

> equilibrium
1) Вместо acedCommand(RTSTR, "_.setvar", RTSTR, "FILEDIA", RTSTR, "0", RTNONE);  есть функция acedSetVar - изучай.
2) Вместо точки вставки задай "\\" - тогда автоматически появится динамическое отслеживание.
3) Диалог создай сам.

Re: Превью и диалог с настройками при вставке Xref.

P.S.: Кстати значение FILEDIA нужно потом обязательно восстановить - иначе пользователи тебя растерзают.

Re: Превью и диалог с настройками при вставке Xref.

С функцией acedSetVar знаком, в процессе разработки было быстрее скопировать строку с acedCommand smile Теперь ее место занимает acedSetVar. И про переменную тоже не забыл, спасибо.
Спасибо большое за помощь, Александр. Терпению Вашему нет предела :)

Re: Превью и диалог с настройками при вставке Xref.

Вставляю Xref следующим образом:

SetVar(VAR_FILEDIA, 0);
acedCommand(RTSTR, CMD_INS_XREF, RTSTR, PRM_ATTACH, RTSTR, Xref, RTSTR, DEFAULT_INTERACTIVE_INPUT, RTSTR, DEFAULT_X_SCALE, RTSTR, DEFAULT_Y_SCALE, RTSTR, DEFAULT_ROTATION_ANGLE, RTNONE);
SetVar(VAR_FILEDIA, 1);

В AutoCAD 2002, 2004, 2006 данный код работает без ошибок.
AutoCAD 2008 при вызове acedCommand(...) из приведенного выше кода время от времени (причина не ясна) падает с FATAL ERROR: пару раза вставил Xref/один раз упал.
Поделитесь, пожалуйста, идеями по поводу ошибки.