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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как получить MTEXT но без форматирования, только текст?

Как получить MTEXT но без форматирования, только текст?

Ответ
Поиск в этой теме
Непрочитано 04.08.2009, 16:32 #1
Как получить MTEXT но без форматирования, только текст?
lexluther
 
Регистрация: 19.03.2009
Сообщений: 51

Добрый день,

С помощью следующего кода я получаю все текстовые элементы на изображении:

(defun dp-text (/ retval)
(setq text-entity (entnext))
(while text-entity
(setq text-element (entget text-entity)
text-type (cdr (assoc 0 text-element))
)
(if (or (= text-type "TEXT") (= text-type "MTEXT"))
(write-line (setq retval (cdr (assoc 1 text-element))))
)
(setq text-entity (entnext text-entity))
)
retval
)

Текст в моем случае пока что выводится просто на вывод. Проблема в том что когда он распарсивает объекты типа MTEXT то он возвращает:

test\Ptest\Ptest

И никаких привычным мне в С++ \r\n и.т.д. Вопрос как можно получить только текст, если ли какие то правила форматирования чтобы допустим вручную из С++ кода распарсил полученную строку. Может в лиспе это можно сделать как то проще?

Или например он вот такое возвращает:

test\P{\fArial|b1|i0|c204|p34;test\P\fArial Narrow|b0|i0|c0|p34;test}

Мне надо чтобы этот код на лиспе был максимально переносимым. Как минимум с 2000 по 2010 версию. Заранее огромное спасибо за помощь!

С уважением.
Просмотров: 7778
 
Непрочитано 04.08.2009, 16:39
#2
Кулик Алексей aka kpblc
Moderator

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


