mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-06-30 12:14:08 +03:00
Data Exchange, Step Export - Ignoring unit factors during tessellation export (#577)
Provide unit factors into the tessellation export methods.
This commit is contained in:
parent
9ddcdae3f9
commit
f1cb756901
@ -173,7 +173,11 @@ void TopoDSToStep_Builder::Init(const TopoDS_Shape& aShape,
|
|||||||
|
|
||||||
if (theTessellatedGeomParam == 1 || (theTessellatedGeomParam == 2 && myResult.IsNull()))
|
if (theTessellatedGeomParam == 1 || (theTessellatedGeomParam == 2 && myResult.IsNull()))
|
||||||
{
|
{
|
||||||
TopoDSToStep_MakeTessellatedItem MkTessShell(myShell, myTool, FP, aPS.Next());
|
TopoDSToStep_MakeTessellatedItem MkTessShell(myShell,
|
||||||
|
myTool,
|
||||||
|
FP,
|
||||||
|
theLocalFactors,
|
||||||
|
aPS.Next());
|
||||||
if (MkTessShell.IsDone())
|
if (MkTessShell.IsDone())
|
||||||
{
|
{
|
||||||
myTessellatedResult = MkTessShell.Value();
|
myTessellatedResult = MkTessShell.Value();
|
||||||
@ -199,7 +203,7 @@ void TopoDSToStep_Builder::Init(const TopoDS_Shape& aShape,
|
|||||||
Message_ProgressScope aPS(theProgress, NULL, 1);
|
Message_ProgressScope aPS(theProgress, NULL, 1);
|
||||||
// fourth parameter is true in order to create a tessellated_surface_set entity
|
// fourth parameter is true in order to create a tessellated_surface_set entity
|
||||||
// or put false to create a triangulated_face instead
|
// or put false to create a triangulated_face instead
|
||||||
MkTessFace.Init(Face, myTool, FP, Standard_True, aPS.Next());
|
MkTessFace.Init(Face, myTool, FP, Standard_True, theLocalFactors, aPS.Next());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MkFace.IsDone() || MkTessFace.IsDone())
|
if (MkFace.IsDone() || MkTessFace.IsDone())
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <MoniTool_DataMapOfShapeTransient.hxx>
|
#include <MoniTool_DataMapOfShapeTransient.hxx>
|
||||||
#include <Poly.hxx>
|
#include <Poly.hxx>
|
||||||
#include <StdFail_NotDone.hxx>
|
#include <StdFail_NotDone.hxx>
|
||||||
|
#include <StepData_Factors.hxx>
|
||||||
#include <StepVisual_FaceOrSurface.hxx>
|
#include <StepVisual_FaceOrSurface.hxx>
|
||||||
#include <StepShape_TopologicalRepresentationItem.hxx>
|
#include <StepShape_TopologicalRepresentationItem.hxx>
|
||||||
#include <StepVisual_TessellatedShell.hxx>
|
#include <StepVisual_TessellatedShell.hxx>
|
||||||
@ -40,11 +41,13 @@ static void InitTriangulation(const Handle(Poly_Triangulation)& theMesh,
|
|||||||
Handle(TColgp_HArray1OfXYZ)& thePoints,
|
Handle(TColgp_HArray1OfXYZ)& thePoints,
|
||||||
Handle(TColStd_HArray2OfReal)& theNormals,
|
Handle(TColStd_HArray2OfReal)& theNormals,
|
||||||
Handle(TColStd_HArray1OfInteger)& theIndices,
|
Handle(TColStd_HArray1OfInteger)& theIndices,
|
||||||
Handle(TColStd_HArray2OfInteger)& theTrias)
|
Handle(TColStd_HArray2OfInteger)& theTrias,
|
||||||
|
const StepData_Factors& theLocalFactors)
|
||||||
{
|
{
|
||||||
|
Standard_Real aFactor = theLocalFactors.LengthFactor();
|
||||||
for (Standard_Integer aNodeIndex = 1; aNodeIndex <= theMesh->NbNodes(); ++aNodeIndex)
|
for (Standard_Integer aNodeIndex = 1; aNodeIndex <= theMesh->NbNodes(); ++aNodeIndex)
|
||||||
{
|
{
|
||||||
thePoints->SetValue(aNodeIndex, theMesh->Node(aNodeIndex).XYZ());
|
thePoints->SetValue(aNodeIndex, theMesh->Node(aNodeIndex).XYZ() / aFactor);
|
||||||
}
|
}
|
||||||
theCoordinates->Init(theName, thePoints);
|
theCoordinates->Init(theName, thePoints);
|
||||||
if (!theMesh->HasNormals())
|
if (!theMesh->HasNormals())
|
||||||
@ -86,10 +89,11 @@ TopoDSToStep_MakeTessellatedItem::TopoDSToStep_MakeTessellatedItem(
|
|||||||
TopoDSToStep_Tool& theTool,
|
TopoDSToStep_Tool& theTool,
|
||||||
const Handle(Transfer_FinderProcess)& theFP,
|
const Handle(Transfer_FinderProcess)& theFP,
|
||||||
const Standard_Boolean theToPreferSurfaceSet,
|
const Standard_Boolean theToPreferSurfaceSet,
|
||||||
|
const StepData_Factors& theLocalFactors,
|
||||||
const Message_ProgressRange& theProgress)
|
const Message_ProgressRange& theProgress)
|
||||||
: TopoDSToStep_Root()
|
: TopoDSToStep_Root()
|
||||||
{
|
{
|
||||||
Init(theFace, theTool, theFP, theToPreferSurfaceSet, theProgress);
|
Init(theFace, theTool, theFP, theToPreferSurfaceSet, theLocalFactors, theProgress);
|
||||||
}
|
}
|
||||||
|
|
||||||
//=================================================================================================
|
//=================================================================================================
|
||||||
@ -98,10 +102,11 @@ TopoDSToStep_MakeTessellatedItem::TopoDSToStep_MakeTessellatedItem(
|
|||||||
const TopoDS_Shell& theShell,
|
const TopoDS_Shell& theShell,
|
||||||
TopoDSToStep_Tool& theTool,
|
TopoDSToStep_Tool& theTool,
|
||||||
const Handle(Transfer_FinderProcess)& theFP,
|
const Handle(Transfer_FinderProcess)& theFP,
|
||||||
|
const StepData_Factors& theLocalFactors,
|
||||||
const Message_ProgressRange& theProgress)
|
const Message_ProgressRange& theProgress)
|
||||||
: TopoDSToStep_Root()
|
: TopoDSToStep_Root()
|
||||||
{
|
{
|
||||||
Init(theShell, theTool, theFP, theProgress);
|
Init(theShell, theTool, theFP, theLocalFactors, theProgress);
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
@ -113,6 +118,7 @@ void TopoDSToStep_MakeTessellatedItem::Init(const TopoDS_Face&
|
|||||||
TopoDSToStep_Tool& theTool,
|
TopoDSToStep_Tool& theTool,
|
||||||
const Handle(Transfer_FinderProcess)& theFP,
|
const Handle(Transfer_FinderProcess)& theFP,
|
||||||
const Standard_Boolean theToPreferSurfaceSet,
|
const Standard_Boolean theToPreferSurfaceSet,
|
||||||
|
const StepData_Factors& theLocalFactors,
|
||||||
const Message_ProgressRange& theProgress)
|
const Message_ProgressRange& theProgress)
|
||||||
{
|
{
|
||||||
done = Standard_False;
|
done = Standard_False;
|
||||||
@ -133,7 +139,14 @@ void TopoDSToStep_MakeTessellatedItem::Init(const TopoDS_Face&
|
|||||||
Handle(TColStd_HArray1OfInteger) anIndices = new TColStd_HArray1OfInteger(1, aMesh->NbNodes());
|
Handle(TColStd_HArray1OfInteger) anIndices = new TColStd_HArray1OfInteger(1, aMesh->NbNodes());
|
||||||
Handle(TColStd_HArray2OfInteger) aTrias =
|
Handle(TColStd_HArray2OfInteger) aTrias =
|
||||||
new TColStd_HArray2OfInteger(1, aMesh->NbTriangles(), 1, 3);
|
new TColStd_HArray2OfInteger(1, aMesh->NbTriangles(), 1, 3);
|
||||||
InitTriangulation(aMesh, aName, aCoordinates, aPoints, aNormals, anIndices, aTrias);
|
InitTriangulation(aMesh,
|
||||||
|
aName,
|
||||||
|
aCoordinates,
|
||||||
|
aPoints,
|
||||||
|
aNormals,
|
||||||
|
anIndices,
|
||||||
|
aTrias,
|
||||||
|
theLocalFactors);
|
||||||
|
|
||||||
const Standard_Boolean aHasGeomLink = theTool.IsBound(theFace);
|
const Standard_Boolean aHasGeomLink = theTool.IsBound(theFace);
|
||||||
StepVisual_FaceOrSurface aGeomLink;
|
StepVisual_FaceOrSurface aGeomLink;
|
||||||
@ -182,6 +195,7 @@ void TopoDSToStep_MakeTessellatedItem::Init(const TopoDS_Face&
|
|||||||
void TopoDSToStep_MakeTessellatedItem::Init(const TopoDS_Shell& theShell,
|
void TopoDSToStep_MakeTessellatedItem::Init(const TopoDS_Shell& theShell,
|
||||||
TopoDSToStep_Tool& theTool,
|
TopoDSToStep_Tool& theTool,
|
||||||
const Handle(Transfer_FinderProcess)& theFP,
|
const Handle(Transfer_FinderProcess)& theFP,
|
||||||
|
const StepData_Factors& theLocalFactors,
|
||||||
const Message_ProgressRange& theProgress)
|
const Message_ProgressRange& theProgress)
|
||||||
{
|
{
|
||||||
done = Standard_False;
|
done = Standard_False;
|
||||||
@ -202,7 +216,12 @@ void TopoDSToStep_MakeTessellatedItem::Init(const TopoDS_Shell&
|
|||||||
for (anExp.Init(theShell, TopAbs_FACE); anExp.More() && aPS.More(); anExp.Next(), aPS.Next())
|
for (anExp.Init(theShell, TopAbs_FACE); anExp.More() && aPS.More(); anExp.Next(), aPS.Next())
|
||||||
{
|
{
|
||||||
const TopoDS_Face aFace = TopoDS::Face(anExp.Current());
|
const TopoDS_Face aFace = TopoDS::Face(anExp.Current());
|
||||||
TopoDSToStep_MakeTessellatedItem aMakeFace(aFace, theTool, theFP, Standard_False, aPS.Next());
|
TopoDSToStep_MakeTessellatedItem aMakeFace(aFace,
|
||||||
|
theTool,
|
||||||
|
theFP,
|
||||||
|
Standard_False,
|
||||||
|
theLocalFactors,
|
||||||
|
aPS.Next());
|
||||||
if (aMakeFace.IsDone())
|
if (aMakeFace.IsDone())
|
||||||
{
|
{
|
||||||
aTessFaces.Append(Handle(StepVisual_TessellatedStructuredItem)::DownCast(aMakeFace.Value()));
|
aTessFaces.Append(Handle(StepVisual_TessellatedStructuredItem)::DownCast(aMakeFace.Value()));
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <TopoDSToStep_Root.hxx>
|
#include <TopoDSToStep_Root.hxx>
|
||||||
#include <Message_ProgressRange.hxx>
|
#include <Message_ProgressRange.hxx>
|
||||||
|
|
||||||
|
class StepData_Factors;
|
||||||
class StepVisual_TessellatedItem;
|
class StepVisual_TessellatedItem;
|
||||||
class TopoDS_Face;
|
class TopoDS_Face;
|
||||||
class TopoDS_Shell;
|
class TopoDS_Shell;
|
||||||
@ -40,23 +41,27 @@ public:
|
|||||||
TopoDSToStep_Tool& theTool,
|
TopoDSToStep_Tool& theTool,
|
||||||
const Handle(Transfer_FinderProcess)& theFP,
|
const Handle(Transfer_FinderProcess)& theFP,
|
||||||
const Standard_Boolean theToPreferSurfaceSet,
|
const Standard_Boolean theToPreferSurfaceSet,
|
||||||
|
const StepData_Factors& theLocalFactors,
|
||||||
const Message_ProgressRange& theProgress = Message_ProgressRange());
|
const Message_ProgressRange& theProgress = Message_ProgressRange());
|
||||||
|
|
||||||
Standard_EXPORT TopoDSToStep_MakeTessellatedItem(
|
Standard_EXPORT TopoDSToStep_MakeTessellatedItem(
|
||||||
const TopoDS_Shell& theShell,
|
const TopoDS_Shell& theShell,
|
||||||
TopoDSToStep_Tool& theTool,
|
TopoDSToStep_Tool& theTool,
|
||||||
const Handle(Transfer_FinderProcess)& theFP,
|
const Handle(Transfer_FinderProcess)& theFP,
|
||||||
|
const StepData_Factors& theLocalFactors,
|
||||||
const Message_ProgressRange& theProgress = Message_ProgressRange());
|
const Message_ProgressRange& theProgress = Message_ProgressRange());
|
||||||
|
|
||||||
Standard_EXPORT void Init(const TopoDS_Face& theFace,
|
Standard_EXPORT void Init(const TopoDS_Face& theFace,
|
||||||
TopoDSToStep_Tool& theTool,
|
TopoDSToStep_Tool& theTool,
|
||||||
const Handle(Transfer_FinderProcess)& theFP,
|
const Handle(Transfer_FinderProcess)& theFP,
|
||||||
const Standard_Boolean theToPreferSurfaceSet,
|
const Standard_Boolean theToPreferSurfaceSet,
|
||||||
|
const StepData_Factors& theLocalFactors,
|
||||||
const Message_ProgressRange& theProgress = Message_ProgressRange());
|
const Message_ProgressRange& theProgress = Message_ProgressRange());
|
||||||
|
|
||||||
Standard_EXPORT void Init(const TopoDS_Shell& theShell,
|
Standard_EXPORT void Init(const TopoDS_Shell& theShell,
|
||||||
TopoDSToStep_Tool& theTool,
|
TopoDSToStep_Tool& theTool,
|
||||||
const Handle(Transfer_FinderProcess)& theFP,
|
const Handle(Transfer_FinderProcess)& theFP,
|
||||||
|
const StepData_Factors& theLocalFactors,
|
||||||
const Message_ProgressRange& theProgress = Message_ProgressRange());
|
const Message_ProgressRange& theProgress = Message_ProgressRange());
|
||||||
|
|
||||||
Standard_EXPORT const Handle(StepVisual_TessellatedItem)& Value() const;
|
Standard_EXPORT const Handle(StepVisual_TessellatedItem)& Value() const;
|
||||||
|
@ -15,12 +15,9 @@ set conf "
|
|||||||
provider.STEP.OCC.write.schema : 5
|
provider.STEP.OCC.write.schema : 5
|
||||||
provider.STEP.OCC.write.tessellated : 1
|
provider.STEP.OCC.write.tessellated : 1
|
||||||
"
|
"
|
||||||
LoadConfiguration ${conf} -recursive on
|
|
||||||
param write.step.schema 5
|
|
||||||
param write.step.tessellated 1
|
|
||||||
|
|
||||||
WriteStep D1 "$imagedir/${casename}.stp"
|
WriteFile D1 "$imagedir/${casename}.stp" -conf ${conf}
|
||||||
ReadStep D2 "$imagedir/${casename}.stp"
|
ReadFile D2 "$imagedir/${casename}.stp"
|
||||||
|
|
||||||
XGetOneShape a1 D1
|
XGetOneShape a1 D1
|
||||||
XGetOneShape a2 D2
|
XGetOneShape a2 D2
|
||||||
@ -44,8 +41,4 @@ if {([expr abs($REF_X - [lindex $pos2 9])] > $tol) ||
|
|||||||
Close D1
|
Close D1
|
||||||
Close D2
|
Close D2
|
||||||
file delete "$imagedir/${casename}.stp"
|
file delete "$imagedir/${casename}.stp"
|
||||||
set conf "
|
|
||||||
provider.STEP.OCC.write.schema : 4
|
|
||||||
provider.STEP.OCC.write.tessellated : 2
|
|
||||||
"
|
|
||||||
LoadConfiguration ${conf} -recursive on
|
|
||||||
|
48
tests/bugs/step/bug_ocp1949_2
Normal file
48
tests/bugs/step/bug_ocp1949_2
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
puts "================================================"
|
||||||
|
puts "OCP-1949: Apply a scaling transformation to STEP"
|
||||||
|
puts "================================================"
|
||||||
|
puts ""
|
||||||
|
|
||||||
|
pload OCAF
|
||||||
|
|
||||||
|
Close D1 -silent
|
||||||
|
Close D2 -silent
|
||||||
|
|
||||||
|
# Create simple mesh
|
||||||
|
box b 1 1 1
|
||||||
|
incmesh b 1
|
||||||
|
writestl b "$imagedir/${casename}.stl"
|
||||||
|
readstl b "$imagedir/${casename}.stl"
|
||||||
|
|
||||||
|
# Create document with meters as internal units
|
||||||
|
XNewDoc D1
|
||||||
|
XSetLengthUnit D1 m
|
||||||
|
XAddShape D1 b
|
||||||
|
|
||||||
|
# apply parameters for tessellation export
|
||||||
|
set conf "
|
||||||
|
provider.STEP.OCC.write.schema : 5
|
||||||
|
provider.STEP.OCC.write.tessellated : 1
|
||||||
|
"
|
||||||
|
|
||||||
|
WriteFile D1 "$imagedir/${casename}.stp" -conf ${conf}
|
||||||
|
ReadFile D2 "$imagedir/${casename}.stp"
|
||||||
|
|
||||||
|
XGetOneShape a1 D1
|
||||||
|
XGetOneShape a2 D2
|
||||||
|
|
||||||
|
# check sizes
|
||||||
|
set m_diag [eval distpp [bounding a1]]
|
||||||
|
set mm_diag [eval distpp [bounding a2]]
|
||||||
|
set tol 0.1
|
||||||
|
|
||||||
|
if {([expr abs($m_diag * 1000 - $mm_diag)] > $tol)} {
|
||||||
|
puts "Error: wrong size of models."
|
||||||
|
}
|
||||||
|
|
||||||
|
# cleaning
|
||||||
|
Close D1
|
||||||
|
Close D2
|
||||||
|
file delete "$imagedir/${casename}.stp"
|
||||||
|
file delete "$imagedir/${casename}.stl"
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user