Импорт точек из файла .job & .are
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Импорт точек из файла .job & .are

Импорт точек из файла .job & .are

Ответ
Поиск в этой теме
Непрочитано 19.08.2009, 05:45 #1
Импорт точек из файла .job & .are
G-RAV
 
Геодезист
 
г.Новосибирск
Регистрация: 16.08.2009
Сообщений: 86

Написал код для импорта точек .job или .are в Автокад минуя Кредо_Дат, полученных по результатам геодезической съемки прибором Trimble Geodimetr 600. С условием, что съемка велась от исходных пунктов с известными координатами ( в приборе). Буду рад полезной критике, т.к. только начинаю программировать.
Код:
[Выделить все]
 
(defun import_job&are (/)
; отключаем вывод сообщений в командную строку
(setvar "cmdecho" 0)
;;Запоминание привязки, и текущего слоя и цвета
(setq AAA (getvar "osmode"))
;выбираем файл присваеваем File
(setq File (getfiled "Выберите файл с расширением job & are для загрузки в Autocad"  (getvar "dwgprefix") "job;are" 8)) 
;вывод сообщения "Идет работа"
(print "Идет работа")
;поиск файла File присваеваем f
(setq f(findfile File))
;открываем f для чтения
(setq f(open f "r"))
;считываем первую строку Stroka файла f
(setq Stroka(read-line f))
;Начало цикла While до пустой строки
(While(/= Stroka nil)
  ;Начало подцикла While до "0=Measured point" или ">"
  (While(and(/= Stroka "0=Measured point")
 (/= Stroka ">"))
    ;условие на "15=" ищем имя для слоя (на текущей строке)
    (if(=(substr Stroka 1 3) "15=")
  (setq name (substr Stroka 4)))
      ;условие на "5=" ищем имя точки (на текущей строке)
      (if(=(substr Stroka 1 2) "5=")
  (setq a1 (substr Stroka 3)))
      ;условие на "2=" ищем имя точки стояния (на текущей строке)
  (if(=(substr Stroka 1 2) "2=")
  (setq a1 (substr Stroka 3)))
      ;условие на "62=" ищем имя точки ориентирования (на текущей строке)
  (if(=(substr Stroka 1 3) "62=")
  (setq a1 (substr Stroka 4)))
  ;условие на "37=" ищем координату Х точки (на текущей строке)  
  (if (=(substr Stroka 1 3) "37=")
  (setq a3 (substr Stroka 4)))
  ;условие на "38=" ищем координату У точки (на текущей строке)  
  (if (=(substr Stroka 1 3) "38=")
 (setq a4 (substr Stroka 4)))
  ;условие на "39=" ищем высоту точки (на текущей строке)  
  (if(=(substr Stroka 1 3) "39=")
   (setq a5 (substr Stroka 4)))
    ;переход на следующую строку
    (setq Stroka(read-line f))
  );Конец подцикла While до "0=Measured point" или ">"
 
;Ряд операций по отрисовки точек
(progn
(command"_layer""_m" name "") ;Устанавливаем текущем и Рисуем в слое name
  (setq Npiketa a1);Присваеваем Npiketa значение a1
  (setq XYmat (list (atof a4)(atof a3)));Преобразуем в вещественные и объеденяем в список координаты
          (setq Otmetka (rtos(atof a5)2 2));Преобразуем в вещественное и округляем до десятых значение Otmetka
(if(= Otmetka "0.00") (setq Otmetka "Б/В"));Если значение Otmetka=0.00 то заменяем его на Б/В
(command"_osnap" "_non")
(command"_insert" "piket_s"  XYmat 1 1 0 Npiketa Otmetka "" "");вставка блока piket_s
    );Конец операций по отрисовки точек
(setq Stroka(read-line f));переход на следующую строку
(setq a1 "" a3 "" a4 "" a5 "");обнуление аргуменов
 ) ;Конец цикла While до пустой строки
(close f);Закрытие файла
(command "_zoom" "_E" );Показать видимые элементы чертежа
(setvar "osmode" AAA);;Восстановление привязки, и текущего слоя  
(alert "Загрузка закончена")
  )
