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

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

Извлечение текстовой строки из примитива

Ответ
Поиск в этой теме
Непрочитано 04.12.2008, 12:13 #1
Извлечение текстовой строки из примитива
ShaggyDoc
 
Thượng Tá Quân Đội Nhân Dân Việt Nam
 
44d32'44"С, 33d26'51"В
Регистрация: 14.03.2005
Сообщений: 13,381

Довольно часто, во всяком случае в ruCAD, используется функция извлечения текста путем указания на примитив. Указать можно на обычный текст, атрибут, мультитекст, мультивыноску - в общем на всё, где могут быть "буковки". Полученную строку можно использовать по всякому, например для математических действий (сложение, умножение).

Саму строку проще всего так получить:

Код:
[Выделить все]
 
   (if (setq ent (ru-get-nentsel  message ))
        (progn
            (if (vlax-property-available-p
                    (setq result (vlax-ename->vla-object (car ent)))
                    'textstring
                ) ;_ end of vlax-property-available-p
                (vla-get-textstring result)
                nil
            ) ;_ end of if
        ) ;_ end of progn
        nil
    )
Здесь можно ru-get-nentsel заменить на nentsel, только ошибки не будут предотвращаться.
Ничего тут сложного нет - если у указанного объекта есть свойство textstring, то вернется строка, а если нет - NIL.

Но неожиданно наткнулся на такую особенность. В ruCAD строки чаще всего вводятся в специальном диалоговом редакторе, имеющем кнопочку "Взять из чертежа". Указали строку - она попадает в редактор, где ее можно подправить.

В связи с тем, что сделал специальный шрифт со множеством спецсимволов, захотелось, чтобы эти символы отображались и в редакторе не в виде кодов типа \u+2205, а по-настоящему, как в редакторе MTEXTEDIT. Это, после ряда ухищрений сделать удалось. В редакторе строки появилась кнопка, позволяющая выбрать спецсимвол из нескольких десятков.

Но, вот если "взять из чертежа", да указать на объект содержащий мультитекст, да со специальными символами, то оказалось, что в свойстве textstring никаких символов и нет. За исключением Автокадовских псевдонимов наподобие %%c. Вместо настоящих кодов Юникода подставляется "?".

Пришлось использовать entget. Именно в DXF-кодах содержится строка со всеми символами Юникода. В результате получилась така функция:
Код:
[Выделить все]
 
 
(defun ru-get-unicode-from-dwg (message / ent edata)
;; Пример (ru-get-unicode-from-dwg "Выбери в рисунке")
    (if (setq ent (ru-get-nentsel message))
        (progn
            (setq edata (entget (car ent)))
            ;; Вот это и вернет строку в Юникодах!!!             
            ;; Надо только убирать форматирование!!!            
            (_kpblc-string-clear-format
                (if (= (cdr (assoc 0 edata)) "MULTILEADER")
                    (cdr (assoc 304 edata))
                    (cdr (assoc 1 edata))
                )
            )
        )
        nil
    )
)
Она возвращает строку наподобие "\U+2260\U+E101%%C" . В свойстве textstring сидит только "??%%C"
Функцию очистки дополнительного форматирования _kpblc-string-clear-format автор, если захочет, приведет.

Написал это к сведению тех, кто занимается извлечением текстов (есть такие ветки) с использованием vla-get-textstring. Встретится в строке условное обозначение, например, уголка или швеллера в виде спецсимвола и результат будет непредсказуемый. И надо учитывать, что не всегда более удобный в применении объектный метод дает правильный результат.
Просмотров: 4696
 
Непрочитано 04.12.2008, 15:09
#2
Кулик Алексей aka kpblc
Moderator

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


