Tue, 01/21/2020 - 16:40
Hello,
I'm writing a code to read the names of all the solids in a STEP model and export them to stl separate files. So far I succeeded, but there's a strange behavior on the outputs: some of the solids return the same name. I've of course checked the STEP file, and the names do not repeat.
Here's my complete code:
#include <iostream>
#include <vector>
#include <string>
#include <sys/types.h>
#include <dirent.h>
#include <map>
#include <STEPCAFControl_Reader.hxx>
#include <StepRepr_Representation.hxx>
#include <XCAFApp_Application.hxx>
#include <XCAFDoc_DocumentTool.hxx>
#include <XCAFDoc_ShapeTool.hxx>
#include <XCAFDoc_ColorTool.hxx>
#include <Quantity_Color.hxx>
#include <Resource_Unicode.hxx>
#include <TDF_ChildIterator.hxx>
#include <TDocStd_Document.hxx>
#include <TDF_LabelSequence.hxx>
#include <TDataStd_Name.hxx>
#include <BRepMesh_IncrementalMesh.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <Interface_Static.hxx>
#include <StlAPI_Writer.hxx>
using namespace std;
int main()
{
int mkdir;
string Dir = ".../Directory/";
string FileName = "Module.step";
string inFile = Dir+FileName;//+stepFile;
string command = "mkdir "+Dir+"STL";
const char *Command = command.c_str();
mkdir = system(Command);
// Create Document
Handle(TDocStd_Document) aDoc;
Handle(XCAFApp_Application) anApp = XCAFApp_Application::GetApplication();
anApp->NewDocument(FileName.c_str(),aDoc);
// Create additional log file
STEPCAFControl_Reader aReader;
aReader.ReadFile(inFile.c_str());
aReader.Transfer(aDoc);
if(!aReader.Transfer(aDoc)){
cout<<"ERROR: Could NOT read the STEP file."<<endl;
}
aReader.SetNameMode(true);
aReader.SetColorMode(true);
aReader.SetMatMode(true);
Handle(XCAFDoc_ShapeTool) l_ShapeTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
Handle(XCAFDoc_ColorTool) l_ColorTool = XCAFDoc_DocumentTool::ColorTool(aDoc->Main());
// Shape Extraction & Conversion
TDF_LabelSequence FreeShapes;
l_ShapeTool->GetShapes(FreeShapes);
TDF_LabelSequence shapes;
l_ShapeTool->GetComponents(FreeShapes.Value(1),shapes,true);
TCollection_ExtendedString extstr_shapes[shapes.Length()];
string shapes_names[shapes.Length()];
vector<float> RedVector;
vector<float> GreenVector;
vector<float> BlueVector;
for(Standard_Integer i=1; i<=shapes.Length();i++){
TDF_Label label = shapes.Value(i);
TopoDS_Shape shape;
l_ShapeTool->GetShape(label,shape);
// Color Try-Out Declaration
//TDF_Label l_ColorLabel;
//Quantity_Color aColor;
TopAbs_ShapeEnum type = shape.ShapeType();
if(type == TopAbs_SOLID){
//BRepBuilderAPI_Transform xform(shape,transformation,Standard_True);
//shape = xform.Shape();
Handle(TDataStd_Name) name;
if(label.FindAttribute(TDataStd_Name::GetID(),name)){
//TCollection_ExtendedString extstr_shapes = name->Get();
extstr_shapes[i] = name->Get();
shapes_names[i] = TCollection_AsciiString(extstr_shapes[i]).ToCString();
//string shapes_names = TCollection_AsciiString(extstr_shapes).ToCString();
//cout<<extstr_shapes[i]<<endl;
//cout<<shapes_names[i]<<endl;
}
// Shape Meshing and conversion to STL
BRepMesh_IncrementalMesh BMesh(shape,0.1,Standard_True);
StlAPI_Writer STLwriter;
string Filename;
//Filename = Dir+"STL/("+to_string(i)+") "+shapes_names[i]+".stl";
Filename = Dir+"STL/"+shapes_names[i]+".stl";
STLwriter.Write(shape,Filename.c_str());
}
}
cout<<"Shape Color"<<endl;
for(Standard_Integer i=0; i < shapes.Length(); i++){
cout<<shapes_names[i]<<endl;
}
return 0;
}
Here's my output:
M2x10_TX6_6
M2x10_TX6_13
castor-v020
M2x10_TX6_14
M2x10_TX6_7
castor-v020
castor-v020
M2x10_TX6_11
M2x10_TX6_2
M2x10_TX6_12
M2x10_TX6
castor-v020
castor-v020
castor-v020
castor-v020
castor-v020
M2x10_TX6_4
M2x10_TX6_8
castor-v020
castor-v020
Sshield_top
castor-v020
M2x10_TX6_10
castor-v020
castor-v020
M2x10_TX6_9
Sshield_bottom
M2x10_TX6_1
M2x10_TX6_5
castor-v020
castor-v020
M2x10_TX6_3
The "castor-v**" is actually changing in the STEP file, as you can see in the figure attached.
I would really appreciate help. I simply cannot find an error that results in repeated names :(
Thanks in advance.
Attachments:
Thu, 01/30/2020 - 12:45
Could you attach a STEP file?
Thu, 01/30/2020 - 13:07
The step file exceeds the limit of 10MB, so here it is a shareable link: https://drive.google.com/open?id=13M0hRh4J82zrJeWiquOdv-uRLZ-ZjAr3
It's the same file of the results I posted before. Please let me know if you can access it, and thanks again!
Cheers,
/Leonardo.
Mon, 02/10/2020 - 12:10
I have already tried replying, but trying again.
Here's the link for the STEP file: https://drive.google.com/open?id=13M0hRh4J82zrJeWiquOdv-uRLZ-ZjAr3
Thanks a lot for the help.
/Leonardo,
Fri, 02/14/2020 - 11:26
No, they don't - I see no "castor-v023" entities in CAD Assistant nor any such string in STEP file itself.
Look like a different STEP model or issues with STEP export.
Sun, 02/16/2020 - 05:47
Leonardo said "I've of course checked the STEP file,", but I think he did it on FreeCAD.
The original STEP file provided by Leonardo actually contains duplicated names 'castor-v020'.
But, when I open the file in FreeCAD, the duplicated solid names will be renumbered automatically because FreeCAD disallow to set same name for two or more shapes. I guess that would be the root cause.
Tue, 03/03/2020 - 09:29
Dear Kiril and Kenji,
Thank you so much for both your answers. That was my own mistake! Kiril is correct that the names do not change, and FreeCAD renames the solids so as not to have repeated names, as Kenji mentioned.
Apologies, and thank you again for your help.
Best Regards,
/Leonardo