Lisp. Обработка текста (числа) по условию.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Обработка текста (числа) по условию.

Lisp. Обработка текста (числа) по условию.

Ответ
Поиск в этой теме
Непрочитано 05.06.2012, 08:23 #1
Lisp. Обработка текста (числа) по условию.
Alex_80
 
ПГС
 
Регистрация: 24.11.2011
Сообщений: 31

Здравствуйте. Давно ищу lisp для решения вот такой задачки, к сожаления своими силами её решить не удалось. Может у кого есть уже готовое решение?
Исходные данные:
1) Autocad 64 bit.
2) Text/Mtext в виде цифр, координата z может отличаться.
3) Число, задаваемое пользователем (например 25.6).
4) Арифметическое условие = (равно), <> (меньше больше), <= (меньше равно), >= (больше равно).
5) Текст, содержащий буквы (abc123, %%с12) обрабатываться не должен.
Варианты решения задачи:
1) Число, не удовлетворяющее условиям, удаляется.
2) Число удовлетворяющее условиям, заменяется текстом, введенным пользователем (например %%с12).
Спасибо заранее.

Вложения
Тип файла: dwg
DWG 2004
пример.dwg (271.2 Кб, 1047 просмотров)
Тип файла: dwg
DWG 2004
пример2.dwg (36.4 Кб, 1045 просмотров)


Последний раз редактировалось Alex_80, 05.06.2012 в 11:04.
Просмотров: 3477
 
Непрочитано 05.06.2012, 10:24
#2
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


ни разу не понял, кто что вводит и чего где обрабатывать.
ciril вне форума  
 
Автор темы   Непрочитано 05.06.2012, 11:03
#3
Alex_80

ПГС
 
Регистрация: 24.11.2011
Сообщений: 31


Цитата:
Сообщение от ciril Посмотреть сообщение
ни разу не понял, кто что вводит и чего где обрабатывать.
Добавил пример2.dwg.
Alex_80 вне форума  
 
Непрочитано 05.06.2012, 11:06
1 | #4
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Alex_80, попробуй так
Код:
[Выделить все]
 
