| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Присвоение блоку атрибута и Z из текста.

Lisp. Присвоение блоку атрибута и Z из текста.

Ответ
Поиск в этой теме
Непрочитано 16.08.2010, 11:03
Lisp. Присвоение блоку атрибута и Z из текста.
Ancient John
 
Регистрация: 16.08.2010
Сообщений: 5

Вообщем, не линчуйте, если тема уже проскакивала - поиск не дал нормальных результатов. Опишу проблему.
1. Нашел программу ZTXT, которая берет отметку Z для точки из близлежащего текста. Переделал её так, чтобы в главой роли был блок, а не текст ("переделал" громко сказано, но все же). Но не могу сделать "контролирующий" элемент в ней. А именно: менять цвет блока отличные от существующего и заполнять его атрибут на тоже значение Z.
Код:
[Выделить все]
(defun C:Ztxt ( / objSet Point ptLst tmp1 tmp2 pat txtZList dst *error*)
(vl-load-com)
(defun *error*(msg)(princ msg)
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))(princ))
(vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))
(if (and
      (setq objSet(ssget "_:L" '((0 . "INSERT"))))
      (setq Point (vl-remove-if 'listp(mapcar 'cadr(ssnamex objSet))))
      (setq ptLst(mapcar 'cdr (mapcar '(lambda(x)(assoc 10 x))(mapcar 'entget Point))))
      (setq objSet nil objSet(ssget "_X" (list '(0 . "*TEXT")(cons 410 (getvar "CTAB")))))
      )
  (progn
    (setq tmp1 (vl-remove-if 'listp(mapcar 'cadr(ssnamex objSet))))
    (setq tmp1 (mapcar '(lambda(x)(setq x (entget x))(list (cdr(assoc 10 x))(cdr(assoc 1 x)))) tmp1))
    (foreach pt ptlst
      (setq tmp2 (mapcar '(lambda(x)(list (distance pt (car x))(cadr x))) tmp1))
      (setq pat (car tmp2))
      (foreach dst tmp2 (if (< (car dst) (car pat))(setq pat dst)))
      (setq txtZList (cons (cadr pat) txtZList))
      )
    (setq txtZList (reverse txtZList))
    (setq txtZList (mapcar '(lambda(x)
                    (vl-string-translate "," "." (vl-string-trim  "%UuoOcC \t"   x))
                   )txtZList))
    (mapcar '(lambda(ptObj pt Z)
               (vla-put-insertionpoint (vlax-ename->vla-object ptObj)
                (vlax-3d-point (list (car pt)(cadr pt) Z))
               )
               )
           Point ptLst (mapcar 'atof txtZList)
            )
    )
  )
  (vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
  )
Необходимо это, потому что ближайшим может оказаться текст, не принадлежащий к данному блоку. А если будет заполняться атрибут блока, то можно сразу будет отслеживать та ли отметка заполнилась в блок.

2. А, вообще, в идеале опишу свою задачу так. Есть геоподоснова, где каждому блоку (кружочку с заливкой) соответствует текст, содержащий высотную отметку. Но не на строго выверенном расстоянии, а от балды. Нужно заполнить Z-блока из данного текста, но тоже хитро:
1. У одного блока могут стоять сразу две отметки (верх и низ борта -выбрать нужно низ - т.е. меньшую)
2. Ближайшей может оказаться не так текстовая отметка.
В идеале вижу решение задачи следующим образом.
1. Задается расстояние сканирования (допустим 5).
2. Выбираются блоки.
3. Дальше вокруг блока сканируется расстояние на площади описанного круга с радиусом равным расстоянию сканирования. Если в этот предел попадает одна отметка - то и её назначаем отметкой Z и записываем это значение в атрибут блока. Если две и больше - красим точку в красный и переводим пользовательский экран в это место с диалогом ввода этой отметки.

Заранее спасибо

Последний раз редактировалось Ancient John, 16.08.2010 в 11:13.
Просмотров: 12100
 
Непрочитано 03.02.2023, 15:10
#21
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


johny100, В твоем примере 4 блока: 2 с атрибутами, 2 без атрибутов. Никаких точек и цифр нет.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 03.02.2023, 18:38
1 | #22
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от johny100 Посмотреть сообщение
цель изменить отметку Z у обычного блока, а эту самую отметку заимствовать от рядом стоящей точки, атрибута или цифре. Мне казалось, я находил как подобные инструмент, но сейчас не могу вспомнить.
Наверное, Вы имеете в виду лисп Ztxt - см. стартовый пост этой темы. Автор лиспа, кажется, как раз VVA.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 09.02.2023, 09:30
#23
johny100

автомобильные дороги
 
Регистрация: 27.05.2015
Санкт-Петербург
Сообщений: 10


Цитата:
Сообщение от VVA Посмотреть сообщение
johny100, В твоем примере 4 блока: 2 с атрибутами, 2 без атрибутов. Никаких точек и цифр нет.
Да, все верно! Вот и хотелось бы узнать, можно ли блокам без атрибута задать положение Z (в свойствах блока) такое же как в блоках с атрибутом. Заимствовав эти значения из отметки атрибута или из положения Z в свойства блока с атрибутом ?

Offtop: Извиняюсь, что так выражаю свою мысль долго!

----- добавлено через ~13 мин. -----
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Наверное, Вы имеете в виду лисп Ztxt - см. стартовый пост этой темы. Автор лиспа, кажется, как раз VVA.
Получается присвоить положение Z, но лиспом Ztxtb, который найден в другой теме, но этим лиспом я смог присвоить блокам отметки от ближайшего текста, а мне бы блокам присвоить от ближайших атрибутов, конечно можно разить атрибуты в текст.

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

Или вот тоже пример в приложенном архиве с атрибутами, не смог выполнить присвоение положению Z значения из значения атрибута лиспом ATTZBL, а лиспом Ztxtb команда задает блоку с атрибутом положение Z из тега, который идет как порядковый номер и я уже голову сломал как значения между тегами поменять или удалить лишний тег, но безрезультатно пока что. При чем если схитрить и извлечь из блока с атрибутом текст, то командой Ztxt точке будет задаваться не значение ближайшего текста, коим является отметка, а тот же самый тег из разбитого блока с атрибутом. Не могу понять, как изменить эти теги, чтобы команды использовали нужное значение.
Вложения
Тип файла: rar 1.rar (18.9 Кб, 5 просмотров)

Последний раз редактировалось johny100, 09.02.2023 в 11:38.
johny100 вне форума  
 
Непрочитано 09.02.2023, 16:59
#24
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от johny100 Посмотреть сообщение
а мне бы блокам присвоить от ближайших атрибутов
Эта задача нетипичная, некорректная. Атрибуты специально связаны со своими блоками. Для других блоков они чужие.
Поэтому искать программу для чтения в один блок атрибутов другого блока, скорее, бесполезно. Если уж совсем нужно, то оправдано разбивать блоки с нужными Вам вдруг атрибутами.
Цитата:
Сообщение от johny100 Посмотреть сообщение
точке будет задаваться не значение ближайшего текста, коим является отметка, а тот же самый тег из разбитого блока с атрибутом
Разбивать блоки нужно BURST - командой из Express. Она создаст не надписи тегов, а содержаний атрибутов.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 10.02.2023, 09:20
#25
johny100

автомобильные дороги
 
Регистрация: 27.05.2015
Санкт-Петербург
Сообщений: 10


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Эта задача нетипичная, некорректная. Атрибуты специально связаны со своими блоками. Для других блоков они чужие.
Поэтому искать программу для чтения в один блок атрибутов другого блока, скорее, бесполезно. Если уж совсем нужно, то оправдано разбивать блоки с нужными Вам вдруг атрибутами.
Разбивать блоки нужно BURST - командой из Express. Она создаст не надписи тегов, а содержаний атрибутов.
Понял теперь про присвоение блоку положения Z от близлежащего атрибута.

Так и сделал, если есть возможность и желание, можете проверить. Хотя в моей ситуации, проверьте пожалуйста, из архива файл. Нужно срочно, а не могу дать ума в присвоении отметок точкам в блоке с атрибутом. Любым методом либо через команду BURST либо через лиспы умных людей.

Последний раз редактировалось johny100, 10.02.2023 в 11:39.
johny100 вне форума  
 
Непрочитано 10.02.2023, 14:48
#26
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от johny100 Посмотреть сообщение
Хотя в моей ситуации, проверьте пожалуйста, из архива файл.
Подходящим в принципе должен бы быть лисп ATTZBL из #11, но он выдает:
Код:
[Выделить все]
неверный тип аргумента: (or stringp symbolp): nil
.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 10.02.2023, 17:09
#27
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


АлексЮстасу, скинь пример с ошибкой. Видно в свое время что-то не учел
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 11.02.2023, 03:52
#28
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от VVA Посмотреть сообщение
скинь пример с ошибкой.
Это пример от johny100 - см. #23.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 11.02.2023, 12:17
#29
johny100

автомобильные дороги
 
Регистрация: 27.05.2015
Санкт-Петербург
Сообщений: 10


Цитата:
Сообщение от VVA Посмотреть сообщение
АлексЮстасу, скинь пример с ошибкой. Видно в свое время что-то не учел
Пожалуйста, спасибо!
Вложения
Тип файла: rar 1.rar (18.9 Кб, 6 просмотров)
johny100 вне форума  
 
Непрочитано 16.02.2023, 22:09
#30
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Цитата:
Сообщение от VVA Посмотреть сообщение
пример с ошибкой
Возможно, там проблема из-за двух атрибутов в блоке...
Если Вам срочно, то путь длиннее, но, в идее, продуктивнее, поскольку дает много больше возможностей работы с данными. Для одной этой задачи этот путь сложен. Но он позволяет решать множество задач, для которых нужно много десятков специальных лиспов. Т.е. в сумме позволит сэкономить много времени.
Можно взять набор команд XDTOOLS, тоже на лиспе.
1. Создать XData для нужных данных - XDTOOLS_MDEFINE. Полей в XData можно сразу создать для всех атрибутов этих блоков, т.е. два.
2. Присоединить этот созданный XData к объектам - XDTOOLS_ADD.
3. Создать текстовый файл соответствий блоков/атрибутов с XData/полями. Поможет в этом XDTOOLS_ATTRFILE, который создаст txt-заготовку файла соответствий, выгрузив в него названия всех блоков с соответствующими атрибутами, а так же названия XData и номера их полей.
В Вашем случае достаточно строки:
Цитата:
TCPOINT ОТМЕТКА <название XData> <номер поля>
Разделители - табуляции.
4. Загрузить значение атрибутов в XData на основе файла соответствий - XDTOOLS_ATTR2. В общем случае можно создать файл соответствий для всех разновидностей блоков, для любых их атрибутов, и разом загрузить.
5. Назначить значение свойства объекта (Z) из значения поля XData - XDTOOLS_2PROP.
__________________
количество моих сообщений не говорит о знании Автокада

Последний раз редактировалось АлексЮстасу, 16.02.2023 в 22:34.
АлексЮстасу вне форума  
 
Непрочитано 17.02.2023, 01:47
1 | #31
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Способ быстрее, но тоже обходной и с доп. лиспом - достаточно мощным экспортом/импортом PointManager от Lee Mac. (Есть и другие самодельные хорошие наши лиспы для этого).
1. Команда PTM. Выгружаем выбранные блоки в указанный txt-файл, с атрибутами. (Лисп не даст выбрать блоки для экспорта, если для выгрузки выбраны тоже блоки. Выбрать там что-то другое, точки, например).
2. Открываем созданный txt-файл в Excel или т.п., и заменяем Z на значение атрибута отметки.
3. Команда PTM. Загружаем из txt-файла указанным блоком, с атрибутами. Можно выбрать и цвет/слой. Прежние блоки можно предварительно удалить.

Этот экспорт/импорт вообще оч. неплох для создания точек-блоков и пр. из txt-файлов. Пригодится и для этого, и в ряде других случаев.

Кстати, в штатных средствах AutoCAD так и нет экспорта точек-вершин в txt?
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 20.02.2023, 17:20
#32
johny100

автомобильные дороги
 
Регистрация: 27.05.2015
Санкт-Петербург
Сообщений: 10


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Способ быстрее, но тоже обходной и с доп. лиспом - достаточно мощным экспортом/импортом PointManager от Lee Mac. (Есть и другие самодельные хорошие наши лиспы для этого).
1. Команда PTM. Выгружаем выбранные блоки в указанный txt-файл, с атрибутами. (Лисп не даст выбрать блоки для экспорта, если для выгрузки выбраны тоже блоки. Выбрать там что-то другое, точки, например).
2. Открываем созданный txt-файл в Excel или т.п., и заменяем Z на значение атрибута отметки.
3. Команда PTM. Загружаем из txt-файла указанным блоком, с атрибутами. Можно выбрать и цвет/слой. Прежние блоки можно предварительно удалить.

Этот экспорт/импорт вообще оч. неплох для создания точек-блоков и пр. из txt-файлов. Пригодится и для этого, и в ряде других случаев.

Кстати, в штатных средствах AutoCAD так и нет экспорта точек-вершин в txt?
Спасибо за подсказку и направление. Получилось через это приложение, но только доставал данные атрибутов через функцию автокада - извлечение данных. (данныеизвл)
johny100 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Присвоение блоку атрибута и Z из текста.

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
как редактировать contents в свойствах текста? как привязать размер текста атрибута к размеру блока? p-sm AutoCAD 3 13.08.2009 18:08
Изменение форматированного текста посредством lisp Tramp LISP 4 03.03.2006 11:28
Lisp для текста Vova LISP 11 13.05.2004 17:39