Re: Обновить вхождение блока

Владимир Петров пишет:
Hwd пишет:

Конечно появляется, программа ведь в конечном счёте обрабатывает целевые dwg-файлы, не важно что ты выбрал в качестве цели: подшивку, каталог или индивидуальный набор файлов.

Пока значит не заводится, приходится для 2011 код менять.

AutoCAD .Net API 2009 несколько отличается от AutoCAD .Net API 2010-2012, поэтому некоторые изменения в коде выполнить придётся. Однако это не представляет никаких трудностей, т.к. MS VS 2010 чётко покажет проблемные строки, которые нужно будет отредактировать (править там не так уж много придётся).

(изменено: Владимир Петров, 18 октября 2011г. 18:54:13)

Re: Обновить вхождение блока

Hwd пишет:

AutoCAD .Net API 2009 несколько отличается от AutoCAD .Net API 2010-2012, поэтому некоторые изменения в коде выполнить придётся. Однако это не представляет никаких трудностей, т.к. MS VS 2010 чётко покажет проблемные строки, которые нужно будет отредактировать (править там не так уж много придётся).

Сам работаю в 2008 студии. 2010 так стоит. Попробовал проект из-под отладчика запустить, но точки останова не отрабатывают. Где-то читал что есть такая заморочка для 2010 версии студии.
А так поменять вот что пришлось для Акад 2011 (кроме ссылок) :
1) Стандартный глюк для Акад 2010-2011 в классе AcEnvironment. Не помню как было для 2009, а для 2010,2011 надо 215 строчку записать так "targetDb.SaveAs(targetDb.Filename,true, DwgVersion.Current, targetDb.SecurityParameters);"
2) свойство TextStyle AttributeDefinition в 2011 отсутствуется, заменил на TextStyleId.
В таком варианте будет работать, но копаю дальше.
Из неудобств.
Если контрол настроить на множественное снятие галочек было бы супер. А так открываю чертеж а там 200 блоков, надо обновить один, приходится 199 руками отщелкивать.

Re: Обновить вхождение блока

Андрей еще момент. Зачем используется ссылка на acmgdinternal.dll в 2011 ее не обнаружил. Вроде код на нее не ссылается.

(изменено: Вильдар, 18 октября 2011г. 19:00:38)

Re: Обновить вхождение блока

Hwd пишет:

Скинь файлы на которых тестировал.

http://www.avral.ru/7d52b51a50c7d25a57261ee3fb5064fa
Блок простой.

Hwd пишет:

"Не фиксированные" - это ты так называешь атрибуты, у которых снята галочка "Lock Position"?

Англ.версии нет. Но похоже. На русском - Фиксированное положение.

Замечания по BlockSync:
Форматирование многострочного атрибута удаляется.

(изменено: Hwd, 18 октября 2011г. 19:03:16)

Re: Обновить вхождение блока

Владимир Петров пишет:

Сам работаю в 2008 студии. 2010 так стоит. Попробовал проект из-под отладчика запустить, но точки останова не отрабатывают. Где-то читал что есть такая заморочка для 2010 версии студии.

смотри п.5 в F.A.Q. здесь.

Владимир Петров пишет:

1) Стандартный косяк в классе AcEnvironment. Не помню как было для 2009, а для 2010,2011 надо 215 строчку записать так "targetDb.SaveAs(targetDb.Filename,true, DwgVersion.Current, targetDb.SecurityParameters);"

Я компилирую под AutoCAD 2009 SP3 - код рабочий, так что это не "косяк"(с). Насчёт "стандартного косяка"(с) я писал здесь (см. внизу абзац "Внимание!") и давал свой вариант решения + ссылку на статью Н.Н.Полещука по этому вопросу. Обрати внимание, что этот баг присутствует в версии AutoCAD .Net API 2010 и выше, а не в версии 2009.

Владимир Петров пишет:

2) свойство TextStyle AttributeDefinition в 2011 отсутствуется, заменил на TextStyleId.

Именно о необходимости этого изменения я и писал выше. Как видишь - внести правку под твою версию не сложно.

Re: Обновить вхождение блока

Владимир Петров пишет:

Андрей еще момент. Зачем используется ссылка на acmgdinternal.dll в 2011 ее не обнаружил. Вроде код на нее не ссылается.

Ты можешь её отключить и сразу увидишь, где она используется. :)

Re: Обновить вхождение блока

Hwd пишет:

Ты можешь её отключить и сразу увидишь, где она используется.

Я ее и отключил. Но при этом ничего не изменилось. Никаких ошибок и т.д.

(изменено: Hwd, 18 октября 2011г. 19:09:14)

Re: Обновить вхождение блока

Вильдар пишет:

  Замечания по BlockSync: 

