Commit Graph

830 Commits

Author SHA1 Message Date
Abdullah Tahiri
1e4551123d GCS: convenience diagnosis functions 2021-01-23 07:53:28 +01:00
Abdullah Tahiri
186f5a4c19 GCS/Sketcher: Add equal length line constraint using the new single constraint 2021-01-23 07:53:28 +01:00
Abdullah Tahiri
5609269ca8 GCS: New Constraint for equal size lines, avoiding to use an extra parameter
============================================================================

This specific constraint removes the free parameter of the previous implementation. This solves:
https://tracker.freecadweb.org/view.php?id=4501

fixes #4501

However, this implementation of equal size produces zero gradients when coordinates of lines are aligned,
e.g. vertical or horizontal. These zero gradients, which are mathematically right ruin the diagnosis, which
regards corresponding elements as fully constraint (because they are locked from a solver point of view), when
they are simply locked, but are movable and constrainable. For this, when the rightful gradient is small enough
(<1e-10) it is substituted by a surrogate gradient of 1e-10, which solves the problem with the diagnose, which
treats as zero only values under 1e-13 (pivot threshold used in QR decomposition).

This special behaviour fixes the wrong detection here:
https://forum.freecadweb.org/viewtopic.php?f=8&t=53466&start=40#p464168

It also fixes this one:
https://forum.freecadweb.org/viewtopic.php?p=468585#p468587
2021-01-23 07:53:28 +01:00
Abdullah Tahiri
b01313c0d8 Sketcher: SketchObject partially redundant status 2021-01-23 07:53:28 +01:00
Abdullah Tahiri
a3c1010800 Sketcher: Sketch retrieve partially redundant constraints 2021-01-23 07:53:28 +01:00
Abdullah Tahiri
65fb44df6c GCS: report partially redundant constraints 2021-01-23 07:53:28 +01:00
Abdullah Tahiri
919196fb9a Sketcher: Migrate old construction points as construction
=========================================================

Fix that construction points, which did not have the construction flag before, as construction flag was
reserved for internal alignment points, are migrated as construction points.

Fixes:
https://forum.freecadweb.org/viewtopic.php?f=8&t=53466&start=40#p467176
https://forum.freecadweb.org/viewtopic.php?p=467160#p467160
2021-01-14 19:22:15 +01:00
Abdullah Tahiri
4e5f0a3850 Sketcher: Check for null geometry shapes before adding them to the toShape array 2021-01-09 20:08:05 +01:00
Abdullah Tahiri
e6af511f39 Part/Sketcher: Refactor Geometry Extensions copy/save/restore AND attachment notification
=========================================================================================

- Long overdue refactor to avoid repetition during save/restore and copy.
- New interface to notify an extension when it is attached. It also enables the extension to gain
a pointer to the geometry container. This is intended to extend the functionality already existing
in Part::Geometry.
2021-01-09 20:08:05 +01:00
Benjamin Nauck
927fdc9edc [Sketcher] Fix crash in SketcherObject::setDatum
The variable newVals can't be used after std::move, fetch it from the
constraint it if an error occurs.
2021-01-09 07:50:31 +01:00
luz paz
5b058a9f13 Sketcher: App/Sketch.h minor documentation tweaks [skip ci] 2021-01-07 12:16:24 +01:00
Abdullah Tahiri
e29a394ce0 Sketcher: std::move improvement fixes 2021-01-07 12:03:26 +01:00
Zheng, Lei
12defb11b6 Part/Sketcher: improve list property update efficiency 2021-01-07 10:27:21 +01:00
Abdullah Tahiri
a3b9edc6d8 Sketcher: Expose delGeometries function to Python 2021-01-06 13:54:00 +01:00
Abdullah Tahiri
41c91574cf Sketcher: deleteGeometries split
================================

New deleteGeometries function, according to the comment should the same
as deleteGeometry but at a time. However, this is not accurate, as deleteGeometry
deletes any internal geometry associated to the provided GeoIds, whereas
deleteGeometries does not delete that internal geometry.

Solution:
Split deleteGeometries into two different functions:
1) delGeometriesExclusiveList
2) delGeometry

The former will not delete associated internal geometry. It is more efficient, but
it is the resposibility of the caller not to leave internal geometry undeleted.

The latter, implemented in terms of the former, will delete associated internal
geometry too.

As a bonus, the latter will also remove any GeoId duplicates.
2021-01-06 13:54:00 +01:00
Abdullah Tahiri
2bd2041bfe Sketcher: Retrieve 1-based list of malformed constraints from solver 2021-01-06 13:54:00 +01:00
Abdullah Tahiri
150e50c700 Sketcher: Treat malformed solver constraints as an error during recompute
=========================================================================

