Thu, 05/02/2024 - 00:22
Hi everyone,
this is my first post.
I try to scale a step object and save to another step file
when i transform the shape it works but I lose the color.
i try to copy the color of each face from the original to a scaled one but I receive this error:
Exception caught: A null Label has no attribute.
I put in attachment the step file I try to scale and save
I try to follow this tutorial.
https://www.youtube.com/watch?v=dq2-evewPeA
Here my code to save step file.
bool WriteLabelToSTEP(const Handle(XCAFDoc_ShapeTool)& shapeTool, const TDF_Label& label, const std::string& filename, double scaleFactor = 10.0) { // Create a writer for exporting STEP files STEPCAFControl_Writer writer; writer.SetColorMode(true); // Make sure this is set writer.SetNameMode(true); writer.SetLayerMode(true); Interface_Static::SetIVal("write.stepcaf.subshapes.name", 1); TDF_Label refLabel = label; if (shapeTool->IsReference(label)) shapeTool->GetReferredShape(label, refLabel); // Access color tool Handle(XCAFDoc_ColorTool) colorTool = XCAFDoc_DocumentTool::ColorTool(refLabel); // Retrieve the original shape TopoDS_Shape originalShape = shapeTool->GetShape(refLabel); // Apply scaling to the shape gp_Trsf scaleTrsf; scaleTrsf.SetScaleFactor(scaleFactor); BRepBuilderAPI_Transform transformer(scaleTrsf); transformer.Perform(originalShape, true); TopoDS_Shape scaledShape = transformer.Shape(); // Explore original and scaled shapes to reapply colors TopExp_Explorer expOrig(originalShape, TopAbs_FACE); TopExp_Explorer expScaled(scaledShape, TopAbs_FACE); while (expOrig.More() && expScaled.More()) { const TopoDS_Face& originalFace = TopoDS::Face(expOrig.Current()); const TopoDS_Face& scaledFace = TopoDS::Face(expScaled.Current()); // Debug output to check the presence of faces std::cout << "Original face found: " << &originalFace << std::endl; std::cout << "Scaled face found: " << &scaledFace << std::endl; Quantity_Color color; if (colorTool->GetColor(originalFace, XCAFDoc_ColorSurf, color)) { std::cout << "Color found: " << color.StringName(color.Name()) << std::endl; /* TDF_Label colorLabel = shapeTool->AddSubShape(refLabel, originalFace); //colorTool->SetColor(scaledFace, color, XCAFDoc_ColorSurf); colorTool->SetColor(colorLabel, color, XCAFDoc_ColorSurf); */ try { // Your existing code inside this try block // Associate color with the scaled face TDF_Label scaledFaceLabel = shapeTool->AddSubShape(refLabel, scaledFace); colorTool->SetColor(scaledFaceLabel, color, XCAFDoc_ColorSurf); } catch (const Standard_Failure& e) { std::cerr << "Exception caught: " << e.GetMessageString() << std::endl; } catch (const std::exception& e) { std::cerr << "Standard exception: " << e.what() << std::endl; } catch (...) { std::cerr << "Unknown exception caught" << std::endl; } } else { std::cout << "No color found for this face." << std::endl; } expOrig.Next(); expScaled.Next(); } // Set the scaled shape back to the label shapeTool->SetShape(refLabel, scaledShape); // Transfer the label (with the scaled shape) to the writer if (writer.Transfer(refLabel, STEPControl_AsIs) != IFSelect_RetDone) { std::cerr << "Failed to transfer label to STEP writer." << std::endl; return false; } // Write to a STEP file if (writer.Write(filename.c_str()) != IFSelect_RetDone) { std::cerr << "Failed to write STEP file: " << filename << std::endl; return false; } return true; }
thank you for your help.
Best regards
Daniel
Attachments:
Thu, 05/02/2024 - 12:22
Hello, the main remarks, your colours assigne to faces only? You need to go no all sub labels and regenerate based on them them. Additionally, you need to remove all of old subshapes, I'm not sure that shapetool clean old subshapes.
The functionality for your case already implemented in 7.7. Please Check XCAFDoc_Editor.
Best regards, Dmitrii.
Thu, 05/02/2024 - 12:25
Well, I will check the possibility to start OCCT tutorials or guiding from OCCT team. Thank you for sharing your link.
Best regards, Dmitrii.