1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-13 14:27:08 +03:00

Compare commits

..

1 Commits

Author SHA1 Message Date
ika
2866e52daa 0033266: Modeling Algorithms - Wrong behavior of split shape algorithm
Do not skip both faces after splitting in case of the second one is invalid (has one edge or overlapping edges)
2023-01-04 12:54:02 +03:00
82 changed files with 2855 additions and 3962 deletions

View File

@@ -1,51 +0,0 @@
// Copyright (c) 2023 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <AIS_AnimationAxisRotation.hxx>
IMPLEMENT_STANDARD_RTTIEXT(AIS_AnimationAxisRotation, AIS_BaseAnimationObject)
//=============================================================================
//function : Constructor
//purpose :
//=============================================================================
AIS_AnimationAxisRotation::AIS_AnimationAxisRotation (const TCollection_AsciiString& theAnimationName,
const Handle(AIS_InteractiveContext)& theContext,
const Handle(AIS_InteractiveObject)& theObject,
const gp_Ax1& theAxis,
const Standard_Real theAngleStart,
const Standard_Real theAngleEnd)
: AIS_BaseAnimationObject (theAnimationName, theContext, theObject),
myRotAxis (theAxis),
myAngleStart (theAngleStart),
myAngleEnd (theAngleEnd)
{
//
}
//=============================================================================
//function : update
//purpose :
//=============================================================================
void AIS_AnimationAxisRotation::update (const AIS_AnimationProgress& theProgress)
{
if (myObject.IsNull())
{
return;
}
gp_Trsf aTrsf;
Standard_Real aCurrentAngle = (1.0 - theProgress.LocalNormalized) * myAngleStart + theProgress.LocalNormalized * myAngleEnd;
aTrsf.SetRotation (myRotAxis, aCurrentAngle);
updateTrsf (aTrsf);
}

View File

@@ -1,53 +0,0 @@
// Copyright (c) 2023 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _AIS_AnimationAxisRotation_HeaderFile
#define _AIS_AnimationAxisRotation_HeaderFile
#include <AIS_BaseAnimationObject.hxx>
#include <gp_TrsfNLerp.hxx>
//! Animation defining object transformation.
class AIS_AnimationAxisRotation : public AIS_BaseAnimationObject
{
DEFINE_STANDARD_RTTIEXT(AIS_AnimationAxisRotation, AIS_BaseAnimationObject)
public:
//! Constructor with initialization.
//! @param[in] theAnimationName animation identifier
//! @param[in] theContext interactive context where object have been displayed
//! @param[in] theObject object to apply rotation
//! @param[in] theAxis rotation axis
//! @param[in] theAngleStart rotation angle at the start of animation
//! @param[in] theAngleEnd rotation angle at the end of animation
Standard_EXPORT AIS_AnimationAxisRotation (const TCollection_AsciiString& theAnimationName,
const Handle(AIS_InteractiveContext)& theContext,
const Handle(AIS_InteractiveObject)& theObject,
const gp_Ax1& theAxis,
const Standard_Real theAngleStart,
const Standard_Real theAngleEnd);
protected:
//! Update the progress.
Standard_EXPORT virtual void update (const AIS_AnimationProgress& theProgress) Standard_OVERRIDE;
private:
gp_Ax1 myRotAxis; //!< rotation axis
Standard_Real myAngleStart; //!< start angle for rotation
Standard_Real myAngleEnd; //!< end angle for rotation
};
#endif // _AIS_AnimationAxisRotation_HeaderFile

View File

@@ -14,7 +14,10 @@
#include <AIS_AnimationObject.hxx> #include <AIS_AnimationObject.hxx>
IMPLEMENT_STANDARD_RTTIEXT(AIS_AnimationObject, AIS_BaseAnimationObject) #include <AIS_InteractiveContext.hxx>
#include <V3d_View.hxx>
IMPLEMENT_STANDARD_RTTIEXT(AIS_AnimationObject, AIS_Animation)
//============================================================================= //=============================================================================
//function : Constructor //function : Constructor
@@ -25,7 +28,9 @@ AIS_AnimationObject::AIS_AnimationObject (const TCollection_AsciiString& theAnim
const Handle(AIS_InteractiveObject)& theObject, const Handle(AIS_InteractiveObject)& theObject,
const gp_Trsf& theTrsfStart, const gp_Trsf& theTrsfStart,
const gp_Trsf& theTrsfEnd) const gp_Trsf& theTrsfEnd)
: AIS_BaseAnimationObject (theAnimationName, theContext, theObject), : AIS_Animation (theAnimationName),
myContext (theContext),
myObject (theObject),
myTrsfLerp (theTrsfStart, theTrsfEnd) myTrsfLerp (theTrsfStart, theTrsfEnd)
{ {
// //
@@ -44,5 +49,52 @@ void AIS_AnimationObject::update (const AIS_AnimationProgress& theProgress)
gp_Trsf aTrsf; gp_Trsf aTrsf;
myTrsfLerp.Interpolate (theProgress.LocalNormalized, aTrsf); myTrsfLerp.Interpolate (theProgress.LocalNormalized, aTrsf);
updateTrsf (aTrsf); if (!myContext.IsNull())
{
myContext->SetLocation (myObject, aTrsf);
invalidateViewer();
}
else
{
myObject->SetLocalTransformation (aTrsf);
}
}
//=============================================================================
//function : invalidateViewer
//purpose :
//=============================================================================
void AIS_AnimationObject::invalidateViewer()
{
if (myContext.IsNull())
{
return;
}
const Standard_Boolean isImmediate = myContext->CurrentViewer()->ZLayerSettings (myObject->ZLayer()).IsImmediate();
if (!isImmediate)
{
myContext->CurrentViewer()->Invalidate();
return;
}
// Invalidate immediate view only if it is going out of z-fit range.
// This might be sub-optimal performing this for each animated objects in case of many animated objects.
for (V3d_ListOfView::Iterator aDefViewIter = myContext->CurrentViewer()->DefinedViewIterator();
aDefViewIter.More(); aDefViewIter.Next())
{
const Handle(V3d_View)& aView = aDefViewIter.Value();
const Bnd_Box aMinMaxBox = aView->View()->MinMaxValues (Standard_False);
const Bnd_Box aGraphicBox = aView->View()->MinMaxValues (Standard_True);
Standard_Real aZNear = 0.0;
Standard_Real aZFar = 0.0;
if (aView->Camera()->ZFitAll (aDefViewIter.Value()->AutoZFitScaleFactor(), aMinMaxBox, aGraphicBox, aZNear, aZFar))
{
if (aZNear < aView->Camera()->ZNear()
|| aZFar > aView->Camera()->ZFar())
{
aDefViewIter.Value()->Invalidate();
}
}
}
} }

View File

@@ -15,23 +15,24 @@
#ifndef _AIS_AnimationObject_HeaderFile #ifndef _AIS_AnimationObject_HeaderFile
#define _AIS_AnimationObject_HeaderFile #define _AIS_AnimationObject_HeaderFile
#include <AIS_BaseAnimationObject.hxx> #include <AIS_Animation.hxx>
#include <AIS_InteractiveContext.hxx>
#include <gp_TrsfNLerp.hxx> #include <gp_TrsfNLerp.hxx>
//! Animation defining object transformation. //! Animation defining object transformation.
class AIS_AnimationObject : public AIS_BaseAnimationObject class AIS_AnimationObject : public AIS_Animation
{ {
DEFINE_STANDARD_RTTIEXT(AIS_AnimationObject, AIS_BaseAnimationObject) DEFINE_STANDARD_RTTIEXT(AIS_AnimationObject, AIS_Animation)
public: public:
//! Constructor with initialization. //! Constructor with initialization.
//! Note that start/end transformations specify exactly local transformation of the object, //! Note that start/end transformations specify exactly local transformation of the object,
//! not the transformation to be applied to existing local transformation. //! not the transformation to be applied to existing local transformation.
//! @param[in] theAnimationName animation identifier //! @param theAnimationName animation identifier
//! @param[in] theContext interactive context where object have been displayed //! @param theContext interactive context where object have been displayed
//! @param[in] theObject object to apply local transformation //! @param theObject object to apply local transformation
//! @param[in] theTrsfStart local transformation at the start of animation (e.g. theObject->LocalTransformation()) //! @param theTrsfStart local transformation at the start of animation (e.g. theObject->LocalTransformation())
//! @param[in] theTrsfEnd local transformation at the end of animation //! @param theTrsfEnd local transformation at the end of animation
Standard_EXPORT AIS_AnimationObject (const TCollection_AsciiString& theAnimationName, Standard_EXPORT AIS_AnimationObject (const TCollection_AsciiString& theAnimationName,
const Handle(AIS_InteractiveContext)& theContext, const Handle(AIS_InteractiveContext)& theContext,
const Handle(AIS_InteractiveObject)& theObject, const Handle(AIS_InteractiveObject)& theObject,
@@ -43,10 +44,17 @@ protected:
//! Update the progress. //! Update the progress.
Standard_EXPORT virtual void update (const AIS_AnimationProgress& theProgress) Standard_OVERRIDE; Standard_EXPORT virtual void update (const AIS_AnimationProgress& theProgress) Standard_OVERRIDE;
private: //! Invalidate the viewer for proper update.
Standard_EXPORT void invalidateViewer();
gp_TrsfNLerp myTrsfLerp; //!< interpolation tool protected:
Handle(AIS_InteractiveContext) myContext; //!< context where object is displayed
Handle(AIS_InteractiveObject) myObject; //!< presentation object to set location
gp_TrsfNLerp myTrsfLerp; //!< interpolation tool
}; };
DEFINE_STANDARD_HANDLE(AIS_AnimationObject, AIS_Animation)
#endif // _AIS_AnimationObject_HeaderFile #endif // _AIS_AnimationObject_HeaderFile

View File

@@ -1,88 +0,0 @@
// Copyright (c) 2023 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <AIS_BaseAnimationObject.hxx>
#include <V3d_View.hxx>
IMPLEMENT_STANDARD_RTTIEXT(AIS_BaseAnimationObject, AIS_Animation)
//=============================================================================
//function : Constructor
//purpose :
//=============================================================================
AIS_BaseAnimationObject::AIS_BaseAnimationObject (const TCollection_AsciiString& theAnimationName,
const Handle(AIS_InteractiveContext)& theContext,
const Handle(AIS_InteractiveObject)& theObject)
: AIS_Animation (theAnimationName),
myContext (theContext),
myObject (theObject)
{
//
}
//=============================================================================
//function : updateTrsf
//purpose :
//=============================================================================
void AIS_BaseAnimationObject::updateTrsf (const gp_Trsf& theTrsf)
{
if (!myContext.IsNull())
{
myContext->SetLocation (myObject, theTrsf);
invalidateViewer();
}
else
{
myObject->SetLocalTransformation (theTrsf);
}
}
//=============================================================================
//function : invalidateViewer
//purpose :
//=============================================================================
void AIS_BaseAnimationObject::invalidateViewer()
{
if (myContext.IsNull())
{
return;
}
const Standard_Boolean isImmediate = myContext->CurrentViewer()->ZLayerSettings (myObject->ZLayer()).IsImmediate();
if (!isImmediate)
{
myContext->CurrentViewer()->Invalidate();
return;
}
// Invalidate immediate view only if it is going out of z-fit range.
// This might be sub-optimal performing this for each animated objects in case of many animated objects.
for (V3d_ListOfView::Iterator aDefViewIter = myContext->CurrentViewer()->DefinedViewIterator();
aDefViewIter.More(); aDefViewIter.Next())
{
const Handle(V3d_View)& aView = aDefViewIter.Value();
const Bnd_Box aMinMaxBox = aView->View()->MinMaxValues (Standard_False);
const Bnd_Box aGraphicBox = aView->View()->MinMaxValues (Standard_True);
Standard_Real aZNear = 0.0;
Standard_Real aZFar = 0.0;
if (aView->Camera()->ZFitAll (aDefViewIter.Value()->AutoZFitScaleFactor(), aMinMaxBox, aGraphicBox, aZNear, aZFar))
{
if (aZNear < aView->Camera()->ZNear()
|| aZFar > aView->Camera()->ZFar())
{
aDefViewIter.Value()->Invalidate();
}
}
}
}

View File

@@ -1,49 +0,0 @@
// Copyright (c) 2023 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _AIS_BaseAnimationObject_HeaderFile
#define _AIS_BaseAnimationObject_HeaderFile
#include <AIS_Animation.hxx>
#include <AIS_InteractiveContext.hxx>
//! Animation defining object transformation.
class AIS_BaseAnimationObject : public AIS_Animation
{
DEFINE_STANDARD_RTTIEXT(AIS_BaseAnimationObject, AIS_Animation)
protected:
//! Constructor with initialization.
//! @param[in] theAnimationName animation identifier
//! @param[in] theContext interactive context where object have been displayed
//! @param[in] theObject object to apply local transformation
Standard_EXPORT AIS_BaseAnimationObject (const TCollection_AsciiString& theAnimationName,
const Handle(AIS_InteractiveContext)& theContext,
const Handle(AIS_InteractiveObject)& theObject);
//! Update the transformation.
Standard_EXPORT void updateTrsf (const gp_Trsf& theTrsf);
private:
//! Invalidate the viewer for proper update.
Standard_EXPORT void invalidateViewer();
protected:
Handle(AIS_InteractiveContext) myContext; //!< context where object is displayed
Handle(AIS_InteractiveObject) myObject; //!< presentation object to set location
};
#endif // _AIS_BaseAnimationObject_HeaderFile

View File

@@ -1116,23 +1116,18 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
const Standard_Integer theMode) const Standard_Integer theMode)
{ {
//Check mode //Check mode
const AIS_ManipulatorMode aMode = (AIS_ManipulatorMode) theMode; AIS_ManipulatorMode aMode = (AIS_ManipulatorMode) theMode;
if (aMode == AIS_MM_None) if (aMode == AIS_MM_None)
{ {
return; return;
} }
Handle(SelectMgr_EntityOwner) anOwner; Handle(SelectMgr_EntityOwner) anOwner;
if (aMode == AIS_MM_None)
// Sensitivity calculation for manipulator parts allows to avoid
// overlapping of sensitive areas when size of manipulator is small.
// Sensitivity is calculated relative to the default size of the manipulator (100.0f).
const Standard_ShortReal aSensitivityCoef = myAxes[0].Size() / 100.0f;
const Standard_Integer aHighSensitivity = Max (Min (RealToInt (aSensitivityCoef * 15), 15), 3); // clamp sensitivity within range [3, 15]
const Standard_Integer aLowSensitivity = Max (Min (RealToInt (aSensitivityCoef * 10), 10), 2); // clamp sensitivity within range [2, 10]
switch (aMode)
{ {
case AIS_MM_Translation: anOwner = new SelectMgr_EntityOwner (this, 5);
}
if (aMode == AIS_MM_Translation || aMode == AIS_MM_None)
{ {
for (Standard_Integer anIt = 0; anIt < 3; ++anIt) for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{ {
@@ -1141,21 +1136,23 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
continue; continue;
} }
const Axis& anAxis = myAxes[anIt]; const Axis& anAxis = myAxes[anIt];
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Translation, 9); if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Translation, 9);
}
// define sensitivity by line // define sensitivity by line
Handle(Select3D_SensitiveSegment) aLine = new Select3D_SensitiveSegment(anOwner, gp::Origin(), anAxis.TranslatorTipPosition()); Handle(Select3D_SensitiveSegment) aLine = new Select3D_SensitiveSegment (anOwner, gp::Origin(), anAxis.TranslatorTipPosition());
aLine->SetSensitivityFactor (aHighSensitivity); aLine->SetSensitivityFactor (15);
theSelection->Add (aLine); theSelection->Add (aLine);
// enlarge sensitivity by triangulation // enlarge sensitivity by triangulation
Handle(Select3D_SensitivePrimitiveArray) aTri = new Select3D_SensitivePrimitiveArray(anOwner); Handle(Select3D_SensitivePrimitiveArray) aTri = new Select3D_SensitivePrimitiveArray (anOwner);
aTri->InitTriangulation (anAxis.TriangleArray()->Attributes(), anAxis.TriangleArray()->Indices(), TopLoc_Location()); aTri->InitTriangulation (anAxis.TriangleArray()->Attributes(), anAxis.TriangleArray()->Indices(), TopLoc_Location());
theSelection->Add (aTri); theSelection->Add (aTri);
} }
break;
} }
case AIS_MM_Rotation:
if (aMode == AIS_MM_Rotation || aMode == AIS_MM_None)
{ {
for (Standard_Integer anIt = 0; anIt < 3; ++anIt) for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{ {
@@ -1164,20 +1161,22 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
continue; continue;
} }
const Axis& anAxis = myAxes[anIt]; const Axis& anAxis = myAxes[anIt];
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Rotation, 9); if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Rotation, 9);
}
// define sensitivity by circle // define sensitivity by circle
const gp_Circ aGeomCircle (gp_Ax2(gp::Origin(), anAxis.ReferenceAxis().Direction()), anAxis.RotatorDiskRadius()); const gp_Circ aGeomCircle (gp_Ax2 (gp::Origin(), anAxis.ReferenceAxis().Direction()), anAxis.RotatorDiskRadius());
Handle(Select3D_SensitiveCircle) aCircle = new ManipSensCircle(anOwner, aGeomCircle); Handle(Select3D_SensitiveCircle) aCircle = new ManipSensCircle (anOwner, aGeomCircle);
aCircle->SetSensitivityFactor (aLowSensitivity); aCircle->SetSensitivityFactor (15);
theSelection->Add(aCircle); theSelection->Add (aCircle);
// enlarge sensitivity by triangulation // enlarge sensitivity by triangulation
Handle(Select3D_SensitiveTriangulation) aTri = new ManipSensTriangulation(anOwner, myAxes[anIt].RotatorDisk().Triangulation(), anAxis.ReferenceAxis().Direction()); Handle(Select3D_SensitiveTriangulation) aTri = new ManipSensTriangulation (anOwner, myAxes[anIt].RotatorDisk().Triangulation(), anAxis.ReferenceAxis().Direction());
theSelection->Add (aTri); theSelection->Add (aTri);
} }
break;
} }
case AIS_MM_Scaling:
if (aMode == AIS_MM_Scaling || aMode == AIS_MM_None)
{ {
for (Standard_Integer anIt = 0; anIt < 3; ++anIt) for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{ {
@@ -1185,19 +1184,21 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
{ {
continue; continue;
} }
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Scaling, 9); if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Scaling, 9);
}
// define sensitivity by point // define sensitivity by point
Handle(Select3D_SensitivePoint) aPnt = new Select3D_SensitivePoint(anOwner, myAxes[anIt].ScalerCubePosition()); Handle(Select3D_SensitivePoint) aPnt = new Select3D_SensitivePoint (anOwner, myAxes[anIt].ScalerCubePosition());
aPnt->SetSensitivityFactor (aHighSensitivity); aPnt->SetSensitivityFactor (15);
theSelection->Add (aPnt); theSelection->Add (aPnt);
// enlarge sensitivity by triangulation // enlarge sensitivity by triangulation
Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].ScalerCube().Triangulation(), TopLoc_Location(), Standard_True); Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation (anOwner, myAxes[anIt].ScalerCube().Triangulation(), TopLoc_Location(), Standard_True);
theSelection->Add (aTri); theSelection->Add (aTri);
} }
break;
} }
case AIS_MM_TranslationPlane:
if (aMode == AIS_MM_TranslationPlane || aMode == AIS_MM_None)
{ {
for (Standard_Integer anIt = 0; anIt < 3; ++anIt) for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{ {
@@ -1205,33 +1206,28 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
{ {
continue; continue;
} }
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9); if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9);
}
// define sensitivity by two crossed lines // define sensitivity by two crossed lines
Standard_Real aSensitivityOffset = ZoomPersistence() ? aHighSensitivity * (0.5 + M_SQRT2) : 0.0; gp_Pnt aP1, aP2;
gp_Pnt aP1 = myAxes[((anIt + 1) % 3)].TranslatorTipPosition().Translated (myAxes[((anIt + 2) % 3)].ReferenceAxis().Direction().XYZ() * aSensitivityOffset); aP1 = myAxes[((anIt + 1) % 3)].TranslatorTipPosition();
gp_Pnt aP2 = myAxes[((anIt + 2) % 3)].TranslatorTipPosition().Translated (myAxes[((anIt + 1) % 3)].ReferenceAxis().Direction().XYZ() * aSensitivityOffset); aP2 = myAxes[((anIt + 2) % 3)].TranslatorTipPosition();
gp_XYZ aMidP = (aP1.XYZ() + aP2.XYZ()) / 2.0; gp_XYZ aMidP = (aP1.XYZ() + aP2.XYZ()) / 2.0;
gp_XYZ anOrig = aMidP.Normalized().Multiplied (aSensitivityOffset);
Handle(Select3D_SensitiveSegment) aLine1 = new Select3D_SensitiveSegment(anOwner, aP1, aP2); Handle(Select3D_SensitiveSegment) aLine1 = new Select3D_SensitiveSegment(anOwner, aP1, aP2);
aLine1->SetSensitivityFactor(aLowSensitivity); aLine1->SetSensitivityFactor(10);
theSelection->Add (aLine1); theSelection->Add(aLine1);
Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, anOrig, aMidP); Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, gp::Origin(), aMidP);
aLine2->SetSensitivityFactor (aLowSensitivity); aLine2->SetSensitivityFactor(10);
theSelection->Add (aLine2); theSelection->Add(aLine2);
// enlarge sensitivity by triangulation // enlarge sensitivity by triangulation
Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].DraggerSector().Triangulation(), TopLoc_Location(), Standard_True); Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].DraggerSector().Triangulation(), TopLoc_Location(), Standard_True);
theSelection->Add (aTri); theSelection->Add(aTri);
} }
break;
}
default:
{
anOwner = new SelectMgr_EntityOwner(this, 5);
break;
}
} }
} }

