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

ADN Club => VBA => Тема начата: Stormy от 30-10-2019, 12:04:43

Название: Открытие всех OLE объектов
Отправлено: Stormy от 30-10-2019, 12:04:43
Всем привет!
Можно ли программно открыть одновременно все имеющиеся OLE объекты?
Сами OLE объекты представляют из себя таблицы Excel.

Название: Re: Открытие всех OLE объектов
Отправлено: Александр Ривилис от 30-10-2019, 13:02:57
Можно ли программно открыть одновременно все имеющиеся OLE объекты?
Приветствую на форуме!
Немного не понятен вопрос. Что значит "открыть"? И почему вопрос в разделе VBA? Означает ли это, что нужен код на VBA?
Название: Re: Открытие всех OLE объектов
Отправлено: Stormy от 30-10-2019, 13:50:22
Здравствуйте, Александр.

то значит "открыть"?
Если в Автокад добавить OLE объект, то для его последующего редактирования нужна материнская программа.
В моем случае это Excel. То есть сейчас я кликаю на OLE объект (правой кнопкой) выбираю открыть и он открывается.
И почему вопрос в разделе VBA? Означает ли это, что нужен код на VBA?
Да, предпочтительно на VBA, но если это возможно сделать иным способом, то это тоже мне может помочь.

Приложил пример
Название: Re: Открытие всех OLE объектов
Отправлено: Александр Ривилис от 30-10-2019, 16:55:22
Открытие OLE-объекта происходит при помощи команды _OLEOPEN. Поэтому нужно выбрать соответствующий OLE-объект и запустить команду. На VBA это не слишком удобно. Вот код на AutoLisp, который открывает сразу все OLE-объекты:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:OLEOPENALL ( / ss en i n)
  2.  (setq ss (ssget "_X" '((0 . "OLE2FRAME"))))
  3.  (if ss (progn
  4.    (setq i 0 n (sslength ss))
  5.    (while (< i n)
  6.      (command "_SELECT" (ssname ss i) "")
  7.      (command "_OLEOPEN")
  8.      (setq i (1+ i))
  9.    )
  10.  ))
  11.  (princ)
  12. )
Но будь осторожен. Если их будет слишком много, то могут возникнуть проблемы с оперативной памятью.
Открываются OLE-объекты только с текущего листа.
Название: Re: Открытие всех OLE объектов
Отправлено: Stormy от 31-10-2019, 08:34:17
Александр,
Спасибо за пример.
Проверил на оригинальном файле. Почему-то открываются только 3 объекта.
Нашел код для открытия файла на VBA. Он открывает все объекты
На Ваше замечание по поводу памяти заставило задуматься. В том ли направление я движусь  :o
Можно ли сделать на Lisp такой скрипт по циклу.
1) Открываем OLE объект (допустим OLE 1)
2) Открывшийся объект после обновления сам закрывается ( эту часть реализую в Excel)
3) Получаем команду о закрытие OLE 1
4) Открываем OLE объект (допустим OLE 2)
И так дальше до конца всех объектов. Это займет время на прохождение всего цикла, но в тот же момент не сильно загрузит комп, а про сравнение заполнения всех бланков вручную и говорить не стоит.