На форуме это уже выкладывалось, но искать лениво.
Вложения
Тип файла: pdf mtext_format_symbols.pdf (157.7 Кб, 1795 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.08.2009, 19:28
#3
VVA

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


lexluther,
Это был мой вопрос №3, если помнишь.
По той ссылке, что я привел, найдешь функцию mip_MTEXT_Unformat
Твой код будет выглядеть так:
Код:
[Выделить все]
(defun dp-text (/ retval)
(setq text-entity (entnext))
(while text-entity
(setq text-element (entget text-entity)
text-type (cdr (assoc 0 text-element))
)
(if (or (= text-type "TEXT") (= text-type "MTEXT"))
(write-line (setq retval (mip_MTEXT_Unformat(cdr (assoc 1 text-element)))))
)
(setq text-entity (entnext text-entity))
)
retval
)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 06.08.2009, 13:37
#4
lexluther


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


А оно будет под Автокадом 2000 работать?
lexluther вне форума  
 
Непрочитано 07.08.2009, 09:10
#5
VVA

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


А попробовать?

*** Добавлено
Думаю будет интересно
LISP. Очистка форматирования многострочного текста
.NET - Удаление форматирования текста (2008-2009)
VBA. Удаления форматирования текста
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 07.08.2009 в 09:21.
VVA вне форума  
 
Автор темы   Непрочитано 27.08.2009, 14:12
#6
lexluther


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


Обнаружил что mip_MTEXT_Unformat не работает точнее он не может нормально распарсить текст такого типа:
  • впвпвпв
  • впвпвп
  • впвпвпвп
  • ввпвпвп
Из за точек слева. В результате выдает мешанину из знаков

Можно как то это подправить?
lexluther вне форума  
 
Непрочитано 27.08.2009, 15:37
#7
VVA

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


выложи файл с примером "нераспарсиваемого" мтекста
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.08.2009, 16:53
#8
lexluther


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


Цитата:
Сообщение от VVA Посмотреть сообщение
выложи файл с примером "нераспарсиваемого" мтекста
Например вот это:
  • YES
  • NO
  • CANCEL
Превращается в 2008 автокаде в

xi-3,l3,t3;· YES · NO · CANCEL

То бишь куча лишних символов

Сам код вот:

Код:
[Выделить все]
(defun remove-mtext-formatting
       (mtext-value / text-value temp-string)
      (setq text-value "")
      (while (/= mtext-value "")
    (cond
      ((wcmatch (strcase (setq temp-string (substr mtext-value 1 2)))
            "\\[\\{}]"
       )
       (setq mtext-value (substr mtext-value 3)
         text-value  (strcat text-value temp-string)
       )
      )
      ((wcmatch (substr mtext-value 1 1) "[{}]")
       (setq mtext-value (substr mtext-value 2))
      )
      ((wcmatch (strcase (setq temp-string (substr mtext-value 1 2)))
            "\\[LO`~]"
       )
       (setq mtext-value (substr mtext-value 3))
      )
      ((wcmatch (strcase (substr mtext-value 1 2)) "\\[ACFHQTW]")
       (setq mtext-value
          (substr mtext-value
              (+ 2 (vl-string-search ";" mtext-value))
          )
       )
      )
      ((wcmatch (strcase (substr mtext-value 1 4))
            "\\PQ[CRJD],\\PXQ"
       )
       (setq mtext-value
          (substr mtext-value
              (+ 2 (vl-string-search ";" mtext-value))
          )
       )
      )
      ((wcmatch (strcase (substr mtext-value 1 2)) "\\P")
       (if (or
         (zerop (strlen text-value))
         (= " " (substr text-value (strlen text-value)))
         (= " " (substr mtext-value 3 1))
           )
         (setq mtext-value (substr mtext-value 3))
         (setq mtext-value (substr mtext-value 3)
           text-value  (strcat text-value " ")
         )
       )
      )
      ((wcmatch (strcase (substr mtext-value 1 2)) "\\S")
       (setq temp-string (substr mtext-value
                     3
                     (- (vl-string-search ";" mtext-value) 2)
                 )
         text-value  (strcat
                   text-value
                   (vl-string-translate
                 "#^\\"
                 "/^\\"
                 temp-string
                   )
                 )
         mtext-value (substr mtext-value (+ 4 (strlen temp-string)))
       )
      )
      (t
       (setq text-value  (strcat text-value (substr mtext-value 1 1))
         mtext-value (substr mtext-value 2)
       )
      )
    )
      )
      text-value
    )
Вложения
Тип файла: dwg
DWG 2007
Drawing2.dwg (78.1 Кб, 1401 просмотров)
lexluther вне форума  
 
Непрочитано 27.08.2009, 17:23
#9
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от lexluther Посмотреть сообщение
Например вот это:
  • YES
  • NO
  • CANCEL
Превращается в 2008 автокаде в

xi-3,l3,t3;· YES · NO · CANCEL
А что должно получиться?
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 28.08.2009, 08:33
#10
lexluther


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


А должно получиться просто только текст т.е.:

YES NO CANCEL
lexluther вне форума  
 
Непрочитано 28.08.2009, 08:48
#11
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от lexluther Посмотреть сообщение
А должно получиться просто только текст т.е.:

YES NO CANCEL
Осталось понять, откуда берутся пробелы, между словами. Нужно заменять перенос на другую строку пробелами?
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 28.08.2009, 14:26
#12
lexluther


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


А можно пример кода пожалуйста. Я извиняюсь за свою назойливость и наверное я уже вам порядком надоел но я буду очень благодарен если вы мне поможете каким нибудь примером. В любом случае огромное вам спасибо за вашу помощь и внимание к моим глупым наверное вопросам.
lexluther вне форума  
 
Непрочитано 28.08.2009, 14:40
#13
VVA

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


lexluther, Изменения выделил красным
Код:
[Выделить все]
(defun mip_MTEXT_Unformat ( Mtext / text Str )
  (setq Text "")
   (while (/= Mtext "")
        (cond
          ((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[\\{}]")
            (setq Mtext (substr Mtext 3) Text   (strcat Text Str)))
          ((wcmatch (substr Mtext 1 1) "[{}]")(setq Mtext (substr Mtext 2)))
          ((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[LO`~]")
	   (setq Mtext (substr Mtext 3)))
          ((wcmatch (strcase (substr Mtext 1 8)) "\\FSYMBOL") ;;;Add VVA remove Symbol
            (setq Mtext (substr Mtext (+ 2 (vl-string-search "}" Mtext)))))
          ((wcmatch (strcase (substr Mtext 1 2)) "\\[ACFHQTW]")
            (setq Mtext (substr Mtext (+ 2 (vl-string-search ";" Mtext)))))
	  ((wcmatch (strcase (substr mtext 1 4)) "\\PQ[CRJD],\\PX[QI]")  ;;;Add by KPblC
	   (setq mtext (substr mtext (+ 2 (vl-string-search ";" mtext))))
	   )
          ((wcmatch (strcase (substr Mtext 1 2)) "\\P")
            (if (or
		   (zerop (strlen Text))
		   (= " " (substr Text (strlen Text)))
		   (= " " (substr Mtext 3 1)))
               (setq Mtext (substr Mtext 3))
               (setq Mtext (substr Mtext 3) Text (strcat Text " "))))
	  ((wcmatch (strcase (substr Mtext 1 2)) "\\S")
            (setq Str   (substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
                  Text  (strcat Text (vl-string-translate "#^\\" "/^\\" Str))
                  Mtext (substr Mtext (+ 4 (strlen Str)))))
	  (t (setq Text (strcat Text (substr Mtext 1 1)) Mtext (substr Mtext 2)))))
  Text)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 04.09.2009, 17:51
#14
lexluther


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


Спасибо за код!

Но оно все равно не все варианты форматирования отбрасывает вот например с такими файлами что я вложил в сообщение оно тоже справиться не может. В одном списки, а в другом выравнивание по центру. Обращаюсь к VVA если тебе будет несложно можешь пожалуйста исправить эти ошибки в коде, так как походу код совсем сырой. Извиняюсь за то что у тебя отнял столько времени уже и заранее огромное спасибо за помощь.

С уважением
Артем
Вложения
Тип файла: dwg
DWG 2007
Drawing1.dwg (41.4 Кб, 1400 просмотров)
Тип файла: dwg
DWG 2007
Drawing4.dwg (73.0 Кб, 1387 просмотров)

Последний раз редактировалось lexluther, 04.09.2009 в 17:57.
lexluther вне форума  
 
Непрочитано 13.09.2009, 22:52
#15
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun mip_mtext_unformat (mtext / text str)
  (setq text "")
  (while (/= mtext "")
    (cond
      ((wcmatch (strcase (setq str (substr mtext 1 2))) "\\[\\{}]")
       (setq mtext (substr mtext 3)
             text  (strcat text str)
             ) ;_ end of setq
       )
      ((wcmatch (substr mtext 1 1) "[{}]") (setq mtext (substr mtext 2)))
      ((wcmatch (strcase (setq str (substr mtext 1 2))) "\\[LO`~]")
       (setq mtext (substr mtext 3))
       )
      ((wcmatch (strcase (substr mtext 1 8)) "\\FSYMBOL")
;;;Add VVA remove Symbol
       (setq mtext (substr mtext (+ 2 (vl-string-search "}" mtext))))
       )
      ((wcmatch (strcase (substr mtext 1 2)) "\\[ACFHQTW]")
       (setq mtext (substr mtext (+ 2 (vl-string-search ";" mtext))))
       )
      ((wcmatch (substr mtext 1 3) "\\p[qxicrjd]")
;;;Add and changed by kpblc
       (setq mtext (substr mtext (+ 2 (vl-string-search ";" mtext))))
       )
      ((wcmatch (strcase (substr mtext 1 2)) "\\P")
       (if (or
             (zerop (strlen text))
             (= " " (substr text (strlen text)))
             (= " " (substr mtext 3 1))
             ) ;_ end of or
         (setq mtext (substr mtext 3))
         (setq mtext (substr mtext 3)
               text  (strcat text " ")
               ) ;_ end of setq
         ) ;_ end of if
       )
      ((wcmatch (strcase (substr mtext 1 2)) "\\S")
       (setq str   (substr mtext 3 (- (vl-string-search ";" mtext) 2))
             text  (strcat text (vl-string-translate "#^\\" "/^\\" str))
             mtext (substr mtext (+ 4 (strlen str)))
             ) ;_ end of setq
       )
      (t
       (setq text  (strcat text (substr mtext 1 1))
             mtext (substr mtext 2)
             ) ;_ end of setq
       )
      ) ;_ end of cond
    ) ;_ end of while
  text
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как получить MTEXT но без форматирования, только текст?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 554 14.11.2023 11:59
изменить стиль MTEXT Redya AutoCAD 31 20.10.2019 10:44
Увеличение всех отметок на определенную величину Drweb Программирование 103 22.01.2016 13:52
Юмор 2008 Серёга - Bilder Разное 1185 08.01.2009 11:55
Как найти текст без содержания и еще вопросы Елена AutoCAD 5 29.06.2004 14:16