MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_01C89329.8D940750" Данный документ является веб-страницей в одном файле, также называемой файлом веб-архива. Если вы видите это сообщение, значит, данный обозреватель или редактор не поддерживает файлы веб-архива. Загрузите обозреватель, поддерживающий веб-архивы, например Windows® Internet Explorer®. ------=_NextPart_01C89329.8D940750 Content-Location: file:///C:/2D693E50/Lesson10.htm Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="windows-1251"
Урок 10. = span>Интеграция приложений
<=
/span> 1. Создание
документа MS <=
span
style=3D'mso-no-proof:yes'>Word 2003
Техно=
логия
COM<=
span
style=3D'mso-bookmark:_Toc190054325'>=
1
Объект
Application=
2
Семей=
ство
Documents=
3
Объект
Document=
3
Объек=
т Range=
. =
4
Пример
формирования документа=
4
Загру=
зка
приложений=
6
2.=
span> Чтение
таблицы MS EXCELL 2=
003=
. =
7
Метод=
ы и
свойства приложения MS Excel 2003<=
/span>=
. =
7
Текст
основной LISP-функции=
8
Тексты
вспомогательных программ=
12
Анализ
программ=
14
Фирма Microsoft разработала модель COM (= span>Component Object Model — модель компонентных объектов). Модель позволяет связы= вать самые разнородные приложения. Построенный на спецификации этой модели программный комплекс предоставляет описание своих компонентов и средств дос= тупа к ним другим программам. Это дает возможность проектировать такие системы, в которых одни приложения (приложения-клиенты) обращаются к другим приложениям (приложениям-серверам) для выполнения некоторых операций, специфичных для приложений-серверов. При этом приложение-сервер может запускаться в видимом режиме (для него открывается свое окно) или в невидимом режиме (приложение работает в оперативной памяти, не открывая своего окна).
Приложения, поддерживающие технологию COM, при установке за= носят в реестр Windows информацию о себе, о своих компонентах и объектах. Так, например, имя приложения (ProgID), под которым оно может быть вызвано как приложение-сервер, заносится в реестр в раздел HKEY_CLASSES_ROOT.
На рис. 10.1 показано окно редактора реестра (Пуск — Выполнить — Re= gedit). Установленная версия AutoCAD зарегистрирована как AutoCAD.Application.17.1. Под таким именем нужно создавать (загружать= в оперативную память) объект приложения AutoCAD 2008, если вы будете обращаться к нему из приложения-клиента.
Рис. 10.1. Окно редактора реестра
В реестре также находится информация о том, как можно обратиться к любому зарегистрированному объекту, и какие методы к нему применимы.=
Рассмотрим пример использования технол= огии COM. Создадим прямо и= з AutoCAD документ Word. Приложение Microsoft Word 2003 в реестре и= меет регистрацию как “<= span style=3D'mso-bookmark:_Toc190054325'>Wo= rd.= Application.11”. Для раб= оты с этим приложением необходимо иметь в оперативной памяти экземпляр приложения. Если он загружен и уже находится в памяти, то нужно с ним просто соединитьс= я. Иначе требуется создать в памяти новый объект-приложение. При этом необязат= ельно, чтобы он был виден на экране.
Установления связи с
= ·&nb= sp; vlax-create-object —= создание нового объекта;
= ·&nb= sp; vlax-get-object — со= единение с существующим в памяти объектом;
= ·&nb= sp; vlax-get-or-create-object= span> — проверка существования объекта и соединение с существующим, — при его отсутствии создание нового экземпляра приложения.
Создадим VLA-объект приложения= Word 2003 с помощью следующего выражения:
(setq q=
_ow (vlax-get-or-create-object
“Word.Application.11”))
Переменную q_ow= рекомендуется делать глобальной. По окончании использования нужно освободить занимаемую ею память с помощью функции vlax-release-object. При неправильном освобождении COM-объекты могут ост= аваться в памяти (причем они могут быть невидимы), что приведет к проблемам. В данн= ом уроке для удобства отслеживания такие переменные будут сопровождаться префи= ксом g_.
Для вывода свойств и методов объекта <= /span>Application можно пользоваться функцией
(
Наличие второго параметра T = в этом выражении означает вывод не только свойств, но и методов объекта g_ow. Функция возвратит свойства объекта приложения Word 2003 и его методы. Для извлечения значений свойств объек= та следует пользоваться функцией vlax-get-property, например:
(setq vers (vlax-get-property g_ow “Version”)) или
(setq vers (vlax-get-property g_ow ‘Version=
)).
Для изменения свойств объекта использу= ется LISP-функция:<= /span>
(
Это выражение делает окно приложения (= т.е. объект g_ow) видимым.= По умолчанию окно приложения невидимо.
При вызове методов с помощью функции <= /span>vlax-invoke-method должно быть два основных параметра: пе= рвым должен быть объект, а вторым — имя метода. Например:
(= vlax-invoke-method g_ow ‘ListCommands :vlax-true)
Данное выражение формирует новый докум= ент с таблицей, в которой приведены команды Word 2003 (примерно 25 страниц тек= ста).
Все открытые документы являются элемен= тами семейства Documents. Доступ к нему можно получить из объекта Application с помощью свойства <= span style=3D'mso-bookmark:_Toc190054325'>Documents:
(setq g_docs (vlax-get-property g_ow ‘Documents))
Перечислим свойства семейства <= /span>Documents Word 2003
;Property values (RO=3DReadOnly)):
; Application (RO) =3D
#<VLA-OBJECT _Application 09672214>
; Count (RO) =3D 0
; Creator (RO) =3D 1297307=
460
; Parent (RO) =3D VLA-OBJE=
CT
_Application 09672214>
; NewEnum (RO) =3D #<IU=
nknown
096e150>
;Method supported:
; Add (4)
; CanCheckOut (1)
; CheckOut (1)
; Close (3)
; Item (1)
; <= /span>Open (16)
; <= /span>Save (2)
Каждый из открытых текстовых документов является объектом типа Document. Дост= уп к активному документу получается путем извлечения значения свойства = span>ActiveDocument объекта = Application. Для создания нового документа необходимо к семейству Documents применить метод = Add:
(setq g_doc (vlax-invoke-method g_docs ‘Add=
))
В этом выражении использован простейший вариант создания нового документа без дополнительных аргументов. Новый доку= мент создается со свойствами по умолчанию и по стандартному шаблону.
Объект = Range используется в качестве рабочего диапазона документа Word. Диапазон может = иметь любой размер от нуля символов до всего документа. Ноль символов фактически обозначает ту позицию курсора, перед или после которой будет добавляться те= кст.
Метод = Range, с помощью которого можно создать объект = Range, присутствует у разных объектов Word. Нас будет интересовать объект Range в текущем документе:
(setq g_r (vlax-invoke-method g_docs ‘Range 0 0))
В этом выражении создан диапазон, начинающийся в позиции 0 (вначале документа). Относительно этой позиции дал= ее будут выполнены какие-то операции.
В приведенном ниже листинге приведен п= ример создания нового документа Word. В этот документ выводятся несколько заголовков, разделе= нных символами конца абзаца.
Листинг 10.1. Функция writew11_co=
m
(defun writew11_com ( / _re)
(vl-load-com)
; Загружаем Word 2003 без открыты= х документов
(setq g_ow (vlax-get-or-create-object "Word.Application.11"=
;))
; Раскомментировать следующую строку,<= /span>
; если окно Word должно быть видимым= span>
;;;(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 "Строка один")
(vlax-invoke-method g_r 'InsertParagraphAfter)
(vlax-invoke-method g_r 'InsertAfter "Строка два")
(vlax-invoke-method g_r 'InsertParagraphAfter)
(vlax-invoke-method g_r 'InsertAfter "Строка три")
(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_doc=
s))
(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)
);defun
Создаваемое приложение имеет следующие особенности. Для хранения всех COM-объектов использованы только глобальные переменные. Это должно обеспечить их аккуратное освобождение и тем самым избежать потери памяти.
Функция writewll_com сначала создает объект приложения Word 2003 или соединя=
ется с
тем объектом, который был загружен заранее. Затем создается новый документ =
g_doc. В новом пустом документе формируется рабочий диапа=
зон
(объект класса
В начало диапазона с помощью метода = span>InsertBefore текст «Пояснительная записка» вставляется тем шрифтом, который действует в шаблоне по умолчанию. Тут же методом = span>InsertParagraphAfter в конец рабочего диапазона добавляют= ся два символа конца абзаца. Затем с помощью свойства Font создается объект = Font, который управляет шрифтом выделенного диапазона текста. Для установления требуемого шрифта используется редактирование значений свойств Name, Size, <= /span>Bold, Italic, Underline.
После формирования заголовка необходимо добавить три абзаца текста с новым шрифтом. Для этого с помощью свойства = span>End вычисляется позиция в конце документа и создается нов= ый рабочий диапазон <= span style=3D'mso-bookmark:_Toc190054325'>Range вначале = нулевой длины (вырожденный). Затем в его конец добавляются нужные куски текста (три фразы). С помощью объекта Font задаются = нужные свойства шрифта.
Документ сохраняется под именем D:\Temp\WordDoc.doc. Приложение Word 2003 закрывается=
. Вообще
говоря, необходимо было бы вначале программы создать признак того, что
приложение Word было загружено в память функци=
ей writewll_com. Только в случае, если признак имеет значени=
е T, только тогда закрыть Word.В конце программы освобождают=
ся
объекты и очищается память. Созданный документ показан на рис. 10.2.=
Если Word 2003 загружается только рассмотренной программой, то все выполнение по умолчанию идет в скрытом режиме. Окно MS Word не показывается на экране, но = файл сохраняется. Если требуется появление окна, то следует раскомментировать ст= року с изменением свойства Visible. Тогда на экране появ= ится окно MS Word (р= ис. 10.2).
Рис. 10.2. Окно MS Word, созданное как COM-объект
Часто желательно, чтобы приложение автоматически загру= жалось при старте системы Aut= oCAD или открытии чертежа. Для этого необходимо добавить ст= року на языке AutoLISP в файл acad.lsp= или acaddoc= .= lsp:
(load “exc_com2.vlx”)
Файл acad= span>.= lsp автоматически читается при начальной загрузке AutoCAD. Файл acaddoc.lsp = читается при открытии каждого чертежа-документа. Можно заставить систему читать файл= acad.lsp= также с каждым открытием нового чертежа. Для этого необходимо изменить значение 0 системной переменной ACADLISPASDOC на 1. Путь к фай= лам должен быть внесен в пути доступа к файлам поддержки.
Иногда требуется не только загрузить файлы-приложения = при открытии чертежа, но и начать их выполнение. Для этого в файлы acad.lsp = или acaddoc.lsp= нужно добавить строку обращения к главной функции нашего приложения:
(exc_com2)
Автоматической загрузкой LISP-функций при загрузке меню управляет файл с расширением .= mnl, аналогичный файлу acaddoc.lsp.
<= o:p>
Составленная выше программа с помощью COM-технологии устанавливает связь=
AutoCAD с
объектами MS
Однако текстовые документы из системы AutoCAD составляют редко. Чаще в ч=
ертеже
приходится создавать таблицу, например, спецификацию. Небольшие спецификации
иногда размещают непосредственно на чертеже. Большие спецификации размещают=
на
специальных листах. Удобно составлять спецификации в программе MS=
Excel. Но тогда возни=
кает
вопрос о переносе этих данных в рисунок AutoCAD. Возможен, конечно, импорт таблицы из MS Excel, так же, как и =
экспорт
данных из рисунка Auto=
CAD
в таблицу MS
С помощью реестра определим, под каким именем следует =
в COM-технологии обраща=
ться к
приложению MS Excel 20=
03 (рис. 10.3).
<= o:p>
Рис. 10.3. Определение имени MS Excel 2003 в реестре<= /p>
Имя этого приложения Excel.Ap= plication.11. Последняя установленная на компьютере версия MS Excel 2007 имеет имя Excel.Ap= plication.12. Если пользоваться строкой Excel.Application, то опера= ционная система сама выбирает последнюю из установленных версий.
Запустите из командной строки следующую команду:
(=
vlax-dump-object
(vlax-get-or-creare-object “Excel.Application.11”) T)
<= o:p>
В текстовом окне будет выдан длинный перечень свойств и методов объекта Excel<= /span>. В список свойств включены и дочерние свойства объекта. В списке методов указывается максимально допустимое количество аргументов этих методов.
Предположим, что данные для таблицы спецификации, кото= рую мы должны начертить в рисунке AutoCAD, размещены в файле d:\r16\readex11.xls (рис. 10.4). Из рисунка видно,= что данные располагаются на листе «Спецификация» книги Excel. Кроме этого листа в книге содержатся другие листы: Проекты, Расходы, Материалы. Поэтому программа дол= жна открыть книгу и перелистать листы.
В листе «Спецификация» для облегчения программирования введены дополнительные данные, которые уточняют характеристики будущей табл= ицы деталей, создаваемой в чертеже AutoCAD. В первой строке в ячейке А1 дано количество деталей, т.е. строк таблицы без= учета заголовка. В ячейке В1 указано количество столбцов таблицы (5). Вторая стро= ка содержит размеры столбцов по ширине в мм (30, 70, 30, 40, 40). Третья строка уточняет тип данных, которые располагаются в соответствующем столбце (int — целое, real — вещественное, = srt — текст). При выв= оде чисел будем выравнивать их вправо и писать один знак после точки. Четвертая строка содержит названия колонок таблицы. Все текстовые данные, в том числе заголовки колонок, будем выравнивать влево.
Аргументами программы установим следующие данные:
·&nb= sp; имя xls-файла (d:\r16\readex.xls);
·&nb= sp; название листа в файле (Спецификация);
·&nb= sp; высота строк таблицы (5 мм);
·&nb= sp; высота букв в таблице (3 мм).
<= o:p>
Рис. 10.4. Окно просмотра книги MS Excel
Ниже приведена программа связи AutoCAD — MS Excel 2003.
Листинг 10.2. Функция readex11_com<= /span>
;=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D
; Программа COM-связи AutoCAD - Microsoft Excel 2003
;=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D
; Вычерчивание таблицы по данным из книги Excel
; Используются текущий слой, текущий цвет и создаваемый стиль таблиц
;
; Аргументы:
; tb_xls - и= мя файла книги Excel;
; sheetname = - имя листа;
; hcell - вы= сота ячейки таблицы;
; hlet - выс= ота букв текста таблицы;
; show - при= знак показа Excel во время работы (T или nil)
;
; Глобальные переменные:
; g_oex - VL= A-объект приложения Excel 2003;
; g_wkbs - VLA-объект семейства Workbooks;
; g_awb - VL= A-объект активной книги;
; g_shs - VL= A-объект семейства Sheets;
; g_mainsh - VLA-объект нужного листа книги;
; g_cell - VLA-объект ячейки.
;
; Примеры обращения к программе:
; (readex11_com "d:\\r 16\\readex11.xls" "Спецификация" 8.0 5.0 T)
; (readex11_com "d:\\r 16\\readex11.xls" "Спецификация" 5.0 3.0 nil)
;=
(=
defun
readex11_com (tb_xls sheetname hcell hlet show / nlines ncolumns
<=
span
style=3D'mso-spacerun:yes'> table_items i j row pt0 widths types he=
aders
val msp tbl old_echo)
; Подгрузка библиотек, обеспечивающих работу с ActiveX=
(vl-load-com)
; Отключение эхо-вывода
(=
setq
old_echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
;
; Установление связи c Excel
(=
ex11_set_connect
show)
;=
Указатель семейства Workbooks
(=
setq
g_wkbs (vlax-get-property g_oex "Workbooks"))
; Открытие файла (книги) и получение указателя книги= p>
(=
setq g_awb
(vlax-invoke-method g_wkbs "Open" tb_xls))
; Проверка открытия файла
(if (not g_awb)
(progn
(alert (st= rcat "Не обнаружен файл " tb_xls))
(ex_break_= connect)
(exit)
)
)
; Чтение списка листов; не обязательно активизировать = нужный
(=
setq g_shs
(vlax-get-property g_awb "Worksheets"))
; Указатель на лист с нужным именем
(=
vlax-for s
g_shs (if (=3D sheetname (vlax-get-property s "Name"))(setq g_mai=
nsh
s)))
(=
if (not
g_mainsh)
<=
span
style=3D'mso-spacerun:yes'> (progn
<=
span
style=3D'mso-spacerun:yes'> (alert (strcat "Не обнаружен лист &q=
uot;
sheetname))
<= span style=3D'mso-spacerun:yes'> (ex_break_connect)
(exit)
)
)
;
; Чтение количества строк в будущей таблице спецификац= ии
; (из ячейки = A1 листа Excel), без учета строки заголовков
(=
setq
g_cell
<=
span
style=3D'mso-spacerun:yes'> (vlax-variant-value (vlax-invoke-method
g_mainsh "Evaluate" "A1")))
(=
setq
nlines
<=
span
style=3D'mso-spacerun:yes'> (fix (vlax-variant-value (vlax-get-prop=
erty
g_cell "Value"))))
(=
vlax-release-object
g_cell)
; Чтение количества столбцов в будущей таблице специфи= кации
; (из ячейки = B1 листа Excel)
(=
setq
g_cell
<=
span
style=3D'mso-spacerun:yes'> (vlax-variant-value (vlax-invoke-method
g_mainsh "Evaluate" "B1")))
(=
setq
ncolumns
<=
span
style=3D'mso-spacerun:yes'> (fix (vlax-variant-value (vlax-get-prop=
erty
g_cell "Value"))))
(=
vlax-release-object
g_cell)
;
; Получение списка элементов таблицы (ряды 2,3,4, ... = Excel)
; Ряд 2 - ширины столбцов в мм
; Ряд 3 - заголовки столбцов
(setq table_items nil j 1)
(=
repeat (+
nlines 3)
<=
span
style=3D'mso-spacerun:yes'> (setq row nil j (1+ j) i -1)
<=
span
style=3D'mso-spacerun:yes'> (repeat ncolumns
<=
span
style=3D'mso-spacerun:yes'> (setq i (1+ i))
<=
span
style=3D'mso-spacerun:yes'> (setq g_cell
<=
span
style=3D'mso-spacerun:yes'> (vlax-variant-value
<=
span
style=3D'mso-spacerun:yes'> (vlax-invoke-method
<=
span
style=3D'mso-spacerun:yes'> g_mainsh
<=
span
style=3D'mso-spacerun:yes'> "Evaluate"
<=
span
style=3D'mso-spacerun:yes'> (strcat (chr (+ i (ascii
"A"))) (itoa j))
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> (setq row
<=
span
style=3D'mso-spacerun:yes'> (append
<=
span
style=3D'mso-spacerun:yes'> row
<=
span
style=3D'mso-spacerun:yes'> (list
<=
span
style=3D'mso-spacerun:yes'> (vlax-variant-value
<=
span
style=3D'mso-spacerun:yes'> (vlax-get-property g_cell
"Value")
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> (vlax-release-object g_cell)
<=
span
style=3D'mso-spacerun:yes'> );repeat ncolumns
<=
span
style=3D'mso-spacerun:yes'> (setq table_items (append table_items (=
list
row)))
);repeat nlines
;
; Закрытие и выгрузка Excel
(ex_break_connect)
;
; Запрос точки левого верхнего угла таблицы
(=
setq pt0
nil)
(=
while
(null pt0)
<= span style=3D'mso-spacerun:yes'> (setq pt0 (getpoint "\nТочка левого верхнего угла таблицы: "))
);while
;
; Список ширин колонок и список типов данных
(=
setq
widths (nth 0 table_items) types (nth 1 table_items))
;=
(=
setq msp
(vla-get-ModelSpace (vla-get-activeDocument (vlax-get-acad-object))))
; Создание стандартной таблицы с колонками равной шири= ны
(=
setq tbl
(vla-AddTable msp (vlax-3d-point pt0) (+ 2 nlines) ncolumns hcell (car
widths)))
; Корректировка ширин столбцов
(setq i -1)
(=
repeat
ncolumns
<=
span
style=3D'mso-spacerun:yes'> (setq i (1+ i))
<=
span
style=3D'mso-spacerun:yes'> (vla-SetColumnWidth tbl i (nth i widths=
))
)=
<= o:p>
;=
Заголовок таблицы
;=
Высота букв
(=
vla-SetTextHeight
tbl acTitleRow hlet)
; Текст
(vla-SetText tbl 0 0 "Спецификация")
;
; Заголовки колонок
; Высота букв
(vla-SetTextHeight tbl acHeaderRow hlet)
(=
setq
headers (nth 2 table_items) i -1)
(=
repeat
ncolumns
<=
span
style=3D'mso-spacerun:yes'> (setq i (1+ i))
<=
span
style=3D'mso-spacerun:yes'> (vla-SetText tbl 1 i (nth i headers))
)=
;
;=
;=
Вписывание элементов таблицы=
;=
Высота букв
(=
vla-SetTextHeight
tbl acDataRow hlet)
(=
setq j 2)
(=
repeat
nlines
<=
span
style=3D'mso-spacerun:yes'> (setq j (1+ j) i -1)
<=
span
style=3D'mso-spacerun:yes'> (repeat ncolumns
<=
span
style=3D'mso-spacerun:yes'> (setq i (1+ i) val (nth i (nth j
table_items)))
<=
span
style=3D'mso-spacerun:yes'> (if (=3D "str" (nth i types=
))
<=
span
style=3D'mso-spacerun:yes'> (progn
<=
span
style=3D'mso-tab-count:1'> (vla-SetText tbl (1- j) i val)=
<=
span
style=3D'mso-spacerun:yes'> ; Выравнивание в
ячейке
<=
span
style=3D'mso-spacerun:yes'> (vla-SetCellAlignment tbl (1- j) i
acBottomLeft)
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> (progn
<=
span
style=3D'mso-tab-count:1'> (vla-SetText tbl (1- j) i (rto=
s val
2 1))
<=
span
style=3D'mso-spacerun:yes'> ; Выравнивание в
ячейке
<=
span
style=3D'mso-spacerun:yes'> (vla-SetCellAlignment tbl (1- j) i
acBottomRight)
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> );repeat ncolumns
)=
;repeat
nlines
;=
;=
Восстановление режима эхо-вывода
(=
setvar
"CMDECHO" old_echo)
;=
(=
redraw)
(princ)
)
Примеры обращения к программе показаны в комментарии. В обращении нужно указать фактические аргументы основной функции.
Листинг 10.3. Функция ex11_set_connect
; Установка связи с Excel 2003
; Аргумент:
; vis =3D T = - сделать Excel видимым;
; vis =3D ni= l - сделать Excel невидимым.
;=
(=
defun
ex11_set_connect (vis / )
<=
span
style=3D'mso-spacerun:yes'> (setq g_oex (vlax-get-or-create-object
"Excel.Application.11"))
; Если связь не установлена, то аварийно завершить раб= оту
(if (null g_oex)
<=
span
style=3D'mso-spacerun:yes'> (progn
<=
span
style=3D'mso-spacerun:yes'> (alert "Невозможно запустить Microsoft Excel 2003")
<= span style=3D'mso-spacerun:yes'> (exit)
)
);if
; Сделать Excel видимым в зхаисимости от параметра vis=
(if vis (vlax-put-property g_oex
"Visible" :vlax-true))
)
Листинг 10.4. Функция ex_break_connect
; Разрыв связи с Excel и выгрузка из памяти
(=
defun
ex_break_connect ( / )
<=
span
style=3D'mso-spacerun:yes'> (vlax-invoke-method g_oex "Quit&qu=
ot;)
<= span style=3D'mso-spacerun:yes'> ; Освобождаем объекты, связанные= с Excel,
; для корректной выгрузки Excel из памяти
(mapcar
<=
span
style=3D'mso-spacerun:yes'> (function (lambda (x)
<=
span
style=3D'mso-spacerun:yes'> (if
<=
span
style=3D'mso-spacerun:yes'> (and x (not (vlax-object-released=
-p
x)))
<=
span
style=3D'mso-spacerun:yes'> (vlax-release-object x)
<=
span
style=3D'mso-spacerun:yes'> )
<=
span
style=3D'mso-spacerun:yes'> ))
<=
span
style=3D'mso-spacerun:yes'> (list g_cell g_mainsh g_shs g_awb g_w=
kbs
g_oex)
<=
span
style=3D'mso-spacerun:yes'> )
;=
Сборка мусора
<=
span
style=3D'mso-spacerun:yes'> (setq g_cell nil g_mainsh nil g_shs nil=
g_awb
nil g_wkbs nil g_oex nil)
<= span style=3D'mso-spacerun:yes'> (gc)
)
Перед выполнением операции загрузите все три программы= , а затем запустите основную функцию 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= =3D8.0, hlet=3D5.0)
<= o:p>
Рис. 10.6. Таблица (hcell=3D5.0, hlet=3D3.0)
После установки связи с MS Excel 2003 основная программа вычисляет последовательно указатели:
g
g
g
g
g
Затем с помощью метода Evaluate читаются значения, записанные в листе Спецификация в ячейках А1 и В1= :
nlines — количество строк или деталей;
ncolumns — количество столбцов в будущей таблице.
Поскольку метод Ev= aluate возвращает значение типа Variant, то для его сохранения в виде обычного целого числа применяется преобразован= ие типа с помощью функции vlax-= variant-= value.
Применяя далее тот же метод Evaluate сканируем строки 2-10 листа Спецификация и получаем сп= исок table_items из девяти элементов. Каждый элемент также является спи= ском из пяти значений:
(30.0 70.0 30.0 40.0 40.0) (“int” “str” “re= al” “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)<= /p>
(14.0 “Рама” 35.0 “A” 8.0) (16.0 “Накладка” 10.0 “С” 1.0)
Первый элемент списка table_= items (ширина столбцов) сохраняется для удобства в переменно= й width, второй элемент (типа зна= чений по столбцам) — в переменной types= span>, а третий (заголовки столбцов) — в переменной headers.
Из списка видно, что все значения, являющиеся как вещественными, так и целыми числами, представлены в вещественном виде. Поэт= ому при вписывании их в таблицу нужно пользоваться типами “int” или “real”.
После формирования table_= items программа ex_= break_= connect закрывает соединение с табличным процессором Excel и выгружает его= из памяти. При этом проверяется, какие сформированы глобальные переменные, содержащие указатели объектов Excel. Их объекты аннулируются с помощью функции vlax-= release-= object. Это позволяет избежать неприятного процесса, когда приложение Excel не удаляется из памяти. При повторениях процесса количество неудаленных экземпляров приложения растет и может исчерпать всю оперативную память на компьютере.
Далее интерактивно запрашивается точка р0, в которую будет помещен ве= рхний левый угол таблицы спецификации деталей. Цикл, организованный с помощью фун= кции while, исключает возможно= сть пустого ввода нажатием на клавишу Enter= . Это можно было бы обеспечить применением функции initget.
Сначала с помощью метода AddTable строится пустая таблица с колонками одинаковой ширины.= Затем с помощью метода SetColumnWidth<= /span> задаются нужные ширины.
Заполнение ячеек данными выполняется в три шага:
·&nb= sp; с помощью метода SetTextHeight задается= высота букв текста;
·&nb= sp; с помощью метода SetText задается сам т= екст;
·&nb= sp; с помощью метода SetCellAlignment задае= тся выравнивание в ячейке.
Для заголовков таблицы и колонок дополнительное выравн=
ивание
не выполняется. Используемое по умолчанию выравнивание
· =
acTitleR=
ow — для заголовка табл=
ицы;
· =
acHeader=
Row — для заголовков кол=
онок;
·&nb= sp; acDataRo= w — для ячеек с данными.
Приведенные программы удобны тем, что в самом файле Excel можно задать та=
кие
параметры настройки таблицы, как количество и тип элементов, ширину столбцо=
в и
др. В самой программе можно проводить более тщательный разбор значений,
занесенных предварительно в книгу Excel.
Источни= к:
Н.Н. По= лещук, "AutoCAD: разработка приложений, настройка и адаптация", издатель= ство "БХВ-Петербург", 2006