Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Тема начата: Oleg_S от 06.04.18, 14:15:37

Название: Обход состава сборки и правка путей файлов
Отправлено: Oleg_S от 06.04.18, 14:15:37
День добрый.
Пробегаю по файлу сборки и правлю пути к файлам у входящих объектов. Но беда в том что результат не сохраняется, да и никакой ошибки не происходит. Что может быть?


private void ConvertFile(string filePath)
{
      KompasObject _kompas;
      IApplication _newApi;
      Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
      _kompas = (KompasObject)Activator.CreateInstance(t);
      _newApi = _kompas.ksGetApplication7();
     
       IKompasDocument3D doc = (IKompasDocument3D)_newApi.Documents.Open(filePath, false);
       IPart7 topPart = doc.TopPart;
     
       foreach (IPart7 part in topPart.Parts)
       {
             string newFileName = ConvertFilePath(part.FileName);
             part.FileName = newFileName;
              part.Update();
        }
        doc.Save();
  }

Название: Re: Обход состава сборки и правка путей файлов
Отправлено: ТрындецЪ от 06.04.18, 14:47:00
1)  topPart.Parts возвращает интерфейсы IModelObject, их нужно привести к интерфейсам IPart7, чтобы потом путь получать.
2) Файлы моделей по новому пути существуют?
Название: Re: Обход состава сборки и правка путей файлов
Отправлено: Oleg_S от 06.04.18, 15:05:49
1)  Да вроде проблем с получить нет, всё корректно получает, смотрю в отладчике - всё норм.
2) Я скопировал папку с файлами из другого места и хотел как раз править пути на их новое местоположение, то есть все файлы существуют, просто сборки указывают на старое местонахождение.
Название: Re: Обход состава сборки и правка путей файлов
Отправлено: ТрындецЪ от 06.04.18, 15:18:17
Вот рабочий код на Python, который меняет файлы текущей сборки с диска 'C' на 'D' и наоборот.
# -*- coding: utf-8 -*-

import pythoncom
from win32com.client import Dispatch, gencache

KAPI7 = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
iApplication = KAPI7.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(KAPI7.IApplication.CLSID, pythoncom.IID_IDispatch))
iDocument = iApplication.ActiveDocument
iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)
iPart7_Top = iKompasDocument3D.TopPart
iParts7 = iPart7_Top.Parts

if iParts7.Count:
    for iPart7 in iParts7:
        iPart7 = KAPI7.IPart7(iPart7)
        Path = iPart7.FileName
        if Path[0] =='C':
            iPart7.FileName = 'D' + Path[1:]
        else:
            iPart7.FileName = 'C' + Path[1:]
        iPart7.Update()
Название: Re: Обход состава сборки и правка путей файлов
Отправлено: Oleg_S от 17.04.18, 14:37:34
Попробовал что - то подобное на шарпе... Но не сохраняет он изменений. Никак не могу понять в чём косяк. Хотя бы ошибку какую выдавал.
Название: Re: Обход состава сборки и правка путей файлов
Отправлено: SerGoVec от 17.04.18, 17:39:03
Как вариант: не сохраняет изменения поскольку в данный момент прохода цикла по сборке, сборка находится в другом исполнении, например исполнение №0, а деталь, в которой необходимо поменять путь находится в исполнении №1...

Ps. при обходе сборки не забудьте обходить исполнения IEmbodimentsManager, а в текущем исполнении обходите детали.

Pss. Не знаю как в шарпе, а на delphi для того чтобы поменять путь к файлу использовал маааленькую хитрость
iter_Part.FileName := ExtractFileName(iter_Part.FileName);    //абс. путь построится сам при указании имени файла, это при учете ,что файлы уже были скопированы и сам обход осуществляется с того места куда скопировали.