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

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

Закрашивание редактируемого текста

Ответ
Поиск в этой теме
Непрочитано 28.11.2017, 16:58 #1
Закрашивание редактируемого текста
alik3001
 
Регистрация: 12.09.2016
Сообщений: 33

Добрый вечер, уважаемые форумчане!
Столкнулся со следующей проблемой.
Хочу написать программу которая будет закрашивать текст после редактирования. Чтобы видеть какой текст уже отредактировал, а какой еще предстоит.
Привожу листинг:
(defun C:colm(/ T1 Z1 Zot ber Z proect h ml_text DimPropertyList ZotText)
(while (setq PropertyList (entget (car (entsel))))
(setq PropertyList (subst (cons 62 5) (assoc 62 PropertyList) PropertyList))
(entmod PropertyList)
(vl-cmdf "_.textedit" "\\" "\\" )
)
)

Она глючит, выбор на третьей итерации проводится 3 раза. Что нужно исправить?
Просмотров: 3610
 
Непрочитано 28.11.2017, 17:15
#2
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от alik3001 Посмотреть сообщение
Хочу написать программу
Да ты выдрал грубо откуда-то этот код и выдаешь за свою разработку?
Setvar вне форума  
 
Автор темы   Непрочитано 28.11.2017, 17:47
#3
alik3001


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


Цитата:
Сообщение от Setvar Посмотреть сообщение
Да ты выдрал грубо откуда-то этот код и выдаешь за свою разработку?
Я вижу вы провидец, раз видите откуда мой код.
alik3001 вне форума  
 
Непрочитано 28.11.2017, 19:55
#4
Кулик Алексей aka kpblc
Moderator

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


Откуда код не скажу, поскольку не знаю. Но что код либо кусок другой программы, либо другого автора - почти гарантирую (признаки расписывать не стану, уж извини).
Если известно, какая строка кода что делает - кто мешает их менять местами до достижения нужного результата?
P.S. Лично я предпочитаю с текстами командными методами не работать - уж больно много там слабопредсказуемого. ИМХО лучше написать свой "типа редактор" и в нем все обрабатывать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.11.2017, 20:05
#5
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от alik3001 Посмотреть сообщение
раз видите откуда мой код.
Где это я написал, что вижу, откуда ТВОЙ код? Любой в этом разделе, посмотрев на список локальных переменных, согласится, что код нагло вырван, украден из неизвестной программы.
Setvar вне форума  
 
Автор темы   Непрочитано 28.11.2017, 20:34
#6
alik3001


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


Эти переменные из другой моей же программы, которую использовал как шаблон. Создавать редактор это лишняя работа. Нужна простая функция, которая работает в цикле, чтоб можно было редактировать большое колличество отдельных текстов. Это применяется в изменении исходного dwg файла, для создания на его основе исполнительной схемы.
Перепишу код, чтоб не портили читаемость лишние переменные
(defun C:colm(/PropertyList)
(while (setq PropertyList (entget (car (entsel))))
(setq PropertyList (subst (cons 62 5) (assoc 62 PropertyList) PropertyList))
(entmod PropertyList)
(vl-cmdf "_.textedit" "\\" "\\" )
)
)
alik3001 вне форума  
 
Непрочитано 28.11.2017, 21:37
1 | #7
Кулик Алексей aka kpblc
Moderator

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


Offtop: Вот даж не знаю - потратить 15 минут на нарисование более-менее внятного кода или так оставить...
alik3001, команду воткни до модификации примитива и не парься
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.11.2017, 14:39
#8
alik3001


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


Да, это помогло. Не могу понять почему такая разница в выполнии, между ними?(
Осталось сделать проверку, на текст с цветом "по слою", так как не работает все в этом случае. Надо будет точечную пару записывать в список (62. 1). Но как ее записать не знаю во внутрь. Через (cons (cons 62.1) PropertyList) не работает entmod. Неужели через list придется создавать список новый с (62. 1) в середине. И к нему применять (subst)
alik3001 вне форума  
 
Непрочитано 29.11.2017, 15:00
#9
Кулик Алексей aka kpblc
Moderator

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


Не складывается:
Цитата:
Сообщение от alik3001 Посмотреть сообщение
из другой моей же программы, которую использовал как шаблон.
То есть хотя бы минимальное понимание должно быть. И тут же:
Цитата:
Сообщение от alik3001 Посмотреть сообщение
Не могу понять почему такая разница в выполнии, между ними?
Цитата:
Сообщение от alik3001 Посмотреть сообщение
Осталось сделать проверку, на текст с цветом "по слою", так как не работает все в этом случае.
http://forum.dwg.ru/showthread.php?t...EA%E0%F6%E8%FF попробуй
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.11.2017, 14:08
1 | #10
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


alik3001,
Цитата:
Сообщение от alik3001 Посмотреть сообщение
программу которая будет закрашивать текст после редактирования.
Что-то в этом есть, да и как-то руки почесались)