Не смог прикрепить файл с примером.
В файле, которым пользуются сейчас конструктора около 12 объектов


Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Открытие всех OLE объектов
Отправлено: Stormy от 31-10-2019, 08:38:26
Открываются OLE-объекты только с текущего листа.
Невнимательно прочел этот пункт.
Вопрос про 3 объекта снимается. Так понимаю это решаемый вопрос и можно будет открыть все объекты
Название: Re: Открытие всех OLE объектов
Отправлено: Александр Ривилис от 31-10-2019, 09:56:30
Так понимаю это решаемый вопрос и можно будет открыть все объекты
Да. Для этой цели нужно переключатся между листами, как сделано в коде VBA.
Честно говоря не понимаю зачем это всё нужно.
Можно ли сделать на Lisp такой скрипт по циклу.
1) Открываем OLE объект (допустим OLE 1)
2) Открывшийся объект после обновления сам закрывается ( эту часть реализую в Excel)
3) Получаем команду о закрытие OLE 1
4) Открываем OLE объект (допустим OLE 2)
И так дальше до конца всех объектов. Это займет время на прохождение всего цикла, но в тот же момент не сильно загрузит комп, а про сравнение заполнения всех бланков вручную и говорить не стоит.
Там в действительности всё не так. Есть понятие реактора/события модификации объекта. Причем это событие может на одной команде OLEOPEN произойти неоднократно. Так что отслеживание достаточно непростое.
В принципе если чертежи типа образцового, когда OLE-объектов < 100 ничего страшного произойти не должно. Тем более если ты из Excel будешь закрывать объекты.
Название: Re: Открытие всех OLE объектов
Отправлено: Stormy от 31-10-2019, 10:08:49
Делаю и понимаю, что логика у меня хромает
Тут в голове засела мысль сделать все немного иначе.
То есть написать стороннее приложение, которое будет создавать/заполнять базу.
Дальше это приложение должно передать команду OLEOPEN определенному OLE объекту.
Как присвоить разные названия OLE объектам не нашел ((
Но есть слои, если изначально у каждого OLE объекта будет свой слой, то теоретически можно выбрать слой через командную строку и применить команду OLEOPEN. Это даст возможность конструкторам заполнить нужный ОЛЕ, а в будущем вообщем по шаблону создавать новые листы. Конечно  подводных камней и в этом варианте много, но этот вариант сейчас кажется более продуктивным.
Главное теперь понять насколько сложно передать команды из WinForm в AutoCad (без написания библиотек )
Наверное по этому поводу нужно открыть новую тему.
Название: Re: Открытие всех OLE объектов
Отправлено: Александр Ривилис от 31-10-2019, 11:19:02
Делаю и понимаю, что логика у меня хромает
Похоже. :)
То есть написать стороннее приложение, которое будет создавать/заполнять базу.
Допустим.
Дальше это приложение должно передать команду OLEOPEN определенному OLE объекту.
Идея не слишком хорошая. Управлять AutoCAD из внешнего приложения очень не просто. Есть куча проблем и нюансов. Значительно проще всё это делать из самого AutoCAD (смотри в сторону AutoCAD .NET API)
Но есть слои, если изначально у каждого OLE объекта будет свой слой, то теоретически можно выбрать слой через командную строку и применить команду OLEOPEN.
Слой выбрать нельзя. Можно выбрать OLE-объект(ы), которые расположены на этом слое.
Это даст возможность конструкторам заполнить нужный ОЛЕ, а в будущем вообщем по шаблону создавать новые листы.
Программным путём вставить OLE-объект в чертеж AutoCAD нельзя. Можно вставить dwg-файла, в котором будет готовый OLE-объект.

Главный вопрос: "Зачем нужно OLE? Таблиц AutoCAD для этой цели не хватает?". У AutoCAD очень ограниченные возможности по работе с OLE-объектами.
Название: Re: Открытие всех OLE объектов
Отправлено: Stormy от 31-10-2019, 11:35:30
Слой выбрать нельзя. Можно выбрать OLE-объект(ы), которые расположены на этом слое.
Это тоже решает данный вопрос ))
Программным путём вставить OLE-объект в чертеж AutoCAD нельзя. Можно вставить dwg-файла, в котором будет готовый OLE-объект.
Сейчас все так и есть. Правда все ручную
Главный вопрос: "Зачем нужно OLE? Таблиц AutoCAD для этой цели не хватает?". У AutoCAD очень ограниченные возможности по работе с OLE-объектами.
Как можно сейчас говорить в угоду юзабилити. С таблицами работать может ( или не хочет) не каждый. С OLE у них вопросов не возникает. Да и формулы сложные легче составить в Экзель

Как-то так
Буду смотреть AutoCAD .NET API , посмотрим, что из этого получится.

Спасибо за уделенное время )
Название: Re: Открытие всех OLE объектов
Отправлено: Александр Ривилис от 31-10-2019, 11:42:42
Кстати, на lisp'е функция, которая открывает все OLE-объекты во всех листах:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:OLEOPENALL ( / ss en i n layout)
  2.  
  3.  (foreach layout (layoutlist)
  4.    (setvar "CTAB" layout)
  5.    (setq ss (ssget "_X" (list '(0 . "OLE2FRAME") (cons 410 layout))))
  6.    (if ss (progn
  7.      (setq i 0 n (sslength ss))
  8.      (while (< i n)
  9.        (command "_SELECT" (ssname ss i) "")
  10.        (command "_OLEOPEN")
  11.        (setq i (1+ i))
  12.      )
  13.    ))
  14.  )
  15.  (princ)
  16. )
С OLE у них вопросов не возникает. Да и формулы сложные легче составить в Экзель
Это до поры до времени, когда в очередной версии AutoCAD (или Microsoft Office) их OLE-объекты перестанут открываться или не будут печататься, что бывало уже не раз....
Название: Re: Открытие всех OLE объектов
Отправлено: Stormy от 31-10-2019, 12:00:50
Это до поры до времени, когда в очередной версии AutoCAD (или Microsoft Office) их OLE-объекты перестанут открываться или не будут печататься, что бывало уже не раз....
Да и сейчас периодически  OLE-объекты на одном компьютере вдруг перестают открываться.
Лечиться пересозданием файла.
Кстати, на lisp'е функция, которая открывает все OLE-объекты во всех листах:
Благодарю за помощь.
Пока буду пробовать таким образом ))

Кстати, если Вам интересен (финансово) этот проект, то можем обсудить
Название: Re: Открытие всех OLE объектов
Отправлено: Александр Ривилис от 31-10-2019, 12:09:52
Да и сейчас периодически  OLE-объекты на одном компьютере вдруг перестают открываться.
Вот-вот. А если создать целую библиотеку таких файлов и они в один какой-то "приятный день" перестанут открываться?
Кстати, на домашнем PC у меня нормально отрабатывает открытие OLE-объектов из вашего чертежа, а на рабочем нет. Версия Windows, AutoCAD и MS Office одинаковые...
Кстати, если Вам интересен (финансово) этот проект, то можем обсудить
Такие вопросы решаются в Личных сообщениях. Но с OLE-объектами я точно не буду заморачиваться.