Additive Manufacturing Constraints
The ggp framework supports Additive Layer Manufacturing (ALM) constraints
through the MNA (Moving Node Approach) continuous formulation. This ensures that
the generated topology is self-supporting, i.e. printable without internal
support structures.
The implementation is based on:
Bhat, K.V., Capasso, G., Coniglio, S., Morlier, J., Gogu, C. On some applications of Generalized Geometric Projection to optimal 3D printing. Computers & Graphics (2021).
Variable Layout
Each run of ALM2DMapper creates a single flat vector of design variables:
[Xc_0_0, L_0_0, Xc_0_1, L_0_1, …, Xc_{nY-1}_{np-1}, L_{nY-1}_{np-1},
h_0, h_1, …, h_{np-1},
Mc_0, Mc_1, …, Mc_{np-1},
y0, theta0]
where:
\(N_y\) = number of layers, \(N_p\) = components per layer (printed columns)
\(X_{c,k,j}\), \(L_{k,j}\) — x-centre and width of component \(j\) in layer \(k\) (interleaved pairs, F-major ordering so that \(j\) is the “column” index)
\(h_j \in [0.2,\,1]\) — normalised total print height of column \(j\); the physical height cutoff is \(L_y \cdot h_j\)
\(M_{c,j} \in [0,\,1]\) — membership density for the whole printed component \(j\) (shared across all layers)
\(y_0\) — y-translation of the printing plane (shifts the build origin)
\(\theta_0\) — rotation of the printing plane (tilts the build direction)
Total variables: \(2 N_y N_p + 2 N_p + 2\).
Printing Plane Transform
When \(y_0 \neq 0\) or \(\theta_0 \neq 0\), the evaluation coordinates \((x, y)\) are mapped to print-space before the characteristic function is evaluated:
This allows non-horizontal build directions, e.g. inclined printing at angle \(\theta_0\).
MNA Characteristic Function
For each evaluation point \((x_p, y_p)\) and each printed component \(j\), the framework:
Finds the layer index \(k_e = \lfloor y_p / \Delta h \rfloor\) (clamped to \([0, N_y - 2]\)).
Computes linearly interpolated left/right boundaries between layer \(k_e\) and \(k_e + 1\):
\[ \begin{align}\begin{aligned}l_y = (X_{k_e} - L_{k_e}/2) + \alpha \bigl[(X_{k_e+1} - L_{k_e+1}/2) - (X_{k_e} - L_{k_e}/2)\bigr]\\u_y = (X_{k_e} + L_{k_e}/2) + \alpha \bigl[(X_{k_e+1} + L_{k_e+1}/2) - (X_{k_e} + L_{k_e}/2)\bigr]\end{aligned}\end{align} \]where \(\alpha = (y_p - Y_{k_e}) / (Y_{k_e+1} - Y_{k_e})\) is the local interpolation factor.
Evaluates three signed-distance tests:
\[\zeta_1 = -x_p + l_y, \quad \zeta_2 = x_p - u_y, \quad \zeta_3 = y_p - L_y h_j\]Computes the characteristic function via the quintic MNA window:
\[W(\zeta) = \frac{1}{2} - \frac{15}{16\sigma}\zeta + \frac{5}{8\sigma^3}\zeta^3 - \frac{3}{16\sigma^5}\zeta^5 \quad \text{for } |\zeta| \le \sigma\]\[W_j = W(\zeta_1) \cdot W(\zeta_2) \cdot W(\zeta_3)\]The height test \(\zeta_3\) cuts off the component above its total print height \(L_y h_j\).
Returns the density contribution: \(\rho_j^{el} = M_{c,j}^p \cdot W_j\).
Overhang Angle Constraints
Linear constraints enforce that each layer is supported by the one below. For layer interface \(k \to k+1\) and component \(j\):
where \(\alpha\) is the maximum allowable overhang angle (default 45°). When \(\theta_0 \neq 0\), \(\alpha\) is corrected to \(\alpha \pm \theta_0\) for the two constraint directions.
These are activated by adding an overhang constraint entry to the preset YAML:
constraints:
- name: overhang
type: ineq
bound: 0.0
params:
alpha_deg: 45.0
Bridge Length Constraints
To limit the lateral drift of a component across layers relative to its base, bridge-length constraints bound the horizontal extent of each upper layer relative to the base-layer (layer 0) x-centre:
Enable by adding bridge_length to the overhang constraint params:
constraints:
- name: overhang
type: ineq
bound: 0.0
params:
alpha_deg: 45.0
bridge_length: 12.5 # in the same units as Lx
Feature Summary
Feature |
Status |
|---|---|
MNA continuous mapping |
✅ Implemented |
Per-column print height \(h_j\) |
✅ Implemented |
Per-column membership \(M_{c,j}\) |
✅ Implemented (shared across layers) |
Overhang angle constraints |
✅ Implemented |
Bridge length constraints (2D) |
✅ Implemented |
Printing plane y-offset \(y_0\) |
✅ Implemented |
Printing plane rotation \(\theta_0\) |
✅ Implemented |
3D bridge length constraints |
✅ Implemented ( |