| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET C# Как правильно получить BlockDefinition зная имя блока?

.NET C# Как правильно получить BlockDefinition зная имя блока?

Ответ
Поиск в этой теме
Непрочитано 06.05.2017, 20:30 #1
.NET C# Как правильно получить BlockDefinition зная имя блока?
valerik88
 
Регистрация: 02.07.2016
Сообщений: 249

Хочу записать Xrecord в блок глобально, т.е. не в INSERT блока, а в его описательную часть (если не ошибаюсь - BlockDefinition)
На AutoLisp я делал так:
Код:
[Выделить все]
 
//Получаем имя блока
(setq strBlockName (vla-get-effectivename (vlax-ename->vla-object blk_ent)))
//Получаем BlockDefinition
(setq entBlockDefinition (tblobjname "block" strBlockName))
//Пишем данные в BlockDefinition
(setq objBlockDefinition (vlax-ename->vla-object entBlockDefinition))
На c# .Net я каким-то чудом написал функцию, которая возвращает какой-то ObjectId, в объект которого я записываю данные. Программа у меня работает как надо, но меня терзают сомнения... туда ли я пишу данные.

Код:
[Выделить все]
private ObjectId GetBlockDefId(ObjectId id)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            string blkName = GetBlockName(id);

            ObjectId blkId = new ObjectId();
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                if (bt.Has(blkName))
                {
                    BlockReference br = new BlockReference(new Point3d(), bt[blkName]);
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead);
                    blkId = btr.BlockBeginId;
                }
            }
            return blkId;
        }
По задумке я передаю ObjectId вставленного блока в функцию, получаю имя этого блока через функцию GetBlockName() и дальше солянка из интернета и мои фантазии. Кусок кода который я не понимаю:

Код:
[Выделить все]
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                if (bt.Has(blkName))
                {
                    BlockReference br = new BlockReference(new Point3d(), bt[blkName]);
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead);
                    blkId = btr.BlockBeginId;
                }
Вот эту строку blkId = btr.BlockBeginId; я написал методом подбора. Она вернула какой-то ObjectId (там ещё есть BlockEndId), объекта в который я записал данные. Данные успешно читаются и для разных вхождений блока читаются одни и те же данные, т.е. как и задумывалось. Но я не уверен, что BlockBeginId - это тоже самое, что entBlockDefinitionв AutoLisp.
Как сделать правильно?
Просмотров: 10070
 
Непрочитано 07.05.2017, 00:43
1 | #2
Александр Ривилис

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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Хочу записать Xrecord в блок глобально, т.е. не в INSERT блока, а в его описательную часть (если не ошибаюсь - BlockDefinition)
Xrecord в блок записать нельзя. Можно записать Xdata. Дальше не читал.
http://adn-cis.org/opredelenie-imeni...vke-bloka.html
http://adn-cis.org/kak-najti-vse-vst...ogo-bloka.html
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 07.05.2017, 08:07
#3
valerik88


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


За ссылки спасибо!

Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Xrecord в блок записать нельзя. Можно записать Xdata.
Тем не менее, данные у меня куда-то пишутся. И откуда-то читаются. Притом для каждого блока данные пишутся в разные места и читаются для каждого блока свои данные.
Тут демонстрацию записал: https://youtu.be/dmycbAlXKqU
Данные пишу этими функциями:
Код:
[Выделить все]
DBDictionary xDict = (DBDictionary)tr.GetObject(ent.ExtensionDictionary, OpenMode.ForWrite);
Xrecord xRec = new Xrecord();
xRec.Data = new ResultBuffer(values);
xDict.SetAt(key, xRec);
 tr.AddNewlyCreatedDBObject(xRec, true);


Подозреваю, что данные пишутся и читаются как раз потому, что я пишу их не в блок, а не пойми куда... в какой-то btr.BlockBeginId;

Последний раз редактировалось valerik88, 07.05.2017 в 08:13.
valerik88 вне форума  
 
Непрочитано 07.05.2017, 10:51
#4
trir


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


начало и конец блока - это отдельные объекты
trir вне форума  
 
Автор темы   Непрочитано 07.05.2017, 12:30
#5
valerik88


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


Цитата:
Сообщение от trir Посмотреть сообщение
начало и конец блока - это отдельные объекты
Чем-то чревато писать в них данные?
valerik88 вне форума  
 
