3D PDF: PRC file format (first part)

This commit is contained in:
Jakub Melka
2022-12-30 16:17:14 +01:00
parent 015aeb1f5e
commit e08db37de2
5 changed files with 560 additions and 10 deletions

View File

@@ -2470,8 +2470,8 @@ void PDF3D_U3D_Parser::processCLODMesh(const PDF3D_U3D_Decoder& decoder)
case PDF3D_U3D_Block_Info::BT_GeneratorCLODProgMesh: case PDF3D_U3D_Block_Info::BT_GeneratorCLODProgMesh:
{ {
// TODO: process block data auto currentBlock = PDF3D_U3D_CLODProgressiveMeshContinuationBlock::parse(blockData.blockData, blockData.metaData, this);
auto currentBlock = PDF3D_U3D_CLODProgressiveMeshContinuationBlock::parse(blockData.blockData, blockData.metaData, this/*, declarationBlock*/); Q_UNUSED(currentBlock);
break; break;
} }
@@ -3410,7 +3410,6 @@ void PDF3D_U3D_Parser::addBlockToU3D(PDF3D_U3D_AbstractBlockPtr block)
default: default:
{ {
// TODO: add block to U3D
m_errors << PDFTranslationContext::tr("Block type (%1) not supported in scene decoder.").arg(block->getBlockType(), 8, 16); m_errors << PDFTranslationContext::tr("Block type (%1) not supported in scene decoder.").arg(block->getBlockType(), 8, 16);
break; break;
} }
@@ -3561,6 +3560,12 @@ void PDF3D_U3D_Parser::processGenericBlock(const PDF3D_U3D_Block_Data& blockData
PDF3D_U3D_Block_Info::EPalette effectivePalette = PDF3D_U3D_Block_Info::isChain(blockData.blockType) ? palette PDF3D_U3D_Block_Info::EPalette effectivePalette = PDF3D_U3D_Block_Info::isChain(blockData.blockType) ? palette
: PDF3D_U3D_Block_Info::getPalette(blockData.blockType); : PDF3D_U3D_Block_Info::getPalette(blockData.blockType);
if (effectivePalette == PDF3D_U3D_Block_Info::PL_LastPalette)
{
m_errors << PDFTranslationContext::tr("Failed to add block '%1' - decoder chain does not exist!").arg(blockName);
return;
}
PDF3D_U3D_DecoderPalette* decoderPalette = m_decoderPalettes.getDecoderPalette(effectivePalette); PDF3D_U3D_DecoderPalette* decoderPalette = m_decoderPalettes.getDecoderPalette(effectivePalette);
if (PDF3D_U3D_Block_Info::isContinuation(blockData.blockType)) if (PDF3D_U3D_Block_Info::isContinuation(blockData.blockType))
@@ -4698,6 +4703,8 @@ PDF3D_U3D_AbstractBlockPtr PDF3D_U3D_CLODProgressiveMeshContinuationBlock::parse
block->m_resolutionUpdateCount = block->m_endResolution - block->m_startResolution; block->m_resolutionUpdateCount = block->m_endResolution - block->m_startResolution;
// We do not implement this block
#if 0
for (uint32_t i = block->m_startResolution; i < block->m_endResolution; ++i) for (uint32_t i = block->m_startResolution; i < block->m_endResolution; ++i)
{ {
ResolutionUpdate updateItem; ResolutionUpdate updateItem;
@@ -4768,11 +4775,11 @@ PDF3D_U3D_AbstractBlockPtr PDF3D_U3D_CLODProgressiveMeshContinuationBlock::parse
updateItem.newFaces.emplace_back(std::move(facePositionInfo)); updateItem.newFaces.emplace_back(std::move(facePositionInfo));
} }
// TODO: Fixme
block->m_resolutionUpdates.emplace_back(std::move(updateItem)); block->m_resolutionUpdates.emplace_back(std::move(updateItem));
} }
#endif
block->parseMetadata(metaData, object); block->parseMetadata(metaData, object);
return pointer; return pointer;
} }

