diff --git a/CHANGELOG.md b/CHANGELOG.md index c31c1e8e..20b6a973 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,8 @@ New constraint features: in the text window. * When selecting an entity, the constraints applied to it can be selected in the text window. + * It is now possible to turn off automatic creation of horizontal/vertical + constraints on line segments. New export/import features: * Three.js: allow configuring projection for exported model, and initially diff --git a/src/confscreen.cpp b/src/confscreen.cpp index 7c8d54b2..c7e193c1 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -93,6 +93,11 @@ void TextWindow::ScreenChangeCheckClosedContour(int link, uint32_t v) { SS.GW.Invalidate(); } +void TextWindow::ScreenChangeAutomaticLineConstraints(int link, uint32_t v) { + SS.automaticLineConstraints = !SS.automaticLineConstraints; + SS.GW.Invalidate(); +} + void TextWindow::ScreenChangeShadedTriangles(int link, uint32_t v) { SS.exportShadedTriangles = !SS.exportShadedTriangles; SS.GW.Invalidate(); @@ -301,6 +306,9 @@ void TextWindow::ShowConfiguration() { Printf(false, " %Fd%f%Ll%s check sketch for closed contour%E", &ScreenChangeCheckClosedContour, SS.checkClosedContour ? CHECK_TRUE : CHECK_FALSE); + Printf(false, " %Fd%f%Ll%s enable automatic line constraints%E", + &ScreenChangeAutomaticLineConstraints, + SS.automaticLineConstraints ? CHECK_TRUE : CHECK_FALSE); Printf(false, " %Fd%f%Ll%s show areas of closed contours%E", &ScreenChangeShowContourAreas, SS.showContourAreas ? CHECK_TRUE : CHECK_FALSE); diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index a6d623e7..414c6ec4 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -1283,26 +1283,27 @@ void GraphicsWindow::ToggleBool(bool *v) { } bool GraphicsWindow::SuggestLineConstraint(hRequest request, Constraint::Type *type) { - if(LockedInWorkplane()) { - Entity *ptA = SK.GetEntity(request.entity(1)), - *ptB = SK.GetEntity(request.entity(2)); + if(!(LockedInWorkplane() && SS.automaticLineConstraints)) + return false; - Expr *au, *av, *bu, *bv; + Entity *ptA = SK.GetEntity(request.entity(1)), + *ptB = SK.GetEntity(request.entity(2)); - ptA->PointGetExprsInWorkplane(ActiveWorkplane(), &au, &av); - ptB->PointGetExprsInWorkplane(ActiveWorkplane(), &bu, &bv); + Expr *au, *av, *bu, *bv; - double du = au->Minus(bu)->Eval(); - double dv = av->Minus(bv)->Eval(); + ptA->PointGetExprsInWorkplane(ActiveWorkplane(), &au, &av); + ptB->PointGetExprsInWorkplane(ActiveWorkplane(), &bu, &bv); - const double TOLERANCE_RATIO = 0.02; - 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; - } + double du = au->Minus(bu)->Eval(); + double dv = av->Minus(bv)->Eval(); + + const double TOLERANCE_RATIO = 0.02; + 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/solvespace.cpp b/src/solvespace.cpp index 7e643646..210c2904 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -70,6 +70,8 @@ void SolveSpaceUI::Init() { drawBackFaces = settings->ThawBool("DrawBackFaces", true); // Check that contours are closed and not self-intersecting checkClosedContour = settings->ThawBool("CheckClosedContour", true); + // Enable automatic constrains for lines + automaticLineConstraints = settings->ThawBool("AutomaticLineConstraints", true); // Draw closed polygons areas showContourAreas = settings->ThawBool("ShowContourAreas", false); // Export shaded triangles in a 2d view @@ -241,6 +243,8 @@ void SolveSpaceUI::Exit() { settings->FreezeBool("ShowContourAreas", showContourAreas); // Check that contours are closed and not self-intersecting settings->FreezeBool("CheckClosedContour", checkClosedContour); + // Enable automatic constrains for lines + settings->FreezeBool("AutomaticLineConstraints", automaticLineConstraints); // Export shaded triangles in a 2d view settings->FreezeBool("ExportShadedTriangles", exportShadedTriangles); // Export pwl curves (instead of exact) always diff --git a/src/solvespace.h b/src/solvespace.h index 8e911929..9c788567 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -590,6 +590,7 @@ public: bool drawBackFaces; bool showContourAreas; bool checkClosedContour; + bool automaticLineConstraints; bool showToolbar; Platform::Path screenshotFile; RgbaColor backgroundColor; diff --git a/src/ui.h b/src/ui.h index fcbcffb9..cb6f06a6 100644 --- a/src/ui.h +++ b/src/ui.h @@ -425,6 +425,7 @@ public: static void ScreenChangeBackFaces(int link, uint32_t v); static void ScreenChangeShowContourAreas(int link, uint32_t v); static void ScreenChangeCheckClosedContour(int link, uint32_t v); + static void ScreenChangeAutomaticLineConstraints(int link, uint32_t v); static void ScreenChangePwlCurves(int link, uint32_t v); static void ScreenChangeCanvasSizeAuto(int link, uint32_t v); static void ScreenChangeCanvasSize(int link, uint32_t v);