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

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 29-11-2013, 11:58:55

Название: "Своё" поле с указанием отображаемого текста
Отправлено: Андрей Бушман от 29-11-2013, 11:58:55
Тема не относится к категории .NET, но поскольку нет ветки по вопросам, не связанным с конкретным языком программирования, то спрашиваю здесь.

Мне нужно в тексте или атрибуте размещать текстовую информацию которая бы внешне выглядела как поле Field, но не вычислялась AutoCAD'ом и не показывала в качестве текста ####. В качестве значения такое поле должно содержать текст, указанный мною в составе этого поля. Моя программа сама будет вычислять значение для этого поля и прописывать их в него.

Т. е. предположим, что я напишу нечто подобное:

%<Bushman.SheetSet \GetObj(123456).GetCustomProp("some_name") \DefaultText("0000")>%
в поле присутствует некоторая информация, нужная моему приложению, а так же текстовое значение, которое AutoCAD должен отобразить вместо ####. (в данном случае это 0000) Как такое сделать?

Теоретически, я мог бы воспользоваться следующим хитрым способом:

%<\AcSm ?Sheet.Тут пишу нужный мне текст \f "%tc3">%
В этом случае, если в составе подшивки для листов не определено пользовательское свойство "Тут пишу нужный мне текст", то этот текст будет отображаться в качестве значения поля. Однако это не самый лучший вариант решения вопроса, т. к. в какой-то момент времени значение может совпасть с именем пользовательского свойства и значение поля будет неверным (не тем, которое я ожидаю).

Спасибо.
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Александр Ривилис от 29-11-2013, 13:49:04
Теоретически создавать свои поля можно. Но только на C++ средствами ObjectARX. Смотри в ObjectARX SDK Docs раздел AcFd and CAcFdUi Classes.
Пример я нашел в ObjectARX SDK 2009 (в следующих версиях его почему-то изъяли): samples\misc\TextFileField

Фактически создание свое поля равносильно созданию custom object/entity со всеми вытекающими последствиями, типа появления прокси-объектов в случае незагруженности соответствующего dbx-файла.

Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Андрей Бушман от 29-11-2013, 15:36:42
Теоретически создавать свои поля можно.
А назначать обычному полю (присутствующему в AutoCAD по умолчанию) значение, которое должно подставляться взамен #### как-то можно?
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Александр Ривилис от 02-12-2013, 21:17:36
Нет. Во всяком случае официальными средствами AutoCAD .NET API.
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Андрей Бушман от 09-12-2013, 20:45:37
Тогда поставлю вопрос по другому: можно ли в тексте (однострочном, многострочном) как-то визуально имитировать поле? Т.е. к примеру, в тексте "Мама мыла раму" слово "рама" показывать на непечатуемом, но визуально видимом сером фоне, подобно тому, как это происходит с полями (Fields).
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Александр Ривилис от 09-12-2013, 21:04:26
Всему MTEXT'у задать фон можно, а вот куску - не вижу такой возможности. А еще чтобы он был непечатаемый - однозначно нет. Внутри одного примитива это невозможно стандартными средствами.
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Дмитрий Загорулькин от 09-12-2013, 23:45:02
Можно вот так попробовать: %<\AcVar \href "<http>##Тут наш текст#0">%
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Александр Ривилис от 10-12-2013, 03:05:20
Можно вот так попробовать: %<\AcVar \href "<http>##Тут наш текст#0">%
Очень неплохо. Если не считать, что возникает несуществующая гиперссылка.
А вот так гиперссылки не будет:
%<\AcDiesel $(substr,"Мой текст",1)>%
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Дмитрий Загорулькин от 10-12-2013, 10:31:26
Да, так гораздо лучше :)
В развитие этой темы - может быть можно создать свои строковые LispVariable средствами NET? Которые потом можно будет использовать в полях.
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Александр Ривилис от 10-12-2013, 10:36:44
В развитие этой темы - может быть можно создать свои строковые LispVariable средствами NET? Которые потом можно будет использовать в полях.
А вот это IMHO не стоит. Слишком легко испортить значение lisp-переменной. И при загрузке чертежа, если эта переменная не будет инициализирована, получим "####". И еще эти lisp-переменные нужно создавать в каждом из открытых документов, т.к. они документозависимые.
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Андрей Бушман от 10-12-2013, 10:37:30
Спасибо, это то, что надо. Я подправил вариант под свои нужды...
1. Так можно читать нужную информацию из любого объекта базы данных чертежа:
Код - DCL [Выбрать]
  1. %<\AcDiesel $(index, 4, "Bushman, Bushman.CAD.Document, SomeMethod, AcObjId(123456), Вычисленное значение")>%
2. Так можно читать нужную информацию из любого объекта базы данных подшивки:
Код - DCL [Выбрать]
  1. %<\AcDiesel $(index, 4, "Bushman, Bushman.CAD.SheetSetViewer,SomeMethod, SsObjId(123456), Вычисленное значение")>%
Нумерация элементов в функции index начинается с 0, элементы разделяются запятыми.
Т. о. я могу обработать это поле программно и выяснить следующую, необходимую мне информацию:

Т.о. можно писать плагины, которые зарегистрировавшись на нужные события (открытие\закрытие документа, регенерация, отправка на печать и т.п.), будут обновлять содержимое таких полей, заменяя текстовое содержимое на вычисленный результат. После передачи такого файла заказчику, содержимое поля будет содержать корректное значение вместо #### даже несмотря на то, что у него отсутствует написанный мною плагин.
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Андрей Бушман от 10-12-2013, 10:46:06
Но есть одна проблема, которую нужно как-то решить: в составе текста тоже может иметься запятая...
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Александр Ривилис от 10-12-2013, 10:48:53
Но есть одна проблема, которую нужно как-то решить: в составе текста тоже может иметься запятая...
Попробуй функцию $(nth, номер, арг0 [, арг1,…, арг7]) вместо $index
Название: Re: "Своё" поле с указанием отображаемого текста
Отправлено: Андрей Бушман от 10-12-2013, 10:52:31
Попробуй функцию $(nth, номер, арг0 [, арг1,…, арг7]) вместо $index
Да, спасибо, это оно. Итоговый результат:
Код - DCL [Выбрать]
  1. %<\AcDiesel $(nth, 0, "Expressed value", "Description", "CompanySite", "AssemblyName", "ClassName", "MethodName", "ParameterValue")>%

Параметры, передаваемые в метод, следуют в самом конце. Количество параметров может быть произвольным - столько, сколько потребуется для работы указанного метода. В качестве одного из "ParameterValue" можно, к примеру, передавать числовое значение handle объекта, подлежащего обработке. Используя Reflection в коде, зарегистрированном на соответствующие события, можно вычислить искомый результат и записать его вместо "Expressed value". Этот результат и будет отображаться полем (Field) в качестве значения. В "CompanySite" записывается адрес вашего сайта (как разработчика). В  "Description", в случае необходимости, можно записать некоторую поясняющую текстовую информацию.

Когда заказчик получит комплект чертежей (вместе с подшивкой), то все поля будут содержать корректные значения даже несмотря на то, что написанный вами программный код отсутствует на его машине. Поскольку заказчик по умолчанию не имеет доступа к пользовательским свойствам групп листов, то и изменить их он не сможет. Соответственно, значения, программно записанные вами в состав поля, остаются корректными даже при отсутствии вашей программы.