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

Compare commits

..

1 Commits

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

View File

@@ -45,7 +45,6 @@ user_guides/visualization/visualization.md
user_guides/iges/iges.md
user_guides/step/step.md
user_guides/xde/xde.md
user_guides/de_wrapper/de_wrapper.md
user_guides/ocaf/ocaf.md
user_guides/draw_test_harness/draw_test_harness.md
user_guides/inspector/inspector.md

View File

@@ -20,7 +20,6 @@ user_guides/vis/vis.md
user_guides/iges/iges.md
user_guides/step/step.md
user_guides/xde/xde.md
user_guides/de_wrapper/de_wrapper.md
user_guides/inspector/inspector.md
user_guides/draw_test_harness/draw_test_harness.md

View File

@@ -1,413 +0,0 @@
Data Exchange Wrapper (DE_Wrapper) {#occt_user_guides__de_wrapper}
============================
@tableofcontents
@section occt_de_wrapper_1 Introduction
This guide explains how to use the **Data Exchange Wrapper** (DE Wrapper).
It provides basic directions on setup, usage and file creation via DE_Wrapper.
The Data Exchange Wrapper (DE Wrapper) module allows reading and writing supported CAD formats to shape objects or special XDE documents, setting up the transfer process for all CAD files.
It is also possible to add support for new CAD formats by prototyping existing tools.
The DE Wrapper component requires @ref occt_user_guides__xde "XDE" toolkit for operation.
This guide mainly explains how to convert CAD files to Open CASCADE Technology (OCCT) shapes and vice versa.
This guide principally deals with the following OCCT classes:
* The Provider class, which loads CAD files and translates their contents to OCCT shapes or XDE documents, or translates OCCT shapes or XDE documents to CAD entities and then writes those entities to a CAD file.
* The Configuration class, which contains all information for the transfer process, such as the units, tolerance, and all internal information for the OCC readers or writers.
* The wrapper class, which contains all loaded configuration objects with own CAD format, reads or writes CAD files in the format derived from file extension or contents and saves or loads configuration settings for loaded configuration objects.
@section occt_de_wrapper_2 Supported CAD formats
| CAD format | Extensions | RW support | Thread Safety | Presentation | Package |
| :--------- | :--------- | :--------- | :----------- | :----------- | :------ |
| STEP | .stp, .step .stepz | RW | No | BRep, Mesh | STEPCAFControl |
| XCAF | .xbf | RW | Yes | BRep, Mesh | DEXCAFCascade |
| BREP | .brep | RW | Yes | BRep, Mesh | DEBRepCascade |
| IGES | .igs, .iges | RW | No | BRep | IGESCAFControl |
| OBJ | .obj | RW | Yes | Mesh | RWObj |
| STL | .stl | RW | Yes | Mesh | RWStl |
| PLY | .ply | W | Yes | Mesh | RWPly |
| GLTF | .glTF .glb | RW | Yes | Mesh | RWGltf |
| VRML | .wrl .vrml | RW | Yes | Mesh | Vrml |
**Note** :
* The format names in the first column match the FormatName values used for configuration nodes.
* The VendorName for all listed CAD formats is "OCC".
@section occt_de_wrapper_3 DE Session Configuration
Any providers can have their own read/write parameters. The transfer process is set up using DE configuration nodes, which hold all relevant parameters. There are two ways to change the parameter values: directly from code or by an external resource file/string.
The session is a global or static DE_Wrapper object that stores registered DE configuration nodes and wraps DE commands to work with them. It has some configuration parameters of its own and also keeps track of loaded nodes and specilal global parameters.
@subsection occt_de_wrapper_3_1 Getting a DE session. Code sample
Working with a DE session requires a DE_Wrapper object to be loaded or created first.
Getting the global DE_Wrapping object:
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
~~~~
Creating a local DE_Wrapper:
~~~~{.cpp}
Handle(DE_Wrapper) aSession = new DE_Wrapper();
~~~~
It is recommended to create a local one-time copy to work with the session, if no global changes are intended.
~~~~{.cpp}
Handle(DE_Wrapper) aOneTimeSession = aSession->Copy();
~~~~
@subsection occt_de_wrapper_3_2 Configuration resource
Configuration resource is an external file or string of the following format:
~~~~{.cpp}
global.priority.STEP : OCC DTK
global.general.length.unit : 1
provider.STEP.OCC.read.precision.val : 0.0001
~~~~
@subsubsection occt_de_wrapper_3_2_1 Configuration resource: graph of scopes
* **global.** is a scope of global parameters
* **priority.** is a scope of priority to use vendors with their providers.
* **general.** is a scope of global configuration parameter values
* <strong>"..."</strong> is an internal configuration with any internal scopes
* <strong>". : "</strong> is a separator of key-value
* __...__ parameter value, can't contain new line symbols.
* **provider.** is a scope of configuration providers
* **STEP.** is a scope of CAD format to configure
* **OCC.** is a scope of a vendor or provider
* <strong>"..."</strong> is an internal configuration with any internal scopes
* <strong>". : "</strong> is a separator of key-value
* <strong>"..."</strong> parameter value, can't contain new line symbols.
@subsubsection occt_de_wrapper_3_2_2 Loading configuration resources. Configuring DE Session
The resource should be loaded after the registration of all providers that should be configured. The resource only impacts registered parameters. To configure a new registered provider it is necessary to load the resource again. Parameters not present in the resource will remain unchanged.
There are two ways to check what parameters are available:
* C++: Open ConfigureNode file and check the InternalParameter field. Each parameter will be described with a comment. To check the global parameters, use the DE_Wrapper class public methods.
* Resource: Register all available Nodes to the session, then save the configuration and view all existing parameters.
There are two options for loading a resource: recursive and global parameters only. Recursive is the default option to configure all global parameters (units, priority, enable status) and all registered providers. Non-recursive configures only global parameters and ignores all provider settings. This option is the best for updating provider priority.
@subsubsection occt_de_wrapper_3_2_3 Loading configuration resources. Code sample
Configuring using a resource string:
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aString =
"global.priority.STEP : OCC DTK\n"
"global.general.length.unit : 1\n"
"provider.STEP.OCC.read.precision.val : 0.\n";
Standard_Boolean aIsRecursive = Standard_True;
if (!aSession->Load(aString, aIsRecursive))
{
Message::SendFail() << "Error: configuration is incorrect";
}
~~~~
Configuring using a resource file:
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "";
Standard_Boolean aIsRecursive = Standard_True;
if (!aSession->Load(aPathToFile, aIsRecursive))
{
Message::SendFail() << "Error: configuration is incorrect";
}
~~~~
@subsubsection occt_de_wrapper_3_2_4 Loading configuration resources. DRAW sample
Configuring using a resource string:
~~~~{.cpp}
set conf "
global.priority.STEP : OCC
global.general.length.unit : 1
provider.STEP.OCC.read.iges.bspline.continuity : 1
provider.STEP.OCC.read.precision.mode : 0
provider.STEP.OCC.read.precision.val : 0.0001
"
LoadConfiguration ${conf} -recursive on
~~~~
Configuring using a resource file:
~~~~{.cpp}
set pathToFile ""
LoadConfiguration ${pathToFile} -recursive on
~~~~
@subsubsection occt_de_wrapper_3_2_5 Saving configuration resources. Dump of configuration DE Session
Saving the configuration of a DE Session involves dumping all parameters of registered providers.
If a parameter did not change during the session, its value remains as default.
There are two ways to save a resource: recursive and global parameters only. Recursive is the way to dump all registered provider information. Non-recursive dumps only global parameters, for example, save priority of vendors or the length unit.
It is possible to filter what vendors or providers to save by providing the correct name of the vendor or provider.
@subsubsection occt_de_wrapper_3_2_6 Saving configuration resources. Code sample
Dump to resource string. If the vendors list is empty, saves all vendors. If the providers list is empty, saves all providers of valid vendors.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TColStd_ListOfAsciiString aFormats;
TColStd_ListOfAsciiString aVendors;
aFormats.Appends("STEP");
aVendors.Appends("OCC");
Standard_Boolean aIsRecursive = Standard_True;
TCollection_AsciiString aConf = aSession->aConf->Save(aIsRecursive, aFormats, aVendors);
~~~~
Configure using a resource file. If the vendors list is empty, saves all vendors. If the providers list is empty, saves all providers of valid vendors.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "";
TColStd_ListOfAsciiString aFormats;
TColStd_ListOfAsciiString aVendors;
aFormats.Appends("STEP");
aVendors.Appends("OCC");
Standard_Boolean aIsRecursive = Standard_True;
if (!aSession->Save(aPathToFile, aIsRecursive, aFormats,aVendors))
{
Message::SendFail() << "Error: configuration is not saved";
}
~~~~
@subsubsection occt_de_wrapper_3_2_7 Saving configuration resources. DRAW sample
Dump configuration to string. If no list of vendors is passed or it is empty, all vendors are saved. If no providers list is passed or it is empty, all providers of valid vendors are saved.
~~~~{.cpp}
set vendors "OCC"
set format "STEP"
set dump_conf [DumpConfiguration -recursive on -format ${format} -vendor ${vendors}]
~~~~
Dump configuration to file. If no vendors list are set as an argument or it is empty, saves all vendors. If no providers list as argument or it is empty, saves all providers of valid vendors:
~~~~{.cpp}
set vendors "OCC"
set format "STEP"
set pathToFile ""
DumpConfiguration -path ${pathToFile} -recursive on -format ${format} -vendor ${vendors}
~~~~
@subsection occt_de_wrapper_3_3 Registering providers
To transfer a CAD file using DE Wrapper, it is necessary to register a CAD provider.
The provider contains internal and global parameters that have default values in the creation stage.
All registered providers are set to the map with information about its vendor and kept as smart handles. Therefore, it is possible to change the values via handle from external code.
@subsubsection occt_de_wrapper_3_3_1 Registering providers. Code sample
It is nesessary to register only one ConfigurationNode for all needed formats.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
Handle(DE_ConfigurationNode) aNode = new STEPCAFControl_ConfigurationNode();
aSession->Bind(aNode);
~~~~
@subsubsection occt_de_wrapper_3_3_2 Registering providers. DRAW Sample
Use DRAW with all providers registered by the following command:
~~~~{.cpp}
pload XDE
~~~~
@subsubsection occt_de_wrapper_3_3_3 Realtime initialization. Code sample
It is possible to change a paramater from code using a smart pointer.
~~~~{.cpp}
// global variable
static Handle(STEPCAFControl_ConfigurationNode) THE_STEP_NODE;
static Handle(DE_ConfigurationNode) RegisterStepNode()
{
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
if (!THE_STEP_NODE.IsNull())
{
return THE_STEP_NODE;
}
THE_STEP_NODE = new STEPCAFControl_ConfigurationNode();
aSession->Bind(THE_STEP_NODE);
return THE_STEP_NODE;
}
// Change parameter value
THE_STEP_NODE->InternalParameters.ReadRelationship = false;
THE_STEP_NODE->InternalParameters.ReadName = false;
THE_STEP_NODE->InternalParameters.ReadProps = false;
~~~~
@subsection occt_de_wrapper_3_4 Priority of Vendors
DE session is able to work with several vendors with the same supported CAD format. To choose the preffered vendor for each format, use a special priority list.
If the high priority vendor's provider is not supported, a transfer operation is needed (write/read), then the next vendor will be chosen.
@subsubsection occt_de_wrapper_3_4_1 Priority of Vendors. Code sample
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aFormat = "STEP";
TColStd_ListOfAsciiString aVendors;
aVendors.Appends("OCC"); // high priority
aVendors.Appends("DTK");
// Flag to disable not choosen vendors, in this case configuration is possible
// otherwise, lower their priority and continue to check ability to transfer
Standard_Boolean aToDisable = Standard_True;
aSession->ChangePriority(aFormat, aVendors, aToDisable);
~~~~
@subsubsection occt_de_wrapper_3_4_2 Priority of Vendors. DRAW Sample
It is recommended to disable recursion and update only global parameters.
~~~~{.cpp}
set conf "
global.priority.STEP : OCC DTK
"
LoadConfiguration ${conf} -recursive off
~~~~
@section occt_de_wrapper_4 Transfer of CAD files
To transfer from a CAD file to OCC or from OCC to a CAD file, it is necessary to use a configured DE_Wrapper object. It can be local, one-time or global. Global configuration of DE_Wrapper propagates to all nodes via transfer. There are two options for transferring: using OCC shape or XCAF document. It is possible to work only with real path to/from the file. Streaming is not supported (yet).
The format of input/output file is automatically determined by its extension or contents.
@subsection occt_de_wrapper_4_1 Transfer of CAD files. Code samples
Reading STEP file to Shape.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "example.stp";
TopoDS_Shape aShRes;
if (!aSession->Read(aPathToFile, aShRes))
{
Message::SendFail() << "Error: Can't read file";
}
~~~~
Writing Shape to STEP file.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "example.stp";
TopoDS_Shape aShFrom = ...;
if (!aSession->Write(aPathToFile, aShRes))
{
Message::SendFail() << "Error: Can't write file";
}
~~~~
Reading STEP file into XCAF document.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "example.stp";
Handle(TDocStd_Document) aDoc = ...;
if (!aSession->Read(aPathToFile, aDoc))
{
Message::SendFail() << "Error: Can't read file";
}
~~~~
Writing XCAF document into STEP.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper();
TCollection_AsciiString aPathToFile = "example.stp";
Handle(TDocStd_Document) aDoc = ...;
if (!aSession->Write(aPathToFile, aDoc))
{
Message::SendFail() << "Error: Can't write file";
}
~~~~
@subsection occt_de_wrapper_4_2 Transfer of CAD files. DRAW samples
Reading a STEP file into a Shape.
~~~~{.cpp}
set fileName "sample.stp"
readfile shape ${fileName}
~~~~
Writing a Shape into STEP.
~~~~{.cpp}
set fileName "sample.stp"
writefile shape ${fileName}
~~~~
Reading STEP into XCAF document.
~~~~{.cpp}
set fileName "sample.stp"
ReadFile D ${fileName}
~~~~
Writing XCAF document into STEP.
~~~~{.cpp}
set fileName "sample.stp"
WriteFile D ${fileName}
~~~~
@subsection occt_de_wrapper_4_3 Transfer using DE Provider. Code sample
It is possible to read and write CAD files directly from a special provider.
~~~~{.cpp}
// Creating or getting node
Handle(STEPCAFControl_ConfigurationNode) aNode = new STEPCAFControl_ConfigurationNode();
// Creationg an one-time provider
Handle(DE_Provider) aProvider = aNode->BuildProvider();
// Setting configuration with all parameters
aProvider->SetNode(aNode);
if (!aProvider->Read(...))
{
Message::SendFail() << "Error: Can't read STEP file";
}
if (!aProvider->Write(...))
{
Message::SendFail() << "Error: Can't write STEP file";
}
~~~~
@subsection occt_de_wrapper_4_4 Temporary configuration via transfer
It is possible to change the configuration of only one transfer operation. To avoid changing parameters in a session, one-time clone of the session can be created and used for transfer. This way is recommended for use in multithreaded mode.
@subsubsection occt_de_wrapper_4_4_1 Temporary configuration via transfer. Code sample
Code sample to configure via transfer.
~~~~{.cpp}
Handle(DE_Wrapper) aSession = DE_Wrapper::GlobalWrapper()->Copy();
TCollection_AsciiString aString =
"global.priority.STEP : OCC DTK\n"
"global.general.length.unit : 1\n"
"provider.STEP.OCC.read.precision.val : 0.\n";
if (!aSession->Load(aString, aIsRecursive))
{
Message::SendFail() << "Error: configuration is incorrect";
}
TCollection_AsciiString aPathToFile = "example.stp";
TopoDS_Shape aShRes;
if (!aSession->Read(aPathToFile, aShRes))
{
Message::SendFail() << "Error: Can't read file";
}
~~~~
@subsubsection occt_de_wrapper_4_4_2 Temporary configuration via transfer. DRAW sample
Code sample to configure via transfer within DRAW command.
~~~~{.cpp}
set fileName "sample.stp"
readfile S5 $filename -conf "global.general.length.unit : 1000 "
~~~~
Code sample to configure via transfer as variable.
~~~~{.cpp}
set fileName "sample.stp"
set conf "
global.priority.STEP : OCC
global.general.length.unit : 1
provider.STEP.OCC.read.iges.bspline.continuity : 1
provider.STEP.OCC.read.precision.mode : 0
provider.STEP.OCC.read.precision.val : 0.0001
"
readfile S5 $filename -conf ${conf}
~~~~

View File

@@ -13,7 +13,6 @@ OCCT User Guides are organized by OCCT modules:
* @subpage occt_user_guides__iges "IGES Translator"
* @subpage occt_user_guides__step "STEP Translator"
* @subpage occt_user_guides__xde "Extended Data Exchange (XDE)"
* @subpage occt_user_guides__de_wrapper "Data Exchange Wrapper (DE Wrapper)"
* @subpage occt_user_guides__ocaf "Open CASCADE Application Framework (OCAF)"
* @subpage occt_user_guides__test_harness "DRAW Test Harness"
* @subpage occt_user_guides__inspector "Inspector"

View File

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

View File

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

View File

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

View File

@@ -15,23 +15,24 @@
#ifndef _AIS_AnimationObject_HeaderFile
#define _AIS_AnimationObject_HeaderFile
#include <AIS_BaseAnimationObject.hxx>
#include <AIS_Animation.hxx>
#include <AIS_InteractiveContext.hxx>
#include <gp_TrsfNLerp.hxx>
//! Animation defining object transformation.
class AIS_AnimationObject : public AIS_BaseAnimationObject
class AIS_AnimationObject : public AIS_Animation
{
DEFINE_STANDARD_RTTIEXT(AIS_AnimationObject, AIS_BaseAnimationObject)
DEFINE_STANDARD_RTTIEXT(AIS_AnimationObject, AIS_Animation)
public:
//! 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[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
//! @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
Standard_EXPORT AIS_AnimationObject (const TCollection_AsciiString& theAnimationName,
const Handle(AIS_InteractiveContext)& theContext,
const Handle(AIS_InteractiveObject)& theObject,
@@ -43,10 +44,17 @@ protected:
//! Update the progress.
Standard_EXPORT virtual void update (const AIS_AnimationProgress& theProgress) Standard_OVERRIDE;
private:
//! Invalidate the viewer for proper update.
Standard_EXPORT void invalidateViewer();
gp_TrsfNLerp myTrsfLerp; //!< interpolation tool
protected:
Handle(AIS_InteractiveContext) myContext; //!< context where object is displayed
Handle(AIS_InteractiveObject) myObject; //!< presentation object to set location
gp_TrsfNLerp myTrsfLerp; //!< interpolation tool
};
DEFINE_STANDARD_HANDLE(AIS_AnimationObject, AIS_Animation)
#endif // _AIS_AnimationObject_HeaderFile

View File

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

View File

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

View File

@@ -1116,23 +1116,18 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
const Standard_Integer theMode)
{
//Check mode
const AIS_ManipulatorMode aMode = (AIS_ManipulatorMode) theMode;
AIS_ManipulatorMode aMode = (AIS_ManipulatorMode) theMode;
if (aMode == AIS_MM_None)
{
return;
}
Handle(SelectMgr_EntityOwner) anOwner;
// 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)
if (aMode == AIS_MM_None)
{
case AIS_MM_Translation:
anOwner = new SelectMgr_EntityOwner (this, 5);
}
if (aMode == AIS_MM_Translation || aMode == AIS_MM_None)
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
@@ -1141,21 +1136,23 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
continue;
}
const Axis& anAxis = myAxes[anIt];
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Translation, 9);
if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Translation, 9);
}
// define sensitivity by line
Handle(Select3D_SensitiveSegment) aLine = new Select3D_SensitiveSegment(anOwner, gp::Origin(), anAxis.TranslatorTipPosition());
aLine->SetSensitivityFactor (aHighSensitivity);
Handle(Select3D_SensitiveSegment) aLine = new Select3D_SensitiveSegment (anOwner, gp::Origin(), anAxis.TranslatorTipPosition());
aLine->SetSensitivityFactor (15);
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;
}
case AIS_MM_Rotation:
if (aMode == AIS_MM_Rotation || aMode == AIS_MM_None)
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
@@ -1164,20 +1161,22 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
continue;
}
const Axis& anAxis = myAxes[anIt];
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Rotation, 9);
if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Rotation, 9);
}
// define sensitivity by circle
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);
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);
// 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;
}
case AIS_MM_Scaling:
if (aMode == AIS_MM_Scaling || aMode == AIS_MM_None)
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
@@ -1185,19 +1184,21 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
{
continue;
}
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_Scaling, 9);
if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Scaling, 9);
}
// define sensitivity by point
Handle(Select3D_SensitivePoint) aPnt = new Select3D_SensitivePoint(anOwner, myAxes[anIt].ScalerCubePosition());
aPnt->SetSensitivityFactor (aHighSensitivity);
Handle(Select3D_SensitivePoint) aPnt = new Select3D_SensitivePoint (anOwner, myAxes[anIt].ScalerCubePosition());
aPnt->SetSensitivityFactor (15);
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;
}
case AIS_MM_TranslationPlane:
if (aMode == AIS_MM_TranslationPlane || aMode == AIS_MM_None)
{
for (Standard_Integer anIt = 0; anIt < 3; ++anIt)
{
@@ -1205,33 +1206,28 @@ void AIS_Manipulator::ComputeSelection (const Handle(SelectMgr_Selection)& theSe
{
continue;
}
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9);
if (aMode != AIS_MM_None)
{
anOwner = new AIS_ManipulatorOwner(this, anIt, AIS_MM_TranslationPlane, 9);
}
// define sensitivity by two crossed lines
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_Pnt aP1, aP2;
aP1 = myAxes[((anIt + 1) % 3)].TranslatorTipPosition();
aP2 = myAxes[((anIt + 2) % 3)].TranslatorTipPosition();
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(aLowSensitivity);
theSelection->Add (aLine1);
Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, anOrig, aMidP);
aLine2->SetSensitivityFactor (aLowSensitivity);
theSelection->Add (aLine2);
aLine1->SetSensitivityFactor(10);
theSelection->Add(aLine1);
Handle(Select3D_SensitiveSegment) aLine2 = new Select3D_SensitiveSegment(anOwner, gp::Origin(), aMidP);
aLine2->SetSensitivityFactor(10);
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,8 +2,6 @@ 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
@@ -14,8 +12,6 @@ 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,178 +248,167 @@ 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 aShell;
aBB.MakeShell(aShell);
aBB.Add(aShell, aFF);
aMEFP.Clear();
TopExp::MapShapesAndAncestors(aShell, TopAbs_EDGE, TopAbs_FACE, aMEFP);
TopoDS_Shell aShellStart;
aBB.MakeShell(aShellStart);
aBB.Add(aShellStart, aFF);
//
// 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);
TopTools_ListOfShape aLShells;
aLShells.Append(aShellStart);
//
TopTools_ListIteratorOfListOfShape aItLShells(aLShells);
for (; aItLShells.More(); aItLShells.Next()) {
TopoDS_Shell& aShell = TopoDS::Shell(aItLShells.ChangeValue());
//
// 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()));
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);
//
// proceed only free edges in this shell
if (aMEFP.Contains(aE)) {
const TopTools_ListOfShape& aLFP = aMEFP.FindFromKey(aE);
aNbFP = aLFP.Extent();
if (aNbFP > 1) {
// 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) {
continue;
}
}
// 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)) {
// avoid processing of degenerated edges
if (BRep_Tool::Degenerated(aE)) {
continue;
}
//
// find current edge in the face
if (!BOPTools_AlgoTools::GetEdgeOff(aE, aFL, aEL)) {
// candidate faces list
const TopTools_ListOfShape& aLF = aEFMap.FindFromKey(aE);
aNbLF = aLF.Extent();
if (!aNbLF) {
continue;
}
//
if (isBoundary && !aBoundaryFaces.Contains (aFL))
// prepare for selecting the next face
// take only not-processed faces as a candidates
BOPTools_ListOfCoupleOfShape aLCSOff;
//
Standard_Integer aNbWaysInside = 0;
TopoDS_Face aSelF;
TopTools_ListIteratorOfListOfShape aItLF(aLF);
for (; aItLF.More(); aItLF.Next()) {
const TopoDS_Face& aFL = (*(TopoDS_Face*)(&aItLF.Value()));
if (aF.IsSame(aFL) || AddedFacesMap.Contains(aFL)) {
continue;
}
//
// find current edge in the face
if (!BOPTools_AlgoTools::GetEdgeOff(aE, aFL, aEL)) {
continue;
}
//
if (isBoundary && !aBoundaryFaces.Contains (aFL))
{
++aNbWaysInside;
aSelF = aFL;
}
aCSOff.SetShape1(aEL);
aCSOff.SetShape2(aFL);
aLCSOff.Append(aCSOff);
}//for (; aItLF.More(); aItLF.Next()) {
//
aNbOff = aLCSOff.Extent();
if (!aNbOff){
continue;
}
//
// among all the adjacent faces chose one with the minimal
// angle to the current one
if (!isBoundary || aNbWaysInside != 1)
{
++aNbWaysInside;
aSelF = aFL;
if (aNbOff == 1) {
aSelF = (*(TopoDS_Face*)(&aLCSOff.First().Shape2()));
}
else if (aNbOff > 1) {
BOPTools_AlgoTools::GetFaceOff(aE, aF, aLCSOff, aSelF, aContext);
}
}
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 (aNbOff == 1) {
aSelF = (*(TopoDS_Face*)(&aLCSOff.First().Shape2()));
//
if (!aSelF.IsNull() && AddedFacesMap.Add(aSelF)) {
aBB.Add(aShell, aSelF);
TopExp::MapShapesAndAncestors(aSelF, TopAbs_EDGE, TopAbs_FACE, aMEFP);
}
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());
} // for (; aExp.More(); aExp.Next()) {
} // for (; aItS.More(); aItS.Next()) {
//
if (BRep_Tool::IsClosed(aShSp)) {
aShSp.Closed(Standard_True);
myLoops.Append(aShSp);
// 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);
}
}
else {
aLShNC.Append(aShSp);
//
bAllFacesTaken = (AddedFacesMap.Extent() == aNbShapes);
if (bAllFacesTaken) {
break;
}
}
//
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());
//
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());
}
}
}
}
} // 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 :
@@ -445,21 +434,6 @@ 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,14 +127,6 @@ void BRepBndLib::Add(const TopoDS_Shape& S, Bnd_Box& B, Standard_Boolean useTria
for (ex.Init(S,TopAbs_EDGE,TopAbs_FACE); ex.More(); ex.Next())
{
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)
{
@@ -151,7 +143,7 @@ void BRepBndLib::Add(const TopoDS_Shape& S, Bnd_Box& B, Standard_Boolean useTria
else
{
BRep_Tool::PolygonOnTriangulation(E, Poly, T, l);
if (!Poly.IsNull() && !T.IsNull() && T->NbNodes() > 0)
if (useTriangulation && !Poly.IsNull() && !T.IsNull() && T->NbNodes() > 0)
{
const TColStd_Array1OfInteger& Indices = Poly->Nodes();
nbNodes = Indices.Length();

View File

@@ -351,10 +351,6 @@ 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);
@@ -362,10 +358,6 @@ 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);
@@ -379,10 +371,6 @@ 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);
@@ -390,10 +378,6 @@ 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);
@@ -563,10 +547,6 @@ 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);
@@ -701,7 +681,7 @@ void BRepFill_CompatibleWires::Init(const TopTools_SequenceOfShape& Sections)
{
myInit = Sections;
myWork = Sections;
myPercent = 0.1;
myPercent = 0.01;
myStatus = BRepFill_ThruSectionErrorStatus_NotDone;
myMap.Clear();

View File

@@ -41,7 +41,6 @@
#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,
@@ -51,12 +50,6 @@ 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 :
@@ -112,168 +105,15 @@ static void EdgeAnalyse(const TopoDS_Edge& E,
}
else
{
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);
}
}
if (ChFi3d::IsTangentFaces(E, F1, F2)) //weak condition
ConnectType = ChFiDS_Tangential;
else
{
ConnectType = ChFiDS_Mixed;
}
ConnectType = ChFi3d::DefineConnectType(E, F1, F2, SinTol, Standard_False);
}
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,8 +29,7 @@ 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_MixedConnectivity //!< Different connectivity of faces along edge: partially C0 and tangent
BRepOffset_UserBreak //!< user break
};
#endif // _BRepOffset_Error_HeaderFile

