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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как ЛИСПом преобразовать txt файл?

Как ЛИСПом преобразовать txt файл?

Ответ
Поиск в этой теме
Непрочитано 15.05.2008, 10:40 #1
Как ЛИСПом преобразовать txt файл?
Mr.Brown
 
Регистрация: 15.05.2008
Сообщений: 3

Здравствуйте!
У меня задача, обратная этой: http://dwg.ru/f/showthread.php?t=20509
Необходимо экспортировать отметки из txt файла в модель.

Мой Тримблер выдает такое в txt файле (привожу часть данных):

Заголовок - два десятка служебных строк,далее сам код:

SS, 700, 0.100, 168.499, 3.3804, 88.0957, 09:19:27, QQ
CO, Pt:700 Code:QQ X 769.153 m Y 1988.911 m Z 6.839 m
SS, 701, 0.100, 168.204, 3.4147, 88.0944, 09:19:56, QQ
CO, Pt:701 Code:QQ X 768.848 m Y 1989.073 m Z 6.840 m
SS, 702, 0.100, 168.120, 3.4019, 88.1152, 09:20:36, QQP
CO, Pt:702 Code:QQP X 768.772 m Y 1988.997 m Z 6.733 m
SS, 703, 0.100, 161.518, 3.4733, 88.0417, 09:23:20, QQ
CO, Pt:703 Code:QQ X 762.152 m Y 1988.913 m Z 6.882 m

И, наконец, окончание - тоже два десятка служебных строк
Прошу Вас, помогите привести мой код к следующему виду:

700QQ 769.153 1988.911 6.839
701QQ 768.848 1989.073 6.840
702QQP 768.772 1988.997 6.733

и т.д. применительно к моему примеру.

Еще лучше, если Мастер-программист напишет макрос, который вставлял бы в модель все точки по их координатам и справа ставил бы номер каждой точки текущим шрифтом в текущем слое. Номера точек в таком формате: 701QQ или 726QQP, то есть трехзначное число и две или три латинские буквы согласно txt файлу.
Ниже номера, в столбик необходимо записать X, Y, Z , но у же в самостоятельно созданном макросом слое "Координаты". Должно получиться так:

700QQ
X=769.153
Y=1988.911
Z=6.839

Я имею общее понятие о программировании, думаю, необходимо перебором строк выделить нужные, например, содержащие "Pt:".
А затем, выделять знаки, находящиеся между "Pt:" и "X", удаляя "Code:"; между "X" и "m" и т.д.
То есть тут работа со строковыми переменными.
Увы, дальше общих понятий мои знания не распространяются.

Спасибо.
p.s. Работаю в AutoCAD 2004
Просмотров: 2360
 
Непрочитано 15.05.2008, 20:59
#2
Sync02


 
Регистрация: 07.12.2007
Брест
Сообщений: 243


Выложи хоть сам файл то с тахеометра. А там можно глянуть
Sync02 вне форума  
 
Автор темы   Непрочитано 16.05.2008, 08:42
#3
Mr.Brown


 
Регистрация: 15.05.2008
Сообщений: 3


Sync02, спасибо за отклик. Мне во много помогли здесь:
http://www.caduser.ru/cgi-bin/f1/board.cgi?t=42362XD
Там же выложен и сам файл с тахеометра.
Если есть возможность, то я бы просил подредактировать последний макрос от Fatty (он очень занят, и не в моих правилах быть назойливым, злоупотреблять вниманием других людей).
После отработки макроса (последнего и самого удачного в теме) в модели координаты пишутся так:
X=
123.123
Y=
1958.445
H=
6.335

А мне хотелось бы так:
X=123.123
Y=1958.445
H=6.335

И еше: в какой строке кода надо умножить значения координаты X и Y на 1000, чтобы точки встали на свои места в модели, так как данные с тахеометра даны в метрах, а чертеж – в миллиметрах. Буду признателен, если Вы покажете, как надо изменить запись в нужных строчках кода. Но подчеркиваю, умножить надо только координаты точек, чтобы посадить их на чертеж, а сами надписи координат около точек оставить как есть, в метрах.

Спасибо.
Mr.Brown вне форума  
 
Непрочитано 16.05.2008, 11:15
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Mr.Brown,
Там формируется mtext так как тебе надо,
Код:
[Выделить все]
(setq txt (strcat "X = " (rtos (* 1000 (cadr itm)) 2 3) "\\P"
      "Y = " (rtos (* 1000 (caddr itm)) 2 3) "\\P"
      "H = " (rtos (* 1000 (cadddr itm)) 2 3)))
