Интеграция приложений
Анализ программ
После установки связи с 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?