(import_job&are)
И помогите, кто может, создать DCL. Где можно было бы выставлять точность отметки (Н), задавать имя слоя (имя, заданное при съемке ("15=" по умолчанию), и самое главное выбирать цвет слоя из палитры, можно еще и шкалу прогресса, но не так уж важно как остальное.

P.S. Прикрепляю Рисунок.dwg, содержащий необходимый блок
И архив со съемочным файлом

Вложения
Тип файла: zip 300-позиция.zip (6.1 Кб, 123 просмотров)
Тип файла: dwg
DWG 2004
Рисунок1.dwg (106.9 Кб, 1456 просмотров)

Просмотров: 9393
 
Непрочитано 19.08.2009, 08:33
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Почему-то у меня открывается пустой чертеж по 2-й ссылке...
Do$ вне форума  
 
Непрочитано 19.08.2009, 09:27
#3
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Это в новых автокадах атрибуты задаются в command?. У меня 2008 говорит неизвесная команда.
Victor вне форума  
 
Непрочитано 19.08.2009, 09:36
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


У автора, похоже, изменена attdia...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.08.2009, 09:54
#5
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Сам чертеж пустой, но содержит блок "piket_s" (можно увидеть в редакторе блоков), который состоит из точки и 4-х атрибутов(NN-номер, H_FAKT-фактическая отметка, delta_H - превышение факта от проекта, H_PROEKT - проектная отметка. На счет 2008-го не знаю, потому как делал все в 6-м...
G-RAV вне форума  
 
Непрочитано 19.08.2009, 10:33
#6
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Мне просто любопытно. Без строки (setvar "attreq" 0) запрашивает атрибут. Со строкой - неизвесная команда.
Victor вне форума  
 
Непрочитано 19.08.2009, 10:36
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Victor, attreq и attdia немного разные вещи.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.08.2009, 10:46
#8
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


вообще не понимаю о чем вы! В работе, руководствуюсь литературой Николая Полещука, там я не нашел в системных переменных attreq и attdia. У кого-нить кроме меня вообще работает??
G-RAV вне форума  
 
Непрочитано 19.08.2009, 10:57
#9
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Заработало. Когда установил (setvar "attdia" 0). Только точка вставки блока странная. Может только у меня
Victor вне форума  
 
Автор темы   Непрочитано 19.08.2009, 11:06
#10
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Цитата:
Сообщение от Victor Посмотреть сообщение
Заработало. Когда установил (setvar "attdia" 0). Только точка вставки блока странная. Может только у меня
А что именно странного?
Вкладываю рисунок.dwg - то что должно получится..
Вложения
Тип файла: dwg
DWG 2004
Рисунок1.dwg (97.8 Кб, 1070 просмотров)
G-RAV вне форума  
 
Непрочитано 19.08.2009, 11:25
#11
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Точка вставки блока где-то в стороне от блока.
Victor вне форума  
 
Непрочитано 19.08.2009, 11:49
#12
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


ага, есть такое
Do$ вне форума  
 
Автор темы   Непрочитано 19.08.2009, 12:23
#13
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Поставил себе 2008-й.. Все работает.. И точки вставляются в соответствии с координатами в файле..
G-RAV вне форума  
 
Непрочитано 19.08.2009, 13:12
#14
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Господа, позвольте мне, в целях повышения уровня собственной образованности если не прав - пинайте
Код:
[Выделить все]
(defun import_job&are (/) 
;_можно название поменять на C:import_job&are, чтоб запускать командой 
;_неплохо было б указать локальные переменные после /
; отключаем вывод сообщений в командную строку
(setvar "cmdecho" 0)
;_если уж совсем по правильному, то исходное значение "cmdecho" тоже 
;_надо сохранять и потом восстанавливать 
;;Запоминание привязки, и текущего слоя и цвета
(setq AAA (getvar "osmode"))
;выбираем файл присваеваем File
(setq File (getfiled "Выберите файл с расширением job & are для загрузки в Autocad"  (getvar "dwgprefix") "job;are" 8)) 
;вывод сообщения "Идет работа"
(print "Идет работа")
;поиск файла File присваеваем f
(setq f(findfile File)) ;_а зачем его искать? мы ж его указываем.
;открываем f для чтения
(setq f(open f "r"))
;считываем первую строку Stroka файла f
(setq Stroka(read-line f))
;Начало цикла While до пустой строки
;_насчет прогресс-бара, благодаря Александру Ривилису есть такая возможность
;_но не уверен, что с циклом при помощи while можно его использовать
(While(/= Stroka nil)
  ;Начало подцикла While до "0=Measured point" или ">"
  (While(and(/= Stroka "0=Measured point")
 (/= Stroka ">"))
;_а далее вместо кучи if можно использовать cond
    ;условие на "15=" ищем имя для слоя (на текущей строке)
    (if(=(substr Stroka 1 3) "15=")
  (setq name (substr Stroka 4)))
      ;условие на "5=" ищем имя точки (на текущей строке)
      (if(=(substr Stroka 1 2) "5=")
  (setq a1 (substr Stroka 3)))
      ;условие на "2=" ищем имя точки стояния (на текущей строке)
  (if(=(substr Stroka 1 2) "2=")
  (setq a1 (substr Stroka 3)))
      ;условие на "62=" ищем имя точки ориентирования (на текущей строке)
  (if(=(substr Stroka 1 3) "62=")
  (setq a1 (substr Stroka 4)))
  ;условие на "37=" ищем координату Х точки (на текущей строке)  
  (if (=(substr Stroka 1 3) "37=")
  (setq a3 (substr Stroka 4)))
  ;условие на "38=" ищем координату У точки (на текущей строке)  
  (if (=(substr Stroka 1 3) "38=")
 (setq a4 (substr Stroka 4)))
  ;условие на "39=" ищем высоту точки (на текущей строке)  
  (if(=(substr Stroka 1 3) "39=")
   (setq a5 (substr Stroka 4)))
    ;переход на следующую строку
    (setq Stroka(read-line f))
  );Конец подцикла While до "0=Measured point" или ">"
 
;Ряд операций по отрисовке :) точек
(progn
(command"_layer""_m" name "") ;Устанавливаем текущем и Рисуем в слое name
  (setq Npiketa a1);Присваеваем Npiketa значение a1
;_от переменной Npiketa можно избавиться, сразу передавать в command a1 
  (setq XYmat (list (atof a4)(atof a3)));Преобразуем в вещественные и объеденяем в список координаты
;_список тоже можно сразу загнать в command минуя сохранение в переменной
          (setq Otmetka (rtos(atof a5)2 2));Преобразуем в вещественное и округляем до десятых значение Otmetka
(if(= Otmetka "0.00") (setq Otmetka "Б/В"));Если значение Otmetka=0.00 то заменяем его на Б/В
;_от переменной Otmetka тоже можно избавиться...
(command"_osnap" "_non")
(command"_insert" "piket_s"  XYmat 1 1 0 Npiketa Otmetka "" "");вставка блока piket_s
    );Конец операций по отрисовке точек
(setq Stroka(read-line f));переход на следующую строку
(setq a1 "" a3 "" a4 "" a5 "");обнуление аргуменов
 ) ;Конец цикла While до пустой строки
(close f);Закрытие файла
(command "_zoom" "_E" );Показать видимые элементы чертежа
(setvar "osmode" AAA);;Восстановление привязки, и текущего слоя  
(alert "Загрузка закончена")
  )
(import_job&are)
Это по оформлению в основном... А так, если работает - то хорошо
DCL могу накидать, если нарисуешь как он должен выглядеть и поподробнее расскажешь что требуется от диалога.
А цвет можно выбрать из лиспа прямо, без DCL (ф-ция acad_colordlg например.)

Последний раз редактировалось Do$, 19.08.2009 в 13:24.
Do$ вне форума  
 
Автор темы   Непрочитано 19.08.2009, 13:23
#15
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Наконец-то я дождался хоть какой то критики.. Спасибо, Do$! У меня еще ко всему прочему и с русским языком проблемы.. И точка вставки действительно где-то в стороне, и не могу понять почему... А код попробую поправить и выложу...
G-RAV вне форума  
 
Непрочитано 19.08.2009, 13:31
#16
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от G-RAV Посмотреть сообщение
И точка вставки действительно где-то в стороне, и не могу понять почему...
Сам блок поправь, в редакторе блоков перенеси все за центральную точку в начало координат
Do$ вне форума  
 
Непрочитано 19.08.2009, 13:51
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,409


Добавлю: нет обработчика ошибок; чтение файла выполняется вместе с рисованием (что в принципе лично я не считаю нормальным решением: желательно сначала прочитать файл, преобразовать данные с список и потом уже выполнять вставку блоков). Ну и плюс добавить обработку системных переменных attdia, attreq.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.08.2009, 14:43
#18
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Вроде бы поправил, правда не все:
Код:
[Выделить все]
 
(defun C:import_job&are (/ f Stroka name a1 a3 a4 a5) 
;_можно название поменять на C:import_job&are, чтоб запускать командой 
;_неплохо было б указать локальные переменные после / сделал
; отключаем вывод сообщений в командную строку
(setq BBB (getvar "cmdecho"))
(setvar "cmdecho" 0)
;_если уж совсем по правильному, то исходное значение "cmdecho" тоже 
;_надо сохранять и потом восстанавливать сделал
;;Запоминание привязки, и текущего слоя и цвета
(setq AAA (getvar "osmode"))
;выбираем файл присваеваем File
(setq File (getfiled "Выберите файл с расширением job & are для загрузки в Autocad"
       (getvar "dwgprefix") "job;are" 8)) 
;вывод сообщения "Идет работа"
(print "Идет работа")
;поиск файла File присваеваем f
(setq f(findfile File)) ;_а зачем его искать? мы ж его указываем.
   ; в противном случае ошибка: неверный тип аргумента: FILE nil
;открываем f для чтения
(setq f(open f "r"))
;считываем первую строку Stroka файла f
(setq Stroka(read-line f))
;Начало цикла While до пустой строки
;_насчет прогресс-бара, благодаря Александру Ривилису есть такая возможность
;_но не уверен, что с циклом при помощи while можно его использовать
(While(/= Stroka nil)
  ;Начало подцикла While до "0=Measured point" или ">"
  (While(and(/= Stroka "0=Measured point")
 (/= Stroka ">"))
;_а далее вместо кучи if можно использовать cond сделал
    ;условие на "15=" ищем имя для слоя (на текущей строке)
    (cond((=(substr Stroka 1 3) "15=")
  (setq name (substr Stroka 4)))
      ;условие на "5=" ищем имя точки (на текущей строке)
  ((=(substr Stroka 1 2) "5=")
  (setq a1 (substr Stroka 3)))
      ;условие на "2=" ищем имя точки стояния (на текущей строке)
  ((=(substr Stroka 1 2) "2=")
  (setq a1 (substr Stroka 3)))
      ;условие на "62=" ищем имя точки ориентирования (на текущей строке)
  ((=(substr Stroka 1 3) "62=")
  (setq a1 (substr Stroka 4)))
  ;условие на "37=" ищем координату Х точки (на текущей строке)  
  ((=(substr Stroka 1 3) "37=")
  (setq a3 (substr Stroka 4)))
  ;условие на "38=" ищем координату У точки (на текущей строке)  
  ((=(substr Stroka 1 3) "38=")
 (setq a4 (substr Stroka 4)))
  ;условие на "39=" ищем высоту точки (на текущей строке)  
  ((=(substr Stroka 1 3) "39=")
   (setq a5 (substr Stroka 4))))
    ;переход на следующую строку
    (setq Stroka(read-line f))
  );Конец подцикла While до "0=Measured point" или ">"
 
;Ряд операций по отрисовке :) точек
(progn
(command"_layer""_m" name "") ;Устанавливаем текущем и Рисуем в слое name
;_от переменной Npiketa можно избавиться, сразу передавать в command a1 - сделал
;_список тоже можно сразу загнать в command минуя сохранение в переменной - сделал
(setq Otmetka (rtos(atof a5)2 2));Преобразуем в вещественное и округляем до десятых значение Otmetka
(if(= Otmetka "0.00") (setq Otmetka "Б/В"));Если значение Otmetka=0.00 то заменяем его на Б/В
;_от переменной Otmetka тоже можно избавиться...
; а как? на нее же условие??
(command"_osnap" "_non")
(command"_insert" "piket_s"  (list (atof a4)(atof a3)) 1 1 0 a1 Otmetka "" "");вставка блока piket_s
    );Конец операций по отрисовке точек
(setq Stroka(read-line f));переход на следующую строку
(setq a1 "" a3 "" a4 "" a5 "");обнуление аргуменов
 ) ;Конец цикла While до пустой строки
(close f);Закрытие файла
(command "_zoom" "_E" );Показать видимые элементы чертежа
(setvar "osmode" AAA);;Восстановление привязки, и текущего слоя
(setvar "cmdecho" BBB)  
(alert "Загрузка закончена")
)
На счет обработчика ошибок и системных переменных attdia, attreq вообще не секу, если можно по-подробнее, буду очень признателен.