View File

@@ -2,8 +2,6 @@ AIS.hxx
AIS_Animation.cxx AIS_Animation.cxx
AIS_Animation.hxx AIS_Animation.hxx
AIS_AnimationTimer.hxx AIS_AnimationTimer.hxx
AIS_AnimationAxisRotation.cxx
AIS_AnimationAxisRotation.hxx
AIS_AnimationCamera.cxx AIS_AnimationCamera.cxx
AIS_AnimationCamera.hxx AIS_AnimationCamera.hxx
AIS_AnimationObject.cxx AIS_AnimationObject.cxx
@@ -14,8 +12,6 @@ AIS_Axis.cxx
AIS_Axis.hxx AIS_Axis.hxx
AIS_BadEdgeFilter.cxx AIS_BadEdgeFilter.cxx
AIS_BadEdgeFilter.hxx AIS_BadEdgeFilter.hxx
AIS_BaseAnimationObject.cxx
AIS_BaseAnimationObject.hxx
AIS_C0RegularityFilter.cxx AIS_C0RegularityFilter.cxx
AIS_C0RegularityFilter.hxx AIS_C0RegularityFilter.hxx
AIS_CameraFrustum.cxx AIS_CameraFrustum.cxx

View File

@@ -248,178 +248,167 @@ void BOPAlgo_ShellSplitter::SplitBlock(BOPTools_ConnexityBlock& aCB)
// //
// Build the shells // Build the shells
aItF.Initialize (aLFConnected); aItF.Initialize (aLFConnected);
for (i = 1; aItF.More() && !bAllFacesTaken; aItF.Next(), ++i) for (i = 1; aItF.More() && !bAllFacesTaken; aItF.Next(), ++i) {
{
const TopoDS_Shape& aFF = aItF.Value(); const TopoDS_Shape& aFF = aItF.Value();
if (!AddedFacesMap.Add(aFF)) { if (!AddedFacesMap.Add(aFF)) {
continue; continue;
} }
// //
// make a new shell // make a new shell
TopoDS_Shell aShell; TopoDS_Shell aShellStart;
aBB.MakeShell(aShell); aBB.MakeShell(aShellStart);
aBB.Add(aShell, aFF); aBB.Add(aShellStart, aFF);
aMEFP.Clear();
TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEFP);
// //
// loop on faces added to Shell; TopTools_ListOfShape aLShells;
// add their neighbor faces to Shell and so on aLShells.Append(aShellStart);
aItS.Initialize(aShell); //
for (; aItS.More(); aItS.Next()) { TopTools_ListIteratorOfListOfShape aItLShells(aLShells);
const TopoDS_Face& aF = (*(TopoDS_Face*)(&aItS.Value())); for (; aItLShells.More(); aItLShells.Next()) {
Standard_Boolean isBoundary = aBoundaryFaces.Contains (aF); TopoDS_Shell& aShell = TopoDS::Shell(aItLShells.ChangeValue());
// //
// loop on edges of aF; find a good neighbor face of aF by aE aMEFP.Clear();
aExp.Init(aF, TopAbs_EDGE); TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEFP);
for (; aExp.More(); aExp.Next()) { //
const TopoDS_Edge& aE = (*(TopoDS_Edge*)(&aExp.Current())); // loop on faces added to Shell;
// add their neighbor faces to Shell and so on
aItS.Initialize(aShell);
for (; aItS.More(); aItS.Next()) {
const TopoDS_Face& aF = (*(TopoDS_Face*)(&aItS.Value()));
Standard_Boolean isBoundary = aBoundaryFaces.Contains (aF);
// //
// proceed only free edges in this shell // loop on edges of aF; find a good neighbor face of aF by aE
if (aMEFP.Contains(aE)) { aExp.Init(aF, TopAbs_EDGE);
const TopTools_ListOfShape& aLFP = aMEFP.FindFromKey(aE); for (; aExp.More(); aExp.Next()) {
aNbFP = aLFP.Extent(); const TopoDS_Edge& aE = (*(TopoDS_Edge*)(&aExp.Current()));
if (aNbFP > 1) { //
// proceed only free edges in this shell
if (aMEFP.Contains(aE)) {
const TopTools_ListOfShape& aLFP = aMEFP.FindFromKey(aE);
aNbFP = aLFP.Extent();
if (aNbFP > 1) {
continue;
}
}
// avoid processing of internal edges
anOr = aE.Orientation();
if (anOr == TopAbs_INTERNAL) {
continue; continue;
} }
} // avoid processing of degenerated edges
// avoid processing of internal edges if (BRep_Tool::Degenerated(aE)) {
anOr = aE.Orientation();
if (anOr == TopAbs_INTERNAL) {
continue;
}
// avoid processing of degenerated edges
if (BRep_Tool::Degenerated(aE)) {
continue;
}
//
// candidate faces list
const TopTools_ListOfShape& aLF = aEFMap.FindFromKey(aE);
aNbLF = aLF.Extent();
if (!aNbLF) {
continue;
}
//
// prepare for selecting the next face
// take only not-processed faces as a candidates
BOPTools_ListOfCoupleOfShape aLCSOff;
//
Standard_Integer aNbWaysInside = 0;
TopoDS_Face aSelF;
TopTools_ListIteratorOfListOfShape aItLF(aLF);
for (; aItLF.More(); aItLF.Next()) {
const TopoDS_Face& aFL = (*(TopoDS_Face*)(&aItLF.Value()));
if (aF.IsSame(aFL) || AddedFacesMap.Contains(aFL)) {
continue; continue;
} }
// //
// find current edge in the face // candidate faces list
if (!BOPTools_AlgoTools::GetEdgeOff(aE, aFL, aEL)) { const TopTools_ListOfShape& aLF = aEFMap.FindFromKey(aE);
aNbLF = aLF.Extent();
if (!aNbLF) {
continue; continue;
} }
// //
if (isBoundary && !aBoundaryFaces.Contains (aFL)) // prepare for selecting the next face
// take only not-processed faces as a candidates
BOPTools_ListOfCoupleOfShape aLCSOff;
//
Standard_Integer aNbWaysInside = 0;
TopoDS_Face aSelF;
TopTools_ListIteratorOfListOfShape aItLF(aLF);
for (; aItLF.More(); aItLF.Next()) {
const TopoDS_Face& aFL = (*(TopoDS_Face*)(&aItLF.Value()));
if (aF.IsSame(aFL) || AddedFacesMap.Contains(aFL)) {
continue;
}
//
// find current edge in the face
if (!BOPTools_AlgoTools::GetEdgeOff(aE, aFL, aEL)) {
continue;
}
//
if (isBoundary && !aBoundaryFaces.Contains (aFL))
{
++aNbWaysInside;
aSelF = aFL;
}
aCSOff.SetShape1(aEL);
aCSOff.SetShape2(aFL);
aLCSOff.Append(aCSOff);
}//for (; aItLF.More(); aItLF.Next()) {
//
aNbOff = aLCSOff.Extent();
if (!aNbOff){
continue;
}
//
// among all the adjacent faces chose one with the minimal
// angle to the current one
if (!isBoundary || aNbWaysInside != 1)
{ {
++aNbWaysInside; if (aNbOff == 1) {
aSelF = aFL; aSelF = (*(TopoDS_Face*)(&aLCSOff.First().Shape2()));
}
else if (aNbOff > 1) {
BOPTools_AlgoTools::GetFaceOff(aE, aF, aLCSOff, aSelF, aContext);
}
} }
aCSOff.SetShape1(aEL); //
aCSOff.SetShape2(aFL); if (!aSelF.IsNull() && AddedFacesMap.Add(aSelF)) {
aLCSOff.Append(aCSOff); aBB.Add(aShell, aSelF);
}//for (; aItLF.More(); aItLF.Next()) { TopExp::MapShapesAndAncestors(aSelF, TopAbs_EDGE, TopAbs_FACE, aMEFP);
//
aNbOff = aLCSOff.Extent();
if (!aNbOff){
continue;
}
//
// among all the adjacent faces chose one with the minimal
// angle to the current one
if (!isBoundary || aNbWaysInside != 1)
{
if (aNbOff == 1) {
aSelF = (*(TopoDS_Face*)(&aLCSOff.First().Shape2()));
} }
else if (aNbOff > 1) { } // for (; aExp.More(); aExp.Next()) {
BOPTools_AlgoTools::GetFaceOff(aE, aF, aLCSOff, aSelF, aContext); } // for (; aItS.More(); aItS.Next()) {
}
}
//
if (!aSelF.IsNull() && AddedFacesMap.Add(aSelF)) {
aBB.Add(aShell, aSelF);
TopExp::MapShapesAndAncestors(aSelF, TopAbs_EDGE, TopAbs_FACE, aMEFP);
}
} // for (; aExp.More(); aExp.Next()) {
} // for (; aItS.More(); aItS.Next()) {
//
// split the shell on multi-connected edges
TopTools_ListOfShape aLShSp;
RefineShell(aShell, aMEFP, aLShSp);
//
// collect the not closed shells for further processing
TopTools_ListOfShape aLShNC;
//
TopTools_ListIteratorOfListOfShape aItLShSp(aLShSp);
for (; aItLShSp.More(); aItLShSp.Next()) {
TopoDS_Shell& aShSp = *((TopoDS_Shell*)&aItLShSp.Value());
// //
if (BRep_Tool::IsClosed(aShSp)) { // split the shell on multi-connected edges
aShSp.Closed(Standard_True); TopTools_ListOfShape aLShSp;
myLoops.Append(aShSp); RefineShell(aShell, aMEFP, aLShSp);
//
// collect the not closed shells for further processing
TopTools_ListOfShape aLShNC;
//
TopTools_ListIteratorOfListOfShape aItLShSp(aLShSp);
for (; aItLShSp.More(); aItLShSp.Next()) {
TopoDS_Shell& aShSp = *((TopoDS_Shell*)&aItLShSp.Value());
//
if (BRep_Tool::IsClosed(aShSp)) {
aShSp.Closed(Standard_True);
myLoops.Append(aShSp);
}
else {
aLShNC.Append(aShSp);
}
} }
else { //
aLShNC.Append(aShSp); bAllFacesTaken = (AddedFacesMap.Extent() == aNbShapes);
if (bAllFacesTaken) {
break;
} }
} //
// if (aLShSp.Extent() == 1) {
bAllFacesTaken = (AddedFacesMap.Extent() == aNbShapes); // not further processing of not closed shells is needed,
if (bAllFacesTaken) { // as it will not bring any new results
break; continue;
} }
// //
if (aLShSp.Extent() == 1) { Standard_Integer aNbShNC = aLShNC.Extent();
// not further processing of not closed shells is needed, if (aNbShNC == 1) {
// as it will not bring any new results // try to complete the shell with other faces
continue; aLShells.Append(aLShNC);
} }
// else if (aNbShNC > 1) {
// remove th faces of not closed shells from the map of processed faces
// remove th faces of not closed shells from the map of processed faces // and try to rebuild the shells using all not processed faces,
// and try to rebuild the shells using all not processed faces, // because faces of one shell might be needed for building the other
// because faces of one shell might be needed for building the other TopTools_ListIteratorOfListOfShape aItLShNC(aLShNC);
TopTools_ListIteratorOfListOfShape aItLShNC(aLShNC); for (; aItLShNC.More(); aItLShNC.Next()) {
for (; aItLShNC.More(); aItLShNC.Next()) TopoDS_Iterator aItNC(aItLShNC.Value());
{ for (; aItNC.More(); aItNC.Next()) {
TopoDS_Iterator aItNC(aItLShNC.Value()); AddedFacesMap.Remove(aItNC.Value());
for (; aItNC.More(); aItNC.Next()) }
{ }
AddedFacesMap.Remove(aItNC.Value());
} }
} }
} // for (; aItF.More(); aItF.Next()) { } // for (; aItF.More(); aItF.Next()) {
} }
//=======================================================================
//function : FindShape
//purpose :
//=======================================================================
TopoDS_Shape FindShape (const TopoDS_Shape& theShapeToFind,
const TopoDS_Shape& theShape)
{
TopoDS_Shape aRes;
TopExp_Explorer anExp(theShape, theShapeToFind.ShapeType());
for (; anExp.More(); anExp.Next())
{
const TopoDS_Shape& aShape = anExp.Current();
if (aShape.IsSame(theShapeToFind))
{
aRes = aShape;
break;
}
}
return aRes;
}
//======================================================================= //=======================================================================
//function : RefineShell //function : RefineShell
//purpose : //purpose :
@@ -445,21 +434,6 @@ void RefineShell(TopoDS_Shell& theShell,
aMEStop.Add(aE); aMEStop.Add(aE);
continue; continue;
} }
if (aLF.Extent() == 2)
{
const TopoDS_Face& aF1 = TopoDS::Face(aLF.First());
const TopoDS_Face& aF2 = TopoDS::Face(aLF.Last());
TopoDS_Shape aE1 = FindShape(aE, aF1);
TopoDS_Shape aE2 = FindShape(aE, aF2);
if (aE1.Orientation() == aE2.Orientation())
{
aMEStop.Add(aE);
continue;
}
}
// //
// check for internal edges - count faces, in which the edge // check for internal edges - count faces, in which the edge
// is internal, twice // is internal, twice

View File

@@ -60,7 +60,7 @@ public: //! @name public interfaces
//! Clears the indices //! Clears the indices
void Clear() void Clear()
{ {
myPairs.clear(); myPairs.Clear();
} }
//! Sorts the indices //! Sorts the indices

View File

