О буфере обмена замолвим словечко…
О том, что такое буфер обмена, распространяться не буду - и так все знают. Где-то и когда-то я рассказывал про свое видение тонкостей работы с этим понятием в AutoCAD. Искать лениво, поэтому попробую высказаться тут.
Логика работы буфера обмена в AutoCAD немного необычна. Дело в том, что после нажатия Ctrl+C выделенные объекты не только копируются в буфер (точнее, копируется их визуальное представление, насколько я понимаю), но и, дополнительно:
а) во внедокументном адресном пространстве организовывается заполнение некоей переменной полным описанием всех выделенных объектов и
б) в каталог временных файлов (обычно это %temp%) записывается полноценный dwg-файл с именем A$C<и тут цифирки-цифирки-цифирки>. Цифирки, естественно, назначаются случайным (точнее, псевдослучайным) образом.
Если идет вставка "как блок", то проще вставлять внешний файл как блок. Если идет вставка "врассыпную", то, казалось бы, проще сделать через entmakex все примитивы, описания которых хранятся в этой внедокументной переменной. Но в выделенные объекты могут запросто вмешаться вертикальные приложения или пользовательские arx-приложения, создающие custom-объекты. Поэтому (как я полагаю, "для гарантии") делается блок, внутри которого уже создаются все примитивы, блок вставляется и тут же разбивается.
Но есть проблема. И не одна...
Файл, хранимый в %temp%, может запросто не удалиться даже при корректном выходе из AutoCAD (я уж молчу про Fatal Error). Это раз.
Второе. Цифры назначаются псевдослучайным образом, то есть теоретически возможна ситуация, при которой эти цифры будут повторяться.
И, наконец, третье. Описание временного блока копирования-вставки не удаляется из файла.
Представим себе ситуацию: первого марта человек открывает файл (назовем его файл1.dwg) и работает с буфером обмена, вставляя скопированное "как блок". Естественно, на имена блоков он не смотрит, хотя и стоило бы: имя блока вида A$C1653965 мало что скажет. Ну да ладно.
Проходит пару дней (или месяцев, или лет...), и проектировщик возвращается к этому файлу. Ему жизненно необходимо скопировать в этот файл кусок из другого (файл2.dwg). Все стандартно: во втором файле Ctrl+C, переход в первый, Ctrl+V - и вуаля, тушите свет, сливайте воду: на курсоре вместо скопированной таблицы болтается изображение какой-то двери. Что за дела, кричит проектировщик... Ведь в другой / новый файл все вставляется корректно!
Кричать бесполезно. Учитывая все то, что я сказал выше, получается примерно такая схема работы:
- Примитивы из файл2 копируются в буфер. Набор получает "имя" A$C1653965
- Переход в файл1. Нажимается "вставить из буфера".
- AutoCAD проверяет таблицу блоков файл1 на предмет: "а нет ли тут блока с описанием A$C1653965?"
- Естественно, что такой блок находится - ведь раньше-то буфером пользовались!
- Выполняется вставка имеющегося описания блока.
Вот и все.
Теперь о методах "борьбы"...
Естественно, что необходимо выполнять очистку файла от мусора. В идеале - каждый раз при сохранении файла.
Кроме того, крайне желательно "проходить" по таблице блоков текущего файла и переименовывать блоки копирования-вставки, гарантируя уникальность имени.
И, наконец, последнее: при закрытии AutoCAD (ну или Windows :)) желательно очищать %temp% от накопившегося мусора.
Я у себя на работе провернул первые два пункта, и с тех пор жалоб на "неправильное поведение буфера" не слышал
Алексей!
Спасибо за подробное описание! А у нас на работе иная проблема. Цифири вполне исправно генерятся рандомно (может это еще и связано с х64 битностью ОС и кадика, раньше им сложнее было не повторяться, а может и механизм улучшили), но! у нас под разными именами скрывается абсолютно идентичное содержание. И тут уж хоть обос...сь но без ручного вмешательства две тысячи блоков, изображающих один и тот же элемент из 10-ти тысяч блоков A$блабла никак не вычленишь... Вот такие умелые у нас руки
>> под разными именами скрывается абсолютно идентичное содержание
Вот с таким не сталкивался ни разу. Я бы попробовал все же переименовать все блоки A$C* в чертеже, добавив в конце имени, к примеру, текущую дату с точностью до миллисекунд (если работа выполняется в 2019 и более поздних версиях, миллисекунды придется имитировать - там (getvafr "cdate") срабатывает некорректно). Естественно, не руками.
Ну и %temp% на чистку, конечно.