(изменено: void, 2 марта 2009г. 12:54:20)

Тема: Активный лист

Добрый день.

Создал филд передаю в него:

%<\tdmsvalue %<\AcVar Filename \f>%;%<\AcVar ctab \f "%tc4">%;PAGE_CODE>%

Если филд находится в блоке файла шаблона то %<\AcVar ctab \f "%tc4">%
возвращает имя листа шаблона(Model) а не моего документа.
Но если я просто использую в филде %<\AcVar ctab \f "%tc4">%(так же в шаблоне) то все отрабатывает корректно.
Думал получить активный лист сам но если использую acdbHostApplicationServices
то при загрузке dbx ACad ругается что AcRxDynamicLinker не справился.
В качестве примера использовал пример из ObjectArx - TextFileField.

Помогите разобраться с данной проблемой, в частности волнует имя активного листа.
Спасибо.

Re: Активный лист

void пишет:

Думал получить активный лист сам но если использую acdbHostApplicationServices то при загрузке dbx ACad ругается что AcRxDynamicLinker не справился. В качестве примера использовал пример из ObjectArx - TextFileField.

Помогите разобраться с данной проблемой, в частности волнует имя активного листа.

А теперь приведи код которым ты пытаешься получить имя активного листа. Пытаешься ли ты получить его из arx-файла или из dbx-файла? dbx-файл вообще-то не в курсе о имени активного листа, т.к. сделан так, чтобы иметь возможность загружаться не только в AutoCAD, но и в другие host-приложения, которые могут и не иметь вкладок листов. Более того в dbx-файлах нельзя использовать AcEd-классы/функции (фактически допустимы только AcDb классы функции). Правда, если ты уверен что приложение будет загружаться только в AutoCAD, то эти функции можно использовать.

Re: Активный лист

