Хранение данных и dwgInFields/dwgOutFields

Автор Тема: Хранение данных и dwgInFields/dwgOutFields  (Прочитано 6791 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн ОлегАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Добрый день.
Немного запутался. Помогите пожалста понять.

Пытаюсь разобраться в сохранении и восстановлении информации при записи и открытии файла.
В основе код из примера "custobj.cpp".  В этом при мере созданный класс добавляется в словарь.
Сам по себе он просто есть ничего не рисует и не делает.  И при открытии/закрытии файла вызываются функции этого класса dwgInFields/dwgOutFields.

Еще смотрю старые примеры, найденные здесь, "ProgProfile" и "TestDbx".
Здесь созданные объекты чтото рисуют.  Их добавляют в базу, а в словарь НЕ добавляют.  Почему ??

Если  в первом примере ( custobj.cpp ) кроме добавления в словарь еще добавить в базу
Код - C++ [Выбрать]
  1. AcDbDatabase database = acdbHostApplicationServices()->workingDatabase();
  2. Acad::ErrorStatus es;
  3. if ((es = database.addAcDbObject(custobj)) != Acad::eOk)
  4.         return;
  5.  
то после этого dwgInFields/dwgOutFields не вызываются.

Задача создаваемого класса отслеживать некие изменения в чертеже автоматически  и хранить у себя эту информацию ( некое число ). И когда чертеж откроют то информация восстановится.
Нужно его в базу добавлять или не нужно?  !!!!!!!!!
В перспективе будет некая иерархия классов и всю информацию  нужно сохранять и восстанавливать.
« Последнее редактирование: 08-02-2024, 15:50:22 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Хранение данных и dwgInFields/dwgOutFields
« Ответ #1 : 08-02-2024, 15:54:14 »
В этом при мере созданный класс добавляется в словарь.
В какой словарь?
Если  в первом примере ( custobj.cpp ) кроме добавления в словарь еще добавить в базу
Код - C++ [Выбрать]
AcDbDatabase database = acdbHostApplicationServices()->workingDatabase();
Acad::ErrorStatus es;
if ((es = database.addAcDbObject(custobj)) != Acad::eOk)
        return;
 
то после этого dwgInFields/dwgOutFields не вызываются.
Цитировать
This function does not establish ownership. If the object pointed to by pObj is not set up with an owner, then it will not be written out during a save, DXFOUT, or any other process that traverses the database ownership tree.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ОлегАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Re: Хранение данных и dwgInFields/dwgOutFields
« Ответ #2 : 08-02-2024, 16:41:31 »
В какой словарь?
AcDbDictionary
Код - C# [Выбрать]
  1.     AcDbDictionary *pNamedobj;
  2.     acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNamedobj, AcDb::kForWrite);
  3.  
  4.     // Check to see if the dictionary we want to create is
  5.     // already present. If not, create it and add
  6.     // it to the named object dictionary.
  7.     //
  8.     AcDbDictionary *pDict;
  9.     if (pNamedobj->getAt(_T("ASDK_DICT"), (AcDbObject*&) pDict, AcDb::kForWrite) == Acad::eKeyNotFound)
  10.     {
  11.         pDict = new AcDbDictionary;
  12.         AcDbObjectId DictId;
  13.         pNamedobj->setAt(_T("ASDK_DICT"), pDict, DictId);
  14.     }
  15.     pNamedobj->close();
  16.  
  17.     if (pDict) {
  18.         // Create new objects to add to the new dictionary,
  19.         // add them, then close them.
  20.         //
  21.         AsdkMyClass *pObj1 = new AsdkMyClass(1);
  22.         AsdkMyClass *pObj2 = new AsdkMyClass(2);
  23.  
  24.         AcDbObjectId rId1, rId2;
  25.         pDict->setAt(_T("OBJ1"), pObj1, rId1);
  26.         pDict->setAt(_T("OBJ2"), pObj2, rId2);
  27.  
  28.         pObj1->close();
  29.         pObj2->close();
  30.         pDict->close();
  31.     }
  32.  
« Последнее редактирование: 09-02-2024, 16:48:15 от Александр Ривилис »

Оффлайн ОлегАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Re: Хранение данных и dwgInFields/dwgOutFields
« Ответ #3 : 08-02-2024, 16:50:41 »
This function does not establish ownership. If the object pointed to by pObj is not set up with an owner, then it will not be written out during a save, DXFOUT, or any other process that traverses the database ownership tree.

Где можно почитать что это значит про все эти Ownership и Pointer ( Soft and Hard ) ?
И, если не сложно, в двух(трех)  словах о чем это.
Спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Хранение данных и dwgInFields/dwgOutFields
« Ответ #4 : 08-02-2024, 17:34:36 »
Где можно почитать что это значит про все эти Ownership и Pointer ( Soft and Hard ) ?
И, если не сложно, в двух(трех)  словах о чем это.
Спасибо.
В ObjectARX SDK docs. Конкретно в ObjectARX Developer Guide.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Олег 09-02-2024, 15:12:15

Оффлайн ОлегАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 79
  • Карма: 0
Re: Хранение данных и dwgInFields/dwgOutFields
« Ответ #5 : 09-02-2024, 15:11:14 »
может кому-то понадобится

ObjectARX Ownership Example
https://help.autodesk.com/view/OARX/2022/ENU/?guid=GUID-157D8BA1-D8B8-4EBE-9B87-C3A8D25DB508