Sometimes it happens that malformed constraints are arrived to.

Example:
https://forum.freecadweb.org/viewtopic.php?f=3&t=53780#p463271

It is not the first time. They usually go under the radar and when they are
detected is too late to know what caused them. The user is desperate too.

This commit makes malformed constraints to prevent the recompute of the project.

This is in the best interest of the user.
2021-01-06 13:54:00 +01:00
Abdullah Tahiri
035bea5082 Sketcher: Add FullyConstrained read-only output property
========================================================

This property stores whether a Sketch has 0 DoF or not upon solve.

It is serialised to disk, enabling a recently loaded project to have an accurate
populated property even before the first solve() call.
2021-01-06 13:54:00 +01:00
Abdullah Tahiri
2625aabe25 Sketcher/GCS: New Block constraint fixes
========================================

Previous versions relied on a heuristic that proved insufficient for cummulative use of the Block constraint.
The effect is that Block constraints stopped blocking, which is a major bug, as it lead to inadvertedly moving
geometry that was supposed to be blocked.

Fixes:
https://forum.freecadweb.org/viewtopic.php?f=13&t=53515&start=30#p461215
(Thanks Chaospilot)

Know problems with old block constraint (v0.18):
1. If driving constraints were present, they were ignored if inserted before the block constraint (to avoid
redundancy/conflicting). They resulted in

Principles of Working of the new block constraint:
1. Handling of the new block constraint is based two processes, a pre-analysis and a post-analysis. Pre-analysis
works *before* diagnosing the system in the solver. Post-analysis works *after* diagnosing the system in the solver.

2. Pre-analysis is directed to detect geometries affected *exclusively* by a block constraint. This is important
because these geometries can be pre-fixed when creating the solver geometry and constraints before GCS::diagnose()
via initSolution() AND because if no other constraint affects the geometry, the geometry parameters won't even appear
in the Jacobian of GCS, so they won't be reported as dependent parameters (for which post-analysis would be of no use).

3. Post-analysis is directed to detect Geometries affected *not only* by a block constraint. This is important
because pre-fixing these geometries would lead to redundant constraints. The post-analysis, enables to fix just the
parameters that fulfil the dependacy groups.

4. Post-analysis basically identifies which parameters shall be fixed to make geometries having blocking constraints
fixed, while not leading to redundant/conflicting constraints. These parameters must belong to blocked geometry. This
is, groups may comprise parameters belonging to blocked geometry and parameters belonging to unconstrained geometry. It
is licit that the latter remain as dependent parameters. The former are referred to as "blockable parameters". Extending
this concept, there may be unsatisfiable groups (because they do not comprise any bloackable parameter), and it is the
desired outcome NOT to satisfy such groups. It must be emphasised that there is not a single combination of fixed parameters
from the blockable parameters that satisfy all the dependency groups. However:
     1) some combinations do not satisfy all the dependency groups that must be satisfied (e.g. fixing one group containing
        two blockable parameters with a given one may result in another group, fixable only by the former, not to be satisfied).
        This leads, in a subsequent diagnosis, to satisfiable unsatisfied groups.
     2) some combinations lead to partially redundant constraints, that the solver will silently drop in a subsequent diagnosis,
        thereby reducing the rank of the system fixing less than it should.

5. The implementation rationale is as follows:
     1) The implementation is on the order of the groups provided by the QR decomposition used to reveal the parameters
        (see System::identifyDependentParameters in GCS). Zeros are made over the pilot of the full R matrix of the QR decomposition,
        which is a top triangular matrix.This, together with the permutation matrix, allow to know groups of dependent parameters
        (cols between rank and full size). Each group refers to a new parameter not affected by the rank in combination with other free
        parameters intervening in the rank (because of the triangular shape of the R matrix). This results in that each the first column
        between the rank and the full size, may only depend on a number of parameters, while the last full size colum may dependent on
        any amount of previously introduced parameters.
     2) Thus the rationale is to start from the last group (having **potentially** the larger amount of parameters) and selecting as blocking
        for that group the latest blockable parameter. Because previous groups do not have access to the last parameter, this can never
        interfere with previous groups. However, because the last parameter may not be a blockable one, there is a risk of selecting a parameter
        common with other group, albeit the probability is reduced and probably (I have not demonstrated it though and I am not sure), it
        systematically leads to the right solution in one iteration.

GCS: Change dependency group from std::set to std::vector to prevent reordering of parameters.
2020-12-30 18:59:15 +01:00
wmayer
0f31c87cc9 Boost: [skip ci] Fix build warnings from deprecated Boost headers (v1.75) 2020-12-29 15:34:25 +01:00
Mateusz Skowroński
2559f2d29c Fix build warnings from deprecated Boost headers (they are used internally by Boost). Thanks @wwmayer for the hint. 2020-12-29 10:20:53 +01:00
Mateusz Skowroński
6075ba3085 Fix GCC warnings: catching polymorphic type by value [-Wcatch-value=] 2020-12-28 23:17:26 +01:00
luz paz
4327243a0a Sketcher: Fix typos and code linting [skip ci] 2020-12-28 23:15:22 +01:00
luz paz
472168fc15 Fix typos [skip ci]
Typos ffound via `codespell v2.1.dev0`  
Also includes fixes in deprecated code of `src/Mod/Assembly`
2020-12-28 23:14:04 +01:00
wmayer
b318426cd7 Sketcher: fix -Wextra-semi 2020-12-28 11:36:24 +01:00
Abdullah Tahiri
64774bc1fe Sketcher: Fix crash on constraint rename
========================================

Report:
https://github.com/FreeCAD/FreeCAD/pull/4183
https://github.com/realthunder/FreeCAD_assembly3/issues/387

Problem:
renameConstraint() previously implemented exclusively in SketchObjectPyImp.cpp,
will change the Constraints property without updating the solver. A prospective
drag operation would rely on a deleted pointer constraint which leads to the
crash.

Solution:
- mark the solver status as needing an update
- leverage new through sketchobject r/w interface to ensure solver is synchronised
before the temporary move operation starts

Bonus:
move the core of the function to SketchObject.cpp so that input data validity
check on constraint change is inhibited.
2020-12-27 08:24:43 +01:00
Abdullah Tahiri
1d56289c79 Sketcher: restric ViewProviderSketch access to the solver
=========================================================

-> Split read and read/write operations

New interface to access the solver object (Sketch) of SketchObject is now read only (const):

const Sketcher::Sketch &getSolvedSketch(void) const;

-> Encapsulate solver r/w access in SketchObject

Rationale:

- r/w access (access to non-const functions of the solver) leads to unsynchronised solver status.

- Before this commit there was a non-enforceable shared responsibility between ViewProviderSketch
and SketchObject.

- This commit centralises r/w access in SketchObject and SketchObject takes responsibility for doing whatever
necessary so that the solver is synchronised as appropriate.

- For read-only access (const functions) it is possible to use at ViewProviderSketch getSolvedSketch() returning
a const reference to the solver object.

