Split the Entity and Constraint classes into Xxx and XxxBase, with
the fundamental geometric stuff in XxxBase. Next I hope to make the constraint solver use only the XxxBase types. [git-p4: depot-paths = "//depot/solvespace/": change = 1941]
This commit is contained in:
parent
bab13b821f
commit
b293c0ef41
@ -1,7 +1,5 @@
|
|||||||
#include "solvespace.h"
|
#include "solvespace.h"
|
||||||
|
|
||||||
const hConstraint Constraint::NO_CONSTRAINT = { 0 };
|
|
||||||
|
|
||||||
char *Constraint::DescriptionString(void) {
|
char *Constraint::DescriptionString(void) {
|
||||||
static char ret[1024];
|
static char ret[1024];
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#include "solvespace.h"
|
#include "solvespace.h"
|
||||||
|
|
||||||
Expr *Constraint::VectorsParallel(int eq, ExprVector a, ExprVector b) {
|
const hConstraint ConstraintBase::NO_CONSTRAINT = { 0 };
|
||||||
|
|
||||||
|
Expr *ConstraintBase::VectorsParallel(int eq, ExprVector a, ExprVector b) {
|
||||||
ExprVector r = a.Cross(b);
|
ExprVector r = a.Cross(b);
|
||||||
// Hairy ball theorem screws me here. There's no clean solution that I
|
// Hairy ball theorem screws me here. There's no clean solution that I
|
||||||
// know, so let's pivot on the initial numerical guess. Our caller
|
// know, so let's pivot on the initial numerical guess. Our caller
|
||||||
@ -29,7 +31,8 @@ Expr *Constraint::VectorsParallel(int eq, ExprVector a, ExprVector b) {
|
|||||||
oops();
|
oops();
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr *Constraint::PointLineDistance(hEntity wrkpl, hEntity hpt, hEntity hln) {
|
Expr *ConstraintBase::PointLineDistance(hEntity wrkpl, hEntity hpt, hEntity hln)
|
||||||
|
{
|
||||||
Entity *ln = SS.GetEntity(hln);
|
Entity *ln = SS.GetEntity(hln);
|
||||||
Entity *a = SS.GetEntity(ln->point[0]);
|
Entity *a = SS.GetEntity(ln->point[0]);
|
||||||
Entity *b = SS.GetEntity(ln->point[1]);
|
Entity *b = SS.GetEntity(ln->point[1]);
|
||||||
@ -65,14 +68,14 @@ Expr *Constraint::PointLineDistance(hEntity wrkpl, hEntity hpt, hEntity hln) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr *Constraint::PointPlaneDistance(ExprVector p, hEntity hpl) {
|
Expr *ConstraintBase::PointPlaneDistance(ExprVector p, hEntity hpl) {
|
||||||
ExprVector n;
|
ExprVector n;
|
||||||
Expr *d;
|
Expr *d;
|
||||||
SS.GetEntity(hpl)->WorkplaneGetPlaneExprs(&n, &d);
|
SS.GetEntity(hpl)->WorkplaneGetPlaneExprs(&n, &d);
|
||||||
return (p.Dot(n))->Minus(d);
|
return (p.Dot(n))->Minus(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr *Constraint::Distance(hEntity wrkpl, hEntity hpa, hEntity hpb) {
|
Expr *ConstraintBase::Distance(hEntity wrkpl, hEntity hpa, hEntity hpb) {
|
||||||
Entity *pa = SS.GetEntity(hpa);
|
Entity *pa = SS.GetEntity(hpa);
|
||||||
Entity *pb = SS.GetEntity(hpb);
|
Entity *pb = SS.GetEntity(hpb);
|
||||||
if(!(pa->IsPoint() && pb->IsPoint())) oops();
|
if(!(pa->IsPoint() && pb->IsPoint())) oops();
|
||||||
@ -103,7 +106,9 @@ Expr *Constraint::Distance(hEntity wrkpl, hEntity hpa, hEntity hpb) {
|
|||||||
// Return the cosine of the angle between two vectors. If a workplane is
|
// Return the cosine of the angle between two vectors. If a workplane is
|
||||||
// specified, then it's the cosine of their projections into that workplane.
|
// specified, then it's the cosine of their projections into that workplane.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
Expr *Constraint::DirectionCosine(hEntity wrkpl, ExprVector ae, ExprVector be) {
|
Expr *ConstraintBase::DirectionCosine(hEntity wrkpl,
|
||||||
|
ExprVector ae, ExprVector be)
|
||||||
|
{
|
||||||
if(wrkpl.v == Entity::FREE_IN_3D.v) {
|
if(wrkpl.v == Entity::FREE_IN_3D.v) {
|
||||||
Expr *mags = (ae.Magnitude())->Times(be.Magnitude());
|
Expr *mags = (ae.Magnitude())->Times(be.Magnitude());
|
||||||
return (ae.Dot(be))->Div(mags);
|
return (ae.Dot(be))->Div(mags);
|
||||||
@ -122,7 +127,9 @@ Expr *Constraint::DirectionCosine(hEntity wrkpl, ExprVector ae, ExprVector be) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprVector Constraint::PointInThreeSpace(hEntity workplane, Expr *u, Expr *v) {
|
ExprVector ConstraintBase::PointInThreeSpace(hEntity workplane,
|
||||||
|
Expr *u, Expr *v)
|
||||||
|
{
|
||||||
Entity *w = SS.GetEntity(workplane);
|
Entity *w = SS.GetEntity(workplane);
|
||||||
|
|
||||||
ExprVector ub = w->Normal()->NormalExprsU();
|
ExprVector ub = w->Normal()->NormalExprsU();
|
||||||
@ -132,7 +139,7 @@ ExprVector Constraint::PointInThreeSpace(hEntity workplane, Expr *u, Expr *v) {
|
|||||||
return (ub.ScaledBy(u)).Plus(vb.ScaledBy(v)).Plus(ob);
|
return (ub.ScaledBy(u)).Plus(vb.ScaledBy(v)).Plus(ob);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Constraint::ModifyToSatisfy(void) {
|
void ConstraintBase::ModifyToSatisfy(void) {
|
||||||
if(type == ANGLE) {
|
if(type == ANGLE) {
|
||||||
Vector a = SS.GetEntity(entityA)->VectorGetNum();
|
Vector a = SS.GetEntity(entityA)->VectorGetNum();
|
||||||
Vector b = SS.GetEntity(entityB)->VectorGetNum();
|
Vector b = SS.GetEntity(entityB)->VectorGetNum();
|
||||||
@ -161,19 +168,20 @@ void Constraint::ModifyToSatisfy(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Constraint::AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index) {
|
void ConstraintBase::AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index)
|
||||||
|
{
|
||||||
Equation eq;
|
Equation eq;
|
||||||
eq.e = expr;
|
eq.e = expr;
|
||||||
eq.h = h.equation(index);
|
eq.h = h.equation(index);
|
||||||
l->Add(&eq);
|
l->Add(&eq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Constraint::Generate(IdList<Equation,hEquation> *l) {
|
void ConstraintBase::Generate(IdList<Equation,hEquation> *l) {
|
||||||
if(!reference) {
|
if(!reference) {
|
||||||
GenerateReal(l);
|
GenerateReal(l);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void Constraint::GenerateReal(IdList<Equation,hEquation> *l) {
|
void ConstraintBase::GenerateReal(IdList<Equation,hEquation> *l) {
|
||||||
Expr *exA = Expr::From(valA);
|
Expr *exA = Expr::From(valA);
|
||||||
|
|
||||||
switch(type) {
|
switch(type) {
|
||||||
|
@ -1,5 +1,15 @@
|
|||||||
#include "solvespace.h"
|
#include "solvespace.h"
|
||||||
|
|
||||||
|
char *Entity::DescriptionString(void) {
|
||||||
|
if(h.isFromRequest()) {
|
||||||
|
Request *r = SS.GetRequest(h.request());
|
||||||
|
return r->DescriptionString();
|
||||||
|
} else {
|
||||||
|
Group *g = SS.GetGroup(h.group());
|
||||||
|
return g->DescriptionString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Entity::LineDrawOrGetDistance(Vector a, Vector b) {
|
void Entity::LineDrawOrGetDistance(Vector a, Vector b) {
|
||||||
if(dogd.drawing) {
|
if(dogd.drawing) {
|
||||||
// Draw lines from active group in front of those from previous
|
// Draw lines from active group in front of those from previous
|
||||||
|
100
entity.cpp
100
entity.cpp
@ -1,19 +1,9 @@
|
|||||||
#include "solvespace.h"
|
#include "solvespace.h"
|
||||||
|
|
||||||
const hEntity Entity::FREE_IN_3D = { 0 };
|
const hEntity EntityBase::FREE_IN_3D = { 0 };
|
||||||
const hEntity Entity::NO_ENTITY = { 0 };
|
const hEntity EntityBase::NO_ENTITY = { 0 };
|
||||||
|
|
||||||
char *Entity::DescriptionString(void) {
|
bool EntityBase::HasVector(void) {
|
||||||
if(h.isFromRequest()) {
|
|
||||||
Request *r = SS.GetRequest(h.request());
|
|
||||||
return r->DescriptionString();
|
|
||||||
} else {
|
|
||||||
Group *g = SS.GetGroup(h.group());
|
|
||||||
return g->DescriptionString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Entity::HasVector(void) {
|
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case LINE_SEGMENT:
|
case LINE_SEGMENT:
|
||||||
case NORMAL_IN_3D:
|
case NORMAL_IN_3D:
|
||||||
@ -28,7 +18,7 @@ bool Entity::HasVector(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprVector Entity::VectorGetExprs(void) {
|
ExprVector EntityBase::VectorGetExprs(void) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case LINE_SEGMENT:
|
case LINE_SEGMENT:
|
||||||
return (SS.GetEntity(point[0])->PointGetExprs()).Minus(
|
return (SS.GetEntity(point[0])->PointGetExprs()).Minus(
|
||||||
@ -45,7 +35,7 @@ ExprVector Entity::VectorGetExprs(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector Entity::VectorGetNum(void) {
|
Vector EntityBase::VectorGetNum(void) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case LINE_SEGMENT:
|
case LINE_SEGMENT:
|
||||||
return (SS.GetEntity(point[0])->PointGetNum()).Minus(
|
return (SS.GetEntity(point[0])->PointGetNum()).Minus(
|
||||||
@ -62,7 +52,7 @@ Vector Entity::VectorGetNum(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector Entity::VectorGetRefPoint(void) {
|
Vector EntityBase::VectorGetRefPoint(void) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case LINE_SEGMENT:
|
case LINE_SEGMENT:
|
||||||
return ((SS.GetEntity(point[0])->PointGetNum()).Plus(
|
return ((SS.GetEntity(point[0])->PointGetNum()).Plus(
|
||||||
@ -79,11 +69,11 @@ Vector Entity::VectorGetRefPoint(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Entity::IsCircle(void) {
|
bool EntityBase::IsCircle(void) {
|
||||||
return (type == CIRCLE) || (type == ARC_OF_CIRCLE);
|
return (type == CIRCLE) || (type == ARC_OF_CIRCLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr *Entity::CircleGetRadiusExpr(void) {
|
Expr *EntityBase::CircleGetRadiusExpr(void) {
|
||||||
if(type == CIRCLE) {
|
if(type == CIRCLE) {
|
||||||
return SS.GetEntity(distance)->DistanceGetExpr();
|
return SS.GetEntity(distance)->DistanceGetExpr();
|
||||||
} else if(type == ARC_OF_CIRCLE) {
|
} else if(type == ARC_OF_CIRCLE) {
|
||||||
@ -91,7 +81,7 @@ Expr *Entity::CircleGetRadiusExpr(void) {
|
|||||||
} else oops();
|
} else oops();
|
||||||
}
|
}
|
||||||
|
|
||||||
double Entity::CircleGetRadiusNum(void) {
|
double EntityBase::CircleGetRadiusNum(void) {
|
||||||
if(type == CIRCLE) {
|
if(type == CIRCLE) {
|
||||||
return SS.GetEntity(distance)->DistanceGetNum();
|
return SS.GetEntity(distance)->DistanceGetNum();
|
||||||
} else if(type == ARC_OF_CIRCLE) {
|
} else if(type == ARC_OF_CIRCLE) {
|
||||||
@ -101,7 +91,7 @@ double Entity::CircleGetRadiusNum(void) {
|
|||||||
} else oops();
|
} else oops();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::ArcGetAngles(double *thetaa, double *thetab, double *dtheta) {
|
void EntityBase::ArcGetAngles(double *thetaa, double *thetab, double *dtheta) {
|
||||||
if(type != ARC_OF_CIRCLE) oops();
|
if(type != ARC_OF_CIRCLE) oops();
|
||||||
|
|
||||||
Quaternion q = Normal()->NormalGetNum();
|
Quaternion q = Normal()->NormalGetNum();
|
||||||
@ -124,19 +114,19 @@ void Entity::ArcGetAngles(double *thetaa, double *thetab, double *dtheta) {
|
|||||||
while(*dtheta > (2*PI)) *dtheta -= 2*PI;
|
while(*dtheta > (2*PI)) *dtheta -= 2*PI;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Entity::IsWorkplane(void) {
|
bool EntityBase::IsWorkplane(void) {
|
||||||
return (type == WORKPLANE);
|
return (type == WORKPLANE);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprVector Entity::WorkplaneGetOffsetExprs(void) {
|
ExprVector EntityBase::WorkplaneGetOffsetExprs(void) {
|
||||||
return SS.GetEntity(point[0])->PointGetExprs();
|
return SS.GetEntity(point[0])->PointGetExprs();
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector Entity::WorkplaneGetOffset(void) {
|
Vector EntityBase::WorkplaneGetOffset(void) {
|
||||||
return SS.GetEntity(point[0])->PointGetNum();
|
return SS.GetEntity(point[0])->PointGetNum();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::WorkplaneGetPlaneExprs(ExprVector *n, Expr **dn) {
|
void EntityBase::WorkplaneGetPlaneExprs(ExprVector *n, Expr **dn) {
|
||||||
if(type == WORKPLANE) {
|
if(type == WORKPLANE) {
|
||||||
*n = Normal()->NormalExprsN();
|
*n = Normal()->NormalExprsN();
|
||||||
|
|
||||||
@ -150,21 +140,21 @@ void Entity::WorkplaneGetPlaneExprs(ExprVector *n, Expr **dn) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double Entity::DistanceGetNum(void) {
|
double EntityBase::DistanceGetNum(void) {
|
||||||
if(type == DISTANCE) {
|
if(type == DISTANCE) {
|
||||||
return SS.GetParam(param[0])->val;
|
return SS.GetParam(param[0])->val;
|
||||||
} else if(type == DISTANCE_N_COPY) {
|
} else if(type == DISTANCE_N_COPY) {
|
||||||
return numDistance;
|
return numDistance;
|
||||||
} else oops();
|
} else oops();
|
||||||
}
|
}
|
||||||
Expr *Entity::DistanceGetExpr(void) {
|
Expr *EntityBase::DistanceGetExpr(void) {
|
||||||
if(type == DISTANCE) {
|
if(type == DISTANCE) {
|
||||||
return Expr::From(param[0]);
|
return Expr::From(param[0]);
|
||||||
} else if(type == DISTANCE_N_COPY) {
|
} else if(type == DISTANCE_N_COPY) {
|
||||||
return Expr::From(numDistance);
|
return Expr::From(numDistance);
|
||||||
} else oops();
|
} else oops();
|
||||||
}
|
}
|
||||||
void Entity::DistanceForceTo(double v) {
|
void EntityBase::DistanceForceTo(double v) {
|
||||||
if(type == DISTANCE) {
|
if(type == DISTANCE) {
|
||||||
(SS.GetParam(param[0]))->val = v;
|
(SS.GetParam(param[0]))->val = v;
|
||||||
} else if(type == DISTANCE_N_COPY) {
|
} else if(type == DISTANCE_N_COPY) {
|
||||||
@ -172,11 +162,11 @@ void Entity::DistanceForceTo(double v) {
|
|||||||
} else oops();
|
} else oops();
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity *Entity::Normal(void) {
|
Entity *EntityBase::Normal(void) {
|
||||||
return SS.GetEntity(normal);
|
return SS.GetEntity(normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Entity::IsPoint(void) {
|
bool EntityBase::IsPoint(void) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case POINT_IN_3D:
|
case POINT_IN_3D:
|
||||||
case POINT_IN_2D:
|
case POINT_IN_2D:
|
||||||
@ -191,7 +181,7 @@ bool Entity::IsPoint(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Entity::IsNormal(void) {
|
bool EntityBase::IsNormal(void) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case NORMAL_IN_3D:
|
case NORMAL_IN_3D:
|
||||||
case NORMAL_IN_2D:
|
case NORMAL_IN_2D:
|
||||||
@ -204,7 +194,7 @@ bool Entity::IsNormal(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion Entity::NormalGetNum(void) {
|
Quaternion EntityBase::NormalGetNum(void) {
|
||||||
Quaternion q;
|
Quaternion q;
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case NORMAL_IN_3D:
|
case NORMAL_IN_3D:
|
||||||
@ -237,7 +227,7 @@ Quaternion Entity::NormalGetNum(void) {
|
|||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::NormalForceTo(Quaternion q) {
|
void EntityBase::NormalForceTo(Quaternion q) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case NORMAL_IN_3D:
|
case NORMAL_IN_3D:
|
||||||
SS.GetParam(param[0])->val = q.w;
|
SS.GetParam(param[0])->val = q.w;
|
||||||
@ -268,27 +258,27 @@ void Entity::NormalForceTo(Quaternion q) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector Entity::NormalU(void) {
|
Vector EntityBase::NormalU(void) {
|
||||||
return NormalGetNum().RotationU();
|
return NormalGetNum().RotationU();
|
||||||
}
|
}
|
||||||
Vector Entity::NormalV(void) {
|
Vector EntityBase::NormalV(void) {
|
||||||
return NormalGetNum().RotationV();
|
return NormalGetNum().RotationV();
|
||||||
}
|
}
|
||||||
Vector Entity::NormalN(void) {
|
Vector EntityBase::NormalN(void) {
|
||||||
return NormalGetNum().RotationN();
|
return NormalGetNum().RotationN();
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprVector Entity::NormalExprsU(void) {
|
ExprVector EntityBase::NormalExprsU(void) {
|
||||||
return NormalGetExprs().RotationU();
|
return NormalGetExprs().RotationU();
|
||||||
}
|
}
|
||||||
ExprVector Entity::NormalExprsV(void) {
|
ExprVector EntityBase::NormalExprsV(void) {
|
||||||
return NormalGetExprs().RotationV();
|
return NormalGetExprs().RotationV();
|
||||||
}
|
}
|
||||||
ExprVector Entity::NormalExprsN(void) {
|
ExprVector EntityBase::NormalExprsN(void) {
|
||||||
return NormalGetExprs().RotationN();
|
return NormalGetExprs().RotationN();
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprQuaternion Entity::NormalGetExprs(void) {
|
ExprQuaternion EntityBase::NormalGetExprs(void) {
|
||||||
ExprQuaternion q;
|
ExprQuaternion q;
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case NORMAL_IN_3D:
|
case NORMAL_IN_3D:
|
||||||
@ -325,11 +315,11 @@ ExprQuaternion Entity::NormalGetExprs(void) {
|
|||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Entity::PointIsFromReferences(void) {
|
bool EntityBase::PointIsFromReferences(void) {
|
||||||
return h.request().IsFromReferences();
|
return h.request().IsFromReferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::PointForceTo(Vector p) {
|
void EntityBase::PointForceTo(Vector p) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case POINT_IN_3D:
|
case POINT_IN_3D:
|
||||||
SS.GetParam(param[0])->val = p.x;
|
SS.GetParam(param[0])->val = p.x;
|
||||||
@ -392,7 +382,7 @@ void Entity::PointForceTo(Vector p) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector Entity::PointGetNum(void) {
|
Vector EntityBase::PointGetNum(void) {
|
||||||
Vector p;
|
Vector p;
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case POINT_IN_3D:
|
case POINT_IN_3D:
|
||||||
@ -441,7 +431,7 @@ Vector Entity::PointGetNum(void) {
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprVector Entity::PointGetExprs(void) {
|
ExprVector EntityBase::PointGetExprs(void) {
|
||||||
ExprVector r;
|
ExprVector r;
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case POINT_IN_3D:
|
case POINT_IN_3D:
|
||||||
@ -490,7 +480,7 @@ ExprVector Entity::PointGetExprs(void) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::PointGetExprsInWorkplane(hEntity wrkpl, Expr **u, Expr **v) {
|
void EntityBase::PointGetExprsInWorkplane(hEntity wrkpl, Expr **u, Expr **v) {
|
||||||
if(type == POINT_IN_2D && workplane.v == wrkpl.v) {
|
if(type == POINT_IN_2D && workplane.v == wrkpl.v) {
|
||||||
// They want our coordinates in the form that we've written them,
|
// They want our coordinates in the form that we've written them,
|
||||||
// very nice.
|
// very nice.
|
||||||
@ -512,7 +502,7 @@ void Entity::PointGetExprsInWorkplane(hEntity wrkpl, Expr **u, Expr **v) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::PointForceQuaternionTo(Quaternion q) {
|
void EntityBase::PointForceQuaternionTo(Quaternion q) {
|
||||||
if(type != POINT_N_ROT_TRANS) oops();
|
if(type != POINT_N_ROT_TRANS) oops();
|
||||||
|
|
||||||
SS.GetParam(param[3])->val = q.w;
|
SS.GetParam(param[3])->val = q.w;
|
||||||
@ -521,7 +511,7 @@ void Entity::PointForceQuaternionTo(Quaternion q) {
|
|||||||
SS.GetParam(param[6])->val = q.vz;
|
SS.GetParam(param[6])->val = q.vz;
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion Entity::GetAxisAngleQuaternion(int param0) {
|
Quaternion EntityBase::GetAxisAngleQuaternion(int param0) {
|
||||||
Quaternion q;
|
Quaternion q;
|
||||||
double theta = timesApplied*SS.GetParam(param[param0+0])->val;
|
double theta = timesApplied*SS.GetParam(param[param0+0])->val;
|
||||||
double s = sin(theta), c = cos(theta);
|
double s = sin(theta), c = cos(theta);
|
||||||
@ -532,7 +522,7 @@ Quaternion Entity::GetAxisAngleQuaternion(int param0) {
|
|||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprQuaternion Entity::GetAxisAngleQuaternionExprs(int param0) {
|
ExprQuaternion EntityBase::GetAxisAngleQuaternionExprs(int param0) {
|
||||||
ExprQuaternion q;
|
ExprQuaternion q;
|
||||||
|
|
||||||
Expr *theta = Expr::From(timesApplied)->Times(
|
Expr *theta = Expr::From(timesApplied)->Times(
|
||||||
@ -545,7 +535,7 @@ ExprQuaternion Entity::GetAxisAngleQuaternionExprs(int param0) {
|
|||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion Entity::PointGetQuaternion(void) {
|
Quaternion EntityBase::PointGetQuaternion(void) {
|
||||||
Quaternion q;
|
Quaternion q;
|
||||||
|
|
||||||
if(type == POINT_N_ROT_AA) {
|
if(type == POINT_N_ROT_AA) {
|
||||||
@ -557,7 +547,7 @@ Quaternion Entity::PointGetQuaternion(void) {
|
|||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Entity::IsFace(void) {
|
bool EntityBase::IsFace(void) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case FACE_NORMAL_PT:
|
case FACE_NORMAL_PT:
|
||||||
case FACE_XPROD:
|
case FACE_XPROD:
|
||||||
@ -570,7 +560,7 @@ bool Entity::IsFace(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprVector Entity::FaceGetNormalExprs(void) {
|
ExprVector EntityBase::FaceGetNormalExprs(void) {
|
||||||
ExprVector r;
|
ExprVector r;
|
||||||
if(type == FACE_NORMAL_PT) {
|
if(type == FACE_NORMAL_PT) {
|
||||||
Vector v = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
|
Vector v = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
|
||||||
@ -599,7 +589,7 @@ ExprVector Entity::FaceGetNormalExprs(void) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector Entity::FaceGetNormalNum(void) {
|
Vector EntityBase::FaceGetNormalNum(void) {
|
||||||
Vector r;
|
Vector r;
|
||||||
if(type == FACE_NORMAL_PT) {
|
if(type == FACE_NORMAL_PT) {
|
||||||
r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
|
r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
|
||||||
@ -622,7 +612,7 @@ Vector Entity::FaceGetNormalNum(void) {
|
|||||||
return r.WithMagnitude(1);
|
return r.WithMagnitude(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprVector Entity::FaceGetPointExprs(void) {
|
ExprVector EntityBase::FaceGetPointExprs(void) {
|
||||||
ExprVector r;
|
ExprVector r;
|
||||||
if(type == FACE_NORMAL_PT) {
|
if(type == FACE_NORMAL_PT) {
|
||||||
r = SS.GetEntity(point[0])->PointGetExprs();
|
r = SS.GetEntity(point[0])->PointGetExprs();
|
||||||
@ -651,7 +641,7 @@ ExprVector Entity::FaceGetPointExprs(void) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector Entity::FaceGetPointNum(void) {
|
Vector EntityBase::FaceGetPointNum(void) {
|
||||||
Vector r;
|
Vector r;
|
||||||
if(type == FACE_NORMAL_PT) {
|
if(type == FACE_NORMAL_PT) {
|
||||||
r = SS.GetEntity(point[0])->PointGetNum();
|
r = SS.GetEntity(point[0])->PointGetNum();
|
||||||
@ -676,14 +666,14 @@ Vector Entity::FaceGetPointNum(void) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index) {
|
void EntityBase::AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index) {
|
||||||
Equation eq;
|
Equation eq;
|
||||||
eq.e = expr;
|
eq.e = expr;
|
||||||
eq.h = h.equation(index);
|
eq.h = h.equation(index);
|
||||||
l->Add(&eq);
|
l->Add(&eq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::GenerateEquations(IdList<Equation,hEquation> *l) {
|
void EntityBase::GenerateEquations(IdList<Equation,hEquation> *l) {
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case NORMAL_IN_3D: {
|
case NORMAL_IN_3D: {
|
||||||
ExprQuaternion q = NormalGetExprs();
|
ExprQuaternion q = NormalGetExprs();
|
||||||
|
135
sketch.h
135
sketch.h
@ -249,7 +249,7 @@ public:
|
|||||||
char *DescriptionString(void);
|
char *DescriptionString(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
class Entity {
|
class EntityBase {
|
||||||
public:
|
public:
|
||||||
int tag;
|
int tag;
|
||||||
hEntity h;
|
hEntity h;
|
||||||
@ -289,6 +289,9 @@ public:
|
|||||||
|
|
||||||
int type;
|
int type;
|
||||||
|
|
||||||
|
hGroup group;
|
||||||
|
hEntity workplane; // or Entity::FREE_IN_3D
|
||||||
|
|
||||||
// When it comes time to draw an entity, we look here to get the
|
// When it comes time to draw an entity, we look here to get the
|
||||||
// defining variables.
|
// defining variables.
|
||||||
hEntity point[4];
|
hEntity point[4];
|
||||||
@ -303,23 +306,6 @@ public:
|
|||||||
Quaternion numNormal;
|
Quaternion numNormal;
|
||||||
double numDistance;
|
double numDistance;
|
||||||
|
|
||||||
// An imported entity that was hidden in the source file ends up hidden
|
|
||||||
// here too.
|
|
||||||
bool forceHidden;
|
|
||||||
|
|
||||||
// All points/normals/distances have their numerical value; this is
|
|
||||||
// a convenience, to simplify the import/assembly code, so that the
|
|
||||||
// part is entirely described by the entities.
|
|
||||||
Vector actPoint;
|
|
||||||
Quaternion actNormal;
|
|
||||||
double actDistance;
|
|
||||||
// and the shown state also gets saved here, for later import
|
|
||||||
bool actVisible;
|
|
||||||
|
|
||||||
hGroup group;
|
|
||||||
hEntity workplane; // or Entity::FREE_IN_3D
|
|
||||||
|
|
||||||
bool construction;
|
|
||||||
NameStr str;
|
NameStr str;
|
||||||
NameStr font;
|
NameStr font;
|
||||||
|
|
||||||
@ -329,7 +315,6 @@ public:
|
|||||||
|
|
||||||
Quaternion GetAxisAngleQuaternion(int param0);
|
Quaternion GetAxisAngleQuaternion(int param0);
|
||||||
ExprQuaternion GetAxisAngleQuaternionExprs(int param0);
|
ExprQuaternion GetAxisAngleQuaternionExprs(int param0);
|
||||||
bool IsVisible(void);
|
|
||||||
|
|
||||||
bool IsCircle(void);
|
bool IsCircle(void);
|
||||||
Expr *CircleGetRadiusExpr(void);
|
Expr *CircleGetRadiusExpr(void);
|
||||||
@ -383,6 +368,27 @@ public:
|
|||||||
ExprVector NormalExprsV(void);
|
ExprVector NormalExprsV(void);
|
||||||
ExprVector NormalExprsN(void);
|
ExprVector NormalExprsN(void);
|
||||||
|
|
||||||
|
void AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index);
|
||||||
|
void GenerateEquations(IdList<Equation,hEquation> *l);
|
||||||
|
};
|
||||||
|
|
||||||
|
class Entity : public EntityBase {
|
||||||
|
public:
|
||||||
|
// An imported entity that was hidden in the source file ends up hidden
|
||||||
|
// here too.
|
||||||
|
bool forceHidden;
|
||||||
|
|
||||||
|
// All points/normals/distances have their numerical value; this is
|
||||||
|
// a convenience, to simplify the import/assembly code, so that the
|
||||||
|
// part is entirely described by the entities.
|
||||||
|
Vector actPoint;
|
||||||
|
Quaternion actNormal;
|
||||||
|
double actDistance;
|
||||||
|
// and the shown state also gets saved here, for later import
|
||||||
|
bool actVisible;
|
||||||
|
|
||||||
|
bool construction;
|
||||||
|
|
||||||
// Routines to draw and hit-test the representation of the entity
|
// Routines to draw and hit-test the representation of the entity
|
||||||
// on-screen.
|
// on-screen.
|
||||||
struct {
|
struct {
|
||||||
@ -394,6 +400,8 @@ public:
|
|||||||
void LineDrawOrGetDistance(Vector a, Vector b);
|
void LineDrawOrGetDistance(Vector a, Vector b);
|
||||||
void DrawOrGetDistance(void);
|
void DrawOrGetDistance(void);
|
||||||
|
|
||||||
|
bool IsVisible(void);
|
||||||
|
|
||||||
void GenerateBezierCurves(SBezierList *sbl);
|
void GenerateBezierCurves(SBezierList *sbl);
|
||||||
void GenerateEdges(SEdgeList *el, bool includingConstruction=false);
|
void GenerateEdges(SEdgeList *el, bool includingConstruction=false);
|
||||||
|
|
||||||
@ -402,9 +410,6 @@ public:
|
|||||||
double GetDistance(Point2d mp);
|
double GetDistance(Point2d mp);
|
||||||
Vector GetReferencePos(void);
|
Vector GetReferencePos(void);
|
||||||
|
|
||||||
void AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index);
|
|
||||||
void GenerateEquations(IdList<Equation,hEquation> *l);
|
|
||||||
|
|
||||||
void CalculateNumerical(bool forExport);
|
void CalculateNumerical(bool forExport);
|
||||||
|
|
||||||
char *DescriptionString(void);
|
char *DescriptionString(void);
|
||||||
@ -433,8 +438,11 @@ public:
|
|||||||
inline hEquation equation(int i);
|
inline hEquation equation(int i);
|
||||||
};
|
};
|
||||||
|
|
||||||
class Constraint {
|
class ConstraintBase {
|
||||||
public:
|
public:
|
||||||
|
int tag;
|
||||||
|
hConstraint h;
|
||||||
|
|
||||||
static const hConstraint NO_CONSTRAINT;
|
static const hConstraint NO_CONSTRAINT;
|
||||||
|
|
||||||
static const int POINTS_COINCIDENT = 20;
|
static const int POINTS_COINCIDENT = 20;
|
||||||
@ -470,9 +478,6 @@ public:
|
|||||||
|
|
||||||
static const int COMMENT = 1000;
|
static const int COMMENT = 1000;
|
||||||
|
|
||||||
int tag;
|
|
||||||
hConstraint h;
|
|
||||||
|
|
||||||
int type;
|
int type;
|
||||||
|
|
||||||
hGroup group;
|
hGroup group;
|
||||||
@ -489,46 +494,8 @@ public:
|
|||||||
bool other;
|
bool other;
|
||||||
|
|
||||||
bool reference; // a ref dimension, that generates no eqs
|
bool reference; // a ref dimension, that generates no eqs
|
||||||
|
|
||||||
NameStr comment; // since comments are represented as constraints
|
NameStr comment; // since comments are represented as constraints
|
||||||
|
|
||||||
// These define how the constraint is drawn on-screen.
|
|
||||||
struct {
|
|
||||||
Vector offset;
|
|
||||||
} disp;
|
|
||||||
|
|
||||||
char *DescriptionString(void);
|
|
||||||
|
|
||||||
static void AddConstraint(Constraint *c, bool rememberForUndo);
|
|
||||||
static void AddConstraint(Constraint *c);
|
|
||||||
static void MenuConstrain(int id);
|
|
||||||
|
|
||||||
static void DeleteAllConstraintsFor(int type, hEntity entityA, hEntity ptA);
|
|
||||||
|
|
||||||
struct {
|
|
||||||
bool drawing;
|
|
||||||
Point2d mp;
|
|
||||||
double dmin;
|
|
||||||
Vector refp;
|
|
||||||
} dogd; // state for drawing or getting distance (for hit testing)
|
|
||||||
void LineDrawOrGetDistance(Vector a, Vector b);
|
|
||||||
void DrawOrGetDistance(Vector *labelPos);
|
|
||||||
double EllipticalInterpolation(double rx, double ry, double theta);
|
|
||||||
char *Label(void);
|
|
||||||
void DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db,
|
|
||||||
Vector offset, Vector *ref);
|
|
||||||
void DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu);
|
|
||||||
void DoProjectedPoint(Vector *p);
|
|
||||||
void DoEqualLenTicks(Vector a, Vector b, Vector gn);
|
|
||||||
void DoEqualRadiusTicks(hEntity he);
|
|
||||||
|
|
||||||
double GetDistance(Point2d mp);
|
|
||||||
Vector GetLabelPos(void);
|
|
||||||
Vector GetReferencePos(void);
|
|
||||||
void Draw(void);
|
|
||||||
|
|
||||||
bool HasLabel(void);
|
|
||||||
|
|
||||||
void Generate(IdList<Equation,hEquation> *l);
|
void Generate(IdList<Equation,hEquation> *l);
|
||||||
void GenerateReal(IdList<Equation,hEquation> *l);
|
void GenerateReal(IdList<Equation,hEquation> *l);
|
||||||
// Some helpers when generating symbolic constraint equations
|
// Some helpers when generating symbolic constraint equations
|
||||||
@ -540,6 +507,46 @@ public:
|
|||||||
static Expr *PointPlaneDistance(ExprVector p, hEntity plane);
|
static Expr *PointPlaneDistance(ExprVector p, hEntity plane);
|
||||||
static Expr *VectorsParallel(int eq, ExprVector a, ExprVector b);
|
static Expr *VectorsParallel(int eq, ExprVector a, ExprVector b);
|
||||||
static ExprVector PointInThreeSpace(hEntity workplane, Expr *u, Expr *v);
|
static ExprVector PointInThreeSpace(hEntity workplane, Expr *u, Expr *v);
|
||||||
|
};
|
||||||
|
|
||||||
|
class Constraint : public ConstraintBase {
|
||||||
|
public:
|
||||||
|
// These define how the constraint is drawn on-screen.
|
||||||
|
struct {
|
||||||
|
Vector offset;
|
||||||
|
} disp;
|
||||||
|
|
||||||
|
// State for drawing or getting distance (for hit testing).
|
||||||
|
struct {
|
||||||
|
bool drawing;
|
||||||
|
Point2d mp;
|
||||||
|
double dmin;
|
||||||
|
Vector refp;
|
||||||
|
} dogd;
|
||||||
|
|
||||||
|
double GetDistance(Point2d mp);
|
||||||
|
Vector GetLabelPos(void);
|
||||||
|
Vector GetReferencePos(void);
|
||||||
|
void Draw(void);
|
||||||
|
|
||||||
|
void LineDrawOrGetDistance(Vector a, Vector b);
|
||||||
|
void DrawOrGetDistance(Vector *labelPos);
|
||||||
|
double EllipticalInterpolation(double rx, double ry, double theta);
|
||||||
|
char *Label(void);
|
||||||
|
void DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db,
|
||||||
|
Vector offset, Vector *ref);
|
||||||
|
void DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu);
|
||||||
|
void DoProjectedPoint(Vector *p);
|
||||||
|
void DoEqualLenTicks(Vector a, Vector b, Vector gn);
|
||||||
|
void DoEqualRadiusTicks(hEntity he);
|
||||||
|
|
||||||
|
bool HasLabel(void);
|
||||||
|
char *DescriptionString(void);
|
||||||
|
|
||||||
|
static void AddConstraint(Constraint *c, bool rememberForUndo);
|
||||||
|
static void AddConstraint(Constraint *c);
|
||||||
|
static void MenuConstrain(int id);
|
||||||
|
static void DeleteAllConstraintsFor(int type, hEntity entityA, hEntity ptA);
|
||||||
|
|
||||||
static void ConstrainCoincident(hEntity ptA, hEntity ptB);
|
static void ConstrainCoincident(hEntity ptA, hEntity ptB);
|
||||||
static void Constrain(int type, hEntity ptA, hEntity ptB, hEntity entityA);
|
static void Constrain(int type, hEntity ptA, hEntity ptB, hEntity entityA);
|
||||||
|
Loading…
Reference in New Issue
Block a user