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

ADN Club => AutoCAD .NET API => Тема начата: Максим Маркевич от 16-12-2016, 01:36:37

Название: Как правильно обработать положение атрибутов в блоке?
Отправлено: Максим Маркевич от 16-12-2016, 01:36:37
Всем привет.
Разрабатывал метод замены одного динамического блока с атрибутами на другой. Не вышло программно обработать положение атрибутов.

Разве что, при помощи:
Код - C# [Выбрать]
  1. doc.SendStringToExecute("_ATTSYNC\n" + "_N\n" + firstBlkName + "\n", true, false, false);
А так делать не хотелось бы.
Извините, вам запрещён просмотр содержимого спойлеров.

Хотелось бы отметить, что в данном случае вариант, как вот здесь (http://adn-cis.org/kak-vstavit-blok-s-atributami-v-prostranstvo-modeli.html), не подходит, потому что атрибуты создавать не нужно, они формируются при помощи DeepCloneObjects.
Может кто-то подскажет, как разобраться с данной проблемой? Заранее, спасибо.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Александр Ривилис от 16-12-2016, 13:45:08
Я не понимаю в чем проблема. Нужно разместить правильно атрибуты или добавить/удалить атрибуты?
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Максим Маркевич от 16-12-2016, 13:59:25
Я не понимаю в чем проблема. Нужно разместить правильно атрибуты или добавить/удалить атрибуты?
Нужно разместить правильно атрибуты.
Если запустить метод ReplaceAllBlocks в файле "Тест", далее выбрать блок слева (Имя "1") как заменяемый, далее выбрать блок справа (Имя "Раскладка прямых стержней") как заменяющий, то все заменится корректно (цель замены состояла в том, чтобы сохранились одинаковые параметры), кроме расположения атрибутов. Данное неудобство решается при помощи команды AutoCAD _attsync, а хотелось бы программно получать красивый блок.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Дмитрий Загорулькин от 16-12-2016, 14:31:05
А зачем используется DeepCloneObjects? Я себе так представляю замену:
- считываем свойства исходного блока
- вставляем новый блок
- задаем ему свойства из исходного
- удаляем исходный блок
Здесь какой-то другой механизм?
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Максим Маркевич от 16-12-2016, 17:56:28
Дмитрий Загорулькин, по сути, механизм в точности такой же.
А зачем используется DeepCloneObjects?
Просто для того, чтобы создать новое вхождение блока.
Разницы никакой нет, как я понимаю (по крайней мере, применительно к атрибутам).
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Александр Ривилис от 17-12-2016, 16:54:47
В детали не вникал, но думаю, что тогда, когда ты заменяешь атрибуты блока, тебе следует менять им и положение (отсчитывать от точки вставки блока). Возможно придётся менять и угол поворота, если возможен вариант с ненулевым углом поворота.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Максим Маркевич от 17-12-2016, 19:48:32
В детали не вникал, но думаю, что тогда, когда ты заменяешь атрибуты блока, тебе следует менять им и положение (отсчитывать от точки вставки блока). Возможно придётся менять и угол поворота, если возможен вариант с ненулевым углом поворота.
Видимо, да. Я просто думал, что данный вопрос решается вот в этой строке:
Код - C# [Выбрать]
  1. attRef.SetAttributeFromBlock(attDef, blk.BlockTransform);
Пока отбросил эту задачу, потому что заступорился конкретно. Возможно, еще найду время на выходных поэкспериментировать.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Александр Ривилис от 17-12-2016, 21:04:04
Я просто думал, что данный вопрос решается вот в этой строке:
Может быть и решалось бы, если атрибуты не двигались вручную. Кроме того в показанном тобой коде этой строки нет. И такая строка обычно используется при создании атрибута, а ты его не создаёшь - ты его копировал из другого блока.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Максим Маркевич от 17-12-2016, 21:21:34
Может быть и решалось бы, если атрибуты не двигались вручную. Кроме того в показанном тобой коде этой строки нет. И такая строка обычно используется при создании атрибута, а ты его не создаёшь - ты его копировал из другого блока.
Просто я тут уже перепробовал все, что можно. Сделал второй вариант кода - немного другую концепцию (просто подумал, что, возможно, проблема была в DeepCloneObjects).
Что-то более соответствующее тому, что предлагал Дмитрий Загорулькин.
- считываем свойства исходного блока
- вставляем новый блок
- задаем ему свойства из исходного
- удаляем исходный блок
И вот в пункте, где вставляем новый блок, я создаю атрибуты, как и должно быть. Так вот, там эта строчка есть. И даже, если сделать так, они разлетаются.
В общем, у меня выходит их собрать только при помощи SendStringToExecute.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Александр Ривилис от 17-12-2016, 21:32:26
Подумай над тем, чтобы сначала добавлять атрибуты, а уже потом применять динамические свойства.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Максим Маркевич от 18-12-2016, 19:42:57
Подумай над тем, чтобы сначала добавлять атрибуты, а уже потом применять динамические свойства.
Конечно, я так и делал со старта. Ведь динамические свойства отвечают за перемещение атрибутов.
Кстати, насчет статьи http://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html.
Почему, если вставить динамический блок, просто, не изменяя его параметры, то данный метод его просто не найдет?? Нехорошо как-то получается!
(https://s23.postimg.org/6zg438653/Screen_Shot.png) (https://postimg.org/image/6zg438653/)
(https://s23.postimg.org/ppszv694n/Screen_Shot_001.png) (https://postimg.org/image/ppszv694n/)
То есть в методе обработан только поиск анонимных блоков и их вставок. А вот поиск просто вставок определения блока не обработан.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Александр Ривилис от 18-12-2016, 19:49:33
То есть в методе обработан только поиск анонимных блоков и их вставок. А вот поиск просто вставок определения блока не обработан.
Согласен. Статья переводная и я её не правил. Нужно пересмотреть и исправить.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Максим Маркевич от 18-12-2016, 19:55:32
Согласен. Статья переводная и я её не правил. Нужно пересмотреть и исправить.
Готов доработать, если проверите? :)
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Александр Ривилис от 18-12-2016, 19:56:25
Готов доработать, если проверите? :)
Спасибо, я сам. :) Уже исправил и тебя упомянул. :)
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Максим Маркевич от 18-12-2016, 20:23:05
Ну как хотите. :)
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Александр Ривилис от 18-12-2016, 20:29:10
Ты сильно переусложнил. В исходном коде достаточно было заменить строку:
Код - C# [Выбрать]
  1. ObjectIdCollection dynBlockRefs = new ObjectIdCollection();
на
Код - C# [Выбрать]
  1. ObjectIdCollection dynBlockRefs = btr.GetBlockReferenceIds(true, true);
Название: Re: Как правильно обработать положение атрибутов в блоке?
Отправлено: Максим Маркевич от 18-12-2016, 20:37:17
Ты сильно переусложнил. В исходном коде достаточно было заменить строку:
Я хотел выделить 3 типа, а не в кучу!
UPD. Хотя, наверное, Вы правы, перемудрил. Но у меня есть одна защитная фразочка: "Я не программист!" Всякий раз ей подстраховываюсь. :D