Fix point-on-circle constraints to work with arcs too, and lock

extrudes normal to workplane if a workplane is active when the
extrusion is created.

[git-p4: depot-paths = "//depot/solvespace/": change = 1724]
This commit is contained in:
Jonathan Westhues 2008-05-15 22:34:06 -08:00
parent 65ea276fa4
commit 2ec23ffa3e
5 changed files with 22 additions and 5 deletions

View File

@ -496,7 +496,7 @@ void Constraint::Generate(IdList<Equation,hEquation> *l) {
case PT_ON_CIRCLE: {
Entity *circle = SS.GetEntity(entityA);
hEntity center = circle->point[0];
Expr *radius = SS.GetEntity(circle->distance)->DistanceGetExpr();
Expr *radius = circle->CircleGetRadiusExpr();
AddEq(l, Distance(workplane, ptA, center)->Minus(radius), 0);
break;
}

View File

@ -73,7 +73,7 @@ Vector Entity::VectorGetRefPoint(void) {
}
bool Entity::IsCircle(void) {
return (type == CIRCLE);
return (type == CIRCLE) || (type == ARC_OF_CIRCLE);
}
Expr *Entity::CircleGetRadiusExpr(void) {

View File

@ -43,8 +43,8 @@ class SEdgeList {
public:
SList<SEdge> l;
void InsertEdgeBreaking(SEdge *e);
bool AssemblePolygon(SPolygon *dest, SEdge *errorAt);
void BreakEdgesInto(SEdgeList *el);
};
class SPoint {

View File

@ -74,6 +74,7 @@ void Group::MenuGroup(int id) {
case GraphicsWindow::MNU_GROUP_EXTRUDE:
g.type = EXTRUDE;
g.opA = SS.GW.activeGroup;
g.wrkpl.entityB = SS.GW.activeWorkplane;
g.name.strcpy("extrude");
break;
@ -207,6 +208,7 @@ void Group::Generate(IdList<Entity,hEntity> *entity,
}
void Group::GenerateEquations(IdList<Equation,hEquation> *l) {
Equation eq;
if(type == ROTATE) {
// Normalize the quaternion
ExprQuaternion q = {
@ -214,10 +216,25 @@ void Group::GenerateEquations(IdList<Equation,hEquation> *l) {
Expr::FromParam(h.param(4)),
Expr::FromParam(h.param(5)),
Expr::FromParam(h.param(6)) };
Equation eq;
eq.e = (q.Magnitude())->Minus(Expr::FromConstant(1));
eq.h = h.equation(0);
l->Add(&eq);
} else if(type == EXTRUDE) {
if(wrkpl.entityB.v != Entity::FREE_IN_3D.v) {
Entity *w = SS.GetEntity(wrkpl.entityB);
ExprVector u = w->Normal()->NormalExprsU();
ExprVector v = w->Normal()->NormalExprsV();
ExprVector extruden = {
Expr::FromParam(h.param(0)),
Expr::FromParam(h.param(1)),
Expr::FromParam(h.param(2)) };
eq.e = u.Dot(extruden);
eq.h = h.equation(0);
l->Add(&eq);
eq.e = v.Dot(extruden);
eq.h = h.equation(1);
l->Add(&eq);
}
}
}

View File

@ -419,7 +419,7 @@ inline hEntity hGroup::entity(int i)
inline hParam hGroup::param(int i)
{ hParam r; r.v = 0x80000000 | (v << 16) | i; return r; }
inline hEquation hGroup::equation(int i)
{ if(i != 0) oops(); hEquation r; r.v = v | 0x80000000; return r; }
{ hEquation r; r.v = (v << 16) | 0x80000000 | i; return r; }
inline bool hRequest::IsFromReferences(void) {
if(v == Request::HREQUEST_REFERENCE_XY.v) return true;