Обход состава сборки и правка путей файлов

Автор Oleg_S, 06.04.18, 14:15:37

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Oleg_S

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


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();
  }


ТрындецЪ

1)  topPart.Parts возвращает интерфейсы IModelObject, их нужно привести к интерфейсам IPart7, чтобы потом путь получать.
2) Файлы моделей по новому пути существуют?

Oleg_S

1)  Да вроде проблем с получить нет, всё корректно получает, смотрю в отладчике - всё норм.
2) Я скопировал папку с файлами из другого места и хотел как раз править пути на их новое местоположение, то есть все файлы существуют, просто сборки указывают на старое местонахождение.

ТрындецЪ

Вот рабочий код на 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()

Oleg_S

Попробовал что - то подобное на шарпе... Но не сохраняет он изменений. Никак не могу понять в чём косяк. Хотя бы ошибку какую выдавал.

SerGoVec

Как вариант: не сохраняет изменения поскольку в данный момент прохода цикла по сборке, сборка находится в другом исполнении, например исполнение №0, а деталь, в которой необходимо поменять путь находится в исполнении №1...

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

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