Как прочитать ссылки на файлы без открытия файла с ссылками?

Автор lavgirb, 01.06.24, 16:35:07

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

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

lavgirb

Видел кусок кода, позволяющего считывать ссылки на файлы без открытия файла КОМПАС.
Никак не могу найти. Подскажите тему, кто знает, где это сообщение.
Или подскажите, как это можно сделать.
Спасибо.

Andreych

Файл компаса - это zip архив. Его можно разархивировать, там будет файл MetaProductInfo. Это текстовый файл в формате xml, там указаны все ссылки и многое другое.

lavgirb

Цитата: Andreych от 02.06.24, 01:10:56Файл компаса - это zip архив. Его можно разархивировать, там будет файл MetaProductInfo. Это текстовый файл в формате xml, там указаны все ссылки и многое другое.
Andreych, большое спасибо.

lavgirb

Цитата: Andreych от 02.06.24, 01:10:56Файл компаса - это zip архив. Его можно разархивировать, там будет файл MetaProductInfo. Это текстовый файл в формате xml, там указаны все ссылки и многое другое.
Попробовал.
Напрямую из файлов КОМПАС с расширением КОМПАСа MetaProductInfo извлечь не получается.
1 Копирую файл КОМПАС с расширением ZIP в системную временную папку.
2 Извлекаю MetaProductInfo. Читаю.
3 Удаляю MetaProductInfo и ZIP.
Файлов КОМПАС может быть несколько тысяч. Вроде все и ничего, время тратится относительно не много.
Однако некоторые, не все(!), файлы ZIP почему-то не удаляются.
Что, пока, у меня сводит на нет использование такого способа извлечения ссылок.

Причина неудаления не понятна.
Из имени ZIP убрал русские буквы, удалил пробелы. Не удаляются.
Причем, одни и те же файлы.
А вручную удаляются без проблем.
Чудеса!

Дмитрий22

Без всяких не нужных копирований

https://github.com/kozintsev/Pilot.CADReader

Но там только для версий 17-18. Аскон создал много неудобств тем, что от версии к версии меняет структуру файла Meta.

+ Благодарностей: 1

lavgirb

Цитата: Дмитрий22 от 08.06.24, 07:05:25Без всяких не нужных копирований

https://github.com/kozintsev/Pilot.CADReader

Но там только для версий 17-18. Аскон создал много неудобств тем, что от версии к версии меняет структуру файла Meta.


Дмитрий22, спасибо.
Для своих целей нужно программное решение.

Andreych

Цитата: lavgirb от 08.06.24, 06:34:24Попробовал.
Напрямую из файлов КОМПАС с расширением КОМПАСа MetaProductInfo извлечь не получается.
1 Копирую файл КОМПАС с расширением ZIP в системную временную папку.
2 Извлекаю MetaProductInfo. Читаю.
3 Удаляю MetaProductInfo и ZIP.

Можно читать без копирования. Вот в качестве примера на Delphi:
Var FileStream: TStream;
    LocalHeader: TZipHeader;
    zip: TZipFile;
    ws: TStrings;
begin
  zip:=TZipFile.Create;
  zip.Open(FilePath, zmRead); // FilePath - файл архива (Компаса)
  FileStream:=TStream.Create();
  zip.Read('MetaProductInfo', FileStream, LocalHeader);
  ws:=TStringList.Create;
  ws.LoadFromStream(FileStream);
  Result:=ws.Text;
  ws.Free;
  FileStream.Free;
  zip.Close;
  zip.Free;
end;
+ Благодарностей: 1

lavgirb

Цитата: Andreych от 08.06.24, 09:08:12Можно читать без копирования. Вот в качестве примера на Delphi:
Спасибо.
Не подскажете, есть ли возможность получать ссылки верхнего уровня входимости, например, только пути файлов, входящих в сборку?
Без путей файлов из подсборок. В принципе, можно ли эти пути, получаемые из MetaProductInfo, отделить от остальных? Или нет? Или не пробовали?

Andreych

