FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
solvespace/include/slvs.h at python · mdecourse/solvespace · GitHub
mdecourse
solvespace
Repository navigation
Code
Pull requests
Discussions
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
solvespace
/
include
/
slvs.h
Copy path
More file actions
More file actions
Latest commit
History
History
History
404 lines (363 loc) · 12.9 KB
Breadcrumbs
solvespace
/
include
/
slvs.h
Copy path
File metadata and controls
404 lines (363 loc) · 12.9 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
/*-----------------------------------------------------------------------------
* Data structures and prototypes for slvs.lib, a geometric constraint solver.
*
* See the comments in this file, the accompanying sample code that uses
* this library, and the accompanying documentation (DOC.txt).
*
* Copyright 2009-2013 Jonathan Westhues.
*---------------------------------------------------------------------------*/
#ifndef
__SLVS_H
#define
__SLVS_H
#ifdef
WIN32
# ifdef
EXPORT_DLL
# define
DLL
__declspec( dllexport )
# else
# define
DLL
__declspec( dllimport )
# endif
#else
# define
DLL
#endif
#ifdef
__cplusplus
extern
"C"
{
#endif
#ifdef
_MSC_VER
typedef
unsigned
__int32
uint32_t
;
#else
#include
<stdint.h>
#endif
typedef
uint32_t
Slvs_hParam
;
typedef
uint32_t
Slvs_hEntity
;
typedef
uint32_t
Slvs_hConstraint
;
typedef
uint32_t
Slvs_hGroup
;
/* To obtain the 3d (not projected into a workplane) of a constraint or
* an entity, specify this instead of the workplane. */
#define
SLVS_FREE_IN_3D
0
typedef
struct
{
Slvs_hParam
h
;
Slvs_hGroup
group
;
double
val
;
}
Slvs_Param
;
#define
SLVS_E_POINT_IN_3D
50000
#define
SLVS_E_POINT_IN_2D
50001
#define
SLVS_E_NORMAL_IN_3D
60000
#define
SLVS_E_NORMAL_IN_2D
60001
#define
SLVS_E_DISTANCE
70000
/* The special point, normal, and distance types used for parametric step
* and repeat, extrude, and assembly are currently not exposed. Please
* contact us if you are interested in using these. */
#define
SLVS_E_WORKPLANE
80000
#define
SLVS_E_LINE_SEGMENT
80001
#define
SLVS_E_CUBIC
80002
#define
SLVS_E_CIRCLE
80003
#define
SLVS_E_ARC_OF_CIRCLE
80004
typedef
struct
{
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
];
}
Slvs_Entity
;
#define
SLVS_C_POINTS_COINCIDENT
100000
#define
SLVS_C_PT_PT_DISTANCE
100001
#define
SLVS_C_PT_PLANE_DISTANCE
100002
#define
SLVS_C_PT_LINE_DISTANCE
100003
#define
SLVS_C_PT_FACE_DISTANCE
100004
#define
SLVS_C_PT_IN_PLANE
100005
#define
SLVS_C_PT_ON_LINE
100006
#define
SLVS_C_PT_ON_FACE
100007
#define
SLVS_C_EQUAL_LENGTH_LINES
100008
#define
SLVS_C_LENGTH_RATIO
100009
#define
SLVS_C_EQ_LEN_PT_LINE_D
100010
#define
SLVS_C_EQ_PT_LN_DISTANCES
100011
#define
SLVS_C_EQUAL_ANGLE
100012
#define
SLVS_C_EQUAL_LINE_ARC_LEN
100013
#define
SLVS_C_SYMMETRIC
100014
#define
SLVS_C_SYMMETRIC_HORIZ
100015
#define
SLVS_C_SYMMETRIC_VERT
100016
#define
SLVS_C_SYMMETRIC_LINE
100017
#define
SLVS_C_AT_MIDPOINT
100018
#define
SLVS_C_HORIZONTAL
100019
#define
SLVS_C_VERTICAL
100020
#define
SLVS_C_DIAMETER
100021
#define
SLVS_C_PT_ON_CIRCLE
100022
#define
SLVS_C_SAME_ORIENTATION
100023
#define
SLVS_C_ANGLE
100024
#define
SLVS_C_PARALLEL
100025
#define
SLVS_C_PERPENDICULAR
100026
#define
SLVS_C_ARC_LINE_TANGENT
100027
#define
SLVS_C_CUBIC_LINE_TANGENT
100028
#define
SLVS_C_EQUAL_RADIUS
100029
#define
SLVS_C_PROJ_PT_DISTANCE
100030
#define
SLVS_C_WHERE_DRAGGED
100031
#define
SLVS_C_CURVE_CURVE_TANGENT
100032
#define
SLVS_C_LENGTH_DIFFERENCE
100033
typedef
struct
{
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
;
}
Slvs_Constraint
;
typedef
struct
{
/*** INPUT VARIABLES
*
* Here, we specify the parameters and their initial values, the entities,
* and the constraints. For example, param[] points to the array of
* parameters, which has length params, so that the last valid element
* is param[params-1].
*
* param[] is actually an in/out variable; if the solver is successful,
* then the new values (that satisfy the constraints) are written to it. */
Slvs_Param
*
param
;
int
params
;
Slvs_Entity
*
entity
;
int
entities
;
Slvs_Constraint
*
constraint
;
int
constraints
;
/* If a parameter corresponds to a point (distance, normal, etc.) being
* dragged, then specify it here. This will cause the solver to favor
* that parameter, and attempt to change it as little as possible even
* if that requires it to change other parameters more.
*
* Unused members of this array should be set to zero. */
Slvs_hParam
dragged
[
4
];
/* If the solver fails, then it can determine which constraints are
* causing the problem. But this is a relatively slow process (for
* a system with n constraints, about n times as long as just solving).
* If calculateFaileds is true, then the solver will do so, otherwise
* not. */
int
calculateFaileds
;
/*** OUTPUT VARIABLES
*
* If the solver fails, then it can report which constraints are causing
* the problem. The caller should allocate the array failed[], and pass
* its size in faileds.
*
* The solver will set faileds equal to the number of problematic
* constraints, and write their Slvs_hConstraints into failed[]. To
* ensure that there is sufficient space for any possible set of
* failing constraints, faileds should be greater than or equal to
* constraints. */
Slvs_hConstraint
*
failed
;
int
faileds
;
/* The solver indicates the number of unconstrained degrees of freedom. */
int
dof
;
/* The solver indicates whether the solution succeeded. */
#define
SLVS_RESULT_OKAY
0
#define
SLVS_RESULT_INCONSISTENT
1
#define
SLVS_RESULT_DIDNT_CONVERGE
2
#define
SLVS_RESULT_TOO_MANY_UNKNOWNS
3
int
result
;
}
Slvs_System
;
DLL
void
Slvs_Solve
(
Slvs_System
*
sys
,
Slvs_hGroup
hg
);
/* Our base coordinate system has basis vectors
* (1, 0, 0) (0, 1, 0) (0, 0, 1)
* A unit quaternion defines a rotation to a new coordinate system with
* basis vectors
* U V N
* which these functions compute from the quaternion. */
DLL
void
Slvs_QuaternionU
(
double
qw
,
double
qx
,
double
qy
,
double
qz
,
double
*
x
,
double
*
y
,
double
*
z
);
DLL
void
Slvs_QuaternionV
(
double
qw
,
double
qx
,
double
qy
,
double
qz
,
double
*
x
,
double
*
y
,
double
*
z
);
DLL
void
Slvs_QuaternionN
(
double
qw
,
double
qx
,
double
qy
,
double
qz
,
double
*
x
,
double
*
y
,
double
*
z
);
/* Similarly, compute a unit quaternion in terms of two basis vectors. */
DLL
void
Slvs_MakeQuaternion
(
double
ux
,
double
uy
,
double
uz
,
double
vx
,
double
vy
,
double
vz
,
double
*
qw
,
double
*
qx
,
double
*
qy
,
double
*
qz
);
/*-------------------------------------
* These are just convenience functions, to save you the trouble of filling
* out the structures by hand. The code is included in the header file to
* let the compiler inline them if possible. */
static
inline
Slvs_Param
Slvs_MakeParam
(
Slvs_hParam
h
,
Slvs_hGroup
group
,
double
val
)
{
Slvs_Param
r
;
r
.
h
=
h
;
r
.
group
=
group
;
r
.
val
=
val
;
return
r
;
}
static
inline
Slvs_Entity
Slvs_MakePoint2d
(
Slvs_hEntity
h
,
Slvs_hGroup
group
,
Slvs_hEntity
wrkpl
,
Slvs_hParam
u
,
Slvs_hParam
v
)
{
Slvs_Entity
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_POINT_IN_2D
;
r
.
wrkpl
=
wrkpl
;
r
.
param
[
0
]
=
u
;
r
.
param
[
1
]
=
v
;
return
r
;
}
static
inline
Slvs_Entity
Slvs_MakePoint3d
(
Slvs_hEntity
h
,
Slvs_hGroup
group
,
Slvs_hParam
x
,
Slvs_hParam
y
,
Slvs_hParam
z
)
{
Slvs_Entity
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_POINT_IN_3D
;
r
.
wrkpl
=
SLVS_FREE_IN_3D
;
r
.
param
[
0
]
=
x
;
r
.
param
[
1
]
=
y
;
r
.
param
[
2
]
=
z
;
return
r
;
}
static
inline
Slvs_Entity
Slvs_MakeNormal3d
(
Slvs_hEntity
h
,
Slvs_hGroup
group
,
Slvs_hParam
qw
,
Slvs_hParam
qx
,
Slvs_hParam
qy
,
Slvs_hParam
qz
)
{
Slvs_Entity
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_NORMAL_IN_3D
;
r
.
wrkpl
=
SLVS_FREE_IN_3D
;
r
.
param
[
0
]
=
qw
;
r
.
param
[
1
]
=
qx
;
r
.
param
[
2
]
=
qy
;
r
.
param
[
3
]
=
qz
;
return
r
;
}
static
inline
Slvs_Entity
Slvs_MakeNormal2d
(
Slvs_hEntity
h
,
Slvs_hGroup
group
,
Slvs_hEntity
wrkpl
)
{
Slvs_Entity
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_NORMAL_IN_2D
;
r
.
wrkpl
=
wrkpl
;
return
r
;
}
static
inline
Slvs_Entity
Slvs_MakeDistance
(
Slvs_hEntity
h
,
Slvs_hGroup
group
,
Slvs_hEntity
wrkpl
,
Slvs_hParam
d
)
{
Slvs_Entity
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_DISTANCE
;
r
.
wrkpl
=
wrkpl
;
r
.
param
[
0
]
=
d
;
return
r
;
}
static
inline
Slvs_Entity
Slvs_MakeLineSegment
(
Slvs_hEntity
h
,
Slvs_hGroup
group
,
Slvs_hEntity
wrkpl
,
Slvs_hEntity
ptA
,
Slvs_hEntity
ptB
)
{
Slvs_Entity
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_LINE_SEGMENT
;
r
.
wrkpl
=
wrkpl
;
r
.
point
[
0
]
=
ptA
;
r
.
point
[
1
]
=
ptB
;
return
r
;
}
static
inline
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
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_CUBIC
;
r
.
wrkpl
=
wrkpl
;
r
.
point
[
0
]
=
pt0
;
r
.
point
[
1
]
=
pt1
;
r
.
point
[
2
]
=
pt2
;
r
.
point
[
3
]
=
pt3
;
return
r
;
}
static
inline
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
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_ARC_OF_CIRCLE
;
r
.
wrkpl
=
wrkpl
;
r
.
normal
=
normal
;
r
.
point
[
0
]
=
center
;
r
.
point
[
1
]
=
start
;
r
.
point
[
2
]
=
end
;
return
r
;
}
static
inline
Slvs_Entity
Slvs_MakeCircle
(
Slvs_hEntity
h
,
Slvs_hGroup
group
,
Slvs_hEntity
wrkpl
,
Slvs_hEntity
center
,
Slvs_hEntity
normal
,
Slvs_hEntity
radius
)
{
Slvs_Entity
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_CIRCLE
;
r
.
wrkpl
=
wrkpl
;
r
.
point
[
0
]
=
center
;
r
.
normal
=
normal
;
r
.
distance
=
radius
;
return
r
;
}
static
inline
Slvs_Entity
Slvs_MakeWorkplane
(
Slvs_hEntity
h
,
Slvs_hGroup
group
,
Slvs_hEntity
origin
,
Slvs_hEntity
normal
)
{
Slvs_Entity
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
SLVS_E_WORKPLANE
;
r
.
wrkpl
=
SLVS_FREE_IN_3D
;
r
.
point
[
0
]
=
origin
;
r
.
normal
=
normal
;
return
r
;
}
static
inline
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
)
{
Slvs_Constraint
r
;
memset
(
&
r
,
0
,
sizeof
(
r
));
r
.
h
=
h
;
r
.
group
=
group
;
r
.
type
=
type
;
r
.
wrkpl
=
wrkpl
;
r
.
valA
=
valA
;
r
.
ptA
=
ptA
;
r
.
ptB
=
ptB
;
r
.
entityA
=
entityA
;
r
.
entityB
=
entityB
;
return
r
;
}
#ifdef
__cplusplus
}
#endif
#endif
Back
|
FazBrowse Home
|
New Git URL