Элементы вариации

Здравствуйте.

Попадаются некорректные DWG файлы, которые содержат элементы динамических блоков (элементы вариации) в пространстве чертежа. Эти элементы невидимы и при копировании любого примитива в другой чертёж переносятся туда. Происходит "заражение" новых файлов. При этом пользователь ничего не замечает.

Если открыть такой файл в Автокаде, выдаётся сообщение: файл содержит элементы вариации. Открыть в редакторе блоков?

В Нанокаде никаких сообщений не появляется. Выявить такой файл возможно только при вставке из буфера блоком (CTRL+SHIFT+V). Тогда у блока появляются скрытые на чертеже элементы. В примере "Видимость" и "Поворот".

Лечение для Нанокада придумал такое:

  1. Скопировать чертежи в буфер обмена;
  2. В новый файл вставить из буфера блоком (CTRL+SHIFT+V);
  3. Расчленить (взорвать) получившийся блок.

У меня два вопроса:

  1. Как в Нанокаде получать уведомления о содержащихся на чертеже элементах вариации? Наподобие автокадовского сообщения. Это позволило бы предотвратить размножение этих элементов по новым чертежам;
  2. Возможно ли сделать скрипт для автоматической очистки чертежа от элементов вариации?

Теги темы:

Лучший ответ

  • EdwardSt
    отредактировано 15 апр Ответ ✓

    Попробуйте код, который просто удаляет словарь, отвечающий за элементы вариации.

    Не знаю, насколько такая операция безопасна. Дождался бы комментария @kpblc

    Но пока можете потестить на свой страх и риск

    (defun c:ttt ( / vdict dict)
    (vl-load-com)
    (setq vdict (vla-GetExtensionDictionary
    (vla-get-modelspace
    (vla-get-ActiveDocument
    (vlax-get-acad-object)))))
    (setq dict (vlax-vla-object->ename vdict))
    (if (dictsearch dict "ACAD_ENHANCEDBLOCK")
    (progn
    (dictremove dict "ACAD_ENHANCEDBLOCK")
    (alert "Информация об элементах вариации удалена!")
    ))
    (prin1)
    )

    ЗЫ. Кстати, удаление такой информации не всегда является действительно желаемой опцией.

    Если описание динамического блока (корректно только в АС) экспортировалось чем-то типа WBLOCK или сохранением описания блока во внешнем файле, то после такой экзекуции этот файл будет недоступен в качестве вставки блока. Нужно быть точно уверенным, что вы действительно желаете изменить чертеж, а не внести правку в библиотечный элемент-блок.

Ответы

  • Olga94
    отредактировано 10 апр

    Посмотреть в Диспечере чертежа, например

  • Кожевников_Юра
    отредактировано 10 апр

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

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

  • EdwardSt
    отредактировано 15 апр

  • Спасибо! Работает. Поломок чертежей пока не замечено, будем тестировать. Если найдутся - напишу.
    Это решение второго вопроса.

  • Первый вопрос - информирование пользователя о наличии проблемы - более сложная задача. Ее решение возможно:

    • со стороны разработчиков Нанософта путем фиксации пожелания и реализации соответствующего функционала. Путь тяжеловесный, но правильный. Возможно, потребуются дополнительные уточнения по способу реализации, т.к. пресловутые элементы вариации не поддаются редактированию (пока) нанокадом;
    • Использованием механизма реакторов в лисповском скрипте, отслеживающих событие открытия файла и проводящим соответствующую проверку и информирование пользователя о кракозябе. Путь несложный (большая часть его была пройдена на старом форуме), но не очень надежный (есть предвзятое отношение к этому механизму);
    • Использование аналогичного п.2 механизма на других платформах (C#, Мультикад и т.п.). Необходимо обратиться к спецам по этим платформам. Тут я - пас.

  • Кожевников_Юра
    отредактировано 16 апр

    А можно подробнее о варианте "Использованием механизма реакторов в лисповском скрипте…" ?

    Немного поправил ваш скрипт для проверки наличия элементов вариации:

    (defun c:проверить_элементы_вариации ( / vdict dict)

    (vl-load-com)

    (setq vdict (vla-GetExtensionDictionary

    (vla-get-modelspace
    
      (vla-get-ActiveDocument
    
        (vlax-get-acad-object)))))
    

    (setq dict (vlax-vla-object->ename vdict))

    (if (dictsearch dict "ACAD_ENHANCEDBLOCK")

    (progn
    
      (alert "Файл содержит элементы вариации!")
    
    ))
    

    (prin1)

    )

    Получается простой способ проверки, но он требует выполнения команды.

    Теперь вопрос: как выполнять автоматически команду "проверить_элементы_вариации" во время старта Нанокада? (не подгрузка лиспа через APPLOAD, а именно выполнение команды) Тогда первый вопрос тоже будет решён.

  • А можно подробнее о варианте "Использованием механизма реакторов в лисповском скрипте…" ?

    Теперь вопрос: как выполнять автоматически команду "проверить_элементы_вариации" во время старта Нанокада?

    Наверное, имеется ввиду не "во время старта Нанокада", а в "момент открытия файла".

    Именно второе (и еще очень много другого, связанного с контролем изменений) и отслеживается через механизм реакторов. По-другому - никак. Если коротко, то это фрагменты кода, запускаемые по определенному событию, а не путем вызова команды. Механизм этот очень нежный, нужен определённый навык. Не советовал бы сразу в него окунаться, если не желаете всерьез погрузиться в программирование.

    В качестве альтернативы предложил бы остановиться на ручном вызове программы. Еще ее можно модифицировать, чтоб она не выдавала сообщение (убрать alert). Тогда можно добавить эту команду в пакетную обработку файлов и "натравить" все это хозяйство на папку с файлами, подвергаемыми санации.