Непрочитано 11.05.2017, 16:33
1 | #6
Do$

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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Но я не уверен, что BlockBeginId - это тоже самое, что entBlockDefinitionв AutoLisp.
Конечно, не то же самое. Это вообще два разных типа объекта из разных API
В Вашем коде, ObjectId для определения динамического блока Вы получаете с помощью br.DynamicBlockTableRecord. В .NET API вставка блока - это BlockReference, что вполне логично, с точки зрения бывшего лиспописателя. А вот определение блока - это не BlockDefinition, как ожидается, а объект BlockTableRecord, что не поддается логике поначалу. Ничего, привыкнете

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от valerik88 Посмотреть сообщение
Чем-то чревато писать в них данные?
Эти объекты создаются и редактируются внутренними механизмами AutoCAD. Так что, нет никакой уверенности в том, что Ваши данные будут там надежно храниться.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 11.05.2017, 17:15
#7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Задом наперед задача как то поставлена - имхо: вместо того, чтобы хранить внешне информацию о блоке, включая имя самого блока и файла, где он размещен - пытаются запихать информацию внутри определения блока)

p.s. еще Comments есть (если написать две функции преобразования в строку и обратно). Правда, еще смотреть надо - есть ли ограничение на длину и на кодировку.
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.05.2017, 14:49
#8
valerik88


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
вместо того, чтобы хранить внешне информацию о блоке, включая имя самого блока и файла, где он размещен - пытаются запихать информацию внутри определения блока)
Не понимаю зачем нужно хранить где-то отдельно информацию о блоке и думать как их связать и правильно передавать, если можно в самом блоке хранить и передавать прямо в dwg файле.
valerik88 вне форума  
 
Непрочитано 12.05.2017, 15:11
#9
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Не понимаю зачем нужно хранить где-то отдельно информацию о блоке и думать как их связать и правильно передавать, если можно в самом блоке хранить и передавать прямо в dwg файле.
Для того, что бы иметь возможность централизованно хранить и изменять эту самую информацию, а так же не передавать весь массив информации постороннем лицам.
Boxa вне форума  
 
Непрочитано 12.05.2017, 15:58
#10
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Не удивлюсь, что у ТС логика работы с автокадом, хранение данных, вывода отчетности и т.д. - все в одной "каше")
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.05.2017, 16:02
#11
valerik88


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Для того, что бы иметь возможность централизованно хранить и изменять эту самую информацию, а так же не передавать весь массив информации постороннем лицам.
У меня таких задач не стоит.

Offtop:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Не удивлюсь, что у ТС логика работы с автокадом, хранение данных, вывода отчетности и т.д. - все в одной "каше")
куда мне до вас профессионалов автокада


Тему можно закрывать
valerik88 вне форума  
 
Непрочитано 12.05.2017, 16:13
#12
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от valerik88 Посмотреть сообщение
У меня таких задач не стоит.
Вы не понимали, Вам разъяснили. Стоит или нет сейчас такая задача, не важно. Всему свое время.
Цитата:
Сообщение от valerik88 Посмотреть сообщение
куда мне до вас профессионалов автокада
Напрасно Вы ерничаете, это вопрос не профессионализма работы в автокаде, а паттернов архитектуры программы. Использование этих паттернов как правило предполагает разделение данных, логики и отображения. По этому Вам и намекнули, что неплохо было бы разделить данные и логику...
Boxa вне форума  
 
Непрочитано 12.05.2017, 16:21
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Offtop:
Цитата:
Сообщение от valerik88 Посмотреть сообщение
куда мне до вас профессионалов автокада
чтобы стать профессионалом - этим надо заниматься основное рабочее время)

Просто при таком подходе: когда все взаимосвязано, а не разбито на отдельные функции/классы по выполняемому функционалу - развитие/модернизации программы превращается в поиск того, почему тронули в одном месте - и перестало нормально работать в другом месте. А если разбито по функционалу - отладили один раз и забыли. А если нужно внести изменение - то внесли изменения в отдельные классы с учетом взаимодействия с другими частями программы и уже знаете, что вылетающие косяки с 99% процентной вероятностью связаны с этими классами. Не экономьте на коде, экономьте свое время и нервы.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET C# Как правильно получить BlockDefinition зная имя блока?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический блок внутри другого блока Engineer_Sergii Динамические блоки 5 12.07.2018 09:42
Реальные координаты объектов блока kpyjaroshenko .NET 1 26.02.2017 12:12
Присвоение атрибуту блока значения атрибута другого блока. shartal Программирование 4 14.11.2013 14:02
Проблема с базовой точкой блока и вхождением блока в DXF nogaems Программирование 5 29.08.2013 15:46
Перевод имени блока в имя переменной и обратно Supermax Программирование 11 14.12.2009 23:26