Да это dbx, я выше написал это. Использоваться будет только в AutoCad. Все же интересно поведение %<\AcVar ctab \f "%tc4">%, по какой причине так происходит? (

Re: Активный лист

void пишет:

Да это dbx, я выше написал это. Использоваться будет только в AutoCad. Все же интересно поведение %<\AcVar ctab \f "%tc4">%, по какой причине так происходит? (

Подозреваю, что если это не баг, то поле обновится после регенерации или принудительного обновления при помощи функции acdbEvaluateFields(...).
Ну а если dbx-приложение грузится только в AutoCAD, то:
Добавь:

#include "acaplmgr.h"

и можешь получить имя активного листа так:

AcApLayoutManager *pLayMng = (AcApLayoutManager *)acdbHostApplicationServices()->layoutManager();
if (pLayMng) {
  const ACHAR *curLayout = pLayMng->findActiveTab();
  acutPrintf(L"\nCurrent layout=\"%s\"",curLayout);
}

Re: Активный лист

Дело в том, что как я писал выше я думал получить лист аналогичным способом, но при использовании acdbHostApplicationServices() dbx не грузится, ругается AcRxDynamicLinker (((

(изменено: Александр Ривилис, 2 марта 2009г. 15:07:58)

Re: Активный лист

void пишет:

Дело в том, что как я писал выше я думал получить лист аналогичным способом, но при использовании acdbHostApplicationServices() dbx не грузится, ругается AcRxDynamicLinker  (((

Так быть не должно. Что-то у тебя не так. Приведенный код я проверил, создав тестовый dbx-файл и включив этот код в обработчик InitAppMsg. Какая версия AutoCAD? Какая версия ObjectARX? Какая версия MS VS? Если VS 2005, то отключена ли генерация и включение манифеста?

(изменено: void, 2 марта 2009г. 15:20:11)

Re: Активный лист

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

Цитатаvoid пишет:

Дело в том, что как я писал выше я думал получить лист аналогичным способом, но при использовании acdbHostApplicationServices() dbx не грузится, ругается AcRxDynamicLinker  (((

Так быть не должно. Что-то у тебя не так. Приведенный код я проверил, создав тестовый dbx-файл и включив этот код в обработчик InitAppMsg. Какая версия AutoCAD? Какая версия ObjectARX? Какая версия MS VS? Если VS 2005, то отключена ли генерация и включение манифеста?

AutoCad 2008, ObjectARX 2009, из-за либ использую 2005 студию 2008 не катит.

это acrxEntryPoin:

void addEvalIdToRegistry()
{
    //get the 'NumberField' Key location
    HKEY hSoftKey = NULL;
    HKEY hNumFldKey = NULL;
    const TCHAR * acadkey = acrxProductKey();
    const size_t nappKey = 1024;
    TCHAR appkey[nappKey]=_T("");
    _stprintf_s(appkey, nappKey, _T("%s\\Applications"),acadkey);

    if (RegOpenKeyEx(HKEY_CURRENT_USER, appkey, 0, KEY_WRITE|KEY_READ,
        &hSoftKey) == ERROR_SUCCESS)
    {
        DWORD dw;
        if (RegCreateKeyEx(hSoftKey, _T("TDMSValues"), 0, REG_NONE,
            REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
            &hNumFldKey, &dw) == ERROR_SUCCESS)
        {
            //Add 'FIELDEVALUATORS' entry to 'TextFileField'
            TCHAR evalId[14]=_T("TDMSValues");
            RegSetValueEx(hNumFldKey,_T("FIELDEVALUATORS"),0,REG_SZ,(LPBYTE)evalId,sizeof(evalId));
        }
    }
}

void updateRegistry()
{
    TCHAR moduleName[256];
    ::GetModuleFileName(_hdllInstance, moduleName, 256);
    // Fill the AppInfo structure with our demand loading details.
    AcadAppInfo appInfo;
    appInfo.setAppName(_T("TDMSValues")); // Application name
    appInfo.setModuleName(moduleName);// Module path
    appInfo.setAppDesc(_T("AsdkTDMSValues")); // Description
    appInfo.setLoadReason(// Specify when we want these to load
        AcadApp::LoadReasons(
        AcadApp::kOnCommandInvocation |
        AcadApp::kOnLoadRequest));
    
    appInfo.writeToRegistry(false,true);// Write the appInfo to the registry.
    
    appInfo.writeGroupNameToRegistry(_T("TDMSValues_GROUP"));// Write the group name
    
    // Write out all our commands (Global,Local).
    appInfo.writeCommandNameToRegistry(_T("TDMSValues"),_T("tnf"));

    addEvalIdToRegistry();
}

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CTDMSValuesApp : public AcRxDbxApp {

public:
    CTDMSValuesApp () : AcRxDbxApp () {}

    virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
        AcRx::AppRetCode retCode =AcRxDbxApp::On_kInitAppMsg (pkt) ;
        m_textFileFieldLoader.registerLoader();
        updateRegistry();
        return (retCode) ;
    }

    virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
        AcRx::AppRetCode retCode =AcRxDbxApp::On_kUnloadAppMsg (pkt) ;
        m_textFileFieldLoader.unregisterLoader();
        return (retCode) ;
    }

    virtual void RegisterServerComponents () {
    }

private:
    AsdkTDMSValuesEvaluatorLoader m_TDMSValuesFieldLoader;
} ;

Спасибо за помощь.

(изменено: Александр Ривилис, 2 марта 2009г. 15:32:05)

Re: Активный лист

С AutoCAD 2008 следует использовать ObjectARX 2008 (или 2007), но не 2009!
И не забываем про отключение манифеста:
Активный лист
Активный лист

Re: Активный лист

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

С AutoCAD 2008 следует использовать ObjectARX 2008 (или 2007), но не 2009!

на сайте написано что можно использовать ObjectARX 2009 для 2008 Autocad (dhjlt), но могу проверить и на 2009 Autocad), а так же пересобрать для ObjectARX 2008.

Re: Активный лист

void пишет:

на сайте написано что можно использовать ObjectARX 2009 для 2008 Autocad (dhjlt)

Это кто такое написал?

API Compatibility
Binary compatibility between AutoCAD 2008 and AutoCAD 2009 has been maintained. Applications built with ObjectARX for AutoCAD 2008, ObjectARX for AutoCAD 2007, and ObjectARX for AutoCAD 2008 will continue to run in AutoCAD 2009, but applications built using ObjectARX for AutoCAD 2009 may not work with previous releases.

AutoCAD 2009 и ObjectARX 2009 собраны с использованием MS VS 2005 с SP1. Для AutoCAD 2007 и 2008 не рекомендуется использовать MS VS 2005 с SP1.
Так что сделай как полагается и если не заработает будем копать дальше.

Re: Активный лист

Ок, Спасибо. Думаю заработает все) под 2009 попробовал загрузился на работе завтра спроверю ObjectARX 2008.

(изменено: void, 3 марта 2009г. 09:02:48)

Re: Активный лист

Спасибо, Александр. Собрал, проверил в 2009 все заработало - линкер не ругается, сейчас пересоберу еще для 2008, нужно для обеих версий. Но все же интересно, что с %<\AcVar ctab \f "%tc4">% не так)

P.S.
Собрал для 2008 все заработало)
Спасибо.

(изменено: Alxd, 3 марта 2009г. 13:50:30)

Re: Активный лист

Короче говоря, в результате множества экспериментов можно сделать вывод, что вложенное поле AcVar внутри блока не вычисляется, а сохраняет свое значение или вычисляется, но возвращает значение переменной как будто из редактора блока. То ли это ошибка, то ли это баг.

Re: Активный лист

Alxd пишет:

То ли это ошибка, то ли это баг.

Хорошо сказано! smile

Re: Активный лист

Я хотел сказать, то ли фишка, то ли баг. ;)