Re: LISP. Рисование точек с номерами по координатам из внешнего файла
> прохожий
pancake - блин, ^~ (^Ё) - мои собственные ругательства. Но это уже жуткий оффтопик.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Готовые программы → LISP. Рисование точек с номерами по координатам из внешнего файла
Чтобы отправить ответ, вы должны войти или зарегистрироваться
> прохожий
pancake - блин, ^~ (^Ё) - мои собственные ругательства. Но это уже жуткий оффтопик.
pancake - блин, ^~ (^Ё) - мои собственные ругательства. Но это уже жуткий оффтопик
ААААААААААААААААААААААААААААА!
Ну тада панятна!
У меня после всех запросов проги, вместо построения точек пишется текст: bad argument type: streamp nil. Что это за ерунда?
> VOVAMAT
Код? Тут вариантов кода было мама не горюй. Да еще и по личке несколько вариантов, по-моему, промелькнуло.
> kpblc (2005-11-21 08:36:34)
Уважаемый kpblc,
может и не актуально, но желающим уточнение не помешает:
1. bad argument type: streamp nil выдается из-за ошибки в коде программы: file_name или file-name?
2. Может проясните и для меня неясное, по поводу открытия файла. Если я в
(setq file_name (getstring "\nВведите имя файла : "))
указываю только имя файла без полного пути, модуль не работает, несмотря на то, что путь в файлах поддержки прописан.
Так и должно быть? или это "глюк".
Спасибо за полезный модуль.
> gas
По п.1 - не понял, если честно. Имена переменных сделаны "как надо". Если можно, то пришли файл, на котором сбоит (хотя бы часть).
По п.2 - ну в общем-то да, не планировалось, что файл будет в путях поддержки. Немного доработанная функция выглядит таким манером (заменить в исходном):
(defun c:mk-point (/ file_name _answer_ text_height offset) ;; Локальные функции (defun *error* (msg) (princ msg) (lib:error-restore-sysvar) ) ;_ end of defun ;; Конец локальных функций (setq file_name (getstring t "\nВведите имя файла : ")) (if (and file_name (setq file_name (findfile file_name)) ) ;_ end of and (progn (lib:error-save-sysvar '(("osmode" 0))) (initget "Да Нет Yes No _ Yes No Yes No") (setq _answer_ (getkword "\nВыполнять автоматическую нумерацию [Да/Нет] <Нет>? : " ) ;_ end of getkword ) ;_ end of setq (setq _answer_ (= _answer_ "Yes")) (if (= (lib:ent-get-dxf-data (tblsearch "style" (getvar "textstyle")) 40) 0.0 ) ;_ end of = (progn (setq text_height (getreal "\nВведите высоту текста для нумерации <2.5> : ") ) ;_ end of setq (if (not text_height) (setq text_height 2.5) ) ;_ end of if (setq offset (getreal "\nВведите значение смещения текста <0.0> : ")) (if (not offset) (setq offset 0.0) ) ;_ end of if ) ;_ end of progn (setq text_height (lib:ent-get-dxf-data (tblsearch "style" (getvar "textstyle")) 40) ) ;_ end of setq ) ;_ end of if (_kpblc-make-points file_name _answer_ text_height offset) ) ;_ end of progn ) ;_ end of if (lib:error-restore-sysvar) ) ;_ end of defun
Код не проверял, т.к. возможности сейчас никакой, увы. Если что - прошу в почту.
У меня аналогичная задача решаеся (на VBA) следующим образом: данные с тахеометра заносятя в Excel, там (если нужно сортируются), подготавливаются и записываются в отдельные текстовые файл, а потом уже из шаблона AutoCAD-а
программа считывает эти обычные текстовые файлы и, напрммер, вставляев блоки - условные знаки в определенные слои и т.д
У меня немного аналогичная задача, но нужно построить линию из 2-х точек и относительно её под заданным углом поставить точку на заданном расстоянии и пронумировать её. данные нужно брать из экселя.
Я просмотрел код макроса и ничего там знакомого не нашел. вопрос к спецам : можно ли такое оформить на ВБА(просто я с ним знаком)
Кто подскажет по совмещению Autodesk Map и Autodesk Land ,после переустановки винда никак не могу их обьединить.
Файл для вставки координат должен иметь следующий вид:
№ точки коорд.X коорд.Y высота H (разделитель пробел) программа воспринимает разделитель целой и дробной части в виде точки,запятые не воспринимаются
1 100.00 120.20 180.00
2 120.00 150.14 180.15
3 150.00 130.40 180.07
В данной прогр. реализуется проставление № точек по их координатам из txt файла опсианного выше:
(defun C:POINTIMPORT ()
(if (not (tblsearch "BLOCK" "TOPO_POINT"))
(progn
(entmake
(mapcar 'cons
(list 0 8 2 70 10 3)
(list "BLOCK" "0" "TOPO_POINT" 2 '(0 0 0) "TOPO_POINT")))
(entmake
(mapcar 'cons
(list 0 8 62 10 210 50)
(list "POINT" "0" 0 '(0 0 0) '(0 0 1) 0.0)))
(entmake
(mapcar 'cons
(list 0 8 62 10 40 70 1 210 3 2)
(list "ATTDEF" "0" 0 '(1 1 0) 2.5 0 "" '(0 0 1) "Номер точки" "TOPO_POINT_NUMBER")))
(entmake
(mapcar 'cons
(list 0 8)
(list "ENDBLK" "0")))))
;
(if (not (tblsearch "STYLE" "TOPO"))
(progn
(command "_.STYLE" "TOPO" "TXT.SHX" "0" "1.0" "0" "" "" "")
))
(setq layername (getstring T "\nИмя слоя для точек: "))
(if
(progn
(setq filename (getfiled "Файл данных" "" "txt" 0))
(if filename
(setq f (open filename "r"))))
(while (setq s (read-line f))
(setq l (read (strcat "(" s ")")))
(mapcar 'set (list 'n 'y 'x 'z) l)
(entmake
(mapcar 'cons
(list 0 8 62 66 2 10 210)
(list "INSERT" layername 256 1 "TOPO_POINT" (list x y 0) '(0 0 1))))
(entmake
(mapcar 'cons
; (list 0 8 62 10 40 1 2 70 210)
; (list "ATTRIB" layername 256 (append (mapcar '1+ (list (- x 0.75) (- y 0.75))) (list z)) 0.8 (itoa n) "TOPO_POINT_NUMBER" 0 '(0 0 1))))
(list 0 7 8 62 10 40 1 2 70 210)
(list "ATTRIB" "TOPO" layername 256 (append (mapcar '1+ (list (- x 0.75) (- y 0.75))) (list (- z z))) 0.8 (itoa n) "TOPO_POINT_NUMBER" 0 '(0 0 1))))
(entmake
(mapcar 'cons
(list 0 8 62)
(list "SEQEND" layername 256))))
(prompt "\nФайл не найден."))
(prin1)
)
В данной прогр. реализуется проставление высот точек по их координатам из txt файла опсианного выше:
(defun C:POINTIMPORT_H ()
(if (not (tblsearch "BLOCK" "TOPO_POINT"))
(progn
(entmake
(mapcar 'cons
(list 0 8 2 70 10 3)
(list "BLOCK" "0" "TOPO_POINT" 2 '(0 0 0) "TOPO_POINT")))
(entmake
(mapcar 'cons
(list 0 8 62 10 210 50)
(list "POINT" "0" 0 '(0 0 0) '(0 0 1) 0.0)))
(entmake
(mapcar 'cons
(list 0 8 62 10 40 70 1 210 3 2)
(list "ATTDEF" "0" 0 '(1 1 0) 2.5 0 "" '(0 0 1) "Номер точки" "TOPO_POINT_NUMBER")))
(entmake
(mapcar 'cons
(list 0 8)
(list "ENDBLK" "0")))))
;
(if (not (tblsearch "STYLE" "TOPO"))
(progn
(command "_.STYLE" "TOPO" "TXT.SHX" "0" "1.0" "0" "" "" "")
))
(setq layername (getstring T "\nИмя слоя для точек: "))
(if
(progn
(setq filename (getfiled "Файл данных" "" "txt" 0))
(if filename
(setq f (open filename "r"))))
(while (setq s (read-line f))
(setq l (read (strcat "(" s ")")))
(mapcar 'set (list 'n 'y 'x 'z) l)
(entmake
(mapcar 'cons
(list 0 8 62 66 2 10 210)
(list "INSERT" layername 256 1 "TOPO_POINT" (list x y 0) '(0 0 1))))
(entmake
(mapcar 'cons
; (list 0 8 62 10 40 1 2 70 210)
; (list "ATTRIB" layername 256 (append (mapcar '1+ (list (- x 0.5) (- y 1.9))) (list z)) 0.8 (rtos z) "TOPO_POINT_NUMBER" 0 '(0 0 1))))
(list 0 7 8 62 10 40 1 2 70 210)
(list "ATTRIB" "TOPO" layername 256 (append (mapcar '1+ (list (- x 0.5) (- y 1.9))) (list (- z z))) 0.8 (rtos z) "TOPO_POINT_NUMBER" 0 '(0 0 1))))
(entmake
(mapcar 'cons
(list 0 8 62)
(list "SEQEND" layername 256))))
(prompt "\nФайл не найден."))
(prin1)
)
Спасибо Дмитрию за выложенные LISP'ы. это как раз то что мне нужно. Сама я только начинаю с ними работать, поэтому еще не все получается. Очень хотелось, что бы кто-то помог сделатьь так, что бы одновременно выносились номера точек и отметки высот. так как поправить самостоятельно у меня совсем не получается.
Спасибо.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → Готовые программы → LISP. Рисование точек с номерами по координатам из внешнего файла
Форум работает на PunBB, при поддержке Informer Technologies, Inc