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

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

Преобразование многострочного текста в блок с атрибутами

Ответ
Поиск в этой теме
Непрочитано 10.04.2011, 16:19 #1
Преобразование многострочного текста в блок с атрибутами
superkot007
 
Регистрация: 15.01.2010
Сообщений: 254

Есть много чертежей, где условные обозначения выполнены многострочным текстом. Нужно "перевести" их в блоки для дальнейшей обработки. Прикрепляю файл образца для простоты взаимопонимания

Попытался написать порядок действий:
1. Выбор объекта - MText-а
2. Получение его имени
3. Получение строки
4. Преобразование строки в список
5. Извлечь каждый элемент списка
6. Объединение в новые списки (5 атрибутов в блоке, следовательно, 5 списков)
7. Преобразование списков в строку.
8. Соответствие имен списков именам атрибутов
9. Вставка блока с уже заданными атрибутами

Крайне желательно сделать все в цикле, чтобы "конвертация" многострочного текста в блок проходила за один раз.

Вложения
Тип файла: dwg
DWG 2007
mtext_to_block.dwg (55.1 Кб, 2695 просмотров)

Просмотров: 9435
 
Непрочитано 10.04.2011, 20:19
#2
Кулик Алексей aka kpblc
Moderator

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


Поскольку тема в "AutoCAD", то, наверное, ответ будет только один - вручную. Или теме место в "Программировании"?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.04.2011, 20:51
#3
superkot007


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Поскольку тема в "AutoCAD", то, наверное, ответ будет только один - вручную. Или теме место в "Программировании"?
Давно на форум не заходил, ошибся
Прошу прощения, перенеси, пожалуйста
superkot007 вне форума  
 
Непрочитано 10.04.2011, 20:56
#4
Кулик Алексей aka kpblc
Moderator

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


Перенесено.
---
Добавлено: а закон формирования подобных атрибутов всегда один?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.04.2011, 22:00
#5
superkot007


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Добавлено: а закон формирования подобных атрибутов всегда один?
Ну пока пока так:
MTEXT в 2 строки; формат записи такого вида ABC123DE456F (A...F - любая латинская заглавная буква, 1...6 - любая цифра 0...9)
ABC - первый атрибут блока, 123 - второй, DE - третий; 456 - четвертый; F - пятый

А что, позже нельзя будет изменить, если "закон" изменится (чертежи разные приходят, под все не подстроишься)?
Если бы на LISP-е было решение, то можно было бы попробовать подправить в случае чего самому
superkot007 вне форума  
 
Непрочитано 10.04.2011, 22:45
#6
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от superkot007 Посмотреть сообщение
А что, позже нельзя будет изменить, если "закон" изменится (чертежи разные приходят, под все не подстроишься)?
Если программу писать грамотно, т.е. выносить настройки во внешний файл, то можно.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 11.04.2011, 00:53
#7
superkot007


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


Цитата:
Сообщение от hwd Посмотреть сообщение
Если программу писать грамотно, т.е. выносить настройки во внешний файл, то можно.
Я, честно говоря, думал, что задачу можно решить одним lisp-ом (ну готовый блок для вставки - не в счет) и в случае необходимости, подправив lisp и блок, работать с другими чертежами...
superkot007 вне форума  
 
Непрочитано 11.04.2011, 08:26
#8
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от superkot007 Посмотреть сообщение
Я, честно говоря, думал, что задачу можно решить одним lisp-ом (ну готовый блок для вставки - не в счет) и в случае необходимости, подправив lisp и блок, работать с другими чертежами...
По лиспу я не подскажу, поскольку пишу на др. языке.
Если лисп не компилировать, то конечно же - не сложно и в lsp-файле внести изменение (если человек точно знает, где именно и что нужно менять), но если на руках будет только откомпилированная версия...
Offtop: Вообще НЕ выносить конфигурационные настройки за рамки кода считается правилом дурного тона (по вполне понятным причинам). Даже если лисп не компилировать, существует опасность того, что пользователь, когда полезет изменять "правило", случайно не там точку поставит или ещё чего, в результате код работать перестанет. Да и вообще, все настройки нужно хранить отдельно от кода - тогда и их искать по коду не придётся, и угрозы случайного повреждения кода не будет. Я не придираюсь, просто озвучиваю общепринятую практику программирования
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 11.04.2011, 18:38
#9
superkot007


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


hwd, ну с этим никто не спорит

Начал понемногу двигаться, думаю, начало примерно такое
Код:
[Выделить все]
 
  (setq a (entsel "Выберите объект: "))
  (setq b (car a))
  (setq c (entget b))
  (setq d (cdr (assoc 1 c)))
  (vl-string->list  'd)
???
)
superkot007 вне форума  
 
Непрочитано 12.04.2011, 08:42
1 | #10
Do$

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


В MTEXTе контент может содержаться не только в коде 1, но и в дополнительных кодах 3. В примере из #1, конечно же, количество символов небольшое и в таком случае вполне будет достаточно извлекать только код 1, но, на всякий случай, это стоит иметь в виду (если поискать на форуме, можно найти грамотные функции для извлечения из MTEXTа строки).
Затем, нужно будет снести форматирование MTEXTа (поиск по форуму по словам "mtext" "unformat"), потому что вместо нужной строки "CSQ874JL080V" из MTEXTа в примере извлекается "CSQ874\\PJL080V" (и это еще далеко не самый запущенный случай).
Ну а потом уже манипулировать с готовой к употреблению строкой с помощью функции substr, или как в коде из #9 преобразовать строку в список с помощью vl-string->list и работать со списком...
Do$ вне форума  
 
