File Format FCStd/ru

Обзор

Стандартный формат файлов FreeCAD (.FCStd) является основным форматом файлов FreeCAD. Это составной формат, поддерживающий сжатие и встраивание различных типов данных.

Внутренняя структура файлов .FCStd

FCStd — это стандартный zip-файл, содержащий один или несколько файлов с определённой структурой. Как таковой, файл .FCStd можно распаковать обычным инструментом распаковки zip, но при упаковке содержимого файла .FCStd необходимо соблюдать осторожность. FreeCAD содержит утилиту "Project Utility" для переупаковки файлов .FCStd, её использование описано в разделе Изменение исходного файла .FCStd ниже.

Document.xml

Это основной файл .xml, описывающий все объекты внутри документа FreeCAD, то есть только геометрическое и параметрическое определение объектов, а не их визуальное представление. Если FreeCAD запущен в консольном режиме (без графического интерфейса), будет использоваться только этот файл Document.xml.

Пример Document.xml

<?xml version='1.0' encoding='utf-8'?>
 <Document SchemaVersion="4">
    <Properties Count="9">
       <Property name="Comment" type="App::PropertyString">
          <String value=""/>
       </Property>
       <Property name="Company" type="App::PropertyString">
          <String value=""/>
       </Property>
       <Property name="CreatedBy" type="App::PropertyString">
          <String value=""/>
       </Property>
       <Property name="CreationDate" type="App::PropertyString">
          <String value="Fri Jan 29 15:14:38 2010 "/>
       </Property>
       <Property name="FileName" type="App::PropertyString">
          <String value="/tmp/test.FCStd"/>
       </Property>
       <Property name="Id" type="App::PropertyString">
          <String value="201b746f-a1ed-4297-bf3d-65d5ec11abe0"/>
       </Property>
       <Property name="Label" type="App::PropertyString">
          <String value="names"/>
       </Property>
       <Property name="LastModifiedBy" type="App::PropertyString">
          <String value=""/>
       </Property>
       <Property name="LastModifiedDate" type="App::PropertyString">
          <String value="Fri Jan 29 15:15:21 2010 "/>
       </Property>
    </Properties>
    <Objects Count="2">
       <Object type="Mesh::Cube" name="Cube" />
       <Object type="Part::Box" name="Box" />
    </Objects>
    <ObjectData Count="2">
       <Object name="Cube">
          <Properties Count="7">
             <Property name="Height" type="App::PropertyFloatConstraint">
                <Float value="10"/>
             </Property>
             <Property name="Label" type="App::PropertyString">
                <String value="Cube"/>
             </Property>
             <Property name="Length" type="App::PropertyFloatConstraint">
                <Float value="10"/>
             </Property>
             <Property name="Mesh" type="Mesh::PropertyMeshKernel">
                <Mesh file="MeshKernel.bms"/>
             </Property>
             <Property name="Placement" type="App::PropertyPlacement">
                <PropertyPlacement Px="0" Py="0" Pz="0" Q0="0" Q1="0" Q2="0" Q3="1"/>
             </Property>
             <Property name="Pos" type="App::PropertyPlacementLink">
                <Link value=""/>
             </Property>
             <Property name="Width" type="App::PropertyFloatConstraint">
                <Float value="10"/>
             </Property>
          </Properties>
       </Object>
       <Object name="Box">
          <Properties Count="7">
             <Property name="Height" type="App::PropertyLength">
                <Float value="10"/>
             </Property>
             <Property name="Label" type="App::PropertyString">
                <String value="Box2"/>
             </Property>
             <Property name="Length" type="App::PropertyLength">
                <Float value="10"/>
             </Property>
             <Property name="Placement" type="App::PropertyPlacement">
                <PropertyPlacement Px="0" Py="0" Pz="0" Q0="0" Q1="0" Q2="0" Q3="1"/>
             </Property>
             <Property name="Pos" type="App::PropertyPlacementLink">
                <Link value=""/>
             </Property>
             <Property name="Shape" type="Part::PropertyPartShape">
                <Part file="PartShape.brp2"/>
             </Property>
             <Property name="Width" type="App::PropertyLength">
                <Float value="10"/>
             </Property>
          </Properties>
       </Object>
    </ObjectData>
 </Document>

GuiDocument.xml

Это графический аналог файла Document.xml. Для каждого объекта, описанного в Document.xml, существует один соответствующий объект в GuiDocument.xml, описывающий визуальное представление этого объекта (цвет, толщина линии и т.д.).

Thumbnails/thumbnail.png

Это миниатюра документа размером 128x128 пикселей, представляющая собой снимок 3D-вида в момент сохранения. Миниатюры создаются только в том случае, если соответствующая опция включена в настройках FreeCAD.

*.brep

Это B-rep формы всех объектов, которые имеют форму Part в Document.xml. Каждый объект, даже если он параметрический, имеет свою форму, сохранённую как отдельный файл .brep, так что к нему могут обращаться компоненты без необходимости пересчитывать форму.

*.svg

Это шаблонные svg-файлы, используемые на страницах TechDraw.

Типовая структура

Структура типового файла .FCStd. Расширение можно изменить на .zip, чтобы просмотреть его как обычную папку. Файлы Document.xml и GuiDocument.xml находятся в корне архива вместе с любым количеством файлов .brp (BREP). Одна подпапка может содержать миниатюру, а другая — SVG-шаблоны, используемые в TechDraw.

File.FCStd (File.zip)
  |
  |--thumbnails/
  |  |
  |  :--Thumbnail.png
  |
  :--Document.xml
  :--GuiDocument.xml
  :--Shape1.brp
  :--Shape2.brp
  :--MyPage.svg
  :--etc.

Включение других файлов

Чтобы включить другие типы файлов в файл FCStd, сначала нужно создать скриптовый объект из консоли Python и добавить ему свойство App::PropertyFileIncluded.

Затем в Property View можно перейти к добавленному свойству и выбрать файл на компьютере. После сохранения файла FCStd файл, назначенный свойству ДанныеPropertyFileIncluded, будет упакован внутрь .FCStd. При восстановлении документа тот же файл будет восстановлен вместе с свойством ДанныеPropertyFileIncluded.

custom_obj = App.ActiveDocument.addObject("App::FeaturePython", "CustomObject")
custom_obj.addProperty("App::PropertyFileIncluded", "AttachedFile")

См. тему на форуме, PDF внутри проекта.

Изменение исходного файла