Форматирование многострочного атрибута удаляется.

Форматирование какое? Толщина, цвет и тип линии для атрибутов? В моих тестах они не исчезли. Буду тестировать на твоих файлах.

(изменено: Hwd, 18 октября 2011г. 19:18:30)

Re: Обновить вхождение блока

Владимир Петров пишет:

Я ее и отключил. Но при этом ничего не изменилось. Никаких ошибок и т.д.

Значит я удалил из AcadNetLib функционал, который использовал её (недавно из библиотеки убрал несколько методов, написанных ранее).

п.с. Если интересно, что именно я изменил - можешь сравнить содержимое AcadNetLib с содержимым этой документации (я пока не обновлял её с момента последних изменений AcadNetLib).

Re: Обновить вхождение блока

Hwd пишет:

Форматирование какое? Толщина, цвет и тип линии для атрибутов?

В редакторе многострочного текста. Там много параметров (межстрочный интервал, наклон, сужение и т.д.)
Думаю, эти параметры нужно приводить к тем, что выставлены в блоке источнике.
Например. Ставим в блоке источнике, многострочному атрибуту форматирование (межстрочный интервал, и т.д.). В целевых вхождениях блоков, при этом, не важно какое форматирование у многострочного атрибута, оно должно стать таким, как в блоке истонике.

(изменено: Вильдар, 18 октября 2011г. 21:36:35)

Re: Обновить вхождение блока

Замечания по BlockSync:
Удаляются поля (fields). Вместо полей, после синхронизации остаются только текст значения полей.