Непрочитано 12.04.2011, 11:22
#11
TararykovDG

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


superkot007, для Твоего примера
Код:
[Выделить все]
 
; mip_MTEXT_Unformat автор VVA
; http://forum.dwg.ru/showpost.php?p=138785&postcount=24
(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 2)) "\\[ACFHQTW]")
            (setq Mtext (substr Mtext (+ 2 (vl-string-search ";" Mtext)))))
          ((wcmatch (strcase (substr Mtext 1 2)) "\\P")
            (if (or(= " " (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
  ); end mip_MTEXT_Unformat



; Вызов mtext->block
(defun c:mtext->block()
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  ((lambda(block_name template sel_mtext)
     (if (and sel_mtext
              (or (tblsearch "BLOCK" block_name)
                  (findfile block_name)
                  )
              )
       (foreach item (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel_mtext)))
         ((lambda(ins_point lst_attr)
            (if (vl-every 'wcmatch lst_attr template)
              (if (not (vl-catch-all-error-p
                         (vl-catch-all-apply 'apply
                                             (list 'vl-cmdf (append (list  "_.-insert" block_name ins_point "" "" "") lst_attr))
                                             )
                         )
                       )
                (entdel item)
                )
              )
            )
           (cdr (assoc 10 (entget item)))
           ((lambda(f_rec str)
              (f_rec str template)
              )
             (lambda(ss temp)
               (if (and (/= ss "")
                        temp
                        )
                 (cons (substr ss 1 (strlen (car temp))) (f_rec (substr ss (1+ (strlen (car temp)))) (cdr temp)))
                 )
               )
             (mip_MTEXT_Unformat (cdr (assoc 1 (entget item))))
             )
           )
         )
       )
     )
    "Block"	; здесь имя блока или путь до файла *.dwg
    (list "@@@" "###" "@@" "###" "@")	; здесь изменяемый шаблон для выборки mtext'а (это конкртено для твоего примера)
    (ssget "_X" (list (cons 0 "MTEXT")))
    )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
  ); end c:mtext->block
Выбирается весь mtext на чертеже и при совпадении с шаблоном заменяется на указанный блок с атрибутами.
Исходный mtext удаляется.
Блок вставляется в точку вставки mtext'a
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 12.04.2011, 21:12
#12
superkot007


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


TararykovDG
Забыл про
Код:

на "единичном блоке" - работает, завтра на "боевое дежурство" поставлю

Последний раз редактировалось superkot007, 12.04.2011 в 22:47.
superkot007 вне форума  
 
Непрочитано 20.03.2014, 12:02
#13
jon73


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


TararykovDG Не могу загрузить данный лисп "mtext->block" не запускается... Интересно а можно оптом заменить многострочные тексты на блоки по местам?

----- добавлено через ~10 ч. -----
Кто знает как запустить лисп с 11 поста ?
jon73 вне форума  
 
Непрочитано 21.03.2014, 13:45
#14
WhiteShark


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


Ну если не стоит задача какой то автоматизации, то просто копируете в буфер и вставляете как блок.
А если у вас стоит задача еще кучу таких кучек загнать в блок, то парой слов не опишешь
WhiteShark вне форума  
 
Непрочитано 21.03.2014, 13:48
#15
jon73


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


да мне нужно много текстов на плане перевести в блоки автоматом, вот этот код это делает ? http://www.cadtutor.net/forum/showth...th-block/page2
jon73 вне форума  
 
Непрочитано 21.03.2014, 14:08
#16
WhiteShark


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


именно. Единственное, что блок, которым будете заменять, должен находиться в этом варианте программы в отдельном файле.
А вообще обманул я вас. Она не вносит значения текста в атрибут это раз, во вторых в оригинале заменяются только строки с "F", ну и масштаб вставляемого блока не 1,1,1. Так что не то

Последний раз редактировалось WhiteShark, 21.03.2014 в 14:50.
WhiteShark вне форума  
 
Непрочитано 21.03.2014, 15:26
#17
jon73


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


Да каждый текст преобразуется в блок с атрибутом содержащий этот текст и вставляется в тоже место где был этот текст, то есть происходит просто замена текста на блок с атрибутом. и так во всех текстах на плане

пример что я хочу

----- добавлено через ~39 мин. -----
интересный пост http://through-the-interface.typepad...et-part-2.html

----- добавлено через ~8 ч. -----
Вот замороченный пример только не понятно как запускается http://www.cad.dp.ua/stats/a_vba/acentity3.php
Вложения
Тип файла: dwg
DWG 2004
Экспликация.dwg (1,003.9 Кб, 2147 просмотров)
jon73 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Преобразование многострочного текста в блок с атрибутами

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Ширина многострочного текста уменьшается до минимума Kalhaman AutoCAD 4 12.05.2010 12:03
Изменение стиля Многострочного текста Traum AutoCAD 29 18.08.2009 10:31
редактирование многострочного текста в AutoCAD 2006 greta AutoCAD 10 12.03.2007 23:24
как создать блок с атрибутами Алексей К. Динамические блоки 8 12.11.2006 15:47