Skip to content

Commit f953274

Browse files
committed
Fix unit handling in an edge case.
1 parent 5c5f2d9 commit f953274

File tree

5 files changed

+30
-21
lines changed

5 files changed

+30
-21
lines changed

dist/occt-import-js.wasm

30 Bytes
Binary file not shown.

occt-import-js/example/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ int main (int argc, const char* argv[])
127127
}
128128

129129
ImportParams params;
130+
params.linearUnit = ImportParams::LinearUnit::Meter;
130131
Importer::Result result = importer->LoadFile (argv[1], params);
131132
if (result != Importer::Result::Success) {
132133
return 1;

occt-import-js/src/importer-utils.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <Bnd_Box.hxx>
1010
#include <BRepBndLib.hxx>
1111
#include <BRepMesh_IncrementalMesh.hxx>
12+
#include <UnitsMethods.hxx>
1213

1314
VectorBuffer::VectorBuffer (const std::vector<uint8_t>& v)
1415
{
@@ -95,6 +96,25 @@ bool OcctFace::HasTriangulation () const
9596
return true;
9697
}
9798

99+
UnitsMethods_LengthUnit LinearUnitToLengthUnit (ImportParams::LinearUnit linearUnit)
100+
{
101+
UnitsMethods_LengthUnit lengthUnit = UnitsMethods_LengthUnit_Millimeter;
102+
switch (linearUnit) {
103+
case ImportParams::LinearUnit::Millimeter:
104+
return UnitsMethods_LengthUnit_Millimeter;
105+
case ImportParams::LinearUnit::Centimeter:
106+
return UnitsMethods_LengthUnit_Centimeter;
107+
case ImportParams::LinearUnit::Meter:
108+
return UnitsMethods_LengthUnit_Meter;
109+
case ImportParams::LinearUnit::Inch:
110+
return UnitsMethods_LengthUnit_Inch;
111+
case ImportParams::LinearUnit::Foot:
112+
return UnitsMethods_LengthUnit_Foot;
113+
default:
114+
return UnitsMethods_LengthUnit_Millimeter;
115+
}
116+
}
117+
98118
bool TriangulateShape (TopoDS_Shape& shape, const ImportParams& params)
99119
{
100120
Standard_Real linDeflection = params.linearDeflection;
@@ -112,7 +132,12 @@ bool TriangulateShape (TopoDS_Shape& shape, const ImportParams& params)
112132
Standard_Real avgSize = ((xMax - xMin) + (yMax - yMin) + (zMax - zMin)) / 3.0;
113133
linDeflection = avgSize * params.linearDeflection;
114134
if (linDeflection < Precision::Confusion ()) {
115-
linDeflection = 0.1;
135+
// use 1mm in the current unit
136+
double mmToUnit = UnitsMethods::GetLengthUnitScale (
137+
UnitsMethods_LengthUnit_Millimeter,
138+
LinearUnitToLengthUnit (params.linearUnit)
139+
);
140+
linDeflection = 1.0 * mmToUnit;
116141
}
117142
}
118143

occt-import-js/src/importer-utils.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <TopoDS_Face.hxx>
77
#include <TopLoc_Location.hxx>
88
#include <Poly_Triangulation.hxx>
9+
#include <UnitsMethods_LengthUnit.hxx>
910

1011
#include <vector>
1112
#include <fstream>
@@ -36,4 +37,5 @@ class OcctFace : public Face
3637
TopLoc_Location location;
3738
};
3839

40+
UnitsMethods_LengthUnit LinearUnitToLengthUnit (ImportParams::LinearUnit linearUnit);
3941
bool TriangulateShape (TopoDS_Shape& shape, const ImportParams& params);

occt-import-js/src/importer-xcaf.cpp

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -371,26 +371,7 @@ Importer::Result ImporterXcaf::LoadFile (const std::vector<std::uint8_t>& fileCo
371371
{
372372
document = new TDocStd_Document ("XmlXCAF");
373373

374-
UnitsMethods_LengthUnit lengthUnit = UnitsMethods_LengthUnit_Millimeter;
375-
switch (params.linearUnit) {
376-
case ImportParams::LinearUnit::Millimeter:
377-
lengthUnit = UnitsMethods_LengthUnit_Millimeter;
378-
break;
379-
case ImportParams::LinearUnit::Centimeter:
380-
lengthUnit = UnitsMethods_LengthUnit_Centimeter;
381-
break;
382-
case ImportParams::LinearUnit::Meter:
383-
lengthUnit = UnitsMethods_LengthUnit_Meter;
384-
break;
385-
case ImportParams::LinearUnit::Inch:
386-
lengthUnit = UnitsMethods_LengthUnit_Inch;
387-
break;
388-
case ImportParams::LinearUnit::Foot:
389-
lengthUnit = UnitsMethods_LengthUnit_Foot;
390-
break;
391-
default:
392-
return Importer::Result::ImportFailed;
393-
}
374+
UnitsMethods_LengthUnit lengthUnit = LinearUnitToLengthUnit (params.linearUnit);
394375
XCAFDoc_DocumentTool::SetLengthUnit (document, 1.0, lengthUnit);
395376

396377
if (!TransferToDocument (fileContent)) {

0 commit comments

Comments
 (0)