# GeoSolver Project Page

GeoSolver is a Python package for geometric constraint solving.

A geometric constraint problem (GCP) is a set of geometric constraints on/between geometric variables. The problem is finding a configuration of the geometric variables so that all constraints are satisfied. Geometric variables are objects with an unknown position, orientation, shape, size, etc. Variables in a GCP  can be points, lines, planes, spheres, cylinders and more complex shapes. Geometric constraints are relations such as the distance between objects (e.g. between a pair of points or between a point and a plane), the angle between objects (e.g. the angle between two planes), tangency of curves and surfaces, othogonality and parellelism, etc.

Geometric constraint problems are found in CAD applications, robotics, simulations, and many other scientific areas. Generic constraint solving/satisfaction methods are typically not suitable for geometric constraint problems, so specialised geometric constraint solving (GCS) algorithms are needed.

## GeoSolver

The GeoSolver Python package provides classes and functions for specifying, analysing and solving geometric constraint problems. It can be used in python applications that need to solve geometric constraint problems.

Features:
• 3D geometric constraint problems, consisting of:
• point variables
• two-point distance constraint
• three-point angle constraint
• Problems with other geometric variables (lines, planes, spheres, etc.) and constraints can be mapped to these basic constraints on point variables
• Solution selection:
• chiralty constraints (clock and handedness constraints)
• protoype-based (sketch-based) selection
• Finds a generic solution, from which all particular solutions, for different parameter values (e.g. distances and angles), can be easily derived
• Incremental algorithm that it can efficiently deal with changes in the GCP (i.e. adding and removing constraints and variables and changing parameter values)
• Extensible solving framework, allowing for new types of geometric variables and constraints

## GCS Workbench

The Geometric Constraint Solving Workbench provides a nice GUI for interactively editing, analysing and solving geometric constraints problems. It uses the GeoSolver package for analysis and solving, and pyQt and pyOpenGL for interactive 3D graphics.

The workbench is currenly used for debugging/testing the GeoSolver package. It may also be used as a teaching tool, and perhaps some day may evolve into a complete geometric design tool kit.

Features:
• Easy interactive editing of constraint problems
• 3D views of problem and solution
• Decompition view: shows how problem is decomposed into a tree of rigid clusers

Browse GeoSolver API reference (generated by pydoc)

[to do: GCS Workbench user manual]

## Development

The GeoSolver project is hosted on Sourceforge. Project information, source code and forums can be found on the sourceforge project page.

You can directly get the latest version from the subversion tree, using the following command:
svn checkout svn://svn.code.sf.net/p/geosolver/code/trunk geosolver-code

## Licence

The GeoSolver package was written by Rick van der Meiden. The GCS Workbench was written by Rogier de Regt and maintained by Rick van der Meiden.

The GeoSolver package and the GCS Workbench are distributed with the GNU Public Licence version 3.0.  See distribution files for more information.

## Publications

An research paper on the geometric constraint solving algorithm used in GeoSolver:

Hilderick A. van der Meiden and Willem F. Bronsvoort, 2009,  A non-rigid cluster rewriting approach to solve systems of 3D geometric constraints, Computer-Aided Design 42(1), pp. 36-49 [doi:10.1016/j.cad.2009.03.003] [Download PDF]

The GCS Workbench is presented in this paper:

Rogier de Regt, Hilderick A. van der Meiden and Willem F. Bronsvoort, 2008, A Workbench for Geometric Constraint Solving, Computer-Aided Design and Applications, Volume 5, Numbers 1-4 (Proceedings CAD'08, June 23-27, 2008, Orlando, Florida) [doi: 10.3722/cadaps.2008.471-482] [Download PDF]