Тема: Как из файла выбрать данные с координатами, соединить их линиями и повторить это для всей папки?
формат файлов *.IN4
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Отрасль → Геодезия и картография → Как из файла выбрать данные с координатами, соединить их линиями и повторить это для всей папки?
Чтобы отправить ответ, вы должны войти или зарегистрироваться
формат файлов *.IN4
В LISP'е практически не разбираюсь, но есть конкретная задача, возможно, кто-нибудь поможет, за что буду очень благодарен.
Есть папка с файлами типа *.IN4 приблизительно следующего формата:
#TN,
#
BL,
DS="6320410100",
SD="00",
BC="004",
SZ="га",
CS="3,6315",
HS="1",
GL=,
ZM=,
AB=0.1000,
PB=26.34,
MB=0.05,
N=1,NP="4105",X=29192.07,Y=15539.65,MX=0,MY=0,
N=2,NP="4102",X=29205.07,Y=15535.29,MX=0,MY=0,
N=3,NP="4101",X=29218.07,Y=15530.92,MX=0,MY=0,
N=4,NP="4122",X=29225.80,Y=15551.999,MX=0,MY=0,
N=5,NP="0498",X=29228.55,Y=15565.82,MX=0,MY=0,
N=6,NP="0500",X=29203.00,Y=15573.60,MX=0,MY=0
SR,
SC="0040143",
AD=,
NM,
MP="0",
AS=0.1000,
PS=126.34,
MS=0.05,
N=1,NP="4105",X=29192.07,Y=15539.65,MX=0,MY=0,
N=2,NP="4102",X=29205.07,Y=15535.29,MX=0,MY=0,
N=3,NP="4101",X=29218.07,Y=15530.92,MX=0,MY=0,
N=4,NP="4122",X=29225.80,Y=15551.999,MX=0,MY=0,
N=5,NP="0498",X=29228.55,Y=15565.82,MX=0,MY=0,
N=6,NP="0500",X=29203.00,Y=15573.60,MX=0,MY=0
Имя каждого файла уникально. В этих файлах описываются земельные участки. Задача следующая: надо все файлы из папки бросить в Автокад, причем каждый файл в отдельный слой, названный именем файла. Точки, описанные в файле нужно соединить линиями. Возможно, не совсем понятно написал, но если кто откликнется – объясню подробнее. НУ ОЧЕНЬ НАДО, ПОМОГИТЕ.
Я так понимаю это координаты углов.Почему их не вбить вручную,или их очень много?Есть еще вариант составить в Exel текстовый файл с координатами XYZ и номер точки,из этого можно получить точки в AutoCAD c номерами.
Очень много точек и много файлов. Поэтому руками все это делать сам понимаешь долго и нудно. Поэтому и хотелось, чтобы машина поработала
А не проще в экселе подредактировать и отправить в акад из экселя?
Может, Вам эту тему в форум LISP запостить. На самом то деле тут нужна программка проостенькая:-). Только сразу описывайте, что именно считывать из файла (я так поняла, что там часть информации дублируется, часть ненужная). В каком виде проставлять точки (ну там кружочек на месте точки, рядом номер или что?) И хотя бы примерно укажите путь к этим файлам на вашем компе.
Можно и без LISP обойтись, есть очень удобный текстовый редактор - Ultra Edit, можно в нем макрос написать, разобраться просто.
Вот пример формата, который можно импортировать в Land: обознацени столбцов - P номер точки, X (Nothing), Y (Easting), Z высота, D описание. Это формат PNEZD (comma delimited)
1,4475.9280,422.8890,378.9660,T3
2,4500.9560,235.5730,378.8220,T2
3,4503.9360,469.6510,380.8240,T4
4,4457.5920,473.9660,380.0740,T5
5,4391.3920,593.2460,381.2210,T6
Высота в Вашем примере не задана, поэтому в Format Menager (это в меню Points>Import\Export Point>Format Menager) или выберите другой ()более удобный для вас формат, или создайте свой (там кнопочка Add есть :)). Тогда в Ultra Edit останется только очистить файл от лишней информации.
Если понадобится помощь, пишите в мыло
Предупреждение! Кросс-постинг запрещен.
/Администратор./
Просьба к понимающим LISP - помогите.
В файле описывается земельный участок и его смежники, поэтому часть координат повторяется.
файл следующего содержания:
BL, DS="6320684500", SD="01", BC="000", CS="2,Х", SZ="га.", AB=3.1733, PB=743.0820, N=1,NP="447",X=5412095.39624079,Y=5375300.51869742,MX=0.05,MY=0.05, N=2,NP="35d0",X=5412015.10631953,Y=5375495.30506351,MX=0.05,MY=0.05, N=3,NP="35d1",X=5411853.96764392,Y=5375466.89196736,MX=0.05,MY=0.05, N=4,NP="452",X=5411903.68339873,Y=5375384.14108483,MX=0.05,MY=0.05, N=5,NP="448",X=5411949.90562587,Y=5375269.61756552,MX=0.05,MY=0.05 SR, SC="0000040", AD="Надеждинська сільська рада,-,-,-", NM="Пакулiн Володимир Владиславович", TX="паї", PF="1.1", VP="-", AU="804,-,Харківська область,Близнюківський район,с.Надеждине,-,-,-,-", KZ="20", FL="-", CM="рілля", TM="-,-,-,-", EV="-,-,-,-,-,-,-", KF="2494906232", PP="804,ПВ,ММ 807125", PV="ВЛ,-", PZ="РА,09.03.2004,№72,-", CV="2.1", TD="В,13.04.2004,ООО \"Земляне\",Лук'янчікова Є.М.", GA="-,-,-,-,-", LM="-,-,-,-,-,-,-", LS="-,-,-,-,-,-", LE="-,-,-,-,-,-,-,-,-,-,-,-,-", SL="-,-,-,-,-,-,-,-,-,-", MO="-,-,-,-", MP="0", AS=3.1733, PS=743.0820, N=1,NP="447",X=5412095.39624079,Y=5375300.51869742,MX=0.05,MY=0.05, N=2,NP="35d0",X=5412015.10631953,Y=5375495.30506351,MX=0.05,MY=0.05, N=3,NP="35d1",X=5411853.96764392,Y=5375466.89196736,MX=0.05,MY=0.05, N=4,NP="452",X=5411903.68339873,Y=5375384.14108483,MX=0.05,MY=0.05, N=5,NP="448",X=5411949.90562587,Y=5375269.61756552,MX=0.05,MY=0.05 CL, CI=1, LC="1", CN="5", LM="-,-,-,-,-,-,-", LS="-,-,-,-,-,-", LE="-,-,-,-,-,-,-,-,-,-,-,-,-", SL="-,-,-,-,-,-,-,-,-,-", MO="-,-,-,-", AL=3.1733, PL=743.0820, N=1,NP="447",X=5412095.3962,Y=5375300.5187,MX=0.05,MY=0.05, N=2,NP="35d0",X=5412015.1063,Y=5375495.3051,MX=0.05,MY=0.05, N=3,NP="35d1",X=5411853.9676,Y=5375466.8920,MX=0.05,MY=0.05, N=4,NP="452",X=5411903.6834,Y=5375384.1411,MX=0.05,MY=0.05, N=5,NP="448",X=5411949.9056,Y=5375269.6176,MX=0.05,MY=0.05 # #Блок Смежников Пакулiн Володимир Владиславович NB, NM="земельна дiлянка гр.Лiтвiнова В.О.", N=1,NP="35d0",X=5412015.10631953,Y=5375495.30506351,MX=0.05,MY=0.05, N=2,NP="35d1",X=5411853.96764392,Y=5375466.89196736,MX=0.05,MY=0.05 NB, NM="землi Надеждинської сiльської ради", N=1,NP="35d1",X=5411853.96764392,Y=5375466.89196736,MX=0.05,MY=0.05, N=2,NP="452",X=5411903.68339873,Y=5375384.14108483,MX=0.05,MY=0.05, N=3,NP="448",X=5411949.90562587,Y=5375269.61756552,MX=0.05,MY=0.05, N=4,NP="447",X=5412095.39624079,Y=5375300.51869742,MX=0.05,MY=0.05, N=5,NP="35d0",X=5412015.10631953,Y=5375495.30506351,MX=0.05,MY=0.05
есть программка (может, посмотрев как она работает, будет понятнее что мне нужно):
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; Программа для ввода протяженного участка из файла .in4 ; ; ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:ainput( / take_line take_value action file_ext cv_exe fp cv_line cv_desc new_sec_flag parsel_sec_flag x y x_prev y_prev x_first y_first scale_list osnap_var) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Функция выделения параметра из текущей строки .in4 файла ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun take_value (name cv_line / curr_name i curr_char curr_value name_flag value_flag cv_value ) (setq cv_value 'nil) (setq name_flag 'nil) (setq value_flag 'nil) (setq curr_name "") (setq curr_value "") (setq i 1) (setq curr_char ",") (while (/= curr_char "") (setq curr_char (substr cv_line i 1)) (progn (setq i (1+ i)) (if (and (/= curr_char ",") (/= curr_char "=")) (progn (if name_flag (setq curr_name (strcat curr_name curr_char)) (if value_flag (setq curr_value (strcat curr_value curr_char)) ) ) ) ) (if (= curr_char "=") (progn (setq name_flag 'nil) (setq value_flag 't) ) ) (if (or (= curr_char ",") (= curr_char "")) (progn (setq name_flag 't) (setq value_flag 'nil) (if (= name curr_name) (setq cv_value curr_value) ) (setq curr_name "") (setq curr_value "") ) ) ) ) (setq cv_value cv_value) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Функция определения центральной оси участка ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun axe( / axe_point axe_list) (if (setq axe_point (getpoint "\nУкажите первую точку оси")) (progn (setq axe_list (list axe_point)) (while (setq axe_point (getpoint "\nУкажите следующую точку оси")) (setq axe_list (append axe_list (list axe_point))) ) ) ) (if (< (length axe_list) 2) (setq axe_list 'nil)) (setvar "osmode" 0) (setq axe_list axe_list) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Функция переопределения координат точек ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun redef(curr_point axe_list / curr_point axe_list dest_point direction first second int_point i len prev curr next bis ) ;***** Переопределить координаты точек перпендикулярно оси ***** (setq i '0) (setq len (length axe_list)) ; Пока не просмотрены все точки оси (setq dest_point 'nil) (while (and (< i (1- len)) (not dest_point)) ; определить i-й отрезок оси (setq first (nth i axe_list)) (setq second (nth (1+ i) axe_list)) ; определить координаты искомой точки ; (если таковая имеется) (setq direction (+ (angle first second) (/ pi 2))) (if (setq int_point (inters first second curr_point (inters first second curr_point (polar curr_point direction '1.) 'nil) 'T ) ) (setq dest_point (polar int_point (angle int_point curr_point) (* (distance int_point curr_point) scale))) (setq dest_point 'nil) ) (setq i (1+ i)) ) ;***** Проверить не попадают ли точки на на изгибы оси ***** ;***** если да - переопределить координаты через точку изгиба ***** ;***** и текущую точку ***** (setq i '1) ; Пока не просмотрены все поворотные точки оси (while (< i (1- len)) ; определить координаты смежных отрезков (setq prev (nth (1- i) axe_list)) (setq curr (nth i axe_list)) (setq next (nth (1+ i) axe_list)) ; определить половину угла изгиба (setq delta (abs (- (angle prev curr) (angle curr next)))) (if (> delta pi) (setq delta (- delta pi))) (setq delta (/ delta 2)) ; определить бисектрису угла между ; смежными отрезками (setq bis (/ (+ (angle curr prev) (angle curr next)) 2)) (if (> bis pi) (setq bis (- bis pi))) ; определить направление из точки изгиба ; на текущую точку (setq direction (angle curr curr_point)) ; пересчитать координаты текущей точки ; если она попадает на изгиб (if (or (and (< (- bis delta) direction ) (> (+ bis delta) direction ) ) (and (< (- (+ bis pi) delta) direction ) (> (+ bis delta pi) direction ) ) ) (setq dest_point (polar curr (angle curr curr_point) (* (distance curr curr_point) scale))) ) (setq i (1+ i)) ) (if (not dest_point) (setq dest_point curr_point)) (setq dest_point dest_point) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Функция инициализации переменных ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun init() (if (not file) (setq file "")) (if (not scale) (setq scale '1.0)) (setq osnap_var (getvar "osmode")) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Функция вывода и обслуживания диалогового окна ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun menu( / exe dcl_id ) ;***** Вывести основную форму ***** (setq dcl_id (load_dialog "ainput.dcl")) (if (not (new_dialog "input_box" dcl_id))(exit)) ;***** Установить начальные значения компонент ***** (set_tile "scale" (rtos scale)) ;***** Обработка событий ***** (action_tile "scale" "(setq scale (atof (get_tile \"scale\")))") (action_tile "file" "(setq file (getfiled \"Файл для ввода\" file \"in4\" 6))") (action_tile "cancel" "(setq exe 'nil)(done_dialog)") (action_tile "accept" "(setq exe 't)(done_dialog)") (start_dialog) (setq exe exe) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun main() (progn (if (setq fp (open file "r")) (progn (setq cv_line ",") (setq new_sec_flag 'nil) (setq parsel_sec_flag 'nil) (while (/= (setq cv_line (read-line fp)) 'nil) (progn (setq cv_desc (substr cv_line 1 2)) (if (or (= cv_desc "BL") (= cv_desc "BR") (= cv_desc "SR") (= cv_desc "ST")) (progn (setq new_sec_flag 'T) (if parsel_sec_flag (progn (command "_line" (redef (list x_prev y_prev) axe_list) (redef (list x_first y_first) axe_list) "") (setq parsel_sec_flag 'nil) ) ) ) ) (if (= cv_desc "N=") (progn (setq parsel_sec_flag 'T) ; (setq x (atof (take_value "X" cv_line))) ; (setq y (atof (take_value "Y" cv_line))) (setq y (atof (take_value "X" cv_line))) (setq x (atof (take_value "Y" cv_line))) (if new_sec_flag (progn (setq x_first x y_first y) (setq x_prev x y_prev y) (setq new_sec_flag 'nil) ) (progn (command "_line" (redef (list x_prev y_prev) axe_list) (redef (list x y) axe_list) "") (setq x_prev x y_prev y) ) ) ) ) ) ) (if parsel_sec_flag (progn (command "_line" (redef (list x_prev y_prev) axe_list) (redef (list x_first y_first) axe_list) "") (setq parsel_sec_flag 'nil) ) ) (close fp) ) (alert "Не могу открыть файл !!!") ) ) ) (init) (if (and (menu) (setq axe_list (axe))) (main)) (setvar "osmode" osnap_var) )
и файл .dcl
//---------------------------------------------------------------------------- dcl_settings : default_dcl_settings { audit_level = 0; } input_box : dialog { label = "Импорт обменных файлов"; : boxed_column { label = "Участок"; : row { : text { label = "Масштаб:"; mnemonic = "М"; } : edit_box { label = ""; key = "scale"; width = 3; edit_limit = 3; } } : row { : button { label = "Файл..."; key = "file"; mnemonic = "Ф"; width = 11.7; fixed_width = true; } } } ok_cancel; }
Она бросает за один раз один файл, при этом после выбора файла надо два раза щелкнуть по экрану и нажать enter. Программка что-то там вычисляет, может и лишнее
А надо бросить много файлов, причем каждый файл на свой слой, названный именем файла.Путь к файлам примерно такой: E:\IN4. Точки подписывать не надо, кружки тоже не надо ставить, только сделать контур участка. Если невозможно сделать, чтобы бросались все файлы из папки, то помогите переделать мою программку, чтобы она хоть создавала слой по имени файла и бросала на него участок.
Попробуй, собрал на коленке. Скорее всего, не покатит =)
(defun c:ins-point (/ dir_path files_list item string_list file_handle string) (vl-load-com) (if (not *kpblc-activedoc*) (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of if (vla-startundomark *kpblc-activedoc*) (if (setq dir_path (getstring t "\nВведите путь к каталогу с файлами *.in4 : ")) (if (and (setq files_list (z-files-in-directory dir_path "*.in4" nil)) (> (length files_list) 0) ) ;_ end of and (progn (foreach item files_list (setq file_handle (open item "r") string_list nil ) ;_ end of setq (while (setq string (read-line file_handle)) (if (and (vl-string-search "X=" string) (vl-string-search "Y=" string) ) ;_ end of and (setq string_list (append string_list (list string))) ) ;_ end of if ) ;_ end of while ;; Теперь для данного файла получен список строк с координатами ;; точек ;; Надо в первую очередь создать слой. Имя слоя = имени файла (без ;; пути и ;; расширения) (vla-add (vla-get-layers *kpblc-activedoc*) (vl-filename-base item)) (vla-put-activelayer *kpblc-activedoc* (vla-item (vla-get-layers *kpblc-activedoc*) (vl-filename-base item) ) ;_ end of vla-item ) ;_ end of vla-put-ActiveLayer (command "_.pline") (foreach str_item string_list (command (list (atof (substr (substr str_item (+ 3 (vl-string-search "X=" str_item))) 1 (vl-string-search "," (substr str_item (+ 3 (vl-string-search "X=" str_item))) ) ;_ end of VL-STRING-SEARCH ) ;_ end of substr ) ;_ end of atof (atof (substr (substr str_item (+ 3 (vl-string-search "Y=" str_item))) 1 (vl-string-search "," (substr str_item (+ 3 (vl-string-search "Y=" str_item))) ) ;_ end of VL-STRING-SEARCH ) ;_ end of substr ) ;_ end of atof ) ;_ end of list ) ;_ end of command ) ;_ end of foreach (command "_close") ) ;_ end of foreach ) ;_ end of progn ) ;_ end of if ) ;_ end of if (vla-endundomark *kpblc-activedoc*) ) ;_ end of defun ;|======================================================================================= * функция z-files-in-directory возвращает список файлов находящаяся в заданной * директории * Автор : Зуенко Виталий (ZZZ) * Параметры: * directory путь к папке например "D:\\Мои документы\\ZEF\\Lisp" * pattern шаблон например "*.lsp" или список '("*.dwg" "*.dxf") * nested искать в вложенных папках: t (да) или nil (нет) * Пример вызова: (z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" "*.lsp" t) (z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" '("*.lsp" "*.fas") t) =======================================================================================|; (defun z-files-in-directory (directory pattern nested /) (if (not (listp pattern)) (setq pattern (list pattern)) ) ;_ if (if nested (apply 'append (append (mapcar '(lambda (_pattern) (mapcar '(lambda (f) (strcat directory "\\" f)) (vl-directory-files directory _pattern 1) ) ;_ list ) ;_ lambda pattern ) ;_ mapcar (mapcar '(lambda (d) (z-files-in-directory (strcat directory "\\" d) pattern nested ) ;_ z-files-in-directory ) ;_ lambda (vl-remove "." (vl-remove ".." (vl-directory-files directory nil -1) ) ;_ end of vl-remove ) ;_ vl-remove ) ;_ mapcar ) ;_ append ) ;_ append (apply 'append (mapcar '(lambda (_pattern) (mapcar '(lambda (f) (strcat directory "\\" f)) (vl-directory-files directory _pattern 1) ) ;_ list ) ;_ lambda pattern ) ;_ mapcar ) ;_ apply ) ;_ if ) ;_ defun
Ух ты, работает!!! Супер!!Спасибо огромное!!!
попробовал не нескольких папках, правда многовато лишних линий рисует, но это из-за того что координаты повторяются и с этим, наверное, ничего не сделаешь.Вот только с одной папкой проблемка-рисует-рисует, а потом
Command: ; error: Automation Error. Calling method SetObjectId of interface
IAcadBaseObject failed
может это из-за того что имя какого-то файла повторяется? Как можно ввести проверку? А если повторяются - менять имя слоя, например добавляя "zzz" в конце.
> Вадим
Да нет, сделать-то можно, только я не стал. Удаление повторяющихся координат реализовать не особо проблема, просто (поскольку не геодезист я) в таком случае нет никакой гарантии правильности построений.
Для ошибочной папки - скажи имя файла, на котором споткнулась прога, и можешь ради интересу прислать этот "спотыкачный" файл - гляну (скорее всего, ошибка на преобразовании текста в координаты - наверняка там в качестве разделителя стоит не ".", а нечто иное). Имя файла вряд ли повторяется, это не вызывает ошибку - просто уже имеющийся слой будет активирован. Можно вообще-то сделать вариант имени слоя с указанием полного пути (в заменой "\" на "-", например), но на фига такое? Представляешь, каково будет смотреть список слоев, ну хотя бы такой:
d-files-in4-part006-level01
d-files-in4-part006-level01-162
d-files-in4-part006-level01-178
d-files-in4-part006-level01-178-01-3265-2004-12-01
d-files-in4-part006-level02
d-files-in4-part006-level03
d-files-in4-part006-level04
d-files-in4-part006-level05
d-files-in4-part006-level06
?
Всем, кто откликнулся, БОЛЬШОЕ СПАСИБО!!!
Иногда выдавала программка ошибку из-за того что в имени файла был пробел, а так все отлично работает.
Неплохо было б создать программу, которая экпортировала акадовские данные в формате in4.
> Iгор
Напиши мне на e-mail - помогу с экспортом в *.in4
Всем привет!
Сам занимаюсь такой фигней, иногда приходится импортировать кучу in4.
Во первых, хочу заметить, что в Lips программке надо поменять местами Х и У, где рисуется полилиния.
Также, как вариант импорта кучи файлов, склеевание их в командной строке в один, а затем импортировать через ainput.lsp
И еще предложение-просьба, как бы так сделать, чтобы при рисовании участка, каждый "набор" координат рисовался новой полилинией (как вариант проверки на начало нового блока, отсутствие запятой в конце строки с координатами), по-моему тогда исчезнут ненужные линии.
Спасибо за внимание.
P.S. Благодарность посетителям форума за небезразличие к проблемам трудящихся :)
Вот доработанный код крЫс
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;Функция вызывает окно выбора папки ;;; ;;;Аргументы — нет ;;;Возвращаемое значение — путь к папке вида: ;;;disc:\\dir1\\....\\dirN ;;; ;;;Вызов (BrowseFolder) ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun BrowseFolder ( / ShlObj Folder FldObj OutVal) (vl-load-com) (setq ShlObj (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application" ) Folder (vlax-invoke-method ShlObj 'BrowseForFolder 0 "Укажите каталог с файлами *.in4" 0) ) (vlax-release-object ShlObj) (if Folder (progn (setq FldObj (vlax-get-property Folder 'Self) OutVal (vlax-get-property FldObj 'Path) ) (vlax-release-object Folder) (vlax-release-object FldObj) OutVal ) ) ) (defun c:ins-point (/ dir_path files_list item string_list file_handle string str_list pt_X pt_Y) (vl-load-com) (setvar "EXTNAMES" 1) (if (not *kpblc-activedoc*) (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of if (vla-startundomark *kpblc-activedoc*) (if (setq dir_path (BrowseFolder)) (if (and (setq files_list (z-files-in-directory dir_path "*.in4" nil)) (> (length files_list) 0) ) ;_ end of and (progn (foreach item files_list (setq file_handle (open item "r") string_list nil ) ;_ end of setq (while (setq string (read-line file_handle)) (setq str_list nil) (if (and (= (substr string 1 2) "N=") (vl-string-search "X=" string) (vl-string-search "Y=" string) ) (progn (setq str_list (append str_list (list string))) (while (and (setq string (read-line file_handle)) (= (substr string 1 2) "N=") (vl-string-search "X=" string) (vl-string-search "Y=" string) ) (setq str_list (append str_list (list string))) ) (setq string_list (append string_list (list str_list))) ) ) ) ;_ end of while (close file_handle) ;; Теперь для данного файла получен список строк с координатами ;; точек ;; Надо в первую очередь создать слой. Имя слоя = имени файла (без ;; пути и ;; расширения) (if (snvalid (vl-filename-base item)) (progn (vla-add (vla-get-layers *kpblc-activedoc*) (vl-filename-base item)) (vla-put-activelayer *kpblc-activedoc* (vla-item (vla-get-layers *kpblc-activedoc*) (vl-filename-base item) ) ;_ end of vla-item ) ;_ end of vla-put-ActiveLayer ) );_if (mapcar '(lambda (s ) (command "_.pline") (foreach str_item s (command (list (atof (substr (substr str_item (+ 3 (vl-string-search "Y=" str_item))) 1 (vl-string-search "," (substr str_item (+ 3 (vl-string-search "Y=" str_item))) ) ;_ end of VL-STRING-SEARCH ) ;_ end of substr ) ;_ end of atof (atof (substr (substr str_item (+ 3 (vl-string-search "X=" str_item))) 1 (vl-string-search "," (substr str_item (+ 3 (vl-string-search "X=" str_item))) ) ;_ end of VL-STRING-SEARCH ) ;_ end of substr ) ;_ end of atof ) ;_ end of list ) ;_ end of command ) ;_ end of foreach (command "_close") ) string_list ) ) ;_ end of foreach ) ;_ end of progn ) ;_ end of if ) ;_ end of if (vla-endundomark *kpblc-activedoc*) ) ;_ end of defun ;|======================================================================================= * функция z-files-in-directory возвращает список файлов находящаяся в заданной * директории * Автор : Зуенко Виталий (ZZZ) * Параметры: * directory путь к папке например "D:\\Мои документы\\ZEF\\Lisp" * pattern шаблон например "*.lsp" или список '("*.dwg" "*.dxf") * nested искать в вложенных папках: t (да) или nil (нет) * Пример вызова: (z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" "*.lsp" t) (z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" '("*.lsp" "*.fas") t) =======================================================================================|; (defun z-files-in-directory (directory pattern nested /) (if (not (listp pattern)) (setq pattern (list pattern)) ) ;_ if (if nested (apply 'append (append (mapcar '(lambda (_pattern) (mapcar '(lambda (f) (strcat directory "\\" f)) (vl-directory-files directory _pattern 1) ) ;_ list ) ;_ lambda pattern ) ;_ mapcar (mapcar '(lambda (d) (z-files-in-directory (strcat directory "\\" d) pattern nested ) ;_ z-files-in-directory ) ;_ lambda (vl-remove "." (vl-remove ".." (vl-directory-files directory nil -1) ) ;_ end of vl-remove ) ;_ vl-remove ) ;_ mapcar ) ;_ append ) ;_ append (apply 'append (mapcar '(lambda (_pattern) (mapcar '(lambda (f) (strcat directory "\\" f)) (vl-directory-files directory _pattern 1) ) ;_ list ) ;_ lambda pattern ) ;_ mapcar ) ;_ apply ) ;_ if ) ;_ defun
кстати здесь есть описание формата in4
http://www.vinnitsa.com/geo/Rus/Raspaevka.doc
Чуть-чуть дополнений:
- функция browsefolder не моя, ссылку Олег jr показывал недавно на исходный код
- функция z-files-in-directory впервые появилась здесь : https://www.caduser.ru/forum/topic19699.html
> kpblc
А, объектные данные сохраняются? Можно на результат посмотреть?
Если, не затруднит, бросьте в мыло небольшой .dwg
PS меня пока еще 2005
> Ольга_@@@
Не понял, что имелось в виду? Какие объектные данные? Результат чего?
Я ж не геодезист, я так, программист немного, и не больше.
В исходнике, помимо координат углов участка, содержатся другие сведения об участке: индивидуальный номер участка, административный район, адрес, владелец, обеспеченность инженерными сетями, номер землеотводного документа, дата выдачи, условия освоения, номер зоны в соответствии с регламентом, площадь, периметр и т.д. В приведенном примере я насчитала 27 столбцов в таблице, связанной с графическим изображением границ участка. Плюс сокращенные описания и координаты смежных участков... Что происходит с этими данными при вашем способе импорта?
Гхм... Ничего. Пока теряются.
Дело вот в чем. Была поставлена задача только построить границы участков, я так понимаю. Эти данные в файл не вносились никаким образом. Сделать-то не особо проблема в принципе - можно тексты сделать, можно - расширенные данные попробовать использовать, можно словари... Мест достаточно, чтобы свои данные запрятать. И потом (или сразу) вытащить.
Опять же, подчеркиваю, что я не спец в этих вещах, а объем ТЗ определяет качество выполненной работы.
> Ольга_@@@ (2006-05-23 15:32:55)Ничего. Рисуются только границы. Хотя не проблема реализовать, главное знать что сохранять. Мы у себя (в Минске) с форматом in4 не работаем. А так кадастровая информация хранится в расширенных данных примитива.
с потерей объектных данных теряется 90% информации приведенного в пример файла...
> Ольга_@@@
Господи, ну дайте полное ТЗ с полным описанием, что где хранится и как это показывать на файле, надо ли сохранять в данных примитивов - в общем, полное ТЗ. Вот тогда и будет программа, выполняющая Ваши требования в указанном Вами объеме.
P.S. btw, ко мне, если можно - на "ты".
Я в таких ситуациях, если надо импортировать всю информацию, пока выкручиваюсь следующим образом. Заранее знаю, что не права, но лично мне так проще. Я привожу подобные файлы к виду, соответствующему mif/mid и импортирую их в AutoDesk Map штатными средствами. Объектные данные при этом сохраняются и могут быть использованы в последующей работе для составления запросов. При необходимости Мар может их выгрузить во внешнюю базу, связанную с графикой, ессно.
Примерчик.mid
"6320684500","га.",3.1733,743.0820,"0000040","Надеждинська сільська рада","Пакулiн Володимир Владиславович","паї","1.1","804,-,Харківська область,Близнюківський район,с.Надеждине","20","рілля","2494906232","804,ПВ,ММ 807125","ВЛ,-","РА,09.03.2004,№72,-","2.1","В,13.04.2004,ООО \"Земляне\",Лук'янчікова Є.М."
Примерчик.mif
Version 2
Delimiter ","
CoordSys NonEarth Units "m" Bounds (40000000,40000000) (60000000,60000000)
Columns 18
01DS Char(20)
02SZ Char(50)
03AB Float
04PB Float
05SC Char(50)
06AD Char(50)
07NM Char(50)
08TX Char(50)
09PF Char(50)
10AU Char(50)
11KZ Char(50)
12CM Char(50)
13KF Char(50)
14PP Char(50)
15PV Char(50)
16PZ Char(50)
17CV Char(50)
18TD Char(50)
Data
Region 1
5
5412095.39624079 5375300.51869742
5412015.10631953 5375495.30506351
5411853.96764392 5375466.89196736
5411903.68339873 5375384.14108483
5411949.90562587 5375269.61756552
Прошу прощения, что удалила часть колонок и смежества.
Эти файлы получены в Ultra Edit-32, все сделано автозаменами (Сtrl+R). Там же возможна автоматическая запись макроса и пакетная обработка файлов.
Суета это, конечно... но, другого способа я не знаю.
Но, великая лентяйская МЕЧТА о большой красной кнопке жива :))))
Может сбудется? Вы можете считать это расширенным ТЗ?
Ура???
PS Прошу не считать это требованием, это - просьба :)
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Отрасль → Геодезия и картография → Как из файла выбрать данные с координатами, соединить их линиями и повторить это для всей папки?
Форум работает на PunBB, при поддержке Informer Technologies, Inc