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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Палитра инструментов. Быстрая замена пути к источникам данных для всех элементов сразу.

Палитра инструментов. Быстрая замена пути к источникам данных для всех элементов сразу.

Ответ
Поиск в этой теме
Непрочитано 27.11.2009, 11:50 #1
Палитра инструментов. Быстрая замена пути к источникам данных для всех элементов сразу.
hwd
 
C, C++, C#
 
С-Пб.
Регистрация: 07.10.2009
Сообщений: 2,762

Исходные данные
Создана палитра инструментов и наполнена содержимым. Каждый элемент на вкладке палитры ссылается на некоторый файл, содержащий в своём составе нужный блок. Этот блок и будет вставлен в чертёж при активации данного элемента палитры. Все файлы-источники (используемые элементами палитры) размещены в определённом каталоге сети или его подкаталогах.

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

Общая схема решения
Нужна возможность указания в свойствах элемента, размещённого на вкладке палитры, относительного пути к файлу, а так же возможность использования пользовательских и системных переменных.

Попытка реализации решения
Создал новую системную переменную под именем %AcadCommonSettingsPath%, которая содержит строковое значение пути к каталогу, в котором расположены файлы, являющиеся источниками данных для моей палитры инструментов. Проверил через Проводник - переменная работает, т.е. введя в строке пути %AcadCommonSettingsPath% благополучно попадаю в нужный мне каталог.

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

Вопрос
Кто-нибудь уже решал данную проблему? Если да, то как?

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

Далее... Палитру инструментов можно экспортировать в xpg-файл. Содержимое файла представлено в формате XML.
Открываю файл и смотрю:

Код:
[Выделить все]
<ToolPaletteGroupExport>
  <ToolPaletteGroups>
    <ToolPaletteGroup>
      <Name>Оформление</Name>
      <CustomData />
      <ActivePaletteIndex>0</ActivePaletteIndex>
      <Contents>
        <ToolPalette ID="{6D067168-1D89-4567-87C6-D22CAC068AE3}" />
        <ToolPalette ID="{5A4F6403-D585-4B27-A261-8D22C2CCCC69}" />
      </Contents>
    </ToolPaletteGroup>
  </ToolPaletteGroups>
</ToolPaletteGroupExport>
Как видим, в файле представлены идентификаторы (GUID) вкладок палитры инструментов. Возможно удастся внести изменения в файл, содержащий описание вкладок палитр.
Какой файл содержит информацию по данным идентификаторам? Сначала подумал, что данные могут храниться в реестре (от Autodesk этого вполне можно ожидать). Однако поиск не дал результата. Тогда задал в проводнике поиск по содержимому файлов, указав один из GUID - результат поиска пока так же нулевой (продолжает искать).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 27.11.2009 в 12:21.
Просмотров: 9298
 
Непрочитано 27.11.2009, 12:26
#2
ытя


 
Регистрация: 23.09.2005
СПб
Сообщений: 424


Цитата:
Сообщение от hwd Посмотреть сообщение
Придётся вручную изменять свойства для каждого элемента, входящего в состав палитры, указывая новый путь к файлу. Если таких элементов много - данный процесс займёт много времени.
Требуется свести к минимуму количество операций, необходимых для того, чтобы после перемещения каталога, содержащего файлы данных, палитра инструментов продолжала работать.
Если не использовать "Общая схема решения...", то открываем файл(ы) палитры (лежат в C:\Documents and Settings\user\Application Data\Autodesk\AutoCAD XXXX\...\Support\ToolPalette\Palettes) в текстовом редакторе и с помощью поиска-замены скопом меняем на нужный путь.
ытя вне форума  
 
Автор темы   Непрочитано 27.11.2009, 12:52
#3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от ытя Посмотреть сообщение
лежат в C:\Documents and Settings\user\Application Data\Autodesk\AutoCAD XXXX\...\Support\ToolPalette\Palettes.
Спасибо
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 27.11.2009, 13:32
#4
kheylan


 
Регистрация: 24.05.2009
Екатеринбург
Сообщений: 86


hwd
Удобно редактировать пути к блоку в палитре с помощью редактора XML NOTEPAD, который прилагаю, но нужно редактировать файлы *.atc в папке ...\ToolPalette\Palettes\*.atc
Путь в редакторе к блоку находится Palette>Tools>Tool>Data>Block>SourceFile
Вложения
Тип файла: rar XmlNotepad.rar (1.01 Мб, 141 просмотров)
kheylan вне форума  
 
Автор темы   Непрочитано 27.11.2009, 15:45
#5
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от kheylan Посмотреть сообщение
hwd
Удобно редактировать пути к блоку в палитре с помощью редактора XML NOTEPAD, который прилагаю, но нужно редактировать файлы *.atc в папке ...\ToolPalette\Palettes\*.atc
Путь в редакторе к блоку находится Palette>Tools>Tool>Data>Block>SourceFile
Спасибо, я знаю об этом редакторе, он у меня есть. )

Похоже, что не распознаёт автокад системных переменных операционной системы... Если данную строку скопировать и вставить в проводник - нужный каталог открывается. Видимо у автокада с этим проблемы, или синтаксис др. должен быть...

Как видно из командной строки скрина - автокад убирает знаки процентов из пути...



Если поставить два процента, то получается правильная строка пути, но акад всё равно не видит файл. хотя всё тот же проводник эту строку ест нормально.

__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 27.11.2009 в 16:02.
hwd вне форума  
 
Непрочитано 27.11.2009, 16:07
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


