Trim lines ending with superfluous whitespace

This commit is contained in:
luzpaz
2024-12-22 12:57:15 +00:00
committed by Chris Hennes
parent 0758630103
commit 7782fd6827
28 changed files with 48 additions and 48 deletions

View File

@@ -26,7 +26,7 @@ The FreeCAD Contribution Process is expressed here with the following specific g
1. FreeCAD uses the git distributed revision control system. 1. FreeCAD uses the git distributed revision control system.
2. Source code for the main application and related subprojects is hosted on github.com in the FreeCAD organization. 2. Source code for the main application and related subprojects is hosted on github.com in the FreeCAD organization.
3. Problems are discrete, well-defined limitations or bugs. 3. Problems are discrete, well-defined limitations or bugs.
4. FreeCAD uses GitHub's issue-tracking system to track problems and contributions. For help requests and general discussions, use the project forum. 4. FreeCAD uses GitHub's issue-tracking system to track problems and contributions. For help requests and general discussions, use the project forum.
5. Contributions are sets of code changes that resolve a single problem. 5. Contributions are sets of code changes that resolve a single problem.
6. FreeCAD uses the Pull Request workflow for evaluating and accepting contributions. 6. FreeCAD uses the Pull Request workflow for evaluating and accepting contributions.
@@ -47,7 +47,7 @@ The FreeCAD Contribution Process is expressed here with the following specific g
## 5. Contribution Requirements ## 5. Contribution Requirements
1. Contributions are submitted in the form of Pull Requests (PR). 1. Contributions are submitted in the form of Pull Requests (PR).
2. Maintainers and Contributors MUST have a GitHub account and SHOULD use their real names or a well-known alias. 2. Maintainers and Contributors MUST have a GitHub account and SHOULD use their real names or a well-known alias.
3. If the GitHub username differs from the username on the FreeCAD Forum, effort SHOULD be taken to avoid confusion. 3. If the GitHub username differs from the username on the FreeCAD Forum, effort SHOULD be taken to avoid confusion.
4. A PR SHOULD be a minimal and accurate answer to exactly one identified and agreed-on problem. 4. A PR SHOULD be a minimal and accurate answer to exactly one identified and agreed-on problem.
5. A PR SHOULD refrain from adding additional dependencies to the FreeCAD project unless no other option is available. 5. A PR SHOULD refrain from adding additional dependencies to the FreeCAD project unless no other option is available.

View File

@@ -1,18 +1,18 @@
# Security Policy # Security Policy
The FreeCAD project is a FOSS (Free and Open-Source Software) project that has a community of thousands of users and The FreeCAD project is a FOSS (Free and Open-Source Software) project that has a community of thousands of users and
hundreds of developers worldwide. We encourage responsible reporting of security vulnerabilities that may affect users hundreds of developers worldwide. We encourage responsible reporting of security vulnerabilities that may affect users
of this software, and will endeavor to address these vulnerabilities when they are discovered. of this software, and will endeavor to address these vulnerabilities when they are discovered.
## Bounties ## Bounties
FreeCAD does not have a program to pay bounties for security bugs. If you discover a vulnerability that affects a part FreeCAD does not have a program to pay bounties for security bugs. If you discover a vulnerability that affects a part
of the FreeCAD project (either directly in FreeCAD, in a library it depends on, or in any of the various other of the FreeCAD project (either directly in FreeCAD, in a library it depends on, or in any of the various other
subprojects such as our website, forums, etc.) we ask you to join the large community of volunteer contributors and subprojects such as our website, forums, etc.) we ask you to join the large community of volunteer contributors and
file a report about the issue. file a report about the issue.
Note that funds may be available from the [FreeCAD Project Association (FPA)](https://fpa.freecad.org) to pursue Note that funds may be available from the [FreeCAD Project Association (FPA)](https://fpa.freecad.org) to pursue
security research and/or the development of fixes to any vulnerabilities discovered. However, vulnerabilities held as security research and/or the development of fixes to any vulnerabilities discovered. However, vulnerabilities held as
hostage in demands for "bounties" will not be entertained. Contact the FPA at fpa@freecad.org for more information. hostage in demands for "bounties" will not be entertained. Contact the FPA at fpa@freecad.org for more information.
## Supported Versions ## Supported Versions

View File

@@ -118,7 +118,7 @@ if(PYCXX_FOUND)
${PYCXX_SOURCE_DIR}/IndirectPythonInterface.cxx ${PYCXX_SOURCE_DIR}/IndirectPythonInterface.cxx
) )
#set old 6.2 pycxx compatibility #set old 6.2 pycxx compatibility
list(APPEND PYCXX_SOURCES ${PYCXX_SOURCE_DIR}/cxx_exceptions.cxx) list(APPEND PYCXX_SOURCES ${PYCXX_SOURCE_DIR}/cxx_exceptions.cxx)
add_definitions(-DPYCXX_6_2_COMPATIBILITY) add_definitions(-DPYCXX_6_2_COMPATIBILITY)
#end old compatibility #end old compatibility

