# -*- coding: utf-8 -*- # cython: language_level=3 """Wrapper header of Solvespace. author: Yuan Chang copyright: Copyright (C) 2016-2019 license: GPLv3+ email: pyslvs@gmail.com """ from libc.stdint cimport uint32_t from libcpp.vector cimport vector from libcpp.map cimport map as cmap cdef extern from "slvs.h" nogil: ctypedef uint32_t Slvs_hParam ctypedef uint32_t Slvs_hEntity ctypedef uint32_t Slvs_hConstraint ctypedef uint32_t Slvs_hGroup # Virtual work plane entity Slvs_hEntity SLVS_FREE_IN_3D ctypedef struct Slvs_Param: Slvs_hParam h Slvs_hGroup group double val # Entity type int SLVS_E_POINT_IN_3D int SLVS_E_POINT_IN_2D int SLVS_E_NORMAL_IN_2D int SLVS_E_NORMAL_IN_3D int SLVS_E_DISTANCE int SLVS_E_WORKPLANE int SLVS_E_LINE_SEGMENT int SLVS_E_CUBIC int SLVS_E_CIRCLE int SLVS_E_ARC_OF_CIRCLE ctypedef struct Slvs_Entity: Slvs_hEntity h Slvs_hGroup group int type Slvs_hEntity wrkpl Slvs_hEntity point[4] Slvs_hEntity normal Slvs_hEntity distance Slvs_hParam param[4] ctypedef struct Slvs_Constraint: Slvs_hConstraint h Slvs_hGroup group int type Slvs_hEntity wrkpl double valA Slvs_hEntity ptA Slvs_hEntity ptB Slvs_hEntity entityA Slvs_hEntity entityB Slvs_hEntity entityC Slvs_hEntity entityD int other int other2 ctypedef struct Slvs_System: Slvs_Param *param int params Slvs_Entity *entity int entities Slvs_Constraint *constraint int constraints Slvs_hParam dragged[4] int calculateFaileds Slvs_hConstraint *failed int faileds int dof int result void Slvs_Solve(Slvs_System *sys, Slvs_hGroup hg) void Slvs_QuaternionU( double qw, double qx, double qy, double qz, double *x, double *y, double *z ) void Slvs_QuaternionV( double qw, double qx, double qy, double qz, double *x, double *y, double *z ) void Slvs_QuaternionN( double qw, double qx, double qy, double qz, double *x, double *y, double *z ) void Slvs_MakeQuaternion( double ux, double uy, double uz, double vx, double vy, double vz, double *qw, double *qx, double *qy, double *qz ) Slvs_Param Slvs_MakeParam(Slvs_hParam h, Slvs_hGroup group, double val) Slvs_Entity Slvs_MakePoint2d( Slvs_hEntity h, Slvs_hGroup group, Slvs_hEntity wrkpl, Slvs_hParam u, Slvs_hParam v ) Slvs_Entity Slvs_MakePoint3d( Slvs_hEntity h, Slvs_hGroup group, Slvs_hParam x, Slvs_hParam y, Slvs_hParam z ) Slvs_Entity Slvs_MakeNormal3d( Slvs_hEntity h, Slvs_hGroup group, Slvs_hParam qw, Slvs_hParam qx, Slvs_hParam qy, Slvs_hParam qz ) Slvs_Entity Slvs_MakeNormal2d( Slvs_hEntity h, Slvs_hGroup group, Slvs_hEntity wrkpl ) Slvs_Entity Slvs_MakeDistance( Slvs_hEntity h, Slvs_hGroup group, Slvs_hEntity wrkpl, Slvs_hParam d ) Slvs_Entity Slvs_MakeLineSegment( Slvs_hEntity h, Slvs_hGroup group, Slvs_hEntity wrkpl, Slvs_hEntity ptA, Slvs_hEntity ptB ) Slvs_Entity Slvs_MakeCubic( Slvs_hEntity h, Slvs_hGroup group, Slvs_hEntity wrkpl, Slvs_hEntity pt0, Slvs_hEntity pt1, Slvs_hEntity pt2, Slvs_hEntity pt3 ) Slvs_Entity Slvs_MakeArcOfCircle( Slvs_hEntity h, Slvs_hGroup group, Slvs_hEntity wrkpl, Slvs_hEntity normal, Slvs_hEntity center, Slvs_hEntity start, Slvs_hEntity end ) Slvs_Entity Slvs_MakeCircle( Slvs_hEntity h, Slvs_hGroup group, Slvs_hEntity wrkpl, Slvs_hEntity center, Slvs_hEntity normal, Slvs_hEntity radius ) Slvs_Entity Slvs_MakeWorkplane( Slvs_hEntity h, Slvs_hGroup group, Slvs_hEntity origin, Slvs_hEntity normal ) Slvs_Constraint Slvs_MakeConstraint( Slvs_hConstraint h, Slvs_hGroup group, int type, Slvs_hEntity wrkpl, double valA, Slvs_hEntity ptA, Slvs_hEntity ptB, Slvs_hEntity entityA, Slvs_hEntity entityB ) cpdef enum Constraint: # Expose macro of constraint types POINTS_COINCIDENT = 100000 PT_PT_DISTANCE PT_PLANE_DISTANCE PT_LINE_DISTANCE PT_FACE_DISTANCE PT_IN_PLANE PT_ON_LINE PT_ON_FACE EQUAL_LENGTH_LINES LENGTH_RATIO EQ_LEN_PT_LINE_D EQ_PT_LN_DISTANCES EQUAL_ANGLE EQUAL_LINE_ARC_LEN SYMMETRIC SYMMETRIC_HORIZ SYMMETRIC_VERT SYMMETRIC_LINE AT_MIDPOINT HORIZONTAL VERTICAL DIAMETER PT_ON_CIRCLE SAME_ORIENTATION ANGLE PARALLEL PERPENDICULAR ARC_LINE_TANGENT CUBIC_LINE_TANGENT EQUAL_RADIUS PROJ_PT_DISTANCE WHERE_DRAGGED CURVE_CURVE_TANGENT LENGTH_DIFFERENCE cpdef enum ResultFlag: # Expose macro of result flags OKAY INCONSISTENT DIDNT_CONVERGE TOO_MANY_UNKNOWNS cpdef tuple quaternion_u(double qw, double qx, double qy, double qz) cpdef tuple quaternion_v(double qw, double qx, double qy, double qz) cpdef tuple quaternion_n(double qw, double qx, double qy, double qz) cpdef tuple make_quaternion(double ux, double uy, double uz, double vx, double vy, double vz) cdef class Params: cdef vector[Slvs_hParam] param_list @staticmethod cdef Params create(Slvs_hParam *p, size_t count) cdef class Entity: cdef int t cdef Slvs_hEntity h, wp cdef Slvs_hGroup g cdef readonly Params params @staticmethod cdef Entity create(Slvs_Entity *e, size_t p_size) cpdef bint is_3d(self) cpdef bint is_none(self) cpdef bint is_point_2d(self) cpdef bint is_point_3d(self) cpdef bint is_point(self) cpdef bint is_normal_2d(self) cpdef bint is_normal_3d(self) cpdef bint is_normal(self) cpdef bint is_distance(self) cpdef bint is_work_plane(self) cpdef bint is_line_2d(self) cpdef bint is_line_3d(self) cpdef bint is_line(self) cpdef bint is_cubic(self) cpdef bint is_circle(self) cpdef bint is_arc(self) cdef class SolverSystem: cdef Slvs_hGroup g cdef Slvs_System sys cdef cmap[Slvs_hParam, Slvs_Param] param_list cdef vector[Slvs_Entity] entity_list cdef vector[Slvs_Constraint] cons_list cdef vector[Slvs_hConstraint] failed_list cdef void copy_to_sys(self) nogil cdef void copy_from_sys(self) nogil cpdef void clear(self) cdef void failed_collecting(self) nogil cdef void free(self) cpdef void set_group(self, size_t g) cpdef int group(self) cpdef void set_params(self, Params p, object params) cpdef tuple params(self, Params p) cpdef int dof(self) cpdef object constraints(self) cpdef list faileds(self) cpdef int solve(self) cpdef Entity create_2d_base(self) cdef Slvs_hParam new_param(self, double val) nogil cdef Slvs_hEntity eh(self) nogil cpdef Entity add_point_2d(self, double u, double v, Entity wp) cpdef Entity add_point_3d(self, double x, double y, double z) cpdef Entity add_normal_2d(self, Entity wp) cpdef Entity add_normal_3d(self, double qw, double qx, double qy, double qz) cpdef Entity add_distance(self, double d, Entity wp) cpdef Entity add_line_2d(self, Entity p1, Entity p2, Entity wp) cpdef Entity add_line_3d(self, Entity p1, Entity p2) cpdef Entity add_cubic(self, Entity p1, Entity p2, Entity p3, Entity p4, Entity wp) cpdef Entity add_arc(self, Entity nm, Entity ct, Entity start, Entity end, Entity wp) cpdef Entity add_circle(self, Entity nm, Entity ct, Entity radius, Entity wp) cpdef Entity add_work_plane(self, Entity origin, Entity nm) cpdef void add_constraint( self, Constraint c_type, Entity wp, double v, Entity p1, Entity p2, Entity e1, Entity e2, Entity e3 = *, Entity e4 = *, int other = *, int other2 = * ) cpdef void coincident(self, Entity e1, Entity e2, Entity wp = *) cpdef void distance(self, Entity e1, Entity e2, double value, Entity wp = *) cpdef void equal(self, Entity e1, Entity e2, Entity wp = *) cpdef void equal_included_angle(self, Entity e1, Entity e2, Entity e3, Entity e4, Entity wp) cpdef void equal_point_to_line(self, Entity e1, Entity e2, Entity e3, Entity e4, Entity wp) cpdef void ratio(self, Entity e1, Entity e2, double value, Entity wp) cpdef void symmetric(self, Entity e1, Entity e2, Entity e3 = *, Entity wp = *) cpdef void symmetric_h(self, Entity e1, Entity e2, Entity wp) cpdef void symmetric_v(self, Entity e1, Entity e2, Entity wp) cpdef void midpoint(self, Entity e1, Entity e2, Entity wp = *) cpdef void horizontal(self, Entity e1, Entity wp) cpdef void vertical(self, Entity e1, Entity wp) cpdef void diameter(self, Entity e1, double value, Entity wp) cpdef void same_orientation(self, Entity e1, Entity e2) cpdef void angle(self, Entity e1, Entity e2, double value, Entity wp, bint inverse = *) cpdef void perpendicular(self, Entity e1, Entity e2, Entity wp, bint inverse = *) cpdef void parallel(self, Entity e1, Entity e2, Entity wp = *) cpdef void tangent(self, Entity e1, Entity e2, Entity wp = *) cpdef void distance_proj(self, Entity e1, Entity e2, double value) cpdef void dragged(self, Entity e1, Entity wp = *)