Сообщество программистов Autodesk в СНГ

ADN Club => VBA => Тема начата: sangvinik128 от 02-12-2019, 16:18:29

Название: Обращение к текущему объекту
Отправлено: sangvinik128 от 02-12-2019, 16:18:29
Здравствуйте ! Хочу написать макрос, который будет менять цвет всех символов кириллицы, в выбранном пользователем объекте пр-ва модели. Не подскажете, как мне обращаться к текущему ( который выделен пользователем в данный момент) объекту на языке VBA ?
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 02-12-2019, 16:22:46
Не подскажете, как мне обращаться к текущему ( который выделен пользователем в данный момент) объекту на языке VBA ?
1. Одновременно может быть выбрано ни одного объекта, один объект, несколько объектов. Причем они могут быть разных типов.
2. Набор предварительного выбора: AcadDocument.PickfirstSelectionSet
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 07:48:11
Ну мне нужно обрабатывать только объекты типа : AcadMText, AcadText, AcadTable.
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 03-12-2019, 10:17:13
Ну мне нужно обрабатывать только объекты типа : AcadMText, AcadText, AcadTable.
Ну значит только их будешь выбирать из .PickfirstSelectionSet
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 10:43:00
Ну да, хорошо, спасибо
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 10:58:48
Как я понял, посимвольно цвет поменять не получится у текстового объекта ? Хотелось бы визуально выделить искомые символы каким-то образом, ничего не посоветуете ?
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 12:05:45
Вообще можно ли работать с символами объектов ? Все св-ва и методы ( в случае AcadTable) возвращают строку, строку можно преобразовать в массив символов, но в этом случае мы уже не работаем с объектом AutoCAD
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 03-12-2019, 12:12:20
Вообще можно ли работать с символами объектов ?
С символами объектов ты работать можешь. Но вот менять им цвет...
1. Для AcadText можно менять цвет только всей строке.
2. Для AcadMText можно поменять цвет отдельному символу используя коды \CNNN;, где NNN - номер цвета от 1 до 255
Описание управляющих полей: https://adndevblog.typepad.com/autocad/2017/09/dissecting-mtext-format-codes.html
3. Для ячейки AcadTable аналогично как и для AcadMText
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 12:27:09
Ну, в MText я меняю цвет таким образом :
Код - F# [Выбрать]
  1. objMText.TrueColor.ColorIndex = acRed
А как мне обратиться по индексу символа к MText ?
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 03-12-2019, 12:35:24
Ну, в MText я меняю цвет таким образом :
Код - Visual Basic [Выбрать]
  1. objMText.TrueColor.ColorIndex = acRed
