Sumil Sood
Sumil Sood

Reputation: 11

STEPCAFControl_Writer not writing the SubShape data like Names and Colors

I am working on importing a STEP file and then exporting it back but changing their appearance using color and material. I am able to export color information for Compounds and Solids but when I try to do it for Faces it doesn't export. I have verified that the face label created has the color information before exporting. The below code I am adding a color for each face but it doesn't get exported. Here's my export code:

void ShapeNode::Export(std::string fileName)
{
    Handle (XCAFApp_Application)
    app = XCAFApp_Application::GetApplication();
    
// Create a new XDE document
    Handle (TDocStd_Document) doc;
    app->NewDocument("MDTV-XCAF", doc);
    
// Access the shape, color, and material tools
    Handle (XCAFDoc_ShapeTool)
    shapeTool = XCAFDoc_DocumentTool::ShapeTool(doc->Main());
    Handle (XCAFDoc_ColorTool)
    colorTool = XCAFDoc_DocumentTool::ColorTool(doc->Main());
    Handle (XCAFDoc_MaterialTool)
    materialTool = XCAFDoc_DocumentTool::MaterialTool(doc->Main());
    
// Add the root shape to the document
    TDF_Label shapeLabel = shapeTool->AddShape(shape);
    
// Set the name using TDataStd_Name attribute
    TDataStd_Name::Set(shapeLabel, name.c_str());
    
    if (material.GetName() != "")
    {
        std::vector<double> color;
        if (material.GetAttribute(color, "Color"))
        {
            Quantity_Color col(color[0], color[1], color[2], Quantity_TOC_RGB);
// Set the color
            colorTool->SetColor(shapeLabel, col, XCAFDoc_ColorGen);
        }
        
        Handle (TCollection_HAsciiString)
        matName = new TCollection_HAsciiString(material.GetName().c_str());
        Handle (TCollection_HAsciiString)
        matDes = new TCollection_HAsciiString(material.GetName().c_str());
        double density = 0.0;
        if (material.GetAttribute(density, "Density"))
        {
            TDF_Label matLabel = materialTool->AddMaterial(matName,
                                                           matDes,
                                                           density,
                                                           matDes,
                                                           matDes);
            materialTool->SetMaterial(shapeLabel, matLabel);
        }
        
    }
    
    for (TopExp_Explorer itf(shape, TopAbs_FACE); itf.More(); itf.Next())
    {
        TopoDS_Face face = TopoDS::Face(itf.Current());
        
        Quantity_Color color;
        if (!colorTool->SetColor(face, color, XCAFDoc_ColorSurf))
        {
            TDF_Label faceLabel;
            if (!shapeTool->FindSubShape(shapeLabel, face, faceLabel))
            {
                faceLabel = shapeTool->AddSubShape(shapeLabel, face);
            }
            colorTool->SetColor(faceLabel,
                                Quantity_Color(1, 0, 0, Quantity_TOC_RGB),
                                XCAFDoc_ColorSurf);
        }
    }
    
// Write to STEP file
    STEPCAFControl_Writer writer;
    writer.Transfer(doc, STEPControl_AsIs);
    if (writer.Write(fileName.c_str()) != IFSelect_RetDone)
    {
        std::cout << "Failed to write STEP file." << std::endl;
    }
}


The expected result from the above code was to see the colors per face on the output STEP file but that did not happen.

Upvotes: 1

Views: 45

Answers (0)

Related Questions