View File

@@ -546,8 +546,6 @@ private:
float m_reflectivity = 0.0; float m_reflectivity = 0.0;
}; };
// TODO: apply material to default color
class PDF4QTLIBSHARED_EXPORT PDF3D_U3D class PDF4QTLIBSHARED_EXPORT PDF3D_U3D
{ {
public: public:

View File

@@ -514,10 +514,111 @@ Qt3DCore::QNode* PDF3DSceneProcessor::createMeshGeometry(const pdf::u3d::PDF3D_U
return node; return node;
} }
case ShadedWireframe:
case HiddenWireframe: case HiddenWireframe:
{
return createWireframeWithoutObscuredEdgesMeshGeometry(meshGeometry);
}
case SolidOutline: case SolidOutline:
{
Qt3DCore::QNode* node = new Qt3DCore::QNode();
Qt3DCore::QNode* solidGeometry = createSolidMeshGeometry(meshGeometry, 1.0);
Qt3DCore::QNode* wireframeGeometry = createWireframeWithoutObscuredEdgesMeshGeometry(meshGeometry);
solidGeometry->setParent(node);
wireframeGeometry->setParent(node);
return node;
}
case ShadedVertices: case ShadedVertices:
{
// We will display vertices with triangle color
// Vertex buffer
Qt3DRender::QAttribute* positionAttribute = createPositionAttribute(meshGeometry->getPositions());
// Color buffer
Qt3DRender::QBuffer* colorBuffer = new Qt3DRender::QBuffer();
colorBuffer->setType(Qt3DRender::QBuffer::VertexBuffer);
const uint positionCount = positionAttribute->count();
QByteArray colorBufferData;
colorBufferData.resize(positionCount * 3 * sizeof(float));
float* colorBufferDataPtr = reinterpret_cast<float*>(colorBufferData.data());
for (size_t i = 0; i < positionCount; ++i)
{
QVector3D color(0.0, 0.0, 0.0);
std::vector<pdf::u3d::PDF3D_U3D_MeshGeometry::Triangle> triangles = meshGeometry->queryTrianglesByVertexIndex(i);
if (!triangles.empty())
{
pdf::u3d::PDF3D_U3D_MeshGeometry::Triangle triangle = triangles.front();
for (const auto& vertex : triangle.vertices)
{
if (vertex.positionIndex == i)
{
color = meshGeometry->getDiffuseColor(vertex.diffuseColorIndex).toVector3D();
}
}
}
*colorBufferDataPtr++ = color.x();
*colorBufferDataPtr++ = color.y();
*colorBufferDataPtr++ = color.z();
}
colorBuffer->setData(colorBufferData);
Qt3DRender::QAttribute* colorAttribute = new Qt3DRender::QAttribute();
colorAttribute->setName(Qt3DRender::QAttribute::defaultColorAttributeName());
colorAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
colorAttribute->setVertexSize(3);
colorAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
colorAttribute->setBuffer(colorBuffer);
colorAttribute->setByteOffset(0);
colorAttribute->setByteStride(3 * sizeof(float));
colorAttribute->setCount(positionCount);
// Geometry
Qt3DRender::QGeometry* geometry = new Qt3DRender::QGeometry();
geometry->addAttribute(positionAttribute);
geometry->addAttribute(colorAttribute);
Qt3DRender::QGeometryRenderer* geometryRenderer = new Qt3DRender::QGeometryRenderer();
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveRestartEnabled(false);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::Points);
Qt3DExtras::QPerVertexColorMaterial* material = new Qt3DExtras::QPerVertexColorMaterial();
Qt3DRender::QEffect* effect = material->effect();
for (Qt3DRender::QTechnique* technique : effect->techniques())
{
for (Qt3DRender::QRenderPass* renderPass : technique->renderPasses())
{
Qt3DRender::QPointSize* pointSize = new Qt3DRender::QPointSize();
pointSize->setSizeMode(Qt3DRender::QPointSize::Fixed);
pointSize->setValue(m_pointSize);
renderPass->addRenderState(pointSize);
}
}
addDepthTestToMaterial(material);
Qt3DCore::QEntity* entity = new Qt3DCore::QEntity();
entity->addComponent(geometryRenderer);
entity->addComponent(material);
return entity;
}
case ShadedWireframe:
{
// Just display wireframe geometry
return createWireframeMeshGeometry(meshGeometry);
}
default: default:
Q_ASSERT(false); Q_ASSERT(false);