Код:
[Выделить все]
 

;***************************************************************************************************************************************
;
;                                                    Written by koMon 30.11/2017
;
;***************************************************************************************************************************************

(vl-load-com)

;***************************************************************************************************************************************

(defun Check_Locale ( / AcaKey AcaVer AppKey TmpKey)
	(setq AcaVer (substr (getvar "ACADVER") 1 4)
		  AppKey (strcat"\\Software\\Autodesk\\AutoCAD\\R" AcaVer)
		  TmpKey (strcat "HKEY_LOCAL_MACHINE" AppKey)
		  AcaKey (if (> (atof AcaVer) 15.0)
		  			(vl-registry-read (strcat "HKEY_CURRENT_USER" AppKey) "CurVer")
		 			(vl-registry-read TmpKey "CurVer")
				  )
	)
	(cond
		(
			(= (vl-registry-read (strcat TmpKey "\\" AcaKey) "Language") "Русский")
				;                           0                         1                        2                   3                             		4                                        5
				(setq prompts (list "Выберите Текст/МТекст: " "\nНичего не выбрано! " "\nНеправильный выбор! " "\nКоманда отменена! " "\nВыбранный текст на блокированном слое! " "\nЧто-то пошло прям не так!"))
		)
		(
			t
				;                           0                         1                        2                   3                         	4                                5
				(setq prompts (list "Select Text/MText: " "\nNothing is Selected! " "\nWrong Selection! " "\nCommand Cancelled! " "\nSelected Text is on Locked Layer! " "\nSomething Went Wrong! "))
		)

	)
)

;***************************************************************************************************************************************

