All notable changes to this project will be documented in this file.
- Add
pyslm.hatching.utils.getContoursFromShapelyPolygon1374dd5373abf4232a91563cdafeb0222e2616d8 - Pytest Unit Testing Framework 7f5ebceecd27095f478d7fd2d178a55952236c35
- Formatting and Linting via Ruff and mypy c58c38d6cbcad23cc18503d00fc760a7a9c1cbd4
- Change build script to use
pyproject.tomlfor building PySLM wheels using hatchling (#58) - cbd78b7950633c5b29db3efe5a246a49d413b280 - Updated build project dependency requirements to use specific version of numpy, trimesh, shapely 98f758f9488c47969afd124eb2faa7348368e6f3
- Minimum version of Python is now 3.9, because 3.8 is now considered unmaintained
- Removal of
setup.py7c39ad8c0ac608ccffcd28a4524409b5942fd31e
- Added documentation covering basic example usage for the operation of PySLM 8eee1f96f13b4b7915ea862ee643984f8e1e2f41
- In
pyslm.supportadded a method for sweeping polygons along a pathsweepPolygonbased on Trimesh 7ac9e4fd771fa6abc65753c21735c1592dbc9aa1 - In
pyslm.supportforBlockSupportBasethat are connected directly to the baseplate are now smoothly created df2dd41e0b04160a7ed4c96f8f7c0aed71003430 - In
pyslm.supportadded perforated teeth to the upper and lower surfaces ofGridBlockSupport70c510cce31b0cb297873252fa72c2f67b386423 - In
pyslm.supportadded a method for checking the approximate intersection of a cylindrical strutcheckStrutCylinderIntersectionf2baa3383b1c01512d3a74d74af65931b14f7986 - In
pyslm.supportadded regions for strengthening the support on upper and lower regions of both the skin and slices inGridBlockSupport0121971813e50296e3f6d9bab0beb431067443d2 - In
pyslm.support.GridBlockSupportadded methods for labelling generated geometry based on the interior X,Y grid and across the skin 71fb3efd1a8376809850f83760639fa331181436 - In
pyslm.support.GridBlockSupportadded methods for slicing the geometry into layers and performing sorting to provide correct orientation 4c7000b604b3f231d0160312aa2cd5a170de69f1 - Added methods
pyslm.hatching.poly2paths,pyslm.hatching.paths2clipperandpyslm.hatching.clipper2pathsfor conversion between shapely polygons and pyclipr paths adcb371e62e45a5dbadfa46e4e5589a0f5cb28ae - In
pyslm.support.GridBlockSupportthe grid truss slices include additional face-attributesorderandtypedescribing their order of generation across X,Y planes. This is used for the scan order when slicing and hatching these regions
- Fixed a bug in
pyslm.hatching.BaseHatcher.hatch- internal contour is offset when needed 344941fdd951152b69d81e97a957fd2709251151 - Fixed a bug in
pyslm.support.GridBlockSupport- fixes for identifying top and bottom paths of the skin and fixed ordering during slicing - 7d4c9e1294f17334f97016c22062eccd3111b2a6 - Fixed a bug in
BlockSupportGenerator.identifySupportRegionswhere supports connected to the build-plate were not self-intersected with the original mesh - f1d9c95a5921bf6070799f05fd940cc056d852b1 - Fixed a bug in
pyslm.analysis.getLayerGeometryTimewhere the jump distance was not correctly calculated resulting in anNaNby dividing by zero by checking the build-style jump speed is greater than zero d169b30302e79c73ea37f9759feff72784dda4e6 - Fixed a bug in
pyslm.analysis.getLayerGeometryTimewhere the jump delay was not added and default argument is used alternatively in the calculation 3d996ef44284959d40b81918ecfbfba4ef240d0c - Fixed bug in
pyslm.support.render.Canvasnot capturing the depth correctly - 114ffa9259f844549c4aa509c5e3d4b2db4ab081 - Invalid projection of extruded prismatic mesh in
support.GridBlockSupportGenerator.identifySupportMethods. Generated mesh is not automatically processed by Trimesh prior to extrusion to prevent mismatch between vertices. df2dd41e0b04160a7ed4c96f8f7c0aed71003430 - Fixed the
pyslm.supportmodule to use manifold3D library instead of pycork df2dd41e0b04160a7ed4c96f8f7c0aed71003430 - Updated to Trimesh version 4.0 081dede9a14357fe9fb706470a5d42e698b763a6
- Update to Shapely Library version 2.0 081dede9a14357fe9fb706470a5d42e698b763a6
- Fixes for IslandHatcher when processing empty regions f9ff55ecc2709c3514b1d14f815cb2620856be97
pyslm.visualise.plotwill now plot point geometries when included ddb7f27f6c18b6d494870e5823dbede7987e2e12- In
pyslm.visaulise.plot, the method will correctly plotshapely.geometry.MultiPolygonafter the update to Shapely 2.0 99c7a475e10b9c138e061f56aa28f7780f2a5eac - Update imports to prevent namespace polluting
- In
pyslm.analysisfixed bug for build-time calculation usingpyslm.geometry.PointsGeometry7f1e42ae6b30ee157a96303fa6e0b6e5632eabfd
- Change PySLM to use manifold library instead of pycork bad0fc0285835e998a3acdb02afa7e0ed02619ee
- Change PySLM to use pyclipr library 081dede9a14357fe9fb706470a5d42e698b763a6
pyslm.visualise.plotby default only plots for a single layer 02ccc1d503580cea802d996f6d6532c2f7526c8f- Removal of custom pyclipper bindings and removing the requirement for compiling via cython f434d77c8670bbb0bf5e289d9b7d2c011a9dcc92
- Cannot currently use
mergeMeshinpyslm.support.GridBlockSupportdue to change to the manifold boolean CSG library
- Added support for Mac OS X (Monterey 12.3) 3b4103bf2e01f3e7175adcf0f1bed5a429bad361
- Added the Support Module:
pyslm.support9ee1f6668b56e76137c3dade178dc837460fc056 0f6e29815a5d6a65789d27c49131d49486415d31- Added generic abstract class
support.SupportStructurefor providing the generic infrastructure for defining support structures (e.g. block, grid, tree) and common methods - Introduced Various Classes -
BaseSupportGeneratorandBlockSupportGeneratorfor Generating BlockSupports - Introduced
support.geometry.extrudeFacemethod for extruding block faces with variable height - Introduced method
support.geometry.triangualtePolygonFromPathsto triangulate polygons generated in the Support Module - Introduced a method
support.render.projectHeightMapfor projecting height/depth maps using OpenGL to calculate the depth map for projecting supports - Introduced classes
GridBlockSupport,GridBlockSupportGeneratorand associating mapping function for generating polygon truss grid supports - Introduced classes for identifying and generating conforming support volume
- Self-intersecting support volumes are generated via the pycork library e438bef493553b18dd1ee5031a226d04b63a5c67
- Added generic abstract class
- Added point delay and jump speed in
pyslm.geometryand these are used in calculations performed inpyslm.analysis55cc7e79c9e6f1f5f8b25d38dd6a48639b422fd2
- Fix
pyslm.analysistools to use jump speed and jump delay parameters 3bce788b5362062755e0fb7f17757b4174d1e877 - Fixed
plotSequentialshowing an invalid scan vector at the end of the contour scanning c46ae70980ac652d30ce7e3a2aa6667246752744 - Fixed the offsetting applied to contour/border scans. An overall offset is not applied if a contour scan is not used 40fb789164aa76e25222e1c822e3462eb1c6fd82
- Updated compatability for Python 3.9 01f79a6dcfb9625d05e3d12a5b1901d32324c7ca
- Updated examples 639e042575e019d3b3d6f3a6272cb5f140f45606
- Added soft dependency for PyQt5 in the dependencies needed for support generation 2ced797da62f9b8099c8c9f30c4ff7c6677b2b6d
- Added example_laser_iterator.py for demonstrating the basic use of the iterator class 0f26f4a4aa33d80769d9713157e8b675cb48a862
- Added example_parametric_study.py for showing how create a design of experiment study 54dfca913b23ad71b025f5eec646f5f896b605b8
- Added
fixGeometryoption added to repair polygons generated following slicing - Added various modes for polygon line simplification - including absolute and 'line' based on the mean edge length in the polygon. 4e6bf23cccb4ac091d44381649a11288ce495033
- Added a simplification tolerance based on relative or absolute tolerance for contours 078cc554bba4c22ce1a36f682b401fb72d59f335
- Added a method
visualise.plotSequentialto plotLayerGeometryin sequential order with jump vectors 4a0cd56c21e35ee09ec8afdc408471e8211d057d - Added an option to modify order of scanning for hatch and contour scan vectors using
Hatching.scanContourFirstproperty. 1120ee5b041dd0cdc9eb35f507d4ba13aa9ff02e - Added a sort method -
UnidirectionalSortclass, that simply provides a pass through method to not modify scan vectors 0f2304f5f58612ca619e3f94276d38b6d85fe5e8 - Added a sort method -
FlipSortclass, that flips the scan vectors 6d4c77984a25d80e9c4061860416fd75804a476f - Added an Iterator Module (
analysis/iterator.py) for processing through the LayerScan Geometry. Various supporting classes are used for efficiently parsing across the Layer and associated Layer Geometries. This includes several classes including- (
Iterator- base class LayerGeometryIterator- Iterate acrossLayerGeometrysScanVectorIterator- Iterate across individual Scan VectorsScanIterator- Incremental position at a fixed time
- (
- Added property
Part.extents,Part.getProjectedHullandPart.getProjectedArea4d8747fa3083c2005df8ddf6817db2f4102b84f2 - Method for visualising convex polygons from
ShapelyorClipperLib, using Matplotlib.patches. This cannot be visualise polygons with holes - these are treated as boundaries 1bbf60298c634ea918d354f45c979aff3f4bedcc
- Contour scan vectors are scanned following hatch vectors by default 1120ee5b041dd0cdc9eb35f507d4ba13aa9ff02e
ModelValidatoruses LayerGeometry's Model Id is used for finding the associatedModel76587c58b7240822ea3b6314a404137af3342509- Contour offset is correctly generated 8b37f5a37520b5abbace9f24e629826a3326e8bb
- (BUG FIX) Final scan vector is correctly flipped e935217f13dceda55f1f514f7c8cbdac852024df
- (BUG FIX) Remove debugging messages during Layer Generation fe9c31dacc8ce95d09999acd7ef83db4ff70669f
- Added BaseHatcher.boundaryBoundingBox() to obtain the bounding box of a collection of polygons - returned internally from PyClipper
- Added a
simplifyBoundaries()in hatching/utils.py to simplify polygons (shapely and raw coordinate boundaries using scikit image) -hatching.generateExposurePoints()now generates forContourGeometry - Added
ModelValidatorclass inpyslm.geometry.utilsto verify the input of build files generated prior to exporting in libSLM - e75b486c090b4ead712d2ddb950577e058c419e6 - Added example_exporting_multilayer.py showing how to export a multi-layer build using libSLM - 52090085fd52336e2cc2181ff886a8aebbdca1ef
- Added example_custom_island_hatcher.py showing a method to create customised island scan
- Added a
HexagonIslandClass to demonstrate custom implementation of island regions - Added example_build_time_analysis.py to show the processes of estimating build-time
- Added example_custom_sinusoidal_hatching.py for showing custom hatch-infills - c7c1a4304dd4f2a4cdf0286385ccb68d3968ba5e
- Added a method
BaseHatcher.clipContourLinesfor clipping open scan paths to fill a region - Added an analysis method utility
getBuildStyleByIdto find theBuildStylegiven a model id and build style id - Added a method in plotLayer to visualise the scan vector properties (e.g. length)
- Added properties for geometry class to be compatible with libSLM 0.2.2 - providing multi-laser compatibility
- Added the method
Part.getTrimeshSliceto get atrimesh.Path2Dslice from the geometry - bb2ebb9c4514a05cc1728c810deef7fc6c3239e4 - Added a method to find the 'inverse' projection of support faces
- Added
visualise.visualiseOverhangfor showing overhang regions - Added
geometry.utils.ModelValidatorfor validating the build inputs (layers, models) when exporting to a machine build file - Added a
.gitignorefile - 498d9116dd9d91698695669d5d1309a7941e0dd9
- Internally generateHatching() and hatch() in subclasses of
BaseHatcherto generate the internal hatch geometry to use multiple boundaries to ensure that the subregion generation sorting covers the global region. - Internally
BaseHatcher.boundaryBoundingBox()is called instead ofBaseHatcher.polygonBoundingBox() - Removed the for loop which previously iterate across boundaries.
- Updated IslandHatcher to use this behaviour
- Updated BaseHatcher to use static members where possible
- Analysis method
analysis.getLayerTimerequires aModellist - Analysis methods use point exposure time and distance using
analysis.getLayerTime - Removed debug messages when visualising layers
- Fixed import of submodules in PySLM - 66f48fd9929d244b836583f24c087602cdc31a96
- Fixed
LaserMode,LaserTypeEnums to be compatible with libSLM - 52090085fd52336e2cc2181ff886a8aebbdca1ef - Jump distance between
LayerGeometryis accounted for in the Analysis Submodule - Fixed visualisation of PointGeometry exposures - 135bed81bb57b867f2499311bacd7ad2d7aa67d9
- Updated Documentation across the project
- Fixed the setup.py source tarball to include the PyClipper extensions.
Development branch of PySLM with new features.
- Added transformations to the Part class so that these can be translated, rotated, scaled efficiently on demand
- Updates on the geometry are cached when geometry method is called.
- Method included to drop the part to the platform
- Added an enhanced version and higher performance of generated clippable island regions.
- Introduced
InnerHatchRegionin the hatching submodule - Introduce
IslandHatcherwhich re-implements the Island/Checkerboard Scan Strategy
- Introduced
- Added a method to alternate adjacent scan vectors in the hatching module
- Added a method to
generateExposurePointmethod in the hatching submodule to create exposure points from scan vectors - Added a Geometry Submodule in pyslm.geometry
- libSLM Python Extension Library is used if available
- A set of native compatible Python classes are available if libSLM is not available
- Classes include:
LayerLayerGeometryModelBuildStyleHeaderHatchGeometry,ContourGeometry,PointsGeometry
- Added an Analysis Module in pyslm.analysis:
- Total length of all the scan vectors across a layer
- Total jump length between scan vectors across all vectors
- Total scan time across a layer
- Added a method to generate bitmap slices from a single image is included in Part
- Added a Visualise Submodule in pyslm.visualise
- Introduced a method to visualise a collection of shapely polygons
- Introduced a method to generate a heatmap based on a set of exposure points in a layer
- Introduced an updated method to plot layerGeometry
- Plot scan order
- Plot arrow direction
- Plot the layers correctly in 3D
- Introduced several new examples:
- 3D slicing example - example_3d.py
- Multi-threading example - example_3d_multithread.py
- Island hatching example using new implementation - example_island_hatcher.py
- Bitmap slicing of parts - example_bitmap_slice.py
- A heat-map/exposure map visualisation - example_heatmap.py
Part.getVectorSlicemethod by default returns a list of coord pathsPart.getVectorSlicenow returns a list ofShapely.geometry.Polygonif optional argument is passedhatching.IslandHatcherin the previous release is changed toBasicIslandHatcher
- Further changes and improvements to the overall documentation.
- Updated requirements.txt to ensure documentation can correctly build on readthedocs
The first release of PySLM in its distributed packaged form via PyPi. This release includes basic slicing and hatching using a custom version of PyClipper built internally using setuptools.