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

ADN Club => AutoCAD .NET API => Тема начата: nolte от 10-09-2017, 02:45:36

Название: чтение данных из словаря
Отправлено: nolte от 10-09-2017, 02:45:36
не удается получить конечные данные, записанные мною в словарь.
вношу данные в примитив
Код - C# [Выбрать]
  1.            //http://adndevblog.typepad.com/autocad/2012/06/adding-extension-dictionary.html
  2.             public static void LAddExDict(string ndic, string rs)
  3.             {
  4.                 PromptEntityResult per = ed.GetEntity("Select entity to add extensiondictionary.");
  5.                 if (per.Status != PromptStatus.OK) return;
  6.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  7.                 {
  8.                     DBObject dbObj = tr.GetObject(per.ObjectId, OpenMode.ForRead);
  9.                     ObjectId edId = dbObj.ExtensionDictionary;
  10.                     if (edId == ObjectId.Null)
  11.                     {
  12.  
  13.                         dbObj.UpgradeOpen();
  14.                         dbObj.CreateExtensionDictionary();
  15.                         edId = dbObj.ExtensionDictionary;
  16.                     }
  17.                     DBDictionary dbED = (DBDictionary)tr.GetObject(edId, OpenMode.ForRead);
  18.                     if (!dbED.Contains(ndic))
  19.                     {
  20.                        
  21.                         dbED.UpgradeOpen();
  22.                         Xrecord xRec = new Xrecord();
  23.                         ResultBuffer rb = new ResultBuffer();
  24.                         rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "TEST"));
  25.                         rb.Add(new TypedValue((int)DxfCode.ExtendedDataReal, 100));
  26.                         xRec.Data = rb;
  27.                         dbED.SetAt(ndic, xRec);
  28.                         tr.AddNewlyCreatedDBObject(xRec, true);
  29.                         ed.WriteMessage("\nDictionarw Count - {0}", dbED.Count);
  30.                        
  31.                     }
  32.                     else
  33.                     {
  34.                         ed.WriteMessage("entity contains the TEST data/\n");
  35.                     }
  36.                     tr.Commit();
  37.                 }
  38.             }