Цитата: lavgirb от 08.06.24, 11:38:06Не подскажете, есть ли возможность получать ссылки верхнего уровня входимости, например, только пути файлов, входящих в сборку?
Без путей файлов из подсборок.

Так там и нет путей к файлам из подсборок, а только пути к компонентам, непосредственно входящих в данную сборку.

Toptotal

Цитата: Дмитрий22 от 08.06.24, 07:05:25о там только для версий 17-18. Аскон создал много неудобств тем, что от версии к версии меняет структуру файла Meta.
это говорит о не профисионализме или попытках выбить решения от конкурентов. Также вот работает компания 2-3 года со своим софтом и системой, программу написали, заплатили отдефектовали косики и вот год работает все хорошо.. приходит новая версия Компаса с др форматом.. будут внедрять на предприятие нет. а если они не будут и это крупное смежники тоже не будут. Хоть какие шоу и маркетинговые шаги предпринимай, ставить не будут.
Для примера Солид воркс ,  2003-2014 все читает один и тот же плагин все читает одинаково в методанных, с 2015 изменили..

lavgirb

Цитата: Andreych от 08.06.24, 11:41:16Так там и нет путей к файлам из подсборок, а только пути к компонентам, непосредственно входящих в данную сборку.
Ок. Вероятно, я не внимательно еще пробовал.

KrissKross

Ну во-первых, надо было с чего начинать
т.к. до 16 версии - все данные были спрятаны в двоичный формат - известный только самому Аскону

Формат развивается как и программа Компас
Так между 16 и 17 версиями Компаса - там огромная пропасть
16 - прям какой-то детский сад
Вроде как после 18 разработчики Аскона взяли себя в руки
и дальше идут только небольшие косметические изменение

Во вторых идет изменения формата - диктуемого связкой PDM - CAD
Развивается PDM и иногда требует уточнения в формате Компаса

И в заключении
Разработчики Аскона - никому ни чего не должны
Формат по прежнему является собственностью и де-юре закрыт
Наверное даже от просмотра - не юрист, не знаю

И вычленение данных - головная боль сторонних разработчиков

Не смотря на все выше изложенное
отчасти разделяю ваше возмущение
Непостоянством формата
+ Благодарностей: 1

Toptotal

#12
Цитата: Andreych от 08.06.24, 11:41:16Так там и нет путей к файлам из подсборок, а только пути к компонентам, непосредственно входящих в данную сборку.

Почему то в 7-8 версии было всеи показывало простеньким рег выражением \\.*.m3d|\\.*.a3d|\\.*.сdw.


lavgirb

Цитата: Andreych от 08.06.24, 09:08:12Можно читать без копирования. Вот в качестве примера на Delphi:
Посмотрел. Аналога класса TZipFile в Vb6 не нашел.

Валерий Изранов

Цитата: lavgirb от 01.06.24, 16:35:07Видел кусок кода, позволяющего считывать ссылки на файлы
lavgirb, а как эти ссылки собираетесь использовать?
Может вам нужнее "Полное имя файла" для компонентов Сборки?


lavgirb

Цитата: Andreych от 08.06.24, 11:41:16Так там и нет путей к файлам из подсборок, а только пути к компонентам, непосредственно входящих в данную сборку.
Посмотрел внимательнее.
Во всех MetaObjectInfo-файлах чертежа есть пути не только сборки, что на главном виде, но так же пути к составным частям этой сборки.
Потратил полтора дня на то чтобы понять, что разделить их невозможно.
То есть, если, скажем, в чертеже есть несколько видов от разных файлов, то понять какие пути относятся к видовым, а какие к составным частям сборок для меня пока оказалось непосильной задачей.
Кажется все проанализировал, но закономерностей не нашел.

На одном чертеже был главный вид сборки и несколько разных самостоятельных видов деталей из состава этой сборки.
После удаления главного вида, в MetaObjectInfo путь, который формировал удаленный вид, остался как ни в чем не бывало.)
Ссылка на сборку. вид которой был удален сохранилась.


