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

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

LISP. Замена текстового стиля

Ответ
Поиск в этой теме
Непрочитано 18.09.2008, 17:53 15 | 1
LISP. Замена текстового стиля
VVA
 
Инженер LISP
 
Минск
Регистрация: 11.05.2005
Сообщений: 6,990

По мотивам Замена текстового стиля
Команды CTS и CTSU подверглись косметическим улучшением.
Добавлена команда TSUP - изменение начертания текстов, атрибутов на основе установок выбранного стиля (начертание, сжатие, угол наклона).
Использована функция ru-textstyle-update любезно предоставленная ShaggyDoc
Описание команд:
Как это работает - см пост #12
CTS - замена текстовых стилей у всех объектов на выбранный
CTSU - замена текстовых стилей у всех объектов на выбранный с очисткой форматирования многострочных текстов
TSUP - Для выбранного стиля изменяется начертания всех существующих ТЕКСТОВ, АТРИБУТОВ во ВСЕХ примитивах, включая блоки в соответствии с установками стиля (начертание, сжатие, угол наклона). Сначала с помощью команды _style задаем необходимые установки стиля (шрифт, наклон, сжатие/растяжение). Затем командой TSUP для всех текстов и атрибутов, вычерченных этим стилем, устанавливается наклон, сжатие/растяжение такой же как и в определении стиля.
UNF-MTEXT - Убрать форматирование мтекста
Допустим у Вас текст, вычерченный стилем Стиль1 с углом наклона 15 градусов. Вызываем команду _style и выставляем в стиле Стиль1 угол 0. В тексте угол остался прежним 15 градусов. Чтобы синхронизировать параметры текста с параметрами стиля (наклон, сжатие/растяжение) и вызываем команду TSUP.

Возможный вариант макроса для пунктов 3-5
Код:
[Выделить все]
(if (null C:CTS)(load "change text styles (cts)"));CTS;(cts:layer-status-save);(ru-textstyle-update "*");_.PURGE;
***Изменения
22.10.2008 Добавлена обработка форматирования МТЕКСТОВ для Автокада с 2008 версии (выравнивание влево, вправо, посередине, по ширине, распределенное)
02.12.2008 Изменена ф-ция cts:msg-yes в соответствии с постом #46 Диалог строится не VBA, а лиспом (dcl)
26.02.2009 Версия 1.3 Исключена обработка блоков внешних ссылок (Спасибо Sleekka). Добавлен выбор игнорируемых стилей
16.03.2009 В версии 1.3 CTSU исправлена ошибка с разным количеством аргументов
05.02.2010 Добавлена обработка дополнительного форматирования в ф-цию mip_MTEXT_Unformat (см. сообщение wetr)
09.03.2010 В версии 1.4 в TSUP исправлена ошибка обработки примитивов только на текущем листе
03.06.2010 Отдельная команда для удаления форматирования мтекста
23.12.2011 UNF-MTEXT (vla-SetCellState item row col acCellStateNone) Снятие блокировки ячейки
21.11.2013 Добавлена обработка MLEADER. Команда CTS
20.04.2016 Добавлена функция CTS:GET-TEXTSTRING (как замена vla-get-textstring. Т.к. неверно возвращает строку при наличии юникод символов)
http://forums.autodesk.com/t5/visual...s/td-p/4365165


Описание
Цитата:
DESCRIPTION

StripMtext v5.0b Copyright© Steve Doman and Joe Burke 2010

StripMtext is an AutoLISP program that runs inside AutoCAD 2000 or above and enables the AutoCAD user to quickly remove unwanted Mtext formatting embedded in Mtext, Mleaders, Dimensions, Tables, and Multiline Attributes objects.
Оригинальный пост (требуется регистрация)





В версии 1.5 добавлена отдельная команда UNF-MTEXT для удаления форматирования MTEXTa
В версии 1.6 добавлено снятие блокировки ячейки таблицы при установке связи Datalink
Важно!!! Начиная с 2021 Автокада может не срабатывать команда stripmtext. Решение - установить системную переменную LISPSYS=0
См пост #281 и #282 или гугл

Вложения
Тип файла: lsp StripMtext v5-0c.lsp (60.1 Кб, 22809 просмотров)
Тип файла: lsp change text styles (cts) 2.0c.LSP (44.3 Кб, 7091 просмотров)

__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 03.11.2023 в 14:28. Причина: см пост #290
Просмотров: 583853
 
Непрочитано 11.01.2009, 10:23
#61
Romanich

Robot и Хобот
 
