Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# & AutoCad внешние ссылки, изменение путей внешних ссылок 
:(
    Опции темы
Nec32
Дата 18.6.2010, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.4.2010

Репутация: нет
Всего: нет



У меня задача после работы пользователем с автокадовским документом, сохранять его в базе
проблема возникает тогда, когда в документе имеются ссылки на внешние файлы
Код

using ACad = Autodesk.AutoCAD.Interop;



ACad.AcadDocument acaddocument = (ACad.AcadDocument)Document;
        
String FileName;
String FullFileName;
String folder = acaddocument.FullName.Substring(0, acaddocument.FullName.LastIndexOf('.'));
DirectoryInfo dir = new DirectoryInfo(folder); // папка в той же директории где и сам документ с таким же название как имя документа
FileInfo OutFile;
List<int> ListIndex = new List<int>();


//1 способ [ берутся только *.dwg, но можно менять путь ]

for (int i = 0; i < acaddocument.Blocks.Count; i++)
{
    ACad.Common.AcadBlock  block = acaddocument.Blocks.Item(i);
    if (block != null)
        if (block.IsXRef)
        {
            String outFileName = "\\" + block.Name + block.Path.Substring(block.Path.LastIndexOf("."));
            if (block.Path[0] == '.') // проверка на относительный путь
                OutFile = new FileInfo(dir.Parent.FullName + block.Path.Substring(1));
            else
                OutFile = new FileInfo(block.Path);
            if (!OutFile.FullName.Equals(dir.FullName + outFileName)) // проверка на нужное место, то есть если там где надо, то пропускать
            {
                OutFile.CopyTo(dir.FullName + outFileName, true);
                block.Path = ".\\" + dir.Name + outFileName;
            }
            block.Reload();
        }
}



//2 способ [ по идее должны браться все ссылки, но это не всегда происходит, некоторые пропускаются, и все параметры readonly ]



foreach(ACad.Common.AcadFileDependency file in acaddocument.FileDependencies)
{
    ListIndex.Add(file.Index);
}
for (int i = 0; i < ListIndex.Count; i++)
{
    int index;
    ACad.Common.AcadFileDependency file = acaddocument.FileDependencies.Item(ListIndex.ToArray()[i]);
    acaddocument.FileDependencies.UpdateEntry(file.Index);
    if (file.Feature.Equals("Acad:XRef") || file.Feature.Equals("Acad:Image"))
    {
        FileName = file.FileName;
        FullFileName = file.FullFileName;
        OutFile = new FileInfo(FullFileName);
        if (OutFile.Exists) // если ссылка не битая, если битая то можно воспользоваться FoundPath
        {
            dir.Create();
            if (!FullFileName.Equals(dir.FullName + "\\" + FileName)) // проверка на нужное место, то есть если там где надо, то пропускать
            {
                OutFile.CopyTo(dir.FullName + "\\" + FileName, true);

                index = acaddocument.FileDependencies.CreateEntry
                (file.Feature, dir.FullName + "\\" + FileName, file.AffectsGraphics, true);
                acaddocument.FileDependencies.UpdateEntry(index); // создает но в автокаде не видно [ наверно, надо указывать ссылку ]
                acaddocument.FileDependencies.RemoveEntry(file.Index, true); // удаляет но в автокаде в "вхождение файлов"  остается при повторном запуске кода создает с новым индексом
            }
        }
    }
}
acaddocument.Save();

в первом способе берутся не все внешние файлы
во втором нельзя менять и не всегда все показаны, а иногда и шрифты и муть какая то показывается


помогите люди, уже головой об стену бьюсь


Это сообщение отредактировал(а) Nec32 - 18.6.2010, 16:48
PM MAIL   Вверх
Nec32
Дата 9.7.2010, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.4.2010

Репутация: нет
Всего: нет



Код

//копирует файл в document_Path\document_FileName\
//и изменяет ссылку на относительную
//OldPath дополнительный путь где искать файлы
        private void CopyFileDependencies(ACad.AcadDocument document,String OldPath)
        {
            String folder = document.FullName;
            folder = folder.Substring(0, folder.LastIndexOf('.'));
            DirectoryInfo dir = new DirectoryInfo(folder); // папка куда копировать

            for (int i = 0; i < document.ModelSpace.Count; i++)
            {
                ACad.Common.AcadEntity ent = document.ModelSpace.Item(i);
                String outName = null;
                String ReserveFilePath = null;
                try
                {
                    if (ent.EntityType == 26)
                    {
                        ACad.Common.AcadRasterImage rimage =
                            (ACad.Common.AcadRasterImage)document.HandleToObject(ent.Handle);
                        rimage.Update();
                        outName = CopyAcadObject(dir, rimage.ImageFile);
                        if (OldPath != null) //если есть дополнительный путь для поиска
                        {
                            if (outName == null) //если файл не был скопирован
                            {
                                if (rimage.ImageFile[0].Equals('.'))//если путь относительный, не относительный тупо проверять относительно дополнительного пути
                                {
                                    ReserveFilePath = OldPath + rimage.ImageFile.Substring(2);
                                    outName = CopyAcadObject(dir, ReserveFilePath);
                                }
                            }
                            if (outName == null) //если файл не был скопирован
                            {
                                //поиск файла в самой папке
                                ReserveFilePath = OldPath + rimage.ImageFile.Substring(rimage.ImageFile.LastIndexOf("\\")+1);
                                outName = CopyAcadObject(dir, ReserveFilePath);
                            }
                        }
                        if (outName == null)
                            MessageBox.Show(rimage.ImageFile + " Файл не найден");
                        else
                        {
                            rimage.ImageFile = outName;
                            rimage.Update();
                        }
                    }
                }
                catch (Exception ex) { }
            }
//тоже самое с блоками
            for (int i = 0; i < document.Blocks.Count; i++)
            {
                ACad.Common.AcadBlock block = document.Blocks.Item(i);
                String outName = null;
                String ReserveFilePath = null;
                if (block != null)
                    if (block.IsXRef)
                    {
                        block.Reload();
                        outName = CopyAcadObject(dir, block.Path);
                        if (OldPath != null)
                        {
                            if (outName == null)
                            {
                                if (block.Path[0] == '.')
                                {
                                    ReserveFilePath = OldPath + block.Path.Substring(2);
                                    outName = CopyAcadObject(dir, ReserveFilePath);
                                }
                            }
                            if (outName == null)
                            {
                                ReserveFilePath = OldPath + block.Path.Substring(block.Path.LastIndexOf("\\")+1);
                                outName = CopyAcadObject(dir, ReserveFilePath);
                            }
                        }
                        if (outName == null)
                            MessageBox.Show(block.Path + " Файл не найден");
                        else
                        {
                            block.Path = outName;
                            block.Reload();
                        }
                    }
            }
        }
//-----------------------------------------------------------------------------------
        private String CopyAcadObject(DirectoryInfo dir, String FileName)
        {
            FileInfo OutFile = null;
            String outFileName = FileName.Substring(FileName.LastIndexOf("\\")); //имя файла
            if (FileName[0].Equals('.')) //проверка на относительность
                OutFile = new FileInfo(dir.Parent.FullName + FileName.Substring(1));
            else
                OutFile = new FileInfo(FileName);
            if (OutFile.Exists) //если файл для копирования существует
            {
                if (!OutFile.FullName.Equals(dir.FullName + outFileName)) //если он не в том месте куда мы собрались копировать
                {
                    dir.Create();
                    OutFile.CopyTo(dir.FullName + outFileName, true);
                }
                return String.Format(@".\{0}{1}", dir.Name, outFileName);
            }
            //если файл не скопирован то ищем его в папке с документом
            OutFile = new FileInfo(dir.Parent.FullName + outFileName);
            if (OutFile.Exists)
            {
                dir.Create();
                OutFile.CopyTo(dir.FullName + outFileName, true);
                return (String.Format(@".\{0}{1}", dir.Name, outFileName));
            }
            else
                return null;
        }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1386 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.