- As it regards the advanced solver configuration dialog, it has been modified to configure by const-casting that reference. This
is not optimal, but it is deemed acceptable, because it should be rewritten sooner or later to include only useful information
and the configuration probably centralised in an individual configuration object, possibly compatible with several solvers
(e.g. DeepSOIC's ConstraintSolver too).
2020-12-27 08:24:43 +01:00
Abdullah Tahiri
8e3b6be0e7 Sketcher: Trigger elements widget update on toggle/set construction geometry 2020-12-27 08:24:43 +01:00
Abdullah Tahiri
733b7bde90 Sketcher: encapsulate Sketch::SolveTime and RecalculateInitialSolutionWhileMovingPoint members 2020-12-27 08:24:43 +01:00
Abdullah Tahiri
18ecd174a8 Sketcher: make Sketch::calculateNormalAtPoint const 2020-12-27 08:24:43 +01:00
Abdullah Tahiri
a790e32605 GCS: Const correctness and override qualifier
=============================================

Make several functions operate as const.
Use the override qualifier
2020-12-27 08:24:43 +01:00
Abdullah Tahiri
c2ab51314d GCS: Return a zero sized reduced Jacobian if only driven constraints present
=============================================================================

The reduced Jacobian defaults to the size of the full Jacobian, where driven constraints
and parameters are not considered to build the reduced Jacobian and thus empty rows remain.

This is generally not a problem as QR decomposition ignores this rows, except in case where
only driven constraints exist. In such a case no QR decomposition is necessary, and in fact
relying on the size of the QR decomposition leads to the incorrect result that the sketch
is fully constraint, when the opposite is true.

This commit resizes an effectively empty reduced Jacobian to avoid this issue.

Fixes the problem that a line with a single reference constraint is shown as fully constraint.
2020-12-27 08:24:43 +01:00
luz paz
38cafc57a5 Sketcher: typo in function name 2020-12-27 06:08:01 +01:00
Yorik van Havre
145fa6bfa1 Merge pull request #4186 from luzpaz/typos
Fix typos [skip ci]
2020-12-24 12:07:15 +01:00
Abdullah Tahiri
af605e4066 GCS: Improve documentation about debug
======================================

Explicitly indicate that if parameter diagnosis must be silent=false in order to debug,
then the lauch policy during the debug must be set to deferred in order to avoid concurrent
access to Base::Console which is not thread-safe.
2020-12-24 11:59:51 +01:00
Abdullah Tahiri
197a234357 Sketcher: Fix block constraint with several dependency groups
=============================================================

Fixes:
https://forum.freecadweb.org/viewtopic.php?f=8&t=53466&p=460513#p460270

When a parameter belonging to a blocked geometry is present in several
dependency groups and there are other fixed parameters one or more of
the dependency groups, it is not enough to remove that parameter, from
the one or more dependency groups. The removal of a parameter may only
satisfy one dependency group. Removing a single parameter creates a
new different dependency group.

Solution:
If the first blocked parameter in a group is already set for removal,
continue searching for other blocked parameters, until one not searched
for removal is found.
2020-12-24 11:59:51 +01:00
Abdullah Tahiri
dfda68be11 Sketcher: enable Block constraint with empty additional constraints
===================================================================

Fixes:
https://forum.freecadweb.org/viewtopic.php?f=13&t=53515&p=460523#p460406
2020-12-24 11:59:51 +01:00
Abdullah Tahiri
5cfef45561 Sketcher: Additional debug code for new block constraint 2020-12-24 11:59:51 +01:00
luz paz
ff96cb301e Fix typos [skip ci]
Found via `codespell v2.1.dev0`
2020-12-23 14:32:38 -05:00
David Osterberg
cbbbe942ea Apply style suggestions from @abdullahtahiriyo 2020-12-23 06:23:17 +01:00
David Osterberg
73fa304685 Sketcher: Fix issue #4513 - SketchObject::addSymmetric
This fixes issue
https://tracker.freecadweb.org/view.php?id=4513

addSymmetric will now only transfer Vertical and Horizontal constraints if the reference axis is either
 - the HAxis
 - the VAxis
 - a Vertical line
 - a Horizontal line
2020-12-23 06:23:17 +01:00
Abdullah Tahiri
e875704c2c Sketcher: Support for defining point 2020-12-22 07:10:48 +01:00
wmayer
6c956bb80f Sketcher: support vertexes in sketch used e.g. for hole features 2020-12-22 07:10:48 +01:00
Abdullah Tahiri
c79ac8d1fc Sketcher: Implement Python function getConstruction(geoId) to retrieve geometry construction status 2020-12-22 07:10:48 +01:00
David Osterberg
dec01d1df0 Sketcher: Fix several issues in SketchObject::trim
Issues addressed:
- exception when trimming a loose end of a Arc of circle
- conflicting constraints when trimming
- loss of tangency when trimming arcs tangent to lines or other curves
- incorrect trimming when the intersecing geometry has a PointOnObject constraint to the arc, but also another intersection og geometry.

Fixes:
https://tracker.freecadweb.org/view.php?id=4066
https://tracker.freecadweb.org/view.php?id=3910

Also see forum discussion
https://forum.freecadweb.org/viewtopic.php?f=10&t=53299
2020-12-21 20:03:02 +01:00
David Osterberg
a8443b6b7f Improve comment and remove uncessary return statement 2020-12-21 08:37:37 +01:00
David Österberg
bfc036daa4 Update src/Mod/Sketcher/App/SketchObject.cpp
Co-authored-by: Chris Hennes <chennes@pioneerlibrarysystem.org>
2020-12-21 08:37:37 +01:00
David Osterberg
edb87a0663 Delete Equal constraints on LineSegments in SketchObject::trim
This closes:
https://tracker.freecadweb.org/view.php?id=4510
2020-12-21 08:37:37 +01:00
Abdullah Tahiri
07725ede25 Sketcher: New Blocked constraint solver implementation
======================================================

With the new solver ability to identify groups of dependent parameters, even with SparseQR, it is now possible to properly implement Blocked constraint (blocked geometry state/mode).

This comes at the cost of two consecutive diagnosis (4 QR decompositions, running in parallel by pairs, so the double of time than when not using any blocked constraint).

A first diagnosis identifies the groups of dependent solver parameters.

If any of these groups comprises a parameter affected by a blocked constraint, the parameter is fixed. As only one parameter from each group is fixed, there are no (partly) redundant parameters involved.

Then the new adapted system is solved.
2020-12-21 05:57:42 +01:00
Abdullah Tahiri
ea006076e4 Sketcher: GeometryFacade - convenience method to check if a geometry is blocked 2020-12-21 05:57:42 +01:00