Открытие всех OLE объектов

Автор Тема: Открытие всех OLE объектов  (Прочитано 5742 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн StormyАвтор темы

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


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Открытие всех OLE объектов
« Ответ #1 : 30-10-2019, 13:02:57 »
Можно ли программно открыть одновременно все имеющиеся OLE объекты?
Приветствую на форуме!
Немного не понятен вопрос. Что значит "открыть"? И почему вопрос в разделе VBA? Означает ли это, что нужен код на VBA?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StormyАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Открытие всех OLE объектов
« Ответ #2 : 30-10-2019, 13:50:22 »
Здравствуйте, Александр.

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

Приложил пример

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Открытие всех OLE объектов
« Ответ #3 : 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-объекты только с текущего листа.
« Последнее редактирование: 30-10-2019, 18:07:32 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StormyАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Открытие всех OLE объектов
« Ответ #4 : 31-10-2019, 08:34:17 »
Александр,
Спасибо за пример.
Проверил на оригинальном файле. Почему-то открываются только 3 объекта.
Нашел код для открытия файла на VBA. Он открывает все объекты
На Ваше замечание по поводу памяти заставило задуматься. В том ли направление я движусь  :o
Можно ли сделать на Lisp такой скрипт по циклу.
1) Открываем OLE объект (допустим OLE 1)
2) Открывшийся объект после обновления сам закрывается ( эту часть реализую в Excel)
3) Получаем команду о закрытие OLE 1
4) Открываем OLE объект (допустим OLE 2)
И так дальше до конца всех объектов. Это займет время на прохождение всего цикла, но в тот же момент не сильно загрузит комп, а про сравнение заполнения всех бланков вручную и говорить не стоит.

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


Извините, вам запрещён просмотр содержимого спойлеров.

Оффлайн StormyАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Открытие всех OLE объектов
« Ответ #5 : 31-10-2019, 08:38:26 »
Открываются OLE-объекты только с текущего листа.
Невнимательно прочел этот пункт.
Вопрос про 3 объекта снимается. Так понимаю это решаемый вопрос и можно будет открыть все объекты

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Открытие всех OLE объектов
« Ответ #6 : 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 будешь закрывать объекты.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StormyАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Открытие всех OLE объектов
« Ответ #7 : 31-10-2019, 10:08:49 »
Делаю и понимаю, что логика у меня хромает
Тут в голове засела мысль сделать все немного иначе.
То есть написать стороннее приложение, которое будет создавать/заполнять базу.
Дальше это приложение должно передать команду OLEOPEN определенному OLE объекту.
Как присвоить разные названия OLE объектам не нашел ((
Но есть слои, если изначально у каждого OLE объекта будет свой слой, то теоретически можно выбрать слой через командную строку и применить команду OLEOPEN. Это даст возможность конструкторам заполнить нужный ОЛЕ, а в будущем вообщем по шаблону создавать новые листы. Конечно  подводных камней и в этом варианте много, но этот вариант сейчас кажется более продуктивным.
Главное теперь понять насколько сложно передать команды из WinForm в AutoCad (без написания библиотек )
Наверное по этому поводу нужно открыть новую тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Открытие всех OLE объектов
« Ответ #8 : 31-10-2019, 11:19:02 »
Делаю и понимаю, что логика у меня хромает
Похоже. :)
То есть написать стороннее приложение, которое будет создавать/заполнять базу.
Допустим.
Дальше это приложение должно передать команду OLEOPEN определенному OLE объекту.
Идея не слишком хорошая. Управлять AutoCAD из внешнего приложения очень не просто. Есть куча проблем и нюансов. Значительно проще всё это делать из самого AutoCAD (смотри в сторону AutoCAD .NET API)
Но есть слои, если изначально у каждого OLE объекта будет свой слой, то теоретически можно выбрать слой через командную строку и применить команду OLEOPEN.
Слой выбрать нельзя. Можно выбрать OLE-объект(ы), которые расположены на этом слое.
Это даст возможность конструкторам заполнить нужный ОЛЕ, а в будущем вообщем по шаблону создавать новые листы.
Программным путём вставить OLE-объект в чертеж AutoCAD нельзя. Можно вставить dwg-файла, в котором будет готовый OLE-объект.

Главный вопрос: "Зачем нужно OLE? Таблиц AutoCAD для этой цели не хватает?". У AutoCAD очень ограниченные возможности по работе с OLE-объектами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StormyАвтор темы

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

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

Спасибо за уделенное время )

Отмечено как Решение Stormy 31-10-2019, 15:50:08

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Открытие всех OLE объектов
« Ответ #10 : 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-объекты перестанут открываться или не будут печататься, что бывало уже не раз....
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StormyАвтор темы

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Открытие всех OLE объектов
« Ответ #11 : 31-10-2019, 12:00:50 »
Это до поры до времени, когда в очередной версии AutoCAD (или Microsoft Office) их OLE-объекты перестанут открываться или не будут печататься, что бывало уже не раз....
Да и сейчас периодически  OLE-объекты на одном компьютере вдруг перестают открываться.
Лечиться пересозданием файла.
Кстати, на lisp'е функция, которая открывает все OLE-объекты во всех листах:
Благодарю за помощь.
Пока буду пробовать таким образом ))

Кстати, если Вам интересен (финансово) этот проект, то можем обсудить

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Открытие всех OLE объектов
« Ответ #12 : 31-10-2019, 12:09:52 »
Да и сейчас периодически  OLE-объекты на одном компьютере вдруг перестают открываться.
Вот-вот. А если создать целую библиотеку таких файлов и они в один какой-то "приятный день" перестанут открываться?
Кстати, на домашнем PC у меня нормально отрабатывает открытие OLE-объектов из вашего чертежа, а на рабочем нет. Версия Windows, AutoCAD и MS Office одинаковые...
Кстати, если Вам интересен (финансово) этот проект, то можем обсудить
Такие вопросы решаются в Личных сообщениях. Но с OLE-объектами я точно не буду заморачиваться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение