Добро пожаловать!
Войдите или зарегистрируйтесь сейчас!
Войти
Страница 4 из 18
-
Форумчанин
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 2.704
- Симпатии:
- 2.444
- Адрес:
-
Сибирь
Выложи пример проблемного файла, попробую обойти эту ошибку
#61
-
Форумчанин
- Регистрация:
- 27 фев 2012
- Сообщения:
- 29
- Симпатии:
- 1
- Адрес:
-
Москва
Вот что пишет:
Команда: Make_tab_file
найдено: 1
Команда: !table
!version 300
!charset WindowsCyrillic
Definition Table
File «58-93MONTAJ2_1_1P1.JPG»
Type «RASTER»
(309050.8,5869472.591) (0,0) Label «Point 1»,
(309053.265,5866794.297) (0,2514) Label «Point 2»,
(312985.479,5866797.917) (3691,2514) Label «Point 3»
CoordSys NonEarth Units «m»
Units «m»
; ошибка: неверный тип аргумента: streamp nilВложения:
#62
-
Форумчанин
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 2.704
- Симпатии:
- 2.444
- Адрес:
-
Сибирь
Проблема в имени файлапапки, пока некогда, как разберусь расскажу,
#63
-
Форумчанин
- Регистрация:
- 15 дек 2009
- Сообщения:
- 207
- Симпатии:
- 42
- Адрес:
-
Хабаровск
Источник — ГОСТ Р 51794-2008
Номер счета выучил наизусть…
#64
-
Форумчанин
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 2.704
- Симпатии:
- 2.444
- Адрес:
-
Сибирь
Krovlaf, с пересчётом вроде разобрался, но всё равно получается какая-то хрень с файлами выложенными numerick.
Выложите ещё пожалуйста какую-нибудь связку с градусной привязкой#65
-
Форумчанин
- Регистрация:
- 15 дек 2009
- Сообщения:
- 207
- Симпатии:
- 42
- Адрес:
-
Хабаровск
Попробуйте мой вариант. У numerick. в tab файле
Definition Table
File «156_1-2.jpg»
Type «RASTER»
(42.8140640258789,48.6085681795219) (0, 0) Label «Точка 1»,
(42.8537178039551,48.5912560895706) (1848, 1220) Label «Точка 2»,
(42.8140640258789,48.5912560895706) (0, 1220) Label «Точка 3»,
(42.8537178039551,48.6085681795219) (1848, 0) Label «Точка 4»,
(42.833890914917,48.5999128762053) (924, 610) Label «Точка 5»,
(42.833890914917,48.6085681795219) (924, 0) Label «Точка 6»,
(42.8140640258789,48.5999128762053) (0, 610) Label «Точка 7»,
(42.8537178039551,48.5999128762053) (1848, 610) Label «Точка 8»,
(42.833890914917,48.5912560895706) (924, 1220) Label «Точка 9»
CoordSys Earth Projection 1, 104
Units «degree»
Выделенное красным вроде должно соответствовать долготе, широте в десятичных градусах. Может в моем варианте получится. (Участок карты и файлы привязки взяты с SAS.Planet)
Definition Table
File «ружино.jpg»
Type «RASTER»
(133.561992645264,45.5285990161151) (0, 0) Label «Точка 1»,
(133.628253936768,45.4975639155435) (386, 258) Label «Точка 2»,
(133.561992645264,45.4975639155435) (0, 258) Label «Точка 3»,
(133.628253936768,45.5285990161151) (386, 0) Label «Точка 4»,
(133.595123291016,45.5130836051324) (193, 129) Label «Точка 5»,
(133.595123291016,45.5285990161151) (193, 0) Label «Точка 6»,
(133.561992645264,45.5130836051324) (0, 129) Label «Точка 7»,
(133.628253936768,45.5130836051324) (386, 129) Label «Точка 8»,
(133.595123291016,45.4975639155435) (193, 258) Label «Точка 9»
CoordSys Earth Projection 1, 104
Units «degree»
До кучи закинул все остальные файлы привязки которые предлагает SAS.ПланетаВложения:
#66
-
Форумчанин
- Регистрация:
- 15 дек 2009
- Сообщения:
- 207
- Симпатии:
- 42
- Адрес:
-
Хабаровск
Пересчитал координаты в маленькой и удобной программке любезно предоставленной Кручининым Владимиром. Считает верно, проверял.
В моем варианте должно получается:
Пересчет в систему 42 года, 23 зона
5 044 786.1845 387 663.3871
5 041 246.2667 392 780.7500
5 041 336.8460 387 601.6132
5 044 695.6068 392 839.6763
5 043 015.9274 390 221.3564
5 044 740.3615 390 251.5314
5 043 061.7508 387 632.5003
5 042 971.1722 392 810.2133
5 041 291.0223 390 191.1813
При вставке точек в Акад вроде все нормально. Одно НО. Помнится при попытке вставки точек по координатам с номером зоны получалась какая-то белиберда. Мы зону вырезали.#67
-
Форумчанин
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 2.704
- Симпатии:
- 2.444
- Адрес:
-
Сибирь
Сделал загрузку и по «градусной» привязке.
Привязка немного кривовата, т.к. земля ни фига не плоская :(, ну и пересчёт координат из геодезических в прямоугольные у всех по разному, у меня получились немного отличные от твоих, но зато до миллиметра совпали с рассчитанными в программе PHOTOMOD GeoCalculator
Тестируйте, новую версии 2.1, скачать можно из 18 поста в этой теме, если используем макрос на кнопку, обращаем внимание на изменение версии так же и в макросе.#68
-
Форумчанин
- Регистрация:
- 15 дек 2009
- Сообщения:
- 207
- Симпатии:
- 42
- Адрес:
-
Хабаровск
-
- Регистрация:
- 18 дек 2012
- Сообщения:
- 1
- Симпатии:
- 0
А вы можете сказать как вставить растр с привязкой MI в Autocad с помощью RasterDesk?
#70
-
Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 84
- Адрес:
-
Краснодар
Народ подскажите , что мне нужно поставить на голый русский автокад 2010 для подгрузки изображений с расширением .sldИ если можно ссылку на это дело
#71
-
Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 84
- Адрес:
-
Краснодар
Прошу прощения расширение sid
#72
-
Форумчанин
Raster Design, Global Mapper
#73
-
Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 84
- Адрес:
-
Краснодар
Raster Design — а чего нибудь бесплатного нет ?
#74
-
Форумчанин
Robkiy, а привязка какая?
Я к тому что можно переконвертировать изображения, например в tiff, а в привязочном файле поменять расширение с sid на tiff.. Не вариант?#75
-
Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 84
- Адрес:
-
Краснодар
Уважаемый Alexandr-GR, проблема такова у меня автокадовский фаил со слепленными растратами вышеупомянутого формата , но увы сами картинки не отображаются , для меня координаты их не важны просто хочется видеть слепленную картинку , перевести все в другой формат можно только теоретически так как их более тысячи и потом опять в одно единое надо будет лепить
#76
-
Форумчанин
Robkiy, ясно.. Я так и предпологал…
Попробуй Global Mapper, но там могут возникнуть сложности с настройкой системы координат (проекции).
Все таки идеальный вариант RD. имхо#77
-
Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 84
- Адрес:
-
Краснодар
да скачал я от туда версию но она я так понял не полноценная — и не зависимая от автокада — или я что то путаю ?
#78
-
Форумчанин
В ней можно открыть все растры (при условии, что они с привязочными файлами) и экспортировать в, например, BMP — TAB
#79
-
Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 84
- Адрес:
-
Краснодар
да привязочных файлов нет к сожалению
#80
Страница 4 из 18
Поделиться этой страницей
Well, I though I figured it out. The one I
got stuck on happened to be a directory that didnt exist, however after getting
past that, 10 more directories and WHAM!!! it happened again, and then
again. All directories existed this time. I dont understand.
Below is the code. Any help would be appreciated.
;wrote by John Crocco
12-16-01
;used to write a script from 2002 to be ran in R14 by the script
command
;This routine purges, deletes a specific image, and saves the
file.
(defun C:det3 ()
(WriteFindImageScript)
(princ)
)
(defun WriteFindImageScript (/ path dir pathname
files scriptfilename filedescriptor counter)
(setq path
«j:/cc/»)
(Prompt «Enter directory or directory/subdirectory ie:3044 or
3044/dwgs»)
(write-line «»)
(setq dir (getstring «Directory
name under j:cc ?»))
(setq pathname (strcat path dir
«/»))
(setq files (vl-directory-files pathname «*.dwg»
0))
(setq scriptfilename (strcat (getvar «users1»)
«z.scr»))
(setq filedescriptor (open scriptfilename
«w»))
(setq counter 0)
(repeat (length
files)
(write-line «open»
filedescriptor)
(setq drawingfile (strcat pathname (nth
counter Files)))
(write-line (strcat «»» drawingfile
«»») filedescriptor)
(write-line (strcat «(load «»
«delimg» «»)») filedescriptor)
(write-line «delimg»
filedescriptor)
(write-line «purge»
filedescriptor)
(write-line «all»
filedescriptor)
(write-line «*»
filedescriptor)
(write-line «N»
filedescriptor)
(write-line «QSAVE»
filedescriptor)
; (write-line «CLOSE» filedescriptor);
commented out for R14
(setq counter (1+
counter))
)
(close filedescriptor)
(Setvar «users1»
pathname)
;(command «script» scriptfilename);makes it run in 2002,
need it to run in r14
)
style=»PADDING-RIGHT: 0px; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #000000 2px solid; MARGIN-RIGHT: 0px»>
Without the code, not really. However, it sounds
like a file handle is not being closed.style=»PADDING-RIGHT: 0px; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #000000 2px solid; MARGIN-RIGHT: 0px»>
THIS stupid eror is driving me
crazy!Does anyone know what it means?
I load a lisp routine to make a scipt file. it
works most times, but not always. Sometimes it will work only 1 or 2
times in a row then give me this error. Other times it works for a
while before crashing. right now I cant get it to work for more than 2
times in a row. Then even reloading the lisp wont help it, I need to
restart 2002.What could be the problem?
- Forum
- AutoCAD Customisation
- LISP Routines
- Error bad argument type: streamp nil
-
Error bad argument type: streamp nil
anyone node howda fix iss?
I have never seen such an error
-
Is someone taking the P out of you?
Seriously- this is somthing to do with a lisp function concerned with media viewing but the best I can suggest is to google the error to see if it has turned up on another forum.
From my very limited knowledge of lisp and a quick look on the web I think it is probably a syntax error in the lisp
Last edited by NukeCad; 22-07-2008 at 02:32 PM.
-
? for Nuke
Originally Posted by NukeCad
Is someone taking the P out of you?
Seriously- this is somthing to do with a lisp function concerned with media viewing but the best I can suggest is to google the error to see if it has turned up on another forum.
From my very limited knowledge of lisp and a quick look on the web I think it is probably a syntax error in the lisp
What does «Is someone taking the P out of you?» mean ?
I waz just typin soas those Texas folk thatdar hare cud utterstad wut i waz saain.
I googled it…. over my head today
-
Taking the P ?
English expression-
Taking the Pee
Taking the Piss
Extracting the UrineSlang for having fun at your expense / trying to make you look stupid.
-
well takin the P down south has other meanings……
I mean…
you could take a P
you could want some P
You could be on your P
You might even feel P’d
If you had a cathader you could P in a bag and not have to ever wipe.
****!!! My kids just scared the P out of me.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
- BB code is On
- Smilies are On
- [IMG] code is On
- [VIDEO] code is On
- HTML code is Off
Forum Rules
#1 24 июля 2015г. 16:35:04
- Blackjek
- Участник
- На форуме с 24 июля 2015г.
- Сообщений: 2
- Спасибо: 0
Тема: Ошибка: неверный тип аргумента: stringp nil
Добрый день коллеги.
Моим товарищем было написан лисп:
(defun c:11 (/ xyfill osm ocmd spt ept cla)
;;—————————————————————————
;; функция заливки прямоугольника, определенного точками 1pt и 2pt в текущей ПСК,
;; блоками с именем bname на максимальном расстоянии maxdist
(defun xyfill (1pt 2pt maxdist bname / n_meas nx ny dx dy sx sy ix iy)
(defun n_meas (1p 2p d / n) ;_ возвращает количество точек деления по координате
(max (fix (if (not (zerop (- (abs (- 2p 1p)) (* (fix (setq n (/ (abs (- 2p 1p)) d))) d))))
(1+ n)
n
) ;_ if
) ;_ fix
1 ;_ минимум одна точка деления
) ;_ max
) ;_ defun n_meas
(setq dimlf1 (getvar «DIMLFAC»));; установка масштаба блока «Оросители»
(setq mashbloka1 (/ 1.0 dimlf1))
(setq nx (n_meas (car 1pt) (car 2pt) maxdist))
(setq ny (n_meas (cadr 1pt) (cadr 2pt) maxdist))
(setq dx (/ (- (car 2pt) (car 1pt)) nx)) ;_ шаг по X
(setq dy (/ (- (cadr 2pt) (cadr 1pt)) ny)) ;_ шаг по Y
(princ (list «рядов по X=» nx «, по Y=» ny «, шаг X=» dx «, шаг Y=» dy));;писанина
(setq sx (+ (car 1pt) (* dx 0.5)))
(setq sy (+ (cadr 1pt) (* dy 0.5)))
(setq ix sx)
(repeat nx
(setq iy sy)
(repeat ny
(vl-cmdf «_.insert» bname (list ix iy) mashbloka1 mashbloka1 0)
(setq iy (+ iy dy))
) ;_ repeat
(setq ix (+ ix dx))
) ;_ repeat
) ;_ defun xyfill
;;—————————————————————————
;; собственно программа
;; Установка слоёв
(setq ocmd1 (getvar «cmdecho»))
(setvar «cmdecho» 0)
(if (setq layget (tblsearch «LAYER» «Оросители»)) ; проверка на наличие слоя
(cond ; если есть, то проверка его состояния
((= (logand 1 (cdr (assoc 70 layget))) 1)
(alert «Слой «Оросители», заморожен!nnДальнейшая работа, увы, невозможна…»)
(exit)
)
((= (logand 4 (cdr (assoc 70 layget))) 4)
(alert «Слой «Оросители» заблокирован!nnДальнейшая работа, увы, невозможна…»)
(exit)
)
((minusp (cdr (assoc 62 layget)))
(alert «Внимание!!!nnСлой «Оросители», на котором будет отрисован объект, невидим!»)
)
) ;_ cond
(vl-cmdf «_.layer» «_n» «Оросители» «_c» 20 «Оросители» «») ; создание слоя, если такого нет
) ;_ if
(setvar «cmdecho» ocmd1)
;;конец функции установки слоев
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(setq cla (getvar «CLAYER»))
(setq ocmd (getvar «cmdecho»))
(setq osm (getvar «osmode»))
(setq bname1 «Ороситель») ;; Имя блока
(princ (strcat «nЗаливка прямоугольника блоками » bname1 «.»))
(initget 1)
(setq spt (getpoint «nОдин угол >»))
(initget 1)
(setq ept (getpoint «nДругой угол >»))
(princ «nМинуточку…..n»)
(setvar «CLAYER» «Оросители»)
(setvar «cmdecho» 0)
(setvar «osmode» 0)
(xyfill spt ept (/ (atof(getenv «min-dist»)) (getvar «dimlfac»)) bname1) ;_ указать минимальную дистанцию и имя блока заливки
(setvar «cmdecho» ocmd)
(setvar «CLAYER» cla)
(setvar «osmode» osm)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
(princ «nГотово «)
(princ (strcat «nШаг между оросителями составляет : » (getenv «min-dist») «мм»))
(princ)
) ;_ defun
(vl-load-com)
;;;**********************************************************************************************************
(defun min-dist-orosit (/ i)
;; (min-dist-orosit)
(or (getenv «min-dist») (setenv «min-dist» «4000»))
(initget «» 6)
(if (setq i
(getdist
(strcat «n Укажите минимальную дистанцию между блоками [» (getenv «min-dist») «]»)
) ;_ getint
) ;_ setq
(setenv «min-dist» (rtos i 2 3))
) ;_ if
(atof (getenv «min-dist»))
) ;_ defun
Смысл данной программы заключается:
1. Создается слой
2. равномерное распределение блока «ороситель» по всей площади помещения с указанием шаг оросителя.
В старых версиях программы все работало — а для в автокаде 2012 не работает, выдает ошибку:
Ошибка: неверный тип аргумента: stringp nil.
Помогите и разъясните , чтоб понять в чем ошибка и куда смотреть?
Спасибо.
#2 Ответ от Alan 26 июля 2015г. 14:31:56
- Alan
- Активный участник
- Откуда: Украина / Киев
- На форуме с 2 апреля 2002г.
- Сообщений: 1,345
- Спасибо: 15
Re: Ошибка: неверный тип аргумента: stringp nil
Про (getenv «min-dist») я отвечал на соседнем форуме
#3 Ответ от Blackjek 27 июля 2015г. 08:46:23
- Blackjek
- Участник
- На форуме с 24 июля 2015г.
- Сообщений: 2
- Спасибо: 0
Re: Ошибка: неверный тип аргумента: stringp nil
Спасибо за совет — «Там была определена переменная среды min-dist, а в новом нет — (getenv «min-dist») — nil
Задайте её и будет вам счастье…»
а Вы можете, чайнику подсказать что и где править?
Спасибо
#4 Ответ от kpblc 27 июля 2015г. 09:05:14
- kpblc
- Активный участник
- Откуда: С.-Петербург
- На форуме с 29 ноября 2004г.
- Сообщений: 8,348
- Спасибо: 23
Re: Ошибка: неверный тип аргумента: stringp nil
Сначала запусти функцию min-dist-orosit
#5 Ответ от Alan 27 июля 2015г. 12:06:56
- Alan
- Активный участник
- Откуда: Украина / Киев
- На форуме с 2 апреля 2002г.
- Сообщений: 1,345
- Спасибо: 15
Re: Ошибка: неверный тип аргумента: stringp nil
Дмитрий Беляков пишет:
а Вы можете, чайнику подсказать что и где править?
Ну или добавь вызов функции min-dist-orosit в начало своего текста
(defun c:11 (/ xyfill osm ocmd spt ept cla) ;;; вызов функции задания дистанции между блоками (min-dist-orosit) ..............
тогда при вызове команды 11, функция min-dist-orosit будет отрабатывать автоматически.
Как мне кажется в этом тексте есть еще достаточно подводных камней типа ошибок.
Совет.
Если хочешь изучать работу ЛИСПа, открывай тексты в редакторе ВизуалЛиспа и запускай пошаговую отладку
#6 Ответ от Alan 6 августа 2015г. 14:47:20 (изменено: Alan aka Александр Назаров, 6 августа 2015г. 14:47:51)
- Alan
- Активный участник
- Откуда: Украина / Киев
- На форуме с 2 апреля 2002г.
- Сообщений: 1,345
- Спасибо: 15
Re: Ошибка: неверный тип аргумента: stringp nil
убрал дубль
Когда Вы начнёте писать свои программы, то неизбежно столкнетесь с необходимостью решения проблем, которые в программировании носят название отладка программы.
Давайте рассмотрим некоторые технические приемы, которые помогут нам при создании новых программ на языке AutoLISP. К таким приемам относятся:
- Проверка фрагментов кода в окне «КонсольVisual LISP».
- Отслеживание парных кавычек.
- Поиск парных скобок в процессе и после написания кода.
- Использование окна «Контрольное значение»
Проверка фрагментов кода в окне «КонсольVisual LISP».
Вы можете проверить, насколько правильно вы понимаете синтаксис функции.
Давайте для примера рассмотрим функцию getpoint. Функция getpoint помогает нам задать координаты точки при помощи мыши. Давайте поищем эту функцию в справочной системе. Система выдаст следующую информацию. См. Рис. 1.
Рис. 1. «Окно справка»
Мы видим, что функция getpoint имеет два аргумента.
Первый, из которых pt – это координаты точки.
А второй msg — текст, который будет показан пользователю.
При чем оба аргумента не являются обязательными. Это следует из того, что они заключены в квадратные скобки ( [pt] [msg] )
Давайте откроем окно «КонсольVisual LISP» щелкнув по одноименной кнопке. См. Рис. 2.
Рис. 2. Добавляем (getpoint)
Введем функцию (getpoint) без аргументов и нажмем <Enter>.
Активным станем AutoCAD, где надо указать любую точку.
После указания точки, AutoCAD снова вернет нас в редактор Visual LISP.
В консоли появятся координаты указанной точки. См. Рис. 3.
Рис. 3. Координаты указанной точки.
Теперь давайте попробуем использовать аргументы. Введем функцию с первым аргументом (getpoint pt) и нажмем <Enter>. См. Рис. 4.
Рис. 4. Ошибка: не верный тип аргумента
Консоль выдаст нам сообщение об ошибке: неверный тип аргумента: point: nil.
Очевидно, переменная pt не содержит в себе значения. (значение nil означает, что аргумент не имеет значения). Давайте это проверим. Наберем в следующей строке pt и нажмем <Enter>. См. Рис. 5.
Рис. 5. Проверка значения переменной pt.
Консоль подтвердит наши предположения.
Давайте подставим, вместо pt координаты точки начало координат (getpoint (0 0 0)) и нажмем <Enter>. См. Рис. 6.
Рис. 6. Ошибка: неверная функция.
Консоль выдает сообщения об ошибке: неверная функция : 0. Скорее всего, координаты в скобках Visual LISP принял за функцию с именем 0 (вспоминаем, что после открывающийся скобки всегда следует имя функции). Как объяснить Visual LISP, что это не функция, а список координат? Для этого есть, два способа:
1) После открывающийся скобки добавить функцию list : (list 0 0 0)
2) Или перед открывающийся скобкой поставить апостроф: ‘(0 0 0)
Давайте снова напишем функцию, но уже с апострофом (getpoint ‘(0 0 0)) и нажимаем <Enter>. См. Рис. 7.
Рис. 7. Добавляем (getpoint ‘(0 0 0)).
Функция сделает активным AutoCAD и мы увидим, что указатель мыши как будто привязан ниточкой к началу координат. См. Рис. 8.
Рис. 8. Точка задается относительно другой точки.
И теперь мы можем задать точку, относительно другой точки, координаты которой являются первым аргументом функции getpoint. Щелкните в любом месте, и консоль вернет координаты выбранной точки. См. Рис. 9.
Рис. 9. Координаты указанной точки.
Давайте теперь разберемся со вторым аргументом. Напомню, что это msg — текст, который будет показан пользователю. Поскольку это текст (string), то писать его нужно в кавычках. Давайте добавим к нашей функции надпись: “Проверка”. См. Рис. 10.
Рис.. 10. Добавляем (getpoint ‘(0 0 0) «Проверка»)
Нажимаем <Enter>. И видим, что наша надпись появилась в командной строке. См. Рис. 11.
Рис. 11. Надпись в командной строке.
Очевидно, что второй аргумент функции getpoint, выдает подсказку пользователю, что в данный момент ему нужно сделать.
Давайте посмотрим пример применения этой функции в программе my_otr, которую я приводил в уроке: Построение отрезков в AutoCAD.
Открываем эту программу, выделяем вторую и третью строки и нажимаем на кнопку «Загрузить выделенный фрагмент». См. Рис. 12.
Рис. 12. Загрузка выделенного фрагмента.
Далее на просьбу в командной строке, выбираем первую точку (координаты этой точки при помощи функции присвоения setq запоминают в переменной р1). Появится следующая просьба. Вторую точку мы уже выбираем, ориентируясь на первую.
После указания второй точки в окне консоли появятся координаты выбранных точек. См. Рис. 13.
Рис. 13. Координаты выбранных точек.
Таким образом, мы проверили, как у нас работает выделенный фрагмент программы.
Я думаю, что после такова исследования, мы уже имеем четкое представление о том, как работает эта функция.
Отслеживание парных кавычек.
Раньше при написании кода в других текстовых редакторах одной из наиболее частых ошибок было не соблюдение правильного количества скобок и кавычек. Напомню, что количество открывающихся скобок и кавычек должно равняться количеству закрывающихся. В других текстовых редакторах отследить это было не всегда легко.
В 2000 году с появлением Visual LISP этот процесс стал значительно более простым.
Давайте начнем с простого и рассмотрим двойные кавычки. В Visual LISP применяется кодирование цветом, поэтому любая строка, заключенная в кавычки, на экране пурпурная. Кодирование цветом применяется в процессе ввода, поэтому после того, как вы поставили открывающиеся кавычки, остальная часть файла становится пурпурной до тех пор, пока вы не введете закрывающиеся кавычки. См. Рис. 14.
Рис. 14. Не закрытые кавычки.
Ставим в нужном месте закрывающиеся кавычки, и пурпурным сделается только текст, заключенный в кавычки с двух сторон. См. Рис. 15.
Рис. 15. Кавычки с двух сторон.
Стоит отметить, что в программах AutoLISP нужно всегда использовать кавычки вида “ ” (кавычки « » — не воспринимаются)
Поиск парных скобок в процессе и после написания кода.
С парными скобками все немного сложнее. Но в редакторе Visual LISP есть инструменты, которые помогают нам избежать лишних или недостающих скобок.
Прыгающий курсор.
Как только, в процессе написания кода новой программы, вы ставите закрывающую скобку, ваш курсор перескакивает к соответствующей ей открывающей. Если курсор не перескакивает, значит, вы поставили слишком много закрывающихся скобок (нет открывающийся скобки, к которой курсор мог бы переместиться). Если программа короткая, следить за перемещением курсора не сложно. В длинных программах следить за курсором сложнее, потому что в некоторых случаях открывающая скобка может находиться в не видимой области текущего окна.
Двойной щелчок возле скобок.
В редакторе Visual LISP проблема отслеживания перемещений курсора решена при помощи подсветки (выделения). Поместите курсор непосредственно перед открывающейся скобкой или после закрывающейся и щелкните дважды левой кнопкой мыши. Все содержимое скобок станет подсвеченным. Теперь вы видите, где находится парная скобка. См. Рис. 16.
Рис. 16. Выделение содержимого скобок.
Если кавычки и скобки в вашей программе расставлены правильно, но программа все равно не работает, не отчаивайтесь, отнеситесь к поиску ошибок как к интересной задаче.
Для начала определите, как далеко продвинулась ваша программа, прежде чем прекратила работать. Это можно сделать, если проверить значения присвоенные переменным.
Типы переменных.
В программах AutoLISP используются два типа переменных:
1) Системные переменные, которые описаны в AutoCAD (Пример: osmode).
2) Программные переменные, которые описаны и именованы вами.
Программные переменные могут быть как локальными, т. е. сохранять свои значения только на время выполнения программы, так и глобальными, сохраняющими значения после завершения работы программы, в которой они определены.
Когда вы добавляете в свою программу новую переменную, то по умолчанию она глобальная. Для того, чтобы она стала локальной ее нужно добавить в список временных переменных функции defun. См. Рис. 17.
Рис. 17. Список временных переменных.
Окно «Контрольное значение»
Для проверки значения переменных удобнее всего использовать окно «Контрольное значение». Для того, чтобы добавить переменную в это окно, поместите курсор на имени переменной р1 и нажмите на кнопку «Добавить контрольное значение». См. Рис. 18.
Рис. 18. Добавление переменных в окно «Контрольное значение».
Появится окно «Добавление контрольных значений», в котором нажимаем кнопку «ОК».
Наша переменная появится в окне «Контрольное значение». См. Рис. 19.
Рис. 19. Окно «Контрольное значение».
Чтобы окно «Добавление контрольных значений» не появлялось, а переменные сразу попадали в окно «Контрольное значение», переменную нужно выделить.
Давайте добавим в это окно и другие переменные.
Когда окно «Контрольное значение» открыто, можно добавлять переменные через кнопку «Добавить контрольное значение» расположенную в этом окне. См. Рис. 20.
Рис. 20. Кнопка «Добавить контрольное значение».
Теперь для того, чтобы увидеть значения переменных, после того как программа прекратила работать, нам необходимо все переменные сделать глобальными. Для этого их нужно убрать из списка временных переменных функции defun.
Затем загрузить нашу программу, нажав на кнопку «Загрузить активное окно редактора». См. Рис. 21.
Рис. 21. Загрузка программы.
Далее переходим в AutoCAD, нажав на кнопку «Активизация AutoCAD».
Набираем в командной строке mp_kub. См. Рис. 22.
Рис. 22. Вводим в командной строке mp_kub
Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.
Наша программа, которая должна была нарисовать куб. Этого не сделала.
Давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 23.
Рис. 23. Окно «Контрольное значение»
Мы видим, что переменные р1 и р2 имеют значения, а все остальные переменные нет. Очевидно, что ошибка произошла при расчете переменной р3. Находим эту строчку в программе и видим, что координаты точки р3 рассчитываются относительно самой себя. А должны были рассчитываться относительно точки р2.
Давайте, исправим ошибку, и снова загрузим нашу программу.
Перейдем в AutoCAD, набираем в командной строке mp_kub и нажмем <Enter>.
Указываем базовую точку, и наша программа нарисует куб. См. Рис. 24.
Рис. 24. Программа нарисовала куб.
Ура заработала!!!
Давайте снова вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 25.
Рис. 25. Все переменные имеют значение.
Мы видим, что все наши переменные имеют значения.
После того, как программа отлажена:
- Нужно вернуть все локальные переменные в список временных переменных функции defun.
- Сохранить свою LISP-программу.
- Закрыть редактор Visual LISP и AutoCAD, чтобы очистить все значения переменных. Этот шаг очень важен. Возможно, что некоторые переменные всё еще сохраняют присвоенные им значения.
Теперь давайте снова запустим AutoCAD и редактор Visual LISP. Откроем окно «Контрольное значение». Если переменные исчезли, то добавьте их снова. См. Рис. 26.
Рис. 26. Все переменные не имеют значений.
Мы видим, что все переменные не имеют значений.
Теперь давайте рассмотрим, как отслеживать значения переменных во время выполнения программы.
Для этого нам необходимо в программе поставить точки останова – места, в которых во время выполнения программа будет останавливаться.
Для этого помещаем курсор в то место программы, где мы хотели бы установить точку останова и нажимаем на кнопку «Точка останова вкл/выкл». См. Рис. 27.
Рис. 27. Точка останова.
Точка останова выделится красным.
Давайте добавим еще пару точек останова, загрузим программу и перейдем в AutoCAD. См. Рис. 28.
Рис. 28. Добавляем точки останова и загружаем программу.
Набираем в командной строке mp_kub. Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.
AutoCAD вернет нас в редактор Visual LISP, и мы увидим, что наша программа остановилась в первой точки останова. См. Рис. 29.
Рис. 29. Первая точка останова.
Обратим внимания на окно «Контрольное значение». В данной точки останова переменная р1 уже имеет текущее значение. Для продолжения программы нажимаем на кнопку «Продолжить». См. Рис. 30.
Рис. 30. Следующая точка останова.
Наша программа остановиться в следующей точке останова. В этой точке уже пять переменных будут иметь свои текущие значения.
Снова нажимаем на кнопку «Продолжить». См. Рис. 31.
Рис. 31. Последняя точка останова.
Программа остановиться в последней точке останова. В этой точке уже все переменные имеют свои текущие значения.
Для того чтобы завершить выполнение программы, снова нажимаем на кнопку «Продолжить».
В конце программы мы снова окажемся в AutoCAD, где будет нарисован куб. См. Рис. 32.
Рис. 32. Программа нарисовала куб.
Теперь давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 33.
Рис. 33. Все переменные не имеют значений.
По окончании программы все переменные снова не имеют значений.
Таким образом, используя точки останова и окно «Контрольное значение», можно отслеживать значения переменных в любой точке во время выполнения программы.
Чтобы удалить все точки останова по окончании работы с ними, нажмите клавиши <Shift>+<Ctrl>+<F9>.
И так в этом уроке мы рассмотрели основные приемы отладки программы AutoLISP.
К этим приемам относятся:
- Проверка фрагментов кода в окне «Консоль Visual LISP».
- Отслеживание парных кавычек.
- Поиск парных скобок в процессе и после написания кода.
- Использование окна «Контрольное значение»
Искренне надеюсь, что отладка программ AutoLISP стала для Вас теперь легкой, занимательной головоломкой.
Пишите в комментариях:
Была ли для Вас полезной информация, данная в этом уроке?
Какие способы отладки используете Вы?
На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?
Я с удовольствием отвечу на ваши комментарии.
Если вы хотите получать новости с моего сайта. Оформляйте подписку.
До новых встреч.
«Автор: Михаил Орлов»