1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-19 13:40:49 +03:00

Compare commits

..

18 Commits

Author SHA1 Message Date
dpasukhi
b989082fe1 0033337: DRAW - Can't load plugins on Linux OS
WSL 2 have windows FileSystem and as a result we have \r symbols before \n
For this cases we can just remove \r\n (\n is a last symbol) for the node value.
2023-03-09 23:26:59 +00:00
akaftasev
86e352849d 0033263: Modeling Algorithms - BRepFilletAPI_MakeFillet doesn't work for current parameters
Do not calculate edge state if there are more than 4 G1 connections for currect vertex.
2023-02-10 15:35:41 +00:00
akaftasev
6d140acb14 0030292: Modeling Algorithms - BRepBndLib should avoid using Poly_Polygon3D when called with useTriangulation set to false
BRepBndLib.cxx : treatment of useTriangulation is modified according to specified behavior of algorithm
BRepTest_CurveCommands.cxx : creation edge from polygon3d is added in Draw command mkedge.
2023-02-06 17:51:52 +00:00
akaftasev
44be123039 0030055: BRepOffset_MakeOffset throws "TopoDS_Vertex hasn't gp_Pnt" in intersection mode
Diagnostic of mixed connectivity of faces along common edge is added.
If algorithm finds such pair of faces, it stops working with special error code.
2023-02-06 14:15:35 +03:00
dpasukhi
47263fa6a3 0033317: Data Exchange, Step Export - Ignoring color attached to the reference shape label
Fixed problem with pure referencing.
  To export reference label to step we convert it to the assembly with one part.
  All attributes attached to the label should be moved to the new part.
  For working with it new map contains only pure reference labels, that converted to the part
  was implemented to the STEPCAFControl_Writer.
Updated code style of the STEPCAFControl_Writer
Improved ability to export labels from different documents
Removed OCCT_Debug macros to print in Trace gravity
2023-02-04 09:18:29 +00:00
mzernova
b0afa94d10 0027848: Visualization - sensitivity of lines is too high
Improved objects sorting by depth.

The sensitivity calculation for the manipulator has been changed.
Now the sensitivity of the elements of the manipulator depends on its size.

Also fixed the problem of erroneous selection of unfilled circles (SelectMgr_Frustum<N>::hasCircleOverlap() function).

Test case vselect/bugs/bug27848 added.
2023-02-04 09:17:58 +00:00
dorlov
c772c6caa4 0030828: Data Exchange - The commands getting shapes from XCAF document should be available in C++
Added two new overloaded methods XCAFDoc_ShapeTool::GetOneShape: one returns TopoDS_Shape from TDF_LabelSequence and the other from a sequence of all top-level shapes which are free
2023-02-02 15:04:50 +00:00
mzernova
53eae1a935 0032570: Visualization, AIS_AnimationObject - define rotation around axis
When using AIS_AnimationObject, linear interpolation is performed from one gp_Trsf transformation to another.
But when an object rotates around a specific axis, the object moves not along a linear trajectory,
but along a circle. Therefore, a separate class AIS_AnimationAxisRotation was created that
allows to animate rotation around a specific axis.

Test case tests/v3d/bugs/bug32570 was added.
2023-02-01 23:26:46 +00:00
dpasukhi
d22b135217 0033307: Data Exchange, Step Import - Crash after reading empty edge loop
Fixed problem with empty edge list in the edge loop, mark as a fail entity in this case
2023-02-01 00:09:26 +00:00
vro
3c7c705d77 0033320: Data Exchange - Reading of a VRML file with a long line fails
Implement rolling back input stream to split on possible logical parts by comma or space.
2023-01-24 22:38:57 +00:00
dorlov
fc72568ba9 0033312: Data Exchange - NULL-dereference in StepToTopoDS_TranslateShell::Init()
The condition "if" was changed to opposite
2023-01-20 03:10:45 +00:00
akaftasev
107b57a955 0033311: Modeling Algorithm - No results of thrusection algorithm
Changed default value of myPercent
2023-01-17 20:47:54 +00:00
oan
8b301eb865 0033315: Mesh - BRepMesh_IncrementalMesh takes forever to finish (ends up with system memory, etc)
Added test case
2023-01-16 22:00:35 +00:00
rodrlyra
1f469e3781 0033305: Coding - BOPTools_PairSelector::Clear method uses "Clear" instead of "clear" on std::vector 2023-01-16 15:22:08 +00:00
akaftasev
ce4d294074 0033306: Modeling Algorithm - Crash in TrimEdge() method
Added condition to not cut the edges by closely located parameters
2023-01-09 21:44:11 +00:00
akaftasev
9f338a00a1 0033298: Modeling Algorithm - Offset operation gives wrong result
Process only those images of the faces, if one if them has anInsideEdges/anInsideVertices and the other is not.
2023-01-03 18:01:14 +00:00
akaftasev
a011359b8a 0033227: Modeling Algorithm - BOPAlgo_BuilderSolid generates incomplete result
Deleted outer loop for shells.
Added additional check of edges orientation for RefineShell().
2023-01-03 18:01:05 +00:00
msv
42e4ae96ae 0033304: Modeling Data - Floating point signal when converting a B-spline curve to analytical form
Protect the static function ConicDefinition from calling sqrt with negative argument.
2023-01-03 18:00:55 +00:00
83 changed files with 4231 additions and 3114 deletions

View File

@@ -0,0 +1,51 @@
// 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

@@ -0,0 +1,53 @@
// 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,10 +14,7 @@
#include <AIS_AnimationObject.hxx>
#include <AIS_InteractiveContext.hxx>
#include <V3d_View.hxx>
IMPLEMENT_STANDARD_RTTIEXT(AIS_AnimationObject, AIS_Animation)
IMPLEMENT_STANDARD_RTTIEXT(AIS_AnimationObject, AIS_BaseAnimationObject)
//=============================================================================
//function : Constructor
@@ -28,9 +25,7 @@ AIS_AnimationObject::AIS_AnimationObject (const TCollection_AsciiString& theAnim
const Handle(AIS_InteractiveObject)& theObject,
const gp_Trsf& theTrsfStart,
const gp_Trsf& theTrsfEnd)
: AIS_Animation (theAnimationName),
myContext (theContext),
myObject (theObject),
: AIS_BaseAnimationObject (theAnimationName, theContext, theObject),
myTrsfLerp (theTrsfStart, theTrsfEnd)
{
//
@@ -49,52 +44,5 @@ void AIS_AnimationObject::update (const AIS_AnimationProgress& theProgress)
gp_Trsf aTrsf;
myTrsfLerp.Interpolate (theProgress.LocalNormalized, 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();
}
}
}
updateTrsf (aTrsf);
}

View File

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

View File

@@ -0,0 +1,88 @@
// 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

@@ -0,0 +1,49 @@
// 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,18 +1116,23 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
const Standard_Integer theMode)
{
//Check mode
AIS_ManipulatorMode aMode = (AIS_ManipulatorMode) theMode;
const AIS_ManipulatorMode aMode = (AIS_ManipulatorMode) theMode;
if (aMode == AIS_MM_None)
{
return;
}
Handle(SelectMgr_EntityOwner) anOwner;
if (aMode == AIS_MM_None)
{
anOwner = new SelectMgr_EntityOwner (this, 5);
}
if (aMode == AIS_MM_Translation || 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:
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
@@ -1136,23 +1141,21 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
continue;
}
const Axis& anAxis = myAxes[anIt];
if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Translation, 9);
}
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Translation, 9);
// define sensitivity by line
Handle(Select3D_SensitiveSegment) aLine = new Select3D_SensitiveSegment (anOwner, gp::Origin(), anAxis.TranslatorTipPosition());
aLine->SetSensitivityFactor (15);
Handle(Select3D_SensitiveSegment) aLine = new Select3D_SensitiveSegment(anOwner, gp::Origin(), anAxis.TranslatorTipPosition());
aLine->SetSensitivityFactor (aHighSensitivity);
theSelection->Add (aLine);
// 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());
theSelection->Add (aTri);
}
break;
}
if (aMode == AIS_MM_Rotation || aMode == AIS_MM_None)
case AIS_MM_Rotation:
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
@@ -1161,22 +1164,20 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
continue;
}
const Axis& anAxis = myAxes[anIt];
if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Rotation, 9);
}
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Rotation, 9);
// define sensitivity by circle
const gp_Circ aGeomCircle (gp_Ax2 (gp::Origin(), anAxis.ReferenceAxis().Direction()), anAxis.RotatorDiskRadius());
Handle(Select3D_SensitiveCircle) aCircle = new ManipSensCircle (anOwner, aGeomCircle);
aCircle->SetSensitivityFactor (15);
theSelection->Add (aCircle);
const gp_Circ aGeomCircle (gp_Ax2(gp::Origin(), anAxis.ReferenceAxis().Direction()), anAxis.RotatorDiskRadius());
Handle(Select3D_SensitiveCircle) aCircle = new ManipSensCircle(anOwner, aGeomCircle);
aCircle->SetSensitivityFactor (aLowSensitivity);
theSelection->Add(aCircle);
// 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);
}
break;
}
if (aMode == AIS_MM_Scaling || aMode == AIS_MM_None)
case AIS_MM_Scaling:
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
@@ -1184,21 +1185,19 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
{
continue;
}
if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Scaling, 9);
}
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Scaling, 9);
// define sensitivity by point
Handle(Select3D_SensitivePoint) aPnt = new Select3D_SensitivePoint (anOwner, myAxes[anIt].ScalerCubePosition());
aPnt->SetSensitivityFactor (15);
Handle(Select3D_SensitivePoint) aPnt = new Select3D_SensitivePoint(anOwner, myAxes[anIt].ScalerCubePosition());
aPnt->SetSensitivityFactor (aHighSensitivity);
theSelection->Add (aPnt);
// 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);
}
break;
}
if (aMode == AIS_MM_TranslationPlane || aMode == AIS_MM_None)
case AIS_MM_TranslationPlane:
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
@@ -1206,28 +1205,33 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
{
continue;
}
if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9);
}
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9);
// define sensitivity by two crossed lines
gp_Pnt aP1, aP2;
aP1 = myAxes[((anIt + 1) % 3)].TranslatorTipPosition();
aP2 = myAxes[((anIt + 2) % 3)].TranslatorTipPosition();
Standard_Real aSensitivityOffset = ZoomPersistence() ? aHighSensitivity * (0.5 + M_SQRT2) : 0.0;
gp_Pnt aP1 = myAxes[((anIt + 1) % 3)].TranslatorTipPosition().Translated (myAxes[((anIt + 2) % 3)].ReferenceAxis().Direction().XYZ() * aSensitivityOffset);
gp_Pnt aP2 = myAxes[((anIt + 2) % 3)].TranslatorTipPosition().Translated (myAxes[((anIt + 1) % 3)].ReferenceAxis().Direction().XYZ() * aSensitivityOffset);
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);
aLine1->SetSensitivityFactor(10);
theSelection->Add(aLine1);
Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, gp::Origin(), aMidP);
aLine2->SetSensitivityFactor(10);
theSelection->Add(aLine2);
aLine1->SetSensitivityFactor(aLowSensitivity);
theSelection->Add (aLine1);
Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, anOrig, aMidP);
aLine2->SetSensitivityFactor (aLowSensitivity);
theSelection->Add (aLine2);
// enlarge sensitivity by triangulation
Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].DraggerSector().Triangulation(), TopLoc_Location(), Standard_True);
theSelection->Add(aTri);
Handle(Select3D_SensitiveTriangulation) aTri = new Select3D_SensitiveTriangulation(anOwner, myAxes[anIt].DraggerSector().Triangulation(), TopLoc_Location(), Standard_True);
theSelection->Add (aTri);
}
break;
}
default:
{
anOwner = new SelectMgr_EntityOwner(this, 5);
break;
}
}
}

