• 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
BOPAlgo_PaveFiller.hxx 16.5 KB