Регистрация: 29.08.2003
Abu Dhabi
Сообщений: 940
Отправить сообщение для Romanich с помощью Skype™


dextron3,
Цитата:
а то существуют люди которые до сих пор пользуются м-текстами
И будут пользоваться, потому что м-текст это мегаудобная вещь.
__________________
Robot и Хобот
Romanich вне форума  
 
Непрочитано 11.01.2009, 10:33
#62
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Romanich
Все удобства на прочь убивают его недостатки.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 11.01.2009, 14:04
#63
dextron3

проектировшик
 
Регистрация: 01.01.2007
СССР
Сообщений: 5,143


Кулик Алексей aka kpblc,
Алгоритм лиспа:
1. Выбираются все м-тексты
2. Взрываются
3. Опять выбираются
4. Дальше обрабатываются существующим лиспом

вот так как то...
буду рад за помощь может максросом тут получиться обойтись..
__________________
инженер проектировшик с опттом программа авто гад образование высшие
dextron3 вне форума  
 
Непрочитано 13.01.2009, 11:39
#64
Hans667

сети
 
Регистрация: 12.04.2007
SPb
Сообщений: 536
Отправить сообщение для Hans667 с помощью AIM Отправить сообщение для Hans667 с помощью Skype™


VVA в первом посте CSTU поправь на правильный.А то сбивает с упти истинного. Не понимаю чем CTS отличается от замены стиля у всех объектов сразу в панели свойств
__________________
Errare humanum est, insipientis perseverare
Hans667 вне форума  
 
Автор темы   Непрочитано 13.01.2009, 16:32
#65
VVA

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


А что в CSTU не правильного?
Цитата:
Не понимаю чем CTS отличается от замены стиля у всех объектов сразу в панели свойств
А тем, что меняет стили у ВСЕХ примитивов (в том числе в блоках, атрибутах, размерах, а так же на всех листах. Короче по всей базе чертежа)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.01.2009, 15:19
#66
Hans667

сети
 
Регистрация: 12.04.2007
SPb
Сообщений: 536
Отправить сообщение для Hans667 с помощью AIM Отправить сообщение для Hans667 с помощью Skype™


ну CTSU наверно а не CSTU. Иначе выдает что команда не известная
__________________
Errare humanum est, insipientis perseverare
Hans667 вне форума  
 
Автор темы   Непрочитано 14.01.2009, 15:33
#67
VVA

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


Исправил
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 12.02.2009, 03:42
#68
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,535
<phrase 1= Отправить сообщение для wetr с помощью Skype™