А если попытаться внутри AutoCAD выполнить (getenv "AcadCommonSettingsPath")?
По-моему, корректно будут браться только системные переменные, возвращаемые командой set в cmd (и то каждую проверить не помешает):
Код:
[Выделить все]
с:>set
ALLUSERSPROFILE
APPDATA
CLASSPATH
CommonProgramFiles
COMPUTERNAME
ComSpec
FP_NO_HOST_CHECK
HOMEDRIVE
HOMEPATH
LOGONSERVER
NUMBER_OF_PROCESSORS
OS
Path
PATHEXT
PROCESSOR_ARCHITECTURE
PROCESSOR_IDENTIFIER
PROCESSOR_LEVEL
PROCESSOR_REVISION
ProgramFiles
PROMPT
SystemDrive
SystemRoot
TEMP
TMP
USERDNSDOMAIN
USERDOMAIN
USERNAME
USERPROFILE
windir
Возможно, на каких-то конкретных машинах этот список будет отличаться.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.11.2009, 16:14
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Решение оказалось простым (спасибо Александру Ривилису за подсказку!):
В свойстве достаточно убрать путь к файлу, а в диалоговом окне Options, на вкладке Files добавить в категорию Support Search File Path путь к нужному каталогу. Всё работает безо всяких там системных переменных.
А изменить содержимое файлов, вырезав из них пути и оставив только имена можно так:

Код:
[Выделить все]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.IO;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WindowWidth = 180;
            //Каталог, в котором находятся файлы, подлежащие обработки
            DirectoryInfo dir = new DirectoryInfo(@"C:\Documents and Settings\andrey.bushman\Application Data\Autodesk\AutoCAD 2009\R17.2\enu\Support\ToolPalette\Palettes");
            //Правлю файлы
            ChangePath(dir, "xxx_");
            Console.Read();
        }

        /// <summary>
        /// Метод обрабатывает группу atc-файлов, удаляя в SourceFile пути к dwg-файлам, оставляя только их имена.
        /// </summary>
        /// <param name="dir">Каталог, в котором расположены искомые atc-файлы</param>
        /// <param name="prefixFilter">Префикс, с которого начинаются имена файлов, которые необходимо обработать</param>
        static void ChangePath(DirectoryInfo dir, string prefixFilter)
        {         
            if (!dir.Exists) return;            
            foreach (FileInfo fileFromList in dir.GetFiles(prefixFilter + "*.atc"))
            {
                if (!fileFromList.Name.StartsWith(prefixFilter)) continue;
                    XElement obj = XElement.Load(fileFromList.FullName);
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("Файл: {0}", fileFromList.FullName);
                    Console.ForegroundColor = ConsoleColor.Gray;
                    Console.WriteLine("Содержимое файла до внесения изменений:");                    
                    Console.WriteLine(obj);                    
                    Console.WriteLine("Изменяем содержимое...");
                    Console.WriteLine();
                    foreach (XElement item in obj.Element("Tools").Elements("Tool"))
                    {
                        if (!item.Element("Data").IsEmpty)
                        {
                            XElement fp = item.Element("Data").Element("Block").Element("SourceFile");
                            FileInfo dwgFile = new FileInfo(fp.Value);
                            fp.Value = dwgFile.Name;
                        }
                    }
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Содержимое файла после внесения изменений:");
                    Console.ForegroundColor = ConsoleColor.Gray;
                    Console.WriteLine();
                    Console.WriteLine(obj);
                    obj.Save(fileFromList.FullName);
            }
        }
    }
}
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 27.11.2009 в 18:31.
hwd вне форума  
 
Непрочитано 30.11.2009, 14:48
#8
kheylan


 
Регистрация: 24.05.2009
Екатеринбург
Сообщений: 86


hwd
A как из этого кода сделать команду для удаления пути? Очень интересно.
kheylan вне форума  
 
Автор темы   Непрочитано 30.11.2009, 15:42
#9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от kheylan Посмотреть сообщение
hwd
A как из этого кода сделать команду для удаления пути? Очень интересно.
это был общий код. для того, чтобы сделать из него консольное приложение, его следует слегка изменить. При желании можно по быстрому создать и GUI (WinForm или WPF), в котором заюзать этот метод, но имхо задача того не стоит. Я оформил в виде консольного приложения. Описание того, как им пользоваться прилагается в архиве.
Архив с "программкой" лежит здесь.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 30.11.2009, 16:04
#10
Сергей Дубина


 
Регистрация: 06.04.2009
Сообщений: 705


Есть частный случай, в котором задача решается штатными средствами: если все блоки находятся в одном файле, то выбрав через шифт все элементы на палитре, правой кнопкой выбрать свойства объекта и поменять путь к файлу, для всех элементов сразу.
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Автор темы   Непрочитано 30.11.2009, 16:06
#11
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Сергей Дубина Посмотреть сообщение
Есть частный случай, в котором задача решается штатными средствами: если все блоки находятся в одном файле, то выбрав через шифт все элементы на палитре, правой кнопкой выбрать свойства объекта и поменять путь к файлу, для всех элементов сразу.
У меня блоки находятся в разных файлах.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Палитра инструментов. Быстрая замена пути к источникам данных для всех элементов сразу.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Предложения по расчетным моделям сооружений aldt Расчетные программы 8 06.07.2009 17:53
Электромагнитная пушка T-Yoke Машиностроение 112 06.08.2008 18:48
Юмор 2007 Огурец Разное 1172 29.12.2007 11:16
Подскажите способ перевода DWG в PDF сразу для всех лайаутов dextron3 AutoCAD 15 14.10.2007 20:39