Присоединение дополнительной информации к чертежу. AutoCAD 2012, C#
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Присоединение дополнительной информации к чертежу. AutoCAD 2012, C#

Присоединение дополнительной информации к чертежу. AutoCAD 2012, C#

Ответ
Поиск в этой теме
Непрочитано 13.05.2013, 06:41 #1
Присоединение дополнительной информации к чертежу. AutoCAD 2012, C#
TAPRAA
 
до-диез
 
Томск
Регистрация: 15.02.2013
Сообщений: 20

Всем привет!
Я так понимаю, всякую инфу можно помещать в свойство XData, но там есть ограничение в 16 килобайт.
Можно как-нибудь или обойти это ограничение или по другому добавить к чертежу данные?
Причем, эти данные должны храниться в какой-нибудь глобальной области не должны быть привязаны к какому-нибудь визуальному объекту.
Просмотров: 4879
 
Непрочитано 13.05.2013, 07:22
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


А зачем?
trir вне форума  
 
Автор темы   Непрочитано 13.05.2013, 07:52
#3
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


С чертежом должны идти дополнительные данные, и если хранить в отдельном файле, то пользователь их обязательно потеряет
А этих данных много
TAPRAA вне форума  
 
Непрочитано 13.05.2013, 08:51
#4
Petrov-Vodkin


 
Регистрация: 30.10.2010
Сообщений: 123


Нужно добавлять Xrecord (не XData) в словарь именованных объектов NamedObjectsDictionary (в один Xrecord влезает до 2 Гб данных, если не ошибаюсь), хранится NOD на уровне базы чертежа, а не конкретного примитива.

Код А.Ривилиса:
Код:
[Выделить все]
[CommandMethod("addDataToNOD")]
        public void addDataToNOD()
        {
            // получим объект редактора
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            // стартуем транзакцию
            Transaction trans = ed.Document.Database.TransactionManager.StartTransaction();
            try
            {
                // 26. Здесь мы добавим данные в словарь именованных объектов (Named Objects Dictionary - NOD) 
                // Объявим переменную типа DBDictionary. (назовём её nod). Присвоим ей значение возвращаемое 
                // возвращаемое методом GetObject объекта транзакции 
                // (trans). В качестве аргумента ObjectId используем 
                // свойство NamedObjectsDictionaryId активной базы: 
                // (ed.Document.Database.NamedObjectsDictionaryId) 
                // Открываем для чтения. 

                DBDictionary nod = (DBDictionary)trans.GetObject(ed.Document.Database.NamedObjectsDictionaryId, OpenMode.ForRead);

                // 27. Проверим, не было ли еще такой записи в NOD 
                // Используем свойство Contains словаря в операторе "if else"
                // Заметка: поместим “}” и оператор else после шага 33. Поместим “}” 
                // оператора else после шага 39

                if (nod.Contains("MyData"))
                {

                    // 28. Объявим переменную типа ObjectId с именем entryId. Присвоим ей значение 
                    // равное возвращаемому значению метода GetAt объекта NOD (DBDictionary) 
                    // из шага 26. В качестве аргумента EntryName используем "MyData"
                    ObjectId entryId = nod.GetAt("MyData");

                    // 29. Если мы здесь, значит NOD уже содержит наши данные.
                    // Используем метод WriteMessage редактора. В качестве аргумента Message 
                    // "\n" + "This entity already has data..." 
                    ed.WriteMessage("\n" + "This entity already has data...");

                    // 30. Получаем Xrecord из объекта NOD. Объявим переменную типа Xrecord 
                    Xrecord myXrecord = null;

                    // 31. Используем транзакцию (trans) и используем метод GetObject для получения 
                    // Xrecord из NOD. В качестве аргумента ObjectId используем 
                    // ObjectId из шага 28. Открываем Xrecord для чтения.
                    myXrecord = (Xrecord)trans.GetObject(entryId, OpenMode.ForRead);

                    // 32. Напечатаем значения из Xrecord в командную строку. Используем
                    // оператор "foreach". Используем value в качестве имени элемента цикла
                    // с типом TypedValue. Используем свойство Data объекта Xrecord из
                    // шага 31 в качестве коллекции 
                    // Заметка: поместим “}” после шага 33 
                    foreach (TypedValue value in myXrecord.Data)
                    {
                        // 33. Используем метод WriteMessage редактора. Используем в качестве сообщения: 
                        // "\n" + value.TypeCode.ToString() + " . " + value.Value.ToString() 
                        ed.WriteMessage("\n" + value.TypeCode.ToString() + " . " + value.Value.ToString());
                    }
                }
                else
                {
                    // 34. Наших данных еще нет в NOD, так что нужно добавить его. 
                    // Переключаем переменную NOD с шага 26, в режим записи 
                    nod.UpgradeOpen();

                    // 35. Объявим новую переменную типа Xrecord. 
                    Xrecord myXrecord = new Xrecord();

                    // 36. Создаём список буферов (resbuf). Объявим переменную типа ResultBuffer.
                    // Инициализируем её при помощи new ResultBuffer. 
                    // В качестве аргумента ParamArray используем следующее: 
                    //new TypedValue((int)DxfCode.Int16, 1),
                    //new TypedValue((int)DxfCode.Text, "MyCompanyDefaultSettings"),
                    //new TypedValue((int)DxfCode.Real, 51.9),
                    //new TypedValue((int)DxfCode.Real, 100.0),
                    //new TypedValue((int)DxfCode.Real, 320.6)
                    ResultBuffer data = new ResultBuffer(new TypedValue((int)DxfCode.Int16, 1),
                        new TypedValue((int)DxfCode.Text, "MyCompanyDefaultSettings"),
                        new TypedValue((int)DxfCode.Real, 51.9),
                        new TypedValue((int)DxfCode.Real, 100.0),
                        new TypedValue((int)DxfCode.Real, 320.6));

                    // 37. Добавим ResultBuffer к Xrecord используя свойство Data 
                    // объекта Xrecord. (приравниваем его ResultBuffer из шага 36)
                    myXrecord.Data = data;

                    // 38. Создаём запись в NOD. Используем его метод SetAt 
                    // В качестве аргумента SearchKey используем "MyData".
                    // В качестве аргумента DBObject используем Xrecord, 
                    // созданную на шаге 35. 
                    nod.SetAt("MyData", myXrecord);

                    // 39. Сообщим транзакции о новой Xrecord, используя метод
                    // AddNewlyCreatedDBObject транзакции (trans) 
                    trans.AddNewlyCreatedDBObject(myXrecord, true);
                }                
                // Всё в порядке – завершим транзакцию 
                trans.Commit();
            }
            catch (Exception ex)
            {
                // Возникла проблема, напечатаем информацию: 
                ed.WriteMessage("a problem occurred because " + ex.Message);
            }
            finally
            {
                // Чтобы не случилось мы должны освободить транзакцию 
                trans.Dispose();
            }
        }