При выборе подшивки, словил сначала исключение (обработанное NET'ом - в этом сообщении есть кнопка продолжить) с сообщением о том, что подшивка уже кем-то открыта (мной же). В дисп.подшивок переключился на другую подшивку, думаю тем самым закрыл предыдущую. Повторил выбор подшивки, словил фатал-ерор.
После этого (не открывая подшивку в дисп.подшивок), все обработалось.

(изменено: Hwd, 18 октября 2011г. 21:46:52)

Re: Обновить вхождение блока

Вильдар пишет:

  Замечания по BlockSync:   

Удаляются поля (fields). Вместо полей, после синхронизации остаются только текст значения полей.



При выборе подшивки, словил сначала исключение (обработанное NET'ом - в этом сообщении есть кнопка продолжить) с сообщением о том, что подшивка уже кем-то открыта (мной же). В дисп.подшивок переключился на другую подшивку, думаю тем самым закрыл предыдущую. Повторил выбор подшивки, словил фатал-ерор.

Версия AutoCAD какая? Предполагаю, что отличная от 2009 и при этом ты, наверняка не стал генерировать с помощью утилиты Tlbimp.exe управляемую оболочку для класса acsmcomponents18.tlb. У меня ведь оболочка сгенерирована для acsmcomponents17.tlb. Не забудь CopyLocal выставить в true (когда подключишь).

п.с. Это относится к работе с подшивками. Насчёт полей - буду разбираться.

Re: Обновить вхождение блока

Hwd пишет:

Версия AutoCAD какая?

2009, xp, 32x.
Я просто загружаю blocksync , пока сам ничего не компилирую и исходники еще не качал. Подшивка, изначально была создана в 2008. Но, думаю, это роли не играет. Обработалось же.

Hwd пишет:

Предполагаю, что отличная от 2009 и при этом ты, наверняка не стал генерировать с помощью утилиты Tlbimp.exe управляемую оболочку для класса acsmcomponents18.tlb. У меня ведь оболочка сгенерирована для acsmcomponents17.tlb. Не забудь CopyLocal выставить в true (когда подключишь).

С этим пока не сталкивался.

(изменено: Вильдар, 19 октября 2011г. 09:16:19)

Re: Обновить вхождение блока

Обновление анонимных блоков!
Начиная с 2009 акада, для NET появилась функция BlockTableRecord.UpdateAnonymousBlocks(). В ARX появился класс AcDbDynBlockTableRecord, с такой же функцией.
Как же быть в 2008 акаде? Пока даже предположений нет. Помогите. (пока буду ResetBlock пробовать)

Re: Обновить вхождение блока

Хорошо, что у меня не 2008 :)
Если Александр Ривилис не подскажет (а он в последнее время занят), то как вариант - можешь задать этот вопрос в ADN.

Re: Обновить вхождение блока

Hwd пишет:

можешь задать этот вопрос в ADN.

Не знаю, что такое ADN. Задал вопрос тут

(изменено: Hwd, 19 октября 2011г. 11:41:34)

Re: Обновить вхождение блока

Вильдар пишет:
Hwd пишет:

можешь задать этот вопрос в ADN.

Не знаю, что такое ADN. Задал вопрос тут

Здесь ты свой вопрос задал, или же по указанному тобой линку - не имеет значения. Из русскоязычных программистов в AutoCAD .Net API хорошо разбирается только Александр Ривилис. Всё. Других, к сожалению, нет... Александр Наумович читает и этот форум и тот, так что дублировать там свой вопрос тебе не было нужды (имхо).

ADN - это служба поддержки от Autodesk. Там можно задать вопрос и получить на него ответ непосредственно от разработчиков AutoCAD. Странно, что ты об этом слышишь первый раз...

Re: Обновить вхождение блока

Hwd пишет:

ADN - это служба поддержки от Autodesk. Там можно задать вопрос и получить на него ответ непосредственно от разработчиков AutoCAD. Странно, что ты об этом слышишь первый раз...

Слышу не первый раз. Но, в том и дело, что только слышу :D
А как туда вопрос задать? Обращайтесь контактное лицо Н.Поликарпова. Не писать же ей про мой вопрос  :D

Re: Обновить вхождение блока

Вильдар пишет:

Слышу не первый раз. Но, в том и дело, что только слышу 

А как туда вопрос задать? Обращайтесь контактное лицо Н.Поликарпова. Не писать же ей про мой вопрос

Читай.

Re: Обновить вхождение блока

Hwd, спасиб, почитал.
Посмотрел еще раз, как работает штатная команда _AttSync. Она делает именно то, что мне нужно. Я кажется понял как, очень хитро. Она меняет ссылку на BloctTableRecord у вхождения анонимного блока. Т.е. создает новое определение дин.блока, видимо, путем временного создания нового вхождения дин.блока с нужными дин.параметрами, и назначает его нужному вхождению блока.
По-моему, вполне реализуемо. Буду пробовать.

(изменено: Hwd, 19 октября 2011г. 15:04:37)

Re: Обновить вхождение блока

Вильдар пишет:

Я кажется понял как, очень хитро. Она меняет ссылку на BloctTableRecord у вхождения анонимного блока. Т.е. создает новое определение дин.блока, видимо, путем временного создания нового вхождения дин.блока с нужными дин.параметрами, и назначает его нужному вхождению блока.

Как-то ты это поздно понял... Вообще-то это было очевидно из моего кода - посмотри как я обрабатываю вхождения динамических блоков, откуда выбираю их определения. Динамическому блоку соответствует одно определение. Если ты создаёшь вхождение такого блока, не меняя его динамических параметров - такое вхождение блока будет ссылаться именно на это определение. Но если для вхождения дин. блока ты изменишь значение дин. параметра - сразу будет создано определение анонимного блока и это вхождение блока уже будет ссылаться на данный анонимный блок, а не на исходный оригинал. Из оригинала можно получить идентификаторы всех его определений анонимных блоков.

Только не

видимо, путем временного создания нового вхождения дин.блока

, а путём создания нового определения анонимного блока.

Re: Обновить вхождение блока

Hwd пишет:

Как-то ты это поздно понял... Вообще-то это было очевидно из моего кода - посмотри как я обрабатываю вхождения динамических блоков, откуда выбираю их определения.

Упс. Честно, пыталя разобрать твой код, но мне сложно понять Linq. Сейчас, еще внимательно посмотрю. Отпишусь, если найду/ненайду.

Re: Обновить вхождение блока

Вильдар пишет:

Упс. Честно, пыталя разобрать твой код, но мне сложно понять Linq. Сейчас, еще внимательно посмотрю. Отпишусь, если найду/ненайду.

Linq здесь не при чём. Определения нужных анонимных блоков я получаю без Linq.
См. строку 113 кода - получаю идентификаторы всех анонимных блоков, созданных автокадом на базе исходного определения динамического блока. Каждая новая комбинация параметрических свойств вхождения блока будет создавать новую версию анонимного блока.

(изменено: Вильдар, 19 октября 2011г. 15:13:21)

Re: Обновить вхождение блока

Кроме строки btr.UpdateAnonymousBlocks(), ничего касающегося обновления анонимных блоков не нашел.
Наверно, я непонятно описал про работу _AttSync (вернее мою интерпретацию).
Еще раз попробую.
Как я понял работу команды _AttSync для вхождения анонимного блока:
1.Создается временное вхождение дин.блока, устанавливаются соотв.дин.параметры. Тем самым, создается определение анонимного блока, но уже из обновленного (после переопределения) дин.блока.
2.Целевому вхождению анонимного блока назначается ссылка на этот новый анонимный блок.
Вот, все.
А как можно по-другому создать или модифицировать определение анонимного блока, в соответствии с определением дин.блока? По-моему никак.

Re: Обновить вхождение блока

всё, я понял тебя. Да, это наверное был бы самый оптимальный вариант.