package OSCADml

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

Install

Dune Dependency

Authors

Maintainers

Sources

OSCADml-0.2.3.tbz
sha256=61bc12919734a42004f9f54bb03aa5403eac9cdd645cad1fb97ddd2eba148583
sha512=9aca48afeb2c89ace6b07110b6aadedac7d877fb9b0d1990b0c0b622829ff45ced3841fdae30b5b869293dea1b3ae39f1b00fc767c8e3f69d7e78f6412801ffb

doc/rounded_prisms.html

Rounded Prisms

open OCADml
open OSCADml

If you are in need of extrusions with more continuous curvature than what can be achieved by Mesh.Cap.t specified sweep caps, there are the Mesh.linear_prism and Mesh.prism.

Generally, each of the joint_ pairs describe the desired rounding length "backwards" and "forwards" from the edge (for _top and _bot, this is from the perspective of facing the opposite edge). The sign of the first element of the top and bot pairs determines whether the curvature flairs inwards or outwards, depending on the winding direction of the path (positive will lead to inward rounding for CCW paths).

For more details on what each of the joint_ parameters for Mesh.prism mean, see the documentation for the Mesh.Prism.spec type.

let () =
  Poly2.star ~r1:4. ~r2:8. 5
  |> Mesh.(
       linear_prism
         ~outer:
           Prism.(
             spec
               ~joint_top:(0.95, 0.95)
               ~joint_bot:(-1., 1.)
               ~joint_sides:(`Flat (2., 2.))
               () )
         ~height:2. )
  |> Scad.of_mesh
  |> Scad.to_file "rounded_prism_star.scad"

The Mesh.prism function provides us with a bit more power, allowing us to form meshes around our own transformed bottom and top polygons, rather than simply linearly extruding upward from the base polygon.

For this example, we'll make a box outline for our base, and rotate then translate the same shape up to act as our top polygon. Rotation about the y-axis does not break the requirements of Mesh.prism, since all of the sides will still be coplanar polygons. Note that z-axis rotations would violate this.

let bot = Poly3.box ~center:true ~thickness:(v2 3. 3.) (v2 5. 5.)
let top = Poly3.translate (v3 0. 0. 5.) (Poly3.rotate (v3 0. (Float.pi /. 4.) 0.) bot)

Create a rounded mesh between our bot and top polygons, with separate roundover joint specifications for the outer and inner shapes. By default, ?holes will be `Flip, which mimics ~outer, but negates the first element of joint_top and joint_bot to account for assumed opposite winding direction of the inner paths. In this example, we'll instead use `Spec to directily specify the treament of the inner path, in part to prevent collision of our outer and inner roundovers.

let tunnel =
  let outer =
    Mesh.Prism.spec
      ~joint_top:(0.8, 0.8)
      ~joint_bot:(0.8, 0.8)
      ~joint_sides:(`Flat (1.5, 1.5))
      ()
  and holes =
    `Spec
      (Mesh.Prism.spec
         ~joint_top:(-0.5, 0.5)
         ~joint_bot:(-0.5, 0.5)
         ~joint_sides:(`Flat (0.5, 0.5))
         () )
  in
  Mesh.prism ~fn:16 ~outer ~holes bot top

Convert our tunnel mesh into an OpenSCAD polyhedron and output to file.

let () = Scad.to_file "rounded_prism_tunnel.scad" (Scad.of_mesh tunnel)

OCaml

Innovation. Community. Security.