"Своё" поле с указанием отображаемого текста

Автор Тема: "Своё" поле с указанием отображаемого текста  (Прочитано 15087 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Тема не относится к категории .NET, но поскольку нет ветки по вопросам, не связанным с конкретным языком программирования, то спрашиваю здесь.

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

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

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

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

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

Спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Теоретически создавать свои поля можно. Но только на C++ средствами ObjectARX. Смотри в ObjectARX SDK Docs раздел AcFd and CAcFdUi Classes.
Пример я нашел в ObjectARX SDK 2009 (в следующих версиях его почему-то изъяли): samples\misc\TextFileField

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

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Теоретически создавать свои поля можно.
А назначать обычному полю (присутствующему в AutoCAD по умолчанию) значение, которое должно подставляться взамен #### как-то можно?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Нет. Во всяком случае официальными средствами AutoCAD .NET API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Тогда поставлю вопрос по другому: можно ли в тексте (однострочном, многострочном) как-то визуально имитировать поле? Т.е. к примеру, в тексте "Мама мыла раму" слово "рама" показывать на непечатуемом, но визуально видимом сером фоне, подобно тому, как это происходит с полями (Fields).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Всему MTEXT'у задать фон можно, а вот куску - не вижу такой возможности. А еще чтобы он был непечатаемый - однозначно нет. Внутри одного примитива это невозможно стандартными средствами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Можно вот так попробовать: %<\AcVar \href "<http>##Тут наш текст#0">%

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно вот так попробовать: %<\AcVar \href "<http>##Тут наш текст#0">%
Очень неплохо. Если не считать, что возникает несуществующая гиперссылка.
А вот так гиперссылки не будет:
%<\AcDiesel $(substr,"Мой текст",1)>%
« Последнее редактирование: 10-12-2013, 03:24:46 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, так гораздо лучше :)
В развитие этой темы - может быть можно создать свои строковые LispVariable средствами NET? Которые потом можно будет использовать в полях.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В развитие этой темы - может быть можно создать свои строковые LispVariable средствами NET? Которые потом можно будет использовать в полях.
А вот это IMHO не стоит. Слишком легко испортить значение lisp-переменной. И при загрузке чертежа, если эта переменная не будет инициализирована, получим "####". И еще эти lisp-переменные нужно создавать в каждом из открытых документов, т.к. они документозависимые.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Спасибо, это то, что надо. Я подправил вариант под свои нужды...
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, элементы разделяются запятыми.
Т. о. я могу обработать это поле программно и выяснить следующую, необходимую мне информацию:
  • Моими ли программами это поле было создано (первый элемент списка).
  • Класс, с помощью которого следует вычислить искомое значение поля (второй элемент списка).
  • Метод в составе класса, который следует использовать для получения искомого значения (третий элемент списка).
  • Аргумент, который следует передать методу для вычисления искомого результата (четвёртый элемент списка).
  • Текстовое значение, которое должно отображаться в поле (пятый элемент списка).

Т.о. можно писать плагины, которые зарегистрировавшись на нужные события (открытие\закрытие документа, регенерация, отправка на печать и т.п.), будут обновлять содержимое таких полей, заменяя текстовое содержимое на вычисленный результат. После передачи такого файла заказчику, содержимое поля будет содержать корректное значение вместо #### даже несмотря на то, что у него отсутствует написанный мною плагин.
« Последнее редактирование: 18-01-2014, 08:52:01 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Но есть одна проблема, которую нужно как-то решить: в составе текста тоже может иметься запятая...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Но есть одна проблема, которую нужно как-то решить: в составе текста тоже может иметься запятая...
Попробуй функцию $(nth, номер, арг0 [, арг1,…, арг7]) вместо $index
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Попробуй функцию $(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", в случае необходимости, можно записать некоторую поясняющую текстовую информацию.

Когда заказчик получит комплект чертежей (вместе с подшивкой), то все поля будут содержать корректные значения даже несмотря на то, что написанный вами программный код отсутствует на его машине. Поскольку заказчик по умолчанию не имеет доступа к пользовательским свойствам групп листов, то и изменить их он не сможет. Соответственно, значения, программно записанные вами в состав поля, остаются корректными даже при отсутствии вашей программы.
« Последнее редактирование: 10-12-2013, 16:14:52 от Андрей Бушман »