Ну хорошо, получить получили. В принципе вопрос-то только один: а назначать как? Особенно для многострочных текстов, у которых группа 3 используется во весь рост?
Через (entmod) или (vla-put-textstring) - что рекомендуется?
P.S. Честно скажу - сейчас провести эксперимент не могу. Может, ночью получится...
---
Добавлено: кстати, пока вспомнил про MTEXT...
Код:
[Выделить все]
(defun ru-get-unicode-from-dwg (message / ent edata)
  ;; Пример (ru-get-unicode-from-dwg "Выбери в рисунке")
  (if (setq ent (entsel))
    (progn
      (setq edata (entget (car ent)))
      ;; Вот это и вернет строку в Юникодах!!!             
      ;; Надо только убирать форматирование!!!            
      (_kpblc-string-clear-format
	(cond
	  ((= (cdr (assoc 0 edata)) "MULTILEADER")
	   (cdr (assoc 304 edata))
	   )
	  (t
	   (apply (function strcat)
		  (mapcar (function cdr)
			  (vl-remove-if-not
			    (function
			      (lambda (x)
				(member (car x) '(1 3))
				) ;_ end of lambda
			      ) ;_ end of function
			    edata
			    ) ;_ end of vl-remove-if-not
			  ) ;_ end of mapcar
		  ) ;_ end of apply
	   )
	  ) ;_ end of cond
	) ;_ end of _kpblc-string-clear-format
      ) ;_ end of progn
    nil
    ) ;_ end of if
  ) ;_ end of defun
---
Добавлено 2: по идее надо бы еще и по многострочным атрибутам пройтись (для вящего спокойствия). Но, по-моему, они сильно похожи на MTEXT...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 04.12.2008 в 15:21.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 04.12.2008, 15:30
#3
VVA

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


Цитата:
В принципе вопрос-то только один: а назначать как?
Следует иметь ввиду, что там еще и поля могут быть. У текстов, мтекстов есть метод FieldCode, чтобы получить строку с полями, у атрибутов такого метода нет. Похожая тема http://discussion.autodesk.com/forum...hreadID=583040
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 04.12.2008, 18:32
#4
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
а назначать как
Назначать можно хоть как. Если передавать в textstring строку с кодами типа \\u+2205, то она принимается и текст отображается уже с раскодированными символами. Если конечно они есть в текущем шрифте. В том-то и парадокс, что обратного возврата не происходит.

Упоминавшийся диалог (есть варианты с 1 и 2 строками) используется чаще всего - чтобы можно было воспользоваться словарями, справочниками, взять имеющийся текст, не вводить вручную спецсимволы. В результате в LISP возвращается строка со спецсимволами в "лисповском" стиле, т.е. типа "\\u+22051000".

В чертеж такая строка попадает разными путями. Например, через функцию рисования мультивыноски. Там работает vla-put-textstring. Есть вариант вставки в любое место. Указали точку в пустое место - добавится обычный текст со спецсимволами. Указали точку в ячейке таблицы - заменится содержимое ячейки. Указали (через опцию) "Заменить" на атрибут или размер - изменится их содержимое. Везде через свойство textstring, не задумываясь о DXF-кодах.

С полями и многострочными атрибутами пока не испытывал. Многострочный атрибут - по сути MTEXT. Но это нетрудно доработать.
ShaggyDoc вне форума  
 
Непрочитано 10.12.2008, 17:41
#5
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Если не секрет , кто автор _kpblc-string-clear-format и где ее взять?
Holon вне форума  
 
Автор темы   Непрочитано 10.12.2008, 20:25
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Holon Посмотреть сообщение
Если не секрет , кто автор _kpblc-string-clear-format и где ее взять?
Естественно, kpblc, который aka Алексей Кулик

Функцию я не прикладываю, так как всех проблем с очисткой формата она не решает. Так же, как несколько других, в том числе моих собственных. А у автора может быть и уже другой вариант.

Коли уж тему приподняли:

Замена текста в многострочном атрибуте через свойство textstring вполне корректна, так как там только мультитекст. То же самое и для Field. Но, если просто заменить textstring, из поля пропадет формула, поэтому сделал добавление текста к свойству FieldCode, если такое обнаружится.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 14.12.2008, 17:02
#7
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Как-то не обратил внимания на изменение, которое сделал Кулик Алексей aka kpblc в #2.

Для извлечения полного содержимого мультитекста конструкции
(cdr (assoc 1 edata)) недостаточно. Здесь будет возвращена только последняя часть строки. А предыдущие будут зашиты в пары с кодом 3, только сколько их - заранее неизвестно.

То есть надо "сложить" все строки, содержащиеся под кодом 3 со строкой с кодом 1. Сделал это не так, как Алексей -
Код:
[Выделить все]
(apply (function strcat)
		  (mapcar (function cdr)
			  (vl-remove-if-not
			    (function
			      (lambda (x)
				(member (car x) '(1 3))
				) ;_ end of lambda
			      ) ;_ end of function
			    edata
			    ) ;_ end of vl-remove-if-not
			  ) ;_ end of mapcar
		  )
менее изящно, но надежней. А заставила понять, зачем он так делал почти случайность - ранее я в MTEXT особо не влезал. Усовершенствовал программу "текст-лупа". Это возможность просматривать с увеличением всякие мелкие надписи (тексты, атрибуты, размеры, мультивыноски, мультитексты). Указанный текст выодится в окно "лупы" (рисунок 1). Тут главная задача была - отобразить специальные символы (диаметры, прокат и т.п.). Попутно обнаружилось, что длинные тексты отображаются не полностью. Вот и вспомнил, что Алексей зачем-то коды 1 и 3 обрабатывал. В итоге получилась и полная загрузка текста (рисунок 2).

Век живи - век учись.
Миниатюры
Нажмите на изображение для увеличения
Название: dlg_txt_magn.png
Просмотров: 124
Размер:	4.6 Кб
ID:	13501  Нажмите на изображение для увеличения
Название: dlg_txt_magn_2.png
Просмотров: 123
Размер:	17.3 Кб
ID:	13502  
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Извлечение текстовой строки из примитива

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) Red Nova LISP 4555 24.03.2024 13:44
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Извлечение данных в шаблон EXEL. OHUKC Программирование 23 15.09.2008 19:45
Как Извлечь из строки числа Kostinok Программирование 7 12.08.2008 08:00
Извлечение значения параметра регистра отлиного от строки AleX Программирование 13 27.01.2005 18:06