; Примеры вызова:
; (test 30 < "aaa") - если меньше 30 заменить на "aaa", остальные удалить
; (test 10 = "bbb") - если равно 10 заменить на "bbb", остальные удалить
; (test 15.34 > "ccc") - если больше 15.34 заменить на "ccc", остальные удалить
; (test 25 >= "") - если больше или равно 25 оставить как есть, остальные удалить
(defun test(value operator new / )
  (vl-load-com)
  ((lambda(nbr)
     (if nbr
       (foreach item (mapcar 'cadr (ssnamex nbr))
         ((lambda(ed)
            ((lambda(ss)
               ((lambda(current_value)
                  (if current_value
                    (if (operator current_value value)
                      (if (/= new "")
                        (progn
                          (setq ed (subst (cons 1 new) (assoc 1 ed) ed))
                          (entmod ed)
                          (entupd item)
                          )
                        )
                      (entdel item)
                      )
                    )
                  )
                 (cond ((Is-Str->Value ss nil T) (atoi ss))
                       ((Is-Str->Value ss nil nil) (atof (vl-string-translate "," "." ss)))
                       )
                 )
               )
              (cdr (assoc 1 ed))
              )
            )
           (entget item)
           )
         )
       )
     )
    (ssget "_X" (list (cons 0 "*TEXT")))
    )
  (princ)
  ); end test


; Проверка является ли строка числом (если not_null = T - проверка на неравенство нулю; если int = T - проверка является ли число целым)
(defun Is-Str->Value(str not_null int / lst lst_memb)
  (if (= (substr str 1 1) "-")
    (setq str (substr str 2))
  )
  (setq lst (vl-string->list (vl-string-translate ",e" ".E" str)))
  (if int
    (setq lst_memb (list 45 48 49 50 51 52 53 54 55 56 57 69))
    (setq lst_memb (list 45 46 48 49 50 51 52 53 54 55 56 57 69))
  )
  (and lst
       (vl-every '(lambda(x) (member x lst_memb)) lst)
       (< (length (vl-remove-if-not '(lambda(x) (= x 46)) lst)) 2)
       (if (vl-position 69 lst)
         (and (> (vl-position 69 lst) 0)
              (< (vl-position 69 lst) (1- (length lst)))
              (< (length (vl-remove-if-not '(lambda(x) (= x 69)) lst)) 2)
              )
         t
         )
       (if (vl-position 45 lst)
         (and (< (length (vl-remove-if-not '(lambda(x) (= x 45)) lst)) 2)
              (< (vl-position 45 lst) (1- (length lst)))
              (= (nth (1- (vl-position 45 lst)) lst) 69)
              )
         t
         )
       (if not_null
         (> (length (vl-remove-if '(lambda(x) (or (= x 45) (= x 46) (= x 48) (= x 69))) lst)) 0)
         t
         )
       )
); End Is-Str->Value

__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 05.06.2012, 11:11
#5
Alex_80

ПГС
 
Регистрация: 24.11.2011
Сообщений: 31


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Alex_80, попробуй так
Убери пожалуйста нумерацию строк кода, а то вместе с ними вставляется.
Alex_80 вне форума  
 
Непрочитано 05.06.2012, 11:20
1 | #6
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Alex_80 Посмотреть сообщение
Убери пожалуйста нумерацию строк кода, а то вместе с ними вставляется.
В верхнем правом углу окна с кодом нажми кнопку view source
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 05.06.2012, 11:25
#7
Alex_80

ПГС
 
Регистрация: 24.11.2011
Сообщений: 31


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
В верхнем правом углу окна с кодом нажми кнопку view source
спасибо, не знал.
Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Alex_80, попробуй так
если меньше 30 заменить на "aaa", остальные удалить - это работает, но надо или "если меньше 30 заменить на "aaa"" или "если меньше 30 удалить" по выбору, т.е. условие одно, а команды обработки две.
Alex_80 вне форума  
 
Непрочитано 05.06.2012, 11:37
#8
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Alex_80 Посмотреть сообщение
но надо или "если меньше 30 заменить на "aaa"" или "если меньше 30 удалить" по выбору, т.е. условие одно, а команды обработки две.
(test 30 >= "") - если больше или равно 30 оставить как есть, остальное удалить - это тоже самое что удалить если меньше 30
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 05.06.2012, 11:56
#9
Alex_80

ПГС
 
Регистрация: 24.11.2011
Сообщений: 31


TararykovDG спасибо разобрался. Переделай пожалуйста
если меньше 30 заменить на "aaa", остальные удалить, на если меньше 30 заменить на "aaa"

Последний раз редактировалось Alex_80, 05.06.2012 в 16:26.
Alex_80 вне форума  
 
Непрочитано 05.06.2012, 16:49
#10
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Alex_80, удали из кода 23 строчку (entdel item)
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 06.06.2012, 07:21
#11
Alex_80

ПГС
 
Регистрация: 24.11.2011
Сообщений: 31


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Alex_80, удали из кода 23 строчку (entdel item)
Залез в код и он перестал работать.
Вот Disney подкинул идею From >= Содержимое >= To:
http://forum.dwg.ru/showpost.php?p=660353&postcount=32
+ запросы сделать как у VVA в сквозной нумерации:
Команда: Выберите объекты:
Команда: Введите From или Пробел-нет:
Команда: Введите To или Пробел-нет:
Команда: Введите Заменяющий текст или Пробел-нет:

Последний раз редактировалось Alex_80, 14.06.2012 в 09:09. Причина: Просветление
Alex_80 вне форума  
 
Непрочитано 28.06.2012, 16:47
#12
tigra-18

конструктор
 
Регистрация: 04.06.2009
Сообщений: 1,166


А можно как-нибудь модифицировать выше приведенный код, для того чтобы определенный интервал чисел заменялся на определенное заранее заданное число, и желательно, чтобы можно было задать несколько интервалов и соответствующее количество заменяющих чисел.
tigra-18 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Обработка текста (числа) по условию.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
LISP очистить стиль текста в буфере объмена gizmo_zx LISP 1 20.12.2011 11:36
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
Изменение форматированного текста посредством lisp Tramp LISP 4 03.03.2006 11:28