Link Search Menu Expand Document

Document. Builders, Fillet/Chamfer & glTF

This page covers the v0.120–v0.126 additions to Document.swift: continuity/parameter extras on Curve3D, Curve2D, and Surface; gp_Vec static helpers on Shape; BSpline mutation completions on all three geometry types; the standalone FilletBuilder and ChamferBuilder classes (BRepFilletAPI_MakeFillet/MakeChamfer); the WireAnalyzer class (ShapeAnalysis_Wire); and glTF/GLB import and export on Shape, Exporter, and Document. See the main Document page for the XCAF core and assembly hierarchy.

Topics


Final cleanup. IsCN, ReversedParameter, ParametricTransformation

Extensions on Curve3D, Curve2D, and Surface exposing continuity checks, reversed-parameter mappings, parametric-transformation scale factors, and Bezier/BSpline static limits.

Curve3D.continuityOrder

Unavailable (#619), use continuityClass, or continuity for a raw ordinal. Any use is a compile error.

@available(*, unavailable, message: "...")
public var continuityOrder: Int { get }

The values this reported changed in #485, from a hand-invented C0=0, C1=1, C2=2, C3=3, CN=99, G1=-2, G2=-3, matching neither GeomAbs_Shape nor its own documentation, and disagreeing with continuity on the same curve for every class except C0, to the real ordinal 0=C0, 1=G1, 2=C1, 3=G2, 4=C2, 5=C3, 6=CN. The type and name were unchanged, so continuityOrder >= 2 kept compiling and went from meaning “at least C2” to meaning “at least C1”, and continuityOrder == 99 (the analytic fast path) became unreachable. #619 retires the spelling so both become errors.

// A continuity floor, takes the request vocabulary by type, so the wrong
// constant cannot be written at all.
if curve.continuityClass.satisfies(.c2) { useAsC2Spline() }

// The analytic fast path that `== 99` used to express.
if curve.continuityClass == .cN { useAnalyticFastPath() }

// A raw ordinal, if that is what you want, re-check the constant you compare against.
let ordinal = curve.continuity
  • OCCT: Geom_Curve::Continuity (via OCCTCurve3DGetContinuity).
  • No error sentinel. The retired encoding returned -1 for a null or unreadable handle and from its default: branch; continuity returns 0, which is an ordinary C0. A migrated < 0 error check can never fire (#619).

Curve3D.isCN(_:)

Check if this curve has at least Cn continuity.

public func isCN(_ n: Int) -> Bool
  • Parameters: n, minimum continuity order required, which must not be negative.
  • Returns: false for a negative n.

n < 0 is refused on the Swift side, because the answer does not depend on the class. Standard_RangeError_Raise_if(N < 0, ...) sits in a .cxx for all eight classes implementing IsCN here, so the pinned Release kernel compiles it out of every one of them (occt-validation-is-compiled-out), and isCN(-1) returned true: answered by Geom_BSplineCurve’s own N <= 0 test rather than by the class agreeing. Curve3D.bezierIsCN, Curve2D.bsplineIsCN, Surface.bezierIsCNu and Surface.bezierIsCNv carry the same refusal (#2862).

  • OCCT: Geom_Curve::IsCN (via OCCTCurve3DIsCN).
  • Example:
    let curve: Curve3D = ...
    if curve.isCN(2) { print("C2 continuous") }
    

Curve3D.reversedParameter(_:)

Get the parameter on the reversed curve corresponding to parameter u on this curve.

public func reversedParameter(_ u: Double) -> Double
  • Parameters: u, parameter on the original curve.
  • Returns: Corresponding parameter on the reversed curve.
  • OCCT: Geom_Curve::ReversedParameter (via OCCTCurve3DReversedParameter).

Curve3D.parametricTransformation(rotation:translation:)

Get the parametric transformation scale factor under a geometric transform.

public func parametricTransformation(rotation: [Double], translation: SIMD3<Double>) -> Double
  • Parameters:
    • rotation: 3×3 rotation matrix in row-major order (9 elements).
    • translation: translation vector.
  • Returns: Scale factor for parameter intervals under the transform; returns 1.0 if rotation.count != 9.
  • OCCT: Geom_Curve::ParametricTransformation (via OCCTCurve3DParametricTransformation).

Curve3D.bezierResolution(tolerance3d:)

Resolution for 3D Bezier curves: the parameter step corresponding to tolerance3d in 3D space.

public func bezierResolution(tolerance3d: Double) -> Double
  • Parameters: tolerance3d, desired 3D tolerance.
  • OCCT: Geom_BezierCurve::Resolution (via OCCTCurve3DBezierResolution).

Curve3D.bezierMaxDegree

Maximum degree for 3D Bezier curves (static).

public static var bezierMaxDegree: Int { get }
  • OCCT: Geom_BezierCurve::MaxDegree (via OCCTCurve3DBezierMaxDegree).

Curve2D.continuityOrder

Unavailable (#619), use continuityClass, or continuity for a raw ordinal. Any use is a compile error.

@available(*, unavailable, message: "...")
public var continuityOrder: Int { get }
if pcurve.continuityClass.satisfies(.c2) { treatAsC2() }
  • Warning: the raw values changed in #485 and the spelling was retired in #619, see the Curve3D.continuityOrder note above for the before/after encoding.
  • OCCT: Geom2d_Curve::Continuity (via OCCTCurve2DGetContinuity).

Curve2D.isCN(_:)

Check if this 2D curve has at least Cn continuity.

public func isCN(_ n: Int) -> Bool
  • Parameters: n, minimum continuity order required, which must not be negative.
  • Returns: false for a negative n; see Curve3D.isCN(_:) above for why (#2862).
  • OCCT: Geom2d_Curve::IsCN (via OCCTCurve2DIsCN).

Curve2D.reversedParameter(_:)

Get the parameter on the reversed 2D curve corresponding to parameter u on this curve.

public func reversedParameter(_ u: Double) -> Double
  • OCCT: Geom2d_Curve::ReversedParameter (via OCCTCurve2DReversedParameter).

Curve2D.bezierMaxDegree

Maximum degree for 2D Bezier curves (static).

public static var bezierMaxDegree: Int { get }
  • OCCT: Geom2d_BezierCurve::MaxDegree (via OCCTCurve2DBezierMaxDegree).

Curve2D.bsplineMaxDegree

Maximum degree for 2D BSpline curves (static).

public static var bsplineMaxDegree: Int { get }
  • OCCT: Geom2d_BSplineCurve::MaxDegree (via OCCTCurve2DBSplineMaxDegree).

Surface.isCNu(_:)

Check if this surface has at least Cn continuity in the U direction.

public func isCNu(_ n: Int) -> Bool
  • Parameters: n, minimum continuity order required, which must not be negative.
  • Returns: false for a negative n; see Curve3D.isCN(_:) above for why (#2862).
  • OCCT: Geom_Surface::IsCNu (via OCCTSurfaceIsCNu).

Surface.isCNv(_:)

Check if this surface has at least Cn continuity in the V direction.

public func isCNv(_ n: Int) -> Bool
  • Parameters: n, minimum continuity order required, which must not be negative.
  • Returns: false for a negative n; see Curve3D.isCN(_:) above for why (#2862).
  • OCCT: Geom_Surface::IsCNv (via OCCTSurfaceIsCNv).

Surface.uReversed()

Create a U-reversed copy of this surface.

public func uReversed() -> Surface?
  • Returns: A new Surface with reversed U parameterization, or nil on failure.
  • OCCT: Geom_Surface::UReversed (via OCCTSurfaceUReversed).

Surface.vReversed()

Create a V-reversed copy of this surface.

public func vReversed() -> Surface?
  • Returns: A new Surface with reversed V parameterization, or nil on failure.
  • OCCT: Geom_Surface::VReversed (via OCCTSurfaceVReversed).

Surface.uReversedParameter(_:)

Get the reversed U parameter value corresponding to u on the original surface.

public func uReversedParameter(_ u: Double) -> Double
  • OCCT: Geom_Surface::UReversedParameter (via OCCTSurfaceUReversedParameter).

Surface.vReversedParameter(_:)

Get the reversed V parameter value corresponding to v on the original surface.

public func vReversedParameter(_ v: Double) -> Double
  • OCCT: Geom_Surface::VReversedParameter (via OCCTSurfaceVReversedParameter).

Surface.bsplineRemoveVKnot(index:mult:tolerance:)

Remove a V knot from a BSpline surface, reducing its multiplicity to mult.

@discardableResult
public func bsplineRemoveVKnot(index: Int, mult: Int, tolerance: Double) -> Bool
  • Parameters: index, 1-based V knot index; mult, target multiplicity; tolerance, geometric tolerance.
  • Returns: true if the knot was successfully removed.
  • OCCT: Geom_BSplineSurface::RemoveVKnot (via OCCTSurfaceBSplineRemoveVKnot).

Surface.bezierResolution(tolerance3d:)

Resolution for Bezier surfaces: parameter steps in U and V corresponding to tolerance3d in 3D space.

public func bezierResolution(tolerance3d: Double) -> (u: Double, v: Double)
  • Returns: Tuple of (u, v) parameter steps.
  • OCCT: Geom_BezierSurface::Resolution (via OCCTSurfaceBezierResolution).

Surface.bezierMaxDegree

Maximum degree for Bezier surfaces (static).

public static var bezierMaxDegree: Int { get }
  • OCCT: Geom_BezierSurface::MaxDegree (via OCCTSurfaceBezierMaxDegree).

Surface.bsplineMaxDegree

Maximum degree for BSpline surfaces (static).

public static var bsplineMaxDegree: Int { get }
  • OCCT: Geom_BSplineSurface::MaxDegree (via OCCTSurfaceBSplineMaxDegree).

Shape.vecCrossMagnitude(_:_:)

Compute the magnitude of the cross product of two 3D vectors.

public static func vecCrossMagnitude(_ v1: SIMD3<Double>, _ v2: SIMD3<Double>) -> Double
  • OCCT: gp_Vec::CrossMagnitude (via OCCTVecCrossMagnitude).
  • Example:
    let mag = Shape.vecCrossMagnitude(SIMD3(1, 0, 0), SIMD3(0, 1, 0))  // 1.0
    

Shape.vecCrossSquareMagnitude(_:_:)

Compute the square magnitude of the cross product of two 3D vectors.

public static func vecCrossSquareMagnitude(_ v1: SIMD3<Double>, _ v2: SIMD3<Double>) -> Double
  • OCCT: gp_Vec::CrossSquareMagnitude (via OCCTVecCrossSquareMagnitude).

Shape.dirIsOpposite(_:_:tolerance:)

Check if two directions are opposite within angular tolerance (radians).

public static func dirIsOpposite(_ d1: SIMD3<Double>, _ d2: SIMD3<Double>,
                                 tolerance: Double = 1e-10) -> Bool
  • Parameters: d1, d2, unit direction vectors; tolerance, angular tolerance in radians.
  • Returns: true if the angle between d1 and d2 is within tolerance of π.
  • OCCT: gp_Dir::IsOpposite (via OCCTDirIsOpposite).

Shape.dirIsNormal(_:_:tolerance:)

Check if two directions are normal (perpendicular) within angular tolerance (radians).

public static func dirIsNormal(_ d1: SIMD3<Double>, _ d2: SIMD3<Double>,
                               tolerance: Double = 1e-10) -> Bool
  • Parameters: tolerance, angular tolerance in radians.
  • Returns: true if the angle between the two directions is within tolerance of π/2.
  • OCCT: gp_Dir::IsNormal (via OCCTDirIsNormal).

BSpline completions

BSpline mutation helpers added to Surface, Curve3D, and Curve2D.

Surface.bsplineSetUNotPeriodic()

Remove U periodicity from a BSpline surface.

@discardableResult
public func bsplineSetUNotPeriodic() -> Bool
  • OCCT: Geom_BSplineSurface::SetUNotPeriodic (via OCCTSurfaceBSplineSetUNotPeriodic).

Surface.bsplineSetVNotPeriodic()

Remove V periodicity from a BSpline surface.

@discardableResult
public func bsplineSetVNotPeriodic() -> Bool
  • OCCT: Geom_BSplineSurface::SetVNotPeriodic (via OCCTSurfaceBSplineSetVNotPeriodic).

Surface.bsplineSetUOrigin(index:)

Set the origin knot index in the U direction on a periodic BSpline surface (1-based).

@discardableResult
public func bsplineSetUOrigin(index: Int) -> Bool
  • OCCT: Geom_BSplineSurface::SetUOrigin (via OCCTSurfaceBSplineSetUOrigin).

Surface.bsplineSetVOrigin(index:)

Set the origin knot index in the V direction on a periodic BSpline surface (1-based).

@discardableResult
public func bsplineSetVOrigin(index: Int) -> Bool
  • OCCT: Geom_BSplineSurface::SetVOrigin (via OCCTSurfaceBSplineSetVOrigin).

Surface.bsplineIncreaseUMultiplicity(index:multiplicity:)

Increase U multiplicity at a knot index to at least multiplicity (1-based).

@discardableResult
public func bsplineIncreaseUMultiplicity(index: Int, multiplicity: Int) -> Bool
  • OCCT: Geom_BSplineSurface::IncreaseUMultiplicity (via OCCTSurfaceBSplineIncreaseUMultiplicity).

Surface.bsplineIncreaseVMultiplicity(index:multiplicity:)

Increase V multiplicity at a knot index to at least multiplicity (1-based).

@discardableResult
public func bsplineIncreaseVMultiplicity(index: Int, multiplicity: Int) -> Bool
  • OCCT: Geom_BSplineSurface::IncreaseVMultiplicity (via OCCTSurfaceBSplineIncreaseVMultiplicity).

Surface.bsplineInsertUKnots(_:multiplicities:tolerance:)

Batch insert U knots with their multiplicities.

@discardableResult
public func bsplineInsertUKnots(_ knots: [Double], multiplicities: [Int], tolerance: Double = 1e-10) -> Bool
  • Parameters: knots, sorted knot values to insert; multiplicities, corresponding multiplicities; tolerance, knot merging tolerance.
  • Returns: false if either array is empty.
  • OCCT: Geom_BSplineSurface::InsertUKnots (via OCCTSurfaceBSplineInsertUKnots).

Surface.bsplineInsertVKnots(_:multiplicities:tolerance:)

Batch insert V knots with their multiplicities.

@discardableResult
public func bsplineInsertVKnots(_ knots: [Double], multiplicities: [Int], tolerance: Double = 1e-10) -> Bool
  • OCCT: Geom_BSplineSurface::InsertVKnots (via OCCTSurfaceBSplineInsertVKnots).

Surface.bsplineMovePoint(u:v:to:uPoleRange:vPoleRange:)

Move a BSpline surface to pass through a point at (u, v), adjusting poles within the given ranges.

@discardableResult
public func bsplineMovePoint(u: Double, v: Double, to point: SIMD3<Double>,
                             uPoleRange: ClosedRange<Int>, vPoleRange: ClosedRange<Int>) -> Bool
  • Parameters:
    • u, v, parameter at which the surface should pass through point.
    • point: target 3D point.
    • uPoleRange, vPoleRange, 1-based ranges of poles allowed to move.
  • OCCT: Geom_BSplineSurface::MovePoint (via OCCTSurfaceBSplineMovePoint).

Surface.bsplineSetPoleCol(vIndex:poles:)

Set an entire column of poles (all U poles at vIndex, 1-based).

@discardableResult
public func bsplineSetPoleCol(vIndex: Int, poles: [SIMD3<Double>]) -> Bool
  • Parameters: vIndex, 1-based V index; poles, array of NbUPoles points.
  • OCCT: Geom_BSplineSurface::SetPoleCol (via OCCTSurfaceBSplineSetPoleCol).

Surface.bsplineSetPoleRow(uIndex:poles:)

Set an entire row of poles (all V poles at uIndex, 1-based).

@discardableResult
public func bsplineSetPoleRow(uIndex: Int, poles: [SIMD3<Double>]) -> Bool
  • Parameters: uIndex, 1-based U index; poles, array of NbVPoles points.
  • OCCT: Geom_BSplineSurface::SetPoleRow (via OCCTSurfaceBSplineSetPoleRow).

Surface.bsplineSetWeightCol(vIndex:weights:)

Set a column of weights on a BSpline surface (vIndex 1-based, count = NbUPoles).

@discardableResult
public func bsplineSetWeightCol(vIndex: Int, weights: [Double]) -> Bool
  • OCCT: Geom_BSplineSurface::SetWeightCol (via OCCTSurfaceBSplineSetWeightCol).

Surface.bsplineSetWeightRow(uIndex:weights:)

Set a row of weights on a BSpline surface (uIndex 1-based, count = NbVPoles).

@discardableResult
public func bsplineSetWeightRow(uIndex: Int, weights: [Double]) -> Bool
  • OCCT: Geom_BSplineSurface::SetWeightRow (via OCCTSurfaceBSplineSetWeightRow).

Surface.bsplineIncrementUMultiplicity(fromIndex:toIndex:step:)

Increment U knot multiplicities in the range [fromIndex, toIndex] by step (1-based).

@discardableResult
public func bsplineIncrementUMultiplicity(fromIndex: Int, toIndex: Int, step: Int) -> Bool
  • OCCT: Geom_BSplineSurface::IncrementUMultiplicity (via OCCTSurfaceBSplineIncrementUMultiplicity).

Surface.bsplineIncrementVMultiplicity(fromIndex:toIndex:step:)

Increment V knot multiplicities in the range [fromIndex, toIndex] by step (1-based).

@discardableResult
public func bsplineIncrementVMultiplicity(fromIndex: Int, toIndex: Int, step: Int) -> Bool
  • OCCT: Geom_BSplineSurface::IncrementVMultiplicity (via OCCTSurfaceBSplineIncrementVMultiplicity).

Surface.bsplineFirstUKnotIndex

First U knot index of the BSpline surface.

public var bsplineFirstUKnotIndex: Int { get }
  • OCCT: Geom_BSplineSurface::FirstUKnotIndex (via OCCTSurfaceBSplineFirstUKnotIndex).

Surface.bsplineLastUKnotIndex

Last U knot index of the BSpline surface.

public var bsplineLastUKnotIndex: Int { get }
  • OCCT: Geom_BSplineSurface::LastUKnotIndex (via OCCTSurfaceBSplineLastUKnotIndex).

Surface.bsplineFirstVKnotIndex

First V knot index of the BSpline surface.

public var bsplineFirstVKnotIndex: Int { get }
  • OCCT: Geom_BSplineSurface::FirstVKnotIndex (via OCCTSurfaceBSplineFirstVKnotIndex).

Surface.bsplineLastVKnotIndex

Last V knot index of the BSpline surface.

public var bsplineLastVKnotIndex: Int { get }
  • OCCT: Geom_BSplineSurface::LastVKnotIndex (via OCCTSurfaceBSplineLastVKnotIndex).

Surface.bsplineCheckAndSegment(u1:u2:v1:v2:uTolerance:vTolerance:)

Validate parameter ranges and segment the BSpline surface to [u1,u2] × [v1,v2].

@discardableResult
public func bsplineCheckAndSegment(u1: Double, u2: Double, v1: Double, v2: Double,
                                    uTolerance: Double = 1e-10, vTolerance: Double = 1e-10) -> Bool
  • OCCT: Geom_BSplineSurface::CheckAndSegment (via OCCTSurfaceBSplineCheckAndSegment).

Curve3D.bsplineSetNotPeriodic()

Remove periodicity from a 3D BSpline curve.

@discardableResult
public func bsplineSetNotPeriodic() -> Bool
  • OCCT: Geom_BSplineCurve::SetNotPeriodic (via OCCTCurve3DBSplineSetNotPeriodic).

Curve3D.bsplineSetOrigin(index:)

Set the origin knot index (1-based) on a periodic 3D BSpline curve.

@discardableResult
public func bsplineSetOrigin(index: Int) -> Bool
  • OCCT: Geom_BSplineCurve::SetOrigin (via OCCTCurve3DBSplineSetOrigin).

Curve3D.bsplineIncreaseMultiplicity(index:multiplicity:)

Increase the multiplicity of knot at index to at least multiplicity (1-based).

@discardableResult
public func bsplineIncreaseMultiplicity(index: Int, multiplicity: Int) -> Bool
  • OCCT: Geom_BSplineCurve::IncreaseMultiplicity (via OCCTCurve3DBSplineIncreaseMultiplicity).

Curve3D.bsplineIncrementMultiplicity(from:to:step:)

Increment multiplicity of all knots from from to to by step (1-based).

@discardableResult
public func bsplineIncrementMultiplicity(from: Int, to: Int, step: Int = 1) -> Bool
  • OCCT: Geom_BSplineCurve::IncrementMultiplicity (via OCCTCurve3DBSplineIncrementMultiplicity).

Curve3D.bsplineSetKnots(_:)

Set all knot values at once; count must match NbKnots.

@discardableResult
public func bsplineSetKnots(_ knots: [Double]) -> Bool
  • OCCT: Geom_BSplineCurve::SetKnots (via OCCTCurve3DBSplineSetKnots).

Curve3D.bsplineReverse()

Reverse the parameterization of this 3D BSpline curve in place.

@discardableResult
public func bsplineReverse() -> Bool
  • OCCT: Geom_BSplineCurve::Reverse (via OCCTCurve3DBSplineReverse).

Curve3D.bsplineMovePointAndTangent(u:point:tangent:tolerance:startingCondition:endingCondition:)

Move the point and tangent at parameter u on a 3D BSpline curve.

@discardableResult
public func bsplineMovePointAndTangent(u: Double, point: SIMD3<Double>, tangent: SIMD3<Double>,
                                       tolerance: Double, startingCondition: Int, endingCondition: Int) -> Bool
  • Parameters:
    • u: parameter value.
    • point: desired 3D position at u.
    • tangent: desired tangent direction at u.
    • tolerance: geometric tolerance.
    • startingCondition/endingCondition: OCCT’s independent continuity codes, not a pole-index range: -1 means that endpoint is free to move, 0 means the point cannot move, 1 means the point and its tangent cannot move, and so on. The two codes are unrelated and need not be ordered.
  • OCCT: Geom_BSplineCurve::MovePointAndTangent (via OCCTCurve3DBSplineMovePointAndTangent).

Curve2D.bsplineSetNotPeriodic()

Remove periodicity from a 2D BSpline curve.

@discardableResult
public func bsplineSetNotPeriodic() -> Bool
  • OCCT: Geom2d_BSplineCurve::SetNotPeriodic (via OCCTCurve2DBSplineSetNotPeriodic).

Curve2D.bsplineSetOrigin(index:)

Set the origin knot index (1-based) on a periodic 2D BSpline curve.

@discardableResult
public func bsplineSetOrigin(index: Int) -> Bool
  • OCCT: Geom2d_BSplineCurve::SetOrigin (via OCCTCurve2DBSplineSetOrigin).

Curve2D.bsplineIncreaseMultiplicity(index:multiplicity:)

Increase the multiplicity of knot at index to at least multiplicity (1-based).

@discardableResult
public func bsplineIncreaseMultiplicity(index: Int, multiplicity: Int) -> Bool
  • OCCT: Geom2d_BSplineCurve::IncreaseMultiplicity (via OCCTCurve2DBSplineIncreaseMultiplicity).

Curve2D.bsplineIncrementMultiplicity(from:to:step:)

Increment multiplicity of all knots from from to to by step (1-based).

@discardableResult
public func bsplineIncrementMultiplicity(from: Int, to: Int, step: Int = 1) -> Bool
  • OCCT: Geom2d_BSplineCurve::IncrementMultiplicity (via OCCTCurve2DBSplineIncrementMultiplicity).

Curve2D.bsplineSetKnots(_:)

Set all knot values at once; count must match NbKnots.

@discardableResult
public func bsplineSetKnots(_ knots: [Double]) -> Bool
  • OCCT: Geom2d_BSplineCurve::SetKnots (via OCCTCurve2DBSplineSetKnots).

Curve2D.bsplineReverse()

Reverse the parameterization of this 2D BSpline curve in place.

@discardableResult
public func bsplineReverse() -> Bool
  • OCCT: Geom2d_BSplineCurve::Reverse (via OCCTCurve2DBSplineReverse).

Curve2D.bsplineMovePointAndTangent(u:point:tangent:tolerance:startingCondition:endingCondition:)

Move the point and tangent at parameter u on a 2D BSpline curve.

@discardableResult
public func bsplineMovePointAndTangent(u: Double, point: SIMD2<Double>, tangent: SIMD2<Double>,
                                       tolerance: Double, startingCondition: Int, endingCondition: Int) -> Bool
  • Parameters: point and tangent are 2D here (unlike the Curve3D variant). startingCondition/endingCondition are OCCT’s independent continuity codes, not a pole-index range: see the Curve3D entry above for the code meanings.
  • OCCT: Geom2d_BSplineCurve::MovePointAndTangent (via OCCTCurve2DBSplineMovePointAndTangent).

FilletBuilder

Builder for applying rounded fillets to selected edges of a solid, wrapping BRepFilletAPI_MakeFillet.

Contour and edge indices. Every method that takes a contour index takes it 1-based, in 1...contourCount; the edge index inside a contour is 1...edgeCount(contour:). An index outside its range, 0 and the negatives included, is refused with the answer each method documents (0, -1, false, nil or no effect) and never reaches the kernel. OCCT range-checks neither end reliably: ChFi3d_Builder::Value(I) walks its stripe list I - 1 times, so an index past the end, or any index on a builder with no contour, steps onto a null node and faults the process uncatchably, while 0 and the negatives run no steps and read, or write, contour 1 (#3518, Scripts/repro/3518/).

let box = Shape.box(width: 10, height: 10, depth: 10)!
let builder = FilletBuilder(shape: box)!
print(builder.edgeCount(contour: 1))        // 0: no contour yet, and not a crash
builder.addEdge(box.edges()[0], radius: 1)
print(builder.edgeCount(contour: 1))        // 1
print(builder.edgeCount(contour: 0))        // 0, not contour 1
print(builder.edgeCount(contour: 2))        // 0

FilletBuilder.init?(shape:)

Create a fillet builder on the given shape.

public init?(shape: Shape)
  • Parameters: shape, the solid or shell to fillet.
  • Returns: nil if the bridge cannot initialise the builder for this shape.
  • OCCT: BRepFilletAPI_MakeFillet (via OCCTFilletBuilderCreate).
  • Example:
    guard let box = Shape.box(width: 20, height: 20, depth: 20),
          let builder = FilletBuilder(shape: box) else { return }
    for edge in box.edges() {
        _ = builder.addEdge(edge, radius: 2.0)
    }
    if let filleted = builder.build() {
        print("filleted shape valid:", filleted.isValid)
    }
    

FilletBuilder.addEdge(_:radius:)

Add an edge with a constant fillet radius.

@discardableResult
public func addEdge(_ edge: Edge, radius: Double) -> Bool
  • Parameters: edge, the edge to fillet; radius, constant fillet radius (> 0).
  • OCCT: BRepFilletAPI_MakeFillet::Add (via OCCTFilletBuilderAddEdge).

FilletBuilder.addEdge(_:radius1:radius2:)

Add an edge with an evolving fillet radius (r1 at the start vertex, r2 at the end vertex).

@discardableResult
public func addEdge(_ edge: Edge, radius1: Double, radius2: Double) -> Bool
  • OCCT: BRepFilletAPI_MakeFillet::Add with two radii (via OCCTFilletBuilderAddEdgeEvolving).

FilletBuilder.build()

Build the filleted result shape.

public func build() -> Shape?
  • Returns: The filleted solid, or nil if no edges have been added or all contours failed.
  • Note: Check hasResult first when a partial result is acceptable.
  • OCCT: BRepFilletAPI_MakeFillet::Shape (via OCCTFilletBuilderBuild).

FilletBuilder.contourCount

Number of contours registered in the builder.

public var contourCount: Int { get }
  • OCCT: BRepFilletAPI_MakeFillet::NbContours (via OCCTFilletBuilderNbContours).

FilletBuilder.edgeCount(contour:)

Number of edges in a contour (1-based index, 1...contourCount).

public func edgeCount(contour: Int) -> Int

Answers 0 for a contour that does not exist. OCCT reads its stripe list with no range test here, so an index past the end faulted the process, and so did any index on a builder with no contour (#3518).

let box = Shape.box(width: 10, height: 10, depth: 10)!
let builder = FilletBuilder(shape: box)!
builder.addEdge(box.edges()[0], radius: 1)
print(builder.edgeCount(contour: 1))   // 1
print(builder.edgeCount(contour: 2))   // 0: past contourCount, not a crash
  • OCCT: BRepFilletAPI_MakeFillet::NbEdges (via OCCTFilletBuilderNbEdges), read only for a contour in 1...NbContours().

FilletBuilder.hasResult

Whether the builder has a result, may be a partial result even if some contours failed.

public var hasResult: Bool { get }
  • OCCT: BRepFilletAPI_MakeFillet::HasResult (via OCCTFilletBuilderHasResult).

FilletBuilder.badShape

The shape that caused failure (if any).

public var badShape: Shape? { get }
  • Returns: The problematic sub-shape, or nil if no failure has been recorded.
  • OCCT: BRepFilletAPI_MakeFillet::BadShape (via OCCTFilletBuilderBadShape).

FilletBuilder.faultyContourCount

Number of faulty contours after a build attempt.

public var faultyContourCount: Int { get }
  • OCCT: BRepFilletAPI_MakeFillet::NbFaultyContours (via OCCTFilletBuilderNbFaultyContours).

FilletBuilder.faultyVertexCount

Number of faulty vertices after a build attempt.

public var faultyVertexCount: Int { get }
  • OCCT: BRepFilletAPI_MakeFillet::NbFaultyVertices (via OCCTFilletBuilderNbFaultyVertices).

FilletBuilder.radius(contour:)

Get the radius of a contour (1-based index, 1...contourCount).

public func radius(contour: Int) -> Double

Answers -1 for a contour that does not exist, the value OCCT documents for an index outside its table. 0 and the negatives used to answer contour 1’s radius, and any index faulted on a builder with no contour (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::GetFilletShape / radius query (via OCCTFilletBuilderGetRadius).

FilletBuilder.length(contour:)

Get the length of a contour (1-based index, 1...contourCount).

public func length(contour: Int) -> Double

Answers -1 for a contour that does not exist, as radius(contour:) does (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::Length (via OCCTFilletBuilderGetLength).

FilletBuilder.isConstant(contour:)

Whether a contour has a constant radius (1-based index, 1...contourCount).

public func isConstant(contour: Int) -> Bool

Answers false for a contour that does not exist (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::IsConstant (via OCCTFilletBuilderIsConstant).

FilletBuilder.removeEdge(_:)

Remove an edge from its contour.

@discardableResult
public func removeEdge(_ edge: Edge) -> Bool
  • OCCT: BRepFilletAPI_MakeFillet::Remove (via OCCTFilletBuilderRemoveEdge).

FilletBuilder.reset()

Reset all contours, clearing all registered edges.

public func reset()
  • OCCT: BRepFilletAPI_MakeFillet::Reset (via OCCTFilletBuilderReset).

ChamferBuilder

Builder for applying chamfers to selected edges of a solid, wrapping BRepFilletAPI_MakeChamfer.

ChamferBuilder.init?(shape:)

Create a chamfer builder on the given shape.

public init?(shape: Shape)
  • OCCT: BRepFilletAPI_MakeChamfer (via OCCTChamferBuilderCreate).
  • Example:
    guard let box = Shape.box(width: 10, height: 10, depth: 10),
          let builder = ChamferBuilder(shape: box) else { return }
    for edge in box.edges() {
        _ = builder.addEdge(edge, distance: 1.0)
    }
    if let chamfered = builder.build() {
        print("valid:", chamfered.isValid)
    }
    

ChamferBuilder.addEdge(_:distance:)

Add an edge with a symmetric chamfer distance.

@discardableResult
public func addEdge(_ edge: Edge, distance: Double) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::Add (via OCCTChamferBuilderAddEdge).

ChamferBuilder.addEdge(_:face:distance1:distance2:)

Add an edge with two distances (requires a face for orientation).

@discardableResult
public func addEdge(_ edge: Edge, face: Face, distance1: Double, distance2: Double) -> Bool
  • Parameters: face, adjacent face that determines which side gets distance1.
  • OCCT: BRepFilletAPI_MakeChamfer::Add with two distances (via OCCTChamferBuilderAddEdgeTwoDists).

ChamferBuilder.addEdge(_:face:distance:angle:)

Add an edge with a distance and angle (requires a face for orientation).

@discardableResult
public func addEdge(_ edge: Edge, face: Face, distance: Double, angle: Double) -> Bool
  • Parameters: angle, chamfer angle in radians.
  • OCCT: BRepFilletAPI_MakeChamfer::AddDA (via OCCTChamferBuilderAddEdgeDistAngle).

ChamferBuilder.build()

Build the chamfered result shape.

public func build() -> Shape?
  • Returns: The chamfered solid, or nil on failure.
  • OCCT: BRepFilletAPI_MakeChamfer::Shape (via OCCTChamferBuilderBuild).

ChamferBuilder.contourCount

Number of contours registered in the builder.

public var contourCount: Int { get }
  • OCCT: BRepFilletAPI_MakeChamfer::NbContours (via OCCTChamferBuilderNbContours).

ChamferBuilder.isDistanceAngle(contour:)

Whether a contour uses distance-angle mode (1-based index).

public func isDistanceAngle(contour: Int) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::IsDistanceAngle (via OCCTChamferBuilderIsDistAngle).

ChamferBuilder completions

Additional inspection and mutation methods on ChamferBuilder.

ChamferBuilder.edgeCount(contour:)

Number of edges in a contour (1-based index).

public func edgeCount(contour: Int) -> Int
  • OCCT: BRepFilletAPI_MakeChamfer::NbEdges (via OCCTChamferBuilderNbEdges).

ChamferBuilder.getDistance(contour:)

Get the symmetric chamfer distance for a contour (1-based).

public func getDistance(contour: Int) -> Double
  • Returns: The distance, or -1.0 if not set.
  • OCCT: BRepFilletAPI_MakeChamfer::GetDist (via OCCTChamferBuilderGetDist).

ChamferBuilder.getDistances(contour:)

Get the two distances for a contour (1-based).

public func getDistances(contour: Int) -> (d1: Double, d2: Double)
  • Returns: Tuple of (d1, d2); both -1.0 if not set.
  • OCCT: BRepFilletAPI_MakeChamfer::Dists (via OCCTChamferBuilderGetDists).

ChamferBuilder.getDistAngle(contour:)

Get the distance and angle for a contour (1-based).

public func getDistAngle(contour: Int) -> (distance: Double, angle: Double)
  • Returns: Tuple of (distance, angle); both -1.0 if not set.
  • OCCT: BRepFilletAPI_MakeChamfer::GetDistAngle (via OCCTChamferBuilderGetDistAngle).

ChamferBuilder.setDistance(_:contour:face:)

Set symmetric distance on a contour (1-based, requires face for orientation).

@discardableResult
public func setDistance(_ dist: Double, contour: Int, face: Face) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::SetDist (via OCCTChamferBuilderSetDist).

ChamferBuilder.setDistances(_:_:contour:face:)

Set two distances on a contour (1-based, requires face for orientation).

@discardableResult
public func setDistances(_ d1: Double, _ d2: Double, contour: Int, face: Face) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::SetDists (via OCCTChamferBuilderSetDists).

ChamferBuilder.setDistAngle(distance:angle:contour:face:)

Set distance and angle on a contour (1-based, requires face for orientation).

@discardableResult
public func setDistAngle(distance: Double, angle: Double, contour: Int, face: Face) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::SetDistAngle (via OCCTChamferBuilderSetDistAngle).

ChamferBuilder.length(contour:)

Length of a contour (1-based).

public func length(contour: Int) -> Double
  • OCCT: BRepFilletAPI_MakeChamfer::Length (via OCCTChamferBuilderLength).

ChamferBuilder.removeEdge(_:)

Remove the contour containing the given edge.

@discardableResult
public func removeEdge(_ edge: Edge) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::Remove (via OCCTChamferBuilderRemoveEdge).

ChamferBuilder.reset()

Reset all contours, canceling the effects of a previous build.

public func reset()
  • OCCT: BRepFilletAPI_MakeChamfer::Reset (via OCCTChamferBuilderReset).

ChamferBuilder.isClosed(contour:)

Whether a contour (1-based) is closed.

public func isClosed(contour: Int) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::Closed (via OCCTChamferBuilderClosed).

ChamferBuilder.isClosedAndTangent(contour:)

Whether a contour (1-based) is closed and tangent at closure.

public func isClosedAndTangent(contour: Int) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::ClosedAndTangent (via OCCTChamferBuilderClosedAndTangent).

ChamferBuilder.isSymmetric(contour:)

Whether a contour (1-based) uses a symmetric (single-distance) chamfer.

public func isSymmetric(contour: Int) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::IsSymetric (via OCCTChamferBuilderIsSymmetric).

ChamferBuilder.isTwoDistances(contour:)

Whether a contour (1-based) uses the two-distance mode.

public func isTwoDistances(contour: Int) -> Bool
  • OCCT: BRepFilletAPI_MakeChamfer::IsTwoDistances (via OCCTChamferBuilderIsTwoDists).

ChamferBuilder.edge(contour:index:)

Get edge index in contour contour (both 1-based) as a Shape.

public func edge(contour: Int, index: Int) -> Shape?
  • Returns: The edge as a Shape, or nil if the indices are out of range.
  • OCCT: BRepFilletAPI_MakeChamfer::Edge (via OCCTChamferBuilderEdge).

ChamferBuilder.firstVertex(contour:)

Get the first vertex of a contour (1-based) as a Shape.

public func firstVertex(contour: Int) -> Shape?
  • OCCT: BRepFilletAPI_MakeChamfer::FirstVertex (via OCCTChamferBuilderFirstVertex).

ChamferBuilder.lastVertex(contour:)

Get the last vertex of a contour (1-based) as a Shape.

public func lastVertex(contour: Int) -> Shape?
  • OCCT: BRepFilletAPI_MakeChamfer::LastVertex (via OCCTChamferBuilderLastVertex).

ChamferBuilder.contour(for:)

Get the contour index for an edge (returns 0 if not found).

public func contour(for edge: Edge) -> Int
  • OCCT: BRepFilletAPI_MakeChamfer::Contour (via OCCTChamferBuilderContour).

ChamferBuilder.abscissa(contour:vertex:)

Curvilinear abscissa of a vertex on a contour (1-based).

public func abscissa(contour: Int, vertex: Shape) -> Double
  • OCCT: BRepFilletAPI_MakeChamfer::Abscissa (via OCCTChamferBuilderAbscissa).

ChamferBuilder.relativeAbscissa(contour:vertex:)

Relative abscissa (0–1) of a vertex on a contour (1-based).

public func relativeAbscissa(contour: Int, vertex: Shape) -> Double
  • OCCT: BRepFilletAPI_MakeChamfer::RelativeAbscissa (via OCCTChamferBuilderRelativeAbscissa).

FilletBuilder completions

Additional inspection and mutation methods on FilletBuilder.

FilletBuilder.setRadius(_:contour:edge:)

Set a radius on a specific edge in a contour (1-based, 1...contourCount).

@discardableResult
public func setRadius(_ radius: Double, contour: Int, edge: Edge) -> Bool

Returns false, and changes nothing, for a contour that does not exist. 0 and the negatives used to re-radius contour 1, and an index past the end answered true for a write that never happened (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::SetRadius on edge (via OCCTFilletBuilderSetRadiusOnEdge).

FilletBuilder.setRadius(_:contour:vertex:)

Set a radius at a specific vertex in a contour (1-based, 1...contourCount).

@discardableResult
public func setRadius(_ radius: Double, contour: Int, vertex: Shape) -> Bool

Returns false, and changes nothing, for a contour that does not exist (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::SetRadius at vertex (via OCCTFilletBuilderSetRadiusAtVertex).

FilletBuilder.setTwoRadii(_:_:contour:edgeInContour:)

Set two evolving radii on a specific edge in a contour (both 1-based: contour in 1...contourCount, edgeInContour in 1...edgeCount(contour:)).

@discardableResult
public func setTwoRadii(_ r1: Double, _ r2: Double, contour: Int, edgeInContour: Int) -> Bool

Returns false, and changes nothing, when either index is outside its range. 0 is not an edge: OCCT reads it as an absolute abscissa, and an index past the contour’s edges reads the spine’s abscissa table out of bounds (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::SetRadius two-radius variant (via OCCTFilletBuilderSetTwoRadii).

FilletBuilder.contour(for:)

Get the contour index for an edge (returns 0 if not found).

public func contour(for edge: Edge) -> Int
  • OCCT: BRepFilletAPI_MakeFillet::Contour (via OCCTFilletBuilderContour).

FilletBuilder.edge(contour:index:)

Get edge index in contour contour (both 1-based) as a Shape.

public func edge(contour: Int, index: Int) -> Shape?

Returns nil when contour is outside 1...contourCount or index is outside 1...edgeCount(contour:). OCCT checks neither: 0 faulted and an index past the end answered a stale node or memory that is not an edge (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::Edge (via OCCTFilletBuilderEdge).

FilletBuilder.firstVertex(contour:)

Get the first vertex of a contour (1-based, 1...contourCount) as a Shape.

public func firstVertex(contour: Int) -> Shape?

Returns nil for a contour that does not exist (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::FirstVertex (via OCCTFilletBuilderFirstVertex).

FilletBuilder.lastVertex(contour:)

Get the last vertex of a contour (1-based, 1...contourCount) as a Shape.

public func lastVertex(contour: Int) -> Shape?

Returns nil for a contour that does not exist (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::LastVertex (via OCCTFilletBuilderLastVertex).

FilletBuilder.abscissa(contour:vertex:)

Curvilinear abscissa of a vertex on a contour (1-based, 1...contourCount).

public func abscissa(contour: Int, vertex: Shape) -> Double

Answers -1 for a contour that does not exist (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::Abscissa (via OCCTFilletBuilderAbscissa).

FilletBuilder.relativeAbscissa(contour:vertex:)

Relative abscissa (0 to 1) of a vertex on a contour (1-based, 1...contourCount).

public func relativeAbscissa(contour: Int, vertex: Shape) -> Double

Answers -1 for a contour that does not exist (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::RelativeAbscissa (via OCCTFilletBuilderRelativeAbscissa).

FilletBuilder.isClosedAndTangent(contour:)

Whether a contour (1-based, 1...contourCount) is closed and tangent at its closure.

public func isClosedAndTangent(contour: Int) -> Bool

Answers false for a contour that does not exist (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::ClosedAndTangent (via OCCTFilletBuilderClosedAndTangent).

FilletBuilder.isClosed(contour:)

Whether a contour (1-based, 1...contourCount) is closed.

public func isClosed(contour: Int) -> Bool

Answers false for a contour that does not exist (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::Closed (via OCCTFilletBuilderClosed).

FilletBuilder.surfaceCount

Number of fillet surfaces computed after build.

public var surfaceCount: Int { get }

Answers 0 unless the last build() completed: the builder was never built, the build was declined (faultyContourCount says how many contours the kernel refused), there was no contour to build, or reset() has been called since. OCCT reads this count from a data structure that exists only once a build got that far, and reading it on any of those builders used to fault the process uncatchably (#3516, upstream Open-Cascade-SAS/OCCT#1716).

let box = Shape.box(width: 10, height: 10, depth: 10)!
let edge = box.edges()[0]

let declined = FilletBuilder(shape: box)!
declined.addEdge(edge, radius: 20)           // far past half a face width
_ = declined.build()                         // nil: the builder refused it
print(declined.surfaceCount)                 // 0, and faultyContourCount is 1

let built = FilletBuilder(shape: box)!
built.addEdge(edge, radius: 1)
_ = built.build()                            // the filleted box
print(built.surfaceCount)                    // 2
  • OCCT: BRepFilletAPI_MakeFillet::NbSurfaces (via OCCTFilletBuilderNbSurfaces), read only while IsDone() is true.

FilletBuilder.computedSurfaceCount(contour:)

Number of computed fillet surfaces for a contour (1-based, 1...contourCount).

public func computedSurfaceCount(contour: Int) -> Int

Answers 0 for a contour that does not exist. OCCT already refused the index here; only the conversion to a C integer is new (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::NbComputedSurfaces (via OCCTFilletBuilderNbComputedSurfaces).

FilletBuilder.stripeStatus(contour:)

Error status for a contour (1-based, 1...contourCount), returned as ChFiDS_ErrorStatus encoded as Int.

public func stripeStatus(contour: Int) -> Int
  • Returns: 0 = no error; other values correspond to ChFiDS_ErrorStatus enumerators; -1 for a contour that does not exist.

OCCT walks its stripe list for the index and dereferences the stripe whether or not it found one, so any index outside the range faulted the process before #3518.

let box = Shape.box(width: 10, height: 10, depth: 10)!
let builder = FilletBuilder(shape: box)!
builder.addEdge(box.edges()[0], radius: 1)
print(builder.stripeStatus(contour: 1))   // 0
print(builder.stripeStatus(contour: 2))   // -1: past contourCount, not a crash
  • OCCT: BRepFilletAPI_MakeFillet::StripeStatus (via OCCTFilletBuilderStripeStatus), read only for a contour in 1...NbContours().

FilletBuilder.faultyContour(index:)

Get the faulty contour index for the i-th fault (1-based, 1...faultyContourCount).

public func faultyContour(index: Int) -> Int

An index outside that range answers 0. OCCT already did; only the conversion to a C integer is clamped (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::FaultyContour (via OCCTFilletBuilderFaultyContour).

FilletBuilder.faultyVertex(index:)

Get the faulty vertex for the i-th fault (1-based, 1...faultyVertexCount).

public func faultyVertex(index: Int) -> Shape?

An index outside that range answers nil. OCCT already did; only the conversion to a C integer is clamped (#3518).

  • OCCT: BRepFilletAPI_MakeFillet::FaultyVertex (via OCCTFilletBuilderFaultyVertex).

WireAnalyzer

Analyzer for wire geometry and topology, wrapping ShapeAnalysis_Wire.

WireAnalyzer.init?(wire:face:precision:)

Create a wire analyzer from a wire shape, a face it lies on, and precision.

public init?(wire: Wire, face: Shape, precision: Double = 1e-7)
  • Parameters:
    • wire: the wire to analyse.
    • face: the face context (used for 2D checks).
    • precision: geometric precision (default 1e-7).
  • Returns: nil if initialisation fails.
  • OCCT: ShapeAnalysis_Wire (via OCCTWireAnalyzerCreate).
  • Example:
    if let face = Shape.box(width: 10, height: 10, depth: 1)?.faces().first.flatMap(Shape.fromFace),
       let wire = Wire.rectangle(width: 5, height: 5),
       let analyzer = WireAnalyzer(wire: wire, face: face) {
        _ = analyzer.perform()
        print("self-intersects:", analyzer.checkSelfIntersection())
    }
    

WireAnalyzer.perform()

Run all checks (order, small, connected, degenerated, self-intersection, lacking, closed).

public func perform() -> Bool
  • Returns: true if all checks pass.
  • OCCT: ShapeAnalysis_Wire::Perform (via OCCTWireAnalyzerPerform).

WireAnalyzer.checkOrder()

Check edge ordering (each edge’s start matches the previous edge’s end).

public func checkOrder() -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckOrder (via OCCTWireAnalyzerCheckOrder).

WireAnalyzer.checkConnected(edgeNum:)

Check if edge edgeNum (1-based) is connected to the previous one.

public func checkConnected(edgeNum: Int) -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckConnected (via OCCTWireAnalyzerCheckConnected).

WireAnalyzer.checkSmall(edgeNum:)

Check if edge edgeNum (1-based) is degenerate-small (shorter than precision).

public func checkSmall(edgeNum: Int) -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckSmall (via OCCTWireAnalyzerCheckSmall).

WireAnalyzer.checkDegenerated(edgeNum:)

Check if edge edgeNum (1-based) is topologically degenerated.

public func checkDegenerated(edgeNum: Int) -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckDegenerated (via OCCTWireAnalyzerCheckDegenerated).

WireAnalyzer.checkGap3d(edgeNum:)

Check for a 3D gap at edge edgeNum (1-based; pass 0 to check all edges).

public func checkGap3d(edgeNum: Int = 0) -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckGap3d (via OCCTWireAnalyzerCheckGap3d).

WireAnalyzer.checkGap2d(edgeNum:)

Check for a 2D gap at edge edgeNum (1-based; pass 0 to check all edges).

public func checkGap2d(edgeNum: Int = 0) -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckGap2d (via OCCTWireAnalyzerCheckGap2d).

WireAnalyzer.checkSeam(edgeNum:)

Check if edge edgeNum (1-based) is a seam edge.

public func checkSeam(edgeNum: Int) -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckSeam (via OCCTWireAnalyzerCheckSeam).

WireAnalyzer.checkLacking(edgeNum:)

Check if edge edgeNum (1-based) is lacking (missing a 2D curve on the face).

public func checkLacking(edgeNum: Int) -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckLacking (via OCCTWireAnalyzerCheckLacking).

WireAnalyzer.checkSelfIntersection()

Check whether the wire self-intersects.

public func checkSelfIntersection() -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckSelfIntersection (via OCCTWireAnalyzerCheckSelfIntersection).

WireAnalyzer.checkClosed()

Check whether the wire is topologically closed.

public func checkClosed() -> Bool
  • OCCT: ShapeAnalysis_Wire::CheckClosed (via OCCTWireAnalyzerCheckClosed).

WireAnalyzer.minDistance3d

The minimum 3D gap distance found across all checked edges.

public var minDistance3d: Double { get }
  • OCCT: ShapeAnalysis_Wire::MinDistance3d (via OCCTWireAnalyzerMinDistance3d).

WireAnalyzer.maxDistance3d

The maximum 3D gap distance found across all checked edges.

public var maxDistance3d: Double { get }
  • OCCT: ShapeAnalysis_Wire::MaxDistance3d (via OCCTWireAnalyzerMaxDistance3d).

WireAnalyzer.edgeCount

Number of edges in the wire.

public var edgeCount: Int { get }
  • OCCT: ShapeAnalysis_Wire::NbEdges (via OCCTWireAnalyzerNbEdges).

WireAnalyzer.isLoaded

Whether the wire is loaded into the analyzer.

public var isLoaded: Bool { get }
  • OCCT: ShapeAnalysis_Wire::IsLoaded (via OCCTWireAnalyzerIsLoaded).

WireAnalyzer.isReady

Whether the analyzer is ready (wire and face both loaded).

public var isReady: Bool { get }
  • OCCT: ShapeAnalysis_Wire::IsReady (via OCCTWireAnalyzerIsReady).

FilletBuilder completions (v0.126.0)

Advanced parameter and simulation controls for FilletBuilder.

FilletBuilder.setParams(tang:tesp:t2d:tApp3d:tApp2d:fleche:)

Set fillet tolerances for the builder.

public func setParams(tang: Double, tesp: Double, t2d: Double,
                      tApp3d: Double, tApp2d: Double, fleche: Double)
  • Parameters: tang, tangency tolerance; tesp, surface tolerance; t2d, 2D tolerance; tApp3d, 3D approximation tolerance; tApp2d, 2D approximation tolerance; fleche, sag for approximation.
  • OCCT: BRepFilletAPI_MakeFillet::SetParams (via OCCTFilletBuilderSetParams).

FilletBuilder.setContinuity(_:angularTolerance:)

Set the fillet surface continuity: 0=C0, 1=C1, 2=C2.

public func setContinuity(_ internalContinuity: Int, angularTolerance: Double)
  • Parameters: internalContinuity, target continuity class; angularTolerance, angular tolerance for the join.
  • OCCT: BRepFilletAPI_MakeFillet::SetContinuity (via OCCTFilletBuilderSetContinuity).

FilletBuilder.setFilletShape(_:)

Set the fillet shape type: 0=Rational, 1=QuasiAngular, 2=Polynomial.

public func setFilletShape(_ filletShape: Int)
  • OCCT: BRepFilletAPI_MakeFillet::SetFilletShape (via OCCTFilletBuilderSetFilletShape).

FilletBuilder.filletShape

Get the current fillet shape type: 0=Rational, 1=QuasiAngular, 2=Polynomial.

public var filletShape: Int { get }
  • OCCT: BRepFilletAPI_MakeFillet::GetFilletShape (via OCCTFilletBuilderGetFilletShape).

FilletBuilder.resetContour(_:)

Reset radius info on a specific contour (1-based, 1...contourCount).

public func resetContour(_ contourIndex: Int)

Does nothing for a contour that does not exist. 0 and the negatives used to reset contour 1, and any index faulted on a builder with no contour (#3518).

let box = Shape.box(width: 10, height: 10, depth: 10)!
let builder = FilletBuilder(shape: box)!
builder.addEdge(box.edges()[0], radius: 1)
builder.resetContour(0)             // no contour 0: contour 1 keeps its radius
print(builder.radius(contour: 1))   // 1.0
  • OCCT: BRepFilletAPI_MakeFillet::ResetContour (via OCCTFilletBuilderResetContour).

FilletBuilder.simulate(contour:)

Simulate filleting on a contour, computes cross-sections without building the final shape.

public func simulate(contour: Int)
  • Parameters: contour, 1-based contour index, 1...contourCount. An index outside that range does nothing: OCCT walks its stripe list for the index and finds none.
  • OCCT: BRepFilletAPI_MakeFillet::Simulate (via OCCTFilletBuilderSimulate).

FilletBuilder.simulatedSurfaceCount(contour:)

Get the number of simulated surfaces for a contour (1-based) after simulate(contour:).

public func simulatedSurfaceCount(contour: Int) -> Int

Answers 0 while the contour holds no surface data: the builder was never built or simulated, reset() has been called since, the simulation was declined, or contour names no contour. OCCT reads this count from a sequence that only build() or simulate(contour:) creates for a contour, and reading it before either had run, or after a reset, used to fault the process uncatchably (#3519). A contour that build() has run on keeps the surface count that build left.

let box = Shape.box(width: 10, height: 10, depth: 10)!
let builder = FilletBuilder(shape: box)!
builder.addEdge(box.edges()[0], radius: 1)

print(builder.simulatedSurfaceCount(contour: 1))   // 0: nothing has run on it yet
builder.simulate(contour: 1)
print(builder.simulatedSurfaceCount(contour: 1))   // 1: one fillet face on a box edge
builder.reset()
print(builder.simulatedSurfaceCount(contour: 1))   // 0: reset discards the surface data
  • OCCT: BRepFilletAPI_MakeFillet::NbSurf (via OCCTFilletBuilderNbSimulatedSurf), read only while NbComputedSurfaces for the same contour is above 0.
  • Example:
    guard let box = Shape.box(width: 30, height: 30, depth: 30),
          let builder = FilletBuilder(shape: box) else { return }
    let edge = box.edges().first!
    _ = builder.addEdge(edge, radius: 3.0)
    builder.simulate(contour: 1)
    print("simulated sections:", builder.simulatedSurfaceCount(contour: 1))
    

GLTF Import/Export

glTF/GLB import on Shape and Document, plus glTF/GLB export on Exporter and Document.

Shape.loadGLTF(fromPath:)

Load a shape from a glTF or GLB file path.

public static func loadGLTF(fromPath path: String) -> Shape?
  • Parameters: path, file system path to a .gltf or .glb file.
  • Returns: The imported shape, or nil on failure.
  • OCCT: RWGltf_CafReader (via OCCTImportGLTF).
  • Note: Colors and materials are not preserved; use Document.loadGLTF(fromPath:) to retain those.

Shape.loadGLTF(from:)

Load a shape from a glTF or GLB file URL.

public static func loadGLTF(from url: URL) -> Shape?
  • OCCT: RWGltf_CafReader (via OCCTImportGLTF).
  • Example:
    let url = URL(fileURLWithPath: "/tmp/model.glb")
    if let shape = Shape.loadGLTF(from: url) {
        print("loaded shape valid:", shape.isValid)
    }
    

Exporter.writeGLTF(shape:to:binary:deflection:)

Export a shape to glTF or GLB format.

public static func writeGLTF(shape: Shape, to url: URL, binary: Bool = true, deflection: Double = 0.1) throws
  • Parameters:
    • shape: shape to export (meshed internally by the bridge).
    • url: output file URL (.gltf or .glb).
    • binary: true writes binary GLB; false writes text glTF.
    • deflection: mesh linear deflection tolerance.
  • Throws: Exporter.ExportError.exportFailed if writing fails.
  • OCCT: RWGltf_CafWriter (via OCCTExportGLTF).
  • Example:
    guard let box = Shape.box(width: 10, height: 10, depth: 10) else { return }
    let out = URL(fileURLWithPath: "/tmp/box.glb")
    try Exporter.writeGLTF(shape: box, to: out, binary: true, deflection: 0.05)
    

Document.loadGLTF(fromPath:)

Load a glTF or GLB file into an XDE document, preserving names, materials, and colors.

public static func loadGLTF(fromPath path: String) -> Document?
  • Parameters: path, file system path to a .gltf or .glb file.
  • Returns: A Document with the assembly hierarchy, or nil on failure.
  • OCCT: RWGltf_CafReader into TDocStd_Document (via OCCTDocumentLoadGLTF).

Document.loadGLTF(from:)

Load a glTF or GLB file URL into an XDE document.

public static func loadGLTF(from url: URL) -> Document?
  • OCCT: RWGltf_CafReader (via OCCTDocumentLoadGLTF).
  • Example:
    let url = URL(fileURLWithPath: "/tmp/model.glb")
    if let doc = Document.loadGLTF(from: url) {
        for node in doc.rootNodes {
            print(node.name ?? "<unnamed>")
        }
    }
    

Document.writeGLTF(to:binary:)

Write this XDE document to glTF or GLB format.

public func writeGLTF(to url: URL, binary: Bool = true) -> Bool
  • Parameters:
    • url: output file URL (.gltf or .glb).
    • binary: true writes binary GLB; false writes text glTF.
  • Returns: true if the file was written successfully.
  • OCCT: RWGltf_CafWriter (via OCCTDocumentWriteGLTF).
  • Example:
    let doc = try Document.load(from: stepURL)
    let glb = URL(fileURLWithPath: "/tmp/out.glb")
    if doc.writeGLTF(to: glb) {
        print("exported GLB to", glb.path)
    }