ЧАСТЬ
IV
.ru/CAD
Разработка прикладных программ Глава 24. Глава 25.
Разработка набора инструментов для программистов Программы общего назначения
Глава 26.
Формирование специализированных программ из универсальных функций
Глава 27.
Примеры программ для архитектурно-строительной части
Глава 28.
Программы для "генпланистов" и топографов
Глава 29.
Несколько программ для сантехников
Глава 30.
Вывод чертежа на бумагу
Глава 31.
Несколько примеров расчетных программ
Глава 32.
Спецификации оборудования
Глава 33.
Элементы документооборота
Глава 34.
Интеграция САПР и ГИС
Г Л А В А 24
Разработка набора инструментов для программистов Этой главой мы открываем часть W нашей книги, посвященную разработке прикладных программ. По русской припычке мы "долго запрягали", разрабатывая бесчисленные вспомогательные функции. Теперь нам предстоит "быстро ехать", т. е. выдавать продукцию в ииде программ для конечного пользователя. Однако, как мы уже писали в главе II, первыми пользователями будем мы сами — разработчики системы. Прежде всего мы позаботимся об автоматизации собственного труда по разработке и сделаем для себя небольшой "сундучок" с инструментами разработчика. Многие из них мы уже реализовали и виде функций, осталось их вставить в меню системы. Все инструменты разработчика мы будем размещать в разделе меню Профи, закрывая их от доступа низкоквалифицированных пользователей, чтобы они по неосторожности и сами не "порезались", и окружающую обстановку не испортили. В этой главе мы приведем программы, которыми сами чаще всего пользуемся и очень простые, и достаточно сложные.
Редактирование меню На этапе разработки нам часто придется редактировать меню. Чтобы не блуждать по системе каталогов, напишем простую функцию для загрузки файла шаблона меню в текстоцый редактор {листинг 24.1). Функция перегрузки меню после редактирования с u -menu- re load была описана в главе 13. \ ЛИСТИНГ 24.1. Функция ru-menu-edit (defun ru-menu-edit ',/ reg_key editor)
Используем встроенную функцию, т. к. не требуется запускать редактор в модальном режиме (stactapp
(cu-spp-txt-editor] (ru-flie-template "ruCAD.mnu")I
Часть IV. Разработка прикладных программ
778
Переключатели режимов в меню У нас имеется несколько глобальных переменных, определяющих режим работы системы. Для переключения значений этих переменных (рис. 24.1) разработаем соответствующую диалоговую функцию (листинг 24.2). Е
Листинг 24.2. Функция ru-var- check -dig ;defun ru-var-check-dlg (/ var__values ) (If (setq var_values (ru-dlg-showcheck-list "Установка переключателей" (list "Вывод отладочных сообщений" "Предварительная справка" "Редактирование XML" "Режим разработчика" } ;_ end of list (list *rij_msg_debug* * r u_pr e vi e whelp * *ru_xml_edit*
* r u__de ve 1 ope r * 1 ;_ end of list (list Т Т (ru-user-may-xml-edit) (ru-user-may-develop) ) ) ;_ end of ru-dlg-show-check-list ) ,-_ end of satq [mapcar ' tu-var-set-var (list "*ru__msg_debug*" "*ru_previewhelp*" "*ru_xml__edit*"
I ,-_ end of mapcsr ) ;__ end of if (princ) ) ; end of defun
Установил переключите пей v В ырад огла
с.ная cr, :i a
ОК
Отмети
Рис. 24.1. Пере1спючение режимов работы
Глава 24. Разработка набора инструментов для программистов
779
Установка режима работы с запоминанием для текущего пользователя реализована в функции, показанной в листинге 24.3. : I " •" I Листинг 24.3. Функция ru-vmr-set-var
"
1
Idefun ru-vac-set-vsr {svar value) ;;Пример (ru-var-set-var "*ru_rasg_debug''" T] [set (read svar} value), •_ end of set (ru-user-write-last-pararo svar (itoa ( ru-conv- value- to -viordbool value})} value
Массовые операции с файлами Очень часто приходится выполнять рутинные операции с большим числом примитивов. Иногда это нужно проделать и со множеством файлов. Типичным примером является конвертирование файлов, созданных в DOS-версиях системы AutoCAD. Еще одним примером может служить операция, которую нам приходилось проделывать с несколькими тысячами файлов топографических планшетов. С каждым файлом, созданным в системе AutoCAD RIO. нужно было проделать такие манипуляции: D конвертировать каждый файл в WIN -кодировку с изменением всех надписей и имен именованных объектов; П изменить имена слоев и блоков по новому стандарту классификатора; D "нормализовать" определения блоков и примитивов — примитивы блоков перенести на слой 0 с цветом BYBLOCK (ПОБЛОКУ), ивет всех примитивов установить BYLAYER (ПОСЛОЮ), изменить цвета слоев на стандартные; 3 вычислить новое имя файла планшета в соответствии с системой разграбки планшетов; П вычислить имена восьми примыкающих планшетов, определить, есть ли они в наличии, а если есть, то нарисовать на специальном слое рамки планшетов и привязать к рамкам гиперссылки на эти планшеты; О изготовить для каждого планшета по два DWF-файла (с полным набором слоев для служебного пользования и с сокращенным набором слоев для публика аии в Интернете); 3 записать все файлы в соответствующие каталоги; П сгенерировать HTML-файлы для публикации DWF и Интернете. Разумеется, вручную проделать это было немыслимо, поэтому пришлось написать несколько специальных функций и единственную программу. При разработке системы mCAD нам приходится выполнить много подобных действий, В основном это вызвано переходом на "стандарт ruCAD" по именованию слоев и блоков. Блоков и библиотек блоков мы используем много, не исключено пополнение их из посторонних источников, которые также нужно нормализировать. Изредка нам придется использовать и файлы в DOS-кодировке, потребуются и функции для конвертирования.
780
Часть IV. Разработка прикладных программ
Методика обработки списка файлов Для операций с несколькими файлами часто используют механизм сценариев (пакетов). В ранних версиях AutoCAD сценарии были единственным способом автоматизации работы. В более поздних, например, н незабвенной системе AutoCAD R I O , также были единственным средством автоматизации при выборе из "черного меню 1 ", в современных версиях механизм сценариев программистами используется редко. Мы даже не упоминали его в паве 9 при обсуждении инструментов разработч и к а . В некоторых ситуациях сценарии могут оказаться незаменимым инструментом (например, в AutoCAD LT). Имеется значительное количество пользователей системы AutoCAD, принципиально автоматизирующих свою работу только с помощью "штатных" команд и иных средств адаптации AutoCAD, включая сценарии 2 . Недостаток механизма сценариев проистекает из его преимущества — сценарий представляет собой записанную в файл последовательность инструкций, которые должны быть введены в командной строке для выполнения задачи. Заметим именно абсолютно точную и правильную последовательность, не допускающую ни одного лишнего или недостающего символа, да еше с учетом того, что при любой ошибке или неправильно предсказанной ситуации работа сценария будет прервана. Добиться .этого несложно в простых ситуациях1, а для "хитрых" задач требуется и "хитрый" сценарий. Разумеется, сценарий можно сгенерировать, но в этом случае проще разработать программу, которая просто будет выполнять требуемые действия, но с использованием всей мощи систем программирования. Про сценарии мы упомянули потому, что разработчики часто не догадываются, как из программы, запущенной в адресном пространстве одного документа, обработав другие документы — именно в такой ситуации вспоминают про язык сценариев. Однако задача решается достаточно просто и можно написать единстненную базовую функцию (листинг 24.4), с помощью которой выполняются любые операции с любым количеством файлов. Функции передаются аргументы: 3 Eirst_message — предупреждающее сообщение перед запуском массовых операций иди nil, если предупреждения не требуется: G fiies_iist — список полных имен обрабатываемых файлов; G test__fur;c — ИМЯ тестовой функции, выводящей сообщение first_message И Проверяющей возможность начала обработки файлов по списку; П quoted_func — имя функции, выполняющей операцию с именем одного файла из списка. Листинг 24,4. Функция ru-batcb-file-operations :defuri ru-batch-file-operations (first^inessage files_list teet_fuuc quoted_func / do it) 1
Главное меню AutoCAD ранних версий, ш во див те ее я в текстовом режиме. Пункты этого меню выбирались ЕШОДОМ номера пункта. г 1 Сторонникам такого подхода рекомендуем очень интересную книгу Свет В. Л. AutoCAD язык макрокоманд и создание кнопок. — СПб : БХБ-Петербург, 2004. - Очень nony.iiipiibi были сценарии с единственно» строкой, в которой был записан символ 1 или 2 — для действий из "черного меню".
Глава
24.
Разработка
набора
инструментов
для
программистов
_
781
[if (not first_messagel [sstq do_it t: isetq do_it ( (eval test_func) first_roessage) j ) ;_ end of if ;if do_it (mapcar quo ted_f uric f i l e s _ l i 5 t } | [princ; ) ;_ enU of
С файлами могут производиться любые операции, не обязательно требуюшие открытия самих файлов. Вот пример использования, не имеющий практического смысла, но иллюстрирующий механизм работы функции: [ru-batch- file-operations (£trcat "Вывод списка файлов" '"^ПОЛЬЗОВАТЬСЯ ОСТОРОЖНО !\п\пБувем делать") (list "с: \\.ru\\ru-lib-bolt.dwg" "с: \\.ra\4ru-lib-builcl.dwg" "с : \ \ . ru\\tu-lib-car . dwg" ) 'ru-yes ' p r i n t !
В этом примере основной функцией, выполняющей операции, является print, т. е. в этом случае будут просто выведены имена файлов. Тестовая функция ru-yes выведет предупреждающее сообщение, и если будет нажата кнопка Да, то опасная операции печати списка будет выполнена. Разумеется, нам нужны функции, делающие что-то полезное, и их можно разработать сколько угодно, главное, чтобы в момент выполнения функции ru-batcn-fiieoperations и тестовая, и основная функции были определены. Далее разберем пример программы для массовых операций над файлами — "нормализацию" библиотек блоков.
Нормализация файлов Мы договаривались, что блоки, используемые в системе rnCAD, должны состоять из примитивов, находящихся на слое 0 и имеющих цвет ByBlock (ПОБЛОКУ), а все тексты и атрибуты должны быть созданы стилем RU_CAD. Блоков у нас очень много, и в отдельных файлах, и в библиотеках, поэтому требуется программа для приведения их в "нормальное" состояние (листинг 24.5). | Листинг 24.5. Файл ru_pro_batchi_normal,lsp [defun START (/ files_listl [if (ru-user-action-enabled "DEVELOP" T) ; prog л [if (setq files_list (ru-dlg-file-seJ.ect-dwg-multi "Выбор файлов для нормализации" "" (ru-xiser-reacl-last-param "prG_batch_7iormal_dir" (ru-uset-wQrk-dir)
);
) ; _ end of ru~user- read- las t-patatn {ru-user-action-enabled "DEVELOP" nil; ) ,•_ snd of ru-dlg-file-select-dwg-inulti end of setq
782
Часть IV. Разработка прикладных программ (progri (ru-user-write-last-param "pro_batch_normal__dir" (vl- filename -directory (car files_list) I ; ,-__ end of ru-user-write-last-param ( ru-batch-f lie - operati ong (s treat "Программа перерабатывает выбранные файлы." "\nBce прииитивы, включая вложенные в блоки," " переносит на слои О" "\nBce стили переводит в RD_CftD" "ХпПОЛЪЗОВАТЬСЯ ОСТОРОЖНО' ХпТОЛЬКО ДЛЯ РИСУНКОВ, "ВСТАВЛЯЕМЫХ КДК БЛОКИ ' \пЕудем делать" files list 'ru-уеэ ' ru -batch -normal -block-lib
.
);_ end of progn ) ;_ end of if );_ end of progn );_ end of if [princ)
Главной здесь является функция га-batch-normal-block-lib (листинг 24.6). Она демонстрирует типовой алгоритм, применяемый нами для обработки посторонних DWG-файлов: 1. Создается новый пустой рабочий файл. 2. В него вставляется обрабатываемый файл в виде блока. 3. Производится требуемая обработка. 4. Обработанный блок вновь сохраняется в файл1. Б конкретных вариантах возможны нюансы (например, расчленение вставленного блока, запись в другой каталог, ведение LOG-файлов), но обязательным является дублированное несколько раз до и после обработки удаление "мусора", обеспечивающее постоянную "пустоту" рабочего файла. Листинг 24.6. Функция ru-batch-normal-block-lib ;dsf'jn ru-batch-normal-block-lib iblock_f lie / block_obj v l _ _ [princ (strcat "\nO6paQа(гываю " block_filej] ;;; Предварительная страховочная чистки мусора (vla-purgeall (ru-obj-get-active-docu-Ter.") ) [vla-purgeall (ru-obj-get-active-documentI; ;vla-purgeall (ru-obj-get-active-document)]
1
Только не забудьте, что мри этом будет сохранено только содержимое пространства модели обрабатываемого файла.
Глава 24. Разработка набора инструментов для программистов
^^^
;,-; Вставка обрабатываемого файла в виде блока (setq block_obj (ru-hlock-insert-obj block^file (list 0.0 0.0 0.0) 1110); ;;; Основная обработка [ ru-normal-al11 ;;; Создание резервной копии
!vl-file-copy block_file (ru-file-set-ext block__file ".bak"K -, i; Запись E файл [if (setq vla_sset_obj (ru-ss-entlast-to-vla-ssetH (vla-wblock (ru-obj-get-active-document) block_file vla__sset_pbj} [princ (strcat "ХпСЛИБКй. He создан набор для записи " block^file); );_ end of if ::; Удаление временного блока [ru-obj-delete-object block_obj) [vla-p'jrgeall (ru-ob] -get~acfive-document) ; ;vla-purgeall (cu-obj-get-active-dociiment)) (vla-purgeall (ru-obj-get~active-document); (vla-purgeall (ru-obj-get-active-document)) (vla-purgeall (cu-obj-get-actlve-document)) (prinC "\HrOTOEO\n")
)
Проследим, как выполняется обработка файла (листинги 24.7—24.10). I Листинг 24.7. Функция ru-normal-all [def'jn cu-normal-all I/ ent} (pcinc "\п0бравотка б л о к о в . . . " ) ;setq ent (tblnext "BLOCK" t ) I [while ent ini-normal-block-props (cdc (assoc -2 e n t ) ) ) iEetq ent (tblnext "BLCCK"}) (princ " . " ) );_ end of while lEetq ent (entnextl) Ipcinc "ХпОбработка примитивов...") [while ent (Eu-notmal-ant-props ent; [princ " .") (setg ent (entnext (cdt (assoc -1 (entget e n t ) 1 1 1 ) );_ end of while ); end of defun : Листинг 24.8. Функция ги-nomal-ant-props (defun tu-nonnal-ent-props (ent) ;;; Норнализаиия примитивов .(ru-ent-mod ent "0" S) {ru-ent-mod ent "RU__CAD" 7) (ru-ent-mod ent "BYBLOCK" 621
/83
Часть IV. Разработка прикладных программ
784
Листинг 24.9. Функция ru-normal-block-props (defun ru-normal-block-props lent; г ; ; Нормализация вложенных приыитиаив блока [while ent I ru-norraal-ent-props ent]
(seta ent (entnext (cdr (assoc -1 lentget e n t ) ) ) ) ) ) ; _ end of while
I Листинг24.Ю. Функция ni-ent-mod (defun xu-ent-mod (ent value bit / ent_li3t old_dxf new_dxf) ; i Изменение свойства примитива ent, заданного DXF-кодом bit, на новое значение
value •
(ru-ent-mod (car (entsel)) 100 37C) (rxi-ent-mod (entlast) "1" 9) ;setq ent_list (entget ent) new_dxf (cons bit (if (and (= bit 62) (= (type value) 'str)) (if (= (strcasc value) "BYLAYER") 255 0
);_ end of it value ) ;__ end of if );_ end of cons ) ;__ end of setq ;if (/= new_dxf (setq old_dxf (аззос b i t ent_list))) Ipcogn (entmod (if old_d>:f (subst new__dxf old_dKt ent_list) (append ent_list (list neu__dxf) ) );__ end of if I;_ end of entmod (entupd ent) !redraw ent) );_ end of progn i ; _ end of if ent
Используя приведенные функции в качестве прототипов, можно разработать программы для сколь угодно сложной обработки файлов.
Объектный доступ к другому документу Мы рассмотрели пример с обработкой файлов, загружаемых в Биле блоков. Этот способ имеет ряд недостатков, но главное преимущество в том, что все манипуля-
Глава 24. Разработка набора инструментов для программистов
785
ции мы производим и'з своей, уже загруженной программы, т. к. мы продолжаем работать в актинном документе. Возможен и вариант с "настоящей" загрузкой файлов и другие окна (если установлен многодокументный режим работы). В этом случае наша основная программа продолжает работать в пространстве имен прежнего "основного" документа, но может обрабатывать и другие документы объектными методами. Обычно мы должны другой файл загрузить и отдельное окно, как-то обработать, а затем сохранить и закрыть. Напишем функцию открытия файла (листинг 24.11), возвращающую VLA-объект открытого документа иди nil при неудаче. Листинг 24.11. Функция ;defun ru-Owg- open -other (dwtj_nain4; iru-error-catch [function (lambda 0 (vla-open (ru-obj-get-docs-collection) dwg_nainel ) ; _ end of lambda ! ; _ end of function [function [lambda ( x ) iprinc (street "\пОЩБКА RU-DWR-OP EM-OTHER: Нельзя открыть файл " dwg__nai!ie: ) ; _ end of princ nil ) ;_ end of lairbda ) ; _ end of function ) ; _ end of r j-error-catch ) ; _ ena of defun
Сохранить другой документ можно с помощью функции, приведенной в листинге 24.12. I Листинг 24.12. Функция m-dwg-save-other (dsfun tru-dwg-save-other (dug_obj awg_i-.ame) !r.i-error-caLch ( f u n c t i o n ;iambaa U (vla-save d w g _ o b j ) } ) ! function ! lambda i x ) iprinc (strcat T'\nOlEIEKfi RU-DHG-S«VE-OTHER: Нельзя сохранить файл " iwg^name) ):_ end of princ nil ! ; _ end of lambda ) ; _ end of function ) ,-_ end of ru-ercor-catch );
enfl of defun
786
_
Часть
IV.
Разработка
прикладныхпрограмм
И наконец, обработать другой документ можно с помощью функции, приведенной в листинге 24.13. 1
Листинг 24.13. Функция ru-dog-modify
[defun г u- dwg -modify (dwg_file exoresion / other_dug_obj ) ; ; Открыли другой документ (if fsetq other_dwo_obj ( ru- dwg -op en-other dwg_file)) [progn , i_ _ Что-то делаем. Для примера выведем имя документа, которое Судет напечатано в окне основного документа, а не того, который сткрьщи - -- .-_-_. . .. , _ ---- .__ . — __. — .____. . — . ---- ^|. [princ (strcat "ЧлОткрыт " (vla-get-fullnaine other__dwg__obj ] "\n")l г I
Во вноеь открытом документе мы можем выполнить только то, что доступно через объектную модель. Мы предусматриваем отправку Б командную строку любого выражения. Выполняться оно будет в "том" документе. fvla-sendcommand other dwg obj
После выполнения действий сохраняем и закрываем документ '.if (vla-get-saved other_dwg_obj ) (ru-clwg-save-other other_dwg_cb] dwg) ! ;_ end of if (vla-close other_dwg_obj t dwg} } ;_ end of progn );_ end of if I ;__ end of defun Эта функция не претендует на совершенство и разработана в демонстрационных целях. Мы показали, что можно сделать и универсальную обработку — достаточно правильно "сконструировать" строку, передаваемую посредством метода Sendcommand. В принципе, мы можем выполнить только такие же операции, как и из программ, написанных на Delphi или Visual Basic, но при этом имеем существенные преимущества: П в нашем распоряжении все удобства обработки данных в LISP; О в открытый документ уже загружена наша главная библиотека и в нем доступны все его функции. Не надо забывать, что функции, определенные в файле программы (а не и автоматически загружаемых библиотеках), в "том" документе недоступны. Одно из преимуществ компоновки даже редко используемых функций в главную библиотеку и заключается в их доступности во всех открываемых документах. При необходимости мы можем загрузить и любую программу. Более на этой методике мы задерживаться не будем, но читатели могут по этой схеме разрабатывать собственные, сколь угодно сложные программы.
Глава 24^ Разработка набора инструментов для программистов
757
Конвертирование файлов Рассмотрим интересующий многих процесс перекодировки файлов. О проблемах, методиках и мифах, связанных с конвертированием файлов, мы подробно писали а главе 4, сейчас попытаемся разработать программу перекодировки. Всего лишь попытаемся, потому что абсолютно надежных программ такого типа мы пока не встречали — каждая подобная программа, в том числе и наши прежние варианты, может обработать тысячи своих файлов, но сломаться на первом же постороннем файле, в котором имеются какие-то нюансы. Замечание
J
Попытавшись загрузить один из "древних" файлов в формате AutoCAD R12, мы получали сообщения об ошибке в какой-то строке какого-то СРР-файла, и прервать зацикленный вывод сумели только "варварским убийством" системы AutoCAD. Несколько раз получали и "любимое" сообщение error: Exception occurred: OxCOOOOOOS (Access Violation). Так --то учесть всю "чертовщину", которая может встретиться в файлах, невозможно. А искали мы хоть какой-то файл, в котором были бы и тексты, и именованные объекты, и символы UNICODE.
Начнем разработку с выделении и решения частных задач. Прежде всего надо уметь конвертировать отдельные символы, затем строки, далее разыскивать в файле все строки, включая все, где могут встретиться "буквы". Неплохо уметь конвертировать симиолы из DOS в WIN и обратно (иногда и это требуется, но для экономии места листинги не будем приводить), а также преобразовывать строки, которые система AutoCAD без спросу перевела в UNICODE —- они выглядят в виде символов косой черты с цифрами. Такие функции приведены в листингах 24.14 и 24.15. >
! Листинг 24.14. Функция ru-coriv-cam-chat [defun ru-conv-oem-char {ch / ;setq code (ascii ch.)) (chr (+ code (cond ( [<= 128 code ((<= 176 code («= 224 code [T 0] ),-_ end of cond ) ; __ end of + ) ; end of chr
code]
П5) 64) 223} -48; 2391 16]
i Листинг 24.15. Функция ru-oonv-oera-to-ansi [defun ru-coriv-Qem-to-ansi (str / st) ; | Конвертирование строки. Пример: (гтд-Conv-oeni-to-ansi ", з и e oj ;Е"-?Л" жЕвагб, ", -® д "миЕ^ле не§Г-|1"па"!
"В чащах юга жил-был цитрус, да, но фальшивый экземпляр"
"
1
!
Часть IV. Разработка прикладных программ
788
ХТОРОЖНО! Повторная перекодировка портит строку! Пример: ; г u-c onv-oem-1 o-a n s i "В чащах юга жил-был цитрус, да, но фачьоивый экземпляр") "' чршрх юур цшы-сыы цштрус, фр, эю фрыьаштыщ эъчхьяыяр" I; (setq st " " )
(while (< 0 (scrlen s t r ) ) [setq st (strcat st (ru-conv-oein-cfiar (substr str 1 1И1 str (substr str 2] !;_ end of setq );_ end of while st
!;
end of defun
Умея конвертировать строки, мы, вроде бы, можем и переименовать все, что требуется. Однако, нее не так просто. Попробуйте хотя бы переименовать командой RENAME (НОВОЕИМЯ) различные обьскты (рис. 24.2). Команда "жалуется" на неверное старое имя! Да про старое имя мы знаем, проверять нужно новое имя!!! К тому же "неправильные" имена отображаются во всех диалоговых окнах системы AutoCAD, а список их выводится нашей функцией: _-[•"
Р
"1)Ъ,"
Кстати, переведем их ради любопытства: [mapcar '{lambda iname) (ru-conu-oe.-ii--to-ansi name)! (cu-obj-list-layers) ) ("О" "СТЕН" "СТЕКП" "КАРН" "КРОВ" "ЦОК" "ДОР" "ПОЯС" "ОБОД" "СТ_Б" "ТРЙВ" "НЕБО" "ДЕРЕ" "РАМИ" "ЦВЕТЫ" "СТ_К" "ASHADE" "ЛИСТ"]
Слои явно создавал русский архитектор, но даже он имел полное право, работая в системе AutoCAD RI2, создавать такие имена. JJJD Darned Objects
Lmelypes text slyles UCSi Vie^porfs Views
• с
л' .•fir,
: ••;-. Reneme To 1
NEW IAYER
Рис, 24.2. Попытка переименования слоя
Глава 24. Разработка набора инструментов для программе то в _ 789 Подобная ситуация возникает со всеми именованными объектами, причем некоторые из них позволяется переименовывать, а некоторые — нет. Проверим старые имена функцией itnapcar '(lambda (name) (invalid name)) (ru-obj-l ist-layers) ) IT ni.1 ni.l Т nil nil nil nil ml n; 1 nil nil nil Т nil nil Т nil)
Вот где причина беды — некто в фирме Autodesk не придумал ничего лучшего, как проверить старые имена этой функцией. Может быть переименование можно выполнить объектными методами? Что же, попробуем. Напишем функцию, изменяющую имя VLA-обьекта (листинг 24.16). Встроенную функцию мы по традиции "обертываем" в спой обработчик ошибок, чтобы не происходила "ломка" основной программы из-за исключительных ситуаций. Листинг 24.16. Функция ru-cbj-put-name ;deI'Jn iiA-cbj-put-name (obj name) , ri:-errnr-cat~h [function (lambda () (vla-put-г.дгае ohj name) name) ) (function (lambda ( x ) (princ ( s t i c a t "ХпОШИБКй PL'-FUT-HAME: Нельзя присвоить имя " name)) M I L ) )
Переименование слоя будем выполнять функцией, приведенной в листинге 24.17. Листинг 24.17. Функция ru-layer-obj-renane ;deiun ru-layer-obj-rename (old__name new__name / obi! ;;; Переименование слоя объектным методом
[if (setq ob] iru-obj-layer-by-name old_name); ;ru-ob}-put-name obj new_namet [progn Iprinc (strcat "ХпСЩИБКЙ RU-LSYER-REMAME: Нет слоя " old_^name) ) nil
);
i;_ end of ptogn end of if
Проверка на практике: (inapcar ' (lambda (name)
(ru-layer-ob^-rename name
(ru-conv-oem-to-arisi name)!) (cu-obj -list-layers) } иернет ("0" nil nil "KAPH" nil nil nil nil rul nil nil nil nil "
" nil nil "ASHADE" ni.l)
Ошибка кажется непреодолимой. Кстати, текстовый стиль объектным методом вообшс нельзя переименовать, т. к. свойство Name для объекта Textstyie — read-only.
790
Часть IV. Разработка прикладных программ
Ну, тупые! Вы подумали, что эту фразу известного писателя-юмориста мы в очередной раз решили процитировать по поводу разработчиков фирмы Autodesk? Нет, это про нас сказано! Конкретно про меня. (Сергей Зуев)
Тысячи раз мы конвертировали файлы, разрабатывали много вариантов программ и ни разу не удосужились просто войти в открытую дверь, а пробивали стены лбом. Цитируем высказывание из главы 4: "Глупая в отношении всего "неамериканского" система Win-AutoCAD, загрузив файл с DWGCODEPAGE = dos866, радостно начинает конвертировать имеющиеся в ней тексты. Но делать она этого не умеет, к в результате вместо русских символов появляются символы косой черты с цифрами, соответствующими номеру символа в кодовой таблице ". Примите наши уверения — все происходило именно так. Далее мы советовали: "Если предстоит конвертировать файлы системы AutoCAD R12, то необходимо избавиться от упоминания в них о DWGCODEPAGE — dos866. Сделать это можно, открыв рисунок в AutoCAD R12 it установив значение системной переменной DWGCODEPAGE, равное "undefined" (именно так!). Делать это много раз неудобно, да и система AutoCAD R12 может быть недоступной, поэтому лучше воспользоваться утилитой wnewcp.exe, которая делает это без запуска системы AutoCAD". Действительно, после этого файлы становились обрабатываемыми, но возникали проблемы, с которыми мы и разбираемся. А теперь приводим новый вариант совета по конвертированию файлов системы AutoCAD R12: Если предстоит конвертировать файлы системы AutoCAD R12, то необходимо воспользоваться утилитой wnewcp.exe, и, с ее помощью, заменить кодовую страницу в фшие AutoCAD RI2 на DOS866 (рис. 24.3). Именно на DOSS66, а не ANSI_125]_Cyrillic! Обратите внимание на информацию о файле — указано Code page:BIG5. У нас давно нет системы AutoCAD R12, и мы не можем загрузить этот файл для проверки. Но, просматривая с помощью утилиты wnewcp.exe все файлы формата AC10G9, мы не нашли ни одного, у которого кодовая страница распознавалась бы как dos_866 (за исключением тех, в которых кодовая страница была изменена самой утилитой wnewcp.exe) — везде или UNDEFINED, или BIG5. После концертирования утилита wnewcp.exe выдает сообщение: File: Plan_R12.DWG
Codepage changed
from BIG5 to DOS3S6.
Теперь мы просто загружаем "отконвертированный" файл в AutoCAD и видим, что все русские имена и надписи отображаются правильно В системе AutoCAD R14 и 1 AutoCAD 2002 . Причем не только отображаются, изменены и сами надписи, в чем легко убедиться, загружая их в редактор текстовой строки. Система AutoCAD во время загрузки рисунка сообщила:
На версиях 2000 и 2000i не проверяли, но предполагаем, что результат будет такой же.
Глава 24. Разработка набора инструментов для программистов
791
"onverting old drawing. Opening a Release 12 format file. Substituting [rucad.shx] for [AR]. Substituting frucad.shx) for [CYRIL3TD.SHX1. Substituting [rucad.shx] for [CYRILSTD.SHX],
Substituting [rucad.shx] for [CYRILSTD.shxl . Substituting (ruead.shx] for [CYRILSTD.shx]. Regenerating model. , &;AutoCAD {.nric P
Inpul or Drng/D гор tbgdira clary where ytiurDWG/D>5:'ulBBra?id& in
Convert only the fQJbwng checked DWij/D>Flilas.
!*7 --.г г
г --•"•
г •.-
E? act a {tew coda page JDOSBE6 Cti.neEefTor^en. Hong Kong)) K5C5601 KoreanWonsiing oisgn Jqheb. го[_31,срсг.е
£41!
ANSI USD EaelemEurapenn SIjaBI CynlliG Copy Ihe converted DWG/O>^fite(6) Ic following location
Versiort f Code page B1G5
Рис. 24.3. Установка параметров для изменения кодовой страницы
На рис. 24.4 показаны два окна с разными версиями одного файла. Слепа — файл, в котором системная переменная DWGCODEPAGE = dosS66 установлена с помощью утилиты wnewcp.exe, справа — без обработки. Утилита wnewcp.exe рисунок не конвертирует, она изменяет всего два байта (рис. 24.5), значит система AutoCAD сумела правильно отконвертировать документ. Собственно, удивительно не это так и должно быть, странно, почему она ранее этого не умела, и почему версия системы AutoCAD R12 неправильно записывала кодовую страницу. Но система AutoCAD 2004 снова не умеет правильно отконвертировать русские символы! Появилась уже и версия AutoCAD 2005. Так что вопрос, кто "они", еще остается открытым. Впрочем, за истечением срока давности мы не будем выяснять, кто виноват, нам надо решить, что делать с файлами, которые но каким-то причинам не могут быть конвертированы автоматически.
Часть IV. Разработка прикладных программ
792
Рис. 24.4. Две версии одного файла IHCpa iiL- -PI 1Д« mn -ML jCVliAca -
-
:
Сравштъ ООЙАЗ:
•
ЗОЙНО
OA
30£Be: ЭОЙСО :
00
D060D. TGftDB: QQ6HO: Э05ЕВ; 1Q6FOIU&FS:
AT
H07Q0
OA D7
31
00 00
S4
"
22
in
00
00
00
CO
10
on
•
DO
00
Nil
=• •
61
33
00
oo
JC Z3
IS
00
71 7Г
02
'
DO
_
3D
'
OQ
19 •: .
ГЯ 7F 02
007Ю:
Ншнй
-
«e
::
1
J070B;
WL -Aav.AKSi2?DWG
_>>JJCW«
56
00
•
00 00 00
00
-.
|
0 ПЧЗрт
D-? лАД лЬГкпЗОс ]• sOLD.'
00
B6 OJ 00
.
00
00
nn nn nn nn 00 oa 00
00
57
DO
Д9 .
flO £4 £Э
Ч >D|H П rfJDOlT
OP
_-J
—
J
006 AS:
• :-л .
OA B7 31
ЮЁВЭ: C"J ' C06CO; 006CO; fiDEDS: 006HO: 0(I6ES; OQ ](1йРО; CO 1P6FS:
гг
">j 00
.
00
O0700 • OO'OS-
00 49
Eilprfpr
P9D
00710 ;
-
1*1* -
*H
J[ tnaujci. 1С*рглн4нс f Предыдущее от*ние |
00
B7 .
•01 «1 •B
DO .
00 00
UD
s»
ц^НШ^НЦ^Н^-||х| mL*y-uKSl2^ t^6 DWG
:
. .
\T\\ u^t* LiUp Двои* ел
.
•
ОС
. or F8
on
70
»1
i
f~ Ur«codff
ЗГ
П
DO
[]• J
[J4Jp«
:4 S3
00 00 00 - 00 oo 02 IB £6 DO ОС 00 00 DO 00 DO 00 00 E6 23 0( 00 00 04 02 19 57 00 n . . 00 00 ПГ1 ; ' 00 OG oo DC oa 40 OP
zibT^SOc J-
iDqav 11
^_;F |> >-fnnn
DI?D
к2
Рис. 24.5. Сравнение файлов до и после обработки утилитой wnewcp.exe. Подчеркнуты измененные байты
Как избежать переименования Возможен такой прием — создавать новые именованные объекты с правильными именами с последующим изменением сиойств всех примитивов. А старые объекты, после того как с ними не будут связаны примитивы, попытаемся удалить. Такую схему мы пытались усовершенствовать несколько раз, но надежного решения не получалось — все время находились какие-то варианты, связанные с особенностями свойств разных примитивов. В результате мы решили принципиально изменить подход — поручить системе AutoCAD самой правильно переименовать именованные объекты, а уж с примитивами мы как-нибудь справимся.
Глава 24^. Разработка набора инструментов для программистов
793
При выполнении команды A U D I T (ПРОВЕРИТЬ) система AutoCAD заменяет неправильные имена (а с ее точки зрения это все русские слова в DOS-кодировке) на автоматически генерируемые типа nimiT__i_G40302232920-32. Мы можем продела] ъ следующие "махинации": 1. Сохранить списки имен всех именованных объектов в DOS-кодировке. 2. Перекодировать их, чтобы знать, какими должны быть новые имена, но пока ничего не переименовывать. 3. Произвести аудит рисунка с заменой имен на правильные, но непонятные. 4. Произвести замену "аудитированных" имен на требуемые — при этом автоматически изменятся и свойства примитивов, такие как имена слоев. 5. Отконсортировать строковые значения у примитивов — к этому нет никаких препятствий. Приступаем к реализации идеи. Как всегда, нам понадобятся вспомогательные функции, которые мы приведем после рассмотрения основной (листинг 24.Ц). Функции ru-oonv-flie передается один аргумент— имя функции, выполняющей конвертирование строк. Обычно это будет функция ru-conv-oem-to-ansi, но могут быть и другие варианты. Например, для передачи иностранным партнерам может потребоиатьсн транслитерация латинскими символами.
Замечание
)
На LISP несложно разработать и функцию настоящего перевода (не символов, а слов и фраз) технических текстов, встречающихся в чертежах.
I Листинг 24.18. Функция nj-
[defxin ru-conv-file (quoted_furic / audit_name audit_names_list blk collection collection_name ename ent i j list_audit_names list_new__names name names naraes_list new_names_list obj old_names_l.ist sub_list _ent_modify) . ^_ . . _ . ^ _ . -. . _^_. . _ Локальная функция модификации списка данных прлмитива. Модифицирует строковые значения из списка ent, заданные DXF-кодами, с помощью функции quoted_func.
Возвращает измененный список данных примитива.
_ ii г. (defun _ent_raodify {ent
;if [= (type o^ioted^furic) 'STR) (setq new__value quoted_Eunc) lisetq ne«__value ( (eval quoted__func} old_vaiue) )
) ; _ end of i J ,-; Ограничиваем явно бессмысленные действия ( i f (and (/= old_value new_value) (/* old_value "DEFPOINTS") );
(/= old_value "0") end of and
794
Часть IV. Разработка прикладных программ
iprogn (if (and is_print *ru__msg_debug*) (princ (strcat "ХпИзменяю значение для DXF-кода " (itoa dxf^_code) " [" old_value "] на [" new__value ! ;_ end of if (setq ent (subst (cons dxf_code new_valuel [cons dxf_code old_yalue) ent );_ end of subst ) ;__ end of setq },-_ end of progn );_ end of if ),-_ end of progn );_ end of if ent ); end of defun Локальная функция формирования списка имей именованных объектов из всех сеыейств, допускакших переименование. В список вк.тк>чаем имена семейств (defun _make-naraes-list I! (list (list "Layers" Iru-obj-list-layers)) (list "Dimstyles" (ru-obj-list-dim-styles)) [list "Textstyles" (ru-obj-list-textstyles)] (list "Layouts" (ru-obj-list-layoutsl) (list "Blocks" (ru-obj-list-blocks)) [list "views" (tu-obj-list'views)} (list "viewports" (ru-obj-list-viewportslI [list "Linetypes" (ru-obj-list-collection-membe i;-names [ru-obj-doc-collection "Linetypes") ) ;_ end of ru-obj-list-collection-member-names );_ end of list (list "DserCoordinateSystems" !ru-obj-list-collection-member-names [ru-obj-doc-collection "UserCoordinateSystems"! );_ end of ru-obj-list-collection-member-names !;_ end of JTU-obj-list-colleccion-member-naines ;;_ end of list ),- end of defun . Главная функция . ii_ ' Составляем список имен именованных ;;
(setq old_naraes_list (_make-names-list)) .i . г _ ж __^ .
.—
-,
^
^__
Получили иримерно такой список, в данном примере с русскими именами в DOS-кодировке [хотя это могли Бы быть и имена в WIN-кодировке):
__
Глава 24. Разработка набора инструментов для программистов
("Layers"
("О" ""5$ЖВ"' "г-$ЪК€->" "DEFPOINTS" ""...К>"»
("Dimstyles"
70;,
.
("Standard"»
("rextstyies" (""Eit,s5"' "STANDARD" "irau")j f "Layouts" ("Layout:" "Model"» ("*MOdel_Space" "'Paper_ Space" "RECTAWG"
("Blocks"
"-X13"
"*X14"
"$ZN71" "_KVADRAT"
"_LINE150QO&")
>
("Views"
nil)
("Viewports"
I"* Active") )
'"Linetypes"
("ByBIock"
"ByLayer"
"COWT1MOTS"
"CENTER"/)
I "UserCoordinateSys terns" n i l j )
(Cdr (list "Te^tstyJes" (list ""Ж„Ъ5"' "STANDARD" "ICAD")» теперь формируем другой список о этими же именами, но перекодированными функцией .
-
-— ---- -
.-
. -------- ,
.
-----------
_ ----- ---- |;
(setq new_names_list imapcar ; function Uambda (names_list) [list (car naroes_list] Imapcar- (function (lambda (name) (if name ( (eval qiioted_func) name) name)) I ;_ end of function (caflr names_list) ) ;_ end of inapcar ) ;_ end of list ) ;_ end of lambda ) ;_ end of function old_names_li2t ) ;_ end of mapcar ) ;_ end of setq Список "переводов" вьггпядит примерно так: I
("О"
("Layers"
("Dimstyles"
"ФОРМАТ"
"ГРАНИЦЫ"
"DEFPOINTS"
r'Textstyles" ("СТАНДАРТ" "STANDARD" {"Layouts" ("Layoutl " "Model") ) f"*Model_Space"
("Blocks"
"*X13"
"СТЕНЫ");
("Standard"))
'"X14"
"ICAD"»
"*Paper_ Space"
"RECTAWG"
"SZN71"
"_KVADRAT"
"_tTNE15000M"»
("Views" nil)
("Viewports" (""Active") I /"Linetypes" ("ByBIock" "ByLayer" "COWTIWUOf/S" "CENTER")) ("UserCoordinateSys terns" nilj ) Вьаюлняем проверку с исправлением ошибок .
._ — -
,
-^
(vla-auditinfo lru-оЬз -get- active-document)
_
,
:vlaic-trua)
-^
-
^ ;
Часть IV. Разработка прикладных программ
796
Формируем список исправьенньк имен. [Setq aQdit_naraeS_list (_ne>:e-r.Hni=i-l Такой же список, как до аудита, но с неправленными именами f f "Layers" ("О" "AUDIT_1 _0403Q223292C:-32" "AODIT_I_04Q302232920-33" "AUDIT I 040302232920-46"!) '."Dimstyles" ("Standard"» ("Textstyles" f"AUDIT_I_Q40302232920-4T' "STANDARD" "ICAD">; '"Layouts" ("Layout 1" "Wodej "), ("Blocks" '."vieus"
<"fModel_Spaee" "*Рарег_5гмсе" "RECTAflG" ""XIJ" "+X14" "_LIl.lF.lSC30lb")) nil)
"SZHll"
"DEFPOIt'ITS"
"_Xi/ADRAT"
("Viewports" ('"Active"!) '"Lirietypes" ("ByBlock" "ByLayei" "CONTINUOUS" "CENTER"!)
{"UsezCoordinateSystems" nill I Далее переходим к ответственной операции - обратному переименованию имен по списку audit names list E имена по списку new nanes list Isetq i 0] ( f ore^ch collectit>n_list audit_name^_list Isetq collectioo_name tear coliec7ion__listl list_aijdit_naraes (cadr collection^list) 1i s t_n ew_n ame s (cadr (nth i r.ew_names_list! ; i [1+ i) j 0 );_ end of setq (if list_new_naroes Iprogn [setq collection (m-obj-doc'collection collect! on__name; , [foreach name list^new^narae* Isetti audit_name
:nth j i is t_audit_ names) D (1+ jl ];_ end of setq (i f *ru_rnsg__debug1' [pcinc {strcat "\n" audit-_name "=" naiviel; I; end of if Для текстовых стилей у объектов свойство Нате только для мтения, поэтому их можно переименовать только командой
(if (= collection_name "Textstyles") Опасность! Б стилях могут Сыть пустые имена, образующиеся при применении SHAPE!\
24^
Глава
Разработка
на
бора_ннс
тру
ментов
для
программистов
(if {and ( / = audit _naaie " " ) ( / = name "")) (command "_. -RENAME" "_Styla" auditjiame name) 1 ;__ end. of if (if Isetq obj (ru-obj-collection-item-by-name collect ion__name
) ;_ end of setq ;if {/= audit_nme name) ; ; ; He переименовываем анонимные блоки, штриховки и т. п. (if (/= (substr audit_name 1 1) "*") ; ; ; Переименование объектным методом (го- obj -put -name obj паяв) ) ;_ end of if ) ;_ end of if i :_ ead of if ) ;__ end of if
) ;_ end of foreach I ;_ end of progn ) ;_ end of if
) ;_ end of foreach • j . . .
,
._--^_
.__-
,
_^
. ._,
.___,
Самок сложное позади. Приступаем к обработке примитивов - — - — ----- ----- - ------ .___~- --- --. — ._- . ----- ----- — ._--. ------ .___,.Iprinc "ХпОбрайотка блоков.. Лп") ; (setq blk Itblnext "BLOCK" T)} ; [while blk ; ; и теперь беремся за примитивы, входящие в блок isetq ent (cdr (assoc -2 blk))} (while ent (setq ent (_ent__moiiify (_ent_modify ;__ent_modify (_ent_rnodify (entget ent) 1 quoted_func nil) 2 quoted_func nil ) ;_ end of _ent_modlfy 3 quoted_func nil ) ;_ end of _ent_^odify
nil i;_ end of __ent_modi f у ) ;_ end of setq [entmod ent) ,- ; Исследуем вложенные примитивы (setq ent (entnext (cdr (assoc -1 ent})}}; );
end of while
____
797
Часть IV. Разработка прикладных программ
798 (setq blk (tblnext "BLOCK"}} ) ; _ end of while
;;/ Покончили с блоками, береысч за объекты, "плавакщие" на поверхности [setq ent (entriext); (princ "ХпОбработка примитивов ... W ; (while ent (setq ent (entget ent] ename (cdi (assoc 0 ent} I ];_ end of setq (if (/= епале "SEQEND") (progn (setq ent (_ent_modify ent 1 quoted_func Г ) ) ;; Текст (if (/- опале "INSERT") ;;; Опасно! Эта проверка нужна, иначе будет обратное переименование (setq ent [_ent_nxxJify ent 2 quoted_func Т ) ) ) ;_ end of if (setq ent (_ent__modify ent 3 quoted__func T) 1 (setq ent (_ent_modify ent 4 quoted^func T ] ) lentmod ent) );_ end of progn ),-_ end of if (setq ent (entnext Icdr lassoc -1 e n t ) } ) ! );_ end of while (command "_.REGEN"] (princ "\n ГотоеоХп"} [princ] ) ; end of
X \
,f!
, \
,70 f.:
\
\
. ., я
Рис. 24.6, Файл до конвертирования
\
-Ч '
Глава 24. Разработка набора инструментов для программистов
799
Остается надеяться, что в AutoCAD 2005 не появятся новые "подлые ловушки", требующие очередной переработки функции. Испытаем функцию в работе. Загрузим файл с DOS-кодировкой (рис. 24.6) и отконвертируем его: (ru-coriv-file 'ru-conv-oem-to-ansil, Результат можно увидеть на рис, 24.7.
•ИХ.
»..
ХЕМД ГЕНЕРАЛЬНОГО ППД-Д
•
Рис. 24.7. Файл после конвертирования из кодировки DOS866 в WIN1251
EH К S P L I К А С 1 YA 1 PROEKTIRUEMIHYJ INDIViDUALJNIHYJ ZHILOYJ DOM 2. SUTHESTVUYUTHIYJ ZHILOYJ DOM S WA.GAZINOM jdjiMKiTfr
-*"—
.'.•j-.-i'vy-rv
~&——'
~
ТВД
Рис. 24.8. Файл после транслитерации
Часть IV. Разработка прикладных программ
800
А теперь представьте, что заказчику требуются рисунки только с .ПУТИНСКИМИ символами — "у богатых свои причуды" -- может быть, у нею русских шрифтов нет, но полно иммигрантов, понимающих русские слова. Имея нашу функцию, произвести транслитерацию очень просто: (ru-c^-v-fUe 'ru-ccTw-string-win-transiit). Результат транслитерации показан на рис. 24.8. Функции конвертирования можно использовать и для массовой обработки файлов с применением рассмотренной ранее функции ru-batch-file-operations.
Приведение текстового стиля для всех примитивов к определению Неожиданно популярной оказалась программа приведения всех надписей (тексты, атрибуты блоков) к виду, заданному текущим стилем. Проблема заключается в том, что надписи, написанные одним стилем, могут иметь разный угол наклона и ширину. При изменении определения стиля в диалоговом окне вил надписей не изменяется. Положение осложняется тем, ччо некоторые начальники любят отдавать приказы "чтобы все было курсивом" (или наоборот). Кроме того, в рисунок могут попасть блоки, созданные в разное время, под разные вкусы. Для быстрого решения такой проблемы и написана следующая программа. До ее запуска необходимо в диалоговом окне команды STYLE (СТИЛЬ) настроить требуемые параметры каждого стиля. Программа должна запросить (рис. 24.9), какие стили приводить к определению и выполнить задуманное (листинг 24.19). Стиль RU_LINE, используемый нами для создания "лохматых" типов линий, не должен менять начертание и не может быть выбран в диалоговом окне, IОтбор изменяемы* с 1ипеи •• STANDARD 5 RUS5 LINE
пи_. v
у. HU CSD
? 10ПО_4В8 «? ГОПО_485 V ТОПО_4ЭС f ТОПО 491
•j. тотмэг
ОК
Отма-iii]
Рис. 24.9. Отбор текстовых стилей для приведения и определению
Листинг 24.19. Файл rij-txt_style_redraw.lsp Idefun START (/ checked_list enabled_list i res_l:st te-tt_styles_j.ist _update-style modify-style)
Глава 24, Разработка набора инструментов для программистов ;: Локальная функция [defun _modify-style (style_name new_style_name ent_data style_width style_angle)
;if (and (or (= "TEXT" (cdc (assoc 0 er.t_data))> ;= "ftTTRlB" (cdr {assoc 0 entjdata))) ( = "ftTTDEF" {cdr (absoc 0 e n t _ d a t a ) } ) l
t;_ end of or (or
(= "'" style__name; [= (strcase style_nainet (cdr (assoc 'I ent_data)) ) ) ; _ end of or ) ; _ end of and [sctq ent_data (entmod Isubst (cona 7 new_style_name) (assuo 7 ent_data) erit_data ) ; _ end of subst ),-_ end of entmod snt_data I entmod (subst (cons 41 style_widtti) ;assoc 41 ent_data) ent_data ) ; _ end of subst I;_ end of entreod ent_data (entmod (subst (cons 51 style^anglel [assoc 51 ent_data) ent^data };_ end of subst );_ end of entraod ) ; _ end of setq );_ end of if ) ; _ end of defun г,- Локальная функция (defun _update-3tyle (style / ent_nam6 ent_data old_style style_angle style_width tbe) (princ {strcat "Чйите, привожу стиль\п '" style "' к определению...\n")! (setq ent_name (tblnext "DIMSTYLE" t) old_style {tblobjname "STYLE" style! tbe (entget old__style) style_width (cdr (assoc 41 tbe)] style_angle (cdc (assoc 50 tbe)) I,-_ end of aetq [while ent naitie !Eetq ent__data lentget (tblobjnarae "DIMSTYLE" {cdr (assoc 2 e n t _ n a m e ) I ) ) )
26 Зав 834
801
802
_
Часть
IV.
Разработка^рикладных^рограмм
lit (or i= "*" style) != old__style (cdr (assoc 340 e n t _ d a t a ) ) ) ) ;_ end of or (entmod (subst (cons 340 old_style) (assoc 340 ent__data) ent_data| ) ) ; _ end of if [entupd (cdr (assoc -1 ent^data) ) } (setq ent_name (tblnext "DIMSTYLE") ) ) ;_ end of while [setq ent_name [tblnext "BLOCK" T) I (while ent_name [setq erit_data (cdr (assoc -2 ent_name] J ) [while ent_data (setq ent^data (entget ent_data) ) (_modify-style style style ent_data style_width style_angle) (setq ent_data (entnext (cdr (assoc -1 ent_data) ) ) ) ) ;_ end of while [setq ent_naine (tblnext "BLOCK"! I ) ; end of while [setq ent_name (entnext)) [while ent_narae (_modify-style style style (entget ent_name) style_width style_angle! (entupd ent_name) [setq ent_narne (entnext ent_name)} ) ; end of while i:_ end of defun ;;;-Главная функция ( i f (ru-yes (strcat '"^Производится изменение начертания всех существующих " "\nTEKCTOB, АТРИБУТОВ \пво ВСЕХ примитивах, включая блоки," " \п.выОранного стиля!" "\n\nyстанавливается по определению стиля" "\п начертание, сжатие, угол наклона" "ХпПользоваться осторожно!ХпБупем делать"
[setq text_styles_list (ru-obj-list-textstyles) ] [foreach style text_styles_list [setq enabled__list (cons (if (= style "RO_LINE") nil T) enabled_list) ;_ end of cons checked_list (cons (if (= style "Ш_ЫМЕ") nil T) checked^list ) ;_ end of cons ) ;_ end of setq ) ;_ end of foreach [if (setq res__list (ru-dlg-show-check-list "Отбор изменяемых стилей" text_styles__list [reverse checkea_list) (reverse enabled^list) ; ! ;_ end of setq (progn (setq i 0]
Гпава_24. Разработка набора инструментов для программистов
803
;foreach style teKt_styles_list ;if (nth i res_list) (_updgte-style style!) isetq i (1+ i ) ) I,-_ end of foreach i ;__ end of progn ;•;_ end of if ) ; _ end of progn ) ; _ end of if Iprinc) ! ;_ end of clefun ; START)
Используя приведенные функции для изменения сгзойств в качестве прототипок. можно разработать много специализированных программ.
Обработка штриховок Опытные "автокадчики" стараются применять штриховки в минимальном объеме, но в некоторых разделах проектов без штриховок никак не обойтись. При проектировании по стандартам разновидностей образцов штриховок требуется немного. Беда в том, что многих именно таких, какие нужны, ц системе AutoCAD нет. Разумеется, за годы работы с AutoCAD создано множество образцов и вряд ли стоит теперь заниматься разработкой собственных. Все можно "лостать". После того как нужные образцы добыты, ими нужно суметь с толком распорядиться. Коллекции штриховок обычно собирают в файлы acad.pat и acadiso.pat (иногда, в соответствии с рекомендациями фирмы Autodesk, для каждого образца создают собственный файл). В результате набирается множество файлов штриховок неизвестного происхождения, в каждом из которых есть и стандартные образцы, и собственные, и "левые". Одноименные образцы могут быть выполнены в разных единицах (английских или метрических). Как разобраться с этим "добром" (скорее, "барахлом")? Для начала напишем функцию, раскладывающую РАТ-файл на отдельные образны (листинг 24.20)'. Ей передается имя файла с образцами и имя каталога, в который нужно помещать отдельные файлы. Функцией ru-hatch-split-pat-file можно обработать все имеющиеся РАТ-файлы. складывая образцы в один каталог. Для однои м е н н ы х образцов будут создаваться новые имена файлов путем конкатенации имени образца и уникального кода, например: D ANSI37.pat — первый файл с образцом ANS137; П ANSI37_0403Q809550763.pat — второй файл с образцом ANSI37; D ANSI37_04030809550942.pat — третий файл с образцом ANSI37, :
j Листинг 24,20. Функция ru-hatch-split-pat-file (defun ru-hatch-split-pat-file (pat_file dir / count file_name new pat_list pat all_pat — list short^pat!
Это может быть и консольная программа, написанная на любимом языке программирования
Часть IV. Разработка прикладных программ
804
[setq dir [ru-dirs-path-and-slash dir) pat_list ' II short_pat (street (vl-filename-base pat_file] ".pat"! pat short_pat count 0 ;_ end of setq (if [setq all_pat_list (ru-list-read-from-file pat_fileH [progn (setq new nil) (foreach string all_pat_list (if (= (substr string 1 1) "T") iprogn !if (> count 0) (progn [setq pat_list (cons (sttcat ";;") pat^list) pat_list (cons (slrcat: ";; END OF " pat) pat_list) pat__list (cons (strcat ";,-") pat_list) ];_ end of setq iprint (strcat "Записываю " file__name|) (ru-list-write-to-fiie file__name (reverse pat_list)) );_ end of progn ) ,-_ end of if (setq new Т pat (ru-stnr.g-word string 1 ' ("*" ",'')) pat_list '0 pat_list (cons (strcat "") pat_list) pat_list (cons I strcat ";; FROM: " short_pat) pat__list] pat_list (cons (strcat ";; COMMENT: ") pat_list) pat_list (cons (strcat ";;") pat_list) pst_list (cons string pat__list) new nil count (1+ count) file_narae (strcat die pat ".pat") ),-_ end of setq (print (strcat "Добавляю " string]; (if {findfile file_name) (setq
file_riaine (strcat dir pat "_" (ru-string-unique) ".pat") 1 :__ end of setq );_ end of if I;__ end of progn (if =* (substr string 1 1) ";") (setq pat__list (cons string pat_list); );_ end of if );_ end of if };_ end of foreach );_ end of progn
Глава 24 Разработка набора инструментов для программистов
80S
[ги-тзд-alert (strcat "Не ногу прочитать " pat_£ile) ) ) ; _ end of if [princ] ) :__ end of defun Полученные образцы придется просмотреть и спрятать ненужные дубли в надежное место. Оставшиеся можно скомпоновать обратно в сборный РАТ-файл с помощью функции ru-hatch-merge-pat-files (ЛИСТИНГ 24.21). Листинг 24.21. Функция гц-hatch-merge-pat-files [defun tu-hatch-merge-pat-files
(out_file pat_files__list /
pat__list pat_string__list; [mapcar [function (lambda (pat_file) (setq pat__list (ru-list-read~from-file pat_filei pat_stting_list (append pat_list pat_string__list) );_ end of setq ) ;_ end of lambda I;_ end of function [reverse pat_files_list! );_ end of mapcar [ru-list-write-to-file out_file pat_string_list) );_ end of defun Лучше всего собрать образцы в файл acadiso.pat в нашем каталоге uL sionDir%.
Теперь можно написать функцию для рисования сборника всех образцов штриховок (листинг 24.22). ! Листинг 24.22. Функция ru-hatch-draw-sangles [deiun ru-hatch-draw-sai-ples (pat_list / def_scale dx dxcuiri n row saiHple^height sarople_width to tx x xcurr хтак у ycurr; ;;;Рисование матрицы образцов штриховок
[defun draw_saraple (ptO x у pattern / pt2 pt3 pti ss pttext) (setg ptZ (polar ptO 0 x) pt4 (polar ptO (ru-geom-go-left 0) y) pt3 (polar pt2 (ru-georn-go-left 0) y; pttext (polar pt4 (ru-geom-go-left 0) (• у 0.1}; ) ; _ _ end of setq iru-pj.iiie-add (list ptO pt2 pt3 pt4) T O O nil) (setq ss (ssadd) ss (ssadd (entlast) s s ) ) ;ru-hatch-add-ob] pattern (ru-nomxal-hatch-scale pattern) 0 ss; [ru-text-add pattern ptteKt (" у 0.15) 0 "L"; } ; end o£ defun
806
Часть IV. Разработка прикладных программ
(setq sairpie_width 45.0 sairplejieight 30.0 tO (ru-get-point-regijired "Левый верхний угол матрицы образцов" nil) dx (ru-get-dist "Расстояние мекцу образцами " {* sanple_width 2) tO) xmax tru-get-dist "\пРаэнер матрицы максимальный: " (* dx 20| tO) tx tO n 0 row 0 );_ end of setq (foreach r.ame pat^list Isetil dxcurr (* dx nl xcurr (+ (car tO) dxcurr) yeurr- (cadr t x ) ] [if (> dxeurr xmaxi [setq n 0 row (1 cowl xcurr (car tO) ycurr (- (cadr t O ) (* dx row)); );_ end of if (setq tx (list xcurr ycurr) n (1+ n ) } (draw_sairple tx sample_width зэгар1е_лeight name) );_ end of foreach (print "Готово.") [prlnc) А как получить список образцов штриховок, известных системе AutoCAD? Сама-то она знает об их существовании, раз выводит в диалоговом окне команды ВНАТСН (КШТРИХ) список, да еще умудряется генерировать миниатюры изображений. К сожалению, мы не нашли ответа на этот вопрос. Не существует некоей таблицы штриховок, наподобие таблицы блоков. Используя пару функций (листинги 24.23 И 24.24) можно получить список образцов нарисованных штриховок, но для получения списка доступных образцов мы не придумали ничего лучшего, чем чтение РАТфайла (листинг 24.25). Листинг 24,23. Функция ru-obj-list [defun ru-obj-list (obj_nsrae / item result! [vlax-for item (ru-obj-get-model-space) [if (- (vlax-get-property item 'Objections) obj_name) (setq result (append (list item) r e s u l t ) ) ) ] result ); defun Листинг 24.24. Функция ru-ctoj- list-hatch -patterns (defun ru-obj-list-hatch-patterns (/ hatch result; [foreach hatch (ru-obj-list "AcDbHatch") (setq result iappend (list (vlax-get-property hatch 'PatternName)1 result) I;_ end of setq ) ; _ end of foreach ;_ end of flax-for result
Глава 24. Разработка^абора^нструменговдля программистов
807
Листинг 24.25. Функция cu-hatch-list-pat-in-file ;defun ru-hatch-list-pat-in-file lpat_fila / pat pat_JList) Iforeach string (ru-list-read-from-file pat_file) i i f (= isubstr string I 1) "*") ;setq pat ( ru-st ring-word string 1 ' ("*" " , " ) ' ! pat_list (cons pat pat_list) ) ) ) (reverse pat_list]
Настройка оптимальных масштабов штриховок Создадим новый файл с единицами рисунка мм и масштабом 1:1 и выполним функцию ru-hatch-draw- samples. В результате у нас должен получиться сборник образион штриховок наподобие показанного на рис. 24.10. Должен, но наверняка не получится.
Рис. 24.10. Сборник образцов штриховок
Штриховки в РАТ-файле могут быть созданы разными людьми и рассчитаны на разные системы измерений. Хотя мы создавали размеры образцов штрихоиок 45x30 мм на бумаге (оптимальный для восприятия), не все виды штриховок смогут правильно отобразиться в таком поле — некоторые будут слишком густыми, некоторые просто не ипишутся. Наша функция рисования штриховок ru-hatch-add-лЬ;
Часть IV. Разработка прикладных программ
808
разработана так, что при ошибке рисования программа не прерывается, а выводится сообщение. В результате мы можем получить примерно такой протокол: Сбой BO-HATCH-ADD-OBJ: Pattern cutstone, СЗИИЕКД: Automation Error. Hatch pattern
too dense
Сбой МЬНЙТСН-ADD-OBJ: Pattern CS60, СШИБКА: Automation Error, ambiguous output СОой BU-HATCH-ADD-OBJ: Pattern CS31, СШИЕКД: Automation Error. Invalid input Сбой RU-HATCH-ADD-OBJ: Pattern cor.crt, СШИБКА: Automation Error. Hatch pattern too
dense
Некоторые ошибки возникают из-за того, что по умолчанию система AutoCAD ие может создать образец из более чем 10000 сегментов. В этом случае обычно генерируется знакомое всем сообщение "spacing too dense or hatch pattern too small". Для решения этой проблемы, конечно, нужно увеличивать масштаб штрихоики, но в нашем случае, когда образцов много, а масштаб пока неизвестен, можно изменить настройки системы AutoCAD. Для этого достаточно в командной строке выполнить выражение (setenv "MaxHatch" "10QODO") и получить возможность создавать образец, состоящий от 100 до 10000000 сегментов. При этом значительно возрастет потребность в памяти, и производительность будет резко снижена. После нескольких экспериментов мы получим набор из большинства образцов. Остальные, у которых прямоугольники остались пустые, но есть надписи с названиями образца, можно заштриховать командой ВНАТСН (КШТРИХ), подбирая масштаб вручную. На следующем этапе мы подберем оптимальные масштабы штриховок — такие, чтобы образец выглядел примерно так, как он должен выглядеть на бумаге. Для этого напишем функцию подбора масштаба (листинг 24.26). !
| Листинг 24.26. Функция ru-hateh-change-scale [defun ru-hatch-change-scale (enanie / ent pattern ras new_scale olci^scale do) ;;; изменение масштаба примитива-штриховки с записью в IHI-файл isetq er.t lentget enamel do t old_scale (cdr (assoc 41 ent) I
pattern (cdr (assoc 2 ent)) new_scale old_scale) [while do [setq ent (entget ename) old_scale (cdr (assoc 41 ent)) new_scale (_ru-get-with-default "Масштаб штриховки" (rtos old_scale 2 2) 'getreal nil "+ - Save Exit" nil) ),-__ end of setq [cond
((- new_scale "+") (setq old__scale (* old_scale 0.5))) ( (= new_scale "-"] (setq old__scale {* old_scale 2.0») [ (= ne«_scale "Save") (setq ms (rtos (ru-conv-unit-to-nullimeter-in-psper old_scale) 2 3) ),-_ end of setq [ru-ini-write (ru-file-ini "hatch.ini") "HatchScale" pattern ras) (princ (strcat "ЧпШтриХОвка " pattern
" описана в НДТСН.1Н1 с масштабом " ras "\n")) [setq do nil)
Глава 24. Разработка набора инструментов для программистов ; {= new_scale "Exit") (setq do nil}i [T (setq old_scale neu_scale)} );__ er.d of cond !if do (command "_.-HATCKf*dit" ename "_ P' );_ end of while old seals
809
old_scale " " ) )
Теперь можно написать программу, позволяющую установить и сохранить оптимальный масштаб штриховки (листинг 24.27). | Листинг 24.27. Файл ru_set_tiatch_best__scale.lsp [defun START (/ ent; (cu-app-begin! Iwhile (setq ent (ru-get-entsel-by-type "ВыЗери штриховку" "Это не ШТРИХОВКИ" (list "HATCH") Т); [ru-hatch-change-gcale (car ent))
) (ru-app-end) ;princt
) (START)
Поработав с нарисованными образцами, мы запомним оптимальные, с нашей точки •зрения, масштабы, которые и будут использоваться по умолчанию функциями рисования штричовок (см. главу 25).
Обработка блоков Мы уже рассмотрели "нормализацию" библиотечных блоков, но нам необходимо автоматизировать еще несколько рутинных операций, связанных с блоками. Для формирования библиотек блоков потребуются две простых профаммы — выгрузки всех блоков из активного рисунка в отдельные файлы (листинг 24.28) и встаика всех отобранных файлов (листинг 24.29). Листинг 24.28. Файп ruj>lock_save_file.lsp (defun START (/ descr f i l e 'older lbt_naraes_descr name; ;;;извлечение блоков из чертежа (if (ru-user-action-enabled "DEVELOP" T j (if (ru-yes (strcat "программа выгр^ает на диск" "\П ВСЕ БЛОКИ, ЧпЗйМЕНЯЯ существуюи(ие" "\nBE3 дополнительных вопросов 1ХпБудем выгружать" ) [progn (if (setq folder (_ru-dig-folder "Вьтбор папки для записи блоков" (ru-user-work-dir) (tu-usec-read-last-parain
"block spUt_folder"
(getvar "DWGPBEFIX")) T ) ;
810
Часть IV. Разработка прикладных программ
[progn iru-user-write-last-parain "block_5plit_f older" folder) (if (setq lst_names_descr (ru-block-list-all-naraes-and-decryptions) J [progn (foreach block lst_names_descr (setq name (car block) descr (cadr block)] (if (not descr) (setq descr " " I ) (setq file (strcac (ru-dirs-path-and-slash folder) name}) (princ (strcat "ЧпЗаписываю - " f i l e ) ) (if {findfile (ru-Eile-set-eKt file ".dwg")) (command "_.WBLOCK" file "_Y" "=") [command "_.HSLO"K" file "=") );_ end of if (if (/= descr " r l ; [ru-file-write-dirinfo-file-comraent file descr) !;_ end of if };_ end of foreach :;_ end of progn );_ end of if ) ; _ end of progn };__ end of if !;_ end of progn );_ end of if );__ end of if ;princ I ) ; _ end of defun ISTfiRT} При в ы п о л н е н и и этой программы в выбранный каталог записываются файлы блоков с описаниями блоков, сохраненными в файле dirinfo.ini. Листинг 24.29. Файл ru_block_insert_all.lsp (defun START (/ files_list) ; ; вставка отобранных файлов (if (ru-user-act ion -enabled "DEA^LOP" Ti (if (setq files_list (ru-dlg-file-select-dwg-raulti "Выбор блоков для вставки" (ru-user-work-dir) ( ry-user- read- last -param "block_split_f older" (getvar "DWGPREFIX") ) T) ; iforesch file files_list [rti-error-catch [function (lambda i] (princ (strcat "\пвставляю " file)) t-ob^ file (list 0 0 0) 1 I 1 ) ,-_ end of lair£da ; ;_ end of function (function (lambda (msg) (princ (strcat \пОШИЕКД вставки: " msg)) ) ; end at lambda
Глава 24, Разработка набора инструментов дп^ программистов
811
);_ end of function ) ; _ end of ru-error-catch );_ end of foreach !,-_ end of if );_ end of if Iprinc) I ; _ _ end of dafun {START I
В функции вставки файлов мы использовали объектный метод с дополнительной ловушкой ошибок, т. к. при вставке возможно переопределение блоков, встроенных в AutoCAD (например, блоки засечек для размеров).
Расстановка всех блоков После вставки блоков {а все они вставляются в начало координат) возникает желание расставить их "рядами и колоннами", примерно так, как мы поступили со штриховками. Упорядочивание блоков никогда не повредит, поэтому мы напишем очередную программу (листинг 24.30). Листинг 24.30. Файл ru_pro_arrange_blocks.lsp [defun STftRT {/ blocksdx dxcurr n name row to tx x xcurr xtuax ycucr:! lit (ru-yes (strcat "Программа растаскивает\п ВСЕ БЛОКИ" "\ппо рисунку IХпЕудем делать"; Iprogn [setq blocks (ru-obj-list-blocks) to (r\j-get-point-reguired "Левый аерхний угол матрицы блоков" nil) dx (ru-get-dist "\nРасстояние меаду блоками: " 10.0 tO) xmax (ru-get-dist "ХпРаэмер матрицы максимальный: " (* dx 101 tO; tx tO n 0 row 0) [foreach name blocks [if [/= (substr name 1 1) "*"; Iprogn [pEinc (strcat "\пНайдан блок - " name I ) (setq dxcurr {* dx n) xcuir (+ (car tOI dxcurr] ycuri (cade t x ) ) (if (> dxcucr xroax) ;setq n 0 row (1+ cow) xcurr (car tO) ycutr (- (cadr tO) (* dx row))) i ;_ end of if (setq tx Hist xcurr ycurr) n (1+ n)! Iru-block-insert-obj name tx 1 1 1 01 );__ end of progn ) ;__ end of if I :_ er.Q of foreach ) ;__ end of progn I ; end of if
812
Часть IV. Разработка прикладных программ
:princ; i ; _ end of defun : START]
Запись списка блоков в файл В связи с тем. что для приведения в соответствие со "стандартом ruCAD" нам потребуется переименовать множество блоков, а затем изменить все старые имена на новые во множестве меню и программ, удобнее всего создать для каждой библиотеки (или любого файла) список блоков и описаний. В дальнейшем эти файлы можно использовать в программе поиска и замены (см. главу 9). Формат строк файла должен быть таким: имя_0лока|Примечание к блоку, а если его нет, имя_олока|имя йлока В конце строки мы повторяем имя_блока, чтобы из него удобнее было сделать новое имя. Изменять имена множества блоков с помощью текстового редактора удобнее, чем в диалоговом окне. Программа записи имен блокои очень проста (листинг 24.31), но значительно облегчает работу. Листинг 24.31. Файл ruj>lock_names_file.lsp (defun START [/ file lst_names_descr descr name string_list] [if (setq lst_naraes_descr (ru-block-list-all-names-and-decriptions); 'pzogn (seeq file (ru-file-dwgnarae-type "blocks"!) [foreach block lst_names_descr [setq name (car block) descr (cadr block) };_ end of setq !if (not descr] (setq descr "") ) (setq string_list (cons (strcat name "'," (if (/= descr ""! descr name) " | " name) string^list)) );_ end of foreach ;ru-list-«rite-to-file file (reverse string_list)) (ru-msg-info (street "Записан файл " f i l e "\n с га^енами и пояснениями к блокам'' "\пИспользуйте для переименования Слотов" ) ; _ end of strcat !;_ end of ru-msg-info I;_ end of progn ) ,-__ end of i f
(princ) ) ;__ end of defun (START) После редактирования файла имен и примечаний можно переименовать блоки с помошью программы, приведенной в листинге 24.32.
Глава 24. Разработка набора инструментов для программистов
813
Листинг 24.32. Файл ru_block_rename_from_file.lsp (defun START
(/ err_list: err_file)
[if (setg e r r _ l i s t (ru-block-rename-with-descr [ru-file-dwgnarae-type "blocks"! Iru-file-tiwgname-type "replace") !,-_ end of ru-block-rename-with-descr ) ;_ end of. setq (pcogr, ;setg err__file (ru-file-tmp "~biock._i:enaine.err" i ) (if {ru-list-write-to-Iile e r r _ f l i e err_list) Iru-dlg-view-txt-file ec±_fiie e r r ^ f i l e "Ошибки переименования" Т)
1; end of if ) ; _ end of progn
t ; _ _ end of if (ru-block-show-all-nairies-and-dsciiption.? n i l ) Ipcinc) ', : _ end of defun ! START)
Программа прочитает файл и переименует блоки с присвоением им новых описаний. Если при переименонании обнаруживаются ошибки, то сообщения об ошибках записываются во временный файл, который будет выведен для просмотра. В конце будет показан список имен блоков и описаний. В качестве дополнительной услуги создается файл произведенных замен, который можно использовать в других программах.
Переопределение указанного блока Часто приходится переопределять блоки с небольшой корректировкой, исключая или добавляя примитивы. Эту операцию удобно выполнять с помощью простой программы (листинг 24.33). ] Листинг 24.33. Файп ru_block_redefine.lsp [defun START I/ block_jiame basejpoint ent ent 1st selection) [ru-app-beginl [if (cu-user-sction-enabled. "DEVELOP" T! [while [setq ent (ru-get-entsel-by-type "Выбери Олок для переопределения" "Это не EJ1OK" ( l i s t "INSERT"! T ) , [setq ent (car ent) ent__lst (entget ent; base_point (cdr (assoc 10 ent_lst)! block_name (cdr lassoc 2 ent_lstl ) base__point {ru-get-point-with-ciefault "Новая точка вставки" base_poiiit base_
Часть IV Разработка прикладных программ (ru-obj-ent-ss-explode ent) Iprinc (strcat "\пвыОерит= о&ьекты дал блока " block_nawe [if (setq selection (ru-ss-get)) ef block_name base_point selection))
[ru-app-endl (princi )
[START; Пользоваться этой программой нужно так: О если из блока надо исключить часть примитивов, достаточно выбрать переопределяемый блок, подтвердить прежнюю точку вставки и выбрать примитивы, не указывая исключаемые; О если требуется добавить примитивы, удобнее нарисовать возле существующей вставки новые примитивы и выбрать их при формировании набора; О если требуется изменить геометрию блока, нужно рядом с существующей нерасчлемснной вставкой блока нарисовать новые или откорректировать расчлененную вставку, указывать иа нерасчлененный блок, а точку вставки и набор примитивов указывать по усмотрению. Команды BLOCK (БЛОК) и REFEDIT (ССЫЛРЕД) в современных версиях системы AutoCAD очень удобны, с помощью стандартного диалогового окна команды BLOCK можно переопределить блок, но если это нужно делать сотни раз, то выбирать имя переопределяемого блока из списка быстро надоест. Тем более что мы можем и не знать имя блока, но знаем и видим, какое изображение нам требуется откорректировать.
Просмотр информации об объектах рисунка Напоследок разработаем несколько простых программ для просмотра свойств объектов — не в окне редактора свойств, а в виде списка с DXF-кодами (рис. 24,11). Не знаем, как обстоят дела у читателей, а нам очень часто приходится набирать в командной строке что-то наподобие (entget (car (entsel))], а потом разбираться с выведенным списком. Давайте напишем программу для вывода этой информации в более читабельном виде. Сначала сделаем это для просмотра свойств любого примитива (листинг 24.34). Данные мы выводим именно в виде точечных пар, не пытаясь выводить осмысленные названия — это прекрасно делает стандартный диалог свойств объектов. Е
Листинг 24.34. Файл ru_pro_list_entity_data.lsp (defun START
{/ ent 1st)
[while (setq ent (ru -get-en tsel "ЗыЭери объект"! 1 (if (setq 1st (ru-conv-list-to-st ring-list (entget (car ent) И ) (iriE-dlg~single-list "Вывод данных примитива" "Данные 1st)
Глава 24. Разработка набора инструментов^ля программистов
815
;print (entget (cat entl}) ) ) (princ)) (START) Для просмотра вложенных данных можно использовать функцию, приведенную в листинге 24.35. Паники* йлокл Счмсок данной
(74 0| [73.0] (70.41 (2 НОМЕР) (3. Номер ^зяа) (210000010)
(и о о о о о 01 (72 4)
171 01 (7 BU CAD) (61 ОЖ179Э1
[41 1C]
ill
(50.00)
£
Рис. 24.11. Просмотр списка данных объекта
Листинг 24.35. Файл ru_pro_list_nested_entity_data.lsp (defun START (/ ent 1st) (while (setq ent (ru-get-nentsel "Зыбери объект"!) (it {setq 1st (ru-conv-list-to-string-list (entget (car e n t ) ] ) ) (cu-dlq-single-list "Вывод данньк принитиаа" {if (< {length ent) 3) "Данные примитива" "Данные ВЛОЖЕННОГО прга-итива") 1st; (print (entget (car e n t ) ) ) ) i (princ)) (START) Эта программа кажется более универсальной, но она не позволяет просмотреть свойства вставки блока, поэтому напишем еще одну программу, "натасканную1 на блоки (листинг 24.36). Листинг 24.36. Файл ru_pro_list_all_block_entity_dala.lsp (deJun STfiRT 1/ block__naae lst__data s_list _list_block_data: (flefun _list_block__data (Ы^сК_пйгое etype / reslist DATA) ;setq data (tblsearch "block" block_jiame) reslist (cons data ceslist) data (ru-ent-dxf-code-data -2 data) data (entget data ' { " * " ) ) ) (if etype (setq etype (strcase e t y p e ) } ] (while data (cond
Часть IV. Разработка прикладных программ
816
[etype ;if (= etype (ru-ent-dxf-code-data 0 data)) [progn (setq reslist (cons data realist)) [if (setq data (entnext (ru-ent-dxf-code-data -1 data/)) Isetq data (entget data '("*"!)) (setq data nil)
(setq data (if [setq data (entnext (ru-ent-dxf-code-data -1 data! ) ; [entget data ' ("*"))
!T (setq reslist (cons data r e a l i s t } ) [if (setq data [entnext (ru-ent-oxf-code-data -1 d a t a ! ) ) ;se.tq data (entget data ' ( " * " ] > ! (setq data nil) ) ; end of if
);
(reverse reslist) end of defun
[while
(setq block_name (ru-get-block~name "Выбор блока для просмотра свойств")! (if (setq lst__data (_list_block_data bloek_nanie n i l ) ) [progn iforeach к lst_data Ifoceach у (ru-conv-list-to-string-list x) - (setq s_list (cons у s_list)1 1
[setq s_list (reverse s_list)) !if s__list (ru-dlg-single-list "Данные блока" "Список данных' s__list) [print lst_data| I ; _ end of if I,-_ end of if {ru-rasg-alert "Данные не извлечень;")
I [princj (START)
Глава24. Разработка набора инструментов^цляпрограммистов
BY?
Резюме В этой главе мы рассмотрели несколько программ, требующихся самим р;иработчикам. Надеемся, что чшатели обратили внимание на ю, как часто мы используем библиотечные функции, на разработку которых потратили столько времени. В следующих главах мы продолжим демонстрацию наших технологий, но уже в программах, предназначенных для конечных пользоиателей.
.ru/CAD
\jm
ГЛАВА 25
Программы общего назначения В этой главе мы разберем несколько программ общего назначения. Такие программы предназначены для облегчения работы любого специалиста. Хотя наша книга про САПР строительного профиля, но эти программы могут использоваться И машиностроителями. Мы постарались отобрать для демонстрации мал о известные решения.
Переключение компоновок При большом количестве листов (которые в данной книге будем называть компоновками), особенно с длинными именами, переключение между ними стандартным способом неудобно — приходится прокручивать список вкладок. Разработаем программу выбора компоновки из вертикального списка (рис. 25.1). Вариант такой программы, используюшсй язык DCL, можно найти в Интернете 1 . Мы пойдем другим путем — используем свое универсальное диалоговое окно выбора из списка, а кроме того, добавим в строку состояния системы AutoCAD специальную кнопку для вызова этого окна (одну такую кнопку- переключатель меню мы уже добавили). Основная функция установки выбранной компоновки приведена в листинге 25. 1 . ! Листинг 25.1. Функция ru -dig- set-layout (defun ru-cilg-set-layout (/ layout__list) (if (setq layout_list (ru-dlg- select- layout) ) :, -Вариант -(setvar "СТАВ" (car layout_list> I (via -put -act! vela /out (ru-obj-get-active-document) [car (cadr layout_list) ) ) (princ (streat "ХпВьяюуен Layout !princ; ; end of ciefun www. afralisp. eom/n e ws (elter/code/eud c7 6. htm
(getvai "СТАВ") "\n")!
Глава 25. Программы общего назначения
819
fljri*nait Midde Frame
-
МосЫ
30 Front Vew 2€ Hea. View Cuilinij LacaToi and Sijipof 1
Т.
Clamp ВЫ*. - Тсс Baft Claip j=a гг.^зг Muuil ....~— . .j..J;.m-.....^ Marilubng Mi6Fiamff
1 ^
J
Рис. 2S.1. Выбор компоновки из списка
Функция визуального выбора компоновки (листинг 25.2) возвращает список из имени выбранной компоновки и ее VLA-объекта. I Листинг 25.2. Функция ru-dlg- select- lay out ;clefuri ru-dlg-select-layout 1/ layouts__with__name [setq layouts_with_name (ru-obj-get-Iayouts-with-nartie)) [if (setq name (ru-dlg-single-list "Выбор компоновки" ( s t r c a t "Активная: " (getvar "СТАВ"]) (mapcar 'car Iayout5_with__naine: ! ; _ end of ru-dlg-single-list ) ; _ end of setq Ilist name (cdr (assoc name layouts_with_name))) nil ) ,-_ er.d of if i ; _ end of defun
Теперь разработаем функцию для добавления кнопки (листинг 25.3). ' Листинг 25.3. Функция ru-acad-ehb-malce- layouts -button [defun m-acad-sbb-make-layouts-butt on lbutton_tent button_clicked_call_back / srv] isetq 'ru_sbb_layouts_mak.ed* (vl-bb-ref ' 'cu_bb_sbb_layouts_maked" [if (not *cu_sbb_layouts_maked*I Iprogn (setq srv [vlax-create-object "AcadStatusBarButton.Button")1 (vlax-put-property srv 'Text button_text)
820
Часть IV. Разработка прикладных программ
(vlax-put-property srv 'Width 0) (vlax-put-property srv 'TooltipText "Выбор компоновки") (vlax-put-property srv 'TooltipEnabled :vlax-true) ;vlax-put-property srv 'LispFanctionOnClieked (vl-syrtibol-name button__clicked_j;all_bac)0 );_ end of vlax-put-property [vlax-put-property srv 'Visible ivlax-true) (setq *ru_sbb_layouts_maked* t) (vl-bb-set "ru_bb_sbb_layouts__maked* *ru__sbb__layouts_maked*) );_ end of progn ) ;__ end of if stv ) ,•_ end of defun
И напоследок добавим код в конец функции ru-imt-start-mcad: (setq *ru__£bb_layouts_srv* tru-acad-sbb-make-layouts-button "Компоновки" 1 ru-dlg-set-layout))
для того чтобы новая кнопка появлялась при запуске системы AutoCAD. Эти функции работают нормально, но обнаруживается неприятная особенность объекта AcattstatusBarBut ton. Button — после переключения компоновок система AutoCAD делает вид, что зависает и не выдает приглашения на ввод команды. Придется сделать ухудшение кода. Введем промежуточную функцию, реагирующую на нажатие кнопки (листинг 25.4). Мы вынуждены вместо прямого вызова функции гчdlg-set-layout вызывать ее через командную строку. I Листинг 25.4. Функция ru-acad-sbb-roake- layouts -button-on- diet (defun ru-acad-sbb-mke-layouts-button-on-click II (vlax-invoke-me thod(vla-get-activedocujnent (vlax-get-scad-object)) ' SendCoranand " (ru-dig-set-layout! \n") (princ) > ; _ end of defun ПрИХОДИТСЯ Изменить И КОЛ ФУНКЦИИ ru-init-start-rucad:
[setq "ru_sbb_layouts_srv* (ru-acad-sbb-inaks-layouts-button "Компоновки" ' m-aoad-abb-make-layouts-button-on-click; !
Вот теперь асе нормально, только "мусор" в командной строке остается.
Быстрое стирание Иногда приходится стирать много мелких примитивов, да еше н "неправильно" расположенных. Хотелось бы быстро их стирать, просто проводя мышью по рисунку, как это делается в графических редакторах растровых файлов. В качестве "ластика" можно было бы использовать прицел выбора объектов. Для этого нужно непрерывно отслеживать перемещение указателя мыши и нажатия клавиш. Решается такая задача с помощью функции grread. Все варианты использо-
Глава 25. Программы общего назначения
821
ванил этой функции мы разбирать не будем. Для наших целей пригоден следующий формат вызова — i^iread т -1 2), соответствующий условиям: D отслежиьатъ положение курсора (значение перного аргумента — т); П отображать курсор (.шачение второго аргумента — 4) в виде прицела выбора объектов (значение третьего аргумента — 2). Функция y n r e a d возвращает список, первым элементом которого будет код. указывающий тип ввода, а вторым злеменшм — либо список с координатами точки, либо целая величина. Нас ин гересуют только типы ввода, соответствующие величине первого элемента списка: 5 (перемещение указателя), 3 (указание точки) и 2 (ввод с клаьиатуры). При коде 5 или 3 список будет наподобие (5 (8Э5.7 1680.48 о . 0 1 ) , а при коде 2 — (2 431. Целая величина при коде 2 соответствует коду нажатой клавиши. Опасность п р и м е н е н и я такой функции при выборе из меню в том, что стирание Будет происходить сразу же. в том числе пока курсор перемещается к задуманному месту. Следовательно, Необходимо явно начинать и останавливать стирание. Самым естественным событием для начала и приостановки стирания был бы щелчок левой кнопкой м ы ш и (как бы указание первого стираемого примитива), а полным завершением — нажатие клмиши <Ешег> (на самом деле любой клавиши или правой кнопки м ы ш и ) . Текст программы, выполняющей быстрое стирание, приведен в листинге 25.5. Листинг 25.5. Файл ru-rubber.lsp ( d e f u n START (/ key mode point selection *erroi' ;;; Локальный обработчик ошибок, (defun 'error 4 (mag) i ru-obj-undo-end; icommand " _ . U " ! iprinc "\пстирание отменено\г." . Iprinc] ) ; _ end of defun
[ ru-ob j -undo-begiri: (setq key 3 moae т: ;while (or (= key "it (- key 5 ) ) icond !(= key 3) [princ Выхол показываем в виде результата действия по умолчанию, т. е. нажатия клавиши Enter. Фактически можно нажать любую клавишу, но не будем смущать "теток" двусмысленным предложением "Any key" .
._.
._,
.
.
i.
!if (setq mode (not mode}I "ХпРежим ЛАСТИК (клик = приостановить стирание) <Выход>" "\т\Укэ№ точку для запуска режима ЛАС1Ж <Выкод>"
822
Часть IV, Разработка прикладных программ
(Т [if (setq selection (ssget (cadr point)}J (entdel (ssname selection 0 ) 1 );_ end of if
} );_ end of cond ;setq key tear (setq point (grtread Т 6 2 ) 1 ) 1 ) ; _ end of while [princ "ХпРаСота команды завершена.") (ru-obj-undo-end) (princ) :•;_ end of defun (START! Замечание Мы делали и "продвинутый" вариант этой программы — с возможностью динамического изменения размера курсора нажатием клавиш <+> или <->. Но пользоваться такой программой оказалосв так же неудобно, как водить автомобиль, у которого имеются несколько дополнительных педалей. Программа, по нашему мнению, достойна включению в панель инструментов. Напоминаем, как это делается в системе ruCAD: [_Button{"Ластик - быстрое стирание ПОД курсором", RD_RUBBER__16, RO_RUBBER_32)]"C"C-P(defun C:RU(I[ru-spp-load "ru_rubber"));BU Обратите внимание на то, что мы переопределили обработчик ошибок, а а нем. в отличие от нашей обычной практики, предусмотрели отмену изменений. Это "опасная" программа и "тетка", испугавшись быстрого пропадания объектов, инстинктивно нажимает клавишу <Esc>. В этом случае стирание будет отменено.
Текстовая "лупа" Очень часто приходится выполнять зумирование только для того, чтобы прочитать мелкую надпись. ^
Замечание
)
В системе AutoCAD вообще не хватает "лупы", позволяющей просматривать увеличенный фрагмент. А ведь такая возможность была в версии AutoCAD R13C4 для Windows Там окно общего вида, вызываемое по команде DSVIEWER, имело инструментальную функцию Фрагмент. При этом действительно в окне общего вида показывался фрагмент изображения возле курсора. То есть окно общего вида работало наоборот. Да еще масштабом увеличения можно было управлять. И было это очень удобно! Очень просто сделать лупу для увеличения фрагмента экрана, но только в растровом виде. Можно использовать и штатный Magnifier из комплекта Windows, но проку от таких "луп" мало. Просматривать любые надписи (тексты, размеры, значения атрибутов) можно очень простой программой (листинг 25.6).
Глава 25. Программы общего назначения
823
Листинг 25.6. Файл ru_vmw_text_magnitify.lsp (defun START (/ txt) [while (setq txt (ru-get-txt-from-dwg "Выбери надпись для просмотра"!] (princ (strcat "ХпТекст указанной надписи: '" txt '"\n")|) (prrinc] ) : START)
Такую программу лучше "привязать" к кнопке на панели инструментов, иначе проще будет зумировать изображение, чем разыскивать инструмент в меню,
Быстрое рисование "такого же" объекта Очень часто пользователю нужно нарисовать такой же объект, какой он видит — на таком же слое, с таким же цветом и прочими характеристиками. Простое копирование не всегда пригодно — это может быть и линия, у которой должен быть другой контур. Да и простое копирование при быстрой работе неудобно — нужно выбрать объект, указать базовую точку, не забыв про возможную опцию Multiple (Несколько), и только потом указывать точки вставки. Да и "хвост" резиновой нити будет раздражать. Разработаем еще одну простую, но эффективную программу (листинг 25.7). Для повышения динамики работы рисование "таких же" объектов предусматривается с использованием циклов. Листинг 25.7. Файл ru_draw_by_object.lsp Idefun START (/elist ename etype list_sysvars_codes point sysvars^list val _cix:cle _text _hatch _block _command _copy-paste; •. i Локальная функция копирования-вставки примитива. Мы не любим использовать буфер обмена, но в данной ситуации считаем это возможным (defun _copy-paste (ename point; (command "_.COPYBASE" point ename ""} (_comniand "_.PASTECLIP") ) .i
r I -
Локальная функция. Имитатор левой стандартной команды ;defun _coirmand (command_nairie / do_it old_echo: [setq old_echo (getvat "CMDECHO") do_it tl (setvar "CMDECHO" 1) (while do_it (vl-cmdf command_i!ame) (while (> (getvar "CMDACTIVE") 0) (vl-ondf pause)) ;
I
Лучше вставить дополнительный запрос в командной строке, чем заставлять вновь запускать программу _Е i .' (setq do_it (ru-dlg-yes-cml (strcat "Повторить7"))) ) [setvar "CMDECHO" old echo)
824
Часть IV. Разработка прикладных программ
Локальная функция. Вставка "такого же" блока (defun _Ыое1с (elist ename point / name! [if (= (substr (setq name [cdr (assoc 2 e l i s t ) ) ) 1 1) "*") ;; анонимные блоки и штриховки (_copy-paste ename point) ;; ОЬычные именованные блоки I гтд-bloek-multi-insert-scaled-r ota ted-or-angleask name (cdr (assoc 41 e l i s t } ) icdr (assoc 42 elist)) 1ru-conv-rad-to-deg (cdr (assoc 50 elist)))
) ; _ end of if I ; _ end of defun Локальная функция.
Рисование текстов F»
(defun _text (elist ename / string height justification point ang point_l point_2 point^a) (setij height (cdr (assoc 40 elist)) ang (cdr [assoc 50 elist)) string (cdr (assoc 1 elist)) justification (cdr (assoc 72 elist))) (cond !(or (= justification aCAlignmentAligned) (= justification acAlignmentFit)) [setq point_l (cdr (assoc 10 elist)) point_2 (cdr (assoc 11 elist)))
I
_
"Точно такой же" текст редко нужен, даем возможность изменить текстовую строку [while (setq string (ru-get-string "Новьн текст" string)) [while (setq point (ru-get-point-or-exit (strcat "Точка текста '" string "' ") nil)) [ru-tex^-add string [cond ((or {= justification acAlignmentftligned) [= justification acAlignmentFiti) ;; точка 2 берется как от точки! цо точкиЗ Isetq point_l (trans point_l ename 0) point_2 (trans point_2 ename 0) ang (angle point_l point_2) point_a (polar point ang (distance paint_l poinC_2)l i
(list
point point__a)
(т point) height ang justification)))
Глава 25. Программы общего назначения
Локальная функция. Рисование кругов _. , . _
.
825
^.
^
.__
|,
[defun _circle {elist / г] {setq т (cdr (assoc 40 elist})) (whi1e (vl-cmdf "_.CIRCLE" (ru-get-point-or-exit "Центр круга" nil) r j )
1
Основная функция
_ i1 1.
;ru-app-begir.; iif (setq ename {ru-get-entsel "Выбери объект-образец для создания таких же")! (progr\ ;[
Запоминаем точку указания - пригодится в качестве базовой для копирования и встазки _.
.
т
{setq point enanie
L
т
_,
L
.
1
•
(cadr enamel fear enameJ
^ Список С!5ОЙств выбранного примитива — .
elist etype
(entget enarae) (strcase (cdr (assoc 0 elist]))
Начинаем формировать список системных переменных, которые нужно запомнить и восстановить. Сначала составляем список переменных, не зависящих от типа примитива . —— — —— — |, list_sysvars_codes (list (cons 6 "CELTYPE") (cons 1 "TEXTSTYLE") Icons 8 "CLSYER") (cons ЗЭ "THICKNESS") (cons 62 "CECOLOR"} (cons 370 "CELWEIGHT") );_ eild of list );_ end of setq
Добавляем коды и переменные, зависящие от типа примитива [cond {(= etype "HATCH") [setq list_sysvars_codes (append (list (cons 2 "НРНйМЕ") (cons 41 "HPSCALE") (cons 52 "KPANG")] list_sysvars_codes);_ end of append );_ end of setq ) ; (or (= etype "POLYLINE") (= etype "LWPOLYLIHE"))
[setq list_sysvars_codes (append (list (cons 43 "PLINEWTD")) list_sysvars_codes] !;_ end of setq
826
Часть IV. Разработка прикладных программ ((= etype "TEXT") !setq list_sysvars_codes (append (list (cons 40 "TEXTSI2E")} list_sysvars_codes) I;_ end of setq
);_ end of cond r I
•
•
~
'
'
Список общих системных переменных _ . . . . . .-— jsetq sysvarE_list
~
.
'
.
~
.
.
-
(list (list "CMDECHO" 01 (list "BLIPMODE" 0) (list "OSMODE"} [list "PICKBQX") (list "HIGHLIGHT") (list "ORTHOMODE"))
', ii
),-_ end of setq
Объединяем все запоминаемые переменные в один список (гаарсаг (function (lambda (x) (if (setq val (setq sysvars_list (cons (setq sysvars_list (cons "I list_sysvar s__c odes I;_ end of raapcar • i_ Запоминаем список переменных и Теперь, при ошибке, они будут
(cdr [assoc [car x) elist)11 (list (cdr xj val) sysvars_list)) (list (cdr x]] sysvars_list|)
их значений, как это делается в обработчике ошибок. восстановлены
(ru-error-sava-aysvars aysvars_list) Для каждого типа примитива-образца запускаем соответствующую функции -, _ -. _ _. -, _—._[cond ((= etype "CIRCLE"! (_circle elist)}
t
-
(I- etype "HATCH") ;; Вариант стандартной команды (_command "__.ВНАГСН";
!ru-hatch-draw-pattern (cdr (assoc 2 elistl) (cdr (assoc 41 elistl J (cdr (assoc 52 elist)))) ! (= etype "INSERT") l_block elist ename point)) ( [= etype "LINE") (__comnand "_.LINE") ) [(or {= etype "POLYLINE") (= etype "LKPOLVLINE")) (_command "_.PLINE")1 : (= etype "TEXT") (_text elist enamel) -| . __ . . . . . .—. . . — Для любого другого типа
[Т (__copy-paste ename point)) ) ;__ end of cond Зосстанавлизаем значения переменных - . . ^- . . (ru-error-restore-sysvars) 1;_ end of progn ); end of if
-
_
..
_
,.
Глава 25. Программы общего назначения
827
[ ru-app-end) (princ) };_ end of defun [START)
Опыт показывает, что как только пользователи понимают, что делает эта функция, кнопка Такой же на панели инструментов становится одной из самых любимых.
Программы для быстрого штрихования При разработке некоторых разделов проекта штриховать приходится много, и стандартное диалоговое окно, открываемое командой ВНАТСН (КШТРИХ), в котором можно сделать какую угодно штриховку, становится тормозом в работе. При штриховании возникают две основных проблемы — выбор нужного образца и установка правильного масштаба. Традиционно выбор образца производился из слайдового меню, сейчас используется диалоговая команда ВНАТСН (КШТРИХ). Стандартный выбор образца из списка с последующим просмотром в микроскопическом поле является издевательством над пользователями. Кроме того, пользователю не важны маловразумительные названия, ему нужно выполнять штрихование конкретного изображения (металл или кирпич в разрезе), и можно использовать один образец, но с разными масштабами и углами поворота для различных изделий. [•выбери образец шчриковки
• • • • • • • • • G ^ Z I]
'.;- ь . of @ п а {-: Шлифовки- сборник R Разрезы Металл рвзреь Бетон Бутобетон
•*
Изоляция Стекло Камень разрез Кирпич разрез Утеплитель R Растительность Белого ~ Газон f
:^
1
1
'^ьшки из глины
J
п*
Но. Степе Трава 13ыру&й К Всиа Всего ,jr;.e 132
Уял: 5
Выполните —
-
Закрыть, -
Рис. 2S.2. Выбор образца штриховки
Разумеется, мы предусмотрели выбор образца из иллюстрированного XML-меню (рис. 25.2). На рисунке показано диалоговое окно, выводимое при выборе опции
Часть IV. Разработка прикладных программ
828
X M L во время работы функции ru-han.-h-draw-patt.arn (см. главу 22). Когда пользователю нужно нарисовать заведомо штрихуемый объект (например, контуры зон различного назначения на генплане], то он должен иметь возможность выбирать не образец штриховки, а команду, внутри которой создается штриховка с заданными параметрами. В результате программирование рисования изображении со штриховками может свестись к разработке нескольких простеньких вариантов использования типовой функции штрихования и к формированию XML-меню. Установка масштаба штриховки также должна быть упрощена. Для конкретных изображений заранее определенный масштаб указывается в аргументах функций, а для "свободной штриховки" оптимальный масштаб у нас определен заранее и сохранен для каждого образца в файле hatch.ini (о том, как установить оптимальный масштаб штриховок, мы писали в главе 24). Универсальная программа свободной штриховки приведена в листинге 25.К. Листинг 25.8. Файл rujiatch_draw.lsp (defun START {/ hatch_narae) (ru-app-begln) (if (setq hatch__name (ru-get-hatch-name "Выбор образца штриховки")! [ru-hatch-draw-pattern hatch__name (ru-get-hatch-scale hatch_name) 0) !;_ end of if !ru-app-end) (princ) ) : START) Пример специализированной программы рисования контуров зданий приведен в листинге 25.9. 1
-
I Листинг 25.9, Файл ru_gp_house_hatch.lsp (defun START (pattern scale ang / ss} (ru-app-begin) [if (setq ss Iru-pline-make-multi-contour "штриховки здания"})
(ru-hatch-draw pattern scale ang ss) ) ;_ end of if ;ru-app-end) (princl ) / _ end of defun
Пример вызова этой программы из XML-меню показан в листинге 25-10. ! Листинг 25.10. Файл hatch_zd.ruxm <7xml version=I1.С' encoding='uindcws-1251'?> •iroot name='Назначение зданий' macro=''J 1 1
Глава
25.
Программы
общего
назначения
_
829
' (prcgn (if (ru-app-load "ru_gp_fiouse__hatch.") (START "ansi31" 15 0 ) ) } V > 1 -
-
Иногда требуется изменить "густоту" существующей штриховки. Разумеется, можно сделать это посредством диалогового окна свойств, а можно и проще, специальной программой (листинг 25.11). Чуть более сложную функцию, предназначенную для подбора оптимального масштаба с записью в файл, мы рассмотрели в главе 24. Листинг 25.11. Файл ru_ed_hatch_scale.lsp [defuri START (m / ename old_scale) ;;; Изменение густоты штриховки в К раз [ru-app-begin) [setvar "HIGHLIGHT" 1) [while (setq ent (ru-get-entsel-by-type "Выбери штриховку" "Это ке ШТРИХОВКИ" (list "HATCH") t ) ) (setq enarae (car ent)] l i f (setq old^scale (cdr (assoc 41 (entget e n a m e l ) ) ) [command "_.-HATCHEDIT" ename "_P" "" (" old_Ecale ra) "") ;; это SOLID ;prlnc "ЧпУ этой штриховки масштаб изменять н е л ь з я ! \ п " ) ) ; _ end of if ) i_ end of while (ru-app-end) Jprincl ),end of defun
Замечание Изменение масштаба штриховки с помощью функций entmod и eritupd не получается — свойства меняются, а изображение остается прежним, поэтому применена команда HATCH EDIT (РЕДШТРИХ)
Псевдоштриховка с помощью блока При всем многообразии образцов штриховок нужную можно не найти. В этом случае может помочь "штриховка" с помощью блока (листинг 25.12).
830
Часть IV. Разработка прикладных программ
Листинг 25.12. Файл ru_draw_hatch-block.lsp (defun START (Header mb bn scale dx dy cliez ud! (ru-draw-block-hatch Header rab bn scale dx dy chez ud) [princl
Программа является "оберткой" к основной функции штрихования блоком (листинг 25.13). Листинг 25.13. Функция ru-draw-bloclc-hateb Idefun ru-draw-block-hatch (Header block_lib block_narae scale dx dy is_chess ang_deg / contour_ent LSTBOX LSTVER IX LY NX KXT NY NYT SM TO ГМЙХ TT X XO ХМЙХ Y YO YMAX) Штриховка с помощью блока. Аргументы: Header - заголовок block_lib - библиотечный блок block_name - блок scale - масштаб блока мм/бум dx - интервал по X мм/бум dy - интервал по У мм/Буы is_cfiess - признак шахматное™ ang_deg - поворот блока Примеры: (ru-draw-block-hatch "Штриховка блоком" "ru-lib-topo" "ДЕРЕВО_ШИРОКОЛИСТВ_ТОПО" 1 В 8 Т 0} (ru-draw-block-hatch "Штриховка блоком" "ru-lib-conmon" "ru__circle_and_cross_unit" 1 3 3 NIL 45) ;ru-app-begin) [if (ru-block-lib-insert block_lib block__name} (progn (setq dx (ru-conv-millimeter-in-papet-to-unit dx) dy (ru-conv-milliraeter-in-paper-to-unit dy) scale (ru-conv-millimeter-in-paper-to-unit scale)] (if is_chess (setq sm (/ dy 2.01) (setq sm 0]) [if (setq IstVer (ru-pline-raake-any-contour Header t NIL); (progn (princ "ХпЖците, рисую...\п") (setq contour_ent (entlast) IstEox (ru-geoni-bound-box (Car IstVer); tO (cadr Istbox) кО (car tO) yO (cadr tO) troax (car Istbox) xmax (car tmax) углах (cadr tmax| x xO у yO Ix (- xmax xO) ly i- ymax yOJ nx (fix [/ Ix dx)) ny (fix (/ ly dy)) nxt 0 nyt 0) (repeat (1+ nx) (setq nxt (1+ nxt)) (repeat (1+ ny) (setq nyt (1+ nyt) tt (list X Y))
Глава 25. Программы общего назначения
831
(if Iru-match-is-even nyt) (setq tt (polar tt D sml)I !if [ru-geora-is-point-in-cotitour tt (car I s t V e r ) ; Irti-block-insert-cbj block__name tt scale scale scale [ru-conv-deg-to-rad ar.g_deg)K [setq Y {+ Y d y ) ) ) (setq у yO nyt O X [+ x dx) j
(if [ru-dlg-yes-cml "Стереть контур") (entdel contour_entl) 1;__ end Of progn I;_ end of if ) ; _ end of progn ),-_ end of if [ru-app-endl [princ} );_ end of defun
В результате можно получить изображение, подобное показанному на рис. 25.3.
00000 000 000 Q QOQOQOOOOOOOO Q O O Q £00000000$ QOOOOOOOOOOOOO 000000000000 0 00000 00 QO^ 00$QQОО 5000 Q Q O O 0 0 OOQO 0000 0000 000000 000 00 Рис. 25.3. Псевдоштриховка с помощью блока
Работа со слоями Выполнять различные действия со слоями приходится очень часто. Стандартные средства AutoCAD достаточно удобны, но только пока слоев в рисунке немного. Как только количество слоев начинает превышать десяток, работа с н и м и становится мучительной. Особенно это касается простых операций — включение, замораживание, блокирование. У нас же еще имеется классификатор слоев, для работы с которым мы уже рассмотрели несколько функций (см. главу IS) — запуск классификатора, выбор слоя, получение дополнительных данных для классифициро на иного слоя, вывод списка слоев с комментариями, выбор слоя указанием. Теперь разработаем несколько программ для повышения динамичности работы.
832
___^_
Часть IV. Разработка прикладных программ
Установка слоя по образцу Это была одна из первых программ, которую разрабатывали, наверное, все программисты, пока фирма Autodesk не включила ее D состав "полустандартных". Так как наличие команды AT_MOLC не гарантируется, мы включим в наше меню собстьенпый аналог (листинг 25.14), "приняли" его к привычной всем кнопке. Листинг 25.14. Файп rujayer_set__by_object.lsp (defun START (/ layer) (if (setq layer [ru-get-layer-from-dwg "Укажи сСгъект в желаемой слое")) (ru-layer-current layer) ) (pzrinc)) [STftRT)
Отключение слоя Так же проста, но эффективна программа отключения указанного слоя (листинг 25.15) — зачем искать нужный слой для отключения в длинном списке, если можно просто указать на объект. Аналогичные программы написаны и для блокировки и замораживания слоев. ! Листинг 25-15. Файл ru_layer_off_by_object.lsp (defun START (/ layer) (while [setq layer (ru-get-layer-from-dwg "Укажи объект в отключаемом слое")) [ru-layer-toggle-on-off layer) I (princ)) (START)
Включение всех слоев Любой, кто хоть раз мучился с "включением лампочек" на нескольких десятках слоев, поймет, как облегчает работу программа, приведенная в листинге 25.16. Листинг 25.16. Файл ru_layer_show__all.lsp (defun START () (vlax-for each (ru-obj-get-layeisi (vla-put-layeron eacfi :vlax-tiue)i (princ "\nBce слои включены")(princ)) (START)
Оставить видимыми указанные слои Следующая программа {листинг 25.17) имеет противоположное назначение — оставляет видимыми только указанные слои.
Глава 25. Программы общего назначения
833
! Листинг 25.17. Файл ru_layer_stay_selected.lsp [defun START (/ layer layer_list) (while (setq layer (ru-get-layer-from-dvjg "Укажи объект в ОСТАВЛЯЕМОМ слое. Последний указанный станет текущим")} (princ (strcat " ^Оставляем слой " layer I ] [if (not (member layer l a y e r _ l i s t l ) [setq layer_list /cons layer layeE_list) I ) I ;; Сразу устанавливаем текущим последний слой - в списке он первый !ru-layer-current (car layer__list)) (vlax-for each (ru-obj-get-layers) (if (not (member (ru-obj-get-obj-name each] layer_list)} • (vla-put-layeron each : v l a x - E a l s e t ) I ( p r i n c l ) (START;
Перелистывание слоев Следующая программа (листинг 25.18) позволяет просматривать слои по одному, отключая все остальные. При таком просмотре пользонатель сразу же увидит объекты, находящиеся не на своих слоях. Во время просмотра можно оставлять любой слой видимым, наглядно формируя требуемый набор. ••-
:•
-—"
| Листинг 25.18. Файл ru_layer_showj)y_one.lsp (defun START (/ layer_list layer_naroe layer_mim opt done last_layei:) (setq layer_list (ru-obj-list-layers)) ;; Отключаем все слои (vlax-for each (ru-obj-get-layers} (vla-put-layeron each :vlax-falsel) [setq layer_name (getvac "CLAYER"} 1ауег_пшп (vl-position layer_narae layer_list) last_layer layer_narae) (while (not done] ;;; включаем слой (tu-layer-оп layeir_name) (setq opt (ru-get-kword (strcat "СЛОЙ: " layer_name) "Prev Next stay Exit" " N e x t " ) ) (cor.d [ { = opt "Prev"; ;; Отклкрчаем (ru-layec~off layer_name) г;Берем предыдущий номер слоя (setq layer_nun (1- 1ауег_галп)) ;; Если достигли начала, переходим в конеи (if (< layer_num 0) (setq layee__nurn (1- (length layer_list)) I ; ) ( I - opt "Next") (ru-layer:-off layer_name) (setq laysr_mffli (1+ layer_num)i (if (>= layer_num (length layer_listl) (setq layer_rium 0 ) ; 1 27 3ar 834
834
Часть IV. Разработка прикладных программ
[(= opt "Stay"] ;,- Оставляем слой включенным и удаляем из списка (setq layer_list (vl-remove layer__nair'e layer_list) layer_num (It layer_nun! l a s " _ , a y p r layer_namel [if (>= layer_num (length layer^listH (setq layer_num 0}) I
(T (ru-layet-off layer_name! [setq done т ) ! ) ; _ end of cond [setq layer_name [nth layer_num layet_list]I (if (< [length layec_list) 1) (setq done T ) ) )
,'; На выходе полаем текущим последний оставленный слой (ru-layer-current last_layer) (princ) )
(START)
Стирание слоя Программа стирания объектов на слое также входит в джентльменский набор начинающего программиста. Действительно, это удобный инструмент, ускоряющий работу. Попробуем развить традиционное решение. Начнем с функции стирания объектов в заданном слое {листинг 25.19). Функция стирания вернет количество удаленных объектов, которое, кстати, может быть нулевым, т. к. если слой будет заблокирован, то объектная функция ru-obj-ent-ss-erase отбросит объекты на заблокированных слоях и сообщит об ошибке автоматизации. В данном случае мы не занимаемся проверкой блокировки слоя, поскольку можем обеспечивать проверки на верхнем уровне (листинг 25.20). '• Листинг 25.19. Функция ru-layer-delete [defun ru-layer-delete (name / ss result) (if (setq ss (ssget "_X" (list (cons S n a m e ) ) ) ! (progn (setq result (sslength s s ! ) (ru-obj-ent-ss-erase ssl [if (setq ss (ssget "_X" (list (cans 3 n a m e ) } ) ) [setq result (- result [sslength s s i l l i ) ] result
Конечную программу стирания объектов в слое (листинг 25.20) разработаем с проверкой и подготовкой условий для стирания. Листинг 25.20. Файл rujayer_erase.lsp [defun START (/ name л do) (ru-app-begin)
[while (setq name (rxi-get-layer-r.a-'re "С.той для СТИРАНИЯ" nil)! [setq do T]
Глава 25. Программы общего назначения
635
[if (tu-layer-is-lock name} [if (ru-yes Istrcat "ХпСлой \n"' name '"\n заблокирован " "ХпРаз&локировать и стереть"!] [ru-layer-unlock name) [setq do nil)1) (if do (if (setq n (ru-layer-delete name)] [princ (strcat "ХпСтерто " (ru-stting-nuniber-end n "объект" "а" "ов" "ов"] " иэ слоя ' " name Ill] (ru-app-end) (princ) I
[START) Как видите, даже в такой простой программе мы умудрились использовать восемь библиотечных функций, повышающих надежность к удобство работы. Например, выбрать слой можно указанием на примитив и из комментированного списка. А теперь напишем программу удаления слоя, т. е. стирания всех объектов и ликвидацией определения слоя в рисунке. Сначала разработаем функцию удаления (листинг 25.21). Листинг 25,21. Функция ru-layer-purge (defun ru-layer-purge (name / obj ss) ; ; Если слой заблокирован - разблокируем его (if (ru-layer-is-lock name) ( r u- layer -unlock name) ) ; ; Если на слое есть примитивы — сотрем [if (setq ss (ssget "_X" (list (cons 8 name)]]] (ru-layer-delete narae) ) ; ; Если слой текущий — сделаем активным слой О (if (= fgetvar "CLAYER") name] (setvar "CLAYER" "0")) (if (setq obj Iru-obj-layer-by-narne name]) [ru-error-catch (function (lambda (I (vla-delete obj) t] ] (function (lambda (xl [princ (strcat "ХпОШИБКА RU-LAYER-DELETE: " x! ] nil)) I nil I
Удаление слоя мы выполнили объектным методом, предусмотрен традиционн) ю ловушку ошибок с сообщением в случае ошибки. Основная программа удаления слоя у нас не будет зациклена и будет выдавать дополнительный запрос (листинг 25.22). j"-™""T—«4™» ....... -- -" — "-; ............ ....................... - ........................ •„• ............... -.'" ................. -: ........ "•- ........ ---------- .............. - ............................. " ........ 1
[ Листинг 25.22. Файл ru_layer_putge.lsp
(defun START (f name) !ru-app-begin) (if (setq name ( ru- get -layer -name "Слой для полного УДАЛЕНИЯ" nil))
636
Часть IV. Разработка прикладных программ
(if (not (ru-no (strcat "ХпПрограмма полностью УДАЛЯЕТ слой \л" name "\пи все объекты на нем с удалением из таблицы слоев\пБудеы делать"]II (ru-layer-purge name})) (ru-app-end) (princ) ) (START)
Общие средства рисования Многие изображения используются при разработке любых частей проекта — различные линии, контуры, тексты, отметки, уклоны, обозначения видов и разрезов, выноски позиций и диаметров, таблицы и т, п. Все эти изображения легко программируются вообше и очень легко — с использованием разработанных нами библиотек базовых функций. Важно обеспечить удобный доступ пользователя к средствам рисования. Самые "ходовые" программы можно привязать к кнопкам панелей инструментов, но экранное место ограничено, а представления о полезности того или иного инструмента у всех разные. Можно заготовить описания панелей на все программы, но как же нам "прокормить" столько "батраков", сколько потребуется хотя бы для рисования 10000—15000 миниатюр для кнопок? Как всегда, мы видим выход в использовании иллюстрированных XML-меню. Особенности XML-меню позволяют вставлять одни и те же макросы в разные меню. Например, рисование высотных отметок может быть и в меню общих средств рисования, и в меню фасадов, разрезов и схем трубопроводов. Далее мы рассмотрим несколько примеров часто исполиуемых изображений.
Рисование специальных линий В главе 22 мы разбирали различные способы рисования трасс. В пользовательских программах рассмотренные функции заключаются в небольшую оболочку. Например, программа ru_draw_trass_itype (листинг 25.23) позволяет рисовать объект заданным типом линии. : Листинг 25.23. Файл ru_draw_trass_ltype.lsp (defun START (Itype lineweighc msg can_chanche_lw arc_enabled / old__ltype) (ru-app-begin) (setq old__ltype (getvar "CELTYPE") ) (ru-ltype-set-current Itype) (ru-trass-draw-lw-from-pt1-arc msg arc_enabled can_ehanche_lw lineweight OJ (cii- Itype- set -cur rent old_lcype] {ru-app-end) (princ) Может возникнуть вопрос — зачем вообще нужны такие программы? Можно просто установить нужный тип линии и рисовать стандартными средствами. Конечно, можно, но: О нужно знать, какой именно тип линии устанавливать для рисования конкретного изображения (одних пунктирных линий с разным соотношением длины штриха и пропуска имеется очень много);
Глава 25. Программы общего назначения
837
О требуемый тип линии должен быть загружен; П после рисования объекта необходимо восстановить ранее действовавший тип линии. Все эти задачки и автоматизирует приведенная программа. Конкретное ее применение может быть описано в XML-меню (листинг 25.24). j Листинг 25.24. Фрагмент XML-меню контуров зданий - • Два объекта рисуются пунктирной линией, но с разной длиной штриха. Пользователю вообще не нужно знать никаких технических детали — он выбирает не тип линии, а изображаемый объект. Еще один пример (листинг 25.25) — рисование трасс текстовым типом линии. Эта программа вроде бы вообще ничего своего не делает, только вызывает резидентную функцию. Однако кое-что делает функция-загрузчик ru-app-ioad (см. главу 22) и базовой функции передается часть постоянных аргументов. Листинг 25.25. Файл ru_draw_trass_text_ltype.lsp Idefun START [txt arc_enabled len__dash first_poirit secondjpoint) (ru-trass-draw-lw-txt txt len_dash first_point second_point arc_enabled t (ru-lw-current) 0) Iprincl
Вызов этой программы также включается в XML-меню, в макросы которого записаны подготовленные вызовы программы (листинг 25.26). ; Листинг 2S.26. Фрагмент XML-меню трасс
'
| Листинг 25.27. Файл ru_draw_trass_txt_line.lsp [defun START (/ txt) [while (setq txt (ru-get-string "Обозначение линии: " " T l " ) ) [ru-trass-draw-lw-txt txt nil nil nil Т Т (ru-lw-current) 0)} (princ)} [START)
Врезка и привязки текстов к линиям Программы-близнецы для врезки текста в линию (листинг 25.28) и для написания текста над линией (листинг 25.29) пригодятся, когда использование текстового типа линии неприемлемо. Напомним, что используемые в них функции всегда пишут строку с правильной ориентацией относительно линии — текст не может оказаться написанным "вверх ногами". I Листинг 25.28. Файл ru_txt_in_Nne.lsp (defun START [/ txt) [ru-app-begin) (setq txt ""} [while (setq txt (ru-get-string "Текст дг.я врезки в линию" txt) (ru-draw-tst-in-line t x t ) ) (ru-app-endl(princ)1 [START)
:
Листинг 25.29, Файл ru_txt_alongjine.lsp (defun START (/ txt) (ru-app-begin) (setq tut "") (while (setq txt (ru-get-string (tu-draw-txt-up-line txt); (ru-app-end) (princ)) (START)
"Текст для написания НАД пинией" txt))
Несложно написать и модифицированные прснраммы, врезающие предопределенные в XML-меню тексты в линии.
Рисование контуров Топографам и "генплапистам" часто приходится рисовать замкнутые контуры с определенным типом линии, при этом контур может быть сглаженным. Решает такие задачи программа, показанная в листинге 25.30. l
Листинг 25.30. Файл ru_dr aw_dot_ctosed_pline.lsp [defun START (Itype / old_ltype) (ru-app-begin)
Глава 25. Программы общего назначения
__
__
__
839
isetq old_ltype (getvar "CELTYPE")) [ пд-ltype-set-current Itype) Awhile ( ru-p line -draw- closed- Iw-iusg "замкнутого контура" t ( ru- lu- current ) 01 [if (ru-yes " Сгладить контур"! Ivl-cmdf "_.PEDIT" (asadd (entlast) (ssaddl ) "_FIT" "_Х"П> (ru-ltype- set-current old_ltype] [ru-app-endl [ptincl
Вызоц также производится посредством XML-меню (листинг 25.31). | Листинг 25.31. Фрагмент XML-меню контуров Разумеется, существуют и варианты рисования незамкнутых линий заданного типа со сглаживанием по запросу,
Рисование прямоугольников У нас имеется много программ для рисования различных изображений, но разберем мы только одну — рисование прямоугольника. Как выглядит прямоугольник, представляют все читатели (в отличие, например, от изображения вентилятора), и такая программа будет понятна всем. В строительном проектировании очень часто приходится рисовать различные объекты прямоугольной формы. Стандартная команда RECTANG (ПРЯМОУГ) не очень удобна — хотя бы из-за необходимости поворота системы координат для рисования под углом. Написать свою программу рисования прямоугольника можно и в две строки, но пользы от такой программы будет мало. Мы разработаем довольно "хитрую" программу, которая пригодится многим специалистам. В диалоговом окне Прямоугольник (рис. 25.4) этой программы можно: О задать размеры сторон прямоугольника вводом с клавиатуры или измерением в рисунке (размеры сторон запоминаются и восстанавливаются); О размеры сторон можно указать во время работы; П возможны три способа рисовании — по стороне, по углу и по центру; D возможна установка веса линии прямоугольника. Кроме того, имеются и скрытые особенности, не просматривающиеся в диалоговом окне. На рис, 25,5 показаны некоторые изображения, созданные программой рисования прямоугольников, На самом деле программа не рисует прямоугольники отрезками или полилиниями, а создает блоки прямоугольных объектов. Частным случаем является обычный прямо-
Часть IV. Разработка прикладных программ
840
угольник. Кроме линейного контура прямоугольника или вместо контура заполнителем прямоугольника может являться другой блок, лучше единичный. ЛрЯМОУГОЛЫ!**
Запрашивать первым • ~ Сторсча I
f~ ^гоя
Центр
Рис. 25.4. Диалоговое окно рисования прямоугольника
Рис. 25.5. Все это "прямоугольники"
Зачем мы создаем из контура блок? Да потому, что одинаковых прямоугольников н рисунке может быть очень много, например здания на плане города. Если прямоугольный объект создан в виде блока, то его удобно повторять программой "Такой же" (см. листинг 25.7), Прием создания блоков мы применяем довольно часто, например, для рисования различных окружностей — разных диаметров, с разным весом линии, с центровыми линиями или без них. Функции ru-draw-rectangle (листинг 25.32) передаются аргументы: О dig_caption — заголовок диалогового окна, если nil — принимается "Прямоугольник"; О block_lib — имя библиотеки блоков, если nil — принимается блок из имеющихся в рисунке; О biock_na.-ne_unit — ими добавочного ЕДИНИЧНОГО блока, если nil — создается пустой прямоугольник; О hole — флаг Tnil необходимости рисования люкои. Последний аргумент появился после того, как выяснилось, что программа часто применяется для рисования резервуаров или камер тепловых сетей с неизвестным заранее количеством люков.
Глава 25. Программы общего назначения :
I Листинг 25.32. Функция rn-draw-rectangle (defun ru-draw-г ее tangle (dlg_caption block^lib block__naine__unit hole / dcl_id do is_ask_dim is_by__angle is_by_center is_by__side lst_x_y what_next x у _test _rect—set_as _reet-by-center __rect-by-angle _rect-by-side _rect-block ___rect-draw-hole) Функция рисования люков. (defun _rect-draw-hole (lineweight / diam_hole pnt) (setq diam_hole (ru-conv-millimeter-to-unit 600.0)1 (while (setq pnt (ru-get-point-or-exit "Центр люка" nil)) (ru-draw-circle-and-cross pnt diara_hole 0 lineweight)) Функция создания прямоугольного блока из единичного блока. Аргументы:
block_narne_unit - имя дополнительного единичного блока; ent - примитив контура прямоугольника; tO - базовая точка для создания блока; tv - точка вставки блока; х - масштаб по оси х; у - масштаб по оси у; ang - угол поворота; lineweight - вес пинии; (defun _rect-block {block_name_unit ent tO tv x у ang lineweight / prefix block_name selection) [if block_nairie__unit (setg prefix block^namejjnit) {setq prefix "ка_вох"}| (setq block_naitie {strcat prefix "_" (itoa lineweight) "-" (itoa ( f i x (' x 1000))) "-" litoa (fix (* у 1 0 0 0 ) ) ) ) ) [if (tblsearch "BLOCK" block_name) [progn (entdel ent) (ru-block-insert-obj block_name tv 1 1 1 ang)) (progn [setq selection (ssadd) selection (ssadd ent selection); (if block__nanie_unit (progn (ru-block-insert-obj block_name_unit tO x у 1 0) (setq selection (ssadd (entlast) selection): II [ ш -block- din -make blocl;__name tO selection lineweight) (if [tblsearch "BLOCK" block__namei (ru-block-insert-obj blocfc_naine tv 1 1 1 ang) (alert (strcat "He создан блок " block_name))
I ) [setq selection nil selection {ssadd) selection (ssadd (entlast) selection)) selection
841
842
Часть IV. Разработка прикладных программ
Рисование прямоугольника по стороне (defun __rect-by-side (block_name_unit х у is_ask_j3iin hole / ang om ptO ptl pt2 pt3 pt4 sa) (setq от (getvar "ORTHGMODE") sa (getvar "SNAPANG")) (while (setq ptl (ru-get-point-or-exit "Начало 1-й стороны" nil)) (setq pt2 (ru-get-point-reguired !if is_ask__dim "Конец 1-й стороны" "Направление 1-й стороны") ptl) ang (angle ptl pt2J) [if is_ask_dim [setq x (distance ptl pt2)) (setq pt2 (polar ptl ang x)) ] [if is__ask_dim (progn (grdraw (trans ptl 0 1) (trans pt2 0 1) -1) (setvar "ORTHCMODE" 1) (setvar "SNAPAHG" ang) [setq у [ru-get-dist "Длина второй стороны" у ptl)) [grdraw (trans ptl 0 1) (trans pt2 0 I) -1))) ;;рисуем под углом 0 длч создания блока Isetq ptO (getvar "VSMAX") pt2 (polat ptO 0 x) pt4 (polar ptO (ru-geom-go-left 0) y) pt3 (polar pt2 (ru-geom-go-left 0) y)) [ru-pline-add (list ptO pt2 pt3 p t i ) t 0 (ru-lw-current) nil) [setvar "ORTHCMODE" om) (setvar "SNAPANG" sa) [_rect-block block_name_unit (entlast) ptO ptl х у ang (ru-lw-current)) [if hole [_rect-draw-hole (ru-lw-current))) ) ; _ _ end of while [list x y)
Рисование прямоугольника no ywiy [defun _rect-by-angle (block_narne_unit х у is_ask__dini hole / ptO ptl pt2 pt3 selection) [while (setq ptl (ru- get -point -or -exit "Левый нижний угол" n i l ) ) [if is_ask_dim (setq x [ru-get-dist "Длина 1-й стороны" х ptl! у (ru-get-dist "Длина 3-й стороны" у ptl))) [setq ptO (getvar "VSMfiX") ptZ [polar ptO 0 x) pt4 [polar ptO (ru-geora-go-left 0) y) pt3 (polar pt2 (ru-geom-go-lefc 0) y) ) (ru-pline-add (list ptO pt2 pt3 p t 4 ) t 0 [ru-lw-current) n i l ) [if [setq selection (_rect-block block__name_unit (entlast) ptO ptl х у 0 (ru-lw-current) ) ) [progn [prompt "\пУгол поворота; "] (vl-cmdf "_. ROTATE" selection "" (trans ptl 0 1)) (while (> (getvar "CMDACTIVE"] 0) (vl-cmdf pause)] 1 (if hole (_rect-drawhole ( ru-lw-current ) ) ! ) [list к у) I
Глава 25. Программы общего назначения
843
Рисование прямоугольника по центру
;def-an _rect-by-center (block_name_unit к у is__ask_dini hole / ptO ptl pt2 pt3 pt4 selection! ; while (setq ptl (ru-get-point-or-exit "Центр" nil)) (if i3_ssk__diin (setq
x (* (tu-get-dist "Полудлина 1-й стороны" (/ х 2} ptl) 21 у (* (ru-get-dist "Полудлина 2-й стороны" (/ у 2} ptl} 2) ) 1 (setq ptO (getvar "VSMAX") pt2 (polar ptO 0 x) pt4 (polar ptO (ru-geom-go-left 0) y) pt3 (polar pt2 (ru-geom-go-left 0) y) ) [ru-pline-add (list ptO pt2 pt3 pt4) t 0 (ru-lw-currerit) nil) (setq pt2 (polar ptl ( ru-geom-go-back 0) (/ x 2J) pt2 (polar pt2 (ru-geom-go-right 0) {/ у 21!) (if (setq selection
( rect-block block__name__unit (entlast) ptO pt2 x у 0 (ru-lw-cucrent; ) ) [prrign (prorapt "ХпУгол поворота: "}
;vl-cmdf "_. ROTATE" selection "" (trans ptl 0 1}) [while (> (getvar "CMDACTIVE") 0) (vl-cmdf pause) })) (if hole (_rect -draw- hole (ru-lu-current) I ) ) : _ end of while ;list к y)
Далее идут простые функции для работы с диалогозым OKHQE-I. С^ьнно мы не стремимся, "по-Лисповски" оптимизировать, т. к. при этом легко потерять логику работы. (defun _rect_set_as () !if ia_by_side (progri (set_tile "as_side" "1") (set_tile "as_angle" "0") !set_tile "as^centr" " 0 " ) D ;if is_by_angle (progn (set_tile "as_sifle" "0") (set_tile "as_angle" "1")
(set__tile "as_centr" "0")1! (if is_by_center (progn (set_tile "as_side" "0") (set_tile "as_angle" "0") [set_tile "as_centr" " 1 " ) ) ! Idefun _test !) ;^iode_ tile "outton__do" 0) [setq ts__ask_dira [e (get_tila "in_work"! "1")) [if is_ask_diin [progn (set__tile "iri_work" "1") (mode_tile "ed_y" 1} [mode_tile "get_y" 1) (mode_tile "ed_x" li (mode_t:ile "get_x" 1 ) : [progn (set_tile "in_vroEk" "0") (mode_tile "ed_y" 0! (mod=_tile "get_y" 0) (raode^tile "ed_x" 0) (modejrile "get_x" 01) (set_tile "error. ...... ) isetq x (atof (get_tile "ed__x")l у (atof (get_tile "ed_y") ) )
Часть IV. Разработка прикладных программ
844
[if (<= х 0) (set_tile "in_work" "1")) [if (<= у 0) (set_tile "in_work" "1")) (setq is_ask_dim {= (get_tile "in_work") "1") is_by_side (= (get_tile "as_side") "1") is_by_angle (= (get_tile "as_angle") "1"; is_by_center [= (get_tile "as_centr") "1")
Основная [ru-a.pp-begin)
(if (null dlg_caption)
(setq dlg_captior. "Прямоугольник") )
[setq DO T)
[if (and block_lib blocX_narae_unit) (setq Do (ru-block-lib-insert block_lib block_naine_iinit)} ] (if Do (progn (setq X [atof (jru-user-read-last-patam "RectangX" "1.0")) У (atof (ru-UEer-read-last-para.'ti "RectangY" "1.0"]) is_ask_dim т is_by_side Т is_by_angle nil asjay__center nil wftat_next 5) (if (setq dcl_id (load_dialog (ru-file-dcl "ru_draw_rectangle"))) (progn (while (> what_next 0) (if (new_dislog "rectang" dcl_id] [progn (set_tile "title" dlg_caption) (set__tile "ed_x" (rtos к ) ; [set_tile "ed__yn (rtos y) } (_rect_set__as} (_test! (action_tile "a5_side" "(_test)"I [aetion_tile "as_angle" " ( _ t e s t ) " | [action_tile "as_centr" " (_test)") (action_tile "ed_x" "(_t:est)"; [action_tile "ed_y" " ( _ t e s t ) " ) [action^tile "in_work" " ( _ t e s t ) " J [action_tile "get__x" " |_test} (done__dialog 2 ) " ) [sction_tile "get_y" " (__test) (done__dialoe| 3)") (action_tile "lineweight" "(ru-dlg-dcl-aelect-lw)"] (action___tile "button_do" " (_test| (done_dialog 4 | " j (action_tile "help" " (ru-dlg-uiew-txt-file (ru-file-help-txt \"ru_draw_;:ectangle.txt\"}
\"O программе\"
\"Рисование прямоугольника\" (arid *ru_developer* (cu-user-raay-txt-hlp-editl ) 1 "1 [setq what^next (start_dialog]) [cond [ ( = 0 what_next|) [1- 2 what_next) (setq X (ru-get-dist "Длина 1-й стороны" X nil})) ( ( = 3 what_next) (setq Y (ru-get-dist "Длина 2-й стороны" у n i l ) ) ) ( ( = 4 what_next). (if is_by_^sicle (setq lst__x_y !_rect-by-side block_name__unit x у is_ask_dira hole)
Глава 25. Программы общего назначения
845
к (car lst_x__y) у (cadr lst_x_y) is_by_angle NIL is_by_ceriter NIL!) [if is_by__angle (setq lst_x__y (__rect-by-angle block__name_unit у. у is_ask_dim hole) >: (car lst__x_y) у (cadr lst_x_y) is_by__side nil is_by_center n i l l ) ( i f . is_by_center (setq lst_x_y (_rect-by-center blocl(_naine_unit x у is_ask__dim hole) x (car lst^x_y) у (cade lst_jt_y) ia_by_side nil is_by__angle n i l l !
I [(= 8 what__next} ;; определено в базовом DCL [ru-dcl-hide-dialog)))
i [progn [setq what_next 0]
(alert "He йогу показать диалоговое окно")]
) I (ru-useir-write-leist-parain "RectangX" {rtos к 2 2} } (ru-user-write-last-param "BectangY" (rtos у 2 2 ) \ (unload_dialog DCL_ID)} [alert "He могу загрузить диалоговое окно")
in
[ru-app-end) (princ)
Приводить исходный текст DCL-файла мы не будем — слишком много он займет места. Вызов функции гц-draw-rectangle с различными параметрами из XML-меню позволяет "создать" множество прикладных команд. Часть изобрджений, показанных в рис. 25.5 (таких, у которых нет окружающего прямоугольного контура), создана с помощью простой функции, приведенной п листинге 25.33. Она позволяет рисовать псевдопрямоугольные объекты неопределенных заранее размеров — таких изображений требуется довольно много. Листинг 25.33. Функция ru-draw- rectangle -block- lib-box [defun ru-dtaw-ractangle-block-lib-box (block_lib block_riame msg / ir.s_pnt second_pnt) (ru-app-begin) (if (ru-block-lib-insert block_lib block__name) (while ins_pnt (ru-get-point-or-enit (strcat "Угол " rosgl nil)] second_pnt (ru-get-corner-reguired [strcat "Противоположный угол" msg] ins_jpnt) I ;ru-block-insert-obj block_name ins__pnt I- (car second__pnt) (car ins_pnt) I (- (cadr second_pnt| {cade ins_pnt|I 1 0)
II [ru-app-end)
846
Часть IV. Разработка прикладных программ
Рисование текстов различными способами Тексты приходится писать очень часто. Программное создание текстов мы освоили, теперь напишем простые функции, заменяющие команду DTEXT {ДТЕКСТ). Простейшая программа (листинг 25.34) ничего особенного не делает — просто запускает команду DTEXT (ДТЕКСТ), но дает большую экономию времени за счет частоты применения, т. к. пользователь не тратит времени на ввод или подтверждение зысоты и угла поворота текста. Для реже встречающихся повернутых текстов предусмотрен флаг запроса угла поворота. ! Листинг 25.34. Файл ru_draw_txt_horisontal (defun START (is_horisontal / pnt) (ru-app-begin)
(if (setq pnt (tu-get-point-or-exit "Точка начала текста" nil}) [vl-cmdf "_.DTEXT" pnt (ru-normal-test-height) (if is_horisontal 0 (ru-conv-rad-to'deg (ru-get-angle "Угол поворота текста: " D p n t ] ) ) ) 1 [ru-app-endl (princl
Вызов такой команды просто обязан быть в стандартной панели инструментов рисования. Часто применяемые подчеркнутые тексты заголовков изображений удобно рисовать с помощью программы, приведенной в листинге 25.35. Листинг 25.35. Файл ru_draw_text_underlined.lsp (defun START (/ txt point) (ru-app-begin) (setq txt (ru- user- read- last -pa ram "LastUserStnng" "ПЛАН") I (while(setq txt (ru -get-string "Подчеркнутый текст " (while (setq point (ru- get -point -oc -exit (strcat "Центр текста "' txt ) nil)) ( ru- text -add (strcat "%%u" txt) point [ru-nomal-text-height] 0 ac alignment center) ) (ru-user-write-last-param "LastUsetString" t x t ) ) !ru-app-end) (princ) ! START}
Создание и выбор типовых текстов Во всех разделах проекта используется множество типовых текстов (примечания, общие указания и т. п.). Типовые фразы хранятся в словаре и доступны при вводе текста с использованием функции ru-get-string. Типовые тексты удобнее хранить в
Глава 25. Программы общего назначения
847
файлах, выбирать их из древовидного меню, редактировать перед вставкой и вставлять в нужное место рисунка. Работа с такой программой может выглядеть так: О проюводится выбор файла из каталога типовых текстов (рис. 25.6); П во время выбора файла возможно его редактирование; О после выбора файла производится вставка текста. Выбор шайпа дпя вставки -
Типовыетексгм г
Ь Всдогровод и канализация Обшче указания !-: Отопление * мкгь-ляцня О&цие указания
1ШвШьШШШй ПрОТИБОРОррОЗИЙМЭО Защите
F' Строительные Монтаж K.QHcrpyMJUu Общие ^азанич Посадке здаичй • Состав кровпм
Комментарий |Указанна7Го системам дьи-юуааления и пгщпора Правка
ОК
J
Отмена
Рис. 2S.S. Выбор типового текста для вставки
При вставке текста возможно, в момент запроса точки вставки, выбрать опцию указания количества строк. В этом случае будет написан не весь текст, а указанное количество строк. Это позволит длинный файл написать в несколько колонок. Возможен даже вариант запроса точки для каждой строки, для этого достаточно при вводе количества строк указать единицу. Такой вариант удобен, если, например, в файле находятся строки с типовыми наименованиями помещений. Сначала напишем главную функцию с выбором файла {листинг 25.36). | Листинг 25.36. Функция tu-text-file-import
(defuri ru-text-file-irrport (/ file_r,ame) (if (setq file_name (ru-dlg-file-select-in-tree " [strcat (ru-dirs-get-all-users) "txtSV) ". txt (ru-text-draw-file file_narae)) iprincl
файла для встевки"
Непосредственное написание текстов вынесем в отдельную функцию тинг 25.37) — она пригодится для вставки любых текстовых файлов.
(лис-
848
Часть IV. Разработка прикладных программ
I Листинг 25.37. Функция ru-tart-draw-fila
(defun ru- text-draw-file (file_nane / pnt start_lst srring_list str_count _getpoint-text) ,- ,• Локальная функция ввода точки начала текста (defun _get -point -text (msg str_coun" / point done] (while (not done) (setq point (ru-get-point-or-exit istrcst msg " Пишем " (ru-string-nuniber-end str__count "стро" "ку" "км" "к")) "Число"}) (cond ( [ = point "Число") Isetq str__count (ru-get-int-or-pick "Количество строк " sti:_count) ) ) ; ; Выход, если введена точка или отказались от ввода [Т (setq done (listp point))) (list point str_count) I ; ; Главная функция Isetq pnt T)
(if (setq string_list (ru-list-read-frora-file filename)) Iprogn isetq str_count {length string_listl start_lst (list pnt str_count) ) (while (and put string_list isetq stait_lst (_get-point-text (strcat "Строка ' " (car string_list) "'\пначало колонки, осталось " [i:u- s tiring-number -end (length string_list) " стро" "ка" "ки" "к") " . " ) str_count) ) ) [if (setq pnt (car start__lst) 1 (repeat (min (setq str_count (cadr start_lstl) (length string_list) ) (ru-text-add (car stiing_listl pnt [ru -normal -text-height) 0 nil) [setq pnt (ru-geom-txt- down- line pntl string^list (cdr string__list ) ) I))))
Конструктор таблиц О рисовании и заполнении различных таблиц текстами МБ! уже писали в главе 16. Функция г u-t able -draw- with- ask (см. листинг 16.20) позволяет нарисовать и разграфить любую таблицу с шапкой. Шапки таблиц у нас хранятся в файлах в каталоге %ruCADRootDir%\A!l Users\table\- Размеры граф таблицы записаны в файле имя^таблицьиш. Файл блока таблицы и 1К1-файл можно создать вручную, а можно и с помощью специальной программы, которую мы обещали предъявить для обозрения, что и делаем. Для облегчения рисования произвольных таблиц мы напишем специальную программу (листинг 25.38). Хотя в системе имеется почти сотня стандартных таблиц, часто возникает необходимость просто разграфить таблицу для разных целей. Отличие программы от простого рисования Б том, что высота строк рассчитывается автоматически под нормальную высоту текста.
Глава 25. Программы общего назначения
849
г
j Листинг 25.38. Файл ru_draw_table_user.lsp
[defun START (/ colimm_width row_count string__h eight t!np_point first__point secorid_point table_height column_nuinber) (ru-app-beginl (while (setq first_point [ru-get-point-or-exit "Левый верхний угол граф" nili) [setg tmp_point first__point strmg_height (ru-get-dist (strcat "Высота строки, " (ru-unit-na^ie) ) (ru-normal-table-cow-heightI first_point) table_height [_ru-get-with-default (strcat "Примерная высота таблицы, " (ru-uriit-паще)) (rtos string^height) 'getdist 4 "Строк" first_jpointl ) (cond ( ( = table_height "Строк") [setq row__count [ru-get-int-or-pick "Количество строк в тайлице" 1] t'able_height {* cou^count string_height) ) ;[null table_heightl
[setq table_height string^height row__count 1 ) 1 (T {setq row_count (ru-match-ceiling I/ tablejieight strlng_heightl1 table__height (* row_count string_heighc) ) } )
[princ {strcat "ХпЕудет начерчено " (itoa row_count) " строк! " ) ) !setq coluinii__width (* 2 stri.rig_height) columi_nLimber 0) •f Вертикальные линиии (while [setq column^width (cu-get-dist-or-exit [strcat "Ширина графы " (itoa (1+ coluinn_nurnber!)) coluim_width firsr_point)) (if (= coluinn__nuntier 0) [cu-line-ada first_point (polar fitst_point (tu-geom-go-cight 0) table_height] 0 nil: ) (setq first_point (polar first_point 0 column_width) column_tiumber (1+ column_riuirieer) I (ru-line-add £irst__point (polar firstjioint (ru-geom-go-right 0) table_heightl 0 nill
I (if (> colwnn_numbej: 0) (progn
(ru-li-fte-add tmp_pc>int first__point 0 nil) (repeat row_count [setq first_point (polar firstjioint (cu-geom-go-right 0) stritig__height) seccnd_point [polar tmp__point (ru-gsora-go-right 0) string_he _ght)
Глава 25 Программы общего назначения
851
:;; Ввод в лвухстрочном диалоговом скне имени и описанмч
(if (setq table_lst (ru-dlg-get-two-string "Описание таблицы" "Файл" "ru_new__table" Т "Описание" "Новая таОлица" Т Т
") !
[progn [setq block__hesder (car table_lst) description icadr tab"ie_lsti file_name (ru-Sile-set-ext (ru-file-table block__neader) ".dwg") do (if (findfile file___nartis) (not (ru-no (strcat "Файл " file_narae " уже имеется. \пПереписать"))) Т) ) (if do (progn [setq top_left_pnt [ru-get-point-reguired "Левый верхний yroj; и:апки" nil) bo 11 om__l e f t_pnt
550
Часть IV. Разработка прикладных программ tmp_point secoridjpoint) (ru-lirie-add second_poant first_point 0 nil) D i l l (ru-app-end) (princ) !
(START) В результате может быть нарисована таблица, подобная показанной на рис. 25.7
Рис. 2S.7. Результат рисования произвольной таблицы Вызов программы m_draw_tab!e_user мы смело можем включать в XML-меню таблиц.
(ru-yes (strcat "Программа записывает таблицу" "\n и генерирует для нее файл описания!" "\пШапка должна Сыть предварительно нарисована!ХпБудем делать"))
Часть IV. Разработка прикладных программ
852
(ru-string-rem-right dn-in_striri7 (list " ; " } ) ! (j:u-file-write-dirinfо-file-comment file_narae 1 1 ) 1 H I (ru-app-end) (princ)) (START)
description;
Встанку таблиц с разграфкой мы рассмотрели в главе 16.
Замечани Наши средства для рисования таблиц не стоит сравнивать с инструментами системы AutoCAD 2005 или программой АТаЫе Александра Щетинина— это различные классы программ. Так же, как бензиновые или электрические пилы не вытеснили простые ножовки, так и наряду со сложными программами нужны простые инструменты.
Заполнение таблиц
Глава 26, Формирование специализированных программ • С пелены авгииатшниии
k- k • ог т а а я кип Прибои по мкту-овапьпый Прибое на uiKTft Прибс^ на идйг^нжалыъ* Отборное устройство :- И сгипнигельчьй механизм Общее эбойпаченн? Открывающий при прекращении подачи энергии 3*.рыЕД10<ц»Л при прекращении подачи энеопвп1 Оетавпякяций гри прекращбпни подачи энергии
857
шннннннинишЕ]
!
С^] w
•Лножестввшйя вставка иаображемв" с аетсмасцгт абированием
всегоуыве: U
^Jtn: 1
Выполнить
Закрьпъ
Рис. 26.1 k Выбор блока из иллюстрированного меню
Создание"специального"меню В &wee 8 мы писали о том, что все специализированные программы будем размещать на шестом месте в главном падающем меню СпецРис. В этом меню мы, с разбивкой на тематические страницы, соберем команды специального рисования'. Каждая тематическая страница вызывается функцией ru-menu-special-show (пример вызова приводился в главе 8}. На каждой тематической странице могут быть пункты меню для вызова групп изображении. Принципы разделения программ между меню системы AutoCAD {а внутри него между падающими, вложенными меню и панелями инструменте и) и XML-меню мы уже обсуждали. Вопросы эти неоднозначные и во многом зависят от личных пристрастий и "натасканности" пользоОбозначения не планах »» вателей на те или иные задачи. В любом случае наша сисПроводки электрические »» Устройства на проводках »» тема открыта и квалифицированные пользователи (а лучше администраторы САПР) могут "перетасовать" меню по Светильники »» Электрооборудаем* >?» своему вкусу. На рис. 26.2 показано падающее меню СпенРис-ЭО, У, котором вся "электрика" разбита на не,1 устройств »» сколько крупных групп изображений. Локальные сети Автонйтщаиня Нар/жмые сети Таблицы
все ЭШ<ТРО СпещИпьныв м&мго... Ожияенн) н«Д группы
1
Рис. 26.2. Падающее специальное меню "электрики"
В AutoCAD 2U05 мы можем продублировать специальные меню в Tool Palettes.
860
Часть IV. Разработка прикладных программ
Рисование трасс Некоторые программы для рисования грасс мы также "проходили": О ru_draw_trass_text_ltype — рисование трасс текстовым типом линии; О ru_draw_trass__itype — рисование ладанным типом линии. Приведем еше один пример, чтобы электрики не чувствовали себя совсем забытыми (листинг 26.5). ; Листинг 25.5. Файл ru_draw_trass_llne.lsp ;defun START (msg Itype lineweight can_chariche_lw arc_enabled; (ru-tras s-draw-Iw-Itype-from-pt1-arc Itype msg arc__enabled can_chanche_lw lineweight 0) ;princ)) Применение этой программы продемонстрировано в листинге 26.6, i Листинг 26.6. Фрагмент файла e_prov.ruxm -
-
Рисование любых таблиц Таблицы широко используются во всех ралделах проекта. Мы уже приводили примеры нескольких программ для создания таблиц; О ru_draw_table_docs — заполнение ведомости ссылочных и прилагаемых документов; П ru_draw_table_user — создание и разграфка собственных таблиц; П ru_pro_table_gen — генератор таблиц. В случаях, когда таблица имеет постоянное количество строк, ее можно просто вставить в виде блока (листинг 26.7).
Глава 26. Формирование специализированных программ
861
\ Листинг 26.7. Файл ru_block_insert_table.lsp (defun START (blk)(xu-block-insect-table blk)(princ}) Пример элемента XML-меню показан в листинге 26.8. ! Листинг 26.8. Фрагмент XML-меню <1±ет пате= ' Основные показатели' image= 'OV\TABOPOV.GIF' conment= ' Вставляет таблицу в рисунок' macro=' [progn(if (ru-app-load "ru_block_insert_table" ) (start "tabopov")!) '
Чаще всего применяется программа, приведенная в листинге 26.9. Мы используем ее для рисования практически всех таблиц с переменным количеством строк и разграфкой. Листинг 26.Э. Файл ru_draw_table.lsp (defun START (fonn__riarae is_vertical) Iru-app-begin) Iru-table-draw-with-ask form_r;aine NIL is_vectical; (ru-app-end) (princ)
Пример использования показан в листинге 26.10. В нем имеется один пункт для рисования обычной вертикальной таблицы и два пункта для рисования горизонтальных таблиц — заготовок продольных профилей 1 надземных и подземных газопроводов. 1истинг 26.10. Файл tabl_gs.ruxm n = ' 1 . О ' enco<3ing='window5-1251' ?> -
- •Citem name ='Профиль ГСН надземный' image='GAZ\PROGS_N.GIF' ccuMnent=' рисует заготовку профиля' raacro=' {prognlif (ru-app-load "iu_dcaw__table") (start "progs_n" nill ]) ' />
1
Автоматизированного построения профилей в составе нашей системы пока нет, по и простейшие 1 заготовки значительно облегчают работу , особенно когла приходится рисовать километры трасс
ХОДЯТ. Л-'iM реализации проще tiuciu о тимсш [jduuioi uciuu^a mat,jjMou HJ лш^-м^пы
запоминать его текст о глобальной переменной и, при щелчке по специальной кнопке панели инструментои Добавить в избранное, добавлять текст последнего макроса в специальное меню Избранное. По такому принципу в системе BestIA мы формировали списки любимых файлов, слоев, калек. Новые возможности открываются в системе AutoCAD 2005 с появлением возможности добавлять в окно Tool Palettes (Инструментальные палитры} собственные команды. Палитры сохраняются в текстовых файлах формата XML, а это означает, что мы сможем создавать их профаммным путем. Однако эта технология требует дополнительных исследований и применять ее мы будем в следующей версии нашей системы, полностью ориентированной на систему AutoCAD 2005.
862^
'
_
Часть
IV.
Разработка
прикладных
программ
Замечание В системе AutoCAD 2005 появилось долгожданное средство для работы с таблицами {команда TABLE], позволяющее создавать таблицы и редактировать их содержание. Но так удобно работать с индивидуальными таблицами, а при массовом использовании стандартных таблиц наши программы еще долго будут востребованы К сожалению, пока s , -нельзя сохранить во внешнем файле определение таблицы AutoCAD 2005 для повторного применения, да и сами таблицы пока примитивные и требуют настройки по месту. Однако обьект Table в AutoCAD 2005 имеет много свойств и методов, и наверняка мы сможем в будущем разработать программы, позволяющие, используя описание таблиц во внешнем файле, легко создавать и типовые таблицы.
Как научить пользователя добавлять свои команды Итак, темпы развития нашей системы во многом зависят уже не от программистов, а от продвинутых пользователей. Программистам хватит работы на несколько лет вперед, т. к. на следующем этапе придется переходить к разработке более сложных программ. Массовые операции уже могут обеспечить пользователи, но этому их нужно научить. Практика показывает, что многие программисты этого не умеют делать и не любят. Вскользь мы об этом уже писали. Работа с пользователями является особым искусством, и не все разработчики с ней справляются просто из-за особенностей своего характера. Существуют и чисто технические приемы, позволяющие добиться желаемого результата. 3 Bn-первых, надо для этой достаточно нудной и монотонной работы выбирать не молодых и шустрых ребят, все знающих об AutoCAD, а скромных "теток", склонных к аккуратному выполнению простой работы и теряющихся в ситуациях, когда надо "шевелить мозгами". 3 Ba-вторых, при обучении нужно начинать не с работы в AutoCAD, а с ликвидации пробелов в умении работать с файловым менеджером и текстовым релактором — наверняка этому их никто не удосужился научить. Разумеется, надо обеспечить их русифицированными программами. 3 В-третьих, не пытайтесь изложить им 1еоретические осноь-ы XML — объясняйте на уровне "скопировать строку, откорректировать то. что в кавычках". Только после получения практических результатов можно будет постепенно объяснить и про элементы, и про теги, и про атрибуты. П В-че/поертых, убедитесь, что человек действительно умеет работать в AutoCAD и знает элементарные вещи — использование объектных привязок, ввод данных с клавиатуры и т. п. Проверять точность рисования сотен блоков будет некому и лучше потратить некоторое время на первоначальное обучение. Наш опыт показывает, что уговорить пользователей включиться в работу и научить их_ЕёдактиРОвать меню — эхо не самое ттшнпе Гппячпп
ГЛАВА 27
Примеры программ для архитектурно-строительной
части
В этой главе мы рассмотрим несколько примеров "рисовальных" программ для строительной части. Программ для строителей разрабатывается очень много, мы разберем только несколько характерных примеров.
Рисование координационных осей
Глава 2? Примеры программ для архитектурно-строительной части
865
сетка осей, но могут быть и варианты с угловым расположением. Рисование осей выполняется по ГОСТ 21.101—97. Координационные оси наносят на изображения .здания, сооружения тонкими штрихпунктирными линиями с д л и н н ы м и штрихами, обозначают арабскими цифрами и прописными буквами русского алфавита (за исключением букв: Ё, 3, И, О. X, |Д, Ч, Щ. Ъ, Ы, Ь) и кружках диаметром 6—12 мм. Цифрами обозначают координационные оси по стороне мания и сооружения с большим количеством осей. Если для обозначения координационных oceii не хватает букв алфавита, последующие оси обозначаю! двумя буквами (АА. ББ, ВВ). Лля обозначения координационных осей блок-секций ж и л ы х зданий применяют индекс "с" (1с, 2с, Ас, Бс). Разумеется, запрограммировать рисование отрезка с кругом и символом внутри очень просто. Сложнее сделать удобную программу. На рисунке диалогового окна видно, что пользователь может задать: П автоматическое обозначение осей или выбор обозначения по запросу программы: О постоянный или запрашиваемый шаг осей (возможно указание и рисунке): П количество рисуемых осей;
3 направление прирастания обозначений "буквенных" и "цифровых" осей. Самым сложным и этой программе является правильное вычисление б у к в е н н ы х обозначений осей, особенно при большом их количестве, а самым нудным — разработка диалогового окна средствами DCL и "издевательство" над стандартным форматированием при вписывании исходного текста в формат книги. Текст программы приведен в листинге 27.!. Листинг 27.1. Файл ru_ar_laying_axis.lsp (de£ur. START ( / auto_num auto_num_firsi; dcl__idx double ia_alpha_std__num is_ask_.aJ.l dist is_digit_std_num 1 n number 1 what_next _toggle_is_alpha_std__num _toggleuis_digit_std_num _tcggie_is_55S;__all_dist __toggle_auto_num_first toggle double toggle auto _test draw _draw axis _auto nura axis] Замая интересная локальная функция автоматического определения обозначение следующей оси по заданному обозначению предыдущей оси fdefun _auto num_axis
„С„
„т„
"у"
"фР-
,.х„
"Ц"
"у..
„щ„
,.,Ц"
Р.Э..
„ю„
P.JJ..)
lat__enablea_chats (list "ft" "В" "С" "D" "Е" "E" r "G" "Н" "I" "J" "К" "L" "М" "И" .TQ,,
lip"
r,Q,.
PIp.P
P.gPl
,ГТГ.
Р.ЦР.
.гуЧ
„ЦП
.,ХИ
«Y'l
"2"|
ак1в__пате (if (not axis_narae) "" (progn ;bet^ axis_section (if != "c" Isubstr axis_r.ame [strlen axi3_naine)} ) (progn (setq axis^naine sobstr a^is_name 1 U- (sLrlen axis_nanie)) ) } T) nil) 1 istrcase axis name)!I base name "") 2в '-las
Часть IV. Разработка прикладных программ
866
[if (or (= 'INT (type [read axis__name| ) ) [while [and (/= axis_narne "") [setq flag (/= 'INT (type (read (cond ((or [= "." (substr axis_name 1 1)) (= "-" (substr axis name 1 1)) (setq base_name {strcat base__name (substr axis_name 1 1)1 axis_narae (substr ajtis__name 2 ) )
)
|T a x i s _ n a m e ) ) ) ) ) ) } [setq base_name (strcat base_na.-r.e (substr axis__name 1 1 ) 1 axis_name (substr axi5_tiame 2 1 ) (if (/= axis name "") flag nil) Закончилось условие: если нашли в конце строки число, то увеличим его и все! [setq base_name [strcat base_name (itoa (1+ (read axis_name))))) ; А если числа не нашли, то ... (progn [cond [(= 1 (setq flag (strlen base^name)I) [setq base_name (cadr (member base_ngme (setq enabled^chars [if (membei base_name lat_enabled_chars) 1at_e nabled_cha r5 rus_enable d_cha r s )}));_ end of cadr base_name (if (not base_narae) (ru-get-string-cral "Конец списка букв. Введи новое обозначение" (strcat (last rus_enabled__chars) (itoa flag)) nil);__ end of ru-get-string-onl base_r.ame );_ end of if );_ end of setq
! « 1 flag) ;; Символов - больше одного [setq base_name (cadr (member (substr Ьазе_::а.те 1 1} enabled_chars)); (if base__narne
[repeat (1- f l a g ) [setq base_nare [strcat base_naire (substr base_name 1 1) i ; _ end of repeat
Глава 27. Примеры программ для архитектурно-строительной части
867
[setq base_name (ru-get-string-cnil "Конец списка букв. Введи нсвое обозначение" (strcat (last rus_enabled_charsj (itoa f l a g ) ! nil);_ end of ru-get-string-cral )))
'T (setq base_name " S I " ) ) !;_ end of cond );_ end of progn ) ;_ er.d of
if
;if axis_section (strcat base_name "c" !;_ end of defun Локальная функция рисования единичной оси [defun _clraw_a>;is |star^_line_pn double / radius) (if (not auto_nim) (setq axis_t^t (ru-get-string-cml "Обозначение оси" axis_txt n i l ) ) ! ; _ end of if (setq radius I* (ru-nonnal-text-height) 2) ) : ru-line-add start_lir,e_pnt [polar start_linej)nt [angle start_line_pnt center_circle_pnt! [- (distance start_line_pnt center__circle_pnt) radius); 3 "CENTER2");_ end of ru-line-add (ru-circle-add center_circie_pnt radius 0 nil! [if double (ru-circle-add center__circle_pnt 1+ radius (lu-conv-millimeter-iri-paper-to-unit 1 ) 1 0 n i l ! ) [ru-text-add axis_txt center_circle_pnt (ru-nonnal-text-height) 0 "11" i ;_auto_num_axis sxis_tKti ) ; _ end of defun Локальная функция рисования массива осей [defun _draw (txt r, dist auto_nira auto_num_first double is_ask_all_dist is_digit std_jium is_alpha_std_nuiri / ang is_dig^t_aKis msg msgl rr^g2 msg3 start_pnt ~enter_circle_pnt tx t_l)
. |_
_
.~
.
.
--
.
йргументы: Txt- марка 1 оси n - >= 1 количество осей dist - шаг осей auto_nuiyi - т | nil - ав^онумерация без запроса auto__nLm_f irst - Т | nil - автонумерация 1-й оси double - двойной кружок is_ask_all_dist - запрос каждого шага iE_digit_std_nurn - стандартная нумерация цифровых осей is_aIpha_std_nu.T. - стандартная нумерация буквенных осей (setq ang 0) (if (> n 1)
isetq rnsgl (strcat "Количество осей " (itoa Ы) ". ") msg2 " первой":
868
Часть IV. Разработка прикладных программ
[seng rnsgl "" msg2 "") г ; _ end of if ( i f auto_mnn_first [setq rasg3 "") [setq msg3 (strcat " '" txt " ' " ) ) );_ end of if [setg msg (strcat "\n" rasgl "Начало" шьд2 " оси" Л1здЗ)) [if (setq startjint (ru-get-poir,'--oi-=xi t rasg n i l ) ) [progn [setq center_circle_pnt (tu-get-point-rsjguired "Центр кружка" start_pnL) ang (angle center_circle^pr.- statt_prit) ! !if :is T) ! ; _ end of if [ i f auto_nuro_first (setq t x t txt 1 ) (setq txt ;_draw_axis start__pnt centei_circle_pnt txt auto_jium_first double)) 1 ;; Вернула обозначение следукщей осм '.; Выясняем направление осей (if О г. 1) [рсодп [if is_digit_axis [if is_digit_std_num (setq ang (ru-geom-go-ngh- a n g ) ) [if (ru-dlg-yes-cml "Cnsfl'/Kcie оси вправо от первой") [setq ang (ru-geom-go-right a n g ) ) (setq ang (ru-geom-go-Ieft a n g ) ) ) ) ; _ end of if [if is_alpha_std__nura (setq ang (ru-geom-gc-lti-ft a n g ) ; [if (ru-dlg-yes-cml "Следующие оси влево от первой") [setq ang (ru-geom-go-left a n g i ) [setq ang (ru-geom-go-right a n g ) ) ) ) ) ; _ end of if (repeat (- n 1) (if is_ask_all_dist (setq dist (ru-get-dist "Расстояние до сле.-укией оси1' dist center_circle_pnt); );_ end of if (setq start_pnt (polar start_pnt ang dist) centeredrcle_pnt Ipolai center_circle_pnt ang dist; txt (_draw_axis start_pnL eenter_circle_pnt txt auto_nura double) ) ;_ end of setq ; ; _ end of repeat !;_ end of progn j ; _ end of i f ] ;_ end of progri
Глава 27. Примеры программ для архитектурно-строительной части
);_ end of if l;
end of defun
Далее мелкие неинтересные функции длч работы с диалоговьы окном (defun _test !/ res) [setq res Т) (node_tile "button__do" 0) (set_t;le " e r r o r " "") ;set_tile "no_auto" (ru-conv-bool-to-str auto_num)) ( s e t _ t i l e "is_digit_std_iii3a" (ru-conv-bool-to-str J-s_digit_stii num}; 1 ( s e t ±ile "-,s alpha_stci__num" (ru-conv-bool-to-str Ls_alpha_st<J r.vji ! j !set_tilc "double" (ru-conv-bool-to-str double)) (set_tile "autol" (ru-conv-bool-to-btr auto_nuro_first)! lffiode_t] le "ea_Dair.e" iru-conv-bool-to-str auto__nura_first)) (set _tile "i3_a£j^_3ll_disi:" iru-conv-bool-to-sti is_3sk_all_dist) ! ;ifloae_i:ile "ed_l" (ru-conv-bool-to-str is_ask_all_dist)) l!Uode tile "get_l" jru-conv-bool-to-str is_as!c^ail_di3t.)! isetq 1 (atof (get_tile "ed_l"})
r. (atoi (get_tile "ed n") ! number 1 \get_tile "ed_nanie") !;__ .end of setq (if «= n 0} iprogn itnode_tlle "button_do" 11 : s s t _ - i l e "emor" "Количество осей должно быть не менее 1"'
!se-q Res n i l ) )) (if (and (<- 1 0 . 0 ! (> n 1): (pcogr. (mode_tile "batton__do" 1 ) (set t i l e "error" "Неверный шаг нескольких осей"; i s e t q Res n i l ] ( ; tts i; t>nd of defun (defim _toggle_Auto (val)
(setq auto_njm (= val " 0 " ] }
[defun _togglc_Dcuble ( v a l )
isetq Double (= val " 1 " ) )
(defun _toggle_auto_nura__f;rst ( v a i ) !_test)l (defun _toggle_i5_ask_all_dist (val! (_test)j
(_uestt) (_test))
(setq auto_num_first (= val "!"}'•
(setq is__a5k_all_dist (= val " 1 " ) !
(tiefun _Lcggle_is_digit_5td_num {val! ;aetq IB _digit__std_num (= val " l " i ) (_test)) [defun __toggle_is_alpha_std_num (val) (setq is_alpha_std_nura (= val " 1 " ) ) [ _ t e s t l }
н^н функдяя
[setq L (atof (nj-'Jber- read- last-pa ram "ШагКолонн" " 6 0 0 0 . 0 " ) :
869
570
Часть IV. Разработка прикладных программ
N 1 Numberl "I" auto__num nil auto_nuir,_first T Double nil is_ask_all_dist nil is_digit_std__num Т is_alpha_sKd_nuin Г what__next 5) (if {> (setq dcl_idx (load_dialog (ru-file-del "ru_ar_laying_axis"))) 0) [progn [while (> what_next 0) (if (new_dialog "axis" DCL_IPx: (progn (set_tile "ed_l" {rtos 1 2 0 ) ) (set_tile "ed_n" (itoa N ) ! !set_tile "ed_name" Numberl] (_test; (action_tile "ed_l" "IJTestl") (a=tion_tile "ed_n" " (_Test) "] (action_tile "aci_name" "(_Test)"l (action_tile "no_auto" " (_toggle_a'jto_nunt Svaluel") (action_tile "double" "(_toggle_Double Svaluel") (action_tile "autol" " (_toggle_aijto_nura_first Svalue) "1 [action_tile "is_ask_all_dist" " (_toggle_is_ask_all__dist ;action_tile "is_digit__std—num" " (_toggle_is_digit_std_num Svalue)") {action_tile "is_alpha_std_num" " !_toggle__is_alpha_std_nura Svaluel") [aetion_tile "get_l" "(done_dialog 3}"] (aetion_tile "get_n" "(done_dialog 5 ) " i [action_tile "button_do" "(done_dialog 4}") [action_t:ile "help" "(ru-help-show \"ru__ar_laying_axis\")") [action_Cile "cancel" "(done_dialog 0 ; " ; (setq what_next lstart_dialogi ; [cond [ (= 3 what__next) (setq 1 (ru-gef.-dist "Шаг осей" 1 nil] 11 L ( = 5 what_next) [setq n (ru-get-int-from-dwg "Укажи место расположения оси" n ) 1 1 ; ( = 1 what_next) [draw Humberl n 1 auto_num auto_nura_first double is_ask_all_dist is_digit_std_num is_alpha_std_num) [(= 6 what_next) (iru-dcl-hide-dialog)) ) ; _ end of cond );_ end of prong (progn (setq what^next 0) (ru-msg-aleirt "He могу показать диалоговое окно!")
i ; _ end of if ;;_ end of while Iru-user-write-last-parani "ШагКолонн" (rtos L 2 21 ) ;unload_dialog dcl__idn) ! ; _ end of progn (ru-msg-alert (strcat "He могу загрузить " [ru-file-dcl "ru_ar_laying_axis")I) !;_ end of if (ru-app'end) Iprinc) ) ; _ end of defun [ЗТДКТ)
Глава 27. Примеры программдля архитектурно-строительной части
871
Исходный текст диалогового окна программы приведен в листинге 27.2. Листинг 27.2. Файл ru_ar_laying_axis.dcl dcl_j5ettings : defsult_dcl_settings ( audit_level = 0; ) ^include "ru__cad_l3.b.dcl" axis : dialog (label="Координационные оси"; icolu^in {:boxed_coli3iin {label = "ОСсэначения осей"; : toggle {label = "Запрашивать для каждой"; key = "no_auto"; value = "0";l : toggle [label = "Авдоопределение для первой"; key = "autol"; value = "0";} : ed-t_box [fixedjrfidtn = true; width = 10; alignment = right; label = "Обозначение nepEOU";key = "ed_nair,e";edit_width = 6.-)} :boxed_column '.label = "Шаг осей";: toggle {label = "Запрашивать для каждой"; key = "is_ask__all_dist";value = "0";!
:row (fixed_width = true; width = 30;children_alignnient = right; :spacer_l {width=4;}: edit_box (label = "Постоянный uiar";key = "ed_l"; edit_lirtat = 5; edit_width = 6;] : button {label = "<";key = "get_l";fixed_width = true; width = 1;1} : row {fixed_widtli = true; width = 30; children_alignir.erit = right; :spacer__l (widtti=3,-} : edit_box {label = "количество осей";Кеу = "ed_n" =dit_linit = 3; edit_width = 6;} : burtc- (label = "<";key = "get_n";fixea_width = true; width = l ; } ! j ;boxed___coluran (label = "Дополнительно"; : toggle (label = "Двойные кружки у каждой оси";} ; toggle {label = "Цифровые оси добавлять влево"; value = " 1 " ; ) : toggle [label = "Буквенные оси доСавлять ввери"; key = "is_alpha_5td_num"; value = "1";)Н errtile; do—exit_hicle_help;}
В результате работы программы может быть нарисована сетка осей, подобная показанной на рис. 27.2.
Рис. 27.2. Результат работы программы рисования координационных осей здания
Часть IV. Разработка прикладных программ
872
Мы не предусматриваем автоматической простановки размеров между осями, т. к. это удобнее делать стандартными срслсишми системы AutoCAD "по вкусу" на требуемых слоях. Эта программа назначена в качестве метода слоя (см. главу 18) в клас-" сификаторе слоев и может быть выполнена при вызове команды "Создать объект методом слоя", если установлен соответствующий слой.
Рисование стен и перегородок После рисования осей было бы естественным заняться разработкой программы рисования стен. Однако самый основной рисунок для строительной части — рисование стен — мы автоматизировать не будем. Что есть стена или перегородка в двухмерном черчении— просто дне параллельных линии. Параллельны они сами себе и какой-то базовой линии, обычно координационной оси или другой стене. Мы делали много вариантов рисования двойных линий, и до того, как я системе AutoCAD RI1 впервые появилась команда DLINE, и после появления мультилиний. В доказательство приводим рис. 27..1, па котором показано диалоговое окно одной из программ. Суля по его виду, программа может рисовать любые прямолинейные стены (может делать и врезки в случае примыкания к ранее нарисованным). Конечно, это не такие стены, которые иозлпюгся в ЛОТ1 или хотя бы в системе АРКО — это обычные полилинии.
И'чрчна
Слисок т ОCD трассы :
Положение
а от правой грани
Р Лреый кр С Центр
1!!
Г ff Другое
12.: 17 Рчсоьлт&ось
- Заглушки J7 Начало
ф Конец
-Ширина линий, мм на
j О 5 1-я-! ма
Рис. 27.3. Диалоговое окно рисования стены
Но чем больше мы разрабатывали вариантой этой программы, тем меньше видели необходимость в ней. То ли строители и архитекторы нам попадались какие-то "не-
Aiitodesk Archilecturjl Desktop.
Глава 27. Примеры программ для архитектурно-строительной част
873
правильные", то ли еще что, но они предпочитают работать просто п эффективно создавать контуры стен просто командой OFFSET (ПОДОБИЕ) от существующих объектов с последующими сопряжениями, удлинениями и обрезками. Вместо этой большой программы, которая займет слишком много места, мы разработаем маленькую программу для дорисовки пилястр и н и ш к стенам, нарисованн ы м и отрезками или полилиниями. Эта программа может послужить примером изменения технологии программирования. Когда-то мы разрабатывали ее с диалоговым окном (рис. 27.4). II котором можно было задать два размера и выбрать ширину линии.
PHCOBW£ П-ПЯ' ТрЫ
Размеры гмпястры Длина адояь стены
перпе.дикцлярно стене
Рис. 27.5. Ввод размеров пилястр
Рис. 27.4. Диалоговое окно программы рисования пилястр
Программ, в которых нужно вводить каких-то два размера, требуется довольно много. При использовании DCL можно программно изменять значения меток диалога (L, Н заменить на "Длина" и "Ширина"), но не очень удобно — приходится писать дополнительный код. Когда нам это надоело, мы вернулись к любимой командной строке, и это оказалось не худшим решением. Кроме того, мы ведь разработали универсальный диалог ввода двух строк (см. главу 15), который можем использовать и для ввода чисел. Вьпнав функцию ввода двух строк ;ru-dlg-gst-two-string "Размеры пилястры" "Длина вдоль стены" "64Э" Т "Ширима перпендикулярно стене" "380" Т Т "option5\\wall_w.xml" "opt ions \\wall_w.xnil") мы выведем на экран диалоговое окно (рис. 27.5), в котором можем ввести размеры вручную, указать их в рисунке или выбрать из XML-меню типовых размеров стен (рис. 27.6). При выборе из справочника толщины кирпичной стены 2.5 кирпича мы получим число 640, а диалоговое окно вернет список ("640" "380"). Конечно, пользователь можег ввести и неправильное число, и нообще любую строку, но контроль за вволом нам придется выполнить в основной программе, а еще лучше, на базе функции r-J-dlg-get-two-striw;
разработать
функцию
ru-dig-geL-two-number
(ЛИСТИНГ 27.3),
осуществляющую контроль ввода чисел1.
1
А еше мы можем создать аналогичный СОМ-сервер яяя виода чисел, не позволяющий щелкнуть по кнопке ОК. пока не будут введены допустимые числа.
Пастьбу. Разработка прикладных программ
874 (•Выбор <-} справочника
:• ;. 17
• • • ^ • • • • Щ Г п Ш
.?•--'
Тсищииа степь, !-". Кирпичные
-
- ] Щ1ПИ1
1 5 кирпича • гИИиТпР
1
Ь Степлыепяп-пц бетоммые
200 ь*4 250мм
__
300 мч '
"
dJT h.._-
V
•ИЪг-И
0с*Г и У^ЧОЙ: 24
^
!Удп: 6
СК
|
ОТР™
Рис. 27.6. Выбор толщины стены из справочника
• Листинг 27.3. Функция ru-dlg-get-two-number ;defun ru-dig-get-two-number (caption label1 default1 mini maxl Iabel2 default2 га!л2 max2 xml_flle_na.iiel xial file_na.iie2 / end err_str 1st numl nurn2 result strl str2) Ввод двух чисел (while (not end) (if {setq 1st (ru-dlg-get-two-strlng caption labell (vl-princ-to-string defaultl) Г Iabel2 (vl-princ-to-string default2) Т т xml_file_na3iel xml_fi1e_n ame 2) );_ end of setq !progn ;setq err_str "" strl (car 1st} str2 (cadr 1st) numl (atof strl) nura2 (atof str2)) 'if t< numl mini) (setq err_str .'streat err_str "\n" labell "=" strl " меньше допустимого значения " ivl-princ-to-string mini)))! (if (> numl uiaxl) (setq err_£tr {4trcat erc_str "\n" labell "=" strl " больше допустимого знамения " (vl-priric-to-string maxl) ) ) ) (if (< num2 min2) (setq err_str {strcac err_str "\n" 1зЬе12 "=" str2 " меньше допустимого значения " (vl-princ-to-string min2)})! [if (> num2 max2| (setq err_str (strcat erar_str "\n" Iabel2 "=" str2 " больше допустимого эначен:-1я " (vl-princ-to-string niax2))ll :if (/= err_str "") (ru-msg-alert (strcat caption "ХпООнаружены ошибки: " err_str "\пГТовторите ввод] ") J (setq end t result (last numl _-vjm2) ) :;_ end of if !;_ end of progn
Глава 27. Примеры программ для архитектурно-строительной части
875
(setq end T! );__ end of if );_ end of while result
Теперь разработаем основную программу (листинг 27.4), которая всего-навсего рисует П-образную полилинию, но использует несколько очень полезных функций. Главной функции start передается дна аргумента — название рисуемого объекта и признак необходимости разрыва основной л и н и и , например: (start "пилястры" т) ИЛИ (start "ниши" nil). '
« . .. : Листинг 27.4. Файл m_ar_union_pilaster_in_line.l3p п
[defun START (msg is_break / ang end_point ent ent_point h 1 lst_dim lst_pnt pick_point) [ru-app-beginl ;; Восстанавливаем предыдущие параметры [setq 1 !ru-conv-millimeter-to-ur,it (atof (ru-uset-read-last-parair, (strcat "Размер" msg "L"l "510.0"! ) I h (rxi-conv-millimeter-to-unit (atof (cu-user-read-last-param (strcat "Размер" msg "H") "510.0"}): I;_ end of setq (while [setq lst_dira (ru-dig-get-two-number (strcat "Размеры " msg) "Длина вдоль стены" 1 120 3000 "Ширина перпендикулярно стене" h 50 6000 "options\\wall_w.anl" "options \\wall__w.xml") I;_ end of setq [setq 1 [car lst_dim} h (cade lst_dim); ;; SanpauiisaeM точку вреаки объекта (while (setq etvt_point [ru-get-point-on-ent (street "Начало " nisg " на грани стены")); (setq ent (car ent_point| picl:_point (cadi erit_point) ! Разыскиваем точки качала и конца примитива ent, указанного в точке. Получаем список из имени этого же примитива и точек начала и конца. Для полилинии это начало и конец указанного сегмента (if (setq lst_pnt (ru-geora-list-ent-point ent pick__point) ! (progn [setq ang (angle pick_pcint (nth 2 lst_pnt))) F I
Запрашиваем ориентацию объекта относительно указанной точки - достаточно указать любую точку в нужном направлении. Делиться никуда не надо. !if (ru-get-is-point-right-by-axis (strcat " " msg " размером " (rtos 1 2 2 ) " вдоль стены ") pick_point (polar pick_point (ru-geom-go-nght ang} h] ) ;__ end of ru-get-is-point-right-by-axis [setq ang (angle pick__point (nth 1 lst_pnt)))
Часть IV. Разработка прикладных программ
876 Isetq end_point [polar iif is_break [progn
При необходимости вырезаем кусочек рассчитанной длины [ru-var-clear-osnapl
(command "_.BREAK" (list enL p-]ck_point) "__F" pick_point end_point; (ru-va r-re s t ore-os nap) );_ end of progn
);_ end of if .|
-,
.
. .
.
.
.
-
_
_
-
Запрашиваем ориентацию поперек основной линии _ . . т _^
_
-
._-
. . .
[if (ru-get-is-point-right-by-axis (strcat " " msg " размером " (rtos h 2 2) " поперек сзте^ь: " ) pick_point end_point) (setq ang {ru-geom-go-right a.-.gi ) isetg ang (ru-geom-go-left а : щ ) ; ) ; _ end of if . 1i ^
г
Рисуем полштинию (tu-pli.ne-add (list pick_point (polar pick_point дпд h} (polar end__point ang h) end__point; nil 0 0 nil) . ~ . * , t | Устанавливаем для полилинии такие ^е свойства, как и для основной линии Iru-obj-eopy-ptop "LINEHEIGHT" [vlax-enaine->vla"obj ect enti ! vi ax- en anie-> via -object ( e n t l a s t ) ) ) jru-obj -copy-prop "CONSTWJTWTDTH" {vlax-ename->vla--object ent) (vlax-ename->vla-object ( e n t l a s t ) } ) ) ; _ end of progn ) ;_ end of if ) ; _ end of while I ; _ end of if (ru-user-write-last-param {strcat "Раэиер" msg "L") (rtos 1 2 2 ) ! (tu-uset-write-last-param (strcat "Размер" msg "H") {rtos h 2 2 ) 1 icu-app-end) [princ;
При копировании свойств от основной линии (отрезка или компактной лолилинии) К нновь нарисованному объекту не возникнет сбойной ситуации, лаже если мы попытаемся присвоить отрезку свойство Constantwidth, которого у отрезка не существует. Объясняется это тем, что и функции iu-obj-copy-ргор предусмотрена наша традиционная ловушка ошибок ru-error-catchВ результате (рис. 27.7).
работы
программы
могут быть
нарисованы
пилястры
и
ниши
Глава 27. Примеры программ для архитектурно-строительной части \Kftft .ИИЫ • I 1 '
877
'
Список с н
РИС. 27,7. Результаты рисования пилястр и ниши
Рээмгры.мм --
Радколонн-
Рис. 27.8. Диалоговое окно программы рисования колонн
Рисование колонн и опор Еще одним примером упрощения технологии программирования является программа рисования на плане колонн различных конструкций и типоразмеров. Прежде она имела диалоговое окно (рис. 27.И), над которым пришлось немало потрудиться. В диалоговом окне можно было выбрать конструкцию колонны из выпадающего списка, каждая конструкция была проиллюстрирована слайдом {который надо было создать и поместить в библиотеку), имелась возможность внести или указать размеры, количество и шаг колонн. Владея рассмотренными и книге технологиями, мы можем легко сформировать иллюстрированное XML-меню для любых конструкций и типоразмеров. После выбора типоразмера остается указать шаг и количество изображаемых колонн, а это легко сделать в командной строке. Программа могла бы вообще только производить множественную вставку блока, тем более что точки вставки в виде пересечений осей имеются, но мы все-таки предусмотрим возможность рисования рядов колонн с заданным шагом, имея в виду, что эта программа нам понадобится не только для колонн, но и для многих иных изображений. Сначала решим, как мы будем рисовать любую отдельную колонну. Разумеется, лучше всего использовать блоки. Самым простым решением является использование единичных блоков (рис. 27.9) — в этом случае, задавая масштабы вставки по осям X и Y, равные реальным размерам колонн, можно один единичный блок использовать для всех типоразмеров. Обычно это приемлемо, но если важно выдержать и внутриблочные размеры, то могут понадобиться блоки реальных изображений. Например, при использойании единичного блока двухветвевой колонны не совсем верно будет отображаться толщина ветвей, а это может оказаться препятствием при разработке смежных разделов. Очевидно, надо иметь возможность использовать любые варианты рисования, следовательно, макрос XML-меню должен сообщить программе и то, каким методом следует рисовать колонны. "Продвинутые" пользователи, зная допустимые методы рисования, смогут сами создавать необходимые им блоки и расширять меню. В принципе, колонна может ри-
Часть IV. Разработка прикладных программ
878
соиаться и не блоком, а какой-нибудь "хитрой" функцией — лишь бы а момент рисования эта функция была определена. Колонны лучше всего рисовать рядами, задавая тип и количество колонн, расстояние между колоннами и направление ряда. Для этого пригодится функция, приведенная и листинге 27.5.
= z нн жФа
•
Рис. 27.9. Единичные блоки схематичных изображений колонн
Листинг 27.5. Функция ru-block-insert-diet-count [defun. ru-block-insert-dist-count (block_name x_scale y_scale z_scale firstjaoint ang dist count) (repeat count (ru-block-insert-obj block_narae £ir5t_point x_scale y_scale 1 ang} (setq first__point (polar first_point ang dist) ) ) first point
Функция, осуществляющая запрос исходных данных для рисования ряда, приведена и листинге 27.6. Листинг 27.6. Функция ru-trasa-draw-block-count ru-trass-draw-block-count (block__naroe x__scale y_scale dist count / first__point) [while (setq first_point (_tu-get-with-default (strcat "Dist*" [rtos dist) ", Coiuit=" (itoa count) ". Точка начала ряда"! "Выход" 'getpoint nil "Dist Count" nil)) (if (ru-is-point first_point) (setq first_point (trans first_point 1 0 ) 1 ) (cond ! ( = first_point "Dist") isetq dist (ru-get-dist "Пролет" d^st nil)}) ( ( = first_point "Count") (setq count (ru-get-int-or-pick "Количество" c o u n t ) ) ) :T (setq first_point (ru-block-insert-dist-count block_na»e x_scale y__scale 3
fir£t__point [angle first__point [ru-get-poinC-required "Направление ряда" firstjioiflt}; dist count)
(list dist count)
Глава 27. Примеры программ для архитектурно-строительнсм части
879
Основная программа, шзов которой осуществляется из XML-меню, прииедена в листинге 27.7. •" ••
Яистинг 27.7. Файл ru_ar_colomn_row.lsp (defun START (block_lib block__name x_size__mm y_size_mra / result) (ru-app-begin) [if (ru-block-lib-insert block_lib block__name) Iprogn ;setq result (ru-trass-draw-block-count block_namE (ru-conv-millimeter-to-unit x_5ize_inm] (ru-conv-millimeter-to-unit y_size_nm; Iru-conv-milliraeter-to-unit (atof (ru-user-read-last-param [strcat "columr.DistForBIock" block_r.amei "6000"))) latoi (cu-user-read-last-param (street "ColuimCountForBlock" block_name) " 1 " ) ) ) ) (ru-user-write-last-param (strcat "ColumnDlstForBlcck" block_name; (rtos (car result)И [ru-user-write-last-рагаш (streat "ColumnCountForBlock" block_najne) (rtos (cadr r e s u l t ) ) ) 1;__ end of progn );_ end of if (ru-app-end) (princ)
В результате может быть нарисован рис. 27.10.
ряд колонн,
подобный
показанному
на
Рис. 27.10. Нарисованные ряды колонн
Пример с колоннами показьшает, как можно избежать разработки диалоговых окон и уходить от связанных с этим проблем. Полученная программа может исполыоваться не только для рисования колонн зданий, но и для любых других объектов, которые можно изобразить расстановкой блоков на заданном расстоянии. Все дальнейшее "программирование" сводится к подготовке необходимых блоков и редактированию XML-меню, а это уже работа, за которую охотно берутся обычные пользователи.
Часть IV. Разработка прикладных программ
880
Отверстия в стенах и перекрытиях Наличие планов с отверстиями для прокладки коммуникаций является одним из признаков качественных рабочих чертежей — независимо от того, предусматривается ли пробивка отверстий или они должны быть оставлены при сооружении стен и перегородок. Отверстия всегда являлись предметом спора как между конструкторами-строителями и смежниками, так и между генподрядчиками и субподрядчиками. В "советские" времена отсутствие отперстпй или несоответствие их размеров СНиП по производству работ могло послужить причиной для отказа субподрядчика от приемки объекта иод монтаж — напомним, что тогда очень часто все искали не работу, а причины для уклонения от нее. Раздоры внутри проектных организаций происходят до сих лор. Конструкторам строителям не хочется делать л и ш н и х проемов с перемычками или монолитных участков в перекрытиях, э смежники должны добиться, чтобы отверстия соответствовали нормам. Размеры отверстий по СНиП предусматривают комфортные условия для монтажа коммуникаций, например, размеры оиерстий для воздуховодов должны быть на 150 мм больше диаметра или размера стороны воздуховода, следовательно, лаже для воздуховода с минимальным диаметром iOO мм уже нельзя воспользоваться пробивкой отверстия В пустотном перекрытии. В результате часто и строители, и смежники делают вид, что проблемы с отверстиями не существует и оставляют ее для решения по принципу "пробника по месту, диаметр по соображению". Мы все-таки будем рассматривать вариант нормальной работы — подготовку смежниками задания на отверстия и выполнение строителями планов отверстий. При использовании САПР эти два этапа можно легко совместить. Смежники должны аккуратно нарисовать на специальных слоях планы отверстий, а строители должны С минимальной доработкой использован, эти слои и своих разделах. После сведения в один файл планов отверстий разных марок необходимо составить ведомость отверстий. программу для рисования отверстий для коммуникаций. Здесь нам не обойтись без диалогового окна (рис. 27. 1 !). Мы видим, что программа позволяет: О задать размеры отверстия путем виола в иоле редактирования, измерением в рисунке (кнопки <), указанием на отверстие-аналог (кнопка Аналог) или выбором из справочника (кнопка СНиП):
-азмерь' отверстия "*i Ширииа
Высота
|£ОСГ~1 _<J
|500~~J _<_|
\
Высота от попа. h*j- ' [2000
I ^ Оси
-
Г Ним
.
UJ^jiw стены |i340
J
<
|
ГЗростйвяягь раэгнврдо— ibcij
>>
- В лЩелец отверстия—
Г Kpw
Рис. 27.11, Диалоговое окно программы рисования отверстий е стенах
Глава 27. Примеры программ для архитектурно-строительной части
881
П задать толщину стены прямым вводом, намерением или выбором из справочника; П задать отметку оси или низа отверстия от пола этажа; "3 указать, до оси или края отверстия выполняется привязка; D задать марку раздел а-владельца отверстия или выбрать ее из справочника. Во время рисования отверстия (кнопка Делай) программа выдаст запросы: Эсь отверстия <Вых'од>;
Пользователь указывает начало отверстия в месте входа трубопровода в стену. Направление трассы:
Пользователь указывает точку в нужном направлении. Программа рисует зачерненное обозначение ошерстия в виде блока, присваивает ему требуемые значения атрибутов, прицепляет к концу отверстия первую точку выносной линии маркировки и запрашивает точки выноски. Вторая тс4Кл выносной линии номера отверстия: ЗледуЮ1Пач т^чк-i В1^:но:;нсй линии кодера отверстия
< Выход>;
После рисования выноски на се конце подписывается обозначение отверстия и запрашивается точка привязки оси или края отверстия. Начало выносной размерной линии от коч-трукци;::
После указания точки привязки выводился запрос Положение размерной линии:
И программа дожидается, пока пользователь не передвинет размерную линию и нужное место (попытки нажатия к л а в и ш и <Esc> пресекаются). В изобразительном смысле программа проста — рисуются залитые прямоугольники, выноски обозначений и ра1мерные привязки, но для последующего составления ведомости отверстий приходится использовать ряд специальных приемов, которые могут послужить прототипами при разработке других программ.
Рисование отверстий в стенах Ознакомимся с исходным текстом программы (листинг 27.8). В ней используется много мелких локальных функции и несколько специализированных глобальных функций, которые пригодятся для программы рисования отверстий в перекрытиях. ! Листинг 27.8. Функция ru-holes-waU. Idefun ru-holes-wall (/*is_axes_level *botton_level *is_dira__axes *hole__height *hole_owner *hole_width * 1evel_from_floot 'number *max_n'Jipber *wall_width dcl_id;t aig^file dlg_name what_next _test _pick_dim _pick level _change__level __select_dira • __select_owner _select_wall_width _set_tile5-_sava _reatore _hole_info __leadec analog _draw_hole _draw_diir^rotated) ;;; Основная функция рисования отверстий в стенах
;;;
"окальная функция рисования размера
[defun
draw dim rotated (pntl pnt2 ana)
682
Часть IV. Разработка прикладных программ
(while (not (ru-error-catch (function (lambda () [princ "\пЛоложение размерной линии: "; (vl-cmdf "_.DIMLINEAR" pntl pnt2 "_Rotated" (ru-conv-rad-to-deg ang) pause)]} nil)))} ,-;; Локальная функция вычисления номера типоразмера отверстия
[defun _eval_number (/ number) (if (setq number (ru-holes-wall-find-hole-number *hole_widtb *hole_height *wall_widtn *bottomj.evel *hole_dic__list*) ] (setq "number number) [progn (setq 'number (H- *max_riurnbet) 'raan^number *number) ;;,- При добавлении нового отверстия список пополняется (setq *h<sle_dic_list* (cons (ru-holes-wall-hole-dic-dot-pair *number *hole_width *bole__height *wall_width *bottom_level) "hole die list*}))}) ;;; Локальная функция рисования отверстия
Idefun _dfau_hole (/ start_pnt end_pnt left_pnt om riqht_pnt sa start_dim__pnt ang old_lay) (setq old_lay (getvac "CLAYER")) г ; Установка слоя владельца отверстия (ru-layer-current (Strcat "RU^_WALL_HCLE_:-ffiRK_" *hole_owner) } (while (setq start_pnt (ru-get-point-or-exit "Ось отверстия" n i l ) I [setq end__pnt (ru-get-point-reguired ''Направление трассы" start__pnt) ang (angle start_pnt end_pnt) ersd_pnt (polar start__pnt ang (ru-conv-millimeter-to-uTiit *wall_width)) | ;: Вычисление номера типоразмера ; _e va l_r.turi>e r) ;; Вставка блока отверстия (ru-block-insert-obj "RU__HALL_HOLE__MARK" start_pnt (ru-conv-Jnilliraeter-to-unit *wall_width) [ru-conv-milliraeter-to-unit *hole_width) 1 (angle start_pnt end_pnt) '. ;; Автозаполнение атрибутов ' ru-Ы ос k- change -at tributes (entlast) (list (cons "OWNER" *hole___owner) :cons "HEIGHT" (vl-princ-to-string (ru-conv-unit-to-millimeter *hole_height))) (cons "WIDTH" (vl-princ-to-string (ru-conv-unit-to-raillimeter *hole_width))) [cons "BOTTOM_LEVEL" [vl-princ-to-string (ru-conv-unit-to-millimeter *bottom_level))I (cons "LENGTH" (vl-princ-to-string (ru-convumt-to-railliineter *wall__width) 1 ! г ; Построение виноски с маркой отверстия (^leader end_jpnt (strcat *hole__ownec "-" (itoa -number))
Глава 27. Примеры программ для архитектурно-строительной части ;;Соразмеривание isetq start__dim_pnt (ru-get-point-reguired "Начало вь»носной размерной линии о? конструкции" stai±_pnt; sa Igetvae "SNAPANG") от (getvar "ORTKOMODE")) [setvar "SN&FANG" ang) (setvat "GRTHOMODE" 1; [if *is_dxm__axes ;;размер до оси ;_dt:aw_dim__rotated {trans end_pnt 0 1) (trans start_dim_pnt 0 1) (ru-geom-go-right ang] ) ;; Если размер до края ;; выясняем, до какого края [if {<.= (distance (setq left_pnt (polar end__pnt (ru-geom-go-left ang) I/ *hole_widtb 2 ) ) ) start—diin__pnt|;_ end of distance distance (setq right_prst (polar end_pnt (ru-geora-go-eight arigj ( / -hole_width 2 ) ) } start_dun__pnt}) ;_drau_diiTL_rotated (trans left_pnt 0 1) (trans start_dim_pnt 0 l; (ru-geom-go-left angl] :_draw_dim_rotated (trans right__pnt 0 1) (trans start_dim__pnt 0 1) (ru-geora-go-right a n g ) ) I) (setvar "SNAPAHG" sa) (setvar "ORTHCMODE" om|) :; Восстановление слоя old__lay)
;;; Локальная функция получения параметров отверстия по аналогу ;def\:n _ar.alog (/ ent _bottora_level _hole_height _hole__owner _hole_width _number __wall_width) (if (setq ent (ru-get-entsel-by-type "Укажите отверстие" "Это не БЛОК" (list "INSERT") t)) (progn isetq ent (car ent)) (if (and (setq_hole_width (ru-block-attrib-by-name ent "WIDTH") _hole_height [ru-block-attrib-by-name ent "HEIGHT") _wall_width (ru-block-attrib-by-name ent "LEMGTH"] _bottora_level (ru-block-attrib-by-name ent "BOTTCW_LEVEL"1 _hole_Ownej: (ru -bloc k-att rib -by-name ent "OWMER"))) ; progn isetq "hole_width {atof _hole_width) *hole__height (atof _hole__height; 'wall_width (atof __«all__width) *bottom_level (atof _bottom_levelI 1 ;; сменить владельца i_change owner hole_owner] ;_eval_numbe r) [сц-msg-info (strcat "ВЗЯТО ЗА АНАЛОГ ОТВЕРСТИЕ:" "\п\пМарка раздела " _hole_owner ";\пДлина = " _hole_width " мм;ХпВысота = " _hole_height " мм; ХпТолщина стены = " _wall_width " мм;\пНиз отверстия от пола этажа = " _hottom_level " мм "))
) [ru-msg-alert "Это НЕ отверстие в СТЕНЕ!"))): ); end of defun
863
Часть IV. Разработка прикладных программ
884
Локальная функция рисования выноски (defun _leader (start_pnt txt / list_point) [if (setq list_point (_ru-trass-draw-Iw [strcat " выносной линии номера отверстия " tut) start_pnt nil nil nil nil 0 0 nil)] [ru-text-add (strcat "%%u" txt) (trans (ru-text-end-leader-point (angle (cadr list_point) (car list_point)! (car list_pointl) 1 0) (ru-normal-text-heightI 0 [ru-text-end-leade r-align (angle (cadr list_point) (Car listjioint)) ! ) } (princ) )
;;; Локальная функция справки по отверстик (defun _hole_info (/ ent __bottom_level _hole_height _hole_ovmer _hole_width _wall_width> iif (setq ent (ru-get-entsel-by-type "Ука^сите отверстие" "Это не БЛОК" [ l i s t "INSERT"! T)) (progn [setq ent (cat e n t ) ) (if
(and
(setq _hole_width iru-block-attrib-by-name ent "WIDTH") _hole_height (ru-block-attrib-by-name ent "HEIGHT") _wall_width (cu-block-attrib-by-riame ent "LENGTH") _bottom_level (ru-ЫосХ-attrib-by-name ent "BOTTCW_LEVEL") _hole_owner [ru-biock-attriS-by-name ent "OWNER"))) (ru-msg-info (strcat "ДАННЫЕ ОТВЕРСТИЯ:" "\п\пМарка раздела " _hole_owner ";\пдлина = " _hole_width " мм; Хпвысота = " _hole__height " мм; ХпТолщина стены = " _wall_width " мм;\пНиз отверстия от пола этажа - " _bottom_level " мм " ) ) [ru-msg-alert "Это НЕ отверстие в CTEiiE i " ) ) ) 1 )
;;; Локальная функция еосстановления параметров отверстия (defun ^restore (/ ini__file) (setq ini_file fru-file-dwg-inil 'wall__width (atof (ru-ini-read ini_file "Setup" "wall_width" "540.0"); *hole__owner (tu-ini-tead ini_file "wall_holes" "hole_owner" "OB") *hole_dic_list* (ru-holes-wall-read-dic *riole_Owner) "max_nurobeE (atoi (ru-ini-read ini_nle "wall_holes" (strcat 'hole__owner "-max_nu:nber") " 0 " ) ; *hole__width (ru-conv-milli_meter-to-Qni.t (atof (ru-ini-read ini^file "wall_holes" "hole_widtb" "1000.0");; *hole_height [ru-conv-raillimeter-to-unit (atof (ru-ini-read ini_file "uall_holes" "hole_height" "1000.0"))) *is_axes_level (ru-conv-str-to-bool (ru-ini-read ini_file "wall_holes" "is_ax.es_level' "1")) *is_dira_axes (ru-conv-str-to-bool
[ru-ini-read ini file "wall holes" "is aira axes" "1"))
Глава 27. Примеры программ для -архитектурно-строительной части ' level__from_£loo: (ru-OGnv-ir.il lii'ioter-to-unit !atof (ru-ini-read in-. f _ I e "w.-illj-oles" "level_from_floor" "1000.0"};
I) i_char.d& ] evt?l 1 I ;_ end of u e f u n ;;; вокальная функция сохранения параметров отверстия ! da fun _s-jve !/ i n i ^ f i l e i [ru-hoios-wall-wr- te-dic *hole_owner *hole_dic_list*; i s e t q i n i _ f i l e (ru-file-
I ; ; ; вокальная функция заполнения полей диалогового окна (defur. __set_tile? I ) ;зет. L; ie "ed_hole_ownec" *hole_: - ..:.o sl s e L _ t i l e "ed_hole_height" (rtos (ru-conv-unit-to-milliraeter 'hole heigh; i 2 0 ) 1 Ise- tile "ed_holo_width" ;rtos ( ru-conv-urnt-to-millimeter *hole__width) 2 0 ) ) !sct_tiic "ed_wa il__width" irtos jru-conv-unit-to-mi llimeter *wall__width( 2 0 ) ; ;set_tile "ed_l£?vel " (rtos ira-conv-unit-to-milliitietex 'level_f rora_iloor) 2 0}) ;sal_tile "axes_leve) " (ru-conv-bool-ta-stc *is_axes_levs?l) ) :sst_:jle "bor.tira__level " (ru-conv-bool-to-str (not *is_axes_level) ) !set_tile "diiti_axes" (ru-conv-buol-to-sLr T is_;iim_axe5} I {set_tile "dim borde-" (ru-conv-bool-lo-str (riot ";5_dim_a>:es) ) ] latest)
; ; ; Локальная функция реакции на изменение владельца отверстия i'-iefun change owner (r.ew o ;n;-ini -write ( rn-f ile-dwg-irii! " w a l l _holes" *hale owner "-max nijralier") (itoa *max_n'jmberl )
88S
886
Часть IV. Разработка прикладных программ
; ; Сохраняем данные отверстий прежнего владельца [xu-holes-waH-write-dic 'hole_owner -hole_dic_list*) [setq *hole__ovmer new_ownei: ;; Читаем данные нового владельца •hole die list* (ru-holes-wall-read-die *hole_owner) 'raan^nuniber (atoi (ru-ini-read (ru-file-d«g-ini) "wall_holes" ;strcat *hole__owner "-max_nwnber"} " 0 " ] ) ) ) ,..
;;; Лока-тьная функция выбора владельца иэ словаря [defun __select_owner (/ data) (if (setq data (ru-xml-get-sdata "Марки разделов" (ru-file-menu-xml "options\\marka_rz.xml")]} [if (and [/= data " " ) ( / = data *hole_owner))(_change_owner d a t a ) } ] ) ... ;;; Локальная функция редактированич владельца [defun _edit_owner (new_owner) [if (and (/= new_ovmec "")(/= new_owner 'hole^ownerl} (_change__owner new_owner) 1 ] ;;; Локальная функция редактироканля БЬ:СО^Ы отверстия
[defun _edit_height 0 ;; При неверном вводе останется старое значение (aetq *hole_height (ru-dcl-check-tile-param "ed_hole_height" "Высота" 50 6000.0 *hole_height 0 "button_do"))) ,-,-; Локальная функция редактирования иприны отверстия [defun _edit_width () (setq *hole_width (ru-dcl-check-tile-param "ed_hole__width" "Ширина" 50 6000.0 *hole_width 0 "buttori_do")) ! ;;; Локальная функция выбора ширины стены из словаря [defun _select_wall_width (wall_width / data) (if (setq data (ru-xml-get-sdats "типовые стены" [ru-file-menu-Kml "options\\wall_w.xrnl"))! (atof (car (ru-string-to-list data ";"))) wall_widthj) ;;; Локальная функция редактирования ширины стены
(defun _edit_wall_width (] [setq "wall_width (ru-dcl-check-tile-param "ed__wall_"idth" "Ширина стены" 50 1000.0 *wall_width 0 "button_do"))) ;;; Локальная функция редактирования отметки отверстия от пола [defun edit level (1
Глава 27. Примеры программ для архитектурно-строительной часта
887
isetq *level_from_floor (ru-dcl-check-tile-param "ed_level" "Отметка" -100000 100000 *level_from_floor 0 "button_do") } ) ; ; ; Локальная функция выбора отверстия из справочника (defun _Eelect_dim (/ data height width) ,.i.f Isetq data ( tu-xml-get-stiata "Типовые отверстия" (ru-file- menu-xml "optioris\\wallb.ole.xml") } ! (prong
:\ 3 справочнике часть данных задана с фиксированными размерами отверстии (например, для стоякоб и подволок) , а часть определяется расчетом в зависимости от диаметра трубопровода или размеров сторон прямоугольных воздуховодов. На необходимость выяснения диаметров указывают целочисленные коды, получаемые вместо реальных отверстий isetq data (гц-string-to-list data ";") width (atof (car datal ] height (atof (cadr data) I ) Icond ; (and != width 3) (= height 1) ) (if (eetq data (ru-xml-get-sdata "Выбор диаметра трубопровода" [ru-file-menu-Kml "options \\du__lst.xml") ) ) ; ; Для труб размер отверстия Сольце на 100 мм диаметра трубы (setq *hole_height !+ 100. О (atof (car (ru-string-to-list dara ";"}})}}|1 s; Для воздуховопов размер отверстия больше на 150 мм размера воздуховода [(and (= width 2) (= height 1)) ; ; Прямоугольные ;if (setq data (ru-xml-get-sdata "Выбор ширины воздуховода" [ru-file-menu-xml "opt ions \\uzd_kr ,xml") I ; (progn (setq *hole_wi(jth !+ (atof [cadr (ru-string-to-list data ";"))) 150.0)1 ;if (setq data (ru-xml-get-sdata "Выбор высоты воздуховода" (ru-file-menu-xml "optionsX \uad_lcr. wnl") } 1 [setq 'hole_height !+ (atof (cadr (ru-strlng-to~list data ";"))) 150.0)};
))) Manca (= width 2)
(= height 0})
; ; Круглые ;if (setq data (tu-Kml-get-sdata "Выбор диаметра воздуховода" (ru-f lie-menu -xrnl "opt ions \\vzd__kr .xml"} ) ) isetq *hole_height !+ (atof Icadr (ru-string-to-list data ";"))) 150.0))); ;T (setq *hole_width width *hole_height height;
; ; .- Локальная функция пересчета отметки от попа при изменении высоты или - ; ; вида отметки (defun _change_level 1)
888
Часть ^Разработка прикладных программ
Isetq *bottom_level (cond (*is_axes_level (- "level_froin_floor (/ *hole_height 2 ) ) } (T *levei_from_floor))1 tprinc)) .L. ^ . , . . . .__
.
;;; Локальная функция обработки переключателя вида отметки .. :defuii _pick_level (name_what_pick} (setq *is_axes_level (= naffle_what_p;cr< "axes_level"l)} ,•,-; Локальная функция обработки переключателя вида привязки [defun _pick_dim (naine_what_pick) [setq *is_dim_axes (= name__what_pick "dim_ ... Г ,-;; Локальная функция справки [defun _help (/ err| Iru-dlg-view-txt-file (ru-£ile-heip-;xt dlg_file) "О программй" "Задание на отверстия" (and *ru_developer* (rj-user-may-txt-hlp-editi))}
_L.__
.
__ r f
J
^.
.
r
;;; Локальная функция тестирования ввода [defun _test (/ err) (setq err (cond ((<= *hole_height 0] "Недопустимая высота отверстия") [(<-'= *hole_width 0) "Недопустимая ширина отверстия"! ( [•:= *wall_wldth 0) "Недопустимая толщина стены"| !(= *hole_owner "") "Не указана марка"! (Т "") ) ) (set_tile "error" err) ;roodc_tile "button do" (cu-conv-value-to-wordbocl (not (= err "")
;; Главная программа ;ru-app-begin) г; Внедрение библиотеки блоков [if (ru-block-lib-inser^ "ru-lib-bui]d" "RU_WALL_HOLE_MAKK"; (progn Isetq dlg_file "ru_ar_hole_wall" dlg^a.'ae "start" what__next 100] ;if (> (setg DCL_IDX (load_dlalog (ru-file-del dlg_rile))) Oj (progn •,- Восстановление параметров ;__restore) ;; инициализация переменных [while (> what_next 0} (if (new_dialog dlg_name DCL_IDX) Iprogn 1 ; Установка данных ; set tiles)
Глава 27. Примеры программ для архитектурно-строительной части ;; Определение обработчиков событий [action_tile "ed__hole__owner" " (_edjt_owner Svalue} i_set_tiles)"] ;action_tile "dic_hole_cwner" "(_select_owner){_set_tiles| ") [action_tile "ed__hole_height"
;; ;; :;
;;
"(_edit_height)(_change_level)(_set_tiles)") ;action_tile "get_hole_height" "(done_dialog 2 ; " ) !acti.onj:ile "ed__hole_width" " (_edit_width) f_bot__tiies) "I iaccion_tile "get_hole_width" "(done_dialog 3 ) ' V ;action_tile "ed__wall_width" " (_edit_wall_width) (_seti_tiles) ") !action_tile "get_wall_width" " (tione_dialog 4 1 " ) {action_tile "dic_wall_width" "isetq *wall_wldth (_select_wall_width *wall_width})(_set_tiles)") [action_tile "dim" "(_pick_dim Svaluel(_set_tiles)") (action_tile "level" " {_pick__level Svsluel (__change_level| [_set_tiles) "! idCLior._ti.". e "ed level" " i_ed^t_level) (_change_levell (_set_tiles) "', (action_tile "analog" "|done_dialog 6 1 " i (action_tile "dic_hole_dim" " (_select_dim) (__change_level} (_set__tiles) ") (action_tile "oty_spr" "(done_dialog 5 ) " ) (action_tile "button_do" " (done_dialog D " ) ;action_tile "cancel" "(done_dialog 0 ) " ) iaction_tile "help" "(_help)"};_ end of actlor._tjle Запуск диалогового окна (setq Hhat_next (start_dialog)) Icond Рисование отверстия I(= 1 what_neKt)(_draw_hole)] Указание высоты в рисунке ( ( = 2 what_next) [setq *hole__height (cu-conv-unit-to-railliineter (ru-get-dist "Высота отверстия" (ru-conv-millimeter-to-unit "*hole_heightl n i l ) ) ) (_change_leuel)) Указание ширины в рисунке i ( = 3 what_next) [setq *hole_width Iru-conv-unit-to-miliinietei (ru-get-dist "Ширина отверстия" {ru-cony-millimeter-to-unit *hole_width) nil))))
;: Указание ширины стены в рисунке [i= 4 what_next; (setq *wall_width (ru-conv-unit-to-millimeter (ru-get-dist "Ширина стены" (ru-coriv-millinieter-to-unit *wall_width) nil)))) ;; Справка об отверстии ([= 5 what_next)(_hole_info}) ;; Установка параметров по аналогу
((= 6 what_next)(_analog) (_change_level)) ;; определено в базовом DCL ; {= 8 what_next) (ru-del-hide-dialog))
889
890
Часть IV. Разработка прикладных программ
(progn [setq what^next 0) (ru-msg-alert (strcat "He ногу показать диалог '" dlg_narne " ' ! " ) } ) } ) (_save)(unload_dialog DCL_IDX)) (r-u-msg-slert (street "He могу загрузить файл диалога \п'" (ru-file-del dlg_file) " ' ! " ) ) ) ] ) (ra-app-endi (princ)I Все сложности в программе вызваны необходимостью последующего формирования ведомости отверстий. Каждое отверстие характеризуется строкой, сформированной из значений параметров отверстия функцией tu-hoies-waii-string (листинг 27.9).
i
\ Листинг 27.9. Функция ru-holea-wall-string (defun ru-holes-wall-string (hole_width hole__tieight wall^width bottom_level! (strcat (vl-princ-to-string (ru-conv-unit-tc-millimeter hole_uidth)} ";" (vl-princ-to-string (ru-conv-unit-to-millimeter hole_height)} ";" [vl-princ-to-string (ru-conv-unit-to-.iillimeter wall_width) ) ";" (vl-princ-to-stcing (ru-conv-unit-to-milliraeter bottom_levell)}! Функция ru-hoies-waii-hoie-dic-dot-pair (листинг 27.10) создает точечную пару из строки описания и номера отверстия. Необычное расположение номера на втором месте вызвано тем, что нам потребуется поиск номера по строке описания. Листинг 27.10. Функция ru-holes-wail-hola-die-dot-pair {defun ru-holes-wall-hole-dic-dot-pair (number hole_width hole^height wall_wio.th bottom_level) Icons (ru-holes-wall-string hole^width hole_height wall_width bottom_leveli numbet)) Из таких точечных пар формируется список параметров отверстий. При изменении владельца (марки раздела) список сохраняется в словарь рисунка в виде переменной с именем, включающим имя владельца (листинг 27.11), а список отверстий нового владельца читается из словаря (листинг 27.12). Так как в словарь (см. главу 13) можно записынать только списки С числом на первом месте в точечной паре, при чтении и записи элементы списка переворачиваются. Листинг 27.11. Функция Ш-holes-wall-write-die (defun ru-holes-wall-write-die (owner .iole_dic_list| (m-dietuar-set-data (strcat MR(J_MALL__HOLE_MABK_" owner; !ru-list-reverse-assoc hole die l i s t ! ) ; Листинг 27.12. Функция ru-holes-wall-read-die (defun ru-holes-wall-read-die (owneri !ru-list-reverse-assoc (ru-dictvar-get-data (strcat "RO_WALL_HOLE_MARK_" o w n e r ) ] ) }
Глава 27. Примеры программ для архитектурно-строительной части
891
Для того чтобы каждое отверстие со своим набором характеристик имело уникальный номер, в момент рисования отверстия производится поиск характеристик в имеющемся списке (листинг 27,13), если такое отверстие не найдено, номер увеличивается на единицу, иначе принимается найденный номер. | Листинг 27.13. Функция ru-holes-wall-find-hole-number ;defun ru-holes-wall-find-hole-nuraber (hole_width hcle_height wall_width bottom_level hole_dic_list] (car [ru-list-rnassoc (ru-holes-wall-string hole_width hole_height wall_width bottom_level} hole_dic_list))! Формирование списка значений атрибутов вставленных блоков отверстий производится функцией, приведенной в листинге 27.14. Листинг 27.14. Функция cu-Jiolas-list-wall-holee (defun ru -holes-list-wall-holes (/ list_holes_blocks result _bottoni_level _hole_height _hole_owner _hole_width _number _wall_width) (if (setq list_holes_b locks (ru-ss-to-ent-list (ssget "_X" (list ' ( 0 . "INSERT") [progn
(cons 2 "RU_WALL_HOLE_MfiRK" ) ) ) ) )
(raapcar (function (lambda (ent) (if (and {setq _hole_width (ru-block-attrib-by~name ent "WIDTH"; _hole_height ( tu- block -at t rib-by-name ent "HEIGHT" I _wall_width ( ru -bloc k-att rib-by ~name ent "LENGTH") _bottom_level (ru-block-attrib-by-name ent "BOTTCM_LEVEL" ) _hole_owier (ru-block-attrib-by-name ent "OWNER"!)) (setq result (cons (list _hole_owner _hole_width __hole_height _wall_width _bottom_level) result) ) ) ) ) list_holes__blocKS ))) ; ; Удаление повторяющихся элементов ;ru-list-remove-dublicates result) Удаление повторяющихся элементов из списка производится функцией, приведенной в листинге 27.15. I Листинг 27.15. Функция ru-list-remove-dublicatas (defun ru-list-remove-dublicates (1st / result) (foceach x 1st [if (not (member к result))(setq result (cons x r e s u l t ) ) ) ) (reverse result)) Конвертирование набора в список примитивов производится функцией, приведенной н листинге 27.16.
Часть IV. Разработка прикладных программ
892 Листинг 27.16. Функция m-ss-to-ent-list
(defun ru-ss-to-ent-list (selection; [if selection [vl-remove-if-not (function (lambda ! x } (= (type x; ' e n a m e l ) ) [mapcar 'cadr (ssnamex selecticn))])
Проверка корректности введенных д а н н ы х в ноля ввода диалогового окна производится функцией, приведенной и л и с м п и е 27.17 (есть и более шбкий нариант проверки — функция ru-dcl-check-tile-entry). : Листинг 27.17. Функция ru- del -check- tile-par am [defuri ru-dcl-check-tile-param ( t j le_:ia:ne t x t nrain nraax old dec locked_ti1e / val trap res key) ;;; Проверка правильности ввода в текущее поле диалога ;|Аргументы: Cile_name - имя элемента, в котором проверяется ввод nrain - минимально допустимое значение птах - максимально допустимое эначеш-iL old - старое значение dec - точность отображения чисел locked_tile - КЛЮУ кнопки, которую Hv-t-jso заблокировать при ошибке (if (setq tfup (atof (get_tile Cile_:;.:m-;-) ! ) [progn [setq res "") (mode_tile locked t i l e 0) ( i f (> tmp птах) (setq res (strca" txt " " (rtos trap 2 dec) " sojitae " (rLos nmax 2 d e c ) ) ) ) [if (< tup nrain) (setq res [strcat txt " " (rtos imp 2 dec) " меньше " (rtos nrain 2 d e c ) ) ) )
[if (/= res "") [progn [mode_tile tile_name 3)(ru-rasg-д]ert rest i s e t q trap o l d ) ) ; [5et_tile tile_name (rtos tmp 2 d e c ) ) tnp
Исходный текст диалогового окна приведен в листинге 27.18. Листинг 27.18. Файл ru-holes-wall.dcl // Отверстия в. стенах dcl_settings : default_dcl_5ettings { judit_level = 0; ] ^include "ru_cad_lib.dcl" get_liole__height: boxed_coluran {label="Высота "; : row {: edit_box (key = "ed_hole_heiyht";ediL_limit - 10; edit width = 6:}
Глава 27. Примеры программ для архитектурно-строительной части : button (label = "<";key = "get hole height"; fixed width = true; -~ width - 1,-}] spacer; spacer;)
i
get_hole_bddth : boxed_column flabel-''Ширина"; T1
: row {: edit__bon (key = "ed_hole_width ;edit_limit =10;edit_width = 6 ; ) : button {label = "<";key = "get_hole_width";fixed_width = truc; width = I ; } } spacer; spacer;] get_wall_width: boxed_coluran (label= "Ширина стены"; : row {: edit_box (key = "ed_wall_width"; edit_liniit = 10; edit_width = 6;} : button (label = "<";key = "get__wall_width"; fixed_width = true; width = 1,-) : button (label = "»";key = "dic_wall_width"; £ixed_width = true;
width = 2 ; } } spacer,- spacer;] box_dira: boxed_cobjinn (1аЬе1="Проставлять размер до"; : radio_row {key = "dim";: radio_button (label = "Оси"; key = "dijr,_axes";value = "1";): radio_button (label = "Края"; key = "dira_border";value = " 0 " ; ] ) spacer; spacer;] get_levol: column (: edit_box {key = "ed_level";edit_lirait = 10;
edit_width = 6;] spacer; spacer;] box_level: boxed_row (1аЬе1="Высота от пола, мм"; get_levei;icoluran {: radio_row (key = "level"; : radio_button (label = "Ocn";key = "axes_level"lvalue = "1" ; radiG_button (label = "HH3a";key - "bottom_level";value = spacer; spacer;]} gat_analog: boKed_column {1аЬе1="Взять размеры"; i r o w {: button (label = "AHanor";key = "analog";fixed_width = true; width = Ё ; } : button {label = "СНиП";1:еу = lr dj.c_hole_dim"; fixed_width = true; width = 4 ; ) | spacer; spacer;] box_hole_diyi!: boxed_column (label = "Размеры отверстия, мы"; :concatenation (gsc_hole_width; get_hole_height; get_wall_width; get_analog;j spacer; spacer;} get_hole_owner: bo:;ed._column (label="Владелец отверстия"; :row |; edit_box {key = "ed_hole_owner";edit_limit = S,-) : button (label = "»";key = "dic_hole_owner"; fixed_width = true; width = 2:}} spacer; spacer;} start :dialcg (label="Отверстия в стенах";Кеу - "title"; box__hole_dira; : row (box — level; boK_dim; get_h.ole_o«ner;} errtile; : row (do exit_hide_help;; button (label = "Чье?"; key = "otv_spr"; fixed_width = true; width = 2 ; } } }
Составление ведомости отверстий в стенах После того как все отверстия в стенах нарисованы, можно составить и нарисовать ведомость отверстий. Ведомость можно составить и после сведения в один ф^йл слоев, п о л у ч е н н ы х or разных исполнителей — конечно, если отверстия нарисованы нашей программой. Ранее нарисованные ведомости можно просто стереть. Функция создания ведомости отверстий в стенах приведена в листинге 27.19.
Часть IV. Разработка прикладных программ
894
1истинг 27.19. Функция ru-holaa- wall -report (dafun ru-holes-wall-report (/ bottom_level f i r s t hole_dic__list hole_height hole_nuraber hole^owner hole^width lisi;_holes pnt trnp wall_width) (if (ru-yes (strcat "ХпКоманда создает ведомость отверстий в стенах." "\п\пОтБерСтия должны быть предварительно проставлены" 1 "\пс помощью команды 'Отверстия в с т е н а х ; " "\п\пБудем делать")) (progn (ru-app-begin) (if (ru-yes "Нарисовать форму ВЕДОМОСТЬ ОТВЕРСТИЙ В СТЕНАХ") (ru-table-draw-with-ask "tab_otvs" nil T ) ) [if (setq list_holes (ru-holes-list-wall-holes)) (progn (setq put (polar (ru-get-point-reguired "Левый нижний угол графы первой строки ведомости отверстий" nil) (ru-geom-go-left 01 (tu-conv-raillimeter-in-paper-to-unit 4 . 0 } ] first T) Iforeach hole list holes (seCq hole_cwner (nth 0 hole] hole_width (nth 1 hole) (nth 2 hole) hoie_height wall_width (nth 3 hole; bottom level (nth 4 hole; hole_dic_list (ru-holes-wall-read-dic hole_owner) hole_number (ru-holes-wall-find-hole-number hole_width hole_height wall_width bottom__level hole_dic_list ]) (if hole__number (setq hole_number litoa hole_number]} ;; Для неизвестных отверстий (setq hole_nuniber "???") ) (if (not first) [if (setq tup ;_ru-get-with-default "Левый нижний угол графы следующей записи" "Авто" 'getpcint nil nil n i l ) ) ;; вернет или указанную точку, или nil, при Enter [setq pnt (polar (trans Ьпр 1 Q) [ru-geom-go-left 0) (ru-conv-roillimeter-in-paper-to-unit 4 . 0 ) ) | ) [setq first nil pnt (trans pnt 1 0 } ) ) [setq pnt (ru-text-draw-in-table pnt
))
(list (strcat hole_owner "-" hole__nuraber} hole_width hole_height wall_width bottom_level hole^owner) (list 20.0 25.0 25.0 25.0 25.0 25.0)))
Глава 27. Примеры программ для архитектурно-строительной части
895
[ru-msg-alert "Отверстия а стенах не найдены") ) (ru-app^end))) (princ)
После разработки программы рисования отверстий в стенах мы аналогичным образом разрабатываем профамму рисования отверстий в перекрытиях {рис. 27.12). |Отверстия в пирекрытиян - Размеры отверстий, нг* - -Дм*э~ ]600
г
|
- -]
Ширима ТО -
< |
[350""
Отметь веиха паренрытня, м
Взять размеры ™ Аналог
СНиП
- j f - Владелец стверсгня
а!
„| ?|
Рис. 27.12. Диалоговое окно программы рисования отверстий в перекрытиях Отверстия в перекрытиях рисуются по таким же принципам, но с учетом некоторых особенностей: 3 отверстия могут быть круглыми и прямоугольными; D требуется задавать угол поворота отверстия; П должны быть выполнены две размерные привязки. г
•-
ТХ-1
Рис. 27.13. Пример плана отверстий
Часть IV. Разработка прикладных программ
896
Результат рисования отверстии показал на рис. 27.13. составления ведомостей отверстий — на рис. 27.14. 1
ВЕДОМОСТЬ ОТ5ЕР.П .' I CTEI'AX И ПЁ'Е'ОРЭДКОХ Размеры. n\
Мцжа
• .. • )'•' 1 rm: I :
ШфмЗ
чек--
•woo
адоо
- II
НвК-1
чОО.О
100 D
юст
НВК-2
2000
гопо
тс-1
еоо.о
300 В
MtpfH 4TDH*'fU
г l^-i'-ftML^
1
nm 00 }. и 41. [1 0
нек
1 h
;:и |
ПОйП
IIBK
:•
1--( 1
ТС
ВЕДОМОСТЬ этьектк.' е ПГРЕ'^.Т-' Pu>ie[*j. нл
Мори Длина
Шина
6W U
ТН-1 ТС-2
:.' "i'^i'p
ьясо
250.0
^крыпиьи
мажо •«pntf^ea
i.O
i(
.,1
т;
ripjne«.iijc
.
Рис. 27.14, Пример ведомости отверстий
Резюме Мы рассмотрели только несколько программ зля рисования строительной части. За пределами обзора остались программы для рисования различных проемов, планов и разрезов лестниц, элементов полов, элементов фасадов, выполнение схем и деталировки конструкций, рисование различного оборудования и многое друюс. Большинство таких программ просты для разработки, особенно с учетом возможности применения функции из нашей библиотеки. Основу для многих мы уже рассмотрели, например рисование таблиц, текстов и иставку блоков, а некоторые, такие как использование типовых проектных решений, разберем в последующих главах. Хочется подчеркнуть необходимость разумного сочетания создания изображений с использованием блоков и с рисованием по рассчитываемым точкам. Нам приходилось встречать программы, в которых рисуется контур железобетонных ферм и плит перекрытия. Это явно неразумно, т. к. геометрия этих изделий не меняется десятилетиями (хотя изменяются серии и маркировка), а программы фактически рисуют всегда одинаковые изображения. В этом случае лучше применить блоки. А вот окна и двери на фасадах мы предпочитаем рисовать программным путем, т. к. их номенклатура очень велика, при небольшом количестве параметров внешнего вида.
^u/CAD Г Л А В А 28
Программы для "генпланистов" и топографов Программ для рисования топографических и генеральных планов мы разрабатывали очень много, но приведем только несколько характерных примеров. Большинство таких программ не являются сложными для программиста, хотя встречаются исключения, например, составление картограммы земляных работ или профилей коммуникаций. Количество пунктов меню для этих разделов проектов очень велико, i-o "номенклатура типов программ" ограничена. Специалистам, работающим с планами местности, чаще всего требуется рисование: П точечных условных знаков, которых насчитывается несколько сотен, но все они могут быть созданы с помошью рассмотренных нами функций вставки блоков; D линейных изображений (трасс коммуникаций, ограждений), для которых у нас предусмотрено несколько функций рисования трасс; О дорог различного назначения, которые можно создавать по одному прототипу с отрисовкой одной бровки дороги и созданием второй бровки с использованием подобия; О различных границ и зон в виде рассмотренных нами контуров и штриховок. Остальные изображения легко программируются в индивидуальном порядке.
Использование городской системы координат Работа с планами территорий тесно связана с использованием геоинформационных технологий (см. главу 34), хотя топографы и генпланисты, к сожалению, часто даже не знают о существовании этой отрасли. Но и в этом случае каждый топограф знает, что в САПР топографические планы используются в качестве подосновы для чертежей генплана и сетей, а чертежи генплана и коммуникаций должны отражаться на дежурном плане города. Достичь этих целей можно только при выполнении чертежей в единой системе координат. В каждом приличном населенном пункте такая местная система координат имеется 1 . У крупных предприятий могут быть и собственные местные системы координат, привязка которых к городской системе может быть закрыта.
1
Одним из немногих исключений является город Москпа
Часть IV, Разработка прикладных программ
898
При работе в AutoCAD в качестве местной системы координат следует использовать мировую систему координат (MCK, WCS). Это единственная система, имеющаяся в каждом рисунке. See планы местности должны выполняться только в ЫСК, какими 1 бы неудобными не казались значения этих координат . За единицу рисунка обычно принимают один метр. Напоминаем, что все наши функции поддерживают систему-пропорциональности и позволяют создавать одинаковые на бумаге изображения при работе и с миллиметрами, и с метрами. Второе важнейшее условие — изображение плана местности никогда не должно переноситься а поворачиваться для удобного размещения на листе. Поворачивайте формат, рисуйте его в ПСК, поворачивайте пиды. но никогда не поворачивайте план, иначе его невозможно будет совместить с планом города и другими генпланами. Третьим важнейшим условием является использование единой системы слоев для всех планов. В нашей системе это обеспечивается с помощью рассмотренного ранее классификатора слоев.
Названия осей координат В геодезии ось координат, направленная на север, обычно называется X, а не Y, как в системе AutoCAD, хотя в некоторых населенных пунктах придерживаются "математического" именования осей. Надо понимать, что X и Y всего лишь символы, обозначающие оси. Как бы мы их не называли, u AutoCAD первое число в списке 1 Ре да* юр i о по графический л .шиын города Данные города
Держатель планшете*
- - '- Изготовитель планшетов . | Муниципальное^ Организация
Министерство
.1
Комитет по врите] , | Олератср
jDi-сгтииаЛА
. Ле£ын верхи*! основной планшет •• Масштай
|i 5000
_-J Кол колонок
Координата на восток
|12
-Системы — Координат ВысспГоризонтали
Наличие планшетов
[7 1:5000
[Местная
17 1:2000
Местная
,]
Г7 Ось Хна Север Hifoepauua 1 500
j Номер
П Координата на Север
Г 1:1000 1-500
|от1 до 64 вйутр^ ! 501 »j Банк —*
|t \be^lia\sefver^
'
Обзор.. .j_]
Рис. 28.1. Редактор топографических данных населенного пункта
В некоторых населенных пунктах значения координат в местной системе могут составлять десятки километров.
Глава 28. Программы для "генпланистов" и топографов
89 '•
координат точки соответствует "координате на восток". Правильное обозначение осей имеет значение только в тех случаях, когда оно должно быть написано, например, при выноске координат точки. Так как однозначного наименования осей для всех населенных пунктов нет, направление оси X необходимо уточнять в конкретных проектах. При работе в полной версии нашей системы, включающей ГНС-модуль, в специальной программе (рис. 28.1) производится выбор населенного пункта, для которого разрабатывается проект и устанавливаются все топографические данные, позволяющие впоследствии легко манипулировать топографическими планшетами. Задерживаться на этой программе мы не будем — она слишком объемна и требует изложения большого материала по системам разграфки топографических планшетов. Рассмотрим несколько более простых, но эффективных программ
Работа с координатами объектов Наибольшее впечатление на "теток", лет по двадцать занимающихся генпланами, производит одна из самых простых программ — выноска координат точки. Специалисты знают, что координаты углов трасс, участков отвода, границ красных линий и т. п. должны быть обозначены с помощью специальной выноски. При традиционном проектировании определение координат производится занудными графоаналитическими методами, требующими большой аккуратности и точности. В AutoCAD координаты любой точки всегда известны, остается их нарисовать в требуемом виде (рис. 28.2). Текст программы, как всегда, прост (листинг 28.1).
' ' Y-.2930.B4 \\ '
Рис. 28.2. Выноски координат узлов трассы
900
Часть IV. Разработка прикладных программ
: Листинг 28.1. Файл ru_topo_coord_leader.lsp [ciefun START (/ StaLt_pnt txt_x txt__y x x_north y] !ru-app-begin) (setq x_north (ru-conv-str-to-bool (ru-ini-read-default KIL "Setup" "X_axis_North" " 1 " ) ) (while (setq start_pnt !ru-get-point-or-exit "Укажи точку длч выноски координат" n i l ) ] (setq x (rtos (ru-conv-unit-to-meter (car start_pnt)) 2 2) v (rtos (ru-conv-unit-to-meter (cadr start_pnt|| 2 2H (if x_noi:th [setq txt_x (strcat "X=" y) txt_y (strcat "y=" x ) ) (setq txt_y (strcat "Y=" y) txt_x (stccat "X=" x ) ) ! (ru-draw-leader-and-two-string txC__x txt_y start_pnt) I [ru-app-endt (princl) [START)
Рисование выноски с двумя строками, применяемое во многих программах, выполняется функцией, приведенной в листинге 28.2. j Листинг 28.2. Функция ru-dxaw-leader-arid-two-string (defun ru-dtaw-leader-and-two-string (txtl txt2 start_pnt / align end_pnt len_txt lst_txt result y) [setq у 0 . 6 } (if (not start_pnt) [setq start_pnt (tu-get-point-or-exit "Начало выноски" n i l ) ) ) (if startjmt [progn [setq end_pnt (ru-get-point-reguired "Конец вьагоски" start_pnt] align (ru-text-end-leader-align (angle start_pnt end_pnt)) lst_txt (textbox (list (cons 1 t x t l l l ) len_txt [- (car (cadr lst__txt) ) (car [car lst_txt)) И (ru-line-add-raulti (list start_pnt end__pnt ;if (zerop align) [polar end_pnt 0 len_txt) [polar end_pnt (ru-georn-go-back 0) len_txt] ) I nil 0 nil; [ru-taxt-add txtl (polar end_pnt (ru-geom-go-left 0) !* у (ru-normal-text-height))) (ru-normal-text-heighti о align) [ru-text-add txt2 [polar end_pnt (ru-geon-,-go-iright 0) (+• (* у (ru-normal-text-height)) (ru-norroal-text-height)) ) (ru-normal-text-height) 0 align) (setq result t l I
result
Гла$а 28. Программы для "генпланистов" и топографов
901
Ведомость координат Еше одна эффектная программа, значительно облегчающая работу многих специалистов — ведомость координат полигонов или трасс (рис. 28.3). Она производит особое впечатление при большом количестве вершин полиюна, например, при составлении ведомости координат городской черты. Такой работой, за п р и л и ч н ы е деньги, может заниматься целый институт. После того как линия границы согласована и начерчена, значительную часть работы будет составлять расчет координат узловых точек, вычерчивание и заполнение ведомости.
Рис. 2В.3. Ведомость координат
В функции составления ведомости (листинг 28.3) единственной сложностью является кропотливое высчитывание координат точек таблицы и текстов. При этом, как всегда, используется очень много библиотечных функции. В аргументах функции передаются название объекта, префикс для номеров точек, максимальная высота таблицы. Если точек много, то таблица после достижения максимальной высоты продолжается вправо. Листинг 28.3. Функция cu-table-coords (defun ru-table-ccords (header pc;ints_prefix may._tabla_height / area closed curr_point first_point lst_po;nts lst_points_txt -next_point perimeter pline_ent point_count poirit__number point_txt last_start_point next_erid_pnt next _stari;_prit row height _draw_point_tstt _make_table _draw_table_line _draw_table_header _d с aw_t abl e_g r:_ d! ;;; Пример: (ru-table-coords "Зеиельный участок" " Т . " 50] ;;; Расчерчивание таблицы {defun _draw_table_grid (start__pnt endj>nt dowr._riisi: / next_start_pnt next_end_pnt list__columns_width) ;; левая черта (ru-line-a
902
Часть IV. Разработка прикладных программ
Вертикальные линии [mapcar (function (lambda (width / d i s t ) (setq dist [ru-ccnv-millimeter-in-paper-to-unit width] next_start_pnt (polar next_start_pnt 0 dist) next_end_jmt (polar next_end_pnt 0 dist); (ru-line-add next_start_pnt- next__end_pnt 0 nil) ) ) list_columns_width) Правая черта [ru-line-add [polar start_pnt 0 (ru-conv-milJ.J-meter-in-paper-to-unit 185.0)) (polar end_pnt 0 (ru-conv-raillimeter-in-paper-to-unit 185.0)1 0 nil) ;;; Шапка и заголовок (defun _draw__table_header (pnt header / scale next__line_start_pnt) (setq scale (ru-conv-millimeter-to-unit (ru-scale-current-space)) row_height (ru-normal-table-row-height)) (ru-bloek-insert-obj (ru-file-set-ext (ru-file-table "vedkrd") ".dwg") pnt scale scale 1 0) [setq pnc (polar pnt (ru-geom-go-rig.it 0) (ru-conv-millirneter-in-paper-to-unit 25,0! ) next_line__start__pnt (polar pnt (ru-geom-go-right 0) row_height) ) (rii-text-add [strcat "%%U" "ОБЪЕКТ - " Header) (polar (polar pnt 0 (i u- con v-atillimeter- in- paper- to -unit 5 ) J ; ru-geom-go-right 0) (- row^height (ru-conv-millimeter-in-paper-to-unit 2 ) ) ) [ru-normal-text-height) 0 NIL) ;; Линия после заголовка (ru-line-add next_line_start_pnt (polar ne>:t__line_5tart_pnt 0 (ru-conv-raillimeter-in-paper-to-unit 185.0)) 0 nil) (ru-geom-txt-dowri-line next_line_start_pnt) 1 ... Строка таблицы (defun _draw_table_line (le£t_row_point startjnt end_pnt tKt_start_pnt txt_end_pnt / azimut length__str txt_end_pnt_x txt_end__pnt__y) (if end_pnt isetq t>:t_end_pnt_x (rtos (car end_pntj 2 2) txt_end_pnt_y (rtos (cadr end_pnt! 2 2) length_str (rtos (distance ^tart_pnt end_pnt) 2 2) a^imut (ru-conv-angle-to-str (angle starE_pnt endjnc) 4 4 "%%d"J (setq txt_end_pnt_x "" txt_end__pr.-__y "" length^str "" azimut "") [ru-text-draw-in-table (polar left_row_point (ru-geom-go-left 0) [ r u - conv-mi 11 ii\eter-in-paper-to-unit 2 . 0 ) ) (list txt_start_pnt (rtos (car start_pnt) 2 2) (rtos (cadr startjint) 2 2} txt_end_pnt txt_end__pnt_x tnt_end_prit_y azimut length_str (list 20.0 20.0 2 0 . 0 2 0 . 0 2 0 . 0 20.0 35.0 3 0 . 0 ) 1 [ru-line-add le£t_row_point (polar lef c__row_point 0 (ru-conv-milliraeter-in-papt-'r-tc-unit 1B5.0)) 0 nil!
Глава 28. Программы для "генпланистов" и топографов
__
_
903
( ru-geom-txt-down-line lef t_row_point ) ; ; ;
------
Формирование
таблицы --------------------------
{defjn _make_table (lst_points lst_names_points header Area perimeter fflax__table_height Polygon / end_pnt go__up left_pnt left__topjpnt n name2 points_count rov)_height txt__pnt] [setq left_top_pnt {ru-get-poirit-reguired "Левели верхний угол шапки ведомости координат" nil} left_pnt (_draw_table_header left_top_pr,t header; n 0 points_coun.t (length lst__points! cow_height (ru -normal- table- tow-height) go__up {ru-geom-go-left 0 ) 1 ;repeat points_count [if (< n (1- points_count| ] [setq end_pnt {nth (1+ n) lst_pointsl narae2 (nth (1+ n! l=t_naraes_points} ) (if Polygon (setq end__pnt (nth 0 lst_points) nanie2 (nth 0 lst_names_points) ) [setq end__pnt nil name2 " " I ) ) ; ; проверка на превышение высоты [if (> (distance left_top_pnt left_pnt) maK_table_heignt; (progn I _d r aw_t able_grid [polar left__top__pnt
(гц-geom-go-right O )
[ru-conv-raillimeter-in-paper-to-unit 25) ) [setq left_pnt {polar left_pnt go_up rou_height)) row_height! !setq left_top_pnt (polar left__top_pnt С [ro-conv-millimeter-in-paper-to-unit 1ЭО) ; left_pnt (__dtaw_table_he ader left_top_pnt (strcat header " (продолжение) ") ) ! Isetq left_pnt {__draw_table_line Left_pnt {nth n lst_points) end_pnt [nth n lst_r.ames_pQints) name2) n (1+ n] ) ) ;_ end of repeat ;_draw__table_grid (polar left__top_pnt { гц-geom- go -right 0] (ru-conv-millimetec-in-paper-to-uriit 25) ) [Setq left_pnt (polar left_pnt go_up row_height}) vow_height! (setq left_pnt (polar left_pnt (cu-geom- go -right 0) ' i f Polygon.
row_heightl)
(progn {ru-text-add "Площадь " (setq txt_pnt (polar (polar left__pnt С
[ru-conv-millimeter-in-paper-to-unit 120) ) go_up (ru-conv-millimeter-in-paper-to-unit 2} } [гц-normal- text-height) 0 nil! (ru-text-add (strcat (rtos (* Area (ru-coiw-unit-to-rneter 1) {ru-conv-unit-to-raeter 1)) 2 4 ) " ьЙ"} (polar txt_pnt 0 (ru-conv-millj.ir.eter-in-paper-to-unit 35)! [ru-normal- text-height) 0 nil)
Часть IV. Разработка прикладных программ
904
iprogn (tu-text-add "Длина трассы " (setg txt_pnt (polar (polar left_pnt 0 [ru-conv-millimeter-in-paper-to-unit 120) ) go__up (nj-conv-roillirneter-in-paper-to-unit 2 ) ) ) (ru-normal-text-height) 0 n i l ) (ru-text-add (street (rtos perimerer 2 4] " " (ru-unit-name)] (polar txt_J?nt 0 (ru-conv-mlllimeter-in-paper-to-ijnit 35); [ru-normal-text-height) 0 n i l )
;;; Подписывание точки на плане !defun _draw_point_txt (txt ptl pt2 / angle_rad text_pnt txt_height) [setq angle_rad (angle ptl pt2) txt_height (ru-normal-text-height[ text_pnt (polar ptl arsgle_rad txt_height)> (ru-text-add txt [polar (if (and (> angle_rad 1.5708) (<= angLe_rad 4.71239))
[polar text_pnt (ru-geora-go-right angle_rad) txt_height) (polar text_pnt (tu-georn-go-left angle_rad) txt_height)
) [ru-geom-go-left 0) (* 0.5 txt_height)) txt_height 0 [ru-text-end-leader-align (angle pt2 ptl)); ;;;
Основная функция
(if (setq pline_ent (ru-get-entsel-by-type "Выбери полилинию Для ведомости координат" "Это не (list "LKPCLYLINE") Т)) (ргодл
ПОЛИЛИНИЯ"
(setq lst_points (ru-pline-list-vertex (car pline_ent)] closed (cadr lst_points) lst_points (car lst_points; Area (ru-geora-area-ent (саг pline_ent)) point^number 0 perimeter 0 point_count (length lst_points) first_point (nth 0 lst_points) last_start_point first_point) [repeat point_count [setg curr__point (nth point_number lst_points) poinc_number (1+ point:__number) point_txt (strcat points__prefix (itoa point_number)); (if (< point_number point__count) [progn (setq next_point (nth point_nuirber l3t__points)
perimeter (+ perimeter [distance curr_point next_point)I; [_draw_point__txt point__txt curr_point next_point) [progn (__draw_point__txt point__txt curr_point last_statt_point; (if closed (setq perimeter (+ perimeter (distance next_point first_point))J
Глава 28. Программы для "генллалистов" и топографов
9С5
i setq last__start_point curr_poi.nt lst_points_txt (cons point_txt 1st j)oints_txt)] );_ end of repeat ;_make__table Ist^polnts (reverse lst_points___txt) Header Area perimeter raax_table_height Closed)
) ) (priric) )
Несколько способов рисования откосов Рисование откосов — тема, являющаяся "пробным камнем" для любой графической системы. Попробуйте нарисовать откос по "советским" стандартам во многих популярных картографических системах — в лучшем случае найдется возможность применить тип линии с чередующимися штрихами постоянной длины. Откосы для мелкомасштабных планов, где не имеет значения размер штрихов, можно выполнять специальным типом линии и в AutoCAD (см. гяаву 7), но нас интересует стандартное изображение для крупномасштабных планов (рис. 28.4).
Рис. 28.4. Топографическое условное изображение откоса
Графические условные изображения откосов устанавливаются ГОСТ 21.108-78 Условные графические изображения и обозначения на чертежах генеральных танов и транспорта и условными знаками для топографических планов 1 . В общем виде для более наглядного выражения направления ската у ыерха кромок откосов наносятся штрихи перпендикулярно горизонталям1. Расстояние между длинными штрихами 3—4 мм, между короткими и длинными 1.5—2 мм. В стандарте указано только расстояние между штрихами, но умалчивается о длине коротких штрихов, а в примерах изображения рельефа короткие штрихи показаны и до середины склона (рис 28.5), и такой же длины, как и расстояние между штрихами. Условные знаки для топографических планов более конкретны — атина коротких штрихов должна быть равна расстоянию между штрихами. В учебной литературе 1
2
Условные знаки для топографических планов масштабов 1:5000, 1:2001). 1:1000, 1 500. — М. 1 Картleuuemp - Геодеаиздат, 2000. - 286 с.: ил. ISBN 5-86066-046-4. В ГОСТ 21.108-78 такого выражения нет, это цитата из учебника по строительному черчению
906
Часть IV. Разработка прикладных программ
встречаются различные варианты. Для нас этот мелкий вопрос очень важен, т. к. определяет весь алгоритм программы. Мы будем придерживаться правила — расстояние между короткими и длинными штрихами и длину коротких штрихов принимаем 2мм на бумаге. Мы будем также придерживаться наименований — бровка для верхней кромки откоса и подошва для нижней.
Mwmm Рис. 28.5. Вариант изображения откоса
Технология рисования зависит от способа определения бровки и подошвы. При топографическом черчении откос обычно "скалывается" с оригинала. Как были рассчитаны кромки и их пересечения, оператора не интересует, ему нужно просто получить такое же, но более аккуратное изображение, не исказив обстановку. В этом случае удобно автоматически выполнять штриховку откоса сразу после нанесения линий бровки и подошвы. При проектировании рельефа кромки и их пересечения строят по правилам начертательной геометрии, и построением таких изображений мучили всех студентов строительных вузов. Разумеется, такие построения очень просто делать в системе AutoCAD, а штриховку откосов лучше вынести в отдельную программу. Этот вариант является универсальным, и его мы примем за основу. Штриховка будет выполняться между примитивами, указанными в качестве бровки и подошвы.
Разбивка кромок Штрихи рисуются от бровки в направлении подошвы. Разбить бровку на равные участки можно командами MEASURE (РАЗМЕТИТЬ) и DIVIDE (ПОДЕЛИТЬ). Здесь возникает вопрос о том, "кто кому перпендикулярен". Штрихи должны быть якобы "перпендикулярны 1 " горизонтали, но и бровка, и подошва не являются горизонталями (линиями с одинаковыми высотными отметками) — это линии резкого перелома рельефа. Обычно штрихи строят по нормали к бровке, но это не цсегда возможно. Рассмотрим классический учебный пример построения откосов (рис. 28.6). В этом варианте штрихи построены по нормали к бровке откоса. Для участков, у которых кромки формируются прямыми или равномерно изогнутыми кривыми, все выглядит прилично, а вот "зуб" в нижней части построен безобразно. Небольшая правка нескольких штрихов позволяет получить требуемое изображение (рис. 2S.7). Именно таким образом были нарисованы откосы на сотнях топографических планшетах с использованием системы BestTA — быстрое рисование основных изображений и мелкая правка отдельных неверных деталей.
1
На нашем, "автокааовском" языке — построены по нормали к крияой.
Глава 28. Программы для "генпланистов" и топографов
907
Рис. 28.6. Откосы со штрихами, нормальными бровке
Рис. 28.7. Исправленное изображение со штрихами, нормальными бровке
В этой программе реализован следующий алгоритм (назовем его метод I): П бровка разбивается с шагом 2 мм на бумаге (блоки длиной 2 мм на бумаге вставляются "перпендикулярно" к бровке с помощью команды MEASURE (РАЗМЕТИТЬ)); D четные блоки-штрихи расчленяются и удлиняются до подошвы. На мелких деталях алгоритма останавливаться не будем, отметим только, что качество изображения зависит от длины и извилистости подошвы — не все штрихи могут быть удлинены до подошвы, а некоторые могут пересекаться между собой, что недопустимо.
90S
Час re IV. Разработка прикладных программ
Второй вариант штриховки откоса (рис. 28.8) работает по другому алгоритму (назовем его метод 2): О бровка разбивается точками с шагом 2 мм на бумаге с помощью команды MEASURE (РАЗМЕТИТЬ); П подошва разбивается точками на такое же количество частей с помошыо команды DIVIDE (ПОДЕЛИТЬ); П координаты точек бровки и подошвы запоминаются, а сами точки удаляются; П по известным координатам рисуются отрезками длинные и короткие штрихи
Рис. 28.8, Откос с делением бровки и подошвы нэ равное количество частей
Судя по рис. 28.8, качество изображения получается лучше, но "перпендикулярность" штрихов к бровке может быть получена только при параллельных кромках. Думаем, что этим можно пренебречь. В реальных условиях изображения будут удовлетворять любых критиков, хотя возможны и неожиданные варианты (рис. 28.9— 28.11). Результаты рисования по методу 2 зависят от того, как система AutoCAD начинает разбивку замкнутых объектов, используемых в качестве подошвы, а также от направления линий. Особое внимание следует уделять варианту с пересечением бровки и подошвы — в этом случае возможно соединение не так, как думал пользователь (ряс. 28.11). Итак, изрядно разобравшись с теорией, мы легко напишем программу рисования откоса по второму методу (листинг 28.4).
Глава 28. Программы для "генпланистов" и топографов
Рис. 28,9. Сравнение вариантов рисования: метод 1 вверху, метод 2 внизу
Рис. 28.10. Сравнение вариантов рисовании: метод 1 слева, метод 2 справа
9СЭ
910
Часть IV. Разработка прикладных программ
Рис. 28.11. Влияние направления пиний на изображение откоса
Листинг 28.4. Файл ru_topo_slope.lsp :defun START (/ bottom_point bottora_points_list_ents dist entjsottom ent_top Iast_ent length_berg long n ss_bottom_points ss_top_point5 top_point top_points_list_entsI [ru-app-begin) ;;; Размер верхних коротких штрихов 2 мм на бумаге [setq length_berg [ru-conv-millimeter'in-paper-to-unit 2.0] I (while (setq ent_top (ru-get-entsel-by-type "Вьйери линию Оровки" "Это нельзя использовать в качестве Оровки" [list "LIME" "LHPOLYLINE" "POLYLINE" "ARC" "CIRCLE" "SPLINE") T) ; (it (setq ent_bottom (ru-get-entsel-by-type "Выбери линию подошвы" "Это нельзя использовать в качестве подошвы" ( l i s t "LIME" "POLYLINE" "LWPOLYLIHE" "ARC" "CIRCLE" "SPLINE") T ) ) [progn :^etq IaEt_ent (entlastl ent_top icar ent__top) ent_bottom (car ent_Dottom|) (vl-cmdf "_.MEASURE" ent_top length_berg) Isetq 3S^_top_points (ru-ss-selec^-aftec-ent last__ent) last_ent (entlast)) (Vl-ondf "_.DIVIDE" ent_bottom (1-r (sslength ss_top_points)) ) [setq 55_bottom_points (ru-ss-select-after-ent last_ent! n 0 top_points_list__ents (ru-ss-to-ent-list ss_top__points) bottom_points__list__ents (ru-ss-to-ent-list ss_bottcm_points)) (T.t (inters (cdr (assoc 10 (entget (car top_points_list__ent3))) I ;cdr (assoc 10 (entget (cat- bottom_polnts_list_ents) ) ) (cdr (assoc 10 (entget (last top_jjoints_list_ents) M ] ;edc (assoc 10 (entget (last bottora_pointE_list_ents)1 T) :setq bottorn_points_list__ents [reverse bottom_jioints__li3t_ents) 1 )
!i
Глава 28. Программы для "генпланистов" и топографов
911
(mapcar (function (lambda !top_pnt_ent / botto!i\_pnt_ent; (setq top__point (cdr (assoc 10 (entget top_pnt_ent)) 1 bottom_pnt_ent (nth n bottcm_points_li£t_eritsj bottcra_point (cdr {assoc 10 (entget bottorn_pnt_ent))) dist (distance top_point bottom_point) n (1+ n)
Long (not long)] (entdel top_pnt_ent) lent del bottom_pnt__ent: lit (not long] (setq bottom__point (polar topjpoint (angle top_point bottom__point) (if (< dist length_bergi (' dist 0.5) length_bergl)') (ru-line-add top_point bottom_point 0 n i l ) ) ] topjpo ints_list_ents );_ end of mapcar ) ; _ end of progn ) ; _ end of if ) ; _ end of if !ru-app-end) [princ;
Рисование трасс Теперь разработаем несколько программ для рисования трасс различных коммуникаций. Начнем с воздушных электролиний. В "голой" системе AutoCAD рисовать паутину ЛЭП со столбами сущее мучение — множество столбов с "зазубренными" наконечниками направлений трасс. Столбы бывают из разного материала, ответвлений от столбов разное количество, и все надо сделать аккуратно и единообразно, поэтому часто программа рисования ЛЭП разрабатывается в первую очередь. Опоры ЛЭП мы, конечно, будем создавать из блоков. Сначала включим в библиотеку топографических блоков несколько блоков опор из разных материалов для низкого (одна "зазубрина") и высокого (две "зазубрины") напряжения (рис. 2S.12). Диаметр окружности всех опор одна единица. Для рисования ЛЭП очень удобна функция ru-trass-draw-first-prev-sample (см. главу 22), которой требуется передать один аргумент — имя функции рисоиаушя сегмента. Мы можем сразу написать универсальную функцию рисования любых ЛЭП (листинг 2S.5).
Рис. 28.12. Блоки опор линий электропередачи
Часть IV. Разработка прикладных программ
912
Листинг 2S-5. Функция ru-draw-electro-pole ;clefun ru-draw-electro-pole (funct! (r.i-сrdss-draw-first-prev-sample
(read funct)!
Ipcinc)
I
Эта функция может показаться ничтожной, но обратите внимание на то, что она передает основной функции свой единственный аргумент, прочитанный функцией read. Такой прием позволяет вызвать функцию рисования ЛЭП из меню системы AutoCAD или из XML-меню посредством макросов (листинг 28.6). Листинг 28.6. Фрагмент XML-меню рисования ЛЭП 1
1 - <1'_ет пате= 'Низкое напряжение ' inace= 'TOFO\SETI\VL_POLE__W_NN.GIF' corranent=' Рисование ВЛ по столбам ' niacro= ' (ru-draw-electro-pole "СТСШБ^ДЁРЕВО_НВ") ' /? •citem n ате =• Высокое напряжение' iirage=' TOFO\SETI\VL_POLE__W_VN.GIF 1 comnent=' Рисование ЕШ по столбам ' macro» ' (nJ-draM-electro-pole "СГОЛБ_ДЕРЕВО_ВБ") ' />
-
- <j.tea name= ' Низкое напряжение' i_t.aae- 'TOPO\SETIWL_POLE_W_NN_L.GIF 1 con"unent= ' Рисование ВЛ по стол&а:,: ' raacro=' (cu- draw -electro -pole "СТОЛВ_ДЕРЕВО__НВ_ЛИНИЯ") ' / >
Итак, мы передаем имя функции рисования сегмента и виде строки, а в результате для выполнения вызывается функция с таким же именем. Попробуйте проделать такой фокус is программах, написанных на других языках программирования! Меню для работы с ЛЭП будет выглядеть так, как показано на рис. 28. |3.
913
Глава 28. Программы для "генпланисгае" и топографов Электроснабжение и свяль
*: & . О; ОЯ a a - Э пенросмабжение - ТОП О Молния е линии - По опорам -' Деревянные опоры Высоко* напряжение -' Железобетонные опоры Низкое напряжение Высокое напряжение '•£. HeianjM^ecKvis опоры Низкое напряженно Бысо-ое нк!пря.*ений - Линия по опорам - Яеревя>1ые опоры Никлое напряжен11е
е В Л по столбам
• ::
Всего узлов: 3Q
Рис. 28.13, Меню рисования ЛЭП во время выбора
Напишем для примера пару таких функций (листинги 28.7 и 28.8). Реально таких функций могут быть десятки, и не только для ЛЭП, а для любых изображений, имеющих точку начала и конца. Листинг 28.7. Функция стОЛБ_ДЕРЕВСмш (deEun СТОЛБ_ДЕРЕВО_НВ1 (statt_point end_point) [ru-draw-electro-pole-segni start_point end_point "СтапБ_ДЕРЕВО_КВ" 1.5 NIL 0 . 5 !
Листинг 28.8. Функция СТОЛБ__ДЕРЕВО_НВ_ЛИНИЯ (defun СТОЛЕ_ДЕРЕВО_НВ_ЛИНКЯ (start_point end__point) start_point end^point "СТВД6_ДЕРЕВО_НБ" 1.5 "COMTIHUOUS" 0.5}
Все подобные функции вызывают еще одну, которая и рисует ceiMeirr (листинг 28.9). Листинг 28.9. Функция ru-draw-electro-pole-sagm Idefun tu-draw-electra-pole-segm (start_point erid_point block_naroe Itype line^dist / dist scale}
1
PVCCKHC имена функций и блоков, иротшюрсчашие коииепиии нашей системы, оставлены временно — мы их переименуем в конце разрибочки Е пакетном режиме. Кроме того, мы демонстрируем, что в LISP можно применять и такие имена.
914
Часть IV. Разработка прикладных программ
;; Внедрение блока из библиотеки (if (ru-block-lib-insert "ru-lib-topo" block_riarnel (progn [setq *ru_last_end_point* startjioint scale (ni-conv-millimeter-in-paper-to-unit blockjscale) dist [ru-conv-millimetet-ln-paper-to-unit line_dist)) ;; Вставка начального блока (ru-block-insert-obj block_name start_j)oint scale scale scale (angle start__point end_point! ) ;; Вставка конечного Блока !ru-block-insert-obj block_r.ame end_point scale scale scale (angle eod_polnt start_point)} ;; Если задан тип линии, рисование "провода" (if Itype (ru-line-add (polar start_point (angle start__poirit erid_point| distj ;polar end_point (-angle end_poirit start_point) dist) 0 Itype) I ;setq «ru_last_start_point* end_point)
В результате работы этих функций могут быть нарисованы ЛЭП, подобные показанным на рис. 28.14.
Рис. 28.14. Топографический плэн с ЛЭП, дорогами и растительностью
На рис. 28.14 заметны еще несколько изображений. Условные знаки деревьев и кустарников нарисованы с помощью функции многократной вставки блока, с откосом мы уже знакомы, остановимся теперь па дорогах и тропинках.
Глава 28. Программы для "генпланистов" и топографов
915
Рисование дорог Рисовать топографические дороги можно и обычными примитивами. Однако возникает трудность с правильным подбором типов линий и длиной штрихов. Это только дилетанту кажется, что нарисовано "пунктиром", для профессионалов важно точное соответствие стандарту. Рисование дорог будем выполнять путем трассировки одной стороны, указанием края другой стороны и иыполнением эквидистантной линии (такой, какая выполняется командой OFFSET (ПОДОБИЕ)). Саму команду OFFS1IT (ПОДОБИЕ) мы применять не будем, это было бы слишком просто. Основная функция (листинг 28.10) не сложна, но для ее реализации нам понадобятся несколько дополнительных библиотечных функций. Е
| Листинг 28.10. Функция ru-draw-road-topo-dline (defun ru-draw-road-topo-dline (msg Itypel Itype2 / last_pnt list_point pre__last_pnt second_coadjoint vla_a>::ray_c>bjs) ;| Примеры вызова: [ru-draw-toad-topo-dline "лесной дороги" "DASHED2" "DSSKEDS") (ru-draw-road-topo-dline "грунтовой дороги" "CONTINUOUS" "DftSHED": I; [ru-app-begini [if (setq list_point (reverse (_^u-trass-draw-lw (strcat "края " msg) nil nil nil Т nil 0 0 n i l ! ) )
;| Нам потребуется угол между предпоследней к последней точками, и для облегчения их извлечения делаем реверс списка точек нарисованной трассы iprogri (setq last_pnt (car list__point) pre_last_pnt (cade list_point! s=cond_r oad_poin t !ru-get-point-reguired (strcat "Второй край " msg) last__pnt)) (if (ru-ltype-load Itypel) ;;; Вариант с изменением типа линии модификацией DXJ-кода (ru-ent-mod (entlast) Itypel 6) ;[xi-msg-alert latrcat "\nHe найден тип линии" Itypel))) ;;: Функция - заменитель команды OFFSET [if (setq vla_array__objs (ru-ob^-ent-offset (entlast! ((if
;
ru-geom-is-point-right-by-axi э second_road__point pre_last_pnt lastjint) - +) (distance last_pnt second_road_point))) (if (ru-1type-load ItypeS! ;| А здесь применяем тип линии к массиву, т. к. при подобии могут образоваться несколько объектов I; [ си- ob] -via- air ay-mod vla_artay__obj s "Linetype" Itype2! ;ru-msg-alert (strcat "\nHe найден fun линии" Itype2)))l
:
Часть IV. Разработка прикладных программ
916 (tu-app-end) (princ)
Создание подобного объекта выполняется функцией, показанной в листинге 28. И. Функции передается VLA-объект или примитив и смещение создаваемой линии. При отрицательном значении смешения новые объекты создаются подобием влево, а при положительном смещении — вправо от направления основного примитива, возвращается массив созданных объектов типа variant, т. к. в некоторых случаях может быть создано несколько отдельных объектов. Г Листинг 28.11. Функция ru-obj-ent-offset (defun ru-obj-ent-offset (some dist) при смещении отрицательном - влево, при поцелительней - вправо от направления линия возвращает Variant (array of objects) (ru-error-catch [function (lambda (; (cond !(= 'vla-object (type some)] (vis-offset some dist)) ((= 'enarae (type some}} (vla-offset (vlax-ename->vla-obpect some) d i s t ) } } ) ) Ifunction (lambda (msg) (princ [strcat "\nRC-OBJ-ENT-OFFSET: " m s g ) ) n i l ) )
Для правильного задания знака смешения требуется функция, определяющая, вправо или влево от последнего сегмента трассы расположена указанная точка второго края (листинг 28.12). | ЛИСТИНГ 28.12. Функция ru-gaom~ is-point-right-by axis (defun ru'-geom-i5-point-right-by-axis lorientjint firstj>nt second_pnc / right__first_pnt) (setq right^first_jtnt [polar first^pnt lru-geom-go-right (angle first_pnt second_pnt|) 1.0)! (ru-geom-is-point-in-line i;ight_first_pnt orient_pnt (inters first_j)nt second_pnt oriet>t_ptic right_first_pnt nil) )
Теперь мы можем включить в иллюстрированное XML-меню сколько угодно типов дорог, и не только дорог, но и других объектов, строящихся подобием от края. Нетрудно модифицировать приведенные функции и для построения объектов, подобных осевой линии трассы.
V~ I wt/ щ0 ^^л Ш&
Г Л А В А 29
Несколько программ для сантехников В этой главе мы рассмотрим несколько программ для облегчения работы специалистов, занимающихся разработкой различных систем, внутри которых что-то "течет" или дшшс1СЯ — технологических трубопроводе!!, котельных, отопления, вентиляции, водопровода, канализации, газоснабжения, тепловых сетей. При всем многообразии технических решений в этих разделах проекта изобразительная часть их стандартизирована. Большинство программ или функций, требующихся "сантехникам", мы уже рассмотрели. Пели читатели-сантехники этого не заметили, то мы напомним. Все. связанное с общими данными по рабочим чертежам (таблицы, типовые тексты), мы уже автоматизировали. Для рисования любых видов оборудования у нас имеется множество вариантов вставки блоков. Рисовать трассы и трубопроводы в одну линию мы также умеем — И стандартными командами, и с помощью наших программ. В линии, изображающие трубопроводы и воздуховоды, мы умеем врезать (арматуру, переходы) или привязывать (опоры, футляры) изображения, являющиеся блоками. В главе 26 мы даже порассуждали о гидравлических и аэродинамически* расчетах. Осталось нам совсем немного — "мелочевка", наподобие надписей диаметров трубопроводов, рисования трубопроводов и воздуховодов "в три линии" и продольных профилей сетей.
Профили Сразу закроем тему профилей — разрабатывать программы для их автоматизированного построения мы пока не будем. У нас имеются средства для профилей (рис. 29.1), но "для служебного пользования", а и систему niCAD мы пока включаем только программу рисования .заготовки профиля, это хоть небольшое, но облегчение. Почему мы не делаем программы для настоящего построения профилей, ведь это так необходимо всем? Причин несколько. Во-первых, если уж браться делать такую программу, то ее надо делать так, чтобы получить результат с ее помощью было бы легче, чем вручную. Мы видели несколько решений по разработке профилей и делать подобные не желаем, а наша пока не доведена до "товарного вида". Хорошая программа построения профилей должна
918
Часть IV. Разработка прикладных программ
Рис. 29.1. Продольный профиль тепловых сетей
О получить от пользователя узловые точки трассы, указываемые на плане; О автоматически определить "черные" отметки поверхности земли; О автоматически или по запросу определить "красные" отметки земли; О с помощью указания или автоматически определить пересечения с другими коммуникациями (плановое и вертикальное положение); D построить заготовку профиля с грунтом и пересечениями; О построить проектное положение трубопровода с учетом всех условий и ограничений (допустимые уклоны, глубина заложения, расстояния до пересекаемых коммуникаций). Последний пункт является практически не поддающимся помои автоматизации в реальных условиях насыщенной городской застройки, но возможен интерактивный режим работы, позволяющий пользователю самому принимать решения. Все остальные во многом зависят от организации электронного плана города. Если у нас имеется электронный план нашего города, на котором все отметки, горизонтали и коммуникации находятся на стандартных слоях и выполнены стандартными средствами, то мы можем (это реализовано) автоматически определять отметки земли для узловых точек трассы. Но в другом городе эта программа будет бесполезной. Во-вторых, понятие "всем надо" расплывчатое. Может быть надо и "всем", но оплачивать такую работу не хочет никто. Проектные организации, с которыми мы сотрудничаем, сейчас или не занимаются разработкой больших проектов наружных сетей, или делают это без электронной подосновы. В таких условиях им выгоднее разработать проект Б "бумажном" виде. Например, подготовка электронного плана местности для разового проекта межпоселкового газопровода экономически нецелесообразна. Такой план проще сделать вручную, дополнив разработанными на компьютере общими данными и спецификациями. Небольшие участки трасс нетрудно "профилировать" на компьютере, но вручную. Так что с профилями мы подождем до лучших времен.
Глава_29. Несколько программ для сантехников
919
Технология рисования "аксонометрии" Больным вопросом для сантехников остается рисование аксонометрических схем. О проблемах, связанных с их рисованием, мы уже рассуждали в главе 2. Конечно, всем проектировщикам хочется "нажать на кнопку" и получить все и сразу, но не все понимают, что это невозможно. Все сантехники хорошо знают, что такое "аксонометрия под 4S градусов", машиностроители и программисты с этим не сталкиваются, а знакомы с обычной изометрией. Во избежание недоразумений разберемся с терминологией. "Схемы систем выполняют в аксонометрической фронтальной изометрической проекции в масштабе" — гласит пункт 3,2.1 ГОСТ 21.602-79. В учебной литературе по строительному черчению поясняют: "аксонометрические схемы выполняют во фронтальной изометрии с левой системой осей и коэффициентам искажения вдоль осей, условно принятым за единицу, что позволяет использовать метрический масштаб при построении". Если элементы схемы при вычерчивании в масштабе накладываются один на другой или непроизводительно занимают плошаль чертежа, делают обрыи и выносят часть изображения на свободное место. Когда наложение элементов затрудняет чтение схемы, для увеличения наглядности прорезают линии, обнажающие трубопроводы, расположенные дальше от наблюдателя. На рис. 29.2 показан куб с "трубопроводом", проведенным по трем ребрам, в различных аксонометрических проекциях.
Рис. 29.2. Изображение куба а аксонометрических проекциях: а — изометрия, 6 — фронтальная диметрия с левой системой осей, з — фронтальная диметрия ("сантехническая аксонометрия")
Хуже всего, с "начертательно-геометрической" точки зрения, выглядит сантехническая аксонометрия (рис. 29.2, в), но именно она используется десятки лет по простой причине — для вычерчивании схемы достаточно было рейсшины и треугольника, размеры по всем осям откладывались просто по делениям без всяких вычислений. Измерить размеры было так же просто. Изометрия (рис. 29.2, а) неудобна для изображения длинных участков трубопроводов, т. к. площадь чертежа при этом используется нерационально. Система AutoCAD имеет хорошие потенциальные возможности для трехмерного моделирования, в том числе трубопроводов. Потенциал постепенно реализуется в специализированных приложениях к AutoCAD. Казалось бы, получить изометрическое изображение трубопровода автоматически просто — нужно нарисовать его в трехмерной модели, установить требуемый вид, в пространстве листа разместить ендовой экран (Viewport) и показать в нем модель
920
Часть IV. Разработка прикладных программ
трубопронода (рис. 29.3), Однако реалистичное изображение это не схема, на которой должны быть показаны с помощью специальных обозначений все элементы трубопронода, марки, диаметры, отметки, уклоны и т. п. Тонированное изометрическое изображение может быть прекрасным дополнением к рабочим чертежам, но не может заменить их. По трехмерной модели легко могут быть построены различные планы, фрагменты и виды. Сложнее, чтобы это были не просто виды, а чертежи видов, но и это уже решается. Появляются и программы, автоматически создающие изометрические изображения из трехмерной модели. При наличии всех требуемых проекций изометрические схемы вообще не нужны (в рабочем проекте, но могут понадобиться в монтажном проекте). При проектировании котельных, например, изометрические схемы традиционно не разрабатывались, но планы и разрезы дополнялись детальной плоской монтажной схемой трубопроводов.
Рис. 29.3. Модель трубопроводов s изометрии (файл %Acad_2004%\Sample\Oil Module cfwg)
Однако чтобы обычный проектировщик-сантехник смог ощутить все преимущества моделирования трубопроводов, необходимо: О иметь тонную трехмерную строительную и технологическую подоснову всего здания или сооружения;
D иметь программные средства для моделирования трубопроводных и вентиляционных систем, адаптированные для использования российских изделий; Э уметь работать в трехмерной модели и прокладывать трубопроводы и воздуховоды в пространстве. Многие ли проектные организации способны обеспечить выполнение этих условий' 1 Конечно, такие фирмы есть, и их становится все больше. Если имеются заказы на проектирование объектов с большой стоимостью строительства и проектирования, т. е. возможность и приобрести программные средства, и обучить специалистов в
Глава 29. Несколько программ для сантехников
921
специализированных центрах полготовки, и разрабатывать документацию не на условиях "вчера надо было". Представляется, что соотношение количества таких фирм по отношению к обычным такое же, как соотношение граждан, ездящих на "Мерседесах", по отношению к остальному "несознательному" населению. Модель мания и модель трубопроводов должны быть именно абсолютно точными, а не просто похожими на реальный объект. Точность необходима для того, чтобы использовать преимущества моделирования. Если строительная длина задвижки составляет 230 мм, то и в модели ее длина должна быть именно 230 единиц, а не "примерно 200—300". Трубопровод или воздуховод должен быть смоделирован со всеми отступами, "скобами", "утками" и прочими мельчайшими деталями. Сделать это для реального здания, особенно существующего, насыщенного оборудованием и коммуникациями вообще не всегда возможно. Не случайно фирма Autodesk в качестве примера трехмерной модели приводит именно установку Oil Module (см. рис. 29.3). Это компактный блок оборудования, предназначенный для заводского изготовления. Преимущество трехмерной модели для проектирования (скорее, конструирования) таких объектов не вызывает сомнения. В этом случае, кроме сборки будут выпущены еще и чертежи узлов и деталей •фубопроводов. Полный комплект займет целый альбом. Недаром в комплект примеров системы AutoCAD не попал ни один комплексный строительный проект вместе с трехмерной сантехникой — он мог бы быть наглядным доказательством преимуществ моделирования. Пример %Acad__2004%\Sample\8tn floor hvac.dwg (посредственного, по российским меркам, чертежного качества) — всего лишь плоский чертеж, наложенный на трехмерную архитектурную модель. Предположим, что вы все-таки построили качественную трехмерную модель трубопроводов, Теперь попробуйте сформировать на листах, предназначенных для печати, такие изометрические виды, по которым монтажники на стройке, имеющие дело только с бумажным чертежом, смогут изготовить узлы и смонтировать системуКомплект чертежей компактной установки Oil Module можно подготовить без особых ухищрений, а с объектом, подобным 8th floor, не говоря уж о системах длинного производственного объекта, проблемы будут, и проблемы непростые. Например, трубопроводы малых диаметров и большой длины при параллельной прокладке будут просто сливаться в малопонятную линию, при этом мелкие изгибы будет трудно рассмотреть. На следующем этапе попробуйте "пропустить"1 такой проект через орган Госэкспертизы (об этих проблемах мы также писали в главе 2). Если проект выполнен иностранной фирмой и с нее нечего взять, или, наоборот, есть что взять и взяли, то экспертиза пройдет успешно. Но рядовая проектная фирма, в рядовом российском городе, по рядовому проекту запросто получит заключение о нарушении стандартов СГТДС2 и необходимости переработки проекта. Вероятность такого исхода обратно пропорциональна компетентности специалистов, проводящих экспертизу. Наблюдается устойчивая тенденция "цепляния" экспертов за мелкие детали - "передвинуть 1
Вообще-то получение заключения экспертизы является обязанностью заказчика (застройщика), но без участии проектировщиков это мероприятие не обходится.
2
Система проектной документации для строительства.
922
Часть IV, Разработка прикладных программ
стояк ц другой угол", "подключиться к другому колодцу", "длину кожуха предусмотреть кратной 4-м метрам". Настоящие ошибки, например неверный расчет воздухообмена во влажном помещении, приводящий к намоканию строительных конструкций, могут быть не замечены, а "выполнение аксонометрических схем в проекции, не соответствующей стандартам СПДС", отметят непременно. Отсталость стандартов от современных компьютерных технологий — отдельная тема. Изменять стандарты нужно, но вряд ли это будет сделано скоро. Пока выход в том, что их следует придерживаться, постепенно формируя общественное мнение о необходимости перехода на новые технологии. Практически это означает, что, даже имея модель трубопроводов, следует, не тратя времени на бесполезные споры, просто уметь быстро чертить на плоскости традиционные аксонометрические схемы, показывая на них то, что не отражено в модели. Одна из задач нашей системы — предоставить инструменты для быстрого рисования таких схем. Техника рисования схем проста — или сначала нарисовать трубопроводы полилиниями, а затем врезать в них, с помошью наших программ, условные обозначения элементов трубопроводов, или сначала нарисовать крупные элементы и узлы, соединить их линиями, а затем врезать в линии "мелочевку". Для удобного проведения линий под требуемыми углами в современных версиях системы AutoCAD удобнее всего использовать режим POLAR с установкой шага углов 45 градусов (диалоговое окно Drafting Settings (Режимы рисования), вкладка Polar Tracking (Отслеживание)). Чтобы пользователям не приходилось обращаться к этим средствам, мы просто включим н настройки нашей системы установки соответствующих системных переменных, а переключение режима POLAR всегда доступно в строке статуса.
_
Замечание
)
Если понадобится рисование в классической изометрии (рис. 29 2, а), то ее можно включить на вкладке Snap and Grid (Шаг и сетка) окна Drafting Settings (Режимы рисования) переключателем Isometric snap (Изометрическая], а переключение между "плоскостями" изометрыи во время работы делать нажатием клавиши .
Средства рисования аксонометрии в системе ruCAD Фактически у нас сделано почти нее. Рисовать трубопроводы в схеме можно обычными полилиниями, а потом только врезать в них арматуру и другие элементы. Однако есть некоторые нюансы, связанные с шириной линий. Подакляющее большинство линий, изображающих трубопроводы и воздуховоды, должны быть нарисованы основной линией. Отдельные участки трубопроводов, а также арматура и другие изделия должны быть нарисованы тонкими линиями. В соответствии с концепцией нашей системы для рисования "жирных" линий используется вес (lineweight) линий. О достоинствах и недостатках веса линий мы рассуждали в главе 3, но решили, что достоинств больше, чем недостатков. В отношении линий в схемах это не так. Все схемы насыщены врезками изображений элементов, выполненными тонкими линиями, и важно, чтобы торцы разрезанной линии были прямоугольными и не "агтезали" в изображение элемента трубопровода. На рис. 29.4 слева показан фрагмент схемы, в котором трубопровод нарисован полилинией с заданной шириной, а справа — полилинией с нулевой шириной, но с
Глава 29. Несколько программ для сантехников
923
заданным весом. Отчетливо видна небрежность правого рисунка. Кому-то "и так сойдет", а кому-то эти мелкие неточности неприемлемы.
Рис. 29.4. Фрагмент схемы Слева — задана ширина попипиний, справа — задан вес линий При уменьшении масштаба изображения на экране (рис. 29,5) недостаток веса линий усугубляется. На отпечатанном листе бумаги этот недостаток может быть незаметен, а проявится достоинство веса линии — постоянная ширина на бумаге независимо от масштаба печати, но очень часто более важным является именно качественное экранное изображение. Схемы насыщены енемасштабными символами и чертежи схем должны печататься не в произвольном, а в заданном при рисовании масштабе печати. В этом случае достоинство постоянности ширины линий, использующих вес, не выявится, а недостатки останутся.
r*"*>*^J Рис. 29.5. Фрагмент схемы в уменьшенном масштабе изображения на экране Вообще-то в Plot Style Table Editor (Редактор таблиц стилей печати) (рис. 29.6) на вкладке Table View (Таблица) имеется настройка Line End Style (Стиль окончания линий), позволяющая установить стиль печати концов линий ("Butt", "Square", "Round" и "Diamond"). От круглых торцов на печати можно избавиться или, наоборот, сделать их "бриллиантовыми", но это только при выводе на бумагу. Да и много ли рядовых пользователей знают про такие, столь далеко запрятанные детали настройки?
Замечание
J
В настройке сопряжения линий Line Join Style (Стиль соединения линий] имеется опция Use object join style (Взять стиль соединения из объекта), но объектов, имеющих такой параметр, нет. В том числе в самой последней версии AutoCAD 2005 В результате, после консультаций с пользователями наших прежних систем мы приняли решение — для рисования схем использовать старый надежный метол рисования полилшшями с задаваемой шириной. Пока только для схем, хотя пользователи просят оставить ширину и для деталировок трубопроводов и воздуховодов.
Часть IV. Разработка прикладных программ
924 IE Plot Style Table Editor - acad^tb
ВВ
С eneal IstfeView FnmVw~| 1 Wjme
Г
5(yle 1
• Color Enable dithering
P
Convert 1.0 grayscale
Г
P
Use assigned pen *
Г Automate
Virtual pert t
Automatic
100
Screening
Use оЬ]й! hiofype
LinsWpe Adaptive adjustment Lueweight
R
1= ,•;
.'
•
L
Lfeeobject bneweight
Line End Style .'•-- -'• -•.
Line Join Яу*
..< -- fJse object ]oin ^tyle Uw ob]ect f\\l style
Fill Style
Add Style
j
Edill meweighls
S^veSCIos*
CenceT
Save As.
j
Рис. 29.6. Настройка торцов пиний
Узлы схем Кроме стандартных внемас-штабных условных обозначений элементов схем (арматура, переходы, соединения деталей) удобно использовать блоки укрупненных типовых узлов. Такие блоки, как и любые реальные изделия, следует рисовать в натуральную величину, принимая за единицу рисунка миллиметр. Однако в подобных блоках обязательно будет иметься схематичное изображение трубопровода, а трубы в чертежах разных масштабов могут иметь разную ширину. Способ изменения ширины полилиний в блоке был рассмотрен в лмве 22. В блоках, для которых потребуется изменение ширины линий, линии, у которых ширина будет меняться, должны быть нарисованы компактными полилиниями (LWPOLYL1NE), а остальные — любыми другими примитивами. На рис. 29.7 показаны блоки типовых радиаторных узлов систем отопления. Блоки предназначены для рставки в общую схему системы, где излишняя детализация не требуется и даже вредна, поэтому в узлах с замыкающими участками не показаны регулирующие краны. Деталировка узлов обычно производится в более крупном масштабе и для нее предназначены другие блоки (рис. 29.8). Впрочем, нет препятствий для вставки блоков с кранами и в общую схему, но при масштабе печати 1:100 изображения кранов будут слишком мелкие, линии сольются и вместо кранов будут напечатаны непонятные "козяики".
Глава 29. Несколько программ для сантехников
925
Рис. 29.7. Упрощенные схемы типовых радиаторных узлов систем отопления
Рис. 29.8. Типовые радиаторные узлы с регулирующими кранами
Замечание
J
Обратите внимание, в схемы узлов не включены никакие внемасштабные символы, например, выноски, знаки диаметров. Это позволяет использовать блоки узлов в чертежах, предназначенных для печати а любом масштабе
Вставка библиотечных блоков с изменяемой шириной выполняется рассмотренной ранее функцией ru-block-lw-lib-insett-ptask-angleask. Блоки для схем обычно вставляются с поворотом 0 градусов, поэтому нам потребуется еще один вариант функции (листинг 29.1). Для этого варианта нам пришлось немного усовершенслвоиать функцию ru-block-lw-insert-ptask-angieask, введя в нее дополнительный параметр — угол повороти (если задан nil, то угол поворота запрашивается при вставке). ! Листинг 29.1. Функция ru-blook-lw-lib-insact-ptask [defun tu-block-lw-lib-insert-ptask (block_lib block_name scale) (ru-app-begin! (if (ru-block-lib-insert block__lib block_name) (ru-block-lw-insert-ptask-arigleask blocfc_name scale 01 ] (ru-app-endl (princ))
Часть IV. Разработка прикладных программ
926
Теперь мы можем написать XML-меню радиаторных узлов (листинг 29.2). | Листинг 29.2. Фрагмент XML-меню радиаторных узлов 11
|
- •sitem nanie='Проточные ' raacro=''> 1
-
-
Вил XML-меню радиаторных умов во время выбора показан на рис. 29.9. 1 • Г не>1ы и i QI шеннч
•:• >-- , ч е п о — Отопле'||'е-С"вмы Н Отопте/юнеч пмйоры 5 PauMdTfipbi
*
.J
; , н п,*™™*
**Lj
Лньй
_
ПША
Ливы* Пяррнутый
..........
\
- d_ -13- Г^чсГ- .JC п с- rtpaHDM с чоиНС"
рвг-^пирмки ПРИЫЙ
^i' Рвтлирав^** Ы БнриыВ**яч«м» Левый Пр^ьЛ Порвмцгый ri; Go crDWam U СКЛР g
:
'^'^l ПрйВЫЛ
Вснаумпй^ТО
У5СП!£7
v
багпппи1ь
За^^ыть
Рис. 29.Э. XML-меню радиаторных уэпов
Рисование линий схем Рисовать линии схем мы договорились обычными полилиниями. Для облегчения установки ширины полилиний мы разработаем дополнительную функцию, пол-
Глава 29. Несколько программ для сантехников
927
ностью имитирующую работу команды PLINE (ПЛИНИЯ), но начинающую рисование с требуемой шириной (листинг 29.3). Листинг 29.3. Функция ru-pline-dran-witii-width (defuri ru-pline-draw-with-width (pline_
.
[ru-error-save-sysvars (list (list "CMDECHO" 1) [list "OSMODE")
(list "PICKBGX")
(list "BLIPMODE" 0)
(list "HIGHLIGHT")
(list "PLINEHID" pline_width))) (vl-cmdf "__.PLIHE") [while (> (getvar "CMDACTIVE") 0) (ru-error-restore-sysvars)
(list "ORTHCMCCE". (vl-cmdf pause))
(princ))
Эта функция будет применяться очень часто и достойна не только включения н обычное меню (листинг 29.4), но и выделения кнопок на панели инструментов. Как правило, используются тонкая или основная линия. ! Листинг 29.4. Макросы меню рисования типовых полилиний ;тонкая полилиния]~C"C"P(defun C:RUO [ru-pline-draw~with-width 0 ) I ; R D ;Основная полилиния!"C*C*P(defun C : R U ( ) (ru-pline-draw-with-width (ru-normal-pline-width)) ) ;RU
Пересечение линий При вычерчивании схем часто для увеличения наглядности прорезают линии, обнижаюшие трубопроводы, расположенные дальше от наблюдателя. Делают это обычно командой BREAK (РАЗОРВАТЬ), но и эту процедуру можно облегчить (листинг 29.5). Программа просит указать нижнюю и верхнюю линии, определяет ширину пересечения с учетом физической ширины или веса верхней линии и делает требуемый разрыв. I Листинг 29.5. Файл ru_erossjines.lsp [defun START (/angle_segm break_length can__break entl ent2 ent_pointl ent_point2 inters_pnt lst_segml Ist_segin2 pntl pr.tl_break pntl_found pnt2 pnt2 pnt2_£ound pnt3 pnt4 _width> (defun _width (ent / obj wl [setq obj (vlax-ename->vla-object ent) w (ru-conv-raillirneteL-iri-paperr-to-uiiit O.S); [max {+ (vla-get-lineweight obj) w) (if (= (vla-get-objectname obj) "AcDbPolyline") (+ (vla-get-constantwidth objI w) 0) w ) ) ;;
Основная функция
[while (setq ent_pointl (ru-get-point-оп-ent "Укажи точку на разрываемом сегменте")) (if (setq lst_segrnl (ru-geom-list-ent-point (setq entl [car ent_pointll) (cadr ent_pointl))) (progn {setq pntl [car lst_segml) pntE [cadr lst_segyr.l) can_break t)
Часть IV. Разработка прикладных программ
928 [if
(setq ent_point2 [ru-get-point-on-ent "Укажи точку на верхнем се^енте"?) [if (setq Ist_segrn2 (ru-gecm-list-ent-point (setq ent2 (cat erst_point2i ) (cadr ent_poinl2)) ) (setq pnt3 [car Ist_segm2) pnt4 (cadr Ist_segm2) can_Ereak T) (setq can_break n i l ) ) )
[setq can_break nil) (if (and can_break {setq inters_pr.t. (inters pntl pnt2 pnt3 pnt4 Т] И (progn (setq angle_segm (angle pntl pntZ) break_length (* (_wid-h e n t ? ) 0 . 5 ) pntl_break (polar inters_pnt angle_segm b£eak_lengthi pnt2_break (polar inters_pnt tru-geom-go-back angle_segm) break_length)) [ i f (>= (distance inters__pnt pnll break) break_length) [setq pntl_Eound T) (setq pntl_found nil pntl_break [polar inters j>nt angle_segm I* break_lengLh 2 ) ) ) ) [if [>= (distance intecs_pnt pnt2_oiijak) break_length) [setq pnt2_found T) [setq pnt2_found nil pnt2_break [polar inters_pnt [ru-geom-go-back angle_segm) ( • break_length 2 ) ) ) ) [ru-uar-clear-osnap) (cond (pntl__found (command "_.BREAK" Hist entl (trans intera_pnt 0 1)) "___F" (trans pntl_break D II (trans pnt2_break 0 1 ) ) ) [pnt2_found
(command "_.BKEAK" (list entl (trans inters_pnt 0 1 ) ) "_F" (trans pnt2_break 0 1) l-rans pntl_break 0 1 } ) ) [T (ru-msg-alert "\nHe могу найти пересечение... " ) 1 ) ' (m-vsr-restore-osnap)) ) ) (pcinc) ) [ЗТЙКТ)
Выноски диаметров В сантехнических чертежах проставляется несметное количество подписей диаметров трубопроводов, изделий и воздуховодов. Диаметры приходится рисовать разными способами, и мы приведем несколько примеров программ, облегчающих эту работу. Сначала напишем программу для рисования диаметра вдоль линии. Функции для рисования текста вдоль л и н и й мы рассматривали в главе 22. Подпись диаметра отличается от обычного текста наличием знака диаметра. Проще всего добавлять знак диаметра с помощью специального символа %%с, но в этом случае имеется вероятность, что используемый шрифт не поддерживает такие специальные символы. Теперь уже трудно И найти "плохие" шрифты, но ведь где-то находят, и чертежи могут потерять первоначальный вид. Поэтому мы до сих пор знак диаметра заменя-
Глава 29. Несколько программ для сантехников
э.?9
ем специальным блоком, который сохранит неизменный вин. Программа для рисования диаметров вдоль линий приведена в листише 29.6. Листинг 29.6. Файл ru_draw_dia_alongjine.lsp
:
Idefim START (/ diaraeter _dia-up-line! (defiin _dia-up-line (t>Lt / lst_break result ang_rad) ;if (setq 1st break jru-piine-break-length istrcat "Точка на линии для диаметра ' " LKt ) 0)! iprc-gn Isetq ang rad tcadr 1st brea-0 ) lif (and (> ang_rad 1.5708) (<= ang_rad 4.71239)1 (setq ang rad (ru-geom-go-back ang rad))) (ru-draw-diameter-taxt (car 1st break) txt ang_rad) ;setq result t)}) result) ,•;; Основная функция ._____-_-__ (ru-app-begin) (if (setq diameter (ru-get-diam-text (tu-user-read-last-parara "I.astDiameterString" "100")) ) iprogn (while (_dia-up-ltne diameter}) ;tij-user-write-last-param "LastDiameterString" diameter)) ; ;ru-app-end} (princ) )
: STAR':1.
Функиня непосредственного рисования диаметр:! приведена в листинге 29.7. Она возвращает набор из блока и текста диаметра дли последующих возможных м а н и п у ляций. Листинг 29.7. Функция ru-draw- diameter -text Idefun ru-draw-diameter-text (put text ang_rad / ent_lab^) (set!) ent_last (entlast) ) (ru-text-add text ;ru-draw-block-diameter pnt (ru-normal-text-height) ang_radl (ru-normal-text-height) ang_rad ac-alignmentlef t! [ru-ss-select-after-ent ent l a s t )
Вставка блока знака диаметра осуществляется функцией, приведенной к листинге 29.S и возвращающей точку, от которой можно продолжать текст значения диаметра. Для маловероятного случая отсутствия биб/шснечного блока предусмотрено символьное написание анака диаметра. Листинг 29.8. Функция ru-draw-block-diameter (def-un ru-draw-block-diameter (ins_pnc teKt_height ang / block_name blk_pnt txt_pnt) isetq txt_prit ins_pnt block_narae "ru_diameter";
930 (if
Часть IV. Разработка прикладных программ (ru-bloek-lib-insert "ru- lib -с oration" block_r_ame!
(progn
[rij-blocK-insert-ob] block_name (polar (polar ins_pnt (ru-geon-go-left ang) text_height) ang (* text_height 0 . 5 ) } -ext_height text_height 1 ang: (polar {polar ins_pnt (ru-georr-go-left ang) I* text_height 0 . 5 ) 1 ang (* text_height 1 . 5 ) ) ! ; progn (ru-text-add "D=" (setq ins_pnt (polar ins_pnt (ru-geora-go-left ang; (* text_height 0 . 5 ) ) ) text_.-ieight ang acAlignmentLeft; (polar ins_pnt text_height (* textjieight 2 . 0 ) } ) )
Текст диаметра задается в диалоговом окне, позволяющем ввести строку вручную. взять указанием надписи в рисунке или выбрать из XML-меню диаметров различных изделий (листинг 29.9). 1
Листинг 29.9. Функция ru-get-diam-tsxt (defun ru-get-diam-text (default / iat; (if
(setq 1st (ru-dlg-get-two-strjn:; "Ввод диаметра" "Диаметр" default Т "" "" Т nil "options \\dia_lst.xicl" " " ) ) !car 1st) n i l ) )
Теперь напишем программу рисования диаметров с полочкой выноски. Программа (листинг 29.10) позволяет выбрать диаметр из справочника, указать несколько издел и й с одинаковым диаметром. Для повышения динамичности работы использонан аргумент, позволяющий под полочкой выноски диаметра рисовать дополнительный текст (марку изделия, обозначение стояка и т. п.), вводимый вручную или выбираемый из XML-меню. Листинг 29.1D. <PaHnru_drawJeader_dia_with.je)(t.lsp (defun START (draw_mark / align ar.g_txt_line diarceter diajnark end_leader ?nd_t!tt_line len_txt 1st lst_txt start_)eader start__txt start txt Tine) (defun _move (selection pnt) (while (not {ru-error-catch (function (lambda 0 (princ "\пТочка вставки марки изделия: ") (vl-cmdf "_.MOVE" selection "" (trans pnt 0 1) p a u s e ) ) ) nil Ш > ;;; Основная функция [ ru-app-begin) [while Isetq diameter (ru-get-diam-text (ru-user-read-last-param T1r.astDia.-neterStting" diameter))! [if (setq start_ieader Iru-get-point-or-exit "Начало выноски" n i l ) ; [progn [setq end_leader [ru-get-point-reg'jired "Конец выноски" start leader] align (ru-text-end-leader-align (angle start_leader end_leader)) 1st txt (textbox (list {cons i d i a m e t e r ) } J
Глава 29. Несколько программ для сантехников
931
len_txt ( + (- (car icadr Is>t_txt}) Icaar lst_txt) ) (* Iru-normal-text-height) 2.5}) ang_txt_line (if (= align acoligmoentleft) 0 (ru-geom-go-back Dl start_txt_line (if (= align acalignmentleft) eyid_leader (polar erid_leader {m-geom-go-back 0) len_t.xti ! end_txt__line (polar °nd_leader an.g_txt_lir.e len_txt) start_txt (polar start_txt_±ine (ru-geom-go-left 0) (* 0.1 (ru-nornial-!:eKt-height) j ) ) Iru-draw—diameter-text start_txt diameter 0} !ru-pline-add (list start__leader end_leader end__txt_line) nil 0 0 nil) iwhile (setq start^leader (ru-get-point-or-exit-base "Слекукщее изделие" eric_leader) } ;ru-line-add start_leader end_laader 0 n i l ) ) ;;; Вариант рисования дополнительного текста под полочкой [if dEavj_rnark (pcogr. (if
(setq 1st "Марка"
(гч-dlg-get-two-string "Продаъ-зкение текста диаметра"
(setq diajnark (гч-user-read-last-param "LastDiameterMark" "Ст B l . l " ) ! Т "" "" Т nil "options\\dia_txt.KBl" " " ) ) (progr. (ru-text-add (setq dia_mark (car 1 s t ) ] (setq start_txt
(polar start__txt
Iru-geom-go-rigtit 0)
(* 1.2 (ru-normal-text-heichtI))) (ru-normal-text-heightt "0" nil; ;;; Даем возможность передвинуть текст ;_move lentlast) start_txt))) (ru-user-write-last-param "LastDiameterMark" dia_roarh))))) iru-uaer-write-last-param "LastDia;r,eT;erString" diaineterj ) (ru-app-end)(princ)) Пример использования приведенных программ показан на рис. 29.10.
Рисование элементов трубопроводов в три линии Изображение труболроиодон диаметром более 100 мм "в три линии 1 " предписывается стандартами для фрагментов и узлов (в стандарте на чертежи котельных — трубопроводов, "у которых на чертеже диаметры равны 2 мм и более", что правильнее). Такое изображение требуется не только "для красоты", но и для тога, чтобы правильно сконструировать трубопровод с учетом размеров фасонных частей, арматуры и других изделий. Традиционно высока культура рисования трубопроводов у проектировщиков технологической чцсяи котельных — там очень много узлов в стесненном пространстве, требующих тщательной проработки, не выполняются аксонометрические схемы, способствующие "прокладке по соображению". При проектировании котельных всегда прорисовывались тройники, отводы и другие фасонные части.
1
В стандартах пишут "двумя линиями", проектировщики говорит про при — есть ешс и осевая л и н и я Трубопровода
Часть IV. Разработка прикладных программ
932
г:1,
Рис. 29.10. Схема системы отопления
В ГОСТ 21.606-95 по выполнению рабочей документации тепломеханических решений котельных эта хорошая привычка узаконена, а вот в ГОСТ 21.601-79 на рабочие чертежи нодопровода и каначизации, на черт. 10, с примером плана насосной детали не проработаны, и это приводит к неверным техническим решениям (сварные стыки в толше стены, например). В главе 3 мы писали о возможности избыточной детализации чертежей, а теперь приведем конкретный пример. На рис. 29.11 показана та же насосная станция, которая изображена и на черт. 10 в ГОСТ 21.601-79Наш чертеж содержит избыточную, но сравнению со стандартом, детализацию. Стандартизация строительного ч е р ч е н и я , кроме достижения единообразия оформления, преследовала цели упрошенин и ускорения работ. Разрабатывать вручную чертежи масштаба 1:50 так детально, как показано на рис. 29.11, будут только отдельные энтузиасты — слишком долго, "за свои харчи" и все равно только приблизительно точно. На компьютере этот рисунок мы, в присутствии "понятых", нарисовали за 27 минут. Все, что на нем показано, нарисовано с помощью программ системы niCAD, за исключением стен и размеров, лли которых использовались стандартные команды системы AutoCAD. Читатели могут сравнить впечатления от стандартного чертежа и нашего. Но, кроме необязательной "красивости", детальный чертеж имеет более важные свойства. На рис. 29.12 показан у в е л и ч е н н ы й фрагмент рисунка в месте подключения маленького водопроводного насоса. Видно, что на деталях проработаны даже
Глава 29. Несколько программ для сантехников
9.33
Рис. 29.11. План насосной
170 _
.
95 _
НО
IS
\,
ПО
{ 60 L
Рис. 29.12. Фрагмент плана насосной
105
170
Часть IV. Разработка прикладных программ
934
выступы фланцев, т. е. чертеж выполнен очень точно. Это позволяет использовать его не только как рабочий чертеж, но и как деталировочныи для монтажнозаготовшельного производства. Совмещение рабочего и монтажного проектирования, только начинавшееся в СССР, теперь легко может быть реализовано, особенно при росте количества проектностроительных организаций, у которых конечным продуктом являются не рабочие проекты, а объекты, "сдаваемые под ключ". В отличие от систем трехмерного моделирования, которым, безусловно, принадлежит будущее, двумерные системы с их "доступной плоской формой" легко осваиваются "тетками", а разрабатывать их может любой программист. Как это делается, мы рассмотрим ниже.
Программирование рисования трубопроводов с детализацией Все трубопроводы и их элементы, показанные на рис. 29.11, могут быть нарисованы при выборе одного пункта меню — СгтецРис | Трубопроводы ] Детализация. При этом вызывается XML-меню, показанное на рис. 29.13. !• ДеклднроБка трубопроводов р ~г^ — '
Г:- г.
Q* @i а о
~~
~~~"
- Дгталирсвка трубопроводов •£ Трубы в 3 линии G ТруЙопрововы стальные а 3 чини Тр^опроводная арматура .- Трубы Пр*т«ой участок. Труби гнут as Рзиз трубопровода .-. Переходы стандаргиь» ^i- расширгнир РсщенгрмчмьИ 1 Эксцентричный >: Сч-еяие •» Переходы нестанод111*1^ •-: Отевы
"—
• • • • • • ^ • • K Z ^ ] I
*
п
К — ,• 1
^~~\ 1
:
1атр<|йок с двумя плащами
|
Гнуты4-; Отктыинич В Подь«*| и опусти Трубз кр-няч * опусTt-tfa нилнчя * под.ъег-1 Труба еертчи - опус»+тр|[ба ныжичч - Сгочк 'Tp с Фланцем Фланец с патруй-лм
!Всн-п уэлсе: 77
У»п: 43
i — ~ — ~~~i i ' \ — 1 _1_
Рис. 29.13. XML-меню деталировки трубопроводов
Глава 29. Несколько программ fin я сантехников
935
Это XML-меню имеет несколько десятков элементов, в каждом из которых спрятан макрос, загружающий небольшую программу рисования конкретного элемента трубопровода (на рисунке выбран патрубок с двумя фланцами). Фрагмент XML-меню приведен в листинге 29.11. Листинг 29.11. Фрагменты файла ru_pipe_detail.ruxm •citem name='Трубопроводная арматура' iinage=' TRUBA\ARMREftL\fiRM_ALL .GIF' c:oTrnent=' Реалистичное изображение выбранного изделия 1 mac±o=' (progn (ru-app--load "ru_san_pi.pe_detail") (START "Арматура" [quote ru-pipe-valve-details) "Начало изделия со стороны входа среды" "Направление потока" MIL "valve")) '/> titem riame='Трубы' macro=''> eriteni name=' Разрез трубопровода' iitiage='TRUBA\PIPES\PIPE_RAZ.GTE -l comment»'Раареэы труй с опорами и без опор' raacro=' (ru-app-load "ru_san_pipe_sect±onal" j ' /'~t/item> Citem name='Патрубок с фланцем' image='TRUBA\PIPES\FLftN_PF.G!F' =oamer.t=' Рисование от патрубка 1 macro=' (progn (ru-app-load "ru_san_pipe__flange") (START "Патрубок с фланцем" (quote ru-pipe-branch-flange)}) ' /> При просмотре полного текста меню на компакт-диске читатели убедятся, что почти все рисование сосредоточено в одном файле ru_san_pipc_detaiUsp. Кроме того, используются ru_san_pipe_sectiorial.lsp и ru_san_pipe_flange.lsp. Две последних про-
936
__
Часть IV. Разработка прикладных программ
граммы предназначены для рисования специфичных изображений, и мы о них поговорим потом. Программа ri!_san_pipe_detai] рисует прямые участки, гнутые трубопроводы, переходы, отводы, тройники, врезки, подъемы и спуски. Все эти узлы обладают общими свойствами: П каждый узел имеет главный параметр — диаметр основного трубопровода и может иметь дополнительный параметр — диаметр ответвления или второй диаметр перехода; 3 некоторые однотипные рисунки отличаются характером изображения {концентричный или эксцентричный переход, центральный угол отвода, дополнительные изображения на стояках); 3 трубопроводная арматура имеет множестио конструкций (задвижки, клапаны и т. п.), отличается давлениями, размерами, характером изображения (вид сбоку, сверху, вдоль оси), но также имеет главный параметр — диаметр; G все элементы могут создаваться с разным весом л и л и и . Для каждого элемента необходимо задавать требуемые параметры, причем непременно в диалоговом окне. В системе AutoCAD R I O диалоговые окна отсутствовали, параметры отображались И изменялись с помощью опций командной строки и экранного меню. Это было не очень удобно, и с появлением диалоговых окон работа значительно упростилась. Очень важно, что отдельные элементы нужны не сами по себе, а должны формировать связанное изображение трубопровода. На рис, 29.11 видно, что, н а ч и н а я от напорного патрубка правого насоса, последовательно нарисованы: фланец, прямой участок, отвод, прямой участок, переход, патрубок с фланцем, обратный клапан, "катушка", задвижка, фланец, прямой участок, отвод, прямой участок, фланец, задвижка, фланец, прямой участок, подъем с двумя отводами в вертикальной плоскости, прямой участок и обрыв трубопровода. В этот трубопровод врезаны еще два трубопровода, состоящих из собственных цепочек элементов. При выборе для рисования любого элемента, пользователь должен иметь возможность начать его рисование от введенной точки или продолжить рисование от предыдущего элемента, не затрачивая у с и л и й на прицеливание, В главе 2S мы разбирали применение для рисования трасс функции ru-trass-drawfirst-prev-sample (см. главу 22), с помощью которой возможно рисование любых трасс с зацепкой за окончание предыдущего сегмента трассы. Подобную функцию можно разработать и для трубопроводов При разработке таких программ возможны различные принципиальные подходы. Во-первых, можно разработать большую программу с большим диалоговым окном, позволяющим выбрать элемент, установить его параметры и нарисовать. При таком подходе множество проблем имеет программист — требуется увязать множество условий и событий Разработчик будет обречен всю жизнь совершенствовать эту программу, а пользователям сложные диалоги со множеством визуальных элементов неудобны. Во-вторых, можно вынести выбор элементов в XML-меню, для групп однотипных элементов разработать простые диалоговые окна, которые, например, показаны в следующем разделе, и разработать одну программу средней сложности, управляю-
Глава 29. Несколько программ для сантехников
937
шую диалоговыми окнами и вызывающую требуемые функции ввода данных и рисования элементов. В XML-меню вызывать универсальную программу с требуемыми аргументами. В-третьих, можно для всех элементов разработать собственные короткие программы, по возможности использующие универсальные функции ввода данных и рисования. В XML-меню можно вызывать необходимые программы с требуемыми аргументами. Первый вариант следует отбросить сразу — одни недостатки при отсутствии достоинств. Второй вариант реализован нами в программе ru_san_pipc_detaii. Несколько лег назад при разработке эгой программы мы польстились на красоту решения с передачей в аргументах имени функции, но оказалось, что и с программой средней сложности трудно разбираться, если не заниматься исключительно ей. Начиная разработку "с нуля", лучше действовать по третьему варианту — он оптимален и для программиста, и для пользователя. Вместо одной сложной программы мы будем иметь много, но простых. Наш опыт показывает, что разбираться с маленькими программами намного легче, особенно имея такой инструмент, как программа ш Lisp Explore г (см. главу 9).
Организация ввода данных В главе 9 мы уже упоминали об организации хранения данных — как раз на примере рисования трубопроводов. Для каждого элемента нам, как минимум, потребуется выбор одного диаметра (рис. 29.14). диаметра и наименования изделии (рис. 29.15). иногда двух диаметров (рис. 29.16), а иногда — диаметра и иного параметра, например, радиуса изгиба (рис. 29.17). I Пряной участо* Диаметр, мм
Изделие
D'i ICO
Рис. 29.14. Диалоговое окно ввода диаметра
Рис. 29.15. Диалоговое окно ввода наименования изделия и диаметра
(Врезка в магистраль (Труба гнут аи Дяаметр.мч ~" Ио
I
.
г
Радиус изгиба.мм -
» Г • ITooo
Рис. 29,16. Диалоговое окно ввода диаметров магистрали и ответвления
Рис. 29.17. Диалоговое окно ввода диаметэа и радиуса изгиба
938
Часть IV, Разработка прикладных программ
Для подписывания диаметров мы уже предусмотрели инод текста диаметра в функции ru-get-diani-text (см. листинг 29.9). Выбор диаметров производился из меню options\\dia_lst.xml (листинг 29.12). В этом меню содержатся строки "всего круглого", и для рисования это меню не подходит — рядом могут быть строки 500 (преобразуется в число) и 530x7 {в число не преобразуется). I Листинг 29.12. Фрагмент файла diajstxml ws-1251' ?>
15' sdata='15'/> 20' sdata='20'/>
папре='Ду 10001 sdata= ' 1000 ' /> -
-
-
":iteni name= ' Электросварные ' sdata-1 '> -
-
-
Лля разных элементов трубопроводов требуются различные параметры, связанные с диаметром условного прохода трубы. Если для прямого участка необходим только 1 диаметр условного прохода , то для рисования фланца, кроме диаметра условного
1
Трубопроводы мы рисуем по лмамстру условного прохода, пренебрегая толщиной стенки, и н а ч е выГюр будсч слишком велик при отсутствии потребности в такой точности.
Глава 29. Несколько программ для сантехников прохода н у ж н ы уже четыре парамегра, да еще зависящие от расчетного давления для фланца. Для расчетных программ могут потребоваться и дополнительные параметры. От идей, рассматривавшихся в главе 9, мы давно перешли к реализации. Мы уже умеем работать с базами данных и вообще могли бы занести все параметры всех марок и типоразмеров труб в базу данных и для разных целей использовать требуемые данные. Могли бы, но не стали этого делать, т к. это сильно осложнило бы и разработку программ, и работу пользователей, да и работающую систему мы просто не успели бы сделать. Пользователям нужны не идеи, а готовые программы. Данные трубопроводов, за исключением преходящих номеров стандартов, не меняются десятилетиями, и работа с базой данных в таких условиях не имеет смысла. Хранение данных мы предусмотрели в XML и пока об этом не жалеем. Но и здесь имеются нюансы. Примеры выбора д а н н ы х по диаметрам из XML-меню мы приводили в главе 16 и упоминали о необходимости совместимости со старыми п р о г р а м мами системы BestlA, в которой для хранения данных использовалась одна строк;! и в которой данные разделялись точкой с запятой. Это были файлы формата ВТК. преобразованные теперь в XML. Строка данных содержалась в атрибуте с именем ЗОАТА (листинг 29.13). Листинг 29.13. Фрагмент файла diam_nominal.xml
В строке SDATA содержатся размеры трубопровода и фланцев (для одного из давлений). Что именно означает каждое число, когда-то знали только мы, но уже забыли. Разобраться с этим можно только анализируя программы. В программе требуемый параметр и зиле кается по номеру элемента в списке, что также затрудняет понимание смысла. Но XML позволяет хранить данные в именованных атрибутах (листинг 29. 14). Такой формат данных понятен любому специалисту, знающему, что такое фланцы. ! Листинг 29.14. Фрагмент файла flange. xml cflange name =' При в арной встык Ру 1 . 6 МПа ' Ду=' ' Дфл=' ' ДСолт=' ' Толщ= ' ' ДЕЫСТ=' Выступ=' ступ=' ' Патрубок=' Патубок=' ' дотв=' дотв ' п = ' ' > уп=' 5 . О ' Патрубок=' ПС. О ' Дотв='45' п = ' 2 В ' / >
940
Часть IV. Разработка прикладных программ Двыст=''
Двыст= ;ст='47.0' Выступ='2.0' ПатруСок=' 3?.. Э ' Дотв='14' п = Ч ' / >
Выбор из XML-меню с помощью вьиова функции isetq 1st (car (ru-xml-get-att-llst "Зыбср диаметра" Iru-flle-raenu-Miil "options \Mlaiige.1; .кщ!"1 (list "name" "Ду" "Дфл" "ДЬолт" "Толщ" "ДЕЫСТ" "Выступ" "Патрубок" "Дотв" "п") "Ду")11 может вернуть удобный для чтения нссоциироианный список
LISP гюзьоляст найти значение из ассоциированного списка и даже присвоить его переменной, имя которой является ключом для поиска: Isetq var_name "Дфл") !set (road var_name)(atof (car (ru-list-raassoc var_name 1 s t ] ] I ) (print Дфл) 145.0
Все это очень хорошо, но требует И переделки наших программ, и переписывания старых XML-меню. Себе мы работы добавим, сроки сорвем, а заказчик наших улучшении и не заметит — это внутренние детали, не интересующие пользователей, и им нет дела до того, как мы анализируем списки. Рассмотрим еще один вариант. Попробуем вообще избавиться от диалоговых окон, даже таких простых, как на рис. 29.14—29.17. Пока наш пользователь работает в многостадийной системе, включающей, как минимум: П выбор элемента трубопровода (рис. 29.13); П выбор типоразмера (рис. 29.14—29.17); П
рисование;
3 возврат Б диалог выбора типоразмера; П выбор другого типоразмера и повторное рисование; П выход и возират в меню выбора элементов; 3 выход в систему AutoCAD. Если мы совместим меню элементов с типоразмерами, то пользователь будет иметь дело с единственным диалоговым окном, а мы будем писать только короткие функции рисования конкретного элемента с конкретными параметрами. Вместо переработки и программ, и меню мы будем иметь дело с написанием ноиых коротких программ п новых макросов меню. Написать нужно около десятка новых простых
Глава 29. Несколько программ для сантехников
__
941
функций, а это легче, чем переделить три больших и сложных программы. Пользователи также получат реальную пользу от ускорения работы. Вот этот вариант мы и примем для дальнейшей работы.
Универсальная функция рисования элементов труб Первым делом разработаем универсальную функцию рисования любого элемента трубопроводов (листинг 29.15). Аргументами ф у н к ц и и яиляются: D имя функции рисования; О список аргументов для функции рисования (и частном случае это может быть не список, а атом); П сообщение, выводимое при запросе первой точки: 0 сообщение, выводимое при запросе второй точки. 1 Листинг 29.15. Функция ru-pipe -draw- any [defun ru -pipe -draw- an у (func param_l£t msg_lpt msg_2pti / start_pnt erid_pnt end: (cu-app-begin) (while [not end) (setq start_pnt (if *ru_last_end_point* [ru-get-point-or-lw-or -continue -or -exit msg_lpt) (ru-get-point-or-lw-or-exit msg_lptl ) ) (cond ; (ru-is-point start_pnt! !(eval func) start_pnt (ru-get-point-reguired msg__2pt start_pntl ; (null start_pnt) (setq end t) ) } ) (ra-app-end) iprinc) ; И эта функция будет рисовать все элементы трубопроводов? Конечно. Куда же она денется, будет рисовать, и не только элементы трубопроводов, но и воздуховодов, и вообще всего, что можно нарисовать, имея две точки ц список параметров. Теперь мы можем избавиться от сложной программы m_san_pipc_delai! и от всех больших и малых диалоговых окон. Работа теперь сводится к рьиработке простых функции и наполнению их вызовами XML-меню. Приведем пример самой простой функции рисования прямого участка трубы или концентричного перехода. ; Листинг Э9.16. Функция ru-pipe-llna (defu-i ru-pipe-line (pnt^start pnt_end param_lst / r_start r_end ang right left) (setq restart I/ (car param_]-st) 2.0) t_end 1/ (cade param_lst} 2 . 0 ) ang (angle pne_start pnt_arid) right (ru-geom- go- right arig) left (ru-geom-go-left ang) I ( ru-p line -add (list (polar pnt__start right restart; ;polar pnt_end right r_end) (polar pnt_end left r_end] (polar pnt_stact left r_start) ) Т 0 (ru-lw-current) n i l ) (ru-line-add pnt_start (setq *ru__last_end_point* pnt_er.d) 0 "DASHDOT2")
Часть IV. Разработка прикладных программ
942
Для того чтобы не сбивать себя с толку вызовом такой функции со списком двух одинаковых диаметров для рисования простой трубы, сделаем еше упрощенный вариант (листинг 29.17). Листинг 29.17. Функция
;defnn г j-pipe-simple (pnt_start pnt_end param_lst; [ru-pipe-line pnt_start pnt_end (list param_lst parain_lst} I ) Рисование концентричных переходов выполняется функцией, приведенной в листинге 29.IS. Листинг 29.18. Функция ru-pipe-reducer-concert tr (defun ru-pipe-reducer-concentr (sta-t_pn- end_pnt parara_lst; (ru-pipe-line statt_pnt (polar start_pnt (angle stact_pnt end_pnt] (nth 1 patam_lstl] [list (nth 0 pararn_lst) (nth 1 p a r a m _ l s t ) ) ) ! Еще один пример — рисование гнутой трубы (листинг 29.19), для которой требуется задавать минимальный радиус гиба. Листинг 29.19. Функция ru-pipe-line-bend ;defun ru- pi pe -line -bend ( first jioint aecond_point parara_lst / diamjuain rad_iaid ang center line list__point vla_array_obi з ) [setq diam_main (/ (ru-conv-millimeter-to-unit (nth 0 param_lstl) 2 . 0 ) rad_mid (nth 1 parara_lst) ang (anyle first_point second__point) ) ;if (setq li£t_point (ru-tras3-dravj-l-.-/-frora-pt3-inin-segm "гнутой трубы" firstt_point second_j3oint 0 0 rad_mid)) (progn (setq centet_line (entlast) ] (command "__.FILLE1T" "_R" (ru-conv-:rillinieter-to-unit rad__mid) ) [command "__. FILLET" "_P" center_line) (if (setq vla_array_ob j S
;ru-ohj-ent-offset center^line (» diam_main) ) } ; ru-ob-j -vla-array-mod vla_array_ob;s "LineWeight" (ru-lw-current) ) ] ( i f (setq vla_jsrr-ay_ob j s
[ru-obj-ent-offset center__line [- diara__inain) | ) [E\]-obj-vla-array-moii vla_arcay_ob;s "LifteWeight" (ru-lw-current) ) ) \ i f (ru-ltipe-load "DASHDOT2") (nj-cnt-rr.od center_line "DASHDOT2" 6 ) ! ) ! (princ))
рисования трубопроводной арматуры используется специальная функция (листинг 29.20). Реалистичные изображения арматуры выполнены в виде библиотечных блоков (виды сбоку, сверху и вдоль оси трубы). Для того чтобы не рисовать для каждого конструктивного исполнения и диаметра отдельные блоки, применен прием формирования "конечных" блоков из промежуточных единичных деталей. В функцию рисования арматуры передается список параметров ш имени библиотеки, имени блока и строительной длины.
Глава 29. Несколько программ для сантехников
943
\ Листинг 29.20. Функция ru-pipe-valve-details [defvm ru-pipe-valve-details (start_pnt end_pnt param_lst / ang block_name scale) ;setq block_name (nth 1 paran_lst) scale (ru^conv-milliraeter-to-unit 1) ang (angle start_pnt end_pnt) *nj_last_er1d_polnt" (polar start_pnt ang (ru-conv-millimetei-to-unit (nth 2 p a r a m _ l s t l ) } ) [if (ru-block-lib-insert (nth 0 param_lst| blcck^name: (progr; 1ru-block-insett-obj block_name start_pnt scale scale scale ang]
(if
[not
(ru-get-is-point-right-by-axis "верха изделия" start_jpnt end_pnt)] [ru-obj-ent-ss-mirror (entlast! start_pnt eno pnt t ) ) } | | После всех изменений мы можем откорректировать XML-меню, характерные п у н к ты которого показаны в листинге 29.21 Листинг 29.21. Фрагменты файла pipe_detail.xml
version^' 1.0' encodino='windovjs-1251 ' ?> narae= ' Трубопроводы стальные в 3 линии1 mc>:o= ' ' > naroe=' Арматура ' m a c r o = ' ' > - пате=' Задвижки' raacro=I ' xiterr. name= ' Чугунные ' raacro=r '>
-
-
-
15.0 50.0) "Начало гнутой
-
-
•
944
Часть IV. Разработка прикладных программ
Программы для рисования вентиляции Программы для рисования рабочих чертежей вентиляционных систем (планы, установки, схемы) принципиально не отличаются от программ для рисования трубопроводов. Проблемы и пути их решения точно такие же. Некоторая сложность есть только в функциях рисования отдельных элементов, например, тройникои "аспирационного" типа, и немного усложняет работу использование круглых и прямоугольн ы х воздуховодов и различных вариантов соединений (на фланцах, бандажах, рейках, термоусаживающихсн манжетах). Разбираться с такими программами мы не будем, приведем только пример готового рисунка (рис. 29.18), в котором все вентиляционное оборудование нарисовано и помощью функций системы ruCAD.
'
Рис- 29.18. Фрагмент плана вентиляции
Кстати, рис. 29.18 демонстрирует применяемое нами много лет решение — отказ от разработки чертежей установок систем с "угловыми" спецификациями и проставление на общем плане позиционных обозначений по спецификации оборудования. В большом проекте такой прием позволяет избавиться от десятков никому не нужчых листов.
Глава 29. Несколько программ для сантехников
945
Резюме Мы рассмотрели только основные про]раммы для сантехнических разделов проекта — самые "ходовые" и самые принципиальные. Разумеется, требуется еще много других средств автоматизации рисования сантехники (и они есть), но большую часть изображении можно создавать с использованием функций, разобранных в книге. Заглядывайте ц другие "специальные" главы и находите там решения, необходимые сантехникам. А если чего-то не найдете в книге или на компакт-диске, заходите на сайт книги1 — там мы будем выкладывать дополнения к системе.
wviv. kurganobl.ru/cad
J4I/CAD ГЛАВА 30
Вывод чертежа на бумагу До сих пор основной продукцией проектных организаций являются чертежи, выве1 денные на бумажный носитель. По чертежам, выведенным на бумагу , оценивается вся работа проектировщиков. Процесс печати в системе AutoCAD от версии к версии все более усложняется, но фирму и этом упрекнуть нельзя — сложность работы определяется усложнением задач. О том, как печатать чертежи стандартными мето2 дами, мы писать не будем — это тема других изданий . Остановимся только на возможности программирования этого процесса. Программы, автоматизирующие печать, встречаются редко и решают они обычно вспомогательные задачи, например учет отпечатанных чертежей. В частных случаях, при постоянных условиях печати, можно автоматизировать и сам процесс. Мы попробуем решить одну из актуальных задач, не решенных а самой системе AutoCAD — вывод больших чертежей на малоформатные устройства. "Сытый голодного не разумеет" — гласит пословица. Видимо поэтому в фирме Autodesk не предусмотрели такое необходимое усовершенствование. "Там" это решается просто — хочешь иметь большие чертежи — покупай соответствующее оборудование. Российские разработчики ближе к нашим реалиям, поэтому российская система КОМПАСГРАФИК выгодно отличается тем, что имеет возможность печати чертежей по частям.
Замечание Не всегда печать по частям требуется "бедному студенту" для распечатки дипломного проекта на принтере офисного класса. Нам приходилось делать это, имен плоттер формата АО — требовалось отпечатать общий план города, который наклеивался на планшет размером 6*3 метрэ. Конечно, из системы AutoCAD можно отпечатать чертеж по частям с использованием различных "шаманских" приемов, не являющихся темой нашей книги, но мы 1
2
Процесс вывода на бумажный носитель (или в файл любого формата, например. DWF) в дальнейшем будем именовать печать, независимо от того, па какое физическое устройство выводится чертеж . Например, с.м. главу 43 книги Н. Полешука "AutoCAD 2004", изд. "БХ В-Петербург", 2004 — 976 с. (серия "В подлиннике").
Глава 30. Вывод чертежа на бумагу
947
попробуем выполнить это программным путем. Пример решения такой задачи пока1 зала Надежда Толстоба , разработавшая "для студентов" программу печати на принтер формата А4. Ее программа решает задачу, но в частных условиях. Мы попробуем 2 выполнить ее на профессиональном уровне, попутно разобравшись с массой интересных вопросов.
Алгоритм печати В целом алгоритм печати по частям кажется простым — выделять рамкой фрагмент рисунка, соответствующий формату бумаги, отправлять на устройство печати и переходить к следующему фрагменту. Реализовать это практически гораздо сложнее, чем придумать. Решать приходится много частных подзадач. Рассмотрим процесс печати с точки зрения пользователя нашей будущей программы. Для упрощения программирования мы не будем разрабатывать сложное диалоговое окно, а воспользуемся простыми средствами, предусмотрев линейную структуру программы. На каждом шаге зафиксируем задачи, которые предстоит решить программисту.
Шаг 1. Выбор компоновки Пользователь выбирает компоновку (Layout), выводимую на печать (рис. 30.1). Для программиста здесь сложностей нет. Переключение между компоновками у нас уже решено. В принципе, этот шаг не нужен (печатать надо всегда активную компоновку), но слишком часто пользователи, глядя на модель, думают, что печататыя будет какой-нибудь Layont3. • Выбор компоновки Активная Model
Рис. 30.1. Выбор компоновки для печати
' aco.ifmo.ru/ nadinet/ ^ Не подвергая ни малейшему сомнению профессионализм Надежды Дмитриевны как преподавателя. Кстати, именно на ее сайте начинающие LISP-программисты могут найти не столь "заумные", как в нашей книге, материалы для начального обучении
Часть IV. Разработка прикладных программ
948
Шаг 2. Выбор устройства печати Пользователь выбирает устройство печати (рис. 30.2). Проблемы программиста заключаются в получении списка доступных устройств печати, а их может быть много, в том числе сетевые и виртуальные. [•ЬыЬоришл геоа Известные п/югтеры \\PRESSA4HP \\rOPORKOV\HP \1ZUKO N2\HP Autodesk DWF Writer OWFmaka DWFmaked) EPSON Stylus Photo ЗЭ5 HP DeskJet 1220C 1 кшияя пвнаив иВрВИ. .M Jaws PDF Deatof PDF Compal We Praitei Oliver
HHHBHUUE] -1
j
1 >Г
«1 - — . .. . — ^- . . OK
Отмена
|
Рис. 30.2. Выбор устройства печати
Шаг 3. Выбор формата бумаги Пользователь выбирает формат (размер) бумаги, поддерживаемой выбранным устройстиом (рис. 30,3). При выиодс в растровый формат вместо размеров бумаги будет выбираться размер изображения о пикселах. выбор плоттера Известие п \\PRESSA\HP \\TOPQRKCV\HP \SZAKQN2\HP Autodesk DWT Wrta
I
DWFniak«i1] EPSON Stylus Photo 6S
ымпгпггиитпииш! Jaw PDF Deal» PDF CompalitJe Prrtei
Отмена
Рис. 30.3. Выбор формата бумаги
Для программиста возникают сложности — у каждой компоноики может быть свой набор поддерживаемых стандартов бумаги. Их надо выяснить и вывести дли выбора. Но не просто получить список поддерживаемых форматов, а учесть, что у каждого формата имеется имя, показываемое пользователю, каноническое имя, используемое программами, длина и ширина листа, а также код формата.
->' '
Глава 30. Вывод чертежа на бумагу
Шаг 4. Выбор стиля печати Программа предлагает выбрать стиль печати {рис. 30.4). Программист должен позаботиться об использовании выбранного стиля и о иариан те отказа от выбора стиля. Выбор с т и пц печати Измстные стили
Fi Pa" fcrm clb Grayscale* monochif^e clb Screening 1003; clb Screen^ 2У. clb Screening 5Q%.«b Scieenng 75* db
Отмена
Рис. 30.4. Выбор стиля печати
Шаг 5. Выбор зоны печати Программа делает активной выбранную компоновку и ^прошивает: Укажи первый угол зоны печати jEaents/Display/Limits/: Укажи второй утл зоны печати: Пользователь указывает зону печати. Для этого шага программист должен предусмотреть, с учетом всех выбранных ранее параметров, разбивку тоны печати на "конверты" с учетом формата бумаги, сформир о и а г ь массив зон псчаш, нарисовать эти зоны на экране и дать возможность перслпитать созданный массив.
Шаг 6. Формирование массива листов Программа формирует массии листов (рис. 30.5) и предлагает пользователю уточнить его расположение. Границы лпстоп показываются специальными контурами ("коннертами"). В ответ на запрос: Точное расположение массива листов <Как есть>: Пользователь может передвинут], мышью весь массии листов или согласиться с предложенной "нарезкой". Программист должен предусмотреть возможность передвижения массива листов.
950
Часть IV. Разработка прикладных программ
Рис. 30.5. Границы массива листов
Шаг 7. Печать Программа сообщает: Подготовлено листов: 9. Печатать? [Yes/No/Se!ected]: При выборе опции Selected будет подсвечиваться "конверт" очередного листа и выводиться запрос: Печатать подсвеченный лист? [Yes/No/Preview]: Effective pton/rtg area: 201.61 wide by 279.84 high При выборе опции Preview выводится стандартное окно предварительного просмотра печати. При согласии на печать происходит вывод листа на устройство, а "конверт" отпечатанного листа исчезает. Профаммист должен все это реализовать в кодах, да еще при условии, что реально проверить работу невозможно — кто же ему позволит экспериментировать с реальной бумагой и устройствами?
Реализация алгоритма печати Приступаем к реализации задуманного. Для этого нам необходимо хорошо изучить объектную модель печати в системе AutoCAD.
Глава 30. Вывод чертежа на бумагу
Как выполняется печать Печатать следует с использованием объекта Plot, имеющего, помимо прочих, интересующие нас методы: П Plc-ToDevice — С опциональным параметром PlotConfig; D PiotToFile — с обязательным параметром pictnie и опциональным параметром PlotConfig.
Параметр PlotConfig должен содержать полное имя РСЗ-файла с требуемой конфигурацией. Если этот параметр не задан, используется текущая конфигурация- С*7' сюда вытекает, что для полного управления процессом печати нам необходимо подготовить правильную конфигурацию печати. Обычно параметры конфигурации создаются с помощью инструмента Autodesk Plotter Manager, конфигурация для компоновки — с помощью диалогового окна команды PAGESETUP (ПАРАМ Л ИСТ). Нам предстоит проделать это программным путем.
'v
Замечание
\
А почему бы не выполнять все настройки с помощью команды PAGESETU(ПАРАМЛИСТ), в которой пользователь настроит все, как ему надо? Да, можно было бы, если бы в диалоговом окне, вызываемом по этой команде, не было кнопки Plot. Нам нужно решить задачу вывода по частям, а не печати "как влезет". Конечно, можно бы и предупредить пользователя, чтобы он не нажимал на Plot, но ведь нажмет обязательна Возможна и нудная разработка собственного диалогового окна, но мы пока ограничимся установкой набора типовых параметров, которые считаем оптимальными. Не будем использовать и команду -PLOT, т. к предугадать все возможные опции для различных устройств практически невозможно. Объект конфигурации piotconfiguration имеет множество свойств и методов. Мы будем работать с основными: ~3 configNarne — имя РСЗ-файла или устройства печати; И CarionicalKediaName — каноНИЧССКОС ИМЯ бумаги; П centerPiot — центрировать ли печать (мы будем центрировать всегда); П Paperunits код acMillimeters);
единиц
измерения
размеров
бумаги
(мы
принимаем
П PlotHidden — печатать ли скрытые объекты {мы будем печатать); П piotocigin — смещение начала зоны печати; "J PlotHotation — поворот бумаги при печати; П piotType — тип печати (мы будем всегда использовать acwindow — таково назначение нашей программы); П piotviewPottBorders — печатать ли границы виртуальных экранов (мы не будем): П PiotviewPortsFirst — печатать ли сначала содержимое виртуальных экранов; П PlotWithLineweights — печатать ли с учетом веса л и н и й в стиле печати (мы будем печатать с учетом веса линий в рисунке); О FlotWithPlotstyies — использовать ли стили печати, назначенные объектам; 3 Stylesheet — ИМЯ таблицы СТИЛЕЙ.
952
Часть IV. Разработка прикладных программ
Вывести чертеж на печать очень просто — достаточно выполнить LI SP-вы ражен ие (vla-plottofile plot_obj file_name device! ИЛИ (vla-plottodevice plot_obj device).
Вся остальная невидимая часть "айсберга" программы должна подготовить конфигурации объекта печати и обеспечить пользовательский интерфейс. Как это делается, мы разберем в следуюших разделах.
Основная функция печати Сначала разберем главную функцию печати (листинг 30.1), а затем вспомогательные функции. Листинг 30.1. Функция ru-plot-array [defun ru-plot-array l/plot_obj array conf csl cs2 curjilot cur_ucs dpi layer layout_list layout_obj master p_size paper_canonic_name paper_cfg paper_code paper_height paper_name paper_width p].otter_papers plot_device plot_file plot_scale p_rot style tmp_uc5l 1. Выбор компоновки ___. _
.
.
._
(if (Setq layout_list (ru-dlg-select-layout))
[piogn [setq layout_obj (car (cade layout_listl]I Установка выбранной компоновки ;vla-put-activelayout (ru-obj-get-active-docLiment) layout_obj) 1, Выбор устройства (if (setq plot_device Iru-dlg-select-plot-device layout_objl) [progn Список конфигураций бумаги для выбранного устройства (setq plotter_papers [ru-plot-get-plottei:-papers plot_device layout_obj T) );_ end of setq
Выбор конфигурации бумаги для устройства
(if (setq paper_cfg (ni-dlg-select-papers-cfg plotterjapecs)) (progn (setq papec_canonic_na.*iie (nth 0 paper_cfg] paper_name
(nth 1 paper_cfg)
paper_code paper_width paper_height
(nth 2 paper_cfg) (car (nth 3 paper_cfg)) :cadr (nth 3 paper_cfg)!
|.
Глава 30. Вывод чертежа на бумагу
953
Расчет масштаба печати. Для пространства модели выполняется с учетом масштаба и наименования единиц рисунка, устанавливаемого в свойствах рисунка. Для пространства листа масштаб 1:1 plot_scala (if (= (strcase icar laycut_list)) "MODEL") (ru-conv-millimeter-in-papeir-to-unit 1.0! 1 !;_ end of if );_ end of setq . . ^_
.I
Запрос на печать в фай^ lif (ru-yes "Печатать в файл")
I;
[setq plot_file [ru-file-dwgnaine-type ""К end of i f
Показываем размеры бумаги и запрашиваем поворот. Это место самое "скользкое", т. к. устройства по-разному реагируют на команды развернуть чертеж. Некоторые черте* разворачивают, а Бумагу - нет . .— — . [if {ru-yes (strcat "Устройство " plot_device "ХпРазмер Бумаги; Длина " (rtos paper_width) ", Высота " [rtos papec_height) "ЧпПовернуть на 90 градусов") ) (setq p_rot acSOdegrees; ;setq p_rot acCdegrees;
Isetq style (cond ( (ru-dlg- select- style layout_ob]l) IT "") ) ,-_ end of cond ) ;_ end of £ei_q
Начало обработки. Ставим метку отката [vla-startundomark (ru-obj-get-active-document!I Устанавливаем временную систему координат (setq 'ru-ctgect-error-теыsages* nil cur_ucs (vla-qet-activeucs (ru-obj-qet-active-document)) trnp_ucs_na:ne "ru-temp-wcs" }; end of setq
954
. г_ ' i
Часть IV. Разработка прикладных программ [if {setq trnp_usc (tu-obj-collection-item-by-name "DserCoordinateSysterns" tmp_ucs_naine)I
Если временная система координат уже есть, а это могло Сьгть при сбое, то удаляем ее [ru-obj-error-apply 'vla-delete (list tmp_ucs)) ) ;__ end of if isetq tnip_ucs (apply 'vla-add (append (list (vla-get-usercoordinatesystems ;ru-obj-get-active-docuinent)I) (mapcar 'vlan-3d-point •1(0.0 0.0 0.0) (1.0 0.0 0.01 (0.0 1.0 0.0)} );_ end of mapcar (list tmp_ucs_name) !;_ end of append ) ) ;__ end of setq (vla-put-activeucs (ru-obj-get-active-document] tmp_ucs) i- ii — Определение разрешения для вывода Б растр. Пока тут заглушка, в дальнейшем можно предусмотреть диалоговый вариант Isetq dpi [if (and (= 2 paper_code) (setq dpi 600)1 [if (= 1 (getvar "MEASUREMENT"}) Icvunit 600 "iraa" "inch") ;; _ на самом деле DPI -> D?MM dpi) I
- i
Преобразование масштаба .
.
._
.
.
.
^_
_i .
plot__scale (/ plot_scale (cond (dpi) ( (= 0 (vla-get-paperunits layout_obj)| 25.•З) (1-01 I;_ end of cond );_ end of / Расчет размера листа с учетом масштаба p_size
(mapcar [function (lairbda ix) {* x plot_scale) ) ) (if (= p_rot acOdegreesi [list paper_uidth paper_heighC) [list paper_height paper_width; I;_ end of if i;_ end of mapcar );_ end of setq .i . ^ _, . . . Формирование массива листов 11
(if (setq master
Глава 30. Вывод чертежа на бумагу
.
.
955
._
._
Запрос зоны печати -
|;
(ru-plot-get-plotarea р_з1ге Создание временного непечатаемого слоя (vla-get-name (setq layer (пд-layer-create-tupj}; !;_ end of ru-plot-get-plotarea );_ end of setq (progn
Визуальное уточнение расположения листов • " — ~ • " ~ ' t Iprinc "\пТочное расположение массива листов <Как есть>: "; (vl-cmdf "_.CHAMGE" master "" "" pause "": Остановка конфигурации плоттера
;
Ii .•
[setq cur_plot [ni-plot-layout-cfg iayout_^obj (list plot_d.evice papec_canoni c_n atne 1; cer.terplot true-false acrallliroeters; paperunits nil; plothidden true-false nil; plotorigin - должен бить массив (точка! p_rot; plotrotation acwindow; plottype Э; plotviewportborders true-false :vlax-tnie; plotviewportsfirst true-false nil; plotwithlineweights true-false (if style :vlax-true); plotwithplotstyles style; stylesheet nil; yiewtoplot - строка - имч вида для печати ),-_ end of list );_ end of ru-plot-layout-cfg );_ end of setq Запоминание масштаба в переменных
^
I .
(vla-getcustomscale layout_obj 'csl Pcs2) ,| .__, . . -
--
Вставка массива "конвертов" _^
.
.
.
;setq array (ru-block-minBect-to-array master!) Получение объекта печати
(setq plot_obj (vla-get-plot (ru-obj-get-active-document]:
I•
956
Часть IV. Разработка прикладных программ
Запрос на печать conf (ru-get-kword [ьtreat " Подготовлено листов: " {itoa (length a r r a y ] ) ". Печатать? "I "Yes No Selected" " N o " i ) ; _ end of setq (if (or (= conf "Yes"] (= coni "Seierted")] ; progn • (—
r I
Установка масштаба печати _г .
I'
(vla-setcustomscale layout r/ir; 1.0 plot scale) Печать массива листов
(mapcar [function (lambda (x) Печать одного листа :ru-plot-unit-now layout_ob] plot_device p_size x plot obj {if plot__file (strcat plot._ t* le "#" [itoa (It (vl-posi tier, x array))])} ;if (=• conf "Selected"] T) ];_ end of ru-plot-unit-now i ) array I; end of mapcar Восстановление масштаба
[vla-setcustomscale layout_obj csl cs2) I;_ end Of progn );_ end of if Удаление массива листов
_ [raapcar 'vla-delete array) Восстановление конфигурации (ru-plot-layout-cfg layout obj cjr_plr_'t) );_ end of progn
.i
I;_ end of if
. __.
....
Восстановление системы координат (vla-put-aetiveucs (ru-obj-get-active-oocuraont) cii!:_ucs) Удаление временных системьт координат м слоя [ru-obj-error-apply 'vla-delete Г-^зт; i.mp_ucs}; [ru-obj-error-apply 'vla-delete (l_i.t layer)) Ivla-endundoraark (ru-obj-get-аг-л ve-aocument;}
,.-
i.
957
Глава 30. Вывод чертежа на бумагу ;:; Закрываем все скобки (princ) I
Далее приведем незнакомые вспомогательные функции в порядке их использован им в основной. Функция ru-dig-seiect-plot-device (листинг 30.2) вернет имя выбранного устройства печати. Выбор производится из списка устройств, используемых в заданном VLAобъекте компоновки.
I Листинг 30.2. Функция ru-dlg-select-plot-device Idefun ru-dlg-select-plot-device (iayout_obj; Jru-dlg-single-lisc "Выбор плоттера" "Известные плоттеры" (ru-plot-get-plotters-name-for-layout layout_obj) ) ; _ end of ru-dlg-single-list
I СПИСОК плоттеров (листинг 30.3).
формируется
функцией
ru-plot-get-plotteta-name-for-layout
\ Листинг 30.3. Функция m-plot-get-plotters -name- for- layout (defun ru-plot-get-plotters-name-for-layout (layout_obj / 1st _ru-is-.pc3 поп] I d e f u n jru-is-.рсЗ (str / len) (if (> (setq len (stilen str}) 3! != ".PC3" (strcase (substr str (- len 3}))) );_ end of if );_ end cf defun (setq 1st (vlax-safearray->list (vlax-variant-value (vla-getplotdevicenames layout_obj)H I ;cond ((vl-position "Hone" 1st) (setq 1st (vl-remove "Hone" 1st) non "Hone"] ) ((vl-position "Нет" Istl (setq 1st (vl-reraove "Нет" 1st) non "Нет") I IT nil) j ; _ end of cond Icons ^ion (append (dcad_st3;lsort (vl-remove-if '_ru-is-.pc3 1 s t ) ) (acad__strlsort (vl-remove-if-not P _ru-is-.pc3 1st) } >:_ end of append ),-_ er,d of cons
I
958
Часть IV. Разработка прикладных программ
Список конфигураций бумаги для .заданных устройства и компононки формируется функцией г u-plot- get -plotter -papers (листинг 30.4). I Листинг 30.4. Функция ru-plot-get-plotter-papers [defun ru-plot-get-plotter-pspers (plotter layout force / current res titip] [if (or (not (setq trap (assoc plotter *ru-plot-plotters-cfg*))! force ) ;_ end of or (progn ;setq *ru-object-error-itiessages* nil current (ru-plot-layout-cfg layout
res
'[nil nil nil nil nil nil nil nil nil nil nil nil nil nil) };_ end of ru-plot-layout-cfg (cond [(ru-obj-error-apply 'vla-pjt-configname (list layout p l o t t e r ) ! ]
!(ru-plot-get-layout-papers-cfg l a y o u t ) ) (T nil) I ; _ end of cond ) ; _ _ end of setq (ru-plot-layout-cfg layout currer.;:) !if (and res ilistp res]) [setq *ru-plot-plotters-cfg* (if [not tup) (cons (cons plotter res) *ru-plot-plotters-cfg") (subst (cons plotter res) trap 'ru-plot-plotters-cfg*) I;_ end of if );_ end of setq I;_ end of if res },-_ end of progn (cdt tmp] I; end of if
Список свойств всех типов бумаги плоттера компоновки возвращает функция ru-plot-get-layout-papers-cfg (листинг 30.5), Листинг 30.5. Функция ru-plot-get- layout-paper a -cfg (defun ru-plot-get-layout-papers-cfg (layout / current res trapO tmpl; (setq current (vla-get-canonicalmedianame layout) res (mapcar 'ru-plot-gat-paper-cfg isetq tmpO [acad__strlsort (ru-plot-get-layout-papers-naiua l a y o u t ) ) ) (repeat (length tmpO) (setq ttnpl (cons layout tinpl))) ) ; _ end of mapcar I,-_ end of setq
Глава 30. Вывод чертежа на бумагу
___.
[vl-remove-if (function (lambda (x / yl у 2 ) (setq x (cadddr х) ) [СЕ (minusp (setq yl [car x) ) } (rainusp (setq y2 [zerop yl} (zerop y2) );_ end of or ) ; _ end of lambda I ; _ end of function (vl-remove-if 'null resl ) ; end of vl-remove-if
953
(cadr x! } !
Конфигурацию бумаги с заданными каноническим именем и компоновкой возвращает функция ru-plot-get-paper-cfg (листинг 30.6). Листинг 30.6. Функция m-plot-get-paper-c£g (defun ru-plot-get-paper-cfg (paper_canonical_name layout / px py mx ray margins valid area ptype} [cond ( [ru-obj-error-apply 'vla-put-canonicalmeoianame {list layout paper_canonical_name)) 1 ((ru-obj-error-apply 'via-put-plotrotation (list layout 0)}; ((m-obj-etror-apply ' vla-getpapersize (list layout 'px 'py) ) j ! (tu-obj-error-apply ' vla-getpaperniacgins (list layout 'rax 'my)}! ;|Ну, тупые! В mx попадает left и bottom, а в яу - right и top [по листу!)I; «betq valid Т) ) ),-_ end of cond (if valid (progr. (Eetq margins (apply 'raapcar (cons 'list [raapcar 'vlax-safaarray->list (list mx ray)}}) ptype (vla-get-paperunits layout} area [if (= 2 ptype! iiist px py! (list [apply '- (cons px (car margins)}! [apply '- (cons py [cadr margins))) );_ end of list ),-_ end of if );__ end of setq ilist paper_canonical_name [vla-getlocaleraedianame layout paper_canonical_name! ptype [if {= 2 ptype! [mapcar 'fix area) area ),-_ end of if );_ end of list !;_ end of progn ); end of if
Часть IV. Разработка прикладных программ
960
Список строк названий бумаги для заданной компоновки получаем с помощью функции EU -plot -get-layout -papers -г. are- {листинг 30.7). ! ЛИСТИНГ 30-7. Функция ru-plot-get-lay out -papers -naiaa
(defun r u-plot -get-lay out-paper s-riajae
(layout)
[vla-refreshplotdeviceinfo layout • [vlax-safearray-:>list
(vlax-variant-value (vla-getcanonicalmedianames layout) ] ) ;_ end of vlax-safeariray->li:it
Диалоговый выбор конфигурации бумаги из списка выполняем с помощью функции ru-dlg-select-papers-cfg (листинг 30. К). Листинг 30.8. Функция ru-dlg-select-papers-cfg [defun ru-dlg-select-papers-cfg (plotter_papers / name paper_cfg) (defun _find-in-list (name layout papers_cfg_list / result) (foreaeh x layout_papers_cfg_liEt (if (= {cadr x] name) (setq result (cons x r e s u l t ! i ) ;_ end of if ) ;__ end of foreaeh result ) ; _ end of defun (if (setq name (ru-dlg-single-list "ВыОор фор; > JIM бумаг;:" "Известные форматы" [mapcar 'cadr pi. с L'.er joapers) I )
Isetg paper_cfg (car l_find--.-i-i_st name plotter_papersl ]} ) ; _ end of if paper_cfg i
Выбор стиля печати для заданной компоновки производится с помощью функции ru-dig-seiect-styie (листинг 30.9), а формирование списка стилей — функцией ru-plot-get-styles-for-layout (ЛИСТИНГ 30.10). ':
I Листинг 30.9. Функция ru-dlg-eelect-style (defun ru-dlg-select-style (layout:_ob] i (ru-dlg-single-list "Выбор стиля л-г^т:-" "известные стили' : m-plot -get- sty lea -for- layout : ) ; _ end of ru-dlg-sir.gle-list
-i; r __cl)] )
Листинг 30.10. Функция ru-plot-get- sty las -for- layout (defun ru-plot-get-styles-for-layout :acad strlsort
!layout_ob]I
":
Глава
30.
Вывод
чертежа
на
бумагу
_
96
1
[vlax-safearray->list [vlax- variant -value (vla-getplotstyletablenames layout_obj } )
Выбор зоны печати и формирование массива "конвертов", отображающих расположение будущих ЛИСТОВ, ПРОИЗВОДЯТСЯ С ПОМОЩЬЮ ФУНКЦИИ ru-plot-get-plotare.a (листинг 30.11). j Листинг 30.11. Функция ru-plot-get-plotarea (defun ru-plot-get-plotarea (paper-size layer / inpl inp2 valid dx dy modx roody pi
p2 sx sy)
[cond ( (ptogn [initget 12B "Extents Display Limits"! [vl -catch -all-error-p (setq inpl (vl -catch-all-apply 'getpoint ' ("ХпУкажи первый угол зоны печати [Extents/Display/Liinits): "! );_ end of vl- catch -all -apply ) ;_ end of setq I ) ;_ end of progn ) Knot inpl) ) I (= inpl "Extents")"" (setq inpl (getvar "EXTMIN") inp2 (getvar "ЕХТМДХ") valid T) >
( (= inpl "Display") Isetq inpl (getvar "VSMIN") inp2 (getvar "VSMAX") valid T] I
( [= inpl "Limits") [setq inpl (getvac "LIMMIH") inp2 (getvar "LIMMAX") valid Tl
I ( (progn (initget 1) [not (vl-catch-all-error-p [setq inp2 (vl-catch-all-apply 'getcorner (list inpl "ХпУкаяи второй угол зоны печати: ") };_ end of vl-catch-all-apply I ;_ end of setq );_ end of vl-catch-all-erroc-p I ;_ end of not ) ;_ end of progn 31 Sat «34
962
Часть IV. Разработка прикладных программ [setq valid T;
1
(Т nil)
);_ end of cond [if valid iprogn (secq pi
(list (apply 'nun (list (car iripl] (car inp21. (apply 'min (list (cadr inpl] (cadr inp2)|] );_ end of list p2 (list (apply 'max [list (car inpl) (car i n p 2 ) ) ) (apply 'max (list (cadr inpl) (cadr i n p 2 ) ) l };_ end of list dx (- (car p2) (car p i ) } dy [- [cadr p2) (cadr p i } ) sx (float (car paper-size]) sy (float (cadr paper-size))' raodx ( f i x (/ dx s x ) ) raody ( f i x (/ dy sy)) );_ end of setq (if (> (rem dx sx) 0) (setq mod-< (1+ modx)) I ; _ end of if [if (> (rem dy sy) 0) (setq mody [1+ raody)) ) ;_ end of if
Вставка конвертов в виде массива анонимных блоков (ni-block-minsett-unit-uiraained pi paper-size layer (list modx mody)] (entlast) ),-_ end of progn ) ; end of if
\ Листинг 30.12. Функция ru-Mock-minaart-unit-unna«*d ( d e f u n ru-block-minsert-unit-unnamed (point scale layer matrix) ;;; Вставка массива анонимных блоков-конвертов (entraa-ke [append ' ( (0 . "INSERT"} (100 . "AcDbBlockReference";
;£2 . 256) (50 . 0) ) [list (cons 2 (ru-blodc-raaka-uriit-imnamad}! (cons 10 point) (cons В (cond (layer) ((getvar "CLAYER")) );_ end of cond ); end of cons
Глава 30, Вывод чертежа на бумагу [cons 41 [cons 42 !cons 70 [cons 11 (cons 44 (cons 45 1;_ end of list ) ; _ end of append 1;_ end of entroake ) ; _ end of defim
(car scale)) (cadr s c a l e ) ) (car m a t r i x ) ) (cadr matrix|) (car scale)I (cadr scaleI)
Отдельный аНОНИМНЫЙ блоК-КОНВерТ создает ФУНКЦИЯ г и-Ы ос k-make-unit-unnamed
(листинг 30.!3), возвращающая "имя" этого блока и помещающая это имя в глобальную переменную 'ru-biock-unit-unnamed*. :"""
""'
"
! Листинг 30.13. Функция ru-block-make-unit-uimamed i : ' .- „ (defun ru-block-make-unit-unnamed (/ item} (if (or (not * ni-Ы oc k-unit-unnamed*) [not (tblobjname "block" *ru-block-unit-unnamed;*) ; );_ end of or (setq *ru-block-unit-unnamed* 1 (foreach item («o . "BLOCK") (IOC . "ftcDbBlockBegin") (2 . "•DO") (10
. 1)
(10 0 . 0 0 . 0 0 . 0 ) (62 . 256) ((0 . (IOC (ЭО (70 (43 (38 (39
"LWPOLYLINE") . "AcObPolyline")
. *) . Vi . 0.01) . 0.0) . 0.0) lie 0 . 0 0 . 0 ) (10 1.0 0 . 0 ) (10 1.0 1 . 0 ) (10 3.0 1.01 ;2ic 0 . 0 0 . 0 1 . 0 ) (62 . 0)
( ( 0 . "LMPOLYblNC"! (100 . "AcDbPolyline": (90 . 2) ;тс . Oi [43 . 0 . 0 1 ) (33 . 0 . 0 ) [39 . 0.0)
"" ]
..._. J
964
_
Часть
IV (10 (10 (210 (62
)
Разработка
прикладных
программ
0-0 0 . 0 | 1.0 1.0) 0.0 0.0 1.0) . 0)
( ( О . "LWPOLYLINE") (100 . "AcDbPolyline") (90 (70 (43 (38 (39 (10 (10 (210
. 2} . 0) . 0.01) . 0.0) . 0.0) 0.0 1.0) 1.0 0.0) С . О 0.0 1.0)
(52 . 0)
)
"EHDBLK") . "AcDbBlockEnd" )
(entmake (append (list (car item) ' (100 . "AcDbEntity" ) ;_ end of list (append (cdr item) 1 ((8 . "0") (67 . 0) "Model")
) ;__ end of append ) ;_ end of cons ) ;_ end of entmake ) ;_ end of f oreach I ;_ end of setq ) ,-_ end of if * EU -block -unit -unnamed* ) ;_ end of defun Для отрИСОВКИ "конвертов" функцией ru-layer-create-tmp (листинг 30. 14) создается временный непечатаемый слой. -Листинг 30.14. Функция ru-layer-create-tup
(defun ru-layer-create-tmp (/ all lay item пей iter new-vla) [vlax-for item (setq lay (vla-get-layers (ru-obj-get-active-doeument))) (setq all (cons (via-get-name item) all)I );_ end of vlax-for (setq iter 0) (uhile (vl-position
Глава 30. Вывод чертежа на бумагу
966"
(setq iter (1+ iter} new (strcat "RO-TMP-" (itoa iter]I );_ end of setq all };_ end of vl-position I ; _ _ end of while (setq new-vla (vla-add lay пей11 [via-put-Plottable new-vla :vlax-false) ;vla-put-Color new-vla 6] new-vla ) ; _ end of defun
Функция tu-piot-iayout-cfg (листинг 30.15) получает и качестве аргументов объект компоновки и список параметров новой конфигурации печати. Функция устанавливает новую конфигурацию печати, а возвращает ранее действовавшую конфигурацию. | Листинг 30,15. Функция ru-plot-lavout-cfg (defun ru-plot-layout-cfg (layout cfg-lst / current) ;; Получаем текущую конфигурации: [setq current (mapcar (function (lambda (к) (vl-catch-all-apply x (liat layout)))) ' (vla-get-configname via-get-canonicaimed!aname vla-get-centerplot vla-get-paperunits via-get-plothidden vla-get-plotorigin via-get-plotrotation vla-get-plottype vla-get-plotviewportborders vla-get-plotviewportsfirst vla-get-plotwithlineweLghts vla-get-plotwithplotstyles vla-get-stylesheet vla-get-viewtoplot) );_ end of mapcar );_ end of setq (vla-tefreshplotdeviceinfo layout) (raapcar (function (lairbda (у. у} [if (and у (not (vl-catch-all-error-p y))) (cu-obj-error-apply x (list layout y))))) '(vla-put-configname vla-put-canonicalmedianame vla-put-centerplot via-put-paper units via-put-plothi tide n via-put-plot origin via-put-plotrotation vla-put-plottype vla-put-plotviewportborders vla-put-plotviewportsfirst vla-put-plotwithlineweights ula-put-plotwithplot styles vla-pxit-stylesheet vla-p'Jt-viewtoplotl cfg-lst ),-_ end of mapcar current
Функция ru-biock-minsert-to-array (листинг 30.16) получает в качестве аргумента примитив вставки блока и преобразует его в массив блоков, возвращая список элементов массива.
966
_
Часть
IV,
Разработка
прикладных
программ
| Листинг 30.16. Функция ru-blodc-minsert- to -array ' (defun ru-block-minsert-to-array (block / param d x f )
(setq param [ru-block-get-array-cfg block) dxf (eritget block]) [entdel block) [entmake ( ru-ent-dxf --code-clear-list dxf '(-1 330 5 70 71 44 151 nil)) (setq block (entlast) } [if {< 1 (apply '* (car param))) ( ru-obj -array-rectangular block (caar pacam) (cadar param) 1 (caadr pacam) (cadadr param) 0) [list (vlax-ename->vla-object block) ) ) ;_ end of if Печать единичного листа осуществляется функцией ru-piot-unit-now (листинг 30.17). | Листинг 30.17. Функция ru-plot-unit-now(defun ru-plot-unit-now (layotit_obj device p_size unit plot_obj fname opt / do ins) (vla-highlight unit :vlax-true) [via-update unit) (vla-setwindoutoplot layout_ob] (setq ins (ru-obj-point-3d-to-2d (vla-geE-insertioripoint unit)]) [ru-obj-point-move ins p^size) I ; _ end of vla-setwindowtoplot (vla-highlight unit :vlax-true) Подсвечиваем текущий лист и запрашиваем разрешение на печать. При этом даем возможность стандартного предварительного просмотра [if (or (not opt) (ru-plot-ask-arid-prgvie« plot_obj ) ) (progn [if fnarne (via-plottofile plot_obj fname device) (vla-plottodevi.ee plot_obj device] ) ; _ end of if ) ; _ end of progn ),-__ end of if (vla-put-visible unit :vlax-false) (vla-highlight unit :vlax-false) I
Печать листа с опцией предпросмотра осуществляется функцией cu-piot-ask-эпаpreview (листинг 30.18). Листинг 30.18. Функция ru-plot-aafc-and-preview (defun ru-plot-ask-and-preview (plot_ob] / answer end) ;;; Запрос печати листа с опцией предпросмотра (while (not end]
Глава 30. Вывод чертежа на бумагу
__
_
__
967
(setq answer (ru-get-kword "Печатать подсвеченный лист" "Yes No Preview" "Yes") I (cond I [= answer "Preview") (vla-displayplotp review plot_obj acf ullpreview) ) (T (setq end T) (= answer "Yes"}) );_ end of cond ) ;_ end of while
Преобразование трехмерной точки типа variant в двухмерную осуществляется функ ru-obj-point-3d-to-2d (ЛИСТИНГ 30.19).
•Листинг 30.19. Функция ru-0b;j-point-3d-ta-2d
(defun ru-obj-point-3d-tо-2d (point / tup) (setq trap (vlax-safearray->list [vlax-variant-value point))) [ru-conv-list-points-to-variant-array {list (car trap) (cadr trap)))
Для отлавливания ошибок в программе печати была разработана специальная функция ru-obj-error-apply (листинг 30.20), принимающая аргументы аналогично функции vi- catch- all -apply и возвращающая т в случае ошибки или NIL в противоположном случае. Кроме того, функция добавляет сообщение об ошибке в начало СПИСКа ГЛОбаЛЬНОЙ переменной "ru-object-errror-messages*.
] Листинг 30.20. Функция (defun ru-obj -error-apply (func 1st / err is-err) [setq err (vl -catch-all -apply func 1st] ) [if Isetq is-err (vl-catch-all-error-p err)) (setq * ru-object-error-messages4 (cons (substr (vl-eatch-all-error-message err) 19} *tu-object-errcr -messages*) ) ) ,-_ end of if
is-err I ;_ end of defun В качестве "отходов производства" представим функцию, которую мы разработали, но не использовали в программе — она, может быть, пригодится читателям. Функция ru-plot-get-plotters-papers (листинг 30.21) возвращает очень длинный список всех конфигураций бумаги (листинг 30.22) для всех обнаруженных плоттеров. Первоначально мы хотели производить выбор конфигурации из генерируемого XMLфайла, позволяющего выбрать конфигурацию бумаги из всех известных устройств и форматов, но в дальнейшем остановились на более простом варианте последовательного выбора из двух линейных списков (см. рис. 30.2 и 30.3). I Листинг 30.21. Функция ru-plot-get-plotters-papers (defun ru-plot-get-plotters-papers [force / layout current res) [if (or force (not *ru-plot-plotters-cfg*))
Часть IV. Разработка прикладных программ
966
(progn (ru-splash-show "Иису конфигурации бумаги для известных плоттеров") (setq 'ru-objeet-error-raessage;,* nil layout (vla-get-layout (ru-obj-get-model-space)) current (ru-plot-layout-cfg layout
'(nil nil nil nil nil nil nil nil nil nil nil nil nil nil)) res (mapcar (function (lambda ( x ) [cond I(tu-obj-error-apply 'vla-put-configname (list layout x) ) ! ((list к (ru-plot-get-layout-papers-cfg l a y o u t ) ) ) [t n i l l ] 1 ) (ru-plot-get-plotters-name)) );_ end of setq (ru-plot-layout-cfg layout current) 1 r u- spl a sh-hi de") [setq *ru-plot-plotters-cfg* (vl-remove-if-not ' l i s t p (vl-remove-if 'null r e s ) ) ) };_ end of progn * r u- pi ot-pl ot te r s - с f g *
i;
end of if
Листинг 30.22. Сокращенный пример списка всех конфигураций
("Hone" ( ("7QQmm_(700.0Q_x_lQOO.OO_MM)" "700mm (700.00 x 1000.00 MM)" 1 (6B5.0 960.0)) ("AHSI_A_(11.00_x_8.50_Inches) " "ANSI Й (11.00 x 8.50 Inches)" 1 (266.7 177.81) ("ARCH_C_(18.00_x_24.00_Inches(" "ЙКСН С (18.00 x 24.00 Inches)" 1 (444.5 571.5) ) l"ISO_AO_(1189.00_x_841.QO__MM)" "ISO АО [1189.00 x 841.00 MM)" 1 (1174. ff 801.0) ) ;"ISO_A4_(21C.QO_x_297.00_Mtt)" "ISO A4 (210.00 x 297.00 MM)" I (195.0 257.0)) ("ISO_A4_(297.00_x_210.00_MM)" "ISO A4 (297.00 x 210.00 MM)" 1 (282.0 170.0) )
! "Sun_Hi-Res_ ( 1280 . 00_x__1600 . 00_P "Sun Hi-Res (1280.00 X 1600.00 Pixels)" 2 (1279 1599)1 ( "3uper_VGA_ ( 600 . 00_x_800 . 00_PixelS) " "Super VGA (600.00 x 800.00 Pixels)" 2 (599 799)) ( "XGA_Hi-Res_ ( 1200 . 00_x_1600 . 00_Pixels) " "XGA Hi-Res (1200.00 x 1600.00 Pixels)" 2 (1199 1599))
Глава 30. Вывод чертежа на бумагу
_____
96&
("Autodesk DWF Writer"
( ("Oserll9" "ANSI A: S . 5 x 11 in" 1 (209.55 2 7 3 . 0 5 ) ! ["Userl24" "ISO Д4 : 210 x 297 mm" 1 ( 2 0 3 . 5 5 2 9 0 . 5 5 1 ) ("Userl26" "ISO A2: 420 x 594 nm" 1 (413.55 5 8 7 . 5 5 ) ) [ 1T Userl4Q" "ARCH E3; 27 x 39 in" 1 (679.45 9E4.25i;
1 "PublishToHeb JPG.pcS"
;<"Sun_Hi-Bas_(1280.QOji_1600.0Q_Pixels)" "Sun Hi-Res (1280.00 к 1600.00 Pixels) " 2 (1280 1600)) ("Super_VGA_(eOO.OG_X_600.00_Pixels)" "Super VGA (800.60 x 600.00 Pixels)" 2 (800 600)1
( "UserDef inedRaster [1216.00 x 1576.00Pixels)" "User 1 (1216.00 x 1576.00 Pixels)" 2 (1218 1576))
I
Резюме Мы посвятили целую главу программе, которая, как нам казалось, предназначена для ограниченной категории пользователей. Просто задача была нам самим интересна, т. к. потребовала детального изучения объекта печати и заставила разработать несколько интересных вспомогательных функции. Мы намеренно ушли от разработки большого диалогового окна — чтобы не терять времени. Однако неожиданно программа оказалась очень нужной некоторым "теткам", располагающим приличными крупноформатными плоттерами. Привлекательными оказались следующие моменты: П простой интерфейс — несколько последовательных щелчков мышью оказались удобнее разборки с достаточно сложным стандартным диалоговым окном; П возможность визуального прицеливания массивом "конвертов" оказалась удобной для расположения будущего изображения на листе вместо выравнивания с помощью смещений; П Б частном случае, при достаточном размере бумаги программа позволяет вывести и один лист с точным соблюдением масштаба {для чертежей генплана, топографии и сетей это обязательное условие) или, по крайней мере, оценить возможность вывода на один лист (от печати-то всегда можно отказаться).
970
Часть IV. Разработка прикладных программ
Разумеется, программа еше очень "сырая", не более чем Alpha-версия, требует ряда доработок, тестирования с различными устройствами печати (многие из которых имеют собственные "подлые" особенности) и версиями систем AutoCAD. Напрашивается сохранение любимой конфигурации для типовых условий работы и ее быстрое применение. Мы привели это описание для того, чтобы показать, как это делается, т. е. процесс разработки, а не готовый результат.
.ru/CAD ГЛАВА 31
Несколько примеров расчетных программ
(А ^^Г
Выполнение различных расчетов является одной из привлекательных черт систем автоматизированного проектирования. Действительно, в среде AutoCAD, обладающей такими превосходными средствами для программировании прикладных задач, можно рассчитать все что угодно. Однако использовать расчетные возможности нужно очень осторожно, т. к. выполнение неверных расчетов хуже, чем их отсутствие. Программа, выполняющая расчет по неверной методике, опасна тем, что в результаты расчетов обычно не вникают: "машина умная, она рассчитала". А кто определит, какую методику считать "верной"? В официальных нормативных документах стараются избегать прямого изложения методик расчетов, а если такие методики и приводятся, то для случаев, основанных на фундаментальных законах природы. Методиками расчетов полны различные рекомендации, пособия, справочники проектировщиков. Доверять этим материалам можно, но осторожно. Авторы таких материалов не несут особой ответственности за конкретные решения и результаты использования методик. На любые рекомендации, выпущенные одним головным институтом, непременно найдутся критики из другого, вполне обоснованно указывающие на методические ошибки. Мы разрабатываем строительную САПР, а расчетные ошибки в строительстве чреваты возможными авариями и гибелью людей. Но даже если проектные промахи не приводят к уголовному разбирательству, последствия могут быть неприятными, и не столько для проектировщиков, сколько для людей, которые будут жить и работать в зданиях, построенных по нашим проектам. К счастью, большинство конструкторе в-строите лей, от которых в наибольшей степени зависит надежность зданий, являются людьми разумно консервативными. Они никогда не схватятся за программу, уверяющую, что "это все, что потребуется как чертежнику, так и проектировщику"— они знают, что такого не бывает, но охотно используют проверенные и хорошо зарекомендовавшие себя расчетные системы. К сожалению, пока таких систем, встроенных в систему AutoCAD, мы не встречали. А как быть программисту, если на него наседают пользователи, требующие "сделать" расчетную программу? Ответ такой — надо очень хорошо изучить предметную область, не полагаясь на "постановку" задачи в стиле "надо сделать". Кажется, что очень легко разработать, например, программу расчета теплопотерь помещений, основанную на подкрепленной авторитетом СНиП фундаментальной
97g
Часть IV. Разработка прикладных программ
формуле Q = fc'F'dT. Плошали ограждений помещений можно легко получить в системе AutoCAD, а коэффициенты теплопередачи — вводить или выбирать из справочников пользователя. Все сложности видятся только в организации удобного интерфейса. Такая программа выполняет арифметические вычисления и на вид безопасна. Однако ее применение может привести к соиершенно неверным результатам, если по этой формуле будут рассчитываться теплопотери помещений в многоэтажном здании. Площади ограждений, их конструкции (т. е. коэффициент теплопередачи) и разность температур внутреннего и наружного воздуха могут быть одинаковы для комнат, расположенных на первом и двадцатом этажах. Одинаковыми будут и теплопотери через ограждающие конструкции. Но расход тепла на отопление одинаковых комнат будет разный, т. к, в расчетной формуле не учитывается расход тепла на нагрев инфильтрующегося в помещения наружного воздуха. Рассчитать объем поступающего воздуха уже не так просто, т. к. он зависит от многих факторов, в том числе от конструктивных особенностей конкретного здания. Следовательно, такая программа и называться должна соответственно — не "расчет расхода тепла", а "расчет теплопотерь через ограждающие конструкции без учета инфильтрации", и пользователи должны знать пределы ее применения. Еще лучше, если уж браться за такую программу, то разработать ее с учетом всех возможных нюансов. Однако именно такие нюансы и могут превратить простую (в математическом отношении) программку в сложную комплексную систему. Не случайно прикладные расчетные программы чаще всего разрабатывают или инженеры, "деквалифицировавшиеся 1 " до программистов, или программисты, очень хорошо изучившие предметную область. Однако даже если разработчик очень хорошо знает предметную область, надо позаботиться, чтобы с программой было удобнее работать, чем без нее. Приведем пример собственной неудачной программы — пусть это будет упомянутый расчет теплопотерь. Эти расчеты проще всего выполнять в электронной таблице, но мы поддались на уговоры заказчика, которому хотелось делать эти расчеты в системе AutoCAD. В результате появилась программа, в которой можно рассчитать потери тепла через отдельное ограждение (стена, окно, пол, потолок) с возможным измерением размеров ограждений в рисунке (рис. 31.1). Из расчетов отдельных ограждений, каждое из которых может быть сохранено и использоваться как аналог для других, можно сформировать данные о теплопотерях помещения (рис. 31.2). Помещения также можно использовать как прототипы для других объектов. Из потерь тепла отдельных помещений формируются потери тепла зданием (рис. 31.3). Программа полностью учитывает все особенности таких расчетов и прекрасно решает поставленную задачу. Почему же мы считаем ее неудачной? Да потому, что работать с ней обычному пользователю неудобно. Традиционно такие расчеты выполняются в табличной форме. Расчет в электронной таблице (или в сетке базы данных) соответствует традиционной технологии и, как принято говорить, имеет интуитивно понятный интерфейс. Заполнение характеристик ограждений и помещений в формах, написанных на языке DCL, непривычно. В такую форму нельзя вписать расчетную таблицу — слишком уж неуклюж язык описания диалоговых окон.
1
Или "дисквалифицировавшиеся", так как про грамм ист-кодировщик, в западном понимании, часто рассматривается как чернорабочий.
Глава 31. Несколько примеров расчетных программ
973
ННЯННВНИННННВН^ВН-^1
• in, раж д(и.-г. Новое on мо
|^ЩЕЗВ
Название
1
•-Ориентация—
:i_ BOCT» ..
;
-J
-> ! ! L—
—
1^5-J
p
:
.- Bof^VrHfll/Knan- --
»,uiI
-—
i
'1
i Учет сопротивления теплопередачи стены Эти тювмы в стата
Степа наружная
Восгены 1,08
Прнтять
1
Отмена
|
_ |
Рис* 31.1. Расчет теплопотерь одного ограждения И) Насчет trfmnnontlTiK ППМРШР-ННО
Название
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^•— 1 \ Твн 20 К Углевое
По аналога
-^™~-~«-*
SRS
т^ч
Fr м2
.
1тема нэрчжная
Э075
1Б.2
!
Новый потолок
50 ДБ
1
L
j. "
'
ОрмеиЕ.
УСЛОВИЯ районы
Восток
Нвтдопчсясвий Еесчерла <пи-?
~
~~^
"
~~
Такое же
Теппопотери. ккчл/ч
*1
р Жилое
J
' ' Новое
--.:-• -чкг
10Э6
Пршять
'
Ч_
j |Г"Иэ컧Г^}
|
|
Uflavnt "|
Нагчш
GtMt-u
|
| ?
_ |
7 |
Рис. 31 .2. Расчет теплопотерь помещения Н Е'^чет Т1.ПППППТ1-ПК 1длн^| Иаэяанир
'
|9эт жилой дом в 1^ур"ам
.-
. J
< 1 Тк 1^5 | Нзд.,м |М — <— -л t — _ — 1 -
1
J
Ощяж помещений — ;
Помещение
Ккап/ч
.
Вктибспь Гэдщерой ' Прикожай Клмовад
127621 699 ВЗ 93438 91438
Файл ПОмещ&иЙ 005ТРО 006 Т PQ 001 (ро 007ТРО Такое *е
г l^rcrH расчета по мамчо — i Твпяопогерм. ккап/ч
|
Новое
[
Измени
[
Удали
|
' 7С6Э
Rw,?.---
|
Напиши
ПрНИЖЬ
Рис. 31.3. Расчет теплопотерь здания
j
j
Г;:*
Отчетвфайл
-
|
_ |
1 {
^^Н^И
974
Часть IV. Разработка прикладных программ
Единственным преимуществом такого варианта программы является возможность измерения размеров ограждений в системе AutoCAD, но за это небольшое и не.решающее удобство приходится расплачиваться необходимостью щелчков по многочисленным кнопкам без полного обозрения всего расчета. Пользователю проще ввести число с клавиатуры, чем измерять его в системе AutoCAD. В результате эта программа попала в категорию "на любителя".
Расчеты объемов работ При работе в системе AutoCAD чаще всего возникают идеи автоматического подсчета каких-то "количеств" с последующим использованием этих результатов. Реализовать такие идеи можно, и сделать это достаточно просто — мы приводили подобный пример в главе 27. Но надо хорошо подумать, стоит ли этим заниматься. Применительно к спецификациям оборудования этот вопрос рассмотрен в главе 32. В этой же главе мы разберем несколько простейших программ для выполнения элементарных расчетов, которые могут пригодиться в виде компонентов для более сложных систем.
Измерение расстояний Начнем с измерения расстояний. Это действие требуется выполнять часто, а стандартная команда DJST (ДИСТ) удобна только для разовых измерений. Попробуем разработать универсальную "рулетку", позволяющую: П измерять расстояния от точки до точки; О отменять измерение до неверно указанной точки; D добавлять к измеренным расстояниям произвольные числа (например, существующих, но не доступных для измерения на плоском плане вертикальных участков), в том числе "прочитанные" надписи атрибутов, текстов и размеров; О добавлять к измеренным "шаг за шагом" расстояниям дополнительные измерения "посторонних" участков и длин указанных примитивов; О помечать измеренные участки цветом. Как видите, запросы у нас скромные, и реализуем мы их в скромной функции (листинг 31.1). | Листинг 31.1. Функция ru-traas-suam-length
(defun ru-trass-suram-length (msg / list__point first_point next_jjoint undo_count add_len list_dist result ent lst_vei:t _add_dist| ,-;; Локальная функция добавления очередного измерения (defun _add_dist [distl (if (ru-is-point neKt_point) (setq- first_point next_point} (setq next_point first_point)) :setq list_dist ;; ДоОавляем измерение в список icons dist list dist)
Глава 31. Несколько примеров расчетных программ
;; Добавляем измерение к результату result (+ result dist) ;; Добавляем очередную точку в список list_point (cons nextjpoint list_point) ;; Увеличиваем счетчик отката
undo_count (l+ undo_courit)
) ;;; Главная функция (setq undc_count 0 ad [length list_point) 2) [strcat "Замерено сейчас... " (rtos (car list_tiist) 2 3) " " (ru-unit-name) " . " "\riBcero " (rtos result 2 3) " " (ru-unit-name) "." "ХпС/те^зуидан точка " rasg) (strcat "Следующая точка " msg) 1 "Выход" 'getpoint nil [if (> undo_count 1) "Undo Sarrple Number Bead" "Sample Humbet Read") [if (ru-is-point first_point) (trans first_point 0 1) first_point))) !if (ru-is-point naxt_point) Isetq next_point (trans next_point 1 0 } ! ) [cond ( ( = next_point "Undo") ;; He отменяем перйьм сегмент (if (> undo_count 11 [progn ;; Стираем подсветку трассы [gcdraw (trans (car list_pointl 0 1) (trans (cadr list_point) 0 1) -1} ;; Делаем откат результатов (setq undo_count (1- undo_count) list_point (cdr list_point) Eirst_point (car list_point) next_point (cadr list_point) result (- result (car list_clist» list_dist [cdr list_dist|) ;; Снимаем подсветку с примитива-оОрааца ;if ent (progn (redraw ent 4) (setq ent n i l ) ) ) ) ) ) ((= nextjioint "Sample")
975
976
Часть IV. Разработка прикладных программ
;; Извлечение длины из указанного примитива [if (setq ent (ru-get-entsel-by-type (strcat "ХпУкажите образец для '" msg "'"I "Примитив недопустимого типа" [list "LIME" "LWPOLYLINE" "POLYLINE") nil)) [progn [setq ent (car ent) lst_vert [ru-pline-list-vertex ent)} ;; Подсвечиваем примитив/ чтобы не забыть, что его сосчитали (redraw ent 3) (_add_dist (ru-geom-plir.e-length [car lst_vert) (cadr lst_vert) T ) I ) ) I [(=- next_point "Number") ;; Ввод дополнительного числа - с клавиатуры или измерением (_add__dist (setq add_len (ru-get-dist (strcat "Численная довавка для " msg) add_len nil)))) [(= next_point "Read") ;; Чтение текстового числа (_add_dist (ru-get-calc-number [strcat "Укажи размер, текст или атрибут с числом для " msg))]) [Т ;; Указана очередная точка г; Подсвечиваем измеренный отрезок и добавляем измерение [grdraw [trans first_point 0 1) [trans next_point 0 1) 1) !_add_dist [distance first_point next__point) )) )))) result)
Имея такую функцию, мы можем использовать ее в самых разных программах. Прежде всего, разработаем самую очевидную программу — "измерить и написать" (листинг 31.2). Листинг 31.2. Файл rn_calc_sum_dist.lsp [defun START (/ length_dist trass_name pt txt) [setq trass_name (ru-user-read-last-parare "LastTrassName" "Трасса")] (while [setq trass^name (ru-get-string "Наименование измеряемой линии" trass_name)) [if [not (zerop [setq length_dist (ru-trass-sumrn-length ttass_name)))) (ptogn (setq txt (rtos length_dist) pt (ru-get-point-or-exit [strcat "\пТочка начала наименования ' " trass_narae "' ") "Leader")) [corid ( (= pt "Leader") [ru-dcaw-leader-and-two-string t[ass_name txt nil)) [(ru-is-point pt) [ru-text-add trass_name pt (ru-normal-text-height) 0 nil) [if (setq pt (ru-get-point-or-exit (strcat "ХпТочка начала текста длины '" txt "' ") nil)) [ru-teKt-add txt pt (ru-norrr^l-text-height) 0 nil)))))))
Глава 31. Несколько примеров расчетных программ
9/7
(ru-usee-write-last-param "LastTrassName" trass_name! (princ} ) [START)
После измерения расстояния программа запрашивает точку для записи наименования трассы (ее можно указать и в графе таблицы) и точку для записи измеренного расстояния. При выборе опции Leader наименование и расстояние пишутся нал полкой выноски.
Определение площадей Расчеты площадей требуются очень часто — и для написания на планах, и для внесения в экспликации, и для прочих корыстных целей. Когда-то для определения площади использовалась команда AREA с последующим извлечением измеренной площади из системной переменной AREA, теперь мы можем воспользоваться объектными методами (листинг 31.3). Листинг 31.3. Функция ru-geom-araa-ent (defun ru-geom-area-ent (ent) [ru-error-catch (function (lambda 0 (vl-catch-all-apply 'vlax-curve-getarea [list (vlax-ename->vla-object e n t ) ) ) } ! nil})
Эта функция возвращает площадь примитива, но иногда требуется определить "теоретическую" площадь, заданную списком координат вершин. В системе AutoCAD проще всего по списку координат построить примитив, получить его площадь функцией ru-geom-area-ent и стереть примитии, но мы попробуем решить задачу путем вычислений. Расчет площади выпуклого многоугольника выполняется по формуле' 31.1. (31.1) 2
ЛИ
Реализация соответствующей LISP-функции приведена в листинге 31.4. | Листинг 31.4. Функция ru-geoo-area-points [defun ru-georn-area-points (pnt_liat) (abs (* (apply '+• (mapear (function (lambda (pi p2) (* (+ (carpi) (car p2)} (- (cadr pi) (cadr p2))!)) pnt_list (cons (last pnt_list) pnt__list)l) 0.5)))
algolist. manual .ru/m я ths/ веот/polygo n/area. pb p
978
Часть IV. Разработка прикладных программ
Рис. 31.4. Проверка расчета площадей
Многоугольник называется выпуклым, если никакая сторона многоугольника, будучи неограниченно продолженной, не разрежет многоугольник на две части. Однако наша функция правильно определяет площадь и не выпуклых, практически встречающихся, многоугольников (рис. 31.4), за исключением некоторых вариантов "бабочки". Так как мы не можем утверждать, что функция ru-geom-area-points правильно определяет площадь во всех случаях, от ее применения мы воздержимся.
Спецкалькуляторы различного назначения Располагая функциями для определения расстояний и площадей, мы можем разработать множество программ для различных прикладных вычислений. На рис. 31.5 показано диалоговое окно калькулятора площадей. Программа предназначена для расчета любых площадей и написания результатов в рисунке. Наименование площади можно ввести в строке редактирования или в диалоговом окне функции ru-get-string с возможностью выбора из словаря. Площадь можно измерять несколько раз, добавляя или вычитая результат текущего измерения. Полученный результат можно написать (в таблицу, в контур, с выноской) в рисунке, при написании возможно задать подчеркивание наименования, результата и добавление единицы измерения площади. При щелчке по кнопке Измерить производится измерение площади контура. Контур для определения площади созлается одним из методов, выбираемых в диалоговом окне (рИС. 31.6), ВЫВОДИМОМ функцией ru-dlg-dcl-get-area. ФуНКЦИЯ рисует замкнутую полилинию, определяет площадь полилинии с помощью функции ru-geom-area-eiit и, если не устаноатен флажок Рисовать контур, стирает временный контур. Приводить исходные тексты функций И диалоговых окон мы не будем, т. к. они объемны, но не содержат ничего интересного — рутинная работа с элементами диалоговых окон. На рис. 31.7 показано диалоговое окно еще одного спецкалькулхтора ведомости изоляции трубопроводов.
Глава 31, Несколько примеров расчетных программ
979
(Калькулятор площадей Наименование площади. fe01"1""~
Ввод
г- Площадь. гт2—
I [25 3JQ
| Было
|
Текущая
^_ |аООО
Измерить
- Результат, м2— - Действие
•" Рассчитано -^~
(* Плюс
!
f Минус
Г '~ Перос чет
! 25.34Q
Пси записи результатов "
1
Г~ Подчеркивать имя
Р Подчеркивать результат
|v м2
Напиши
ОК
Рис. 31.5. Калькулятор площадей
ЗЕ23Н
Определание площади Холл - Создали комгфа" —™~ *~ . - Способ опр^елений контура i . | 1 f^ Создать контур указанием т.0"ек
" ~~ —
•- •
! ] Г Смдать какгчо а редакторе tool I (* У кйзвть суш ест в yotu^to линию и .—„ . — Г~ Рисовать контнр 1
Делай _J
В ы-од
Рис. 31.6. Диалоговое окно создания контура
К^пькулятии о е донос т и изоляции трубипроводоБ ДВ - Характеристика нт/я^емога объекта- 1ррй до 70 градусов
» J Дн [108
>^ [ LM
_
а покрытие 1ЭмальЗП-5Б в 3 сяод по шпаглежеЗП-QgtD вУсоуа : термообработТ]
» |
Серия
|ТУ &-10-12ДЭ-72 J 3,гиги
|OJ
[7.ЭОЗ.Э-2.1 -21
pO
Твплоизолнцнь»ий слойл -
л
[Маты минералоБагнеьр npouineifcie 2M-100 в обкладках »*э мегаллицеск л
пие тепловой НЗЧЛНЧАИИ
» j
Серий
I S,htrf
-
частик Р^В^НЫ^ PCI 5 У &-П-145-80 по'риберонаьРП-ЗдОй ~~|
» |
Серия
|7Э039-2У21
; S.MM
[D B' [
s В ЬйДОМОнЗГЬ
Окраску
F-41.733M2 ^ блаик ведомости
!7 Изоляцию
'
У1-2Э2мЗ
Р Покрытие
Р-&1.Э6Эм2
.
_3аписать J :i
ii i
Рис. 31.7. Диалоговое окно калькулятора ведомости изоляционных конструкций
i
' in—-1
Часть IV, Разрабогка прикладных программ
9SO
BEJQNQCTb ТЕПП060Й ИЗОЛЯЦИИ*! |ТС1ИКЖС1РР1)И*4*1 Э
[-а ГССТ 13499-74
i, гост ?5ее-а: .
S=OJ. ГЦС1 J^C
осГ?ШЗЕГ£д
Рис. 31.8. Ведомость тепловой изоляции (фрагмент)
При проектировании технологических трубопроводов может применяться много разновидностей конструкций тепловой изоляции и противокоррозийной зашиты. Этот калькулятор позволяет нарисовать бланк ведомости, рассчитывать площади поверхности трубопровода и защитного покрытия изоляции и объем теплоизоляционного слоя. Длина участков трубопроводов измеряется 9 рисунке, типовые конструкции изоляции выбираются из спраиочников. В результате может быть сформирована ведомость, показанная на рис. 31.8. Разработаны и другие подобные калькуляторы, например, масс листовых и погонажных изделий, объемов насыпей и траншей.
Математика с числовыми текстами Частенько пользователю приходится перемножать или суммировать числа, написанные в виде текста. Например, если требуется получить общий объем изоляционных конструкций, занесенных поэлементно в ведомость (см. рис. 31.8). Напишем функцию (листинг 31.5), позволяющую выполнять какие-то действия с числами, читаемыми в рисунке. Число может быть в виде текста, значения атрибута или размера. Функции передается один аргумент — строковое имя функции, которая должна применяться к двум числам. Обратите внимание на использование функций eval и read — именно эта пара позволяет обрабатывать аргумент, переданный в виде строки. Вычисление мы "оборачиваем" в традиционную функцию-ловушку ru-ertor=atch, чтобы предотвратить сбой при возможном делении на ноль или по иным заранее неведомым причинам. Листинг 31.5. Функция ru-text-eval
-'--:;•-
(defun ru-text-eval (fane I nl n2 pt result txt_result) [while [setq ril (ru-get-calc-nximbei "Укзжи первое число "11 (if (/= nl 0) (progn (while (setq n2 (ru-get-calc-number "укажи следугацее число"))
Глава 31. Несколько примеров расчетных программ
981
{setq result (ru-error-catch {function (lambda {) ((eval (read func)) nl ri2) ] ) (function [lambda (x) (princ (strcat "Ошибка вычисления " {vl-princ-to-string nl) func (vl-princ-to-string n2) " \ n " ) > n l ) ) ] txt_result (vl-princ-to-string result!) (princ (strcat "\пРеэультат: " {vl-princ-to-string nl} func (vl-princ-to-string n 2 ) "=" txt_result)! [setq nl result) )
[setq pt (ru-get-point-or-exit (strcat "ХпТочка начала текста результата '" txt_result " ' " ) "Line"]) (cond ;; Возможность написать текст вдоль линии ! (= pt "Line") (ru-draw-tnt-up-line txt_result)l ({ru-is-point pt] (ru-teKt-add txt__result pt (ru-normal-text-height) 0 nil) 1 ))))(princ)) Вызвать эту фунКЦИЮ МОЖНО ИЗ ЛЮбоГО подходящего места В виде (ru-text-eval "*"), (ru-text-eval "+"), (ru-text-eval "-"), (ru-text-eval " / " ) ИЛИ даже (ru-texteval "expt"), хотя в практических целях применяется сложение или умножение. Так как в экзотических случаях может возвращаться не только численный результат, перевод результата в строку предусмотрен функцией vl-princ-to-string.
Быстрый прикидочный расчет диаметров трубопроводов и воздуховодов Неопытных проектировщиков могут поставить в затруднительное положение самые простые задачи, например, определение диаметров трубопроводов или воздух о подов. Пока нет опыта, трудно сразу определить, какой диаметр требуется для пропуска такого-то расхода среды. Вспоминая сложные гидравлические расчеты, выполнившиеся во время учебы, молодые специалисты с надеждой хватаются за программы, совмещающие черчение и расчеты. В Советском Союзе было создано немало программ гидравлических расчетов различного назначения. Разрабатывали их весьма квалифицированные специалисты на высоком постановочном уровне. Неудобно только было применять эти замечательные программы из-за технологии прохождения расчетов (заполнение бланков, обработка в вычислительном центре, исправления, повторные расчеты). Технология была настолько неудачной, что большинство проектировщиков правдами и неправдами избегали машинных расчетов и продолжали работать традиционными методами. Сейчас положение дел иное — у каждого есть компьютер, имеются и хорошие программы, но беда в другом — современные расчетные программы бесплатно не распространяются. Вот и получается парадокс — опытная "тетка", работая на компьютере, держит под рукой таблицы или номограммы для гидравлического расчета, по которым, как и пятьдесят лет назад, прикидывают диамегры трубопроводов, ориентируясь на скорость среды и удельные потери давления.
984
Часть IV. Разработка прикладных программ d - внутренний диаметр трубопровода, мм ke - эквивалентная шероховатость трубопровода, мм si - единицы измерения в системе СИ, иначе NIL Isetq d (* 0.001 d} density 983.0,-; Плотность воды f (/ {* pi (expt d 2)! 4));; Площадь сечения трубы (if g
Если задан расход, определяется скорость (setq v (/ (/ (/ g density) 3600.0] f)) иначе по скорости определяется расход (setq g (* (* (* v f) 3600.0} density)) Удельные потери на трение, кгс/м2 (setq _speci£ic_resistance - " (* (/ (/ 1.488 {expt (log (/ <* 5.5 d) (+ ke (/ (* 73 {expt d 2 ] ) g ) ) ) ) 2» d| (/ (* (expt v 2) density) 1 9 . 6 2 ) ) ) пересчет единиц (if si {setq _specific_resistance (" _specific_resistance 9 . B i l l ) [setq _volume g _speed v),-_ end o£ setq (set_tile "ed_volurae" (rtos _vcluir,e 2 3 1 } [set_tile "ed_speed" (rtos _speed 2 3}) (set_tile "ed_pot" Ittos _specific__resistance 2 3 } ) (set_tile "txt_result" (strcat "Общие потери на треи^е " (rtos (* _specific_resistance _length| 2 31 " " _name lost] _speed
Это локальная функция, вызываемая внутри основной программы, поэтому в ней используются несколько глобальных по отношению к этой переменной, но локальных В Программе переменных (_specific_resistance, _volurae, _speed, _length. _name_iost). Это не очень хорошо, но в программах, в которых применяется DCL, допускается. В данном случае не будем к этому придираться, хотя можно было результат вернуть списком, а установку значений полей редактирования диалогового окна выполнить в более подходящем мосте программы.
Замечание Внимательные читатепк заметят что в диалоговых окнах и функциях встречаются наименования единиц измерения, не соответствующие современным стандартам (килокалории, кгс/м ). Связано это с тем. что в теплотехнической отрасли международная система единиц СИ внедряется "со скрипом" из-за плохой наглядности внедряемых единиц измерения Изымаемая из обращения килокалория (количество теплоты, требуемое для нагрева одного килограмма воды на один градус) была "интуитивно понятна", как понятны были единицы измерения давления (напора), выражаемые в метрах и миллиметрах водяного столба Так как большинство проектировщиков no-прежнему предпочитают запрещенные единицы, в программах мы предусматриваем два варианта вывода результатов — на вкус пользователя. В СССР объявлена предпочтительной с 1963, а стандартной — с I9S1 года.
Глава 31 Несколько примеров расчетных программ
955
Особенности программирования расчетов Рассмотрим расчетную часть. В ней сделана попытка оптимизации функции в любимом LlSP-программистами стиле — избавление от ненужных присваиваний и переменных. Заметим, что оптимизировать можно было бы и лучше, но в данном случае ОПТИМИЗаЦИЯ ПРОСТО вредна. В Приведенной ранее функции ru-gecm-area-points (см. листинг 31.4) также была проведена оптимизация, в результате функция стала и "красивой", и понятной. Но расчет потерь давления более сложен и стандартен. Его изучают студенты всех строительных специальностей (большинство "несантехников" об этом просто забыли), но в приведенной формуле с трудом разберутся даже те, кто занимается такими расчетами профессионально. Неизвестно, откуда взялись константы 1.488, 5.5, 73, можно догадаться только, что 19.62 — это 2g. Специалисты знают, что существует несколько вариантов определения коэффициента гидравлического сопротивления трению, но константы не похожи на используемые в известных методиках. Через некоторое время об этом забудет и автор программы. А для кого мы пишем исходный текст программы? Не столько для "машины", сколько для человека, который с этой программой будет разбираться. Если в функциях общего назначения вполне уместно воспользоваться языковыми преимуществами LISP, избавиться от н е н у ж н ы х переменных, то в расчетных программах лучше не уадекаться оптимизацией, а написать исходный текст так, чтобы он прежде всего был понятен специалисту. В этом случае не повредят и лишние переменные, и м е н а которым лучше назначать общепринятые в предметной области, например, не specific_resistance, a H_l!. Но и с именами переменных не так просто. Ученый люд очень любит придумывать сложные обозначения физических и технических величин — с верхними и н и ж н и м и индексами, да еще составными. Возможно, это является мерой "крутизны" автора, но для программистов — беда. Обозначение нужно записывать в одну строку, но тогда общепринятое или даже стандартизированное обозначение будет непонятно никому, особенно после перевода на латиницу греческих символов. Мы предполагаем, что когда-то будет выработан и стандарт для "перевода" обозначений величин в компьютерный вид, но работать нужно сейчас. В книге мы старались давать именам переменных осмысленные английские имена, но для многих технических величин подобрать английский эквивалент просто невозможно, а опускаться до "транслита" ("rasxod_tepla") уже не хочется. Так как язык LISP позволяет использовать для имен переменных любые символы, рискнем сделать неожиданное предложение — в расчетных программах использовать русские имена переменных. Попробуйте, например, придумать понятное английское имя переменной "норма расхода горячей воды потребителем в час наибольшего водопотребления", учитывая, что в СНиП 2.04.01-85 эта величина обозначается трехэтажными символами (31.2).
«£„
(31 2)
К сожалению, в некоторых СНиП введены такие буквенные обозначения для расчетных форм/;], которые просто невозможно записать в программах, поэтому приходится конструировать имена, хотя бы похожие на стандартные.
986
Часть IV. Разработка прикладных программ
Может получиться нечто непроизносимое и непонятное наподобие q_tot_hr_u. Непонятное ни ученым, ни "англичанам". А на русском языке это будет "норм_раех_гв_мах_час". Тоже неблагозвучно и некрасиво, но понятно. По крайней мере, "нашим" — а кто же еще будет читать наши исходные тексты программ. Вернемся к определению потерь давления. Классическая формула 31.3 понятна любому инженеру, отражает физический смысл процесса, но не очень удобна как для ручных, так и для автоматизированных вычислений. \ии
—
-Р
(31.3)
' 2
где: Ар — падение давления, вызванное трением и местными сопротивлениями. Па; Я. — коэффициент гидравлического трения; da — внутренний диаметр трубопровода, м; / — длина участка сети, м; V'C — сумма коэффициентов местных сопротивлений на рассчитываемом участке; со — скорость жидкости в трубопроводе, м/с; 3
р — плотность жидкости в трубопроводе, кг/м . Самым сложным является определение коэффициента гидравлического трения, для расчета которого существует несколько вариантов расчетных формул для различных режимов течения жидкости ( л а м и н а р н ы й , переходный, турбулентный) и шероховатости труб. Авторы всех вариантов расчета коэффициента гидравлического трения (Мурин, Блазиус, Никурадзе, Киссин. Зусманович и др.) стремились добиться максимального соответствия расчетных и опытных данных, однако расчеты оставались достаточно сложными, т. к. в них необходимо учитывать плотность и вязкость жидкости, не являющимися постоянными Поэтому ли я практического применения были разработаны формулы, предназначенные для типовых условий (температура воды SO градусов, эквивалентная шероховатость труб 0.2, 0.5 и I мм), а по этим формулам были составлены таблицы и номограммы, использующиеся уже несколько десятилетий. Кроме того, для упрощения инженерных расчетов систем в целом были разработаны различные практические методики расчета (по характеристикам сопротивления, проводимостям, относительным расходам и т. п.) потерь давления в трубопроводах. После появления первых ЭВМ, которые физически были большими, но имели мизерную, по нынешним меркам, память, в совершенствование расчетных формул включились программисты, старавшиеся использовать более удобные варианты расчета коэффициента гидравлического фения, применять функции, имеющиеся в системах команд конкретной системы, и преобразовывать расчетные зависимости для сокращения объема постоянных вычислений. В варианте, использованном нами в функции _evai_hw (см. листинг 31.6), коэффициент гидравлического трения определяется по формуле 31.4 Л. И. Кагана, преобразованной для воды с плотностью 983 кг/м 3 с заменой десятичного логарифма на натуральный.
Глава 31. Несколько примеров расчетных программ _
987
1.4SK
Потери давления на трение (местные сопротивления можно учитывать в виде эквивалентной длины трубопровода) мы определяли по формуле 31.5.
л . со Я = —/-р d 19.62^
, -, , (3.J)
где: 2
// — потери давления на участке, кгс/м (мм. вод. сг); и — скорость жидкости, м/с. Плотность воды, которую можно было бы оставить условно-постоянной, как э~о принято при расчете коэффициента гидравлического трения, мы оставляем в виде переменной. В функции _evai_hw (см. листинг 31.6). предназначенной для прикн3 дочных расчетов, мы принимаем постоянную плотность воды 983 кг/м , но при выполнении более точных расчетов плотность воды мы будем определять функцией, приведенной в листинге 31.7. ЛИСТИНГ 31.7. Функция ru-eval-hot-water-density
(defun ru-eval-h.ot -water-density (t_water} ; ; ; Плотность виды при заданной температуре :;; iru-eval-hot-water-density 5 . 0 ) ЭЭЭ.Э1 ;;,-
( г u-eval-hot -water-density 6 5 . 0 ) 9В1.19
; ; ; ( ru-eval -hot -water-density 150.0) 910.3 ; ; ; Использована формула Туркина Е.П. [- 1000.3 (* 0.06 t_water) {* 0.0036 t_water t_water) )
Где брать формулы? Большинство методик расчета в строительном проектировании использует данные. приводящиеся в виде таблиц или номограмм. Всегда возникает вопрос о том, где же взять формулы функций, по которым построены таблицы и графики. Все это изучается в курсе математики, но многие ли инженеры помнят, как это делается? Приведем некоторые практические рекомендации. Во-первых, следует вести постоянную "охоту" за изданиями, в которых могут обнаружиться искомые формулы, а во-вторых, попытаться самостоятельно искомую формулу вывести. Действуя по первому варианту (охота), мы, например, нашли формулу для определения плотности поды' (см. листинг 31.7).
1
Имеется еще несколько вариантов этой формулы, выведенных разными авторами.
988
Часть IV. Разработка прикладных программ
А вот для определения кинематической вязкости воды пришлось действовать по второму варианту. В этом случае л у ч ш е всего воспользоваться какой-либо программой аппроксимации функций. Можно работать с каким-нибудь "монстром", наподобие MathCAD, а можно разыскать простую программу, которая также справится с такой работой. Для точного расчета коэффициента гидравлического трения, определения режима течения жидкости и выбора точной расчетной формулы требуется вычисление числа Рейнольдса. Число Рейнольдса определяют по формуле 31.6. Re = ^
(31.6)
где:
н>0 — определяющая скорость потока, м/с; D0 — гидравлический диаметр трубы, м; v — кинематическая вязкость, м2/сКинематическую вязкость среды при ручных способах расчетов определяют по таблицам или принимают постоянной, пренебрегая ее зависимостью от температуры и давления. Формула 31.5 выведена для воды с плотностью 983 кг/м3 с кинематической вязкостью 0.479* 10~6 м2/с. Такие условия примерно соответствуют обычным режимам работы систем и позволяют получать результаты с приемлемой для практических целей точностью. Выполняя расчеты на современных компьютерах, мы можем позволить себе и точные вычисления, особенно необходимые для многовариантных режимных расчетов. Используя табличную зависимость кинематической вязкости воды от температуры и программу Approximator' (рис. 31.12), мы легко вывели расчетную формулу. Для этого достаточно заполнить таблицу (X — температура, Y — кинематическая вязкость), выбрать расчетную формулу, щелкнуть кнопку Аппроксимация и проанализировать результаты — отклонения вычисленных значений от заданных и вид графика. Разумеется, "математик" сразу, по виду графика, определит подходящую расчетную формулу, но и полуграмотный (в математическом отношении) инженер может просто перебрать все формулы и получить требуемый результат. При аппроксимации полиномом 4-й степени достигается наименьшее среднее отклонение на всем рассматриваемом диапазоне, но мы будем использовать более простую формулу 31.7, дающую отклонение до 10% только при температурах ниже 10°, т. е. вне применяемого диапазона температур воды. 33.30215068 12.32052783 + t
(31.7)
Теперь мы можем написать и LlSP-функцию для определения кинематической вязкости воды (листинг 31.8). Самым трудным оказывается придумывание названия функции, а непременным условием — описание в комментариях источника информации и методики.
1
www.aproxim.narod.ru
Глава 31. Несколько примеров расчетных программ
-Ост
*ИЬЧ *1Н-Ч1—
w
-
сл г т ПА.в^ог ндо-ехрс-хн ' Г £ «ЗЧА.в-XJr- A/IB.X) Г *fXtWX\C А'ЕХР|ВЛ<]
г t Ч"*
Г AHQ-[BW|
'aujfiior А*В->ГП
С А -ВЧОСр<|^ Pnpfl Г X /W'BT<( г" АТШ!ХР1В21>- '
X
2
V
|Урасч.
OTK.nDJ д" ',' ^39&42д
1 JQ6
-1.23337Б9
1
Г
Э
го
1 006
1.02БВ043 2
1
3D
О.ИБ
U BJIh/il ^
Q55U
0.5513*1^1
5
939
3
С
B1,.0iDffi?l?H:a2-
Средние шгиионвннв :1 X СЩЯННР. ОТЧ14-Ч1В- ^0.005315^3
4D
150
S7
ть {
?
1
У-
Ч Г
^ Бъсн!
^1 Ишчнтайлцл
Рв
\ •
Чх ;
1
о
»
.»
*а
.
:
я н и
«
М
ЙС
ЦИ
110
1»
1»
140
,1
1Щ
ш Рис. 31.12. Программа "Аппрсжсиматор"
| ЛИСТИНГ 31.8. Функция ru-eva.1-water-cuiem-viscous
[defun !:ij-eval-water-cineiii-vj.scous (t_water) ;;; Кинематическая вязкость воды
;l Получена аппроксимацией
таблицы 1-8 Справочника по гидравлическим сопротивлениям
И. Е. Идельчика издания 1960 года с использованием программы Approximate;: v.1.3. t_water - температура воды, градусов Цельсия в диапазоне 10-15С Результат - кинематическая вязкость*10"6 мс/сек
\; (/ 33.30215068 (+ 12.32052783 t water))
Алгоритм определения диаметров трубопроводов Почти любая "тетка" на память знает, примерно какой диаметр трубопровода приблизительно соответстиует заданному расходу среды. Программа этого знать не может и каждый раз, когда диаметр нужно рассчитать, должна определить его и первом приближении, а затем, возможно, произвести еще несколько итераций, добиваясь соблюдения нормативных ограничений. Беда в том, что ограничения имеют слишком большой диапазон. Минимальная скорость движения воды должна б ы т ь 0.25 м/с (для выноса пузырькои воздуха с потоком воды), а максимальная ограничивается условиями допустимого эквивалентного уровня шума и может составлять до З м / с в производственных зданиях. При таких условиях может быть очень мне го
Часть IV, Разработка прикладных программ
990
расчетных итераций, и беда не в их количестве, а в том, что в результате могут быть сконструированы теоретически правильные, но практически неработоспособные системы. Диаметры стояков систем отопления, как правило, принимаются конструктивно. СНиП рекомендует принимать потери давления в стояках не менее 70% общих потерь давления в циркуляционных кольцах, еще лучше, если потери в стояках будут составлять до 95% — тогда может быть обеспечена гидравлическая устойчивость системы. Но, если даже придерживаться рекомендаций СНиП и принимать минимальные диаметры стояков, остается простор для самодеятельности при расчете диаметров магистралей.
._
S
005
S 050
S
[Л
.Л
S
S
050
0-.0
1Л
[J-l
S
S
U1
5 0W
5 0m
032
025
1Л
S 3&D
015
020
LT*
S 050
S 05C
5 050
Рис. 31.13. Варианты диаметров магистрального трубопровода
На рис. 31.13 показаны два варианта диаметров магистралей при стояках с примерно одинаковой нагрузкой. Первый вариант часто получается в результате машинного расчета систем отопления. В нем соблюдаются и ограничения по скорости, и в магистралях теряется не более 30% располагаемого давления. Тем не менее, это очень плохое решение! Ориентируясь на минимальные металлоемкость и, как полагают некоторые проектировщики, стоимость, в проекте использовано семь типоразмеров труб. Однако подлинная экономичность системы оценивается совокупностью металлоемкости, затрат труда на монтаж, электроэнергии на перекачку ~еплоносителя. На сокращение затрат труда на монтаж (про которые проектировщики забывают — все, мол, заложено в сметы) значительно влияет индустриальность системы, которая может быть оценена в коэффициентах индустрисыьности и унификации, зависящих от количества типоразмеров труб. Не вдаваясь в доказательства, приводившиеся в лите1 ратуре , скажем, что самым эффективным является вариант 2, в котором принимаОделъский Э. X., Каган Л. И., Клрзнер Л. X. Расчет систем центрального отопления и вентиляции на электронных вычислительных машинах. — Минск, 1974.
Глава 31. Несколько примеров расчетных программ
99?
ется постоянный диаметр, равный диаметру для всей ветки, пока нагрузка не снизится до 0.33 от нагрузки всей ветви, а далее также принимается постоянный диаметр до конца ветки. Совсем немного уступает по показателям так любимый практиками вариант с постоянным диаметром магистрали, и на последнем месте находится вариант 1. Расчетные формулы приведем сразу в виде функций (листинги 31.9—31.12). Во всех функциях аргументом яиляется расход теплоносителя в т/ч (тонны в час), а результатом — оптимальный внутренний диаметр в метрах. В вызывающей программе принимается ближайший больший диаметр из стандартного типоразмерного ряда. ! Листинг 31.9. Функция ru-erval-diam-bw-st (defun ru-eval-diain-hw-st (g) ;;; Оптимальный внутренний диаметр стояка отопления (* 0.036 (expt g 0 . 5 3 ) ! } Листинг 31.10. Функция ru-eval-dj.am-hw-mag-33
(defun EU-eval-diam-hw-тад-ЗЗ (g; ;;; Оптимальный внутренний диаметр конечных участков ветки ;;; с 1/3 нагрузки (* 0.022 (expt g 0 . 4 9 ) 1 ) Листинг 31.11. Функция ru-eval-d±am-hw-mag-100 Idefun m-eval-diam-hw-mag-lOQ (g; ;;; Оптимальный внутренний диаметр начальных участков ветки (* 0.034 (expt g 0 . 4 9 ) ) } ЛИСТИНГ 31.12. Функция ru-eval-diam-hw-mag-connaon [defun ru-eval-diam-hw-mag-coraron (g} ;; r- Оптимальный внутренний диаметр сборных магистралей (' 0.037 (expt g 0 . 4 9 ) ) I
Резюме Для чего мы в очередной раз отвлеклись на рассуждения, не относящиеся непосредственно к программироианию для системы AutoCAD? В начале главы мы сделали "грязный" намек на якобы неправильные методики расчетов, а сейчас привели конкретный пример. Неверность методики заключается не в том, что в ней использованы "неправильные" формулы — такого практически не быиает, а в том. что при формальной правильности всех расчетных компонентов может получиться принципиально неверный результат. В примере с диаметрами магистралей опасность не в том, что в первом варианте хуже показатели унификации, а в том, что такая система еще и гидравлически менее устойчива и, при отклонении располагаемого напора от расчетного значения, будет происходить и теплоиая разрегулировка здания. Регули-
992
Часть IV, Разработка прикладных программ
ровке, надежности и работе в нестационарных режимах при изучении курса отопления уделяется недостаточно внимания, а использовать машинные расчеты рационально именно для таких режимов. Мы специально привели ссылку на столь "древний" труд Эммануила Хацкелевича Одельского и его коллег, в котором, наряду с давно устаревшими сведениями по заполнению ячеек памяти ЭВМ "Проминь", содержатся и вечно актуальные алгоритмы. Если программист берется за разработку подобных задач, то он просто обязан изучить все, что было написано по теме работы. Вообще большинство научнотехнических изданий выпушено в лучшем случае в конце 80-х годов прошлого века, а в новой России, при огромной номенклатуре компьютерной литературы, не находится места для изданий, систематизирующих и излагающих расчетные методики на современном уровне.
.ru/CAD Г Л А В А 32
Спецификации оборудования В этой главе будет очень много рассуждений и очень мало "исходников". Большая часть текста может быть приравнена к постановке задачи. Реализация задачи достаточно проста и многие ее части мы уже выполнили в предыдущих главах. Программирование подготовки спецификаций более связано с ра]работкой приложений баз данных, не являющимися темой книги, чем с системой AutoCAD. Более важным нам показалось отразить то, что не написано ни в одной книге по программированию — особенности работы с этими важнейшими документами. Важнейшими потому, что на основании спецификаций составляются сметы, а многие виды работ можно выполнять только по смете, вообще не имея никаких чертежей. Что такое спецификации— знает любой проектировщик 1 . В последние годы в проектной документации для строительства применяются спецификации оборудования, изделий и материалов по ГОСТ 21.110-95 СПДС и спецификации к планам расположения коммуникаций, конструкций, чертежам установок систем, выполняемые по ГОСТ 21.101.93. За последние 30 лет спецификации делались разными способами: 3 "угловые" — кому как вздумается; D по форме 1 ГОСТ 21.104; 3 сводные спецификации на заглавном листе; П заказные спецификации; П заявочные ведомости: О ведомости объемов строительных и монтажных работ; П ведомости потребности в материалах: П спецификации оборудования. Многообразие форм документов было вызвано существовавшей в СССР распределительной системой. Часть спецификаций, входивших в состав проектной документации, была предназначена для понятных задач — определения необходимых ресурсов для строительства объекта, установления его сметной стоимости и производства 1
Материалы этой главы ас распространяются на спецификации, составляемые ш) стандартам ЕСКЛ32 Зак. Я 34
996
Часть IV. Разработка прикладных программ
Этот объемный экскурс в недавнюю историю мы написали для того, чтобы молодые разработчики знали, от чего мы избавились, и что потеряли. Знать историю необходимо хотя бы для того, чтобы не повторять прошлых ошибок. Люди, о которых мы писали с иронией, тоже искренне хотели делать "как лучше".
Что такое спецификация оборудования Для того чтобы понять, как автоматизировать выпуск спецификаций оборудования, разберемся, что мы должны получить на выходе. Спецификация оборудования, изделии и материалов, выполняемая по ГОСТ 21.11095 СПДС (далее будем именовать Спецификация) — текстовый документ, определяющий состав оборудования, установок, изделий, устройств и материалов, предусмотренных рабочими чертежами соответствующего основного комплекта. Документ по существу является сводной спецификацией к соответствующему комплекту рабочих чертежей и предназначен для комплектования, подготовки и осуществления строительства, а также для составления сметной документации ресурсным (ресурсно-индексным) методом. ГОСТ 21.110-95 и дополняющие его "Методические рекомендации по составлению спецификации оборудования, изделий и материалов МР 21.01-95" вызывают противоречивые чувства. С одной стороны, это очень полезные документы, четко установившие роль спецификаций оборудования и, наконец-то, отменившие "мертвые" стандарты на ведомости объемов строительных и монтажных работ и ведомости потребности в материалах. С другой стороны, стандарт (как и многие другие стандарты СПДС) совершенно не учитывает современных информационных технологий, их реальных возможностей и реальных ограничений. Не учитываются и современные формы организации строительного производства и новые взаимоотношении между заказчиком (в современном понимании — инвесторами), проектировщиками и строителями. Начнем критику с последнего утверждения. Несколько десятилетий фактическим инвестором в строительство было государство, устанавливающее "правила игры". Проектировщикам жестко предписывалось, как и в каком объеме выпускать документацию. Стоимость проектных работ диктовалась государством с учетом предписанной номенклатуры и детализации. Многие разделы документации нуждались в последующей доработке силами подрядных организаций — составление монтажных и деталировочных чертежей, определение реальной потребности в материалах и изделиях. Строители не были в обиде — затраты на эти работы входили и нормативы накладных расходов. Заказчику предписывалось укомплектовать строительство "оборудованием, поставляемым заказчиком". Как это делалось, мы писали в начале главы. Строительство подрядным способом велось, в основном, достаточно крупных объектов. Такие работы, как перепланировка и переоборудование квартир или строительство коттеджей, да еще по проектам, вообще не выполнялись. К сожалению, ГОСТ 21.110-95 написан так, будто бы жизнь не изменилась. Представьте, что вы законопослушный частный предприниматель, приобрели квартиру для переоборудования под магазин (типичная ситуация), в соответствии с нормативными требованиями заказали проект перепланировки (за солидные деньги),
Глава 32. Спецификации оборудования
997
проект прошел государственную экспертизу, вы закупили по Спецификации все материалы и изделия и наняли бригаду рабочих. Но вдруг выясняется, что. например, в чертежах водопровода и канализации, преду см атривающих монтаж системы из современных металл ополи мерных труб, заложено лишних десять метров "погонажа", но нет ни одной соединительной детали и крепления, стоимость которых весьма значительная. Деньги истрачены на ненужные трубы, а смонтироиать их нельзя. Потом аналогичная ситуация будет с канализацией, отоплением и вентиляцией. Проектировщики в ответ на претензии покажут ГОСТ, где написано "элементы трубопровода (отводы, переходы, тройники, крестовины, фланцы, болты, гайки, шайбы, прокладки) в Спецификацию не включают", и любая экспертиза их поддержи" (разве что заставит исключить лишние трубы, да еще с учетом места, занимаемого арматурой — тогда вы вообще не сможете списать затраты). А если количество таких позиций исчисляется тысячами штук? Конечно, толковые проектировщики, дорожащие заказами, да еще выполняющие проектные работы в частном порядке, проигнорируют неразумный стандарт и сделают все, как надо. Но и на них может "наехать" орган экспертизы, указать на нарушение стандарта и даже, под благовидным предлогом, а на самом деле — для устранения конкурента "дружественной" проектной организации, лишить лицензии на строительную деятельность. В подобной ситуации могут оказаться и проектно-строительные фирмы, осуществляющие нормальное современное проектирование и строительство "под ключ". Теперь поговорим о несоответствии компьютерным технологиям. Форма Спецификации содержит девять граф: И Графа 1 (Позиция) — позиционное обозначение (марка) оборудования, предусмотренное рабочими чертежами соответствующего комплекта. П Графа 2 (Наименование и техническая характеристика) — наименование и техническая характеристика оборудования в соответствии с требованиями государственных стандартов и технических условий. П Графа 3 (Тип, марка, обозначение документа, опросного листа) — тип, марка оборудования, обозначение стандарта, технических условий, а также (при необходимости) обозначение опросного листа. D Графа 4 (Код оборудования, изделия, материала) — код оборудования по Общероссийскому классификатору продукции (ОКП). 3 Графа 5 (За вод-из готов и те ль) — наименование завода-изготовителя для серийно изготавливаемого отечественного оборудования (для импортного оборудования — страна и фирма). П Графа 6 (Единица измерения) — обозначение единицы измерения. 3 Графа 7 (Количество). О Графа Я (Масса единицы) — масса единицы оборудования в килограммах. D Графа 9 (Примечание) — дополнительные сведения. В целом структура формы Спецификации пригодна для создания баз данных, в которых можно хранить как каталожную информацию, так и готовые Спецификации по конкретным объектам. Однако указания по заполнению граф (а особенно приме-
998
Часть IV. Разработка прикладных программ
ры составления Спецификаций) убеждают, что разработчики нормативного документа имеют смутные представления об информационных технологиях и сделали все, чтобы усложнить автоматизированную подготовку спецификаций. Введя понятную по названию графу Позиция, стандарт начинает запутывать проектировщиков, указывая, что в этой графе должны записываться позиционные обозначения (марки), а для изделий, не имеющих этого самого позиционного обозначения, уже в графе 2. перед их наименованием, следует указывать порядковый номер их записи в Спецификацию, да еще в пределах раздела. Вот на такие "крючки" и "ловили" снабжениев в "приснопамятные" времена! Вручную так писать можно, а формировать спецификацию автоматически — очень сложно. А ведь можно было сформулировать, что в графе 1 указывают "марки, порядковые номера и иные обозначения, предусмотренные рабочими чертежами". Да еще набраться смелости и добавить: "При соответствии позиций изделий в рабочих чертежах спецификации оборудования допускается не выполнять на листах рабочих чертежей спецификации установок и систем, предусмотренные соответствующими стандартами СПДС". Разъяснения по графе 2 еще более усугубляют положение. Многие стандарты предусматривают "многоэтажное" обозначение материалов и изделий, которое даже в текстовом процессоре MS Word трудно изобразить без подключения редактора формул или хитрого форматирования таблиц, например: Псшоса
5 х 50-В-2 ГОСТ 103-76
стЗпс1-и гост 535-ее
Много лет проектировщики мучились, проклиная авторов таких изобретений и вписывая замысловатые конструкции в строки бланков спецификаций. В базе данных наименование изделия будет храниться в одном поле в виде строки, обозначение — в другом поле. Заполнять автоматически тысячи подобных граф (да еще во множестве вариантов) просто невозможно. Недаром даже во включенных в МР 21.01-95 примерах составления Спецификаций нет ни одного, в котором изделие было бы записано в соответствии с текстом самого документа. Проектировщики, при необходимости указать полную техническую характеристику, часто1 просто пишут так, как показано в табл. 32.1. Такая запись облегчает и производство работ, т. к, на стройке нет никакой возможности иметь все стандарты дли расшифровки замысловатых обозначений. Таблица 32.1. Пример 1 Тип, марка, Наименование и техническая характеристика
Полоса стальная горячекатаная толщиной 5 мм, шириной 50 мм, обычной точностью прокатки, с серпов и дностью по классу 2 из стали марки СтЗпс, категория проката 1, группа проката 2
документа, опросного листа ГОСТ 535-88
Еще чаще пишут просто "Полоса 5 < 50", хотя мы бы рекомендовали всегда указывать подробные технические характеристики по принципу — "что стандарт зашифровывает, мы раскрываем". Не жалейте компьютеры, пожалейте прорабов!
Глава 32. Спецификации оборудования
999
Писать вручную множество раз такие длинные формулировки сложно, но можно воспользоваться предусмотренными стандартами способами сокращений повторяющихся к графе текстов. При использовании базы данных любой текст вручную набивается только один раз, при этом можно применять любую существующую запись л качестве прототипа. Еще одним образцом нетехнологичных заполнений граф является запись вентиляторов, имеющих различные варианты исполнений и комплектаций электродвигателями. В примерах составления Спецификаций имеются формулировки, одна из которых показана в табл. 32.2. Таблица 32.2. Пример 2
Позиция
Наименование и техническая характеристика
Тип, марка, обозначение документа, опросного листа
2. Вентилятор радиальный, исполнение 1,
ВР-Ц4-75.1-2,5-Л.05
диаметр колеса 1.1 Дном, положение Л О
4АА56А4
с электродвигателем 1375 об/мин. 0.12 кВт
TV 22-59-33-85
В этом примере два фрагмента полного наименования изделия (обозначение вентилятора и марка электродвигателя) перенесены в графу 3, перед наименованием, при пустой графе 1, проставлен пресловутый порядковый номер (при том, что именно вентиляторы обычно имеют позиционное обозначение, но уже в спецификации к установке, системы). Единое наименование разбито на несколько строк, при этом обычно марку электродвигателя стараются написать в той же строке, где приводятся его характеристики. Корни таких примеров растут из "древних" Рекомендаций ГПИ Сантехлроект, еше из "докомпьютерной эры". Похоже, что кое для кого время остановилось на месте. Разве трудно сообразить, что записывать такие изделия нужно примерно так, как показано в табл. 32.3 (заодно избавившись от спецификаций установок на листах). Таблица 32.3. Пример 3
Позиция
Наименование и техническая характеристика
61. 2
Вентилятор радиальный ВР-Ц4-75.1-2.5-Л.05, исполнение 1, диаметр колеса 1.1 Дном, положение Л 0 с электродвигателем 4АА56А4 1375 об/мим. 0.12 кВт
Тип, марка, обозначение документа, опросного листа ВР-Ц4-75.1-2,5-Л.05
Продолжим критику. Коды оборудования, заносимые в графу 4, были придуманы именно для механизированной обработки. По существу эти коды должны были бы 5ыть уникальными индексами, так необходимыми при обработке данных. Стесняясь признать тот факт, что конечная цель кодирования провалена, стандарт дает дели-
1000
Часть IV. Разработка прикладных программ
катную оговорку, что если "отсутствует информации по кодам ОКП, необходимая для заполнения графы 4, то эту графу не заполняют". Вот за это спасибо! Ушлые проектировщики, очень любящие всякие "если, нельзя, но очень хочется", "допускается", "если нужно, но не хочется", давно перестали заполнять эту графу, понимая ее бесполезность для практических целей. Продолжают заполнять те, кто по инерции "идет строем". Пусть бы была эта графа "про запас", но она занимает место, необходимое для расширения графы 3, т. к. существует множество обозначений документов, не вписывающихся в ширину этой графы, а правильный автоматический перенос их просто невозможен, а часто и недопустим. Графа 5 также выглядит ненужной. Наименование завода-изготовителя выглядит как атавизм плановой системы. В современных условиях логичнее выглядело бы название графы "Поставщик" (это, скорее всего, будет не сам завод, а оптовый продавец оборудования), хотя для некоторых изделий мог бы быть указан предпочтительный изготовитель. И последнее. Чрезвычайно нетехнологичной является и сама форма Спецификации. Разграфка на строки фиксированной высоты нужна только тем, кто пишет вручную. Ну и оставили бы ее для таких целей, но добавили бы заветное "допускается...", для автоматизированной подготовки. Различные формы основной надписи для первого и последующего листов Спецификации, взятые из общего стандарта на текстовые документы, очень неудобны для автоматизированного вывода спецификации на печать. Системы подготовки отчетов из баз данных просто не предполагают, что где-то еще не додумались до такой простой вещи, как единая форма всех листов. Конечно, выкрутиться можно, но с излишним усложнением программ. Для чего мы занимались бесполезной критикой действующего нормативного документа, который нужно просто исполнять? Да для того, чтобы предупредить молодых разработчиков, что бесполезно автоматизировать составление Спецификаций, придерживаясь буквы стандарта. Это просто опасно, особенно если попытаться заносить в базу данных записи, подобные описанию вентилятора по строкам формы, т. к. при любой сортировке база может быть испорчена. Не вздумайте использовать фафу Код оборудования для индексации баз данных — она, по большей части, будет оставаться пустой.
Обзор методик работы со Спецификациями Как же составляют спецификации оборудования при реальном проектировании? Не беремся отвечать за полноту обзора методик, но выделим несколько самых распространенных.
Ручное составление Несмотря на повсеместное распространение компьютеров, множество проектировщиков пишут Спецификации вручную. Это не их вина, а беда. Написать Спецификацию авторучкой при отсутствии хороших программ часто быстрее, чем С использованием плохих программ. Это позор всей нашей ИТ-отрасли1, а прежде всего тем, 1
ИТ — информационные технологии.
Глава 32. Спецификации оборудования
100?
кто командует проектированием и строительством. Разве трудно в масштабах страны продумать единую структуру базы данных оборудования, взять за основу (или поручить паре студентов-дипломников создать новую) одну из существующих программ, довести ее до блеска и бесплатно распространять среди всех проектных организаций? Бесплатно, но при условии, что все сформированные фрагменты специализированных БД будут передаваться в единый фонд для общего пользования. Увы, при современной политико-экономической ситуации это является утопией, Зачем "им" это надо?
Использование текстовых процессоров Во многих проектных организациях "рисуют" Спецификации с помощью таких "подходящих" программ, как MS Word. Это уже прогресс, но такой же, как переход от каменного топора к бронзовому, только в XXI веке. Получаются документы, отпечатанные "красивым шрифтом", можно использовать заготовки, шаблоны, буфер обмена и пр. Самое ужасное, что эту технологию иногда внедряют специалисты, обязанные заниматься автоматизацией проектирования, сводящие свою роль к подготовке шаблонов бланков спецификаций. Это уже позор для таких "специалистов". К пользователям претензий быть не может, они просто не понимают, как "дурят нашего брата" (чаще сестру). Вред таких решений в том, что информация в текстовых документах не структурирована, ее нельзя извлечь для использования в базах данных, к которым неизбежно придется переходить. В некоторых проектных организациях такая технология поддерживается на основании мифов о том, что заказчикам могут понадобиться спецификации, сделанные в MS Word.
Рисование в AutoCAD Выполняется также из-за того, что пользователям не предоставлено удобных средств. В системе AutoCAD удобно нарисовать и повторно использовать формы спецификаций или автоматически рисовать готовые спецификации, содержание которых наполнено в специальных программах — исключительно для формального соблюдения требований стандарта к форме Спецификации, Но написание текста спецификации вручную текстовыми примитивами системы AutoCAD — все тот же "пещерный век".
Использование электронных таблиц Подготовка Спецификации в программах, подобных MS Excel, большой шаг вперед, сопоставимый с изобретением колеса. В Excel можно и вести примитивную базу оборудования, и готовить прекрасные итоговые документы, и автоматизировать определение некоторых вторичных "количеств" — например, пересчет объемов тепловой изоляции при изменении протяженности трубопроводов. При правильной организации структуры таблиц (не так, как в табл. 32.1, а так, как в табл. 32.2} банк данных оборудования из Excel можно экспортировать в настоящие базы данных. Изворотливые люди успешно сочетают Excel и систему AutoCAD. Но при всей прогрессивности такой технологии, она остается "домашней", т. е. рассчитанной на личное пользование или на работу в небольшой группе.
1004
•
Часть IV. Разработка прикладных программ
Мы не будем зацикливаться на бесплодных попытках автоматизированного заполнения графы "Количество", а сосредоточимся на максимальном облегчении подготовки текста документации.
Организация банка данных по оборудованию, изделиям и материалам Итак, для составления Спецификаций необходим банк данных оборудования, изделий и материалов. Технические вопросы на современном уровне решаются достаточно просто, сложнее с организационными. Идея единого на всю страну банка данных осталась утопией. В одной проектной организации вести общий банк данных вполне реально. В прежние времена в проектных организациях существовали подразделения, занимавшиеся оборудованием {связи с заводами, коллекционирование "номенклатур", паспортов и чертежей), но они не имели почти никакою технического оснащения. Теперь все можно автоматизировать, но такие службы во многих организациях ликвидированы по экономическим причинам. Несомненно, эту глупость придется исправлять, но пока многие проектировщики вынуждены заниматься упоминавшейся ранее самодеятельностью. Играет роль и конкуренция внутри организации. Кто-то будет заниматься черновой работой по формированию банка, а кто-то будет "снимать пенки", используя чужой труд и хорошо при этом зарабатывая. Эта проблема решаемая, но при условии заинтересованности руководителей организации. Программные решения должны быть масштабируемыми и позволять работать любым способом — от "частных банков" у каждого исполнителя до единого на организацию. Во всяком случае, структура данных и программные средства должны быть унифицированными, чтобы в лучшие времена можно было объединить мелкие базы данных. Сразу следует забыть про милые детские глупости с Word и Excel. Более серьезные и популярные ранее решения с базами данных в формате -DBF или Paradox также лучше забыть — это уже прошлый век. Вполне возможно использование баз данных в формате Access с последующей миграцией на Microsoft SQL Server. СУБД масштаба Oracle нам не понадобится — с банком данных в объеме максимум в несколько десятков тысяч записей' справится любая система. Файл-серверную систему применять также не стоит — только SQL-сервер. Решения возможны разные, но в своей системе мы остановимся на клоне Firebird СУБД Interbase. Причины такого выбора: О сервер Firebird (по крайней мере, до грядущего объединения с другим клоном Interbase — Yaffiid) является бесплатным; П сервер очень прост и надежен в эксплуатации и пользователь может не подозревать о его деятельности; О Firebird можно установить на UNIX-сервере, с клиентами, работающими под Windows; Количество записей в сметных банках данных гто всей мыслимой номенклатуре работ не превышает миллиона.
Глава 32. Спецификации оборудования
/005
3 имеется специальная версия Firebird Embedded Sewer, позиоляюшая, положив рядом с основным приложением несколько DLL, работать с базами данных на локальной машине как через настоящий сервер, не изменив ни строчки Программного кода. Использование механизма SQL-запросов и приличного набора инструментальных средств для администрирования таких баз данных позволит импортировать данные из других источникон.
Структура базы данных Проектирование структуры базы данных — важнейший этап. В нашем случае важно не увлечься излишней нормализацией, столь любимой разработчиками баз данных. Создание базы данных Interbase мы выполняем с помощью великолепной программы IBExpert. He останавливаясь на деталях работы с этим продуктом, приведем только SQL-запрос для создания базы данных (листинг 32.1). Несущественные детали мы опускаем ради экономии места. ! Листинг 32.1. SQL-запрос для создания базы данных оборудования SET NAMES WIH1251; CREATE DATABASE 'RUSO.GDB' USER 'SYSDEA' PASSWORD 'masterkey' PAGE^SIZE 1024 DEFAULT CHARACTER SET WIN1251; /** * Гбнсрзторы *** СВЕЙТЕ GENERATOR GEN_DIC___PLANTS_ID; SET GENERATOR GEN_DIC_PLANTS_ID TO 200; CREATE GENERATOR GEN_DIC_UNITS_ID; SET GENERATOR GEN_DIC_UNITS_ID TO 11; CREATE GENERATOR GEN_OBOR_ID; SET GENERATOR GEN_OBOR_ID TO 1228; CREATE GENERATOR GEN_SC_FRAGMEHTS_ID; SET GEHERATOR GEM_SO_FRAGMENTS_ID TO 20; /**** Таблицы
**••/
/****
**../
Справочник заводов-изготовителей
CREATE TABLE DIC__PLANTS ( ID_P INTEGER NOT NULL, ID_PBRENT_P INTEGER, NAME_P VABCHAR(250} CHARACTER SET WIN1251, ADRESS VARCHAR(120| CHARACTER SET WIN1251, URL VARCHfiR (200) CHARACTER SET WIN1251
); /****
Справочник единиц намерения
CREfiTE TUBLE DIC^UNITS ( ID_U INTEGER NOT NULL, NAME UNIT CHAR(10j CHARACTER SET WIH1251 HOT HULL
*••»/
1006
Часть IV. Разработка прикладных программ
/•••• Таблица типовых фрагментов CREATE TABLE SO_FRAGMENTS ( ID_F INTEGER NOT NOLL, ID__PARENT_F INTEGER NOT NULL, NAME_F VARCHAR(5QO) CHARACTER SET WIN1251, POS_F VARCHAR(IO) CHARACTER SET WIH1251, CODE IN OBOR INTEGER NOT HULL /**** Главная таблица с CREATE TABLE SO_OBOR ( ID INTEGER NOT NULL, ID_PARENT INTEGER NOT NULL, HAKE_OBOR VARCHAR(500) CHARACTER SET WIN1251, TIP_OBOR VARCHAR(250) CHARACTER SET WIN1251, CODE_OBOR VARCHAR(20) CHARACTER SET WIN1251, ZAVOD VARCHAR(IOO) CHARACTER SET HIN1251, ED_:ZM VARCHAR(IO) CHARACTER SET HIN1251, KOL_ED NUMERIC(15,3), MASSA_ED NUMERIC(15,4), PRIM VARCHAR(IO) CHARACTER SET WIN1251', PHOTO_LINK VARCHAR(250) CHARACTER SET WIN1251, POS VARCHAR(IO) CHARACTER SET HIN1251 /**•*•* Просмотры *•***/ CREATE VIEW FKAGMENT ( HAME_OBOR, F_TIP_OBOR, F_CODE_OBOR, F__ZAVOD, F_ED_I2H, F_KOL_ED, F_MASSA_ED, F__PRIM, F_PHOTO_LrNK) AS select POS_F M ' ' I I HAME_OBOR, TIP_OBOR, CODE_OBOR, ZAVOD, ED_IZM, KOL ED, MSSSA_ED, РЙ1М, PHOTO_LINK from so__obor, so_fr3ginents where (so_fragments.code_ln_obor = so_cbor.id); /**** первичные ключи ***•*/ ALTER TABLE DIC_PLAMTS ADD CONSTRAINT PK_DIC_PLANTS PRIMARY KEY (ID_P); ALTER TABLE DIC_(JNITS ADD CONSTRAINT PK_DIC_UNITS PRIMARY KEY |ID__U) ; ALTER TABLE SO__FRAGMENTS ADD CONSTRAINT PK_SO_FRAGMENTS PRIMARY KEY (ID__F) ALTER TABLE SO__OBOR ADD CONSTRAINT PK_SO_OBOR PRIMARY KEY (ID); /**** Триггеры ****/ SET TERM "; CREATE TRIGGER DIC_PLAHTS_Br FOR DIC_PLANTS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN
Глава 32. Спецификации оборудования
ЮО?
IF (NEW.ID_P IE HULL) THEN NEW.ID_P = GEN_ID(GEH_DIC_PLANTS_ID, 1); EMD Л Trigger: DIC_UNITS_BI */ CREATE TRIGGER DIC_UNITS_BI FOR DIC_UNITS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.ID_U IS NOLL) THEH NEW.IDJ) = GEH_ID(GENJ>IC_UNITS_ID,1); EHD ^
/" Trigger: INS_OBOR_TRIGGER */ CREATE TRIGGER INS_OEQR_TRIGGER FOR 50_OBOR ACTIVE BEFORE INSERT POSITION 0 AS
begin new.iti = gen_id(gen_obor_id, II;
/" Trigger: SO_FRAGMENT5_BI */ CREATE TRIGGER SO_FRAGMENTS_BI FOR SO_FRAGMENTS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.ID_F IS NULL) THEN NEW.ID_F = GEN_IO(GEN_SO_FRAa«IENTS_ID, 1) ; END
ЗЕТ TERM;
/* Пояснения к полян */ DESCRIBE FIELD ADRESS TABLE DIC_PLANTS 'Адрес завода1; DESCRIBE FIELD ID_P TABLE DIC_PLANTS 'Код'; DESCRIBE FIELD ID_PARENT_P TABLE DIC_PLANTS 'Код предка'; DESCRIBE FIELD NAME_P TABLE DIC_PLANTS 'Наименование1; DESCRIBE FIELD URL TABLE DIC_PLM!TS 'Ссылка на сайт С номенклатурой1; DESCRIBE FIELD ID_U TABLE DIC_UNITS 'Код'; DESCRIBE FIELD NAME__UNIT TABLE DIC_UNITS 'Наименование'; DESCRIBE FIELD CODE^IHJDBOR TABLE SO_FFAGMENTS 'Код Записи в таблице оборудования' DESCRIBE FIELD ID_F TABLE SO_FPAGMEHTS'Код записи'; DESCRIBE FIELD ID_PAREHT_F TABLE SO_FRAGMENTS 'Код предка',DESCRIBE FIELD NAME_F TABLE SO_FRAGMEMTS 'Наименование1; DESCRIBE FIELD POS_F TABLE SO_FBAGMENTS 'Позиция в фрагменте'; DESCRIBE FIELD CODE__OBOR TABLE SO_OBOR 'Кол оборудования'; DESCRIBE FIELD ED_IKM TABLE SO_OBOR 'Изм'; DESCRIBE FIELD ID TABLE SO OBOR 'КОД';
1008
Часть IV. Разработка прикладных программ
DESCRIBE FIELD ID_PARENT TABLE SO_OBOR 'Код владельца'; DESCRIBE FIELD KOL_ED TABLE SO__OBOR ' Количество ' ,DESCRIBE FIELD MASSA_ED TABLE 5O_OBOR 'Масса ед.'; DESCBIBE FIELD NftME_OBOR TABLE SOJDROR 'Наименование оборудования'; DESCRIBE FIELD PHOTQ_LINK TABLE SO_CBOR 'Ссылка на файл с изображением'; DESCRIBE FIELD РОЗ TABLE SO_OBOR 'Позиция'; DESCRIBE FIELD PRIM TABLE SO_OBOR 'Примечание'; DESCRIBE FIELD TIP_OBOR TABLS 5O_OBOR 'Тип, марка1; DESCRIBE FIELD ZAVOD TABLE SOjPBOR 'Завод';
Напомним читателям, что мы уже сравнивали SQL-запросы в мире СУБД с выражениями AntoLISP в командной строке AutoCAD. Выполнив этот SQL-запрос, мы создадим базу данных InterBase с несколькими таблицами. Знатоки SQL наверняка сообразили, что на самом деле мы просто экспортировали из готовой базы данных ее структуру. Кроме того, видно, что вопреки теории баз данных у нас имеется дублированная информация — заводы-изготовители и единицы измерения заносятся в виде текстов, а не связок по кодам, и таблицы заводов и единиц измерения используются просто в виде справочников, облегчающих ввод повторяющихся данных. Для справочника заводов мы предусмотрели поля адреса и URL 1 , не требуемые в Спецификации, но облегчающие работу проектировщиков. По URL, например, можно прямо из программы перейти на сайт завода для уточнения номенклатуры. В основной таблице имеется поле ссылки на файл с изображением оборудования. Разве плохо, если "девочка" сможет но фотографии узнать, чем вентиль отличается от задвижки?
Разработка программы К сожалению, у нас нет возможности рассказать, как делается такая программа — наберется несколько глав, и все "не про AutoCAD". Как разрабатывать приложения, работающие с базами данных, написано во множестве книг. Мы остановимся на том, как должна работать такая программа. Программу подготовки спецификаций ruSO мы делаем в виде самостоятельного приложения. Она может работать и "сама по себе", но может быть запущена и из меню системы AutoCAD. При самостоятельной работе в niSO пользователь или пополняет базу данных оборудования, или формирует рабочую спецификацию, или делает это одновременно. После завершения формирования рабочей спецификации она может быть отпечатана прямо из программы в виде отчета, или может быть "нарисована" в AutoCAD, если "рисованная" спецификация больше нравится. В принципе, для такой программы даже не важно, как она сделана и с каким банком данных работает — можно даже вообще не иметь базы данных оборудования, а просто редактировать таблицы рабочих спецификаций, используя прежние разработки и прототипы. Взаимодействия с системой AutoCAD практически нет никакоURL — Uniform Resource Locator, унифицированный указатель информационного ресурса, т е. стандартизованная строка символов, указывающая местонахождение документа в сети Интернет.
Глава 32. Спецификации оборудования
1009
го, хотя при заполнении графы Количество возможно использование результатов полуавтоматического определения объемов работ. Имеется вариант программы, специально сделанный для "единоличников" — проек.тировщиков, предпочитающих вообще не связываться с коллегами, а все свое держать на собственном компьютере. Эта версия программу {рис. 32.1) вообще не использует единой базы данных, а все спецификации (рабочие, справочники, фрагменты и шаблоны) хранятся в одинаковых CSV-файлах (листинг 32.2). Файлы находятся в специальной ветви рабочего катачога, навигация по которой осуществляется так же, как и по каталогам классификатора слоев.
и Ч. [ , . - . .-...--..Ч.":
'
,,.-..
- I I , .
а! Счет* >овдно1. нль -л- «&<*!<*& ВО!- Л DH ^ реп-- Cft*-i шди'а'анм
В|Г~
|
•
'
D, K
D Ч 40. H
В] Клдин [ввнтмир] vreemft муртс** DH 25 1*^ Рч 1 г г] Труби стать-** «осгкароищтыв оиии- Оввпнь* 1 д| Tpjf
'иг*, .оен-.i-ib, M
Рис. 32.1. Упрощенная версия программы подготовки спецификаций оборудования
Пользователь открывает два окна, и одном из которых будет формировать рабочую спецификацию, а другое будет использовать как справочник оборудования. Рабочую спецификацию или ее фрагменты также можно сохранять в качестве справочников фрагментов или шаблонов. Преимущества и недостатки такого подхода примерно такие же, как и при формировании документов в текстовом редакторе с использованием множества файлов — опасность запутаться с большим количеством файлов при простоте единообразных приемов работы. Имеется определенное удобство в возможности синхронизации с другими компьютерами по датам обновления файлов — отыскать изменения в единой базе данных без специальных полей невозможно. У пользователя существует две возможности — иметь один или несколько больших справочников и долго выбирать в них нужные позиции или иметь много маленьких справочников в дереве каталогов
Часть IV. Разработка прикладных программ
1012
РИС. 32-2, Редаьггирование рабочей спецификации
Н.
шг
3 DTBIA Д* IffiDlD
D Ы 1*1 . ЭШв С"
ни "*,-"•»« Гм 1"2-шэотаэящэ<. л*ГЧД1В- (
I ГОС1 3 I ГОСТ -
Рис, 32.3. Просмотр рабочей спецификации в Total Commander
Очень удобно, что спецификацию в формате CSV можно просматривать с помощью очень удобного " Lister-pi ugin 1 " wlx_csv,wlx 2 для файлового менеджера Toial 1 2
plugin, plug-in — дополнительно подключаемый программный блок. ylIunorT.uarod.ru.
Глава 32. Спецификации оборудования
1013
Commander (рис. 32.3) простым нажатием клавиши . Так как у наших спецификаций будет нестандартное расширение ruso, в файле настроек wlx_csv.ini необходимо ИСПраВИТЬ строку ext=.csv; .tab; .ruso.
Формирование рабочей спецификации В самом примитивном случае рабочую спецификацию можно просто написать вручную, используя форму как электронный бланк. Таким образом поступают, пока базы данных оборудования вообще еще нет. В рабочую спецификацию можно вставить строки из другой спецификации или использовать готовую спецификацию в качестве прототипа. По мере формирования банка данных оборудования появляется возможность экспорта в рабочую спецификацию записей из основной базы данных оборудования отдельными записями, группами выделенных записей или целыми фрагментами. База данных оборудования отображается в виде структур про на иного дерева (рис. 32.4) или в виде таблицы. При необходимости базу оборудования можно на лету дополнять и изменять структуру дерева перетаскиванием узлов. В базе могут быть не только записи оборудования, изделий и материалов, по и типовые заголовки разделов. \№ rUCAD ' Подготовка специфнчацьи ойпрудппанив Фагп
Ppawa
Почк
&1Д
•• ' • " J
£ПЧВКН
Бан-flwwQ БааатаЙгчца| Сгчшцмацмр \ Фрагм»^*| Спраеочнчи* ] . На«^«>йна11яа60|Ч£1йваннргиминя PttlHdTCp смогите гц.чьЬ( wif^*ft*i HC 14Q-'08. 1 се-ичяО "Я^кЭт 7-£;е*и*к>1ны£'
' & Изолшыя '• « Обоснование Т да Тр^боГСсвШЬ.
Тип. мариа ГО.ГТ 6Б90 75
' -ф DB ,- ф Отопление < Л Кс-итдры *
i
Лм обор^овв«1я
£Л Р5Г1*ГТ1Я*
Завм-чэг-irrenTeib
,- ф Раичатось - ^ l-V*™*^e |£ Рчи*-лс(1 uraintemiMbHls^ryHi-itti^C'liO'lCie. ~\ a !t Радиатор огопигеи^члй чугу-sfcH МС140-Ш8. 1 о
. Eft идм
Ко™н*ство
'ид
!=. Рашнтос o7arnTCibHD*i чупрчьй kC-l4Q-lQ2 1 Q ^ Ргчинтар urarwrtiiinib* чугунный WC 1 JG'IQS 1 ci ' !•; Раш'атэротогытельны' '"jmiHbi^MC'lflD-IQej c»,"v fj. PaaMaTnDOTorwTenfibil ^п)нлыйМГ-*^>1Св, 1 с' f\J Рщиатср птогитечь'ый -чгиимыиМ^-' 411-1 J6r 1 d с. ^ бенгн.тчи"! "- ^ ВрмтипвТОрг* + ^ Раана/ьные
Zl
1
Масса щ и
000
°
1
ОООСС
Мллплраиа ms-140 gif
• (1 -
J
°-! *•
•-. ф ^едй;ДЙе'3^| - & Д*та^ *l f^H |
'
^am-си 3JD Ген влацеля1а |
(
^J
i
943
РИС. 32.4. Работа с базой данных оборудования
Значительно ускоряют работу типоные фрагменты — группы записей, физически находящихся в разных местах базы данных оборудования, но вносимых в рабочую
1016
Часть IV. Разработка прикладных программ
Для заполнения граф основной надписи программа подготовки спецификаций должна включать специальное диалоговое окно, представляющее урезанную версию Мастера, рассмотренного нами в главе 21. Данные для заполнения "штампа" сохраняются так же, как и у основного Мастера вычерчивания формата, что позволяет единообразно обрабатывать их в системе AutoCAD.
Рисование спецификации в AutoCAD Хотя вывод спецификации в виде отчета очень удобен, многие пользователи предпочитают нарисовать ее в системе AutoCAD, а потом мучиться с постраничной печатью. Преимущество этого метода только в том, что рисуется точная форма спецификации, автоматически создается требуемое количество листов, в которые вписывается текст рабочей спецификации и заполняются графы основной надписи. Рисование спецификации лучше выполнять в пространстве модели в отдельном файле. Масштаб чертежа лучше установить 1:1, а единицы рисунка — миллиметры, хотя все будет нарисовано пропорционально и при любых иных параметрах. Нарисованную спецификацию можно вывести на бумагу стандартными средствами AutoCAD, поочередно выводя на плоттер указанные рамкой лист.ы. От автоматического создания компоновок для каждого листа спецификации мы отказались, т. к. этот вариант пользователям не очень-то нравится, но значительно усложняет работу. Программу для рисования спецификаций мы рассмотрим далее.
Подготовка форм Для рисования спецификации нужны две формы — для первого и последующего листов. Формы спецификации оборудования мы нарисуем своей же программой рисования формата. "Местом жительства" для форм мы определим каталог %LocalData%\So\, в котором будут находиться файлы ni-so-first.dwg и ш-so-next.dwg. В этом же каталоге, при необходимости, можно размешать данные для упрощенной версии программы. Файлы форм включают атрибуты основной надписи — точно такие же, как и для программы рисования формата.
Общая схема работы Целесообразно подготовить две функции — для запуска одной из программ подготовки спецификаций и для рисования спецификации. Запуск программы можно выполнять в модальном режиме (дожидаясь завершения работы) или в параллельном процессе. На уровне меню мы традиционно будем загружать и выполнять короткие программы. Запуск упрощенной версии редактора спецификаций показан н листинге 32.3. | Листинг 32.3. Файл ru_so_edit_lt.lsp [defun START () (ru-app-beginl
Глава 32. Спецификации оборудования
)017
iru-so-run-app "ruSoCsv" t! (ru-app-end) (princ) I ; _ end of defun (START) Функция для запуска редактора спецификаций приведена и листинге 32.4.
i ;••;
| Листинг 32.4. Функция ru-so-run-app ! defun ru-so-run-app (exe_name is__modal / reason so_file so_key; (setq so_file (ru-file-dwgname-type ".ruso") so_key [ru-file-set-ext exe_name " " } exe_name [ru- file-bin exe_name) ) ;_ end of secq (if (findfile exe_name) (progn ; ; Записываем задание для программы (ru-ieg-write-tmp- string so_key "Result" so_file) ; ; Запускаем редактор спецификаций (ru-app-run exe_name is_modal! [if is^raodai (progn ; ; Выясняем причину выхода из программы Isetq so_file (ru-reg-read-tmp-string so_key "Result" so_file) reason (ru-reg-read-tmp-string so_key "ResultDial" "1") ) ;_ end of setq (if (= reason "1") ; ; Если был выполнен выход с рисованием спецификации, ; ; то рисуем спецификацию (ru-ao-draw-in-dwg so file) ) ;_ end of if i ;_ end of pcogn ! ;_ end of if ) ;_ end of progn (ru-msg-alert (strcat "He найден \n" exe_name) ) ) ;_ end of if [princ)
Программа для рисования выбранной спецификации оборудования без запуска редактора приведена в листинге 32.5. | Листинг 32.5. Файл ru_so_select_and_draw.lsp (defun START (/ so_file! [ru-app-begir.; (if (setq so_file (_ru-dlg-file
1018
Часть IV. Разработка прикладных программ "Выбор файла спе^фикации оборудования" (ru-user-work-dir) (getvar "DWGFREFIX") "*,ruso nil Г nil
};_ end of _ru-dl(j-file );_ end of setq (ru-so-draM-in-dwg (car so_file)) );_ end of if (ru-app-end)
(princ) I;_ end of defun (START)
Главная функция, рисующая спецификацию, приведена в листинге 32.6. Листинг 32.6. Функции ru-so-draw-in-dwg (defun ru-so-drau-in-dwg [so_file / lst_recocds block_ent first_block_ent left_top_pnt lst_columris_width number_page records) [if (findfile so_file) г,- Читаем файл спецификации (if (setq lst_recocds
(ru-table-conv-csv-to-string-list so_filel)
(progn
(setq nuinber_page 1 ;; Запрашиваем точку начала рисования left__top_pnt (ru-get-point-reguired "Верхний левый угол первого листа спецификации: " nil) ;; Список с размерами граф в миллиметрах на бумаге 1s t_c olumn s_width [list 20.0 130.0 60.0 35.0 45.0 20.0 20.0 25.0 40.0) ,•; Преобразуем список строк в список записей lst_records (ru-table-conv-records-to-s trings lst_records 1s t_co1umns_wi dth
records
[length lst_records)
),-_ end of setq ;; Пока не закончится список записей в спецификации (while (> records 0) ;; Рисуем требуемый бланк спецификации [setq block_ent (ru-яо-draw-forms left_top_pnt number_page) ,•; пишем порцию строк, входящих на страницу, и получаем остаток строк lst_records
(ru-so-draw-racordg left_top__pnt nuirber_page
lEt_cecords lst_coluinns_width) left_top__pnt (polac left_top_pnt 0(ru-conv-millimeter-in-paper-to-unit 430.01) records (length lst_records) );_ end of setq ;; заполняем основную надпись ;ru-ao-set-attribs block_ent numoer_page}
Глава 32. Спецификации оборудования
1019
;if (= nuinber_page (setq first_block_ent block_ent) ) ;setq number_page ( nurober_page ) ) ) ;_ end of while после рисования всех бланков (setq number_page (1- numberjage) ) заполнясы графу "Листов" на первом листе iru-block- change -attributes first__block_ent ;list (cons "ftLLPAGE" (itoa number_page} ) ; );_ end of tu-block-change-at tributes (princ (strcat "ХпГотово. Начерчено " (itoa r.umberjage J " листов \n") I !• ; end of progn ;ru-msg-alert "ОШИБКА; ru-tabie-conv-csv-to-stnr.g-list"! ! ,•_ end of if (ru-msg-alert (strcat "He найден \n" so f i l e ) ) ;
end of if
Результат работы этой функции показан на рис. 32.6.
• •VC -п_ ,*3 FMlnJ B«IJ • ! „ • IW1HI йг!НЬг.
ГИ-И ТЧ И-1-5И-И
-D1-BK
Рис. 32.6. Первый лист нарисованной спецификации оборудования
Наиболее значимые вспомогательные функции приведены Б следующих- четырех листингах (листинги 32.7—32.10).
1020
Часть IV. Разработка прикладных программ
Листинг 32.7. Функция ru-table-conv-csv- to- string- list [defun ru-table-conv-csv-to-st ring-list ( f ull_csv_f ile_nan\e / result x) ; ; ; Преобразование csv в список (foreach string (cdr [ru-list-read-f ram- file full_csv_file_name] I [setq result (cons
(mapcar '(lambda (х) (ru-string-rerri-all x (list " V " ' ) } ] (ru-st ring-to-list string ";") I ;_ end of mapcar result ) ;_ end of cons ! ;_ end of setq ) ;_ end of foreach [reverse result! ] ;_ end of defun i Листинг 32.8. Функция ru- table -conv-records- to- strings (defun ru-table-conv-records-to-st rings (lst_records lst_columns_width / column_index lst_field lst_fields_strj ng lst_substr max_stririgs_iri_row result) Преобразование списка длинных строк в список коротких строк с учетом переносов по словам. Каждая запись выравнивается по высоте до максимального количества подстрок
_ i1 1.
Iforeach record lst_records [setq max_strings_in_row
1
; ; это присваивание нельзя убирать ! 1 lst_fields_String '(} column_index 0 ) ;_ end of setq . ; -------- . ---- разборка каэщого по.':я ---------- _~-. ------------------
(foreach field record (setq lst_field (ru-string-division-into-syilables field (ru-conv-millimeter-in-paper-to-unit (nth со 1ипл_ index lst_calumns_width)
column_index
lst_fields_string I ;_ end of setq );_ end of foreach (setq result I append result
(H- со luran_ index)
(cons lst_field lst_fields_string)
Глава 32. Спецификации оборудования (ru-list-Douglas-wil son-transpose [ru-list-align-sublists-length (reverse lst__fields_5tring) ! ;_ end of append I ;_ enci of setq ) ;_ end of foreach result I ; end of defun Листинг 32,9. Функция ru-so-draw-forms (defun ru-so-draw-forms (ins_point nuirtoer_page / block_ent format^block ins_scale! (if (= nuroDer_page 1! (setq foimat_block "ru-so-first") (setq format_block "ru-so-next") ),-_ end of if (if (not (tblsearch "block" forrrat_block); [setq format_block (strcat (tu-dirs-get-local-app-data) "so\\" format_Dlock " , d w g " ) ) I [setq ins_scale (ru-conv-milliraeter-in-paper-to-unit 1.0! block_ent [ru-block-insert-obj £ormat_block ins_point ins_scale ins_scale ins_scale ) ,-_ end of ru-block-insert-obj );_ end of setq block_ent I; end of defun Листинг 32.10. Функция ru-so-draw-recocds (defun ru-so-draw-records (left_top_pnt number_page lst_records lst_columns_width / field fields nuirtoer_rows nuni__column page pnt txt_pnt) ;; пишет тексты и удаляет написанное иэ списка ;; Количество строзс на первом и послеяукших листах [if (= 1 number_page) (setq nurober_row3 21) (setq nuniber_rows 2 6 ) ! Isetq nijmber_rows (min nurober_rows (length l5t_records) ;
pnt ;; Высчитываем начало текста в графе "Позиция" (polac left_top_pnt 0 (ru-conv-millimetet-iri-paper-to-unit 2 2 . 0 ; ) pnt (polar pnt [cu-geom-go-right 0) [ra-conv-raillmeter-in-paper-to-unit 56.0! ) ; end of polar
1022
Часть IV. Разработка прикладных программ
niun_coluirai ) ;_ end of setq
О
(repeat number_rows I setq num_colurm 0 fields (car lst_records ) txt_pnt " 'pnt I ;_ end of setq [repeat (length fields I [setq field (nth nwi_column fields)) 1T (if (/= field ") (ru-text-draw field txt_pnt (ru-narmal-text-height) 0 . 0 NIL) ) ;_ end of if (setq txt_pnt (polar txt_pnt 0 ( r u - con v-mi 1 1 irae t e r - i n -pape r - 1 о -uni t [nth num_column lst_coluinns_width) ) ,-_ end of polar nuin_column (1+ num_coljj[in; ) ;_ end of setq ) ,-_ end of repeat : ; Опускаемся на строку ниже (setq pnt (ru-geom-txt-down-line pnt) (setq lst_recorcls (cdr lst__recordsl ) ! ;_ end of repeat lst_re cords ) ; end of defun
end of setq
Резюме Используя материалы этой главы в качестве постановки задачи, любой программист баз данных сможет разработать рабочую профамму — примеров кодирования мы не рассматривали специально. Приведенные функции рисования спецификаций оборудования с помощью системы AutoCAD можно, с небольшими изменениями, использовать и для рисования "угловых" спецификаций с применением базы данных спецификаций оборудования.
ru/CAD Г Л А В А 33
Элементы документооборота Без правильно организованного электронного (впрочем, как и без бумажного) доку1 ментооборота невозможна эффективная работа проектных организаций . Разумная организация работы с документами может дать больший эффект, чем автоматизация черчения. В большинстве проектных организаций, за некоторыми досадными исключениями, бумажные архивы проектов и иных документов (типовых проектов, серий, СНиП, паспортов оборудования) и системы работы с ними были органшованы на достаточно высоком уровне. К сожалению, при массовой компьютеризации про электронные архивы такого уже сказать нельзя. Электронный документооборот (не только в проектных организациях, но и в органах власти) находится в зачаточном состоянии. Руководители проектных организаций еще не поняли достоинств и недостатков современных информационных технологий — иначе они не пускали бы все "на самотек". По-прежнему "главным" считается бумажный оригинал, переданный в бумажный архив. Не вдазаясь в юридические проблемы с лештимностью электронных документов — они уже решаются на законодательном и практическом уровне, и в социально-экономические аспекты, мы рассмотрим элементарные технические решения, позволяющие пусть не устранить беспорядок, но дать возможность наведения порядка. Разумеется, в рамках нашей САПР невозможно разработать настоящую систему электронного документооборота, но некоторые простейшие элементы, способствующие улучшению организации работы с документами, мы рассмотрим. В основном это будут задачи ведения и использования электронного архива чертежей.
Что требуется исполнителю Любой исполнитель, работающий на компьютере, держит у себя собственный архив разработок, прихватывая еще все чужое, "что плохо лежит". Л так лежит практически все. 1
Напоминаем, что мы рассматриваем САПР для строительною проектирования, и совершенно не будем касаться организации документооборота в конструкторских «рганизаимях машиностроительного профиля, а также "канцелярского" документооборота и систем подготовки производства.
1024
Часть_1У. Разработка прикладных программ
Исполнителю требуется не так уж много: П иметв порядок в личном архиве; I] знатв, что и где взятв в доступном общем фонде. Вспомним, зачем мы обычно обращаемся к традиционнвш архивам. Обычно требуется решить следующие задачи: О посмотреть архивный экземпляр проекта во время разборок с заказчиками и строителями; D подобрать подходящий проект для повторного применения; О использовать готовый проект для разработки каких-то новых вариантов; О повторно применить отдельные технические решения. Изредка возникают и более сложные задачи — например, составление по готовым проектам каталогов и технико-экономических показателей для быстрой предварительной оценки потребности в ресурсах и сметной стоимости. Исполнители заинтересованы во внедрении систем электронного документооборота и электронных архивов, прежде всего для наведения порядка на собственном компьютере. Многие, просто по незнанию, хранят файлы где попало, иногда не могут разыскать файл, сохраненный час назад. В главе 3 мы уже рассуждали о размещении файлов и папок на компьютере пользователя, И предусмотрели некоторые средства для облегчения ведения собственного архива. Электронный архив организации можно создавать по аналогичным принципам, но с учетом требований безопасности. Из обших архивов все хотят брать материалы, но не все хотят их пополнять. При переходе на другую работу (иногда в конкурирующую фирму) все наработанные материалы разумный исполнитель непременно заберет с собой, а все, что было на прежнем месте — постарается уничтожить. Ведь это за ним "не числится". Его заставят разыскать и сдать давно утерянные книги, СНиП и сам компьютер, но никто и не вспомнит об информационных ресурсах, которые гораздо пеннее компьютера.
Что требуется руководителю Многих руководителей сохранившихся (или бывших) государственных проектных организаций архивы интересуют только в ииде площадей, которые можно было бы сдать в аренду. Электронный архив для них вначале интересен, как способ освободить место, но после того как становится ясно, что "загнать в компьютер" накопленные за десятилетия материалы быстро не удастся, интерес к электронному документообороту пропадает. Руководители организаций "нового" типа, наоборот, действительно заинтересованы в электронном документообороте. Во многих таких фирмах работа с момента образования выполнялась на компьютерах, бумажные архивы еще небольшие и выполняют роль хранилища юридических документов. Реальная работа все чаще ведется с электронными документами. Руководитель заинтересован в результатах работы всей организации, и в этом смысле его требования к архивам должны быть более высокими. Основные дополнительные требования заключаются в следующем:
Глава 33. Элементы документооборота
1025
3 н электронный архив должны поступать все готовые проекты; П доступ к электронному архиву должен производиться с учетом политики безопасности; И псе электронные проекты должны быть признаны информационными ресурсами, со всеми вытекающими последствиями. Решить эги дополнительные задачи трудно — требуется подкрепление организационно-техническими мероприятиями. Разработать и утвердить стандарты предприятия но э т и м вопросам несложно, сложнее добиться их исполнения. Важнейшим для реализации должно быть простое условие — не "закрывать деньги" исполнителям, пока все материалы в требуемом виде не будут переданы в электронный архив. Многие проектировщики не подозревают, что в соответствии с федеральным законодательством информационные ресурсы являются имуществом и должны ставиться на учет. Это требование практически нигде не выполняйся, г. к. такое имущество возникает как бы ниоткуда (за исключением случаев покупки), а любое имущество должно быть оценено в денежном выражении и за него должны платиться налоги,
Что мы уже нечаянно сделали Хотя мы не разрабатывали специально систему документооборота, у нас имеется много решений, способствующих ее внедрению в будущем: D разработан стандарт приемов работы для строительного проектирования и все программы написаны так. чтобы обеспечить техническую поддержку его соблюдения; ~3 предусмотрена единообразная информация о свойствах каждого DWG-файла, а накопление такой информации позволит в будущем программно обрабатывать файлы и помещать сведения о них в базы данных системы документооборота; Э имеются функции извлечения свойств внешних файлов — соответственно, несложно сделать и функции поиска файлов по свойствам, в то числе в сочетании с имеющейся функцией поиска по атрибутам файла; ~3 предусмотрено ведение комментариев к папкам и файлам в "человеческом" виде, которые значительно облегчают разбирательства с файлами и могут быть использованы при формировании баз данных; 3 разработан классификатор слоев, позволяющий единообразно именовать слои и устанавливать для них единые свойства; П предусмотрен! .•iv.cn.. .. - [роверки размешени; объ . : . - . . рядочивания слоев;
о
юя!
л
упо-
3 предусмотрено программное заполнение основных надписей по специальным стандартам, с сохранением данных в файлах .иля последующего учета в системе до куме нтооборота. Конечно, этого мало, и необходима большая работа по созданию собственной системы документооборота или интеграции с покупными системами. Пока мы разработаем еще несколько дополнительных решений.
33
З.чв S3 Ч
Часть IV. Разработка прикладных программ
1026
Организация архива электронных калек В электронном архиве можно и нужно хранить готовые проекты "как есть", сжатые специхтьными программами-архлшаюрами. В такой архив должны включаться не только DWG-файлы, но и вспомогательные — файлы комментариев, основных надписей и т. п. Но пользоваться такими материалами не очень удобно. По нашему опыту использования геоинформашюнных технологий (см. главу 34) очень удобно использование так называемых электронных калек. Электронная калька — это отдельный слой, сохраненный в виде файла в один из подкаталогов специальной папки, размещенной, как правило, на общедоступном диске (рис. 33.1). Непременным условием для всех электронных калек одного проекта является расположение точки вставки в начале мировой системы координат, при этом с началом МСК должно совпадать характерное место изображения в пространстве модели (пересечение осей, угол здания и т. п.). Для топографических планов и основанных на них рисунках начало мировой системы координат совпадает с местной системой координат населенного пункта. При работе с калькам и-слоям и выполняются следующие операции: D запись выбранных классифицированных слоев в соответствующую папку архива: О выбор из архива калек-слоев и вставка в активный документ в виде внешних ссылок (всегда в пространство модели, и точку с координатами О, О МСК. на слой, соответствующий слою кальки);
,-v
Рис. 33.1. Пример слоя-кальки с планом канализации
Глава 33. Элементы документооборота
1027
сохранение, редактирование и загрузка именованных наборов калек, обеспечивающих быстрое формирование изображения из слоев, вставляемых в требуемом порядке (рис. 33.2).
Рис. 33.2. Пример набора калек
Более подробно эти операции булут рассмотрены далее при pajpa6oTKe функций для работы с архивом.
Организация архива типовых проектных решений Электронный архив типовых проектных решений (ТПР) предназначен для хранения любых рисунков, которые можно использовать повторно. По сути, это просто упорядоченный и комментированный набор файлов, которые можно вставлять и вид; блоков. Но такой архив не должен превращаться и и обычную свалку. Попадать в него должны рисунки высокого качества, разбитые по темам и вытащенные из реальных проектов. Например, я ТПР не стоит помещать чертежи здания со всеми слоями, этажами, планами, разрезами, но можно поместить планы типовых секций различных серий (каждый этаж отдельно, рис. 33.3), компоновки насосных, тепловых пунктов, различные узлы (рис. 33.4).
1023
Часть IV. Разработка прикладных программ
Рис. 33.3. Типовое проектное решение плана этажа
Рис. 33.4. Типовое проектное решение водомерного узла
Глава 33. Элементы документооборота
102Э
Формирование архива ТПР должно производиться с \ четом технической политики, проводимой II организации. Типовое решение, применяемое в одной организации, может оказаться предметом критики в другой. Файл, помещаемый в архив ТПР, также должен соответствоиать следующим необходимым требоианиям: 3 обязательно сопровождаться комментариями; Э иметь словесное описание точки вставки; D иметь описание единиц рисунка для автоматического масштабирования при вставке; О по возможности не включать масштабируемые символы и размеры. Основные операции при работе с архивом ТПР сводятся к помещению файлов в архин и выбору из архива со вставкой в виде блока и будут рассмотрены далее.
Архив топографических планшетов Такие архивы используются в немногих проектных организациях, используют их геоинформаиионные технологии, поэтому мы ладим о них только краткую справк>
Рис. 33.5. Электронный топографический планшет
1030
Часть IV. Разработка прикладных программ
В архиве планшетов содержатся файлы электронных топографических планшетов. Каждый файл размещается в каталоге со строго определенным именем, и сам имеет имя, формируемое по определенному алгоритму. Правила именования каталогов и файлов зависят от принятой в населенном пункте системы разграфки плана местности (существует несколько известных нам систем). Каждый электронный планшет (рис. 33.5) отображает квадратный фрагмент плана местности определенного размера (например, планшет масштаба 1:500 — 250x250 м). включает весь набор классифицированных слоев и имеет точку вставки, совпадающую с началом местной системы координат территории. Планшеты могут быть нарисованы с использованием средств топографического рисования niCAD, но могут включать и растровые подложки. Технологии создания планшетов можно посвятить целую книгу. В архив планшеты попадают после тщательного контроля в индивидуальном порядке. Работа проектировщика, имеющего доступ к архиву планшетов, заключается в формировании сводного плана несколькими способами; И указанием точки на плане: П указанием прямоугольника; О указанием известных номеров планшетов. При любом способе в рисунок вставляются в нужное место требуемые планшеты, обнаруженные в архиве. Программ для работы с планшетами в этой книге мы приводить не будем.
Функции для работы с электронными архивами Для работы с электронными архивами нам потребуются несколько функций. Начнем с электронных калек-слоев. .
Замечание Все функции для работы с электронными архивами, помимо блокировки на уровне меню, проверяют права пользователя на соответствующие действия.
Как записать кальки в архив Для записи калек напишем соответствующую программу (листинг 33.1). 1
-
| Листинг 33.1. Файл ru_doc_hrefjayer_save.lsp (defun start (/ __layers_list _dialo3__list _selected_list _enabled_list __comments_lo.st __save_layer __select_layers folder folder_coinraent i) .; Локальная функция ;defun make lists {/ comment)
;
Глава 33. Элементы документооборота
Поставляет списки для зывсда в диалоговое окно. Допускается отметка толькс классифицированных слоев (setq __la.yers_list (ru-obj-list-iayers) ) [foreach layer _layecs_list (if (ru-layer-is-standard layerl isetq _enabled list (coris t _eriabled__list: _selected_iist (cons t _jselectea_list; comment (ru-layer-read-cotment layer) _comm.ents_list (cons comment __cornments_list; i ; _ end of setq ;setq _enabled_list (cons MIL __enabled__liST:) _selected_l:-5t (cons NIL ^_selected_list) corment "Нет в классификаторе" _comnent5_list (cons coiranem: _concr.ents_list; i ;_ erid of setq
! ; _ end of if ;; Кокментарга! для отображения (setq _dialog__list (cons (if ', = comment " ") layer {strcat layer " [" correr.ent " ] " ) ) ; _ end of if _dialog_list !;_ end of cons !;_ end of setq ) ;_ end of foreach (setq _enabled_list (reverse _enabled_list) _dialog_list (reverse _dialog_J.ist) _coiaraer.ts_list (reverse _ccnnnent£_list) _3elected_list (reverse _selected_list; i ,-_ er.d of setq i ;__ end of defun ;; Локальная фушщия выбора &юеЕ в диалоге (defun _select_layers <) isetq _selected_list ;ru-dlg-show-check-list "Отбор калек слоев для записи в архив" _dialog__list _s ele cted_l1st _enablea_list ) ; _ end of ru-dlg-show-check-list };_ end of ш-cilg-user-show-check-List !;_ end of defun ;; Локальная функция сохранения слоя в файл (defun _saver layer (layer comment dir / selection file_name file infc l i s t ;
1031
1032
Часть IV. Разработка прикладных программ
(if (and (setq selection (ssget "_X" (list (cons 8 layer)!)) ,•; Внешние ссылки ке сохраняем (setq selection [ru-ss-exclude-xref selection)) );_ end of and (progn (Setq file_name [strcat [ru-dirs-path-anqi-slash dir) layer ".dwg" );_ end of Strcat );_ end of setq ;if (findfile file_name) [progn (setq file_info__list (dos_file file__name) ) (if (not (ru-no (strcat "Файл \n" [nth 0 file__info_list} [if (/= comment " " I [strcat "\n [" comment "1" ) ; _ end of strcat (;_ end of if "\пСоздан " (nth 2 file_info_list) " в " (nth 3 file_info_listl ", размер " [nth 1 f i l e _ i n f o _ l i s t ) " Сайт" "ХпУже существует!" "ХпПереписать" );_ end of strcat );_ end of I ;__ end of not ;if (dos_openp file_name) (ru-fflsg-alert [strcat "\пфайл " file_name "Хпсейчас нельзя переписать, он открыт!" 1;__ end of strcat ) ; _ end of ru-msg-alert (progn Iprinc (strcat "ХпЗаписьшаю " file_narne "\n") ) (command "_.WBLOCK" file_naine "__Y ' "0,0"
selection ""),-
end of command
Глава
33^
Элементы
документооборота
(EU-file-write-dirinfo-file-cororoent f;le_name comment) Iprinc "\nOK\n") ! ,-_ end of progn
! ;_ end of if I ;_ end of if ) ;_ end of ptogn (prcgn (princ (strcat "ХпЗаписыЕаю " file_naine " \ n " ) ] ; Command "_.WBLOCK" file__name "" "0,0" selection "") (ru-file-write-dirinfo- file-comment £ile__name comment) (princ "\r,OK\n") ) ;_ end of progn ) ;_ end of if ) ;_ end of progn (strcat "\!1Слой " layer " не содержит примитивов входящих в кальки" ) ;_ end of strcat ) ;_ end of princ ) ;_ end of if ) ;__ end of defun ----- Главная функция (ru-app-begin) ;if (and (ru-user-act ion-enabled "РОТ_1ДУ" tl (setq folder (ru-dlg-archive-layers-folder) ) (setq folder_coroment [ru-dirs-read-dirinfo-dir-comment folder) ) ) ;__ end of and (if (ru-yes (strcat "ХпОткрыта ПАПКА: " folder_conment "ХпКаталог папки: " folder "ХпЖелаете записать кальки в эту папку" I ;_ end of. strcat ) ;_ end of : progn (ru-user-write-last-param "acchive__layers_folder" folder } ;_ end of ru-user-write-last-param ; Создаем списки слоев для вывода в диалоговом окне (_make_lists) ; Выводим диалог для выбора сохраняемых слоев [if (_select_layers) (progn ; Устанавливаем мировую систему координат (command "_.UCS" "__«"] (setq i 01 ; Сохраняем отмеченные слои (foreach iayei; _layers_list
_
1033
1034
Часть IV. Разработка прикладных программ (if [nth i __selected_list; [__save__layer layer (nth i __comments_list)
folder;
i ; _ end of IE [setq i [1+ i) ! i ;__ er.d of foreacfi г ; Восстанавливаем систему координат ieoirraana "_,UC5" "_P": i ; _ end of progn ) ; _ end of if i,-_ end of progn );_ end of if ) ; _ end of if !ru-app-end) (princ) I , - _ end of defuri (start)
Эта программа выводит дихтоговое окно выбора архивной папки для сохранения калек (рис. 33.6), затем, после подтверждения записи калек в эту папку (рис. 33,7). выводит список слоев (рис. 33.8), в котором доступны для отметки только стандартные классифицированные слои. После отметки экспортируемых слоев кальки записываются в архив. Вывел папки о архиве пачек
Г-1 ^J Сети
oGB
^ Транспарт _J Проекты
:- ^п
^ Лсрсги О Жилые -" '_3 Заевд=| 1
Запчасти
Пэ^з: Оптсанме: |Еодосмайжемие и -.амагин^ацид
Отроен*
i
Рис. 33.6. Выбор лапки в архиве калек Господин Командой, прошу ответить
^* J
Откршта ПйПКА; Водосмаб^емие и кйлали^а^^р Катара- папки: C;\OotuniertSdnd Settingi\AU Uses^ApplkatBn Dat Желаете s b капели в зту п
л^
И"
Рис, 33.7. Подтверждение выбора папки
1035
Глава 33. Элементы документооборота 1 Отбор канем сидев для дамся в арцив Р_ГП_Сети_ГСН_Гаэопро&(ц1_В £_ги н и Р ГП_С«и ГСН_Гз»провп^_ Д_' Р1гП_Сгги"ГСН_Газопровщ_С Д. lu Р ГП_Сети_ГСН 06opfn_iu P_rn_CeiHTCHJX3_ru Р_ГП_С*ти„Н В К_В oionpjl лам_ I раесыJ« 3 .ГП_Еии.НВ |;_8свопр_Плаи_Т рассы_В 1JU Р_ГГ|_От-и_Н8К_е щ«»_П яан_1 р«сы_В 2_ru = ГП Сети НИ ('анализ План Tpami K1 шГТпжсыШ
Отмена
!
Рис. 33.8. Отбор слоев для записи в еиде «апек
Как взять кальки из архива Для вставки одной или нескольких калек из архива напишем программу (листинг 33.2), вставляющую отобранные кальки в виде внешних ссылок. ; Листинг 33.2. Файл ru_doc_hrefjayer_insert.lsp (defur. START (/ files_list: Iru-app-begin) (if (rn-user-action-enabled "GET_IAY" tl (if (setq filas_list ;ru-dlg-file-3elect-dwg-multi "Выбор калек" {cu-dirs-archive-layers-dir) (ru-user-iead-last-pacam "acchive_layers_£older" [ru-dirs-archlve-layers-dir) ) ; _ end of ru-user-read-last-param [ru-usec-action-enabled "PUT_LfiY" nil) } ; _ end of ru-flie-dwg-rnulti-select ) ; _ end of setq [foceach fn files_list (ru-block - insert-xref-f corn-archive fn) );_ end of if ) ; _ end of if ! ru-app-end: (princl 1;_ end of defun ; START) Вставка каждой кальки производится с помощью функции, приведенной в листин-
ге 33.3.
1036 Е
Часть IV. Разработка прикладных программ
Листинг 33.3. Функция ru-blodc-insert-xcef-from-archive
;dofun rii-block-insert-Kref-from-arcUive (full_name / xref_name comment) [if ( f i n d f i l e full_nainei (progn (setq comment (ru-file-read-dirinfo-file-comment
full_name}
) ; _ ond of setq (princ (3treat "\пП0ДОждите, вставляю \п " full__name (if (/= cowmen'-, "") (st-rcat "\n u " comment ),-_ end o£ sticat
),-__ end of if "\n" ) ;__ end of strcat !; _ end of princ (setq xref_name (ru-flie-unique-name full_name)) i.ru-xraf-detach xref_name) !ru-xref-attach full__narae xref_:ianie) i;_ end of progn i p r i i L C (strcat "\riHe найдена калька " full_narae " \ n " } } ) ;__ end Of if xref_name ) ; _ _ end of defun
У нас может оказаться несколько калек одноименных слоев, но вставляемых из разных папок. Для предупреждения конфликтен разработана специальная функция (листинг 33.4), генерирующая по полному имени файла уникальную строку, используемую при вспшке и отображаемую i; стандартном диалоговом окне Xref Manager (Диспетчер внешних ссылок) как Reference Name (Имя). I Листинг 33.4. Функция ru- file-unique -name [defun ru-file-unique-name (file_/ian-,e ' i code) ;setq i 0 code 0) [repeat (strlen file_namel isstq i (1+ i]) [setq code (+ code (* (ascii {siibscr filename i 1)! i ) ) } i ; _ ynd of repeat iitoa code)
Вставка внешней ссылки производится иссгда в пространство модели при установленной мировой системе координат (листинг 33.5).
Глава 33. Элементы документооборота _
1037
Листинг 33.5. Функция ru-xref-attach ;defun ra-xref-attach (file_name ref__name / old_layer) ,setq old_layer (getvar "CLAYER")) [command "_.UCS" "_И"1 (ru-layer-current (rith 2 (dos_splitpath file_name)} ) : vla-a t tachex t e rnalre fe rence (ru-obj-Qet-n^odel-gpaciB) file лапкз ref riame [vlax-Bd-point ' ( 0 . 0 0.0 0 . 0 ) ) 1.0 1.0 1.0 0.0 :vIaK-false );__ end of vla-BttachExternalRefererice iconnr^nd "_.DCS" "__P") (cu-layer-cutrent old_layer) );_ end of defun Отсоединение ьнешней ссылки осуществляется функцией ru-y.ref-detach (листинг 33.6), предусматривающей предотвращение ошибок при попытке отсоединения несуществующей ссылки. . Листинг 33.6. Функция ru-xref -detach :
-
ч
А,
(defur. ru-xref-detach (name) :| Примеры: He сущее т вукща я [ru-xref-detach "1133177"! вернет nil "уществукщзя [ru-xref-detach "1406S97") вернет Т I; [if {vl-catch-all-error-p ;vl-catch-all-apply ' (lambda ( ) {vXa-detach (vla-item (ru-obj-get-blocks) name );_ end of vla-item );_ end of vla-detach );_ end o£ lambda );_ end of setq !;_ end of vl-catch-all-error-p nil };_ end of if
! ;__ end of defun
Как использовать наборы калек Сохранение набора калек производится программой, приведенной и листинге 33.7 Листинг 33.7. Файл ru_doc_href_iayer_set_save.lsp [defun START (/ archive_layers_dit file file_natne set_file__name ncef list Kref Iist2!
^
J038
_
Часть
IV.
Разработка
прикладных
программ
(if (ru-user-action-enabled "PUT_LftY" t) (if (setq xref_list (ru-xref-liat-with-path) ] [if (setq xref_list2
;I Используем диалоговое окно с двойным списком, в котором можно не только сформировать результирующий список, но и изменить порядок его элементов, т. е. s какой последовательности слон будут впоследствии вставляться в рисунок (ru -dig- file-dual -select -by-note "Отбор внешних ссылок для сохранения в наборе" "Имеются в рисунке" "Поместить в набор" ) ;_ end of ic_SelectList ) ;_ end of setq ;if t s e t q Eet_file_name (_ru-dlg-file "BbiOop или создание набора калек" (setq archive_layei:s_dij: (ru-dirs-archive-layers-dirl ) !ru-user-read-last-param "archive_layers folder" (ru-dirs-atchive-layers-dirl ) ; _ end of ru-user-read-last-param "*.rulset" "" nil Т Т ) ;_ end of _ru-dig-fiie ) ;_ end of setq (progn ;setq set_file_name {сиг set:_file_nainej 1 ;if (setq file (open s e t _ f i :e_name "w") ; i progn : ; пишем список ссылок в файл ( for each file_name xier_list2 [princ (strcat ПрооВразуем полисе имя в относительное ,ru- string- trim-prefix archive_layers_d.ir (car f ile__nsme :• i "W I ;_ end of strcat file } ,-_ end of princ };_ end of foreach :setq file (close f i l e ' ; (princ "\пготово! " i ) ;_ end of progn (ru-msg-alert (strcat "Нельзя записать файл\п" set_file__name) ) };__ end of if ) ;_ end of progn ( ru-msg-alert "Файл набора не выбран!"; ) ; end of if
Глава 33. Элементы документооборота
1
1039
iru-msg-alert "He выбран список сохраняемых ссылок!") ,-__ end of if
(ru-msg-alert "Нет? внешних ссыпок для сохранения!") ),-_ end о£ if
I ; _ end of if [princ} ) ; _ _ end of defun (start]
Открыть типовой набор калек можно с помощью программы, приведенной в листинге 33.8. ! Листинг 33.8. Файл ru_doc_href_layer_set_restore.lsp (defun START !/ archive_layers__dir file files_list s set_file_name; ;if fru-user-action-enabled " GET_1AY " T) (progn (if
(setq set filename ;_ru-dlg-file "Выбор набора калек" (setq archive_layers__dir (ru-(Jirs-archive-layers-die)) (ru-user-read-last-param "acchive_layers_folder" (tu-dirs-archive-layers-dir) !;_ end of ru-user-read-last-param ""•. tulset" "" nil (ru-;iser-actior.-ensoj ed "P'JTMAY" nil! nil ) ;_ end of __cu-dlg-f ils ! ;__ end of setq [progn (setq Eet_Iile_naine (car bet_file_naraei ; !if (setq f i l e (open set_file_name " c " ) ) [progn (while (setq s (read-line f i l e ) ) (if (/= s " " ) (pcagn [setq s (ru-atring-trim--leEi: я 1 I (if (/= (substc s 1 1) ";"! ;; пропускаем ^а^омменггиро1чан1-1ые [setq files_list (cons S files^list))
) ;__ end of if } ; _ end of progn l ; _ end of if ) ; _ end of while Iclose f i l e ) ;; Реверс для вставки е обратном порядке (foreach fn (reverse files_list) (ru-blcck-insert-Kref-from-archive (strcat archive layers_dir fn)
1040
Часть IV. Разработка прикладках программ !;_ end of ru-block-insert-xref-from-archive i ; _ end of fcreach ;princ "\лГотово!") I,-_ end of progn (ru-msg-alert (strcat "Нельзя прочитать файлЛп" set__file_rianLe;I
);_ end of if );
end of pregn
l ; _ end of if );
end of progn
i ; _ end of if (princj };_ end of defun (START) Отредактировать, при необходимости, набор калек можно и помошыо программы, приведенной в листинге 33.9. Листинг 33.9. Файл ru_doc_href_layer_set_edit.lsp (def-jn START (/ archive_layefE_di;r f i J e f i l e s _ l i s t s set_file_nairie xref_list2) r i f (ru-usec-action-enabled "p(JT_LAY" T'. (progn [if (setq set_file_name (_ru -dig-file "Выбор набора калек лття редактирования" [setq archive_layer?_di:" (ru-dirs-archive-layers-diu) ; (ru -user- read- las t-parajn "ar chi ve_l aye r s_ f о 1 de r " (ru-dirs -archive-] ay=rs-dir; I ; _ _ end of ru-user-read-last-parair. "*.rulset ...... ni! [ru-user-action-enabied "PUT^LAY" n i l ) nil ) ;_ end of __ru-dlg-file l ;_ end of setq :piogn (setq set_file_name (cat 5et_file_name) ; [if (setq file (open set_f il e_name "r") ) [progn [while (setq s (read-line i l l s ' ;
(if
(/= s •"•) (progn (setq s (if
(ru-string-Lri7r,-left s) )
(/= (SUbstr E :
l'i
";"}
(setq files^list (cons (strcat archive layers dir s)
Глава 33. Элементы документооборота
files_iist ) ;_ end of cons i ;_ end of setq ) ; _ end of if ; ;_ erd of progn ) ;__ end of if i ; _ end of while : close file) ; ; Реверс для вставки Б обратном порядке (if (setq xref_list2 (tu-dlg-file-aual-seleot-by-note "Отбор калек для сохранения в типовом наборе" "Уже имеются в наборе" "Оставить в наборе" 1
;_ end of ru-iilg- f i l e -dual-select -by- note I ;_ end of setq !if (setq file (open sst_Eile_ name "w" ) ) (foreach file_name xref_list2 (princ (strcat [ru-st ring-trim-prefix
ал ch i ve_l а у е г 5_di r (oar fxle_name) i ;_ end of ru-string-t rim-pee fix "\n" ) ;_ end of Strcat file i ; ^ end of princ ) ;_ end of foreach !cu~n>.sg-alert (strcat "нельзя записать файл\п" set_file_ftame) ! ) ;_ end of if ) :_ end of if ) ;_ end of pcogn ;ru-msg-alert (strcat "Нельзя прочитать файл\п"
! ;_ end of if : ;_. end of progn
I ;_ end of if i ;_ end of proqn
1 ; _ end of if [princl ) ;_ end of defnn (START) Присоединить капьку к рисунку можно с помощью программы, приведенной в листинге 33.10, а удалить {"вернуть в архив") — с помощью профаммы, приведенной 13 листинге 33.11
1042
Часть IV. Разработка прикладных программ
\ Листинг 33.10. Файл ru_doc_href_insert.lsp (defun START (/ comment ent file_name layer xref_naroe) (ru-app-begin) (if [not (ru-no (strcat "ВНИМАНИЕ!"
"\пДоСэвление кальки сделает ее постоянной частью рисунка'" "ХпКалька будет добавлена в расчлененном виде," "\пс возможностью редактирования входящих в нее примитивов!" "\г.Раэмер рисунка увеличится, а слой кальки НЕ БУДЕТ обновляться!' "\пДействительно хотите добавить кальки" );_ end of strcat );_ end of ru-msg-no I,-_ end of not [progn [while (setq ent (ru-get-entsel-by-cype "Выбери добавляемую кальку" "Это не КАЛЬКА" (list "INSERT"} Т ] ;_ end of ru-get-eritsel-by-type );_ end of setq [setq ent (car ent) ) (if (ru-block-is-xref ent) Iprogn (setq xref_name (cdr (assoc 2 (entget entl) ] file_name (cdr (assoc 1 (tblsearcti "BLOCK" xref_name) ) I comment (ru-file-read-dirinfo-file-comment file_name} layer (ru-xref-short-layer-name xref_naitie) !;_ end of setq (redraw ent 3)
(if (ru-yes (strcat "Добавить кальку\п" comment "\n " file__name "\П а слой " layer J;_ end of strcat );_ end of ru-yes (progn (redraw ent 4) [ru-xref-detach xref_name) (command "_.INSERT" (strcat "*" file_name| (list 0.0 0.0) "1" "0" );__ end of command (princ "ХпГотово!") );_ end of progn
Глава 33. Элементы документооборога
1043
(redraw ent 4) ),-_ end of if t ; _ end of progn (princ "ХпЭто НЕ КАЛЬКА!") ) ;__ end of if ;;_ end of while );_ end of progn ) ; _ end of if ;ru-app-end) (princl ) ; _ end of tie fun {START]
Листинг 33.11. Файп ru_doc_rtref_delete.lsp [defun START (/ comment ent file_name xref_name) (while (setq ent (ru-get-entsel-by-type "Выбери возвращаемую кяльк.у" "Это не КАЛЬКА" (list "INSERT"} Т };_ end of ru-get-entsel-by-type ) ; _ end of setq (setq ent (car ent)] (if. (ru-block-is-xre-f ent! ; progn [setq xref_narae (cdr lassoc 2 (entget e n t ) ) ) file_name (cdc (assoc 1 (tblsearch "BLCCK" xrefjiamej i j comment (ru~file-read-dirinfo-file-comment file__na!ne! ) ; _ end of setq (redraw ent 3) ;ru-yes (street "Вернуть кальку\п" comment "\пв " file name)! (progn [redraw ent 4! (ru-nref-detach xref_name) (princ "\nroTOBQ!"1 j ; _ end of progn [redraw ent 4) i ; _ end of if ) ; _ enu of progn (print "\пЭто НЕ КАЛЬКА!"! ) :_ end of if : ;_ ena of while ,princ) ) ; _ end of defun (START) V,
Кроме приселенных программ, возможно ведение списка "любимых" наборов и калек, но рассматривать эти программы мы не будем — реализация их очевидна.
1044
Часть IV. Разработка прикладных программ
Работа с типовыми проектными решениями Запись типового проекта в специальный каталог производится с помошью программы, приведенной Bj-шстинге 33.12. Листинг 33.12. Файл ru_doc_project_save.lsp (defun start (/ 1st ptojects_dir file_name comment) (if (ru-user-action-enabled "POT_PROJ" T l ( i f (ru-yes (strcat "\ВНИМАНИЕ!" "ХпТиповой проект предназначен для повторного использования." "ХпЗаписываетсч в специальную папку архива," "Хпсопровогаается комментарием." '"•пБудем делать типовой проект" ) ;__ end of strcat ) ; _ end of ru-msg-yes Iprogn (setq projects_dir (ru-dirs-archive-projects-dir)] (if (setq 1st (ru-block-write-block "Имя файла для записи типового проекта" (ru-user-read-last-param "LastProjectsDir" projects__ditl pjrojects_dit
) ) ; _ end of setq iprogn [setq file_name (car 1st) comment (cade 1st)) ; ru-user-writs-1ast-param "LastProjectsDir" (ru-file-path file_naine) !;_ end of ru-user-write-last-pa rain [ru-dugprops-file-edlt file_name (list (cons 300 (rtos iru-scale-model))) [cons 301 [ru-ur.it-narnel) ) ; _ _ end of list I,-_ end of ru-dwgprops-file-edit ;; Загрузить записанный файл для просмотра и правки (if [ru-yes
(strcat "ХпЗаписан типовой проект " file_name "\nc комментарием '" comment "'\n\n3aгрузить его для просмотра?" !;_ end of strcat ) ; _ _ end of cu-msg-yes ; I Открываем записанный файл в другом окне. |; (ru-dwg-open-file filename)
i ; _ end of if !;_ end of ptogn
;;
end of if
Глава 33. Элементы документооборота
__
_
1045
: ;_ end u£ progn
i ;_ end of if 1 ; e:iLi of i f ,pnnc! I ;_ end of defun ( STAPT )
Непосредственная запись файла производится с помощью функции ru-biock-wri-eЬ1ос>: (листинг 33.13). Эта функция записывает блок Б файл, ныбираемый или создаваемый i! -заданном каталоге. Листинг 33.13. Функция ru-block-writs-block (defun ru-block-write-block (caption start_dir root_dir / base_point comment £ile_naine note_base_point selection} : : возвращает список из имени записанного файла и коилентария ' p r i n i : "\пЖдите, загружаю н а в и г а т о р , . . " )
(ru-dlg-f i le-select-or-new-dwg caption Etart_dir root_dir ,.,. T ) ! ;_ end of satq (progr, •:sei:q file_narae (car file_natriei connynt (ru-file-cead-dirinfo-f ile-co:nir,ent file_name! i ;__ end of 5etq (princ "\пВибор объектов для записи:\п") iif ( a e t q selection (ru-ss-get-or-ssfirst j ) ;progn [setq basejoint (ru-get-point-reguired "Базовая точка для последующих вставок" r.i 1)
! ;__ end of setq I ru-block -write -with- comment file_nanie comment base_j>oint selection T) ) ;_ end of progn ! ;_ end of if ilist file name comment) i ;_ end of pxogn nil i ,-_ end of if ) ;_ end of defun
В листингах 33.14 и 33.15 приведены функции, почиоляющие записывать или перезаписывать блоки в файлы с комментариями. Листинг 33.14. Функция ru-ЫосХ-write-with-comment (defun m-block-Mrite-with-comment (file_narae comment base_point selection is ass rewrite / file info list rewritel
1046
Часгь IV. Разработка прикладных программ
(if (and (findfile file_name) is_as.<_rewtite) [setq file_info_li3t ;dos_file file_narne] rewrite (not (ru-no (strcat "Файл \n" [nth 0 file_info_list) (if (/= comment "") (strcat "\n [" comment };_ end of strcat );_ end of if "ХпСоздан " (nth 2 file_in£o_list| " Б " !nth 3 file_info_list) ", размер " (nth 1 file_info_list) " Сайт" "\пУже существует!" "ХлПереш-сать" ),-_ end of strcat ) ;_ end of 1;_ end of not );_ end of setq (setq rewrite T) l ; _ end of if :if rewrite :ru-block-rewrite-with-comment file_na.Tie comment base_point selection) ) ;_ end of if ) ; end of defun
Листинг 33.15. Функция ru-blodc-re"r±te-wj.th-comaent ;defun ru-block-rawrite-with-conraent (file_naine comment base_point selection) [if (dos_oper.p file_nan\e) [progn (ru-msg-alert (strcat "\пфайл " fiZe_name "Хпсейчэс нельзя переписать, он открыт!" I) nil I ; _ end of progn [progn ;princ (strcat "ХпЗаписываю " file_name (if (/= comment " " ) (strcat "\n [" cerement " ] " ] ) "\n") ) [command "_.ИВЮСК" file_name) (if ( f i n d f i l e file_namel (conrnand "_y") ) (command "" base_point selectior. ""; ;rL:-file-write-dicinfo-file-comraent file_name comment; t
Глава 33. ^Элементы документооборота
Т047
);_ end of progn ) ;_ sr.d of if
);_ end of defjn Функция открытия файла (листинг 33.16) пригодится нам не только для типовых проектов.
—
}•
I Листинг 33.16. Функция ru-dwg-open-file
(aefun ru-dwg-open-file (dwg_file! i| Открывает DWG-файл в AutoCAD зерсии 15 и старше как в однодокументном, так и многодокументном pexiwe ;if (= 0 (getvar "S3I")) . i_ . ^
..
.
Для многодокументного режима (SDI=OI открываем новый документ в новом окне. Сохранять открытые не нужно ;vla-activate (vla-open (ru-obj-get-docs-collection| d w g _ f i l e ) ) iprogn .i_ * I
Для однодокументного режима (SDI=i) нужно позаботиться с сохранении открытого документа (if (r.ot (equal 2 (logand 2 [getva:: "QAFLAGS"))) ; (setvar "QAFLAGS" (+ (getvar "QAFLAGS") 2))! (if (not (equal 4 (logand 4 'getvar "QUFLftGS")i)} {setvar "QAFIAGS" {+ (getva; "QAFLAGS") 4)}) Мы использовали биты переменной CA бит 0=1 Снимает выселение "ручек" (аналогично ESC! Бит 1=2 отменяет паузы при вьшоде текста на экран 5ит 2=4 запрещает вывод диалогового окна функции alert [command "_.ОРШ"} ;;; Проверяем, не изменялся ли текущий рисунок ;;; -л, если изменялся - передаем опцию "Yes", дескать, сохраняй {if (not (equal 0 {getvar "DBKCD");) (command "_y"!; (coituTrand dwg_£ile) ;;; и теперь, пока работает команда OPEN, ,•;; на все возможные запросы даем пустой ответ ( w h u l e (wcmatch (getvar "CMD:IA^ES") "'ОРЕМ*"! (Т (coiranand "" ) } ! ; _ end of while [setvar "QAFLAGS" 0: );_ end of progn ! ;_ end of if i ; er.d of def un
1
1048
Часть IV. Разработка прикладных программ
Выбор и вставка типового проектного решения Вставить файл ТПР несложно, но нужно показать его свойства (это не заранее известный блок из меню). Реализуется программой, приведенной в листинге 33.17. Листинг 33.17. Файл ru_doc__project_insert.lsp Idefun START [/ file_name projects_dir) (ru-app-begin) (if (ru-user-action-enabled "GET_PRGJ" т; (progn 'setq projects_dir (ru-dirs-archive-projects-dir)I (princ "ХпЖците, загружаю н а в л г э т о р . . . " ! (if
[setq file_name (ru-dlg-flie-select-or-new-dwg "Выбор типового проектного решения" (ru-user-read-last-para.-n "LastProjectsDir" projects_dirl projects_dir "" nil ) ; _ end of ru-dlg-file-select-or-new-dwg I ; _ end of setq : progn
:ru-block-insert-project (car filejiame) ] (ru-user-write-last-param "LastPco^ectsDir" [ru-file-path (car filename}) ] I ) ; _ end of if );_ end of progn !;_ end of if !ru-app-end) [princ) );_ end of defwi (START)
Непосрелственно перед встаикой выбранного файла (листинг 33.18) мы получаем из него список свойств, показываем и диалоговом окне (рис. 33.9, листинг 33.19), вычсняем единицы ТПР, правильно масштабируем и позволяем выполнить множественную вспшку блока. : Листинг 33.18. Файл ru-block-insert-project.Isp (dafun ru-block-insett-project idwg_7iarrie / note__base_poirit dwg__props scale unit)
(if (findfile dwg_narae) (progn [setq dwg_props (ru-dwgprops-obj-get-frora-file dwg_nanie) ) (ru-dwgprops-file-show dwg name dt.'g_ [if (setq note_base_jioint [cdr (assoc 302 dwg_pro?5|) );_ end of setq
Глава 33. Элементы документооборота _
_
__
[setq note_base_point (ru-string-right-part note_base— point "=" ; : 1 ;_ end of if [if (setq unit (cdr (assoc 301 dwg_props); ! ;_ end of setq Isetq unit (ru-string-right-part unit " = " ) ) ;if (ru-yes (strcat "Д.7Я выбранного типового проекта '" " ' \пне указано название единиц рисунка!" "\пПринять единицу рисунка '" [ru-unit-name; "' (как в текущем)" I ,-_ end of strcat ) ;_ end of ru-msg-yes [setq unit (ru- unit-name) ) [if (= (ru-unit-name) "м") (setq unit "MM") Isetq unit "м") ) ; _ end of if ) ;_ end of if ) ;_ end of if
(if i= unit "м"} (setq scale (ru-conv-meter-to-unit 1) ) (setq scale (ru-conv-millimeter-to-unit 1)1 ) ;_ end of i f
[if note_base_point [princ Istccat "ХпИзвестное описание точки вставки ТПр : ' " not e_b a s e_po i n t •>'\п" } : _ end of stvcat i ;_ end of ptinc ) ;_ end of if [ru-block-multi-insert-scaleci-rotated-or-angleask dwg_narae scale scale nil 1 !• ;_ end of progn (princ {strcat "\nHe найден " awg_name] i } ,•_ end of if
| Листинг 33.19. Файл ru-dwgprops-file-show.lsp ( d e f u n ru-dwgprops-file-show {caption dwg_props) (setq dwg_props (ru-dwgprops-test-list dwgjiropsl) [ru-dlg-double-list caption "Переменная" "Значение" [raapcar ' i: u - dwgp r ops-rus-name-by-code (rnapcar 'car [mapcac '(lambda (xl {tu-string-right-part к "="}}
1049
Часть IV. Разработка прикладных программ
1050 [mapcar 'cdr dwg_props) );__ end of mapcev Т ) ; _ end of ru-dlg-double-list ) ; end of defun
Пео?г"5нная Название Тема Автор Заметки Ключевые слои М1 Ед рис /-„.г.
^х^ачение Проба проекта КругвТПР Зуее
|*|
Ш
•
Рис. 33.9. Просмотр свойств типового проектного решения
Работа с DWF-файлами Начиная с версии AutoCAD R13, фирма Autodesk внедрила ^мечательное решение для публикации чертежей — формат DWF (Design Web Format). На момент написания этой главы действует версия формата DWF6. DWf'— это формат файла для стандартизированного описания базированных на векторах, рисунков и иллюстраций. Поскольку DWF имеет обобщенный векторный формат, а не использует структуры данных создавшего его приложения (например, AutoCAD), то обеспечивается независимость от приложения. Совместимость обеспечивается посредством установки общего, расширяемого синтаксиса для обмена графическими данными между приложениями, генерирующими рисунки, и приложениями, читающими DWF-файлы. В формате DWF данные могут храниться как в текстовом, так и в двоичном виде. Имеется метод сжатия данных, который минимизирует дублирование геометрической информации. Например, исходный файл формата DWG с планом территорий г. Кургана имеет размер 2,4 Мбайт, файл формата DWF с этого рисунка имеет размер 0,54 Мбайт. Очень удобно, что DWF включает в себя механизм для присоединения данных любого вида (с помощью накладывания связи или операции вложения). Поддерживается вложение URL-гиперсвязей в данные рисунка. Это позволяет использовать очень интересную возможность — навигацию по смежным DWFфайлам и даже по базам данных. Например, в исходных DWG-файлах геоинформационной системы к объектам плана города мы, программным путем, привязывали расширенные данные вида "КОД_БД\КОД_ТАБЛИЦЫ\КОД_ЗАПИСИ". Информация об объекте хранится в базе данных, при работе с DWG-файлом специальная программа при указании на изображение объекта выводит в специальном диалоговом окне информацию из базы данных по этому объекту. При экспорте DWG-файла в DWF-формат в нем сохраняются все гиперссылки. Из базы данных экспортируются данные в формат HTML,
Глаза 33. Элементы документооборота в одном из двух вариантов — один файл со всеми записями или много файлов с одной записью в каждой. В автоматически генерируемый DWF-файл для объектов привязываются автоматически генерируемые URL 1 . В результате при размещении DWF-файла на Web-странице возможен просмотр информации по объекту при щелчке по его изображению. Если информация в базе данных может изменяться часто и нерационально публиковать ее на статических страницах, то этот же DWFфайл при изменении обработчика события onNavigate может обращаться за актуальной информацией непосредственно к базе данных, размещенной на удаленном сервере. DWF-файлы быстро загружаются и просматриваются. Панорамирование и зумирование выполняются практически мгновенно. DWF. в отличие от DWG, не предоставляет все данные файла рисунка широкой публике. Это означает, что рисунок в формате DWF можно просматривать (в лучшем случае, отпечатать), но нельзя редактировать. В DWF не попадает информация, находящаяся на отключенных слоях. Ваша интеллектуальная собственность надежно защищена.
Создание DWF Вначале DWF создавали командой AutoCAD DWFOUT (ЭКСПОРТВ), которая имела несколько простых опций. Это было очень удобно для автоматического создания DWF. По мере развития формата DWF и его возможностей фирма Autodesk перешла к изготовлению DWF-файлов путем выаода на виртуальный плоттер. Вывод на плоттер позволяет использовать множество тонких настроек и получать превосходные DWF-файлы 1 . Команда DWFOUT еще использовалась в AutoCAD 2002, но это была уже не "настоящая" команда, а оболочка-эмулятор, написанная на LISP3 и фактически "вычисляющая" имя файла конфигурации плоттера; в AutoCAD 2004 от нее уже отказались (заменили на команду PUBLISH (ПУБЛ)). Недостаток вывода на плоттер заметен программистам, т. к. нельзя программно задать все требуемые параметры, можно только подготовить одну или несколько конфигураций плоттеров. Для создании DWF-файлов могут быть использованы и отдельные инструменты. устанавливаемые независимо от системы AutoCAD. Особенно интересен появившийся в феврале 2004 года драйвер принтера для Windows Autodesk DWF Writer. Использование драйвера стандартного принтера позволяет создавать DWF-файлы из любого приложения. Недостаток мы пока видим в том, что в таком DWF не поддерживаются слои (даже если вывод производится из системы AutoCAD). Однако это позволяет создавать и хранить копии различных документов в едином формате "только для чтения", что очень удобно для систем до кумен TOO борота. В самой же системе AutoCAD имеется стандартная команда PUBLISHTOWEB (ОПУБЛИКОВАТЬ), позволяющая легко создавать HTML-страницы для публика1
2 3
Uniform Resource Locator (URL, гиперссылка) — это строка специального вила, вставляемая Б документ и позволяющая программе просмотра (такой, как Internet Explorer) при щелчке no URL открывать ресурс, на который ссылается URL. Отличный пример — &Acad20G4&\Sample\Welding Fi\ture-l.dwf. %Acad2M2%\Support\Legacy\DWFOut\dwfout.lsp.
1052
_Часть IV. Разработка прикладных программ
ции чертежей. Программа рассчитана на неподготовленных пользователей, которые с помощью Мастера смогут и создать DWF-файлы, и разместить их на страницах. Генерируемые страницы имеют непритязательный дизайн, но технически написаны грамотно. Для изменения дизайна страниц можно просто откорректировать шаблоны таблиц стилей, страниц и скриптов, находящиеся в папке %Acad2004% \ UserDataCache\Te mplate\PTWTem pi ates. Автоматически генерируемые страницы являются хорошим пособием для изучения технологии публикации чертежей.
Просмотр DWF Просмотр DWF возможен несколькими программами. Самой удобной, на наш взгляд, является Autodesk Express Viewer, имеюшая, кстати, русскоязычный интерфейс 1 . Больше возможностей имеет программа Volo View (поддержка стилей печати, пометок в документах, трехмерных видов и вращения по орбите), но это уже коммерческий продукт. Недостаток программы Autodesk Express Viewer нам видится п том, что ее авторы от версии к версии идут по традиционному пути все большего наполнения программы излишними возможностями, но этот недостаток компенсируется наличием хорошо документированного интерфейса прикладного программирования (API) 2 , позволяющего создавать собственные программы просмотра.
Использование DWF Мы используем DWF-файлы очень широко: О для публикации В Интернете электронных карт; П для публикации проектов; О для предъявления заказчикам на предварительный просмотр выполненных проектов3; П в качестве "этикеток" к DWG-файлам.
Об DWF-этикетках Прикиньте, как часто вы загружаете DWG-файлы в AutoCAD только для того, чтобы их посмотреть. Наша предыдущая система BesllA автоматически делает к каждому рисунку так называемую "этикетку" в виде DWF-файпа. Файловый навигатор BestIA, с помощью которого открываются файлы, имеет средства для просмотра этикеток Это позволяет избежать загрузок рисунков в AutoCAD.
Как создать DWF на LISP В книжную версию системы ruCAD мы не включили функции для создания "DWFэтикеток" к рисункам — исключительно ради экономии места. Программно экспортировать чертеж в DWF-формат можно функцией, приведенной В листинге 33.20. [ 2 3
1
www.autodesk.ru/adsh/bervlet/index?siteID=87173(i&id=3S )3406. ww»3.autodesk.com/adsk/files/343190 l_Aulodesk_F,j;press_Vicwer_APIO.zip. При заключении договоров на перыычу прост ных материалов п члектроином виде мы перелаем заказчику проект в пиле DWF. Заказчик знакомится с проектом, оплачивает работы, после чего получает DWG-файлы.
Глава 33. Элементь! документооборота
1053
Листинг 33.20. Функция ru-dwf -plot ( d e f u n ru-dwf-plot
(config_file plot_file /
;setq plot
plot orgqem)
(via-get-plot (ru-obj-get-active-docurnentl ]
orgqem (vlax-get-property plot "QuietErrorMode") );_ ena of setq (vlax-put-property plot "QuietErrorMofle"
:vlax-true)
(vlax-invoke plot "plottotiile" plot_file c o n f i g ^ f i l e ) [vlax-put-property plot "QuietErrorMode" orgqem) ) ; _ end of defun
Аргументами функции являются имена файла конфигурации и выходного DWFфайла. Все хитрости настройки находятся и файле конфигурации, создаваемом стандартными средствами системы AutoCAD. Подобную функцию можно встроит!, и любую программу.
DWF или PDF? Довольно часто возникают вопросы о том, в каком формате сохранять документы для публикации или для передачи заказчику — в рассмотренном нами формате DWF или в формате PDF фирмы Adobe. Формат PDF в последние годы стал своеобразным стандартом для публикации документов. Фирма Adobe бесплатно распространяет программу просмотра PDF-файлов, продвигая тем самым коммерческие продукты для создания файлов такого формата. Документы в формат PDF обычно выводятся через драйвер принтера. В некоторых бесплатных продуктах имеется возможность экспорта в формат PDF. Фирма Autodesk, конечно, заинтересована во внедрении своей технологии. Используя систему AutoCAD, мы легко, без дополнительных затрат, можем экспортиронать данные в DWF, к тому же сохраняя важнейшие параметры исходного чертежа слои, именованные виды, координаты объектов, компоновки листов. Вот еще некоторые технические подробности {табл. 33.1) для файла willhome.dwg . Таблица 33.1. Сравнение технологий DWF и PDF DWF
PDF
Размер файла, Кбайт
89
1624
Время создания, сек.
.
г- .
Показатель
Размер дистрибутива программы просмотра. Мбайт Пределы разрешения, точек на дюйм Скорость рендеринга (файл sascalch32.dwg). сек.
usa.autodesk.com/adsk/senlet/mde\?sitelD=123m&id=35I3485
2
15,3/8,7
15-60000000
72-4 000
0,1
7
/054
Часть IV. Разработка прикладных программ
Проверить эти данные фирмы Autodesk в части формата PDF мы не можем, т. к. не собираемся специально покупать программу для создания PDF. Это, пожалуй, главное преимущество формата DWF для пользователей системы AutoCAD - "родной" формат, создаваемый "родной" программой. Один из бесплатных драйверов печати в PDF-формат для файла Welding Fixture-l.dwg создал PDF-файл очень хорошего качества, но размером 19,943 Мбайт, тогда как размер Welding Fixture-l.dwf такого же качества — 653 Кбайт, Эти характеристики мы привели для того, чтобы в возникающих иногда спорах о достоинствах или недостатках технологий спорщики оперировали не понятиями "нравится", "стандартнее", "есть на каждом диске", а количественными и качественными показателями.
Резюме Рассмотренные кратко технологии позволяют на базе нашей системы создать и систему документооборота. Ну, пусть не на нашей базе, а на базе какого-нибудь "дорогущего" решения, "проталкиваемого" системными интеграторами, но мы уже даем инструменты, способствующие наведению хотя бы элементарного порядка в электронном чертежном хозяйстве.
ГЛАВА 34
j[
CAD
Интеграция САПР и ГИС Эта глава появилась в книге, посвященной разработке САПР на базе системы AutoCAD, не случайно. Многие разделы проекта (генплан, транспорт, инженерные сети) разрабатываются на топографической основе. Естественно, что разработчикам этих разделов проекта, помимо средств для рисовании своих изображений, нужно иметь и актуальную электронную топографическую подоснову. Чаще всего электронный план приходится или "доставать" (иногда незаконными методами), или сканировать имеющуюся топографическую основу и рисовать поверх полученного растра. При наличии дигитайзера возможна оцифровка топографических планов с помощью этого устройства (в прежние годы применялись и "шаманские" приемы "сколки" подосновы с помощью измерительного инструмента и ойшеизвестных заклинаний). В то же время существует параллельный "мир ГИС", о существовании которого специалисты "мира САПР" часто не подозревают. А в этом параллельном мире, где широко используются компьютерные карты и планы, также не могут решить вопросы с получением достоверной информации. САПР и ГИС просто обречены на слияние этих двух технологий. Что такое ГИС Упрощенно'' seoинформационную систему (ГИС) можно определить как комплекс электронных карт2 и баз данных, в котором любые объекты, изображенные на карте, связаны с информацией, относящейся к этим объектам и описывающей их свойства. В простейшем случае каждому картографическому объекту ставится в соответствие строка таблицы (запись в базе данных) с атрибутивной информацией.
Город, как известно, начинается со стройки, а стройка — с проекта. Все, что в городе проектируется, когда-то (пусть с отступлениями от проектов) будет построено. Пользователям ГИС необходимо знать не только то, что в городе есть, но и то, что
' Определений термина ГИС существует примерно столько, сколько ученых занимаете» этой течатикой. г Карпами, в общих рассуждениях о ГИС, мы будем называть и собственно карты — изображения земной поверхности с учетом формы Земли, и планы, не учитывающие кривизны поверхности планеты.
Ю56
Часть IV. Разработка прикладных программ
будет (а зачастую и то, что было). Следовательно, данные проектов, по крайней мере в части генплана и коммуникации, должны сразу попадать на планы ГИС в слои класса будет, по мере реализации генпланов переноситься (с фиксированием реального состояния) в слои класса сейчас. Помимо очевидного эффекта от координации проектных решений (о. сколько же выявляется неувязок, при совмещении проектои на едином плане!), от интеграции САПР и ГИС пояапяются дополнительные преимущества, а именно: проектировщики получают возможность работать на готовой электронной топографической подоснове, а банк данных ГИС интенсивно пополняется новой информацией.
Возможности ГИС ГИС позволяет отобразить любой участок местности (от карты мира до плана здания или помещения) в требуемом виде с необходимым набором видимых слоев. ГИС позволяет выбрать для отображения только интересующие в д а н н ы й момент картографические слои, задать удобный порядок наложения этих слоев друг на друга, отобразить их на экране в удобном масштабе и желаемой картографической проекции, визуализировать на экране интересующий фрагмент карты, если вся карта не помешается на экране, вывести на карту пояснительные надписи или. наоборот, убрать их. ГИС позволяет, указав объект на карге, получить ответ на вопрос "Что это?". При этом будет выведена описательная информация объекта из базы данных (такая, какая туда "заложена", в том числе, при необходимости, в виде фотографий). ГИС позволяет, выбрав по каким-либо условиям объекты в базе данных, получить ответ на вопрос "Где это?". При этом будут указаны объекты или их местоположение на карте. ГИС позволяет выбирать объекты по различным пространственным критериям (удаленность, нахождение в заданном контуре, круге и т. п.). ГИС позволяет легко определять площади, расстояния, объемы сооружений, выполнять различные расчеты, например, последствий аварии на химически опасных объектах с отображением результатов на карте. ГИС позволяет составлять различные тематические карты с отображением, например, районов области различными цветами и штриховками в зависимости от какогото параметра (рис. 34.1). ГИС различного уровня могут использоваться как для управления регионом, так и для производственных задач на уровне предприятия или даже отдельного здания. ГИС обладают способностью выявлять скрытые взаимосвязи и тенденции, которые трудно или невозможно заметить, используя привычные бумажные карты и таблицы. Мы не будем рассматривать различные области применения ГИС — один только перечень реально используемых тематических карт может занять несколько десятков страниц. Коснемся только вопросов, близких к основной теме к н ш и — системам автоматизированного проектирования — САПР.
Глава 34. Интеграция САПР и ГИС
1057
73% Рис. 34.1. Отображение на электронной карте хода уборки урожая
Составные части ГИС Термин "геоинформационная система" (ГИС) обычно применяется в двух смыслах. Во-первых, ГИС часто называют какое-то конкретное программное средство, например: ТИС ИнГео". При всем нашем уважении к этому замечательному продукту, это все-таки не геоинформационная система, а только инструментальное средство для ее создания. В рекламе продуктов фирмы Autodesk применяются более корректные (если не обращать внимания на прилагательное "уникальный") наименования: "AutoCAD Map — уникальный инструмент для автоматизированного картографирования и ГИС", "Autodesk World — уникальный интегратор географических данных", "Autodesk Map Guide — уникальная интернет-технология для ГИС". Во-вторых, ГИС называют некую информационно-справочную или информационно-аналитическую систему в какой-либо предметной области. Вот такая ГИС и нужна конечным пользователям — это может быть "ГИС администрации города Арбатов" или "ГИС ООО "Рога и Копыта"". Истинные геоинформационные системы состоят из следующих компонентов: О
аппаратные средства (компьютеры, сканеры, дигитайзеры, плоттеры);
О программные средства — инструменты для создания ГИС, обработки данных и предоставления результатов конечным пользователям: П информация — электронные карты и пространственно координированные данные, как правило, связанные с изображениями на картах; 34
Зак К34
Часть IV. Разработка прикладных программ П пользователи — специалисты, создающие и поддерживающие информационную систему в актуальном состоянии, и прочие пользователи, использующие информацию в собственных целях; 3 технологии — методы создания карт и данных и дальнейшей работы с ними. Аппаратные средства мы рассматривать не будем — любой современный персональный компьютер может работать с геоинформационной системой. Не будем рассматривать и программные средства для решения узкого круга специфичных задач (например, обработки аэрофотоснимков). Все остальные составные части оказывают существенное влияние на конечный результат — ошибка в любой составляющей может привести к полной дискредитации информационной системы. Особое значение имеют технологии работы, т. к. от выбора того, что и как делать, зависит принятие решения о том, чем делать. Весьма распространенной ошибкой является приспосабливание конечнв[Х целей под возможности инструментального средства — делают, что могут и кок могут, вместо того, что нужно и как нужно. Виновниками часто становятся программисты, которые якобы "могут все сломать" (для начальников это кажется признаком квалификации) и с энтузиазмом берутся за решение задач, в которых ничего не понимают.
Инструментальные средства ГИС Сейчас имеется множество п р о г р а м м н ы х средств для создания геоинформационных систем. Особенно отрадно, что на рынке появились программные продукты российских разработчиков, не уступающие именитым зарубежным конкурентам. Но наша книга посвящена САПР, и рассматривать мы будем только продукты, позволяющие осуществить интеграцию САПР и ГИС. Конечно, существуют различные САПРплатформы, на базе которых возможны интегрированные решения, но все-таки лидером САПР в России остается система AutoCAD. От фирмы Autodesk долго ожидали и аналогичных решений в области ГИС. и они последовали. Появилась целая линейка продуктов для работы в ГИС — AutoCAD Map, Autodesk World, Autodesk Map Guide, Autodesk Land Desktop и прикладные приложения. Однако один из главных лозунгов фирмы Autodesk "Сделаем работу с геоинформацией доступной всем!" все-таки вызывает сомнение. Во-первых, смущают цены. Мы уже прикидывали, во что обойдется проектной организации оснащение рабочих мест полным набором продуктов на базе AutoCAD (см. главу 2), и сказали: "Однако!" Но если на рабочих местах проектировщиков производится проектная продукция, продаваемая заказчикам, и САПР-продукты, в конце концов, себя окупят, то с ГИС положение иное. ГИС, по определению, является информационной системой, предназначенной для предоставления информации по возможности" широкому кругу организаций и граждан. На одно рабочее место "создателя" ГИС приходится несколько десятков, а то и сотен рабочих мест пользователей, большинству из которых информация должна предоставляться бесплатно. Если укомплектовать пару рабочих мест продуктами фирмы Autodesk в головной организации, создающей муниципальную ГИС, еще сгоряча возможно, то как заставить сделать это десятки организаций, которые тоже должны принимать участие в создании такой ГИС, иначе грош ей цена? Значительные затраты требуются на создание
Глава 34. Интеграция САПР и ГИС
1059
и поддержание информации в актуальном состоянии, а продавать практически ничего (го крайней мере в первые годы создания ГИС) нелыя. Во-вторых, продукты фирмы Autodesk требуют значительной доработки. Хотя иногда можно нстретить утверждения, что "это (AutoCAD Map} самая дешевая полнофункциональная ГИС". но мы то с вами знаем, что и базовая система AutoCAD, и "десктопы" - не конечные продукты "под ключ", а скорее "шасси", которые нужно до укомплектовывать предметными приложениями. Не являются исключениями и ГИС-продукты фирмы Autodesk. У них имеется множество функциональных возможностей, которые никогда не понадобятся пользователю, и нет средств для решения первоочередных задач. Когда-то мы с нетерпением ожидали появления анонсированного AutoCAD Map, наивн:> полагая, что в продукте с таким названием появятся специализированные средства для рисования планов и карт. Увы! Появился дежурный набор, уже реализованный в известных продуктах— оцифровка, векторизация, коррекция топологии,- семьсот проекций, тематическая картография плюс весьма неудобная технология связки графической и семантической информации, и ничего из ожидаемых инструментов. /Сергеи Зуее) Лаже в статьях, посвященных внедрению таких продуктов, подтверждается - "мы рассматриваем AutoCAD Map 2000 не как конечный продукт, а как средство разработки, для решения специальных задач". Возможность разработки собственных расширений одна из причин успеха системы AutoCAD, но эти работы также требуют времени и средств. В-третьих, система AutoCAD и продукты на ее основе сложны в освоении. Не зрч издается столько книг, посвященных различным аспектам работы с AutoCAD, ГИСпродукты фирмы Autodesk, в отличие от конкурирующих систем, не русифицированы, не имеют документации на русском языке. Осваивать ГИС-технологии ц гаких условиях сложно. Конечно, "продвинутые" пользователи и разработчики ГИС преодолевают эти трудности, но попробуйте обучить работе с такими программами "тетку", особенно если она занимает должность мэра города или губернатора — а именно с облегчения работы руководителей такого уровня нужно начинать, чтобы обеспечить финансовую и моральную поддержку создаваемой системе. Альтернативные инструментальные средства ГИС в рассмотренных отношениях выглядят лучше — и по иене, и по "готовности к употреблению", и по простоте освоения. Более того, нам кажется, что фирма Autodesk продвигает свои продукты в уже занятую нишу геоинформатики, использующей мелкомасштабные карты, недостаточно уделяя внимание той, где они могли бы быть вообще вне конкуренции — интегрированным с САПР информационным системам, базирующимся на точных Крупномасштабных планах. При использовании продуктов на базе системы AutoCAD в мелкомасштабных ГИС проявляются и его органические недостатки — невозможность управления порядком отображения слоев, отсутствие встроенной генерализации изображений, недостаточная цветовая палитра (сдвиги в лучшую сторону наметились только D AutoCAD 2004). Однако известны и преимущества системы AutoCAD: D огромное количество обученных пользователей; D близкий к идеалу набор средств для рисования и редактирования; 3 удобные инструменты для управления изображением;
TQ60
Часть IV. Разработка прикладных программ
П мощная система разработки приложений, которую мы подробно рассматриваем в книге; П большое количество прикладных программ и библиотек; П множество наименований технических изданий, рассчитанных на пользователей разных категорий. Для того чтобы создать эффективную информационную систему, нужно использовать продукты по назначению там, где меньшее значение имеют их недостатки, но лучше могут проявиться достоинства. Это банальная мысль, но мы постоянно видим, как люди, берущиеся "сделать ГИС", делают это, не изучив вопрос всесторонне. Выбор инструмента для ГИС сложен, неоднозначен и ответственен. Именно поэтому мы отдаем столько места "пустым разговорам" на эту тему.
Область применения ГИС на базе AutoCAD Руководствуясь собственным 10-летним опытом (и достижениями, и ошибками) разработки ГИС на базе системы AutoCAD, мы можем очертить круг рационального применения этой платформы. Во-первых, мы рекомендуем ограничиться крупномасштабными планами — не мельче масштаба 1:2000, а еще лучше — 1:500. Именно на плановой основе таких масштабов цедется рабочее проектирование, для которого необходима самая точная подоснова. Масштаб электронной подосновы и масштаб рабочих чертежей должны быть одинаковыми. При этом, помимо крупномасштабных планов, созданных на основании топографических планшетов, должен быть относительно небольшой набор слоев с общей ситуацией по территории. Это могут быть и не очень точные схемы, но лучше, если они основываются на достаточно точных источниках, например на данных земельного кадастра. Во-вторых, в дополнение к обязательному первому условию должна быть явная и осознанная заинтересованность руководителей города или предприятия и ведении именно точного плана города или предприятия (вплоть до отражения планировок зданий), пригодного для рабочего проектирования. В-третьих, на обслуживаемой ГИС территории должно вестись достаточно активное проектирование и строительство, иначе в точных планах просто не будет потребности. Энтузиазм руководителей по финансированию работ быстро иссякнет, если не будет подкрепляться давлением и материальной помошью со стороны заказчиков. Все эти условия могут соблюдаться в муниципальных ГИС и в информационных системах промышленных предприятий, причем для предприятий внедрение таких технологий реальнее из-за широкого применения AutoCAD в разных службах и отсутствия множества анархистски настроенных самостоятельных руководителей. Однако, даже если в городе создается базовая электронная топографическая основа с использованием системы AutoCAD, это не означает, что все организации должны использовать продукты на этой платформе — отраслевые ГИС могут применять иные технологии. Как сделать данные, подготовленные в AutoCAD, доступными для его "не пользователе и", мы еще обсудим. Конечно, с использованием линейки ГИС-продуктов фирмы Autodesk можно разрабатывать разнообразные ГИС (кадастровые, статистические, экологические, геогра-
Глава 34. Интеграция САПР и ГИС
1061
фические. социально-экономические и пр.), но в большинстве случаев это не будет оптимальным решением.
Об электронных картах Электронные карты являются обязательным элементом ГИС. но далеко не каждое изображение местности на экране компьютера обладает большим, чем бумажная карта, информационным наполнением. Если это отсканированная или даже векторизированная модель бумажного топографического планшета, то на ней мы в лучшем случае увидим только то, что было на оригинале. Информация об объектах на обычном плане представлена в виде надписей и условных знаках. По условному знаку можно, например, определить, что нарисованный "кружок с точкой" (рис. 34.2) это разведочная скважина, да еще узнать отметку устья л фунтовых вод.
Рис. 34.2. Изображение скважины на плане
Если же к изображениям скважин привязана описательная информация ("семантика", на ГИС-жаргоне), то можно узнать об объекте очень много (рис. 34.3).
файл Правка
Режун Справка
Номес ,[Отме7ка|Пво6й>н1а1Глч6ниа|УГВ IrpiHT i 2
3 4 5 6
7 6 9 10 11
12 13 14
70.37 24387 71.1 24368 70,45 24383 *71.1 24330 70.4 2443) 7Е.8 24485 24486 24487 34386 24336 24474 24475 24477
:;:
13 27051993 13 13 09 12 1333 13 01061993 13 0111.1993 15
77 76,3 76.35 70.37
28.10.1993 15 27.10.1993 15 01 И.13ЭЗ 15 07.121393 13 07.12.1993 20
•79 79.25 78.7
30.03.1993 20 01.Ю1ЭЭЭ 20 29 09 1333 20
та
0,5 0.4 0.15 0.7
0 3.6 3.5 3.2 2.7 0.5 4 4 4.3 3.5
Договор |План 15 Суглинок 335-93 Суглинок 335-93 15 Суглинок 335-33 15 15 Сутли-о» 335-93 Суглинок 335-33 15 Глина
ЗЛ93 371 -ЭЗ 371-33
Гч-на Глина 371 -аз Суглинок 335-93 33593 Суглинок 355-33 Суг липок 355-32 355-33 Глина
9 9
"э
3 IS 20 20 20 20
X ]Y -4509 185.5 -4046.5 127 76.5 •4030 -ЗЭ92.2 -3355 -4332.1 •4375.4 •4385.5 -43636 -4503 •83! 3.2 -8913.2 •8862.2 •6930.2
ге.4
9.25 2573.3 2582.2 "2549.1 2561.1 185,5 •4856,8 -4856,3 -4856.2 -431 ОБ
Уникод 1* Э707031ИЛЭ54 _J 3707031 1421 359 97070311421365 97070311421370 97070311421376 97070311421381 Э 707031 1421 337 9707031 1421 392 37070311421398 9707031 142П 20 97070311421425 97070311421431 37070311421436 37070311421442
,'
•Г
|
Рис. 34.3. Информация о скважинах в базе данных
Но электронная карта в ГИС способна на большее. Мы можем установить такой режим отображения карты, при котором скважины будут изображаться в виде пятен, имеющих цвет, соответствующий глубине залегания грунтовых вод {например, чем ближе к поверхности, тем интенсивнее оттенок синего цвета). Любой инженерстроитель знает, сколько времени нужно затратить на то, чтобы узнать, выполнялись ли на площадке инженерно-геологические изыскания и разыскать отчеты об этих работах. А с помощью ГИС-технологий мы сразу видим и общую информацию об
1062
Часть/V. Разработка прикладных программ
изученности территории, и, щелкнув по знаку скважины, получаем детальную информацию. Но у нас не простая карта, а тематическая, и инвестор, не вникая в технические детали, может заранее оценить предлагаемую площадку для строительства. Один взгляд на такую карту может спасти от значительных бесполезных расходов. Аналитическая карта, показанная на рис. 34.4, сформирована с помощью программы Mapinfo, база данных скважин создана в системе BestlA, являющейся приложением к системе AutoCAD.
О Рис. 34.4. Тематическая парта залегания грунтовых вод
Семантическая информация, привязанная к объектам карты, не образуется сама по себе в процессе векторизации. Помимо решения технических вопросов, как и какую "семантику" привязать, надо решить, где, а главное как эту информацию добыть 1 . Если на топографическом планшете М 1:500 показаны каждый столб, дерево, сарай, забор или кабель, то, конечно, полезно было бы иметь характеристики этих объектов, но где же их взять? Хорошо еще. если можно раздобыть минимальную информацию об основных заданиях (адрес, этажность, владелец и т. п.), т. к. не вся она отображается на планах. Поэтому задачи нужно ставить реальные, распределять наполнение карты информацией во времени и между исполнителями. Например, в органе архитектуры может поддерживаться топографическая информация, предназначенная для использования любыми организациями города. На топо-
Приемы и методы лобывания информации мм вмносим за рамки книги
Глава 34. Интеграция САПР и ГИС
1063
графических планах показаны, в частности, тепловые сети (условным обозначением, в одну линию и не всегда с указанием диаметров труб). Подробная же информация о тепловых сетях с указанием всех их детальных характеристик должна поддерживаться владельцем сетей с передачей той части информации, которая может или должна быть доступна "смежникам" в информационную систему города.
Откуда берутся электронные карты? Судя по тому, как мало внимания уделяется созданию электронных карт в зарубежных программных продуктах, псе они уже давно созданы. В наших условиях создавать электронные карты приходится, в основном, самостоятельно, хотя имеется множество фирм, предлагающих такие услуги. К подобным предложениям со стороны иногородних фирм мы рекомендуем относиться очень осторожно. Самым лучшим вариантом является приобретение электронной карты в организации, являющейся официальным держателем топографических данных территории. Модель карты или модель местности? В мире ГИС. как и а САПР, постоянно циркулируют идеи об геоинформационных системах основанных на трехмерной модели местности. Безусловно, это очень необходимо, но смысл в такой модели есть только тогда, когда она точная. Но как точно нанести, например, подземные коммуникации, если в исходных материалах в лучшем случае имеются отметки лотков канализационных колодцев? В то же время в отдельных случаях, когда производится сквозное трехмерное проектирование нового объекта, проектные разработки могут послужить основой для ГИС.
У вас хорошая крыша? Создание и ведение геоинформационных систем, создание тематических карт {в "io\i числе и цифровой форме) относится к геодезической и картографической деятельности, которая в соответствии с федеральным законом "О геодезии и картографии" подлежит лицензированию. А у вас есть лицензия на такую деятельность? Если нсг. то ее надо получать "в установленном порядке" в территориальном органе Госгеонадзора.
Где брать исходные материалы Прежде чем бросаться "заносить в компьютер" карту или план, подумайте, стоит ли это делать именно с этим материалом, Во-первых, проверьте легитимность карты. Откуда она появилась на нашем столе куплена в магазине, "достали", "сами нарисовали"? В любом из этих случаев иы вступаете в конфликт с законом — нарушая авторские права создателя карты или занимаясь незаконной деятельностью. Даже если исходный материал получен от владельца, убедитесь, что имеется его письменное согласие на создание вторичных материален. Во-вторых, проверьте качество карты. Если она "отрэмлена" или даже "отксерена", то наверняка имеются значительные искажения, которые сделают электронную карту неточной.
1064
Часть IV. Разработка прикладных программ
Постарайтесь использовать оригинальные, а не вторичные материалы. Оригинальными являются топографические планшеты (на картоне, металле, лавсановой пленке), а вторичными — различные "выкопировки" и отчеты о топографических изысканиях. Вопрос с доступом к исходным материалам очень сложен, но его нужно решать. Никогда не используйте в качестве подосновы имеющиеся в эксплуатационных организациях схематичные планы, хотя иногда они выглядят "как настоящие".
Привязка к системе координат Любой топографический план должен быть привязан к местной системе координат! Если вы работаете с настоящим топографическим планшетом, то координаты углов планшета указаны в зарамочном оформлении. Если же вам вынужденно приходится работать с выкопировкой из плана, то на ней обязательно должны быть "крестики" координатной сетки, и хотя бы у одного из них должно быть значение координат. 1 Не забывайте, что в геодезии ось, направленная на север, обычно называется X, а не Y. Необходимо также знать, где физически (с привязкой к объектам местности) расположена точка начала координат. А как привязано начало местной системы координат к географическим вам лучше не знать.
Совет В AutoCAD в качестве местной системы координат используйте мировую систему координат, и асе объекты местности рисуйте только при установленной МСК План, не привязанный к местной системе координат, не пригоден для работы. Особенно ужасно, если план привязан неправильно — это хуже отсутствия координат. Пример В городе N служба, занимавшаяся нормированием выбросов в атмосферу, запросила в Горархитектуре обзорный план города, не указав, для каких цепей он будет использоваться. Гор архитектура, не уточнив цели, выдала старинную неточную специально искаженную схему. А экологи задумали использовать этот план для задания предприятиям точек начала местных систем координат, используемых при определении координат источников выбросов в проектах нормативов предельно допустимых выбросов в атмосферу [ПДБ]. При этом, не долго думая, нарисовали в левом нижнем углу схемы точку начала координат. Начало координат местных систем задавалось предприятиям после измерения портновским измерительным инструментом от этого условного начала до не менее условного угла площадки предприятия. Поразительная техническая безграмотность экологов, не знающих о городской системе координат ("география— наука для ямщиков"), привела к тому, что сотни тысяч координат источников выбросов на десятках предприятий были установлены неправильно. Впоследствии эти "координаты" были добросовестно внесены в базу данных, и только при попытке показать источники на электронной карте "экологической ГИС" выяснилась истинная картина. Разумеется, в итоге пострадали предприятия, которых заставили переделывать все проекты ПДВ, запрашивая правильные привязки местных систем к городской системе координат.
В некоторых городах осью X называют нсь, направленную на восток. Незнание этой летали может привести к ужасным ошибкам, поэтому исегда уточняйте название осей на незнакомой территории
Глава
34.
Интеграция
САПР
и
ГИС
_
1065
Процесс создания электронной карты Если вы все-таки решаетесь на создание электронной карты, изучите различные технологические варианты.
Замечание Все последующие советы мы даем из предположения, что вы работаете в AutoCAD л используете описываемую в книге систему ruCAD. Не следует сразу бросаться на векторизацию топографических планшетов — лучше создайте схематический обзорный план территории. Для таких целей подойдет даже туристическая карта, выполненная в масштабе (которому особо доверять не следует). Выясните систему разграфки планшетов для вашей территории и начертите теоретическую сетку размещения планшетов. Совместите, по возможности точно, схему города с сеткой планшетов.
Совет Используйте классификатор слоев, рассмотренный в главе 18, для распределения объектов по стандартным слови При необходимости пополняйте классификатор. В дальнейшем схему города можно постоянно уточнять, повышая ее точность. Желательно использовать любые источники, в которых координаты встречаются в аналитическом виде: D материалы земельного кадастра (координаты зон, массивов, кварталов и участков): D каталоги координат красных линий; D каталог координат границы городской черты; D акты выноса объектов в натуру; UJ каталоги разведочных скважин, пунктов полигонометрии; П геодезические ходы, опорные точки, скважины: О координаты источников выбросов в ведомостях инвентаризации; D проекты детальной планировки и другие проектные материалы. Таких источников информации имеется очень много, но беда в том, что надо знать, где они есть и как их взять. Здесь решающее значение имеет знание разработчика у и ГИС всех тонкостей взаимоотношений между городскими организациями и личные связи (например, среди опытных топографов и генпланистов, многие из которых имеют личные архивы). Соиокупность всех объектов, полученных из таких источников, дает прекрасную опорную сеть. Разумеется, просто так эти материалы вам никто не даст, поэтому надо заручиться поддержкой "самого главного" и. кроме того. создавать собственную "службу внешней разведки". Создан более или менее узнаваемую схему города, ее нужно сразу использовать для демонстрации результатов. Пример Сформированную примерно так схему мы предоставили службе по чрезвычайным ситуациям, где она использовалась для учета потенциально опасных объектов и для отобра-
Часть IV. Разработка прикладных программ
1066
женин результатов расчетов прогнозируемых аварий. Это дало и дополнительный источник финансирования, и наглядно показало полезность ГИС Сразу же создавайте бааы данных по соответствующей тематике и начинайте наполнять любой доступной семантической информацией. После того как ГИС начнет работать, можно приступать к самой объемной работе по векторизации планшетои. Идеальным является вариант, создаются и поддерживаются ской службой. К сожалению, ных городских сумасшедших)
при котором электронные топографические планшеты в актуальном состоянии единой городской геодезиченаличие таких служб (в отличие от наличия обязательявляется исключением, а не правилом.
Векторизация планшетов При векторизации планшетов обычно выполняются следующие операции: О сканирование — получение фотографического изображения планшетов: 3 сводка — размещение углов растров планшетов так, чтобы они совпадали с теоретическими координатами углов планшетов; О векторизация — ручная, автоматическая или полуавтоматическая обрисовка объектов поверх растровых изображений планшетов; 3 формирование сводном плана из отдельных планшетов; О
топографический мониторинг — внесение текуших изменений.
Каждая из этих операций имеет массу важнейших деталей, а трудоемкость во многом зависит от применяемых технологий. Например, можно потратить массу времени на мифическую автоматическую или реальную полуавтоматическую векторизацию путем программной обработки растра. Л можно, располагая программными средствами, создание которых рассмотрено в нашей книге, очень быстро нарисовать обьекты местности поверх растра. Примеры При оцифровке изображения откоса нет необходимости координировать каждый штрих, достаточно "сколоть" определяющие точки верхней и нижней подошвы и откос будет нарисован в полном соответствии со стандартом. Для отрисовки трассы канализации указывают только центры колодцев, а все остальное (сам колодец, примыкающие трассы с обозначениями] рисуется автоматически. Подробнее остановимся на формировании сводного плана из отдельных электронных планшетов.
Совет В системе AutoCAD каждый электронный планшет должен быть отдельным DWG-файлом со специальным именем, которое можно вычислить по координатам точки на местности. Базовой точкой вставки для всех планшетов должна быть точка начала МСК Рамка планшета должна охватывать квадрат с соответствующими координатами. В электронном планшете должен быть полный набор соответствующих классифицированных слоев, а во всех планшетах одинаковые объекты должны размещаться на одноименных слоях.
Глава 34. Интеграция САПР и ГИС
1067_
Формирование сводного плана Существует два способа создания сводного плана: 3 вставкой "встык", в виде кафельной плитки отдельных планшетов, без объединения; П объединение изображений на отдельных планшетах в единое поле. Некоторые специалисты, зациклившись на деталях, пишут о технологиях векторизации, считая само собой разумеющимся, что планшеты могут получаться только векторизацией растрои, а в результате обязательно должно быть получено единое векторное папе. Например, в программном продукте ИнГЕО на очень высоком техническом уровне реализована технология СРВ (Сшивка растров с последующей приоритетной векторизацией объектов) — выборочная обрисовка контуров объектов, расположенных на разных планшетах. Мы можем засвидетельствовать — ИнГЕО, работает с этой технологией очень хорошо и действительно является примером "революционных технологических достижений в обработке информации персональными компьютерами 1 " и нравится нам больше, чем многие знаменитые программные продукты. Однако в идеологию СРВ заложено ложное предположение, о том, что можно и нужно "раз и навсегда сшить получившиеся векторные изображении планшетов". Если мелкомасштабные планшеты и лаже планшеты М 1:2000 действительно практически не изменяются, то "пятисотка" корректируется постоянно, причем корректировка производится именно попланшетно. Сшить все планшеты в один план можно, но даже такая шустрая программа, как ИнГЕО, не справится с обработкой единого плана большого города. А если и справится (делает она это очень ловко благодаря тому, что вообще не хранит данные в графических форматах — все в БД). то практически невозможно отслеживать и вносить изменения, постоянно вносимые в оригиналы, т. к. при малейшем изменении любого объекта меняется вся база данных. При хранении каждого планшета в отдельном файле просто не нужно и пытаться сшивать их ни в растровом, ни в векторном виде. Условно-постоянные объекты (например, контуры зданий), .требующие привязки атрибутивной информации, должны просто располагаться на отдельных слоях, а еще лучше, если координаты их контуров хранятся is базе данных и доступны для использования и отображения н любых системах, а не только в AutoCAD или ИнГЕО. Проектировщику, для того чтобы начертить план коммуникаций отдельного здания, не потребуется загружать план всего города, а достаточно путем нескольких щелчков мышью подгрузить только требуемые планшеты. А вот собрать единый топографический план среднего з:шода вполне реально, но все изменения обстановки должны фиксироваться на этом плане.
Связь изображений с базами данных Вторым, после электронных карт, важнейшим компонентом ГИС являются б.иы данных, в которых хранится семантическая информация об изображенных на карте 1
Цитата из технической документации на ИнГЕО
1068
Часть IV. Разработка прикладных программ
объектах. Именно связки изображений на экране с записями в базе данных делают обычную графическую систему информационной. В различных программных инструментах для ГИС эти связки организуются собственными методами. Разберем, как это можно сделать в AutoCAD. Самым простым способом, доступным LlSP-программистам, является использование расширенных данных примитивов. В своих системах мы программным п\тсм привязывали к примитивам строку расширенных данных специального формата, в которой записывались через символы-разделители имена базы данных, таблицы и уникальный код записи, например: "GIS\TS\MKRN12,-ТЕПЛОПУНКТЫ;99111811500323".
Возможны и более изощренные схемы, но в любом случае внутри DWG-файла хранятся связанные с примитивами указатели на записи в базе данных. Важнейшим является вопрос о том. что же хранится внутри самой базы д а н н ы х . Возможны две принципиально отличающихся технологии: 0 хранение пространственной информации в графическом файле; 1 хранение пространственной информации в базе данных.
Вариант пространственной информации в графическом файле При использовании первого варианта в базе данных может быть записана различная информация. Кроме того, любая таблица с произвольной структурой может быть привязана к любому примитиву AutoCAD. Примером является база данных % АСА D%\Sa rnple\db_samples.mdb с набором включенных в нее таблиц. Единственным подозрительным полем является поле Entity_Handie в таблице Room. В данном случае для связки используется номер метки примитива. Такой методический подход удобен тем, что не накладывается никаких ограничений на структуру базы данных. Можно использовать любые существующие базы данных (обычно в каждой есть какое-то уникальное поле) для привязки к изображениям. Но эта технология обладает большим недостатком — невозможно определить пространственное положение объектов, характеристики которых хранятся в базе данных при недоступности DWG-файла. Восстановить связь примитив-запись можно только с использованием технологий фирмы Autodesk, т. е. используя весьма дорогие программные продукты. Фактически мы сталкиваемся с насильственной привязкой пользователей к продукции фирмы 1 . Конечно, с точки зрения фирмы это несущественно, но возникают и технические проблемы, Во-первых, редактирование или даже только просмотр DWG-файлов в истинно многопользовательском режиме невозможно или чрезвычайно затруднено. Во-вторых, в ГИС обязательно необходим поиск по пространственным критериям, а это опять привязка к выбору и фильтрации объектов внутри системы AutoCAD.
Большинство других фирм также применяют подобные приемы.
Глава 34. Интеграция САПР и ГИС
1069
Вариант пространственной информации в базе данных При работе по второму варианту вся информация, требуемая для восстановления геометрии объектов, хранится в базе данных. Взгляните на рис. 34.5 — на нем показан редактор пространственной базы данных. Мы видим не только основные семантические характеристики объекта, но и его контур со списком координат вершин, которые можно редактировать. Первоначально контур здания был нарисован в системе AutoCAD полилинией, затем список координат был отправлен в базу данных, и базе данных была создана запись с уникальным кодом, заполнены описательны^ поля, а после завершения редактирования к полилинии были привязаны расширенные данные с указателем на запись в базе данных. Если при редактировании в БД будет изменен список координат, то полилиния будет перерисована по новому контуру-
Правка
Данные
Запись
Экспорт
дополнения
-
Объект Ад Dec .Б леденец
Ч>]._М. Паникоккога 13 Коищра Геркулес
Описание
1замбтка]
ЭТ4ЖИОСТО
1
Площадь
737
. :
...1Г
U , $i «• и «• -s '
•
Г
ijClnepauns: Редактирование Заосы 7иэ 12 :3апис&" 7
.Записей 12
Copi.: откя.
Рис. 34.S. Пространственно координированная база данных
Создав с помошью системы AutoCAD необходимый набор объектов в базе данных (например, внеся все здания города), мы можем вообще забыть о ее существовании!
Часть IV. Разработка прикладных программ
1070
Отобразить контуры по известным координатам мы можем В любой графической системе. Заметим, что и дополнять базу данных мы также можем из любой программы, которая "знает", как передавать и нее координаты. Конечно, пользователи, испольчуюшие систему AutoCAD (с н а ш и м и или собственными небольшими "ГИС-довесками"), по-прежнему могут использовать ее мощь и несомненные преимущества, но информация теперь будет доступна и пользователям иных систем. Технология работы с базами данных в многопользовательском режиме отработана и надежна. Имея в базе данных списки координат объектов, можно организовать и поиск по пространственным критериям ("найти информацию по кабелям, проложенным ближе 5 м от такого-то здания" и т. п.). Недостатком хранения пространственной информации В базе данных является наличие специальных полей для хранения координат, но этот недостаток компенсируется гибкостью и дополнительными возможностями. Еще один пример использования такой базы данных показан на рис. 34.6 (к сожалению, черно-белое изображение не способствует восприятию карты).
>V о с Т Ж^ • ••'.-•
,-'• TWJaKobiHHnJ
I I!
Рис. 34.6. Векторная электронная карта, просматриваемая в Интернете
На рисунке показана электронная карта области, просматриваемая через браузер (адрес скрыт, т. к. доступ К карте пока ограничен). Просмотр карты осуществляется в режимах, привычных для пользователей САПР и ГИС (зумирование, панорамирование). Возможно управление видимостью слоев, причем вид слоев управляется
Глава 34. Интеграция САПР и ГИС
1071
с помощью XML, ни котором и написана просматриваемая страница. Например, цвет полигонов населенных пунктов зависит от численности населения, извлекаемой из базы данных. Возможно управление видимостью подписей, например, названий населенных пунктов. Внешний вид карты каждый пользователь может настроить по своему желанию. В левом нижнем углу показано окно общего вида, хорошо знакомое пользователям AutoCAD. Возможно измерение расстоянии на карте (показан маршрут, проложенный пользователем). При необходимости можно найти в базе данных населенный пункт (по названию или части названия), просмотреть информацию по нему, и увидеть, где он расположен на карте (будет показан и иентре карты и выделен цветом). На рис. 34.7 показано дополнительное окно с информацией из базы данных, по объектам, попавшим в выделенный на карте контур. Выделив объект в базе данных, можно увидеть его положение на местности.
Рис. 34.7. Просмотр информации объектов, выбранных на карте
Как это сделано Мы привели пример разумного, на наш взгляд, сочетании различных технологий. Карта области была нарисована в трех идеологически разных программных продуктах — AutoCAD, ИнГЕО и Mapinfo и разное время и различными исполнителями. Пространственно координированные данные из разных источников были импортированы в базу данных Inierbase.
1072
Часть IV. Разработка прикладных программ
Страницу с картой размещена на Web-сервере Tomcat, работающем в операционной системе Linux. Доступ к базе данных осуществляется с помощью сервера баз данных Firebird J.5, работающем под Linux, а пользователь просматривает карту с помощью Avant Browser (или любого другого, поддерживающего виртуальную машину Java) из операционной системы Windows (или иной, что не критично). На сервере вообще не лежит никаких графических файлов — только база данных, к которой могут подключаться столько пользователей, сколько выдержит "железо". Семантическую информацию в базе данных (например, численность населения по результатам переписи) редактируют ответственные специалисты, не мешая просмотру карты. Изображение карты формируется в окне браузера на клиентской стороне с помощью локализированного нами Java-апплета ALOVMap'. Информация из базы данных передается порциями, при изменении зоны просмотра, и кэшируется у клиента. Аналогичные карты могут быть сформированы и по территории любого населенного пункта или промышленного предприятия. Все программные средства, выделенные здесь полужирным шрифтом, являются бесплатными (или практически бесплатными). Технические и экономические показатели демонстрируемого решения и линейки ГИС-продуктов от Autodesk читатели могут сравнить сами, ознакомившись с прайс-листами.
Как хранить координаты в базе данных Итак, для того чтобы суметь нарисовать объекты независимо от применяемой программной среды, необходимо хранить координаты в базе данных. Чаше всего и ГИС применяются объекты Трех типов: 3 точки — положение объекта on редел яеася парой координат X и Y (возможно и Z, и угол поворота); П линии — геометрия объекта определяется списком координат вершин; О полигоны — замкнутые контуры, геометрия объектов также определяется списком координат вершин. Визуально объекты могут изображаться разными способами. В системе AutoCAD точечные объекты могут изображаться блоками, линейные — полилиниями, а полигональные — замкнутыми полилиниями со штриховками. В системе Mapinfo точечные объекты изображаются символами специальных картографических ТшеТурешрифтов или растровыми изображениями, линейные — полилиниями, а полигональные — специальными замкнутыми областями.
Замечание В отличие от AutoCAD в Mapinfo осуществляется автоматическая генерализация изображений— сохранение постоянных видимых размеров объектов при изменении масштаба изображения на экране. В системе AutoCAD слабым аналогом генерализации является управление весом линий. Конечно, и в AutoCAD можно запрограммировать автоматическое изменение масштабов блоков, ширины линий и густоты штриховок, но это будет связано с изменением свойств объектов в графической базе данных.
www.alov.org.
Гпава34. Интеграция САПР и ГИС
1073
Желательно избежать хранения внешнего вида объектов в базе данных, но если непременно требуется фиксированное изображение объекта, визуальные характеристики можно хранить в специальных полях. Сложность будет в том, что разные системы по-разному должны интерпретировать эти данные. Существуют различные системы хранения пространственных данных, наиболее известной является Oracle SpatialWare. Безусловно, это очень мощный, надежный и универсальный инструмент, позволяющий решить все проблемы с хранением и использованием пространственных данных (при условии, если у вас нет финансовых проблем). Практически все ГИС-инструменты позволяют использовать это великолепное хранилище данных. По запросу "SpatialWare" поисковая машина Google выводит ссылки на тысячи страниц, на которых на разных языках расхваливаются достоинства продукта. По провокационному запросу "Кто использует SpatialWare" находится только четыре страницы — по случайному стечению обстоятельств это так^е страницы продавцов, а не потребителей. Процитируем одно из высказываний: "Когда мне требуется SpatialWare? Когда Вы имеете большие объемы изменяющихся пространственных данных, требующих доступа в реальном времени многим пользователям. SpatialWare также будет решением для случаев, когда нужен мощный пространственный анализ, а в клиентской части используются недостаточно производительные картофафические системы". С этим утверждением можно полностью согласиться. Но "большие объемы" д а н н ы х , из-за которых вообще стоит применять такую мощную СУБД, как Oracle, могут образоваться в вашей ГИС только через несколько лет или вообще никогда не появиться. Так зачем же стрелять из пушки по воробьям, если можно использовать обычную рогатку? На первых порах лучше использовать простые и дешевые решения ("рогатку"). Бесполезно сразу расходовать большие средства на столь "скоропортящиеся" продукты, как программы — когда их мощь действительно потребуется, купленные впрок версии наверняка устареют Организовать собственную систему хранения пространственных данных в СУБД совсем не сложно. Любой программист баз данных это может сделать. Опасность только в том, что бе-j глубокого п о н и м а н и я сути задачи это можно сделать нерационально. После многих экспериментов мы пришли к выводу, что лучше всего координатную информацию хранить в одной таблице, в специальном МЕМО-поле в виде единого списка всех координат вершин. Технические реализации хранения списка могут быть различными — мы работали с несколькими вариантами текстовых форматов (от Clipper-массива до LlSP-списка), но теперь привели формат в соответствие с используемым в ALOV Map двоичным кодом. Переход на групповой стандарт и позволил применять продемонстрированные решения по публикации карт в Интернете.
Как создать собственную ГИС-систему В рамках этой книги на такой вопрос ответить нельзя — на это можно ответить в специальной книге "ГИС на базе AutoCAD. Как это делается". Такая книга может появиться, если читатели проявят достаточную заинтересованность — ни авторы, ни издательство не знают, нужно ли это кому-нибудь.
1074
Часть IV. Разработка прикладных программ
Разрабатывая САПР, мы уже создали базовый фундамент и для разработки САПРориентированной ГИС. У нас уже есть классификатор слоев, не столь, может быть, нужный в САПР, но чрезвычайно необходимый в ГИС. Мы разработали систему работы с электронными архивами проектов, калек и топографических планшетов, которая может использоваться и и ГИС (см. главу 33). У нас имеется множество функций, облегчающих разработку программ любой сложности. Для наделения системы ГИС-функциями необходимо проработать следующие вопросы: О поддержка дополнительных свойств слоев И структур данных в классификаторе; 3 технология создания информационных объектов в AutoCAD; О реализация хранения пространственных данных в СУБД; П связывание базы данных с объектами рисунка; П редактирование информационных объектов в базах данных и AutoCAD, О комфортабельное редактирование баз данных; О экспорт данных в AutoCAD и другие системы; О получение координат объектов в базе данных из AutoCAD; О просмотр объектов из базы данных в AutoCAD; О управление видимостью информационных объектов; О генерализация информационных объектов; И организация топографического банка данных; СЗ системы разграфок топографических планшетов; О манипуляции с топографическими планшетами.
Резюме Завершая эту главу, в которой совсем не было "исходников", но было множество спорных рассуждений и утверждений, мы хотим пояснить следующее. Хота на сей раз мы много критиковали продукты фирмы Autodesk, но делали это "по-родственному". Система AutoCAD и продукты на ее основе могут быть очень удобными инструментами для ГИС, прежде всего благодаря набору инструментов для разработчиков. Главным препятствием остается цена продуктов, терпимая в САПР, но неприемлемая для ГИС. Если это обстоятельство для кого-то из читателей не является препятствием, то для разработки собственной ГИС на базе системы AutoCAD мы все-таки рекомендуем приобретать специализированные продукты (Autodesk Map u комплекте с Raster Design, как минимум). В любом случае вы будете иметь базовый AutoCAD, по вдобавок получите набор полезных утилит, многие из которых вам пригодятся. Autodesk Map имеет и собственный интерфейс для разработки прикладных программ. Советуем обратить внимание на Raster Arts — серия программ, разработанных фирмой Consistent Software для работы с гибридной (растроно-векторной) графикой. По
Глава 34. Интеграция САПР и ГИС
1075
нашему глубокому убеждению продукты российских разработчиков в этом секторе завсломо лучше импортных — хотя бы потому, что наши разработчики знакомы с достоинствами и недостатками "ихних", даже если не принимать во внимание, что "наши" вообще "чрезвычайно умны и сообразительны". "Чрезвычайный ум" и "сообразительность" понадобятся также читателям, решившимся на внедрение ГИС-технологи и — не для решения технических проблем, а для решения множества организационных и координационных задач. Это горащо сложнее, чем "запрограммировать" ГИС на базе системы AutoCAD.
ЧАСТЬ
V
CAD
Выпуск системы в свет Глава 35.
Создание справочной системы
Глава 36.
Разработка инсталлятора
Глава 37.
Подготовка к распространению
Глава 38.
Особенности AutoCAD 2005
.ru/CAD ГЛАВА 35
1Л
Создание справочной системы Одним из основных отличий программного продукта от программы (или даже большой "кучи" программ, как у нас) является наличие документации и справочной системы. Это самое больное место большинства даже очень хороших профамм 1 . Так уж "устроены" программисты, что заниматься скучной работой по разработке документации им очень не хочется. Документация всегда откладывается "на потом", а потом не остается времени. Мы в этом отношении не являемся исключением. Наши клятвы, произносившиеся в первых главах, мы хоть и не забыли, но и не выполнили. Полноценной справочной системы мы, разумеется, не имеем. Правда, одновременно с разработкой мы успели написать эту книгу, т. е,, по традиционной мангре российских программистов, попытались сделать "как лучше", хотя заказчик продукта нас об этом не просил. В больших фирмах разработке документации уделяется офомное внимание — там этим занимаются специальные "дивизионы". Но даже в таких условиях наша любимая система AutoCAD и ее "десктопы" в последних версиях не имеют полноценной русскоязычной документации, какая была когда-то для AutoCAD R12. В современных условиях бумажная документация все более сдает позиции. Многие производители стараются экономить и ограничиваются справочной системой и документацией в электронном виде. Конечно, настоящая бумажная документация удобней лля пользователя. Очень многие пользователи до сих пор с блаюларностью пользуются руководствами из упоминавшейся системы AutoCAD R!2. Однако и культура многих пользователей ч отношении использования справочных систем очень низка. Даже имея справки на родном языке, они ими не пользуются. Объясняется это, возможно, тем. что обычно справочные системы были англоязычными и малопонятными рядовым пользователям. Теперь это давно не так, но "наш человек" предпочитает потратить массу сил па поиск информации is Интернете, вместо тою, чтобы нажать клавишу и решить вопрос за несколько секунд. У нашей "фирмы" возможности по изготовлению документации минимальные, поэтому мы решаем обойтись электронными материалами. Пока. Пока не "ра.чбо!атеем". Ох уж эти благие намерения... Есть и приятные исключения — например, нешшокрачно упоминавшаяся нами программа ACADVai Алексея Васильченко
1080
Часть V. Выпуск системы в свет
Что уже сделано Несмотря на покаянное и пессимистичное вступление, мы можем отметить, что у нас имеется хороший задел. П Во-первых, при загрузке каждой LISP-про граммы может, по желанию пользователя, предварительно ВЫРОДИТЬСЯ для просмотра файл с описанием работы этой программы. Именно для этой возможности мы и создавали "псевдопрограммы", фактически вызывающие одну функцию. Напомним, что справки к программам могут быть в виде простого текста или в HTML. П Во-вторых, мы сделали так, чтобы этот файл справки, при запуске программы разработчиком, выводился в режиме редактирования. Тем самым мы заставляли себя написать сразу хоть несколько фраз о работе программы. Этого мало, но это уже кое-что. П В-третьих, мы придумали такой же фокус с диалоговым окном Советы дня. Файлы советов у нас также понемногу накапливаются. П В-четвертых, наша программа ш Lisp Explorer позволяет автоматически создавать HTML-файлы исходных текстов с подсветкой синтаксиса. П В-пятых, у нас есть огромный резери в виде пользователе И-активистов, осваивающих нашу систему. В своих прошлых разработках мы применяли такую практику — предоставляли избранным людям в пожизненное бесплатное пользование наши программы в обмен на то, что они эти программы документируют. Есть категория людей, которым для того, чтобы что-то запомнить, нужно непременно законспектировать. Так пусть "конспектируют" функционирование нашей программы, изучая ее в работе. Таких л юл ей мало, но пользу они приносят огромную.
Н1_Р,СНМ или HTML Рано или поздно нам придется делать настоящую справочную систему. Текстовые "конспекты" нам, конечно, пригодятся, но придется сделать выбор формата справочников. Расписывать их особенности нашим читателям нет смысла — они с ними прекрасно знакомы. Первоначально в Windows использовались справочные HLPфайлы, в дальнейшем появился формат СНМ. Оба формата имеют свои достоинства и недостатки. В системе AutoCAD до сих пор используются оба формата. Фирма Microsoft перспективным считает формат СНМ, так оно, видимо, и будет. С развитием Интернета весьма распространенным приемом стало использование справок в формате HTML. Действительно, очень удобно иметь одни и те же материалы на сайте и в справочной системе. Впрочем, работать на локальном компьютере с HTML-справками не очень-то удобно, т. к. нельзя воспользоваться поиском во всем содержимом. Современные инструментальные средства позволяют легко собрать из отдельных HTML-страниц единый СНМ-файл. Писать HTML, предназначенный для использования в справках, нужно как можно проще. Не следует применять никаких "украшений", вес желательно делать в "академическом" стиле, с использованием минимальной номенклатуры логических теroi! — заголовков, абзацев, списков, ссылок.
Глава 35. Создание справочной системы
1081
Инструмент для создания справок Скомпоновать справочную систему с использованием современных инструментальных средств несложно. Не стоит даже рассчитывать на "официальную" технологию — написание текстов в формате RTF с последующей компиляцией. Систем разработки "хелпов" существует много. Выбор их определяется обычно финансовыми возможностями и привычками разработчике!!. Одной ил лучших программ такого класса является Help & Manual (рис. 35.1). ||«HelplManu^[C;Viu\Md\Souice\He*,W:adl.iipLib.tim3] Fife
Copies
Ed*
|
£eafch ^iew
Insert
jJJM,'. -„serf
Tjble
TooJ$
£юрй
Jjio j ••
К S Я := t= tf ffi:i*-tr
-_J
* ,£ Table of CfTMefufE IjJ 1М1--райлы
^
1>
О
Topicoptions Help te'l 1
О -j
?1 rif eed def-ini ^ Преобразованиа LU ЗагС^З^а приложений _?| ru-loa-1 JJj ^^ЕЗЗрЕЗЕЗ
?
Ь-**-"ы°^
Line
s J- H «•
-i t*f li=i
'1
Г
НЕЙ!
Help
Т Cot 1
,
>(
Д
g. . . i
. -i . . . , . . - 2 .
. , . . . з; .
ru-make .fas-tile
jj
;интаксис
_^J
^pryueHiu f il^ name - короткое имч файла беэ расширения Цействие Конпилир)в1 LSP-файл из ка!эяогэ (сходны* ISICIOB в FAS-файя в каталог АРР Возвращает INS
fD5030322-1?^Cl]ToprtJD=Ru-mahe-ras-filt, Wmdo* ,,.
Рис. 35.1. Окно программы Help 8 Manual
Эта программа позволяет, используя один проекг, изготовить справочную систему в форматах WinHelp (.HLP), HTML Help (.CHM), HTML, Adobe PDF, Microsoft Word (.RTF) и MultiMedia Help (e-Books). Очень полезна возможность создания проектов из HLP- и СНМ-файлов с их декомпилированием. Постепенное занесение в проекты Help & Manual наших текстовых и HTMLполуфабрикатов будет наилучшим решением. На технологии работы с этой программой мы не будем задерживаться. Она достойна написания специальной книги, хотя освоить ее можно самостоятельно за несколько часов.
Публикация в Интернете Продвижение современных программ без собственного сайта невозможно. Тем более такой объемной системы, как наши. Для отдельных небольших программ можно обойтись их размещением в "софтовых" каталогах (и иметь от этого приличный доход), для крупной системы наличие собственного сайта обязательно. Бесплап 1
1082
Часть_У. Выпуск системы в свет
хостинг на различных "народных" ресурсах вряд ли поможет, такие услуги предоставляются с ограниченным набором доступных средств и склонны, после собственной "раскрутки", превращаться в платные. При создании сайта основное внимание нужно уделять не дизайну, а содержанию. Посетитель должен прежде всего получить полное представление о возможностях продукта и условиях приобретения. Вспомните, чего вам не удавалось обнаружить на сайтах, продвигающих программы, и не допускайте у себя таких ошибок. О том, как создать сайт, мы, конечно, писать не будем'. Советами и руководствами по этой "кухне" заполнен Интернет.
Дополнительные справочники Помимо справок по работе с программами в САПР можно включать множество справочной информации по различным аспектам проектирования. Каждый проектировщик работает, обложившись множеством справочников и нормативных документов. Как правило, в каждой книге "зачитаны до дыр" всего несколько страниц. Мы практически без дополнительных усилий можем дополнить свою систему мошной справочной службой, создавать которую будут сами пользонатели. Многие проектировщики, имеющие доступ к Интернету, давно "накачали" себе гигабайты всякого "добра" — от электронных изданий СНиП и ГОСТ до всяческих статей и невесть зачем прихваченных DWG-файлов. Но разобраться с этими драгоценными запасами и найти в них нужное бывает труднее, чем вновь разыскать материал в Интернете. Существуют и про граммы-каталогизаторы, хорошие и разные. А ведь в нашей системе уже все есть для упорядочивания таких ресурсов. Мы умеем работать с XML-меню, можем встроить такое меню куда угодно (вспомните программу-стартер), можем описать в нем все, что угодно, да еще с иллюстрациями. Давайте предоставим пользоиателям шСАО возможность самостоятельного ведения электронных справочников.
DWF-справка Одним из возможных вариантов является создание справок в формате DWF. Это трудоемкий способ, т. к. предварительно нужно нарисовать требуемое в системе AutoCAD. Но такие "рисунки" всегда делались энтузиастами на бумаге, каких только "справок" не доводилось наблюдать. Научим нескольких дотошных "девочек" (увы, обычно бальзаковского возраста) этой нехитрой технологии, главный секрет которой — как написать XML-меню, мы много раз разбирали, DWF-слравки удобны тем, что внутри могут быть ссылки на другие ресурсы, в том числе на другие DWF, Самой мощной справочной системой такого рода, которую нам доводилось создавать, является топографический план г. Кургана М 1:500 с общей схемой перекрытия города топографическими планшетами, возможностью просмотра любого из них и перехода на соседние. Специалистам, занимающимся проектированием генплана и инженерных коммуникаций, не нужно объяснять, что дает такая система в практической работе. Наш сайт, посвященный системе niCAD, — www.kurganobl.ru/cad
Глава 35. Создание справочной системы
1083_
Растровые справочники Во многих ситуациях поможет простое сканирование нужных страниц, сохранение в растровом формате и включение ц XML-меню. Вспомните, наше XML-меню может иметь иллюстрацию к любому элементу. Обычно иллюстрации делаются маленькими по размеру, но ничто не мешает сделать их большими и основным содержанием, а прочие элементы — дополнительными комментариями.
Резюме В этой очень короткой главе мы напомнили про некоторВ1е возможности системы, позволяющие, в первых версиях, предоставить пользователям хотя бы суррогатную документацию. Идею о нагрузке пользователей черновой работой по разработке справок трудно реализовать, но это возможно. Это следует возложить на "дипломата", который обязательно должен быть в команде разработчиков.
.ru/CAD ГЛАВА 36
P
Разработка инсталлятора Любой программный продукт должен поставляться в виде установочного (инсталляционного) комплекта. С помощью инсталляционного комплекта пользователь с ква1 лификацией "чайника" должен иметь возможность установить программный продукт и при необходимости удалить его из системы. Некоторые программисты особо подчеркивают, как достоинство, что их программа не требует инсталляции, достаточно скопировать файлы в "подходящее" место. Как правило, это несложные в эксплуатации программы, которые действительно можно запускать из любого места, но при некоторых ограничениях — пользователю, от имени которого запускается программа, должно быть дозволено выполнять действия, выполняемые программой, например, запись файлов в те каталоги, в которые вздумает их писать эта программа. Для серьезных программ такой способ установки (скопировал в любое место и запустил) просто невозможен. Мы уже писали о том, что система AutoCAD 2004 раскладывает свои файлы но сотням каталогов и производит запись в реестр нескольких тысяч ключей. Это делается не для того, чтобы попортить побольше крови пользователям и администраторам, а для того, чтобы обеспечить работу в современных многопользовательских операционных системах. Еще система AutoCAD 2002 устанавливалась так, что работать на ней мог только пользователь с правами Power User, что вызывало справедливый гнев системных администраторов, подрывало уважение к столь солидной фирме и заставляло искать лазейки для обхода ограничений. Как работают инсталляционные программы, наши читатели, конечно, знают. Теперь нам предстоит узнать, как они делаются. Давайте разберем, что требуется проделать, чтобы установить систему ruCAD на компьютер конечного пользователя без программы-инсталлятора. Зная это, мы будем знать, что должен выполнить инсталлятор, а потом придумаем, как это сделать. Прежде всего вспомним основные вопросы, связанные с безопасностью в Windows NT/2000/XP (далее будем применять название Windows NT, как общего "предка" этих операционных систем). Заодно уточним и терминологию.
1
На домашнем компьютер?. Вряд ли в корпоративной системе администратор предоставит обычным пользователям право устанавливать программы.
Глава 38. Разработка инсталлятора
Коротко о безопасности Напомним, что в Windows NT каждый пользователь имеет два типа прав доступа. разрешения (permissions) и права (rights). Разрешение — возможность доступа к кснкретному объекту определенным способом, например, записи в файл, Право — возможность выполнить действие, воздействующее на всю систему. Права и разрешения одновременно обычно называются привилегиями (privileges). Каждый пользова1 тель при входе в Windows NT проходит процедуру регистрации , а при попытке доступа пользователя к любому объекту или свойству производится проверка привилегий данного пользователя и по результатам этой проверки доступ предоставляется или отклоняется. Каждому пользователю Windows NT соответствует учетная запись. определяемая именем пользователя и паролем, который он вводит при регистрации. Существуют две особые учетные записи с предопределенными привилегиями: "АдMutiticmpamop" (Administrator) и Тое/иь" (Guest). Дли удобства управления пользователи объединяются в группы с одинаковыми привилегиями. При инсталляции Windows NT на рабочей станции создаются несколько стандартных предопределенных групп: "Администраторы" (Administrators), "Опытные пользователи" (Power Users), "Пользователи" (Users), "Гости" (Guests) и некоторые другие специальные группы. В доменных сетях существуют свои стандартные группы, разбор свойств которых не входит в рамки этой книги.
Замечание В нашей системе также существуют пользователи, группы, администраторы и гости. Впредь, во избежание недоразумений, мы будем именовать их пользователями ruCAD, группами ruCAD и администраторами ruCAD. Все члены группы "Администраторы", в которую по умолчанию входит пользоватгль "Администратор", обладают максимальными, из предоставляемых по умолчанию, правами 1 на управление системой — их много, а перечислять нет места, В контексте настоящей главы укажем только, что "Администраторы" могут взять на себя владение любым файлом. Члены группы "Опытные пользователи" не могут стать владельцами чужих файлов, но могут предоставлять в совместное использование папки. Члены группы "Пользователи" не могут предоставлять в совместное пользование каталоги (если только одновременно не являются членами групп "Опытные пользователи" или "Администраторы"), Обычно большинство пользователей являются членами группы -• "Пользователи" и/или "Опытные пользователи". Системный администратор может, а администратор домена просто обязан, создавать и иные группы пользователей с одинаковыми правами, например "Пользователи ruCAD". Каждый пользователь может входить в одну или несколько групп или вообще не входить в группы — это определяется политикой безопасности, проводимой администратором. Права членов стандартных групп могут быть изменены. Посколь-
1
Регистрация может производиться автоматически, что не должно вводить в заблуждение — Windows NT в любом случае использует учетную запись пользователя для доступа к об!>сктам от его имени Автоматическая регистрация недопустима в корпоративной среде. ! Существуют права, не предоставляемые по умолчанию операционной системой Windows NT, даже илминистра-юрам, но это тема совершенно отдельного разговора.
IQgg
Часть V. Выпуск системы в свет
ку представить и тем более разобрать все варианты управления правами не представляется возможным, мы ограничимся разбором только тех привилегий, которые имеют прямое отношение к установке и функционированию нашей системы. При упоминании стандартных групп и прав мы будем исходить из установок, производимых системой при инсталляции. Обычно компьютер закреплен за одним "человеко-пользователем", но наведываться в гости могут и посторонние лица, в том числе незваные. Иногда на компьютере попеременно работают разные люди. Разумный пользователь, предоставляя компьютер даже "лучшей подруге", должен всегда выйти из системы и предоставить посетителю возможность зарегистрироваться под своим именем. Администратор, если ему это надо, доберется до ресурсов компьютера и в удаленном режиме. В файловой системе NTFS, используемой в Windows NT, для каждого файла, помимо традиционных сведений (имени, размера, даты и времени последнего изменения), хранится также список управления доступом (Access Control List — ACL), определяющий для пользователей доступ к папкам и файлам. У каждого файла установлен режим доступа и владелец (как отдельный пользователь, так и группа). Владелец — это пользователь, создавший файл. Пользователи имеют разрешения (permissions) на действия с файлом, установленные операционной системой. Права на вновь созданный файл назначаются по правилам, установленным для контейнера (каталога), в котором он создается. Даже "Обычный пользователь" может запретить доступ к файлу, на который он имеет право на изменение доступа (Change Permission), всем пользователям, включая членов группы "Администраторы" и себя самого, но "Администратор" может взять на себя владение файлом (в журнале системных событий об этом останется запись), а "Опытный пользователь" "заатадеть" чужим файлом, как правило, не может.
Как установить систему ruCAD вручную Сценарий установки в значительной степени зависит от используемой операционной системы. Если бы система ruCAD применялась в Windows 98 или в Windows 2000/ХР пользователем с правами администратора (что, само по себе, неоправданно), то все можно было бы проделать очень просто: 1. Скопировать (или разархивировать при поставке в виде Zip-файла) каталог ,ru со всеми подкаталогами в корень диска С:. 2. Выполнить командный файл c:\.ru\cad\bin\reg_rLiSrv.bat для регистрации наших СОМ-серверов. 3. Выполнить файл c:\.ru\cad\bin\niCAD.reg для внесения в реестр записей о расположении компонентов нашей системы. Последние два действия можно было бы произвести с помощью одного командною файла. Если бы мы решили установить ruCAD в более подходящее место, например в каталог c:\Program Files\ru, то пришлось бы еще и отредактировать REG-файл. Для запуска системы потребовалось бы создать ярлык файла ruCAD.exe на рабочем столе или в панели задач Windows. Прочие настройки (параметры пользователей, выбор рабочей системы AutoCAD) можно было бы осуществить из программыстартера.
Глава 36. Разработка инсталлятора
10Ь7
При установке ruCAD в Windows 2000/ХР для работы обычного пользователя придется разложить файлы по папкам, доступным этому пользователю. Подробно эти вопросы мы рассматривали в главе 3. Итак, программа-инсталлятор должна выполнить следующий минимальный набор операций: П запросить каталоги для установки компонентов системы; О скопировать в назначенные каталоги требуемые файлы; О выполнить регистрацию компонентов системы в реестре и, при необходимости, произвести соответствующие записи в lNI-файлах; D запросить разрешение и, при положительном ответе, создать необходимые ярлыки в главном меню, на рабочем столе и в панели задач; О обеспечить последующее корректное удаление системы. Кроме того, инсталлятор обычно позволяет выбрать комплектность установки программы, а также выводит дополнительные сообщения — знакомит с лицензионным соглашением и особенностями программы. В нашей системе мог бы быть запрос нескольких каталогов, например для размещения классификатора слоев или базы д а н н ы х спецификаций оборудования, которые могут уже существовать в общедоступных каталогах или даже на удаленном сервере. В рамках книжной версии мы этого делать не будем.
Присядем "на дорожку" и подумаем А теперь задумаемся — все ли мы делали правильно до сих пор? В главе 3 мы рассуждали о том, как будем сохранять настройки, но еше не знали, что именно будем сохранять. Теперь у нас имеются все программы, разработанные нами в соответствии с намеченной концепцией. До сих пор сами мы работали с привилегиями Администратора и делачи что хотели. При этом мы считали, что наши решения обеспечат и работу обычных пользователей. Еще раз продумаем, верно ли это утверждение. Напомним, что права пользователей ruCAD, получаемые ими при регистрации в программе-стартере, не имеют никакого отношения к правам этих же людей, как пользователей Windows. Администратор САПР может быть "чайником" в работе с Windows и зарегистрирован в ней как обычный пользователь, хотя, конечно, такое нежелательно. Системный "суперадмин", в свою очередь, может ничего не понимать в САПР, что нежелательно еще более. Все дальнейшие рассуждения будут распространяться на пользователей Windows NT/2000/XP.
Кто должен устанавливать ruCAD Устанавливать систему ruCAD должен будет администратор, а работать с ruCAD обычный пользователь, или, правильнее, такой, который может работать с системой AutoCAD. С точки зрения работоспособности нашего программного продукта, установка системы администратором требуется из-за необходимости регистрации серверов (впрочем, это может делать и Power User) и потребности записи в раздел реестра HKEYJJSERS \.DEFftULT (а это доступно только Администраторам).
/088
Часть V. Выпуск системы в свет
Куда копировать файлы Устанавливать файлы лучше всего в каталог, доступный всем пользователям. Хотя у нас, на период разработки, был предусмотрен каталог Local settings, в нем не оказалось ничего, учитывающего специфику пользователя Windows. Для облегчения последующих настроек мы будем устанавливать все файлы в подкаталоги папки %ALHJSERSPROFILE%\Application l)iita\mCAD. Внутри этой папки мы все-таки создадим подкаталоги: 3 Shared — для файлов, которые могут переноситься в другие места, в том числе на разделяемые ресурсы других компьютеров; d Local Data — для файлов, которые всегда должны находиться на компьютере пользователя; О UserData — для специальных данных групп пользователей САПР; О OtnerData — для данных посторонних приложений, которые у нас непременно появятся. Исполняемые файлы приложений будут устанавливаться в выбранный каталог, предлагая для этого %ProgramFiles%\ru\CAD 1 .
Что и куда писать в реестр Записи в реестре определяют расположение компонентов системы. Пока мы читали ИХ ИЗ ВеТКИ HKEY_CrjRWMTJJSER\Software\ruCAD group\ruCAD. НО КЗК данные ПОПадуТ В
эту ветку для каждого пользователя, если устанавливает систему только один пользователь, хоть и администратор? Необходимо уточнить алгоритм работы. При установке системы администратором производится запись в раздел реестра HKEY_LOCAL_MACHINE\Software\ruCAD groupXruCAD. ЭТОТ раздел доступен ВССМ ПОЛЬЗОВа-
телям для чтения. При запуске стартера любым пользователем расположение компонентов определяется так: О сначала ищется ключ в ветке HKEY_CORRENT_USER\software\CUCAD groupXruCAD, если там обнаружены данные, то они используются, а иначе данные читаются из ветви HKEY_LCCAL_MACHIHE\Scftware\tuCAD groupXruCAD; 3 запись данных измененных пользователем производится в ветвь HKEY_CURREMT_ USERXSoftware\ruCAD groupXruCAD;
О если после установки ruCAD будет создан новый пользователь Windows, то для него устанавливаются "настройки по умолчанию", копируемые из ветви HKEYJJSERSX.DEFAULT. Мы также можем записать сюда некоторые данные, наподобие всяких "подлых ловушек", записываемых некоторыми программами.
Разборки с системой AutoCAD Для того чтобы система mCAD заработала сразу, необходимо, чтобы она знала, какую систему AutoCAD запускать, которая в свою очередь должна иметь профиль ruCAD. в котором в ключе с именем ACAD следует записать пути поиска н а ш и х 1
Выделяем подкаталог rU\CAD потому, что у нас уже зреют "коварные замыслы" по созданию ISi, ru\DOCS.
Глава 3В Разработка инсталлятора _
_
1089
каталогов, да еще такие, куда система будет устаноплена. Такой профиль должен быть записан в ветви реестра [HKEY_CURRENT_USERXSoftuare \Autotfesk\fiutoCAD \R%AcadVersion% .OUAcadKey* \ProfileE\ruCAD\General] ,
где %sca
Не надо унывать! Итак, хотя мы и старались предусмотреть при разработке программ все возможные ситуации, без их корректировки нам явно не обойтись. Вот тут и пригодятся дальновидные решения по инкапсуляции кода в одно место. Нам не придется корректировать десятки мест, в которых могло бы быть чтение данных из реестра, достаточно изменить два-три участка кода.
Как делаются установочные комплекты Изготовить инсталляционный комплект можно даже с помощью архиватора RAR. позволяющего, при некотором навыке, подготовить довольно интеллектуальный сценарий установки программы, но обычно используются специализированные программные продукты, предназначенные для создания инсталляций. Все они имеют общий принцип работы: D с помощью программы-оболочки 1 (обычно работающей в режиме Мастера) формируется сценарий установки программы; О в соответствии со сценарием формируется дистрибутив продукта в виде одного или нескольких файлов, обычно с возможностью поставки на различных видах носителей. При формировании дистрибутива в него могут включаться дополнительные библиотеки, требуемые для работы устанавливаемого продукта, причем некоторые инсталляторы позволяют, запустив приложение, подлежащее установке, выяснить, какие библиотеки оно использует, и включить их в комплект поставки. Мощные пакеты имеют в собственном составе архивы со всеми распространенными дополнительными компонентами (BDE, MDAC и т. п.).
Подготовка к созданию дистрибутива Прежде чем формировать дистрибутив, необходимо как следует подготовить исходные файлы, из которых он будет комплектоваться. Наша система но время разработ-
1
Некоторые инсталляторы ire имеют интерфейсных оболочек, сценарий создается вручную, что иногда даже удобнее, а для отдельных оболочки ра)рабатывают сторонние авторы. 35
Зав 834
1090
Часть V. Выпуск системы в свет
ки находится в каталоге c:\.ni\CAD. Сейчас у нас наверняка имеется масса мусора — устаревшие файлы, "натасканные про запас" блоки, документация, всякие посторонние утилиты и прочее неведомо откуда и зачем "притащенное добро". На всякий случай спрячем это все в специальный "архив-снимок" текущего состояния.
Уменьшение размеров приложений Мы разработали довольно много приложений к mCAD в среде программирования Borland Delphi и видим, что размер DLL- и ЕХЕ-файлов получается весьма значи1 тельный — от 0,4 до 1,4 Мбайт . Если заглянуть в любой из таких файлов с помощью подходящего редактора ресурсов, то можно обнаружить внутри массу кнопок, картинок и текстовых строк, которые мы нигде не использовали. Вызвано это тем, что Delphi статически прикомпоновала к приложению пакеты, в которых содержатся стандартные ресурсы. Отделять используемые ресурсы от неиспользуемых компилятор и сборщик не умеют (таковы уж отрицательные последствия быстрой разработки). Для приложения, состоящего из одного ЕХЕ-файла, включение внутрь всех его ресурсов может быть достоинством. Если файлов много и в каждом из них "зашита" одна и та же информация •— это плохо. Фирма Borland предусмотрела возможность использования пакетов (packages) специальных динамически присоединяемых библиотек, содержащих визуальные компоненты и другие объекты. Приложение, откомпилированное с включенным флажком Build with runtime packages на вкладке Packages диалогового окна Project Options, булет иметь меньший размер. Вопрос в том, насколько меньший. Часто приводятся примеры, в которых пустое приложение, откомпилированное с поддержкой пакетов, "весит" в 20 раз меньше, чем при компилировании без пакетов, но при этом вместе с приложением размером 15 Кбайт нужно поставлять библиотеки общим размером до 5 Мбайт. В реальных приложениях соотношение иное. Наша программа-стартер, откомпилированная с поддержкой пакетов, будет иметь размер 315 Кбайт, без поддержки 860 Кбайт. Уменьшение размеров уже не в двадцать раз, но "головной боли" у нас будет больше, т. к. нам нужно абсолютно точно знать, какие именно дополнительные файлы мы должны будем поставлять в комплекте системы. Это будут не только стандартные библиотеки, но и пакеты времени выполнения из всех используемых нами дополнительных библиотек. Но и это еще полбеды. Если мы перекомпилируем хотя бы одно приложение в другой иерсии Delphi, то должны будем включить в поставку пакеты и из этой версии. Нет никаких гарантий, что во время всех этих "махинаций" с пакетами мы не допустим ошибок, за которые будут расплачиваться наши пользователи, которые в самый интересный момент могут получить сообщение об отсутствии какого-то файла. Поэтому мы принимаем решение — не использовать пакеты времени исполнения.
Малый размер файлов, созданных в других средах, например в Visual Basic, не должен ннодить в иблужденис — они также используют дополнительные ресурсы, только спрятанные и других DLL и OCX.
Глава 36. Разработка инсталлятора
__^_
1091
Перекомпиляция приложений Далее следует перекомпилировать все Delphi-приложения. В каждом приложении следует снять отладочные режимы, убедиться, что флажок Build with runtime packages отключен, убрать все "черные ходы", которые мы оставляли, например, в диалогах регистрации пользователей, заполнить, где это доступно, информацию о версии программы. Кроме того, нужно проверить соответствие иконок приложений, логотипов и прочих оформительских элементов текущему состоянию пашей системы. Работа эта муторная, но больше откладывать ее нельзя.
Кстати, о логотипе Внимательные читатели, возможно, заметили, что логотип и иконки приложений, показанные на нескольких рисунках, совсем не соответствуют рис. 2.2. Отвратительная (по нашему нынешнему мнению) "лапа" заменена на изящный (опять же по сегодняшнему представлению) "карандаш", составленный из нескольких "листов-слоев", имеющих цве~а российского флага (цвет на черно-белых иллюстрациях не виден). Вызвано это тем, ч~о рука сложной формы плохо масштабировалась на иконках, превращаясь в непонятное пятно. Пришлось тщательно, до пиксела, проработать один из наших прежних логотипов, сделать несколько вариантов для разных масштабов (иконки 16x16 и 32-32 пиксела, большие и малые заставки), включая эскиз рекламной растяжки, место для размещена которой мы уже наметили.
Упаковка файлов Позаботиться об уменьшении размеров файлов не мешает. Нас не так волнует место, занимаемое программами на диске, как размер файлов дистрибутива, которые пользователям придется "качать" из Интернета. Есть еще одна возможность уменьшить размер ЕХЕ- и DLL-файлов — сжатие специальными программами. Часто применяется программа UPX (Ultimate Packer for executables)1. Это консольная утилита, позволяющая примерно в два раза снизить размер исполняемого файла. Для облегчения работы можно воспользоваться интерфейсной оболочкой к JTOH программе — UpxShell2. Использование UPX позволило снизить размер файлов в нашем каталоге BIN с 20 до 7,8 Мбайт. На размере дистрибутива это не скажется так значительно, т. к. файлы, уже сжатые UPX, будут в меньшей степени сжиматься при упаковке инсталлятором. В наших условиях размер дистрибутива уменьшается всего на 10%. Однако все гораздо сложнее. Windows при запуске программы загружает в память не весь код сразу, а только часть кода, которая требуется для исполнения. Если программа имеет пункт меню Print и код для выполнения при выборе этого пункта, то код загружается в память только тогда, когда пользовачель выбирает данный пункт. Если после загрузки кода в память он не используется некоторое иремя, то код выгружается из памяти, память освобождается и может быть использована другими программами (процесс, именуемый paging). При запуске нескольких экземпляров программы одна и та же область памяти используется для каждого из них. "Компрессоры" ЕХЕ-файлов полностью блокируют работу метода paging, разжимая весь код в память и сохраняя его там ло конца работы программы. Код в упакован1 1
upx.soiirceforge.nel. Авторы Markus F X.J. Obcrhumer и Laszlo Molnar bash.hotbox.ru. Автор Евгений Башким
1092
Часть V. Выпуск системы в свет
ном ЕХЕ-файле хранится в таком формате, что операционная система не в состоянии разделять тот же блок памяти для нескольких экземпляров программы. В результате, сэкономив несколько мегабайтов на диске, мы можем получить перерасход куда более ценной оперативной памяти. Эксперименты .Джордана Рассела (Jordan Russell), автора программы Inno Setup, показали удивительные результаты; при сжатии файла MSACCESS.EXE с помощью UPX размер файла снизился на 2,2 Мбайт, но размер используемой памяти при запуске одного экземпляра программы увеличился на 5 Мбайт, а при запуске двадцати экземпляров — на 100 Мбайт по сравнению с несжатым файлом! Двадцать экземпляров мы запускать не будем, но дальнейшее баловство с "ЕХЕ-выжи малками" прекратим.
Упаковка DWG-файлов Не нужно забывать и об удалении "мусора" из DWG-файлов, входящих в поставку. Все файлы блоков и библиотек блоков следует очистить от неиспользуемых блоков, слоев и всего такого прочего с помощью команды PURGE или специальных утилит.
Второй этап чистки После первого этапа "чистки рядов" скопируем все, как есть, в специальный каталог c:\.mVrulnstair\cad, в котором всегда будем хранить исходные файлы, включаемые В дистрибутив, и начинаем более жестокую разборку, безжалостно удаляя все ненужные файлы. Не забываем удалить все файлы с расширениями bak (временные файлы), todo (наши заметки для памяти), replace, blocks {временные файлы для переименования блоков), cdc, err, dmp, mnc, runs, mnr, Thumbs.db ("грязь" от AutoCAD), \cad\All Users\iisers.ini (история действий пользователей). Разыскиваем и удаляем INI-файлы, в которых встречаются упоминания конкретных каталогов диска С: — FormStorage.ini, RU_USERS.INI. Редактируем cad\Local Settings\Application Data\ruCAD\ru_users.mdb — удаляем всех пользователей, кроме ADMIN с паролем rucad. В результате до 43 Мбайт.
всех
чисток
общий
размер
наших
файлов
уменьшился
с
88
Для облегчения ориентировки в файлах перенесем их, как намечено, в подкаталоги Shared, LocalData, UsersData и OtherData каталога c:\.ra\_mlnstall\cad.
Установка даты и времени Обычно у всех файлов инсталляционного комплекта устанавливают единую дату и время, отражающие номер версии. Мы будем выпускать версию 0.9, и нам нужно установить время 00:09 и текущую дату выпуска. Сделать это можно разными способами, мы просто выделим в Total Commander корневой каталог, выполним соответствующий пункт в меню Файлы | Изменить атрибуты (Files [ Change Attributes) и установим параметры изменения атрибутов (рис. 36.1). Теперь мы готовы к созданию установочного комплекта.
1093
Глава 36. Разработка инсталлятора Изменение атрибутов Обрабатывать с л ~ И irrt [7 а
h Скрыть* 17
[30 09 ОД CnfMWa Рис. 36.1. Изменение даты и Бремени асех файлов комплекта
Выбор инструмента Выбор продукта для создания инсталляций зависит от сложности требуемого сценария и комплектности системы. Немалое значение имеет и стоимость системыинсталлятора. Очевидно, что нет смысла приобретать мошный инсталлятор InstallShield Professional стоимостью около $700 для создания дистрибутива условнобесплатной программы, стоимостью $25. В то же время, если программа разрабатЕ.1вается с использованием Delphi, то можно воспользоваться версией InstallShield Express, поставляемой с Delphi. Инсталляции отдельных приложений для AutoCAD можно создавать с помощью простой, но достаточно мощной программы Ghost Installer Алексея Попова. Эта программа, основанная на использовании архиватора RAR, теперь стала коммерческим продуктом, но имеет и бесплатную версию, отличающуюся тем, что сценарий нужно писать вручную. Когда-то автор учел некоторые наши советы по совершенствованию программы, а мы ее использовали для создания инсталляций системы BestlA. Помимо упомянутых систем подготовки инсталляций используются и другие превосходные продукты (MindVision's Installer VISE, WISE Installer, GkSetup, Createlnstall и др.). Мы их исследовать не будем, а воспользуемся хорошим и бесплатным инсталлятором Iimo Setup1. Этот инсталлятор имеет достаточный ассортимент возможностей, доступен для бесплатного использования с исходными текстами и имеет несколько графических оболочек разных авторов.
Работа с программой Inno Setup Внешне основная программа Inno Setup (Compil32.exe) представляет собой простенький, казалось бы, текстовый редактор сценариев инсталляции (рис. 36.2), из которого можно запустить сценарий и скомпилировать дистрибутив. www .jrsoftware.org.
/094
Часть V. Выпуск системы в свет
Г, fuCADBookLT - Inno Setup Compile) 4.0.10
: SEE THE DocVKEUTiTi.'.
:
г IT.-.:
::: -•:....-::;; I N K ; .IT":- /
^" AppName=MHTtpp нр о ванная система ruCAI» I SpfVevNanie=ruCAll boot LT version 0.90 1 AppPuto Jlshei:°i:uCAD group
II e f au 1 t Gr oupNam* " r uC AD n ; Licens^F i l e i : u C A D l t cense, tit
1. 1
Insert Рис. 36.2. Программа Inno Selup Compiler
№СЛ lulnslemiuCADBooUT.iS! - ISIool Файл Редактировать &f Q
D
Просмотр Проест 5
4
, x
Section
Помошь ?
Options - fin Secliom -
Filej DeBDJ
Name J 0-infdim
-Jji Удаленье после у. 3 Запуск после установки J) Удаление гриденмсгалпяцин * О
(appIMm
Р гu^GelSJj с.в'
INI
^ nj_XML&ftd.e>;e J uGelDoubleSli exe
catfjj..
|_J ruLsv^iiExplorei sxf ." njL -;з£хр1огег е"&
cad\bi cad^i
Сообщения -: КОМПЧ-Ч1-ПЫ
£ Languages _J Секции JSTool "J2 фаза перед кслвига^йей сжрипта 3] фаза после г^омпилд1ией скрипта _--| ?Т _ _U
Рис. 36.3. Окно программы ISTool
Мощь и возможности этой замечательной программы заключаются в том, как она обрабатывает сценарий и что в этом сценарии можно предусмотреть. Программа Inno Setup имеет массу возможностей, описание которых заняло бы очень много места. То, что потребуется нам, мы разберем на конкретном сценарии установки системы ruCAD. Файл сценария можно редактировать и вручную, но для этого нужно знать массу мелких деталей, касаюшихся различных параметров, условий их применения и условных обозначений в сценарии. Когда-то мы их будем хорошо знать, а сначала лучше воспользоваться специальной программой-оболочкой
Глава 36. Разработка мнеталлятора
1095
1
fSTool , Эта программа (рис. 36.3) облетает разработку сценария. Разработчик имеет удобный интерфейс, позволяющий как редактировать сценарий в виде текста, так и редактировать любой элемент сценария с использованием специальных форм, выбором допустимых вариантов и параметров в диалоговых окнах. Весьма разумное сочетание "визуальности" и редактирования текста, в котором отображаются результаты интерактивных действий, позволяет быстро освоить подготовку сценариев для программы Inno Setup. Мы не будем разбирать работу с программами — она очень проста. Детальному рассмотрению мы подвергнем наш сценарий инсталляции.
Сценарий инсталляции Сценарий инсталляции сохраняется в файле с расширением LSS. Формат файла сценария напоминает формат INI-файлов, но есть и некоторые отличия — не всегда имя переменной отделяется от значения символом "=". Запустив программу ISTool, мы, с помощью Мастера, создаем файл c:\.ni\^rulnsiall\ruCADBookLT.iss, в котором вначале имеются заготовки основных параметров будущей инсталляции. Далее мы, иногда вручную, иногда с помощью диалоговых окон (рис. 36.4), редактируем сценарий. Idopeilbes Fie
.[
jCcfriroon Component j Task
Mm™,u,«
j|^F|J!||j|f7i
t^.jjCT,
|(4ppW*-,
Language]
,[
!
Имя истек:
НСЕ
ФГ
""*"
I . • = ' • -т ение Системный
г "
Г Флаги Р Сравнить время создания
Р
Р Прелзпре*ДЗть при гкреэвч*
Г ч.-.—
Внешний
- Р Удалить после установки
Р Переписать даже для чтения
i
P Для прочтения
Г Еоти есть (райл • гяпучетвяь
Р Зарегистрировать сервер
Р Рекурсия с гщкатапсгаг^!
Р Зарегистрировать библ. типов
Р Удалить при перезагрузке
.
. Р Безспшбкч регистрации Р Переписать при перезагрузи • Р Ос*Д1ЙФайя
Р Предуг|редить вс»ы старый Р Только при отогтствич Р Игнорировать версию
Р Няг огдл мс уцадягь
Р Не копировать Р Remove read огУ^
!.__.
,
-_ OK
Отмена
.
-' • ^
Справка
Рис. 36,4. Диалоговое окно свойств элемента
www.istool.org.
1096
_
Часть
V,
Выпусксистемы
в
свет
Замечание Далее мы будем приводить усложняющиеся фрагменты сценария в отдельных листингах (по секциям). Для улучшения восприятия мы будем переносить длинные строки, добавленные нами пространные комментарии (которых в реальном сценарии нет) мы будем писать курсивом под чертой, введенные нами данные — выделять полужирным шрифтом. Ключевые слова программы Inno Setup мы будем выделять подчеркиванием.
В сценарии часто используются символьные константы, указанные в фигурных скобках. Во время выполнении программы установки на компьютере пользователя вместо констант подставляются их значения, действующие на компьютере пользонателя. Например, константа {localappdata} на одном компьютере (в Windows 98) будет соответствовать каталогу c:\Windows\Local Settings\Application Data, а на другом (в Windows XP) — c:\Documents and Settings\S ha ggyDoc\ Local Settings\Appli cation Data. Константа { common app data | будет соответствовать (в Windows XP) — c:\Documents and Settings\A]l Users\Application Data. Смысл констант мы будем разъяснять в комментариях. Сценарий формируется для установки на русском языке, хотя имеется возможность выбора языка инсталляции, В этом случае потребовались бы варианты языкозависимых параметров, например, разных файлов с текстом лицензии. Основные параметры приложения занесены в секцию setup (листинг 36.1). I Листинг 36.1 . Файл сценария ruCADBookLT.iss. Секции setup [Setup) ; Наименование нашего приложения и основные параметры установки АррНате=ИктегрИров энная система ruCUD flppVerName=ruCAE> book LT version 0 , 90 AppPublisher=ruCftD group AppPubli5herURL=http: //www . admobl . kurgan.ru/oad/ AppSuppOEtURL=http : //www . admobl . fcurgan . ru/cad/ AppDpdatesURL=bttp: //www . admobl . kurgan . ru/cad/ ; Куда, по умолчании, будем предлагать установить систему ; Константа /pf) обычно соответствует с: \Program Files De f a ul t Di EName '(p£)\ ru\CftD DefaultGroupN ame=ruCAD с текстом лицензионного соглашения. Указываем один вариант только на русском языке. О содержании лицензии см. главу 37
icenseFile=license.txt Файл с тегсстсм, выводягцимся перед установкой InfoBeforeFile=preiriatall. txt
Глава 36. Разработка инсталлятора
1097
Файл с текстом, выводящимся после установки nf oAf terFile=readrae. txt Имя ЕХЕ-фзйлз инсталляции.
Задаем E~uCADSetup.exe
Output Ba s e FiI ename=ruCadSetup Минимальная версия Windows. Задана Windows 98 до second Edition MinVeirsicn=4.1.1998,4.0.1381
AppCopyright=ruCAD group
Требуемые привилегии для запуска ruCADSetup.exe. Указываем константу admin, т. к. потребуется регистрация С0*?-серверой Если не задать ограничение, сбой произойдет слишком поздно г i vi I e g e s Re qu I r e d= admin Отключение вывода страницы о пользователе Windows. Незачем UserlnfoPage^false AlwaysShowDirOnReadyPage-true filwaysShowGroapOnReadyPa ge=true ; Вывод диалога для выбора язька инсталляции ShowLanguageDialog=auto ; Задаем картинку, выводящуюся в левой стороне мастера. Это должен ; быть файл формата ШР размером 164x314 пикселов. Можно не задавать, ; тогда будет выведена стандартная картинка WizardImageFile=C:\. пд \_rulnstall\rulnnol64_314.Ьпр ; Задаем картинку, выводящуюся в шапке Мастера. Это должен ; Сыть файл формата ЙМР размером 55x55 пикселов. Можно не задавать, / тогда будет выведена стандартная картинка WizardSmaHImageFile=C:\-ru\_EUInstall\rulnnoS5.bnp
В листинге 36.2 приведена секция Tasks сценария. В этой секции можно описать несколько дополнительных задач. Мы оставляем одну, предлагаемую по умолчанию, задачу "Создать ярлык на рабочем столе" и добавляем свою задачу "Установить DOSLib".
1098
Часть V. Выпуск системы в свет
\ -•••"••" Е Листинг 36.2. Файл сценария ruCAOBookLT.iss. Секция Tasks
-•••
•
[Tasks] Maine: desktopicon; Description: Создать ярлык иа рабочем столе; GcoupDescription: Дополнительные значки: Name: doslib; Description: Установить DOSLib; GroupDescription; Дополнительные
Далее формируем важнейшую секцию сценария — Files (листинг 36.3). Именно в этой секции задают, какие файлы нужно включать в установочный комплект и куда эти файлы должны устанавливаться на компьютере пользователи. Файлы можно перечислять как по одному, так и по маске. Для каждого файла могут быть установлены индивидуальные параметры установки. Мы не будем разбирать все параметры. прокомментируем только используемые в нашем сценарии. Для каждого описания обязательным является параметр source (расположение файла относительно сценария) и DestDir (размещение этого файла на компьютере пользователя). При указании Destoir следует использовать константы, обозначающие физические имена каталогов, вычисляемые во время установки. Нам предстоит установить несколько тысяч файлов. Описывать каждый отдельный файл и сценарии мы, разумеется, не будем. Нам поможет заранее продуманная (см. главу 3) система каталогов, позволяющая установить большие группы файлов в любые места с учетом привилегий пользователя. Файлы из каталога Bin мы будем описывать индивиду ально, т. к. для некоторых из них требуется регистрация в качестве СОМ-сервера, а для некоторых — нет. В листинге мы приведем только несколько примеров. Описание каждого файла начинается с ключевого слова source и выполняется в виде одной строки, но в листинге мы сделаем разбивки на строки по параметрам. Сделано это из-за формата издания и для улучшения восприятия. Ключевое слово Components указывает на принадлежность файла к группе, определенной в секции components (см. листинг 36.9). Создав в сценарии несколько групп, можно предусмотреть различные варианты установки (полная, минимальная, выборочная и т. п.). Мы (несколько искусственно) предусмотрели группы компонентов для проверки возможностей и н стад л я тора. По мере развития системы мы можем предусмотреть разбивку на более логичные группы, например, по специальностям (АР, OB. BK). Ограничений здесь нет, вопрос только в том, как выделить необходимые только для этой группы файлы — слишком "переплетены" все наши функции, \ Листинг 36.3. Файл сценария ruCADBookLT.iss. Секция Files IFiles]
; Таким образом записываются- ActiveX DLL, Включаются в обязательную : группу компонентов main, указывается необходимость Source : cad\bin\AxAcadStatusBarButtoii.dll; { applNbin;
DestDir: Components: Flags :
main;
ragaerver
Глава 36. Разработка инсталлятора
1099
; Аналогично включаем и Другие DLL и OCX, зребукщие регисзрапии Source:
caaSbin\ruftDOConnSvr.dll;
DestDir: jjipp|\bin,Components:
main;
Flags: yegsetver Source: cad\bin\AcadColor.ocx; DestDic: {app)\bin; Components: main; Flags: reqserver
; Л это обычная DLL, не требушвя регистрации Source: cad\bin\rudMglnfo.dll;
DestDir: {appl\bin; Corrponents: maj n Далее перечислены ЕХЕ-файлы. Для некоторых из ник мочгет Сыть указана задача - desJ;tdpicon, ;гозволягацэя создать кип этого файла значок на рабочем стале. Дагл достаточно создать элачок для -с тартера Source: cadSb±n\ruCAD.exe; DestDir: ^app)\bin;
Conponants: main; Tas);5: desktopicon Source: cad\bin\ruLayersExplorer.exe; DestDic: (app)\bin; Coirponents: main;
; Dirinfo.ini нужно просто скопировать Source: cad\bin\DIRINPO.INI; DestDic;
; ; ; ;
tapp>\bm; Components: main
Далее записаны большие труппы каталогов. Для файлов указана маска *, каталоги назначения заданы константами, указаны группы компонентов и Flags: recursesubd-irs, укаэывакнюга на необколииооть обработки всех подкаталогов, показаны, для примера, только несколько каталогов
Source: cad\Sharad\app\*; DestDir: jconnnonappdata]\ruCAIJ\Shared\3pp; Components:
main;
Flags: recuraegubdirs
1100
Часть V. Выпуск системы в свет
; Файлы справок входят в группы main и help Source: cad\ Shared\help\ * ; DestDir:
)conmonappdata)\ruCftD\Shared\hglp;
Components: main help; Flags: recur sesubdir s ; HTML-файлы входят в группы main и html Source: oad\Shared\htnil\*; DestDir: 4conm^nappdat3|\riiCAD\5hared\htinl; Components: main html; Flags: re curs e subdir s ; Файлы классификатора слоев входят в группы main и class Source : cad\Shared\Layers\* ; OestD-i' : ( conimonappdata } \ ruCAD\ Sharad\Layers ,• Components: main class,- Flags: recui se subdl r s ; Файлы типовых текстов входят в группы лют и txt Source : cad\Shared\Txt\*; DestDir : ( eommonappda ta)^\ mCAD\ Shared\Txt; Components: main tact,- Flags: recur saaubclirs ; Л эти файла должны устанавливаться в папку localdata Source: cad\LocalHata\*; DestDir: jconanonappdatal S niCftD \ LocalData ; ^omponerits : main; Flags: recur a asubdi r s ; Файлы, копируемые в корневой каталог приложения Source: license.txt; DestDir: ( зрр } ; Components: main Source: readrne.txt; DestDir; (apg^; Components: main В секции icons (листинг 36.4) указываем, какие создавать значки и группы меню.
I Листинг 36.4. Файл сценария ruCADBookLT.iss. Секция loons
I,.
[Icons] :
Создаем группу в главном меню
Наше:
{сопшюпргодгатзАИнтегрщюванная система ruCAD; Filename : {apj3jAbin\ruCaD. exe; Comment: Стартер mCAD
Глава 36, Разработка инсталлятора
1101
: Даем указание создать значок на рабочем столе каждого пользователя Name : (еотшдпдез1с1:ор)\Инге1Т'ированнзя система ,' Filename: ( арр } \bln\ruCAD , axe ; Tasks: deaktopicon
Секцию Run (листинг 36.5} мы оставляем пустой. Здесь мы могли бы указать программы, запускаемые до и после установки системы. ! Листинг 36.5. Файл сценария ruCADBookLT.iss, Секция Run [Rim]
; NOTE: The following entry contains an English phrase ("Launch"). You are free ts translate it into another language if required. Секцию Dirs (листинг 36.6) мы также оставляем пустой. Здесь мы могли бы указать, какие каталоги (помимо автоматически создаваемых при копировании файлов) требуется создать или удалить. Обычно, таким образом, некоторые программы создают пустые каталоги для собственных данных. Мы предпочитаем, чтобы это делали сами пользователи, по своему усмотрению. ;
—Г™
] Листинг 36.6. Файл сценария ruCADBookLT.iss. Секция Dirs
'
[Dirs] В важнейшей секции Registry {листинг 36.7) записываются требуемые ключи. Напомним, что для "внутреннего употребления" у нас имеется REG-файл, но у пользователя ключи в реестре должны быть созданы автоматически. В значениях ключей записываются каталоги, в которые установлена система. Добавлен флаг uninsdelelekey, указывающий на необходимость удаления ключа реестра при деинсталляции системы. Мы пока не предусмотрели выбор рабочей системы AutoCAD и запись информации о ней в реестр. Это все равно сделает программа -стартер при первом запуске. В финальных версиях системы mCAD мы предусмотрим все ситуации. До запуска основного процесса установки будет запускаться специальная функция, проверяющая наличие системы AutoCAD на компьютере, позволяющая выбрать его версию и разрешающая или запрещающая основной процесс установки. ! Листинг 36.7. Файл сценария ruCADBookLT.iss. Секция Registry [Registry) г Несколько примеров записи ь реестр Root: ККШ; SubKey: SOFTWARESruCftD group\ruCAD; ValueType: string; ValuetJaine: RootDir; ValueData: japp}; Flags: uninsdeleteksy; Components: main
1102
Часть V. Выпуск системы в свет
Root: НИМ; SubKey: SOFTWARE\ruCAD group\ruCAD; ValueType: string; ValueNme: AppDataDir; ValueData: IcommonappdatalXruCMAShared,1 Flags : uninsdeletekey;; Components : main Root: [ЛОМ; SubKey: SOFTWARE\ruCAD group\ruCAD; ValueType: string; ValueNarne: Local Set tmgsDir; ValueData: {localappdata>\ruCAD\LocalData; Flags: lining dele tekey; Components: main Root: HKIM; SubKey: SOFTWARE\ruCAD gioup\ruCAD; ValueType : string; ValueName: User Connections tring ; ValueData: "Provider=Microsoft.Jet.OLEDB. 4 . 0;Da.ta Soiirce=(coniraoriappdata)\iiiCftD\LocalData\ru_iisera.mdb;PerBiat Security Info=False"; Flags: uninsda1e tskey; Components: main В секции iSTool (листинг 36.S) записаны некоторые параметры самого инструмента разработки сценария — разрешено использование сжатия по алгоритму 7zip' и указан LOG-файл, в который будут записываться сообщения компилятора сценария. Листинг 36.8. Файл сценария ruCADBookLT.iss. Секция isiool [_ISTool] Use7zip=True LogFile=ruCAD_Iiistall. Log Fi1eApp e nd= false
LOG
В секции conponents (листинг 36.9) описаны группы компонентов, на которые мы ссылались при формировании предыдущих секций. :
'"*
'
' """
"
\
\ Листинг 36.9. Файл сценария ruCADBookLT.iss. Секция Components [Components] Группа main, видимая пользователю как "Основной комплект". Имеет флаг fixed, указывающий, что эту группу компонентов нельзя отключить при установке. Входят в типа Custom, Compact и Full, т. е. в "Выборочную", "Компактную" и "Полную" установки Наше: main; Description: Основной комплект; Flags: fixed; Types: cuatorn compact full -• Группа help, видимая пользователю как "Справки" ; Не имеет флага fixed, т. е. эти компоненты можно не ставить
1
Включение этой опции приполит к тому, что сама программа установки будет помешена а самораспаковьгпающийся архив Размер файла при этом уменьшится почти в два раза, но потребуется время на автоматическую распаковку. На компьютере пользователя это займет несколько сскулл, при сборке установочного комплекта — от нескольких минут до часов (в зависимости от производительности компьютера разработчика).
Глава 36. Разработка инсталлятора
1 103
Входит в типы Custom и г. е. в "Выборочную " и "Полную" установки =пе: help; description: Справки; Types: custom full Группа class, видимая пользователю как "Кпасскфнкзтор слоев" Не име^т флага fixed, т. е. эти компоненты можно не ставить Входит в типы Custom 11 Full, т. е. в "Выборочную" и "Полную" установки ame: class; Description: Классификатор слоев; Types: custom full Группа html, видимая пользователю как "HTML-справки" Не имеет флага fixed, т. е. эти компоненты можно не ставить Входит в типы Custom и Full, т. е. в "Выборочную" и "Полную" установки I £LT.e: htnd.; Description: HTML-с правки; Types: custom full Группа txt, видимая пользователю как "И^шовые тексты" Не имеет флата fixed, т. е. эти компоненты можно не ставить Входит в типы Custom и Fall, т. е. в "Выборочную" и "Полную" установки Name: txt; Description: Типовые ?е-кс1ц]; Tipes: custom full В секции Languages (листинг 36.10) записаны некоторые параметры языка установочного комплекта. Мы предусмотрели один язык, но можно описать несколько языков для инсталляционной программы. Для каждого языка можно задать имена файлов сообщений программы, лицензионного соглашения, текстов, иыводимых до и после работы программы установки. Кстати, для любого из ранее описанных компонентой можно указать языковую опцию, т. е. при выборе какого языка устанавливать этот компонент. Листинг 36,10. Файл сценария ruCADBookLT.iss. Секция Languages '_ Languages] Name: Russian; MessagesFile: CAProgranx Files\Inno Setup 4\Rus3ian-19-4 . 0 .O.ial; LicenseFile: С Л.ru\_rulnstall\license. bit; InfoBeforeFile: С Л.ru\_rulnstall\preinstall.txt; InfoAftcrFile: С Л . ru\_rulns tall\readme. txt
Как найти систему AutoCAD Установка системы niCAD имеет смысл только в том случае, если на компьютере установлена система AutoCAD. Поиском AutoCAD из про граммы-стартера мы занимались в главе 20. Теперь это нужно проделать до установки ruCAD. Более того, нам
1 104
Часть V. Выпуск системы в свет
необходимо для выбранной системы AutoCAD создать профиль niCAD и записать в пути поиска наши каталоги, да еще такие, куда система будет установлена. Начнем решение с конца. Профиль должен быть создан в ключе реестра. Из множества параметров профиля нас интересует только ветка JHKCU\Software\Autodesk\AutoCAD\R% AcadVersion %.OUAcadKey*\Piofiles\ruCAD \Genecal]
и ключ ACAD, в начало которого мы должны вписать свои каталоги. Сделать это можно множеством способов, но мы постараемся найти простой. Вспомним, что программа-стартер позволяла выбрать систему AutoCAD из списка установленных путем вызова функции ruSeiectAcad. Эта функция, после выбора пользователя, сразу записывала в реестр параметры выбранной системы AutoCAD, в частности AcadKey и Acadversion, т. е. то, что нам надо. Итак, нам необходимо в начале инсталляции вызвать это диалоговое окно, если выход из него будет произведен по кнопке Отмена — прервать инсталляцию, а если выход будет произведен по кнопке ОК — прочитать данные из реестра и вписать и профиль. Все это легко проделать в своей программе, но как это сделать при инсталляции? В сценарии программы 1шю Setup может быть очень интересная секция code, в которую можно включить собственные процедуры и функции, написанные на Pascal, вызывать функции из собственных DLL, включать собственные диалоги. Сначала мы напишем на Delphi небольшую динамическую библиотеку DLL (листинг 36.11). Функция seiectAcad выводит диалоговое окно выбора системы AutoCAD и записывает результаты в реестр в ветвь HKEY_CURRENT_USER или HKEY_LCCAL_MACHIHE. Листинг 36.11. Файл ruSelAcad.dpr library ruSelAcact; uses SysUtilS,Windows, Classes, frmSelectAcad, ruOtils,
JclRegistry, JclStrings;
{SR ".RES}
function SeiectAcad(): boolean; stdcall; begin result :- ruSelectAcad; ena;
exports SeiectAcad; begin end. Откомпилируем проект и полученный файл ruSelAcad.dll сохраним под именем c:\.ra\_rulnstall\cad\AddOn\ruSelAcad.dll. Добавим в секцию Files (листинг 36.12) еще одну строку, включающую DLL в инсталляцию, но не устанавливающую на компьютер пользователя — флаг dontcopy.
Глава 36. Разработка инсталлятора
1105
\ Листинг 36.12. Файл сценария п CADBookLT.iss. Секция Files !._ _ ;_..i. ..-. .,
;
Source: cad\AddQn\r-uSelAcad.dll; Flags: dontcopy В сценарий установки добавим секцию code (листинг 36.13). В этой секции мы объявили собственную функцию seiectAcad, заключенную в файле mSelAcad.dll, и переопределили стандартную функцию программы lutio Setup NextButtondick. В результате инсталляция будет запускаться, но после просмотра информационного сообщения (в котором мы напишем о необходимости выбора системы AutoCAD) при нажатии кнопки Далее будет появляться диалоговое окно выбора AutoCAD (см. рис. 20.3). При закрытии этого окна кнопкой Отмена будет выдано сообщение об ошибке с предложением отменить инсталляцию. Таким образом или сведения о системе AutoCAD будут записаны в реестр, или установка будет отменен;!. ••—
-
-
"
| Листинг 36.13. Файл сценария ruCADBookLT.iss. Секция code
V
"
У'1'!
function SelectftcadO iboolean; external 'SelectAcadlfiles:ruSelAcad.dll stdcall'; function HeKtButtonClicklCurPsge: Integer): Boolean; begin Result := True;
if CurPage = wpInfoBefore then Result:= SeiectAcad,if not result then MsgBoxCHe выбран рабочий AutoCAD! 'H13+ 'Отмените установку или повторите выбор1, inbCriticalError,MB_OKj ,end;
Сборка установочного комплекта После подготовки сценария в среде ISTools можно откомпилировать (+) или откомпилировать и запустить (+) установку (рис. 36.5 и 36.6). Если в сценарии нет ошибок, то по истечении времени, необходимого на обработку сценария и упаковку файлов, будет создан файл дистрибутива C:\.rirVnilnstaU\Output \ruCadSetup.exe.
Испытания установочного комплекта Испытаниям и совершенствованию полученного "изделия" теперь можно посвятить всю оставшуюся жизнь. Но начать следует с проверки того, как происходит сам процесс инсталляции, а потом уже — как работает установленная система. Производить испытания нужно на разных компьютерах, под всеми операционными системами, на которые мы ориентированы (минимум Windows 98, максимум, пока. Windows ХР). Прежде всего проверим, туда ли, куда мы задумывали, устанашшваегся наша система. При установке по подготовленному сценарию компоненты системы установились в перечисленные ниже каталоги. 36 Зак КЗЛ
1106
Часть V. Выпуск системы в свет (Ш Установка • Интегрированная системj ruCAD
) Добро пожаловать в программу установки Интегрированная
система ruCAD,
Программе усгано&гг ruCAD toe* Lt version 0 90 на ваш настоятельно рекомендуется закрыть все прочие ложения перед прсйопжением установки. Это поможет Нажм1гг* «Далее» для прщоп*&нмд ним «Отмена» nns вЫ'ОДа иэ программы.
алее > 1
Отмена
Рис. 36.5. Первая страница Мастера установки
] ДО Установка- Ннтегрнриваш^ая систеч<1 luCAD Выбор компонентов Каше компоненты допяны i
* лс*»»зиа1гы, ксгтсСЫ* вы хотите устаио&игь; cninwre Фгщжкис к.смтоивмтов, ^стфивлывэтр югорые не требуется Нажмьле «Далее», когда Вы й&ате готдач щнаолянть.
У! Справки у] Классификатор слоев У' HTML-справки < Типовые тексты
01 Мб
се MS 0.5 Мб 01 Мб
Т екуший выбор требует не ^&IH 39.3 МЛ на диске. Далее > |
Отмена
Рис. 36.6. Страница выбора компонентов Мастера установки
При устаноике под Windows 98: 3 в каталог c:\Program Files\ru\CAD\bin — ЕХЕ-файлы и DLL; О в каталог c:\Windows\Application Data\ruCAD\Shared и его подкаталоги (арр, block, block-lib, block-lw, del, help, html, Layers) — файлы, общие для всех пользователей; О в каталог c:\Windows\Application Data\niCAD\LocalData и его подкаталоги фаИлы для настроек конечного пользователя.
Глава 36. Разработка инсталлятора
IT07
Конечно, это не очень удобно. В Windows 98 мы могли бы все спалить в одну большую кучу ц подкаталоги c:\Program Files\m\CAD, для этого надо было бы написать более "хитрый" сценарий. Но рядом с н а ш и м и каталогами расположился и c:\Windows\Local Settings\Application Data\Autodesk\AutoCAD 2004, а это уже "подходящая компания", и свидетельство нашего движения в верном направлении. При установке под Windows XP: 3 в каталог c:\Prograrn Files\ru\CAD\bin — ЕХЕ-файлы и DLL; D в каталог c:\Documents and Settings\All Users\Application Data\ruCAD\Shared и его подкаталоги (app, block, block-lib, block-lw, del, help, hlinl, Layers) — файлы, общие для всех пользователей; П в каталог c:\Documents and Settmgs\ShaggyDoc\Loca1 Settings\Application Data\niCAD \LocalData и его подкаталоги — файлы для настроек конечного пользователя. Рядом разместились каталоги весьма известных программных продуктов, что также свидетельствует о правильности выбранного пути. После внесения некоторых изменений в наши программы мы добиваемся, чтобы система mCAD правильно устанавливалась.
Испытания в работе На следующем этапе мы начинаем испытывать систему в работе. Сначала мы запускаем ее от имени администратора. Если грубых ошибок пег, то все будет работать правильно. Далее следует войти в Windows is качестве обычного пользователи. Вот теперь у нас будет очень много проблем. Начнутся они с невозможности записи в файлы. Напомним, что множество настроек записываются в INI-файлы. По сценарию установки мы собрали все файлы и подкаталоги папки A l l Users. В эту папку могут записывать все пользоиатели, но файлы копировались от имени администратора. В результате обычный пользователь не сможет внести изменения в обычный INl-файл. потому что владельцем этого файла является администратор. Создать свой файл можно, а изменить принадлежащий администратору — нельзя. Если бы мы вообще не копировали настроечные файлы, то все равно столкнулись бы с подобной ситуацией, когда один обычный пользователь не может изменить файл, принадлежащий другому обычному пользователю. Вот мы и "наступили на грабли, которые сами положили на тропинку!" В главе 3 мы подробно разобрали, где можно хранить настройки, и где мы их будем хранить. Из жалости к пользователям мы решили не слушать рекомендаций Microsoft по хранению настроек в реестре и решили сохранять их в 1М1-файлах. При разработке сценария инсталляции мы еще более разжалобились и отступили от плана хранения локальных настроек каждого пользонателя в его личном каталоге и "свалили" все настроечные файлы в общий каталог — Document and Seltings\AII Users\Application Data\ruCAD. Сделано это было в одной строке сценария: Source: cad\LocalData\*; DestDir: {coimiionappdata} \ruCAD\LocalData; Components: main; Flags: recuisesubdirs
1108
Часть V. Выпуск системы в свет
Конечно, мы хотели "как лучше" — устанавливая систему от имени администратора сделать файлы доступными всем пользователям, но получилось "как всегда". (
Замечание
^
Мы столкнулись с типичной ситуацией — программы, прекрасно работающие у разработчиков, неработоспособны у конечных пользователей. Увы, так "сработаны" и некоторые популярные программы известных фирм. Мы не будем изображать "хорошую мину при плохой игре", не будем пенять на "злобных админов" и "кривую" Windows. Давайте признаемся, что пока "кривые" только наши руки и мозги, и приступим к корректировке программ.
Корректировка программ Фактически мы должны переписать примерно четиерть книги, но делать этого мы не будем. Мы легко могли бы изобразить, что заранее все знали, и сразу приводить правильные исходные тексты, но наша книга о том, как это делается, а не о том, как это сделано, а делается многое путем проб и ошибок. Подумаем, что мы можем сделать для обеспечения работоспособности программ при их минимальной переделке. Прежде всего, отказываемся от пагубной идеи хранить настройки в файлах. Многие настройки, сохранявшиеся в INI-файлах, мы перенесем в реестр. Облегчает работу то, что все операции чтения-записи инкапсулированы в нескольких функциях, и нам необходимо только изменить их реализацию без изменения интерфейсов. Например, нам не нужно заменять в сотнях мест запись в lNl-файл последних параметров, достаточно только в одном месте переопределить функцию ru-user-writelast-parara. В приложениях, написанных на Delphi, нам достаточно включить у компонентов класса TJvFormPlacement СВОЙСТВО UseRegistry И Задать ДЛЯ СВОЙСТва RegistryRoot 3H3-
чение HKEY_CURRENT_CJSER. Одновременно мы сможем записывать некоторые настройки, ранее передававшиеся в виде аргументов, методами этого компонента (например, номер последнего выбиравшегося элемента в XML-меню). Любой параметр мы будем читать по схеме: сначала из ветви HKEY_CURRENT_DSER, если там значение не найдено, то из ветви HKEY_LOCAL_MACHINE, если и там не найдено, то принимается значение по умолчанию. Запись
практически
всех
параметров
мы
будем
делать
только
в
ветвь
HKEY_CURRENT_USER, И ТОЛЬКО некоторых — I) HKEY_LOCAL_MACHINE, S3 И ТО В СЛуЧЭС, ССЛИ
программа запущена системным администратором.
Новая стратегия работы с пользователями ruCAD Ранее мы предусматривали работу с пользователями нашей системы при хранении информации о пользователях в локальной базе данных. При реальной работе с такой
Глава 36. Разработка инсталлятора
1109
БД разных пользователей Windows NT возникнут проблемы с доступом 1 , да и сама идея далека от концепции работы в Windows. Теперь мы убедились, что делать нужно иначе, Количество пользователей ruCAD на одном компьютере будет не более десятка и обойтись без БД при этом вполне возможно. Всю информацию о пользователях удобнее и надежнее хранить н реестре Windows. Пользователь Windows одновременно становится потенциальным пользователем ruCAD. Администратор niCAD должен одновременно иметь права члена группы "Администраторы" Windows — иначе он просто не сможет выполнять многие действия по сохранению данных. Перечень прав контролируется более жестко. Например, права редактирования XML или помещения калек в архив могут быть реализованы, только если пользователь вообще имеет право на запись файлов в соответствующие каталоги. Сведения об активном пользователе Windows хранятся в его ветви реестра (а это всегда HKEY_CURKENT_USER}. Нет необходимости хранить LOGIN и PASSWORD, зато можно добавить дополнительные сведения, например информацию о структурном подразделении. Если систему ruCAD запускает активный пользователь Windows, ему не потребуется проходить регистрацию. Все его привилегии уже известны. Но под именем одного пользователя Windows в niCAD могут работать различные пользователи СЛПР. В Windows 98 это обычная ситуации, в Windows NT это может понадобиться администратору и разработчику для проверки работы системы защиты на уровне ruCAD. Мы предусматриваем возможность ведения списка субпользователей ruCAD. Право пользователя ruCAD на какое-то действие означает право на выполнение соответствующей функции niCAD. Реализовать это право функция системы niCAD сможет только в том случае, если ей это позволит операционная система (фактически — Администратор Windows). Например, в ruCAD предусмотрено право на сохранение калек в электронном архиве. Реализация этого права предусмотрена специальной функцией, которая знает, как и куда положить кальку. Пользователь ruCAD может запустить эту функцию, но она может и не выполнить свою задачу, если Администратор Windows не предоставил пользователю право записи в этот каталог, причем не просто записи, но и замены, возможно, имеющихся в этом каталоге файлов, владельцами которых являются иные пользователи. Сам Администратор, имеющий доступ ко всем ресурсам компьютера, может не иметь права на запуск этой функции. Он, конечно, может установить себе любые права и в системе ruCAD, но подумает, прежде чем эту возможность будет использовать — он ведь не знает, какие кальки и куда нужно раскладывать. В новых условиях можно и отказаться от использования парольного входа в ruCAD. Наши программы, за некоторыми исключениями, не выполняют действий, которые могут нанести вред операционной системе и иным пользователям. Для предотвращения упомянутых исключений требуется работа в защищенной операционной сис1
При работе с удаленной клиент-с ер вер но и базой данных проблемы доступа решаются не на уровне физического доступа к файлу, а на уровне сервера БД. Информация о пользователях там организована на качественно ином уровне (не в одной примитивной таблице), пользователи могут работать под разными операционными системами и даже через Интернет. Подобным образом, например, организован доступ к электронным картам, размещаемым на Web-есрвере в геоинформапионной системе.
1110
Часть*V. Выпуск системы в свет
теме, а там защита осуществляется на уровне политики безопасности Windows NT. В Windows 98 профиль пользователя ruCAD только предоставляет пользователю дополнительные удобства, а система привилегий рассчитана на "законопослушного" человека. "Вредный" пользователь (обычно из категории "ламер") в Windows 98 имеет доступ ко всем ресурсам компьютера и может навредить не только себе, но и соседям по "коммунальному" компьютеру. Надеемся, что и ближайшее время все поймут, что для корпоративной системы такие операционные системы непригодны. Но от паролей мы можем отказаться уже сейчас. [НКЕY_CURRENT_DSER\S О ftwa re\ГиСЙО groupXUserData] ТIТ LE="ДОС топоч т е нный " 1 LCNG_MRKE=" Ипполит Матвеевич" WORK_GROUP=" COMMON " WORKED I R="" DEPARTMENT"^"Отдел рогов"
В этих ключах хранится безопасная информация, которую пользователь может изменять сам, разумеется, с помощью специальной программы, а не прямого редактирования реестра. Таблица наименований прав И соответствующих им флагов хранится и ветви реестра F!KEV_LccsL_MACKiNE и заполняется только при инсталляции. Обычный пользователь к этой ветви доступа на запись не имеет. [НКЕY_LOCAL_MACHIНЕ\SOFTWARE\ruCAD group\Osers4Pennissions\Flags] ADMIN=dword:QOQOOOQl XML_EDn>dword: 00000800
Напомним, что названия ключей, подобные XML_EDIT, используются для облегчения нашей собственной работы и фактически являются именованными константами. Для "человеческого" отображения наименований прав используются их описания, хранящиеся в соответствующих ключах. !НКЕY_LOCAL_MACHINE\SOFTHARE\ruCAD groupNUsers\Perfliissions\NOtes] "ADMIN"=' 'Администрирование'' "XML_EDIT"="Редактирование XML"
Требования к Администратору Windows при установке ruCAD повышаются. Он должен представлять, что и как делает система и какие могут быть последствия этих действий, Разумный Администратор Windows предоставит соответствующие привилегии пользователям шСАО. Он не будет сам бегать по всем рабочим местам, на которых пользователь решит изменить, например, иллюстрацию в XML-меню, а предоставит доступ на запись в этот каталог. Возможно, он перенесет каталог с иллюстрациями в другое место или даже на другой компьютер — для этого Администратор должен знать, что и куда можно переносить. Наша задача — обеспечить его подробной документацией и предоставить соответствующие инструменты.
Замечание А что произойдет, если все-таки права на запись какого-то файла нет? Произойдет ошибка, но все такие ошибки разработчики обязаны предвидеть и предусматривать соответствующие решения — внятные сообщения и тому подобные действия, этим вопросам мы
Глава 36. Разработка инсталлятора
1111
отдали много места а книге. Пока мы работали с программами с правами Администрэ"ора, сообщений об ошибках не было. Как только мы запустили программу-стартер под профилем обычного Пользователя— появились сообщения, послужившие причиной переработки стратегии работы с файлами, но программа продолжала работу. Если бы мы ие предусмотрели обработки исключительных ситуаций, то до сих пор гадали бы, почему "падают" программы. Устанавливает права Администратор Windows с помощью специальной утилиты. Записынаются права в "машинную" ветвь реестра, где но идентификатору пользонателя задается сумма битов, соответствующая набору прав пользова!еля. Самые большие изменения придется вносить и программу-стартер. Мы исключим из нее процедуру регистрации пользователя при входе, но введем специальный модуль Менеджер безопасности, позволяющий настроить систему. Измененные исходные тексты мы не приводим, т. к. потребуется слишком много места на код "не про AutoCAD", Кроме того, мы не рискуем публиковать деликатные коды управления системой безопасности Windows — предоставим это право более компетентным специалистам. Приведем только несколько иллюстраций готовых решений. На рис. 36.7 показана закладка редактирования свойств пользователя. Безопасную личную информацию может редактировать сам пользователь, а изменять привилегии, добавлять и удалять пользователей — только Администратор Windows. (Менеджер безопасности ruC AD Пользователь шСАО [ Сведения об Wmdowj | Палки ruCuD ] Обращение
Полное и*вд
Рабочая группа
Подразделений
I
COMMON
13
:-!..
]000 РОГА И КОПЫТА
Рабочий каталог
Добавите Удалить
UCAD ocuvienls: and Seiiings^ShaggyDocVMoii документы Привилегии Редактировать огмсаныя файлов и палок 1? Дополнять попьэовате-пьскиИ словарь [7 Редактировать XML-меню Брать кальки ил вр*нва Сохранять наборы калек Брать типовой проект из библиотеки ** Братьтопограф!*оиз архива Редактировать структуру таблиц J7 Сдавать кальки t, ар.ив [^ Помещать типовая проект в библиотеку Р Сдавать топографию в архив [7 Иэменчпь настрйки шСДО Р Иэменшь насгрйкиспоя в классификаторе р Релагтировать гекстовые спрааки к программам Р Редактировать советы к. программам Р? Права опытного пользователя ruCAD f> Разработка пpи>lo^t;e^•^й шСАО Администрировать ruCAD
Рис. 36.7. Редактор свойств пользователя
На рис. 36.8 показано отображение свойств операционной системы. Более подробная информация доступна при щелчке по кнопке Подробнее, запускаюшей системную программу insinfo.
1112
Часть V. Выпуск системы в свет Менеджер безопасности ruCAD Пользователь TutAD
Сведения oU Windows I ПаптлшСАО|
Пространство имен Windows Папка Corranonfiles G^Aogiam F n file Текущая пагжа: с \Pioflram FJe?\ Палка Progiamfies С \Program Files Пагха Windows: С \WINDOWS ад WmdwrtSyslem С \WlNDOW Папка Windo^iTernp: С \DOCLJME~1 \SHAGGV1 40 CALS"! \Tenp Палка Programs: й\Ооожт1еп14аг^5вГ(1Г1д^ЬэддуОос\Гпаенов1нвмю\ Папка PefsonaL C"VOocumsf4s and 5 ellmg^ShaggyD ос \М пи документы " f c a CommonFrogtami: С UJocunenl! and Self ings V4Useii\TnaBMoe Папка ConnnoriAppdala: C:\Docunenfs and Se"mgiV-ll U^sVipplicaJion Data Тапка Appdafa С \Documenls andSeftrigsXShagfjyDotVipplicaiion Data Программам si rtv С.\Ргядаш Fies\Cooimon Fies\Mjcrosoft 5ha(ed\M&lNFO\M5lMF032.EXE
Подробнее.
p
1
опъэоояг&а Windows • " "fos'-JLll'"^J||,''r!^h•^J•^г^!^Ч'j i i ;'°Eh?-
--
-
•'^I
РИС. 36.8. Просмотр сведений о Windows
На вкладке Папки ruCAD {рис. 36.9) Администратор Windows сможет просмотреть расположение именованных папок mCAD, перенести их при необходимости в другие каталоги (будут перенесены и файлы и изменены ключи реестра), просмотреть и изменить привилегии для групп пользователей. Все эти опасные функции выполняются стандартными средствами операционной системы. Теперь программа-стартер знает об операционной системе и пользователе все, что необходимо. Делаем следующий шаг — передаем все эти сведения нашим LISPфункциям. Конечно, из них мы можем просто прочитать реестр, но вряд ли целесообразно постоянно "копаться" в реестре. Лучше мы передадим все сведения в виде одной глобальной переменной 1 , для чего в очередной раз изменим процедуру генерирования файла acaddoc.lsp. Этот файл по-прежнему генерируется из шаблона, но его первая часть создается стартером путем записи всей известной ему информации. При чтении готового файла acaddoc.lsp (листинг 36.14) будет создана глобальная переменная *nj_startup_ info-, представляющая собой ассоциированный список. К элементам этого списка можно легко добираться по их именам.
1
Нельзя сбывать о поддержании актуальности информации, хранящейся в этой глобальной переменной. Если по ходу выполнения какой-го функции необходимо изменить значение, хранящееся в реестре, то обязательно должна быть предусмотрена синхронизация содержимого реестра и глобальной переменной.
Глава 36. Разработка инсталлятора
1113
Пене дч|рр безащкнасжи i-uCAD Пользователь ruCAD } CeeuftWfl об Windows Паплчп£АО | Текстовой редактор
|с \WNDOWS\Noiepad е.е
;-:
1
Имя папки
•
-*t|
zJ
[корме&ая папка архива типовых проектным решении
Каталог папки |С \_GQ\iuCAD \CuDAi etvve\PiO|ects\ г-Бвэапасгость-~; рПраеа на каталог Р ПолмыйДосг*!
|i р Запись Р '
Выполнение
, i рчшы или noibsoeere/n Имя \ !! П|)пьзоБв^*лц Опытные поиьз Админиегоаторы SYSTEM
Tin Длиас [П"' TIJID Ал1*1с (Пока*. Дяиас [Покаль . Стандартные г
—
—
Свовер Z^A ZSA Z^A Z5A
1 Поаеа наката. 1 IRW-I > - ' [Все] (Qcel <
Р Удаление
: Р Смена розрешемА ^ Р Смена владельца
1
Дойэвмгь гррту ион пользователя или прае
ll
Удалить группу ИЛУ пользователя из прев Установить длян Пол*эоеатея/'
'I L.
\
'••
ji
~ —
. ,
-- -
—
- - . . - .л
— .
- - . .- -
Рис. 36.9. Настройка прав доступа к каталогам
i Листинг 38.14. Окончательный вариант файла acaddoc.lsp (setq ""r Hist (cons "Folders Info" (list [cons " Folds rsNotes" (list [cons "RootDir" "Корневой каталог cuCAD") [cons "RppDataDic" "Общие данные сторонник приложений") (cons "LocalSettingsDir" "Локальные настройки и данные"; [cons "LocalAppDataDir" "Локальные данные приложений ruCAD"! (cons "LocalAcadAllVersionDir" "Папка файлов поддержки AutoCAD, общих для всех версий") (cons "AilUsersDic" "Корневая папка общих данных всех пользователей") (COBS "CurrentUserDir" "корневая папка общих данных Tef^/щего пользователя") (cons "LspSourceDir" "Исходные тексты LISP-функций" ) (cons "HtrnlDii:" "Корневая папка HTML-файлов") (cons "XralMenuDic" "Корневая папка XML-меню"! [cons "Xral Images Di г" "корневая папка иллюстраций к XML-меню"; [cons "LayersClassDir" "Корневая папка классификатора слоев") (cons "archiveTopoDir" "Корневая папка архива топографии";
1114
Часть V. Выпуск система в свет Icons "ArchiveProjectsDir" "Корневая папка архива типовых проектных решений"] (cons "ArchiveLayersDir" "Корневач папка архива калек-слоев"!
I I [cons "FoldersDirs" (list (cons "RootDir" "C:\\Program Files\\ru\\CAD\\") (cons "AppDataDir" "C: \\Docwnents and Settings\\Ail Users\\Application Data\\m\\CAD\\Shared\\") (cons "Loca13 e ttings DiE" "C: \\Docuinents and Settings\\All Users\\Application Data\\ru\\CAD\ \LocalData\\1'} (cons "LocalAppDataDir" "C:\\Docjnents and Settings\\All Users\\Application Data\\ru\\CAP\\LocalData\\"] (cons "LocalAcadAllversionDir" "c:\\Docwnents and Settings\\All Users\\Application Data\\ru\\CAD\\LocalData\\AutoCAD\\"i (cons "AllUsersDir" "C:\\Docuraents and Settings\\£ll Dsers\\Application Data\\ru\\CAD\\Shared\\") (cons "CurrentOserDir" "C:\\Documents and Settings\\All Users\\Application Data\\ru\\CAD\\UsersData\V) Icons "LspSourceDir" "C; \\.rii\\_ru3o'jrce\\lisp\\") (cons "HtnuDir" "C:\\Documents and settings\\All Users\\Application Data\\ ru\\CAD\\Shared\\Htnu \\") (cons "XralMenuDlr" "C:\\Docuffents and Settings\\All Users\\Appllcation Data \\riA\CAD\\5hared\\Xral\\Menu\\") (cons "Xral Image sDir" "C: \\Docurr.ents and Set tings \\A11 Users \\Application Data \\ru\\CAD\\Shared\\Xml\\Images\\") (cons "LayersClassDir" "C:\\Documents and Settings\\All users\\Application Data\\ru\\CAD\\Shared\\Layers\\Bce\\"! (cons "ArchiveTopoDir" "C: \\Docu.Tents and Set tings \\A1J. users \\Application Data\\ru\\CADarchive\\CADArchive\\Topo\\"| (cons "ArchivePvojectsDir" "C: \\DocUinents and Settings\\All Users\\Application Data\\cu\\CADacChiVL=\\С/iDArchive\\Projects\\") [cons "ArchiveLayersDir" "C: S\Doco_-ner.ts and Settings\\All Users\\Application Data\\ru\\CADarchive\\CADArchive\\Layers\S") ) > I
(cons "Userlnfo" (list (солз "LCGIN" "Администратор") (cons "TITLE" "Господин") [cons "LONG__NAME" "Командор"] (cons "rtORK_GROUP" "CCMMOH") [cons "HORK_DIR" "C;:\\. tu\\cad\\saroples\\dwg") [cons "DEPARTMENT'1 "OOO ТОГА И КОПЫТА") (cons "BIT__RIGHT5" 262143) [cons "RU_IS_CAN_REG_EDIT" T)
*
Глава 36. Разработка инсталлятора
__
__
__
(cons "Permissions Info" (list Icor.s "PermissionsNotes" (list Icons Icons (cons (cons icons (cons (cons (cons icons
"EDIT_DIRINFO" "Редактировать описания файлов и папок") "ADD_USER_DIC" "Дополнять пользовательский словарь") "XML_EDIT" "Редактировать XML-меню") "GET_LAY" "Брать кальки из архива"! "SAVE_LAYERg_SET" "Сохранять наборы калек") "GET_PROJ" "Брать типовой проект из ОиСлиотеки") "GET_TCPO" "Брать топографию из архива") "TABLE_STRU_EDIT" "Редактировать Структуру таблиц") "PUT_LAY" "Сдавать кальки в архив")
Icons "PUT_PROJ" "Помещать типовой проект в библиотеку") (cons "PUTJTOPO" "Сдавать топографию в архив") icons "SETUP_CAD" "Изменять настройки ruCAD" ) Icons "SETUP_LAY" "Изменять настройки слоя в классификаторе") Icons "TXT_HLP_EDIT" "Редактировать текстовые справки к программам")
(cons "TIPS_EDIT" "Редактировать советы к программам") (cons "PROFI" "Права опытного пользователя ruCAD") Icons "DEVELOP" "Разработка приложений ruCAD") (cons "ADMIN" "Администрировать tuCAD")
I Icons "Permissions Flags" (list (cons "EQIT_DIRINFO" 1) (cons "ADD_USER_QIC" 2) (cons "XML_EDIT" 4) icons "GET_LAY" 8) Icons "SAVE_LSYERS_SET" IS) (cons "GET_PROJ" 32) (cons "GET_TOPO" 64) (cons "TABLE_STR(I_EDIT" 128) (cons "PUT_LAY" 256) [cons "P4T_PROJ" 512) Icons "POT_TOPO" 1024) (cor.s "SETUP_CAD" 204Э) (cons "SETUP_IAY" 4096) icons "TXT_HLP_EDIT" B193) (cons "TIPS_EDIT" 16334) icons "PROFI" 32763) Icons "DEVELOP" 65536) (cons "ADMIN" 131072)
)
(cons "winlnfo" (list (cons "IsWinNT" T) ) ) ) ) I vl- load- com) (setq *ru_root_dir* "C: \\Prograrn Files\\ru\\CAD\\")
1115
1116
Часть V. Выпуск системы в свет
(load "C:\\Doeuments and Settings\\A11 Users\\Application Data\\ru\\CAD\\shared \\app\\tu-lib-main.fas") (if « {atoi "15") 16} (progn (if (not (member "ru_MainLib.arx" (arx))) [arxload [findfile "ru_MainLib.arx"))) (setq 'ru_use_ru_arx* T) );_ end of progn (setq *ru_use_ru_arx* nil) • (ru-express-load) (ru-doslib-load) (if (or (ru-doslib-load) *ru_use_ru_arx*l (ru-init-start-tucad) [alert "Система не сможет работать. Не загружена ни MainLib, ни DosLib"! После загрузки этого файла мы знаем всю необходимую информацию. Приведем примеры использования информации о пользователе. В листинге 36.15 показано, как из глобальной переменной извлекается информация о пользователе. ! Листинг 36.15. Функция ru-user-get-current-uger-i ! :.
„.
„
[defun ru-user-get-currerit-user-info {) ;cdr (assoc "(Jserlnfo" T ru_stactup_info*l I ),-_ end of defun Эта функция вернет список (("LCGIH" . "йлминистратор") ("TITLE" . "Господин") ("1ШС_МДМЕ" . "Командор") ("WORKGROUP" . "CCMMON") ("WORK_DIR" . "C:\\.ru\\cadS\samples\\dwg"} ("DEPARTMENT" . "COO РОГА И КОПЫТА") ("BIT_RIGHTS" . 262143)("RU_IS_CAN_REG_EDIT" . t) Все сведения о привилегиях можно получить так, как показано в листинге 36.16. ! Листинг 36,16. Функция ru-user-get-permissions-info
v:
1
(defun ru-user-get-permissions-info () (cdt (assoc "PermissionsInfo" *ru_£tartup_info*)) ) ; _ end of defun ФуНКЦИЯ iru-user-get-permissions-flags (ЛИСТИНГ 36,17) вернет аССОЦИИрОВЗННЫЙ список имен и флагов привилегий пользователя. | Листинг 36.17. Функция ru-uaer-get-permis a ions- flags ;def un ru-useE-get-pemissions-flags () Icdr (assoc "PemissionsFlags" (ru-user-get-permissions-info)) ) ; end of defun
Глава 36. Разработка инсталлятора ФУНКЦИЯ
1117_
ru-user-get-permssions-f lags-list
(ЛИСТИНГ 36.18) ВСрнеТ СПИСОК фЛЯГОВ
привилегий пользователя. . Листинг 36.18. Функция ni-uaer-gat-pecaisBiena- flags -list
(defun ш-uset-get-pe missions-flags-list { ) Imapcar 'cdr (ru-user-get-permissions-fLags)) ) : _ end of defun
Функция ru-user-get-pemissions-names-list (листинг 36.19) вернет список имен привилегий пользователя. I Листинг 36.19. Функция ru-user-gat-permis a ions -names -list (defun tu-user-get-peemissions-names-list [) [mpcar 'car (ru-usee-get-permissions-notes)] ! ;__ end of defun ФУНКЦИЯ
ru-jser-get-permissions-notes
(ЛИСТИНГ 36.20)
вернет
аССОЦИИрОВЭННЫЙ
список имен и описаний привилегий пользователя. ;'
j Листинг 36.20. Функция ru-usee-gat-pemiss±ona-notea [ciefun ru-user-get-permissions-notes ( I (cdr (assoc "PetmissionsHotes" (ru-user-get-perraissior.s-info) ] I ) ; _ end of defun
Функция ru-user-get-petmissions-notes-list (листинг 36.21) вернет список описаний привилегий пользователя. Листинг 36.21. Функция ru-user-get-peemissions-notes-list Idefun ru-user-get-permissions-notes-list ( > [mapear 'cdr Itu-user-get-permiaaions-notes)) );_ end of defun
Семейство функций, подобных m-user-titie (листинги 36.22 и 36.23), возвращают значения свойств пользователя (в примерах — TITLE и ш^^G_^lA^E). ! Листинг 36.22. Функция ru-user-titla F
-
-
-
(defun ru-user-title () (cdr (assoc "TITLE" (ru-uset-get-current-user-info|) I Пистинг 36.23. Функция ru-цвег-long-name (defuri ru-user-long-name () !sttcat (ru-user-titlel " "
1118
Часть V. Выпуск системы в свет
!cdr (assoc "LONG_NSM£" |ru-user-get-curcent-user-infoI ))) 1;_ end of defun Функция ru-user-right-flag (листинг 36.24) вернет целое число, определяющее набор привилегий пользователя. ! Листинг 36.24. Функция ru-user-right-flag [defun ru-user-right-flag () (cdt (assoc "BIT_HIGHTS" (ru-user-get-current-user-info))1 ) ;__ end of defun Функция r-j-user-perm-bit-by-name (листинг 36.25) вернет целое число, соответствующее флагу именованной привилегии. i
| Листинг 36.25. Функция ru-user-perm-bit-Ьу-паюе [defun ru-user-penn-bit-by-neme inane) (cond [(cdr (assoc name fru-user-get-pemissions-fiags)))) It -1) I;_ end of cond );_ end of defun Функция, приведенная в листинге 36.26, проверяет разрешения пользователя на выполнение именованного действия. i i Листинг 36.26. Функция ru-user-test-perm!salon
[defun ru-user-test-permission (name! [ru-match-is-bit-in-flag (ru-user-pem-bit-by-narae name) (ru-user-right-flag) i ; _ end of ru-match-is-bit-in-flag );_ end of defun Семейство функций, одна из которых приведена в листинге 36.27, проверяют разрешения пользователя на выполнение конкретных именованных действий. | Листинг 36.27. Функция xu-user-raay-xnil-e
Функция, показанная в листинге 36.28, выводит диалоговое окно со списком наименований привилегий и отметками об их доступности для конкретного пользователя без возможности редактирования.
Глава 36.Разработка инсталлятора
/119
т™
Листинг 36,28. Функция tu-usec-show-rights Idefun сa-user-show-rights ( 1 !ru-dlg-show-check-list (street (ru-user-long-namel " - ваши права:") [tu-user-get-pennissions-notes-list! [mdpcar ' ru-user-test-permission [cu-uaer-get-peEmissions-names-list); nil ;•;_ e:id oE ru-dlg-usec-show-check-list (ptinc) ) ; _ end of defuri
В конечных программах используется функция, приведенная в листинге 36.29. Она применяется но всех потенциально опасных программах, и извещает пользователя об отсутствии у него прав на какое-либо действие. Если аргумент show_insg равен nil, то сообщение не выводится. Листинг 36.29. Функция ru-user-action-enabled (defur. ru -laser-action-enabled (narae_right show_msg) Делает остановку с сообщением о нарушении права Если зсе нормально, пропускает далыие Флаг show_msg для возможности тихой проверки [ ru-user-act ion -enabled "RCMIN" т} (ru-user-action-enabled "GET_TQPO" nil} iru-user-action-enabled "ПРЫГАТЬ" Т) (cond ( [ru-ijser-test-pennission name__rightl T) (T J i f show__msg (strcac ''\пВы не имеете разрешения на\п" (ru-user-pe cm-note -by- name narae_rightl : ) ; _ end of ru-rasg-alert : i ; _ end of if nil )} ! ;_ end of defuri
Примерно так же обрабатываются и другие подсписки глобальной переменной *ru_£tartup_info*.
Корректировка сценария установки С учетом всех изменений откорректируем сценарий установки. Прежде всего доработаем секцию code (листинг 36.30), дополнив ее выбором папок для файлов обшего доступа и архивов.
1120
Часть V. Выпуск системы в свет
I Листинг 36.30. Файл сценария ruCADBookLT.iss. Измененная секция cods !, :. ч [Code] var firchiveDir: String; SharedDir: String; TxtEditor; String; // Выбор AutoCAD в диалоге function SelectAcadf):boolean; external 'SelectAcad@files:tuSelScad.dll stdcall'; function EuKey(Default: string): String; begin Result := 'SOFTWARE\ruCfiD group\tuCAD'; end;
function FromptSrchiveDir(BackClicked: Boolean): Boolean; // Выбор каталога для архивов var next r Boolean; ConroonDefDir: string; begin ConmonDefDir:=ExpandConstant['(cormonappdata}'); // Открываем дополнительную страницу мастера ScriptDigPageOpen(1: ScriptDlgPageSetCsptiom'Папка для АРХИВОВ'i; ScriptDigPageSetSubCaptionl('Дрхивы, калек-слоев, типовых проектных решений и топографии1]; ScriptDlgPageSetSubCaption2('К фай~ам этой папки должен быть установлен доступ для чтения!'J; ftrchiveDir := ComroonDefDir +• '\ru\CADsrchive'; Hext :* InputDirl 'ruVCADArchive1, ArchiveDirl; while Next and (ArchiveDir = ''} do begin MsgBox(SetupMessage(msglnvalidPath), mbError, MB_OKI; Hext := InputDir('ru\CADArchive', ArchiveDir}; end;
if not BackClicked then Result := Next else Result :- not Next; ScriptDlgPageClose(not Result);
end; // ВыСор каталога или оСших файлов function PromptSharedDir(BackClicked: Boolean): Boolean; var Hext: Boolean; CormonDefDir: string; begin CoiranonDefDir := ExpendConstant ( ' icomraonappdata} ' } ; ScriptDlgPageOpen(); ScriptDlgPageSetCaption('Папка для файлов общего доступа - W i n H T ' ) ;
Глава 36. Разработка инсталлятора
1121
ScriptDlgPageSetSubCaptionl('Компоненты, используемые всеми пользователями'}; ScriptDlgPageSetSubCaption2 ('Ко есем файлам этой папки должен быть установлен полный доступ!'); SharedDir := CommonDefDisr + '\ru\CAD'; 1
Next := InputDirl 'ruXCAD , SharedDir); while Next and (ShacedDir = '') do begin MsgBox (SetupMessage (nisglnvalidPath), mbError, MB_OK); Next := InputDir('ru\CAD', SharedDir); end; if not BackClicked then Result := Hext else Result := not Next,ScriptDlgPageCloseinot Result);
end; // Выбор текстового редактора function ProrrptTxtEditorlBackClicked: Boolean): Boolean; var Next; Boolean; begin ScriptDlgPageOpen(}; ScriptDlgPageSetCaption('Выбор текстового редактора'); ScriptDlgPageSetSubCaptionl('Текстовый редактор, используемый для правки пользовательских текстов'); ScriptDlgPageSetSubCaption2('Пользователь должен иметь право запуска этой программы! Выберите'); TxtEditor := ExpandConstant('[win]') + '\Hotepad.еле'; Next := InputFilel'ВыОор текстового редактора', 'Приложения (*.ехе)]*.ехе', ' .еке1, TxtEditor); while Hext and (TxtEditor = '') do begin MsgSon(SetupMessage(rasglnvalidPath), mbError, MB_OK); Next := InputFile('ВыОор текстового редактора', 'Приложения ('.ехеН*.ехе', 1 .ехе', TxtEditor); end; if not BackClicked then Result := Hext else Result := not Next; SciriptDlgPageCloselnot Result) ; end; function ScciptD!gPages{CurPage: Integer; BackClicked: Boolean); Boolean; begin if (not BackClicked and (CucPage = wpSelectDit)) or (BackClicked and (CurPage = wpReady)) then begin Result := PromptSharedDir(ВасkClieked); Result := ProirptAcchiveDir (BackClicked) ; end else Result := True; end; f-onction ScxriptTxtEditorfCujrPage: Integer; BackClicked: Boolean): Boolean; begin
if (not BackClicked and (CurPage = wpSelectTasks)} ar (Backclicked and (CurPag« = wpReady)1 then Result := ?rronptTxtEditor (BackClicked) else Result := True; end,-
/ 722
Часть V. Выпуск системы в свет
function GetSharedDir(S: String): String; begin Result := SharedDit; End; function GetArchiveDir(S: String): String; begin Result :- ArchiveDir; end; function GetTxtEditor(S: String!: Srnr.g; begin
Result := TxtEditor; end; function UpdateReadyMerao(Spsce, NewLine, MereoUserlnfOlnfo, KemoDirlnfo, MemoTypelnfo, MemcComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; var
5: String; begin 3
= MemoDirlnfo + HewLine + NewLine;
S = S + 'Папка для общих файлов ' - WewLine; Е - S + Space + SharedDir + NewLir,e; £ = S + 'Папка для архивов ' + Newlirie; S S
= S + Space + ArchiveDiE + NewLir.e; = S + Текстовый редактор ' + NewLir.e;
S = S + Space + TxtEditor + MewLine; Result := S; end;
function BackButtonClicMCurPage: Integer:: Boolean; begin Result := (ScriptDigPages(CurPage, True) and ScriptTxtEditor(CurPage, True)); end; function NextButtonClicklCurPage: Integer}: Boolean; begin Result := True; case CurPage of wpInfoBefore : begin Result:= SelectAcad;
if not result then MsgBoxCHe зыСрана рабочая система AutoCAD!'+t!3 +'Стмените установку или повторите выбор', iubCriticalError,MB_OK); gnd; wpSelectDir: ScriptDlgPages(CurPage, False); wpSeiectTasks: ScriptTxtEditor(CurPage, False); er.d; end;
Глава 36. Разработка инсталлятора
1123
Теперь мы можем использовать переменные, вычисленные в секции code и в других секциях сценария (листинг 36.31). г
i Листинг 36.31. Примеры изменений в секции Files [Files) ;; Используем результат функции GetSharedDir :: из секции Code в качестве KOHC-caHTbi{code:GetShai:edDir Г ' 1 Source: cad\Shared\*; DestDir: {cede:GetSharedDir|'')\Shared; Components: main; Flags: recursesubdirs ,•; Используем результат функции Get Archive Si г
;; иэ секции Code в качестве KOHCTaHTtijcode :GetArchiveDir | ' '} Source: csd\Archive\*; DestDir: (code:GetAi:cliiveDir | ' ')\CADArchive;
Components: main add_a:rc; Flags: recursesubdirs; T a s k s : arc_layers arc_projects arc_topo .
__А_„.
; Также отправляем в белее ближние каталоги LocalData и User$Data I Но для этого, чтобы не описывать каждый подкаталог, ; просто перенесем их выше посредством сценария Source: cad\LocalData\*; DestDir: (code:GetSharedDiri ''1\LocalDat£; Components: asain; Flags: recursesubdirs
.,
._
--_
Source: cadVJsersDataS*; DestDir: (code:GetSharedDir|''}\UsersData; Coraponents: main; Flags: recursesubdirs
Внесем в секцию Tasks дополнительные задачи по установке архивов калек, типовых проектных решений и топографии (листинг 36.32). Листинг 36.32. Изменения в секции [Tasks] Name: arc topo; Description: Архиг топографических планшетов; GroupDescnption; Архивные материалы; Coraponents: add_arc Hame: arc_prejects; Description: Типовые проектные решения; GroupDescription: Архивные материалы; Components: add_arc Name: arc layers; Description; Кальки-слои; GroupDescription: Архивные материалы; Components: adci_arc Внесем изменения в секцию Registry (листинг 36.33). В ней мы также будем использовать в виде именованных констант результаты функций из секции code, но
1124
Часть V. Выпуск системы в свет
главное, что записей в реестр будет намного больше (мы приводим только фрагменты), т. к. именно программа установки должна создать все требуемые настройки. В наших программах больше не "зашиты" не только расположение каталогов, но и их "человеческие" описания. Листинг 36.33. Фрагменты секции Registry jRegistry] ;
Каталоги
Root: HELM; SubKey: {code:ruKey|; ValueType; string;
ValueName: RootDir; ValueData: {appj; Flags: uninsdeletekey; Components: main Root: HKLM; SubKey: )code:ruKey}; ValueType: string;
valueMame: AppDataDir; ValueData: -;code:GetSharedDirI ''}\Shared; flags: uninsdeletekey; Components: main Root: HKLM; SubKey: (code:ruKey}; ValueType: string; ValueName: ArchiveTopoDir; ValueData: {code:GetArchiveDir|''}\CADArchive\Topo; Flags: uninsdeletekey; Components: main add_arc; Tasks: arc_topo ; Описания каталогов Root: HKLM; SubKey: (code:ruKey)\Folders\Notes; ValueType: string; ValueName: RootDir; ValueData: Корневой каталог ruCAD; Flags: uninsdeleteKey; Components; main Root: HKLM; SubKey: (code:ruKey}\Folders\Hotes; ValueType: string; Valuetlare: AppDataPir; ValueData: Общие данные сторонник приложений; Flags: uninsdeletekey; Components: main Root: HKLM,- SubKey: (code; ruKeyl \Fclders\Notes; ValueType: string; ValueName: ArchiveTopoDir;
ValueData: Корневая папка архива топографии; Flags: uninsdeletekey; Components: main add_arc; Tasks: aic_topo ;--г
Имена и значения привилегии
Root: HKLM; SubKey: (code :ruKey| \Users\Perrnissions\Flags; ValueType: dword; ValueNarae: EDIT_DIRINFO; ValueData: 1;
Flags: uninsdeletekey; Components: main Root: HKLM; SubKey: (code:ruKeyl\Users\Pernussions\Flag5;
ValueType: dword; ValueNarae: ADMIK; ValueData: 131072; Flags: uninsdeletekey; Components: main . Описания привилегий Root: HKLM,- SubKey; (code;ruKey} \Users\Permissions\Motes; ValueType: string; ValueName: EDIT_DTRINFO;
ValueData: Редактировать описания файлов и папок; Flags: uninsdeletekey; Components: main Root: HKLM,- SubKey: (code : ruKey} \Users\PermisSiOns\Notes; ValueType: string; ValueName: ADMIH;
Глава 36. Разработка инсталлятора
____^_„
1125
ValueData: Администрировать ruCAD,Flags: uninsdeletekey; Components: main ; Перечень типовых пользователей и их привилегий Root: HKLM; SubKey: (code:ruKey}VUsers; ValueType: dword; ValueName: Администратор; ValueData: 262143; Flags: uninsdeletekey; Components: main ; Личные данные одного пользователя Root; HKLM; SubKey: {codeiruKey]\UserгХйдминистратор; ValueType; string; ValueName: LONG_NAME; ValueData: Командор; Flags: uninsdeletekey; Components: main Root: HKLM,- SubKey: (code :ruKey) \Users\Администратор; ValueType: string; ValueHame: HORK_DIR; ValueData:; Flags: unins delete key,- Components: main Root: HKLM; SubKey: {coderruKey)\Users\Администратор; ValueType: string; ValueName: TITLE; ValueData: Господин; Flags: ur.insdeletekey; Components: main Root: HKLM; SubKey: (code:ruKeylXUsersXАдминистратор; ValueType: string; ValueNarae: WORK_GROOP; ValueData: CCMMON; Flags: aninsdeletekey; Components: main Root: HKLM; SubKey: (code;ruKeyiXUsersXАдминистратор; ValueType: string; ValueName: DEPARTMENT,- ValueData: ОСО РОГА И КОПЫТД; Flags: uninsdeletekey; Components: main ; Данньте по умолчанию для новых пользователей Root: HKU; SubKey: .DEFAOLT\{code:ruKey}\Users; ValueType: dword; ValueName; Новичок; ValueData: 3; Flags: uninsdeletekey; Components: main Root: HKU; SubKey; .DEFADLT\(code:ruKey}\DserзХНовичок; ValueType: string; ValueName: TITLE; ValaeData: Уважаемый; Flags: uninsdeletekey; Components: main Root: HKU; SubKey: .DEFADLT\(code:ruKeyl\Users\HoBM4OK; ValueType: string; ValueName: LOHG_NAME; ValueData: Пользователь ruCAD; Flags: uninsdeletekey; Components: main
Полученный сценарий еще далек от совершенства. Нет в нем, например, определения расположения уже установленной системы ruCAD, нет вариантов простого обновления настроек. Пока не решен и главный вопрос — установка разрешений па папки для любых пользователей после инсталляции системы Администратором Windows. Программа Iimo Setup, к сожалению, не позволяет этого сделать. Решить такой вопрос можно путем автоматического запуска консольной программы SetAcI (есть несколько программ с таким названием) и установки с ее помошью разрешений. Наиболее известная из программ такого класса имеет огромное количество ключей и параметров, позволяющих сделать практически все. Пока мы ее применя-ь не будем, т. к. есть обоснованные подозрения, что делает она все, но не все правильно — как всегда проблемы с длинными и русскими именами. Придется сначала поэкспериментировать на себе. Мы уже предусмотрели альтернативное решение — установку разрешений из нашего менеджера безопасности. Воспользуется ли этим предложением Администратор —
) 126
Часть V. Выпуск системы в свет
его дело. Для хитрого Администратора у нас предусмотрено и недокументированное решение — размещение папок общего доступа вне пространства стандартных имен Windows, т. е. в обычный каталог, например. c:\ru\CAD. Администратор должен догадаться, что такой вновь созданный каталог не наследует стандартных разрешений. Хорошая новость! Буквально на следующий день после того, как были написаны эти строки, появилась новая версия программы Inno Setup 4 1 1, в которой предусмотрена долгожданная возможность установки разрешений на каталоги и файлы в процессе инсталляции. Теперь достаточно указать в сценарии флаг Permissions, записываемый и виде <илексификатор пользователя или грулпы>-<тип доступа>, где тип доступа может иметь одно из предопределенных значений modify (чтение и запись), readexec (чтение и выполнение) или f u l l (полный доступ). Например, строка сценария Source; cadYArchive\*; DestDir: (code;GetftrchiveDir|''}\CADArchive; Components: main £dd_arc,- Flags: recursesubdirs; Tasks: arc_layers arc_projects arc_topo; Permissions: "authusers-modify" предоставит всем зарегистрированным пользователям права на чтение и запись в каталог архива. Разумеется, мы немедленно внесем коррективы в сценарий установки нашей системы.
Резюме Разобрав технологию создания установочного комплекта, мы убедились, что даже на самом последнем этапе разработки программы можно обнаружить множество ошибок, но теперь точно знаем, как их можно избежать. Мы создавали установочный комплект для крупной системы, но аналогичные проблемы могут возникнуть и при разработке единственного приложения для AutoCAD, особенно если оно занимается записью информации. Подученный установочный комплект надо еще много тестировать в различных условиях. Даже "невинная" Windows 98 по-разному ведет себя при отсутствии профилей пользователей, при их наличии, при входе под профилем польз о нате л я, по с отменой ввода пароля. А есть еще и Windows ME, и различные клоны NT. Кажущийся последним шаг на пути превращения программы и продукт может оказаться возвратом в самое начало — об этом надо помнить.
ГЛАВА 37
Подготовка к распространению В этой главе, в отличие от предыдущих, мы будем говорить не о нашей системе, а о вашей. Предположим, что вы, наши читатели, с нашей скромной помощью разработали собственную САПР (некую SuperCAD), причем намного лучше описываемой в этой книге. Рано или поздно, но работа по созданию нашей системы завершена Вы знаете, что имеется еще много недоделок и ошибок, но в целом система уже работает, а некоторые члены коллектива разработчиков начинают произносить любимую фразу Михаила Самюэлевича Паниковского: "Отдайте мне мои деньги!". Вы начитались легенд о невероятных доходах авторов популярных программ и начинаете подумывать о том, что можете теперь и неплохо заработать на продаже своей суперпрограммы. А теперь вспомните, что сказал незабвенный товарищ Бендер по аналогичному поводу: "Только вы, дорогой товарищ, плюньте на все это. Слюной, как плевали до эпохи исторического материализма. Ничею не ныйдет". Оставьте в покое свою "голубую мечту" и попробуйте подойти к вопросу распространения (заметьте, еще не продаж) с реалистичных позиций. Знатоки бизнес-модели условно-бесплатного распространения программ считают, что приложения к популярным базовым пакетам, таким как наша любимая система AutoCAD, имеют большие шансы на успех — пристроившись за мировым лидером можно иырваться вперед. Увы, это не совсем верно.
Особенности приложений для AutoCAD В общем случае действительно заработок на приложениях к системе AutoCAD реальнее, чем попытка разработать (это возможно 1 ) и продвинуть на рынок гипотетический самостоятельный "русский CAD". но фактически эта ниша давно занята. Успехом могут пользоваться отдельные приложения, решающие частные задачи вне AutoCAD (просмотрщики, конверторы), и приложения, облегчающие работу пользователя внутри AutoCAD. Программы первого типа необходимы далеко не всем пользователям, да и практически все, что требуется, уже давно разработано. Отдельные успехи могут быть и на ' Примером является очень хорошая система Компас-Графи к. катя и не имеющая таких возможностей, как у AutoCAD, но уверении занимающая свою нишу на российском рынке.
1 128
Часть V. Выпуск системы в свет
этом направлении. Примером такой программы может служить ABViewer 1 , разработанная российскими программистами. Программа умеет просматривать множество графических форматов (ну, этим не удивишь), включая DWG и DXF — а это уже интересно. Кроме того, имеется рял полезных опций, в том числе возможность сохранения выбираемых фрагментов в растровый формат. Быстрый, даже на медленных машинах, просмотр DWG-файлов весьма непростая задача, особенно с учетом того, что формат DWG является закрытым. Хотя программа ABViewer и нуждается в некоторых усовершенствованиях, она вполне может распространяться во всем мире в качестве классической условно-бесплатной программы. Здесь мы пишем, что ABViewer может распространяться как Shareware, но на одном из форумов я писал, что "программа на Shareware пока не тянет". Такой преждевременный вывод я сделал потому, что программа в пробном режиме через несколько секунд напоминала о необходимости регистрации Оценить ее реальные возможности в таких условиях было трудно. Только после получения лицензии достоинства программы были оценены в полной мере. Излишняя назойливость ("дэнги, дэнги давай!"), на мой взгляд, вредит хорошей программе. (Сергей Зуев) Программы второго типа, работающие внутри системы AutoCAD, распространять сложнее. Благодаря развитым средствам разработки в мире разработаны тысячи программ такого типа, большинство из которых решает отдельные задачи или группы сходных задач. О том, что российские программисты, а еще чаще инженеры, с успехом занимаются разработками подобных программ, мы писали во введении, да и наша книга написана в помощь таким разработчикам. Как правило, такие программы в России распространяются бесплатно. Отдельные интересные программы вполне пригодны для условно-бесплатного распространения. Примером может быть программа АТаЫе2, предназначенная для создания в чертеже произвольных таблиц посредстном простого интерфейса, похожего на работу с Microsoft Word и Microsoft Excel. Программу такого класса самостоятельно написать сложно и ее могут приобрести многие. Кроме "маленьких" программ существует и ряд крупных систем, о которых мы упоминали во Введении. Но у всех упомянутых больших и маленьких программ есть крупнейший недостаток — они являются приложениями к дорогой базовой системе AutoCAD. Любая САПР на базе AutoCAD не стоит ни гроша, если у пользователя нет самой системы AutoCAD. Система AutoCAD в России имеется почти у каждого проектировщика, за исключением работающих на иных базовых платформах. Сколько копий AutoCAD используется — никто не знает. Однажды мы встречали упоминание о 40000 пользователей системы AutoCAD (было это лет десять назад, информация исходила из представительства фирмы Autodesk). Большинство этих пользователей, мягко говоря, являются незарегистрированными. Сколько продается легальных экземпляров AutoCAD выяснить, без "маски-шоу", даже у одного дистрибьютера, невозможно. Говорят, что много, а насколько много — два, десять экземпляров или десять тысяч, умалчивают. Предполагаем, что все-таки даже не сотни копий в год, иначе фирма Autodesk не потеряла бы интерес к России. Эти рассуждения мы привели для того, чтобы стало понятно — пользователи пиратских версий базовой системы вряд ли будуг покупать приложения к ней. Но в Росwww.cad softtools. com. ^ www.alx.ncn.ru.
Глава 37. Подготовка к распространению
1129
сии все не так, как во всем мире, и именно пользователи-пираты могут оказаться добросовестными покупателями вашей системы. Как это делается, рассмотрим чуть позже,
Составление бизнес-плана Разработчики программ очень не любит составлять "ненужные" документы, к которым они часто относят и программную документацию, а тут еще какой-то бизнесплан. Зачем он, когда миллионы покупателей только и ждут появления нашей программы? К сожалению, все не так. Не будут миллионы пользователей вставать в очередь (как это бывало при выходе новых версий Windows). Попробуйте сначала объективно и без излишнего оптимизма оценить, сколько покупателей будет у вашей продукции — может оказаться, что и ни одного. Заниматься бизнесом без плана можно в том случае, если вы распространяете простую и дешевую продукцию, примерами которой полны каталоги программ в Интернете. Если инсталляция программы "весит" до мегабайта, вы можете выложить ее на множество серверов для скачивания, а потом смотреть, что из этого выйдет. Если же инсталляция имеет размер несколько десятков мегабайт, то вряд ли вас куданибудь с таким "добром" пустят бесплатно, пользователи не захотят качать такого большого ' к м : I, [ешке (Иптер ei 5о . [инства не бесила ньш . . и вам могу] быть выставлены солидные счета от провайдера за чрезмерный исходящий трафик. Мы не будем разбирать технологию составления бизнес-плана — этим вопросам посвящены многочисленные издания. Остановимся только на нескольких принципиальных вопросах, которые необходимо решить.
Цель вашего предприятия От выбора конечной цели зависят и пути решения проблем. Решайте, чего вы хотите добиться — заработать миллион долларов, внедрить свою программу по всей стране, повысить производительность труда в своей организации или, может быть, "насолить" конкурентам. Конечно, хочется, чтобы вашей программой начали пользоваться все проектировщики бывшего СССР, но для начала поставьте более скромную задачу — "внедрить" ее в одной организации, но в полном объеме, во всех отделах, потом в масштабах города, а уж потом "слух о тебе пойдет по всей Руси великой". Мало желающих найдется делать ставку на "программу, которую сделал Вася Пупкин", а вот "система, успешно используемая в ЧегоТоТамПРОЕКТе" наверняка привлечет внимание. Если программа не используется в вашем родном городе, почему ее будут приобретать и других местах?
Кому нужна ваша программа О том, кто может быть пользователем подобной программы, мы рассуждали в главе 2. Теперь необходимо определиться, кто может купить программу. Вопрос этот очень сложный. Сначала нужно определить количество потенциальных пользователей программы, не вдаваясь в их желания и возможности. По нашим подсчетам у программ такого класса может быть до 3000 организаций-пользователей на терри-
1130
Часть V. Выпуск системы в свет
тории бьпзшего СССР, и это очень оптимистичный вариант. Реальных покупателей программы может быть около |0% or общего количества. '
Замечание
}
Усложняет распространение и ситуация, с которой мы несколько раз сталкивались — в проектных институтах, для которых подобная программа очень нужна и высоко оценена пользователями, главными противниками ее приобретения становятся специалисты отделов САПР. Обычно они заявляют, что "такое мы и сами можем сделать". Иногда это правда (тогда говорят, что уже сделали), но чаще за этими заявлениями скрывается желание скрыть свою некомпетентность, которая неизбежно проявится при появлении чужаков на их территории
Потенциальных пользователей САПР нужно разделить на несколько категорий: О бывшие государственные проектные организации традиционного образца; П проектные подразделения промышленных предприятий; D проектные фирмы нового типа; D частные лица. С каждой из этих групп нужно вести собственную политику распространения программьк Большинство традиционных проектных организаций никогда не будут постепенно приобретать несколько копий или лицензий программы. Им нужно продавать сразу и для использования на любом количестве компьютеров. При этом не следует рассчитывать на оплату наличными — непременно потребуется прикрытие в виде солидного юридического лица, но и продать программу можно за большие деньги. В стране появляется все больше частных проектировщиков, большинство из них работают дома на компьютерах, их благосостояние полностью зависит от результатов труда. Это очень перспективная категория пользователей, которых не надо особенно уговаривать — они сразу видят пользу дня себя и готовы платить за "нематериальный" продукт, причем формы оплаты могут быть самыми разнообразными, иногда экзотичными (машина арбузов, бесплатный Интернет, аренда гаража). Именно такие пользователи обычно используют пиратские версии AutoCAD, но готоиы оплачивать труд российских разработчиков.
Зачем нужна ваша программа Для того чтобы вашу программу приобрели, потенциальные пользователи должны понять, зачем она им нужна. Обшие фразы о повышении производительности и качества не всегда дают эффект. Если проектная организация не загружена заказами и не ликвидирована еще только потому, что это не допускается условиями приватизации, то зачем ей рост производительности? Но и в такой умирающей "конторе" могут быть отдельные группы, перегруженные "левыми" заказами. Это ваши потенциальные клиенты. Организациям, не имеющим проблем с работой, надо объяснять, что ваша система позволяет автоматизировать работу нал всеми разделами проекта, вводить единый стандарт проектирования, создавать упорядоченный электронный архив. Попробуйте оценить, насколько повышается производительность. Лучше, если это будут не мифические "разы", а проценты повышения зарплаты пользователей.
Глава 37. Подготовка к распространению
1131
Что вы будете продавать Необходимо решить, а что именно физически вы будете продавать — коробки с писками и документацией, лазерные диски, записанные на домашнем компьютере, или некие ключи, превращающие закачанную из Интернета программу в полнофункциональную. Рискнем предположить, что "коробочную" версию вы никогда не выпустите — сначала из-за отсутствия средств, а потом из-за того, что такой вид поставок отомрет иообщс. Продавать в принципе лучше не копии, а права на использование программы путем заключения Договора о получении авторских прав на использование программы для ЭВМ конечным пользователем. Еще лучше продавать повышение производительности конкретных исполнителей, хотя сделать это намного сложнее.
Сколько стоит ваша программа Разумеется, в рыночных условиях цена на любой товар определяется спросом и предложением, но необходимо знать, во что обошлось нам изготовление продукта. В главе 1 мы пытались определить трудозатраты на разработку программы, составившие, в первом приближении, 2 084 чел.-часов. Округлив эту цифру до 3 000. приняв среднюю часовую ставку программиста 80 рублей, накладные расходы 500% и "советскую" норму плановых накоплений 6%, мы получим примерные затраты на разработку программы 1 272000 рублей. Вы думаете, что не затратили таких денег на разработку? Вы получали только небольшую зарплату? А кто же ее вам выплачивал, кто платил за аренду помещений, коммунальные услуги, Интернет, выплачивал многочисленные налоги'' Если ничего этого не было, то программа разрабатывалась на необитаемом острове, а единственным ее пользователем станет Пятница Но и Робинзон Крузо начинал не с пустыми руками, а "приватизировал" имущество с разбитого корабля. В столице затраты на разработку' будут еше больше, т. к. мы оперировали ставкой провинциального программиста. Теперь увеличим затраты еще в десять раз, учтя доиедепие программы до уровня товарного продукта, и полученную сумму и 12720000 рублей разделим на минимальное количество продаж — 300 инсталляций. Стоимость инсталляции будет 42400 рублей или примерно 1 400 долларов. Если вы думаете, что найдете в современной России за один год 300 покупателей продукта такого класса по такой цене, то очень ошибаетесь. Система такого класса должна для конечного пользователя иметь пену, не превышающую аналоги. Давайте рассмотрим хотя бы приблизительные аналоги. Для простоты воспользуемся сравнением с продуктами, распространяемыми уважаемой фирмы Consistent Software (табл. 37.1). Напомним, что мы рассуждаем о вашей системе, имеющей возможности не ниже, чем у ruCAD. Мы выбрали три очень хороших и популярных продукта. Project Studio CS — это "потомок" давно известной системы АРКО, ранее разрабатывавшейся и распростра нявшейся московской проектной фирмой АП И О-Центр, МАЭСТРО — продукт Maestro Group, распространяемый Consistent Software в России, СПДС GraphiCS -
1132
Часть V. Выпуск системы в свет
удобный инструментарий, закрывающий бреши в продуктах фирмы Autodesk по оформлению чертежей в соответствии со стандартами СПДС. К сожалению, последний продукт появился лет на пятнадцать позже, чем в нем возникла потребность. Таблица 37.1. Цены аналогичных программных продуктов Продукт
Возможности
Цена
СПДС GraphiCS 2.5
Набор инструментов архитектурно-строительной графики для оформления чертежей в соответствии с требованиями ГОСТ в среде системы AutoCAD 2002/2004, ADT 3.3/2004. Сертифицирован Госстроем России
S450
Project Studio CS v.1 Архитектура
Создание обьемиой модели и формирования полного комплекта рабочей документации архитектурного раздела проектирования (АС, АР. АИ) в среде AutoCAD 2002/2004/ADT
$900
МАЭСТРО-АКС (архитектура, конструкции, сантехника)
Приложение к системе AutoCAD 2002/2004. Сертифицирована Госстроем России
$1530
Соревноваться в бизнесе с этими продуктами тяжело. Они и сами "раскручены" и распространяются ведущей фирмой в области САПР. Следовательно, про все наши ценовые расчеты нужно забыть. При попытке влезть на рынок вы непременно столкнетесь с этими продуктами, и должны будете еще доказать потенциальным покупателям, что нужно не просто купить ваш продукт, но еще и купить его, например, вместо СПДС GraphiCS, и возможно, в дополнение к Project Studio CS. Для этого есть немало оснований. Напомним, что вы предоставляете средства для автоматизации вычерчивания всех разделов проекта, и это очень важно. Вы много раз наблюдали, как мучаются с "голой" системой AutoCAD все смежники, хотя архитекторы и строители много лет работают в АРКО. Вы предусмотрели много программных решений, позволяющих расширять нашу систему, вы имеете удобный интерфейс с иллюстрированными меню, классификатор сдоев, достаточно "продвинутые" элементы документооборота и многое другое. Ваша система полностью совместима 1 с рассматриваемыми продуктами и может даже поглотить их путем включения i! собственные иллюстрированные меню. Пользователи смогут выбирать между оформительскими средствами СПДС GraphiCS и вашими, и еше неизвестно, какие окажутся популярнее. Прежде чем решить, как выжить в соревновании с такими конкурентами, мы дополнительно "постращаем" читателей некоторыми юридическими проблемами, требующими решения.
Юридические вопросы Просмотрите еще раз главу i, в которой мы советовали как можно раньше решить вопросы авторского права. Теперь, при завершении работы, вы уже должны не В отличие от систем, рисующих модель в масштабе, а не в натуральную величину.
Глава 37. Подготовка к распространению только точно знать ответы на все вопросы авторского права, но иметь и документы. в которых все это подтверждено — от соглашения между соавторами до соглашений с организацией, в которой вы работаете. Необходимо хорошо изучить упоминавшиеся нами законы и действовать в точном соответствии с ними, не забывая, что в России, кроме законов, действуют еще и "понятия".
Авторские права Четко установите владельцев личных и имущественных прав — личные авторские права у вас никто не отнимет (если соавторы не перессорятся, "деля шкуру неубитого медведя"), а имущественные права можно продать. Вообще -то, если вы не чувствуете в себе талантов коммерсанта, самым лучшим вариантом для разработчиков является именно продажа имущественных прав, вопрос только кому и за сколько. Не стоит проявлять к этом вопросе излишних амбиций — для довелсния ваших программ до уровня продаваемого продукта потребуется средств намного больше, чем на разработку. Правда и покупателей на такое "имущество" сейчас найти очень трудно, т. к. фирмы-идеалисты, покупавшие интеллектуальную собственность лет 15 назад, сгинули в это смутное время, а выжившие еще не прошли путь от бизнеса на "железе" до продвижения российских продуктов "вне фирменных" разработчиков. Взять "на реализацию" готовый продукт — это можно, а доводить до товарного вида посторонний — увольте.
Регистрация программ После изучения законов у вас отпадут и вопросы о "патентовании" программ. Авторы имеют право на регистрацию программы для ЭВМ и базы данных, но не обязаны это делать. Надо знать и то, что законом охраняются не идеи и п р и н ц и п ы организации интерфейса и алгоритмы, а лишь конкретная реализация этого алгоритма в виде совокупности данных и команд. Регистрация программ и баз данных осуществляется Роспатентом в соответствии с Правилами составления, подачи и рассмотрения заявки на официальную регистрацию программы Aw электронных вычислительных машин и заявки на официальную регистрацию базы данных1, утвержденными приказом Роспатента от 25 февраля 2003 года N° 25.
Сертификация и лицензирование Иногда возникают вопросы о сертификации И лицензировании программ. Действительно, имеются предметные области, в которых сертификация программ является обязательной, а фирмы-разработчики должны иметь лицензию на соответствующую деятельность. Программы класса "чертилка", рассматриваемые в книге, сертификации не подлежат. Другое дело, что солидная (вернее, богатая) фирма может правдами и неправдами получить, "для понту", сертификат на программный продукт, но наличие такого сертификата свидетельствует только о том, что "поддержка отечественному чиновнику" оказана. Самую лучшую "сертификацию" осуществит пользователь.
1
www. fips.ru/avp/pr_sw_db.hlm
^ 134
Часть V. Выпуск системы в свет
Юридическое лицо Далее следует решить вопрос с "юридическим лицом". Конечно, автор имеет полное право (если он имеет имущественное право) торговать своей продукцией самостоятельно — хоть на рынке. При этом сразу встанет вопрос о легализации этой деятельности, как минимум, в качестве частного предпринимателя без образования юридического лица. Но особенность САПР в том, что основными покупателями являются организации, а они привыкли иметь дело с другими организациями. Вот гут-то и может пригодиться ваша работа в проектной организации — оформляйте внутренние взаимоотношения, делитесь доходами и работайте "под крышей". Возможен вариант ухода "под крышу" какой-нибудь солидной компьютерной фирмы — на поверку многие из них. имея солидную марку, оказываются неким товариществом предпринимателей или лиц без определенных (по трудовой книжке) занятий,
Проверка собственных прав Если вы намечаете коммерческую деятельность, то реализуемая вами продукция должна быть изготовлена с использованием лицензионных программных средств. Прежде всего это, конечно, наша базовая система — AutoCAD. Лицензионными должны быть и операционная система, и используемые системы программирования (Delphi, VC++), и все компоненты и библиотеки, примененные при разработке. Не забудьте включить затраты на все это "добро" (не менее $10000) в свой бизнесплан.
Лицензионные соглашения Для завершения юридических вопросов подготовьте лицензионное соглашение на вашу программу. При продаже и предоставлении массовым пользователям доступа к программам законодательством допускается применение особого порядка заключения договоров, например, путем изложения типовых условий договора на передаваемых экземплярах программ —"оберточных" лицензиях (shrnikwrap license). В отличие от традиционных авторских договоров, заключаемых в предписанной законодательством письменной форме, данные договоры являются разновидностью сделок, при которых лицо выражает свою волю установить правоотношение не в форме устного или письменного волеизъявления, а своим повелением, по которому можно сделать заключение о таком намерении — вскрытие упаковки или выполнение программы установки после знакомства с договором. Составлять лицензию нужно тщательно, с привлечением юристов. Мы можем только посоветовать: П
называть лицензию Договором о получении конечным пользователе.» авторских прав на использование программы для ЭВМ, при таком названии возможны льготы по налогам, касающихся "получения авторских прав";
П не применять для своих программ лицензионные соглашения иностранных поставщиков — они могут не соответствовать российскому законодательству.
Глава 37. Подготовка к распространению
/135
Подведем итоги Если читатели напуганы сложностями с распространением собственных программ (и юридические "крючки", и конкуренция, и большие затраты на подготовку), то не переживайте — многого мы не упомянули, ограничившись намеком на "среднепотолочное" десятикратное увеличение стоимости подготовки товарного продукта, по сравнению со стоимостью разработки программы. Решать нужно еще множество вопросов — от дизайна обложки компакт-диска до организации собственного сайта для технической поддержки продукта и технологии распространения программ класса Shareware. Этим вопросам посвящено множество специализированных изданий и ресурсов в Интернете. Понимая, что упомянутые проблемы сразу решить трудно, мы советуем не распылять силы и последовательно действовать в соответствии с планом: G внедряйте программу версии I-** сначала в собственной фирме, а потом и в других проектных организациях города; 3 начинайте переговоры о внедрении не с руководителями организаций и не с работниками САПР, а с заинтересованными специалистами производственных отделен; П используйте собственную программу для разработки проектов — если иы уверяете, что с ее помощью "чертить в десять раз быстрее", так докажите это на деле, увеличив хотя бы в два раза свою зарплату; 3 передавайте программу бесплатно, но предлагайте платную техническую поддержку и обучение — в масштабах города это сделать проше; О предлагайте оплачивать свой труд в процентах от повышения зарплаты исполнителей, использующих программу; О выявляйте ошибки и неудобные пользователям интерфейсы, собирайте статистику по использованию команд для размещения самых популярных на панелях инструментов; И обучите нескольких активистов приемам пополнения библиотек блоков, типовые текстов, типовых проектных решений и пополняйте программу этими данными; П организуйте общий банк данных оборудования и изделий для спецификаций; О передавайте программу в вузы и техникумы для обучения и выполнения курсовых и дипломных работ — студенты быстро растащат ее по домам и по всем, 1 свету; П постепенно создавайте свой сайт в Интернете, наполняя его до открытия реальными вопросами и ответами, иллюстрирующими техническую поддержку программы; О размещайте на сайте достаточно подробную документацию; П начинайте постепенно рекламировать программу в Интернете, но никогда не рассылайте рекламные письма, не употребляйте выражения "лучшая программа" "единственный продукт" и т. П.; П выделите отдельные интересные программы для работы в "автономном" режиме и разместите их в различных коллекциях (упоминая, что это маленький фрагмент
1136
Часть V. Выпуск системы в свет
продукта) — бесплатно с русскоязычным интерфейсом и в качестве условнобесплатных' с англоязычным интерфейсом. Примерно через год работы в таком режиме, после устранения явных огрехов, усовершенствования программы, начинайте внедрение версии 2.хх и в других регионах. Еще через год, набравшись опыта и подготовив существенно усоиершенствованную версию З.хх, составляйте бизнес-план и приступайте к реализации коммерческих замыслов. Если они еще останутся.
' Прежде, чем это делать, разузнайте, как это делается, например на сайте www.soft5hape.com/swrus. Здесь вы найдете вес материалы и ссылки но "шаровзрной" тематике.
,«i/CAD Г Л А В А 38
Особенности AutoCAD 2005 В задании на разработку нашей системы был предусмотрен переход на систему AutoCAD 2004, а и главе 4 приведены особенности AutoCAD 2004. Пока мы разрабатывали нашу систему, фирма Autodesk выпустила новую версию — AutoCAD 2005. Некоторые его особенности мы упоминали в предыдущих главах, теперь рассмотрим эту версию подробнее. В целом система AutoCAD 200S сразу производит очень хорошее впечатление. В neii появились и радикальные улучшения, и множество приятных мелочей. Мы не будем детально описывать новые возможности, которые получили пользователи — для этого требуется отдельная книга, а наша посвящена программированию. Упомянем только основные новинки: П Sheet Set Manager — новый инструмент управления проектами; П команда TABLE — удобное средство для создания и заполнения таблиц; П команда FIELD — превосходное средство, позволяющее вставлять в рисунок автоматически обновляющуюся текстовую информацию (около сорока типов, в том числе и пользовательские свойства рисунка, и значения системных переменных); П
усовершенствованы TOOL PALETTES (ИНСТРУМЕНТАЛЬНЫЕ ПАЛИТРЫ) появилась возможность добавлять собственные макросы, как и в панели инструментов;
О улучшена работа со слоями — появилась .возможность группировки слоев и управления этими группами (к сожалению, дерево групп слоев ограничено одним уровнем). Изменено множество команд и системных переменных, появились 25 новых команд и много новых системных переменных.
Новинки для разработчиков Нас в AutoCAD 2005 интересует прежде всего то, как сможет работать с ним наши система. В каждой новой версии мы сталкивались с какими-то неприятными сюрпризами, о которых, в отличие от приятных, фирма Autodesk скромно умалчивает. Разумеется, для обнаружения всех "подводных камней" требуется долгое и тщатель834
Часть V. Выпуск системы в свет
1138
ное тестирование в различных режимах, но некоторые предварительные выводы можно сделать сразу,
Хорошие новости Главная и самая приятная новость — после установки системы AutoCAD 2005 наша программа-стартер обнаружила ее, запустила, и заработали (насколько это можно оценить сразу} все наши программы. Проверка некоторых критичных мест показала, что в новой версии сохранились и некоторые "глюки" системы AutoCAD 2004. Так как мы их уже преодолели, то это можно считать лучшим вариантом, чем их "усовершенствование". Формат откомпилированных файлов меню остался совместимым с версией 2004. и это позволяет не создавать для AutoCAD 2005 отдельную папку на путях поиска файлов поддержки.
Плохие новости Иногда возникают проблемы с установкой системы AutoCAD 2005. Прежде всего, на некоторых компьютерах может возникнуть ошибка установки среды .NET Framework (рис. 38.1). ire Installer Information Error 1335. An enor occured duiing the ristalldtion oJ a&semb component {Д22Е 3D Б 9-B AE2-W7-AF 95-318ЭЕ7В06132]. HHESULT:-214 7024091
Рис. 38.1. Сбойная ситуация
Эта ошибка к системе AutoCAD отношения не имеет и может возникнуть на компьютерах с ранее установленной средой .NET Framework. Излечивается эта ошибка отключением на время инсталляции всех антивирусных мониторов. Возможно, потребуется удаление Internet Information Service' (IIS), если он зачем-то был установлен. Следующая ошибка может возникнуть при запуске acad.exe (рис. 38.2). Сообщение говорит о том, что модуль acad.exe обратился не к той библиотеке acdbl6.dll. Скорее всего была найдена первой версия библиотеки от AutoCAD 2004 в c:\Program Files\Cornmoii Files\Autodesk Shared\acdbl6.dll. В этой DLL действительно нет функции evaiuationstatus, она должна быть в одноименной DLL для 2005. Это
1
Это всего лишь слухи, но некоторые юянутся, что помогало.
Глава 38. Особенности AutoCAD 2005
1139
означает, что система AutoCAD 2005 была установлена не полностью. Многие компоненты версии 2005 устанавливаются в ту же паку, что и для Персии 2004. Чаще всего эго происходит правильно, но возможны и сбои. Для лечения можно попробовать на время установки AutoCAD 2005 переименовать папку c:\Program File< \Common Files\Autodesk Shared. I аса dene - Точка входа не найдена Точна входа в процедуру ?eva[u3tion5tatus@ftcl*FieldS>eiQB£?SW'tEvdl5tatuseilS1PAHPAPuDSSZ не найдена в библиотеке DLL acdbl6.dll.
Рис. 38.2. Ошибка при запуске acad.exe
Если система AutoCAD 2005 установилась и запускается (обычно так и происходит), то надо проверить работу предыдущих версий. Это только в фирме Autodesk полагают, что перед установкой новой версии будут удаляться старые, мы-то с читателями знаем, что это не так. К. счастью, система AutoCAD 2004 работает с библиотеками версии 2005, как со своими', и это хорошо Оставлять в работе систему AutoCAD 2004 при установленной AutoCAD 2005 имеет смысл только для искателей приключений и разработчиков, просто обязанных тестировав программы в разных версиях базовой системы. Именно этим мы занимаемся, у нас предусмотрена возможность запуска разных версий системы AutoCAD (по алгоритму, описанному в главе 2(7), и мы это должны проверить. Вот тут и начинаются более серьезные неприятности. Каждый acad.exe, как приложение, запускается и работает нормально, но нас интересуют более глубокие вопросы. Напомним, что делает наша программа-стартер: 3 разыскивает все устаноиленные версии AutoCAD; П для каждой версии определяет полный путь к файлу acad.exe; 3 для каждого acad.exe выясняет имя объекта автоматизации AcadAppiication (AutoCAD. Application, AutoCAD.Application.15 ИЛИ AutoCAD.Application. 16); G первоначальный запуск любой из выбранных систем AutoCAD выполняет как для обычного приложения, загружая требуемый acad.exe; D при запущенной системе AutoCAD обращается к ней как к объекту класса Dievariant, посылая ей соответствующие указания — обычно открыть файл. Для связи с объектом автоматизации используется вычисленное имя. После того, как в реестре Windows похозяйничала система AutoCAD 2005, обнаруживаются удивительные вещи. Напомним, что в реестре ИМЕЮТСЯ несколько ветвей: HKEY_CLASSES_ROQT\AutoCAD.Application.14\CLSID HKEY_CLASSES_RQCT\AutoCAD.Application.15XCLSID HKEY CLASSES_RCOT\AutoCAD.Application. 164CLSID
Предполагаем, что до поры до времени
1140
Часть V. Выпуск системы в свет
В каждой из этих ветвей имеется ключ "По умолчанию", а значением ключа является идентификатор этой версии системы AutoCAD, по которому можно найти остальные параметры, в том числе полное имя ЕХЕ-файла, и сопоставить каждому файлу acad.exe соответствующее имя объекта автоматизации. Особую роль играет ветвь HKEY_CLASSES_RCOT \AutoCAD.Application, в которой, кроме подветви CLSID, имеется подветвь CucVer. Сюда записываются параметры последней запущенной системы AutoCAD {изменение происходит после полной загрузки acad.exe). Например, после запуска AutoCAD R14 фрагмент реестра будет выглядеть, как показано в листинге 38.1, после запуска AutoCAD 2002 — как в листинге 38.2, а после запуска AutoCAD 2004 — как в листинге 38.3. I Листинг 38.1. Ветвь реестра AutoCAD.Application после запуска AutoCAD R14 ; HKE Y_CLAS S ES_ROOT \ Aut oC AD. Арр licstion] @="AutoCAD Application" [ HKE Y_C LASS ES_RDOT \Aut oC AD. Appl i ca t i on\CLSID j @="{D2F13240-5769-llCF-A820-080CQ91B9B14>" [ HKEY_C LASS ES_RCOT \ Aut ОС AD. Appl i ca t i on\CurVe r] 3="AutoCAD.Application.14"
I Листинг 38.2. Ветвь реестра AutoCAD.Application после запуска AutoCAD 2002 Г
.'.
,..-
-.-.—
„.,....-.—...
.'.
[HKEY_CLASSES_ROOT\AutoCAD. Application] @="AutoCAD Application" [ HKE Y_C LAS S ES_ROOT \Aut oCAD. Appli ca t i on \ CLSID ] @="{8E7SD911-3D21-lld2-85C
l Листинг 38.3. Ветвь реестра AutoCAD.Application после запуска AutoCAD 2004 (HKEY_CLASSES_ROOT\AutoCAD.Application] @="AutoCArj Application" [HKEY_CLAS Б ES_ROOT \AutoCAD. Application \CLSID] @="{1365A45F-QCBF-48Q6-A26A-6B22AD37EC66}" [HKEY_CLASSES_ROOT\AutoCAD.Application\CurVer] @="AutoCAD.Application.16"
Такая система позволяет сторонним приложениям в любой момент определить истинное название объекта автоматизации AutoCAD.Application. После запуска AutoCAD 2005 эта система оказывается поломанной. AutoCAD 2005 числится в реестре как AutoCAD.Application. 16.1 и, разумеется, имеет свой CLSID: [HKEY_C LASS ES_ROOT \AutoCAD. Application. 16.1 \CLSID) @="fFC280999-88C6-4499-9622-3B795A8B
Однако после запуска, вместо того, чтобы сделать запись (листинг 38.4), как это делали ее "предки", эта наглая система влезает в чужой ключ, идентификатор которого принадлежит AutoCAD 2004, и записывает туда собственное имя файла (листинг 38.5).
Глава 38. Особенное™ AutoCAD 2005
1141 '
С"
"
"
( Листинг 38.4. Как должна была регистрироваться система AutoCAD 2005 ;
-
——
-
"Е
IHKEY_CLASSES_ROOT\autoCAD.Application\CLSID] @="! FC280999-93C6-4499-9622~3B795A6B4A5F }" [HKEY_CIASSES_ROOT\fiutoCAD.Application\CurVer] 3*"AutoCAD.Application.16.1" Листинг 38.5. Запись AutoCAD 2005 в ключ AutoCAD 2004 [HKEY_CLASSES_ROOT\CLSID\(1365A45F-OC8F-4B06-A26A-6B22AD317EC66} \LocalServer32] Э="С:\\Acad\\2005\Sacad.exe /Automation"
Это означает, что при обращении к идентификатору AutoCAD 2004 будет происходить подмена на файл иной версии.
Что делать? А какое нам дело до внутренних махинаций фирмы Autodesk с ее ключами реестра? Может быть, это у них новая политика, в которой мы ничего не понимаем, а может быть, просто кто-то что-то не оттуда, откуда надо, скопировал и не туда, куда надо, вставил? Бывает ведь и "кое-где, у нас порой". Конечно, бывает со всеми, тем более что если отследить приключения идентификаторов во всем реестре, то становится понятно, что никакой "новой политики" нет, просто ошибки. Для нашей системы это имеет прямые последствия. Наша про грамма-стартер ищет объект автоматизации так, как положено — по идентификатору, а натыкается на ЕХЕ-файл, не относящийся к этому идентификатору. В резулвтате у нас происходит конфликт имен, и мы не сможем "по науке" работать с требуемым объектом автоматизации. Это означает, что мы не сможем отправить в работающую систему AutoCAD новый файл, будем запускать новые процессы и вообще будем вынуждены работать не так, как положено. Конечно, можно и отыскать работающую систему AutoCAD в списке процессов, но это будет возврат на несколько лет назад. Поразмыслив, мы приняли решение откорректировать программу-стартер в сторону ухудшения ее возможностей. Изменять концепцию нет смысла — вероятность того, что в фирме Autodesk опомнятся и исправят ошибку, есть. Пока мы просто заблокируем возможность загрузки дополнительных файлов в систему AutoCAD из стартера (это не так уж и нужно) и, для памяти, будем выводить в рабочем окне напоминание о конфликте версий. Вдаваться в детали, как это сделано, мы уже не будем.
Резюме Новая версия системы AutoCAD 2005 является интересной и прогрессивной. Некоторое количество ошибок 1 простительно в любом продукте, ошибки преодолимые, и на AutoCAD 2005 мы и будем ориентироваться в дальнейших версиях ruCAD.
1
Еще более "об належиваю щи и" список "багов" можно найти на www.jtbworld.com.
;
.
1142
Часть V. быпуся системы в свет
После дополнительных исследований новых объектов мы включим в свою систему дополнительные возможности. Просто напрашивается автоматизированное формироиание Tool Palettes из наших XML-меню, тем более что наши иллюстрации к меню "прсллатываются" этими палитрами с удовольствием. В отличие от стандартных панелей инструментов, для которых самым трудоемким является ручное рисование миниатюр, Tool Palettes работают с файлами, а это позволит, кроме XML-меню, сформировать и полный набор палитр. Но это все в будущем.
Послесловие Итак, мы завершаем эту трудную и для нас, и для читателей книгу. Мы впервые описывали, а читатели, возможно, впервые читали, как делаются программы — не справочные сведения, не отдельные примеры, не изучение языка, а технологический процесс создания программного продукта. Трудности для авторов были в том, что мы делали реальную систему, которую можно использовать в реальной работе, да еще и описывали, как это делается. Трудности для читателей мы видим в том, что описывались не всем знакомые технологии, да еще с минимальным разъяснением азов. Но система реальная, и если мы использовали для разработки ее компонентов Borland Delphi, то мы и посвятили значительную часть книги изучению связки Delphi—AutoCAD. He нашлось в нашей системе применения для VBA — мы и не стали внедрять в книгу искусственных примеров. Впрочем, примеров использования VBA полна справочная система AutoCAD, Подведем некоторые итоги выполнения задач, поставленных в начале книги.
Сроки разработки В главе I мы подсчитали примерную трудоемкость работ по разработке такой системы — 260,5 чел.-дней, и заявили, что это ьполне реально. Конечно, такая точная расчетная трудоемкость (с трогательным "полднем") рассчитана на "облапсшивание" заказчика, т. к. вызывает большее доверие, чем, например, "примерно год", хотя, по кути, это и есть год. У нас, кстати, был реальный заказчик, который хорошо разбирается в том, как составляются планы и как они реально выполняются. Теперь мы знаем, что хотя и, разумеется, не выдержали эти "полдня", по и "примерно год" уложились. Заказчик этим был очень удивлен, т. к. думал, что фактически мы будем возиться не менее трех лет. Вообще-то мы уложились бы и в запланированные сроки, но одновременно с разработкой программ мы писали и книгу. Если Приравнять ее к программной документации, то со сроками у нас получается почти 1 идеальная картина . А если бы мы делали систему для одной версии AutoCAD, то могли бы сделать еще быстрее — не менее 10% времени было потрачено на разборки "с сюрпризами" фирмы Autodesk в различных версиях базовой системы.
1
В отличие oi сроков выпуска к н и г и , но мы пошлн на их увеличение, чтобы в книге был отражен реальный прочесе разработки ч реальные результаты.
1144
Послесловие
Результаты разработки В главе 2 мы изложили основные технические требования к системе, а в главе 3 — базовые принципы, включая стандарт работы в нашей САПР. Все эти планы выполнены, хотя пришлось вносить и некоторые коррективы. С коммерческой точки зрения мы совершили типичную ошибку российских разработчиков — сделали систему лучше, чем требовалось, вместо того, чтобы быстрее "пустить в оборот" то, что есть. Например, мы могли бы спокойно использовать давно отработанные меню в формате BTR, не заниматься исследованиями XML, оставить нее старые программы с использованием функции command, без переделки на объектные технологии и оптимизации исходных текстов. Пользователи системы ничего бы об этих технических деталях не знали, да и книга давно бы уже вышла из печати. Но мы посчитали невозможным приводить в книге устаревшие решения и работающие, но некрасивые программы. В этом мы солидарны со многими проектировщиками, не выпускающими "сырых" проектов, как бы на них не нажимало начальство — о том, что "быстро делали", забудется уже завтра, а репутация специалиста может быть испорчена навсегда. Как и большинство разработчиков, мы не выполнили клятву — все сразу документировать, хотя и пытались это делать. Мы даже создали проекты справочной системы и по функциям ruCAD, и по командам. Увы, не располагая специальным "дивизионом" для таких работ, мы, как всегда, отложили эти работы "на потом", хотя и предусмотрели средства, облегчающие подготовку документации — текстовые и HTML-справки и тому подобные суррогаты.
Параметры книги К сожалению, не все, что было задумано, удалось вместить в ограниченный объем издания — прежде всего это касается примеров прикладных программ. Намного больше, чем планировалось, заняли различные, иногда спорные, рассуждения. Мы пошли на это по советам наших консультантов — побольше разъяснять, почему принято то или иное решение, а исходные тексты можно всегда просмотреть на компакт-диске. Мы не можем считать идеальными все приведенные функции — наверняка читатели смогут найти более красивые решения. Можно считать недостатком смесь стилей встречаются и функция comuand, и функция entmake, и работа с использованием механизмов ActiveX. Может вызвать удивление публикация множества примитивных и неинтересных функций. Все это объясняется одним — мы описывали создание реальной системы в реальных условиях, а реальное изделие, как правило, не состоит из одних гениальных конструкций — в нем встречаются и обычные болты, и гайки. Мы писали книгу о том, как делается САПР, а не о том, как она должна делаться. Мы живем так, как живем, а не так, как должны жить, и программируем так, как программируем, а не так, как должны программировать. Для того чтобы понять, как надо "жить", нужно "задокументировать" существующий "образ жизни". Это мы и попытались сделать. Получилось это или нет — судить нашим читателям.
ПРИЛОЖЕНИЕ
Описание компакт-диска В книге мы неоднократно упоминали о дополнительных материалах, которые будут размещены на прилагаемом компакт-диске. Однако сформировать диск оказалось не так просто, и не потому, что у нас недостаточно материалов, а потому, что их слишком много и описание прилагаемых материалов может занять несколько десятков страниц. В результате мы решили схитрить и на компакт-диск поместить минимум "единиц хранения", но предоставив читателям возможность ознакомиться с максимумом материалов. Итак, на компакт-диске в папке Install находятся дне программы для установки системы: П niCADBookLT.exe — установка "книжной" версии системы шСАО; Э ruCADSource.exe — установка исходных текстов системы и листингов.
Такую технологию мы применили для того, чтобы читатели, прочитан в книге, как это делается, могли увидеть и результат работы, то есть кик это сделано.
Как устанавливать Для установки материалов на компьютер необходимо запустить соответствующую программу установки. При запуске программ установки будет выведено для прочтения и подтверждения лицензионное соглашение. Соглашаясь с лицензионным соглашением, вы не просто нажимаете кнопку, а "подписываете" договор, про который не сможете сказать, что "в глаза его не видели"1. В частности, и лицензионном соглашении указано, что прилагаемые исходные тексты вы имеете право использовать и для создания коммерческих программных продуктов, ко только при условии поставки их с исходными текстами, а для разработки "закрытых" программных продуктов требуется приобретение соответствующей лицензии.
1
Еще одна причина создания установочной программы, а не записи материалов на компакт-диск "россыпью".
1146
Приложение
Что будет установлено 1
При запуске программы ruCADBookLT.exe будут выполнены действия, предусмотренные сценарием установки, описанным в главе 36. В результате работы инсталлятора будет установлена специальная "книжная" версия системы niCAD. Мы предоставляем читателям возможность самостоятельно разобраться (по книге и прилагаемому исходному тексту сценария установки}, что и куда будет поставлено. "Книжная" версия является полностью работоспособной, в ней нет никаких ограничений, например на количество запусков. От рабочей версии она отличается только тем, что в нее входят только отдельные прикладные программы. "Книжная" версия системы предназначена для иллюстрирования решений, описанных в книге, а не для изготовления проектной продукции. При необходимости "книжную" иерсию можно обновить до рабочей, скачав с сайта www.kurganobl.ru/cad необходимые дополнения. Дополнения выкладываются в виде небольших пакетов обновления (Service Pack), в которые, кэк правило, включаются FAS-файлы прикладных программ и, при необходимости, дополнительные компоненты (меню, библиотеки блоков). При запуске программы ruCADSource.exe на компьютер пользователя будут установлены все исходные тексты, включая листинги, приводившиеся в книге (в полном объеме и с восстановленным форматированием), .LSP-, PAS-, DFM- и DPR-файлы и прочие исходные материалы, "разложенные по полочкам" в систему каталогов. Кроме того, будет установлена специальная программа-навигатор для удобного просмотра исходных текстов с иллюстрациями и описаниями файлов. Используя программу-навигатор, вы сможете перетаскивать выбранные файлы в среду разработки Visual LISP или Delphi для более детального знакомства.
Что не входит в установочный комплект Не входят в комплект установки исходные тексты сторонних библиотек функции и компонентов. Хотя мы и используем только бесплатные библиотеки и компоненты, поставляемые с исходными текстами, но распространять их не имеем права. Ссылки на сайты с компонентами мы приводили в книге, при затруднениях можно обратиться на сайт www.kurganobl.ru/cad, на котором мы отслеживаем "места прописки" используемых библиотек.
Инсталляция возможна только при наличии AutoCAD R I 5 и старше
Источники информации Список литературы !. David M. Stein, The Visual LISP Developers Bible — 2003 Edition. Электронное издание, 2003. www.dsxcad.com. — 183 с. 2. Архангельский А. Я. Программирование в Delphi 6. — М.: ЗАО "Издательство БИНОМ", 2001. - 1 1 2 0 с . 3. Байбара В. А,, Заболоцкий Д. В., (Спеллер М. И.. Усвятцев О. Б. AutoCAD. Полезные рецепты. — М.: Радио и связь, 1994. — 208 с. 4. Бугрименко Г. А., Лямке В. Н., Шейбоксне Э.-К. С. Автоматизация конструирования на ПЭВМ с использованием системы AutoCAD. — М.: Машиностроение, 1993. -336с. 5. ГинцбургЭ. Я. Расчет отопительно-вентиляционных ЭВМ. - М.: Стройиздат, 1979. - 183 с.
систем
с
помощью
6. Гладков С. А. Программирование на языке Автолисп в системе САПР Автокал. - М: ДИАЛОГ-МИФИ, 1991. - 96 с. 7. Горохов В. Ф., Мущанов В. Ф., Югов А. М. и др. Алгоритмы расчета стальных конструкций. — М.: Стройиздат, 1989. — 368 с. 8. Гофман В. Э., Хомоненко А. Д. Работа с базами данных в Delphi. — СПб.: ВХВПетербург, 2001. — 656 с. 9. Дейт К. Дж. Введение в системы баз данных, 7-е издание: Пер. с англ. — М.: Издательский дом "Вильяме", 2001. — 1072 с. 10. Джамп Д. AutoCAD. Программирование: Пер. с англ. — М.: Радио и связь, 1992. - 336 с. П. Жирков С. В. Shareware: профессиональная разработка и продвижение программ. - СПб.: БХВ-Петербург, 2003. - 320 с. 12. Зингер Н. М. Гидравлические и тепловые режимы теплофикационных систем. — 2-е изд., перераб. — М.: Энергоатомиздат, 1986. — 320 с. 13. Идельчик И. Е. Справочник по гидравлическим сопротивлениям. — М.: Госэнергоиздат, 1960. — 465 с. 14. Ильин Ю. А, Расчет надежности подачи воды. — М.: Стройиздат, 19S7. — 320 с.
1148
Источники информации
15. Ионин А. А. Надежность систем тепловых сетей. — М.: Стройюдат, 1989. — 268 с. 16. КовязинА., Востриков С. Мир Interbase. Архитектура, администрирование и разработка приложений баз данных в Interbase/Firebird/Yaffil. — М.: КУДИЦОБРАЗ, 2002- — 432 с. 17. Кречко Ю. A. AutoCAD: программирование и адаптация. МИФИ, 1995. - 240 с.
М.: ДИАЛОГ-
18. Круглински Д. Основы Visual С-^: Пер. с англ. — М.: Издательский отдел "Русская редакция", 1996. — 696 с. 19. Курганов А. М-, Федоров Н. Ф. Гидравлические расчеты систем водоснабжения и водоотведения. — Л.: Стройиздат, 1986. — 440 с. 20. Одельский Э. X., Каган Л. И., Кирзнер Л. X, Расчет систем центрального отопления и вентиляции на электронных вычислительных машинах. — Минск.: Вышэйшая школа, 1974. — 240 с. 21. Питц-Моултис Н., Кирк Ч. XML: Пер. с англ. - СПб.: БХВ-Петербург, 2000. — 736с.
22. Платт Д. С. Знакомство с Microsoft .NET: Пер. с а н г л . — М.: Издательскоторговый дом "Русская редакция", 2001. 23. Полещук Н. Н. AutoCAD 2002. - СПб.: БХВ-Петербург, 2003. - 1200 с. 24. Полещук Н. Н. AutoCAD 2004. - СПб.: БХВ-Петербург, 2004. — 976 с. 25. Полещук Н. Н. AutoCAD 2004: разработка приложений и адаптация. — СПб.: БХВ-Петербург, 2004. — 624 с. 26. Полещук Н. Н. Visual LISP и секреты адаптации AutoCAD. — СПб.: БХВПетербург, 2001. - 576 с. 27. Роджерсон Д. Основы СОМ: Пер. с англ. — М.: Из дате лье ко-торговый дом "Русская редакция", 2000. — 400 с. 28. Свет В. Л. AutoCAD: язык макрокоманд и создание кнопок. — СПб.: БХВПетербург, 2004. — 320 с. 29. Степанова Т. А. Автоматизированное проектирование систем отопления. — Л.: Стройиздат, 19S6. — 170 с. 30. Тейксейра С., Пачеко К. Delphi 5. Руководство разработчика, том 2. Разработка компонентов и программирование баз данных: Пер. с англ. — М.: Издательский дом "Вильяме", 2001. — 992 с. 31. Финкельштейн Э. AutoCAD 2000. Библия пользователя: Пер. с англ. — М.: Издательский дом "Вильяме", 2000. — 1040 с. 32. Фоменко В. Я,, Любимцев А. П., Любимцева С. Н. Русско-английский разговорник для строителей. — М.: Рус. яз , 1990. — 507 с. 33. Хармон Э. Разработка СОМ-приложений в среде Delphi: Пер. с англ. — М.: Издательский дом "Вильяме", 2000. — 464 с. 34. Хювёнен Э., Сеппянен И. Мир Лиспа. В 2-х т. Т. 1: Введение в язык Лисп и функциональное программирование. Пер. с фипск. — М.: Мир, 1990. — 447 с. 35. Хювёнен Э., Сеппянен И. Мир Лиспа. В 2-х т. Т. 2: Методы и системы программирования. Пер. с финск. — М.: Мир, 1990. — 319 с.
П49
Источника информации
36, Черносвитов A. Visual C++ И MFC. Курс MCSD для профессионалов. — СПб.: ПИТЕР, 2000. - 544 с. 37. Янг М- XML. Шаг за шагом: Пер. с англ. — М.: ЭКОМ, 2000. — 384 с.
Ресурсы в Интернете В сети Интернет можно найти тысячи сайтов, посвященных работе в системе AutoCAD. Мы приведем только краткий список наиболее интересных (на наш субъ ективный взгляд), на которых освещаются вопросы, близкие к теме книги. В список не включены корпоративные российские сайты (чтобы никому не было обидно).
Адрес
Комментарий Англоязычные сайты
www.afralisp.com
Лучший, на наш взгляд, англоязычный сайт со множеством материалов по программированию с использованием Visual LISP и VBA
members.bellatlantic.net/~vze2vjds
Delphi / AutoCAD Programming. Сайт из вестного специалиста по САПР Томи Тан зияло. Много интересных материалов, в том числе по программированию для AutoCAD с использованием Delphi
xarch.tu-graz.ac.at/autoead
Xarch AutoCAD info -t tools. Авторитетнейший сайт Рейни Урбана и его единомышленников. Огромное количество материалов, главным отличием которых является красота LISP-функций
www.mcneel.com
Сайт, главным сокровищем на котором является известнейшая библиотека DOS Lib
www.dsxcad.com
На этом сайте можно приобрести The Visual LISP Developers Bible 2003 Edition — очен» полезную электронную книгу
www.manusoft.com/Software/Freebies/Maln.stm
Множество полезных материалов, в TOW числе библиотека Аса tIStat Button, использованная нами
www .flemlng-group.com
Сайт Fleming Consulting Group с библиотекой для работы из LISP с базами данных
www .cadwerx.net
Сайг с хорошим набором бесплагны:< инструментов, например DwgPropsX.dll в виде ActiveX control
www.dotsoft.com
Сайт, на котором находится известный комплект ToolPack и. другие утилиты
www. j tbworld.com
Интересный сайт с хорошей подборке л материалов. Имеется перечень "багов" AutoCAD 2005
Источники информации
1150
/продолжение) Комментарий
Адрес
Русскоязычные сайты n.webring.com/hub?ring-rU5siancad
Russian CAD-users Web Ring (кольцо русскоязычных сайтов), поддерживаемое Виктором Ткаченко. На этом ресурсе можно найти ссылки на все русскоязычные САПРориентированные сайты, не упомянутые нами
www.cad.dp.ua
Сайт пользователей САПР из exUSSR Виктора Ткаченко. Один из самых насыщенных, полезных и популярных. На нем размещено много материалов как по системе AutoCAD, так и по другим системам. Интересен как пользователям, так и программистам
cadhlp.da.ru
САПР Навигатор— очень известный сайт Геннадия Поспелова. Множество материалов и бесплатных программ. Именно здесь развешивают известные многим российским пользователям "Довески"
www.autocad.ru/
Один из самых популярных форумов, на котором рассматриваются самые разнообразные темы, связанные с AutoCAD
с g i - b i п 'П b о a rd. с g i ? & а с t i о п=s h о w_t г е е
www.autokad.ru
AutoCAD для всех! Обширный сайт Александра Острийчука. Масса полезных материалов, очень активный форум
www.cad.dp.ua/conf.php
Web-конференция пользователей САПРсистем, также поддерживаемая Виктором Ткаченко. К большому сожалению, после ряда проблем с бывшим хостингом, потеряла былую популярность
geol-dh.narod.ru
Авторская страница Александра Косова. Прикладные программы для геологов и геофизикой, горняков и маркшейдеров, проектировщиков, технологов, строителей сантехников, гидротехников. Очень хороший сайт с хорошими программами
tyumsapr.narod.ru/cadsup
САПР и Графика в Тюмени. Имеется полезная документация по AutoCAD и программированию на русском языке
www.kulichki.com/libcad
Проект Библиотека конструктора Евгения Шувалова. Много полезных, но давно не обновлявшихся материалов
mirror01.iptelecom.net.ua/~olegkiev
Проверено собой. Ряд интересных статей по работе с AutoCAD. Поддерживает OLEg, Kiev
Источники информации
1151 (окончание)
Адрес
Комментарий
www.arxmaster.by.ru
Сайт, посвященный программированию под AutoCAD с использованием QbjeclARX. Поддерживает Иван Галака
www.alx.ncn.ru
Plugins from Alex. Сайт Щетинина с прекрасной АТаЫе и другими утилитами
aco.ifmo.ru/~nadinet
ТолстобаН. Д. Полезные материалы для изучения программирования a AutoCAD на начальном уровне. Предназначены для студентов, но могут оказаться полезным/ многим
engineer.rus.co.il
Израильский сайт "Русский" ИнженерЪ на котором имеются материалы по автоматизированному проектированию Интересен тем, что позволяет оценить "их" интересы
www.cadburg.by.ru
CADburg — оренбургский сайт с неплохими статьями
www.dpr.dp.ua/sortware/acesort.shtml
Страницы известного фаната LISP Сергея Попадьина. Интересные, хотя в чем-то и Спорные статьи
www.cad.dp.ua/poleschuk.html, www.private.peterlink.ru/poleshcriuk/cad
Сайты Николая Полещука
www.gis.kurgan.rLi
Геоинформационная система г. Кургана сайт Сергея Зуева, посвященный интеграции САПР и ГИС и предшественнице ruCAD — системе BestlA. Материалы сайта посте пенно переезжают на сайт нашей книги
Александра программой
И наконец, приведем адрес сайта, на котором можно найти все дополнительные материалы нашей книги — www.kurgaQobl.ru/cad. На этом ресурсе можно ознакомиться со множеством материалов, не вошедших и нашу книгу, высказать мнение о ней, задать вопросы авторам, получить установочный комплект системы ruCAD и обновлений к ней.
Предметный указатель
ACI 591 ActiveX 177, 178, 203 ADO 172, 622, 623 ADS 178 ADT 178 API 59, 183 ARX 178 АТС-файл 145 AutoCAD 2004 121 О новые команды 123 u новые системные переменные 123 AutoCAD 2005 862, 863, 1137 AutoCAD Land Development Desktop 45 Autodesk Architectural Desktop 45, 178 Autodesk Civil Design 45 Autodesk Survey 45 AutoLISP 175, 177
В BBNLisp 176 BDE535, 623 BestIA64, 490, 1062 BYBLOCK 133
СНМ-файл 1080 Clarion 621 Clipper 621 COM 183,445 Common LISP 176 СОМ-сервер 183 CSV-формат 1010
dBASE 621 DCL 177 Delphi 165 DesignXML 497 DLL 164, 178 DWF 1050 О использование 1052 О просмотр 1052 О создание 1051 DWF-формэт 1082
Е EleciriCS 45
FAS-файл 214 Firebird 1004 Flavors 176 FoxPro 620 Franz Lisp 176 FWS445
Garden Path 196 GEO + CAD 45 GcomatiCS 45 GLISP 176 GUID 133
1153
Предметный указатель
^ HLP-файл Ю80 HTML-файл 1080 HydrauliCS 45
IDE 165 Interlisp 176 ITS 176
LISP-машины 176 LISP-программы 216 LOOPS 176 LSP-файлы 214
м Mac Lisp 176 MDAC622 MDI 214 Mechanical Desktop 45 McchauiCS 45 McchSoft-PROFI Plus 45 Microsoft .NET 182 Microsoft Visual C++ 415 Migration Assistance 120 Mkltype.lsp 139 МКС-файл 147 MNL-файл "147 MNR-файл 147 MNS-файл 147 MNT-файл 147 MNU-файл 147
N NET Framework 1138 NIL 176
Paging 1091 Paradox 620 РАТ-файл 803 PDF 1053 PLANT-4D 45 PSL 176
Raster Arts 1074 RAW-формат 164 ruCAD 64
Scheme 176 SPlCE-Lisp 176 SQL 631 SQL-запрос 1008 Summary Info 328, 329, 341
Technologies 45 TODO-файл 191 Tool Palettes 144 Total Commander 107
и DDL-файл 625 Users Story 59
V VBA ISO, 181 Visual LISP 179 Vital Lisp 177 VLX-приложения 214 VL-программы 18(1
0 ObjectARX 178, 183, 414 OCX 181 OLE 446, 561 OLE DB 622 Oracle SpatialWarc 1073
XLiSP 177 XML 490 XML-меню 856, 861, 912 XML-формат 105 Х-запись 375
1154
Автоматизация. 446 5 СОМ 446 Актерское право 30 Адаптация AutoCAD 129 Аксонометрия 50, 919 Анализатор 498 Арматура 917 Атрибуты 134, 492
База данных (БД) 115,620,621 О структура 1005 О виртуальная таблица J просмотр 642 О реляционная 620, 621 Библиотека 773 5 ADOLISP 648 О DOSLib219, 320, 414, 433 а DwgPropsX.dll 339 О ЕШЬ 1010 О Express Tools 220, 228, 290 О FibPlus 1010 0> JCL445 5 JEDT 500, 773 О JVCL445 О RxLib445 о ShellShock 564 О STDLIB 220 О VCL445 О VirtualTi-ceVicw 1010 О блоков 130, 135 О типов 626 О LlSP-функций 216 Блок 62, 88, 129, 725, 809 О атрибуты 134 О библиотека 135, 725 О вставка 859 О единичный 130 О имя 132 <> классификация 129 О пользовательский 378 5 правила создания 132 О свойства элементов 133 О система размещения 134 О точка вставки 134 Блок-изделие 130 Блок-символ 131
Предметный указат&ль
Блок-таблица 131 Блок-чертеж 130 Бровка 906 Буфер результатов 428
В Ведомость: о координат 901 О отверстий S93 и ссылочных документов 852 Векторизация 1066 Вентиляционные системы 944 Вентиляция 917 Вес линий 756, 922 Видовой экран 919 Владелец 1086 Внедрение 67 Водопровод 917 Выбор рабочей версии AutoCAD 651 Выноска координат 899
Газопровод 861 Газоснабжение 917 Генератор отчетов 1015 О FaslRepoit 1015 Генплан 897 Генпроектирование 58S ГИС 1055, 1057 Горизонтали 918 Грунт 918 Группа 371 О пользователей 101
д Дерево меню 166 Диалоговое окно 255 О модальное 259 О немодальное 259 Диаметр: О трубопровода 928 О условного прохода 938 Дистрибутив 1089 Дневник проекта 191 Документ: О валидный 493 О корректно сформированный 493
Предметный указатель О обозначение 681 3 объявление 491 Документооборот 1023 Домашний каталог пользователя 102 Дороги 915 Доступ 1086 Драйвер Autodesk DWF Writer 1051
Единицы измерения 82 ЕНВиР 37 ЕСПД 29
Задачи: О общие 60 О специальные 61 Заработная плата 43 Знак диаметра 928 Значок 163
И Измерение расстояний 974 Изомстрия 50, 919 Имена файлов рисунков 89 ИнГЕО 1067 Инкапсуляция 323 Инсталлятор 1084 Инструментальные палитры 863 Инструменты разработчика 777 Интерфейс 445 5 lAcadApplication 445 Информационные ресурсы 36, 1024 Итерации 35
Калькулятор: О ведомости изоляции трубопроводов 978 О площадей 978 Канализация 917 Каноническое имя 948 Каталоги 324 о регистрация 109 Классификатор слоев 87 Классификация пользователей 55 Клиент 446
1155
Кнопка: О групповая 163 О в строке состояния 819 Колировка 116 Колонна 877 Команда: О ACAD1NFO242 С AI_MOLC 832 О AUDIT 793 О ВНАТСН 806, 808, 827 О- BLOCK 814 О BREAK 747, 927 О CHANGE 732 О DIST974 О DIVIDE 906, 908 u DONUT 729 С DTEXT846 О DWFOUT 1051 О DWGPROPS 224, 326, 561, 562 - замеишель 347 - переопределение 343 О EXPLODE 744
О HATCHEDIT829 О MEASURE 906, 907, 908 О OFFSET 873, 915 О OPEN 559 С PAGESETUP951 О PLINE 758, 762, 927 О RECTANG 839 О REFEDIT 814 S RENAME 78S О STYLE 800 О TABLE 862 a VBASTMT201 и переопределение 198 Командная строка 143 О параметры 74 Коммуникации 918 Компонент: О ClientDataSet 536 О DbGridEli 535 О janXMLDataSet2 536 О kbiuMcinTable 536 О niDwgPrcvicw 560, 689 Компоновки 818 Конкатенация 323 Координаты, прсобраювание 717 Корневой: Э каталог 106 О элемент 491 Котельные 917, 931
Предметный указатель
1156 Коэффициент: О гидравлического трения 986 О индустриальное™ 990 О унификации 990
Л Ластик 820 Линия: О все 95, 708 О создание 751 О ширина 79, 95, 130, 708 Листы 818 Литерал 492 Лицензионное соглашение 1134 Лицензирование 1133 Логотип 65 Локализованные версии AutoCAD 119 Лупа 822 ЛЭП 911
м Макрос 155 Малоформатные устройства 946 Мастер рисования формата 677 Масштаб 83, 94, 95 5 чертежа 224 5 штриховки 808 МАЭСТРО 45 Меню 115, 143 О графическое 150 О каскадное 149 О пункт 155 о редактирование 777 О специализированное 857 О управление пунктом 151 О фрагментнос 383 О экранное 153 Методика решения 62 Миграция 113 Мировая система координат (МСК) 84, 716 Многоугольник выпуклый 978 Модуль: о frmTest.pas 548 О frmXmlTableLite.dfm 540 О u XmlTable 546
н Набор 371 о примитивов 378 О свойств 327 Накладные расходы 43 Направление нуля градусов 85 Настройки 100 О хранение 101 Начисления на зарплату 43 Ниша 876 Нормализация 781 Нормирование работ 37 Нормоконтроль 77 Нормы времени 37
О Объект 446 О Double ListSrv.DoubleList Dig 464 О ш Check Lists iv. CheckLisc 469, 471 0 mCoordEditSvr.CoordEdit 472 0 niDualListSrv.mCadDualLst 466 0 nilniRegSrv.Reglni 479 О ш Single ListSrv.S ingle ListDIg 463 0 raSplasliSvr. Splash 462 0 ruSysInfoSvr. System Info 477 0 ruTipsSrv.i-uTipsOfDay475 0 ruTreeDirSrv. Select File 476 о именованный 89 Объектная модель 208 ОКГТ 997 Операции со множеством файлов 779 Опоры 911, 917 Определение диаметров трубопроводов 981 Оси координат 864, 898 Основная надпись 48, 77, 79, 680 Отверстия 880 Откос 905 Отопление 917 Отчет 1015 Оцифровка 1055 Ошибки: а вызова команд 247 О вычислений 245 О этапа ввода данных 222 и этапа обработки данных и рисования 232
Предметный указатель
Пакеты 1090 Панель инструментов 144 Парсер 498 О janXml Parser! 498 Перекодировка 114, 787 Переменная 233 О видимость 368 О глобальная 242, 368 О значение 233 О локальная 242, 368 Пересечение линий 927 Печать 946 Э по частям 947 О концов л и н и й 923 Пиктограмма 163, 165 Пилястра 876 План: О коммуникаций 53 О сводный 1067 О топографический 53, 897 План-графи к разработки 34 Планшет 1065 С топографи чес КУТИ 52, 1030 Подавление запросов 405 Подоснова 49, 1055 Подошва 906 Полилиния, создание 752 Пользовательская система координат (ПСК) 716 Право 1085 О авторское 1133 Привилегии 101, 1085 Приложение 304 О простое 306 Провайдер Jel 623 Программа: О ABVicwcr II28 О ACADVar 250, 488 О Approximate!' 988 О АТа№852, 1128 О Autodesk Express Viewer 1052 3 Code Insight 626 0 Ghost Installer 1093 5 Help& Manual 1081 0 IBExpert 1005 0 Icon Edit Pro 165 0 Inno Setup 1092, 1093 0 Install Shield Express 1093 0 InstallShield Professional 1093
1157
0 ISTool 1095 a Mapinfo 1062 0 Rest orator 166 О ш Lisp Explorer 190 0 niSO 1008 0 SetAel 1125 0 Total Commander 191 0 UltiaEdit 193 Э UPX 1091 0 Volo View 1052 О подготовки спецификаций 1008 Программа-стартер 76, ПО, 649, 1139 Проект 46 S монтажный 51 О рабоче-монтажный 51 О рабочий 66 О технический 66 О эскизный 66 Простановка размеров 85, 97 Пространство: О имен 214 3 в не документ! сое 215 О листа 96 Профиль 649, 917 О трассы 54 Процедура mGetACADExePaihNamcs 651 Прямоугольник 839
Работа с пользователями 862 Размер шрифта 79 Разрешение 1085 Расположение компонентов 323 Распределение изображений 89 Распространение 1127 Расчет 971 О площадей 977 О поверочный 982 О тешютютерь помещений 971 Реактор 216, 349 Регистрация 1133 Редактор: О XMLSpy495 О ресурсов 164 Реестр Windows 101 Режим: О доступа 1086 О многодокументный 214 О работы 778 О разработчика 190
Предметный указатель
1158 Рекурсия 273, 274 Рисование: О дорог 915 О откосов 905 О трасс 911
Сантехника 917 САПР 44 Свойства рисунка 326 Себестоимость 43 Сервер 446 Сертификация 1133 Сетка 679 Символ, тильда 151 Система координат объекта (СКО) 716 Системная переменная: !> INSUN1TS 82 О AUMTS 83 Э AUPREC 83 О CELWEIGHT 70S О DIMLFAC 97 О DIMSCALE 96, 97 О DWGCODEPAGE 116, 118, 790 О EXPLMODE 744 О LUNITS 83 О LUPREC 83 О MENUECHO 158 О NOMUTT404, 405 О SECRET 393 u USERS5 93 Системы координат 84, 898 Словарь 216, 370
Слои 85, 146 О включение всех 832 О включение указанных 832 С отключение 832 О просмотр 833 О удаление объектов 834 о установка 832 СПДС 47, 77 О GraphiCS 45 Специальные папки Windows 99 Спецификация 993 О оборудования 996 О рабочая 1010 Справочная система 1079 Справочник 1082 Стадии разработки 65 Стандарты 29 Стены 872
Стиль: С> "Инженерный" 197 О "Объектный" 203 О "Программистский" 202 О печати 949 Стирание 820 Стоимость работы 43 Столбы 911 Стояк системы отопления 990 Строка соединения 624 Структура resbuf 429 СУБД 621 О Intcrbasc 1004 О многопользовательские 621 и персональные 621 Схемы 50 О аксонометрические 50. 919 Сценарии 780
Таблица 860, 848 О кодовая 114 Тег 155,491 Текст: О врезка 838 С над линией 838 о подчеркнутый 846 О создание 754, 846 О типовой 846 Тепловые сети 917 Теплопотери 972 Техническое задание 30, 65 О составление 67 Тип линии 138 Типовое проектное решение (ТПР) 130, 1027
Тихий выход 721 Точка вставки 84 Трассы 860, 917 О профиль 649, 917 Требования к программному продукту 70 Трубопровод 49, 63, 917, 931, 934, 989 О элементы 941 Трудозатраты 43
Узлы: & радиаторные 926 О типовые 924
Предметный указатель Условные обозначения 53 Утилита ТурсЕхроп 339 Учетная запись 100 Ф
Файл: О acad.lin 120 5 acad.pat 803 О acad.pgp 115 О acaddoc.lsp 220, 649, 659, 660, 1 1 1 3 5 acadinfo.lsp 242 5 acadinfo.txt 242 О acadiso.lin 770 О aciidiso.pat 803, 805 5 acctutil.arx 220 0 acetutil.fas 220, 290 Э ar.xml 167, 491 0 ar_plan.xml 168 ? Autocad_TLB.pas 656 0 description 107 0 dia_lst.xml 938 0 diam_nominal.xml 939 0 diriiifo.ini 93, 316, 562, 810 J DwgProps.h 339 0 DwePiops.obj 339 0 DVVGPROPSXLib_TLB.pas 339 '! e_prov.vuxni 860 0 flange.xml У39 0 forinat.ini 682, 684 0 irmSelectAcad.pas 652 0 fmi Starter, pas 661 0 frmTestSrv.pas 525 0 frmTree Layer.pas 592 0 fnnXmlTree.pas 502 0 hatch.ini 138, 828 0 hatch_zd.nixm 828 Э MainLib.cpp 419 0 MainLib.def426 0 MainLibCommands.cpp 419 0 midas.dll 536 0 pipe_detail.xml 943 0 pscan.cpp 339 0 replace.log 194 0 replace.txt 194 0 ru_ar_colurmi_row.lsp 879 0 m_ar_laying_axis.dd 871 0 ru_ar_laying_axis.lsp 865 Q m_a r_ un io n _p I laster_ in-line. Isp 875 0 iii_bloek_insert_all.lsp 810 5 m_block_ui5CLt_lib.lsp 855
1159 0 m_block_inseit_table.lsp 861 0 ru block names file.Isp 812 0 ru_block_redeTine.Isp SB 0 ru block rename from_filc.Isp 813 0 ru_block_save_file.!sp 809 0 iu_calc_snm dist.lsp 976 0 iu_cTOSS_liiies.lsp 927 О ш doc href delete.Isp 1043 о m_doc_href_msert.lsp 1042 0 m_doc_hrcf_laycr_insert.lsp 1035 0 m_doc_href_layer_save.lsp 1030 О ш doc href laycr_sct_edlt.Isp 1040 0 ru_doc href_tayer_set restore.Isp 1039 0 ru_doc_href_layer_set_save.lsp 1037 0 iTi_doc_project_ insert. Isp 1048 0 ru_d(ic_prqiect_save.lsp 1044 0 iTi_draw_by_objecl.ls>p 823 0 ru_draw_dia_along_line.lsp 929 0 rii_draw_dot_closcd_pline.lsp 838 о ru_draw_format,lsp 698 0 ru_draw_hatcli-block.Isp 830 0 [ii_draw_lcadcr_dia_with_text.lsp 930 0 ru_draw_orient_block.lsp 859 0 m_draw_table.Isp 861 0 m_draw_tabte_ docs. Isp 853 0 ru_draw_iable_user.lsp 849 Э tii_draw_tcxt_underljned.lsp 846 !) ru_draw_trass_line.lsp 860 0 111 _dra\v_trass_ltype.Isp 836 0 n.i_draw_trass_text_ltype.lsp 837 О ш draw_trass_tNt_line.isp 838 0 m_draw_txt_horisontal 846 О га ed hatch scale.Isp 829 0 ni_gel_lw.dcl 715 0 m_get_ string.del 262 ;• ru_GetStrFrm.pas 484 Э ш gp houscjiatch.lsp 828 0 111 hatch draw.Isp 828 0 ru_]ayer_class_select.lsp 615 0 m_layer_comment.lsp 619 и in layer_crasc.lsp 834 5 ui_layer_off by_object.lsp 832 0 iu_layei_purge.lsp 835 5 ru_laycr_set_ by_objcct.lsp 832 0 ai_layei_show_all.lsp 832 Q iii_layer_show_by_one.lsp 833 0 nijayer_stay_sclected.lsp 833 f> m_pipe_detail.ruxm 935 0 ru_pro_arrange_bloeks.lsp 811 0 m_pro_batch_ normal .Isp 781 Продолжение рубрики см. ни с. 1160
Предметный указатель
1160 Файл (npofl.): О ru_projist all_block_entity_data.lsp S15 О ru_pro_list_entity_data.lsp 814 О ru_pro_list_ nest ed_entity_data. Isp 815 О m_pro_table_gen.lsp 850 0 ni_sei_hatch_besl__scalc.lsp 809 0 ru_so_edit_ll.lsp 1016 0 ru_so_select_and_draw.lsp 1017 0 ru_iopo_coord_leader.lsp 900 0 ra_topo_slope.lsp 910 0 ra_txt_along_linc.lsp 838 0 ru_txt_injme.lsp 83S 0 n.i_users.udl 625 0 ni_vicw_tcxt_magnitify.lsp 823 0 niAxSvr_TLB.pas 453 0 ru-block-insert-project.Isp 1048 0 mCAD.dpi-165 0 i-uCAD.lin 770 0 mCAD.miru 149 0 ruCAD.re 165 0 mCAD.reg 109, 318 0 mCADBookLT.iss: °
секция Code 1105. 1120
°
секция Components 1102
°
секция Dirs 1 1 0 1
° секция Files 1098, 1105, 1123 о секция Icons 1100 = секция ISTools 1102
° секция Languages 1103 J секция Registry 1101, 1124 ° ° 0
секция Run 1 1 0 1 секция Setup 1096
секция Tasks 1098, 1123 0 ruCADRegSvr.bat 321 0 ш-dwgprops-file-sliow.lsp Ю49 0 ru Format Wizards rv_TLB.pas 695 0 ruIiiiRegSrv_TLB.pas 479 & ru-obj-gci-acad-object.Isp 362 0 ru-rubber.isp 821 0 ruSelAcad.dpr 1104 0 niShel!FileD!gSvr_TLB.pas 575 5 ru-table-xml-edit-and-draw-txt. Isp 551 5 raTrecDirUtils.pas 611 0 m-tNt_styie_redraw.lsp 800 6 ruUiils.pas 573 & ru-vlr.lsp 349 5 mXmlMcnuSiv_TLB.pas 521 0 StdArx.h419 0 tabl_gs.mxm 861 0 Tables.ruxm 707 0 u_FomatWizaiiJ.pas 696
0 u_IniFile.pas 457 0 u __ Run A pp. pas 456 0 u_mSnellFileD1gSvr.pas 577 0 u_WinMsg.pas 456 0 u_Xm!TreeSrv.pas 523 О имя_рисуHKa.ini 682 О имя_таблицьыш 848 & стандартов 81 О Формат.хт! 678 Файловая система 135 Форма 139 Формат 78, 676
О DXF 175 5 X M L 145, 170 а бумаги 948 Фронтальная изометрия 919 Функция: О 'error' 287 Э 'PRINT' 302 О _evaljiw 983 О _ru-app-run-srv 459 О _ru-block-multi-inserl-scaled-angleask 733 О _iii-dictvar-list-to-picksci 378 О m-dirs-hkcu-reg-key 323 О _ш-dig-coord-edit-2d 472 О _m-dlg-coord-edit-srv 472 О _ru-dlg-file 579 О _m-dlg-folder 582 о _ni-dlg-splash-srv 462 О _m-dwgprops-read-dwg-file-info 583 О _rn-get-em-defaull 405 Э _m-gct-e]itsc]-no-error 405 a _ru-get-nentsel -no-error 406 0 _nj-gct-with-default 397 0 _ru-ini-srv 459 0 _ru-menu-gct-max- pulldown- number 384 О _ш- me mi-get- menugroup 392 о _ru-menu-get-meni^roups-collection 391 0 _ru-menu-gel-popup-menu-by-iianie 390 0 _ru-menu-get-pop up-menus 392 0 _ru-memi-meiiugroups-list 389 0 _m-meiiu-pop-meiru-action 390 0 _m-mcnu-pop-mciiu-item-action 390 о _ru-menu-popupmenuitem-check 389 0 _m - m e n u-popup me nui tern -disable 389 0 _ru-menu-popupmenuilem-enable 389 0 _ni-menu-popupmeniiitem-uncheck 389 о _ru-menu-popup-menus-list 390 6 _ru-msg-srv 459 0 _m-rcg-get-registered 480 0 _n.i-trass-draw-lw 760, 762
Предметный указатель О О 0 0 0 0 0 0 0 0 0 0 0 0 5 6 s Э 0 0 0 о 0 0 0 0 0 0 0 0 0 0 0 S 0 5 0 0 5 0
_га-unit-is-millimeter 355 _ш-хгп I -tree-select 527 acedDefun 427 acet-error-init 290 acel-error-restorc 290 acrxEntryPoint 426 alen 440 CDWGPROPS 347 C:RU_ENT_DUMP209 C:RU_ENTLST210 C:RU-EXPLODE 744, 745 command 143, 175, 197, 198 cond 230, 269 deftin 242 defun-q 180 dofun 428 emgec 202, 209 eutlast 238 entmake 198, 202, 753, 766 entmakex 332 entmod 198, 202, 829 entsel 228, 230 entupd 829 eq 246 equal 246 eval 235, 980 exit 252 foreach 271 funcload 427 gc 244 gctfiled 559 getstring 26] grreari 820, 821 if 269 initget 154, 223, 232 logand 231 mapcar 272, 275 menucmd 152, 385 MyGetDist 396 progn 270
0 quote 237
0 0 5 0 0 0 0 0 0
read 235, 980 ru - ac ad-sbb-make-button 215 ru-acad- sbb- make- layouts -button 819 ru-acad-sbb-make-layouts-button-on-click 820 ru-ado-build-connection-string 641 ru-ado-connect-to-db 628 ru-a do -error- messages 631 ru-ado-exec-sq! 632 ru - ado - схе с -sq I -to -connection 635
1161 5 0 0 C> 0 5 0 о 0 0 о 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 о 5
ш-ado-get-tdbles-and-views 642 ni-ado-import-tlb 627 ru-app-begin 291 ru-app-cnd 291 m-app-exit 292 ш-app-load 771, 856 ru-app-nin 435, 459 ru-batch-file-operations 780 ru-batch-normal-block-lib 782 ni-block-cliange-attributes 704 ru-block-insert-align 749 ru-block-insert-attedit 727 ru-block-1nsert-dist-count 878 ru-block-insert-from-lib 735 ru-block-inseit-from-lib-niousescaleask 736 iii-block-insert-from-lib-sculcl 736 m-block-inscrt-moLisescaleask-angleask 734 ru-block-insert-noscale-ptask-angleask 736 ru-block-insert-obj 727 m-block-inseit-scaled-ptask 734 ru-blocR-in sen-table 735 ru-block-insert-xref-from-archive 1036 ш-block-lib-insert 726 ш-block-Iw-change 738, 739 m-block-lw-edit 745 ru-block-lw-inscrt-ptask-anglcask 738 ni-block-!w-lib-insert-ptask 925 ni-block-lw-lib-inscrt-ptask-angleask 745, 925 5 ru-block-make-for-measure 767 о ru-block-make-unit-unnamed 963 0 m-block-minsert-to-array 966 0 ru-block-minsert-unit-unnamed 962 У ni-block-multi-insert-scaled-anyleO 733, 734 О ш - Ы oc k - m ult i - inse it- sc a led - rotated or-a tig 1 cask 729 0 ru-block-obj-make-def-from-insert 740 0 ru-block-obj-make-from-vla-array 740 0 ru-block-rewrite-wilh-comment 1046 0 ra-block-wriie-block 1045 0 111-bloc k-write-with-comment 1045 0 ru-circle-add 756 0 ru-conv-3dPoint-to-2dPoint 241 6 ru-conv-bool-to-int 352 0 ru-conv-bool-to-str 241, 353 0 ru-conv-deg-to-rad 240, 354 & ru-conv-file 793 0 ru-conv-meter-to-unit 355 5 ni-conv-millimeter-in-paper-to-unit 35(: S ra-conv-millimeter-to-acadlw 709 Продолжение рубрики см. на с. 1162
Предметный указатель
П62 Функция (пред.): "j ru-conv-milli meter-to-unit 356 j ru-conv-oem-char 787 0 ru-conv-oem-to-ansi 787 С iii-conv-rad-io-deg 240, 354 5 ru-conv-str-to-bool 241, 353 'i ш-conv-unit-to-meter 355 о ru-conv-unit-to-millimeter 356 0 ru-conv-unit-to-millimeter-in-paper 357 0 ru-conv-value-to-bool 241, 353 j ru-conv-value-to-wordbool 241, 242, 353 0 ra-dbx-props-find-all-in-file 338 0 iii-dcl-chcck-tile-entry 892 ;• rii-dd-check-tilc-puram 892 0 ni-dictvar-set-data 374, 375 0 m-dirs-get-root 323, 481 0 ru-dirs-get-sys-program-files-folder 478 0 ni-dirs-menu-xm] 324 6 ru-dirs-path-and-slash 324 о ru-dig-coord-edit 473 0 ni-dlg-dcl-gct-arca 978 0 nt-dlg-dcl-get-string 261, 263 0 m-dlg-dcl-select-lw 712 \i m-dlg-double-list 465 0 m-dlg-dual-list 467 0 ra-dlg-file-search 581 J ru-dlg-file-select-dwg 580 0 ni-dig-file-select-in-tree 476 0 iii-dlg-file-selcct-or-ncw-dwg 5B1 0 ru-dlg-get-string 487 С ш-dlg-get-two-number 874 0 ru-dlg-get-two-string 873 0 ru-dlg-select-layout 819 0 m-dlg-select-papers-cfg 960 0 ni-dig-select-plot-device 957 1 ru-dlg-se!ecf-style 960 Э ra-dlg-set-layout 818 J ru-dlg-show-c heck-list 469 0 ru-dlg-single-list 464 0 ru-dlg-tips 475 (i m-dlg-view-m-file 471 0 m-dlg-ycs-cml 297 0 ni-dlg-yes-no-cancel 44! S in-draw-block-diameter 929 0 m-draw-block-hatch 830 0 m-draw-diameler-texi 929 0 ru-draw-electro-polc 912 О ш-draw-electro-pole-segm 913 0 ru-draw-leader-and-two-string 900 0 111-draw-no-osnap 249 0 ra-draw-old-osnap 249
С
0 0
0 0
ru-draw-rectangle 218, 840, 841 ш - draw- ret tangle -block-lib- box 845 iii-draw-road-topo-dline 915 m -draw-txt- in-line 750 ru-draw-txt-up-line 750 m-draw-txt-up-or-in-line 749 ru-dwf-plot 1053 ai-dwy-modify 786 ni-dwg-open-flle 1047 in-dwg-open-other 785 ai-dwgprops-check-property 335 ru-dwgprops-clear-nonstd 335 ru-dwgprops-dlc-makc-or-add 334 m-dwgprops-edit 345 ru-dwgprops-edit-and-sct 346 ш-dwgprops-get 344 ru-dwgpraps-get-by-summary-info 341 ru-dwgprops-gct-std 352 щ-dwgprops-name-by-code 332 ru-dwgprops-names-by-с odes-map 331 iii-dwgprops-obj-gct-dxvgprops336 ru-dwgprops-obj-get-from-file 340 iii-dwgprops-rus-name 331 ru-dwgprops-rus-names-map 331 ni-dwgprops-set 344 riL-dwgprops-set-std 35! ni-dwgprops-set-sum тагу-info 342 ш-dwgprops-test-list 335 ru-dwgprops-test-sum тагу 346 ill-dwg-save-other 785 ru-ent-dxf-code-clear 409 iii-ent-dxf-code-clear-lisi 409 ru-ent-dxf-code-data 408 ru-ent-locked 409 ni-cnt-inod412, 784 ru-ent-multi-dxf-code-data 408 tn-crror 292 ru-error-catch 337, 980 ru-error-in it 292 т-error-restore 293 ru - e ITO r- resto re - sy s va rs 2 94 ru-enor-save-sysvars 293 m-eval-diam-hw-mag-lOO 991 iu-eval-diam-hw-mag-33 991 ru-evaf-diam-hw-mag-common 991 m-cval-diam-hw-st 991 ru-eval-hot-water-density 987 ru-eval-water-cinem-viscous 989 m-file-acad 325 ru-file-block-lib 726 ru-file-dwgname 325
Предметный указатель ru-file-dwgriame-type 325 ni-filc-dwg-not 325 ru-file-layer-ini 617 га-file-rcad-didnfo-file-comment 583 ru-file-set-ext 326 ш -file- unique- name 1036 n-L-file-write-dirinfo-file-commenc 583 ruFindAcadAppString 658 ш-gcom-Eirca-cnt 977, 978 ra-yeom-area-poiiits977, 985 ni-geom-go-back 716 ru-geora-go-left 716 in-gc om-go-rig I it 716 rii-eeoni-is-point-riglil-by-axis 916 ni-geom-list-ent-point 747 га-gcom-segm-Iiue-by-point 747 ra-get-angle 402 ru-get-corner-required 402 ra-gct-diani-icxi 930 m-get-dist 399 ru-get-dist-or-exit 399 ш-get-entsel 406 ra-get-entsel-by-iype 407 ru-yet-int 400 iii-gct-kword 402 ru-get-layer-from-dwg 618 га-get-layer-name 619 ш-yet-nentsel 407 ш-gct-poiiit-on-ent 746 ru-gei-pomt-or-exit 401 m-get-point-or-lw-or-continue-or-exit 401 ш-yel-point-required 400 m-get-pomt-with-defaiilt 401 ш-get-real-positive 400 nt-get-slring 846, 978 ш-get-sys-folder 478 m-get-vla-enisel 412 m-hatch-add-obj 807 iii-hatch-chaiige-scale 803 ru-hatch-draw-samples 805, 807 ru-haich-lisi-pat-in-file 807 in-hateh-merge-pat-files 805 ru-hatcli-split-pat-file S03 m-holes-Iist-wall-holes 891 ra-holes-wall 881 ru-holes-wall-find-hole-number 891 ш-liolcs-wall-hole-dic-dot-pair 890 Lч i-holes-wall-read-die 890 ru-holes-wall-repon 894 ш-holes-wall-string 890 ni-hoks-wall-writc-dic 890
1163
0 ш-mi-read 434, 461 0 m-ini-rcad-dcfatilt 359 0 ш-init-setup-dwg-by-scale 357 u ru-init-start-mead 347 S ru-ini-write 434, 461 0 ra-is-int 240, 354 0 ai-is-paper-space 354 0 ru-ii-real 240, 354 0 ra-is-string 240, 354 0 ru-layer-create-trnp 964 0 ru-layer-delete 834 0 m-layer-gct-ent-data 231 u ru-layer-is-iocked 230, 231 0 ra-laycr-obj-rename 789 0 ru-layer-purge 835 S ru-laycr-rcad-all-comments 618 5 ru-layer-read-var 618 0 ru - la ye r-show-i is! -names -comments 61S 0 ru-line-add 752 S ni-line-add-multi 752 S ra-list-block-names 211 0 ru-list-is-dotted-paii 334 О ш-list-make-two-lists-from-assoc 332 5 ru-list-massoc 272 0 ru-list-remove-dublicates 891 0 ru-list-revetse-assoc 332 0 ru-list-iiiiion-two-assoc 333 О ru-list-write-to-file 271 С ru-ltypc-fincl-in-lin 770 f> ru-1 type-load 770 0 ru-Itypc-make-txt 767 0 ru-ltype-set-eurrent 770 0 ru-lw-calc-for-text 755 0 ru-iw-calc-for-tcxt height 755 C> rii-lw-conv-celweight-to-mm 710 0 ni-lw-conv-cclwcight-to-string 711 •> ru-lw-cuiTent 709 0 ra-lw-makc-double-lst 711 0 ru-lw-replace-pline-width 756 5 m-lw-sct-for-eirt 712 S m-lw-sct-for-ss 712 u ш-lw-std-lst 710 Э ni-match-is-bit-in-fiag 231, 232 0 ru -mcnu-acud -load 382 0 ru-menu-all-items-action 388 0 ru-menu-tliesel 393 0 ru-mcnu-edit 777 0 ru-menu-load-partial 383 0 m-menu-reload 381 0 ru-meiiu-ru-load 382 Продолжение рубрики см. на с. J164
1164 Функция (прод.): О га-menu-set-enabled 386 О ru-menu-special-cornmon-ahow 383 О га-me n u-special-show 383, 857 0 I'u-menu-tag-check 385 5 ru-menu -tag-check-гас ad-workgroup 385 О га-menu-tag-disable 385 0 ru-menu-tag-enable 385 6 ru-menu-tag-uncheck-rucad-workgroup 385 0 га-menu-unload-partial 384 0 ra-msg-alert 440 u ru-msg-box-ex 435, 460 S ru-msg-debug 301 0 ш-msg-dos-msgboxex 438 0 m-msg-info 441 0 m-msg-messagebo)! 438. 461 0 ru-msg-srv-show 459 0 ru-msg-vla-box 443 0 ru-no 443 0 ra-normal-all 783 0 ru-normal- block -props 784 О га-normal-cut-praps 783 0 ra-obj-acad-collection 364 0 ш-obj-active-space 363 0 ш-obj-collection -count 364 0 ru-obj-collection-list 364 0 ru-obj-conv-cname-to-obj 366 0 ru-obj-delele-object 366 5 ru-obj -doc-collection 365 Cru-obj -docs-count 365 о ra-obj-docs-Iist 365 0 ru-obj -cut -offset 916 u ru-obj-ent-ss-erase 743 0 iTi-obj-cnt-ss-explode 744 u lu-obj-ent-ss-move 743 0 ru-obj-ent-ss- rotate 742 0 ru-obj-en t-ss-scale 742 о ru-obj-error-apply 967 0 ra-obj-get-active-document 363 5 m-obj-gct-current-space 364 0 ш-obj-get-docs-collection 365 6 ru-obj-get-layers 365 0 ni-obj-gct-model-space 363 0 m - о bj-get-pa per-space 363 0 ш-obj-get-styles-names-fonts 271 0 ru-obj-layer-by-name 367 0 ш-obj-list 806 0 ru-obj-list-hatch-pattems 806 5 ru-obj-modify-prop 741 5 ru-obj-point-3d-to-2d 967
Предметный указатель О ru-obj-put-name 789 m-obj-vla-array-erase 741 ш-obj -via -array- mod 742 m-obj-vla-array-move 741 ш -obj - via- a rray- rotate 741 ru-obj-vla-array-scale 741 ш-pipc-d raw-any 941 ru-pipe-line 941 iii-pipc-liiie-bcnd 942 0 m-pipe-reducer-concenir 942 m-pipc-siniplc 942 ai-pipe-valve-details 943 0 iii-plinc-add 752 0 m-pline-break-length 747 ni-phne-draw-closed-lw-msg 763 <j ni-plinc-draw-closed-lw-msg-frani-ptl 762 m-pi ine-draw-with-width 927 m-pline-entmake 753 С ru-pline-list-vertex 725 0 ru-pline-make-trace-draw-closed-by-axis 766 vu-pline-make-traee-list-vert-closedby-axis-draw 763 ru-pline-measure-block 765, 766 ru-plot-array 952 ru-plot-ask-a nd-pre view 966 ru - pi о t-get-lay out-pa pel's-с fg 958 iii-plot-get-layout-papeis-name 960 ru-plot-get-pa per-с fg 959 ru - plot-get-pi ota rca 961 0 rn-plot-get-plotter-papei's 958 ru-plot-get-plotters-name-for-layout 957 0 ш-plot-get-plotters-papers 967 ш- plot-get-styles-for-layout 960 in- plot- layout-cfg 965 ru-plot-unit-iiow 966 ru-reg-get- root-dir 481 0 ru-reg-set-root-dir 481 ru-scale-current-space 357 ш-scalc-model 357 nt-so-d raw -forms 1021 ru-so-diaw-in-dwg 1018 ru-so-d raw-records 1021 iii-so-nm-app 1017 ru-splash-hide 463 ru-splash-sct-tcxt 463 С ru-splash-show 463 0 ru-ss-current-space-filter 227 m-ss-cntscl 230 ru-ss-entsel -by-type 229, 230, 231 ru-ss-yet 409
Предметный указатель О ru-ss-gct-first-select ion 410 О ru-ss-get-or-ssfirst 410 О m-ss-join 410 О ш-ss- make -filter- locked 411 С ni-ss-make-filter-space 411 5 m-ss-mod 4 И 0 ш-ss-ones-alt 403 0 m-ss-re move-locked 412 0 ru-ss-select-after-em 228 0 ru-ss-to-ent-list 892 0 ru - tab! e - со nv-csv-to- string- list 1020 5 m-table-coords 901 0 ni-iable-draw-wiih-ask 555, 848 S ru-table-grid 556 0 ru-text-add 754 0 ru- text -draw -file 848 0 ru-texl-eval 980 0 111-text-file- import 847 0 ru - text-se I-style 360 0 ru-trass-draw-block-count 878 0 ru -1 rass - d raw-first-p rev-sample 757, 911 0 ni-trass-draw-lw 758 0 ru-trass-draw-lw-from-ptl-arc 763 0 ru-trass-draw-lw-from-pt2 764 3 ru-trass-draw-lw-from-pt3-min-segm 764 0 ru-trass-draw-lw-txt 764. 767 0 iii-trass-summ-length 974 и ш-ucs-is-ucs 723 0 m-ucs-trans-list-points-tics-wcs 723 0 ni-ucs-trans-list-points-wcs-ucs 723 0 ni-ucs-trans-vertex-ucs-wcs 723 0 ru- uc s- trans -vertex- we s-ucs 723 Э ru-iics-z-is-parallcl-wcs 724 Э ru-imit-name 355 0 ш-uscr-action-enabled 1119 u ш- user-get-current -use r- info 1116 0 m-user-get-permissions-flags 1116 О ш-user-get-permissions-flags-list 1117 0 m-user-get-permissions-info 1116 О ш-user-get-permissions- names-list 1117 0 ru-user-get-permissions-notes 1117 0 ru-uscr-get-permissions- notes- list 1117 0 ru-user-long-n a me 1117 0 ru-user-may-xml-edit 1118 0 m-user-perm-bit-by-name 1118 0 ra-user-rig hi-flag 1118 0 ru-user-show-rights 1119 5 ru-user-test-permission 1118 0 ru-user-title 1117 5 ru-var-chcek-dlg 77S 0 iii-var-set-var 779
1165 0 ru-var-toggle-var 235 0 ru-vlr-end-commaiid 350, 351 0 ru-vlr-start-command 350 о ru-xdata-get-ruclass-by-layer-name 617 О ш-xd at a-get-га с lass-for-active-layer 617 0 ra-xdata-get-mclass-for-all-layers 616 0 ru-xdata-get-mclass-for-layer-obj 616 0 ru-xml-eval 532 0 ru-xml-gct-att-list 533 0 ru-xml-get-sdata 533 0 ru-xml-pop-mnu 532 0 ru-xml-select-macro 531 0 ru-xref- attach 1037 0 ru-xref-detacli 1037 0 ni-yes 442 0 set 233 0 setq 233 0 snvalid 789 0 ssget 225, 403, 404, 405 0 start 160 0 test-toggle-var 236 0 trans 717 0 true_text 248, 250 0 type 238 0 vla-add 740 5 vlax-for271 0 vlax-get-acad-object 445 0 vl-catch-all-apply 238, 298 5 vl-cmdf 143, 201 Э vl-doc-expoit 215 0 vl-doc-import 215 0 vl-doc-ref 215 0 vl-doc-sct 215 0 vl-princ-to-string 981 0 vl-propagate 215 О печати 952 О предикатная 239 Футляры 917
Хранение временных файлов 104
Цвет 85 Цена 1131 О отпускная 43 О реализации 43 Центр управления 144
1166
Чертеж: О деталироночный 51, 934 О рабочий 51, 934
ш Шаблон 76 Шрифт 116 Штриховка 137, 803, 827 О образцы 137 О с помощью блока 829
Предметный указатель
Экс пресс-проверка диаметров 982 Электрика 857 Электронная калька 1026 Электронный архив 1030
Я 0 DCL255, 261 5 DIESEL 151 О LISP 176 О VBA 178 Э XML 490 Ярлык 74
зачем каждый в т о р н и к более 130 с п е ц и а л и с т о в с о б и р а ю т с я в sofUine'? т о л ь к о но с е м и н а р а х s o f f l i n e * вы можеже получить информацию «из п ер в ы х р у к » Более 5400 специалистов посетили семинары SoflLine* в 2002 году. Почему? В процессе информатизации любого предприятия есть определенный критический момент, «точка перегиба», С одной стороны, руководство решило воспользоваться преимуществами П и внедрять и* у себя в организации, с другой стороны — чет четкого понимания того, кап это Делается. На этом этапе очень важно получить квалифицированную консультацию специалиста, а татке пообщаться с коллегами нэ других организаций, которые сталкивались г. подобными проблемами в прошлом и у/спешно их решили. Soft Line' продолжает ^11-. i BECrL4ATHTJX(t4MMapOBnonpDip3H4MO«yo6ixntNcHMiQHC^]]Hxnpn[t№iЛитслей, интересы ьотприя. компания представляет Б ЗЪсспн- £то лидеры ннровогй ршгы: Microsoft, Ь\тшпгсс.\"ЕНПЛ5чС|Чт1, QicckPoint, WljQ, ABBYY, Яабордтирм Каспсрского н многие другие. Квалифицированные докладчики. Нэсгмкн1риЗа^пс"1ц^ст^а>этрст\1П^Т*^ин<^гсч западные спеUuimiciin хомпэннй-рхчгабсгч^иклнлр^раммнотобаэЕечсмин, j-гзкжг прежгглшле.'Л! копия пин. KQIQ1>ъш ifЫСЮТ прякГичц.ю'Ч огтчт рчочрсНИЯ ч нспипьэоиаН ИД протрэх«ны< ПрнЛТучщя. Ня ьтминарл ныпуплотприэтыннысэиспсртм н предметной области, определенной TCMQR ссхипцра. Машн теиьи сетевые операционные системы, >^лз^юнкav вдиншкгрНрСЧЕШненцдойс Летопдснить tcтсй. обеспсчсяне сохранности данных, реэср&ное копнроынис, антавирусняя защиту подключение к Hifif рнспу н лру!ие решечиа, ^рьчспы иисгсчнцго лдмимигтриршамуш • улалсино? ^мииистрнровлчие, ^•озиовга профамя ц дрн срслотэ разрзбогнл ибаор Бшувдыгмхфед рлэработуи ПО, срелсгва с-гтсшкн iipdJHcprbJuaiuiH поч jnjMiiuiicinu р^рабитчнка; ющслг^чрс^ваинсПО. Если Вы определились с удобной датой семинаров, 1ы мотете сообщить об этом нам в гвойодной форме на здр« игл т naii fSscflli п р.ги. зарегисгрировятъсв на айте iyww, s&ftUng. RJ Istmlnan или поиончть по телефону * 7 (095) ?Э 1 -3 9-3 9.
sdftiine
рограммное обеспечение — лицензирование, обучение,консалтинг
издательство компьютерной литературы "БХВ-петербург" bhv
ЗНАКОМЬТЕСЬ, НОВАЯ ИСТЕМНЫЙ СЕРИЯ САДМИНИСТРАТОР БХВ-Латербура
ЗНАКОМЬТЕСЬ,
системных администраторов, ГГ-менеджеров, инженеров.
Книги этой серии помогут а совершенстве овладеть современными компьютерными технологиями, выбрать оптимальные и эффективные решения при проектировании и внедрении сетей, обеспечить их информационную безопасность и квалифицированное администрирование.
Санкт-Петербург, 190005, Измайловский пр., 29 теп.: +7(812) 251-4244; 251-6501 e-mail: [email protected] www.bhv.ru
Опыт и знания специалистов высшей квалификации
БАЗЕ
AutoCAD -
КАК ЭТО ДЕЛАЕТСЯ Книга-проводник на пути создания САПР
ЗУЕВ СЕРГЕИ АЛЕКСАНДРОВИЧ. инженер-строитель, проектировщик с 30-летним стажем. Много лет занимается разработкой систем автоматизации проектирования и геоинформационных систем.
кандидат физико-математических наук, автор восьми книг по системе AutoCAD и программированию. Много лет занимается разработкой систем автоматизации проектирования и подготовки производства. Основываясь на собственном многолетнем опыте и интересных находках, авторы раскрывают секреты создания САПР на базе AutoCAD. Подробно рассматриваются вопросы технологии создания САПР - от выработки концепции до реализации конечного программного продукта. На множестве примеров разбираются библиотечные функции, облегчающие разработку прикладных программ. Особое внимание уделено нетрадиционным для AutoCAD технологиям, таким как использование среды Delphi, создание СОМсерверов, разработка интерфейса пользователя на основе иллюстрированных XMLменю. Представлено множество примеров прикладных программ различного назначения для разработчиков САПР и конечных пользователей. Многие из этих программ могут использоваться в машиностроении. Книга содержит столько практической информации, что с ее помощью можно без труда создать свою уникальную систему автоматизированного проектирования. CD-ROM содержит исходные тексты и дистрибутив системы, рассмотренной в книге.
ISBN 5-94157-344-8
УРОВЕНЬ ПОЛЬЗОВАТЕЛЯ _СРЕДНИ И/ВЫСОКИЙ, КАТЕГОРИЯ САПР
9»785941"5734481
БХ В-П ЕТ Е Р Б f РГ 190005. Измайловский пр . 29 E-mail- [email protected] Internal WWW 3hv.rU Tefl.:(812) 251-4244 Факс:(812) 251-1295