читаю данные
Код - C# [Выбрать]
  1.             public static void LEDataGet(string ndic)
  2.             {
  3.                 PromptEntityResult surRes = ed.GetEntity("Select source entity");
  4.                 if (surRes.Status != PromptStatus.OK) return;
  5.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  6.                 {
  7.                     DBObject dbobj = tr.GetObject(surRes.ObjectId, OpenMode.ForRead);
  8.                     ObjectId surId = dbobj.ExtensionDictionary;
  9.                     if (surId != ObjectId.Null)
  10.                     {
  11.                         DBDictionary dbEd = (DBDictionary)tr.GetObject(surId, OpenMode.ForRead);
  12.                         foreach (DBDictionaryEntry ent in dbEd)
  13.                         {
  14.                             ObjectId dId = dbEd.GetAt(ndic);
  15.                             Xrecord xr = (Xrecord)tr.GetObject(dId, OpenMode.ForRead);
  16.                             TypedValue[] arr = xr.Data.AsArray();
  17.                             ed.WriteMessage("\n** {0}", arr.Length);
  18.                             for (int i = 0; i < arr.Length;i++)
  19.                             {
  20.                                 ed.WriteMessage("\n\t\t {0}", arr[i]);
  21. // [color=red]цель получить данные в том виде в котором вносил "TEST" и 100[/color]
  22.  
  23.                             }
  24.  
  25.                         }
  26.                     }
  27.                 }
  28.             }
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 12:44:12
не удается получить конечные данные, записанные мною в словарь.
Это потому, что ты не понимаешь разницу между Xdata и Xrecord. В Xdata (расширенные данные) пишутся группы начиная с номера 1000 (DxfCode.ExtendedDataAsciiString), а в Xrecord обычные группы начиная с 1 и до 999 (например, DxfCode.Text - для строк и DxfCode.Real для действительных чисел)
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 12:46:20
Советую пользоваться ARXDBG и MGDDBG - утилиты для анализа AutoCAD, чертежа и т.д. (http://adn-cis.org/forum/index.php?topic=7274.msg21888#msg21888) - они помогут понять содержимое чертежа.
Название: Re: чтение данных из словаря
Отправлено: nolte от 10-09-2017, 16:04:46
Это потому, что ты не понимаешь разницу между Xdata и Xrecord.
И это правда, потому и возникают вопросы, потому и спрашиваю тут.
Советую пользоваться ARXDBG и MGDDBG
поставил загрузил не пашет. возможно причина в том что нет файлов 2014......
Фартуна повернулась задом называется.
(https://s26.postimg.org/xlspwaqbp/ererererer.jpg) (https://postimg.org/image/xlspwaqbp/)
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 16:06:55
поставил загрузил не пашет. возможно причина в том что нет файлов 2014......
Используются те, которые для 2013-го. Проверь, что незаблокированны файлы, как указано в той статье.

Стоп!!! Ты неправильно разархивировал. У тебя путь:
C:\Program Files\Autodesk\ApplicationPlugins\ArxDbg.bundle\ArxDbg.bundle
А должно быть:
C:\Program Files\Autodesk\ApplicationPlugins\ArxDbg.bundle
Разницу чувствуешь?
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 16:13:29
Фартуна повернулась задом называется.
Потому что она не Фартуна, а Фортуна.  ;)
Название: Re: чтение данных из словаря
Отправлено: nolte от 10-09-2017, 16:20:00
Потому что она не Фартуна, а Фортуна. 
Да уж.
Разницу чувствуешь?
Асюсяю.
исправляю.
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 16:28:35
исправляю.
И? А MGDDBG запустился?
Название: Re: чтение данных из словаря
Отправлено: nolte от 10-09-2017, 17:36:15
да спасибо все запустилось.
попытался понять куда и чего пишет.
записал с  помощью vlax-ldata-put  данные.
(vlax-ldata-put obj "Test" 1000)
"Test" нашел по такому пути
object -> extension dictionaty -> Test
а 1000 так пока и не нашел
Название: Re: чтение данных из словаря
Отправлено: nolte от 10-09-2017, 17:54:43
ха.................. нашел и значение string под dxfcode - 300
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 18:06:01
Советую обратить внимание на вот эту картинку:
(https://farm5.staticflickr.com/4367/36308333814_a9dcbc2c8e_o.png)

Как видишь хранится в этом случае информация в объекте VLO-VL, а не в XRECORD. Т.е. средствами .NET ты не можешь сделать то, что делал в VisualLisp с помощью (vlax-ldata-put). Да и не нужно. Очень давно была рекомендация не пользоваться (vlax-ldata-put) совсем.
Название: Re: чтение данных из словаря
Отправлено: nolte от 10-09-2017, 18:12:13
хорошо. порою еще малость.
Название: Re: чтение данных из словаря
Отправлено: nolte от 10-09-2017, 18:24:10
(https://s26.postimg.org/fro13ishx/ererererer1.jpg) (https://postimg.org/image/fro13ishx/)
произвел запись с помощью функции поста#1, но видно, что dxfcode 1000 for string and 1040 for integer.
что является признаком XData?
В Xdata (расширенные данные) пишутся группы начиная с номера 1000
ладно пойдем дальше.......
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 19:06:32
что является признаком XData?
Чего ты добиваешься? То что ты получил - это некорректные Xdata внутри XRecord. Например, эти Xdata не содержат группу 1001 которая определяет имя приложения (APPID). Без такой группы Xdata быть не может. Но зачем вообще это всё, если в Xrecord ты можешь поместить обычные группы и не мучатся???
Название: Re: чтение данных из словаря
Отправлено: nolte от 10-09-2017, 19:59:09
нужно для аппликации, которую задумал. построение системы канализации с номерами колодцев, глубинами для труб и колодца, подгонка всего этого дела по высотам, построение разреза ну и так далее.
дабы определить и куда то запомнить глубину колодца врезки, необходимо его куда то записать глубину его(IL) и от этого плясать.
А вообще, если даже и отпадет необходимость в XRecord, знать и уметь это не так уж и плохо. Я только учусь так что пригодиться.
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 20:01:45
нужно для аппликации, которую задумал. построение системы канализации с номерами колодцев, глубинами для труб и колодца, подгонка всего этого дела по высотам, построение разреза ну и так далее.
Я не про прикладную задачу, а про то что именно ты собираешься делать с объектами/примитивами AutoCAD. Если тебе нужно не много данных, то Xdata предпочтительней.
Название: Re: чтение данных из словаря
Отправлено: nolte от 10-09-2017, 20:09:23
пока не решил. хочу понять и то и то . потом решу что применить.
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 20:15:53
По поводу ExtDict и Xrecord - смотри:

(https://farm5.staticflickr.com/4361/36749593980_fbf715916f_o.png)

После того как введёшь данные через ARXDBG посмотришь результат (для XRECORD через DXF).
Название: Re: чтение данных из словаря
Отправлено: Алексей Кулик от 10-09-2017, 23:07:22
Насколько я помню, VLO-VL организовывается и обратывается lisp-функциями типа vlax-ldata-*. Кажется, даже в официально изданной документации подобное упоминалось.
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 10-09-2017, 23:25:59
Насколько я помню, VLO-VL организовывается и обратывается lisp-функциями типа vlax-ldata-*. Кажется, даже в официально изданной документации подобное упоминалось.
Более того если не вызвать предварительно (vl-load-com) и открыть чертеж с такими данными, то они становятся прокси со всеми вытекающими последствиями.
Название: Re: чтение данных из словаря
Отправлено: Алексей Кулик от 11-09-2017, 08:34:15
Ух ты, вот не знал! :) Спасибо :)
Название: Re: чтение данных из словаря
Отправлено: Александр Ривилис от 11-09-2017, 15:30:31
Ух ты, вот не знал! :) Спасибо :)
Если мне не изменяет память, то это происходит при DEMANDLOAD при значении 0 или 2, т.е. когда автоматом не грузятся Object Enabler'ы.
(vl-load-com) загружает Object Enabler для объекта VLO-VL.
Название: Re: чтение данных из словаря
Отправлено: nolte от 11-09-2017, 21:17:06
Александр Ривилис,  спасибо разобрался мал мал.