Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
(defun MODER ()
(repeat (length MLST)
(setvar (caar MLST) (cadar MLST))
(setq MLST (cdr MLST))
)
)
(defun C:PLW (/ sset pl_w n type_e)
(modes ‘(“BLIPMODE” “CMDECHO” ))
(setvar “CMDECHO” 0)
(setvar “BLIPMODE” 1)
(setq sset (ssget) n 0 )
(setq pl_w (getdist “\nВведите ширину линии:_ “))
(while (< n (sslength sset))
(setq name (ssname sset n))
(setq type_e (cdr (assoc 0 (cdr (entget name)))))
(cond
((= type_e “LWPOLYLINE”)
(command “pedit” name “” “W” pl_w “”))
((= type_e “LINE”)
(command “pedit” name “” “W” pl_w “”))
((= type_e “ARC”)
(command “pedit” name “” “W” pl_w “”))
((= type_e “CIRCLE”)
(setq circ (entget name))
(setq rad (cdr (assoc 40 circ)))
(setq cen (cdr (assoc 10 circ)))
(setq diamin (- (* 2 rad) pl_w))
(setq diamout (+ (* 2 rad) pl_w))
(command “donut” diamin diamout cen “”)
(entdel name)
) ; Конец CIRCLE
(t (princ (strcat “\n Ошибочный выбор!”)))
) ; Конец cond
(setq n (1+ n))
) ; Конец while
(command “redraw”)
(moder)
(princ)
) ; Конец программы
В этой программе следует обратить внимание на три обстоятельства. В разделе 4.2 при описании функции cond не была упомянута важная ее особенность. Эта функция может производить проверку типа вводимых данных. В качестве последнего контрольного теста устанавливается условие Т. Если среди аргументов встречается аргумент, не соответствующий перечисленным типам, функция возвращает результат операции, приписанный этому условию. В программе plw подобную роль выполняет строка (t (princ (strcat “\n Ошибочный выбор!”))). При выборе примитива, тип которого отличается от перечисленных (например эллипса), программа его не обрабатывает, сообщает об ошибке выбора, но продолжает обработку примитивов, тип которых соответствует перечисленным в программе.
Второе обстоятельство заключается в следующем. Три примитива – линия, полилиния и дугаwмогут быть обработаны командой pedit, но окружность этой командой не обрабатывается. Поэтому окружность в чертеже заменяется кольцом, а исходный примитив удаляется из чертежа.
Наконец, некоторое неудобство доставляет преобразование окружности в кольцо. Дело в том, что для обрисовки кольца необходимо указать координаты его центра, совпадающие с извлеченными координатами центра окружности. Но если окружность создавалась в одной системе координат, а преобразование осуществляется в другой, то кольцо меняет свое положение относительно прочих элементов чертежа. Чтобы избежать этого, следует либо производить преобразование в той же системе, в которой создана окружность, либо программно осуществить преобразование координат. Читателю, оценившему полезность этой программы, не составит труда дополнить ее нужным фрагментом, а возможно, и добавить к обрабатываемым другие примитивы, например: эллипс и сплайн. Подобная расширенная программа существует и используется студентами при выполнении графических заданий.
6.8. Извлечение данных из таблиц
В описанной ранее программе Format заключен крупный недостаток, который может помешать корректной работе не только с этой программой, но и с другими, в которых встретится аналогичная ситуация. Дело в том, что в приведенной редакции программа может использоваться только в тех случаях, когда с нее начинается работа. Если же в текущем чертеже уже созданы слои или типы линий, одноименные с загружаемыми программой, почти наверняка произойдет сбой.
Рассмотрим следующую ситуацию. В начале работы над чертежом была использована команда scr программы Format, в результате чего в пространстве модели организовано поле чертежа. Независимо от того, какие действия выполнялись оператором в течение сеанса, в чертеже уже присутствуют типы линий Acad_ISO02w100 и Acad_ISO04w100 и несколько слоев. При переходе в пространство бумаги и программном вызове необходимого формата происходит повторная загрузка тех же типов линий и слоев. При выполнении команды linetype Автокад сообщает, что соответствующий тип линий уже загружен, и запрашивает оператора, следует ли произвести перезагрузку. Этот запрос останавливает работу программы и все последующие запрограммированные действия приходится производить вручную.
Подобная ситуация может возникнуть при запуске программ, написанных пользователями с целью автоматизации изображения часто включаемых в чертежи деталей и узлов. Поэтому проверка наличия в базе данных загружаемых элементов является необходимой.
Целый ряд параметров чертежа (например список слоев) хранится в виде таблиц. Для обработки таких таблиц используются функции tblnext и tblsearch. Обработке могут подвергаться таблицы с именами “APPID”, “BLOCK”, “DIMSTYLE”, LAYER”, “LTYPE”, “STYLE”, “USC”, “VIEW”, “VPORT”. Регистр записи имен не играет роли.
(tblnext имя_таблицы [символ]). Функция возвращает параметры первого элемента таблицы. Повторный вызов функции возвращает параметры следующего элемента и так далее. Выведенные параметры представляют собой присущий этому элементу список DXF-кодов и их значений. Параметр символ, если он присутствует и отличен от nil, влечет за собой возврат к первому элементу таблицы. Если же функция вызывается после tblsearch, то механизм ее действия несколько отличен от описанного (см. ниже). Выражение
(tblnext “block”)
может возвратить, например,
( (0 . “BLOCK”)
(2 . “L6”)
(70 . 2)
0.0 0.0 0.0)(-2 . <Entity name: 1fc05d8>)
).
(tblsearch имя_таблицы имя_элемента [символ]). Функция отыскивает нужный элемент таблицы и возвращает его параметры. Например,
(tblsearch “block” “L6”)
возвратит тот же список, что и в предыдущем примере.
Аргумент символ закрепляет этот символ за искомым элементом:
(tblsearch “block” “L3” 6)
возвратит, например,
( (0 . “BLOCK”)
(2 . “L3”)
(70 . 2)
(10 0.0 0.0 0.0 0.0)
(-2 . <Entity name: 1fc0660)
).
Если теперь вызвать функцию tblnext в формате
(tblnext “block” 6),
то она возвратит характеристики блока L3.
Воспользовавшись рассмотренными возможностями, дополним программу Format операцией проверки наличия в ее базе данных необходимых типов линий и слоев. Загрузка нового типа линии должна осуществиться только при условии ее отсутствия в базе данных.
(if (tblsearch "ltype" "Acad_ISO04w100")
(princ)
(command "linetype" "load" "Acad_ISO04w100"
"acadiso. lin" "" "")
)
Если условие функции if соответствует Т, выполняется первая функция, т. е. печатается пустая строка, в противном случае, если тип линий не загружен, он загружается в чертеж.
Следовательно, пользовательская функция sloy может быть представлена следующим образом:
(defun sloy ()
(if (tblsearch "ltype" "Acad_ISO04w100") (princ)
(command "linetype" "load" "Acad_ISO04w100"
"acadiso. lin" "" ""))
(if (tblsearch "ltype" "Acad_ISO02w100") (princ)
(command "linetype" "load" "Acad_ISO02w100"
"acadiso. lin" "" ""))
(if (tblsearch "layer" "contur") (princ)
(command "layer" "new" "contur" ""))
(if (tblsearch "layer" "center") (princ)
(command "layer" "new" "center"
"l" "Acad_ISO04w100" "center"
"c" "red" "center" ""))
(if (tblsearch "layer" "hidden") (princ)
(command "layer" "new" "hidden"
"l" "Acad_ISO02w100" "hidden"
"c" "yellow" "hidden" ""))
(if (tblsearch "layer" "dim") (princ)
(command "layer" "new" "dim"
"c" "green" "dim" ""))
(command "layer" "c" "255" "0"
"s" "0" "")
)
Можно обойтись и без ввода пустой строки, воспользовавшись структурой
(if (not (tblsearch "ltype" "Acad_ISO04w100") )
(command "linetype" "load" "Acad_ISO04w100"
"acadiso. lin" "" ""))
7. OПЕРАЦИИ С ВНЕШНИМИ ФАЙЛАМИ
Вызов файла
Автолисп может взаимодействовать с внешними файлами, если эти файлы открыты для таких операций. Функции, управляющие этим процессом, практически не отличаются от соответствующих операторов других языков программирования.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |


