Интеграция приложений
Анализ программ
После установки связи с MS Excel 2003 основная программа вычисляет последовательно указатели:
- g_oex - указатель объекта самого приложения Excel;
- g_wkbs - указатель семейства Workbooks;
- g_awb - указатель активной книги после открытия файла readex.xls;
- g_shs - указатель семейства листов;
- g_mainsh - указатель нужного листа (Спецификация).
Затем с помощью метода Evaluate читаются значения, записанные в листе Спецификация в ячейках А1 и В1:
- nlines - количество строк или деталей;
- ncolumns - количество столбцов в будущей таблице.
Поскольку метод Evaluate возвращает значение типа Variant, то для его сохранения в виде обычного целого числа применяется преобразование типа с помощью функции vlax-variant-value.
Применяя далее тот же метод Evaluate сканируем строки 2-10 листа Спецификация и получаем список table_items из девяти элементов. Каждый элемент также является списком из пяти значений:
(30.0 70.0 30.0 40.0 40.0) ("int" "str" "real" "str" "int") ("Позиция" "Наименование" "Толщина" "Материал" "Количество") (1.0 "Планка" 20.0 "A" 4.0) (3.0 "Плинтус" 30.0 "A" 6.0) (4.0 "Плита" 50.0 "В" 12.0) (8.0 "Лист" 13.0 "С" 6.0) (14.0 "Рама" 35.0 "A" 8.0) (16.0 "Накладка" 10.0 "С" 1.0)
Первый элемент списка table_items (ширина столбцов) сохраняется для удобства в переменной width, второй элемент (типа значений по столбцам) - в переменной types, а третий (заголовки столбцов) - в переменной headers.
Из списка видно, что все значения, являющиеся как вещественными, так и целыми числами, представлены в вещественном виде. Поэтому при вписывании их в таблицу нужно пользоваться типами "int" или "real".
После формирования table_items программа ex_break_connect закрывает соединение с табличным процессором Excel и выгружает его из памяти. При этом проверяется, какие сформированы глобальные переменные, содержащие указатели объектов Excel. Их объекты аннулируются с помощью функции vlax-release-object. Это позволяет избежать неприятного процесса, когда приложение Excel не удаляется из памяти. При повторениях процесса количество неудаленных экземпляров приложения растет и может исчерпать всю оперативную память на компьютере.
Далее интерактивно запрашивается точка р0, в которую будет помещен верхний левый угол таблицы спецификации деталей. Цикл, организованный с помощью функции while, исключает возможность пустого ввода нажатием на клавишу Enter. Это можно было бы обеспечить применением функции initget.
Сначала с помощью метода AddTable строится пустая таблица с колонками одинаковой ширины. Затем с помощью метода SetColumnWidth задаются нужные ширины.
Заполнение ячеек данными выполняется в три шага:
- с помощью метода SetTextHeight задается высота букв текста;
- с помощью метода SetText задается сам текст;
- с помощью метода SetCellAlignment задается выравнивание в ячейке.
Для заголовков таблицы и колонок дополнительное выравнивание не выполняется. Используемое по умолчанию выравнивание acmiddleCenter является приемлемым. В методе SetTextHeight в качестве аргумента должен задаваться тип ячеек. Он может принимать значения:
- acTitleRow - для заголовка таблицы;
- acHeaderRow - для заголовков колонок;
- acDataRow - для ячеек с данными.
Приведенные программы удобны тем, что в самом файле Excel можно задать такие параметры настройки таблицы, как количество и тип элементов, ширину столбцов и др. В самой программе можно проводить более тщательный разбор значений, занесенных предварительно в книгу Excel.
Система AutoCAD имеет свои средства, позволяющие работать с базами данных и создавать связи между примитивами рисунка и записями базы. Для получения доступа к внешней базе данных из системы AutoCAD нужно настроить связь с базами данных с помощью драйверов Microsoft OLE Database. Из доступных пользователю отметим драйверы MS ODBC (Open Database Connectivity) . В процессе работы драйверов используется модель COM (Component Object Model) .
После завершения настройки связи с внешней базой данных создается файл с расширением udl (Use Data Link) . По умолчанию UDL-файлы располагаются в папке Data Links папки Document end Setting текущего пользователя.
Для создания UDL-файлов обычно используются существующие или создаваемые файлы с расширением dsn (Data Source Name) . По умолчанию они располагаются в папке c:\Program Files\Common Files\Odbc\Data Sources. Возможно, однако, создание файла настройки и без DSN-файла.
Для примера в папке Sample программного обеспечения AutoCAD поставляется файл db_samples.mdb базы данных MS Access. В папке Data Links, расположенной внутри папки Document end Setting текущего пользователя, находится уже созданный UDL-файл jet_dbsamples.udl. Он настроен для работы с таблицами этой базы. Для чтения этого файла достаточно наличия драйверов OLE DB и ODBC.
Внутри папки Sample находится также папка Database Connectivity. В ней расположены файлы caotest.lsp и caotest.dvb. Они используют поддерживаемую системой AutoCAD объектную модель САО (Connectivity Automation Objects) .
Задание 10.1
При открытии сеанса работы в программе AutoCAD пользователь должен ввести свою фамилию в автоматически появляющемся диалоговом окне. Фамилия выбирается в списках окна. Списки сотрудников составлены для каждого подразделения путем чтения текстовых файлов. Данные должны быть записаны в файл MS Word.
Если Вы не сможете решить эту задачу самостоятельно, рассмотрите приведенное ниже решение.
Текстовые файлы polz01 и polz02 имеют следующее содержание:
polz01 | polz02 |
---|---|
Сектор 2111 Алексеева Борисов Витольд Савельев Тверской Юдинцева Яковлева |
Сектор 2112 Калашин Ладейников Михайлова |
Составьте DCL-файл с описанием диалогового окна. Поместите его в один из каталогов маршрутов поддержки.
user:dialog{label = "Ввод фамилии пользователя"; :column{ :edit_box{label="Фамилия:";edit_width=40; alignment=centered; value=""; key="usfam"; }// конец edit_box :spacer{height=1;} :text{label="Выбор из списков подразделений";alignment = centered;} :row{ :text{label="Подразделение 0001"; key="s1";} :popup_list{key="p1";is_enabled=true;label="";list="";width=20;} }// конец row :row{ :text{label="Подразделение 0002"; key="s2";} :popup_list{key="p2";is_enabled=true;label="";list="";width=20;} }// конец row :row{ :text{label="Подразделение 0003"; key="s3";} :popup_list{key="p3";is_enabled=true;label="";list="";width=20;} }// конец row :row{ :text{label="Подразделение 0004"; key="s4";} :popup_list{key="p4";is_enabled=true;label="";list="";width=20;} }// конец row :spacer {height=1;} ok_cancel; }// конец column }// конец dialog
Внешний вид диалогового окна показан на рис. 10.7
Составим процедуру USN LISP-файла. Она состоит из двух частей. В первой части заполняются списки и обрабатываются данные диалогового окна. Фамилия пользователя присваивается глобальной переменной PV. Во второй части значение PV распечатывается в редакторе MS Word.
(defun usn (/ dcl_id fpolz fd i plist nlist spi str nsubd _re) (if (not pv) (setq pv "") ) (if (< (setq dcl_id (load_dialog "user.dcl")) 0) (exit) ) (if (not (new_dialog "user" dcl_id)) (exit) ) (setq i 0) ; Чтение файлов polz01.txt, polz02.txt, polz03.txt, polz04.txt (repeat 4 ; количество подразделений - 4 (setq spi nil) (setq i (1+ i) fpolz (strcat "i:/Dialog/ListOfUsers/polz0" (itoa i) ".txt") ) (if (findfile fpolz) (progn (setq fd (open (findfile fpolz) "r")) (setq str (read-line fd)) (setq nlist (append nlist (list str))) (if str (while (setq str (read-line fd)) (setq spi (append spi (list str))) ) ;while ) ;if str (close fd) (setq fd nil) ) ;progn (setq nlist (append nlist (list nil))) ) ;if findfile (setq plist (append plist (list spi))) ) ;repeat ; ; Заполнение списков диалогового окна (setq i -1) (repeat 4 (setq i (1+ i)) (if (setq nsubd (nth i nlist)) (progn (set_tile (strcat "s" (itoa (1+ i))) nsubd) (if (setq spi (nth i plist)) (progn (start_list (strcat "p" (itoa (1+ i)))) (mapcar 'add_list spi) (end_list) ) ;progn ) ;if ) ;progn ; Гашение списка, если файл с фамилиями не найден (progn (mode_tile (strcat "s" (itoa (1+ i))) 1) (mode_tile (strcat "p" (itoa (1+ i))) 1) ) ) ;if ) ;repeat ; Элементы управления диалогового окна (action_tile "accept" (strcat "(if(= (setq pv(get_tile \"usfam\"))\"\")" "(alert\"Фамилия не задана\")" "(done_dialog))" ) ;strcat ) ;action-tile accept (action_tile "cancel" "(done_dialog)") (action_tile "p1" "(set_tile \"usfam\" (nth (atoi $value) (nth 0 plist)))" ) (action_tile "p2" "(set_tile \"usfam\" (nth (atoi $value) (nth 1 plist)))" ) (action_tile "p3" "(set_tile \"usfam\" (nth (atoi $value) (nth 2 plist)))" ) (action_tile "p4" "(set_tile \"usfam\" (nth (atoi $value) (nth 3 plist)))" ) (start_dialog) (unload_dialog dcl_id) (vl-load-com) ; Загружаем Word 2003 без открытых документов (setq g_ow (vlax-get-or-create-object "Word.Application.11")) ; Раскомментировать следующую строку, ; если окно Word должно быть видимым (vlax-put-property g_ow 'Visible :vlax-true) ; Указатель семейства Documents (setq g_docs (vlax-get-property g_ow 'Documents)) ; Создаем новый документ (setq g_doc (vlax-invoke-method g_docs 'Add)) ; Создаем рабочий диапазон, позиция 0 (setq g_r (vlax-invoke-method g_doc 'Range 0 0)) ; Вставляем текст заголовка в начало диапазона (vlax-invoke-method g_r 'InsertBefore "Список пользователей") ; Вставляем конец абзаца дважды (vlax-invoke-method g_r 'InsertParagraphAfter) (vlax-invoke-method g_r 'InsertParagraphAfter) ; Параметры шрифта рабочего диапазона (setq g_f (vlax-get-property g_r 'Font)) (vlax-put-property g_f 'Name "Arial") (vlax-put-property g_f 'Size 14.0) (vlax-put-property g_f 'Bold :vlax-true) (vlax-put-property g_f 'Italic :vlax-false) (vlax-put-property g_f 'Underline :vlax-false) ; Создание нового диапазона в конце документа (setq _re (vlax-get-property g_r 'End)) (setq g_r (vlax-invoke-method g_doc 'Range _re _re)) ; Вставляем текст в конец (vlax-invoke-method g_r 'InsertAfter "ПК1") (vlax-invoke-method g_r 'InsertParagraphAfter) (vlax-invoke-method g_r 'InsertAfter pv) (vlax-invoke-method g_r 'InsertParagraphAfter) ;;;(vlax-invoke-method g_r 'InsertAfter pv) ;;;(vlax-invoke-method g_r 'InsertParagraphAfter) ; Параметры шрифта рабочего диапазона (setq g_f (vlax-get-property g_r 'Font)) (vlax-put-property g_f 'Name "Times New Roman") (vlax-put-property g_f 'Size 10.0) (vlax-put-property g_f 'Bold :vlax-false) (vlax-put-property g_f 'Italic :vlax-false) (vlax-put-property g_f 'Underline :vlax-false) ; Сохранение документа (vlax-invoke-method g_doc 'SaveAs "d:\\Temp\\WordDoc.doc") ; Выход из Word (vlax-invoke-method g_ow "Quit") ; Освобождение объектов и выгрузка Word (if (and g_f (not (vlax-object-released-p g_f))) (vlax-release-object g_f)) (if (and g_r (not (vlax-object-released-p g_r))) (vlax-release-object g_r)) (if (and g_doc (not (vlax-object-released-p g_doc))) (vlax-release-object g_doc)) (if (and g_docs (not (vlax-object-released-p g_docs))) (vlax-release-object g_docs)) (if (and g_ow (not (vlax-object-released-p g_ow))) (vlax-release-object g_ow)) (setq g_f nil g_r nil g_doc nil g_docs nil g_ow nil) (gc) (princ) ) ;defun usn
Сохраните файл как USN.LSP в одном из каталогов маршрутов поддержки. Запишите команду загрузки этого файла в файл ACAD.LSP и команду запуска программы:
(load "USN") (USN)
Окно MS Word с распечаткой фамилии пользователя представлено на рис. 10.8.
Ключевые термины
Application - vla-объект приложения, создается функцией (vlax-create-object "имя в реестре").
Document - объект, представляющий каждый из открытых документов.
ActiveDocument - активный документ.
Range - рабочий диапазон документа.
Указатели - глобальные переменные, содержащие ссылку на объекты .
Краткие итоги
Модель COM (Component Object Model) позволяет связывать самые разнородные приложения. Построенные на спецификации этой модели программные комплексы предоставляют описание своих компонентов и средств доступа к ним другим программам. При интегрировании приложения-клиенты обращаются к приложениям-серверам для выполнения операций, специфичных для приложения-сервера. Приложения, поддерживающие технологию COM, заносят в реестр Windows информацию о себе, о своих объектах и компонентах.
Вопросы
- Как из AutoCAD установить связь с MS Word?
- Какая функция позволяет вывести свойства и методы объекта Application?
- Какая функция позволяет извлечь значения свойств объекта?
- Какая функция позволяет изменить значения свойств объекта?
- Каков алгоритм создания "Пояснительной записки" в MS Word из AutoCAD?
- Каков алгоритм создания "Спецификации" в MS Excel из AutoCAD?