Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Эд от 28-09-2014, 14:48:35

Название: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 28-09-2014, 14:48:35
Предлагаю на рассмотрение интересный пример с пользовательскими графическими объектами.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 28-09-2014, 15:01:56
Я очистил архив от мусора - 25М-ый ncb-файл совершенно не нужен.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 28-09-2014, 15:05:09
Будет открываться? Спасибо!
Название: интересный пример
Отправлено: Эд от 28-09-2014, 15:10:13
Это пример из статьи некоего инженера-программиста Фернандо из Бразилии. Вот его статья по этому примеру (к сожалению на английском).
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 28-09-2014, 15:16:24
Это пример из статьи некоего инженера-программиста Фернандо из Бразилии. Вот его статья по этому примеру (к сожалению на английском).
Это не некий, а очень даже известный Fernando Malard (https://www.blogger.com/profile/09852061806995998594)
У него есть блог, который он к сожалению давно забросил: ObjectARX & Dummies (http://arxdummies.blogspot.com/)
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 28-09-2014, 15:21:34
Будет открываться?
Конечно.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 28-09-2014, 16:21:13
Пример меня заинтересовал своей наглядностью и яркостью. В папке Samle (ObjectArx) примеров мало. В примере продемонстрировано создание "сложного" объекта из нескольких графических примитивов (что к стати в папке Sample я не нашел), создание новой "ручки" со своими свойствами. Класс MyHatch в данном случае можно было не создавать, это сделано для примера, чтобы показать некоторые виртуальные функции.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 28-09-2014, 16:48:11
Первый недостаток, на который я обратил внимание - проект никак не хочет линковаться в конфигурации x64. Что-то в настройках проектов серьезно было перепутано. Исправил. Что касается путей доступа, то я постарался исправить. Если установлена переменная среды окружения ARX2012, которая указывает на каталог ObjectARX SDK 2012 (обычно это C:\ObjectARX 2012), то всё должно нормально компилироваться и линковаться во всех конфигурациях.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 03-10-2014, 07:55:40
Вопрос:
когда в автокаде выделяю штриховку, то выделяется также полилиния, и наоборот.
Как это объяснить?
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 03-10-2014, 14:05:00
Похоже ты не понял сути этого примера. У тебя уже нет отдельной штриховки и отдельной полилинии. Это единый примитив класса AuPolyline. Аналогичное поведение у вставки блока (INSERT - класс AcDbBlockReference) и атрибутов блока (ATTRIB - класс AcDbAttribute). Если выбираешь атрибут - выбирается весь блок.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 03-10-2014, 14:39:06
Я понимаю, что это объект 1 класса, в котором есть вложенный объект другого класса, а если вложить динамический массив объектов (например контейнер) когда программист заранее не знает количества вложенных объектов, будут ли соблюдаться те же свойства совместной работы?
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 03-10-2014, 14:49:33
Конечно. Пример с вставкой блока и атрибутами блоков, количество которых может быть произвольным, именно об этом и говорит.
Собственно говоря ты и сам мог это проверить если в примере вместо одной штриховки (MyHatch) использовал бы динамический массив штриховок.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 03-10-2014, 15:40:13
Буду пробовать.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 03-11-2014, 20:29:23
Здорово было бы посмотреть пример кода аналогичный блоку.

А если массив указателей на другие объекты создать, будет ли это все работать как блок?
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 03-11-2014, 21:02:21
А если массив указателей на другие объекты создать, будет ли это все работать как блок?
Что имеется в виду?
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 03-11-2014, 23:15:00
Я имею ввиду, что блок может содержать несколько объектов, если готовые примеры аналогичного блоку кода?
Я хочу применять для себя графические объекты с неизвестным заранее количеством (похожие на блоки но с большими возможностями, например которые можно растягивать секущей рамко), пока у меня не получается. Мне не все понятно: например надо делать массив с указателями или массивы с объектами? Подойдут ли в качестве массивов контейнеры std? Непонятно почему в этом примере если выделять штриховку, то выделяется полилиния, от куда автокад знает, что штриховка вложена в полилинию?
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 03-11-2014, 23:42:48
Я имею ввиду, что блок может содержать несколько объектов, если готовые примеры аналогичного блоку кода?
У меня таких примеров кода нет. Но ты сам из примера, который выложил, уже давно мог сделать нужный тебе пример.
Непонятно почему в этом примере если выделять штриховку, то выделяется полилиния, от куда автокад знает, что штриховка вложена в полилинию?
Еще раз повторяю. В этом примере нет отдельной полилинии и отдельной штриховки. Есть единый и неделимый объект "полилиния+штриховка".
Мне не все понятно: например надо делать массив с указателями или массивы с объектами?
Массив с указателями. Обычно для этой цели используется AcGeVoidPointerArray или AcArray<AcDbEntity *>. Впрочем можно использовать и std-контейнеры.
похожие на блоки но с большими возможностями, например которые можно растягивать секущей рамко
Для этой цели ты должен как минимум реализовать метод getStretchPoints

Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 04-11-2014, 11:58:05
Переписал вышележащий код, заменил член MyHatch на контейнер map c указателями на объекты. Для простоты пока включил в контейнер всего 1 объект (тот же MyHatch). Теперь штриховка почему то не отображается.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 04-11-2014, 12:00:19
Архив в решением 26МБ почему-то послать не получается.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 04-11-2014, 12:03:09
Архив в решением 26МБ почему-то послать не получается.
И не получится. Ограничение в 8Мб. Перечитай то, что я написал здесь: http://adn-cis.org/forum/index.php?topic=987.msg4386#msg4386 и выкинь весь мусор из архива.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 04-11-2014, 12:12:32
Почистил, отправляю.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 04-11-2014, 14:03:25
Теперь штриховка почему то не отображается.
А как ей отображаться, если в исходном варианте в методе AuPolyline::subWorldDraw был код:
Код - C++ [Выбрать]
  1.         // Hatch
  2.         m_Hatch.fWorldDraw(mode);
  3.  
А теперь ты его выкинул полностью и соответственно никакая штриховка не рисуется.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 04-11-2014, 14:50:47
Спасибо огромное!
Искал ошибки в других местах.

дописал в конце subWorldDraw()

Код - C++ [Выбрать]
  1.    objArray::iterator it;
  2.    for(it=m_Array.begin();it!=m_Array.end();it++)
  3.    {
  4.  
  5.       const TCHAR* str = (*it).second->isA()->name();
  6.       std::wstring ws(str);
  7.       bool k=(ws==(std::wstring(_T("MyHatch"))) );
  8.       if(ws==(std::wstring(_T("MyHatch"))) )
  9.       {
  10.          MyHatch* pH=dynamic_cast<MyHatch*>((*it).second);
  11.          if(pH)
  12.          {
  13.             pH->assertReadEnabled();
  14.             pH->subWorldDraw(mode);
  15.          }
  16.       }
  17.       else acutPrintf(_T("неизвестный тип данных\n"));
  18.    }

       перед

Код - C++ [Выбрать]
  1. //------ Returning Adesk::kFalse here will force viewportDraw() call
  2.    return (Adesk::kTrue) ;
теперь работает также.
Исправленное решение прикрепляю.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 04-11-2014, 14:57:05
Вообще-то всю эту хитрую проверку можно заменить на:
Код - C++ [Выбрать]
  1. MyHatch* pH =  MyHatch::cast((*it).second));
  2. if (pH)
  3. {
  4.   pH->SetupMe(this);
  5. }
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 04-11-2014, 15:01:17
Спасибо, пригодится.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 12-11-2014, 16:00:57
Переделал немного код. Теперь переписал subTransformBy. Теперь объект перемещается, копируется, отражается, масштабируется вместе со штриховкой.
Но остались проблемы которые я не могу решить:
1) Файл с объектом не возможно правильно сохранить. Возможно тут надо как то переписать функцию SaveAs.
2) Не работают команды UNDO и REDO для штриховки, для полилинии они работают.

Подскажите пож. что нужно сделать. В сети похожих примеров я не нашел.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Николай Полещук от 12-11-2014, 18:25:03
В качестве определенной помощи могу рекомендовать главу 3 моей книги "Программирование для AutoCAD 2013-2015". Глава посвящена пользовательским объектам (план главы: http://poleshchuk.spb.ru/cad/2014/book34-3.htm ).
В ней разбираются основные методы, которые надо переписать, в т.ч. dwgOutFields, dxfOutFields.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 12-11-2014, 18:43:41
Но функция dwgOutFields у меня вроде исправно работает например при перемещении объекта.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 12-11-2014, 18:49:02
Хорошо, что вы написали эту книгу, обязательно куплю если найду.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Николай Полещук от 12-11-2014, 19:14:48
Надо переписать все четыре метода (Out - In). Без них мало что работает.
Купить книгу просто: http://dmkpress.com/catalog/computer/cad/autocad/978-5-97060-066-5/
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 12-11-2014, 21:02:44
Но функция dwgOutFields у меня вроде исправно работает например при перемещении объекта.
Если под перемещением объекта ты имеешь в виду команду _MOVE, то dwgOutFields там вообще не работает, а работает метод transfomBy.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 07:40:30
Если подключится к процессу, установить точки останова, то при команде MOVE программа будет проходить через конструкторы, деструкторы, dwgOutFields, dwgInFields, subTransformBy.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 13-11-2014, 09:25:13
Но это всё (кроме subTransformBy) будет относится не к оригинальному примитиву, а к его копиям, которые создаются после указания Базовой точки и до указания Второй точки. И только после указания второй точки будет вызван subTransformBy для оригинального примитива.
Кстати, если ты установишь DRAGMODE в 0, то у тебя должен вызываться только метод subTransformBy для оригинального примитива - копии при этом значении DRAGMODE не создаются.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 15:40:22
Нашел конкретную проблему:
в dwgInFields не срабатывет почему то при открытии файла автокада:

      ACHAR* str;
      pFiler->readString(&str); // на этой строке происходит сбой

после того как закомментировал в dwgIn dwgOut все что касается этой строки
все заработало. Файл сохраняется и открывается.
В чем у меня может быть ошибка? Мне в будующем нужно записывать в файл строковые данные.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 13-11-2014, 15:51:35
      ACHAR* str;
      pFiler->readString(&str); // на этой строке происходит сбой
Какой сбой? Что происходит?
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 15:57:00
Когда открываю файл и программа доходит в считывания строки
es=pFiler->readString(&str);
появляется ругательство что то про повреждение кучи.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Николай Горлов от 13-11-2014, 15:58:18
не знаю, всё работатет (правда не этот пример)
TCHAR *buffer = NULL;
pFiler->readItem(&buffer);
m_string = buffer; //m_string приватная переменная класса. тип CString
acdbFree(buffer);
кстати, кажись важен порядок чтения записи в InFields и OutFields.
возможно пишутся данные не в том порядке, в котором читаются.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 15:58:56
Причем при drag все работает корректно.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 13-11-2014, 16:03:24
Выложи последние исходники.
P.S.: AuPolyline::undoFiler - это у тебя явно лишнее.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 16:46:42
Вот папка "без строки" где закомментировал все, что касается строки и теперь работает,
и папка "со строкой" где не работает.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 13-11-2014, 16:59:23
Смотрим твой пример "со строкой", который не работает и что мы видим:
Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- AcDbObject protocols
  3. //- Dwg Filing protocol
  4. Acad::ErrorStatus AuPolyline::dwgOutFields (AcDbDwgFiler *pFiler) const {
  5.         assertReadEnabled () ;
  6.         //----- Save parent class information first.
  7.         Acad::ErrorStatus es =AcDbPolyline::dwgOutFields (pFiler) ;
  8.         if ( es != Acad::eOk )
  9.                 return (es) ;
  10.         //----- Object version number needs to be saved first
  11.         if ( (es =pFiler->writeUInt32 (AuPolyline::kCurrentVersionNumber)) != Acad::eOk )
  12.                 return (es) ;
  13.         //----- Output params
  14.         //.....
  15.         //m_Hatch.dwgOutFields(pFiler);
  16.         UInt32 n=m_Array.size();
  17.         es=pFiler->writeUInt32(n);
  18.         if ( es != Acad::eOk )
  19.                 return (es) ;
  20.         objArray::const_iterator it;
  21.         for (it=m_Array.begin();it!=m_Array.end();it++)
  22.         {
  23.                 SOSTAV s=(*it).first;
  24.                 Adesk::UInt32 s1=s;
  25.                 es=pFiler->writeUInt32(s1);
  26.                 if ( es != Acad::eOk )
  27.                         return (es) ;
  28.                 //const ACHAR* str = (*it).second->isA()->name();
  29.                 //es=pFiler->writeString(str);
  30.                 //if ( es != Acad::eOk )
  31.                 //      return (es) ;
  32.                 es=(*it).second->dwgOutFields(pFiler);
  33.                 if ( es != Acad::eOk )
  34.                         return (es) ;
  35.         }
  36.         es=pFiler->filerStatus ();
  37.         return (pFiler->filerStatus ()) ;
  38. }
  39.  
  40. Acad::ErrorStatus AuPolyline::dwgInFields (AcDbDwgFiler *pFiler) {
  41.         assertWriteEnabled () ;
  42.         //----- Read parent class information first.
  43.         Acad::ErrorStatus es =AcDbPolyline::dwgInFields (pFiler) ;
  44.         if ( es != Acad::eOk )
  45.                 return (es) ;
  46.         //----- Object version number needs to be read first
  47.         Adesk::UInt32 version =0 ;
  48.         es =pFiler->readUInt32 (&version);
  49.         if  (es != Acad::eOk )
  50.                 return (es) ;
  51.         if ( version > AuPolyline::kCurrentVersionNumber )
  52.                 return (Acad::eMakeMeProxy);
  53.         //- Uncomment the 2 following lines if your current object implementation cannot
  54.         //- support previous version of that object.
  55.         //if ( version < AuPolyline::kCurrentVersionNumber )
  56.         //      return (Acad::eMakeMeProxy) ;
  57.         //----- Read params
  58.         //.....
  59.  
  60.         Adesk::UInt32 n;
  61.         es=pFiler->readUInt32(&n);
  62.         if  (es != Acad::eOk )
  63.                 return (es) ;
  64.         for(int i=0;i<n;i++)
  65.         {
  66.                 //using namespace AuPolyline::AcDbEntity;
  67.                 SOSTAV s;
  68.                 Adesk::UInt32 s1;
  69.                 es=pFiler->readUInt32(&s1);
  70.                 if  (es != Acad::eOk )
  71.                         return (es) ;
  72.                 s=static_cast<SOSTAV>(s1);
  73.  
  74.                 ACHAR* str;
  75.                 es=pFiler->readString(&str);
  76.                 if  (es != Acad::eOk )
  77.                         return (es) ;
  78.                 std::wstring ws=str;
  79.                 if(ws==std::wstring(_T("MyHatch")))
  80.                 {
  81.                         MyHatch* pH=new MyHatch;
  82.                         es=pH->dwgInFields(pFiler);
  83.                         if  (es != Acad::eOk )
  84.                                 return (es) ;
  85.                         m_Array.insert(std::make_pair(s,pH));
  86.                 }      
  87.                 else
  88.                 {
  89.                         acutPrintf(_T("неизвестный тип данных\n"));
  90.                         return Acad::eNotOpenForRead;
  91.                 }      
  92.         }
  93.         es=pFiler->filerStatus ();
  94.         return (pFiler->filerStatus ()) ;
  95. }
В AuPolyline::dwgOutFields закомментирована строка es=pFiler->writeString(str); и соотвественно строка в файл не пишется. При этом ты пытаешься в AuPolyline::dwgInFields её читать.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 17:07:31
Виноват, забыл разкомментировать в dwgOutFields.
Это строки 28-31.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 13-11-2014, 17:12:38
Нормально работает:
1) Загружаю dbx и arx-файлы
2) Запускаю команду MyCommand1.
3) Сохраняю файл.
4) Закрываю файл.
5) Открываю сохраненный файл - всё в порядке. Никаких ошибок.
Сделал небольшие правки, но они не должны были влиять:
Код - C++ [Выбрать]
  1. Acad::ErrorStatus AuPolyline::dwgInFields (AcDbDwgFiler *pFiler) {
  2.         assertWriteEnabled () ;
  3.         //----- Read parent class information first.
  4.         Acad::ErrorStatus es =AcDbPolyline::dwgInFields (pFiler) ;
  5.         if ( es != Acad::eOk )
  6.                 return (es) ;
  7.         //----- Object version number needs to be read first
  8.         Adesk::UInt32 version =0 ;
  9.         es =pFiler->readUInt32 (&version);
  10.         if  (es != Acad::eOk )
  11.                 return (es) ;
  12.         if ( version > AuPolyline::kCurrentVersionNumber )
  13.                 return (Acad::eMakeMeProxy);
  14.         //- Uncomment the 2 following lines if your current object implementation cannot
  15.         //- support previous version of that object.
  16.         //if ( version < AuPolyline::kCurrentVersionNumber )
  17.         //      return (Acad::eMakeMeProxy) ;
  18.         //----- Read params
  19.         //.....
  20.  
  21.         Adesk::UInt32 n;
  22.         es=pFiler->readUInt32(&n);
  23.         if  (es != Acad::eOk )
  24.                 return (es) ;
  25.         for(int i=0;i<n;i++)
  26.         {
  27.                 //using namespace AuPolyline::AcDbEntity;
  28.                 SOSTAV s;
  29.                 Adesk::UInt32 s1;
  30.                 es=pFiler->readUInt32(&s1);
  31.                 if  (es != Acad::eOk )
  32.                         return (es) ;
  33.                 s=static_cast<SOSTAV>(s1);
  34.  
  35.                 ACHAR* str = NULL;
  36.                 es=pFiler->readString(&str);
  37.                 if  (es != Acad::eOk )
  38.                         return (es) ;
  39.                 std::wstring ws=str;
  40.     if(ws==std::wstring(MyHatch::desc()->name()))
  41.                 {
  42.                         MyHatch* pH=new MyHatch();
  43.                         es=pH->dwgInFields(pFiler);
  44.                         if  (es != Acad::eOk )
  45.                                 return (es) ;
  46.                         m_Array.insert(std::make_pair(s,pH));
  47.                 }      
  48.                 else
  49.                 {
  50.                         acutPrintf(_T("неизвестный тип данных\n"));
  51.                         return Acad::eNotOpenForRead;
  52.                 }      
  53.         }
  54.         es=pFiler->filerStatus ();
  55.         return (pFiler->filerStatus ()) ;
  56. }
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 13-11-2014, 17:27:23
А вот так у меня и Undo/Redo корректно работает:
Код - C++ [Выбрать]
  1. Acad::ErrorStatus AuPolyline::dwgInFields (AcDbDwgFiler *pFiler) {
  2.         assertWriteEnabled () ;
  3.         //----- Read parent class information first.
  4.         Acad::ErrorStatus es =AcDbPolyline::dwgInFields (pFiler) ;
  5.         if ( es != Acad::eOk )
  6.                 return (es) ;
  7.         //----- Object version number needs to be read first
  8.         Adesk::UInt32 version =0 ;
  9.         es =pFiler->readUInt32 (&version);
  10.         if  (es != Acad::eOk )
  11.                 return (es) ;
  12.         if ( version > AuPolyline::kCurrentVersionNumber )
  13.                 return (Acad::eMakeMeProxy);
  14.         //- Uncomment the 2 following lines if your current object implementation cannot
  15.         //- support previous version of that object.
  16.         //if ( version < AuPolyline::kCurrentVersionNumber )
  17.         //      return (Acad::eMakeMeProxy) ;
  18.         //----- Read params
  19.         //.....
  20.  
  21.         Adesk::UInt32 n;
  22.         es=pFiler->readUInt32(&n);
  23.         if  (es != Acad::eOk )
  24.                 return (es) ;
  25.         for(int i=0;i<n;i++)
  26.         {
  27.                 //using namespace AuPolyline::AcDbEntity;
  28.                 SOSTAV s;
  29.                 Adesk::UInt32 s1;
  30.                 es=pFiler->readUInt32(&s1);
  31.                 if  (es != Acad::eOk )
  32.                         return (es) ;
  33.                 s=static_cast<SOSTAV>(s1);
  34.  
  35.                 ACHAR* str = NULL;
  36.                 es=pFiler->readString(&str);
  37.                 if  (es != Acad::eOk )
  38.                         return (es) ;
  39.                 std::wstring ws=str;
  40.     if(ws==std::wstring(MyHatch::desc()->name()))
  41.                 {
  42.                         MyHatch* pH=new MyHatch();
  43.                         es=pH->dwgInFields(pFiler);
  44.                         if  (es != Acad::eOk )
  45.                                 return (es) ;
  46.                         m_Array.insert(std::make_pair(s,pH));
  47.                 }      
  48.                 else
  49.                 {
  50.                         acutPrintf(_T("неизвестный тип данных\n"));
  51.                         return Acad::eNotOpenForRead;
  52.                 }      
  53.         }
  54.         es=pFiler->filerStatus ();
  55.   if (es == Acad::eOk) SetupEntitys();
  56.         return (pFiler->filerStatus ()) ;
  57. }
Вся тонкость в строке   if (es == Acad::eOk) SetupEntitys();
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Николай Горлов от 13-11-2014, 17:32:50
Александр, а освободить str? :):):)
а то ж так можно через 3 часа работы и вылететь из акада без объяснений. читаете то через ACHAR* а не AcString.
кстати вопросик в догонку, может знаете. если читать строку через readItem, то там только ACHAR**, если через readString, то там два варианта: AcString, который не нужно подчищать за собой и ACHAR**, который удалять нужно, но пишут, что когда-то в очередной новой версии уберут вообще.
а вот вопросик такой, убрать то не сложно, только как тогда будет работать readItem? ведь по логике то внутри readItem должен стоять вызов readString (ну я б так сделал, чтоб не городить кучу лишнего кода). но информации о том, что поменяется входной парамерт для readItem не нашел.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 17:34:47
Вы инициализировали указатель на ноль и это все изменило,
почему то.
35. ACHAR* str = NULL;
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 17:43:00
Так что действительно str надо освобождать?
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 13-11-2014, 17:48:31
Александр, а освободить str? :):):)
Я был не прав. :) Я просто проверял работоспособность кода.
а вот вопросик такой, убрать то не сложно, только как тогда будет работать readItem? ведь по логике то внутри readItem должен стоять вызов readString (ну я б так сделал, чтоб не городить кучу лишнего кода). но информации о том, что поменяется входной парамерт для readItem не нашел.
Если уберут, значит сделают параметр с AcString. Хотя я думаю это будет еще очень не скоро.
Так что действительно str надо освобождать?
Да. Читай документацию.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 13-11-2014, 17:56:43
Вы инициализировали указатель на ноль и это все изменило,
почему то.
35. ACHAR* str = NULL;
Думаю, что если str != NULL, то AutoCAD считает, что нужно считывать именно в эту область памяти (а у тебя там в этот момент мусор), а если str == NULL, то он сам распределяет память. Но это только мои предположения, т.к. в документации ни слова об этом не сказано.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Николай Горлов от 13-11-2014, 18:06:14
чуток дополню ответ Александра.
ClassName * pVariable = NULL; Это просто запись нуля в переменную (указатель ведь тоже переменная, которая содержит число). Обычно нулем помечаются невалидные указатели.

