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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проверка наличия конкретного текста в МТЕКСТ

Проверка наличия конкретного текста в МТЕКСТ

Ответ
Поиск в этой теме
Непрочитано 23.06.2015, 12:02 #1
Проверка наличия конкретного текста в МТЕКСТ
nynokne
 
Регистрация: 17.02.2014
Сообщений: 50

Здравствуйте.
Пытаюсь из имеющихся элементов МТЕКСТ сделать таблицу с данными.
Как вытащить из МТЕКСТа эти данные, я разобрался, как создать таблицу и заполнить её этими данными, тоже.
С помощью VL-STRING-SEARCH я определяю позицию текста, например "Стул" в МТЕКСТЕ
Код:
[Выделить все]
 (setq mtxtObj (ssname mtxt i))
(PRIN1 mtxtObj)
(setq mtx_sv (entget mtxtObj))
(PRIN1 mtx_sv)
(setq sod_mtxt (cdr (assoc 1 mtx_sv))
(PRIN1 sod_mtxt)
(setq poz_txt (VL-STRING-SEARCH "Стул" sod_mtxt)))
Далее "вытягиваю" число, стоящее за "Стул" и вставляю его в нужную мне ячейку таблицы.
Всё работает, как надо до тех пор, пока в проверяемом МТЕКСТЕ слова "Стул" не оказывается.
Как добавить проверку на наличия конкретного текста в МТЕКСТЕ?
Я пробовал ввести
Код:
[Выделить все]
 (if (= nil poz_txt)
(progn
.....)
(progn
....)
)
но программа выдаёт ошибку "неверный тип аргумента: numberp: nil"
Просмотров: 4073
 
Непрочитано 23.06.2015, 12:14
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Во-первых, есть такая функция как wcmatch. Во-вторых, есть vl-string-trim, vl-string-trim-right и vl-string-trim-left. В третьих, ты забываешь про принудительное форматирование текста. В четвертых, в DXF 1 группы для MTEXT хранится только 255 символов - остальные в повторяющихся группах 3. В, пятых, конструкция
Код:
[Выделить все]
  (if (= nil poz_txt)
(progn ; Действие1
.....)
(progn ; Действие2
....)
)
я б заменил на
Код:
[Выделить все]
  (if poz_txt
(progn ; Действие2
.....)
(progn ; Действие1
....)
)
----- добавлено через 21 сек. -----
Сама по себе конструкция правильная, ошибка где-то в progn
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.06.2015, 12:27
#3
nynokne


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ошибка где-то в progn
Видимо, мозги не варят, но где тут может быть ошибка?:
Код:
[Выделить все]
 (if poz_txt 
			(progn
				(setq nas_n (+ 10 poz_txt))
				(PRIN1 nas_n)
				(setq nas_txt_1 (substr sod_mtxt nas_n 8))
				(PRIN1 nas_txt_1)
				(setq nas_txt_2 (VL-STRING-SEARCH ' "." nas_txt_1))
				(PRIN1 nas_txt_2)
				(setq nas_txt (substr nas_txt_1 1 (+ 3 nas_txt_2)))
			)
			(progn
				(setq nas_txt "0.00")
			)
	)
----- добавлено через ~18 мин. -----
Разобрался. Ошибка была со скобками.

Цитата:
Сообщение от nynokne Посмотреть сообщение
в DXF 1 группы для MTEXT хранится только 255 символов - остальные в повторяющихся группах 3
Что делать, если символов больше 250? обращаться к группе 3?
Т.е. добавить проверку длины строки полученной переменной sod_mtxt
Код:
[Выделить все]
 (setq sod_mtxt (cdr (assoc 1 mtx_sv))
и делать что-то типа:
Код:
[Выделить все]
 (if (< dlina 250)
(progn
...
)
(progn
(setq sod250_mtxt (cdr (assoc 3 mtx_sv))
...
)
)
Ход мыслей правильный? или к группе 3 не так обращаются?
nynokne вне форума  
 
Непрочитано 23.06.2015, 12:49
#4
Кулик Алексей aka kpblc
Moderator

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


Чего-то тут наверчено многовато лишнего, кажется... Если забыть про принудительное форматирование, я бы делал примерно так:
Код:
[Выделить все]
 (vl-load-com)

(defun test (/ selset)
  (if (setq selset (ssget '((0 . "*TEXT"))))
    (mapcar
      (function
        (lambda (ent)
          (setq ent (vla-get-textstring (vlax-ename->vla-object ent)))
          (if (wcmatch (strcase ent) "СТУЛ*#*")
            (vl-string-left-trim "стулСТУЛ " ent)
            "0.00"
            ) ;_ end of if
          ) ;_ end of lambda
        ) ;_ end of function
      ((lambda (/ tab item)
         (repeat (setq tab  nil
                       item (sslength selset)
                       ) ;_ end setq
           (setq tab (cons (ssname selset (setq item (1- item))) tab))
           ) ;_ end repeat
         ) ;_ end of lambda
       )
      ) ;_ end of mapcar
    ) ;_ end of if
  ) ;_ end of defun
----- добавлено через ~2 мин. -----
вариант 2
Код:
[Выделить все]
 (vl-load-com)

(defun test (/ selset)
  (if (setq selset (ssget '((0 . "*TEXT"))))
    (vl-remove nil
               (mapcar
                 (function
                   (lambda (ent)
                     (setq ent (vla-get-textstring (vlax-ename->vla-object ent)))
                     (cond
                       ((wcmatch (strcase ent) "СТУЛ*#*"))
                       (vl-string-left-trim "стулСТУЛ " ent)
                       ((wcmatch ent "#*")
                        ent
                        )
                       ) ;_ end of if
                     ) ;_ end of lambda
                   ) ;_ end of function
                 ((lambda (/ tab item)
                    (repeat (setq tab  nil
                                  item (sslength selset)
                                  ) ;_ end setq
                      (setq tab (cons (ssname selset (setq item (1- item))) tab))
                      ) ;_ end repeat
                    ) ;_ end of lambda
                  )
                 ) ;_ end of mapcar
               ) ;_ end of vl-remove
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.06.2015, 14:50
#5
nynokne


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


Спасибо!
Вижу, что твой код во много раз лучше моего, но я пока не понимаю, что у тебя написано, и как оно работает))) буду разбираться в процессе изучения лиспа
Пока получилось сделать всё без lambda (не могу пока уяснить как она работает):
Код:
[Выделить все]
 (setq txt_name (vlax-ename->vla-object mtxtObj))
(setq sod_mtxt (vla-get-textstring txt_name))
(setq poz_txt (VL-STRING-SEARCH "Стул" sod_mtxt))
(if poz_txt 
(progn
.....
Где можно на русском языке прочитать, что делает "vla-get-textstring"?? Про vlax-ename я нашёл и вроде всё понял.
nynokne вне форума  
 
Непрочитано 23.06.2015, 15:19
#6
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от nynokne Посмотреть сообщение
lambda (не могу пока уяснить как она работает)
Высказывался тут: http://autolisp.ru/2009/09/16/lambda-functions/
Цитата:
Сообщение от nynokne Посмотреть сообщение
что делает "vla-get-textstring"?
Говорит примерно следующее: получить свойство TextString у объекта. ActiveX чистой воды )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.06.2015, 16:07
#7
nynokne


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Высказывался тут
Читал.. как ты сам написал в этой статье "я долго не мог понять смысла применения lambda-функций"))))
Читаю - вроде всё ясно, а сам пока применить не могу...видимо недопонимаю..но, ничего, 2 недели назад я не знал, как использовать if в цикле))
Спасибо за помощь. Буду разбираться.
nynokne вне форума  
 
Непрочитано 25.06.2015, 07:58
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от nynokne Посмотреть сообщение
ты сам написал в этой статье "я долго не мог понять смысла применения lambda-функций"))))
Цитата:
Сообщение от nynokne Посмотреть сообщение
2 недели назад я не знал, как использовать if в цикле)
Offtop: Я к лиспу и Автокаду приобщился в 1992 году (еще к Автокаду 10 версии).
А lambda функции понял как применять в году 2002, с появлением в моей жизни интернета и форумов autokad.ru (ныне dwg.ru) и autocad.ru. (ныне caduser.ru)

