При расчете триангуляции для форм с помощью BRepMesh_IncrementalMe sh требуется отклонение линии и отклонение угла, что это такое и какими должны быть его значения?
Параметры отклонения определяют качество sh. В пределах указанного c домена / алгоритма вы, вероятно, должны заранее знать допустимое отклонение вашей геометрии (например, не более 1 мм). Однако в контексте визуализации и произвольной модели САПР линейное отклонение обычно определяется относительно ограничивающей рамки документа.
RWGltf_CafWriter требует TDocStd_Document и TDF_LabelSequence, как мы можем получить их из фигур?
TDocStd_Document
- это XDE-документ , поддерживаемый различными трансляторами форматов файлов, включая STEP и glTF. Если на этом этапе у вас есть один TopoDS_Shape
из файла STEP, то вы, вероятно, использовали упрощенный переводчик STEP STEPControl_Reader
. Чтобы сохранить структуру исходного документа, лучше использовать STEPCAFControl_Reader
заполнение документа XDE.
В документе XDE фигуры (и не только фигуры) хранятся как метки, так что коллекция TDF_LabelSequence
используется для передачи информации, такой как последовательность root фигур (корни дерева модели в документе), которые называются произвольными формами:
// read / create / fill in the document
Handle(TDocStd_Document) theXdeDoc; // created in advance
STEPCAFControl_Reader aStepReader;
if (!aStepReader.ReadFile ("myStep.stp") != IFSelect_RetDone) { // parse error }
if (!aStepReader.Transfer (theXdeDoc)) { // translation error }
...
// collect document roots into temporary compound
Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool (myXdeDoc->Main());
TDF_LabelSequence aRootLabels;
aShapeTool->GetFreeShapes (aRootLabels);
TopoDS_Compound aCompound;
BRep_Builder aBuildTool;
aBuildTool.MakeCompound (aCompound);
for (TDF_LabelSequence::Iterator aRootIter (aRootLabels); aRootIter.More(); aRootIter.Next())
{
const TDF_Label& aRootLabel = aRootIter.Value();
TopoDS_Shape aRootShape;
if (XCAFDoc_ShapeTool::GetShape (aRootLabel, aRootShape))
{
aBuildTool.Add (aCompound, aRootShape);
}
}
// perform meshing
Handle(Prs3d_Drawer) aDrawer = new Prs3d_Drawer(); // holds visualization defaults
BRepMesh_IncrementalMesh anAlgo;
anAlgo.ChangeParameters().Deflection = Prs3d::GetDeflection (aCompound, aDrawer);
anAlgo.ChangeParameters().Angle = 20.0 * M_PI / 180.0; // 20 degrees
anAlgo.ChangeParameters().InParallel = true;
anAlgo.SetShape (aCompound);
anAlgo.Perform();
...
// write or export the document
TColStd_IndexedDataMapOfStringString aMetadata;
RWGltf_CafWriter aGltfWriter ("exported.glb", true);
// STEP reader translates into mm units by default
aGltfWriter.ChangeCoordinateSystemConverter().SetInputLengthUnit (0.001);
aGltfWriter.ChangeCoordinateSystemConverter().SetInputCoordinateSystem (RWMesh_CoordinateSystem_Zup);
if (!aGltfWriter.Perform (theXdeDoc, aMetadata, Handle(Message_ProgressIndicator)())) { // export error }
В Draw Harness преобразование может выглядеть следующим образом (исходный код код команд может использоваться в качестве полезного справочника по рабочему коду с использованием связанных алгоритмов OCCT):
pload XDE OCAF VISUALIZATION MODELING
# read STEP file into XDE document
ReadStep D myStep.stp
# display the document in 3D viewer (will also compute default triangulation)
vinit
XDisplay -dispMode 1 D
vfit
# export XDE document into glTF file
WriteGltf D myGltf.glb