PS: Когда пишем NULL, то объект не создается. Cкорей всего внутри readString есть что-то типа

{
   if (pVal== NULL)
     pVal = new ACHAR[255];
   // ну а дальше наполняем pVal
   // и, если не было new, то наполнить не получится :):):)
}
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 20:24:57
Александр Ривилис: "А вот так у меня и Undo/Redo корректно работает:
Вся тонкость в строке   if (es == Acad::eOk) SetupEntitys();"

Жаль, я нарочно хотел записывать все свойства объектов массива в файл и убрал setupEntites(),
а теперь получается масло масляное.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 13-11-2014, 20:34:30
Хотя можно разбить функцию SetupMe на две, чтоб вторая изменяла только вершины штриховки.
Нет я хотел бы, чтобы все свойства штриховки измененные пользователем, тоже подчинялись команде undo.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 13-11-2014, 22:48:36
Я не очень понял чего ты добиваешься и чем тебя не устраивает этот код. Попробуй так:
Код - C++ [Выбрать]
  1. if (es == Acad::eOk && pFiler->filerType() == AcDb::kUndoFiler) {
  2.     SetupEntitys();
  3. }
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 14-11-2014, 07:33:46
Я попрбую обяснить, я хочу дописать код, чтобы пользователь мог в течении сеанса менять свойства вложенных объектов, например цвет этой штриховки, шаг штрихов, угол наклона. Дописать такой код мне вроде не трудно. А вот команды undo , redo работать тут не будут. Другими словами будет возможность восстановить только вершины этой штриховки.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 14-11-2014, 10:39:10
А вот команды undo , redo работать тут не будут.
Не будут потому что ты не хочешь чтобы они работали или не будут потому что ты не знаешь как это сделать?
Свойства объектов будут у каждого объекта отдельно или они общие для всех MyHatch в чертеже?
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 14-11-2014, 10:44:13
Не будут, потому что я не знаю как это сделать. Либо надо создавать с ноля свою базу для каждого объекта с запоминанием шагов пользователя.