View File

@@ -197,8 +197,8 @@ void PDFMediaViewerDialog::regenerateScene()
if (m_sceneU3d.has_value()) if (m_sceneU3d.has_value())
{ {
PDF3DSceneProcessor processor; PDF3DSceneProcessor processor;
processor.setMode(PDF3DSceneProcessor::ShadedIllustration); processor.setMode(PDF3DSceneProcessor::Solid);
processor.setSceneRoot("PDF3D Scene"); processor.setSceneRoot("Scene3D_MalOcc_sceneName"/*"PDF3D Scene"*/);
processor.setPointSize(6.0f); processor.setPointSize(6.0f);
auto scene = processor.createScene(&m_sceneU3d.value()); auto scene = processor.createScene(&m_sceneU3d.value());
if (scene.sceneRoot) if (scene.sceneRoot)

444
prc/prc_format.xml Normal file
View File

@@ -0,0 +1,444 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<prc>
<!--
attribute flat: class is used as structure by value, not a shared pointer on structure
attribute value: value type instead of class (for example int)
attribute constant: constant value (i.e. this constant value should be read from the file)
-->
<enums>
<enum name="EntityType">
<item name="PRC_TYPE_ASM" value="PRC_TYPE_ROOT + 300" />
<item name="PRC_TYPE_ASM_ModelFile" value="PRC_TYPE_ASM + 1" />
<item name="PRC_TYPE_ASM_FileStructure" value="PRC_TYPE_ASM + 2" />
<item name="PRC_TYPE_ASM_FileStructureGlobals" value="PRC_TYPE_ASM + 3" />
<item name="PRC_TYPE_ASM_FileStructureTree" value="PRC_TYPE_ASM + 4" />
<item name="PRC_TYPE_ASM_FileStructureTessellation" value="PRC_TYPE_ASM + 5" />
<item name="PRC_TYPE_ASM_FileStructureGeometry" value="PRC_TYPE_ASM + 6" />
<item name="PRC_TYPE_ASM_FileStructureExtraGeometry" value="PRC_TYPE_ASM + 7" />
<item name="PRC_TYPE_ASM_ProductOccurrence" value="PRC_TYPE_ASM + 8" />
<item name="PRC_TYPE_ASM_PartDefinition" value="PRC_TYPE_ASM + 9" />
<item name="PRC_TYPE_ASM_Filter" value="PRC_TYPE_ASM + 10" />
</enum>
<enum name="CharSet">
<item name="Roman" value="0" />
<item name="Japanese" value="1" />
<item name="Traditional Chinese" value="2" />
<item name="Korean" value="3" />
<item name="Arabic" value="4" />
<item name="Hebrew" value="5" />
<item name="Greek" value="6" />
<item name="Cyrillic" value="7" />
<item name="RightLeft" value="8" />
<item name="Devanagari" value="9" />
<item name="Gurmukhi" value="10" />
<item name="Gujarati" value="11" />
<item name="Oriya" value="12" />
<item name="Bengali" value="13" />
<item name="Tamil" value="14" />
<item name="Telugu" value="15" />
<item name="Kannada" value="16" />
<item name="Malayalam" value="17" />
<item name="Sinhalese" value="18" />
<item name="Burmese" value="19" />
<item name="Khmer" value="20" />
<item name="Thai" value="21" />
<item name="Laotian" value="22" />
<item name="Georgian" value="23" />
<item name="Armenian" value="24" />
<item name="Simplified Chinese" value="25" />
<item name="Tibetan" value="26" />
<item name="Mongolian" value="27" />
<item name="Geez" value="28" />
<item name="EastEuropeanRoman" value="29" />
<item name="Vietnamese" value="30" />
<item name="ExtendedArabic" value="31" />
</enum>
<enum name="FontAttributes">
<item name="Bold" value="2" />
<item name="Italic" value="4" />
<item name="Underlined" value="8" />
<item name="StrikeOut" value="16" />
<item name="Overlined" value="32" />
<item name="Stretch" value="64" />
<item name="Wire" value="128" />
</enum>
</enums>
<objects>
<object name="Fileheader">
<field name="" type="byte" constant="P"/>
<field name="" type="byte" constant="R"/>
<field name="" type="byte" constant="C"/>
<field name="minimal_version_for_read" type="UncompressedUnsignedInteger" />
<field name="authoring_version" type="UncompressedUnsignedInteger" />
<field name="unique_id_file" type="UncompressedUniqueId" />
<field name="unique_id_application" type="UncompressedUniqueId" />
<field name="filestructure_count" type="UncompressedUnsignedInteger" />
<array name="file_info" dim="filestructure_count" type="FileStructureDescription"/>
<field name="start_offset" type="UncompressedUnsignedInteger" />
<field name="end_offset" type="UncompressedUnsignedInteger" />
<field name="file_count" type="UncompressedUnsignedInteger" />
<array name="files" dim="file_count" type="UncompressedFiles" condition="file_count > 0"/>
</object>
<object name="FileStructureDescription">
<field name="unique_id" type="UncompressedUniqueId" />
<field name="" type="UncompressedUnsignedInteger" />
<field name="section_count" type="UncompressedUnsignedInteger" />
<array name="section_offsets" dim="section_count" type="UncompressedUnsignedInteger>" />
</object>
<object name="UncompressedFiles">
<field name="count" type="UncompressedUnsignedInteger" />
<array name="array_of_files" dim="count" type="UncompressedBlock" />
</object>
<object name="Filestructure">
<field name="header" type="FileStructureHeader" />
<field name="schema" type="FileStructureSchema" />
<field name="globals" type="PRC_TYPE_ASM_FileStructureGlobals" />
<field name="tree" type="PRC_TYPE_ASM_FileStructureTree" />
<field name="tessellation" type="PRC_TYPE_ASM_FileStructureTessellation" />
<field name="Geometry" type="PRC_TYPE_ASM_FileStructureGeometry" />
<field name="extra_geometry" type="PRC_TYPE_ASM_FileStructureExtraGeometry" />
</object>
<object name="FileStructureHeader">
<field name="" type="byte" constant="P"/>
<field name="" type="byte" constant="R"/>
<field name="" type="byte" constant="C"/>
<field name="minimal_version_for_read" type="UncompressedUnsignedInteger" />
<field name="authoring_version" type="UncompressedUnsignedInteger" />
<field name="unique_id_file" type="UncompressedUniqueId" />
<field name="unique_id_application" type="UncompressedUniqueId" />
<field name="file_count" type="UncompressedUnsignedInteger" />
<array name="files" dim="file_count" type="UncompressedFile" />
</object>
<object name="FileStructureSchema" >
<field name="schema_count" type="UnsignedInteger" />
<array name="schemas" dim="schema_count" type="Entity_schema_definition" />
</object>
<object name="Entity_schema_definition">
<field name="entity_type" type="UnsignedInteger" />
<field name="token_count" type="UnsignedInteger" />
<array name="schema_tokens" dim="token_count" type="UnsignedInteger" />
</object>
<object name="UncompressedUnsignedInteger" flat="true">
<field name="" type="uint32_t" bytes="4" value="true"/>
</object>
<object name="UncompressedBlock">
<field name="block_size" type="UncompressedUnsignedInteger"/>
<field name="block" type="QByteArray" bytes="block_size" value="true"/>
</object>
<object name="UncompressedFiles">
<field name="file_count" type="UncompressedUnsignedInteger" />
<array name="files" dim="file_count" type="UncompressedBlock" />
</object>
<object name="UncompressedUniqueId">
<field name="unique_id0" type="UncompressedUnsignedInteger" />
<field name="unique_id1" type="UncompressedUnsignedInteger" />
<field name="unique_id2" type="UncompressedUnsignedInteger" />
<field name="unique_id3" type="UncompressedUnsignedInteger" />
</object>
<object name="Boolean" flat="true" compressed="true">
<field name="" bits="1" type="bool" value="true"/>
</object>
<object name="Character" flat="true" compressed="true">
<field name="" bits="8" type="uint8_t" value="true"/>
</object>
<object name="Integer" flat="true" compressed="true">
<field name="" bits="32" type="int32_t" value="true"/>
</object>
<object name="IntegerWithVariableBitNumber" flat="true" compressed="true">
<field name="" bits="32" type="int32_t" value="true"/>
</object>
<object name="UnsignedInteger" flat="true" compressed="true">
<field name="" bits="32" type="uint32_t" value="true"/>
</object>
<object name="UnsignedIntegerWithVariableBitNumber" flat="true" compressed="true">
<field name="" bits="32" type="uint32_t" value="true"/>
</object>
<object name="NumberOfBitsThenUnsignedInteger" flat="true" compressed="true">
<field name="" bits="32" type="uint32_t" value="true"/>
</object>
<object name="Float" flat="true" compressed="true">
<field name="" bits="32" type="float" value="true"/>
</object>
<object name="Double" flat="true" compressed="true">
<field name="" bits="64" type="double" value="true"/>
</object>
<object name="DoubleWithVariableBitNumber" flat="true" compressed="true">
<field name="" bits="64" type="double" value="true"/>
</object>
<object name="CompressedEntityType" flat="true" compressed="true">
<field name="" bits="32" type="uint32_t" value="true"/>
</object>
<object name="CompressedUniqueId">
<field name="unique_id0" type="UnsignedInteger" />
<field name="unique_id1" type="UnsignedInteger" />
<field name="unique_id2" type="UnsignedInteger" />
<field name="unique_id3" type="UnsignedInteger" />
</object>
<object name="String">
<field name="null_flag" type="Boolean" />
<field name="size" type="UnsignedInteger" condition="null_flag == TRUE" />
<array name="string" dim="size" type="Character" condition="null_flag == TRUE" />
</object>
<object name="CharacterArray" flat="true" compressed="true">
<field name="" type="std::vector&lt;Character&gt;" value ="true"/>
</object>
<object name="ShortArray" flat="true" compressed="true">
<field name="" type="std::vector&lt;short&gt;" value ="true"/>
</object>
<object name="ShortArray" flat="true" compressed="true">
<field name="" type="std::vector&lt;short&gt;" value ="true"/>
</object>
<object name="CompressedIntegerArray" flat="true" compressed="true">
<field name="" type="std::vector&lt;int&gt;" value ="true"/>
</object>
<object name="CompressedIndiceArray" flat="true" compressed="true">
<field name="" type="std::vector&lt;int&gt;" value ="true"/>
</object>
<object name="UserData">
<field name="stream_size" type="UnsignedInteger" />
<field name="stream" type="UserDataStream" condition="stream_size > 0"/>
</object>
<object name="UserDataStream">
<field name="section_count" type="UnsignedInteger" />
<array name="sub_sections" dim="section_count" type="UserDataSubSection"/>
</object>
<object name="UserDataStream">
<field name="section_count" type="UnsignedInteger" />
<array name="sub_sections" dim="section_count" type="UserDataSubSection"/>
</object>
<object name="UserDataSubSection">
<field name="same_flag" type="Boolean" />
<field name="unique_id_application" type="CompressedUniqueId" condition="same_flag == FALSE"/>
<field name="stream_size" type="UnsignedInteger" />
<field name="stream" dim="stream_size" type="Bits(n)" condition="stream_size > 0" />
</object>
<object name="Interval" flat="true">
<field name="min_value" type="Double" />
<field name="max_value" type="Double" />
</object>
<object name="Parameterization" flat="true">
<field name="trim_interval" type="Interval" />
<field name="coeff_a" type="Double" />
<field name="coeff_b" type="Double" />
</object>
<object name="Domain" flat="true">
<field name="trim_interval" type="Interval" />
<field name="coeff_a" type="Double" />
<field name="coeff_b" type="Double" />
</object>
<object name="UVParameterization" flat="true">
<field name="swap_uv" type="Boolean" />
<field name="suface_domain" type="Domain" />
<field name="u_param_coeff_a" type="Double" />
<field name="v_param_coeff_a" type="Double" />
<field name="u_param_coeff_b" type="Double" />
<field name="v_param_coeff_b" type="Double" />
</object>
<object name="Vector2d" flat="true">
<field name="x_value" type="Double" />
<field name="y_value" type="Double" />
</object>
<object name="Vector3d" flat="true">
<field name="x_value" type="Double" />
<field name="y_value" type="Double" />
<field name="z_value" type="Double" />
</object>
<object name="BoundingBox" flat="true">
<field name="minimum_corner" type="Vector3d" />
<field name="maximum_corner" type="Vector3d" />
</object>
<object name="ContentPRCBase">
<field name="attribute_data" type="AttributeData" />
<field name="entity_name" type="Name" />
</object>
<object name="ContentPRCRefBase">
<field name="attribute_data" type="AttributeData" />
<field name="entity_name" type="Name" />
<field name="unique_id_cad" type="UnsignedInteger" />
<field name="unique_id" type="UnsignedInteger" />
</object>
<object name="AttributeData">
<field name="attribute_count" type="UnsignedInteger" />
<array name="attribute" dim="attribute_count" type="PRC_TYPE_MISC_Attribute" />
</object>
<object name="Name">
<field name="same_name" type="Boolean" />
<field name="name" type="String" condition="same_name == FALSE" />
</object>
<object name="PRC_TYPE_ROOT_PRCBaseWithGraphics">
<field name="base" type="ContentPRCRefBase" />
<field name="same_graphics" type="Boolean" />
<field name="graphic_content" type="GraphicsContent" condition="same_graphics == TRUE" />
</object>
<object name="GraphicsContent">
<field name="biased_layer_index" type="UnsignedInteger" />
<field name="biased_index_of_line_style" type="UnsignedInteger" />
<field name="behavior_bit_field1" type="UnsignedCharacter" />
<field name="behavior_bit_field2" type="UnsignedCharacter" />
</object>
<object name="PRC_TYPE_ASM_ModelFile">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_ASM_ModelFile" />
<field name="Base" type="ContentPRCBase" />
<field name="units_from_CAD_file" type="Boolean" />
<field name="units_mm" type="Double" condition="units_from_CAD_file == TRUE" />
<field name="number_of_root_product_occurrences" type="UnsignedInteger" />
<array name="product_occurences" type="ProductOccurrenceReference" dim="number_of_root_product_occurrences" />
<array name="file_structure_index_in_model_file" type="UnsignedInteger" dim="number_of_root_product_occurrences" />
<field name="user_data" type="UserData" />
</object>
<object name="ProductOccurrenceReference">
<field name="unique_id" type="CompressedUniqueId" />
<field name="root_index" type="UnsignedInteger" />
<field name="product_occurence_is_active" type="Boolean" />
</object>
<object name="PRC_TYPE_ASM_FileStructure" >
<field name="" type="UnsignedInteger" constant="PRC_TYPE_ASM_FileStructure" />
<field name="Base" type="ContentPRCBase" />
<field name="next_available_index" type="UnsignedInteger" />
<field name="index_product_occurrence" type="UnsignedInteger" />
</object>
<object name="PRC_TYPE_ASM_FileStructureGlobals" >
<field name="" type="UnsignedInteger" constant="PRC_TYPE_ASM_FileStructureGlobals" />
<field name="Base" type="ContentPRCBase" />
<field name="file_count" type="UnsignedInteger" />
<array name="unique_ids" dim="file_count" type="CompressedUniqueId" />
<field name="global_data" type="FileStructureInternalGlobalData" />
<field name="user_data" type="UserData" />
</object>
<object name="FileStructureInternalGlobalData">
<field name="tess_chord" type="Double" />
<field name="tess_angle" type="Double" />
<field name="serialize_help" type="MarkupSerializationHelper" />
<field name="color_count" type="UnsignedInteger" />
<array name="Colors" dim="color_count" type="RgbColor" />
<field name="picture_count" type="UnsignedInteger" />
<array name="Pictures" dim="picture_count" type="PRC_TYPE_GRAPH_Picture" />
<field name="texture_count" type="UnsignedInteger" />
<array name="Textures" dim="texture_count" type="PRC_TYPE_GRAPH_TextureDefinition" />
<field name="material_count" type="UnsignedInteger" />
<array name="Materials" dim="material_count" type="PRC_TYPE_GRAPH_Material" />
<field name="line_pattern_count" type="UnsignedInteger" />
<array name="line_patterns" dim="line_pattern_count" type="PRC_TYPE_GRAPH_LinePattern" />
<field name="style_count" type="UnsignedInteger" />
<array name="Styles" dim="style_count" type="PRC_TYPE_GRAPH_Style" />
<field name="fill_count" type="UnsignedInteger" />
<array name="Fills" dim="fill_count" type="PRC_TYPE_GRAPH_FillPattern" />
<field name="ref_coord_count" type="UnsignedInteger" />
<array name="ref_coords" dim="ref_coord_count" type="PRC_TYPE_RI_CoordinateSystem" />
</object>
<object name="MarkupSerializationHelper">
<field name="default_font_family_name" type="String" />
<field name="font_keys_count" type="UnsignedInteger" />
<array name="font_keys_of_font" dim="font_keys_count" type="FontKeysSameFont" />
</object>
<object name="FontKeySameFont">
<field name="font_name" type="String" />
<field name="character_set" type="UnsignedInteger" />
<field name="key_count" type="UnsignedInteger" />
<array name="font_key_list" dim="key_count" type="FontKey" />
</object>
<object name="FontKey">
<field name="font_size" type="UnsignedInteger" />
<field name="font_attributes" type="Character" />
</object>
<object name="RgbColor">
<field name="Red" type="Double" />
<field name="Green" type="Double" />
<field name="Blue" type="Double" />
</object>
<object name="PRC_TYPE_ASM_FileStructureTree" >
<field name="" type="UnsignedInteger" constant="PRC_TYPE_ASM_FileStructureTree" />
<field name="Base" type="ContentPRCBase" />
<field name="part_count" type="UnsignedInteger" />
<array name="Parts" dim="part_count" type="PRC_TYPE_ASM_PartDefinition" />
<field name="product_count" type="UnsignedInteger" />
<array name="Products" dim="product_count" type="PRC_TYPE_ASM_ProductOccurrence" />
<field name="internal_data" type="PRC_TYPE_ASM_FileStructure" />
<field name="user_data" type="UserData" />
</object>
<object name="PRC_TYPE_ASM_FileStructureTessellation">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_ASM_FileStructureTessellation" />
<field name="Base" type="ContentPRCBase" />
<field name="tess_count" type="UnsignedInteger" />
<array name="tess" dim="tess_count" type="PRC_TYPE_TESS" />
<field name="user_data" type="UserData" />
</object>
<object name="PRC_TYPE_ASM_FileStructureGeometry">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_ASM_FileStructureGeometry" />
<field name="Base" type="ContentPRCBase" />
<field name="exact_geometry" type="FileStructureExactGeometry" />
<field name="user_data" type="UserData" />
</object>
<object name="FileStructureExactGeometry">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_ASM_FileStructureGeometry" />
<field name="Base" type="ContentPRCBase" />
<field name="topo_context_count" type="UnsignedInteger" />
<array name="topo_contexts" dim="topo_context_count" type="TopologicalContext" />
</object>
</objects>
</prc>