Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
(ssadd [имя‗пр [набор]]). Функция добавляет примитив, определенный его именем, в существующий набор. Вызванная без аргументов, она создает пустой набор. Если указано только имя примитива, создается новый набор из одного примитива. Если примитив уже существует в наборе, функция игнорирует операцию и не воспринимает такой ввод за ошибку.
(setq e1 (entnext)) присваивает имя е1 первому примитиву в чертеже,
(setq ss (ssadd)) создает пустой набор ss,
(ssadd e1 ss) включает в набор ss примитив e1,
(setq e2 (entnext e1)) присваивает имя е2 примитиву, следующему за е1,
(ssadd e2 ss) добавляет примитив е2 в набор ss.
(ssdel имя_пр набор). Функция удаляет примитив из набора и возвращает имя набора. Если названный примитив в наборе отсутствует, возвращается nil. Например, если примитив е1 существует в наборе ss1, а примитив е2 нет, то
(ssdel e1 ss1) возвращает SS1 (без элемента е1),
(ssdel e2 ss1) возвращает nil.
(sslength набор). Функция возвращает целое число, соответствующее количеству элементов в наборе.
(ssmemb имя_пр набор). Функция проверяет, является ли указанный примитив элементом набора. Если да, возвращает его имя, если нет, возвращает nil.
(ssname набор индекс). Функция возвращает имя примитива, порядковый номер которого соответствует введенному индексу. Если индекс отрицателен или превышает число примитивов в наборе, возвращается nil. Следует помнить, что первому элементу набора присваивается индекс 0. Если необходимо извлечь имя примитива, индекс которого превышает 32767, следует вводить его как действительное число. Например,
(setq entx (ssname sset 50483.0))
возвращает имя 50484-го примитива набора, присваивая ему идентификатор entx.
6.6. Организация циклов при обработке наборов
В тех случаях, когда программа предусматривает выполнение ряда однотипных операций, целесообразно организовывать цикл подобно тому, как это делается в операторных программах. Далее описываются две функции Автолиспа, позволяющие решить эту задачу.
(repeat число выражение … ). Функция выполняет операции, определяемые выражением заданное число раз и возвращает последний результат. Аргумент число обязателен, список выражений не должен быть пустым. Пример [2]:
(setq a 10 b 100)
(repeat 4
(setq a (+ a 10))
(setq b (+ b 100))
)
присваивает а значение 50, b – значение 500.
(while условие выражение … ). Функция оценивает условие, и если оно не nil, выполняет выражение. Процесс продолжается до тех пор, пока условие не примет значения nil. Функция возвращает значение последнего выражения.
В качестве примера организации цикла рассмотрим программу сохранения системных переменных, которая часто используется в прикладных программах (например в файле attredef. lsp, находящемся в папке support пакета AutoCAD).
(defun MODES (a)
(setq MLST ‘())
(repeat (length a)
(setq MLST (append MLST
(list (list (car a) (getvar (car a))) )) )
(setq a (cdr a))
) )
Каждая системная переменная обладает именем и значением, т. е. представляет собой список из двух элементов. Первая строка программы описывает пользовательскую функцию MODES, включающую один аргумент, по содержанию имеющий определенное сходство с формальным параметром в подпрограмме Фортрана. Автолисп позволяет использовать параметр для подстановки как атомов, так и списков. В данном случае будет использован список системных переменных. Вторая строка создает пустой список MLST. Третья – открывает цикл, в котором количество повторов операции соответствует длине аргумента а, т. е. числу сохраняемых переменных. Далее в первом цикле выполняются следующие операции (для удобства чтения одна из подстрок выделена полужирным шрифтом):
(car a) – извлекается первая системная переменная из списка а сохраняемых переменных;
(getvar (car a)) – извлекается значение первой системной переменной;
(list (car a) (getvar (car a))) – формирует подсписок, состоящий из имени переменной и ее значения;
(list (list (car a) (getvar (car a))) ) – формирует список из подсписков переменных и их значений (в первом цикле список состоит из одного подсписка);
(append MLST (list (...))) – сформированный список присоединяется к пустому списку MLST;
(setq MLST (append MLST (list (...)))) – результат предыдущего действия идентифицируется со списком MLST, который теперь не пуст, а содержит имя системной переменной и ее значение;
(setq a (cdr a)) – из списка переменных исключается обработанная переменная.
Во втором цикле все операции повторяются, но присоединение второй переменной и ее значения происходит уже не к пустому списку, а к списку, хранящему имя и значение первой переменной.
Теперь достаточно из основной программы вызвать функцию MODES с перечисленными в качестве аргументов именами сохраняемых системных переменных, и все они вместе с их значениями будут сохранены в списке MLST:
(modes ‘(sysvar1 sysvar2 sysvar3 ...)).
После окончания всех операций, предусмотренных программой, восстановить системные переменные можно пользовательской функцией moder. Эта функция работает аналогично функции modes и дополнительных пояснений, вероятно, не требует. Следует лишь обратить внимание на то, что обрабатываемым является список MLST, уже существующий в программе. Программа выглядит следующим образом:
(defun MODER ()
(repeat (length MLST)
(setvar (caar MLST) (cadar MLST))
(setq MLST (cdr MLST))
) )
Обе функции можно использовать без изменения при составлении любых программ на Автолиспе.
При сохранении и изменении конфигурации целесообразно обратить внимание на системную переменную OSMODE (Object Snap Mode – режим объектной привязки). Не исключены ситуации, когда объектная привязка главенствует над указанием точки и примитив строится не из указанной точки, а из точки, определенной автоматической объектной привязкой. Поэтому автоматическую привязку целесообразно отключить, установив переменную OSMODE в ноль, или изменить ее значение в нужную сторону. Значение этой переменной устанавливается в соответствии с таблицей 5.
Т а б л и ц а 5
Битовые числа опций объектной привязки
Битовое Значение Битовое Значение
число опции число опции
0 Отсутствие привязки 32 Intersection
1 Endpoint 64 Insertion
2 Midpoint 128 Perpendicular
4 Centre 256 Tangent
8 Node (узел) 512 Nearest
16 Quadrant 1024 Quick
2048 Apparent Intersection
В версию Автокад 2000 включены дополнительно две опции:
4096 Extension 8192 Parallel
Ранее уже отмечалось, что на время работы программы целесообразно устанавливать в 0 системную переменную CMDECHO и устанавливать в 1 переменную BLIPMODE, если оператор при ручной работе использует маркеры.
6.7. Программное редактирование наборов
Чертеж, выведенный на бумагу, содержит объекты, изображаемые линиями различной ширины. До появления 15-й версии Автокада они обычно выполнялись на экране монитора линиями нулевой ширины, а требуемое значение ширины устанавливалось при настройке печатающего устройства. Автокад 2000 снял эту проблему, добавив новую системную переменную – LINEWEIGHT, управляющую шириной линии. Но и в более ранних версиях иногда удобно уже в чертеже задавать необходимую ширину линий, особенно если объекты расположены в одном слое. Автокад в этой ситуации позволяет использовать примитивы, обладающие шириной линии, например, полилинии, полосы, кольца. Однако часто бывает удобнее выполнить чертеж в линиях нулевой толщины, а впоследствии отредактировать нужные примитивы. Автокад предоставляет возможность осуществить это, применив команду Pedit, но подобную обработку, во-первых, воспринимают не все примитивы, во-вторых, она трудоемка и требует особой сосредоточенности в связи с необходимостью постоянно отслеживать информацию в поле сообщений.
Ниже приводится фрагмент программы, осуществляющей одновременное преобразование в примитивы, обладающие шириной, некоторого набора отмеченных примитивов, включающего линии, полилинии, дуги и окружности. Программа использовалась в версиях 11...14, может быть небесполезной и в версии AutoCAD 2000.
(defun MODES (a)
(setq MLST '())
(repeat (length a)
(setq MLST (append MLST (list (list (car a) (getvar (car a))))))
(setq a (cdr a))
) ; Конец repeat
) ; Конец MODE
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |


