1. 29 Dec, 2016 1 commit
    • msv's avatar
      0028283: The command bopcheck crashes on the given shape · 0c5a6d47
      msv authored
      BOPAlgo_CheckerSI crashed due to building of pcurve for an edge not lying on surface. The fix avoids building of pcurves in this algorithm.
      The new flag has been added in BOPAlgo_PaveFiller class (method SetAvoidBuildPCurve). It tells whether to avoid building pcurves. It is worth to set if the result is not used to create splits of faces, as in example with BOPAlgo_CheckerSI.
      0c5a6d47
  2. 16 Dec, 2016 1 commit
    • msv's avatar
      0028017: Unexpected result of General Fuse operation · 24542bc0
      msv authored
      Several improvements have been made in BO code to fix the bug:
      
      - Create empty edge-edge interference if intersection is close to an end vertex. This will help to avoid creation of unnecessary edge-face intersections.
      - Improve PutPaveOnCurve() method to join nearly located vertices when they are put on the same section curve.
      - Add processing of same-domain vertices for section edges in UpdatePaveBlocks() method.
      - Improve the method CorrectWires() in order to not increase vertex tolerance if it will cover the major part of an edge.
      - Replace vertices of section edges by same-domain equivalents.
      - In the algorithm BOPAlgo_WireSplitter, correct angles computation and evaluation, taking into account periodicity.
      - Modify PostTreatFF to properly take into account the orientations of coinciding section edges.
      - In IntTools_Context::ComputePE, check distance from the point to vertices of the edge if the projection to the curve is failure.
      
      Tests update:
      - test offset\faces_type_i\C9 has been updated; now instead of returning bad shape it returns null result.
      
      Notes for porting:
      - Modify BopAlgo_PaveFiller so that on output each interference refers to the new vertex that will hit in the result (same-domain of the initial new vertex).
      - Make the method BOPDS_DS::Index() returning valid index for new shapes.
      
      // eliminate compile warning on VC14
      24542bc0
  3. 08 Dec, 2016 2 commits
    • emv's avatar
      0028165: Improve performance of Boolean Operations · 51db0179
      emv authored
      1. Unification of the usage of the BRepAdaptor_Surface in Boolean Operations algorithm.
      For each face when it is necessary the Adaptor is initialized only once and stored in Context.
      
      For that purpose the new IntTools_Context::SurfaceAdaptor(const TopoDS_Face&) method has been implemented.
      
      To provide possibility to take the Adaptor from the context, the context has been added as
      a parameter in following methods:
      BOPTools_AlgoTools::MakePCurve()
      BOPTools_AlgoTools::Sence()
      BOPTools_AlgoTools2D::BuildPCurveForEdgeOnFace()
      BOPTools_AlgoTools2D::PointOnSurface
      BOPTools_AlgoTools2D::CurveOnSurface
      BOPTools_AlgoTools2D::AdjustPCurveOnFace
      BOPTools_AlgoTools2D::Make2D
      BOPTools_AlgoTools2D::MakePCurveOnFace
      BOPTools_AlgoTools3D::GetNormalToFaceOnEdge
      
      It is also possible now to pass the context into BOPAlgo_WireSplitter algorithm.
      
      Also, the new IntTools_Context::UVBounds(const TopoDS_Face&) method
      has been implemented to get the UV bounds of a face.
      
      2. Additional improvement is a calculation of reduced intersection range only for the intersection
      type VERTEX during computation of Edge/Face interference.
      
      3. The methods IntTools_EdgeFace::Prepare() and IntTools_EdgeFace::FindProjectableRoot()
      and the fields IntTools_EdgeFace::myProjectableRanges and IntTools_EdgeFace::myFClass2d
      have been removed as obsolete.
      
      4. Test cases for the issue.
      51db0179
    • emv's avatar
      0027878: Development of the Gluing operations based on the new Boolean component · 483ce1bd
      emv authored
      The Gluing operation is an additional option for the algorithms in the Boolean Component
      such as General Fuse, Boolean operations, Section operation, Maker Volume and Cells Builder algorithms.
      
      The Gluing options have been designed to speed up the computation of the interference among arguments of the operations on special cases,
      in which the arguments may be overlapping but do not have real intersections between their sub-shapes.
      
      This option cannot be used on the shapes having real intersections, like intersection vertex between edges,
      or intersection vertex between edge and a face or intersection line between faces.
      
      The Gluing option is an enumeration implemented in BOPAlgo_GlueEnum.hxx. There are following items in the enum:
      * BOPAlgo_GlueOff - default value for the algorithms, Gluing is switched off;
      * BOPAlgo_GlueShift - Glue option for shapes with partial coincidence;
      * BOPAlgo_GlueFull - Glue option for shapes with full coincidence.
      
      For setting the Gluing options for the algorithm it is just necessary to call the SetGlue(BOPAlgo_GlueEnum) method with appropriate Glue value.
      
      For using this option in DRAW the command bglue has been implemented:
      * 0 - default value, Gluing is off;
      * 1 - for partial coincidence;
      * 2 - for full coincidence
      
      Elimination of the warnings.
      483ce1bd
  4. 08 Nov, 2016 1 commit
    • msv's avatar
      0026738: Make Boolean operations safely treating arguments when running with fuzzy option · 0d0481c7
      msv authored
      When fuzzy option is in force prevent increasing tolerance of input shapes. Instead pass increased by fuzzy value the tolerances of sub-shapes everywhere where it is needed by intersection algorithms.
      
      The following changes in API have been made:
      
      - The methods SetFuzzyValue and FuzzyValue have been moved from the classes BOPAlgo_ArgumentAnalyzer, BOPAlgo_Builder, and BOPAlgo_PaveFiller to the base class BOPAlgo_Algo.
      - The public method BOPDS_DS::VerticesOnIn has been renamed to SubShapesOnIn, and the new output parameter theCommonPB has been added.
      - In BOPTools_AlgoTools, a new argument "theFuzzyValue" has been added in the methods ComputeVV and AreFacesSameDomain.
      - In IntTools_Context, a new argument "theFuzzyValue" has been added in the methods ComputeVE and ComputeVF.
      - The methods SetFuzzyValue and FuzzyValue have been added in the classes IntTools_EdgeEdge, IntTools_FaceFace.
      - In the class IntTools_EdgeFace, the methods SetTolE, SetTolF, TolE, TolF have been removed, and the methods SetFuzzyValue, FuzzyValue have been added.
      - The new argument "theTol" has been added in the method IntTools_WLineTool::DecompositionOfWLine.
      
      Some improvements in algorithms have been made during fighting with regressions:
      
      - Correct initialization of pave blocks for degenerated edges.
      - In BOPAlgo_PaveFiller::MakeBlocks(), filter out paves on intersection curve that were put on the curve accidentally due to wide range of E-F intersection vertex.
      - In the method IntTools_Tools::ComputeTolerance the margin added to the computed tolerance has been increased up to 0.001%.
      - The method BOPAlgo_PaveFiller::PutPaveOnCurve has been corrected in order to use the original vertex tolerance instead of the value increased during putting it on other curves.
      - The new method BOPDS_PaveBlock::RemoveExtPave has been added.
      - The vertex tolerance computation in BOPTools_AlgoTools::CorrectCurveOnSurface has been improved, taking into account intersection segments between p-curves (to avoid regression on "bugs modalg_6 bug22794").
      - Improve IsExistingPaveBlock to make more stable catching of coincidence of common block with section curve (against regression "bugs modalg_4 bug697_2" on Linux).
      
      Test case for the bug has been added.
      
      The following test cases have been updated as improvements:
      boolean gdml_private ZH2 ZI7 ZJ7
      boolean volumemaker C4
      
      The test case bugs/modalg_4/pro19653 has been corrected to make it stable. See comment inside the script for details.
      
      The test case bugs/modalg_6/bug25880 has been corrected to suppress wrong bfuse commands.
      
      The test bugs/modalg_6/bug26954_3 has been corrected to compare the result with more precise reference value.
      
      The "faulty" TODO in boolean/volumemaker/A8 has been made actual for Linux as well.
      
      //Eliminate compilation error on Linux.
      0d0481c7
  5. 28 Jul, 2016 1 commit
    • emv's avatar
      0027448: BOPTools_AlgoTools::IsMicroEdge does not correspond to shape validity criteria · 01b5b3df
      emv authored
      1. IntTools_ShrunkRange::Perform
      The algorithm of building shrunk range on the edge has been redesigned to make this range as big as possible.
      By new definition it has to have the length not less than Precision::Confusion().
      Although, the possibility of splitting of the edge has been taken into account. If it is impossible to put
      vertex on edge in such a way that the tolerance spheres of the edge's vertices do not intersect the tolerance
      sphere of the putting vertex the edge cannot be split. This possibility is saved in the new field
      IntTools_ShrunkRange::myIsSplittable. It can be checked by the corresponding method IntTools_ShrunkRange::IsSplittable().
      It returns TRUE if the shrunk range is computed successfully and it has the length more than the value of sum of two tolerance
      values of the edge (for putting vertex, as its tolerance should not be less than the tolerance value of edge) and
      two Precision::Confusion() values (to make two new edges valid by Shape validity criteria).
      
      IntTools_ShrunkRange::myErrorStatus and IntTools_ShrunkRange::ErrorStatus() have been replaced by
      the IntTools_ShrunkRange::myIsDone and IntTools_ShrunkRange::IsDone(). IntTools_ShrunkRange::IsDone() returns TRUE
      if the shrunk range has been computed and it has length more than Precision::Confusion().
      
      All computations of the parameters are performed using the GCPnts_AbscissaPoint, but if AbscissaPoint is unable to
      compute the parameters the Resolution of the curve is used.
      
      2. Boolean Operations algorithm now partially works with the edges that cannot be split or does not have the ShrunkData
      at all (previously such edges have been considered as micro and just ignored). If by the result of some intersection such
      edges should be split, i.e. the intersection vertex should be created, the algorithm just ignores them and no vertex is created.
      But if such edges coincide with other shapes (other edges or faces) the algorithm uses them for creation of common blocks.
      The information of the possibility for the edges to be split is saved in its PaveBlocks, in the new BOPDS_PaveBlock::myIsSplittable field.
      It can be retrieved by the BOPDS_PaveBlock::IsSplittable() or BOPDS_PaveBlock::ShrunkData(), but these methods
      make sense only after filling of the shrunk data for the pave block.
      
      BOPTools_AlgoTools::IsMicroEdge() has an additional parameter that defines whether it is necessary to take into account
      the possibility for the edge to be split or not. By default it is set to TRUE, i.e. by default the edge will be considered as micro
      even if the shrunk range is computed, but it is too short for the edge to be split.
      
      3. BOPAlgo_PaveFiller::PerformEF
      To avoid creation of too close intersection vertices the intersection ranges of the edges participating in Edge/Face
      intersections are reduced taking into account the common ranges computed during Edge/Edge intersections.
      Thus, the Edge/Face intersection vertex is not created if it gets into a common range of the Edge/Edge intersection
      between that edge and one of the face's edges. The tolerance value of Edge/Edge intersection vertex is increased
      to reach the Edge/Face intersection.
      
      4. Unification of the vertices of the section edges considered as micro edges.
      If by the result of some Face/Face intersection the section edge is considered as micro edge,
      the vertices of this edge will be united and the edge itself will be removed.
      
      5. Test cases for the issues.
      
      6. Adjusting test cases for issue CR27448.
      01b5b3df
  6. 29 Mar, 2016 1 commit
    • nbv's avatar
      0027179: The algorithm of sharing edges in Boolean operation should be improved · 93e38faa
      nbv authored
      1. New sharing algorithm has been implemented. If intermediate point of some edge is included in the tube with center taken in another edge and radius equaled to maximal vertex-tolerance of both edges then these two edges are considered to be shared. This know-how touches edges only, which have common blocks with interfered faces. If they do not have any common-blocks the algorithm will work as before.
      
      2. Interface of BOPAlgo_PaveFiller::IsExistingPaveBlock(...) method has been changed.
      
      Creation of test case for issues #27128 and #27179
      
      Adjusting some test cases according to their new behavior, because they are IMPROVEMENTS really (TODOs have been deleted).
      93e38faa
  7. 13 Jan, 2016 1 commit
    • msv's avatar
      0027032: [Regression to 6.9.1] Result of bcut has the same volume as the object · 05cf4d98
      msv authored
      - Avoid reducing tolerance of the original edges in BOPAlgo_PaveFiller::CorrectToleranceOfSE
      - If a boundary edge is considered coincident with a section curve then increase its tolerance more carefully, using real distance instead of extended reached tolerance.
      - New test case bugs/modalg_6/bug27032
      - Test cases boolean/gdml_private/E4-F3 have been amended to check area of the result.
      
      - Puts TODO in test cases boolean gdml_private ZI5,ZI7,ZJ7.
      05cf4d98
  8. 23 Dec, 2015 1 commit
    • msv's avatar
      0026619: Tolerances of operands are modified using bop · 3510db62
      msv authored
      0026796: The result of General Fuse operation is self-intersecting shape
      
      The fix forces creation of new sub-shapes (vertex, edge) when the tolerance of some sub-shape of an argument is to be increased.
      
      This new behavior is turned off by default. It can be turned on using two ways:
      1) Setting 'locking' flag of the arguments.
      2) Calling the method SetNonDestructive(Standard_True) of the API classes.
      
      Various bug fixes in the algorithm:
      - Compute correct tolerance values for intersections of type Line/Line, Line/Plane, Plane/Plane.
      - In case of Line/Plane intersection check if line's vertices lie on the plane.
      - Do not allow decreasing of the tolerance value of the Line/Line intersection vertex.
      - In IntTools_EdgeEdge, call the method FindParameters with proper 3D tolerance of the curve.
      - Force making copy of a degenerated edge if its vertex is touched but no 2D intersection with other curves is found.
      - Remove pave blocks both ends of which became referring to the same vertex after vertices substitution.
      - Avoid exception in IntTools_Context::IsVertexOnLine if Extrema is not done.
      - Reduce tolerance of vertex/edge using actual distances to interfered shapes if it was increased due to line/line, line/plane, or plane/plane small intersection angle.
      - Update tolerance of edges to reach all representations in a common block.
      - In V-E intersections, check if a vertex hits beyond shrunk range, in such case create V-V interference.
      - Do not put a section edge to the result if it becomes to be a micro edge after updating its vertex.
      - Correctly make vertices same-domain during the work of MakeBlocks.
      - Decrease shrunk range at least on a Precision::Confusion() in addition to vertex tolerance.
      - Add Confusion to bounding boxes of new shapes in DS
      - Add tolerance Precision::Confusion() to compare distances of touching cases to fix regressions.
      
      TODO marks have been removed from (or modified in) the following test cases (Improvements):
      boolean bsection M3 N2 R2
      boolean gdml_private B6 C2 C6 G7 I6 F6 J1 J4 M7 N1 N8 N9 O3 O4 O6 O8 O9 P1 P2 P5 Q1 Q3 Q5 S9 T2 U4 U5 U9 ZB5 ZB6 ZC1 ZC5 ZD3 ZD6 ZD7 ZH2 ZH5 ZI2 ZI5 ZI7 ZI9 ZJ3 ZJ4 ZJ7 F8 I6 G1
      boolean volumemaker A5 A6 B3 B4 B7 B9 D3 D4 D7 F1
      boolean bopcut_2d D5
      bugs modalg_5 bug25043
      bugs modalg_2 bug472_1 bug472_2 bug472_3
      
      Test cases updated because they are still bad but can be accepted as non-regression:
      boolean volumemaker C4 A3 A7 E6
      bugs modalg_1 bug10232
      boolean bsection N2
      
      Put new TODO in the scripts:
      bugs modalg_5 bug25232_9
      bugs modalg_6 bug26619
      bugs modalg_1 buc60462_2
      bugs modalg_4 bug772
      
      For the following tests the result in fix became better, so take fix result as the reference:
      bugs modalg_5 bug24628
      bugs modalg_6 bug26954_3
      boolean volumemaker A4 B5 B6 C3 C8 D2 D5 F2
      bugs modalg_2 bug472_2
      bugs modalg_1 buc60776_1
      
      - Add the method SetNonDestructive to API classes of user level
      3510db62
  9. 17 Sep, 2015 1 commit
    • isn's avatar
      0026515: Exponential memory usage problems with BOPDS_IndexedMapOfPaveBlock... · 488e5b9d
      isn authored
      0026515: Exponential memory usage problems with BOPDS_IndexedMapOfPaveBlock and NCollection_IncAllocator
      
      Correcting the usage of NCollection_IncAllocator
      
      Conflicts:
      	src/BOPAlgo/BOPAlgo_BOP.cxx
      	src/BOPAlgo/BOPAlgo_Builder.cxx
      	src/BOPAlgo/BOPAlgo_BuilderSolid.cxx
      	src/BOPAlgo/BOPAlgo_Builder_2.cxx
      	src/BOPAlgo/BOPAlgo_MakerVolume.cxx
      	src/BOPAlgo/BOPAlgo_PaveFiller.cdl
      	src/BOPAlgo/BOPAlgo_PaveFiller_1.cxx
      	src/BOPAlgo/BOPAlgo_PaveFiller_10.cxx
      	src/BOPAlgo/BOPAlgo_PaveFiller_3.cxx
      	src/BOPAlgo/BOPAlgo_PaveFiller_4.cxx
      	src/BOPAlgo/BOPAlgo_PaveFiller_5.cxx
      	src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx
      	src/BOPAlgo/BOPAlgo_PaveFiller_7.cxx
      	src/BOPAlgo/BOPAlgo_PaveFiller_8.cxx
      	src/BOPAlgo/BOPAlgo_Section.cxx
      	src/BOPDS/BOPDS_DS.cxx
      	src/BOPDS/BOPDS_Iterator.cxx
      	src/BOPDS/BOPDS_IteratorSI.cxx
      	src/BOPDS/BOPDS_SubIterator.cxx
      	src/BOPTest/BOPTest_BOPCommands.cxx
      	src/BOPTest/BOPTest_PartitionCommands.cxx
      	src/IntTools/IntTools_Context.cxx
      
      additional corrections
      
      Adaptation of test case bugs fclasses bug7287_1 (limit for detection of memory leak reduced due to leak reduction)
      
      Adjusting test-case bugs fclasses bug7287_1
      488e5b9d
  10. 12 Jul, 2015 2 commits