Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Итак, напишем функцию, извлекающую из чертежа координаты точек.

①         (defun pnt ()

②  (setq lin (read-line file1))

③  (setq x1 (atof (substr lin 10 10)))

④         (setq y1 (atof (substr lin 23 10)))

⑤  (setq pt1 (list x1 y1))

        )

Cтрока ① устанавливает имя новой функции  pnt, строка ② считывает из файла, определенного дескриптором file1, первую строку lin, рассматривая ее как строковую переменную. Далее (строка ③) функция substr считывает информацию, содержащуюся в позициях 10…19 строки lin, функция  atof преобразует считанную строковую переменную в числовую, а уже  setq приписывает это значение координате  х1. Аналогичные действия выполняет строка ④, устанавливая координату  y1. Наконец, выделенные координаты приписываются точке pt1 (строка ⑤).

Если остановиться на вычерчивании за один прием участка полилинии, проходящего через две точки, то соответствующая функция будет выглядеть, например, следующим образом:

       (defun otr ()

        (command “pline” t1 “w” “0” “” t2 “”)

       ).

Теперь можно написать полностью программу, обрабатывающую файл результатов расчета любой длины.

;;;  ========================================

(defun cdraw ()

;;;  ========================================

;;;  подавление вывода текста на экран

НЕ нашли? Не то? Что вы ищете?

       (setq svar_old (getvar “cmdecho”))

       (setvar “cmdecho” 0)

;;;        загрузка штрих-пунктирной линии        

  (if (tblsearch "ltype" "Acad_ISO04w100")         (princ) 

  (command "linetype" "load"

  "Acad_ISO04w100" "acadiso. lin" "" "")

  )

;;;        сохранение текущего слоя

       (setq lay_old (getvar "clayer"))

;;;        создание нового слоя в чертеже

       (command "layer" "new" "cam"

                "c" "magenta" "cam"        

  "l" "Acad_ISO04w100" "cam"        

  "s" "cam" "")                        

;;;        вызов файла и чтение первой строки 

(setq get_F (getstring "Введите имя файла: ") )

         (setq file1 (open (strcat get_F) "r") )

       

;;;        организация цикла счета строк файла

       (setq k 0)

(while (read-line file1)

       (setq k (+ k 1))

       )

               (close file1)

;;;        чтение файла и обрисовка профиля

       (setq file1 (open get_F “r”))

  (setq t1 (pnt))

(repeat (- k 1)         

  (setq t2 (pnt))                        

  (otr)

  (setq t1 t2)

  )

                                       

(close file1)

  (command “layer” “s” lay_old)        

  (setvar “cmdecho” svar_old)

       

       (princ)

)

Разумеется, в текст программы должны быть вклю­чены функции, описанные в этом параграфе (имеются в виду функции  pnt  и  otr).

Приведенный пример представляет собой фрагмент программы, используемой для автоматической обрисовки центрового профиля кулачка.  Дополнительно реальная программа выполняет операции объединения сегментов полилинии, генерирования типа линии, размещения изображения профиля в нужном месте чертежа и поворота изображения на заданный угол.  То обстоятельство, что профиль очерчивается отрезками прямых, не играет существенной роли, так как при малом шаге счета (он в реальной программе принят равным одному угловому градусу, а может быть уста­новлен сколь угодно малым) визуально профиль не отличается от такового, построенного с помощью сплайна.

И последнее замечание. Приведенный фрагмент содержит два цикла:  while и  repeat. Это сделано лишь для иллюстрации принципов их построения. В реальной программе достаточно одного цикла  while.



ДОПОЛНИТЕЛЬНЫЕ  СВЕДЕНИЯ
Вывод  сообщений

Ранее рассматривались принципы организации запросов для ввода оператором информации во время работы программы. Иногда бывает необходимо записать  в файл необходимые данные, вывести на экран запрос или сообщение, не связанные с функциями getxxx, и т. п. Автолисп содержит четыре функции, отвечающие этим требованиям:  prompt,  print,  prin1  и  princ.

(prompt  строка).  Функция выводит строку  в поле сообщений экрана и возвращает  nil. В режиме двухэкранной работы сообщение выводится на оба экрана.

Следует иметь в виду, что аргумент строка должен обязательно быть строковой константой. Аргументы другого типа не принимаются. Например:

