Аналог attout – attin

Последнее время все чаще и чаще стал задумываться о написании некоего аналога знаменитых команд из ExpressTools - ATTOUT и ATTIN.

Штатная функция немного не устраивала: во-первых, имена динамических блоков не учитываются. Сориентироваться, что означает, например, "блок с именем "*U658", нереально). Во-вторых, стало просто интересно. Собственно определяются две команды: att-export (соответственно экспорт в файл csv) и att-import (импорт из csv).

Я постарался учесть вариант "ЕТ не установлен", блокированных и замороженных слоев. Кажется, в качестве первого приближения "покатит".

Версия Ссылка для скачивания Описание
0.1 att-export-import v.0.1 Версия с попыткой вывода результатов только в csv
0.2 att-export-import v.0.2 Учтена необходимость вывода файла в txt. Исправлена небольшая опечатка
0.3 att-export-import v.0.3 Попытка исправления вывода атрибутов в csv. Плотного тестирования не проходила
0.4 att-export-import v.0.4 Попытка исправления обработки хенддлов и перевод их в строковое значение в Excel.
0.5 att-export-import v.0.5 Добавление запроса на сортировку тэгов атрибутов
0.6 att-export-import v.0.6 Исправлена ошибка обработки txt-файлов
0.7 att-export-import v.0.7 координаты вставки блока

