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

ADN Club => VBA => Тема начата: sangvinik128 от 19-12-2019, 10:31:40

Название: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 19-12-2019, 10:31:40
Здравствуйте ! Могу ли я каким-то образом найти все таблицы AutoCAD, связанные с каким-либо файлом Excel ? (вне зависимости от того, связана таблица с диапазоном ячеек Excel или c листом Excel). Не удалось ничего дельного найти в гугле. Какой вообще у VBA есть функционал для работы со связанными таблицами AutoCAD, и есть ли он вообще. Где об этом можно почитать?
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: Александр Ривилис от 19-12-2019, 11:22:34
Давай пример dwg-файла с такой таблицей и соответствующий Excel-файл.
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 19-12-2019, 11:30:29
Вот я себе создал файлы для тестирования
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: Александр Ривилис от 19-12-2019, 11:55:25
Какой вообще у VBA есть функционал для работы со связанными таблицами AutoCAD, и есть ли он вообще.
Ты можешь определить, что в чертеже есть связанные таблицы через ThisDrawing.Dictionaries.Item("ACAD_DATALINK") - если такого словаря нет, то нет и связанных таблиц. Это необходимое условие, но недостаточное.
Если же этот словарь есть, ты можешь отобрать все таблицы в чертеже (пройтись по всем блокам ThisDrawing.Blocks и внутри их найти все Table), а затем пройтись по всем ячейкам каждой из таблиц и при помощи метода Table.GetCellState(nRow, nCol)  определить состояние ячейки. Если установлен флаг acCellStateLinked, то есть связь. 
Перепроверил этот метод - он не работает. Так что похоже только ObjectARX/AutoCAD .NET API

Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 19-12-2019, 12:46:08
Какой вообще у VBA есть функционал для работы со связанными таблицами AutoCAD, и есть ли он вообще.
Ты можешь определить, что в чертеже есть связанные таблицы через ThisDrawing.Dictionaries.Item("ACAD_DATALINK") - если такого словаря нет, то нет и связанных таблиц. Это необходимое условие, но недостаточное.
Если же этот словарь есть, ты можешь отобрать все таблицы в чертеже (пройтись по всем блокам ThisDrawing.Blocks и внутри их найти все Table), а затем пройтись по всем ячейкам каждой из таблиц и при помощи метода Table.GetCellState(nRow, nCol)  определить состояние ячейки. Если установлен флаг acCellStateLinked, то есть связь. 
Перепроверил этот метод - он не работает. Так что похоже только ObjectARX/AutoCAD .NET API
А почему условие недостаточное ? Ведь мне просто нужно знать, есть ли в чертеже связанные таблицы, если есть, то я его просто закрываю и перехожу к следующему чертежу. Или Вы имеете в виду, что словарь может существовать и без связанных таблиц ?
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: Александр Ривилис от 19-12-2019, 13:31:24
Или Вы имеете в виду, что словарь может существовать и без связанных таблиц ?
Именно. Таблицы создали, потом удалили. А информация в словаре осталась...
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 19-12-2019, 13:42:13
Или Вы имеете в виду, что словарь может существовать и без связанных таблиц ?
Именно. Таблицы создали, потом удалили. А информация в словаре осталась...
Ага, теперь я понял, спасибо Вам
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 20-12-2019, 11:22:38
Или Вы имеете в виду, что словарь может существовать и без связанных таблиц ?
Именно. Таблицы создали, потом удалили. А информация в словаре осталась...
А количество записей в словаре я узнать не могу ?
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: Александр Ривилис от 20-12-2019, 11:31:42
А количество записей в словаре я узнать не могу ?
Можешь. Свойство Count.
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 20-12-2019, 14:48:44
А количество записей в словаре я узнать не могу ?
Можешь. Свойство Count.
Получается, если я , допустим, буду проверять кол-во записей в словаре по условию : если в словаре 0 записей, то считаем, что связей нет, а если count>0 , то закрываю файл просто. В этом случае я могу что-то упустить ?
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: Александр Ривилис от 20-12-2019, 15:20:08
В этом случае я могу что-то упустить ?
Упустить что? Если count > 0, то вполне возможно, что связей нет - таблицы, в которых были связи уже удалены. Но если count == 0, то однозначно связей нет. 
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 27-12-2019, 15:37:17
А могу ли я как-то разорвать все существующие связи в чертеже ?
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: Александр Ривилис от 27-12-2019, 15:44:47
А могу ли я как-то разорвать все существующие связи в чертеже ?
Средствами VBA? Ну можешь попробовать удалить все записи словаря ACAD_DATALINK. Но боюсь, что после этого потребуется проверка (команда _AUDIT) чертежа. Или брось уже VBA. Ты же видишь, что в нём одни ограничения...
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 27-12-2019, 15:58:36
А могу ли я как-то разорвать все существующие связи в чертеже ?
Средствами VBA? Ну можешь попробовать удалить все записи словаря ACAD_DATALINK. Но боюсь, что после этого потребуется проверка (команда _AUDIT) чертежа. Или брось уже VBA. Ты же видишь, что в нём одни ограничения...
Не, не получается так, пробовал. А в контексте данной задачи, в чём разница ? Как бы я мог решить эту задачу средствами .NET API ? Т.е., как я понимаю, взаимодействие остаётся тем же самым, на уровне объектной модели, свойств объектов и их методов. У меня руки уже чешутся перейти на C# , но чтобы время не терять на переписывание кода, хочется уже допилить средствами VBA.
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: Александр Ривилис от 27-12-2019, 15:59:59
Не, не получается так, пробовал.
Т.е.? Что происходит?
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 27-12-2019, 16:10:23
Не, не получается так, пробовал.
Т.е.? Что происходит?
А ничего не происходит. Я  в словаре прохожу по всем Item'ам и для каждого вызываю метод Delete.
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: Александр Ривилис от 27-12-2019, 17:40:14
Попробуй в командной строке AutoCAD:
Код - Auto/Visual Lisp [Выбрать]
  1. (dictremove (namedobjdict) "ACAD_DATALINK")
После этого чертеж нужно сохранить и открыть по новой.
Название: Re: Связанные таблицы AutoCAD с Excel файлами
Отправлено: sangvinik128 от 28-12-2019, 08:01:45
В общем всё отработало, у меня элементарно ActiveDocument.Close стояло на False, вместо True ;D Затупил конкретно, извиняюсь  :)