View File

@@ -5,14 +5,14 @@ The FreeCAD Document Object
:maxdepth: 4 :maxdepth: 4
.. automodule:: DocumentObject .. automodule:: DocumentObject
.. autoclass:: DocumentObject .. autoclass:: DocumentObject
:members: :members:
.. method:: __setstate__(value) .. method:: __setstate__(value)
allows to save custom attributes of this object as strings, so they can be saved when saving the FreeCAD document allows to save custom attributes of this object as strings, so they can be saved when saving the FreeCAD document
.. method:: __getstate__() .. method:: __getstate__()
reads values previously saved with __setstate__() reads values previously saved with __setstate__()

View File

@@ -3,7 +3,7 @@ The Matrix object
.. toctree:: .. toctree::
:maxdepth: 4 :maxdepth: 4
.. automodule:: FreeCAD .. automodule:: FreeCAD
.. autoclass:: Matrix .. autoclass:: Matrix

View File

@@ -3,7 +3,7 @@ The Placement object
.. toctree:: .. toctree::
:maxdepth: 4 :maxdepth: 4
.. automodule:: FreeCAD .. automodule:: FreeCAD
.. autoclass:: Placement .. autoclass:: Placement

View File

@@ -3,7 +3,7 @@ The Vector object
.. toctree:: .. toctree::
:maxdepth: 4 :maxdepth: 4
.. automodule:: FreeCAD .. automodule:: FreeCAD
.. autoclass:: Vector .. autoclass:: Vector

View File

@@ -121,7 +121,7 @@ DlgCheckableMessageBox::DlgCheckableMessageBox(QWidget *parent) :
m_d->ui.setupUi(this); m_d->ui.setupUi(this);
m_d->ui.pixmapLabel->setVisible(false); m_d->ui.pixmapLabel->setVisible(false);
connect(m_d->ui.buttonBox, &QDialogButtonBox::accepted, this, &DlgCheckableMessageBox::accept); connect(m_d->ui.buttonBox, &QDialogButtonBox::accepted, this, &DlgCheckableMessageBox::accept);
connect(m_d->ui.buttonBox, &QDialogButtonBox::rejected, this, &DlgCheckableMessageBox::reject); connect(m_d->ui.buttonBox, &QDialogButtonBox::rejected, this, &DlgCheckableMessageBox::reject);
connect(m_d->ui.buttonBox, &QDialogButtonBox::clicked, connect(m_d->ui.buttonBox, &QDialogButtonBox::clicked,
this, &DlgCheckableMessageBox::slotClicked); this, &DlgCheckableMessageBox::slotClicked);
} }

View File

@@ -33,11 +33,11 @@ namespace Gui
/** /**
* @class SoFCTransform * @class SoFCTransform
* @brief A temporary workaround for coin3d/coin#534. * @brief A temporary workaround for coin3d/coin#534.
* *
* This class is a workaround for a missing feature to reduce the OpenGL stack size. * This class is a workaround for a missing feature to reduce the OpenGL stack size.
* The issue was reported here: https://github.com/coin3d/coin/issues/534 * The issue was reported here: https://github.com/coin3d/coin/issues/534
* And was merged here: https://github.com/coin3d/coin/pull/535 * And was merged here: https://github.com/coin3d/coin/pull/535
* *
* Once this feature is available in all supported versions of Coin3D, this class should * Once this feature is available in all supported versions of Coin3D, this class should
* be removed and all instances should revert to using SoTransform. * be removed and all instances should revert to using SoTransform.
*/ */

View File

