diff --git a/CMakeLists.txt b/CMakeLists.txt index 1df0baf..cbf348a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,10 @@ if(MSVC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Dinline=__inline") # Same for the (C99) __func__ special variable; we use it only in C++ code. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D__func__=__FUNCTION__") + + # We rely on these /we flags. They correspond to the GNU-style flags below as + # follows: /w4062=-Wswitch + set(WARNING_FLAGS "${WARNING_FLAGS} /we4062") endif() if(CMAKE_CXX_COMPILER_ID STREQUAL GNU) @@ -65,8 +69,8 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang) if(CMAKE_CXX_COMPILER_ID STREQUAL Clang) set(WARNING_FLAGS "${WARNING_FLAGS} -Wfloat-conversion") endif() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${WARNING_FLAGS}") + # We rely on these -Werror flags. + set(WARNING_FLAGS "${WARNING_FLAGS} -Werror=switch") endif() if(MINGW) @@ -97,6 +101,9 @@ if(SANITIZE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZE_FLAGS}") endif() +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS}") + # dependencies find_package(OpenGL REQUIRED) diff --git a/src/bsp.cpp b/src/bsp.cpp index 91bc1bf..c2da77f 100644 --- a/src/bsp.cpp +++ b/src/bsp.cpp @@ -104,7 +104,6 @@ void SBsp3::InsertHow(BspClass how, STriangle *tr, SMesh *instead) { more = m; break; } - default: ssassert(false, "Unexpected BSP insert type"); } return; diff --git a/src/constraint.cpp b/src/constraint.cpp index 8452a38..7327f1b 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -373,6 +373,7 @@ void Constraint::MenuConstrain(Command id) { c.entityA = gs.entity[0]; c.ptA = gs.point[0]; c.ptB = gs.point[1]; + c.type = Type::SYMMETRIC; } else if(gs.lineSegments == 1 && ((gs.workplanes == 1 && gs.n == 2) || (gs.n == 1))) @@ -382,6 +383,7 @@ void Constraint::MenuConstrain(Command id) { c.entityA = gs.entity[1-i]; c.ptA = line->point[0]; c.ptB = line->point[1]; + c.type = Type::SYMMETRIC; } else if(SS.GW.LockedInWorkplane() && gs.lineSegments == 2 && gs.n == 2) { @@ -415,9 +417,7 @@ void Constraint::MenuConstrain(Command id) { "(symmetric about workplane)\n"); return; } - if(c.type != Type::UNKNOWN) { - // Already done, symmetry about a line segment in a workplane - } else if(c.entityA.v == Entity::NO_ENTITY.v) { + if(c.entityA.v == Entity::NO_ENTITY.v) { // Horizontal / vertical symmetry, implicit symmetry plane // normal to the workplane if(c.workplane.v == Entity::FREE_IN_3D.v) { @@ -442,11 +442,7 @@ void Constraint::MenuConstrain(Command id) { Entity::NO_ENTITY); DeleteAllConstraintsFor(Type::VERTICAL, (gs.entity[0]), Entity::NO_ENTITY); - } - } else { - // Symmetry with a symmetry plane specified explicitly. - c.type = Type::SYMMETRIC; } AddConstraint(&c); break; diff --git a/src/constrainteq.cpp b/src/constrainteq.cpp index d574d45..41c0300 100644 --- a/src/constrainteq.cpp +++ b/src/constrainteq.cpp @@ -212,7 +212,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { switch(type) { case Type::PT_PT_DISTANCE: AddEq(l, Distance(workplane, ptA, ptB)->Minus(exA), 0); - break; + return; case Type::PROJ_PT_DISTANCE: { ExprVector pA = SK.GetEntity(ptA)->PointGetExprs(), @@ -223,18 +223,18 @@ void ConstraintBase::GenerateReal(IdList *l) const { pp = pp.WithMagnitude(Expr::From(1.0)); AddEq(l, (dp.Dot(pp))->Minus(exA), 0); - break; + return; } case Type::PT_LINE_DISTANCE: AddEq(l, PointLineDistance(workplane, ptA, entityA)->Minus(exA), 0); - break; + return; case Type::PT_PLANE_DISTANCE: { ExprVector pt = SK.GetEntity(ptA)->PointGetExprs(); AddEq(l, (PointPlaneDistance(pt, entityA))->Minus(exA), 0); - break; + return; } case Type::PT_FACE_DISTANCE: { @@ -243,7 +243,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { ExprVector p0 = f->FaceGetPointExprs(); ExprVector n = f->FaceGetNormalExprs(); AddEq(l, (pt.Minus(p0)).Dot(n)->Minus(exA), 0); - break; + return; } case Type::EQUAL_LENGTH_LINES: { @@ -251,7 +251,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { EntityBase *b = SK.GetEntity(entityB); AddEq(l, Distance(workplane, a->point[0], a->point[1])->Minus( Distance(workplane, b->point[0], b->point[1])), 0); - break; + return; } // These work on distance squared, since the pt-line distances are @@ -261,13 +261,13 @@ void ConstraintBase::GenerateReal(IdList *l) const { Expr *d1 = Distance(workplane, forLen->point[0], forLen->point[1]); Expr *d2 = PointLineDistance(workplane, ptA, entityB); AddEq(l, (d1->Square())->Minus(d2->Square()), 0); - break; + return; } case Type::EQ_PT_LN_DISTANCES: { Expr *d1 = PointLineDistance(workplane, ptA, entityA); Expr *d2 = PointLineDistance(workplane, ptB, entityB); AddEq(l, (d1->Square())->Minus(d2->Square()), 0); - break; + return; } case Type::LENGTH_RATIO: { @@ -276,7 +276,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { Expr *la = Distance(workplane, a->point[0], a->point[1]); Expr *lb = Distance(workplane, b->point[0], b->point[1]); AddEq(l, (la->Div(lb))->Minus(exA), 0); - break; + return; } case Type::LENGTH_DIFFERENCE: { @@ -285,14 +285,14 @@ void ConstraintBase::GenerateReal(IdList *l) const { Expr *la = Distance(workplane, a->point[0], a->point[1]); Expr *lb = Distance(workplane, b->point[0], b->point[1]); AddEq(l, (la->Minus(lb))->Minus(exA), 0); - break; + return; } case Type::DIAMETER: { EntityBase *circle = SK.GetEntity(entityA); Expr *r = circle->CircleGetRadiusExpr(); AddEq(l, (r->Times(Expr::From(2)))->Minus(exA), 0); - break; + return; } case Type::EQUAL_RADIUS: { @@ -300,7 +300,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { EntityBase *c2 = SK.GetEntity(entityB); AddEq(l, (c1->CircleGetRadiusExpr())->Minus( c2->CircleGetRadiusExpr()), 0); - break; + return; } case Type::EQUAL_LINE_ARC_LEN: { @@ -343,7 +343,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { // And write the equation; r*theta = L AddEq(l, (r->Times(theta))->Minus(ll), 0); - break; + return; } case Type::POINTS_COINCIDENT: { @@ -363,14 +363,14 @@ void ConstraintBase::GenerateReal(IdList *l) const { AddEq(l, au->Minus(bu), 0); AddEq(l, av->Minus(bv), 1); } - break; + return; } case Type::PT_IN_PLANE: // This one works the same, whether projected or not. AddEq(l, PointPlaneDistance( SK.GetEntity(ptA)->PointGetExprs(), entityA), 0); - break; + return; case Type::PT_ON_FACE: { // a plane, n dot (p - p0) = 0 @@ -379,7 +379,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { ExprVector p0 = f->FaceGetPointExprs(); ExprVector n = f->FaceGetNormalExprs(); AddEq(l, (p.Minus(p0)).Dot(n), 0); - break; + return; } case Type::PT_ON_LINE: @@ -412,7 +412,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { } else { AddEq(l, PointLineDistance(workplane, ptA, entityA), 0); } - break; + return; case Type::PT_ON_CIRCLE: { // This actually constrains the point to lie on the cylinder. @@ -430,7 +430,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { AddEq(l, ((du->Square())->Plus(dv->Square()))->Minus(r->Square()), 0); - break; + return; } case Type::AT_MIDPOINT: @@ -470,7 +470,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { AddEq(l, PointPlaneDistance(m, entityB), 0); } } - break; + return; case Type::SYMMETRIC: if(workplane.v == EntityBase::FREE_IN_3D.v) { @@ -521,7 +521,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { plane->WorkplaneGetPlaneExprs(&n, &d); AddEq(l, (n.Cross(u.Cross(v))).Dot(pa.Minus(pb)), 1); } - break; + return; case Type::SYMMETRIC_HORIZ: case Type::SYMMETRIC_VERT: { @@ -539,7 +539,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { AddEq(l, au->Minus(bu), 0); AddEq(l, av->Plus(bv), 1); } - break; + return; } case Type::SYMMETRIC_LINE: { @@ -572,7 +572,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { (dlu->Times(lav->Minus(pbv)))); AddEq(l, dista->Plus(distb), 1); - break; + return; } case Type::HORIZONTAL: @@ -594,7 +594,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { b->PointGetExprsInWorkplane(workplane, &bu, &bv); AddEq(l, (type == Type::HORIZONTAL) ? av->Minus(bv) : au->Minus(bu), 0); - break; + return; } case Type::SAME_ORIENTATION: { @@ -621,7 +621,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { } else { AddEq(l, d2, 2); } - break; + return; } case Type::PERPENDICULAR: @@ -650,7 +650,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { // is equal to zero, perpendicular. AddEq(l, c, 0); } - break; + return; } case Type::EQUAL_ANGLE: { @@ -669,7 +669,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { Expr *ccd = DirectionCosine(workplane, ce, de); AddEq(l, cab->Minus(ccd), 0); - break; + return; } case Type::ARC_LINE_TANGENT: { @@ -684,7 +684,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { // The line is perpendicular to the radius AddEq(l, ld.Dot(ac.Minus(ap)), 0); - break; + return; } case Type::CUBIC_LINE_TANGENT: { @@ -708,7 +708,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { ExprVector wn = w->Normal()->NormalExprsN(); AddEq(l, (a.Cross(b)).Dot(wn), 0); } - break; + return; } case Type::CURVE_CURVE_TANGENT: { @@ -746,7 +746,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { } else { AddEq(l, (dir[0]).Dot(dir[1]), 0); } - break; + return; } case Type::PARALLEL: { @@ -765,7 +765,7 @@ void ConstraintBase::GenerateReal(IdList *l) const { ExprVector wn = w->Normal()->NormalExprsN(); AddEq(l, (a.Cross(b)).Dot(wn), 0); } - break; + return; } case Type::WHERE_DRAGGED: { @@ -783,13 +783,12 @@ void ConstraintBase::GenerateReal(IdList *l) const { AddEq(l, u->Minus(Expr::From(u->Eval())), 0); AddEq(l, v->Minus(Expr::From(v->Eval())), 1); } - break; + return; } case Type::COMMENT: - break; - - default: ssassert(false, "Unexpected constraint ID"); + return; } + ssassert(false, "Unexpected constraint ID"); } diff --git a/src/draw.cpp b/src/draw.cpp index cb8fb2c..e4eb907 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -271,7 +271,9 @@ void GraphicsWindow::GroupSelection() { (gs.arcs)++; break; - case Entity::Type::CIRCLE: (gs.circlesOrArcs)++; break; + case Entity::Type::CIRCLE: (gs.circlesOrArcs)++; break; + + default: break; } } if(s->constraint.v) { @@ -680,21 +682,20 @@ nogrid:; // Draw the "pending" constraint, i.e. a constraint that would be // placed on a line that is almost horizontal or vertical - if(SS.GW.pending.operation == Pending::DRAGGING_NEW_LINE_POINT) { - if(SS.GW.pending.suggestion != Constraint::Type::UNKNOWN) { - Constraint c = {}; - c.group = SS.GW.activeGroup; - c.workplane = SS.GW.ActiveWorkplane(); - c.type = SS.GW.pending.suggestion; - c.ptA = Entity::NO_ENTITY; - c.ptB = Entity::NO_ENTITY; - c.entityA = SS.GW.pending.request.entity(0); - c.entityB = Entity::NO_ENTITY; - c.other = false; - c.other2 = false; - // Only draw. - c.Draw(); - } + if(SS.GW.pending.operation == Pending::DRAGGING_NEW_LINE_POINT && + SS.GW.pending.hasSuggestion) { + Constraint c = {}; + c.group = SS.GW.activeGroup; + c.workplane = SS.GW.ActiveWorkplane(); + c.type = SS.GW.pending.suggestion; + c.ptA = Entity::NO_ENTITY; + c.ptB = Entity::NO_ENTITY; + c.entityA = SS.GW.pending.request.entity(0); + c.entityB = Entity::NO_ENTITY; + c.other = false; + c.other2 = false; + // Only draw. + c.Draw(); } // Draw the traced path, if one exists diff --git a/src/drawconstraint.cpp b/src/drawconstraint.cpp index af3e1b0..3fffe7b 100644 --- a/src/drawconstraint.cpp +++ b/src/drawconstraint.cpp @@ -536,7 +536,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { DoLineWithArrows(ref, ap, bp, false); DoLabel(ref, labelPos, gr, gu); - break; + return; } case Type::PROJ_PT_DISTANCE: { @@ -556,7 +556,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { DoLineWithArrows(ref, ap, bpp, false); DoLabel(ref, labelPos, gr, gu); - break; + return; } case Type::PT_FACE_DISTANCE: @@ -583,7 +583,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { } DoLabel(ref, labelPos, gr, gu); - break; + return; } case Type::PT_LINE_DISTANCE: { @@ -635,7 +635,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { Vector c2 = (lA.ScaledBy(1-t)).Plus(lB.ScaledBy(t)); DoProjectedPoint(&c2); } - break; + return; } case Type::DIAMETER: { @@ -657,7 +657,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { Vector topLeft; DoLabel(ref, &topLeft, gr, gu); if(labelPos) *labelPos = topLeft; - break; + return; } case Type::POINTS_COINCIDENT: { @@ -671,7 +671,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { // constraint cannot be selected. But that's okay. dogd.dmin = min(dogd.dmin, pp.DistanceTo(dogd.mp) - 3); } - break; + return; } if(dogd.drawing) { @@ -704,7 +704,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { } } - break; + return; } case Type::PT_ON_CIRCLE: @@ -733,7 +733,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { LineDrawOrGetDistance(p.Plus (r).Minus(d), p.Minus(r).Minus(d)); LineDrawOrGetDistance(p.Minus(r).Minus(d), p.Minus(r).Plus (d)); LineDrawOrGetDistance(p.Minus(r).Plus (d), p.Plus (r).Plus (d)); - break; + return; } case Type::WHERE_DRAGGED: { @@ -753,7 +753,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { ur = ur.RotatedAbout(p, gn, PI/2); uu = uu.RotatedAbout(p, gn, PI/2); } - break; + return; } case Type::SAME_ORIENTATION: { @@ -769,7 +769,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { LineDrawOrGetDistance(p.Plus(u), p.Minus(u).Plus(n)); LineDrawOrGetDistance(p.Minus(u), p.Plus(u).Plus(n)); } - break; + return; } case Type::EQUAL_ANGLE: { @@ -800,7 +800,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { dc.WithMagnitude(40/SS.GW.scale), &ref, /*trim=*/false); if(refps) refps[1] = ref; - break; + return; } case Type::ANGLE: { @@ -820,7 +820,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { DoArcForAngle(a0, da, b0, db, disp.offset, &ref, /*trim=*/true); DoLabel(ref, labelPos, gr, gu); if(refps) refps[0] = refps[1] = ref; - break; + return; } case Type::PERPENDICULAR: { @@ -859,7 +859,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { LineDrawOrGetDistance(m, m.Plus(u)); if(refps) refps[i] = m; } - break; + return; } case Type::CURVE_CURVE_TANGENT: @@ -937,7 +937,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { Point2d ref = SS.GW.ProjectPoint(textAt); dogd.dmin = min(dogd.dmin, ref.DistanceTo(dogd.mp)-10); } - break; + return; } case Type::PARALLEL: { @@ -952,7 +952,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { LineDrawOrGetDistance(p.Minus(u), p.Minus(u).Plus(n)); if(refps) refps[i] = p.Plus(n.ScaledBy(0.5)); } - break; + return; } case Type::EQUAL_RADIUS: { @@ -961,7 +961,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { DoEqualRadiusTicks(i == 0 ? entityA : entityB, &ref); if(refps) refps[i] = ref; } - break; + return; } case Type::EQUAL_LINE_ARC_LEN: { @@ -976,7 +976,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { refps[0] = refa; refps[1] = refb; } - break; + return; } case Type::LENGTH_RATIO: @@ -1001,7 +1001,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { Vector ref = ((a.Plus(b)).ScaledBy(0.5)).Plus(disp.offset); DoLabel(ref, labelPos, gr, gu); } - break; + return; } case Type::EQ_LEN_PT_LINE_D: { @@ -1031,7 +1031,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { Vector refb; DoEqualLenTicks(pt, closest, gn, &refb); if(refps) refps[1] = refb; - break; + return; } case Type::EQ_PT_LN_DISTANCES: { @@ -1055,7 +1055,7 @@ void Constraint::DrawOrGetDistance(Vector *labelPos, Vector *refps) { DoEqualLenTicks(pt, closest, gn, &ref); if(refps) refps[i] = ref; } - break; + return; } { @@ -1099,7 +1099,7 @@ s: LineDrawOrGetDistance(tip, tip.Minus(d.RotatedAbout(gn, 0.6))); LineDrawOrGetDistance(tip, tip.Minus(d.RotatedAbout(gn, -0.6))); } - break; + return; } case Type::AT_MIDPOINT: @@ -1173,7 +1173,7 @@ s: } } } - break; + return; case Type::COMMENT: { if(dogd.drawing && disp.style.v) { @@ -1191,11 +1191,10 @@ s: } if(refps) refps[0] = refps[1] = disp.offset; DoLabel(disp.offset, labelPos, u, v); - break; + return; } - - default: ssassert(false, "Unexpected constraint type"); } + ssassert(false, "Unexpected constraint type"); } void Constraint::Draw() { diff --git a/src/drawentity.cpp b/src/drawentity.cpp index 88a1c4f..f8ffc36 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -223,8 +223,17 @@ Vector Entity::GetReferencePos() { return b.Plus(a.Minus(b).ScaledBy(0.5)); } - default: ssassert(false, "Unexpected entity type"); + case Type::DISTANCE: + case Type::DISTANCE_N_COPY: + case Type::FACE_NORMAL_PT: + case Type::FACE_XPROD: + case Type::FACE_N_ROT_TRANS: + case Type::FACE_N_TRANS: + case Type::FACE_N_ROT_AA: + case Type::WORKPLANE: + break; } + ssassert(false, "Unexpected entity type"); } bool Entity::IsStylable() const { @@ -574,7 +583,7 @@ void Entity::DrawOrGetDistance() { Point2d pp = SS.GW.ProjectPoint(v); dogd.dmin = pp.DistanceTo(dogd.mp) - 6; } - break; + return; } case Type::NORMAL_N_COPY: @@ -643,13 +652,13 @@ void Entity::DrawOrGetDistance() { } if(dogd.drawing) ssglDepthRangeLockToFront(false); - break; + return; } case Type::DISTANCE: case Type::DISTANCE_N_COPY: // These are used only as data structures, nothing to display. - break; + return; case Type::WORKPLANE: { Vector p; @@ -703,7 +712,7 @@ void Entity::DrawOrGetDistance() { // the plane. dogd.dmin += 3; } - break; + return; } case Type::LINE_SEGMENT: @@ -711,9 +720,17 @@ void Entity::DrawOrGetDistance() { case Type::ARC_OF_CIRCLE: case Type::CUBIC: case Type::CUBIC_PERIODIC: - case Type::TTF_TEXT: - // Nothing but the curve(s). - break; + case Type::TTF_TEXT: { + // Nothing but the curves; generate the rational polynomial curves for + // everything, then piecewise linearize them, and display those. + SEdgeList *sel = GetOrGenerateEdges(); + dogd.data = -1; + for(int i = 0; i < sel->l.n; i++) { + SEdge *se = &(sel->l.elem[i]); + LineDrawOrGetDistance(se->a, se->b, true, se->auxB); + } + return; + } case Type::FACE_NORMAL_PT: case Type::FACE_XPROD: @@ -721,18 +738,8 @@ void Entity::DrawOrGetDistance() { case Type::FACE_N_TRANS: case Type::FACE_N_ROT_AA: // Do nothing; these are drawn with the triangle mesh - break; - - default: ssassert(false, "Unexpected entity type"); - } - - // And draw the curves; generate the rational polynomial curves for - // everything, then piecewise linearize them, and display those. - SEdgeList *sel = GetOrGenerateEdges(); - dogd.data = -1; - for(int i = 0; i < sel->l.n; i++) { - SEdge *se = &(sel->l.elem[i]); - LineDrawOrGetDistance(se->a, se->b, true, se->auxB); + return; } + ssassert(false, "Unexpected entity type"); } diff --git a/src/entity.cpp b/src/entity.cpp index 9c50e1a..3a48ed3 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -780,7 +780,7 @@ void EntityBase::GenerateEquations(IdList *l) const { AddEq(l, ra->Minus(rb), 0); break; } - default:; - // Most entities do not generate equations. + default: // Most entities do not generate equations. + break; } } diff --git a/src/exportvector.cpp b/src/exportvector.cpp index 176aebd..822e9ed 100644 --- a/src/exportvector.cpp +++ b/src/exportvector.cpp @@ -230,6 +230,10 @@ public: type.path.push_back(0.0); type.path.push_back(-sw); break; + + case StipplePattern::FREEHAND: + case StipplePattern::ZIGZAG: + ssassert(false, "Freehand and zigzag export not implemented"); } dxf->writeLineType(&type); } @@ -419,6 +423,10 @@ public: st->textAngle, st->textOrigin, c->GetStyle()); break; } + + default: + // Other types of constraints do not have a DXF dimension equivalent. + break; } } } @@ -697,6 +705,9 @@ bool DxfFileWriter::NeedToOutput(Constraint *c) { case Constraint::Type::ANGLE: case Constraint::Type::COMMENT: return c->IsVisible(); + + default: // See writeEntities(). + break; } return false; } @@ -731,8 +742,6 @@ static std::string MakeStipplePattern(StipplePattern pattern, double scale, char std::string result; switch(pattern) { case StipplePattern::CONTINUOUS: - case StipplePattern::FREEHAND: - case StipplePattern::ZIGZAG: return ""; case StipplePattern::DASH: @@ -754,7 +763,9 @@ static std::string MakeStipplePattern(StipplePattern pattern, double scale, char result = ssprintf("%.3f_%.3f", scale * 2.0, scale * 0.5); break; - default: ssassert(false, "Unexpected stipple pattern"); + case StipplePattern::FREEHAND: + case StipplePattern::ZIGZAG: + ssassert(false, "Freehand and zigzag export not implemented"); } std::replace(result.begin(), result.end(), '_', delimiter); return result; diff --git a/src/expr.cpp b/src/expr.cpp index e7418ea..79560c8 100644 --- a/src/expr.cpp +++ b/src/expr.cpp @@ -284,8 +284,13 @@ int Expr::Children() const { case Op::ACOS: return 1; - default: ssassert(false, "Unexpected operation"); + case Op::PAREN: + case Op::BINARY_OP: + case Op::UNARY_OP: + case Op::ALL_RESOLVED: + break; } + ssassert(false, "Unexpected operation"); } int Expr::Nodes() const { @@ -353,8 +358,13 @@ double Expr::Eval() const { case Op::ACOS: return acos(a->Eval()); case Op::ASIN: return asin(a->Eval()); - default: ssassert(false, "Unexpected operation"); + case Op::PAREN: + case Op::BINARY_OP: + case Op::UNARY_OP: + case Op::ALL_RESOLVED: + break; } + ssassert(false, "Unexpected operation"); } Expr *Expr::PartialWrt(hParam p) const { @@ -396,8 +406,13 @@ Expr *Expr::PartialWrt(hParam p) const { return (From(-1)->Div((From(1)->Minus(a->Square()))->Sqrt())) ->Times(a->PartialWrt(p)); - default: ssassert(false, "Unexpected operation"); + case Op::PAREN: + case Op::BINARY_OP: + case Op::UNARY_OP: + case Op::ALL_RESOLVED: + break; } + ssassert(false, "Unexpected operation"); } uint64_t Expr::ParamsUsed() const { @@ -487,7 +502,11 @@ Expr *Expr::FoldConstants() { } break; - default: ssassert(false, "Unexpected operation"); + case Op::PAREN: + case Op::BINARY_OP: + case Op::UNARY_OP: + case Op::ALL_RESOLVED: + ssassert(false, "Unexpected operation"); } return n; } @@ -547,7 +566,6 @@ hParam Expr::ReferencedParams(ParamList *pl) const { //----------------------------------------------------------------------------- std::string Expr::Print() const { - char c; switch(op) { case Op::PARAM: return ssprintf("param(%08x)", parh.v); @@ -571,8 +589,13 @@ p: case Op::ASIN: return "(asin " + a->Print() + ")"; case Op::ACOS: return "(acos " + a->Print() + ")"; - default: ssassert(false, "Unexpected operation"); + case Op::PAREN: + case Op::BINARY_OP: + case Op::UNARY_OP: + case Op::ALL_RESOLVED: + break; } + ssassert(false, "Unexpected operation"); } diff --git a/src/generate.cpp b/src/generate.cpp index f868578..65bd2cc 100644 --- a/src/generate.cpp +++ b/src/generate.cpp @@ -198,8 +198,6 @@ void SolveSpaceUI::GenerateAll(Generate type, bool andFindFree, bool genForBBox) last = i; break; } - - default: ssassert(false, "Unexpected generation mode"); } // If we're generating entities for display, first we need to find @@ -458,6 +456,9 @@ void SolveSpaceUI::MarkDraggedParams() { sys.dragged.Add(&(pt->param[0])); sys.dragged.Add(&(pt->param[1])); break; + + default: // Only the entities above can be dragged. + break; } } } @@ -469,6 +470,9 @@ void SolveSpaceUI::MarkDraggedParams() { case Entity::Type::DISTANCE: sys.dragged.Add(&(dist->param[0])); break; + + default: // Only the entities above can be dragged. + break; } } } @@ -482,7 +486,9 @@ void SolveSpaceUI::MarkDraggedParams() { sys.dragged.Add(&(norm->param[2])); sys.dragged.Add(&(norm->param[3])); break; - // other types are locked, so not draggable + + default: // Only the entities above can be dragged. + break; } } } diff --git a/src/glhelper.cpp b/src/glhelper.cpp index e750aa5..67a4a66 100644 --- a/src/glhelper.cpp +++ b/src/glhelper.cpp @@ -127,7 +127,6 @@ void ssglStippledLine(Vector a, Vector b, double width, case StipplePattern::DOT: stipplePattern = "."; break; case StipplePattern::FREEHAND: stipplePattern = "~"; break; case StipplePattern::ZIGZAG: stipplePattern = "~__"; break; - default: ssassert(false, "Unexpected stipple pattern"); } ssglStippledLine(a, b, width, stipplePattern, stippleScale, maybeFat); } diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 23ae071..ede37e6 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -1063,7 +1063,7 @@ void GraphicsWindow::ToggleBool(bool *v) { SS.ScheduleShowTW(); } -Constraint::Type GraphicsWindow::SuggestLineConstraint(hRequest request) { +bool GraphicsWindow::SuggestLineConstraint(hRequest request, Constraint::Type *type) { if(LockedInWorkplane()) { Entity *ptA = SK.GetEntity(request.entity(1)), *ptB = SK.GetEntity(request.entity(2)); @@ -1077,13 +1077,13 @@ Constraint::Type GraphicsWindow::SuggestLineConstraint(hRequest request) { double dv = av->Minus(bv)->Eval(); const double TOLERANCE_RATIO = 0.02; - if(fabs(dv) > LENGTH_EPS && fabs(du / dv) < TOLERANCE_RATIO) - return Constraint::Type::VERTICAL; - else if(fabs(du) > LENGTH_EPS && fabs(dv / du) < TOLERANCE_RATIO) - return Constraint::Type::HORIZONTAL; - else - return Constraint::Type::UNKNOWN; - } else { - return Constraint::Type::UNKNOWN; + if(fabs(dv) > LENGTH_EPS && fabs(du / dv) < TOLERANCE_RATIO) { + *type = Constraint::Type::VERTICAL; + return true; + } else if(fabs(du) > LENGTH_EPS && fabs(dv / du) < TOLERANCE_RATIO) { + *type = Constraint::Type::HORIZONTAL; + return true; + } } + return false; } diff --git a/src/group.cpp b/src/group.cpp index 5256c44..6b38de1 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -346,7 +346,7 @@ void Group::Generate(IdList *entity, int a, i; switch(type) { case Type::DRAWING_3D: - break; + return; case Type::DRAWING_WORKPLANE: { Quaternion q; @@ -388,7 +388,7 @@ void Group::Generate(IdList *entity, wp.group = h; wp.h = h.entity(0); entity->Add(&wp); - break; + return; } case Type::EXTRUDE: { @@ -428,7 +428,7 @@ void Group::Generate(IdList *entity, // Remapped versions of that arbitrary point will be used to // provide points on the plane faces. MakeExtrusionTopBottomFaces(entity, pt); - break; + return; } case Type::LATHE: { @@ -469,7 +469,7 @@ void Group::Generate(IdList *entity, MakeLatheCircles(entity, param, he, axis_pos, axis_dir, ai); ai++; } - break; + return; } case Type::TRANSLATE: { @@ -497,7 +497,7 @@ void Group::Generate(IdList *entity, true, false); } } - break; + return; } case Type::ROTATE: { // The center of rotation @@ -529,7 +529,7 @@ void Group::Generate(IdList *entity, false, true); } } - break; + return; } case Type::LINKED: // The translation vector @@ -549,10 +549,9 @@ void Group::Generate(IdList *entity, h.param(3), h.param(4), h.param(5), h.param(6), false, false); } - break; - - default: ssassert(false, "Unexpected group type"); + return; } + ssassert(false, "Unexpected group type"); } bool Group::IsSolvedOkay() { diff --git a/src/groupmesh.cpp b/src/groupmesh.cpp index 10abd40..15ead43 100644 --- a/src/groupmesh.cpp +++ b/src/groupmesh.cpp @@ -446,8 +446,10 @@ bool Group::IsMeshGroup() { case Group::Type::ROTATE: case Group::Type::TRANSLATE: return true; + + default: + return false; } - return false; } void Group::DrawDisplayItems(Group::Type t) { diff --git a/src/importdxf.cpp b/src/importdxf.cpp index 4dc4126..24f7a3c 100644 --- a/src/importdxf.cpp +++ b/src/importdxf.cpp @@ -493,14 +493,16 @@ public: processPoint(hr.entity(2)); if(constrainHV) { - Constraint::Type cType = Constraint::Type::UNKNOWN; + bool hasConstraint = false; + Constraint::Type cType; if(fabs(p0.x - p1.x) < LENGTH_EPS) { + hasConstraint = true; cType = Constraint::Type::VERTICAL; - } - else if(fabs(p0.y - p1.y) < LENGTH_EPS) { + } else if(fabs(p0.y - p1.y) < LENGTH_EPS) { + hasConstraint = true; cType = Constraint::Type::HORIZONTAL; } - if(cType != Constraint::Type::UNKNOWN) { + if(hasConstraint) { Constraint::Constrain( cType, Entity::NO_ENTITY, diff --git a/src/lib.cpp b/src/lib.cpp index 7041a2d..8cb75d4 100644 --- a/src/lib.cpp +++ b/src/lib.cpp @@ -228,8 +228,6 @@ default: dbp("bad constraint type %d", sc->type); return; case SolveResult::TOO_MANY_UNKNOWNS: ssys->result = SLVS_RESULT_TOO_MANY_UNKNOWNS; break; - - default: ssassert(false, "Unexpected solver result"); } // Write the new parameter values back to our caller. diff --git a/src/mesh.cpp b/src/mesh.cpp index 4212fd7..2aca565 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -1013,8 +1013,6 @@ void SKdNode::MakeCertainEdgesInto(SEdgeList *sel, EdgeKind how, bool coplanarIs } } break; - - default: ssassert(false, "Unexpected edge class"); } cnt++; diff --git a/src/mouse.cpp b/src/mouse.cpp index 466ebab..fbb18f4 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -276,15 +276,15 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, UpdateDraggedNum(&(c->disp.offset), x, y); orig.mouse = mp; InvalidateGraphics(); - break; + return; } case Pending::DRAGGING_NEW_LINE_POINT: if(!ctrlDown) { - SS.GW.pending.suggestion = - SS.GW.SuggestLineConstraint(SS.GW.pending.request); + SS.GW.pending.hasSuggestion = + SS.GW.SuggestLineConstraint(SS.GW.pending.request, &SS.GW.pending.suggestion); } else { - SS.GW.pending.suggestion = Constraint::Type::UNKNOWN; + SS.GW.pending.hasSuggestion = false; } case Pending::DRAGGING_NEW_POINT: UpdateDraggedPoint(pending.point, x, y); @@ -453,17 +453,14 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, case Pending::DRAGGING_MARQUEE: orig.mouse = mp; InvalidateGraphics(); - break; + return; - default: ssassert(false, "Unexpected pending operation"); + case Pending::NONE: + case Pending::COMMAND: + ssassert(false, "Unexpected pending operation"); } - if(pending.operation != Pending::NONE && - pending.operation != Pending::DRAGGING_CONSTRAINT && - pending.operation != Pending::DRAGGING_MARQUEE) - { - SS.GenerateAll(); - } + SS.GenerateAll(); } void GraphicsWindow::ClearPending() { @@ -511,11 +508,9 @@ void GraphicsWindow::MouseRightUp(double x, double y) { if(context.active) return; - if(pending.operation == Pending::DRAGGING_NEW_LINE_POINT) { - if(SS.GW.pending.suggestion != Constraint::Type::UNKNOWN) { - Constraint::Constrain(SS.GW.pending.suggestion, - Entity::NO_ENTITY, Entity::NO_ENTITY, pending.request.entity(0)); - } + if(pending.operation == Pending::DRAGGING_NEW_LINE_POINT && pending.hasSuggestion) { + Constraint::Constrain(SS.GW.pending.suggestion, + Entity::NO_ENTITY, Entity::NO_ENTITY, pending.request.entity(0)); } if(pending.operation == Pending::DRAGGING_NEW_LINE_POINT || @@ -1134,7 +1129,7 @@ void GraphicsWindow::MouseLeftDown(double mx, double my) { case Pending::DRAGGING_NEW_LINE_POINT: { // Constrain the line segment horizontal or vertical if close enough - if(SS.GW.pending.suggestion != Constraint::Type::UNKNOWN) { + if(SS.GW.pending.hasSuggestion) { Constraint::Constrain(SS.GW.pending.suggestion, Entity::NO_ENTITY, Entity::NO_ENTITY, pending.request.entity(0)); } diff --git a/src/request.cpp b/src/request.cpp index 9f458b9..f9b9e92 100644 --- a/src/request.cpp +++ b/src/request.cpp @@ -13,20 +13,20 @@ const hRequest Request::HREQUEST_REFERENCE_YZ = { 2 }; const hRequest Request::HREQUEST_REFERENCE_ZX = { 3 }; const EntReqTable::TableEntry EntReqTable::Table[] = { -// request type entity type pts xtra? norml dist description +// request type entity type pts xtra? norml dist description { Request::Type::WORKPLANE, Entity::Type::WORKPLANE, 1, false, true, false, "workplane" }, -{ Request::Type::DATUM_POINT, Entity::Type::DATUM_POINT, 1, false, false, false, "datum-point" }, +{ Request::Type::DATUM_POINT, (Entity::Type)0, 1, false, false, false, "datum-point" }, { Request::Type::LINE_SEGMENT, Entity::Type::LINE_SEGMENT, 2, false, false, false, "line-segment" }, { Request::Type::CUBIC, Entity::Type::CUBIC, 4, true, false, false, "cubic-bezier" }, { Request::Type::CUBIC_PERIODIC, Entity::Type::CUBIC_PERIODIC, 3, true, false, false, "periodic-cubic" }, { Request::Type::CIRCLE, Entity::Type::CIRCLE, 1, false, true, true, "circle" }, { Request::Type::ARC_OF_CIRCLE, Entity::Type::ARC_OF_CIRCLE, 3, false, true, false, "arc-of-circle" }, { Request::Type::TTF_TEXT, Entity::Type::TTF_TEXT, 2, false, true, false, "ttf-text" }, -{ Request::Type::UNKNOWN, Entity::Type::UNKNOWN, 0, false, false, false, NULL }, +{ (Request::Type)0, (Entity::Type)0, 0, false, false, false, NULL }, }; const char *EntReqTable::DescriptionForRequest(Request::Type req) { - for(int i = 0; Table[i].reqType != Request::Type::UNKNOWN; i++) { + for(int i = 0; Table[i].reqType != (Request::Type)0; i++) { if(req == Table[i].reqType) { return Table[i].description; } @@ -50,7 +50,7 @@ void EntReqTable::CopyEntityInfo(const TableEntry *te, int extraPoints, bool EntReqTable::GetRequestInfo(Request::Type req, int extraPoints, Entity::Type *ent, int *pts, bool *hasNormal, bool *hasDistance) { - for(int i = 0; Table[i].reqType != Request::Type::UNKNOWN; i++) { + for(int i = 0; Table[i].reqType != (Request::Type)0; i++) { const TableEntry *te = &(Table[i]); if(req == te->reqType) { CopyEntityInfo(te, extraPoints, @@ -64,7 +64,7 @@ bool EntReqTable::GetRequestInfo(Request::Type req, int extraPoints, bool EntReqTable::GetEntityInfo(Entity::Type ent, int extraPoints, Request::Type *req, int *pts, bool *hasNormal, bool *hasDistance) { - for(int i = 0; Table[i].reqType != Request::Type::UNKNOWN; i++) { + for(int i = 0; Table[i].reqType != (Request::Type)0; i++) { const TableEntry *te = &(Table[i]); if(ent == te->entType) { CopyEntityInfo(te, extraPoints, @@ -76,8 +76,9 @@ bool EntReqTable::GetEntityInfo(Entity::Type ent, int extraPoints, } Request::Type EntReqTable::GetRequestForEntity(Entity::Type ent) { - Request::Type req = Request::Type::UNKNOWN; - GetEntityInfo(ent, 0, &req, NULL, NULL, NULL); + Request::Type req; + ssassert(GetEntityInfo(ent, 0, &req, NULL, NULL, NULL), + "No entity for request"); return req; } @@ -86,14 +87,13 @@ void Request::Generate(IdList *entity, IdList *param) const { int points = 0; - Entity::Type et = Entity::Type::UNKNOWN; + Entity::Type et; bool hasNormal = false; bool hasDistance = false; int i; Entity e = {}; - EntReqTable::GetRequestInfo(type, extraPoints, - &et, &points, &hasNormal, &hasDistance); + EntReqTable::GetRequestInfo(type, extraPoints, &et, &points, &hasNormal, &hasDistance); // Generate the entity that's specific to this request. e.type = et; @@ -111,7 +111,7 @@ void Request::Generate(IdList *entity, Entity p = {}; p.workplane = workplane; // points start from entity 1, except for datum point case - p.h = h.entity(i+((et != Entity::Type::DATUM_POINT) ? 1 : 0)); + p.h = h.entity(i+((et != (Entity::Type)0) ? 1 : 0)); p.group = group; p.style = style; @@ -166,7 +166,7 @@ void Request::Generate(IdList *entity, e.distance = d.h; } - if(et != Entity::Type::DATUM_POINT) entity->Add(&e); + if(et != (Entity::Type)0) entity->Add(&e); } std::string Request::DescriptionString() const { diff --git a/src/sketch.h b/src/sketch.h index 31c6e84..9bef5bd 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -299,7 +299,6 @@ public: // Types of requests enum class Type : uint32_t { - UNKNOWN = 0, WORKPLANE = 100, DATUM_POINT = 101, LINE_SEGMENT = 200, @@ -340,8 +339,6 @@ public: static const hEntity NO_ENTITY; enum class Type : uint32_t { - DATUM_POINT = 0, - UNKNOWN = 1000, POINT_IN_3D = 2000, POINT_IN_2D = 2001, POINT_N_TRANS = 2010, @@ -364,7 +361,6 @@ public: FACE_N_TRANS = 5003, FACE_N_ROT_AA = 5004, - WORKPLANE = 10000, LINE_SEGMENT = 11000, CUBIC = 12000, @@ -609,7 +605,6 @@ public: static const hConstraint NO_CONSTRAINT; enum class Type : uint32_t { - UNKNOWN = 0, POINTS_COINCIDENT = 20, PT_PT_DISTANCE = 30, PT_PLANE_DISTANCE = 31, diff --git a/src/solvespace.cpp b/src/solvespace.cpp index ca0b066..692aec1 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -419,9 +419,8 @@ bool SolveSpaceUI::OkayToStartNewFile() { case DIALOG_CANCEL: return false; - - default: ssassert(false, "Unexpected dialog choice"); } + ssassert(false, "Unexpected dialog choice"); } void SolveSpaceUI::UpdateWindowTitle() { diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 4087107..70df591 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -221,7 +221,7 @@ static bool KeepRegion(SSurface::CombineAs type, bool opA, SShell::Class shell, return (inShell && !inFace) || inSame; } - default: ssassert(false, "Unexpected shell type"); + default: ssassert(false, "Unexpected combine type"); } } static bool KeepEdge(SSurface::CombineAs type, bool opA, diff --git a/src/textscreens.cpp b/src/textscreens.cpp index d116959..ec85828 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -503,6 +503,8 @@ void TextWindow::ShowGroupSolveInfo() { case SolveResult::TOO_MANY_UNKNOWNS: Printf(true, "Too many unknowns in a single group!"); return; + + default: ssassert(false, "Unexpected solve result"); } for(int i = 0; i < g->solved.remove.n; i++) { diff --git a/src/ui.h b/src/ui.h index 6b72a15..8fd7977 100644 --- a/src/ui.h +++ b/src/ui.h @@ -598,13 +598,14 @@ public: const char *description; - Constraint::Type suggestion; + bool hasSuggestion; + Constraint::Type suggestion; } pending; void ClearPending(); // The constraint that is being edited with the on-screen textbox. hConstraint constraintBeingEdited; - ConstraintBase::Type SuggestLineConstraint(hRequest lineSegment); + bool SuggestLineConstraint(hRequest lineSegment, ConstraintBase::Type *type); Vector SnapToGrid(Vector p); bool ConstrainPointByHovered(hEntity pt);