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

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

Изменение MTEXT и MULTILEADER с сохранением полей. Помогите, пожалуйста

Ответ
Поиск в этой теме
Непрочитано 19.09.2021, 15:48 #1
Изменение MTEXT и MULTILEADER с сохранением полей. Помогите, пожалуйста
modest-bp
 
Регистрация: 15.04.2019
Сообщений: 54

Написал себе - как мог - программку, чтобы можно было в один клик сокращать междустрочный интервал у мультивыносок и многострочного текста. Принципиальное решение задачи увидел через добавление в начале текста \pxsm0.8; (то есть значение требуемого интервала)

В общем, в итоге у многострочного текста - всё ок, но вот у мультивыносок интервал-то сокращается, но вот поля превращаются в обычный текст (((
Помогите, пожалуйста, как сделать так, чтобы всё сохранялось, а изменялся только лишь интервал между строками

Код:
[Выделить все]
 
(defun c:lineSpacing ( / msgAsk entType1 entType2 pickedEnt pickedEntVLA pickedEntType pickedEntContent newEntContent)
 (vl-load-com) 
  (setq 
	entType1 "MTEXT"
	entType2 "MULTILEADER"
	pickedEnt nil
	pickedEntVLA nil
	pickedEntType nil
	pickedEntContent nil
	newEntContent nil
	msgAsk (strcat "Выберите объект типа " entType1 " или " entType2 ":")
	picking_entity t
  )

  (while picking_entity
	(setq pickedEnt (vl-catch-all-apply 'entsel (list msgAsk)))
	(cond
	  (
		(null pickedEnt)
	  )
	  (
		(vl-catch-all-error-p pickedEnt)
		(setq picking_entity nil pickedEnt nil)
	  )
	  (
		(or
		  (= (cdr (assoc 0 (entget (car pickedEnt)))) entType1)
		  (= (cdr (assoc 0 (entget (car pickedEnt)))) entType2)
		)
		(setq picking_entity nil)
	  )
	) ; end cond
  ) ; end while


  (if pickedEnt
	(progn
	  (setq 
		pickedEnt (car pickedEnt)
		pickedEntType (cdr (assoc 0 (entget pickedEnt)))
		pickedEntVLA (vlax-ename->vla-object pickedEnt)
		pickedEntContent (vla-get-TextString pickedEntVLA)
		newEntContent (strcat "\\pxsm0.8;" pickedEntContent)
	  )
	  (princ (strcat "\nВыбран объект типа " pickedEntType))
	  (princ (strcat "\nСодержимое выбранного объекта: \"" pickedEntContent "\""))
	  (vla-put-TextString pickedEntVLA newEntContent)
	  (princ (strcat "\nСодержимое изменено на: \"" newEntContent "\""))
	)
	(princ "Объект не выбран")
  )
  (princ)
)
Изначально планировал вынимать содержимое через DXF код, но вот в многострочном тексте я его нашёл - поле с кодом 1. А вот у мультивыносок - не нашёл, так что пришлось воспользоваться найденным на просторах интернета методом vla-get-TextString.
Просмотров: 411
 
Непрочитано 19.09.2021, 16:22
1 | #2
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,731


Для мультивыносок (в также любых других текстовых объектов) см. у Ли Мака: http://lee-mac.com/fieldcode.html
__________________
Одно меня лишь радует - я это вижу сам! (С)
kp+ вне форума  
 
Автор темы   Непрочитано 19.09.2021, 17:08
#3
modest-bp


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


Цитата:
Сообщение от kp+ Посмотреть сообщение
Для мультивыносок (в также любых других текстовых объектов) см. у Ли Мака: http://lee-mac.com/fieldcode.html
Спасибо!
Если я правильно понял, то его код вынимает откуда угодно поля.
Получается, что для моих целей мне необходимо будет:
  1. "Разобрать" каким-то образом содержимое своей выноски, чтобы вычленить, какая её часть - поле, а какая - простой текст. Куски с текстом - положить в отдельные переменные (сколько их будет - тоже непонятно, т.к. содержимое выносок не шаблонное, полей может быть несколько, и комбинации полей и текста могут быть какими угодно: текст-поле, поле-текст, текст-поле-текст, текст-поле-текст-поле... ну и т.д.)
  2. Извлечь из мультивыноски поле(я)
  3. Заново собрать содержимое выноски, соединив куски текста с полями в правильной последовательности.

Что-то выглядит это совсем мудрёно и даже не представляю себе, как это возможно сделать...

Где-то и когда-то, помню, на глаза попадался метод, позволяющий не перезаписывать полностью что-либо, а просто дописать в начале, в конце, с n-ного символа... Что-то в этом роде... Вот я думаю, может, если не извлекать полностью текстовую строку и не перезаписывать её, а просто дописать в начале нужный код - тогда и не слетят поля?
modest-bp вне форума  
 
Непрочитано 19.09.2021, 21:56
1 | #4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,731


Ничего мудреного тут нет. У Ли Мака написано "The function will yield results identical to the ActiveX fieldcode method..."
А стандартный метод fieldcode как раз выдает всю строку из текстового примитива, со всеми потрохами, включая как статическую часть, так и коды полей. Но какого-то перца работает только с примитивами TEXT и MTEXT, из-за чего гуру пришлось потрудиться, чтобы сделать то же самое для других "текстоподобных" примитивов.
Поэтому в Вашем коде достаточно заменить в строке 42
Код:
[Выделить все]
pickedEntContent (vla-get-TextString pickedEntVLA)
на
Код:
[Выделить все]
pickedEntContent (LM:fieldcode pickedEnt)
__________________
Одно меня лишь радует - я это вижу сам! (С)
kp+ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменение MTEXT и MULTILEADER с сохранением полей. Помогите, пожалуйста

Система Техэксперт дает уверенность в правильности и эффективности принимаемых инженерных решений!
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение полей (fields) RomanM AutoCAD 20 24.08.2016 22:39
Помогите определить серию дома пожалуйста EvilBraiN Поиск литературы, чертежей, моделей и прочих материалов 0 15.05.2016 04:20
Помогите, пожалуйста, с узлом сопряжения балок. Двутавр 55Б1 в 45Б2 Житель леса Металлические конструкции 31 18.02.2014 15:04
пожалуйста помогите сделать спецификацию, есть чертеж с позициями но я не знаю всех обозначений, а после завтра защита диплома, если можете помогите! саняяя Машиностроение 19 22.06.2011 19:22