@@ -127,14 +127,6 @@ void BRepBndLib::Add(const TopoDS_Shape& S, Bnd_Box& B, Standard_Boolean useTria
for (ex.Init(S,TopAbs_EDGE,TopAbs_FACE); ex.More(); ex.Next()) for (ex.Init(S,TopAbs_EDGE,TopAbs_FACE); ex.More(); ex.Next())
{ {
const TopoDS_Edge& E = TopoDS::Edge(ex.Current()); const TopoDS_Edge& E = TopoDS::Edge(ex.Current());
if (!useTriangulation && BRep_Tool::IsGeometric(E))
{
BC.Initialize(E);
BndLib_Add3dCurve::Add(BC, BRep_Tool::Tolerance(E), B);
continue;
}
Handle(Poly_Polygon3D) P3d = BRep_Tool::Polygon3D(E, l); Handle(Poly_Polygon3D) P3d = BRep_Tool::Polygon3D(E, l);
if (!P3d.IsNull() && P3d->NbNodes() > 0) if (!P3d.IsNull() && P3d->NbNodes() > 0)
{ {
@@ -151,7 +143,7 @@ void BRepBndLib::Add(const TopoDS_Shape& S, Bnd_Box& B, Standard_Boolean useTria
else else
{ {
BRep_Tool::PolygonOnTriangulation(E, Poly, T, l); BRep_Tool::PolygonOnTriangulation(E, Poly, T, l);
if (!Poly.IsNull() && !T.IsNull() && T->NbNodes() > 0) if (useTriangulation && !Poly.IsNull() && !T.IsNull() && T->NbNodes() > 0)
{ {
const TColStd_Array1OfInteger& Indices = Poly->Nodes(); const TColStd_Array1OfInteger& Indices = Poly->Nodes();
nbNodes = Indices.Length(); nbNodes = Indices.Length();

View File

@@ -351,10 +351,6 @@ static void TrimEdge (const TopoDS_Edge& CurrentEdge,
for (j=1; j<=ndec; j++) { for (j=1; j<=ndec; j++) {
// piece of edge // piece of edge
m1 = (CutValues.Value(j)-t0)*(last-first)/(t1-t0)+first; m1 = (CutValues.Value(j)-t0)*(last-first)/(t1-t0)+first;
if (Abs(m0 - m1) < Precision::Confusion())
{
return;
}
TopoDS_Edge CutE = BRepLib_MakeEdge(C,V0,Vbid,m0,m1); TopoDS_Edge CutE = BRepLib_MakeEdge(C,V0,Vbid,m0,m1);
CutE.Orientation(CurrentOrient); CutE.Orientation(CurrentOrient);
S.Append(CutE); S.Append(CutE);
@@ -362,10 +358,6 @@ static void TrimEdge (const TopoDS_Edge& CurrentEdge,
V0 = TopExp::LastVertex(CutE); V0 = TopExp::LastVertex(CutE);
if (j==ndec) { if (j==ndec) {
// last piece // last piece
if (Abs(m0 - last) < Precision::Confusion())
{
return;
}
TopoDS_Edge LastE = BRepLib_MakeEdge(C,V0,Vl,m0,last); TopoDS_Edge LastE = BRepLib_MakeEdge(C,V0,Vl,m0,last);
LastE.Orientation(CurrentOrient); LastE.Orientation(CurrentOrient);
S.Append(LastE); S.Append(LastE);
@@ -379,10 +371,6 @@ static void TrimEdge (const TopoDS_Edge& CurrentEdge,
for (j=ndec; j>=1; j--) { for (j=ndec; j>=1; j--) {
// piece of edge // piece of edge
m0 = (CutValues.Value(j)-t0)*(last-first)/(t1-t0)+first; m0 = (CutValues.Value(j)-t0)*(last-first)/(t1-t0)+first;
if (Abs(m0 - m1) < Precision::Confusion())
{
return;
}
TopoDS_Edge CutE = BRepLib_MakeEdge(C,Vbid,V1,m0,m1); TopoDS_Edge CutE = BRepLib_MakeEdge(C,Vbid,V1,m0,m1);
CutE.Orientation(CurrentOrient); CutE.Orientation(CurrentOrient);
S.Append(CutE); S.Append(CutE);
@@ -390,10 +378,6 @@ static void TrimEdge (const TopoDS_Edge& CurrentEdge,
V1 = TopExp::FirstVertex(CutE); V1 = TopExp::FirstVertex(CutE);
if (j==1) { if (j==1) {
// last piece // last piece
if (Abs(first - m1) < Precision::Confusion())
{
return;
}
TopoDS_Edge LastE = BRepLib_MakeEdge(C,Vf,V1,first,m1); TopoDS_Edge LastE = BRepLib_MakeEdge(C,Vf,V1,first,m1);
LastE.Orientation(CurrentOrient); LastE.Orientation(CurrentOrient);
S.Append(LastE); S.Append(LastE);
@@ -563,10 +547,6 @@ static Standard_Boolean EdgeIntersectOnWire (const gp_Pnt& P1,
SR.Clear(); SR.Clear();
SR.Append(param); SR.Append(param);
TrimEdge(E,SR,first,last,SO,SE); TrimEdge(E,SR,first,last,SO,SE);
if (SE.IsEmpty())
{
return Standard_False;
}
theEdgeNewEdges(E) = SE; theEdgeNewEdges(E) = SE;
TopoDS_Vertex VV1,VV2; TopoDS_Vertex VV1,VV2;
TopExp::Vertices(TopoDS::Edge(SE.Value(1)),VV1,VV2); TopExp::Vertices(TopoDS::Edge(SE.Value(1)),VV1,VV2);
@@ -701,7 +681,7 @@ void BRepFill_CompatibleWires::Init(const TopTools_SequenceOfShape& Sections)
{ {
myInit = Sections; myInit = Sections;
myWork = Sections; myWork = Sections;
myPercent = 0.1; myPercent = 0.01;
myStatus = BRepFill_ThruSectionErrorStatus_NotDone; myStatus = BRepFill_ThruSectionErrorStatus_NotDone;
myMap.Clear(); myMap.Clear();

View File

@@ -41,7 +41,6 @@
#include <TopoDS_Vertex.hxx> #include <TopoDS_Vertex.hxx>
#include <TopTools_MapOfShape.hxx> #include <TopTools_MapOfShape.hxx>
#include <ChFi3d.hxx> #include <ChFi3d.hxx>
#include <LocalAnalysis_SurfaceContinuity.hxx>
static void CorrectOrientationOfTangent(gp_Vec& TangVec, static void CorrectOrientationOfTangent(gp_Vec& TangVec,
const TopoDS_Vertex& aVertex, const TopoDS_Vertex& aVertex,
@@ -51,12 +50,6 @@ static void CorrectOrientationOfTangent(gp_Vec& TangVec,
if (aVertex.IsSame(Vlast)) if (aVertex.IsSame(Vlast))
TangVec.Reverse(); TangVec.Reverse();
} }
static Standard_Boolean CheckMixedContinuity (const TopoDS_Edge& theEdge,
const TopoDS_Face& theFace1,
const TopoDS_Face& theFace2,
const Standard_Real theAngTol);
//======================================================================= //=======================================================================
//function : BRepOffset_Analyse //function : BRepOffset_Analyse
//purpose : //purpose :
@@ -112,168 +105,15 @@ static void EdgeAnalyse(const TopoDS_Edge& E,
} }
else else
{ {
Standard_Boolean isTwoSplines = (aSurfType1 == GeomAbs_BSplineSurface || aSurfType1 == GeomAbs_BezierSurface) && if (ChFi3d::IsTangentFaces(E, F1, F2)) //weak condition
(aSurfType2 == GeomAbs_BSplineSurface || aSurfType2 == GeomAbs_BezierSurface); ConnectType = ChFiDS_Tangential;
Standard_Boolean isMixedConcavity = Standard_False;
if (isTwoSplines)
{
Standard_Real anAngTol = 0.1;
isMixedConcavity = CheckMixedContinuity(E, F1, F2, anAngTol);
}
if (!isMixedConcavity)
{
if (ChFi3d::IsTangentFaces(E, F1, F2)) //weak condition
{
ConnectType = ChFiDS_Tangential;
}
else
{
ConnectType = ChFi3d::DefineConnectType(E, F1, F2, SinTol, Standard_False);
}
}
else else
{ ConnectType = ChFi3d::DefineConnectType(E, F1, F2, SinTol, Standard_False);
ConnectType = ChFiDS_Mixed;
}
} }
I.Type(ConnectType); I.Type(ConnectType);
LI.Append(I); LI.Append(I);
} }
//=======================================================================
//function : CheckMixedConcavity
//purpose :
//=======================================================================
Standard_Boolean CheckMixedContinuity (const TopoDS_Edge& theEdge,
const TopoDS_Face& theFace1,
const TopoDS_Face& theFace2,
const Standard_Real theAngTol)
{
Standard_Boolean aMixedCont = Standard_False;
GeomAbs_Shape aCurrOrder = BRep_Tool::Continuity(theEdge, theFace1, theFace2);
if (aCurrOrder > GeomAbs_C0)
{
//Method BRep_Tool::Continuity(...) always returns minimal continuity between faces
//so, if aCurrOrder > C0 it means that faces are tangent along whole edge.
return aMixedCont;
}
//But we caqnnot trust result, if it is C0. because this value set by default.
Standard_Real TolC0 = Max(0.001, 1.5*BRep_Tool::Tolerance(theEdge));
Standard_Real aFirst;
Standard_Real aLast;
Handle(Geom2d_Curve) aC2d1, aC2d2;
if (!theFace1.IsSame(theFace2) &&
BRep_Tool::IsClosed(theEdge, theFace1) &&
BRep_Tool::IsClosed(theEdge, theFace2))
{
//Find the edge in the face 1: this edge will have correct orientation
TopoDS_Edge anEdgeInFace1;
TopoDS_Face aFace1 = theFace1;
aFace1.Orientation(TopAbs_FORWARD);
TopExp_Explorer anExplo(aFace1, TopAbs_EDGE);
for (; anExplo.More(); anExplo.Next())
{
const TopoDS_Edge& anEdge = TopoDS::Edge(anExplo.Current());
if (anEdge.IsSame(theEdge))
{
anEdgeInFace1 = anEdge;
break;
}
}
if (anEdgeInFace1.IsNull())
{
return aMixedCont;
}
aC2d1 = BRep_Tool::CurveOnSurface(anEdgeInFace1, aFace1, aFirst, aLast);
TopoDS_Face aFace2 = theFace2;
aFace2.Orientation(TopAbs_FORWARD);
anEdgeInFace1.Reverse();
aC2d2 = BRep_Tool::CurveOnSurface(anEdgeInFace1, aFace2, aFirst, aLast);
}
else
{
// Obtaining of pcurves of edge on two faces.
aC2d1 = BRep_Tool::CurveOnSurface(theEdge, theFace1, aFirst, aLast);
//For the case of seam edge
TopoDS_Edge EE = theEdge;
if (theFace1.IsSame(theFace2))
{
EE.Reverse();
}
aC2d2 = BRep_Tool::CurveOnSurface(EE, theFace2, aFirst, aLast);
}
if (aC2d1.IsNull() || aC2d2.IsNull())
{
return aMixedCont;
}
// Obtaining of two surfaces from adjacent faces.
Handle(Geom_Surface) aSurf1 = BRep_Tool::Surface(theFace1);
Handle(Geom_Surface) aSurf2 = BRep_Tool::Surface(theFace2);
if (aSurf1.IsNull() || aSurf2.IsNull())
{
return aMixedCont;
}
Standard_Integer aNbSamples = 23;
// Computation of the continuity.
Standard_Real aPar;
Standard_Real aDelta = (aLast - aFirst) / (aNbSamples - 1);
Standard_Integer i, istart = 1;
Standard_Boolean isG1 = Standard_False;
for (i = 1, aPar = aFirst; i <= aNbSamples; i++, aPar += aDelta)
{
if (i == aNbSamples) aPar = aLast;
LocalAnalysis_SurfaceContinuity aCont(aC2d1, aC2d2, aPar,
aSurf1, aSurf2, GeomAbs_G1, 0.001, TolC0, theAngTol, theAngTol, theAngTol);
if (aCont.IsDone())
{
istart = i + 1;
isG1 = aCont.IsG1();
break;
}
}
if (istart > aNbSamples / 2)
{
return aMixedCont;
}
for (i = istart, aPar = aFirst; i <= aNbSamples; i++, aPar += aDelta)
{
if (i == aNbSamples) aPar = aLast;
LocalAnalysis_SurfaceContinuity aCont(aC2d1, aC2d2, aPar,
aSurf1, aSurf2, GeomAbs_G1, 0.001, TolC0, theAngTol, theAngTol, theAngTol);
if (!aCont.IsDone())
{
continue;
}
if (aCont.IsG1() == isG1)
{
continue;
}
else
{
aMixedCont = Standard_True;
break;
}
}
return aMixedCont;
}
//======================================================================= //=======================================================================
//function : BuildAncestors //function : BuildAncestors

View File

@@ -29,8 +29,7 @@ enum BRepOffset_Error
BRepOffset_CannotTrimEdges, //!< exception while trim edges BRepOffset_CannotTrimEdges, //!< exception while trim edges
BRepOffset_CannotFuseVertices, //!< exception while fuse vertices BRepOffset_CannotFuseVertices, //!< exception while fuse vertices
BRepOffset_CannotExtentEdge, //!< exception while extent edges BRepOffset_CannotExtentEdge, //!< exception while extent edges
BRepOffset_UserBreak, //!< user break BRepOffset_UserBreak //!< user break
BRepOffset_MixedConnectivity //!< Different connectivity of faces along edge: partially C0 and tangent
}; };
#endif // _BRepOffset_Error_HeaderFile #endif // _BRepOffset_Error_HeaderFile

View File

@@ -910,19 +910,6 @@ void BRepOffset_MakeOffset::MakeOffsetShape(const Message_ProgressRange& theRang
myAnalyse.SetFaceOffsetMap (myFaceOffset); myAnalyse.SetFaceOffsetMap (myFaceOffset);
} }
myAnalyse.Perform(myFaceComp,TolAngle, aPS.Next(aSteps(PIOperation_Analyse))); myAnalyse.Perform(myFaceComp,TolAngle, aPS.Next(aSteps(PIOperation_Analyse)));
TopExp_Explorer anEExp(myFaceComp, TopAbs_EDGE);
for (; anEExp.More(); anEExp.Next())
{
const TopoDS_Edge& anE = TopoDS::Edge(anEExp.Current());
const BRepOffset_ListOfInterval& aLI = myAnalyse.Type(anE);
if (aLI.IsEmpty())
continue;
if (aLI.Last().Type() == ChFiDS_Mixed)
{
myError = BRepOffset_MixedConnectivity;
return;
}
}
if (!aPS.More()) if (!aPS.More())
{ {
myError = BRepOffset_UserBreak; myError = BRepOffset_UserBreak;
@@ -2973,36 +2960,6 @@ void BRepOffset_MakeOffset::MakeMissingWalls (const Message_ProgressRange& theRa
TopExp::Vertices(anEdge, V1, V2); TopExp::Vertices(anEdge, V1, V2);
Standard_Real aF, aL; Standard_Real aF, aL;
const Handle(Geom_Curve) aC = BRep_Tool::Curve(anEdge, aF, aL); const Handle(Geom_Curve) aC = BRep_Tool::Curve(anEdge, aF, aL);
if (V3.IsNull() && V4.IsNull())
{
// Initially offset edge is created without vertices.
// Then edge is trimmed by intersection line between
// two adjacent extended offset faces and get vertices.
// When intersection lines are invalid for any reason,
// (one of reson is mixed connectivity of faces)
// algoritm of cutting offset edge by intersection line
// can fail and offset edge cannot get vertices.
// Follwing workaround is only to avoid exeption if V3 and V4 are Null
// Vertex points are invalid.
Standard_Real anOEF, anOEL;
TopAbs_Orientation anOEOri = OE.Orientation();
OE.Orientation(TopAbs_FORWARD);
Handle(Geom_Curve) anOEC = BRep_Tool::Curve(OE, anOEF, anOEL);
BRep_Builder aBB;
gp_Pnt aP1 = anOEC->Value(aF);
gp_Pnt aP2 = anOEC->Value(aL);
TopoDS_Vertex anOEV1, anOEV2;
Standard_Real aTol = Max(BRep_Tool::Tolerance(V1), BRep_Tool::Tolerance(V2));
aBB.MakeVertex(anOEV1, aP1, aTol);
anOEV1.Orientation(TopAbs_FORWARD);
aBB.MakeVertex(anOEV2, aP2, aTol);
anOEV2.Orientation(TopAbs_REVERSED);
aBB.Add(OE, anOEV1);
aBB.Add(OE, anOEV2);
aBB.Range(OE, aF, aL);
OE.Orientation(anOEOri);
TopExp::Vertices(OE, V4, V3);
}
if (!aC.IsNull() && if (!aC.IsNull() &&
(!aC->IsClosed() && !aC->IsPeriodic())) (!aC->IsClosed() && !aC->IsPeriodic()))
{ {

View File

@@ -5225,6 +5225,7 @@ void BRepOffset_BuildOffsetFaces::FilterInvalidEdges (const BRepOffset_DataMapOf
const TopTools_ListOfShape* pEOrigins = myOEOrigins.Seek (aE); const TopTools_ListOfShape* pEOrigins = myOEOrigins.Seek (aE);
if (!pEOrigins) if (!pEOrigins)
{ {
theMEUseInRebuild.Add (aE);
continue; continue;
} }
@@ -5392,29 +5393,6 @@ void BRepOffset_BuildOffsetFaces::FindFacesToRebuild()
} }
} }
namespace
{
//=======================================================================
//function : mapShapes
//purpose : Collect theVecShapes into theMap with setted theType
//=======================================================================
template<class Container>
static void mapShapes (const Container& theVecShapes,
const TopAbs_ShapeEnum theType,
TopTools_MapOfShape& theMap)
{
for (const auto& aShape : theVecShapes)
{
for (TopExp_Explorer anExp(aShape, theType); anExp.More(); anExp.Next())
{
theMap.Add(anExp.Current());
}
}
}
}
//======================================================================= //=======================================================================
//function : IntersectFaces //function : IntersectFaces
//purpose : Intersection of the faces that should be rebuild to resolve all invalidities //purpose : Intersection of the faces that should be rebuild to resolve all invalidities
@@ -5737,10 +5715,7 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
TopoDS_Compound aCBE; TopoDS_Compound aCBE;
aBB.MakeCompound (aCBE); aBB.MakeCompound (aCBE);
// //
// remember inside edges and vertices to further check TopExp_Explorer aExp (aCBInv, TopAbs_EDGE);
TopTools_MapOfShape anInsideEdges;
TopTools_MapOfShape anInsideVertices;
TopExp_Explorer aExp(aCBInv, TopAbs_EDGE);
for (; aExp.More(); aExp.Next()) for (; aExp.More(); aExp.Next())
{ {
const TopoDS_Shape& aE = aExp.Current(); const TopoDS_Shape& aE = aExp.Current();
@@ -5749,15 +5724,6 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
if (aMEFence.Add (aE)) if (aMEFence.Add (aE))
{ {
aBB.Add (aCBE, aE); aBB.Add (aCBE, aE);
if (!myEdgesToAvoid.Contains(aE) && myInvalidEdges.Contains(aE))
{
anInsideEdges.Add(aE);
TopoDS_Iterator anIt(aE);
for (; anIt.More(); anIt.Next())
{
anInsideVertices.Add(anIt.Value());
}
}
} }
} }
} }
@@ -5783,6 +5749,10 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
TopExp::MapShapes (aCBELoc, TopAbs_EDGE, aME); TopExp::MapShapes (aCBELoc, TopAbs_EDGE, aME);
aMECV = aME; aMECV = aME;
TopExp::MapShapes (aCBELoc, TopAbs_VERTEX, aME); TopExp::MapShapes (aCBELoc, TopAbs_VERTEX, aME);
//
// Using the map <aME> find chain of faces to be intersected;
//
// faces for intersection
TopTools_IndexedMapOfShape aMFInt; TopTools_IndexedMapOfShape aMFInt;
// additional faces for intersection // additional faces for intersection
TopTools_IndexedMapOfShape aMFIntExt; TopTools_IndexedMapOfShape aMFIntExt;
@@ -5831,14 +5801,6 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
if (pMFInter && !pInterFi) if (pMFInter && !pInterFi)
continue; continue;
// create map of edges and vertices for aLFImi
TopTools_MapOfShape aMEVIm;
mapShapes(*aLFImi, TopAbs_EDGE, aMEVIm);
mapShapes(*aLFImi, TopAbs_VERTEX, aMEVIm);
Standard_Boolean isIContainsE = aMEVIm.HasIntersection(anInsideEdges);
Standard_Boolean isIContainsV = aMEVIm.HasIntersection(anInsideVertices);
for (j = i + 1; j <= aNb; ++j) for (j = i + 1; j <= aNb; ++j)
{ {
const TopoDS_Face& aFj = TopoDS::Face (aMFInt (j)); const TopoDS_Face& aFj = TopoDS::Face (aMFInt (j));
@@ -5858,28 +5820,6 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
if (!aLFEj) if (!aLFEj)
continue; continue;
// create map of edges and vertices for aLFImi
aMEVIm.Clear();
mapShapes(*aLFImj, TopAbs_EDGE, aMEVIm);
mapShapes(*aLFImj, TopAbs_VERTEX, aMEVIm);
// check images of both faces contain anInsideEdges and anInsideVertices
// not process if false and true
Standard_Boolean isJContainsE = aMEVIm.HasIntersection(anInsideEdges);
Standard_Boolean isJContainsV = aMEVIm.HasIntersection(anInsideVertices);
// Check if one face is connected to inside edge then
// the other must be also connected
if ((isIContainsE && !isJContainsV) ||
(isJContainsE && !isIContainsV))
{
TopTools_ListOfShape aLVC;
// it is necessary to process the images if they already have
// common vertices
FindCommonParts(*aLFImi, *aLFImj, aLVC, TopAbs_VERTEX);
if (aLVC.IsEmpty())
continue;
}
// //
// if there are some common edges between faces // if there are some common edges between faces
// we should use these edges and do not intersect again. // we should use these edges and do not intersect again.

View File

@@ -281,11 +281,9 @@ static Standard_Integer mkedge(Draw_Interpretor& di, Standard_Integer n, const c
Handle(Geom_Curve) C = DrawTrSurf::GetCurve(a[2]); Handle(Geom_Curve) C = DrawTrSurf::GetCurve(a[2]);
Handle(Geom2d_Curve) C2d = DrawTrSurf::GetCurve2d(a[2]); Handle(Geom2d_Curve) C2d = DrawTrSurf::GetCurve2d(a[2]);
Handle(Poly_Polygon3D) P3d = DrawTrSurf::GetPolygon3D(a[2]); if (C.IsNull() && C2d.IsNull()) {
if (C.IsNull() && C2d.IsNull() && P3d.IsNull()) {
//std::cout << a[2] << " is not a curve" << std::endl; //std::cout << a[2] << " is not a curve" << std::endl;
di << a[2] << " is not a curve or polygon 3d\n"; di << a[2] << " is not a curve\n";
return 1; return 1;
} }
@@ -293,12 +291,7 @@ static Standard_Integer mkedge(Draw_Interpretor& di, Standard_Integer n, const c
if (n == 3) { if (n == 3) {
if (!C.IsNull()) edge = BRepBuilderAPI_MakeEdge(C); if (!C.IsNull()) edge = BRepBuilderAPI_MakeEdge(C);
else if (!C2d.IsNull()) edge = BRepBuilderAPI_MakeEdge2d(C2d); else edge = BRepBuilderAPI_MakeEdge2d(C2d);
else
{
BRep_Builder aBB;
aBB.MakeEdge(edge, P3d);
}
} }
else { else {
Handle(Geom_Surface) S; Handle(Geom_Surface) S;

View File

@@ -415,11 +415,6 @@ static void reportOffsetState(Draw_Interpretor& theCommands,
theCommands << "ERROR. Can not extent edge."; theCommands << "ERROR. Can not extent edge.";
break; break;
} }
case BRepOffset_MixedConnectivity:
{
theCommands << "ERROR. Mixed connectivity of faces.";
break;
}
default: default:
{ {
theCommands << "ERROR. offsetperform operation not done."; theCommands << "ERROR. offsetperform operation not done.";
@@ -979,10 +974,7 @@ Standard_Integer thickshell(Draw_Interpretor& theCommands,
const BRepOffset_Error aRetCode = B.Error(); const BRepOffset_Error aRetCode = B.Error();
reportOffsetState(theCommands, aRetCode); reportOffsetState(theCommands, aRetCode);
if (!B.Shape().IsNull()) DBRep::Set(a[1], B.Shape());
{
DBRep::Set(a[1], B.Shape());
}
return 0; return 0;
} }
@@ -1117,10 +1109,7 @@ Standard_Integer offsetshape(Draw_Interpretor& theCommands,
const BRepOffset_Error aRetCode = B.Error(); const BRepOffset_Error aRetCode = B.Error();
reportOffsetState(theCommands, aRetCode); reportOffsetState(theCommands, aRetCode);
if (!B.Shape().IsNull()) DBRep::Set(a[1], B.Shape());
{
DBRep::Set(a[1], B.Shape());
}
return 0; return 0;
} }

View File

@@ -692,6 +692,7 @@ void ChFi3d_Builder::PerformExtremity (const Handle(ChFiDS_Spine)& Spine)
else{ else{
sst = Spine->LastStatus(); sst = Spine->LastStatus();
iedge = Spine->NbEdges(); iedge = Spine->NbEdges();
E[0] = Spine->Edges(iedge);
V = Spine->LastVertex(); V = Spine->LastVertex();
} }
//Before all it is checked if the tangency is not dead. //Before all it is checked if the tangency is not dead.
@@ -702,7 +703,6 @@ void ChFi3d_Builder::PerformExtremity (const Handle(ChFiDS_Spine)& Spine)
} }
if(sst == ChFiDS_BreakPoint){ if(sst == ChFiDS_BreakPoint){
Standard_Integer aLocNbG1Connections = 0;
TopTools_ListIteratorOfListOfShape It;//,Jt; TopTools_ListIteratorOfListOfShape It;//,Jt;
Standard_Boolean sommetpourri = Standard_False; Standard_Boolean sommetpourri = Standard_False;
TopTools_IndexedMapOfOrientedShape EdgesOfV; TopTools_IndexedMapOfOrientedShape EdgesOfV;
@@ -720,10 +720,7 @@ void ChFi3d_Builder::PerformExtremity (const Handle(ChFiDS_Spine)& Spine)
if (!F2.IsNull() && ChFi3d::IsTangentFaces(anEdge, F1, F2, GeomAbs_G2)) //smooth edge if (!F2.IsNull() && ChFi3d::IsTangentFaces(anEdge, F1, F2, GeomAbs_G2)) //smooth edge
{ {
if (!F1.IsSame(F2)) if (!F1.IsSame(F2))
{
NbG1Connections++; NbG1Connections++;
aLocNbG1Connections++;
}
continue; continue;
} }
@@ -762,7 +759,7 @@ void ChFi3d_Builder::PerformExtremity (const Handle(ChFiDS_Spine)& Spine)
if (EdgesOfV.Extent() != 3) if (EdgesOfV.Extent() != 3)
sommetpourri = Standard_True; sommetpourri = Standard_True;
if(!sommetpourri && aLocNbG1Connections < 4){ if(!sommetpourri){
sst = ChFi3d_EdgeState(E,myEFMap); sst = ChFi3d_EdgeState(E,myEFMap);
} }
if(ii==1)Spine->SetFirstStatus(sst); if(ii==1)Spine->SetFirstStatus(sst);

View File

@@ -24,8 +24,7 @@ ChFiDS_Concave,
ChFiDS_Convex, ChFiDS_Convex,
ChFiDS_Tangential, ChFiDS_Tangential,
ChFiDS_FreeBound, ChFiDS_FreeBound,
ChFiDS_Other, ChFiDS_Other
ChFiDS_Mixed
}; };
#endif // _ChFiDS_TypeOfConcavity_HeaderFile #endif // _ChFiDS_TypeOfConcavity_HeaderFile

View File

@@ -429,8 +429,6 @@ static Standard_Boolean ConicDefinition
term2 = -gdet/(cprim*pdet); term2 = -gdet/(cprim*pdet);
if (IsEllip) { if (IsEllip) {
if (term1 <= eps || term2 <= eps)
return Standard_False;
Xax = cost; Xax = cost;
Yax = sint; Yax = sint;
Rmin = sqrt ( term1); Rmin = sqrt ( term1);
@@ -441,16 +439,12 @@ static Standard_Boolean ConicDefinition
} }
} }
else if (term1 <= eps){ else if (term1 <= eps){
if (-term1 <= eps || term2 <= eps)
return Standard_False;
Xax = -sint; Xax = -sint;
Yax = cost; Yax = cost;
Rmin = sqrt (-term1); Rmin = sqrt (-term1);
Rmax = sqrt (term2); Rmax = sqrt (term2);
} }
else { else {
if (term1 <= eps || -term2 <= eps)
return Standard_False;
Xax = cost; Xax = cost;
Yax = sint; Yax = sint;
Rmin = sqrt (-term2); Rmin = sqrt (-term2);

View File

@@ -150,7 +150,6 @@ static Standard_Boolean Connect (const Handle(ShapeAnalysis_Wire)& theSAW,
const Standard_Integer number, const Standard_Integer number,
Handle(ShapeExtend_WireData)& Gsewd) Handle(ShapeExtend_WireData)& Gsewd)
{ {
(void)number;
Gsewd = new ShapeExtend_WireData;//local translation (for mysewd) Gsewd = new ShapeExtend_WireData;//local translation (for mysewd)
Handle(ShapeExtend_WireData) Gsewd3d = new ShapeExtend_WireData;//local translation (for mysewd3d) Handle(ShapeExtend_WireData) Gsewd3d = new ShapeExtend_WireData;//local translation (for mysewd3d)
Handle(ShapeExtend_WireData) Gsewd2d = new ShapeExtend_WireData;//local translation (for mysewd2d) Handle(ShapeExtend_WireData) Gsewd2d = new ShapeExtend_WireData;//local translation (for mysewd2d)
@@ -385,31 +384,17 @@ static Standard_Boolean Connect (const Handle(ShapeAnalysis_Wire)& theSAW,
} }
} }
if (!mysewd.IsNull()) if (number > 1) {
{ okCurve = okCurve && Connect (saw, mysewd, Gsewd, (len3d > 1) || (len2d > 1), maxtol,
okCurve = okCurve && Connect(saw, mysewd, Gsewd, (len3d > 1) || (len2d > 1), maxtol, distmin, revsewd, revnextsewd);
distmin, revsewd, revnextsewd);
}
else
{
mysewd = Gsewd;
}
if (!mysewd3d.IsNull())
{
okCurve3d = okCurve3d && Connect (saw3d, mysewd3d, Gsewd3d, len3d > 1, maxtol, okCurve3d = okCurve3d && Connect (saw3d, mysewd3d, Gsewd3d, len3d > 1, maxtol,
distmin, revsewd, revnextsewd); distmin, revsewd, revnextsewd);
}
else
{
mysewd3d = Gsewd3d;
}
if (!mysewd2d.IsNull())
{
okCurve2d = okCurve2d && Connect (saw2d, mysewd2d, Gsewd2d, len2d > 1, maxtol, okCurve2d = okCurve2d && Connect (saw2d, mysewd2d, Gsewd2d, len2d > 1, maxtol,
distmin, revsewd, revnextsewd); distmin, revsewd, revnextsewd);
} }
else else {
{ mysewd = Gsewd;
mysewd3d = Gsewd3d;
mysewd2d = Gsewd2d; mysewd2d = Gsewd2d;
} }
return okCurve; return okCurve;

View File

@@ -1249,7 +1249,7 @@ Handle(Geom_Curve) IGESToBRep_BasicCurve::TransferLine
// modif du 15/10/97 : test moins severe // modif du 15/10/97 : test moins severe
// beaucoup de points confondus a GetEpsGeom()*GetUnitFactor() // beaucoup de points confondus a GetEpsGeom()*GetUnitFactor()
if (!Ps.IsEqual(Pe,Precision::Confusion() / GetUnitFactor())) { //:l3 abv 11 Jan 99: GetEpsGeom()*GetUnitFactor()/10.)) { if (!Ps.IsEqual(Pe,Precision::Confusion())) { //:l3 abv 11 Jan 99: GetEpsGeom()*GetUnitFactor()/10.)) {
gp_Lin line(Ps, gp_Dir(gp_Vec(Ps,Pe))); gp_Lin line(Ps, gp_Dir(gp_Vec(Ps,Pe)));
Standard_Real t1 = ElCLib::Parameter(line, Ps); Standard_Real t1 = ElCLib::Parameter(line, Ps);
Standard_Real t2 = ElCLib::Parameter(line, Pe); Standard_Real t2 = ElCLib::Parameter(line, Pe);
@@ -1299,7 +1299,7 @@ Handle(Geom2d_Curve) IGESToBRep_BasicCurve::Transfer2dLine
start->EndPoint().Y()); start->EndPoint().Y());
} }
if (!beg.IsEqual(end,Precision::PConfusion() / GetUnitFactor())) { //:l3 abv 11 Jan 99: GetEpsCoeff())) { if (!beg.IsEqual(end,Precision::PConfusion())) { //:l3 abv 11 Jan 99: GetEpsCoeff())) {
gp_Lin2d line2d(beg, gp_Dir2d(gp_Vec2d(beg,end))); gp_Lin2d line2d(beg, gp_Dir2d(gp_Vec2d(beg,end)));
Standard_Real t1 = ElCLib::Parameter(line2d, beg); Standard_Real t1 = ElCLib::Parameter(line2d, beg);
Standard_Real t2 = ElCLib::Parameter(line2d, end); Standard_Real t2 = ElCLib::Parameter(line2d, end);

View File

@@ -976,14 +976,14 @@ Standard_Boolean LocOpe_SplitShape::AddOpenWire(const TopoDS_Wire& W,
} }
} }
bool isBuildF2 = true;
//check overlapping edges for second face //check overlapping edges for second face
if(nbAddBound <2) if(nbAddBound <2)
return Standard_False; isBuildF2 = false;
if(nbAddBound ==2 && !anE1.IsNull() && !anE2.IsNull()) if(nbAddBound ==2 && !anE1.IsNull() && !anE2.IsNull())
{ {
if(checkOverlapping(TopoDS::Edge(anE1), TopoDS::Edge(anE2),FaceRef )) if(checkOverlapping(TopoDS::Edge(anE1), TopoDS::Edge(anE2),FaceRef ))
return Standard_False; isBuildF2 = false;
} }
nbAddBound =0; nbAddBound =0;
@@ -1010,26 +1010,29 @@ Standard_Boolean LocOpe_SplitShape::AddOpenWire(const TopoDS_Wire& W,
return Standard_False; return Standard_False;
} }
TopoDS_Face newF1,newF2; TopoDS_Face newF1,newF2;
aLocalFace = FaceRef.EmptyCopied(); aLocalFace = FaceRef.EmptyCopied();
newF1 = TopoDS::Face(aLocalFace); newF1 = TopoDS::Face(aLocalFace);
newF1.Orientation(TopAbs_FORWARD); newF1.Orientation(TopAbs_FORWARD);
aLocalFace = FaceRef.EmptyCopied(); if (isBuildF2)
newF2 = TopoDS::Face(aLocalFace); {
newF2.Orientation(TopAbs_FORWARD); aLocalFace = FaceRef.EmptyCopied();
newF2 = TopoDS::Face(aLocalFace);
newF2.Orientation(TopAbs_FORWARD);
}
// modifs JAG 97.05.28 // modifs JAG 97.05.28
B.Add(newF1,newW1); B.Add(newF1,newW1);
B.Add(newF2,newW2); if (isBuildF2)
B.Add(newF2,newW2);
for (exp.Init(FaceRef.Oriented(TopAbs_FORWARD),TopAbs_WIRE); exp.More(); exp.Next()) { for (exp.Init(FaceRef.Oriented(TopAbs_FORWARD),TopAbs_WIRE); exp.More(); exp.Next()) {
const TopoDS_Wire& wir = TopoDS::Wire(exp.Current()); const TopoDS_Wire& wir = TopoDS::Wire(exp.Current());
if (!wir.IsSame(wfirst)) { if (!wir.IsSame(wfirst)) {
if (IsInside(newF1, wir)) { if (IsInside(newF1, wir)) {
B.Add(newF1,wir); B.Add(newF1,wir);
} }
else if (IsInside(newF2, wir)) { else if (isBuildF2 && IsInside(newF2, wir)) {
B.Add(newF2,wir); B.Add(newF2,wir);
} }
else { else {
@@ -1040,7 +1043,8 @@ Standard_Boolean LocOpe_SplitShape::AddOpenWire(const TopoDS_Wire& W,
} }
} }
lf.Append(newF1); lf.Append(newF1);
lf.Append(newF2); if (isBuildF2)
lf.Append(newF2);
// Mise a jour des descendants des wires // Mise a jour des descendants des wires
for (exp.Init(F,TopAbs_WIRE); exp.More(); exp.Next()) { for (exp.Init(F,TopAbs_WIRE); exp.More(); exp.Next()) {
@@ -1054,7 +1058,8 @@ Standard_Boolean LocOpe_SplitShape::AddOpenWire(const TopoDS_Wire& W,
if (itl.More()) { // on a trouve le wire if (itl.More()) { // on a trouve le wire
ls.Remove(itl); ls.Remove(itl);
ls.Append(newW1); ls.Append(newW1);
ls.Append(newW2); if (isBuildF2)
ls.Append(newW2);
} }
} }
} }

View File

@@ -106,11 +106,6 @@ void RWStepShape_RWEdgeLoop::Check
Standard_Boolean headToTail = Standard_True; Standard_Boolean headToTail = Standard_True;
//Standard_Boolean noIdentVtx = Standard_True; //szv#4:S4163:12Mar99 unused //Standard_Boolean noIdentVtx = Standard_True; //szv#4:S4163:12Mar99 unused
Standard_Integer nbEdg = ent->NbEdgeList(); Standard_Integer nbEdg = ent->NbEdgeList();
if (nbEdg == 0)
{
ach->AddFail("Edge loop contains empty edge list");
return;
}
Handle(StepShape_OrientedEdge) theOE = ent->EdgeListValue(1); Handle(StepShape_OrientedEdge) theOE = ent->EdgeListValue(1);
Handle(StepShape_Vertex) theVxFrst = theOE->EdgeStart(); Handle(StepShape_Vertex) theVxFrst = theOE->EdgeStart();
Handle(StepShape_Vertex) theVxLst = theOE->EdgeEnd(); Handle(StepShape_Vertex) theVxLst = theOE->EdgeEnd();

File diff suppressed because it is too large Load Diff

View File

@@ -31,7 +31,6 @@
#include <StepVisual_DraughtingModel.hxx> #include <StepVisual_DraughtingModel.hxx>
#include <StepVisual_HArray1OfPresentationStyleAssignment.hxx> #include <StepVisual_HArray1OfPresentationStyleAssignment.hxx>
#include <TDF_LabelSequence.hxx> #include <TDF_LabelSequence.hxx>
#include <TDF_LabelMap.hxx>
#include <XCAFDimTolObjects_GeomToleranceObject.hxx> #include <XCAFDimTolObjects_GeomToleranceObject.hxx>
class XSControl_WorkSession; class XSControl_WorkSession;
@@ -47,9 +46,11 @@ class TopoDS_Shape;
//! Also supports multifile writing //! Also supports multifile writing
class STEPCAFControl_Writer class STEPCAFControl_Writer
{ {
DEFINE_STANDARD_ALLOC
public: public:
DEFINE_STANDARD_ALLOC
//! Creates a writer with an empty //! Creates a writer with an empty
//! STEP model and sets ColorMode, LayerMode, NameMode and //! STEP model and sets ColorMode, LayerMode, NameMode and
//! PropsMode to Standard_True. //! PropsMode to Standard_True.
@@ -58,24 +59,22 @@ public:
//! Creates a reader tool and attaches it to an already existing Session //! Creates a reader tool and attaches it to an already existing Session
//! Clears the session if it was not yet set for STEP //! Clears the session if it was not yet set for STEP
//! Clears the internal data structures //! Clears the internal data structures
Standard_EXPORT STEPCAFControl_Writer(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT STEPCAFControl_Writer(const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = Standard_True);
const Standard_Boolean theScratch = Standard_True);
//! Clears the internal data structures and attaches to a new session //! Clears the internal data structures and attaches to a new session
//! Clears the session if it was not yet set for STEP //! Clears the session if it was not yet set for STEP
Standard_EXPORT void Init(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT void Init (const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = Standard_True);
const Standard_Boolean theScratch = Standard_True);
//! Writes all the produced models into file //! Writes all the produced models into file
//! In case of multimodel with extern references, //! In case of multimodel with extern references,
//! filename will be a name of root file, all other files //! filename will be a name of root file, all other files
//! have names of corresponding parts //! have names of corresponding parts
//! Provided for use like single-file writer //! Provided for use like single-file writer
Standard_EXPORT IFSelect_ReturnStatus Write(const Standard_CString theFileName); Standard_EXPORT IFSelect_ReturnStatus Write (const Standard_CString theFileName);
//! Writes all the produced models into the stream. //! Writes all the produced models into the stream.
//! Provided for use like single-file writer //! Provided for use like single-file writer
Standard_EXPORT IFSelect_ReturnStatus WriteStream(std::ostream& theStream); Standard_EXPORT IFSelect_ReturnStatus WriteStream (std::ostream& theStream);
//! Transfers a document (or single label) to a STEP model //! Transfers a document (or single label) to a STEP model
//! The mode of translation of shape is AsIs //! The mode of translation of shape is AsIs
@@ -83,99 +82,97 @@ public:
//! mode (with external refs), and string pointed by <multi> //! mode (with external refs), and string pointed by <multi>
//! gives prefix for names of extern files (can be empty string) //! gives prefix for names of extern files (can be empty string)
//! Returns True if translation is OK //! Returns True if translation is OK
Standard_EXPORT Standard_Boolean Transfer(const Handle(TDocStd_Document)& theDoc, Standard_EXPORT Standard_Boolean Transfer (const Handle(TDocStd_Document)& doc,
const STEPControl_StepModelType theMode = STEPControl_AsIs, const STEPControl_StepModelType mode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0, const Standard_CString multi = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange()); const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Method to transfer part of the document specified by label //! Method to transfer part of the document specified by label
Standard_EXPORT Standard_Boolean Transfer(const TDF_Label& theLabel, Standard_EXPORT Standard_Boolean Transfer (const TDF_Label& L,
const STEPControl_StepModelType theMode = STEPControl_AsIs, const STEPControl_StepModelType mode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0, const Standard_CString multi = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange()); const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Mehod to writing sequence of root assemblies or part of the file specified by use by one label //! Mehod to writing sequence of root assemblies or part of the file specified by use by one label
Standard_EXPORT Standard_Boolean Transfer(const TDF_LabelSequence& theLabelSeq, Standard_EXPORT Standard_Boolean Transfer (const TDF_LabelSequence& L,
const STEPControl_StepModelType theMode = STEPControl_AsIs, const STEPControl_StepModelType mode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0, const Standard_CString multi = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange()); const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT Standard_Boolean Perform(const Handle(TDocStd_Document)& theDoc, Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc,
const TCollection_AsciiString& theFileName, const TCollection_AsciiString& filename,
const Message_ProgressRange& theProgress = Message_ProgressRange()); const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Transfers a document and writes it to a STEP file //! Transfers a document and writes it to a STEP file
//! Returns True if translation is OK //! Returns True if translation is OK
Standard_EXPORT Standard_Boolean Perform(const Handle(TDocStd_Document)& theDoc, Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc,
const Standard_CString theFileName, const Standard_CString filename,
const Message_ProgressRange& theProgress = Message_ProgressRange()); const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Returns data on external files //! Returns data on external files
//! Returns Null handle if no external files are read //! Returns Null handle if no external files are read
const NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>& ExternFiles() const { return myFiles; }; Standard_EXPORT const NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>& ExternFiles() const;
//! Returns data on external file by its original label //! Returns data on external file by its original label
//! Returns False if no external file with given name is read //! Returns False if no external file with given name is read
Standard_EXPORT Standard_Boolean ExternFile(const TDF_Label& theLabel, Standard_EXPORT Standard_Boolean ExternFile (const TDF_Label& L, Handle(STEPCAFControl_ExternFile)& ef) const;
Handle(STEPCAFControl_ExternFile)& theExtFile) const;
//! Returns data on external file by its name //! Returns data on external file by its name
//! Returns False if no external file with given name is read //! Returns False if no external file with given name is read
Standard_EXPORT Standard_Boolean ExternFile(const Standard_CString theName, Standard_EXPORT Standard_Boolean ExternFile (const Standard_CString name, Handle(STEPCAFControl_ExternFile)& ef) const;
Handle(STEPCAFControl_ExternFile)& theExtFile) const;
//! Returns basic reader for root file //! Returns basic reader for root file
STEPControl_Writer& ChangeWriter() { return myWriter; } Standard_EXPORT STEPControl_Writer& ChangeWriter();
//! Returns basic reader as const //! Returns basic reader as const
const STEPControl_Writer& Writer() const { return myWriter; } Standard_EXPORT const STEPControl_Writer& Writer() const;
//! Set ColorMode for indicate write Colors or not. //! Set ColorMode for indicate write Colors or not.
void SetColorMode(const Standard_Boolean theColorMode) { myColorMode = theColorMode; } Standard_EXPORT void SetColorMode (const Standard_Boolean colormode);
Standard_Boolean GetColorMode() const { return myColorMode; } Standard_EXPORT Standard_Boolean GetColorMode() const;
//! Set NameMode for indicate write Name or not. //! Set NameMode for indicate write Name or not.
void SetNameMode(const Standard_Boolean theNameMode) { myNameMode = theNameMode; } Standard_EXPORT void SetNameMode (const Standard_Boolean namemode);
Standard_Boolean GetNameMode() const { return myNameMode; } Standard_EXPORT Standard_Boolean GetNameMode() const;
//! Set LayerMode for indicate write Layers or not. //! Set LayerMode for indicate write Layers or not.
void SetLayerMode(const Standard_Boolean theLayerMode) { myLayerMode = theLayerMode; } Standard_EXPORT void SetLayerMode (const Standard_Boolean layermode);
Standard_Boolean GetLayerMode() const { return myLayerMode; } Standard_EXPORT Standard_Boolean GetLayerMode() const;
//! PropsMode for indicate write Validation properties or not. //! PropsMode for indicate write Validation properties or not.
void SetPropsMode(const Standard_Boolean thePropsMode) { myPropsMode = thePropsMode; } Standard_EXPORT void SetPropsMode (const Standard_Boolean propsmode);
Standard_Boolean GetPropsMode() const { return myPropsMode; } Standard_EXPORT Standard_Boolean GetPropsMode() const;
//! Set SHUO mode for indicate write SHUO or not. //! Set SHUO mode for indicate write SHUO or not.
void SetSHUOMode(const Standard_Boolean theSHUOMode) { mySHUOMode = theSHUOMode; } Standard_EXPORT void SetSHUOMode (const Standard_Boolean shuomode);
Standard_Boolean GetSHUOMode() const { return mySHUOMode; } Standard_EXPORT Standard_Boolean GetSHUOMode() const;
//! Set dimtolmode for indicate write D&GTs or not. //! Set dimtolmode for indicate write D&GTs or not.
void SetDimTolMode(const Standard_Boolean theDimTolMode) { myGDTMode = theDimTolMode; }; Standard_EXPORT void SetDimTolMode (const Standard_Boolean dimtolmode);
Standard_Boolean GetDimTolMode() const { return myGDTMode; } Standard_EXPORT Standard_Boolean GetDimTolMode() const;
//! Set dimtolmode for indicate write D&GTs or not. //! Set dimtolmode for indicate write D&GTs or not.
void SetMaterialMode(const Standard_Boolean theMaterialMode) { myMatMode = theMaterialMode; } Standard_EXPORT void SetMaterialMode (const Standard_Boolean matmode);
Standard_Boolean GetMaterialMode() const { return myMatMode; } Standard_EXPORT Standard_Boolean GetMaterialMode() const;
protected: protected:
//! Transfers labels to a STEP model //! Transfers labels to a STEP model
//! Returns True if translation is OK //! Returns True if translation is OK
//! isExternFile setting from transferExternFiles method //! isExternFile setting from TransferExternFiles method
Standard_Boolean transfer(STEPControl_Writer& theWriter, Standard_EXPORT Standard_Boolean Transfer (STEPControl_Writer& wr,
const TDF_LabelSequence& theLabels, const TDF_LabelSequence& labels,
const STEPControl_StepModelType theMode = STEPControl_AsIs, const STEPControl_StepModelType mode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0, const Standard_CString multi = 0,
const Standard_Boolean isExternFile = Standard_False, const Standard_Boolean isExternFile = Standard_False,
const Message_ProgressRange& theProgress = Message_ProgressRange()); const Message_ProgressRange& theProgress = Message_ProgressRange()) ;
//! Parses assembly structure of label L, writes all the simple //! Parses assembly structure of label L, writes all the simple
//! shapes each to its own file named by name of its label plus //! shapes each to its own file named by name of its label plus
@@ -183,96 +180,83 @@ protected:
//! Returns shape representing that assembly structure //! Returns shape representing that assembly structure
//! in the form of nested empty compounds (and a sequence of //! in the form of nested empty compounds (and a sequence of
//! labels which are newly written nodes of this assembly) //! labels which are newly written nodes of this assembly)
TopoDS_Shape transferExternFiles(const TDF_Label& theLabel, Standard_EXPORT TopoDS_Shape TransferExternFiles (const TDF_Label& L,
const STEPControl_StepModelType theMode, const STEPControl_StepModelType mode,
TDF_LabelSequence& theLabelSeq, TDF_LabelSequence& Lseq,
const Standard_CString thePrefix = "", const Standard_CString prefix = "",
const Message_ProgressRange& theProgress = Message_ProgressRange()); const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Write external references to STEP //! Write external references to STEP
Standard_Boolean writeExternRefs(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT Standard_Boolean WriteExternRefs (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
const TDF_LabelSequence& theLabels) const;
//! Write colors assigned to specified labels, to STEP model //! Write colors assigned to specified labels, to STEP model
Standard_Boolean writeColors(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT Standard_Boolean WriteColors (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels);
const TDF_LabelSequence& theLabels);
//! Write names assigned to specified labels, to STEP model //! Write names assigned to specified labels, to STEP model
Standard_Boolean writeNames(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT Standard_Boolean WriteNames (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
const TDF_LabelSequence& theLabels) const;
//! Write D&GTs assigned to specified labels, to STEP model //! Write D&GTs assigned to specified labels, to STEP model
Standard_Boolean writeDGTs(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT Standard_Boolean WriteDGTs (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
const TDF_LabelSequence& theLabels) const;
//! Write D&GTs assigned to specified labels, to STEP model, according AP242 //! Write D&GTs assigned to specified labels, to STEP model, according AP242
Standard_Boolean writeDGTsAP242(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT Standard_Boolean WriteDGTsAP242 (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels);
const TDF_LabelSequence& theLabels);
//! Write materials assigned to specified labels, to STEP model //! Write materials assigned to specified labels, to STEP model
Standard_Boolean writeMaterials(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT Standard_Boolean WriteMaterials (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
const TDF_LabelSequence& theLabels) const;
//! Write validation properties assigned to specified labels, //! Write validation properties assigned to specified labels,
//! to STEP model //! to STEP model
Standard_Boolean writeValProps(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT Standard_Boolean WriteValProps (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels, const Standard_CString multi) const;
const TDF_LabelSequence& theLabels,
const Standard_CString theIsMulti) const;
//! Write layers assigned to specified labels, to STEP model //! Write layers assigned to specified labels, to STEP model
Standard_Boolean writeLayers(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT Standard_Boolean WriteLayers (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
const TDF_LabelSequence& theLabels) const;
//! Write SHUO assigned to specified component, to STEP model //! Write SHUO assigned to specified component, to STEP model
Standard_Boolean writeSHUOs(const Handle(XSControl_WorkSession)& theWS, Standard_EXPORT Standard_Boolean WriteSHUOs (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels);
const TDF_LabelSequence& theLabels);
//! Finds length units located in root of label //! Finds length units located in root of label
//! If it exists, initializes local length unit from it //! If it exists, initializes local length unit from it
//! Else initializes according to Cascade length unit //! Else initializes according to Cascade length unit
void prepareUnit(const TDF_Label& theLabel, Standard_EXPORT void prepareUnit(const TDF_Label& theLabel,
const Handle(StepData_StepModel)& theModel); const Handle(StepData_StepModel)& theModel);
Handle(StepRepr_ShapeAspect) writeShapeAspect(const Handle(XSControl_WorkSession)& theWS,
const TDF_Label theLabel,
const TopoDS_Shape theShape,
Handle(StepRepr_RepresentationContext)& theRC,
Handle(StepAP242_GeometricItemSpecificUsage)& theGISU);
void writePresentation(const Handle(XSControl_WorkSession)& theWS,
const TopoDS_Shape& thePresentation,
const Handle(TCollection_HAsciiString)& thePrsName,
const Standard_Boolean theHasSemantic,
const Standard_Boolean theHasPlane,
const gp_Ax2& theAnnotationPlane,
const gp_Pnt& theTextPosition,
const Handle(Standard_Transient) theDimension);
Handle(StepDimTol_Datum) writeDatumAP242(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theShapeL,
const TDF_Label& theDatumL,
const Standard_Boolean isFirstDTarget,
const Handle(StepDimTol_Datum) theWrittenDatum);
void writeToleranceZone(const Handle(XSControl_WorkSession)& theWS,
const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject,
const Handle(StepDimTol_GeometricTolerance)& theEntity,
const Handle(StepRepr_RepresentationContext)& theRC);
void writeGeomTolerance(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theShapeSeqL,
const TDF_Label& theGeomTolL,
const Handle(StepDimTol_HArray1OfDatumSystemOrReference)& theDatumSystem,
const Handle(StepRepr_RepresentationContext)& theRC);
private: private:
Standard_EXPORT Handle(StepRepr_ShapeAspect) WriteShapeAspect(const Handle(XSControl_WorkSession) &WS,
const TDF_Label theLabel, const TopoDS_Shape theShape, Handle(StepRepr_RepresentationContext)& theRC,
Handle(StepAP242_GeometricItemSpecificUsage)& theGISU);
Standard_EXPORT void WritePresentation(const Handle(XSControl_WorkSession)& WS,
const TopoDS_Shape& thePresentation,
const Handle(TCollection_HAsciiString)& thePrsName,
const Standard_Boolean hasSemantic,
const Standard_Boolean hasPlane,
const gp_Ax2& theAnnotationPlane,
const gp_Pnt& theTextPosition,
const Handle(Standard_Transient) theDimension);
Standard_EXPORT Handle(StepDimTol_Datum) WriteDatumAP242(const Handle(XSControl_WorkSession)& WS,
const TDF_LabelSequence& theShapeL,
const TDF_Label& theDatumL,
const Standard_Boolean isFirstDTarget,
const Handle(StepDimTol_Datum) theWrittenDatum);
Standard_EXPORT void WriteToleranceZone(const Handle(XSControl_WorkSession) &WS, const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject,
const Handle(StepDimTol_GeometricTolerance)& theEntity, const Handle(StepRepr_RepresentationContext)& theRC);
Standard_EXPORT void WriteGeomTolerance(const Handle(XSControl_WorkSession)& WS,
const TDF_LabelSequence& theShapeSeqL,
const TDF_Label& theGeomTolL,
const Handle(StepDimTol_HArray1OfDatumSystemOrReference)& theDatumSystem,
const Handle(StepRepr_RepresentationContext)& theRC);
private:
STEPControl_Writer myWriter; STEPControl_Writer myWriter;
NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> myFiles; NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> myFiles;
TDF_LabelMap myRootLabels;
STEPCAFControl_DataMapOfLabelShape myLabels; STEPCAFControl_DataMapOfLabelShape myLabels;
STEPCAFControl_DataMapOfLabelExternFile myLabEF; STEPCAFControl_DataMapOfLabelExternFile myLabEF;
STEPCAFControl_DataMapOfLabelShape myPureRefLabels;
Standard_Boolean myColorMode; Standard_Boolean myColorMode;
Standard_Boolean myNameMode; Standard_Boolean myNameMode;
Standard_Boolean myLayerMode; Standard_Boolean myLayerMode;
@@ -288,4 +272,7 @@ private:
}; };
#endif // _STEPCAFControl_Writer_HeaderFile #endif // _STEPCAFControl_Writer_HeaderFile

View File

@@ -869,27 +869,32 @@ Standard_Boolean SelectMgr_Frustum<N>::hasCircleOverlap (const Standard_Real the
const gp_Pnt aCenterProject (aCoefA * aTCenter, const gp_Pnt aCenterProject (aCoefA * aTCenter,
aCoefB * aTCenter, aCoefB * aTCenter,
aCoefC * aTCenter); aCoefC * aTCenter);
if (isDotInside (aCenterProject, aVertices))
{
return true;
}
const Standard_Boolean isCenterInside = isDotInside (aCenterProject, aVertices); Standard_Boolean isInside = true;
Standard_Boolean isInside = false;
for (Standard_Integer anIdx = aVertices.Lower(); anIdx <= aVertices.Upper(); anIdx++) for (Standard_Integer anIdx = aVertices.Lower(); anIdx <= aVertices.Upper(); anIdx++)
{ {
if (aVertices.Value (anIdx).Distance (aCenterProject) > theRadius) if (aVertices.Value (anIdx).Distance (aCenterProject) > theRadius)
{ {
isInside = true; isInside = false;
break; break;
} }
} }
if (theInside != NULL) if (theInside != NULL)
{ {
*theInside = isInside && isCenterInside; *theInside = false;
} }
return theIsFilled if (!theIsFilled && isInside)
? !isInside || (isCenterInside && isInside) {
: isInside && isCenterInside; return false;
}
return isInside;
} }
//======================================================================= //=======================================================================

View File

@@ -58,33 +58,12 @@ public:
return ZLayerPosition > theOther.ZLayerPosition; return ZLayerPosition > theOther.ZLayerPosition;
} }
// closest object is selected if their depths are not equal within tolerance // closest object is selected unless difference is within tolerance
if (Abs (Depth - theOther.Depth) > Tolerance + theOther.Tolerance) if (Abs (Depth - theOther.Depth) > (Tolerance + theOther.Tolerance))
{ {
return Depth < theOther.Depth; return Depth < theOther.Depth;
} }
Standard_Real aCos = 1.0;
if (Normal.Modulus() > 0 && theOther.Normal.Modulus() > 0)
{
gp_Dir aNormal (Normal.x(), Normal.y(), Normal.z());
gp_Dir anOtherNormal (theOther.Normal.x(), theOther.Normal.y(), theOther.Normal.z());
aCos = Abs (Cos (aNormal.Angle (anOtherNormal)));
}
Standard_Real aDepth = Depth - Tolerance;
Standard_Real anOtherDepth = theOther.Depth - theOther.Tolerance;
// Comparison depths taking into account tolerances occurs when the surfaces are parallel
// or have the same sensitivity and the angle between them is less than 60 degrees.
if (Abs (aDepth - anOtherDepth) > Precision::Confusion())
{
if ((aCos > 0.5 && Abs (Tolerance - theOther.Tolerance) < Precision::Confusion())
|| Abs (aCos - 1.0) < Precision::Confusion())
{
return aDepth < anOtherDepth;
}
}
// if two objects have similar depth, select the one with higher priority // if two objects have similar depth, select the one with higher priority
if (Priority > theOther.Priority) if (Priority > theOther.Priority)
{ {

View File

@@ -284,9 +284,9 @@ void SelectMgr_ViewerSelector::checkOverlap (const Handle(Select3D_SensitiveEnti
aCriterion.NbOwnerMatches = aPrevCriterion->NbOwnerMatches; aCriterion.NbOwnerMatches = aPrevCriterion->NbOwnerMatches;
if (theMgr.GetActiveSelectionType() != SelectMgr_SelectionType_Box) if (theMgr.GetActiveSelectionType() != SelectMgr_SelectionType_Box)
{ {
updatePoint3d (aCriterion, aPickResult, theEntity, theInversedTrsf, theMgr);
if (aCriterion.IsCloserDepth (*aPrevCriterion)) if (aCriterion.IsCloserDepth (*aPrevCriterion))
{ {
updatePoint3d (aCriterion, aPickResult, theEntity, theInversedTrsf, theMgr);
*aPrevCriterion = aCriterion; *aPrevCriterion = aCriterion;
} }
} }

View File

@@ -138,7 +138,7 @@ void StepToTopoDS_TranslateShell::Init(const Handle(StepVisual_TessellatedShell)
{ {
Handle(TransferBRep_ShapeBinder) aBinder Handle(TransferBRep_ShapeBinder) aBinder
= Handle(TransferBRep_ShapeBinder)::DownCast(aTP->Find(theTSh->TopologicalLink())); = Handle(TransferBRep_ShapeBinder)::DownCast(aTP->Find(theTSh->TopologicalLink()));
if (!aBinder.IsNull()) if (aBinder.IsNull())
{ {
aSh = aBinder->Shell(); aSh = aBinder->Shell();
theHasGeom = Standard_True; theHasGeom = Standard_True;

View File

@@ -20,7 +20,6 @@
#include <ViewerTest.hxx> #include <ViewerTest.hxx>
#include <AIS_AnimationAxisRotation.hxx>
#include <AIS_AnimationCamera.hxx> #include <AIS_AnimationCamera.hxx>
#include <AIS_AnimationObject.hxx> #include <AIS_AnimationObject.hxx>
#include <AIS_Axis.hxx> #include <AIS_Axis.hxx>
@@ -7597,11 +7596,6 @@ static Standard_Integer VAnimation (Draw_Interpretor& theDI,
gp_XYZ aLocPnts [2] = { aTrsfs[0].TranslationPart(), aTrsfs[1].TranslationPart() }; gp_XYZ aLocPnts [2] = { aTrsfs[0].TranslationPart(), aTrsfs[1].TranslationPart() };
Standard_Real aScales [2] = { aTrsfs[0].ScaleFactor(), aTrsfs[1].ScaleFactor() }; Standard_Real aScales [2] = { aTrsfs[0].ScaleFactor(), aTrsfs[1].ScaleFactor() };
Standard_Boolean isTrsfSet = Standard_False; Standard_Boolean isTrsfSet = Standard_False;
gp_Ax1 anAxis;
Standard_Real anAngles[2] = { 0.0, 0.0 };
Standard_Boolean isAxisRotationSet = Standard_False;
Standard_Integer aTrsfArgIter = anArgIter + 1; Standard_Integer aTrsfArgIter = anArgIter + 1;
for (; aTrsfArgIter < theArgNb; ++aTrsfArgIter) for (; aTrsfArgIter < theArgNb; ++aTrsfArgIter)
{ {
@@ -7649,45 +7643,13 @@ static Standard_Integer VAnimation (Draw_Interpretor& theDI,
} }
aScales[anIndex] = aScaleStr.RealValue(); aScales[anIndex] = aScaleStr.RealValue();
} }
else if (aTrsfArg == "-axis")
{
isAxisRotationSet = Standard_True;
gp_XYZ anOrigin, aDirection;
if (aTrsfArgIter + 6 >= theArgNb
|| !parseXYZ (theArgVec + aTrsfArgIter + 1, anOrigin)
|| !parseXYZ (theArgVec + aTrsfArgIter + 4, aDirection))
{
Message::SendFail() << "Syntax error at " << aTrsfArg;
return 1;
}
anAxis.SetLocation (anOrigin);
anAxis.SetDirection (aDirection);
aTrsfArgIter += 6;
}
else if (aTrsfArg.StartsWith ("-ang"))
{
isAxisRotationSet = Standard_True;
if (++aTrsfArgIter >= theArgNb)
{
Message::SendFail() << "Syntax error at " << aTrsfArg;
return 1;
}
const TCollection_AsciiString anAngleStr (theArgVec[aTrsfArgIter]);
if (!anAngleStr.IsRealValue (Standard_True))
{
Message::SendFail() << "Syntax error at " << aTrsfArg;
return 1;
}
anAngles[anIndex] = anAngleStr.RealValue();
}
else else
{ {
anArgIter = aTrsfArgIter - 1; anArgIter = aTrsfArgIter - 1;
break; break;
} }
} }
if (!isTrsfSet && !isAxisRotationSet) if (!isTrsfSet)
{ {
Message::SendFail() << "Syntax error at " << anArg; Message::SendFail() << "Syntax error at " << anArg;
return 1; return 1;
@@ -7696,23 +7658,15 @@ static Standard_Integer VAnimation (Draw_Interpretor& theDI,
{ {
anArgIter = theArgNb; anArgIter = theArgNb;
} }
Handle(AIS_BaseAnimationObject) anObjAnimation;
if (isTrsfSet)
{
aTrsfs[0].SetRotation (aRotQuats[0]);
aTrsfs[1].SetRotation (aRotQuats[1]);
aTrsfs[0].SetTranslationPart (aLocPnts[0]);
aTrsfs[1].SetTranslationPart (aLocPnts[1]);
aTrsfs[0].SetScaleFactor (aScales[0]);
aTrsfs[1].SetScaleFactor (aScales[1]);
anObjAnimation = new AIS_AnimationObject (anAnimation->Name(), aCtx, anObject, aTrsfs[0], aTrsfs[1]); aTrsfs[0].SetRotation (aRotQuats[0]);
} aTrsfs[1].SetRotation (aRotQuats[1]);
else aTrsfs[0].SetTranslationPart (aLocPnts[0]);
{ aTrsfs[1].SetTranslationPart (aLocPnts[1]);
anObjAnimation = new AIS_AnimationAxisRotation (anAnimation->Name(), aCtx, anObject, anAxis, aTrsfs[0].SetScaleFactor (aScales[0]);
anAngles[0] * (M_PI / 180.0), anAngles[1] * (M_PI / 180.0)); aTrsfs[1].SetScaleFactor (aScales[1]);
}
Handle(AIS_AnimationObject) anObjAnimation = new AIS_AnimationObject (anAnimation->Name(), aCtx, anObject, aTrsfs[0], aTrsfs[1]);
replaceAnimation (aParentAnimation, anAnimation, anObjAnimation); replaceAnimation (aParentAnimation, anAnimation, anObjAnimation);
} }
else if (anArg == "-viewtrsf" else if (anArg == "-viewtrsf"
@@ -14440,11 +14394,6 @@ Object animation:
-rotX object Orientations pair (quaternions) -rotX object Orientations pair (quaternions)
-scaleX object Scale factors pair (quaternions) -scaleX object Scale factors pair (quaternions)
vanim name -object [-axis OX OY OZ DX DY DZ] [-ang1 A] [-ang2 A]
-axis rotation axis
-ang1 start rotation angle in degrees
-ang2 end rotation angle in degrees
Custom callback: Custom callback:
vanim name -invoke "Command Arg1 Arg2 %Pts %LocalPts %Normalized ArgN" vanim name -invoke "Command Arg1 Arg2 %Pts %LocalPts %Normalized ArgN"

View File

@@ -194,63 +194,29 @@ const Handle(VrmlData_WorldInfo)& VrmlData_Scene::WorldInfo() const
//purpose : //purpose :
//======================================================================= //=======================================================================
VrmlData_ErrorStatus VrmlData_Scene::readLine(VrmlData_InBuffer& theBuffer) VrmlData_ErrorStatus VrmlData_Scene::readLine (VrmlData_InBuffer& theBuffer)
{ {
VrmlData_ErrorStatus aStatus = VrmlData_StatusOK; VrmlData_ErrorStatus aStatus = VrmlData_StatusOK;
if (theBuffer.Input.eof()) if (theBuffer.Input.eof())
{ aStatus = VrmlData_EndOfFile;
return VrmlData_EndOfFile; else {
} theBuffer.Input.getline (theBuffer.Line, sizeof(theBuffer.Line));
// Read a line. theBuffer.LineCount++;
theBuffer.Input.getline(theBuffer.Line, sizeof(theBuffer.Line)); const int stat = theBuffer.Input.rdstate();
if (stat & std::ios::badbit) {
// Check the number of read symbols. aStatus = VrmlData_UnrecoverableError;
// If maximum number is read, process the array of symbols separately }
// rolling back the array to the last comma or space symbol. else if (stat & std::ios::failbit) {
std::streamsize aNbChars = theBuffer.Input.gcount(); if (stat & std::ios::eofbit) {
if (theBuffer.Input.rdstate() & std::ios::failbit && aStatus = VrmlData_EndOfFile;
aNbChars == sizeof(theBuffer.Line) - 1) }
{ else {
// Clear the error. aStatus = VrmlData_GeneralError;
// We will fix it here below.
theBuffer.Input.clear();
size_t anInd = aNbChars - 1;
for (; anInd > 0; anInd--)
{
Standard_Character aChar = theBuffer.Line[anInd];
if (aChar == ',' || aChar == ' ')
{
theBuffer.Line[anInd + 1] = '\0';
break;
} }
} }
if (anInd == 0) // no possible to rolling back theBuffer.LinePtr = &theBuffer.Line[0];
{ theBuffer.IsProcessed = Standard_False;
return VrmlData_UnrecoverableError;
}
theBuffer.Input.seekg(-(aNbChars - anInd - 1), std::ios::cur);
} }
// Check the reading status.
theBuffer.LineCount++;
const int stat = theBuffer.Input.rdstate();
if (stat & std::ios::badbit)
{
aStatus = VrmlData_UnrecoverableError;
}
else if (stat & std::ios::failbit)
{
if (stat & std::ios::eofbit)
{
aStatus = VrmlData_EndOfFile;
}
else
{
aStatus = VrmlData_GeneralError;
}
}
theBuffer.LinePtr = &theBuffer.Line[0];
theBuffer.IsProcessed = Standard_False;
return aStatus; return aStatus;
} }

View File

@@ -89,7 +89,7 @@ Standard_Boolean XCAFDoc_ColorTool::IsColor (const TDF_Label& lab) const
//======================================================================= //=======================================================================
Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& lab, Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& lab,
Quantity_Color& col) Quantity_Color& col) const
{ {
Quantity_ColorRGBA aCol; Quantity_ColorRGBA aCol;
Standard_Boolean isDone = GetColor(lab, aCol); Standard_Boolean isDone = GetColor(lab, aCol);
@@ -104,8 +104,10 @@ Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& lab,
//======================================================================= //=======================================================================
Standard_Boolean XCAFDoc_ColorTool::GetColor(const TDF_Label& lab, Standard_Boolean XCAFDoc_ColorTool::GetColor(const TDF_Label& lab,
Quantity_ColorRGBA& col) Quantity_ColorRGBA& col) const
{ {
if (lab.Father() != Label()) return Standard_False;
Handle(XCAFDoc_Color) ColorAttribute; Handle(XCAFDoc_Color) ColorAttribute;
if (!lab.FindAttribute(XCAFDoc_Color::GetID(), ColorAttribute)) if (!lab.FindAttribute(XCAFDoc_Color::GetID(), ColorAttribute))
return Standard_False; return Standard_False;
@@ -512,7 +514,7 @@ XCAFDoc_ColorTool::XCAFDoc_ColorTool()
//purpose : //purpose :
//======================================================================= //=======================================================================
Standard_Boolean XCAFDoc_ColorTool::IsVisible (const TDF_Label& L) Standard_Boolean XCAFDoc_ColorTool::IsVisible (const TDF_Label& L) const
{ {
Handle(TDataStd_UAttribute) aUAttr; Handle(TDataStd_UAttribute) aUAttr;
return (!L.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr)); return (!L.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr));

View File

@@ -72,12 +72,12 @@ public:
//! Returns color defined by label lab //! Returns color defined by label lab
//! Returns False if the label is not in colortable //! Returns False if the label is not in colortable
//! or does not define a color //! or does not define a color
Standard_EXPORT static Standard_Boolean GetColor (const TDF_Label& lab, Quantity_Color& col); Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& lab, Quantity_Color& col) const;
//! Returns color defined by label lab //! Returns color defined by label lab
//! Returns False if the label is not in colortable //! Returns False if the label is not in colortable
//! or does not define a color //! or does not define a color
Standard_EXPORT static Standard_Boolean GetColor(const TDF_Label& lab, Quantity_ColorRGBA& col); Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& lab, Quantity_ColorRGBA& col) const;
//! Finds a color definition in a colortable and returns //! Finds a color definition in a colortable and returns
//! its label if found //! its label if found
@@ -150,11 +150,11 @@ public:
//! Returns color assigned to <L> as <type> //! Returns color assigned to <L> as <type>
//! Returns False if no such color is assigned //! Returns False if no such color is assigned
Standard_EXPORT static Standard_Boolean GetColor (const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_Color& color); Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_Color& color);
//! Returns color assigned to <L> as <type> //! Returns color assigned to <L> as <type>
//! Returns False if no such color is assigned //! Returns False if no such color is assigned
Standard_EXPORT static Standard_Boolean GetColor(const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color); Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color);
//! Sets a link with GUID defined by <type> (see //! Sets a link with GUID defined by <type> (see
//! XCAFDoc::ColorRefGUID()) from label <L> to color //! XCAFDoc::ColorRefGUID()) from label <L> to color
@@ -198,7 +198,7 @@ public:
Standard_EXPORT Standard_Boolean GetColor(const TopoDS_Shape& S, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color); Standard_EXPORT Standard_Boolean GetColor(const TopoDS_Shape& S, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color);
//! Return TRUE if object on this label is visible, FALSE if invisible. //! Return TRUE if object on this label is visible, FALSE if invisible.
Standard_EXPORT static Standard_Boolean IsVisible (const TDF_Label& L); Standard_EXPORT Standard_Boolean IsVisible (const TDF_Label& L) const;
//! Set the visibility of object on label. Do nothing if there no any object. //! Set the visibility of object on label. Do nothing if there no any object.
//! Set UAttribute with corresponding GUID. //! Set UAttribute with corresponding GUID.

View File

@@ -503,7 +503,7 @@ TDF_Label XCAFDoc_DimTolTool::SetDimTol(const TDF_Label& L,
Standard_Boolean XCAFDoc_DimTolTool::GetRefShapeLabel(const TDF_Label& theL, Standard_Boolean XCAFDoc_DimTolTool::GetRefShapeLabel(const TDF_Label& theL,
TDF_LabelSequence& theShapeLFirst, TDF_LabelSequence& theShapeLFirst,
TDF_LabelSequence& theShapeLSecond) TDF_LabelSequence& theShapeLSecond) const
{ {
theShapeLFirst.Clear(); theShapeLFirst.Clear();
theShapeLSecond.Clear(); theShapeLSecond.Clear();
@@ -855,7 +855,7 @@ Standard_Boolean XCAFDoc_DimTolTool::GetDatum(const TDF_Label& theDatumL,
//======================================================================= //=======================================================================
Standard_Boolean XCAFDoc_DimTolTool::GetDatumOfTolerLabels(const TDF_Label& theDimTolL, Standard_Boolean XCAFDoc_DimTolTool::GetDatumOfTolerLabels(const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums) TDF_LabelSequence& theDatums) const
{ {
Handle(XCAFDoc_GraphNode) aNode; Handle(XCAFDoc_GraphNode) aNode;
if( !theDimTolL.FindAttribute(XCAFDoc::DatumTolRefGUID(),aNode) ) if( !theDimTolL.FindAttribute(XCAFDoc::DatumTolRefGUID(),aNode) )
@@ -874,7 +874,7 @@ Standard_Boolean XCAFDoc_DimTolTool::GetDatumOfTolerLabels(const TDF_Label& theD
//======================================================================= //=======================================================================
Standard_Boolean XCAFDoc_DimTolTool::GetDatumWithObjectOfTolerLabels(const TDF_Label& theDimTolL, Standard_Boolean XCAFDoc_DimTolTool::GetDatumWithObjectOfTolerLabels(const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums) TDF_LabelSequence& theDatums) const
{ {
Handle(XCAFDoc_GraphNode) aNode; Handle(XCAFDoc_GraphNode) aNode;
if( !theDimTolL.FindAttribute(XCAFDoc::DatumTolRefGUID(),aNode) ) if( !theDimTolL.FindAttribute(XCAFDoc::DatumTolRefGUID(),aNode) )

View File

@@ -155,9 +155,9 @@ public:
//! Gets all shape labels referred by theL label of the GD&T table. //! Gets all shape labels referred by theL label of the GD&T table.
//! Returns False if there are no shape labels added to the sequences. //! Returns False if there are no shape labels added to the sequences.
Standard_EXPORT static Standard_Boolean GetRefShapeLabel (const TDF_Label& theL, Standard_EXPORT Standard_Boolean GetRefShapeLabel (const TDF_Label& theL,
TDF_LabelSequence& theShapeLFirst, TDF_LabelSequence& theShapeLFirst,
TDF_LabelSequence& theShapeLSecond); TDF_LabelSequence& theShapeLSecond) const;
//! Returns dimension tolerance assigned to theDimTolL label. //! Returns dimension tolerance assigned to theDimTolL label.
//! Returns False if no such dimension tolerance is assigned. //! Returns False if no such dimension tolerance is assigned.
@@ -215,12 +215,12 @@ public:
Handle(TCollection_HAsciiString)& theIdentification) const; Handle(TCollection_HAsciiString)& theIdentification) const;
//! Returns all Datum labels defined for theDimTolL label. //! Returns all Datum labels defined for theDimTolL label.
Standard_EXPORT static Standard_Boolean GetDatumOfTolerLabels (const TDF_Label& theDimTolL, Standard_EXPORT Standard_Boolean GetDatumOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums); TDF_LabelSequence& theDatums) const;
//! Returns all Datum labels with XCAFDimTolObjects_DatumObject defined for label theDimTolL. //! Returns all Datum labels with XCAFDimTolObjects_DatumObject defined for label theDimTolL.
Standard_EXPORT static Standard_Boolean GetDatumWithObjectOfTolerLabels (const TDF_Label& theDimTolL, Standard_EXPORT Standard_Boolean GetDatumWithObjectOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums); TDF_LabelSequence& theDatums) const;
//! Returns all GeomToleranses labels defined for theDatumL label. //! Returns all GeomToleranses labels defined for theDatumL label.
Standard_EXPORT Standard_Boolean GetTolerOfDatumLabels (const TDF_Label& theDatumL, Standard_EXPORT Standard_Boolean GetTolerOfDatumLabels (const TDF_Label& theDatumL,

View File

@@ -416,20 +416,20 @@ Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TDF
//function : GetShapesOfLayer //function : GetShapesOfLayer
//purpose : //purpose :
//======================================================================= //=======================================================================
void XCAFDoc_LayerTool::GetShapesOfLayer(const TDF_Label& theLayerL,
TDF_LabelSequence& theShLabels) void XCAFDoc_LayerTool::GetShapesOfLayer(const TDF_Label& layerL,
TDF_LabelSequence& ShLabels) const
{ {
theShLabels.Clear(); ShLabels.Clear();
Handle(XCAFDoc_GraphNode) aGNode; Handle(XCAFDoc_GraphNode) aGNode;
if (theLayerL.FindAttribute(XCAFDoc::LayerRefGUID(), aGNode)) if ( layerL.FindAttribute( XCAFDoc::LayerRefGUID(), aGNode) ) {
{ for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++) {
for (Standard_Integer aChildInd = 1; aChildInd <= aGNode->NbChildren(); aChildInd++) ShLabels.Append( aGNode->GetChild(i)->Label() );
{
theShLabels.Append(aGNode->GetChild(aChildInd)->Label());
} }
} }
} }
//======================================================================= //=======================================================================
//function : IsVisible //function : IsVisible
//purpose : //purpose :

View File

@@ -135,7 +135,7 @@ public:
Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetLayers (const TDF_Label& L); Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetLayers (const TDF_Label& L);
//! Return sequanese of shape labels that assigned with layers to <ShLabels>. //! Return sequanese of shape labels that assigned with layers to <ShLabels>.
Standard_EXPORT static void GetShapesOfLayer (const TDF_Label& theLayerL, TDF_LabelSequence& theShLabels); Standard_EXPORT void GetShapesOfLayer (const TDF_Label& layerL, TDF_LabelSequence& ShLabels) const;
//! Return TRUE if layer is visible, FALSE if invisible. //! Return TRUE if layer is visible, FALSE if invisible.
Standard_EXPORT Standard_Boolean IsVisible (const TDF_Label& layerL) const; Standard_EXPORT Standard_Boolean IsVisible (const TDF_Label& layerL) const;

View File

@@ -184,7 +184,7 @@ Standard_Boolean XCAFDoc_MaterialTool::GetMaterial(const TDF_Label& MatL,
Handle(TCollection_HAsciiString)& aDescription, Handle(TCollection_HAsciiString)& aDescription,
Standard_Real& aDensity, Standard_Real& aDensity,
Handle(TCollection_HAsciiString)& aDensName, Handle(TCollection_HAsciiString)& aDensName,
Handle(TCollection_HAsciiString)& aDensValType) Handle(TCollection_HAsciiString)& aDensValType) const
{ {
Handle(XCAFDoc_Material) MatAttr; Handle(XCAFDoc_Material) MatAttr;
if(!MatL.FindAttribute(XCAFDoc_Material::GetID(),MatAttr)) { if(!MatL.FindAttribute(XCAFDoc_Material::GetID(),MatAttr)) {

View File

@@ -76,7 +76,7 @@ public:
//! Returns Material assigned to <MatL> //! Returns Material assigned to <MatL>
//! Returns False if no such Material is assigned //! Returns False if no such Material is assigned
Standard_EXPORT static Standard_Boolean GetMaterial (const TDF_Label& MatL, Handle(TCollection_HAsciiString)& aName, Handle(TCollection_HAsciiString)& aDescription, Standard_Real& aDensity, Handle(TCollection_HAsciiString)& aDensName, Handle(TCollection_HAsciiString)& aDensValType); Standard_EXPORT Standard_Boolean GetMaterial (const TDF_Label& MatL, Handle(TCollection_HAsciiString)& aName, Handle(TCollection_HAsciiString)& aDescription, Standard_Real& aDensity, Handle(TCollection_HAsciiString)& aDensName, Handle(TCollection_HAsciiString)& aDensValType) const;
//! Find referred material and return density from it //! Find referred material and return density from it
//! if no material --> return 0 //! if no material --> return 0

View File

@@ -353,47 +353,6 @@ TopoDS_Shape XCAFDoc_ShapeTool::GetShape(const TDF_Label& L)
return aShape; return aShape;
} }
//=======================================================================
//function : GetShapes
//purpose :
//=======================================================================
TopoDS_Shape XCAFDoc_ShapeTool::GetOneShape(const TDF_LabelSequence& theLabels)
{
TopoDS_Shape aShape;
if (theLabels.Length() == 1)
{
return GetShape(theLabels.Value(1));
}
TopoDS_Compound aCompound;
BRep_Builder aBuilder;
aBuilder.MakeCompound(aCompound);
for (TDF_LabelSequence::Iterator anIt(theLabels); anIt.More(); anIt.Next())
{
TopoDS_Shape aFreeShape;
if (!GetShape(anIt.Value(), aFreeShape))
{
continue;
}
aBuilder.Add(aCompound, aFreeShape);
}
if (aCompound.NbChildren() > 0)
{
aShape = aCompound;
}
return aShape;
}
//=======================================================================
//function : GetOneShape
//purpose :
//=======================================================================
TopoDS_Shape XCAFDoc_ShapeTool::GetOneShape() const
{
TDF_LabelSequence aLabels;
GetFreeShapes(aLabels);
return GetOneShape(aLabels);
}
//======================================================================= //=======================================================================
//function : NewShape //function : NewShape
//purpose : //purpose :

View File

@@ -197,15 +197,6 @@ public:
//! Returns Null shape if label does not contain shape //! Returns Null shape if label does not contain shape
Standard_EXPORT static TopoDS_Shape GetShape (const TDF_Label& L); Standard_EXPORT static TopoDS_Shape GetShape (const TDF_Label& L);
//! Gets shape from a sequence of shape's labels
//! @param[in] theLabels a sequence of labels to get shapes from
//! @return original shape in case of one label and a compound of shapes in case of more
Standard_EXPORT static TopoDS_Shape GetOneShape(const TDF_LabelSequence& theLabels);
//! Gets shape from a sequence of all top-level shapes which are free
//! @return original shape in case of one label and a compound of shapes in case of more
Standard_EXPORT TopoDS_Shape GetOneShape() const;
//! Creates new (empty) top-level shape. //! Creates new (empty) top-level shape.
//! Initially it holds empty TopoDS_Compound //! Initially it holds empty TopoDS_Compound
Standard_EXPORT TDF_Label NewShape() const; Standard_EXPORT TDF_Label NewShape() const;

View File

@@ -79,10 +79,13 @@ const Handle(XCAFDoc_ShapeTool)& XCAFDoc_VisMaterialTool::ShapeTool()
//function : GetMaterial //function : GetMaterial
//purpose : //purpose :
//======================================================================= //=======================================================================
Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetMaterial(const TDF_Label& theMatLabel) Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetMaterial (const TDF_Label& theMatLabel) const
{ {
Handle(XCAFDoc_VisMaterial) aMatAttrib; Handle(XCAFDoc_VisMaterial) aMatAttrib;
theMatLabel.FindAttribute(XCAFDoc_VisMaterial::GetID(), aMatAttrib); if (theMatLabel.Father() == Label())
{
theMatLabel.FindAttribute (XCAFDoc_VisMaterial::GetID(), aMatAttrib);
}
return aMatAttrib; return aMatAttrib;
} }
@@ -211,7 +214,8 @@ Standard_Boolean XCAFDoc_VisMaterialTool::GetShapeMaterial (const TDF_Label& the
Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetShapeMaterial (const TDF_Label& theShapeLabel) Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetShapeMaterial (const TDF_Label& theShapeLabel)
{ {
TDF_Label aMatLabel; TDF_Label aMatLabel;
return GetShapeMaterial (theShapeLabel, aMatLabel) return Label().HasChild() // do not waste time on shape attributes if materials map is empty
&& GetShapeMaterial (theShapeLabel, aMatLabel)
? GetMaterial (aMatLabel) ? GetMaterial (aMatLabel)
: Handle(XCAFDoc_VisMaterial)(); : Handle(XCAFDoc_VisMaterial)();
} }

View File

@@ -56,7 +56,7 @@ public:
Standard_Boolean IsMaterial (const TDF_Label& theLabel) const { return !GetMaterial (theLabel).IsNull(); } Standard_Boolean IsMaterial (const TDF_Label& theLabel) const { return !GetMaterial (theLabel).IsNull(); }
//! Returns Material defined by specified Label, or NULL if the label is not in Material Table. //! Returns Material defined by specified Label, or NULL if the label is not in Material Table.
Standard_EXPORT static Handle(XCAFDoc_VisMaterial) GetMaterial (const TDF_Label& theMatLabel); Standard_EXPORT Handle(XCAFDoc_VisMaterial) GetMaterial (const TDF_Label& theMatLabel) const;
//! Adds Material definition to a Material Table and returns its Label. //! Adds Material definition to a Material Table and returns its Label.
Standard_EXPORT TDF_Label AddMaterial (const Handle(XCAFDoc_VisMaterial)& theMat, Standard_EXPORT TDF_Label AddMaterial (const Handle(XCAFDoc_VisMaterial)& theMat,
@@ -88,7 +88,7 @@ public:
Standard_EXPORT static Standard_Boolean GetShapeMaterial (const TDF_Label& theShapeLabel, TDF_Label& theMaterialLabel); Standard_EXPORT static Standard_Boolean GetShapeMaterial (const TDF_Label& theShapeLabel, TDF_Label& theMaterialLabel);
//! Returns material assigned to the shape label. //! Returns material assigned to the shape label.
Standard_EXPORT static Handle(XCAFDoc_VisMaterial) GetShapeMaterial (const TDF_Label& theShapeLabel); Standard_EXPORT Handle(XCAFDoc_VisMaterial) GetShapeMaterial (const TDF_Label& theShapeLabel);
//! Sets a link with GUID XCAFDoc::VisMaterialRefGUID() from shape label to material label. //! Sets a link with GUID XCAFDoc::VisMaterialRefGUID() from shape label to material label.
//! @param theShape [in] shape //! @param theShape [in] shape

View File

@@ -509,37 +509,40 @@ static Standard_Integer getFreeShapes (Draw_Interpretor& di, Standard_Integer ar
return 0; return 0;
} }
//======================================================================= static Standard_Integer getOneShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
//function : getOneShape
//purpose :
//=======================================================================
static Standard_Integer getOneShape (Draw_Interpretor& theDI,
Standard_Integer theNbArgs,
const char** theArgVec)
{ {
if ( theNbArgs !=3 ) if (argc!=3) {
{ di<<"Use: "<<argv[0]<<" shape DocName \n";
theDI <<"Use: "<< theArgVec[0]<<" shape DocName \n";
return 1; return 1;
} }
Handle(TDocStd_Document) aDoc; Handle(TDocStd_Document) Doc;
DDocStd::GetDocument(theArgVec[2], aDoc); DDocStd::GetDocument(argv[2], Doc);
if ( aDoc.IsNull() ) if ( Doc.IsNull() ) { di << argv[2] << " is not a document\n"; return 1; }
{
theDI << "Error: " << theArgVec[2] << " is not a document\n"; TDF_LabelSequence Labels;
return 1; Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
STool->GetFreeShapes(Labels);
if ( Labels.Length() <=0 ) {
di << "Document " << argv[2] << " contain no shapes\n";
return 0;
} }
Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main()); if ( Labels.Length() ==1 ) {
TopoDS_Shape aShape = aSTool->GetOneShape(); TopoDS_Shape S = STool->GetShape ( Labels.Value(1) );
if (aShape.IsNull()) DBRep::Set ( argv[1], S );
{
theDI << "Error: Document " << theArgVec[2] << " contain no shapes\n";
return 1;
} }
DBRep::Set (theArgVec[1], aShape); else {
theDI << theArgVec[1]; TopoDS_Compound C;
BRep_Builder B;
B.MakeCompound ( C );
for ( Standard_Integer i = 1; i<= Labels.Length(); i++) {
TopoDS_Shape S = STool->GetShape ( Labels.Value(i) );
B.Add ( C, S );
}
DBRep::Set ( argv[1], C );
}
di << argv[1];
return 0; return 0;
} }

View File

@@ -1,17 +0,0 @@
puts "==================================================="
puts "0033326: Data Exchange, IGES Import - Ignoring unit value for validating geometry"
puts "==================================================="
puts ""
pload DCAF
Close D -silent
ReadIges D [locate_data_file "bug33326.igs"]
vclear
vinit View1
XDisplay -dispMode 1 D
vfit
vdump "$imagedir/${casename}_src.png"
Close D

View File

@@ -1,24 +0,0 @@
puts "========"
puts "0033315: Mesh - BRepMesh_IncrementalMesh takes forever to finish (ends up with system memory, etc)"
puts "========"
puts ""
restore [locate_data_file bug33315.brep] result
incmesh result 3.5 -a 20
checktrinfo result -tri 1516 -nod 1118
vinit
vsetdispmode 1
vdefaults -autoTriang 0
vdisplay result
vfit
checkview -screenshot -3d -path ${imagedir}/${test_image}.png
set log [tricheck result]
if { [llength $log] != 0 } {
puts "Error : Invalid mesh"
} else {
puts "Mesh is OK"
}

View File

@@ -1,4 +1,4 @@
puts "TODO OCC26556 ALL: ERROR. Mixed connectivity of faces." puts "TODO OCC26556 ALL: ERROR. offsetperform operation not done."
puts "============" puts "============"
puts "OCC5805" puts "OCC5805"
@@ -20,7 +20,6 @@ if { [catch { offsetshape result a -1 a_6 } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong" puts "Faulty ${BugNumber} : offsetshape is wrong"
} }
if { [isdraw result] } {
checkmaxtol result -min_tol 1. checkmaxtol result -min_tol 1.
checkprops result -s 1185.03 checkprops result -s 1185.03
@@ -28,4 +27,3 @@ checkshape result
checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41 checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41
checkview -display result -2d -path ${imagedir}/${test_image}.png checkview -display result -2d -path ${imagedir}/${test_image}.png
}

View File

@@ -1,4 +1,6 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces." puts "TODO OCC25925 ALL: ERROR. offsetperform operation not done."
puts "TODO OCC25925 ALL: Tcl Exception:"
puts "TODO OCC25925 ALL: TEST INCOMPLETE"
puts "============" puts "============"
puts "OCC5805" puts "OCC5805"
@@ -23,7 +25,6 @@ if { [catch { offsetperform result } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong" puts "Faulty ${BugNumber} : offsetshape is wrong"
} }
if { [isdraw result] } {
checkmaxtol result -min_tol 1. checkmaxtol result -min_tol 1.
checkprops result -s 1185.03 checkprops result -s 1185.03
@@ -31,4 +32,3 @@ checkshape result
checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41 checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41
checkview -display result -2d -path ${imagedir}/${test_image}.png checkview -display result -2d -path ${imagedir}/${test_image}.png
}

View File

@@ -1,5 +1,3 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "============" puts "============"
puts "OCC5805" puts "OCC5805"
puts "============" puts "============"
@@ -23,7 +21,6 @@ if { [catch { offsetperform result } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong" puts "Faulty ${BugNumber} : offsetshape is wrong"
} }
if { [isdraw result] } {
checkmaxtol result -min_tol 1. checkmaxtol result -min_tol 1.
checkprops result -s 876.584 checkprops result -s 876.584
@@ -31,5 +28,3 @@ checkshape result
checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41 checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41
checkview -display result -2d -path ${imagedir}/${test_image}.png checkview -display result -2d -path ${imagedir}/${test_image}.png
}

View File

@@ -1,5 +1,3 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "============" puts "============"
puts "OCC5805" puts "OCC5805"
puts "============" puts "============"
@@ -18,12 +16,9 @@ if { [catch { offsetshape result a -1 } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong" puts "Faulty ${BugNumber} : offsetshape is wrong"
} }
if { [isdraw result] } {
checkmaxtol result -min_tol 1. checkmaxtol result -min_tol 1.
checkprops result -s 876.584 checkprops result -s 876.584
checkshape result checkshape result
checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41 checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41
checkview -display result -2d -path ${imagedir}/${test_image}.png checkview -display result -2d -path ${imagedir}/${test_image}.png
}

View File

@@ -1,18 +0,0 @@
puts "================================"
puts "OCC33113: Modeling Algorithms - BRepFilletAPI_MakeFillet::Build SIGSEGV"
puts "================================"
restore [locate_data_file bug33113.brep] sh
explode sh e
copy sh_4 e
explode sh So
copy sh_1 s
fillet res s 0.1 e
checkshape res
checkview -display res -3d -path ${imagedir}/${test_image}.png

View File

@@ -1,13 +0,0 @@
puts "============"
puts "0033227: Modeling Algorithm - BOPAlgo_BuilderSolid generates incomplete result"
puts "============"
puts ""
restore [locate_data_file bug33227.brep] s
bopbsolid r s
compound r_2 r_3 res
checknbshapes res -shell 6 -solid 2
checkprops res -v 3.33117e+07
checkview -display res -2d -path ${imagedir}/${test_image}.png

View File

@@ -1,11 +0,0 @@
puts "REQUIRED ALL: Algorithm has failed"
puts "========================"
puts "0033306: Modeling Algorithm - Crash in TrimEdge() method"
puts "========================"
puts ""
restore [locate_data_file bug33306_1.brep] w1
restore [locate_data_file bug33306_2.brep] w2
thrusections res 0 0 w1 w2

View File

@@ -1,11 +0,0 @@
puts "========================"
puts "0033311: Modeling Algorithm - No results of thrusection algorithm"
puts "========================"
puts ""
restore [locate_data_file bug33311_1.brep] w1
restore [locate_data_file bug33311_2.brep] w2
thrusections res 0 0 w1 w2
checkview -display res -2d -path ${imagedir}/${test_image}.png

View File

@@ -1,9 +0,0 @@
puts "==========================================================="
puts "0033304: Modeling Data - Floating point signal when converting a B-spline curve to analytical form"
puts "==========================================================="
puts "REQUIRED ALL: Conversion failed"
binrestore [locate_data_file bug33304_bspl_curv.bbrep] a
mkcurve c a
tocanon r c

View File

@@ -1,11 +0,0 @@
puts "==================================================="
puts "0033307: Data Exchange, Step Import - Crash after reading empty edge loop"
puts "==================================================="
puts ""
pload XDE OCAF
Close D -silent
ReadStep D [locate_data_file "bug33307.stp"]
Close D

View File

@@ -1,32 +0,0 @@
puts "========================"
puts "0033317: Data Exchange, Step Export - Ignoring color attached to the reference shape label"
puts "========================"
pload OCAF
Close D -silent
Close D1 -silent
set TempFilename ${imagedir}/${casename}_temp.stp
# Open document
XOpen [locate_data_file bug33317_solids_7_7_0.xml] D
# Get colors
set colors_old [XGetShapeColor D 0:1:1:1 generic]
# Write to STEP
WriteStep D ${TempFilename}
# Read and check
ReadStep D1 ${TempFilename}
set colors_new [XGetShapeColor D1 0:1:1:1:1 generic]
if { [string equal ${colors_new} ${colors_old}] == -1 } {
puts "ERROR: OCC33317 is reproduced while STEP export."
}
# Clear temp file
file delete -force $TempFilename
Close D
Close D1

View File

@@ -1,16 +0,0 @@
puts "======="
puts "0030828: Data Exchange - The commands getting shapes from XCAF document should be available in C++"
puts "======="
pload OCAF
XNewDoc D
box b1 10 10 10
XAddShape D b1 1
XGetOneShape b D
checknbshapes b -shape 34
box b2 10 10 10
ttranslate b2 20 0 0
XAddShape D b2 1
XGetOneShape c D
checknbshapes c -shape 69 -compound 1
Close D -silent

View File

@@ -1,16 +0,0 @@
puts "============"
puts "0033320: Data Exchange - Reading of a VRML file with a long line fails"
puts "============"
puts ""
set aFile [locate_data_file bug33320_wM_BugBlender_2.wrl]
catch { Close D }
ReadVrml D $aFile
vinit Driver1/View_${casename}/${casename}
XDisplay D -dispMode 1
vfit
checkview -screenshot -3d -path ${imagedir}/${test_image}.png
Close D

View File

@@ -1,68 +0,0 @@
puts "========"
puts "0030292: Modeling Algorithms - BRepBndLib should avoid using Poly_Polygon3D when called with useTriangulation set to false"
puts "========"
puts ""
## geometric edge without any discrete representations
circle c 0 0 0 1
mkedge e c
set res1 [bounding e]
set res2 [bounding e -noTriangulation]
if {$res1 != $res2} {
puts "Error: bounding boxes are different for geometric edge"
}
## geometric edge with polygon 3d
incmesh e 0.1
set res1_ref "-1.1000000999999999 -1.0927089740980542 -0.10000010000000001 1.1000000999999999 1.092708974098054 0.10000010000000001"
set res2_ref "-1.0000001000000001 -1.0000001000000001 -9.9999999999999995e-08 1.0000001000000001 1.0000001000000001 9.9999999999999995e-08"
unset res1
set res1 [bounding e]
foreach dd $res1 {
if ![regexp $dd $res1_ref] {
puts "Error: bounding box is wrong"
}
}
unset res2
set res2 [bounding e -noTriangulation]
foreach dd $res2 {
if ![regexp $dd $res2_ref] {
puts "Error: bounding box is wrong"
}
}
## geometric edge with polygon on triangulation
pcylinder cyl 1 1
incmesh cyl 0.1
explode cyl e
renamevar cyl_3 e
unset res1
set res1 [bounding e]
foreach dd $res1 {
if ![regexp $dd $res1_ref] {
puts "Error: bounding box is wrong"
}
}
unset res2
set res2 [bounding e -noTriangulation]
foreach dd $res2 {
if ![regexp $dd $res2_ref] {
puts "Error: bounding box is wrong"
}
}
## not geometric edge with polygon 3d
polygon3d pol3d 5 1 0 0 0 1 0 -1 0 0 0 -1 0 1 0 0
mkedge e pol3d
unset res1
set res1 [bounding e]
unset res2
set res2 [bounding e -noTriangulation]
if {$res1 != $res2} {
puts "Error: bounding boxes are different for not geometric edge"
}

View File

@@ -1,5 +1,4 @@
puts "TODO OCC26030 ALL: Error : The offset cannot be built" puts "TODO OCC26030 ALL: Error : The offset cannot be built"
puts "TODO OCC26030 ALL: ERROR. Mixed connectivity of faces."
puts "========" puts "========"
puts "OCC26288" puts "OCC26288"

View File

@@ -1,5 +1,6 @@
puts "TODO OCC26577 All: ERROR. Mixed connectivity of faces." puts "TODO OCC26577 All: Error : is WRONG because number of EDGE entities in shape"
puts "TODO OCC26577 All: Error : The offset cannot be built." puts "TODO OCC26577 All: Error : is WRONG because number of SHELL entities in shape"
puts "==============================================================" puts "=============================================================="
puts "0027913: Sharing between edges was lost after offset operation" puts "0027913: Sharing between edges was lost after offset operation"
@@ -11,11 +12,9 @@ offsetparameter 1e-7 p i
offsetload s 10 offsetload s 10
offsetperform result offsetperform result
if { [isdraw result] } { unifysamedom result_unif result
unifysamedom result_unif result
checkshape result checkshape result
checkview -display result_unif -2d -path ${imagedir}/${test_image}.png checkview -display result_unif -2d -path ${imagedir}/${test_image}.png
checknbshapes result -ref [lrange [nbshapes s] 8 19] checknbshapes result -ref [lrange [nbshapes s] 8 19]
}

View File

@@ -1,13 +0,0 @@
puts "REQUIRED All: ERROR. Mixed connectivity of faces."
puts "REQUIRED All: Error : The offset cannot be built."
puts "============"
puts "0030055: BRepOffset_MakeOffset throws TopoDS_Vertex hasn't gp_Pnt in intersection mode"
puts "============"
restore [locate_data_file bug30055.brep] a
thickshell result a 1 i
if { [isdraw result] } {
puts "ERROR - result must not be buit"
}

View File

@@ -1,6 +1,4 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces." puts "TODO OCC25925 ALL: ERROR. offsetperform operation not done."
puts "TODO OCC25925 ALL: Error : The offset cannot be built."
puts "============" puts "============"
puts "OCC5806" puts "OCC5806"
puts "============" puts "============"
@@ -30,12 +28,11 @@ explode resthru f
if { [catch { offsetshape result resthru -0.5 resthru_6 resthru_7 } catch_result] } { if { [catch { offsetshape result resthru -0.5 resthru_6 resthru_7 } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong" puts "Faulty ${BugNumber} : offsetshape is wrong"
} }
if { [isdraw result] } {
checkmaxtol result -min_tol 1.
checkprops result -s 1116.06 checkmaxtol result -min_tol 1.
checkshape result
checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 - compound 0 -shape 41 checkprops result -s 1116.06
checkview -display result -2d -path ${imagedir}/${test_image}.png checkshape result
}
checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41
checkview -display result -2d -path ${imagedir}/${test_image}.png

View File

@@ -1,7 +1,7 @@
puts "TODO OCC23190 ALL: ERROR. C0 continuity of input data." puts "TODO OCC23190 ALL: ERROR. C0 continuity of input data."
puts "TODO OCC23190 ALL: Error: The command cannot be built" puts "TODO OCC23190 ALL: Error: The command cannot be built"
puts "TODO OCC23068 ALL: Error : The offset cannot be built." puts "TODO OCC23190 ALL: result is not a topological shape!!!"
puts "TODO OCC23068 ALL: TEST INCOMPLETE"
# Original bug : hkg60144/pro15325 # Original bug : hkg60144/pro15325
# Date : 17Juillet98 # Date : 17Juillet98

View File

@@ -1,7 +1,7 @@
puts "TODO OCC23190 ALL: ERROR. C0 continuity of input data." puts "TODO OCC23190 ALL: ERROR. C0 continuity of input data."
puts "TODO OCC23190 ALL: Error: The command cannot be built" puts "TODO OCC23190 ALL: Error: The command cannot be built"
puts "TODO OCC23068 ALL: Error : The offset cannot be built." puts "TODO OCC23190 ALL: result is not a topological shape!!!"
puts "TODO OCC23068 ALL: TEST INCOMPLETE"
# Original bug : cts21271 # Original bug : cts21271
# Date : 11Sept98 # Date : 11Sept98

View File

@@ -1,8 +0,0 @@
restore [locate_data_file bug33298.brep] s
OFFSETSHAPE 35 {} $calcul $type
checkprops result -v 1.20105e+08
checknbshapes result -shell 1

View File

@@ -1,8 +0,0 @@
restore [locate_data_file bug33298_trimmed.brep] s
OFFSETSHAPE 35 {} $calcul $type
checkprops result -v 7.3756e+07
checknbshapes result -shell 1

View File

@@ -1,7 +1,8 @@
puts "TODO CR27414 ALL: Error: number of wire entities in the result" puts "TODO CR27414 ALL: Error: number of wire entities in the result"
puts "TODO CR27414 ALL: Error: number of face entities in the result" puts "TODO CR27414 ALL: Error: number of face entities in the result"
puts "TODO CR27414 ALL: Error: operation with offset value 9 has failed"
puts "TODO CR27414 ALL: Error: operation with offset value 10 has failed" puts "TODO CR27414 ALL: Error: operation with offset value 10 has failed"
puts "TODO CR27414 ALL: Operations with following offset values have failed: 10" puts "TODO CR27414 ALL: Operations with following offset values have failed: 9 10"
puts "=============================================================================================" puts "============================================================================================="
puts "0032333: Modeling Algorithms - Empty(wrong) result of offset operation in mode \"Complete\" join type \"Intersection\"" puts "0032333: Modeling Algorithms - Empty(wrong) result of offset operation in mode \"Complete\" join type \"Intersection\""

View File

@@ -1,5 +1,3 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "========" puts "========"
puts "OCC26443" puts "OCC26443"
puts "========" puts "========"
@@ -17,8 +15,6 @@ offsetshape r a -2
dchrono h stop counter offsetshape dchrono h stop counter offsetshape
fit fit
if { [isdraw r] } {
checkshape r checkshape r
checknbshapes r -ref [lrange [nbshapes a] 8 19] checknbshapes r -ref [lrange [nbshapes a] 8 19]
checkview -screenshot -2d -path ${imagedir}/${test_image}.png checkview -screenshot -2d -path ${imagedir}/${test_image}.png
}

View File

@@ -1,28 +0,0 @@
puts "============"
puts "0032570: Visualization, AIS_AnimationObject - define rotation around axis"
puts "============"
puts ""
pload MODELING VISUALIZATION
box b1 2 100 100 -preview
box b2 2 100 100 -preview
vinit View1
vdisplay b1 -dispMode 0
vdisplay b2 -dispMode 1
vanimation anim -object b2 -axis 2 100 0 0 0 1 -angle1 0 -angle2 90 -duration 2
#stop at the middle of the animation (45 degrees)
vanimation anim -play 1 0
vanimation anim -stop
vfit
vdump ${imagedir}/${casename}.png
set loc1 [vlocation b2]
vlocation b2 -reset -rotate 2 100 0 0 0 1 45
set loc2 [vlocation b2]
if {$loc1 != $loc2} { puts "Error: the location at the middle of animation is different from the location after rotating by 45 degrees" }
puts "Put the following command to start interactive animation:"
puts " vanimation anim -play"

View File

@@ -176,7 +176,7 @@ check_picking $pick_coord $check_coord "diameter dimension (diam1)"
check_cross_picking $pick_coord diam1 "diameter dimension (diam1)" check_cross_picking $pick_coord diam1 "diameter dimension (diam1)"
# check sensitives "diam2" # check sensitives "diam2"
set pick_coord { { 222 99 } { 285 99 } } set pick_coord { { 221 99 } { 285 99 } }
set check_coord { 239 99 } set check_coord { 239 99 }
check_picking $pick_coord $check_coord "diameter dimension (diam2)" check_picking $pick_coord $check_coord "diameter dimension (diam2)"
check_cross_picking $pick_coord diam2 "diameter dimension (diam2)" check_cross_picking $pick_coord diam2 "diameter dimension (diam2)"

View File

@@ -15,8 +15,8 @@ vmanipulator m -attach b
vdump $imagedir/${casename}_1.png vdump $imagedir/${casename}_1.png
set mouse_pick {231 207} set mouse_pick {226 214}
set mouse_drag {311 258} set mouse_drag {306 265}
# note: mouse events cannot be emulated here, so the original bug cannot be reproduced by this test case # note: mouse events cannot be emulated here, so the original bug cannot be reproduced by this test case
vmoveto {*}$mouse_pick vmoveto {*}$mouse_pick

View File

@@ -61,7 +61,7 @@ vdump $anImage2
# ------------------------------------------- # -------------------------------------------
set mouse_pick {316 261} set mouse_pick {316 261}
set mouse_drag {281 286} set mouse_drag {279 286}
vmoveto {*}$mouse_pick vmoveto {*}$mouse_pick
vselect {*}$mouse_pick vselect {*}$mouse_pick

View File

@@ -47,7 +47,7 @@ vmanipulator m -attach c1 -adjustPosition 1 -adjustSize 0 -enableModes 1 -size 4
vmanipulator m -followRotation 1 vmanipulator m -followRotation 1
set mouse_pick {199 092} set mouse_pick {200 092}
set mouse_drag {176 142} set mouse_drag {176 142}
vmoveto {*}$mouse_pick vmoveto {*}$mouse_pick
@@ -65,8 +65,8 @@ vdump $anImage1
vmanipulator m -followRotation 1 vmanipulator m -followRotation 1
set mouse_pick {175 135} set mouse_pick {173 137}
set mouse_drag {232 144} set mouse_drag {233 144}
vmoveto {*}$mouse_pick vmoveto {*}$mouse_pick
vselect {*}$mouse_pick vselect {*}$mouse_pick
@@ -113,7 +113,7 @@ vmanipulator m -followRotation 0
# test rotation around y axis (world reference frame) # test rotation around y axis (world reference frame)
# --------------------------------------------------- # ---------------------------------------------------
set mouse_pick {205 088} set mouse_pick {205 087}
set mouse_drag {232 127} set mouse_drag {232 127}
vmoveto {*}$mouse_pick vmoveto {*}$mouse_pick
@@ -129,7 +129,7 @@ vdump $anImage4
# test rotation around z axis (world reference frame) # test rotation around z axis (world reference frame)
# --------------------------------------------------- # ---------------------------------------------------
set mouse_pick {228 142} set mouse_pick {228 141}
set mouse_drag {184 143} set mouse_drag {184 143}
vmoveto {*}$mouse_pick vmoveto {*}$mouse_pick

View File

@@ -144,7 +144,7 @@ vdump $anImage4
# ---------------------------------------------------- # ----------------------------------------------------
set mouse_pick {199 164} set mouse_pick {199 164}
set mouse_drag {246 176} set mouse_drag {246 177}
vmoveto {*}$mouse_pick vmoveto {*}$mouse_pick
vselect {*}$mouse_pick vselect {*}$mouse_pick

View File

@@ -11,7 +11,7 @@ set x1 210
set y1 184 set y1 184
set x2 207 set x2 207
set y2 182 set y2 180
stepread [locate_data_file OCC23012-Sample_3.stp] a * stepread [locate_data_file OCC23012-Sample_3.stp] a *
stepread [locate_data_file OCC23012-Sample_9.stp] b * stepread [locate_data_file OCC23012-Sample_9.stp] b *

View File

@@ -16,7 +16,7 @@ vselect 300 200 300 60 400 60 407 150 -xor
set NbSelected1 [vnbselected] set NbSelected1 [vnbselected]
if { ${NbSelected1} != 13 } { puts "Error : Polygonal shift selection doesn't work properly" } if { ${NbSelected1} != 13 } { puts "Error : Polygonal shift selection doesn't work properly" }
vselect 350 121 -xor vselect 350 120 -xor
set NbSelected1 [vnbselected] set NbSelected1 [vnbselected]
if { ${NbSelected1} != 12 } { puts "Error : (case 2)" } if { ${NbSelected1} != 12 } { puts "Error : (case 2)" }

View File

@@ -1,23 +0,0 @@
puts "============="
puts "0027848: Visualization - sensitivity of lines is too high"
puts "============="
pload VISUALIZATION
vinit View1
vclear
box b 10 10 0.1
vdisplay b -dispmode 1
vline l 0 0 0 10 10 0
vdisplay l
vpoint p 20 20 0
vtop
vfit
vselect 100 305
if { [string match "*AIS_Line*" [vstate]] } { puts "Error: AIS_Shape should be detected" }

View File

@@ -39,28 +39,28 @@ if { ![check_highlighting 0 $coords] } {
puts "ERROR: incorrect highlighting of edge 10" puts "ERROR: incorrect highlighting of edge 10"
} }
vselnext
if { ![check_highlighting 2 $coords] } {
puts "ERROR: incorrect highlighting of edge 1 after vselnext call"
}
vselnext vselnext
if { ![check_highlighting 1 $coords] } { if { ![check_highlighting 1 $coords] } {
puts "ERROR: incorrect highlighting of edge 2 after vselnext call" puts "ERROR: incorrect highlighting of edge 2 after vselnext call"
} }
vselnext vselnext
if { ![check_highlighting 2 $coords] } {
puts "ERROR: incorrect highlighting of edge 1 after vselnext call"
}
vselnext
if { ![check_highlighting 0 $coords] } { if { ![check_highlighting 0 $coords] } {
puts "ERROR: incorrect highlighting of edge 10 after vselnext call" puts "ERROR: incorrect highlighting of edge 10 after vselnext call"
} }
vselprev
if { ![check_highlighting 1 $coords] } {
puts "ERROR: incorrect highlighting of edge 2 after vselprev call"
}
vselprev vselprev
if { ![check_highlighting 2 $coords] } { if { ![check_highlighting 2 $coords] } {
puts "ERROR: incorrect highlighting of edge 1 after vselprev call" puts "ERROR: incorrect highlighting of edge 1 after vselprev call"
} }
vselprev vselprev
if { ![check_highlighting 1 $coords] } {
puts "ERROR: incorrect highlighting of edge 2 after vselprev call"
}
vselprev
if { ![check_highlighting 0 $coords] } { if { ![check_highlighting 0 $coords] } {
puts "ERROR: incorrect highlighting of edge 10 after vselprev call" puts "ERROR: incorrect highlighting of edge 10 after vselprev call"
} }