В MetaObjectInfo-файлах сборки имеются пути к составным частям этой сборки и пути к составным частям первого уровня подсборок.
Разделить их, чтоб выделить пути только составных частей сборки, из которой получен MetaObjectInfo, мне не удалось.
Во всяком случае из тех файлов, с которыми я работал.

Вывод. Прочитать ссылки на внешние файлы не запуская КОМПАС можно, но их состав в общем случае будет избыточным и не будет точно соответствовать составу ссылок на файлы, полученному из просто загруженных в КОМПАС файлов.

KrissKross

Там не чего сложного - главное понять структуру
- всё ниже - мои домыслы, которые могут отличаться от действительности

И так начнем с азов - Рассказ о чтение структуры сборки
Перво наперво - Шапка
<document version="1.9.1" create_version="1.8.0" revision="204" state="ready">
Смотрим номер версии
Важно понять и принять номер версии, в которой создан файл
Они редиски - разработчики Аскона
Вечно что-то меняют, хотя это и правильно для развития, но порой сбивает с панталыку честных пацанов

Так же рекомендация
Переименовать файл в xml - MetaProductInfo.xml
И смотреть файл через Notepad++ - появится возможность скрывать целые блоки - кнопки + и -

Скрываем блок - descriptions
1.png

Нас интересует блок product
И в нем как наверное понятно - блоки infoObject
Первые 3 блока - в данном случае
- объекты - всех входящих в сборку компонентов
- можно разбирать по ним - состав всех входящих 3Д моделей в сборку
- но мне - ближе другой подход, а именно разбор по исполнениям - сейчас и не помню - почему - см. ниже

Затем блок document, который содержит данные о текущем документе
в сильно усеченном варианте, больше информации о текущем документе в том же объекте type="embodiment"
2.png

Для чтения сборки по исполнениям
Ныряем в блок, где type="embodiment"
И вот здесь надо быть осторожным - для чтения данных о сборке
В сборке всегда присутствуют исполнения - даже если оно - исполнение одно
3.png

И еще одна засада
Порядок исполнений - в основном идет наоборот
Но может меняться, в зависимости от версии Компаса
Поэтому смотрим шапку и будем готовы использовать - разные стратегии разбора - для разных версий Компаса

Ну а дальше дело техники у infoObject где type="embodiment"
Разбираем по косточкам внедренные infoObject
4.png
+ Благодарностей: 1

KrissKross

т.е. если у сборки - 2 исполнения
будут присутствовать - 2 объекта с атрибутом type="embodiment"
5.png


lavgirb

Чертеж с видом на основе сборки "Плата питания".
В его файле MetaProductInfo ссылка на "видовую" сборку присутствует

ПП.jpg

Однако присутствует и ссылка на подсборку "Плата печатная многослойная" из состава сборки "Плата питания".
Хотя в чертеже вида на эту подсборку нет.

МПП.jpg

Мне ссылка на подсборку не нужна, ввиду отсутствия вида на эту модель.

Вот и как понять, что эта ссылка должна быть проигнорирована?

До кучи.

вер.jpg

Andreych

Цитата: KrissKross от 17.06.24, 09:31:19И еще одна засада
Порядок исполнений - в основном идет наоборот
Но может меняться, в зависимости от версии Компаса

Да, так и есть. Как ни странно, вся нужная инфа в конце файла. Чтобы найти узел документа самой модели, надо сначала перебрать все связанные документы. Затем чтобы узнать текущее исполнение, надо пробежаться по всем узлам с типом embodiment и нужное будет опять где-то в конце.

А есть еще одна засада. Казалось бы, curEmbKey всегда указывает id текущего исполнения. Но у всего в структуре файлов похоже есть исключения. Есть файлы, у которых curEmbKey не соответствует ни одному из исполнений. И поэтому невозможно узнать какое из них текущее. Вот пример.


Аналогично, thisDocument определяет id у документа модели среди всех связанных документов. Однако есть файлы, где thisDocument не соответствует ни одному из документов, входящих в этот файл.
+ Благодарностей: 2