Как получить абсолютный путь к файлу компонента (Part)

Автор SerGoVec, 09.09.16, 18:03:20

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

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

SerGoVec

Всем привет!

Программно разбирается сборка с копированием подчиненных компонентов в определенное место.
При переносе подчиненных компонентов сборки, меняются названия файлов компонентов, меняются линки (ссылки) на расположение подчиненных компонентов сборки.
 
В сборке существует относительный и абсолютный пути к расположению файла, являющегося компонентом, например, если открыть файл MetaInfo архива сборки, то будет примерно такая картина:

...
            <object id="2" type="component" relSource="деталь_3\Деталь_1.m3d" absSource="E:\ASCON\Samples\01_09_2016\папка6\сборка_3\деталь_3\Деталь_1.m3d" included="1" modified="0">
               <properties>
                  <property id="5" value="Деталь" modified="0"/>
                  <property id="6" value="1" modified="0"/>
                  <property id="9" value="Сталь 10  ГОСТ 1050-88" modified="0"/>
                  <property id="10" value="7820" modified="0"/>
                  <property id="8" value="47.2667234" modified="0"/>
...

здесь relSource - относительный путь, absSource - абсолютный путь.
Например, если скопированный компонент будет расположен в папке куда была скопирована сборка, в которую он входил, например в папку "папка7" и назваться "Деталь777.m3d", необходимо изменить линк в сборке на этот компонент - "D:\папка7\Деталь777.m3d". При этом, естественно, нужно сопоставить старый абсолютный путь - "E:\ASCON\Samples\01_09_2016\папка6\сборка_3\деталь_3\Деталь_1.m3d" с новым "D:\папка7/Деталь777.m3d", чтобы знать, что это именно тот компонент.

При обходе скопированной сборки, (лежит она "D:\папка7") компоненты, входящие в нее будут показывать
относительный путь, то есть при вызове iterPart.FileName (где, iterPart - компонент сборки) путь будет D:\папка7\деталь_3\Деталь_1.m3d - будет взят начальный путь до папки, где лежит сборка (D:\папка7), и относительный путь до компонента (.../деталь_3\Деталь_1.m3d).

Как программно можно получить абсолютный путь к файлу на подчиненную часть сборки?

ps. Попутно вопрос: как можно получить свойства компонента (не документа)? такой код не работает:

            KDoc := K7.Documents.Open(NameFile, False, False);
            iterPart := (KDoc as IKompasDocument3D).TopPart;

             PropKeep := iterPar as IPropertyKeeper;
                PropMng := K7 as IPropertyMng;
                n := PropMng.PropertyCount[iterPart];  //только из документа? - ошибка, свойств 0.

                for indexValProp := 0 to n - 1 do
                begin
                  Prop := PropMng.GetProperty(iterPart, indexValProp) as IProperty;
                  nameProp := string(Prop.Name);
                end;