VVA, очередной МЕГА РЕСПЕКТИЩЕ!!!
Вот что значит человек занимается своим делом.
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Непрочитано 26.02.2009, 15:40
#69
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Есть рац предложения:
функцию:
Код:
[Выделить все]
;Extensions:
;It is possible to add bulged segments too by extending the data structure "segment" with (p1 p2 bulge) for curved segments and use a line-arc resp. arc-arc intersection method for those. Then a straight segment is still representable with (p1 p2) 
;line-arc and arc-arc intersection methods are e.g. in GLNADS.C of the AutoCAD SDK 2.0 and may be easily ported to AutoLISP. Another method is with VLA where it is possible to use (vla-intersect-with obj1 obj2), which works with curves and splines too. 
;;Posted by T.Willey 
;;http://www.theswamp.org/index.php?topic=14247.15
;;Обработка всех примитивов рисунка через VLA
;; Doc - vla указатель на обрабатываемый документ
;; StyName - имя стиля
;; Unformat t - снос форматирования nil - нет
(defun ChangeAllTextObjectsStyle (Doc StyName Unformat / tempObjType IsLo ColCnt RowCnt)
(vlax-for Blk (vla-get-Blocks Doc)
 (setq IsLo (if (= (vla-get-IsLayout Blk) :vlax-true) T nil))
 (if (= (vla-get-IsXref Blk) :vlax-false)
  (vlax-for Obj Blk (setq tempObjType (vla-get-ObjectName Obj))
   (if (and Unformat (vlax-property-available-p Obj 'Textstring))
     (vla-put-Textstring Obj (substr (apply 'strcat (mapcar '(lambda(x)(strcat "\\P" x))
     (mapcar 'mip_MTEXT_Unformat (str-str-lst (vla-get-Textstring Obj) "\\P")))) 3)))
   (cond
    ((vl-position tempObjType '("AcDbText" "AcDbMText" "AcDbAttributeDefinition"))
     (vla-put-StyleName Obj StyName)(if (not IsLo)(vla-put-Layer Obj "0")))
    ((wcmatch tempObjType "AcDb*Dimension")(vla-put-TextStyle Obj StyName))
    ((= tempObjType "AcDbBlockReference")
     (foreach Att (vlax-invoke Obj 'GetAttributes)
      (vla-put-StyleName Att StyName))
     (foreach Att (vlax-invoke Obj 'GetConstantAttributes)
      (vla-put-StyleName Att StyName)))
    ((= tempObjType "AcDbTable")(setq ColCnt 0)
     (repeat (vla-get-Columns Obj)(setq RowCnt 0)
      (repeat (vla-get-Rows Obj)(vlax-invoke Obj 'SetCellTextStyle RowCnt ColCnt StyName)
       (setq RowCnt (1+ RowCnt)))
      (setq ColCnt (1+ ColCnt)))))))))
Поменять на:
Код:
[Выделить все]
;Extensions:
;It is possible to add bulged segments too by extending the data structure "segment" with (p1 p2 bulge) for curved segments and use a line-arc resp. arc-arc intersection method for those. Then a straight segment is still representable with (p1 p2) 
;line-arc and arc-arc intersection methods are e.g. in GLNADS.C of the AutoCAD SDK 2.0 and may be easily ported to AutoLISP. Another method is with VLA where it is possible to use (vla-intersect-with obj1 obj2), which works with curves and splines too. 
;;Posted by T.Willey 
;;http://www.theswamp.org/index.php?topic=14247.15
;;Modify by Sleekka
;;Обработка всех примитивов рисунка через VLA
;; Doc - vla указатель на обрабатываемый документ
;; StyName - имя стиля
;; Unformat t - снос форматирования nil - нет
(defun ChangeAllTextObjectsStyle (Doc StyName Unformat / tempObjType IsLo ColCnt RowCnt)
(vlax-for Blk (vla-get-Blocks Doc)
 (setq IsLo (if (= (vla-get-IsLayout Blk) :vlax-true) T nil))
 (if
   ;start the initial code
	;(= (vla-get-IsXref Blk) :vlax-false) 
   ;end the initial code

   
   ;;start added by Sleekka
   (and
       (= (vla-get-IsXref Blk) :vlax-false)
	(not (wcmatch (_dwgru-property-get blk 'name) "*|*")) 
       )
      ;;end added by Sleekka
  (vlax-for Obj Blk (setq tempObjType (vla-get-ObjectName Obj))
   (if (and Unformat (vlax-property-available-p Obj 'Textstring))
     (vla-put-Textstring Obj (substr (apply 'strcat (mapcar '(lambda(x)(strcat "\\P" x))
     (mapcar 'mip_MTEXT_Unformat (str-str-lst (vla-get-Textstring Obj) "\\P")))) 3)))
   (cond
    ((vl-position tempObjType '("AcDbText" "AcDbMText" "AcDbAttributeDefinition"))
     (vla-put-StyleName Obj StyName)(if (not IsLo)(vla-put-Layer Obj "0")))
    ((wcmatch tempObjType "AcDb*Dimension")(vla-put-TextStyle Obj StyName))
    ((= tempObjType "AcDbBlockReference")
     (foreach Att (vlax-invoke Obj 'GetAttributes)
      (vla-put-StyleName Att StyName))
     (foreach Att (vlax-invoke Obj 'GetConstantAttributes)
      (vla-put-StyleName Att StyName)))
    ((= tempObjType "AcDbTable")(setq ColCnt 0)
     (repeat (vla-get-Columns Obj)(setq RowCnt 0)
      (repeat (vla-get-Rows Obj)(vlax-invoke Obj 'SetCellTextStyle RowCnt ColCnt StyName)
       (setq RowCnt (1+ RowCnt)))
      (setq ColCnt (1+ ColCnt)))))))))
ну и закинуть туды функцию _dwgru-property-get
Потому что если в обрабатываемом чертеже есть внешние ссылки а у ссылок есть блоки у которых есть атрибуты, мтексты и тд, то поменять стили таких атрибутов нельзя и программа возвращает ошибку, хотя конечно посещают мысли что проще все в vl-catch-all_apply оборачивать.

Последний раз редактировалось Кулик Алексей aka kpblc, 26.02.2009 в 23:18.
Sleekka вне форума  
 
Непрочитано 26.02.2009, 23:17
#70
Кулик Алексей aka kpblc
Moderator

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


Еще один вариант фильтрации внешних ссылок:
Код:
[Выделить все]
(defun is-ent-xref (ent)
                          ;|
*    Функция проверяет, является ли переданный указатель внешней ссылкой
*    ent	указатель на проверяемый примитив
|;
  (if (setq ent (cond
                  ((= (type ent) 'vla-object) ent)
                  ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                  ) ;_ end of cond
            ) ;_ end of setq
    (or (and (vlax-property-available-p ent 'isxref)
             (equal (vla-get-isxref ent) :vlax-true)
             ) ;_ end of and
        (and (= (vla-get-objectname ent "AcDbBlockReference")
                (vlax-property-available-p ent 'path)
                ) ;_ end of =
             ) ;_ end of and
        ) ;_ end of or
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.02.2009, 09:20
#71
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Алексей, вариант, не плохой, но я говорил не об этом.
Дело в том что блоки находящиеся внутри внешней ссылки, светят в текущем чертеже с именами примерно такими: Чертеж1(вертикальная палочка)Блок1. Дак вот эти блоки на isXref возвращают nil, и рассматриваются как блоки текущего чертежа, но у этих блоков нельзя изменить ни одного свойства.
Sleekka вне форума  
 
Автор темы   Непрочитано 27.02.2009, 10:11
#72
VVA

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


Добавил в #1 версию 1.3. Толком еще не тестировал, поэтому пока не убрил 1.2.
Помимо НЕ обработки блоков и текстовых стилей внешних ссылок добавил еще один запрос на игнорируемые стили (т.е. те, трогать которые не нужно). Если нужно причесать все стили, в 1-м запросе жмем отмена.
> Кулик Алексей aka kpblc По поводу еще одного варианта фильтрации всего, что приходит от внешних ссылок. Я использую snvalid. Имена с символом "|" она не пропускает.
Отсечь текстовые стили внешних ссылок : (vl-remove-if-not '(lambda(x)(snvalid x))(tablelist "STYLE"))
Отсечь слои внешних ссылок : (vl-remove-if-not '(lambda(x)(snvalid x))(tablelist "LAYER"))
ну и так далее
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 27.02.2009, 12:35
#73
Кулик Алексей aka kpblc
Moderator

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


Скажу честно - код сейчас смотреть и по-нормальному расковыривать нет времени, поэтому практически оффтоп: просто я сначала запрашиваю все обрабатываемые элементы, из них исключаю внешние ссылки. Потом, если попались блоки, по "внутренностям" блоков опять же с исключением внешних ссылок, вставленных в блок. Добавляя полученный состав к общему списку. Ну и так далее, чистой рекурсией.
P.S. У меня в 2008-м удавалось "поиграться" с составом внешних ссылок текущего документа, и даже что-то там я менял Но это до первой перезагрузки ссылок Потом я просто вставил фильтрацию и подобные извращения прекратились.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.02.2009, 14:09
#74
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


в 1.3 ошибка
в команде C:CTSU
Код:
[Выделить все]
(ChangeAllTextObjectsStyle (vla-get-activedocument (vlax-get-acad-object)) st t))
передается 3 аргумента а требуется 4.
Sleekka вне форума  
 
Автор темы   Непрочитано 16.03.2009, 20:06
#75
VVA

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


Цитата:
в 1.3 ошибка
в команде C:CTSU
Исправил версию 1.3. Обновил пост #1
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 06.04.2009, 16:32
#76
timer


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


Кто-нибудь пробовал такой лисп написать и к размерным стилям?
timer вне форума  
 
Непрочитано 06.04.2009, 16:58
#77
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


там не нужно...
Sleekka вне форума  
 
Непрочитано 06.04.2009, 22:23
#78
timer


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


Почему не нужно? Было бы неплохо.
timer вне форума  
 
Непрочитано 06.04.2009, 22:55
#79
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Изучи стандартные средства автокада - там их достаточно...
Sleekka вне форума  
 
Непрочитано 06.05.2009, 12:02
#80
Hans667

сети
 
Регистрация: 12.04.2007
SPb
Сообщений: 536
Отправить сообщение для Hans667 с помощью AIM Отправить сообщение для Hans667 с помощью Skype™


а ширину МТекста сразу на всех примитивах убить не удастся?или обнулить допустим.
__________________
Errare humanum est, insipientis perseverare
Hans667 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > LISP. Замена текстового стиля

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена текстого стиля Shoorup Программирование 43 19.05.2015 09:22
Есть ли замена текстового редактора MtmdEdit 2.4.0 beta for AutoCAD 2007 dextron3 Программирование 16 23.06.2008 20:54
Библиотека доступа к содержимому растров из LISP - существуе kp+ LISP 6 16.10.2007 21:45
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19
Настройка "Стандартного" текстового стиля. Кулик Алексей aka kpblc AutoCAD 6 23.10.2003 22:49