# *************************************************************************** # * (c) 2020 Eliud Cabrera Castillo * # * * # * 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()