Редактирование данных в формате СПДС

Cyclopentan
отредактировано December 2024 Раздел: API

Коллеги, добрый день!

Безуспешно попытав удачу на форуме разработчиков решил задать вопрос тут. Вдруг под Новый год действительно случаются чудеса.

Если у нас стоит задача вставить в ячейку формата СПДС не текст, а блок (растровую/векторную подпись, лого компании и т.д.), и потом немного отредактировать её, то руками это делается тривиально:

  • Берём наш блок.
  • В формате СПДС открываем окно редактирования основной подписи и выбираем "Внедрить объект".
  • Выбираем наш блок. Как результат в поле наименования организации появляется гордая надпись "Геометрия".
  • При этом наш блок появляется в формате.
  • Выбираем формат и появляется возможность повозить блок по полю.

Внимание, вопрос! Даже два.

Вопрос первый - как программно вставить данный блок?

Сами данные формата можно получить через MultiCAD следующим образом:

Свойство "Enterprise" объекта McDbEntity будет хранить введённые нами данные в поле наименования организации. Если бы мы ввели текстовые данные, то там был бы просто текст. Для внедрённого блока геометрии там будет примерно такая запись в формате RTF:

Если мы этот текст вставим в другое поле в формате СПДС - в данном поле также будет нарисован наш блок. Это круто, если мы изначально знаем, как наш блок выглядит в виде потока. Вот эту самую строчку @06BgAAAAIAAQAAAQAAHAAAAOMEAAAA…

Но как получить этот поток для произвольного блока - я не понимаю. Пробовал различные типы вывода потока из Entity, из McObject и т.д.:

Всё не то. Поэтому прошу совета - как получить подобный поток из блока? Либо есть какой-то другой способ программно вставлять блоки в поля формата СПДС?

Вопрос второй - как потом его можно перемещать по полю? При этом не ломая сам формат СПДС.

Со вторым вопросом тоже труба. Руками поредактировать блок в формате мы можем - задать ему цвет, перемещать в поле и т.д. Как это сделать программно - загадка. Через свойства, как описано в первом вопросе, мы можем получить лишь само значение в поле, но не само поле с его свойствами.

Тем не менее в MultiCAD объект формата СПДС является McFormat - расширение класса McEntity. Если мы взорвём его геометрию, то легко дойдём до нужного элемента типа DBText, который можно легко редактировать, перемещать и т.д.:

Но взрывать и портить формат не хотелось бы. А как без этого получить доступ к параметрам данного поля - не понятно.

Комментарии

  • MCAD
    отредактировано December 2024

    Не нужно изобретать велосипед.

    Вставьте нужный блок с подписями сверху формата перед выпуском проекта.

    на 01:50

    http://rutube.ru/video/f6f87ab8e0d21179fda4c7dc621c6b24/?r=a

  • Добрый день!

    Спасибо за предложенный вариант, это как-раз был план Б.

    Просто вставлять блоки поверх как-то не спортивно. Если друг в процессе нормоконтроля или каких-то ещё проверок придётся изменять формат или возить формат по экрану - блоки с подписями останутся же на месте.

  • Если друг в процессе нормоконтроля или каких-то ещё проверок придётся изменять формат

    Если в процессе проверки уже все подписано 🤷 то чего еще проверять-то 🤔

    Логично вставить подписи перед печатью.

    PS: удалить все блоки и вставить по новой 10 секунд.

  • При вставке формата текстовые поля сохраняются. А графика пересчитывается. Я не представляю, что вы делаете.

  • Ну, теоретически, можно действительно повесить перерисовку данных на событие закрытия документа и перерисовывать её каждые раз.

    Согласен, немного узко описал задачу. Есть информационная система с документооборотом, в которой хранятся чертежи. Подразумевается, что при каждом открытии чертежа должны обновляться данные из информационной системы. Заполняться вся основная надпись, вставляться фамилии из штатного расписания в зависимости от конкретных чертежей, вставляться подписи только для тех сотрудников, кто в системе согласовал чертежи и т.д.

    Вариант с обновлением через блоки поверх основной надписи тоже рассматривали, но совсем комильфо было бы вставлять эти данные прямо в формат СПДС.

  • Ваш вариант.

    На блок формата сделайте свою форму ввода.

    https://rutube.ru/video/b4fe055f6690667e58caaeba14e32279/?r=a

  • Cyclopentan
    отредактировано December 2024

    У нас немного другой случай. Точнее, всё что есть в видео, есть и у нас, только не в такой локальной форме. Заполнение всех текстовых полей в формате уже делается автоматически и данные берутся из базы данных информационной системы, не из базы нанокада. Без возможности их править проектировщиками.

    У меня вопрос был исключительно по работе с блоками вместо текста.

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

  • Если есть информационная система в которой есть цифровые подписи, немного удивляет атавиз с имитацией живой подписи факсимиле, ну и выводите типа штампа печати прямо на поле чертежа, согласовал, подписал..

    Зачем имитация рукописи в цифровом формате?

    Хотя некоторые облачка рисуют))

  • MCAD
    отредактировано December 2024

    Без возможности их править проектировщиками.

    Это понятно и ничего нового. Зачем вам, в таком случае, вообще нужен диалог формата. Берите блок и вставляйте в него то, что вам нужно.

    Хотите в атрибуты, хотите просто текст плюс подпись сплайном.

    Один чертёж один формат?

    не из базы нанокада

    не понял про базу. Берется из таблицы, таблица может брать из свойств чертежа. (dwgProp)

  • У нас внешние заказчики чертежей и они в любом случае требуют чертежи в печатной форме с рукописными подписями. Если бы чертежи были для внутреннего использования - полностью согласен, даже не заморачивались бы с этим всем.

  • Cyclopentan
    отредактировано December 2024

    Зачем вам, в таком случае, вообще нужен диалог формата.

    Вот тут теперь я немного не понял. Идея в том, чтобы проектировщик открыл нанокад, на чертеж просто добавил формат из СПДС и вообще о нём забыл. Сидел себе, чертил, никаких диалогов, никаких таблиц/форм заполнения, просто работа с чертежом. А потом наша система заполняет все поля. И это уже есть, остаётся только вопрос с автоматической вставкой не текста, а блоков.

  • автоматической вставкой

    Крамольнную вещь скажу, у вас там листинг кода на 100500 знаков.

    А команду -insert не пробовали.

  • Если есть возможность использовать её для вставки в конкретное поле форматки - я только за. Но пока как-то не понимаю, как её использовать, чтобы вставить блок именно в поле формата СПДС.

  • Никак.

    Я же в первом ответе сказал.

  • Более того, добавил, что при редактировании текстовые поля сохраняются, п графика меняется.

    Сто еще добавить.

  • при редактировании текстовые поля сохраняются, п графика меняется

    Это что имеется ввиду? Немного не понимаю, мы сейчас говорим про формат СПДС, про какой-то ручной формат или про что-то другое? Вот в приведённом видео у товарища в поле "Организация" вставлен танк. И если он эту форматку будет таскать по экрану - танк останется в том поле. Если он зайдёт в свойства форматки из изменит её размер с 1А4 на 2А3 - она разъедится, но танк останется в том же поле "Организация". Или мы вообще не про то?

  • Отписываюсь по результатам.

    В итоге самым логичным решением всё-таки оказалось преобразовывать нужные блоки с подписями в RTF и вставлять их в ячейки формата СПДС как геометрию. Так и никаких лишних объектов/блоков не создаётся и при редактировании/перемещении формата СПДС все данные перемещаются вместе с ним.

  • Да, они же вставлены в ячейку формата.

    Это фактически аналог команды "Внедрить объект" из диалога редактирования штампа. После внедрения в редактировании появляется название вставленной геометрии:

    И, если перемещать штамп или менять его формат с А4 на А0, - логотип и подписи также корректно перемещаются.