2019-05-28 12:00:15 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
2019-09-10 07:34:13 +00:00
|
|
|
from typing import Tuple, List, Sequence, Counter, ClassVar
|
2019-05-28 12:00:15 +00:00
|
|
|
|
|
|
|
def quaternion_u(
|
|
|
|
qw: float,
|
|
|
|
qx: float,
|
|
|
|
qy: float,
|
|
|
|
qz: float
|
|
|
|
) -> Tuple[float, float, float]:
|
|
|
|
...
|
|
|
|
|
|
|
|
def quaternion_v(
|
|
|
|
qw: float,
|
|
|
|
qx: float,
|
|
|
|
qy: float,
|
|
|
|
qz: float
|
|
|
|
) -> Tuple[float, float, float]:
|
|
|
|
...
|
|
|
|
|
|
|
|
def quaternion_n(
|
|
|
|
qw: float,
|
|
|
|
qx: float,
|
|
|
|
qy: float,
|
|
|
|
qz: float
|
|
|
|
) -> Tuple[float, float, float]:
|
|
|
|
...
|
|
|
|
|
|
|
|
def make_quaternion(
|
|
|
|
ux: float,
|
|
|
|
uy: float,
|
|
|
|
uz: float,
|
|
|
|
vx: float,
|
|
|
|
vy: float,
|
|
|
|
vz: float
|
|
|
|
) -> Tuple[float, float, float, float]:
|
2020-02-02 13:44:32 +00:00
|
|
|
...
|
2019-05-28 12:00:15 +00:00
|
|
|
|
|
|
|
class Params:
|
2020-02-22 07:02:20 +00:00
|
|
|
pass
|
2019-05-28 12:00:15 +00:00
|
|
|
|
|
|
|
class Entity:
|
|
|
|
|
2020-01-29 03:40:41 +00:00
|
|
|
FREE_IN_3D: ClassVar[Entity] = ...
|
|
|
|
NONE: ClassVar[Entity] = ...
|
2019-05-28 12:00:15 +00:00
|
|
|
params: Params
|
|
|
|
|
|
|
|
def is_3d(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_none(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_point_2d(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_point_3d(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_point(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_normal_2d(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_normal_3d(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_normal(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_distance(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_work_plane(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_line_2d(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_line_3d(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_line(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_cubic(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_circle(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
def is_arc(self) -> bool:
|
|
|
|
...
|
|
|
|
|
|
|
|
class SolverSystem:
|
|
|
|
|
2021-12-11 11:51:55 +00:00
|
|
|
def __init__(self, g: int = 0, param_list=None, entity_list=None, cons_list=None) -> None:
|
|
|
|
"""Create a solver system.
|
|
|
|
|
|
|
|
The current group, parameters, entities, constraints can be set from an existing solver.
|
|
|
|
"""
|
|
|
|
...
|
|
|
|
|
|
|
|
def __reduce__(self):
|
2019-05-28 12:00:15 +00:00
|
|
|
...
|
|
|
|
|
2021-12-11 10:49:15 +00:00
|
|
|
def copy(self) -> SolverSystem:
|
|
|
|
...
|
|
|
|
|
2019-05-28 12:00:15 +00:00
|
|
|
def clear(self) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def set_group(self, g: int) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def group(self) -> int:
|
|
|
|
...
|
|
|
|
|
2019-09-06 14:18:11 +00:00
|
|
|
def set_params(self, p: Params, params: Sequence[float]) -> None:
|
2019-07-11 12:40:33 +00:00
|
|
|
...
|
|
|
|
|
2019-05-28 12:00:15 +00:00
|
|
|
def params(self, p: Params) -> Tuple[float, ...]:
|
|
|
|
...
|
|
|
|
|
|
|
|
def dof(self) -> int:
|
|
|
|
...
|
|
|
|
|
|
|
|
def constraints(self) -> Counter[str]:
|
|
|
|
...
|
|
|
|
|
2020-02-02 13:44:32 +00:00
|
|
|
def failures(self) -> List[int]:
|
2019-05-28 12:00:15 +00:00
|
|
|
...
|
|
|
|
|
2019-10-15 08:13:16 +00:00
|
|
|
def solve(self) -> int:
|
2019-05-28 12:00:15 +00:00
|
|
|
...
|
|
|
|
|
2021-12-11 10:49:15 +00:00
|
|
|
def param_len(self) -> int:
|
|
|
|
...
|
|
|
|
|
|
|
|
def entity_len(self) -> int:
|
|
|
|
...
|
|
|
|
|
|
|
|
def cons_len(self) -> int:
|
|
|
|
...
|
|
|
|
|
2019-05-28 12:00:15 +00:00
|
|
|
def create_2d_base(self) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_point_2d(self, u: float, v: float, wp: Entity) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_point_3d(self, x: float, y: float, z: float) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_normal_2d(self, wp: Entity) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_normal_3d(self, qw: float, qx: float, qy: float, qz: float) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_distance(self, d: float, wp: Entity) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_line_2d(self, p1: Entity, p2: Entity, wp: Entity) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_line_3d(self, p1: Entity, p2: Entity) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_cubic(self, p1: Entity, p2: Entity, p3: Entity, p4: Entity, wp: Entity) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_arc(self, nm: Entity, ct: Entity, start: Entity, end: Entity, wp: Entity) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_circle(self, nm: Entity, ct: Entity, radius: Entity, wp: Entity) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_work_plane(self, origin: Entity, nm: Entity) -> Entity:
|
|
|
|
...
|
|
|
|
|
|
|
|
def add_constraint(
|
|
|
|
self,
|
2019-10-15 08:13:16 +00:00
|
|
|
c_type: int,
|
2019-05-28 12:00:15 +00:00
|
|
|
wp: Entity,
|
|
|
|
v: float,
|
|
|
|
p1: Entity,
|
|
|
|
p2: Entity,
|
|
|
|
e1: Entity,
|
|
|
|
e2: Entity,
|
|
|
|
e3: Entity = Entity.NONE,
|
|
|
|
e4: Entity = Entity.NONE,
|
|
|
|
other: int = 0,
|
|
|
|
other2: int = 0
|
|
|
|
) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def coincident(self, e1: Entity, e2: Entity, wp: Entity = Entity.FREE_IN_3D) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def distance(
|
|
|
|
self,
|
|
|
|
e1: Entity,
|
|
|
|
e2: Entity,
|
|
|
|
value: float,
|
|
|
|
wp: Entity = Entity.FREE_IN_3D
|
|
|
|
) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def equal(self, e1: Entity, e2: Entity, wp: Entity = Entity.FREE_IN_3D) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def equal_included_angle(
|
|
|
|
self,
|
|
|
|
e1: Entity,
|
|
|
|
e2: Entity,
|
|
|
|
e3: Entity,
|
|
|
|
e4: Entity,
|
|
|
|
wp: Entity
|
|
|
|
) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def equal_point_to_line(
|
|
|
|
self,
|
|
|
|
e1: Entity,
|
|
|
|
e2: Entity,
|
|
|
|
e3: Entity,
|
|
|
|
e4: Entity,
|
|
|
|
wp: Entity
|
|
|
|
) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def ratio(self, e1: Entity, e2: Entity, value: float, wp: Entity) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def symmetric(
|
|
|
|
self,
|
|
|
|
e1: Entity,
|
|
|
|
e2: Entity,
|
|
|
|
e3: Entity = Entity.NONE,
|
|
|
|
wp: Entity = Entity.FREE_IN_3D
|
|
|
|
) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def symmetric_h(self, e1: Entity, e2: Entity, wp: Entity) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def symmetric_v(self, e1: Entity, e2: Entity, wp: Entity) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def midpoint(
|
|
|
|
self,
|
|
|
|
e1: Entity,
|
|
|
|
e2: Entity,
|
|
|
|
wp: Entity = Entity.FREE_IN_3D
|
|
|
|
) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def horizontal(self, e1: Entity, wp: Entity) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def vertical(self, e1: Entity, wp: Entity) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def diameter(self, e1: Entity, value: float, wp: Entity) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def same_orientation(self, e1: Entity, e2: Entity) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def angle(self, e1: Entity, e2: Entity, value: float, wp: Entity, inverse: bool = False) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def perpendicular(self, e1: Entity, e2: Entity, wp: Entity, inverse: bool = False) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def parallel(self, e1: Entity, e2: Entity, wp: Entity = Entity.FREE_IN_3D) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def tangent(self, e1: Entity, e2: Entity, wp: Entity = Entity.FREE_IN_3D) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def distance_proj(self, e1: Entity, e2: Entity, value: float) -> None:
|
|
|
|
...
|
|
|
|
|
|
|
|
def dragged(self, e1: Entity, wp: Entity = Entity.FREE_IN_3D) -> None:
|
|
|
|
...
|