Что то типа очереди. Я думал, что можно сделать проще.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 14-11-2014, 10:56:33
Не будут, потому что я не знаю как это сделать.
Ну это горе - не беда. Мы ему поможем. Сохраняй/восстанавливай все эти данные в MyHatch::dwgOutFields/MyHatch::dwgInFields.
В том числе и контур штриховки. А в AuPolyline::dwgInFields не забывай вызывать SetupEntitys(); только этот метод должен работать не с фиксированными значеними, а с теми, которые ввел пользователь.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 14-11-2014, 12:14:56
Кстати, обратил внимание, что в твоих исходниках те же грабли, что и у Николая Горлова (http://adn-cis.org/forum/index.php?action=profile;u=75): http://adn-cis.org/forum/index.php?topic=1076.0
Ты еще на них не наступил, но обязательно наступишь. Так что исправляй.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 14-11-2014, 12:20:35
Спасибо.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 06-05-2015, 21:18:51
Опять проблема, установил 64 платформу WIN7 (была WIN7 x32), теперь этот пример не компилируется, хотя на x32 все было нормально. В частности в данном случае компилятор (VS2008) не понимает ссылки $(ARX2012) в настройках проекта. Если указать полный путь то компилируется.
Также, если создать новое решение с 2-мя проектами вновь, запускаемый проект не может связаться со вторым и не понимает уже остальные макросы (или не знаю как их назвать) $(ARX2012)\lib-$(PlatformName).
Буду благодарен если подскажите как с этим разобраться, и как правильно называются эти "макросы" из за этого не могу в гугле найти самостоятельно тему. И какую литературу надо читать для того чтоб разобраться.
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Александр Ривилис от 06-05-2015, 23:06:36
Думаю что эта картинка всё объяснит:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F3012%2F7842324.3%2F0_fda44_fd981f31_orig.png&hash=8e54bcf38c3f2c79b97da17e0ec208e5)
 
Название: Re: Интересный пример с пользовательскими объектами для изучения
Отправлено: Эд от 07-05-2015, 12:10:56
Спасибо! сработало!