(prompt "Hello")  вызывает на экран  Hellonil,

(prompt  hello)  сообщает  error:  bad argument type.

(prin1  [выражение  [дескриптор_файла]]). Функция выводит выражение  в командную строку или записывает его в открытый для записи файл, определенный дескриптором, возвращая  выражение  в поле сообщений. Таким образом, адрес записи выражения определяется наличием или отсутствием аргумента дескриптор_файла. Примеры [5] :

(prin1  "Hello"  f)  записывает "Hello" в файл  f  и  возвра­­щает "Hello" в поле сообщений,

(prin1  "Hello")  записывает  "Hello"  в командную стро­ку и одновременно возвращает в поле сообщений, в результате чего "Hello" в текстовом поле экрана появляется дважды.

Если функция вызывается без аргументов, она возвращает (и записывает) пустую строку. При использовании prin1 в качестве последнего выражения пользовательской функции эта пустая строка обеспечивает "мягкий" выход из приложения.

(princ [выражение [дескриптор_файла]]).  Функция ра­ботает аналогично предыдущей. Разница заключается в том, что при записи в файл строковой константы princ снимает ее признак (открывающие и закрывающие кавычки), тем самым делая ее доступной для чтения с помощью функции  read-line. Действие пустой строки аналогично предыдущему.

(print  [выражение  [дескриптор_файла]]). В отличие от  prin1 функция  print  предваряет  выражение  управляющим символом перевода строки и заключает его символом пробела.

Как уже упоминалось ранее, если Автокад обнаруживает в программе ошибку, выполнение программы прерывается, выдается сообщение о характере ошибки и осуществляется обратная трассировка программы от  некорректного выражения до имени пользовательской функции, содержащей ошибку. При всех достоинствах этого процесса он обладает одним существенным недостатком. Если программа изменила конфигурацию среды, исходная конфигурация не восстанавливается, и необходимые для дальнейшей работы изменения приходится выполнять вручную. Автолисп предоставляет возможность избежать этой неприятности путем переопределения содержания сообщения об ошибке и включения в программу операции восстановления конфигурации при использовании функция  *error*,  записываемой  в формате

(*error*  сообщение).

Принцип действия этой функции следующий. Если функция не определена или  nil,  осуществляется описанный выше процесс прерывания программы и ее трассировки глубиной до 100 выра­жений.  Если же она определена, Автолисп вычисляет ее и результат возвращает в поле сообщений.

В практике составления программ удобно использовать эту функцию в специальной структуре, управляющей восстановлением конфигурации, например, следующей:

       (defun myerr (s)        

(if (/= s "Function cancelled")

(princ (strcat "\nError: " s))

         )

        (moder)

  (setq *error* olderr)

        (princ)  )

Теперь достаточно в главном модуле  перед началом основных действий написать структуру

       (setq olderr *error*)

(setq *error*  myerr),

и при возникновении ошибки (например, при вводе оператором аргумента, тип которого не соответствует ожидаемому) измененные программой параметры конфигурации будут восстановлены.

Исходя из изложенного, следует сделать вывод, что в период составления и отладки программы целесообразно использовать внутреннюю оценку ошибок, а пользовательскую функцию включать в уже отлаженную программу, чтобы обезопасить конфигурацию от изменений в случае ошибки оператора.

Некоторые  принципы  оформления  программ

Программирование на Автолиспе, как и на любом другом языке высокого уровня, предполагает соблюдение определенных норм и правил, облегчающих возможность использования и модификации законченных программ [5, 6].

Одним из важных компонентов программы является комментарий, в общем случае включающий в себя следующие элементы:

    имя программы, сведения об авторе, версию, дату создания; необходимые инструкции по использованию; замечания, облегчающие понимание структуры программы и логики программирования; собственные замечания, возникающие при прогоне и отладке программы.

Комментарий, описывающий назначение и особенности программы, располагаемый в ее начале, должен быть достаточно подробным, не вызывающим необходимости обращения к дополнительной документации. Следует при этом учитывать, что длина строки, выводимой на экран, на большинстве мониторов ограничена 80 символами. Увеличение количества точек с запятой, предваряющих комментарий, поможет подчеркнуть его важность.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14