Экспериментальный проект XDLabel, подход к задаче. (Судите строго, но снисходительно - ресурсов ничтожно, а тема как минное поле ) Общее: Все надписи в чертежах являются иллюстративными, вспомогательными, т.е. зависимыми элементами. Все надписи всегда логически связаны с конкретными объектами. Но Текст, МТекст и пр. в AutoCAD являются самостоятельными примитивами, такими же как отрезки, полилинии и пр. Т.е. надписи AutoCAD в чертежах физически не связанны со своими объектами. (Кроме случая атрибутов, но они только для блоков). Это ведет к преобладанию ручной работы, появлению ошибок, невозможности их обнаружения и пр. В вертикальных приложениях AutoCAD эта задача связи надписей с объектами решена. Но решена по-разному, не всегда удовлетворительно, и через специальные объекты, недоступные в базовом AutoCAD или в других вертикальных приложениях. До сих пор в базовом AutoCAD, которым пользуется большинство, нет инструментов быстрого создания надписей у указанных объектов, проверки их правильности, обновления содержания, свойств, положения относительно объектов и т.п. Идея: Связать имеющиеся в чертежах надписи с их объектами добавлением к надписям XData с соответствующей информацией. Создавать надписи сразу со связями с объектами. XData выбраны из-за их общедоступности во всех AutoCAD, легкой программной работы с ними. Предполагаемое решение: 5-7 команд, действующих в любом AutoCAD, позволяющих связывать надписи с объектами, создавать надписи при объектах, поддерживать актуальность содержания надписей, ускорять отображение/скрытие/удаление надписей и т.п. Пока сделали с оч. слабым программистом три пять команды для надписей со связью их с объектами: - связывание надписей со своими объектами - XDLABEL_LINK - создание надписей - XDLABEL_CREATE - обновление надписей - XDLABEL_UPDATELBL К объектам должны быть присоединены XData, из полей которых берется содержание надписей или в которые содержание надписей записывается. Сделана возможность создания и связывания надписей с объектами, не имеющими XData. Сделана возможность надписывания и обновления свойств объектов. Добавлено: - создание однострочных текстов со связью с объектами - XDLABEL_DTEXT. Добавлено: - редактирование однострочных текстов со связью с объектами - XDLABEL_EDITDTEXT. Повторены действия штатных команд создания и редактирования однострочных текстов с возможностью сразу создать связь с объектом, взять содержание из XData объекта, загрузить содержание в XData объекта, изменить связь с объектом. Новое: команда выбора связанных объектов и надписей, точечных объектов - XDLINK_LINKSEL. Действия с XData обеспечиваются командами предыдущего проекта - XDTOOLS. Этот проект XDLabel в целом является продолжением XDTOOLS и темы неоцененной применимости XData. Общий порядок действий: 1. Создание XData с полями для содержания надписей. (Поля для Z, площади, длины, угла, индекса, этажности, материала или пр. - что нужно надписать или куда сохранить содержание надписей). 2. Присоединение этих XData к объектам. 3 (Вариант 1). Связывание уже существующих надписей с их объектами с загрузкой содержания надписей в поля XData объектов. 3 (Вариант 2). Ввод значений в поля XData вручную или средствами XDTOOLS. Создание надписей с содержанием из этих полей. 4. Восстановление/изменение содержания, свойств, положения надписей. Например: вставка надписей номеров и площадей земельных участков, создание надписей отметок высот, изменение отметок при изменении Z объектов, создание надписей горизонталей, восстановление цвета, текстового стиля и пр., восстановление положения надписей относительно объектов. И пр. Одна из целей - решение задачи в оптимально общем виде, чтобы не зависеть от множества программок на каждый частный случай, от отсутствия возможности найти такие программки. __________ Самая последняя версия XDLABEL.fas и описание структуры XData, хранящих при надписях параметры их связи и свойства, приложены:
Имхо тут нет смысла в xdata записывать параметры объектов, максимум его хендл, и тип параметров, а команда обновления уже будет считывать тип и хендл, по нему искать объект и с него уже снимать нужные данные, ну как вариант прицепить обновление к событию изменения базы данных чертежа или команде _regen что бы обновлялось автоматически ,в целом ничего сложного не вижу, но смысл всего этого не особо понятен.
Я пытался разобраться с автоматизацией обновления-реакции, но в dwg.ru меня охладили - в AutoCAD это есть, но тухло. Но и в общем случае автоматическое обновление опасно - можно потерять и полезные изменения. Они и не записываются. Сейчас так: 1. В XData при объекте записывается только содержание связанной надписи. 2. К надписям присоединяются специальные XData "XDT_LABEL" с Handle объекта, название-поле нужной XData объекта, основные свойства надписи (стиль, высота, выравнивание, цвет, слой и пр.), параметры связи. В каждом чертеже много/очень много работы с надписями. На всех форумах постоянно вопросы о надписях. А в 99.9% вопросы не задают - просто пилят и перепиливают вручную долго, упорно и с косяками. Типичный случай 1 - надписи отметок высот точек или блоков. Бывает и с номерами-названиями точек. С многими вариантами задач: присвоить Z из надписей точкам, надписать Z точек, загрузить значение надписи в атрибут, согласовать Z точек и содержание надписей. И пр., и пр. Решается связыванием надписей с точками XDLABEL_LINK, назначением полученных Z точкам XDTOOLS_2PROP, загрузкой Z в поле XData объекта XDTOOLS_PROP2, обновлением XDLABEL_UPDATEL. И пр. В т.ч. можно прямо создать новые надписи высот XDLABEL_CREATE. Типичный случай 2 - надписи номеров, площадей участков или характеристик строений в контурах или т.д. Создать надписи в площадях объектов XDLABEL_CREATE. Обновить при изменениях площадей и пр. XDLABEL_UPDATEL. И обратные задачи. Типичный случай 3 - надписи вдоль линейных объектов, горизонталей, ЛЭП, дорог и пр. Создать надписи XDLABEL_CREATE, восстановить положение при изменениях объектов или содержание надписей XDLABEL_UPDATEL. Присвоить уровень горизонталям из надписи XDTOOLS_2PROP. И пр. И т.д. С нашего форума, недавнее: Нетипичный случай - https://geodesist.ru/threads/vynoska-ugla-i-dliny.93195/. Нужно надписывать у отрезков их длины и углы. (О существовании углов у отрезков я узнал из этой темы ). Решается загрузкой значения длины в одно поле XData объекта, значения угла в другое XDTOOLS_PROP2, создание надписей XDLABEL_CREATE. Относительно типичный случай - https://geodesist.ru/threads/podpis-vysot-s-razryvom-vdol-polilinii.92510/. В т.ч. нужно посадить существующие надписи на горизонтали, развернуть вдоль горизонталей. Решается связыванием надписей с горизонталями XDLABEL_LINK, редактированием связи XDTOOLS_VEDIT, обновлением XDLABEL_UPDATEL. Случай легко становится типичным , если пришлось надписанные горизонтали переукладывать или сглаживать. В т.ч. в любой момент XDLABEL_CREATE можно надписать что угодно из основных свойств объектов или др. информацию из XData объектов. Хотя бы временно для вспомогательных целей, наглядности.
Наверняка. Я в цивиловское решение не залезал, но что есть знаю: Может быть полностью конкурировать с возможностями вертикальных не удастся, но хотелось сделать альтернативу в чистом AutoCAD.
Вопрос простой - на хрена это надо? Вас на dwg.ru об этом же спрашивали, но вы так и не смогли объяснить. Похоже на паранойю.
Нахрена нужно ускорять, упрощать, улучшать работу с надписями? Не знаю ответа. Гм. Мои предложения работы с надписями на dwg.ru особо не обсуждали. Что было, было, скорее, наоборот - не отрицали потенциальную полезность или даже пробовали сами сделать. Еще давно, но и недавно тоже. Стереотипы - могучая сила.
Мне нравится ваше стремление упростить работу/задачу. Я похожим образом решал задачи импорта/экспорта точек в автокад, когда под рукой был только "голый VBA", а про Land Desktop я ещё не знал. Кто-то может сказать, что это изобретение велосипеда, по факту это создание инструмента для работы в ограниченных условиях наличия одного автокада под рукой. Сивил имеет смысл поковырять ради интереса хотя бы. Может, удастся что-то полезное/удобное подсмотреть.
Ну от нефиг делать сваял такую фигню, на любых кривых в чертеже появляется мтекст содержащий их длину, который динамически меняется вместе в объектом, держится на нем и обновляет собственно текст длины, ньюансов тут конечно куча. Текст появляется на всех новосозданных объектах, если они созданы со статусом Ок, то есть если чертите полилинию и закончите интером, если закончите эскейпом текст не появится, но появится при любом изменении любого уже готового объекта, движении, изменении геометрии и тд. С текстом можно сделать что угодно в рамках возможностей автокада, при изменении привязанного объекта меняется только его положение и содержимое (длина).
Что-то у меня браузер Chrome ругается на ваш файл, пишет: Ошибка. Обнаружен вирус. А хотелось бы посмотреть. Хотя, вот честное пионерское, не понимаю я всех этих манипуляций с обновлением полей, текстов, с XData и т.д. и т.п. Тупею наверно с возрастом. Возможно, эти все вкусности интересны проектировщикам, мне это не понятно, никто толком не может объяснить эти плюшки. Вот с этим согласен. До сих пор сталкиваюсь, что пикеты (отметки) рисуют точками и текст рядышком, потом сами понять не могут к какой точке текст относится, но с пеной доказывают, что так надо.
хмм, прикольно, проверил прям щас в папке проекта, виндефендер тоже на архив ругается, сама длл причем норм, попробую через зип, на зип вроде не ругался, странно в общем.
Как вызывать? А! Въехал, это . Это оч. полезная бы возможность! Но как ее практически встроить для надписей на линиях? В XData связей, XDT_LABEL, для надписей на линиях есть поле 7 со значением ON, поле 23 - поворот относительно линии, поле 35 с нужным сдвигом вдоль-поперек линии, поле 39 с параметром точки вставки на линии. + (Наведите курсор, чтобы раскрыть содержимое) + (раскрыть) + (свернуть) Давно уже видел близкое у Lee Mac на lisp. Но не уверен, что мои программисты-дилетанты смогли бы применить...
Загрузил DataLink.dll через команду netload. Вычертил отрезок, после нажатия клавиши Enter на отрезке появилась надпись- длина. Если редактировать отрезок за ручки, то соответственно меняется значение длины.
Я восхищен и поражен! И возможностями для пользователей, и немыслимой скоростью Вашего программирования. Можно ли этот подход согласовать, совместить с XDLabel? Lisp с C? Или нужно делать полностью на C? Минимум, для случаев надписей на объектах. --- Сообщения объединены, 17 июн 2023, Оригинальное время сообщения: 17 июн 2023 --- Ну, да! Это одна из целей XDLabel - обычные тексты превращаются в аналог Attribute. Причем, для любых основных типов примитивов, а не одних блоков. Для существующих надписей с помощью XDLABEL_LINK создается их связь с их объектами. Что дает возможность обмениваться данными надписей с их объектами, восстанавливать надписи, их свойства, положение и пр.
А где доработанный вариант? Интересно получилось. Мне понравилось. Начиная с какой версии AC будет запускаться? В 2021 работает, в моем любимом древнем AC2007 не пашет. Для 2007 можете пересобрать?
Совместить навряд ли, с лиспом я не очень дружу (перешел на шарп, когда программа на лиспе обрабатывала чертеж минут 10, а аналог на шарпе секунд 5) максимум можно совместить в части совместного использования кодов, прописанных в xdata, но тут уже нужна документация по структуре данных.
В Autolispe есть реакторы. Я думаю сие можно реализовать через реакторы. Сам правда с реакторами не работал. Но скорость работы лиспа- интерпретатора значительно медленнее, чсм работа dll-приложений.