`Sketcher_ConstrainBlock` to `Constraint_Block`.
`Sketcher_ConstrainLock` to `Constraint_Lock`, and the corresponding
`_Driven` variant.
Adjust the icons in the taskpanel for the sketcher constraints,
elements, and for the action menu for constraints.
Adjust the icon order in the `Sketcher.qrc` resource file.
Update formatting in compliance with pep8 with the following exceptions:
* truncate to 120 characters in line
* prefer double quotes `"` to single quotes `'` in strings
Switch addon lookup mechanism from parsing html page to extracting info
from .gitmodules file.
This simplifies logic and allows using non-Github repos.
Readme for Github repos are extracted from HTML pages using regex.
Gitlab pages are converted to HTML using Python Markdown lib if present,
falling back to displaying raw markdown.
In this case image links are converted from relative to absolute paths.
The `Surface_Workbench` icon is the same as `Surface_Surface`,
which is now an SVG and not XPM.
The lines are thicker and the colors have been adjusted
with a gradient, instead of being solid and plain looking.
Also the following were updated: `BSplineSurface`,
`BezierSurface`, `Cut`, `Filling`, `Sewing.
The `BezierSurface`, `Cut`, and `Sewing` icons are not currently used
in the workbench, but they were still updated in case
a future command uses them.
Replace the hard-coded XPM icon in `InitGui.py` for the workbench
with an SVG file, which at this time is identical to the `Surface` icon.
Change `CMakeLists.txt` to properly install this new icon.
Rename all icons, so that all have the `Surface_` prefix.
Use the new icon names in the viewproviders and task panels.
If the object has a `Shape` it uses its bounding box to enlarge
the page size of the SVG. If it does not have a `Shape`
("Draft Text", "Draft Dimension", other `App::FeaturePython`)
it uses `Draft.get_bbox` to calculate one bounding box
from the viewprovider if possible.
Normally the bounding box is taken from `Shape.BoundBox`.
Certain objects don't have a `Shape`, like `App::FeaturePythons`,
so the bounding box is calculated from `ViewObject.RootNode`.