freecad-cam/Mod/Part/parttests/part_test_objects.py
2026-02-01 01:59:24 +01:00

294 lines
9.1 KiB
Python

# ***************************************************************************
# * (c) 2020 Eliud Cabrera Castillo <e.cabrera-castillo@tum.de> *
# * *
# * This file is part of the FreeCAD CAx development system. *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * FreeCAD is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with FreeCAD; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
"""Run this file to create a standard test document for Part objects.
Use it as input to the program executable.
::
freecad part_test_objects.py
Or load it as a module and use the defined function.
>>> import parttests.part_test_objects as pt
>>> pt.create_test_file()
This test script is based on the one created for the Draft Workbench.
"""
## @package part_test_objects
# \ingroup PART
# \brief Run this file to create a standard test document for Part objects.
# @{
import datetime
import os
import FreeCAD as App
import Part
from FreeCAD import Vector
if App.GuiUp:
import FreeCADGui as Gui
def _msg(text, end="\n"):
App.Console.PrintMessage(text + end)
def _create_frame():
"""Draw a frame with information on the version of the software.
It includes the date created, the version, the release type,
and the branch.
"""
version = App.Version()
now = datetime.datetime.now().strftime("%Y/%m/%dT%H:%M:%S")
_text = ["Part test file",
"Created: {}".format(now),
"\n",
"Version: " + ".".join(version[0:3]),
"Release: " + " ".join(version[3:5]),
"Branch: " + " ".join(version[5:])]
record = App.ActiveDocument.addObject("App::Annotation", "Description")
record.LabelText = _text
record.Position = Vector(0, -1000, 0)
if App.GuiUp:
record.ViewObject.DisplayMode = "World"
record.ViewObject.FontSize = 400
record.ViewObject.TextColor = (0.0, 0.0, 0.0)
p1 = Vector(-1000, -3500, 0)
p2 = Vector(20000, -3500, 0)
p3 = Vector(20000, 8500, 0)
p4 = Vector(-1000, 8500, 0)
poly = Part.makePolygon([p1, p2, p3, p4, p1])
frame = App.ActiveDocument.addObject("Part::Feature", "Frame")
frame.Shape = poly
def create_test_file(file_name="part_test_objects",
file_path=os.environ["HOME"],
save=False):
"""Create a complete test file of Part objects.
It draws a frame with information on the software used to create
the test document, and fills it with every object that can be created.
Parameters
----------
file_name: str, optional
It defaults to `'part_test_objects'`.
It is the name of the document that is created.
The `file_name` will be appended to `file_path`
to determine the actual path to save. The extension `.FCStd`
will be added automatically.
file_path: str, optional
It defaults to the value of `os.environ['HOME']`
which in Linux is usually `'/home/user'`.
If it is the empty string `''` it will use the value
returned by `App.getUserAppDataDir()`,
for example, `'/home/user/.FreeCAD/'`.
save: bool, optional
It defaults to `False`. If it is `True` the new document
will be saved to disk after creating all objects.
Returns
-------
App::Document
A reference to the test document that was created.
"""
doc = App.newDocument(file_name)
_msg(16 * "-")
_msg("Filename: {}".format(file_name))
_msg("If the units tests fail, this script may fail as well")
_create_frame()
# Part primitives
_msg(16 * "-")
_msg("Plane")
plane = App.ActiveDocument.addObject("Part::Plane", "Plane")
plane.Length = 2000
plane.Width = 2000
_msg(16 * "-")
_msg("Box")
displacement = Vector(2500, 0, 0)
box = App.ActiveDocument.addObject("Part::Box", "Box")
box.Length = 1500
box.Width = 1500
box.Height = 1500
box.Placement.Base = displacement
_msg(16 * "-")
_msg("Cylinder")
displacement += Vector(3000, 750, 0)
cylinder = App.ActiveDocument.addObject("Part::Cylinder", "Cylinder")
cylinder.Radius = 500
cylinder.Height = 1500
cylinder.Placement.Base = displacement
_msg(16 * "-")
_msg("Cone")
displacement += Vector(2000, 0, 0)
cone = App.ActiveDocument.addObject("Part::Cone", "Cone")
cone.Radius1 = 700
cone.Height = 2000
cone.Placement.Base = displacement
_msg(16 * "-")
_msg("Sphere")
displacement += Vector(2750, 0, 0)
sphere = App.ActiveDocument.addObject("Part::Sphere", "Sphere")
sphere.Radius = 1000
sphere.Placement.Base = displacement
_msg(16 * "-")
_msg("Ellipsoid")
displacement += Vector(2700, 0, 0)
ellipsoid = App.ActiveDocument.addObject("Part::Ellipsoid", "Ellipsoid")
ellipsoid.Radius1 = 500
ellipsoid.Radius2 = 1000
ellipsoid.Placement.Base = displacement
_msg(16 * "-")
_msg("Torus")
displacement += Vector(2700, 0, 0)
torus = App.ActiveDocument.addObject("Part::Torus", "Torus")
torus.Radius1 = 1000
torus.Radius2 = 300
torus.Placement.Base = displacement
_msg(16 * "-")
_msg("Prism")
displacement += Vector(2700, 0, 0)
prism = App.ActiveDocument.addObject("Part::Prism", "Prism")
prism.Circumradius = 450
prism.Height = 1200
prism.Placement.Base = displacement
_msg(16 * "-")
_msg("Wedge")
displacement = Vector(0, 4500, 0)
wedge = App.ActiveDocument.addObject("Part::Wedge", "Wedge")
wedge.Xmin = 0
wedge.Ymin = 0
wedge.Zmin = 0
wedge.X2min = 0
wedge.Z2min = 0
wedge.Xmax = 1000
wedge.X2max = 1800
wedge.Ymax = 1000
wedge.Zmax = 200
wedge.Z2max = 1200
wedge.Placement.Base = displacement
_msg(16 * "-")
_msg("Helix")
displacement += Vector(3500, 0, 0)
helix = App.ActiveDocument.addObject("Part::Helix", "Helix")
helix.Pitch = 200
helix.Height = 2000
helix.Radius = 350
helix.Placement.Base = displacement
_msg(16 * "-")
_msg("Spiral")
displacement += Vector(2100, 0, 0)
spiral = App.ActiveDocument.addObject("Part::Spiral", "Spiral")
spiral.Growth = 200
spiral.Radius = 100
spiral.Rotations = 4
spiral.Placement.Base = displacement
_msg(16 * "-")
_msg("Circle")
displacement += Vector(2500, 0, 0)
circle = App.ActiveDocument.addObject("Part::Circle", "Circle")
circle.Radius = 500
circle.Placement.Base = displacement
_msg(16 * "-")
_msg("Ellipse")
displacement += Vector(2500, 0, 0)
ellipse = App.ActiveDocument.addObject("Part::Ellipse", "Ellipse")
ellipse.MajorRadius = 800
ellipse.MinorRadius = 400
ellipse.Placement.Base = displacement
_msg(16 * "-")
_msg("Vertex")
displacement += Vector(2500, 0, 0)
vertex = App.ActiveDocument.addObject("Part::Vertex", "Vertex")
vertex.Placement.Base = displacement
if App.GuiUp:
vertex.ViewObject.PointSize = 8
_msg(16 * "-")
_msg("Line")
displacement += Vector(2500, 0, 0)
line = App.ActiveDocument.addObject("Part::Line", "Line")
line.Z2 = 1500
line.Placement.Base = displacement
_msg(16 * "-")
_msg("Regular polygon")
displacement += Vector(2500, 0, 0)
polygon = App.ActiveDocument.addObject("Part::RegularPolygon",
"RegularPolygon")
polygon.Circumradius = 750
polygon.Placement.Base = displacement
App.ActiveDocument.recompute()
if App.GuiUp:
Gui.runCommand("Std_ViewFitAll")
Gui.runCommand("Std_ViewIsometric")
# Export
if not file_path:
file_path = App.getUserAppDataDir()
out_name = os.path.join(file_path, file_name + ".FCStd")
doc.FileName = out_name
if save:
doc.save()
_msg(16 * "-")
_msg("Saved: {}".format(out_name))
return doc
## @}
if __name__ == "__main__":
create_test_file()