  Modern CAD tools represent 3D designs not only as geometry, but also as a
program composed of geometric operations, each of which depends on a set of
parameters. Program representations enable meaningful and controlled shape
variations via parameter changes. However, achieving desired modifications
solely through parameter editing is challenging when CAD models have not been
explicitly authored to expose select degrees of freedom in advance. We
introduce a novel bidirectional editing system for 3D CAD programs. In addition
to editing the CAD program, users can directly manipulate 3D geometry and our
system infers parameter updates to keep both representations in sync. We
formulate inverse edits as a set of constrained optimization objectives,
returning plausible updates to program parameters that both match user intent
and maintain program validity. Our approach implements an automatically
differentiable domain-specific language for CAD programs, providing derivatives
for this optimization to be performed quickly on any expressed program. Our
system enables rapid, interactive exploration of a constrained 3D design space
by allowing users to manipulate the program and geometry interchangeably during
design iteration. While our approach is not designed to optimize across changes
in geometric topology, we show it is expressive and performant enough for users
to produce a diverse set of design variants, even when the CAD program contains
a large number of parameters.
