Попросил я сгенерировать код на Autolisp чтобы он работал в nanoCAD и он конечно же генерирует ошибки. А их довольно трудно отладить, так как nanoCAD даже не указывает номер строки где была ошибка (как мне не хватает VisualLISP). Не поможете мне немного поправить программу?
Задание:
Необходимо запросить имя файла с расширением CSV и указанием пути его сохранения, а затем открыть его для записи. Необходимо циклично получать данные от пользователя и в конце цикла записывать их в файл одной строкой до тех пор пока первый ввод данных не окажется пустым и затем закрыть файл и завершить работу программы. Во время работы цикла необходимо просить выбрать в текущем чертеже однострочный текст и назвать запрос “введите имя куста”. К полученному из чертежа тексту добавить ; и записать в файл. Попросить пользователя выбрать полилинию и назвать запрос “укажите ндс”. Проверить количество вершин выбранной полилинии и если их больше 2, то сообщить об ошибке и попросить указать другую полилинию. Попросить пользователя выбрать точку на экране с запросом “укажите начало ндс” . Вычислить какая из точек выбранной ранее полилинии ближе всего к выбранной точке и из этой точки поликлиники нарисовать отрезок длинной 10 единиц вертикально вверх. Записать в файл координату x точки из которой был нарисован отрезок и добавить ; Записать в файл координату y точки из которой был нарисован отрезок и добавить ; Вычислить угол между нарисованным отрезком и выбранной полилинией и записать его в файл добавив ; Запись данных во время одного цикла производить в одну строку файла. Удалить нарисованный отрезок. Запустить следующий цикл.
Результат:
;; Функция для открытия файла CSV и получения имени файла
(defun GetCSVFile ()
(setq fileName (getfiled “Select CSV File to Save Data” “” “csv” 16))
(if (= nil fileName)
(progn
(princ "
No file selected. Exiting program.")
(exit)
)
)
(open fileName “w”)
)
;; Функция для вычисления расстояния между двумя точками
(defun DistanceBetweenPoints (pt1 pt2)
(sqrt (+ (expt (- (car pt2) (car pt1)) 2) (expt (- (cadr pt2) (cadr pt1)) 2)))
)
;; Функция для нахождения ближайшей точки полилинии к заданной точке
(defun FindClosestVertex (pline pt)
(setq plinePts (vlax-safearray->list (vla-get-coordinates (car pline))))
(setq minDist nil)
(foreach vertex plinePts
(setq dist (DistanceBetweenPoints vertex pt))
(if (or (null minDist) (< dist minDist))
(progn
(setq minDist dist)
(setq closestPt vertex)
)
)
)
closestPt
)
;; Основная функция программы
(defun c:MainProgram (/ csvFile outputString textObj polyline ndsPoint closestPt lineStartAngle lineEndAngle)
(vl-load-com)
)