package OSCADml

  1. Overview
  2. Docs
OCaml DSL for 3D solid modelling in OpenSCAD

Install

Dune Dependency

Authors

Maintainers

Sources

OSCADml-0.2.2.tbz
sha256=8c0eeb5055dd16bb0f9b25b4d21d5312c431969fd0871fc045df2f93147ae39a
sha512=b28bd304ef3196193ba6fe33f51f0f1e2c6bb3cd41c47335a513d9fb4b1f5eca8bcbabcf8683d9b35e3cbd4f3dabe2c7bcc8f5c4b087f96a7ac70117fc4babfa

doc/morphing_sweeps.html

Morphing Sweeps

open OCADml
open OSCADml

While Mesh.sweep and it's derived functions are useful for sweeping fixed polygons with holes, as shown in the rounded sweeps demo, the Mesh.morphing_sweep family provides a means to do so with different shapes at the beginning and end.

let () =
  let path =
    let control =
      V3.[ v 0. 0. 2.; v 0. 20. 20.; v 40. 20. 10.; v 30. 0. 10. ]
      |> Path3.quaternion (Quaternion.make (v3 1. 1. 0.) (Float.pi /. -5.))
    in
    Bezier3.curve ~fn:60 @@ Bezier3.of_path ~size:(`Flat (`Rel 0.3)) control
  and caps =
    Mesh.Cap.(capped ~bot:(round @@ circ (`Radius 0.5)) ~top:(round @@ circ (`Radius 0.5)))
  and a = Poly2.ring ~fn:5 ~thickness:(v2 2.5 2.5) (v2 6. 6.)
  and b = Poly2.ring ~fn:80 ~thickness:(v2 2. 2.) (v2 4. 4.) in
  Mesh.path_morph ~refine:2 ~caps ~path ~outer_map:`Tangent a b
  |> Scad.of_mesh
  |> Scad.to_file "tangent_morph_sweep.scad"

Similar to the ?scale_ez and ?twist_ez parameters on Path3.to_transforms and those that make use of it, such as Mesh.morph, the morphing sweep functions in the Mesh module expose ?ez, which offers the same style of bezier easing (see Easing) for morphs.

let scad =
  let top =
    Mesh.morph
      ~refine:2
      ~ez:(v2 0.42 0., v2 1. 1.)
      ~slices:60
      ~outer_map:`Tangent
      ~height:3.
      (Poly2.ring ~fn:5 ~thickness:(v2 0.5 0.5) (v2 4. 4.))
      (Poly2.ring ~fn:80 ~thickness:(v2 0.2 0.2) (v2 1. 1.))
    |> Scad.of_mesh
  in
  Scad.(add (ztrans 2. top) (ztrans (-2.) @@ xrot Float.pi top))

As the generated mesh contains quite a large number of points due to the large number of slices and the resolution of the inner ring (and the duplication) of the shape (megabytes), we'll take advantage of the include trick provided by the optional ?incl parameter to Scad.to_file. This will produce a pair of .scad scripts, one named "incl_eased_morph.scad", and another named "eased_morph.scad" that simply includes it. By loading the later into OpenSCAD rather than the former, we can avoid the sluggishness that can result when the editor attempts to handle large files.

let () = Scad.to_file ~incl:true "eased_morph.scad" scad

OCaml

Innovation. Community. Security.