День добрый.
Пробегаю по файлу сборки и правлю пути к файлам у входящих объектов. Но беда в том что результат не сохраняется, да и никакой ошибки не происходит. Что может быть?
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) Файлы моделей по новому пути существуют?
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()
Попробовал что - то подобное на шарпе... Но не сохраняет он изменений. Никак не могу понять в чём косяк. Хотя бы ошибку какую выдавал.
Как вариант: не сохраняет изменения поскольку в данный момент прохода цикла по сборке, сборка находится в другом исполнении, например исполнение №0, а деталь, в которой необходимо поменять путь находится в исполнении №1...
Ps. при обходе сборки не забудьте обходить исполнения IEmbodimentsManager, а в текущем исполнении обходите детали.
Pss. Не знаю как в шарпе, а на delphi для того чтобы поменять путь к файлу использовал маааленькую хитрость
iter_Part.FileName := ExtractFileName(iter_Part.FileName); //абс. путь построится сам при указании имени файла
, это при учете ,что файлы уже были скопированы и сам обход осуществляется с того места куда скопировали.