А как мне обратиться по индексу символа к MText ?
Никак. И таким образом ты меняешь цвет всему MText;
Допустим у тебя есть MText с содержимым "123456789" и тебе нужно, чтобы цвет у цифры 5 был красный, а у остальных символов белый, то нужно изменить строку на:
"\C7;1234\C1;5\C7;6789"  (7 - это белый цвет, 1 - красный цвет)
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 12:44:35
А могу ли я запомнить текущий код (цвет) объекта ? Чтобы парсить строку и то, что мне нужно оставлять как было, а по требуемому индексу в строке уже менять цвет
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 03-12-2019, 12:47:08
А могу ли я запомнить текущий код (цвет) объекта ? Чтобы парсить строку и то, что мне нужно оставлять как было, а по требуемому индексу в строке уже менять цвет
Ну да. Так же как ты менял цвет всему MText, ты можешь получить этот цвет: objMText.TrueColor.ColorIndex
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 03-12-2019, 12:51:08
Впрочем если у тебя уже будут коды цвета внутри содержимого MText, то ты легко можешь запутаться.
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 12:53:10
Всё понял, кроме крайнего сообщения. Почему могу запутаться ?
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 03-12-2019, 13:00:57
Всё понял, кроме крайнего сообщения. Почему могу запутаться ?
Ну допустим у тебя содержимое MText такое:
{\fISOCPEUR|b0|i0|c0|p34;\H0.95833x;\C256;\U+00D8\A1;\H1.04348x;\C7;80}Т.е. уже есть заданные цвета для каких-то кусков текста. Что ты с таким будешь делать?
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 13:09:22
Вот только что сидел и об этом думал, теперь понял о чём Вы  :) В AutoCAD без нюансов не бывает... :'(
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 03-12-2019, 13:13:10
Вот только что сидел и об этом думал, теперь понял о чём Вы  :) В AutoCAD без нюансов не бывает... :'(
Мне вообще непонятна постановка задачи. Я правильно понимаю, что в текстах не должно быть кириллицы и нужно как-то её обозначить, чтобы можно было заменить (например, "е"-русскую на "e"-английскую)? Но просто изменение цвета одной букве вряд ли как-то поможет её найти. Может проще составить таблицу замены и менять русские буквы на соответствующие английские?
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 13:21:09
Да, Вы всё правильно понимаете. Но проблема в том, что в тексте кириллица может быть уместна, а может - нет. Т.е.  автоматизировать такую замену довольно проблематично. И критерия отбора никакого нет, как Вы понимаете, хотя мне бы это значительно облегчило жизнь.
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 03-12-2019, 13:50:03
Ну выделение цветом мне не кажется удобным. Может подчеркивание или надчеркивание?
https://knowledge.autodesk.com/ru/support/autocad-lt/learn-explore/caas/CloudHelp/cloudhelp/2019/RUS/AutoCAD-LT/files/GUID-7D8BB40F-5C4E-4AE5-BD75-9ED7112E5967-htm.html
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 14:01:31
Да, возможно так удобнее будет. Надо попробовать. Спасибо за советы !
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 14:43:48
Как-то у меня не получается сделать. Я вот так пытаюсь присвоить требуемое значение : 
Код - Visual Basic [Выбрать]
  1. objMText.TextString = подстрока1 & \Oподстрока2\o & подстрока3

Под подстроками подразумеваются переменные, которые хранят нужные мне подстроки, полученные в результате использования ф-ций Left,Right
Я так понял, что это полная глупость, но ничего иного в голову не лезет. Не подскажете в чём ошибка ?
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 03-12-2019, 14:46:23
Я так понял, что это полная глупость, но ничего иного в голову не лезет
Полная.
Не подскажете в чём ошибка ?
Наверное в незнании VBA:
Код - Visual Basic [Выбрать]
  1. objMText.TextString = подстрока1 & "\O" & подстрока2 & "\o" & подстрока3
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 03-12-2019, 14:51:05
Я так понял, что это полная глупость, но ничего иного в голову не лезет
Полная.
Не подскажете в чём ошибка ?
Наверное в незнании VBA:
Код - Visual Basic [Выбрать]
  1. objMText.TextString = подстрока1 & "\O" & подстрока2 & "\o" & подстрока3
Да, с VBA имею дело второй раз, но  это у меня уже "котелок" немного "подкипел" , такое непростительно ) Спасибо ! 
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 04-12-2019, 10:49:00
У меня вместо добавления подчёркиваний текст заменяется "абракадаброй". Видимо, нужно сохранять св-ва исходного MText'a и создавать новый MText с исходными св-вами и добавлением подчёркиваний ? С удалением исходного, само собой
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 04-12-2019, 10:56:22
Хотя вообще странно, я ведь засылаю в objMText строку, содержащую коды форматирования текста в объекте. Непонятно
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 04-12-2019, 11:39:11
У меня вместо добавления подчёркиваний текст заменяется "абракадаброй".
Какой абракадаброй? И вообще покажи код, которым ты добавляешь подчеркивание.
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 04-12-2019, 11:40:01
Видимо, нужно сохранять св-ва исходного MText'a и создавать новый MText с исходными св-вами и добавлением подчёркиваний ? С удалением исходного, само собой
Нет. Так делать не следует.
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 04-12-2019, 11:56:38
В общем, у меня есть массив индексов, который я получил путём посимвольного сравнения текста (предварительного преобразованного в массив символов) с массивом символов кириллицы. Индексы получаю я те, что нужно. Затем используя этот массив индексов (в которых стоят нужные мне символы кириллицы) перебираю в цикле  элементы массива строкой:
Код - Visual Basic [Выбрать]
  1. objMText.TextString = Left(objMText.TextString, msInt(i) - 1) & "\O" & Mid(objMText.TextString, msInt(i), 1) & "\o" & Right(objMText.TextString, UBound(msInt()) - msInt(i))