View File

@@ -910,19 +910,6 @@ 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;
@@ -2973,36 +2960,6 @@ 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,6 +5225,7 @@ void BRepOffset_BuildOffsetFaces::FilterInvalidEdges (const BRepOffset_DataMapOf
const TopTools_ListOfShape* pEOrigins = myOEOrigins.Seek (aE);
if (!pEOrigins)
{
theMEUseInRebuild.Add (aE);
continue;
}
@@ -5392,29 +5393,6 @@ void BRepOffset_BuildOffsetFaces::FindFacesToRebuild()
}
}
namespace
{
//=======================================================================
//function : mapShapes
//purpose : Collect theVecShapes into theMap with setted theType
//=======================================================================
template<class Container>
static void mapShapes (const Container& theVecShapes,
const TopAbs_ShapeEnum theType,
TopTools_MapOfShape& theMap)
{
for (const auto& aShape : theVecShapes)
{
for (TopExp_Explorer anExp(aShape, theType); anExp.More(); anExp.Next())
{
theMap.Add(anExp.Current());
}
}
}
}
//=======================================================================
//function : IntersectFaces
//purpose : Intersection of the faces that should be rebuild to resolve all invalidities
@@ -5737,10 +5715,7 @@ void BRepOffset_BuildOffsetFaces::IntersectFaces (TopTools_MapOfShape& theVertsT
TopoDS_Compound aCBE;
aBB.MakeCompound (aCBE);
//
// remember inside edges and vertices to further check
TopTools_MapOfShape anInsideEdges;
TopTools_MapOfShape anInsideVertices;
TopExp_Explorer aExp(aCBInv, TopAbs_EDGE);
TopExp_Explorer aExp (aCBInv, TopAbs_EDGE);
for (; aExp.More(); aExp.Next())
{
const TopoDS_Shape& aE = aExp.Current();
@@ -5749,15 +5724,6 @@ 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());
}
}
}
}
}
@@ -5783,6 +5749,10 @@ 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;
@@ -5831,14 +5801,6 @@ 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));
@@ -5858,28 +5820,6 @@ 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,11 +281,9 @@ 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]);
Handle(Poly_Polygon3D) P3d = DrawTrSurf::GetPolygon3D(a[2]);
if (C.IsNull() && C2d.IsNull() && P3d.IsNull()) {
if (C.IsNull() && C2d.IsNull()) {
//std::cout << a[2] << " is not a curve" << std::endl;
di << a[2] << " is not a curve or polygon 3d\n";
di << a[2] << " is not a curve\n";
return 1;
}
@@ -293,12 +291,7 @@ static Standard_Integer mkedge(Draw_Interpretor& di, Standard_Integer n, const c
if (n == 3) {
if (!C.IsNull()) edge = BRepBuilderAPI_MakeEdge(C);
else if (!C2d.IsNull()) edge = BRepBuilderAPI_MakeEdge2d(C2d);
else
{
BRep_Builder aBB;
aBB.MakeEdge(edge, P3d);
}
else edge = BRepBuilderAPI_MakeEdge2d(C2d);
}
else {
Handle(Geom_Surface) S;

View File

@@ -415,11 +415,6 @@ 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.";
@@ -979,10 +974,7 @@ Standard_Integer thickshell(Draw_Interpretor& theCommands,
const BRepOffset_Error aRetCode = B.Error();
reportOffsetState(theCommands, aRetCode);
if (!B.Shape().IsNull())
{
DBRep::Set(a[1], B.Shape());
}
DBRep::Set(a[1], B.Shape());
return 0;
}
@@ -1117,10 +1109,7 @@ Standard_Integer offsetshape(Draw_Interpretor& theCommands,
const BRepOffset_Error aRetCode = B.Error();
reportOffsetState(theCommands, aRetCode);
if (!B.Shape().IsNull())
{
DBRep::Set(a[1], B.Shape());
}
DBRep::Set(a[1], B.Shape());
return 0;
}

View File

@@ -692,6 +692,7 @@ 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.
@@ -702,7 +703,6 @@ 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,10 +720,7 @@ void ChFi3d_Builder::PerformExtremity (const Handle(ChFiDS_Spine)& Spine)
if (!F2.IsNull() && ChFi3d::IsTangentFaces(anEdge, F1, F2, GeomAbs_G2)) //smooth edge
{
if (!F1.IsSame(F2))
{
NbG1Connections++;
aLocNbG1Connections++;
}
continue;
}
@@ -762,7 +759,7 @@ void ChFi3d_Builder::PerformExtremity (const Handle(ChFiDS_Spine)& Spine)
if (EdgesOfV.Extent() != 3)
sommetpourri = Standard_True;
if(!sommetpourri && aLocNbG1Connections < 4){
if(!sommetpourri){
sst = ChFi3d_EdgeState(E,myEFMap);
}
if(ii==1)Spine->SetFirstStatus(sst);

View File

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

View File

@@ -429,8 +429,6 @@ 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);
@@ -441,16 +439,12 @@ 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

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

View File

@@ -106,11 +106,6 @@ void RWStepShape_RWEdgeLoop::Check
Standard_Boolean headToTail = Standard_True;
//Standard_Boolean 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();

File diff suppressed because it is too large Load Diff

View File

@@ -31,7 +31,6 @@
#include <StepVisual_DraughtingModel.hxx>
#include <StepVisual_HArray1OfPresentationStyleAssignment.hxx>
#include <TDF_LabelSequence.hxx>
#include <TDF_LabelMap.hxx>
#include <XCAFDimTolObjects_GeomToleranceObject.hxx>
class XSControl_WorkSession;
@@ -45,234 +44,219 @@ 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)& theWS,
const Standard_Boolean theScratch = Standard_True);
Standard_EXPORT STEPCAFControl_Writer(const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = 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)& theWS,
const Standard_Boolean theScratch = Standard_True);
Standard_EXPORT void Init (const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = 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)& theDoc,
const STEPControl_StepModelType theMode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0,
const Message_ProgressRange& theProgress = Message_ProgressRange());
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());
//! Method to transfer part of the document specified by label
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());
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());
//! Mehod to writing sequence of root assemblies or part of the file specified by use by one label
Standard_EXPORT Standard_Boolean Transfer(const TDF_LabelSequence& theLabelSeq,
const STEPControl_StepModelType theMode = STEPControl_AsIs,
const Standard_CString theIsMulti = 0,
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,
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)& theDoc,
const Standard_CString theFileName,
const Message_ProgressRange& theProgress = Message_ProgressRange());
Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc,
const Standard_CString filename,
const Message_ProgressRange& theProgress = Message_ProgressRange());
//! Returns data on external files
//! Returns Null handle if no external files are read
const NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>& ExternFiles() const { return myFiles; };
Standard_EXPORT const NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>& ExternFiles() const;
//! Returns data on external file by its original label
//! Returns False if no external file with given name is read
Standard_EXPORT Standard_Boolean ExternFile(const TDF_Label& theLabel,
Handle(STEPCAFControl_ExternFile)& theExtFile) const;
Standard_EXPORT Standard_Boolean ExternFile (const TDF_Label& L, Handle(STEPCAFControl_ExternFile)& ef) 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 theName,
Handle(STEPCAFControl_ExternFile)& theExtFile) const;
Standard_EXPORT Standard_Boolean ExternFile (const Standard_CString name, Handle(STEPCAFControl_ExternFile)& ef) const;
//! Returns basic reader for root file
STEPControl_Writer& ChangeWriter() { return myWriter; }
Standard_EXPORT STEPControl_Writer& ChangeWriter();
//! Returns basic reader as const
const STEPControl_Writer& Writer() const { return myWriter; }
Standard_EXPORT const STEPControl_Writer& Writer() const;
//! Set ColorMode for indicate write Colors or not.
void SetColorMode(const Standard_Boolean theColorMode) { myColorMode = theColorMode; }
Standard_Boolean GetColorMode() const { return myColorMode; }
Standard_EXPORT void SetColorMode (const Standard_Boolean colormode);
Standard_EXPORT Standard_Boolean GetColorMode() const;
//! Set NameMode for indicate write Name or not.
void SetNameMode(const Standard_Boolean theNameMode) { myNameMode = theNameMode; }
Standard_Boolean GetNameMode() const { return myNameMode; }
Standard_EXPORT void SetNameMode (const Standard_Boolean namemode);
Standard_EXPORT Standard_Boolean GetNameMode() const;
//! Set LayerMode for indicate write Layers or not.
void SetLayerMode(const Standard_Boolean theLayerMode) { myLayerMode = theLayerMode; }
Standard_Boolean GetLayerMode() const { return myLayerMode; }
Standard_EXPORT void SetLayerMode (const Standard_Boolean layermode);
Standard_EXPORT Standard_Boolean GetLayerMode() const;
//! PropsMode for indicate write Validation properties or not.
void SetPropsMode(const Standard_Boolean thePropsMode) { myPropsMode = thePropsMode; }
Standard_Boolean GetPropsMode() const { return myPropsMode; }
Standard_EXPORT void SetPropsMode (const Standard_Boolean propsmode);
Standard_EXPORT Standard_Boolean GetPropsMode() const;
//! Set SHUO mode for indicate write SHUO or not.
void SetSHUOMode(const Standard_Boolean theSHUOMode) { mySHUOMode = theSHUOMode; }
Standard_Boolean GetSHUOMode() const { return mySHUOMode; }
Standard_EXPORT void SetSHUOMode (const Standard_Boolean shuomode);
Standard_EXPORT Standard_Boolean GetSHUOMode() const;
//! Set dimtolmode for indicate write D&GTs or not.
void SetDimTolMode(const Standard_Boolean theDimTolMode) { myGDTMode = theDimTolMode; };
Standard_Boolean GetDimTolMode() const { return myGDTMode; }
Standard_EXPORT void SetDimTolMode (const Standard_Boolean dimtolmode);
Standard_EXPORT Standard_Boolean GetDimTolMode() const;
//! Set dimtolmode for indicate write D&GTs or not.
void SetMaterialMode(const Standard_Boolean theMaterialMode) { myMatMode = theMaterialMode; }
Standard_Boolean GetMaterialMode() const { return myMatMode; }
Standard_EXPORT void SetMaterialMode (const Standard_Boolean matmode);
Standard_EXPORT Standard_Boolean GetMaterialMode() const;
protected:
//! Transfers labels to a STEP model
//! Returns True if translation is OK
//! 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());
//! 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()) ;
//! 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)
TopoDS_Shape transferExternFiles(const TDF_Label& theLabel,
const STEPControl_StepModelType theMode,
TDF_LabelSequence& theLabelSeq,
const Standard_CString thePrefix = "",
const Message_ProgressRange& theProgress = Message_ProgressRange());
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());
//! Write external references to STEP
Standard_Boolean writeExternRefs(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels) const;
Standard_EXPORT Standard_Boolean WriteExternRefs (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
//! Write colors assigned to specified labels, to STEP model
Standard_Boolean writeColors(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels);
Standard_EXPORT Standard_Boolean WriteColors (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels);
//! Write names assigned to specified labels, to STEP model
Standard_Boolean writeNames(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels) const;
Standard_EXPORT Standard_Boolean WriteNames (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
//! Write D&GTs assigned to specified labels, to STEP model
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);
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);
//! Write materials assigned to specified labels, to STEP model
Standard_Boolean writeMaterials(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels) const;
Standard_EXPORT Standard_Boolean WriteMaterials (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
//! Write validation properties assigned to specified labels,
//! to STEP model
Standard_Boolean writeValProps(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels,
const Standard_CString theIsMulti) const;
Standard_EXPORT Standard_Boolean WriteValProps (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels, const Standard_CString multi) const;
//! Write layers assigned to specified labels, to STEP model
Standard_Boolean writeLayers(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels) const;
Standard_EXPORT Standard_Boolean WriteLayers (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const;
//! Write SHUO assigned to specified component, to STEP model
Standard_Boolean writeSHUOs(const Handle(XSControl_WorkSession)& theWS,
const TDF_LabelSequence& theLabels);
Standard_EXPORT Standard_Boolean WriteSHUOs (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels);
//! Finds length units located in root of label
//! If it exists, initializes local length unit from it
//! Else initializes according to Cascade length unit
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);
Standard_EXPORT void prepareUnit(const TDF_Label& theLabel,
const Handle(StepData_StepModel)& theModel);
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;
@@ -288,4 +272,7 @@ private:
};
#endif // _STEPCAFControl_Writer_HeaderFile

