Опубликован: 21.02.2012 | Доступ: свободный | Студентов: 2067 / 505 | Оценка: 4.20 / 4.40 | Длительность: 19:35:00
Специальности: Разработчик аппаратуры
Лекция 10:

Интеграция приложений

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

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

Диалоговое окно "Ввод фамилии пользователя"

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

Окно MS Word

Рис. 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?
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub