Тексты вспомогательных программ — КиберПедия 

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Тексты вспомогательных программ

2021-06-30 37
Тексты вспомогательных программ 0.00 из 5.00 0 оценок
Заказать работу

; Установка связи с Excel; Аргумент:; vis = T - сделать Excel видимым;; vis = nil - сделать Excel невидимым.;(defun ex11_set_connect (vis /) (setq g_oex (vlax-get-or-create-object "Excel.Application ")); Если связь не установлена, то аварийно завершить работу(if (null g_oex) (progn (alert "Невозможнозапустить Microsoft Excel")(exit)));if; Сделать Excel видимым в зхаисимости от параметра vis(if vis (vlax-put-property g_oex "Visible":vlax-true)))

Листинг 10.3. Функция ex11_set_connect

; Разрыв связи с Excel и выгрузка из памяти(defun ex_break_connect (/) (vlax-invoke-method g_oex "Quit"); Освобождаем объекты, связанные с Excel,; для корректной выгрузки Excel из памяти(mapcar (function (lambda (x) (if   (and x (not (vlax-object-released-p x)))   (vlax-release-object x)))) (list g_cell g_mainsh g_shs g_awb g_wkbs g_oex)); Сборкамусора (setq g_cell nil g_mainsh nil g_shs nil g_awb nil g_wkbs nil g_oex nil) (gc))

Листинг 10.4. Функция ex_break_connect

Перед выполнением операции загрузите все три программы, а затем запустите основную функцию readex11_com в двух вариантах:

(readex11_com "d:\\r 16\\readex11.xls" "Спецификация" 8.0 5.0 T) и(readex11_com "d:\\r 16\\readex11.xls" "Спецификация" 5.0 3.0 nil).

Результаты приведены на рис. 10.5 и рис. 10.6.


Рис. 10.5. Таблица (hcell=8.0, hlet=5.0)


Рис. 10.6. Таблица (hcell=5.0, hlet=3.0)

Анализ программ

После установки связи с 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_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


Рис. 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.


Рис. 10.8. Окно MS Word

Ключевые термины

Application - vla - объект приложения, создается функцией (vlax-create-object "имя в реестре").

Document - объект, представляющий каждый из открытых документов.

ActiveDocument - активный документ.

Range - рабочий диапазон документа.

Указатели - глобальные переменные, содержащие ссылку на объекты.

Краткие итоги

Модель COM (Component Object Model) позволяет связывать самые разнородные приложения. Построенные на спецификации этой модели программные комплексы предоставляют описание своих компонентов и средств доступа к ним другим программам. При интегрировании приложения-клиенты обращаются к приложениям-серверам для выполнения операций, специфичных для приложения-сервера. Приложения, поддерживающие технологию COM, заносят в реестр Windows информацию о себе, о своих объектах и компонентах.

Вопросы

1. Как из AutoCAD установить связь с MS Word?

2. Какая функция позволяет вывести свойства и методы объекта Application?

3. Какая функция позволяет извлечь значения свойств объекта?

4. Какая функция позволяет изменить значения свойств объекта?

5. Каков алгоритм создания "Пояснительной записки" в MS Word из AutoCAD?

6. Каков алгоритм создания "Спецификации" в MS Excel из AutoCAD?

Внимание! Если Вы увидите ошибку на нашем сайте, выделите её и нажмите Ctrl+Enter.

© Национальный Открытый Университет "ИНТУИТ", 2021 | www.intuit.ru


 

Национальный Открытый Университет "ИНТУИТ": www.intuit.ru

Валерий Пакулин


Поделиться с друзьями:

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.026 с.