Последний раз редактировалось Petrov-Vodkin, 13.05.2013 в 08:58.
Petrov-Vodkin вне форума  
 
Непрочитано 13.05.2013, 08:52
#5
trir


 
Регистрация: 18.12.2010
Сообщений: 5,108


Может OLE-объект...
trir вне форума  
 
Автор темы   Непрочитано 13.05.2013, 08:56
#6
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Petrov-Vodkin, а можно поподробнее про этот словарь? Как туда помещать, какие ограничения и т.д.
trir, спасибо за ответ, но мне кажется, что решение господина Petrov-Vodkin мне подходит в большей степени)
TAPRAA вне форума  
 
Непрочитано 13.05.2013, 08:58
#7
Владимир.

Проектирую
 
Регистрация: 10.01.2005
Сообщений: 3,738


Цитата:
Сообщение от TAPRAA Посмотреть сообщение
С чертежом должны идти дополнительные данные....А этих данных много
Тогда для этого начинают использовать разные системы/базы данных
Владимир. вне форума  
 
Непрочитано 13.05.2013, 09:09
#8
Petrov-Vodkin


 
Регистрация: 30.10.2010
Сообщений: 123


Цитата:
Сообщение от Владимир. Посмотреть сообщение
Тогда для этого начинают использовать разные системы/базы данных
Кстати да. А что за задача вообще стоит?

Если с базой данных работать, то можно, например, сделать запись в пользовательских свойствах чертежа и по ней привязываться к данным. Хош руками меняй её, хош программно.
Petrov-Vodkin вне форума  
 
Непрочитано 13.05.2013, 10:13
#9
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Petrov-Vodkin Посмотреть сообщение
Код А.Ривилиса:
До боли знакомый код, особенно комментарии . Только в оригинале они на английском.
Это кусок из учебных материалов Autodesk по NET API AutoCAD.
Do$ вне форума  
 
Непрочитано 13.05.2013, 10:16
#10
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


@TAPRAA,
Google забанили?
AUTOCAD DEVBLOGGERS.
Прочие варианты, выданные Google: тынц.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 14.05.2013, 12:48
#11
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Petrov-Vodkin Посмотреть сообщение
Код А.Ривилиса:
Код не мой.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Присоединение дополнительной информации к чертежу. AutoCAD 2012, C#

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видеоуроки AutoCAD kosmax AutoCAD 173 17.02.2017 15:08
AutoCAD Аrchitecture 2012 Настройка инструментов в стиле AutoCAD Аrchitecture 2009 Backbird Вертикальные решения на базе AutoCAD 7 14.06.2012 12:11
Копирование объектов с нажатой клавишей Ctrl AutoCad 2012 Str0nger AutoCAD 6 17.05.2012 09:51
Настройки AutoCAD 2011 в AutoCAD 2012 Fedorino AutoCAD 1 09.11.2011 09:11
AutoCAD 2009: создание массива по траектории как AutoCAD 2012 Dimitriy AutoCAD 8 05.11.2011 21:41