diff --git a/constraint.cpp b/constraint.cpp index 63ef565..9556a9e 100644 --- a/constraint.cpp +++ b/constraint.cpp @@ -496,7 +496,7 @@ void Constraint::Generate(IdList *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; } diff --git a/entity.cpp b/entity.cpp index 9e802f0..b713dbb 100644 --- a/entity.cpp +++ b/entity.cpp @@ -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) { diff --git a/polygon.h b/polygon.h index 47eb245..0369f84 100644 --- a/polygon.h +++ b/polygon.h @@ -43,8 +43,8 @@ class SEdgeList { public: SList l; - void InsertEdgeBreaking(SEdge *e); bool AssemblePolygon(SPolygon *dest, SEdge *errorAt); + void BreakEdgesInto(SEdgeList *el); }; class SPoint { diff --git a/sketch.cpp b/sketch.cpp index b3aaf7a..d430c21 100644 --- a/sketch.cpp +++ b/sketch.cpp @@ -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, } void Group::GenerateEquations(IdList *l) { + Equation eq; if(type == ROTATE) { // Normalize the quaternion ExprQuaternion q = { @@ -214,10 +216,25 @@ void Group::GenerateEquations(IdList *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); + } } } diff --git a/sketch.h b/sketch.h index 7ae0f48..92b08d2 100644 --- a/sketch.h +++ b/sketch.h @@ -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;