Просто выдели его и потяни за ручку вправо (измени ширину текста)
Я там особо не разбирался насчет соответствия, просто отставил строки, у которых есть CO, Pt: и Code:
Стиль текста текущий
Код:
[Выделить все]
(defun C:GPP (/ data fd fname geopoints hgt locdata matchstr mml numpoint
        pointdata pt strng style tp txt x y z)

(setq data nil);debug only
(setq fname (getfiled "Файл данных тримблера:" (getvar "dwgprefix") "txt" 0))

(if fname
(progn
(setq fd (open fname "r"))
(while (setq strng (read-line fd))
  (setq data (cons strng data))
  )
(close fd)
(setq data (reverse data))
;;;Удаляем все строки, кроме строк, начинающихся с CO,Pt:
(setq data
(vl-remove-if-not
       (function (lambda(x)
                  (and (wcmatch x "CO*")(wcmatch x "*Pt:*")
                       (wcmatch x "*Code:*")
                       )))
       data))

(foreach matchstr data
(setq numpoint (substr matchstr (+ (strlen "Pt:") (vl-string-search "Pt:" matchstr) 1)))
(setq numpoint (substr numpoint 1  (vl-string-search (chr 32) numpoint)))

(setq pointdata (substr matchstr (+ (strlen "Code:") (vl-string-search "Code:" matchstr) 1)))
(setq pointdata (substr pointdata 1  (vl-string-search (chr 32) pointdata)))  

(setq x (substr matchstr (+  (vl-string-search "X" matchstr) 3)))
(setq x (atof (substr x 1 (1- (vl-string-search "m" x)))))

(setq y (substr matchstr (+  (vl-string-search "Y" matchstr) 3)))
(setq y (atof (substr y 1 (1- (vl-string-search "m" y)))))

(setq z (substr matchstr (+  (vl-string-search "Z" matchstr) 3)))
(setq z (atof (substr z 1 (1- (vl-string-search "m" z)))))

(setq geopoints (cons (list (strcat numpoint pointdata) x y z) geopoints))
)


(setq geopoints (reverse geopoints))
(princ "Точки:\n")
(princ geopoints)

(initget 6)
(setq hgt (getdist "\nВысота текста: "))
(setvar "pdsize" hgt);<== размер точки
(setvar "pdmode" 34);<== имидж точки


(or
      (tblsearch "layer" "Координаты")
      (entmake
        (list
          '(0 . "LAYER")
          '(100 . "AcDbSymbolTableRecord")
          '(100 . "AcDbLayerTableRecord")
          '(70 . 0)
          (cons 2 "Координаты")
          (cons 62 12)))
      )
;; тест на единицы черчения
(cond ((= (getvar "insunits") 6);<==метры
       (setq mml nil))
      ((= (getvar "insunits") 4);<==миллиметры
       (setq mml (list 1000 1000 100)))
      (T nil); иные как есть
  )

(foreach itm geopoints

(setq pt
       (if mml
   (mapcar '* mml (list (cadr itm)(caddr itm)(cadddr itm)))
   (list (cadr itm)(caddr itm)(cadddr itm))))

(setq txt (strcat "X = " (rtos (* 1000 (cadr itm)) 2 3) "\\P"
      "Y = " (rtos (* 1000 (caddr itm)) 2 3) "\\P"
      "H = " (rtos (* 1000 (cadddr itm)) 2 3)))
(entmake
(list
(cons 0 "POINT")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPoint")
(cons 10 pt)
(cons 8  (getvar "clayer"))
(cons 62 256)
)
)
 (setq tp (mapcar '+ pt (list hgt 0. 0.)))
 (entmake (list
       (cons 0 "MTEXT")
       (cons 100 "AcDbEntity")
       (cons 100 "AcDbMText")
       ;(cons 7 style)
       (cons 8 "Координаты")
       (cons 62 256)
       (cons 71 1);}
       (cons 72 5);}
       (cons 73 1);}=> top left
       (cons 10 tp)
       (cons 11 (list 1.0 0.0 0.0))
       (cons 50 0.0)
       (cons 41 0) ;_Здесь задаеться ширина
       (cons 40 hgt)
       (cons 44 1.0)
       (cons 1 txt)
     )
  )
(setq tp (mapcar '+ pt (list 0. hgt 0.)))
(entmake
      (list
        (cons 0  "TEXT")
        (cons 100  "AcDbSymbolTableRecord")
        (cons 100  "AcDbTextTableRecord")
        (cons 1 (car itm))
        ;(cons 7 style)
        (cons 8 (getvar "clayer"))
  (cons 62 256)
        (cons 10 tp)
        (cons 11 tp)
        (cons 40 hgt);text height
  (cons 41 0.8);text width
  (cons 50 0.0);vertical, 0 — horizontal
  (cons 51 0.0)
  (cons 71 0);}
  (cons 72 1);}
  (cons 73 1);}=> bottom center
  ))
        )


)
  )
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 16.05.2008, 11:52
#5
Mr.Brown


 
Регистрация: 15.05.2008
Сообщений: 3


Спасибо большое! Всё работает! И за текущий стиль текста спасибо. Это удобнее.
Mr.Brown вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как ЛИСПом преобразовать txt файл?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как закрыть файл из лиспа Apelsinov LISP 26 14.08.2019 10:35
Как распечатать файл "в печать" сгенерированный в SCAD-е Курмышанец Расчетные программы 15 25.05.2010 14:24
Как преобразовать Line в Spline Dim@ AutoCAD 3 20.10.2007 12:37
как в VIZrendere открыть файл dwg Nikolays Прочее. Программное обеспечение 5 29.05.2007 09:13
Как найти файл по содержащемуся в нем тексту? Visla AutoCAD 7 09.04.2004 12:16