(defun Get_Text_to_Change ( / entsel_return entsel_data )
	(setq entsel_return (type (setq entsel_data (vl-catch-all-apply 'EntSel (list (strcat (if (null aux_prompt) (setq aux_prompt "\n") aux_prompt) (strcat "\n" aux_prompt (nth 0 prompts))))))))
	(cond
		(
			(= entsel_return 'LIST)
				(cond
					(
						(or
							(= (vla-get-objectname (setq selected_object (vlax-ename->vla-object (car entsel_data)))) "AcDbText")
							(= (vla-get-objectname selected_object) "AcDbMText")
						)
							(if (= :vlax-true (vla-get-lock (vlax-ename->vla-object (tblobjname "Layer" (vla-get-layer selected_object)))))
								;(vla-put-lock (vlax-ename->vla-object (tblobjname "Layer" (vla-get-layer selected_object))) :vlax-false)
								(progn
									(setq aux_prompt (nth 4 prompts))
									4
								)
								1
							)
					)
						(
							t
								(setq aux_prompt (nth 2 prompts))
								2
						)
				)
		)
						(
							(= entsel_return 'VL-CATCH-ALL-APPLY-ERROR)
								(setq aux_prompt "")
								3
						)
						(
							t
								(setq aux_prompt (nth 1 prompts))
								0
						)
	)
)

;***************************************************************************************************************************************

(defun C:Changed_Text_Color ( / command_is_active index_color_of_changed_text aux_prompt selection_output selected_object selected_text_entity
								vla_object_before_changes_string vla_object_truecolor vla_object_truecolor_color_index vla_object_after_changes_string
								aux_prompt prompts
							)
	(Check_Locale)
	(setq command_is_active t
		  index_color_of_changed_text 5
		  aux_prompt ""
	)
	(setvar "cmdecho" 0)
	(while command_is_active
		(setq selection_output (Get_Text_to_Change))
		(cond
			(
				(= selection_output 0)
					(princ (nth 1 prompts))
			)
			(
				(= selection_output 1)
					(setq selected_text_entity (vlax-vla-object->ename selected_object)
			  			  vla_object_before_changes_string (vla-get-textstring selected_object)
			  			  vla_object_truecolor (vla-get-truecolor selected_object)
			  			  vla_object_truecolor_color_index (vla-get-colorindex vla_object_truecolor)
					)
					(vl-cmdf "._textedit" "_m" "_s" selected_text_entity)
					(setq vla_object_after_changes_string (vla-get-textstring selected_object))
					(if (/= vla_object_before_changes_string vla_object_after_changes_string)
						(progn
			  				(vla-put-colorindex vla_object_truecolor (if (= index_color_of_changed_text vla_object_truecolor_color_index) (1+ index_color_of_changed_text) index_color_of_changed_text))
			  				(vla-put-truecolor selected_object vla_object_truecolor)
						)
					)
					(setq aux_prompt "")
			)
			(
				(= selection_output 2)
					(princ (nth 2 prompts))
			)
			(
				(= selection_output 3)
					(princ (nth 3 prompts))
					(setq command_is_active nil)
			)
			(
				(= selection_output 4)
					(princ (nth 4 prompts))
			)
			(
				t
					(princ (nth 5 prompts))
					(setq command_is_active nil)
			)
		)
	)
	(setq aux_prompt "")
	(setvar "cmdecho" 1)
	(princ)
)



Последний раз редактировалось koMon, 18.01.2018 в 17:54.
koMon вне форума  
 
Непрочитано 30.11.2017, 14:23
#11
Кулик Алексей aka kpblc
Moderator

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


koMon, к сожалению, забыл про локализацию. И про видимость переменных
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.11.2017, 15:06
#12
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Кулик Алексей aka kpblc,
ну я думаю видимость переменных проблема не большая)
локализацию можно доработать, если это конечно кому-то нужно?!)
если у тебя русский автокад, то скажи что у тебя в ключе <HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\RXX.X\ACAD-XXXX:XXX\Language>?

Последний раз редактировалось koMon, 30.11.2017 в 17:24.
koMon вне форума  
 
Непрочитано 30.11.2017, 15:15
#13
Кулик Алексей aka kpblc
Moderator

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


Я вообще-то про вызов команд, а не про приглашения, если что
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.11.2017, 15:47
#14
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


так и я про это)
так что в реестре?
koMon вне форума  
 
Автор темы   Непрочитано 30.11.2017, 15:48
#15
alik3001


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


Я хотел сказать, что почему
;(vl-cmdf "_.textedit" "\\" "\\" "\\") и
;(command-s "_.textedit") по разному выполняются, ведь принцип один и тот же.
Я попробовал через ActiveX сделать, в Helpe поковырялся. Вот что получилось.
;-----------------------------
(defun C:colm(/ PropertyList)
(vl-load-com)
(setq acadObj (vlax-get-acad-object))
(setq doc (vla-get-ActiveDocument acadObj))
(while (setq PropertyList (entget (car (entsel))))
(setq T1 (cdr(assoc 62 PropertyList)))
(if (numberp T1)
(setq PropertyList (subst (cons 62 5) (assoc 62 PropertyList) PropertyList))
)
(if (not (numberp T1))
(progn (setq zo (vlax-ename->vla-object (cdr (car PropertyList))))
(vla-put-Color zo 6)
(setq e1 (vlax-vla-object->ename zo))
(setq PropertyList (entget e1))
(setq PropertyList (subst (cons 62 5) (assoc 62 PropertyList) PropertyList))
))
(entmod PropertyList)
;(vl-cmdf "_.textedit" "\\" "\\" "\\")
(command-s "_.textedit")
)
)
;----------------------------------

На досуге посмотрю код и ссылку)))
alik3001 вне форума  
 
Непрочитано 30.11.2017, 15:50
#16
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


ладно, считаю что Russian... Обновил макрос...
koMon вне форума  
 
Непрочитано 30.11.2017, 15:53
#17
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Еще бы узнать, что там в гроссбухе написано. На 17 странице.
Setvar вне форума  
 
Непрочитано 30.11.2017, 15:56
#18
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Setvar,
Цитата:
Сообщение от Setvar Посмотреть сообщение
На 17 странице.
в гроссбухе на 17 странице стоит штамп библиотеки)))
koMon вне форума  
 
Непрочитано 30.11.2017, 16:01
#19
Кулик Алексей aka kpblc
Moderator

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


koMon, замени 89 строку:
Код:
[Выделить все]
 (vl-cmdf "._textedit" "m" "s" selected_text_entity)
на
Код:
[Выделить все]
 (vl-cmdf "._textedit" "_m" "_s" selected_text_entity)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.11.2017, 16:07
#20
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от koMon Посмотреть сообщение
в гроссбухе на 17 странице стоит штамп библиотеки
Так это стоит, а написано что? Алексей Кулик показал, что там написано.
Setvar вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Закрашивание редактируемого текста

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программное создание размерных стилей Кулик Алексей aka kpblc Программирование 89 08.04.2013 12:59
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
Вопрос. Способы написания текста в AutoCADe. макс геодезист AutoCAD 16 14.07.2011 21:36
как редактировать contents в свойствах текста? как привязать размер текста атрибута к размеру блока? p-sm AutoCAD 3 13.08.2009 18:08
Курсор в конец редактируемого текста? zlobandr AutoCAD 15 13.05.2008 16:41