View File

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

View File

@@ -58,33 +58,12 @@ public:
return ZLayerPosition > theOther.ZLayerPosition;
}
// closest object is selected if their depths are not equal within tolerance
if (Abs (Depth - theOther.Depth) > Tolerance + theOther.Tolerance)
// closest object is selected unless difference is 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,7 +20,6 @@
#include <ViewerTest.hxx>
#include <AIS_AnimationAxisRotation.hxx>
#include <AIS_AnimationCamera.hxx>
#include <AIS_AnimationObject.hxx>
#include <AIS_Axis.hxx>
@@ -7597,11 +7596,6 @@ static Standard_Integer VAnimation (Draw_Interpretor& theDI,
gp_XYZ aLocPnts [2] = { aTrsfs[0].TranslationPart(), aTrsfs[1].TranslationPart() };
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)
{
@@ -7649,45 +7643,13 @@ 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 && !isAxisRotationSet)
if (!isTrsfSet)
{
Message::SendFail() << "Syntax error at " << anArg;
return 1;
@@ -7696,23 +7658,15 @@ 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]);
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));
}
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]);
replaceAnimation (aParentAnimation, anAnimation, anObjAnimation);
}
else if (anArg == "-viewtrsf"
@@ -14440,11 +14394,6 @@ 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,63 +194,29 @@ 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())
{
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;
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;
}
}
if (anInd == 0) // no possible to rolling back
{
return VrmlData_UnrecoverableError;
}
theBuffer.Input.seekg(-(aNbChars - anInd - 1), std::ios::cur);
theBuffer.LinePtr = &theBuffer.Line[0];
theBuffer.IsProcessed = Standard_False;
}
// 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)
Quantity_Color& col) const
{
Quantity_ColorRGBA aCol;
Standard_Boolean isDone = GetColor(lab, aCol);
@@ -104,8 +104,10 @@ Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& lab,
//=======================================================================
Standard_Boolean XCAFDoc_ColorTool::GetColor(const TDF_Label& lab,
Quantity_ColorRGBA& col)
Quantity_ColorRGBA& col) const
{
if (lab.Father() != Label()) return Standard_False;
Handle(XCAFDoc_Color) ColorAttribute;
if (!lab.FindAttribute(XCAFDoc_Color::GetID(), ColorAttribute))
return Standard_False;
@@ -512,7 +514,7 @@ XCAFDoc_ColorTool::XCAFDoc_ColorTool()
//purpose :
//=======================================================================
Standard_Boolean XCAFDoc_ColorTool::IsVisible (const TDF_Label& L)
Standard_Boolean XCAFDoc_ColorTool::IsVisible (const TDF_Label& L) const
{
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 static Standard_Boolean GetColor (const TDF_Label& lab, Quantity_Color& col);
Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& lab, Quantity_Color& col) const;
//! Returns color defined by label lab
//! Returns False if the label is not in colortable
//! or does not define a color
Standard_EXPORT static Standard_Boolean GetColor(const TDF_Label& lab, Quantity_ColorRGBA& col);
Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& lab, Quantity_ColorRGBA& col) const;
//! Finds a color definition in a colortable and returns
//! 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 static Standard_Boolean GetColor (const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_Color& color);
Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_Color& color);
//! Returns color assigned to <L> as <type>
//! Returns False if no such color is assigned
Standard_EXPORT static Standard_Boolean GetColor(const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color);
Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color);
//! Sets a link with GUID defined by <type> (see
//! 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 static Standard_Boolean IsVisible (const TDF_Label& L);
Standard_EXPORT Standard_Boolean IsVisible (const TDF_Label& L) const;
//! Set the visibility of object on label. Do nothing if there no any object.
//! Set 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)
TDF_LabelSequence& theShapeLSecond) const
{
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)
TDF_LabelSequence& theDatums) const
{
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)
TDF_LabelSequence& theDatums) const
{
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 static Standard_Boolean GetRefShapeLabel (const TDF_Label& theL,
TDF_LabelSequence& theShapeLFirst,
TDF_LabelSequence& theShapeLSecond);
Standard_EXPORT Standard_Boolean GetRefShapeLabel (const TDF_Label& theL,
TDF_LabelSequence& theShapeLFirst,
TDF_LabelSequence& theShapeLSecond) const;
//! 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 static Standard_Boolean GetDatumOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums);
Standard_EXPORT Standard_Boolean GetDatumOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums) const;
//! Returns all Datum labels with XCAFDimTolObjects_DatumObject defined for label theDimTolL.
Standard_EXPORT static Standard_Boolean GetDatumWithObjectOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums);
Standard_EXPORT Standard_Boolean GetDatumWithObjectOfTolerLabels (const TDF_Label& theDimTolL,
TDF_LabelSequence& theDatums) const;
//! 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& theLayerL,
TDF_LabelSequence& theShLabels)
void XCAFDoc_LayerTool::GetShapesOfLayer(const TDF_Label& layerL,
TDF_LabelSequence& ShLabels) const
{
theShLabels.Clear();
ShLabels.Clear();
Handle(XCAFDoc_GraphNode) aGNode;
if (theLayerL.FindAttribute(XCAFDoc::LayerRefGUID(), aGNode))
{
for (Standard_Integer aChildInd = 1; aChildInd <= aGNode->NbChildren(); aChildInd++)
{
theShLabels.Append(aGNode->GetChild(aChildInd)->Label());
if ( layerL.FindAttribute( XCAFDoc::LayerRefGUID(), aGNode) ) {
for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++) {
ShLabels.Append( aGNode->GetChild(i)->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 static void GetShapesOfLayer (const TDF_Label& theLayerL, TDF_LabelSequence& theShLabels);
Standard_EXPORT void GetShapesOfLayer (const TDF_Label& layerL, TDF_LabelSequence& ShLabels) const;
//! Return TRUE if layer is visible, FALSE if invisible.
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)
Handle(TCollection_HAsciiString)& aDensValType) const
{
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 static Standard_Boolean GetMaterial (const TDF_Label& MatL, Handle(TCollection_HAsciiString)& aName, Handle(TCollection_HAsciiString)& aDescription, Standard_Real& aDensity, Handle(TCollection_HAsciiString)& aDensName, Handle(TCollection_HAsciiString)& aDensValType);
Standard_EXPORT Standard_Boolean GetMaterial (const TDF_Label& MatL, Handle(TCollection_HAsciiString)& aName, Handle(TCollection_HAsciiString)& aDescription, Standard_Real& aDensity, Handle(TCollection_HAsciiString)& aDensName, Handle(TCollection_HAsciiString)& aDensValType) const;
//! Find referred material and return density from it
//! if no material --> return 0

View File

@@ -353,47 +353,6 @@ 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,15 +196,6 @@ 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,10 +79,13 @@ const Handle(XCAFDoc_ShapeTool)& XCAFDoc_VisMaterialTool::ShapeTool()
//function : GetMaterial
//purpose :
//=======================================================================
Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetMaterial(const TDF_Label& theMatLabel)
Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetMaterial (const TDF_Label& theMatLabel) const
{
Handle(XCAFDoc_VisMaterial) aMatAttrib;
theMatLabel.FindAttribute(XCAFDoc_VisMaterial::GetID(), aMatAttrib);
if (theMatLabel.Father() == Label())
{
theMatLabel.FindAttribute (XCAFDoc_VisMaterial::GetID(), aMatAttrib);
}
return aMatAttrib;
}
@@ -211,7 +214,8 @@ Standard_Boolean XCAFDoc_VisMaterialTool::GetShapeMaterial (const TDF_Label& the
Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetShapeMaterial (const TDF_Label& theShapeLabel)
{
TDF_Label aMatLabel;
return GetShapeMaterial (theShapeLabel, aMatLabel)
return Label().HasChild() // do not waste time on shape attributes if materials map is empty
&& GetShapeMaterial (theShapeLabel, aMatLabel)
? GetMaterial (aMatLabel)
: 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 static Handle(XCAFDoc_VisMaterial) GetMaterial (const TDF_Label& theMatLabel);
Standard_EXPORT Handle(XCAFDoc_VisMaterial) GetMaterial (const TDF_Label& theMatLabel) const;
//! Adds Material definition to a Material Table and returns its Label.
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 static Handle(XCAFDoc_VisMaterial) GetShapeMaterial (const TDF_Label& theShapeLabel);
Standard_EXPORT Handle(XCAFDoc_VisMaterial) GetShapeMaterial (const TDF_Label& theShapeLabel);
//! Sets a link with GUID XCAFDoc::VisMaterialRefGUID() from shape label to material label.
//! @param theShape [in] shape

View File

@@ -509,37 +509,40 @@ static Standard_Integer getFreeShapes (Draw_Interpretor& di, Standard_Integer ar
return 0;
}
//=======================================================================
//function : getOneShape
//purpose :
//=======================================================================
static Standard_Integer getOneShape (Draw_Interpretor& theDI,
Standard_Integer theNbArgs,
const char** theArgVec)
static Standard_Integer getOneShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if ( theNbArgs !=3 )
{
theDI <<"Use: "<< theArgVec[0]<<" shape DocName \n";
if (argc!=3) {
di<<"Use: "<<argv[0]<<" shape DocName \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;
}
Handle(TDocStd_Document) Doc;
DDocStd::GetDocument(argv[2], Doc);
if ( Doc.IsNull() ) { di << argv[2] << " is not a document\n"; return 1; }
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;
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;
}
DBRep::Set (theArgVec[1], aShape);
theDI << theArgVec[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];
return 0;
}

View File

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

View File

@@ -1,4 +1,4 @@
puts "TODO OCC26556 ALL: ERROR. Mixed connectivity of faces."
puts "TODO OCC26556 ALL: ERROR. offsetperform operation not done."
puts "============"
puts "OCC5805"
@@ -20,7 +20,6 @@ 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
@@ -28,4 +27,3 @@ checkshape result
checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41
checkview -display result -2d -path ${imagedir}/${test_image}.png
}

View File

@@ -1,4 +1,6 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "TODO OCC25925 ALL: ERROR. offsetperform operation not done."
puts "TODO OCC25925 ALL: Tcl Exception:"
puts "TODO OCC25925 ALL: TEST INCOMPLETE"
puts "============"
puts "OCC5805"
@@ -23,7 +25,6 @@ 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
@@ -31,4 +32,3 @@ checkshape result
checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41
checkview -display result -2d -path ${imagedir}/${test_image}.png
}

View File

@@ -1,5 +1,3 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "============"
puts "OCC5805"
puts "============"
@@ -23,7 +21,6 @@ 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
@@ -31,5 +28,3 @@ checkshape result
checknbshapes result -vertex 10 -edge 15 -wire 7 -face 7 -shell 1 -solid 1 -compsolid 0 -compound 0 -shape 41
checkview -display result -2d -path ${imagedir}/${test_image}.png
}

View File

@@ -1,5 +1,3 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "============"
puts "OCC5805"
puts "============"
@@ -18,12 +16,9 @@ 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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,6 @@
puts "TODO OCC26577 All: ERROR. Mixed connectivity of faces."
puts "TODO OCC26577 All: Error : The offset cannot be built."
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 "=============================================================="
puts "0027913: Sharing between edges was lost after offset operation"
@@ -11,11 +12,9 @@ offsetparameter 1e-7 p i
offsetload s 10
offsetperform result
if { [isdraw result] } {
unifysamedom result_unif 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

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

View File

@@ -1,6 +1,4 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "TODO OCC25925 ALL: Error : The offset cannot be built."
puts "TODO OCC25925 ALL: ERROR. offsetperform operation not done."
puts "============"
puts "OCC5806"
puts "============"
@@ -30,12 +28,11 @@ 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.
checkprops result -s 1116.06
checkshape result
checkmaxtol result -min_tol 1.
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
}
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

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 OCC23068 ALL: Error : The offset cannot be built."
puts "TODO OCC23190 ALL: result is not a topological shape!!!"
puts "TODO OCC23068 ALL: TEST INCOMPLETE"
# Original bug : hkg60144/pro15325
# 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 OCC23068 ALL: Error : The offset cannot be built."
puts "TODO OCC23190 ALL: result is not a topological shape!!!"
puts "TODO OCC23068 ALL: TEST INCOMPLETE"
# Original bug : cts21271
# Date : 11Sept98

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,3 @@
puts "TODO OCC25925 ALL: ERROR. Mixed connectivity of faces."
puts "========"
puts "OCC26443"
puts "========"
@@ -17,8 +15,6 @@ 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
}

View File

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

View File

@@ -176,7 +176,7 @@ check_picking $pick_coord $check_coord "diameter dimension (diam1)"
check_cross_picking $pick_coord diam1 "diameter dimension (diam1)"
# check sensitives "diam2"
set pick_coord { { 222 99 } { 285 99 } }
set pick_coord { { 221 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 {231 207}
set mouse_drag {311 258}
set mouse_pick {226 214}
set mouse_drag {306 265}
# 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 {281 286}
set mouse_drag {279 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 {199 092}
set mouse_pick {200 092}
set mouse_drag {176 142}
vmoveto {*}$mouse_pick
@@ -65,8 +65,8 @@ vdump $anImage1
vmanipulator m -followRotation 1
set mouse_pick {175 135}
set mouse_drag {232 144}
set mouse_pick {173 137}
set mouse_drag {233 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 088}
set mouse_pick {205 087}
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 142}
set mouse_pick {228 141}
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 176}
set mouse_drag {246 177}
vmoveto {*}$mouse_pick
vselect {*}$mouse_pick

View File

@@ -11,7 +11,7 @@ set x1 210
set y1 184
set x2 207
set y2 182
set y2 180
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 121 -xor
vselect 350 120 -xor
set NbSelected1 [vnbselected]
if { ${NbSelected1} != 12 } { puts "Error : (case 2)" }

View File

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

View File

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