@@ -315,7 +315,7 @@ class Component(ArchIFC.IfcProduct):
prop: string prop: string
The name of the property that has changed. The name of the property that has changed.
""" """
import math import math
ArchIFC.IfcProduct.onChanged(self, obj, prop) ArchIFC.IfcProduct.onChanged(self, obj, prop)

View File

@@ -337,7 +337,7 @@ class _Wall(ArchComponent.Component):
if hasattr(baseProxy,"getPropertySet"): if hasattr(baseProxy,"getPropertySet"):
# get full list of PropertySet # get full list of PropertySet
propSetListCur = baseProxy.getPropertySet(obj.Base) propSetListCur = baseProxy.getPropertySet(obj.Base)
# get updated name (if any) of the selected PropertySet # get updated name (if any) of the selected PropertySet
propSetSelectedNameCur = baseProxy.getPropertySet(obj.Base, propSetSelectedNameCur = baseProxy.getPropertySet(obj.Base,
propSetUuid=propSetPickedUuidPrev) propSetUuid=propSetPickedUuidPrev)
if propSetSelectedNameCur: # True if selection is not deleted if propSetSelectedNameCur: # True if selection is not deleted
@@ -613,11 +613,11 @@ class _Wall(ArchComponent.Component):
else: else:
FreeCAD.Console.PrintError(translate("Arch","Error: Unable to modify the base object of this wall")+"\n") FreeCAD.Console.PrintError(translate("Arch","Error: Unable to modify the base object of this wall")+"\n")
if (prop == "ArchSketchPropertySet" if (prop == "ArchSketchPropertySet"
and Draft.getType(obj.Base) == "ArchSketch"): and Draft.getType(obj.Base) == "ArchSketch"):
baseProxy = obj.Base.Proxy baseProxy = obj.Base.Proxy
if hasattr(baseProxy,"getPropertySet"): if hasattr(baseProxy,"getPropertySet"):
uuid = baseProxy.getPropertySet(obj, uuid = baseProxy.getPropertySet(obj,
propSetName=obj.ArchSketchPropertySet) propSetName=obj.ArchSketchPropertySet)
self.ArchSkPropSetPickedUuid = uuid self.ArchSkPropSetPickedUuid = uuid
if (hasattr(obj,"ArchSketchData") and obj.ArchSketchData if (hasattr(obj,"ArchSketchData") and obj.ArchSketchData

View File

@@ -37,7 +37,7 @@
<item> <item>
<widget class="QCheckBox" name="checkAskAgain"> <widget class="QCheckBox" name="checkAskAgain">
<property name="toolTip"> <property name="toolTip">
<string>If this is checked, you won't be asked again when creating a new FreeCAD document, <string>If this is checked, you won't be asked again when creating a new FreeCAD document,
and that document won't be turned into an IFC document automatically. and that document won't be turned into an IFC document automatically.
You can still turn a FreeCAD document into an IFC document manually, using You can still turn a FreeCAD document into an IFC document manually, using
Utils -&gt; Make IFC project</string> Utils -&gt; Make IFC project</string>

View File

@@ -793,7 +793,7 @@ class ArchTest(unittest.TestCase):
level = Arch.makeFloor() level = Arch.makeFloor()
level.addObjects([wall, column]) level.addObjects([wall, column])
App.ActiveDocument.recompute() App.ActiveDocument.recompute()
# Create a drawing view # Create a drawing view
section = Arch.makeSectionPlane(level) section = Arch.makeSectionPlane(level)
drawing = Arch.make2DDrawing() drawing = Arch.make2DDrawing()
@@ -803,7 +803,7 @@ class ArchTest(unittest.TestCase):
cut.ProjectionMode = "Cutfaces" cut.ProjectionMode = "Cutfaces"
drawing.addObjects([view, cut]) drawing.addObjects([view, cut])
App.ActiveDocument.recompute() App.ActiveDocument.recompute()
# Create a TD page # Create a TD page
tpath = os.path.join(App.getResourceDir(),"Mod","TechDraw","Templates","A3_Landscape_blank.svg") tpath = os.path.join(App.getResourceDir(),"Mod","TechDraw","Templates","A3_Landscape_blank.svg")
page = App.ActiveDocument.addObject("TechDraw::DrawPage", "Page") page = App.ActiveDocument.addObject("TechDraw::DrawPage", "Page")

View File

@@ -56,7 +56,7 @@ FCBRepAlgoAPI_BooleanOperation::FCBRepAlgoAPI_BooleanOperation(const TopoDS_Shap
SetRunParallel(Standard_True); SetRunParallel(Standard_True);
SetNonDestructive(Standard_True); SetNonDestructive(Standard_True);
} }
void FCBRepAlgoAPI_BooleanOperation::setAutoFuzzy() void FCBRepAlgoAPI_BooleanOperation::setAutoFuzzy()
{ {
FCBRepAlgoAPIHelper::setAutoFuzzy(this); FCBRepAlgoAPIHelper::setAutoFuzzy(this);

View File

@@ -318,7 +318,7 @@ MeasureAreaInfoPtr MeasureAreaHandler(const App::SubObjectT& subject)
BRepGProp::SurfaceProperties(shape, gprops); BRepGProp::SurfaceProperties(shape, gprops);
auto origin = gprops.CentreOfMass(); auto origin = gprops.CentreOfMass();
// TODO: Center of Mass might not lie on the surface, somehow snap to the closest point on the surface? // TODO: Center of Mass might not lie on the surface, somehow snap to the closest point on the surface?
Base::Placement placement(Base::Vector3d(origin.X(), origin.Y(), origin.Z()), Base::Rotation()); Base::Placement placement(Base::Vector3d(origin.X(), origin.Y(), origin.Z()), Base::Rotation());
return std::make_shared<MeasureAreaInfo>(true, getFaceArea(shape), placement); return std::make_shared<MeasureAreaInfo>(true, getFaceArea(shape), placement);
@@ -340,7 +340,7 @@ MeasurePositionInfoPtr MeasurePositionHandler(const App::SubObjectT& subject)
return std::make_shared<MeasurePositionInfo>(false, Base::Vector3d()); return std::make_shared<MeasurePositionInfo>(false, Base::Vector3d());
} }
TopoDS_Vertex vertex = TopoDS::Vertex(shape); TopoDS_Vertex vertex = TopoDS::Vertex(shape);
auto point = BRep_Tool::Pnt(vertex); auto point = BRep_Tool::Pnt(vertex);
return std::make_shared<MeasurePositionInfo>( true, Base::Vector3d(point.X(), point.Y(), point.Z())); return std::make_shared<MeasurePositionInfo>( true, Base::Vector3d(point.X(), point.Y(), point.Z()));
} }
@@ -365,11 +365,11 @@ MeasureAngleInfoPtr MeasureAngleHandler(const App::SubObjectT& subject)
Base::Vector3d position; Base::Vector3d position;
if (sType == TopAbs_FACE) { if (sType == TopAbs_FACE) {
TopoDS_Face face = TopoDS::Face(shape); TopoDS_Face face = TopoDS::Face(shape);
GProp_GProps gprops; GProp_GProps gprops;
BRepGProp::SurfaceProperties(face, gprops); BRepGProp::SurfaceProperties(face, gprops);
vec = gprops.CentreOfMass(); vec = gprops.CentreOfMass();
} else if (sType == TopAbs_EDGE) { } else if (sType == TopAbs_EDGE) {
TopoDS_Edge edge = TopoDS::Edge(shape); TopoDS_Edge edge = TopoDS::Edge(shape);

View File

@@ -138,7 +138,7 @@ public:
//! callback registrations //! callback registrations
// TODO: is there more that one place that GeometryHandler is defined? // TODO: is there more that one place that GeometryHandler is defined?
using GeometryHandler = std::function<Part::MeasureInfoPtr (App::SubObjectT)>; using GeometryHandler = std::function<Part::MeasureInfoPtr (App::SubObjectT)>;
class PartExport CallbackRegistrationRecord class PartExport CallbackRegistrationRecord
{ {
public: public:
@@ -146,7 +146,7 @@ public:
CallbackRegistrationRecord(const std::string& module, const std::string& measureType, GeometryHandler callback) : CallbackRegistrationRecord(const std::string& module, const std::string& measureType, GeometryHandler callback) :
m_module(module), m_measureType(measureType), m_callback(callback) m_module(module), m_measureType(measureType), m_callback(callback)
{ } { }
std::string m_module; std::string m_module;
std::string m_measureType; std::string m_measureType;
GeometryHandler m_callback; GeometryHandler m_callback;

View File

@@ -78,7 +78,7 @@
</Methode> </Methode>
<Methode Name="fixShape"> <Methode Name="fixShape">
<Documentation> <Documentation>
<UserDocu>Fixes issues in the overall geometric shape. <UserDocu>Fixes issues in the overall geometric shape.
This function likely encapsulates higher-level fixes that involve multiple faces or elements.</UserDocu> This function likely encapsulates higher-level fixes that involve multiple faces or elements.</UserDocu>
</Documentation> </Documentation>
</Methode> </Methode>

View File

@@ -199,7 +199,7 @@ void SweepWidget::findShapes()
} }
} }
if (!shape.Infinite() && if (!shape.Infinite() &&
(shape.ShapeType() == TopAbs_FACE || (shape.ShapeType() == TopAbs_FACE ||
shape.ShapeType() == TopAbs_WIRE || shape.ShapeType() == TopAbs_WIRE ||
shape.ShapeType() == TopAbs_EDGE || shape.ShapeType() == TopAbs_EDGE ||

View File

@@ -46,7 +46,7 @@ class ColorTransparencyTest(unittest.TestCase):
of 0 corresponds to a fully transparent color, which is not desirable. It changes of 0 corresponds to a fully transparent color, which is not desirable. It changes
the transparency when loading to 1.0 the transparency when loading to 1.0
""" """
self._pg.SetUnsigned('DefaultShapeColor', 0xff000000) # red self._pg.SetUnsigned('DefaultShapeColor', 0xff000000) # red
obj = self._doc.addObject('Part::Box') obj = self._doc.addObject('Part::Box')

View File

@@ -260,7 +260,7 @@ App::DocumentObjectExecReturn* Helix::execute()
if (SC.State() == TopAbs_IN) { if (SC.State() == TopAbs_IN) {
result.Reverse(); result.Reverse();
} }
fix.LimitTolerance(result, Precision::Confusion() * size * Tolerance.getValue() ); // significant precision reduction due to helical approximation - needed to allow fusion to succeed fix.LimitTolerance(result, Precision::Confusion() * size * Tolerance.getValue() ); // significant precision reduction due to helical approximation - needed to allow fusion to succeed
AddSubShape.setValue(result); AddSubShape.setValue(result);

View File

@@ -161,7 +161,7 @@ class TestHelix(unittest.TestCase):
helix.Angle = 0 helix.Angle = 0
helix.Mode = 0 helix.Mode = 0
self.Doc.recompute() self.Doc.recompute()
self.assertTrue(helix.Shape.isValid()) self.assertTrue(helix.Shape.isValid())
bbox = helix.Shape.BoundBox bbox = helix.Shape.BoundBox
self.assertAlmostEqual(bbox.ZMin/((10**exponent)**3),0,places=4) self.assertAlmostEqual(bbox.ZMin/((10**exponent)**3),0,places=4)

View File

@@ -696,7 +696,7 @@
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Shape of line end caps. The default (round) should almost <string>Shape of line end caps. The default (round) should almost
always be the right choice. Flat or square caps are useful always be the right choice. Flat or square caps are useful
if you are planning to use a drawing as a 1:1 cutting guide. if you are planning to use a drawing as a 1:1 cutting guide.
</string> </string>
</property> </property>

View File

@@ -1,8 +1,8 @@
osifont license: osifont license:
osifont-lgpl3fe.ttf is used under one or more of the following licenses: osifont-lgpl3fe.ttf is used under one or more of the following licenses:
- GNU GPL licence version 3 with GPL font exception, - GNU GPL licence version 3 with GPL font exception,
- GNU GPL licence version 2 with GPL font exception, - GNU GPL licence version 2 with GPL font exception,
- GNU LGPL licence version 3 with GPL font exception. - GNU LGPL licence version 3 with GPL font exception.

View File

@@ -1,6 +1,6 @@
# ASME Y14.2-2008 line element definitions # ASME Y14.2-2008 line element definitions
# NOTE: ASME Y14.2-2008 explicitly does not define the lengths of line elements, # NOTE: ASME Y14.2-2008 explicitly does not define the lengths of line elements,
# but recommends lengths that "depict the appropriate line convention commensurate # but recommends lengths that "depict the appropriate line convention commensurate
# with the drawing size and scale". The values used here are generally those # with the drawing size and scale". The values used here are generally those
# from ISO128. # from ISO128.
# NOTE: saving this file from a spreadsheet program (like LibreOffice Calc) may # NOTE: saving this file from a spreadsheet program (like LibreOffice Calc) may
Can't render this file because it contains an unexpected character in line 3 and column 31.

View File

@@ -1,7 +1,7 @@
This folder (`locale`) contains translations for [TechDraw workbench templates](https://wiki.freecad.org/TechDraw_Templates) in the parent `Templates` folder. This folder (`locale`) contains translations for [TechDraw workbench templates](https://wiki.freecad.org/TechDraw_Templates) in the parent `Templates` folder.
The name of each `locale` subfolder represents a language, which follows [IETF BCP 47 standardized codes](https://en.wikipedia.org/wiki/IETF_language_tag). The original TechDraw templates in the parent folder are written using American English (`en-US`). The name of each `locale` subfolder represents a language, which follows [IETF BCP 47 standardized codes](https://en.wikipedia.org/wiki/IETF_language_tag). The original TechDraw templates in the parent folder are written using American English (`en-US`).
As such, the most basic name for a locale subfolder will include an [ISO 639 language code](https://en.wikipedia.org/wiki/ISO_639) (e.g. `de` for German). If it's necessary, additional subtags can be added to describe language variants. For instance variants spoken in a particular country, or a specific script. Those subtags are combinable and are based in other standards. As such, the most basic name for a locale subfolder will include an [ISO 639 language code](https://en.wikipedia.org/wiki/ISO_639) (e.g. `de` for German). If it's necessary, additional subtags can be added to describe language variants. For instance variants spoken in a particular country, or a specific script. Those subtags are combinable and are based in other standards.
The most common additional subtag is an additional country code to describe a regional variant of the language (e.g. `de-DE` for German spoken in Germany, `es-AR` for Spanish spoken in Argentina, or `zh-CN` for Simplified Chinese in Mainland China). Country subtags are based on [the ISO 3166-1 standard's country codes](https://en.wikipedia.org/wiki/ISO_3166-1). The most common additional subtag is an additional country code to describe a regional variant of the language (e.g. `de-DE` for German spoken in Germany, `es-AR` for Spanish spoken in Argentina, or `zh-CN` for Simplified Chinese in Mainland China). Country subtags are based on [the ISO 3166-1 standard's country codes](https://en.wikipedia.org/wiki/ISO_3166-1).

View File

@@ -64,7 +64,7 @@
<keyword>architecture</keyword> <keyword>architecture</keyword>
<keyword>assembly</keyword> <keyword>assembly</keyword>
<keyword>part</keyword> <keyword>part</keyword>
<keyword translate="no">coin</keyword> <keyword translate="no">coin</keyword>
</keywords> </keywords>
<url type="homepage">https://www.freecad.org/</url> <url type="homepage">https://www.freecad.org/</url>
<url type="bugtracker">https://github.com/FreeCAD/FreeCAD/issues</url> <url type="bugtracker">https://github.com/FreeCAD/FreeCAD/issues</url>

File diff suppressed because one or more lines are too long

View File

@@ -32,7 +32,7 @@ msvcp140.dll
vcamp140.dll vcamp140.dll
vccorlib140.dll vccorlib140.dll
vcomp140.dll vcomp140.dll
``` ```
3. Open the file *Settings.nsh* with a text editor (both jEdit and Visual Studio Code are good editors for NSIS files). Edit the following paths to correspond to your system: `FILES_FREECAD` corresponds to your installation directory (e.g. `CMAKE_INSTALL_PREFIX` if you self-compiled) and `FILES_DEPS` is the folder you created with the MSVC redistributable files in it. 3. Open the file *Settings.nsh* with a text editor (both jEdit and Visual Studio Code are good editors for NSIS files). Edit the following paths to correspond to your system: `FILES_FREECAD` corresponds to your installation directory (e.g. `CMAKE_INSTALL_PREFIX` if you self-compiled) and `FILES_DEPS` is the folder you created with the MSVC redistributable files in it.
``` ```
!define FILES_FREECAD "C:\FreeCAD\Installer\FreeCAD" !define FILES_FREECAD "C:\FreeCAD\Installer\FreeCAD"