From f08d9adc6af06f9458309087ad18a97c5488b770 Mon Sep 17 00:00:00 2001 From: adam-urbanczyk Date: Tue, 18 Aug 2020 17:24:34 +0200 Subject: [PATCH] Added dummy solver class --- cadquery/occ_impl/solver.py | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 cadquery/occ_impl/solver.py diff --git a/cadquery/occ_impl/solver.py b/cadquery/occ_impl/solver.py new file mode 100644 index 00000000..5a161bf0 --- /dev/null +++ b/cadquery/occ_impl/solver.py @@ -0,0 +1,48 @@ +from typing import Tuple, Mapping, Union, Any, Callable, List +from nptyping import NDArray as Array + +from numpy import zeros, array +from scipy.optimize import least_squares + +from OCP.gp import gp_Dir, gp_Pnt + +from .geom import Location + +DOF6 = Tuple[float, float, float, float, float, float] +ConstraintMarker = Union[gp_Dir, gp_Pnt] + + +class ConstraintSolver(object): + + entities: Mapping[int, DOF6] + constraints: Mapping[ + Tuple[int, int], + Tuple[Tuple[ConstraintMarker, ...], Tuple[ConstraintMarker, ...]], + ] + + def _jacobianSparsity(self) -> Array[(Any, Any), float]: + + rv = zeros((len(self.constraints), 6 * len(self.entities))) + + for i, (k1, k2) in enumerate(self.constraints): + rv[i, 6 * k1 : 6 * (k1 + 1)] = 1 + rv[i, 6 * k2 : 6 * (k2 + 1)] = 1 + + return rv + + def _cost(self) -> Callable[[Array[(Any,), float]], Array[(Any,), float]]: + def f(x): + + rv = zeros(len(self.constraints)) + + return rv + + return f + + def solve(self) -> List[Location]: + + x0 = array([el for el in self.entities.values()]).ravel() + + res = least_squares(self._cost(), x0, jac_sparsity=self._jacobianSparsity()) + + return res.x