Почитай еще здесь
http://www.lee-mac.com/mapcarlambda.html
http://www.afralisp.net/autolisp/tut...and-lambda.php
http://www.cadtutor.net/forum/showth...t-mapcar-quot-.
PS
Когда разберешься как это работает, то lambda покажутся семечками
Код:
[Выделить все]
(setq b '((0 1 2) (3 4 5) (6 7 8)))
(apply 'mapcar (cons 'list b))
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 25.06.2015 в 08:11.
VVA вне форума  
 
Непрочитано 26.06.2015, 08:49
#9
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


VVA, две строчки, как красивый шахматный этюд. Начинаешь понимать, что за прелесть этот LISP. А нельзя ли наковырять еще несколько таких же изюминок (для гурманов)?
P_S вне форума  
 
Непрочитано 26.06.2015, 08:59
#10
Кулик Алексей aka kpblc
Moderator

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


Поищи "транспонирование матрицы" - где-то ShaggyDoc показывал решение.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.06.2015, 11:36
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Поищи "транспонирование матрицы" - где-то ShaggyDoc показывал решение.
Код в #8 как раз и делает транспонирование

Цитата:
Сообщение от P_S Посмотреть сообщение
А нельзя ли наковырять еще несколько таких же изюминок (для гурманов)?
Габаритный контейнер списка точек, т.е левая нижняя и правая верхняя точки
Код:
[Выделить все]
(setq b '((0 41 21)(33 14 25)(16 73 18)(26 37 84)))
(list
  (apply 'mapcar (cons 'min b))
  (apply 'mapcar (cons 'max b))
  )
Скалярное произведение двух векторов
Код:
[Выделить все]
;;; VXV Returns the dot product of two vectors

(defun vxv (v1 v2)
  (apply '+ (mapcar '* v1 v2))
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.06.2015, 17:12
#12
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


В одной из своиз первых даже не книг - брошюр Н.Н. Полещук, да будет благлсловенно имя его во веки веков, аминь, писал, что главная задача ЛИСПА - работа над списками.
Лентяй вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проверка наличия конкретного текста в МТЕКСТ

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программное создание размерных стилей Кулик Алексей aka kpblc Программирование 96 21.02.2025 13:53
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
AutoCAD 2013 Rus SP2 СПДС при проверке _audit находит и исправляет ошибки но, повторная проверка опять указывает на тоже zoro ПО от CSoft 10 06.08.2013 00:33
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Как из Текста сделать Мтекст? Spy Программирование 4 02.03.2009 20:59