Дисклайм: Теоретически код должен обрабатывать и многострочные атрибуты, но не проверял. Перенос строк в таком случае в результирующем файле будет показываться как "\P" - это нормально. Если в атрибутах будут поля, то как они будут выводиться и какие значения будут назначаться - не представляю. Если есть желание тестировать - милости прошу :)
Порядок следования столбцов в таблице критичен (по крайней мере пока; если необходимо будет предусматривать шанс, что "столбцы переместили", сообщите. По мере возможности добавлю.



Комментарии

Есть 44 коммент. к “Аналог attout – attin”
  1. kacugu пишет:

    Здравствуйте, Алексей.
    Воспользовался вашей функцией. Выявленные проблемы:
    1. Name, Handle и все теги атрибутов при открытии в excel помещаются в ячейку А1
    2. Заполнение столбцов:
    - первый столбец (который д.б. Name) выглядит примерно так: "KAA_Спецификация изделия 1.1 BAF91 7 13,3 1,9 \W0.8000"
    - второй (который д.б. Handle): %%C16 A-III L=1200 ГОСТ 5781-82 \W0.8000
    - третий (в моём случае значение атрибута 1_Количество1): Данный чертеж 1 6 60,0 10,0 \W0.8000
    - все остальные столбцы заполняются также хаотично

  2. ElpanovEvgeniy пишет:

    Спасибо, Алексей!

    Мое мнение, что значительно проще добавить ко всем блокам дополнительный скрытый постоянный атрибут с нормальным именем блока, как вариант, если атрибут уже есть, то обновить его значение.

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

  3. Кулик Алексей aka kpblc пишет:

    Ну, не заставлять же всех пользователей переделывать все блоки :)

  4. Кулик Алексей aka kpblc пишет:

    kacugu, понял, расширение сменю - не вопрос. Можете и сам везде в коде поменять "csv" на "txt" - просто сейчас нет полноценной возможности :( М.б., вечером доберусь.

  5. ElpanovEvgeniy пишет:

    >> Ну, не заставлять же всех пользователей переделывать все блоки :)

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

  6. Кулик Алексей aka kpblc пишет:

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

  7. kacugu пишет:

    Спасибо. Если экспортировать в формат txt, то всё нормально в экселе открывается.

  8. ElpanovEvgeniy пишет:

    я имел в виду примерно такое:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (setq bl(vlax-ename->vla-object(car(entsel "\nSelect block"))))
    (vla-AddAttribute
      (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
                (vla-get-EffectiveName bl)
      )
      1.0
      acAttributeModeInvisible
      "EffectiveName"
      (vlax-3d-point 0 0 0)
      "EffectiveName"
      (vla-get-EffectiveName bl)
    )
  9. Кулик Алексей aka kpblc пишет:

    Никто и никогда не помешает пользователю создать атрибут с тэгом EffectiveName. И загнать туда все что угодно. В результате возникнет путаница.
    Хотя, как альтернатива - вполне. При условии, что потом будет выполнен _.atsync, а атрибуты пользователем не перемещались и не переназначались им какие-либо свойства.

  10. kacugu пишет:

    Добрый день, Алексей.
    Попробовал вторую версию. При экспорте в csv повторяются проблемы, описанные мною ранее.
    Просто интересно - так и должно быть или это какая-то ошибка?

  11. Кулик Алексей aka kpblc пишет:

    Насколько я понял, это проблема CSV фактически. Он корректно будет импортироваться в Excel только в случае, если разделитель между колонками не символ табуляции, а символ ";" (точка с запятой). Учитывая, что этот символ может вполне легко использоваться в значениях атрибутов, я не рискнул переделывать разделитель.
    Сегодня я на Autodesk University, вернусь в нормальный режим ориентировочно в субботу-воскресенье, попробую провернуть несколько экспериментов. Если получится что-то вменяемое, обязательно выложу обновление.

  12. Кулик Алексей aka kpblc пишет:

    Так, нашел пути обхода. Сделаю
    Погорячился. Сохранение в csv приводит к ситуации, которую я пока не могу представить, как корректно решить :( Поэтому могу предложить только "забыть про csv" :(

  13. Кулик Алексей aka kpblc пишет:

    Добавил новую версию. Заодно и дискайм (ну как бы предупреждение) написал.

  14. kacugu пишет:

    Добрый день Алексей.
    Спасибо за версию 0.3. Теперь экспорт атрибутов происходит нормально и в формате csv.
    Из замеченных недостатков/проблем:
    1. Экспорт атрибутов происходит вместе с форматированием: \W0.8000;%%C25 A-III L=2600 ГОСТ 5781-82. Если не удалить форматирование и потом импортировать такие значения обратно, то сбиваются значения атрибутов.
    2. Тут скорее проблема экселя: handle вида 11E8 excel преобразует в 1.10E+09. Как следствие при импорте этот блок уже не находится

  15. Кулик Алексей aka kpblc пишет:

    1. Это явно многострочные атрибуты, с которыми я редко работаю :( Попробую что-нибудь нарисовать и исправить
    2. Понял, учту.

    Не уверен, что смогу в ближайшие пару дней заняться. Но как только - так сразу ))

  16. kacugu пишет:

    1. Вопрос с форматированием решил с помощью функции UnFormat от Lee Mac http://www.lee-mac.com/unformatstring.html - пока вроде работает
    2. Вопрос с handle решил добавлением символа ' к значению. При экспорте работает, а вот как потом удалить этот символ при импорте пока не решил.

  17. Кулик Алексей aka kpblc пишет:

    Сейчас жуткая запарка, ничего не успеваю :( Про апостроф я как-то не сообразил сразу. Сделаю, обязательно сделаю - но позже.

  18. kacugu пишет:

    Так вроде никто не торопит) Я из природной любознательности больше интересуюсь)

  19. Кулик Алексей aka kpblc пишет:

    Наконец-то дошли руки, выпустил новую сборку. Попробуйте, если вдруг кому интересно...

  20. kacugu пишет:

    Здравствуйте, Алексей.
    Попробовал версию 0.4.
    Пока что проблем в работе лиспа не замечено

  21. Александр пишет:

    Здравствуйте.
    Не выполняет импорт значений атрибутов из txt, из csv импортирует нормально. Проверял в AC 18,21,23.
    Пожелание-предложение. attout из экспресса выдаёт атрибуты в текстовый файл в том порядке, в котором они заданы в блоке (в том порядке, как их видит пользователь в окне редактора атрибутов блока), а att-export-import выдаёт их, сортируя имена тэгов по алфавиту. Возможно ли реализовать вариант выдачи, как у attout?

  22. Кулик Алексей aka kpblc пишет:

    Если будет время - посмотрю, что там с импортом из txt. А остальное - ну реально, насколько надо сортировка не по тэгу атрибута, а по порядку их создания (который, кстати, может быть совсем разным в разных блоках)?

  23. Александр пишет:

    "ну реально, насколько надо сортировка не по тэгу атрибута, а по порядку их создания (который, кстати, может быть совсем разным в разных блоках)"
    Ситуация следующая. Всего в блоке более 50 атрибутов. Порядок запроса атрибутов в блоке скомпонован по их функциональному назначению. Пример порядка запроса атрибутов: РАДИУСКР -> СТОРОНКР -> ТИПОП -> ТИПКОН1 -> ТИПКОН2 -> ТИПФИКС1 -> ТИПФИКС2. Когда я опрашиваю разом с помощью attout штук 200 блоков в чертеже, то в Экселе потом вижу столбцы значений атрибутов именно в порядке их создания, соответственно, я могу эти данные за один захват выделить и скопировать в другой файл для обработки. В случае сортировки по наименованию тэга исходный порядок в экселе рушится, между этими столбцами влезают всякие ТИПАНКЕРА, ТИПКР, ЗАЗЕМЛЕН и т.д., которые относятся к другой функциональной группе. Приходится лазить по таблице и выдёргивать нужные столбцы по одному, что крайне неудобно и долго.
    Можно попытаться сделать тэгам префиксы-костыли типа 1_РАДИУСКР, 2_СТОРОНКР и т.д. Но это костыль неработающий, потому что сортируется так: 1_; 10_; 11_ ... 19_; 2_; 20_; 21_ и т.д.
    Короче, мне как пользователю порядок задания гораздо важнее и принципиальнее, а только потом наименование тэгов, поэтому attout в этом плане то, что надо. При это я не делаю одновременный опрос блоков с кардинально разными атрибутами.

  24. Кулик Алексей aka kpblc пишет:

    Добавил запрос на сортировку атрибутов (версия 0.5). Для корректной обработки txt-файлов разделитель должен быть табуляцией; в csv - ";". Мне не удалось повторить "некорректную" обработку txt-файлов, так что ничего там не менял.
    Если информация не совсем секретная - хотелось бы увидеть dwg, txt с минимальным количеством образцов блоков (пары-тройки должно хватить, надеюсь).

  25. Александр пишет:

    Спасибо! Сортировка работает как надо. Ссылку на dwg, txt и csv сделаю.

Поделитесь своим мнением


Я не робот.