Последний раз редактировалось G-RAV, 19.08.2009 в 14:52. Причина: Добавление
G-RAV вне форума  
 
Непрочитано 19.08.2009, 15:01
#19
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Как-то так можно:
Код:
[Выделить все]
(setq  
  f
    (open
      (setq
	file
	 (getfiled
	   "Выберите файл с расширением job & are для загрузки в Autocad"
	   (getvar "dwgprefix")
	   "job;are"
	   8
	 ) ;_ end of getfiled
      ) ;_ end of setq
      "r"
    ) ;_ end of open
) ;_ end of setq
И вот так:
Код:
[Выделить все]
(command
  "_insert"
  "piket_s"
  (list (atof a4)(atof a3))
  1
  1
  0
  a1
  (if (= (rtos (atof a5) 2 2) "0.00")
    "Б/В"
    (rtos (atof a5) 2 2)
  ) ;_ end of if
  ""
  ""
) ;_ end of command
Насчет системных переменных:
http://www.autocads.ru/prilosh/pril_3.php
Do$ вне форума  
 
Автор темы   Непрочитано 19.08.2009, 15:25
#20
G-RAV

Геодезист
 
Регистрация: 16.08.2009
г.Новосибирск
Сообщений: 86
<phrase 1=


Вот как-то так я представляю себе диалоговое окно (прада, можно и как-нить компактней):
Код:
[Выделить все]
 
import: // наверное уже после выбора файла
dialog{label="Импорт точек .job & .are";
:edit_box{label="Имя слоя для пикетов";key="name_layer";value="";edit_width=6;} // по умолчанию, то что стоит после 15= в файле.job
:edit_box{label="Точность Н(знаков после точки)";key="TCH_H";value="";edit_width=6;}
:row{fixed_width=true;alignment=centered;
  :button{label="Палитра";key="palitra";} // интерисует именно цвет слоя 
  :button{label="Импорт";key="Import";}
  :ok_button{label="Выход";is_cancel=true;}
}//row
:row{
  :image{width=20;height=0.5;key="img";} // шкала прогресса
  }//row
}
G-RAV вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Импорт точек из файла .job & .are



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импорт DXF файла в МОНОМАХ Bublik 22 Мономах 30 19.01.2017 11:38
Civil 3D 2007. Импорт точек из dwg Airiz Прочее. Программное обеспечение 3 16.09.2009 11:41
Про импорт txt файла Лиры.. Sid Barret Лира / Лира-САПР 1 16.06.2008 08:05
Импорт точек Сьемочного обоснования в AutoCAD Xamas_DZK AutoCAD 1 05.11.2007 03:24