View File

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

View File

@@ -248,167 +248,178 @@ void BOPAlgo_ShellSplitter::SplitBlock(BOPTools_ConnexityBlock& aCB)
//
// Build the shells
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();
if (!AddedFacesMap.Add(aFF)) {
continue;
}
//
// make a new shell
TopoDS_Shell aShellStart;
aBB.MakeShell(aShellStart);
aBB.Add(aShellStart, aFF);
TopoDS_Shell aShell;
aBB.MakeShell(aShell);
aBB.Add(aShell, aFF);
aMEFP.Clear();
TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEFP);
//
TopTools_ListOfShape aLShells;
aLShells.Append(aShellStart);
//
TopTools_ListIteratorOfListOfShape aItLShells(aLShells);
for (; aItLShells.More(); aItLShells.Next()) {
TopoDS_Shell& aShell = TopoDS::Shell(aItLShells.ChangeValue());
// 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);
//
aMEFP.Clear();
TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEFP);
//
// 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);
// loop on edges of aF; find a good neighbor face of aF by aE
aExp.Init(aF, TopAbs_EDGE);
for (; aExp.More(); aExp.Next()) {
const TopoDS_Edge& aE = (*(TopoDS_Edge*)(&aExp.Current()));
//
// loop on edges of aF; find a good neighbor face of aF by aE
aExp.Init(aF, TopAbs_EDGE);
for (; aExp.More(); aExp.Next()) {
const TopoDS_Edge& aE = (*(TopoDS_Edge*)(&aExp.Current()));
//
// 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) {
// 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 degenerated edges
if (BRep_Tool::Degenerated(aE)) {
}
// avoid processing of internal edges
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;
}
//
// candidate faces list
const TopTools_ListOfShape& aLF = aEFMap.FindFromKey(aE);
aNbLF = aLF.Extent();
if (!aNbLF) {
// find current edge in the face
if (!BOPTools_AlgoTools::GetEdgeOff(aE, aFL, aEL)) {
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;
}
//
// 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)
if (isBoundary && !aBoundaryFaces.Contains (aFL))
{
if (aNbOff == 1) {
aSelF = (*(TopoDS_Face*)(&aLCSOff.First().Shape2()));
}
else if (aNbOff > 1) {
BOPTools_AlgoTools::GetFaceOff(aE, aF, aLCSOff, aSelF, aContext);
}
++aNbWaysInside;
aSelF = aFL;
}
//
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());
aCSOff.SetShape1(aEL);
aCSOff.SetShape2(aFL);
aLCSOff.Append(aCSOff);
}//for (; aItLF.More(); aItLF.Next()) {
//
if (BRep_Tool::IsClosed(aShSp)) {
aShSp.Closed(Standard_True);
myLoops.Append(aShSp);
aNbOff = aLCSOff.Extent();
if (!aNbOff){
continue;
}
else {
aLShNC.Append(aShSp);
}
}
//
bAllFacesTaken = (AddedFacesMap.Extent() == aNbShapes);
if (bAllFacesTaken) {
break;
}
//
if (aLShSp.Extent() == 1) {
// not further processing of not closed shells is needed,
// as it will not bring any new results
continue;
}
//
Standard_Integer aNbShNC = aLShNC.Extent();
if (aNbShNC == 1) {
// try to complete the shell with other faces
aLShells.Append(aLShNC);
}
else if (aNbShNC > 1) {
// remove th faces of not closed shells from the map of 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
TopTools_ListIteratorOfListOfShape aItLShNC(aLShNC);
for (; aItLShNC.More(); aItLShNC.Next()) {
TopoDS_Iterator aItNC(aItLShNC.Value());
for (; aItNC.More(); aItNC.Next()) {
AddedFacesMap.Remove(aItNC.Value());
//
// 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) {
BOPTools_AlgoTools::GetFaceOff(aE, aF, aLCSOff, aSelF, aContext);
}
}
//
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)) {
aShSp.Closed(Standard_True);
myLoops.Append(aShSp);
}
else {
aLShNC.Append(aShSp);
}
}
//
bAllFacesTaken = (AddedFacesMap.Extent() == aNbShapes);
if (bAllFacesTaken) {
break;
}
//
if (aLShSp.Extent() == 1) {
// not further processing of not closed shells is needed,
// as it will not bring any new results
continue;
}
//
// remove th faces of not closed shells from the map of 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
TopTools_ListIteratorOfListOfShape aItLShNC(aLShNC);
for (; aItLShNC.More(); aItLShNC.Next())
{
TopoDS_Iterator aItNC(aItLShNC.Value());
for (; aItNC.More(); aItNC.Next())
{
AddedFacesMap.Remove(aItNC.Value());
}
}
} // 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
//purpose :
@@ -434,6 +445,21 @@ void RefineShell(TopoDS_Shell& theShell,
aMEStop.Add(aE);
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
// is internal, twice

View File

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

View File

@@ -127,6 +127,14 @@ 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())
{
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);
if (!P3d.IsNull() && P3d->NbNodes() > 0)
{
@@ -143,7 +151,7 @@ void BRepBndLib::Add(const TopoDS_Shape& S, Bnd_Box& B, Standard_Boolean useTria
else
{
BRep_Tool::PolygonOnTriangulation(E, Poly, T, l);
if (useTriangulation && !Poly.IsNull() && !T.IsNull() && T->NbNodes() > 0)
if (!Poly.IsNull() && !T.IsNull() && T->NbNodes() > 0)
{
const TColStd_Array1OfInteger& Indices = Poly->Nodes();
nbNodes = Indices.Length();

View File

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

View File

@@ -41,6 +41,7 @@
#include <TopoDS_Vertex.hxx>
#include <TopTools_MapOfShape.hxx>
#include <ChFi3d.hxx>
#include <LocalAnalysis_SurfaceContinuity.hxx>
static void CorrectOrientationOfTangent(gp_Vec& TangVec,
const TopoDS_Vertex& aVertex,
@@ -50,6 +51,12 @@ static void CorrectOrientationOfTangent(gp_Vec& TangVec,
if (aVertex.IsSame(Vlast))
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
//purpose :
@@ -105,15 +112,168 @@ static void EdgeAnalyse(const TopoDS_Edge& E,
}
else
{
if (ChFi3d::IsTangentFaces(E, F1, F2)) //weak condition
ConnectType = ChFiDS_Tangential;
Standard_Boolean isTwoSplines = (aSurfType1 == GeomAbs_BSplineSurface || aSurfType1 == GeomAbs_BezierSurface) &&
(aSurfType2 == GeomAbs_BSplineSurface || aSurfType2 == GeomAbs_BezierSurface);
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
ConnectType = ChFi3d::DefineConnectType(E, F1, F2, SinTol, Standard_False);
{
ConnectType = ChFiDS_Mixed;
}
}
I.Type(ConnectType);
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

View File

@@ -29,7 +29,8 @@ enum BRepOffset_Error
BRepOffset_CannotTrimEdges, //!< exception while trim edges
BRepOffset_CannotFuseVertices, //!< exception while fuse vertices
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

View File

@@ -910,6 +910,19 @@ void BRepOffset_MakeOffset::MakeOffsetShape(const Message_ProgressRange& theRang
myAnalyse.SetFaceOffsetMap (myFaceOffset);
}
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())
{
myError = BRepOffset_UserBreak;
@@ -2960,6 +2973,36 @@ void BRepOffset_MakeOffset::MakeMissingWalls (const Message_ProgressRange& theRa
TopExp::Vertices(anEdge, V1, V2);
Standard_Real 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() &&
(!aC->IsClosed() && !aC->IsPeriodic()))
{

View File

@@ -5225,7 +5225,6 @@ void BRepOffset_BuildOffsetFaces::FilterInvalidEdges (const BRepOffset_DataMapOf
const TopTools_ListOfShape* pEOrigins = myOEOrigins.Seek (aE);
if (!pEOrigins)
{
theMEUseInRebuild.Add (aE);
continue;
}
@@ -5393,6 +5392,29 @@ 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
//purpose : Intersection of the faces that should be rebuild to resolve all invalidities
@@ -5715,7 +5737,10 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
TopoDS_Compound aCBE;
aBB.MakeCompound (aCBE);
//
TopExp_Explorer aExp (aCBInv, TopAbs_EDGE);
// remember inside edges and vertices to further check
TopTools_MapOfShape anInsideEdges;
TopTools_MapOfShape anInsideVertices;
TopExp_Explorer aExp(aCBInv, TopAbs_EDGE);
for (; aExp.More(); aExp.Next())
{
const TopoDS_Shape& aE = aExp.Current();
@@ -5724,6 +5749,15 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
if (aMEFence.Add (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());
}
}
}
}
}
@@ -5749,10 +5783,6 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
TopExp::MapShapes (aCBELoc, TopAbs_EDGE, aME);
aMECV = aME;
TopExp::MapShapes (aCBELoc, TopAbs_VERTEX, aME);
//
// Using the map <aME> find chain of faces to be intersected;
//
// faces for intersection
TopTools_IndexedMapOfShape aMFInt;
// additional faces for intersection
TopTools_IndexedMapOfShape aMFIntExt;
@@ -5801,6 +5831,14 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
if (pMFInter && !pInterFi)
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)
{
const TopoDS_Face& aFj = TopoDS::Face (aMFInt (j));
@@ -5820,6 +5858,28 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
if (!aLFEj)
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
// we should use these edges and do not intersect again.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -106,6 +106,11 @@ void RWStepShape_RWEdgeLoop::Check
Standard_Boolean headToTail = Standard_True;
//Standard_Boolean noIdentVtx = Standard_True; //szv#4:S4163:12Mar99 unused
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_Vertex) theVxFrst = theOE->EdgeStart();
Handle(StepShape_Vertex) theVxLst = theOE->EdgeEnd();

View File

@@ -225,6 +225,14 @@ static Resource_KindOfLine WhatKindOfLine(OSD_File& aFile,
aToken2.Clear();
else {
Line.Remove(1,Pos-1);
const Standard_Integer aLineLength = Line.Length();
if (aLineLength >= 2)
{
if (Line.Value(aLineLength - 1) == '\r')
{
Line.Remove(aLineLength - 1);
}
}
Line.Remove(Line.Length());
aToken2 = Line;
}

View File

@@ -862,8 +862,6 @@ Handle(STEPCAFControl_ExternFile) STEPCAFControl_Reader::ReadExternFile (const S
EF->SetWS(newWS);
EF->SetName(new TCollection_HAsciiString(file));
myReader.WS()->AppendReferenceWS(file, newWS);
// read file
EF->SetLoadStatus(sr.ReadFile(fullname));

File diff suppressed because it is too large Load Diff

View File

@@ -31,6 +31,7 @@
#include <StepVisual_DraughtingModel.hxx>
#include <StepVisual_HArray1OfPresentationStyleAssignment.hxx>
#include <TDF_LabelSequence.hxx>
#include <TDF_LabelMap.hxx>
#include <XCAFDimTolObjects_GeomToleranceObject.hxx>
class XSControl_WorkSession;
@@ -44,219 +45,234 @@ class TopoDS_Shape;
//! colors and part names
//!
//! Also supports multifile writing
class STEPCAFControl_Writer
class STEPCAFControl_Writer
{
DEFINE_STANDARD_ALLOC
public:
DEFINE_STANDARD_ALLOC
//! Creates a writer with an empty
//! STEP model and sets ColorMode, LayerMode, NameMode and
//! PropsMode to Standard_True.
Standard_EXPORT STEPCAFControl_Writer();
//! 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 internal data structures
Standard_EXPORT STEPCAFControl_Writer(const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = Standard_True);
Standard_EXPORT STEPCAFControl_Writer(const Handle(XSControl_WorkSession)& theWS,
const Standard_Boolean theScratch = Standard_True);
//! Clears the internal data structures and attaches to a new session
//! Clears the session if it was not yet set for STEP
Standard_EXPORT void Init (const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = Standard_True);
Standard_EXPORT void Init(const Handle(XSControl_WorkSession)& theWS,
const Standard_Boolean theScratch = Standard_True);
//! Writes all the produced models into file
//! In case of multimodel with extern references,
//! filename will be a name of root file, all other files
//! have names of corresponding parts
//! 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.
//! 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
//! The mode of translation of shape is AsIs
//! If multi is not null pointer, it switches to multifile
//! mode (with external refs), and string pointed by <multi>
//! gives prefix for names of extern files (can be empty string)
//! Returns True if translation is OK
Standard_EXPORT Standard_Boolean Transfer (const Handle(TDocStd_Document)& doc,
const STEPControl_StepModelType mode = STEPControl_AsIs,
const Standard_CString multi = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT Standard_Boolean Transfer(const Handle(TDocStd_Document)& theDoc,
const STEPControl_StepModelType theMode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Method to transfer part of the document specified by label
Standard_EXPORT Standard_Boolean Transfer (const TDF_Label& L,
const STEPControl_StepModelType mode = STEPControl_AsIs,
const Standard_CString multi = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT Standard_Boolean Transfer(const TDF_Label& theLabel,
const STEPControl_StepModelType theMode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! 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& L,
const STEPControl_StepModelType mode = STEPControl_AsIs,
const Standard_CString multi = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc,
const TCollection_AsciiString& filename,
Standard_EXPORT Standard_Boolean Transfer(const TDF_LabelSequence& theLabelSeq,
const STEPControl_StepModelType theMode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT Standard_Boolean Perform(const Handle(TDocStd_Document)& theDoc,
const TCollection_AsciiString& theFileName,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Transfers a document and writes it to a STEP file
//! Returns True if translation is OK
Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc,
const Standard_CString filename,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT Standard_Boolean Perform(const Handle(TDocStd_Document)& theDoc,
const Standard_CString theFileName,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Returns data on external files
//! Returns Null handle if no external files are read
Standard_EXPORT const NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>& ExternFiles() const;
const NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>& ExternFiles() const { return myFiles; };
//! Returns data on external file by its original label
//! Returns False if no external file with given name is read
Standard_EXPORT Standard_Boolean ExternFile (const TDF_Label& L, Handle(STEPCAFControl_ExternFile)& ef) const;
Standard_EXPORT Standard_Boolean ExternFile(const TDF_Label& theLabel,
Handle(STEPCAFControl_ExternFile)& theExtFile) const;
//! Returns data on external file by its name
//! Returns False if no external file with given name is read
Standard_EXPORT Standard_Boolean ExternFile (const Standard_CString name, Handle(STEPCAFControl_ExternFile)& ef) const;
Standard_EXPORT Standard_Boolean ExternFile(const Standard_CString theName,
Handle(STEPCAFControl_ExternFile)& theExtFile) const;
//! Returns basic reader for root file
Standard_EXPORT STEPControl_Writer& ChangeWriter();
STEPControl_Writer& ChangeWriter() { return myWriter; }
//! Returns basic reader as const
Standard_EXPORT const STEPControl_Writer& Writer() const;
const STEPControl_Writer& Writer() const { return myWriter; }
//! Set ColorMode for indicate write Colors or not.
Standard_EXPORT void SetColorMode (const Standard_Boolean colormode);
Standard_EXPORT Standard_Boolean GetColorMode() const;
void SetColorMode(const Standard_Boolean theColorMode) { myColorMode = theColorMode; }
Standard_Boolean GetColorMode() const { return myColorMode; }
//! Set NameMode for indicate write Name or not.
Standard_EXPORT void SetNameMode (const Standard_Boolean namemode);
Standard_EXPORT Standard_Boolean GetNameMode() const;
void SetNameMode(const Standard_Boolean theNameMode) { myNameMode = theNameMode; }
Standard_Boolean GetNameMode() const { return myNameMode; }
//! Set LayerMode for indicate write Layers or not.
Standard_EXPORT void SetLayerMode (const Standard_Boolean layermode);
Standard_EXPORT Standard_Boolean GetLayerMode() const;
void SetLayerMode(const Standard_Boolean theLayerMode) { myLayerMode = theLayerMode; }
Standard_Boolean GetLayerMode() const { return myLayerMode; }
//! PropsMode for indicate write Validation properties or not.
Standard_EXPORT void SetPropsMode (const Standard_Boolean propsmode);
Standard_EXPORT Standard_Boolean GetPropsMode() const;
void SetPropsMode(const Standard_Boolean thePropsMode) { myPropsMode = thePropsMode; }
Standard_Boolean GetPropsMode() const { return myPropsMode; }
//! Set SHUO mode for indicate write SHUO or not.
Standard_EXPORT void SetSHUOMode (const Standard_Boolean shuomode);
Standard_EXPORT Standard_Boolean GetSHUOMode() const;
void SetSHUOMode(const Standard_Boolean theSHUOMode) { mySHUOMode = theSHUOMode; }
Standard_Boolean GetSHUOMode() const { return mySHUOMode; }
//! Set dimtolmode for indicate write D&GTs or not.
Standard_EXPORT void SetDimTolMode (const Standard_Boolean dimtolmode);
Standard_EXPORT Standard_Boolean GetDimTolMode() const;
void SetDimTolMode(const Standard_Boolean theDimTolMode) { myGDTMode = theDimTolMode; };
Standard_Boolean GetDimTolMode() const { return myGDTMode; }
//! Set dimtolmode for indicate write D&GTs or not.
Standard_EXPORT void SetMaterialMode (const Standard_Boolean matmode);
Standard_EXPORT Standard_Boolean GetMaterialMode() const;
void SetMaterialMode(const Standard_Boolean theMaterialMode) { myMatMode = theMaterialMode; }
Standard_Boolean GetMaterialMode() const { return myMatMode; }
protected:
//! Transfers labels to a STEP model
//! Returns True if translation is OK
//! isExternFile setting from TransferExternFiles method
Standard_EXPORT Standard_Boolean Transfer (STEPControl_Writer& wr,
const TDF_LabelSequence& labels,
const STEPControl_StepModelType mode = STEPControl_AsIs,
const Standard_CString multi = 0,
const Standard_Boolean isExternFile = Standard_False,
const Message_ProgressRange& theProgress = Message_ProgressRange()) ;
//! isExternFile setting from transferExternFiles method
Standard_Boolean transfer(STEPControl_Writer& theWriter,
const TDF_LabelSequence& theLabels,
const STEPControl_StepModelType theMode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0,
const Standard_Boolean isExternFile = Standard_False,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Parses assembly structure of label L, writes all the simple
//! shapes each to its own file named by name of its label plus
//! prefix
//! Returns shape representing that assembly structure
//! in the form of nested empty compounds (and a sequence of
//! labels which are newly written nodes of this assembly)
Standard_EXPORT TopoDS_Shape TransferExternFiles (const TDF_Label& L,
const STEPControl_StepModelType mode,
TDF_LabelSequence& Lseq,
const Standard_CString prefix = "",
const Message_ProgressRange& theProgress = Message_ProgressRange());
TopoDS_Shape transferExternFiles(const TDF_Label& theLabel,
const STEPControl_StepModelType theMode,
TDF_LabelSequence& theLabelSeq,
const Standard_CString thePrefix = "",
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Write external references to STEP
Standard_EXPORT Standard_Boolean WriteExternRefs (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
Standard_Boolean writeExternRefs(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels) const;
//! Write colors assigned to specified labels, to STEP model
Standard_EXPORT Standard_Boolean WriteColors (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels);
Standard_Boolean writeColors(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels);
//! Write names assigned to specified labels, to STEP model
Standard_EXPORT Standard_Boolean WriteNames (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
Standard_Boolean writeNames(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels) const;
//! Write D&GTs assigned to specified labels, to STEP model
Standard_EXPORT Standard_Boolean WriteDGTs (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
//! Write D&GTs assigned to specified labels, to STEP model, according AP242
Standard_EXPORT Standard_Boolean WriteDGTsAP242 (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels);
Standard_Boolean writeDGTs(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels) const;
//! Write D&GTs assigned to specified labels, to STEP model, according AP242
Standard_Boolean writeDGTsAP242(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels);
//! Write materials assigned to specified labels, to STEP model
Standard_EXPORT Standard_Boolean WriteMaterials (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
Standard_Boolean writeMaterials(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels) const;
//! Write validation properties assigned to specified labels,
//! to STEP model
Standard_EXPORT Standard_Boolean WriteValProps (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels, const Standard_CString multi) const;
Standard_Boolean writeValProps(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels,
const Standard_CString theIsMulti) const;
//! Write layers assigned to specified labels, to STEP model
Standard_EXPORT Standard_Boolean WriteLayers (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
Standard_Boolean writeLayers(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels) const;
//! Write SHUO assigned to specified component, to STEP model
Standard_EXPORT Standard_Boolean WriteSHUOs (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels);
Standard_Boolean writeSHUOs(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels);
//! Finds length units located in root of label
//! If it exists, initializes local length unit from it
//! Else initializes according to Cascade length unit
Standard_EXPORT void prepareUnit(const TDF_Label& theLabel,
const Handle(StepData_StepModel)& theModel);
void prepareUnit(const TDF_Label& theLabel,
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:
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;
NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> myFiles;
TDF_LabelMap myRootLabels;
STEPCAFControl_DataMapOfLabelShape myLabels;
STEPCAFControl_DataMapOfLabelExternFile myLabEF;
STEPCAFControl_DataMapOfLabelShape myPureRefLabels;
Standard_Boolean myColorMode;
Standard_Boolean myNameMode;
Standard_Boolean myLayerMode;
@@ -272,7 +288,4 @@ private:
};
#endif // _STEPCAFControl_Writer_HeaderFile

View File

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

View File

@@ -58,12 +58,33 @@ public:
return ZLayerPosition > theOther.ZLayerPosition;
}
// closest object is selected unless difference is within tolerance
if (Abs (Depth - theOther.Depth) > (Tolerance + theOther.Tolerance))
// closest object is selected if their depths are not equal within tolerance
if (Abs (Depth - theOther.Depth) > Tolerance + theOther.Tolerance)
{
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 (Priority > theOther.Priority)
{

View File

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

View File

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

View File

@@ -20,6 +20,7 @@
#include <ViewerTest.hxx>
#include <AIS_AnimationAxisRotation.hxx>
#include <AIS_AnimationCamera.hxx>
#include <AIS_AnimationObject.hxx>
#include <AIS_Axis.hxx>
@@ -7596,6 +7597,11 @@ static Standard_Integer VAnimation (Draw_Interpretor& theDI,
gp_XYZ aLocPnts [2] = { aTrsfs[0].TranslationPart(), aTrsfs[1].TranslationPart() };
Standard_Real aScales [2] = { aTrsfs[0].ScaleFactor(), aTrsfs[1].ScaleFactor() };
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;
for (; aTrsfArgIter < theArgNb; ++aTrsfArgIter)
{
@@ -7643,13 +7649,45 @@ static Standard_Integer VAnimation (Draw_Interpretor& theDI,
}
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
{
anArgIter = aTrsfArgIter - 1;
break;
}
}
if (!isTrsfSet)
if (!isTrsfSet && !isAxisRotationSet)
{
Message::SendFail() << "Syntax error at " << anArg;
return 1;
@@ -7658,15 +7696,23 @@ static Standard_Integer VAnimation (Draw_Interpretor& theDI,
{
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]);
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]);
Handle(AIS_AnimationObject) anObjAnimation = new AIS_AnimationObject (anAnimation->Name(), aCtx, anObject, aTrsfs[0], aTrsfs[1]);
anObjAnimation = new AIS_AnimationObject (anAnimation->Name(), aCtx, anObject, aTrsfs[0], aTrsfs[1]);
}
else
{
anObjAnimation = new AIS_AnimationAxisRotation (anAnimation->Name(), aCtx, anObject, anAxis,
anAngles[0] * (M_PI / 180.0), anAngles[1] * (M_PI / 180.0));
}
replaceAnimation (aParentAnimation, anAnimation, anObjAnimation);
}
else if (anArg == "-viewtrsf"
@@ -14394,6 +14440,11 @@ Object animation:
-rotX object Orientations 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:
vanim name -invoke "Command Arg1 Arg2 %Pts %LocalPts %Normalized ArgN"

View File

@@ -194,29 +194,63 @@ const Handle(VrmlData_WorldInfo)& VrmlData_Scene::WorldInfo() const
//purpose :
//=======================================================================
VrmlData_ErrorStatus VrmlData_Scene::readLine (VrmlData_InBuffer& theBuffer)
VrmlData_ErrorStatus VrmlData_Scene::readLine(VrmlData_InBuffer& theBuffer)
{
VrmlData_ErrorStatus aStatus = VrmlData_StatusOK;
if (theBuffer.Input.eof())
aStatus = VrmlData_EndOfFile;
else {
theBuffer.Input.getline (theBuffer.Line, sizeof(theBuffer.Line));
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 VrmlData_EndOfFile;
}
// Read a line.
theBuffer.Input.getline(theBuffer.Line, sizeof(theBuffer.Line));
// Check the number of read symbols.
// If maximum number is read, process the array of symbols separately
// rolling back the array to the last comma or space symbol.
std::streamsize aNbChars = theBuffer.Input.gcount();
if (theBuffer.Input.rdstate() & std::ios::failbit &&
aNbChars == sizeof(theBuffer.Line) - 1)
{
// Clear the error.
// 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
{
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;
}

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

View File

@@ -72,12 +72,12 @@ public:
//! Returns color defined by label lab
//! Returns False if the label is not in colortable
//! or does not define a color
Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& lab, Quantity_Color& col) const;
Standard_EXPORT static Standard_Boolean GetColor (const TDF_Label& lab, Quantity_Color& col);
//! Returns color defined by label lab
//! Returns False if the label is not in colortable
//! or does not define a color
Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& lab, Quantity_ColorRGBA& col) const;
Standard_EXPORT static Standard_Boolean GetColor(const TDF_Label& lab, Quantity_ColorRGBA& col);
//! Finds a color definition in a colortable and returns
//! its label if found
@@ -150,11 +150,11 @@ public:
//! Returns color assigned to <L> as <type>
//! Returns False if no such color is assigned
Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_Color& color);
Standard_EXPORT static Standard_Boolean GetColor (const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_Color& color);
//! Returns color assigned to <L> as <type>
//! Returns False if no such color is assigned
Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color);
Standard_EXPORT static Standard_Boolean GetColor(const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color);
//! Sets a link with GUID defined by <type> (see
//! 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);
//! Return TRUE if object on this label is visible, FALSE if invisible.
Standard_EXPORT Standard_Boolean IsVisible (const TDF_Label& L) const;
Standard_EXPORT static Standard_Boolean IsVisible (const TDF_Label& L);
//! Set the visibility of object on label. Do nothing if there no any object.
//! 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,
TDF_LabelSequence& theShapeLFirst,
TDF_LabelSequence& theShapeLSecond) const
TDF_LabelSequence& theShapeLSecond)
{
theShapeLFirst.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,
TDF_LabelSequence& theDatums) const
TDF_LabelSequence& theDatums)
{
Handle(XCAFDoc_GraphNode) 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,
TDF_LabelSequence& theDatums) const
TDF_LabelSequence& theDatums)
{
Handle(XCAFDoc_GraphNode) 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.
//! Returns False if there are no shape labels added to the sequences.
Standard_EXPORT Standard_Boolean GetRefShapeLabel (const TDF_Label& theL,
TDF_LabelSequence& theShapeLFirst,
TDF_LabelSequence& theShapeLSecond) const;
Standard_EXPORT static Standard_Boolean GetRefShapeLabel (const TDF_Label& theL,
TDF_LabelSequence& theShapeLFirst,
TDF_LabelSequence& theShapeLSecond);
//! Returns dimension tolerance assigned to theDimTolL label.
//! Returns False if no such dimension tolerance is assigned.
@@ -215,12 +215,12 @@ public:
Handle(TCollection_HAsciiString)& theIdentification) const;
//! Returns all Datum labels defined for theDimTolL label.
Standard_EXPORT Standard_Boolean GetDatumOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums) const;
Standard_EXPORT static Standard_Boolean GetDatumOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums);
//! Returns all Datum labels with XCAFDimTolObjects_DatumObject defined for label theDimTolL.
Standard_EXPORT Standard_Boolean GetDatumWithObjectOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums) const;
Standard_EXPORT static Standard_Boolean GetDatumWithObjectOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums);
//! Returns all GeomToleranses labels defined for theDatumL label.
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
//purpose :
//=======================================================================
void XCAFDoc_LayerTool::GetShapesOfLayer(const TDF_Label& layerL,
TDF_LabelSequence& ShLabels) const
void XCAFDoc_LayerTool::GetShapesOfLayer(const TDF_Label& theLayerL,
TDF_LabelSequence& theShLabels)
{
ShLabels.Clear();
theShLabels.Clear();
Handle(XCAFDoc_GraphNode) aGNode;
if ( layerL.FindAttribute( XCAFDoc::LayerRefGUID(), aGNode) ) {
for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++) {
ShLabels.Append( aGNode->GetChild(i)->Label() );
if (theLayerL.FindAttribute(XCAFDoc::LayerRefGUID(), aGNode))
{
for (Standard_Integer aChildInd = 1; aChildInd <= aGNode->NbChildren(); aChildInd++)
{
theShLabels.Append(aGNode->GetChild(aChildInd)->Label());
}
}
}
//=======================================================================
//function : IsVisible
//purpose :

View File

@@ -135,7 +135,7 @@ public:
Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetLayers (const TDF_Label& L);
//! Return sequanese of shape labels that assigned with layers to <ShLabels>.
Standard_EXPORT void GetShapesOfLayer (const TDF_Label& layerL, TDF_LabelSequence& ShLabels) const;
Standard_EXPORT static void GetShapesOfLayer (const TDF_Label& theLayerL, TDF_LabelSequence& theShLabels);
//! Return TRUE if layer is visible, FALSE if invisible.
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,
Standard_Real& aDensity,
Handle(TCollection_HAsciiString)& aDensName,
Handle(TCollection_HAsciiString)& aDensValType) const
Handle(TCollection_HAsciiString)& aDensValType)
{
Handle(XCAFDoc_Material) MatAttr;
if(!MatL.FindAttribute(XCAFDoc_Material::GetID(),MatAttr)) {

View File

@@ -76,7 +76,7 @@ public:
//! Returns Material assigned to <MatL>
//! Returns False if no such Material is assigned
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;
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);
//! Find referred material and return density from it
//! if no material --> return 0

View File

@@ -353,6 +353,47 @@ TopoDS_Shape XCAFDoc_ShapeTool::GetShape(const TDF_Label& L)
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
//purpose :

View File

@@ -196,6 +196,15 @@ public:
//! For component, returns new shape with correct location
//! Returns Null shape if label does not contain shape
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.
//! Initially it holds empty TopoDS_Compound

View File

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

View File

@@ -56,7 +56,7 @@ public:
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.
Standard_EXPORT Handle(XCAFDoc_VisMaterial) GetMaterial (const TDF_Label& theMatLabel) const;
Standard_EXPORT static Handle(XCAFDoc_VisMaterial) GetMaterial (const TDF_Label& theMatLabel);
//! Adds Material definition to a Material Table and returns its Label.
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);
//! Returns material assigned to the shape label.
Standard_EXPORT Handle(XCAFDoc_VisMaterial) GetShapeMaterial (const TDF_Label& theShapeLabel);
Standard_EXPORT static Handle(XCAFDoc_VisMaterial) GetShapeMaterial (const TDF_Label& theShapeLabel);
//! Sets a link with GUID XCAFDoc::VisMaterialRefGUID() from shape label to material label.
//! @param theShape [in] shape

View File

@@ -509,40 +509,37 @@ static Standard_Integer getFreeShapes (Draw_Interpretor& di, Standard_Integer ar
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 (argc!=3) {
di<<"Use: "<<argv[0]<<" shape DocName \n";
if ( theNbArgs !=3 )
{
theDI <<"Use: "<< theArgVec[0]<<" shape DocName \n";
return 1;
}
Handle(TDocStd_Document) Doc;
DDocStd::GetDocument(argv[2], Doc);
if ( Doc.IsNull() ) { di << argv[2] << " is not a document\n"; return 1; }
Handle(TDocStd_Document) aDoc;
DDocStd::GetDocument(theArgVec[2], aDoc);
if ( aDoc.IsNull() )
{
theDI << "Error: " << theArgVec[2] << " is not a document\n";
return 1;
}
TDF_LabelSequence Labels;
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());
TopoDS_Shape aShape = aSTool->GetOneShape();
if (aShape.IsNull())
{
theDI << "Error: Document " << theArgVec[2] << " contain no shapes\n";
return 1;
}
if ( Labels.Length() ==1 ) {
TopoDS_Shape S = STool->GetShape ( Labels.Value(1) );
DBRep::Set ( argv[1], S );
}
else {
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];
DBRep::Set (theArgVec[1], aShape);
theDI << theArgVec[1];
return 0;
}

View File

@@ -11,9 +11,11 @@
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <XSControl_WorkSession.hxx>
//:i1 pdn 03.04.99 BUC60301
#include <Geom2d_Point.hxx>
#include <Interface_Check.hxx>
#include <Interface_HGraph.hxx>
#include <Interface_InterfaceModel.hxx>
#include <Interface_Macros.hxx>
#include <Message_Messenger.hxx>
@@ -25,78 +27,78 @@
#include <Transfer_TransientProcess.hxx>
#include <XSControl_Controller.hxx>
#include <XSControl_TransferReader.hxx>
#include <XSControl_TransferWriter.hxx>
#include <XSControl_Vars.hxx>
#include <XSControl_WorkSession.hxx>
IMPLEMENT_STANDARD_RTTIEXT(XSControl_WorkSession, IFSelect_WorkSession)
IMPLEMENT_STANDARD_RTTIEXT(XSControl_WorkSession,IFSelect_WorkSession)
//=======================================================================
//function : XSControl_WorkSession
//purpose :
//purpose :
//=======================================================================
XSControl_WorkSession::XSControl_WorkSession() :
myTransferReader(new XSControl_TransferReader),
myTransferWriter(new XSControl_TransferWriter)
{}
//=======================================================================
//function : XSControl_WorkSession
//purpose :
//=======================================================================
XSControl_WorkSession::~XSControl_WorkSession()
XSControl_WorkSession::XSControl_WorkSession ()
: myTransferReader(new XSControl_TransferReader),
myTransferWriter(new XSControl_TransferWriter),
myVars(new XSControl_Vars)
{
clearBinders();
}
//=======================================================================
//function : ClearData
//purpose :
//purpose :
//=======================================================================
void XSControl_WorkSession::ClearData(const Standard_Integer mode)
void XSControl_WorkSession::ClearData (const Standard_Integer mode)
{
// 1-2-3-4 : standard IFSelect
if (mode >= 1 && mode <= 4) IFSelect_WorkSession::ClearData(mode);
if (mode >= 1 && mode <= 4) IFSelect_WorkSession::ClearData (mode);
// 5 : Transferts seuls
// 6 : Resultats forces seuls
// 7 : Management, y compris tous transferts (forces/calcules), views
if (mode == 5 || mode == 7)
{
if (mode == 5 || mode == 7) {
myTransferReader->Clear(-1);
myTransferWriter->Clear(-1);
}
if (mode == 6 && !myTransferReader.IsNull()) myTransferReader->Clear(1);
myTransferReader->SetGraph(HGraph());
myTransferReader->SetGraph (HGraph());
}
//=======================================================================
//function : SelectNorm
//purpose :
//purpose :
//=======================================================================
Standard_Boolean XSControl_WorkSession::SelectNorm(const Standard_CString normname)
Standard_Boolean XSControl_WorkSession::SelectNorm(const Standard_CString normname)
{
// Old norm and results
myTransferReader->Clear(-1);
// ???? En toute rigueur, menage a faire dans XWS : virer les items
// ( a la limite, pourquoi pas, refaire XWS en entier)
Handle(XSControl_Controller) newadapt = XSControl_Controller::Recorded(normname);
Handle(XSControl_Controller) newadapt = XSControl_Controller::Recorded (normname);
if (newadapt.IsNull()) return Standard_False;
if (newadapt == myController) return Standard_True;
SetController(newadapt);
SetController (newadapt);
return Standard_True;
}
//=======================================================================
//function : SetController
//purpose :
//purpose :
//=======================================================================
void XSControl_WorkSession::SetController(const Handle(XSControl_Controller)& ctl)
{
myController = ctl;
SetLibrary(myController->WorkLibrary());
SetProtocol(myController->Protocol());
SetLibrary ( myController->WorkLibrary() );
SetProtocol ( myController->Protocol() );
ClearItems();
ClearFinalModifiers();
@@ -105,42 +107,70 @@ void XSControl_WorkSession::SetController(const Handle(XSControl_Controller)& ct
// Set worksession parameters from teh controller
Handle(XSControl_WorkSession) aWorkSession(this);
myController->Customise(aWorkSession);
myController->Customise (aWorkSession);
myTransferReader->SetController(myController);
myTransferWriter->SetController(myController);
myTransferReader->SetController (myController);
myTransferWriter->SetController (myController);
}
//=======================================================================
//function : SelectedNorm
//purpose :
//purpose :
//=======================================================================
Standard_CString XSControl_WorkSession::SelectedNorm(const Standard_Boolean rsc) const
{
//JR/Hp :
Standard_CString astr = (Standard_CString)(myController.IsNull() ? "" : myController->Name(rsc));
return astr;
Standard_CString astr = (Standard_CString ) (myController.IsNull() ? "" : myController->Name(rsc));
return astr ;
}
// ##########################################
// ############ Contexte de Transfert ######
// ##########################################
//=======================================================================
//function : SelectedNorm
//purpose :
//function : SetAllContext
//purpose :
//=======================================================================
void XSControl_WorkSession::AppendReferenceWS(const TCollection_AsciiString& theName,
const Handle(XSControl_WorkSession)& theWS)
void XSControl_WorkSession::SetAllContext(const NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)>& context)
{
myReferenceWS.Bind(theName, theWS);
myContext = context;
myTransferReader->Context() = context;
}
//=======================================================================
//function : ClearContext
//purpose :
//=======================================================================
void XSControl_WorkSession::ClearContext ()
{
myContext.Clear();
myTransferReader->Context().Clear();
}
// ##########################################
// ############ RESULTATS FORCES ######
// ##########################################
//=======================================================================
//function : PrintTransferStatus
//purpose :
//purpose :
//=======================================================================
Standard_Boolean XSControl_WorkSession::PrintTransferStatus(const Standard_Integer num,
const Standard_Boolean wri,
Standard_OStream& S) const
Standard_Boolean XSControl_WorkSession::PrintTransferStatus(const Standard_Integer num,
const Standard_Boolean wri,
Standard_OStream& S) const
{
const Handle(Transfer_FinderProcess)& FP = myTransferWriter->FinderProcess();
const Handle(Transfer_FinderProcess) &FP = myTransferWriter->FinderProcess();
Handle(Transfer_TransientProcess) TP = myTransferReader->TransientProcess();
Handle(Transfer_Binder) binder;
@@ -148,159 +178,145 @@ Standard_Boolean XSControl_WorkSession::PrintTransferStatus(const Standard_Integ
Handle(Standard_Transient) ent;
// *** WRITE ***
if (wri)
{
if (wri) {
if (FP.IsNull()) return Standard_False;
if (num == 0) return Standard_False;
if (num == 0 ) return Standard_False;
Standard_Integer ne = 0, nr = 0, max = FP->NbMapped(), maxr = FP->NbRoots();
if (num > 0)
{
Standard_Integer ne=0, nr=0, max = FP->NbMapped() ,maxr = FP->NbRoots();
if (num > 0) {
if (num > max) return Standard_False;
ne = num;
finder = FP->Mapped(ne);
nr = FP->RootIndex(finder);
}
else if (num < 0)
{
} else if (num < 0) {
nr = -num;
if (nr > maxr) return Standard_False;
finder = FP->Root(nr);
ne = FP->MapIndex(finder);
ne = FP->MapIndex(finder);
}
S << "Transfer Write item n0." << ne << " of " << max;
S<<"Transfer Write item n0."<<ne<<" of "<<max;
if (nr > 0)
{
S << " ** Transfer Root n0." << ne;
S<<" ** Transfer Root n0."<<ne;
}
S << std::endl;
S<<std::endl;
ent = FP->FindTransient(finder);
S << " -> Type " << finder->DynamicType()->Name() << std::endl;
FP->StartTrace(binder, finder, 0, 0); // pb sout/S
if (!ent.IsNull())
{
S << " ** Resultat Transient, type " << ent->DynamicType()->Name();
const Handle(Interface_InterfaceModel)& model = Model();
S<<" -> Type "<<finder->DynamicType()->Name()<<std::endl;
FP->StartTrace (binder,finder,0,0); // pb sout/S
if (!ent.IsNull()) {
S<<" ** Resultat Transient, type "<<ent->DynamicType()->Name();
const Handle(Interface_InterfaceModel) &model = Model();
if (!model.IsNull())
{
S << " In output Model, Entity "; model->Print(ent, S);
}
S << std::endl;
{ S<<" In output Model, Entity "; model->Print(ent, S); }
S<<std::endl;
}
}
// *** READ ***
else
{
else {
if (TP.IsNull()) return Standard_False;
Handle(Interface_InterfaceModel) model = TP->Model();
if (model.IsNull()) std::cout << "No Model" << std::endl;
else if (model != Model()) std::cout << "Model different from the session" << std::endl;
if (model.IsNull()) std::cout<<"No Model"<<std::endl;
else if (model != Model()) std::cout<<"Model different from the session"<<std::endl;
if (num == 0) return Standard_False;
Standard_Integer ne = 0, nr = 0, max = TP->NbMapped(), maxr = TP->NbRoots();
if (num > 0)
{
Standard_Integer ne=0, nr=0, max = TP->NbMapped() ,maxr = TP->NbRoots();
if (num > 0) {
if (num > max) return Standard_False;
ne = num;
ent = TP->Mapped(ne);
nr = TP->RootIndex(finder);
}
else if (num < 0)
{
} else if (num < 0) {
nr = -num;
if (nr > maxr) return Standard_False;
ent = TP->Root(nr);
ne = TP->MapIndex(ent);
ne = TP->MapIndex(ent);
}
S << "Transfer Read item n0." << ne << " of " << max;
S<<"Transfer Read item n0."<<ne<<" of "<<max;
if (nr > 0)
{
S << " ** Transfer Root n0." << ne;
S<<" ** Transfer Root n0."<<ne;
}
S << std::endl;
if (!model.IsNull()) { S << " In Model, Entity "; model->Print(ent, S); }
binder = TP->MapItem(ne);
S << std::endl;
TP->StartTrace(binder, ent, 0, 0);
S<<std::endl;
if (!model.IsNull()) { S<<" In Model, Entity "; model->Print(ent, S); }
binder = TP->MapItem (ne);
S<<std::endl;
TP->StartTrace (binder,ent,0,0);
}
// *** CHECK (commun READ+WRITE) ***
if (!binder.IsNull())
{
// *** CHECK (commun READ+WRITE) ***
if (!binder.IsNull()) {
const Handle(Interface_Check) ch = binder->Check();
Standard_Integer i, nbw = ch->NbWarnings(), nbf = ch->NbFails();
if (nbw > 0)
{
S << " - Warnings : " << nbw << " :\n";
for (i = 1; i <= nbw; i++) S << ch->CWarning(i) << std::endl;
Standard_Integer i,nbw = ch->NbWarnings(), nbf = ch->NbFails();
if (nbw > 0) {
S<<" - Warnings : "<<nbw<<" :\n";
for (i = 1; i <= nbw; i ++) S<<ch->CWarning(i)<<std::endl;
}
if (nbf > 0)
{
S << " - Fails : " << nbf << " :\n";
for (i = 1; i <= nbf; i++) S << ch->CFail(i) << std::endl;
if (nbf > 0) {
S<<" - Fails : "<<nbf<<" :\n";
for (i = 1; i <= nbf; i ++) S<<ch->CFail(i)<<std::endl;
}
}
return Standard_True;
}
//=======================================================================
//function : InitTransferReader
//purpose :
//purpose :
//=======================================================================
void XSControl_WorkSession::InitTransferReader(const Standard_Integer mode)
void XSControl_WorkSession::InitTransferReader(const Standard_Integer mode)
{
if (mode == 0 || mode == 5) myTransferReader->Clear(-1); // full clear
if (myTransferReader.IsNull()) SetTransferReader(new XSControl_TransferReader);
else SetTransferReader(myTransferReader);
if (myTransferReader.IsNull()) SetTransferReader (new XSControl_TransferReader);
else SetTransferReader (myTransferReader);
// mode = 0 fait par SetTransferReader suite a Nullify
if (mode == 1)
{
if (mode == 1) {
if (!myTransferReader.IsNull()) myTransferReader->Clear(-1);
else SetTransferReader(new XSControl_TransferReader);
else SetTransferReader (new XSControl_TransferReader);
}
if (mode == 2)
{
if (mode == 2) {
Handle(Transfer_TransientProcess) TP = myTransferReader->TransientProcess();
if (TP.IsNull())
{
if (TP.IsNull()) {
TP = new Transfer_TransientProcess;
myTransferReader->SetTransientProcess(TP);
TP->SetGraph(HGraph());
TP->SetGraph (HGraph());
}
Handle(TColStd_HSequenceOfTransient) lis = myTransferReader->RecordedList();
Standard_Integer i, nb = lis->Length();
for (i = 1; i <= nb; i++) TP->SetRoot(lis->Value(i));
for (i = 1; i <= nb; i ++) TP->SetRoot(lis->Value(i));
}
if (mode == 3)
{
if (mode == 3) {
Handle(Transfer_TransientProcess) TP = myTransferReader->TransientProcess();
if (TP.IsNull()) return;
Standard_Integer i, nb = TP->NbRoots();
for (i = 1; i <= nb; i++) myTransferReader->RecordResult(TP->Root(i));
for (i = 1; i <= nb; i ++) myTransferReader->RecordResult(TP->Root(i));
}
if (mode == 4 || mode == 5) myTransferReader->BeginTransfer();
}
//=======================================================================
//function : SetTransferReader
//purpose :
//purpose :
//=======================================================================
void XSControl_WorkSession::SetTransferReader(const Handle(XSControl_TransferReader)& TR)
{
if (myTransferReader != TR) //i1 pdn 03.04.99 BUC60301
myTransferReader = TR;
if (TR.IsNull()) return;
TR->SetController(myController);
TR->SetGraph(HGraph());
TR->SetController (myController);
TR->SetGraph (HGraph());
if (!TR->TransientProcess().IsNull()) return;
Handle(Transfer_TransientProcess) TP = new Transfer_TransientProcess
(Model().IsNull() ? 100 : Model()->NbEntities() + 100);
TP->SetGraph(HGraph());
(Model().IsNull() ? 100 : Model()->NbEntities() + 100);
TP->SetGraph (HGraph());
TP->SetErrorHandle(Standard_True);
TR->SetTransientProcess(TP);
}
@@ -309,6 +325,7 @@ void XSControl_WorkSession::SetTransferReader(const Handle(XSControl_TransferRea
//function : MapReader
//purpose :
//=======================================================================
Handle(Transfer_TransientProcess) XSControl_WorkSession::MapReader() const
{
return myTransferReader->TransientProcess();
@@ -316,31 +333,34 @@ Handle(Transfer_TransientProcess) XSControl_WorkSession::MapReader() const
//=======================================================================
//function : SetMapReader
//purpose :
//purpose :
//=======================================================================
Standard_Boolean XSControl_WorkSession::SetMapReader(const Handle(Transfer_TransientProcess)& TP)
Standard_Boolean XSControl_WorkSession::SetMapReader (const Handle(Transfer_TransientProcess)& TP)
{
if (TP.IsNull()) return Standard_False;
if (TP->Model().IsNull()) TP->SetModel(Model());
TP->SetGraph(HGraph());
if (TP->Model().IsNull()) TP->SetModel (Model());
TP->SetGraph (HGraph());
if (TP->Model() != Model()) return Standard_False;
// TR ne doit pas bouger, c est un "crochet" pour signatures, selections ...
// En revanche, mieux vaut le RAZ
// Handle(XSControl_TransferReader) TR = new XSControl_TransferReader;
// TR ne doit pas bouger, c est un "crochet" pour signatures, selections ...
// En revanche, mieux vaut le RAZ
// Handle(XSControl_TransferReader) TR = new XSControl_TransferReader;
Handle(XSControl_TransferReader) TR = myTransferReader;
TR->Clear(-1);
SetTransferReader(TR); // avec le meme mais le reinitialise
TR->SetTransientProcess(TP); // et prend le nouveau TP
SetTransferReader (TR); // avec le meme mais le reinitialise
TR->SetTransientProcess (TP); // et prend le nouveau TP
return Standard_True;
}
//=======================================================================
//function : Result
//purpose :
//purpose :
//=======================================================================
Handle(Standard_Transient) XSControl_WorkSession::Result(const Handle(Standard_Transient)& ent,
const Standard_Integer mode) const
Handle(Standard_Transient) XSControl_WorkSession::Result
(const Handle(Standard_Transient)& ent, const Standard_Integer mode) const
{
Standard_Integer ouca = (mode % 10);
Standard_Integer kica = (mode / 10);
@@ -348,7 +368,7 @@ Handle(Standard_Transient) XSControl_WorkSession::Result(const Handle(Standard_T
Handle(Transfer_Binder) binder;
Handle(Transfer_ResultFromModel) resu;
if (ouca != 1) resu = myTransferReader->FinalResult(ent);
if (ouca != 1) resu = myTransferReader->FinalResult(ent);
if (mode == 20) return resu;
if (!resu.IsNull()) binder = resu->MainResult()->Binder();
@@ -356,17 +376,23 @@ Handle(Standard_Transient) XSControl_WorkSession::Result(const Handle(Standard_T
binder = myTransferReader->TransientProcess()->Find(ent);
if (kica == 1) return binder;
DeclareAndCast(Transfer_SimpleBinderOfTransient, trb, binder);
DeclareAndCast(Transfer_SimpleBinderOfTransient,trb,binder);
if (!trb.IsNull()) return trb->Result();
return binder;
}
// ##########################################
// ############ TRANSFERT #############
// ##########################################
//=======================================================================
//function : TransferReadOne
//purpose :
//purpose :
//=======================================================================
Standard_Integer XSControl_WorkSession::TransferReadOne(const Handle(Standard_Transient)& ent,
const Message_ProgressRange& theProgress)
Standard_Integer XSControl_WorkSession::TransferReadOne (const Handle(Standard_Transient)& ent,
const Message_ProgressRange& theProgress)
{
Handle(Interface_InterfaceModel) model = Model();
if (ent == model) return TransferReadRoots(theProgress);
@@ -375,30 +401,38 @@ Standard_Integer XSControl_WorkSession::TransferReadOne(const Handle(Standard_Tr
if (list->Length() == 1)
return myTransferReader->TransferOne(list->Value(1), Standard_True, theProgress);
else
return myTransferReader->TransferList(list, Standard_True, theProgress);
return myTransferReader->TransferList (list, Standard_True, theProgress);
}
//=======================================================================
//function : TransferReadRoots
//purpose :
//purpose :
//=======================================================================
Standard_Integer XSControl_WorkSession::TransferReadRoots(const Message_ProgressRange& theProgress)
Standard_Integer XSControl_WorkSession::TransferReadRoots (const Message_ProgressRange& theProgress)
{
return myTransferReader->TransferRoots(Graph(), theProgress);
}
// ##########################################
// ############ TRANSFERT WRITE
// ##########################################
//=======================================================================
//function : NewModel
//purpose :
//purpose :
//=======================================================================
Handle(Interface_InterfaceModel) XSControl_WorkSession::NewModel()
Handle(Interface_InterfaceModel) XSControl_WorkSession::NewModel ()
{
Handle(Interface_InterfaceModel) newmod;
if (myController.IsNull()) return newmod;
newmod = myController->NewModel();
SetModel(newmod);
if (!myTransferReader->TransientProcess().IsNull())
if(!myTransferReader->TransientProcess().IsNull())
myTransferReader->TransientProcess()->Clear();
//clear all contains of WS
myTransferReader->Clear(3);
@@ -407,37 +441,19 @@ Handle(Interface_InterfaceModel) XSControl_WorkSession::NewModel()
return newmod;
}
//=======================================================================
//function : TransferWriter
//purpose :
//=======================================================================
const Handle(XSControl_TransferWriter)& XSControl_WorkSession::TransferWriter() const
{
return myTransferWriter;
}
//=======================================================================
//function : SetMapWriter
//purpose :
//=======================================================================
Standard_Boolean XSControl_WorkSession::SetMapWriter(const Handle(Transfer_FinderProcess)& theFP)
{
if (theFP.IsNull()) return Standard_False;
myTransferWriter->SetFinderProcess(theFP);
return Standard_True;
}
//=======================================================================
//function : TransferWriteShape
//purpose :
//purpose :
//=======================================================================
IFSelect_ReturnStatus XSControl_WorkSession::TransferWriteShape(const TopoDS_Shape& shape,
const Standard_Boolean compgraph,
const Message_ProgressRange& theProgress)
IFSelect_ReturnStatus XSControl_WorkSession::TransferWriteShape (const TopoDS_Shape& shape,
const Standard_Boolean compgraph,
const Message_ProgressRange& theProgress)
{
IFSelect_ReturnStatus status;
if (myController.IsNull()) return IFSelect_RetError;
const Handle(Interface_InterfaceModel)& model = Model();
const Handle(Interface_InterfaceModel) &model = Model();
if (model.IsNull() || shape.IsNull())
{
return IFSelect_RetVoid;
@@ -449,58 +465,61 @@ IFSelect_ReturnStatus XSControl_WorkSession::TransferWriteShape(const TopoDS_Sha
// qui s occupe de tout, try/catch inclus
//skl insert param compgraph for XDE writing 10.12.2003
if (compgraph) ComputeGraph(Standard_True);
if(compgraph) ComputeGraph(Standard_True);
return status;
}
//=======================================================================
//function : TransferWriteCheckList
//purpose :
//=======================================================================
Interface_CheckIterator XSControl_WorkSession::TransferWriteCheckList() const
{
return myTransferWriter->ResultCheckList(Model());
}
//=======================================================================
//function : clearBinders
//purpose :
//function : TransferWriteCheckList
//purpose :
//=======================================================================
void XSControl_WorkSession::clearBinders()
Interface_CheckIterator XSControl_WorkSession::TransferWriteCheckList () const
{
const Handle(Transfer_FinderProcess)& FP = myTransferWriter->FinderProcess();
return myTransferWriter->ResultCheckList (Model());
}
//=======================================================================
//function : ClearBinders
//purpose :
//=======================================================================
void XSControl_WorkSession::ClearBinders()
{
const Handle(Transfer_FinderProcess) &FP = myTransferWriter->FinderProcess();
//Due to big number of chains of binders it is necessary to
//collect head binders of each chain in the sequence
TColStd_SequenceOfTransient aSeqBnd;
TColStd_SequenceOfTransient aSeqShapes;
Standard_Integer i = 1;
for (; i <= FP->NbMapped(); i++)
{
Handle(Transfer_Binder) bnd = FP->MapItem(i);
if (!bnd.IsNull())
Standard_Integer i =1;
for( ; i <= FP->NbMapped();i++) {
Handle(Transfer_Binder) bnd = FP->MapItem ( i );
if(!bnd.IsNull())
aSeqBnd.Append(bnd);
Handle(Standard_Transient) ash(FP->Mapped(i));
Handle(Standard_Transient) ash (FP->Mapped(i));
aSeqShapes.Append(ash);
}
//removing finder process containing result of translation.
FP->Clear();
ClearData(1);
ClearData(5);
//removing each chain of binders
while (aSeqBnd.Length() > 0)
{
while(aSeqBnd.Length() >0) {
Handle(Transfer_Binder) aBnd = Handle(Transfer_Binder)::DownCast(aSeqBnd.Value(1));
Handle(Standard_Transient) ash = aSeqShapes.Value(1);
Handle(Standard_Transient) ash =aSeqShapes.Value(1);
aSeqBnd.Remove(1);
aSeqShapes.Remove(1);
ash.Nullify();
while (!aBnd.IsNull())
{
while(!aBnd.IsNull()) {
Handle(Transfer_Binder) aBndNext = aBnd->NextResult();
aBnd.Nullify();
aBnd = aBndNext;
}
}
}

View File

@@ -22,7 +22,7 @@
#include <IFSelect_WorkSession.hxx>
#include <IFSelect_ReturnStatus.hxx>
#include <XSControl_TransferWriter.hxx>
class XSControl_Controller;
class XSControl_TransferReader;
class XSControl_Vars;
@@ -32,11 +32,10 @@ class Transfer_FinderProcess;
class TopoDS_Shape;
class Interface_CheckIterator;
class XSControl_WorkSession;
DEFINE_STANDARD_HANDLE(XSControl_WorkSession, IFSelect_WorkSession)
typedef NCollection_DataMap<TCollection_AsciiString, Handle(XSControl_WorkSession)> XSControl_WorkSessionMap;
//! This WorkSession completes the basic one, by adding :
//! - use of Controller, with norm selection...
//! - management of transfers (both ways) with auxiliary classes
@@ -47,66 +46,72 @@ typedef NCollection_DataMap<TCollection_AsciiString, Handle(XSControl_WorkSessio
//! Each item is accessed by a Name
class XSControl_WorkSession : public IFSelect_WorkSession
{
public:
public:
Standard_EXPORT XSControl_WorkSession();
Standard_EXPORT ~XSControl_WorkSession();
~XSControl_WorkSession()
{ ClearBinders(); }
//! In addition to basic ClearData, clears Transfer and Management
//! for interactive use, for mode = 0,1,2 and over 4
//! Plus : mode = 5 to clear Transfers (both ways) only
//! mode = 6 to clear enforced results
//! mode = 7 to clear transfers, results
Standard_EXPORT virtual void ClearData(const Standard_Integer theMode) Standard_OVERRIDE;
Standard_EXPORT virtual void ClearData (const Standard_Integer theMode) Standard_OVERRIDE;
//! Selects a Norm defined by its name.
//! A Norm is described and handled by a Controller
//! Returns True if done, False if <normname> is unknown
//!
//! The current Profile for this Norm is taken.
Standard_EXPORT Standard_Boolean SelectNorm(const Standard_CString theNormName);
Standard_EXPORT Standard_Boolean SelectNorm (const Standard_CString theNormName);
//! Selects a Norm defined by its Controller itself
Standard_EXPORT void SetController(const Handle(XSControl_Controller)& theCtl);
Standard_EXPORT void SetController (const Handle(XSControl_Controller)& theCtl);
//! Returns the name of the last Selected Norm. If none is
//! defined, returns an empty string
//! By default, returns the complete name of the norm
//! If <rsc> is True, returns the short name used for resource
Standard_EXPORT Standard_CString SelectedNorm(const Standard_Boolean theRsc = Standard_False) const;
Standard_EXPORT Standard_CString SelectedNorm (const Standard_Boolean theRsc = Standard_False) const;
//! Returns the norm controller itself
const Handle(XSControl_Controller)& NormAdaptor() const { return myController; }
//! Returns the current reference WS List, empty if not defined
const XSControl_WorkSessionMap& ReferenceWS() const { return myReferenceWS; }
//! Appends new refrence Work Session
Standard_EXPORT void AppendReferenceWS(const TCollection_AsciiString& theName,
const Handle(XSControl_WorkSession)& theWS);
const Handle(XSControl_Controller) & NormAdaptor() const
{ return myController; }
//! Returns the current Context List, Null if not defined
//! The Context is given to the TransientProcess for TransferRead
const NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)> & Context() const
{ return myContext; }
//! Sets the current Context List, as a whole
//! Sets it to the TransferReader
Standard_EXPORT void SetAllContext (const NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)>& theContext);
//! Clears the whole current Context (nullifies it)
Standard_EXPORT void ClearContext();
//! Prints the transfer status of a transferred item, as being
//! the Mapped n0 <num>, from MapWriter if <wri> is True, or
//! from MapReader if <wri> is False
//! Returns True when done, False else (i.e. num out of range)
Standard_EXPORT Standard_Boolean PrintTransferStatus(const Standard_Integer theNum,
const Standard_Boolean theWri,
Standard_OStream& theS) const;
Standard_EXPORT Standard_Boolean PrintTransferStatus (const Standard_Integer theNum, const Standard_Boolean theWri, Standard_OStream& theS) const;
//! Sets a Transfer Reader, by internal ways, according mode :
//! 0 recreates it clear, 1 clears it (does not recreate)
//! 2 aligns Roots of TransientProcess from final Results
//! 3 aligns final Results from Roots of TransientProcess
//! 4 begins a new transfer (by BeginTransfer)
//! 5 recreates TransferReader then begins a new transfer
Standard_EXPORT void InitTransferReader(const Standard_Integer theMode);
Standard_EXPORT void InitTransferReader (const Standard_Integer theMode);
//! Sets a Transfer Reader, which manages transfers on reading
Standard_EXPORT void SetTransferReader(const Handle(XSControl_TransferReader)& theTR);
Standard_EXPORT void SetTransferReader (const Handle(XSControl_TransferReader)& theTR);
//! Returns the Transfer Reader, Null if not set
const Handle(XSControl_TransferReader)& TransferReader() const { return myTransferReader; }
const Handle(XSControl_TransferReader) & TransferReader () const
{ return myTransferReader; }
//! Returns the TransientProcess(internal data for TransferReader)
Standard_EXPORT Handle(Transfer_TransientProcess) MapReader() const;
@@ -115,8 +120,8 @@ public:
//! defines the relevant read results (forgets the former ones)
//! Returns True when done, False in case of bad definition, i.e.
//! if Model from TP differs from that of Session
Standard_EXPORT Standard_Boolean SetMapReader(const Handle(Transfer_TransientProcess)& theTP);
Standard_EXPORT Standard_Boolean SetMapReader (const Handle(Transfer_TransientProcess)& theTP);
//! Returns the result attached to a starting entity
//! If <mode> = 0, returns Final Result
//! If <mode> = 1, considers Last Result
@@ -126,9 +131,8 @@ public:
//! <mode> = 10,11,12 idem but returns the Binder itself
//! (if it is not, e.g. Shape, returns the Binder)
//! <mode> = 20, returns the ResultFromModel
Standard_EXPORT Handle(Standard_Transient) Result(const Handle(Standard_Transient)& theEnt,
const Standard_Integer theMode) const;
Standard_EXPORT Handle(Standard_Transient) Result (const Handle(Standard_Transient)& theEnt, const Standard_Integer theMode) const;
//! Commands the transfer of, either one entity, or a list
//! I.E. calls the TransferReader after having analysed <ents>
//! It is cumulated from the last BeginTransfer
@@ -137,54 +141,66 @@ public:
//! - <ents> a HSequenceOfTransient : this list
//! - <ents> the Model : in this specific case, all the roots,
//! with no cumulation of former transfers (TransferReadRoots)
Standard_EXPORT Standard_Integer TransferReadOne(const Handle(Standard_Transient)& theEnts,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT Standard_Integer TransferReadOne (const Handle(Standard_Transient)& theEnts,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Commands the transfer of all the root entities of the model
//! i.e. calls TransferRoot from the TransferReader with the Graph
//! No cumulation with former calls to TransferReadOne
Standard_EXPORT Standard_Integer TransferReadRoots(const Message_ProgressRange& theProgress = Message_ProgressRange());
//! produces and returns a new Model well conditioned
//! It is produced by the Norm Controller
//! It can be Null (if this function is not implemented)
Standard_EXPORT Handle(Interface_InterfaceModel) NewModel();
//! Returns the Transfer Reader, Null if not set
Standard_EXPORT const Handle(XSControl_TransferWriter)& TransferWriter() const;
const Handle(XSControl_TransferWriter) & TransferWriter() const
{ return myTransferWriter; }
//! Changes the Map Reader, i.e. considers that the new one
//! defines the relevant read results (forgets the former ones)
//! Returns True when done, False if <FP> is Null
Standard_EXPORT Standard_Boolean SetMapWriter(const Handle(Transfer_FinderProcess)& theFP);
Standard_Boolean SetMapWriter (const Handle(Transfer_FinderProcess)& theFP)
{
if (theFP.IsNull()) return Standard_False;
myTransferWriter->SetFinderProcess(theFP);
return Standard_True;
}
//! Transfers a Shape from CasCade to a model of current norm,
//! according to the last call to SetModeWriteShape
//! Returns status :Done if OK, Fail if error during transfer,
//! Error if transfer badly initialised
Standard_EXPORT IFSelect_ReturnStatus TransferWriteShape(const TopoDS_Shape& theShape,
const Standard_Boolean theCompGraph = Standard_True,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT IFSelect_ReturnStatus TransferWriteShape
(const TopoDS_Shape& theShape,
const Standard_Boolean theCompGraph = Standard_True,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Returns the check-list of last transfer (write)
//! It is recorded in the FinderProcess, but it must be bound with
//! resulting entities (in the resulting file model) rather than
//! with original objects (in fact, their mappers)
Standard_EXPORT Interface_CheckIterator TransferWriteCheckList() const;
const Handle(XSControl_Vars) & Vars() const
{ return myVars; }
void SetVars (const Handle(XSControl_Vars)& theVars)
{ myVars = theVars; }
DEFINE_STANDARD_RTTIEXT(XSControl_WorkSession,IFSelect_WorkSession)
DEFINE_STANDARD_RTTIEXT(XSControl_WorkSession, IFSelect_WorkSession)
protected:
private:
//! Clears binders
void clearBinders();
private:
Standard_EXPORT void ClearBinders();
Handle(XSControl_Controller) myController;
Handle(XSControl_TransferReader) myTransferReader;
Handle(XSControl_TransferWriter) myTransferWriter;
XSControl_WorkSessionMap myReferenceWS;
NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)> myContext;
Handle(XSControl_Vars) myVars;
};
#endif // _XSControl_WorkSession_HeaderFile

View File

@@ -1,6 +1,3 @@
puts "TODO CR23671 Linux: Error"
puts "TODO CR23671 Linux: Draw_Failure: Could not open"
puts "============"
puts "CR23671"
puts "============"

24
tests/bugs/mesh/bug33315 Normal file
View File

@@ -0,0 +1,24 @@
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. offsetperform operation not done."
puts "TODO OCC26556 ALL: ERROR. Mixed connectivity of faces."
puts "============"
puts "OCC5805"
@@ -20,6 +20,7 @@ if { [catch { offsetshape result a -1 a_6 } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong"
}
if { [isdraw result] } {
checkmaxtol result -min_tol 1.
checkprops result -s 1185.03
@@ -27,3 +28,4 @@ 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,6 +1,4 @@
puts "TODO OCC25925 ALL: ERROR. offsetperform operation not done."
puts "TODO OCC25925 ALL: Tcl Exception:"
puts "TODO OCC25925 ALL: TEST INCOMPLETE"
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "============"
puts "OCC5805"
@@ -25,6 +23,7 @@ if { [catch { offsetperform result } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong"
}
if { [isdraw result] } {
checkmaxtol result -min_tol 1.
checkprops result -s 1185.03
@@ -32,3 +31,4 @@ 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,3 +1,5 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "============"
puts "OCC5805"
puts "============"
@@ -21,6 +23,7 @@ if { [catch { offsetperform result } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong"
}
if { [isdraw result] } {
checkmaxtol result -min_tol 1.
checkprops result -s 876.584
@@ -28,3 +31,5 @@ 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,3 +1,5 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "============"
puts "OCC5805"
puts "============"
@@ -16,9 +18,12 @@ if { [catch { offsetshape result a -1 } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong"
}
if { [isdraw result] } {
checkmaxtol result -min_tol 1.
checkprops result -s 876.584
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

@@ -0,0 +1,18 @@
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

@@ -0,0 +1,13 @@
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

@@ -0,0 +1,11 @@
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

@@ -0,0 +1,11 @@
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

@@ -0,0 +1,9 @@
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

11
tests/bugs/step/bug33307 Normal file
View File

@@ -0,0 +1,11 @@
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

32
tests/bugs/step/bug33317 Normal file
View File

@@ -0,0 +1,32 @@
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

16
tests/bugs/xde/bug30828 Normal file
View File

@@ -0,0 +1,16 @@
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

@@ -0,0 +1,16 @@
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

@@ -0,0 +1,68 @@
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,4 +1,5 @@
puts "TODO OCC26030 ALL: Error : The offset cannot be built"
puts "TODO OCC26030 ALL: ERROR. Mixed connectivity of faces."
puts "========"
puts "OCC26288"

View File

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

@@ -0,0 +1,13 @@
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,4 +1,6 @@
puts "TODO OCC25925 ALL: ERROR. offsetperform operation not done."
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "TODO OCC25925 ALL: Error : The offset cannot be built."
puts "============"
puts "OCC5806"
puts "============"
@@ -28,11 +30,12 @@ explode resthru f
if { [catch { offsetshape result resthru -0.5 resthru_6 resthru_7 } catch_result] } {
puts "Faulty ${BugNumber} : offsetshape is wrong"
}
if { [isdraw result] } {
checkmaxtol result -min_tol 1.
checkmaxtol result -min_tol 1.
checkprops result -s 1116.06
checkshape result
checkprops result -s 1116.06
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
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: The command cannot be built"
puts "TODO OCC23190 ALL: result is not a topological shape!!!"
puts "TODO OCC23068 ALL: TEST INCOMPLETE"
puts "TODO OCC23068 ALL: Error : The offset cannot be built."
# Original bug : hkg60144/pro15325
# Date : 17Juillet98

View File

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

View File

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

View File

@@ -0,0 +1,8 @@
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,8 +1,7 @@
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: operation with offset value 9 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: 9 10"
puts "TODO CR27414 ALL: Operations with following offset values have failed: 10"
puts "============================================================================================="
puts "0032333: Modeling Algorithms - Empty(wrong) result of offset operation in mode \"Complete\" join type \"Intersection\""

View File

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

28
tests/v3d/bugs/bug32570 Normal file
View File

@@ -0,0 +1,28 @@
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 sensitives "diam2"
set pick_coord { { 221 99 } { 285 99 } }
set pick_coord { { 222 99 } { 285 99 } }
set check_coord { 239 99 }
check_picking $pick_coord $check_coord "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
set mouse_pick {226 214}
set mouse_drag {306 265}
set mouse_pick {231 207}
set mouse_drag {311 258}
# note: mouse events cannot be emulated here, so the original bug cannot be reproduced by this test case
vmoveto {*}$mouse_pick

View File

@@ -61,7 +61,7 @@ vdump $anImage2
# -------------------------------------------
set mouse_pick {316 261}
set mouse_drag {279 286}
set mouse_drag {281 286}
vmoveto {*}$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
set mouse_pick {200 092}
set mouse_pick {199 092}
set mouse_drag {176 142}
vmoveto {*}$mouse_pick
@@ -65,8 +65,8 @@ vdump $anImage1
vmanipulator m -followRotation 1
set mouse_pick {173 137}
set mouse_drag {233 144}
set mouse_pick {175 135}
set mouse_drag {232 144}
vmoveto {*}$mouse_pick
vselect {*}$mouse_pick
@@ -113,7 +113,7 @@ vmanipulator m -followRotation 0
# test rotation around y axis (world reference frame)
# ---------------------------------------------------
set mouse_pick {205 087}
set mouse_pick {205 088}
set mouse_drag {232 127}
vmoveto {*}$mouse_pick
@@ -129,7 +129,7 @@ vdump $anImage4
# test rotation around z axis (world reference frame)
# ---------------------------------------------------
set mouse_pick {228 141}
set mouse_pick {228 142}
set mouse_drag {184 143}
vmoveto {*}$mouse_pick

View File

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

View File

@@ -11,7 +11,7 @@ set x1 210
set y1 184
set x2 207
set y2 180
set y2 182
stepread [locate_data_file OCC23012-Sample_3.stp] a *
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]
if { ${NbSelected1} != 13 } { puts "Error : Polygonal shift selection doesn't work properly" }
vselect 350 120 -xor
vselect 350 121 -xor
set NbSelected1 [vnbselected]
if { ${NbSelected1} != 12 } { puts "Error : (case 2)" }

View File

@@ -0,0 +1,23 @@
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"
}
vselnext
if { ![check_highlighting 1 $coords] } {
puts "ERROR: incorrect highlighting of edge 2 after vselnext call"
}
vselnext
if { ![check_highlighting 2 $coords] } {
puts "ERROR: incorrect highlighting of edge 1 after vselnext call"
}
vselnext
if { ![check_highlighting 1 $coords] } {
puts "ERROR: incorrect highlighting of edge 2 after vselnext call"
}
vselnext
if { ![check_highlighting 0 $coords] } {
puts "ERROR: incorrect highlighting of edge 10 after vselnext call"
}
vselprev
if { ![check_highlighting 2 $coords] } {
puts "ERROR: incorrect highlighting of edge 1 after vselprev call"
}
vselprev
if { ![check_highlighting 1 $coords] } {
puts "ERROR: incorrect highlighting of edge 2 after vselprev call"
}
vselprev
if { ![check_highlighting 2 $coords] } {
puts "ERROR: incorrect highlighting of edge 1 after vselprev call"
}
vselprev
if { ![check_highlighting 0 $coords] } {
puts "ERROR: incorrect highlighting of edge 10 after vselprev call"
}