From a897057ebb2c92aa70c3ac7015ed439d3418350d Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Fri, 18 Jul 2025 14:55:46 +0200 Subject: [PATCH] Import: Fix export crash when hidden object in Part. (#14567) --- src/Mod/Import/App/ExportOCAF2.cpp | 32 +++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/Mod/Import/App/ExportOCAF2.cpp b/src/Mod/Import/App/ExportOCAF2.cpp index ca0f71686b..cb5ffabb92 100644 --- a/src/Mod/Import/App/ExportOCAF2.cpp +++ b/src/Mod/Import/App/ExportOCAF2.cpp @@ -570,15 +570,29 @@ TDF_Label ExportOCAF2::exportObject(App::DocumentObject* parentObj, // Can be fixed with following // if ( !override.IsNull() && isComponent ) // setDefaultInstanceColor( override, PSA); - // - auto childShape = aShapeTool->GetShape(childLabel); - Quantity_ColorRGBA col; - if (!aColorTool->GetInstanceColor(childShape, XCAFDoc_ColorGen, col) - && !aColorTool->GetInstanceColor(childShape, XCAFDoc_ColorSurf, col) - && !aColorTool->GetInstanceColor(childShape, XCAFDoc_ColorCurv, col)) { - auto& c = options.defaultColor; - aColorTool->SetColor(childLabel, Tools::convertColor(c), XCAFDoc_ColorGen); - FC_WARN(Tools::labelName(childLabel) << " set default color"); + + // First, check if a color was already set (e.g., for a sub-element). + Quantity_ColorRGBA existingColor; + bool hasExplicitColor = + aColorTool->GetColor(childLabel, XCAFDoc_ColorGen, existingColor) + || aColorTool->GetColor(childLabel, XCAFDoc_ColorSurf, existingColor) + || aColorTool->GetColor(childLabel, XCAFDoc_ColorCurv, existingColor); + + if (!hasExplicitColor) { + // The label has no color, which would causes a crash. + + Quantity_ColorRGBA inheritedColor; + // Fetch the effective color from the shape instance. + auto childShape = aShapeTool->GetShape(childLabel); + if (aColorTool->GetInstanceColor(childShape, XCAFDoc_ColorSurf, inheritedColor) + || aColorTool->GetInstanceColor(childShape, XCAFDoc_ColorGen, inheritedColor)) { + aColorTool->SetColor(childLabel, inheritedColor, XCAFDoc_ColorSurf); + } + else { + // As a fallback, use the exporter's default color. + auto& c = options.defaultColor; + aColorTool->SetColor(childLabel, Tools::convertColor(c), XCAFDoc_ColorGen); + } } aColorTool->SetVisibility(childLabel, Standard_False); }