Здесь msInt - массив индексов символов кириллицы.
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 04-12-2019, 12:36:06
sangvinik128,
А теперь напиши, что было в objMText.TextString и что стало после твоего кода.
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 04-12-2019, 12:46:20
Теперь текст вообще удаляется после обработки, когда я там подредактировал некоторые опечатки. Вот строка :
\pxl2,t10;{\Feskd_u|c204;\W0.85;\C256;Примечания\W1;:\P\pi-1,tz;1\W0.85;Перечень изделий и материалов дан для одной позиции прибора.\P2 Перечень учесть: вариант 1 - 2 раза.\P3 Для изоляции с электрообогревом применить холстопрошивное полотно и лист аллюминиевый (заказано в СО2/2400-R-NG-676-IN-MTO-0002-00).}
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 04-12-2019, 12:56:57
Теперь текст вообще удаляется после обработки, когда я там подредактировал некоторые опечатки. Вот строка :
\pxl2,t10;{\Feskd_u|c204;\W0.85;\C256;Примечания\W1;:\P\pi-1,tz;1\W0.85;Перечень изделий и материалов дан для одной позиции прибора.\P2 Перечень учесть: вариант 1 - 2 раза.\P3 Для изоляции с электрообогревом применить холстопрошивное полотно и лист аллюминиевый (заказано в СО2/2400-R-NG-676-IN-MTO-0002-00).}
Это не абракадабра. Это текст с кодами форматирования. Выше я давал ссылку на документ, описывающий эти коды.
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 04-12-2019, 13:01:56
Теперь текст вообще удаляется после обработки, когда я там подредактировал некоторые опечатки. Вот строка :
\pxl2,t10;{\Feskd_u|c204;\W0.85;\C256;Примечания\W1;:\P\pi-1,tz;1\W0.85;Перечень изделий и материалов дан для одной позиции прибора.\P2 Перечень учесть: вариант 1 - 2 раза.\P3 Для изоляции с электрообогревом применить холстопрошивное полотно и лист аллюминиевый (заказано в СО2/2400-R-NG-676-IN-MTO-0002-00).}
Это не абракадабра. Это текст с кодами форматирования. Выше я давал ссылку на документ, описывающий эти коды.
Та нет. Это не то, что я называл абракадброй. У меня уже абракадабра не выводится, теперь текст вообще удаляется. Это я Вам исходный текст скинул
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 04-12-2019, 13:02:48
Вообще логика построения обработки верна ?
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 04-12-2019, 13:37:45
А вот и абракадабра :
Приме\O\OOтопрошивное полотно и ли\\OOшиив\\\OO\OOт\OO\Ooи ли\Oст\\OO\O\\O\Oй (\OOзаказаноака\\\\\O\O\O\\OO\\OO\\OOT\OO\O\OO-\\O
Только вместо "\" знак ">= " выводится в AutoCAD
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 04-12-2019, 13:47:43
sangvinik128,
Логика работы правильная. А вот с индексами что-то не то. Разбирайся.
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 04-12-2019, 13:51:28
sangvinik128,
Логика работы правильная. А вот с индексами что-то не то. Разбирайся.
Хорошо, спасибо.
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 05-12-2019, 11:37:44
Логика работы правильная. А вот с индексами что-то не то. Разбирайся.
Вот не работает хоть убейся, не пойму. Уже трассировку "ручками" раз 10 сделал. Почему-то съедаются буквы некоторые и из-за этого лажа всему приходит.Вот строка :
Исходная строка  = \pxsm0.75;{\flSOCPEUR|b0|i0|c204|p34;\\W0.85; КОВ.Резервуары производственно -\P противопожарного....
Результат 1 итерации в программе :  \pxsm0.75;{\flSOCPEUR|b0|i0|c204|p34;\\W0.85;\OК\oОВ.Резервуары производственно -\P противопожарного....
Результат 2 итерации в программе :  \pxsm0.75;{\flSOCPEUR|b0|i0|c204|p34;\\W0.85;\OК\o\ОВ\oервуары производственно -\P противопожарного....
Результат 3 итерации в программе :  \pxsm0.75;{\flSOCPEUR|b0|i0|c204|p34;\\W0.85;\OК\o\\ОO\oервуары производственно -\P противопожарного....
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 05-12-2019, 11:44:48
Судя по всему ты в левой части строки отбираешь на 1 символ меньше чем надо. Попробуй вместо:
Код - Visual Basic [Выбрать]
  1. Left(objMText.TextString, msInt(i) - 1)
вставить:
Код - Visual Basic [Выбрать]
  1. Left(objMText.TextString, msInt(i))
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 05-12-2019, 11:52:53
Судя по всему ты в левой части строки отбираешь на 1 символ меньше чем надо. Попробуй вместо:
Код - Visual Basic [Выбрать]
  1. Left(objMText.TextString, msInt(i) - 1)
вставить:
Код - Visual Basic [Выбрать]
  1. Left(objMText.TextString, msInt(i))
Нет, я уже пробовал это. Т.е. эта проблема может быть вызвана исключительно ошибкой в индексах ? Нет никаких "автокадовских чуд" , одно из которых могло бы на этой повлиять ?
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 05-12-2019, 11:58:33
Т.е. эта проблема может быть вызвана исключительно ошибкой в индексах ? Нет никаких "автокадовских чуд" , одно из которых могло бы на этой повлиять ?
Именно.
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 05-12-2019, 13:58:38
Т.е. эта проблема может быть вызвана исключительно ошибкой в индексах ? Нет никаких "автокадовских чуд" , одно из которых могло бы на этой повлиять ?
Именно.
Все коды чётко проставились, но надчёркиваний не появилось над надписью в блоке, которую мой код поймал как объект типа MText
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 05-12-2019, 13:59:53
Все коды чётко проставились, но надчёркиваний не появилось над надписью в блоке, которую мой код поймал как объект типа MText
Так блок или MText??? Если это MText в блоке, то нужно регенерировать чертеж.
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 05-12-2019, 14:02:01
Все коды чётко проставились, но надчёркиваний не появилось над надписью в блоке, которую мой код поймал как объект типа MText
Так блок или MText???
Вообще-то блок, вот только мой код строку в блоке поймал как объект типа MText. И тут возникает вопрос, что за дела ? :-[
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 05-12-2019, 14:04:40
Вообще-то блок, вот только мой код строку в блоке поймал как объект типа MText. И тут возникает вопрос, что за дела ?
Внутри блока (AcadBlock) может быть MText. Ты бы код приложил и чертеж, на котором экспериментируешь. А то это гадание на кофейной гуще.
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 05-12-2019, 14:06:23
Добавь на всякий случай в самый конец программы:
Код - Visual Basic [Выбрать]
  1. ThisDrawing.Regen acAllViewports
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 05-12-2019, 14:48:41
Всё сработало, спасибо !
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 06-12-2019, 10:10:09
В объекте типа Text почему-то  не меняется текст строкой :
Код - Visual Basic [Выбрать]
  1. objText.TrueColor.ColorIndex = acRed
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 06-12-2019, 10:12:16
не меняется текст строкой
Текст или цвет?
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 06-12-2019, 10:25:28
не меняется текст строкой
Текст или цвет?
Извиняюсь, цвет. "очепятка"
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 06-12-2019, 12:44:05
не меняется текст строкой
Текст или цвет?
Извиняюсь, цвет. "очепятка"
А так:
Код - Visual Basic [Выбрать]
  1. objText.Color = acRed
?
Название: Re: Обращение к текущему объекту
Отправлено: sangvinik128 от 06-12-2019, 14:19:02
не меняется текст строкой
Текст или цвет?
Извиняюсь, цвет. "очепятка"
А так:
Код - Visual Basic [Выбрать]
  1. objText.Color = acRed
?
Так сработало, спасибо !
Название: Re: Обращение к текущему объекту
Отправлено: Александр Ривилис от 06-12-2019, 14:20:09
Дальше "один вопрос - одна тема".