Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
229 commits
Select commit Hold shift + click to select a range
d5ed24e
feat: add principal axes calculation for pointclouds for pose estimation
DamienGilliard Apr 9, 2025
f43e197
fix: add cilantro KMeans clustering to main header
DamienGilliard Apr 9, 2025
4809f30
feat: add empty component for axis calculation. code must be written
DamienGilliard Apr 9, 2025
3486fa4
feat: add python binding for axis calculation
DamienGilliard Apr 9, 2025
ad8e895
feat: add poses module for pose historic saving
DamienGilliard May 7, 2025
4d5c71b
feat-wip: add code to main axis calculation component. OK but reliabi…
DamienGilliard May 7, 2025
256fd88
feat: add 'save' mathod to DFPoses classes to dump it in a JSON
DamienGilliard May 9, 2025
3971d40
fix: update the metadata of the axis calculation component
DamienGilliard May 9, 2025
13c4759
feat: make pose calculation component leaner
DamienGilliard May 9, 2025
78231f7
feat: slight refactor of df_poses module
DamienGilliard May 9, 2025
d967ea8
fix: simplify k-means clustering implementation
DamienGilliard May 9, 2025
9aadeff
Merge branch 'patch_ws' into implement_pca
DamienGilliard May 9, 2025
188dc81
feat: add unit test to KMeans clustering of normals
DamienGilliard May 10, 2025
e80b266
feat-wip: tentative planning added for DF2 development - TBD
DamienGilliard May 15, 2025
136e3dc
ADD Http Listener
eleniv3d May 15, 2025
56a80d5
fix: marameter name from singular to plural, and corresponding list a…
DamienGilliard May 16, 2025
38aab63
ADD TCP Listener
eleniv3d May 16, 2025
2fd80df
FIX lintering
eleniv3d May 27, 2025
aeecaa2
FIX tcp component + add example file sender
eleniv3d May 27, 2025
5cacef1
Merge branch 'main' into IO
eleniv3d May 28, 2025
4aafbf8
WIP FIX WS Receiver
eleniv3d May 28, 2025
0d98ad0
fix: have new elements pick-up the indexes of the already-existing el…
DamienGilliard May 28, 2025
00ceefa
fix: typo in nickname of i_clouds
DamienGilliard May 28, 2025
3c90378
feat: add a component to crop point clouds
DamienGilliard Jun 17, 2025
a514125
feat: add cropping capability to DFPointCloud
DamienGilliard Jun 17, 2025
e09fb79
FIX websocket component
eleniv3d Jun 17, 2025
f07431f
feat: add binding for cropping capability of point cloud
DamienGilliard Jun 17, 2025
46c6d6f
FIX light refactoring and input reorder
eleniv3d Jun 22, 2025
c546fec
ADD drop btns and panel with standard inputs similar to vizualization…
eleniv3d Jun 22, 2025
a0289fc
fix: simplify cropping component
DamienGilliard Jul 22, 2025
a98b80f
feat: add point cloud subtraction method and implement it in component
DamienGilliard Jul 22, 2025
9964b85
feat-wip: add sequence schema of the df2 workflow as it is now developed
DamienGilliard Jul 22, 2025
8509138
FIX rename python file
eleniv3d Jul 24, 2025
2588656
FIX remove repeated ws from stickys
eleniv3d Jul 25, 2025
683b4e8
ADD warning if trying to load data from tcp/ws listener without start…
eleniv3d Jul 25, 2025
27cad32
ADD sleep to prevent CPU spin
eleniv3d Jul 25, 2025
bd004f7
ADD doc strings
eleniv3d Jul 25, 2025
b383bc1
FIX add docstrings
eleniv3d Jul 25, 2025
7f11249
FIX missing lines from PKG-INFO
eleniv3d Jul 25, 2025
484810f
FIX RML.Warning
eleniv3d Jul 25, 2025
fcc1936
feat: add point cloud duplication for python binding
DamienGilliard Jul 30, 2025
d65fb17
feat: add capacity to crop with any brep, and keep trace of in and ou…
DamienGilliard Jul 30, 2025
10d1943
feat: add point cloud intersection calculation
DamienGilliard Jul 30, 2025
02b4756
feat: add point cloud intersection calculation component
DamienGilliard Jul 30, 2025
bbbee07
feat: add point cloud merge component
DamienGilliard Jul 30, 2025
718a3a6
feat: add point cloud intersection calculation to DFPointCloud
DamienGilliard Jul 30, 2025
4d287f2
FIX cleanup warnings that didnt work
eleniv3d Jul 30, 2025
c65b4ae
Merge pull request #152 from diffCheckOrg/IO
DamienGilliard Jul 30, 2025
f7b1ae6
Update code.py
DamienGilliard Jul 30, 2025
3d33b61
remove unused import
DamienGilliard Jul 30, 2025
f684ca0
Merge pull request #160 from diffCheckOrg/DamienGilliard-patch-3-to-m…
DamienGilliard Jul 30, 2025
e7dad06
fix: rename SubstractCloud to CloudDifference and fix mistakes in met…
DamienGilliard Aug 4, 2025
5308e44
fix: rename MergeCloud to CloudUnion and fix mistakes in metadata
DamienGilliard Aug 4, 2025
164ef82
fix: metadata in CropCloud and IntersectCloud
DamienGilliard Aug 4, 2025
1baf875
fix: small typos again in the metadata
DamienGilliard Aug 4, 2025
8cdd175
feat: add possibility to crop pc with any box
DamienGilliard Aug 4, 2025
3eebaa5
feat: improve cropping component following @eleniv3d 's comments
DamienGilliard Aug 4, 2025
bc42fe2
fix: rename CloudCrop to CloudSplit
DamienGilliard Aug 4, 2025
e2dead4
feat-wip: creation of pose comparison component
DamienGilliard Aug 7, 2025
cdef3ba
fix: remove unneeded markdown file
DamienGilliard Aug 7, 2025
961b28b
fix: committing insignificant changes to example file because ignorin…
DamienGilliard Aug 10, 2025
3828e8e
fix: improvements to code component and metadata following @eleniv3d …
DamienGilliard Aug 10, 2025
2181ad9
feat: add plane property to DFBeam
DamienGilliard Aug 11, 2025
cedfcc1
feat: add max id to CAD segmentation to allow segmentation during fab…
DamienGilliard Aug 11, 2025
953f5f4
feat: remove the i_stop_after_id parameter because it is moved to a d…
DamienGilliard Sep 2, 2025
adf1576
feat: create new truncate_assembly component
DamienGilliard Sep 2, 2025
f7016b4
fix: main axis of DFBeam computed such that the main axes are also th…
DamienGilliard Sep 2, 2025
de7b580
fix: add ghpythonlib. to the overrides of mypy
DamienGilliard Sep 2, 2025
5745db8
feat: update DFMainPCAxes to save the new poses only when user trigge…
DamienGilliard Sep 2, 2025
a4e54d2
fix: name of class in truncate_assembly component
DamienGilliard Sep 9, 2025
a637b5d
fix: remove unused function parameter in DF_CAD_segmentator component
DamienGilliard Sep 9, 2025
a1d5266
FIX minor cosmetic changes
eleniv3d Oct 2, 2025
eb3ab9a
Merge pull request #155 from diffCheckOrg/feature/point_cloud_utils
eleniv3d Oct 2, 2025
2513713
fix: change index in TruncateAssembly component
DamienGilliard Oct 2, 2025
a851476
fix: change sign of index change in TruncateAssembly component
DamienGilliard Oct 2, 2025
b00e145
fix: output the history as ghtree
DamienGilliard Oct 15, 2025
6b38623
feat: add fallback to obb when knn on normals gives insufficiently di…
DamienGilliard Oct 15, 2025
daff8bb
ADD check i_assembly has enough beams and if there is an error on a c…
eleniv3d Oct 20, 2025
067903e
FIX rename files assossiated with Pose Estimation component to have t…
eleniv3d Oct 20, 2025
1fad289
FIX typo and use not all sticky but a single namespaced key df_poses
eleniv3d Oct 20, 2025
2995041
FIX remove re-assignying new_xDirection and fix projection to use tth…
eleniv3d Oct 20, 2025
f29ec53
Merge pull request #163 from diffCheckOrg/implement_pca_patch/improve…
eleniv3d Oct 20, 2025
22d4fda
Merge branch 'release/2.0.0' into implement_pca
DamienGilliard Oct 20, 2025
4d2f3b1
fix: small merge issue
DamienGilliard Oct 20, 2025
b2af2b8
Merge pull request #149 from diffCheckOrg/implement_pca
DamienGilliard Oct 20, 2025
d5f437c
fix: update insubordinate gh file
DamienGilliard Oct 20, 2025
7d41f20
Merge branch 'release/2.0.0' of https://github.com/diffCheckOrg/diffC…
DamienGilliard Oct 20, 2025
9475b6e
feat: add a plane property to beams, automatically computed and with …
DamienGilliard Oct 28, 2025
7348919
feat: bump up version from 1.3.0 to 1.3.1 in manifest.yml
DamienGilliard Jul 10, 2025
f15c055
Update manifest.yml
DamienGilliard Jul 10, 2025
0c3835d
ACTION_BOT: Sync version for release (#158)
github-actions[bot] Jul 10, 2025
3d1be89
Update manifest.yml
DamienGilliard Jul 10, 2025
63feaf7
Update manifest.yml
DamienGilliard Jul 10, 2025
eb0b20d
feat-wip: creation of pose comparison component
DamienGilliard Aug 7, 2025
b2a10b3
fix: remove unneeded markdown file
DamienGilliard Aug 7, 2025
af989eb
feat: add a plane property to beams, automatically computed and with …
DamienGilliard Oct 28, 2025
28d6bb2
feat-wip: use assembly instead of explicit list of planes
DamienGilliard Oct 28, 2025
b97e8c6
rebasing to release/2.0.0 so the pose comparison component has the la…
DamienGilliard Oct 28, 2025
c1f2c86
feat: remove unneeded message about evaluation during assembly of aft…
DamienGilliard Oct 28, 2025
b466cd1
fix: rebase variable name mixup
DamienGilliard Oct 28, 2025
32d9456
feat: update metadata of pose comparison conponent
DamienGilliard Oct 28, 2025
0500f54
feat: adapt pose comparison component so it also works with the full …
DamienGilliard Oct 30, 2025
12bd9e3
feat: remove type hint for i_measured_poses so it takes datatree as well
DamienGilliard Oct 30, 2025
5683c05
fix: use plane instead of pose
DamienGilliard Oct 30, 2025
6660ecb
fix: use consistent naming between pose estimation and pose comparison
DamienGilliard Oct 30, 2025
e0e314c
feat-fix: pose comparison takes (or converts to) data tree as input a…
DamienGilliard Oct 30, 2025
8f430e6
feat: CleanAssociatedClusters now keep the per-face structure
DamienGilliard Nov 24, 2025
de36ecb
feat: implement the per-face change to CleanAssociatedClusters in the…
DamienGilliard Nov 24, 2025
f51f3c0
feat: update component to use datatree with cloud per face
DamienGilliard Nov 24, 2025
4ea8161
feat: add FitPlaneRANSAC method to DFPointCloud
DamienGilliard Nov 24, 2025
765090c
feat; add fit_plane_ransac to binding
DamienGilliard Nov 24, 2025
f0d0a23
fix-wip: temporarily disacctivate test on KMeansClusteringOfNormals, …
DamienGilliard Nov 24, 2025
4ada8de
feat: add test for RANSAC plane fitting
DamienGilliard Nov 26, 2025
afddd46
fix: remove unneeded ply file
DamienGilliard Nov 26, 2025
9e6eed5
fix: make variable names coherent-er
DamienGilliard Nov 26, 2025
5beaaaf
fix: more robust check for validity of poses that are used in the pos…
DamienGilliard Jan 7, 2026
8c54bc5
fix: create DFBeam base plane with coherent orientation with plane de…
DamienGilliard Jan 8, 2026
ddcbf3c
fix: discard null face normals in the pose estimation
DamienGilliard Jan 8, 2026
c892eaa
fix: remove unused lists previously used for debugging
DamienGilliard Jan 8, 2026
9f57cd8
fix: actually update the o_beam_cloud point cloud list
DamienGilliard Jan 8, 2026
71ea6bc
fix: correct the null vector check
DamienGilliard Jan 8, 2026
b512b99
Merge pull request #168 from diffCheckOrg/implement_pca_patch/plane_d…
eleniv3d Jan 13, 2026
2395fb0
FIX remove bc from bc * []
eleniv3d Jan 13, 2026
bb9b60c
Merge pull request #161 from diffCheckOrg/feature/pose_comparison
eleniv3d Jan 13, 2026
f03a7d3
feat: add sophisticated parameter to discard segments that are too far
DamienGilliard Jan 16, 2026
07eccda
fix: associate all clusters before calling clean_unassociated_clusters
DamienGilliard Jan 16, 2026
b8cadee
feat: inverse the normals that have z component under -0.8
DamienGilliard Jan 16, 2026
a4b4f21
feat: adapt distance computation depending of angle in CAD segmentation
DamienGilliard Jan 16, 2026
858d156
feat-wip: creating fallbac solution when only 2 parallel faces found
DamienGilliard Jan 23, 2026
4d0538d
fix-wip: use absolute value of dot product to test colinearity
DamienGilliard Jan 23, 2026
1b2903f
feat: fully deal with first association before cleaning up unassociat…
DamienGilliard Jan 23, 2026
be12c8f
fix: remove unneeded ostream that was added for debugging
DamienGilliard Jan 28, 2026
68c5550
fix: remove unneded timestamp variable
DamienGilliard Jan 28, 2026
84a5d21
Merge pull request #171 from diffCheckOrg/feature/improve_CAD_segment…
eleniv3d Jan 29, 2026
9fcdfa6
feat: add parameter to association to check or not iof the points are…
DamienGilliard Jan 30, 2026
552e374
feat-wip: implement the 2-step CAD segmentation
DamienGilliard Jan 30, 2026
00b7337
feat-wip: add maximum distance for cluster association
DamienGilliard Feb 5, 2026
3811b56
feat: add ICP registration in CAD segmentation component and expose b…
DamienGilliard Feb 11, 2026
0d5fda9
feat: improve geometry center calculation
DamienGilliard Feb 12, 2026
9fef73c
feat: update and cleanup script with new registration step prior to a…
DamienGilliard Feb 12, 2026
6c84650
feat: get rig of angleAssociationThreshold parameter that is now unused
DamienGilliard Feb 12, 2026
c750977
feat: add i_make_registration parameter to component
DamienGilliard Feb 12, 2026
510b242
FIX add missing input to metadata
eleniv3d Feb 18, 2026
e5115ba
FIX add default values for i_max_correspondence_distance_icp and i_ma…
eleniv3d Feb 18, 2026
5a2ef4d
Merge pull request #174 from diffCheckOrg/feature/improve_CAD_segment…
eleniv3d Feb 18, 2026
92cbb82
fix-wip: Remove OG Eigen submodule
DamienGilliard Feb 19, 2026
9d71b2e
fix-wip: Add Eigen 3.4.0 as submodule
DamienGilliard Feb 19, 2026
943dc0e
Remove Eigen submodule
DamienGilliard Feb 19, 2026
3fa5a78
feat-wip: revert back to OG eigen
DamienGilliard Feb 19, 2026
9bc3f4d
feat: switch to exact 5.0.1 release of eigen
DamienGilliard Feb 19, 2026
a19c693
fix: Remove mismatched Eigen submodule
DamienGilliard Feb 19, 2026
b3beb4b
feat: clean eigen submodule added
DamienGilliard Feb 19, 2026
24cc56d
feat: dummy push to force push of new submodule setup
DamienGilliard Feb 19, 2026
e3a9981
Merge pull request #177 from diffCheckOrg/fix/eigen_submodule_issue
eleniv3d Feb 20, 2026
62e93d9
fix-wip: re-test mypy locally
DamienGilliard Feb 20, 2026
cb6d6ff
fix-wip: test type ignore hint (copilot suggestion)
DamienGilliard Feb 20, 2026
93e4c38
Merge pull request #178 from diffCheckOrg/fix/mypy_check_of_setupdotpy
DamienGilliard Feb 20, 2026
3165a68
fix-wip: again a small type hiunt fix for mypy
DamienGilliard Feb 20, 2026
5d99b95
Merge pull request #179 from diffCheckOrg/fix/mypy_check_of_setupdotpy
DamienGilliard Feb 20, 2026
5272035
fix-wip: force mypy version 1.19.1 to make sure all checks are done w…
DamienGilliard Feb 20, 2026
49e84e6
fix: int-float type hint mismatch in DFBeam class
DamienGilliard Feb 20, 2026
abe98d6
Merge pull request #180 from diffCheckOrg/fix/mypy_check_of_setupdotpy
DamienGilliard Feb 20, 2026
373b833
feat: create compute_oriented_bounding_box function in utils
DamienGilliard Mar 8, 2026
4e581a2
fix: exclude poits out of face from brep face loop in DFFace.from_bre…
DamienGilliard Mar 8, 2026
2325233
fix: slight refactor of .run method in JointDetector
DamienGilliard Mar 8, 2026
5f0cf7a
feat: add allow_curved_joint_faces parameter in joint detector and DF…
DamienGilliard Mar 8, 2026
f458f69
feat: add allow_curved_joint_faces parameter in DF_build_assembly com…
DamienGilliard Mar 8, 2026
e87984a
feat: align detected pose vector to DFBeam's (no vector reversing)
DamienGilliard Mar 8, 2026
6aae7c5
fix: coherent spacing fix (cleanup)
DamienGilliard Mar 8, 2026
9a74d41
fix: reversed x-y order in variable passing
DamienGilliard Mar 8, 2026
a999efe
feat: point association a bit more logical and simple
DamienGilliard Mar 8, 2026
08d0b8d
feat-fix: add extremely important brep.Faces.ShrinkFaces() in compone…
DamienGilliard Mar 9, 2026
14703e8
feat: add a compare_to_rh_plane() method to DFPose dataclass
DamienGilliard Mar 18, 2026
8e21f4d
feat-wip: add DFPoseResults dataclass
DamienGilliard Mar 18, 2026
420bd43
feat: add from_gh_tree method to DFPosesAssembly class
DamienGilliard Mar 19, 2026
07bbc9a
fix: complete docstring of from_gh_tree() method
DamienGilliard Mar 19, 2026
28548ca
feat-wip: csv exporter now accepts DFPoseResults object as i_result
DamienGilliard Mar 19, 2026
5d65302
feat: complement DFPoseResults with several methods, notabely compute…
DamienGilliard Mar 19, 2026
090244d
fix: undefined behaviour if gh tree has branchcout 1 in from_gh_tree()
DamienGilliard Mar 19, 2026
f115187
feat: add static method from_rh_plane to DFPose
DamienGilliard Mar 22, 2026
59a2a33
feat: expose poses detected at segmentation step
DamienGilliard Mar 22, 2026
e8c2670
feat: add input parameter i_poses_from_icp to accept poses detected a…
DamienGilliard Mar 22, 2026
544aab8
fix: add reset of pose assembly berfore recreating it from gh tree
DamienGilliard May 17, 2026
8136c3d
fix: Compact mesh face in the conversion from DFFace to Rhino.Geometr…
DamienGilliard May 17, 2026
777bda2
feat: update how poses are added to history in DF_pose_comparison
DamienGilliard May 17, 2026
eccaf03
fix: typo in description of return of DFBuildAssembly
DamienGilliard May 17, 2026
5bd68c8
feat: various small improvements on segmentation implementation (no c…
DamienGilliard May 17, 2026
efee4e5
fix: small cleanup of documentation
DamienGilliard May 17, 2026
08e4bf6
feat: parameter tweaking in DFPointCloud
DamienGilliard May 17, 2026
554f81c
fix: small simplification of IsPointOnFace method
DamienGilliard May 17, 2026
79f6758
fix: remove unused variable in DFMesh.cc
DamienGilliard Sep 7, 2026
6cac79d
fix: keep o_pose_from_icp always same size as df_beams
DamienGilliard Sep 7, 2026
66e5cf4
fix: improve component docu
DamienGilliard Sep 7, 2026
7ef4fc4
fix: specifically check for None data amd accept data == 0
DamienGilliard Sep 7, 2026
1f4c2d1
fix: defensive coding against none i_poses_from_icp
DamienGilliard Sep 7, 2026
fe5f1c6
fix: small defense against elements that might have no pose in history
DamienGilliard Sep 7, 2026
d79cd59
fix: explicitely import df_poses
DamienGilliard Sep 7, 2026
22119a8
fix: disable a check creating an open3d issues with newer versions of…
DamienGilliard Sep 7, 2026
c99c2e8
Merge branch 'feature/export_pose_csv' of https://github.com/diffChec…
DamienGilliard Sep 7, 2026
8a1c6a1
fix: disable a check that is not compatible with newer versions of MSVC
DamienGilliard Sep 8, 2026
09c4913
feat: small adaptation of cmake workflow to dll's are copied at build…
DamienGilliard Sep 8, 2026
610dc87
fix: avoid normalizing a null vector
DamienGilliard Sep 9, 2026
7ad3378
Merge pull request #186 from diffCheckOrg/feature/export_pose_csv
DamienGilliard Sep 9, 2026
352fb01
fix: a bit of defensive coding suggested by guithub copilot
DamienGilliard Sep 11, 2026
1dc3fcd
Merge pull request #182 from diffCheckOrg/fix/plane_detection_and_joi…
DamienGilliard Sep 11, 2026
6a39456
Merge pull request #187 from diffCheckOrg/feature/export_pose_csv
DamienGilliard Sep 11, 2026
17ea054
fix: check on null normal was wrongly formulated
DamienGilliard Sep 11, 2026
f276cd7
fix: close server only when thread-safe
DamienGilliard Sep 11, 2026
a69d500
fix: require equests in package dependencies
DamienGilliard Sep 11, 2026
55cb370
fix: reset good mesh index at each loop begin
DamienGilliard Sep 11, 2026
23cd3b2
fix: avoid changing Rhino objects in other thread than Rhino UI threa…
DamienGilliard Sep 11, 2026
b04b9c9
fix: change points, colors and normals always together [no ci]
DamienGilliard Sep 11, 2026
2d718b1
Merge branch 'release/2.0.0' of https://github.com/diffCheckOrg/diffC…
DamienGilliard Sep 11, 2026
301c21b
feat: small cleanup of README to remove deprecated info [no ci]
DamienGilliard Sep 11, 2026
55e13c6
feat: add mention of pose estimation in main README
DamienGilliard Sep 11, 2026
bf81839
feat: add illustrations of pose detectionn
DamienGilliard Sep 11, 2026
9f32cb6
fix: also include plane in _get_state_()
DamienGilliard Sep 11, 2026
53541c6
fix: correcting previous fix about type hinting, this time compatible…
DamienGilliard Sep 11, 2026
4fb0bdf
Potential fix for pull request finding
DamienGilliard Sep 11, 2026
6849592
fix: handle case of n_elements decreasing, as defensive coding (not i…
DamienGilliard Sep 11, 2026
b5271ad
fix: duplicate before shrink
DamienGilliard Sep 11, 2026
4515f23
fix: small tweak to authorship
DamienGilliard Sep 11, 2026
3f51672
Merge branch 'release/2.0.0' of https://github.com/diffCheckOrg/diffC…
DamienGilliard Sep 11, 2026
c07e1f9
feat: bump version and fix typo
DamienGilliard Sep 11, 2026
2ef94a8
feat: bump python package version to 2.0.0
DamienGilliard Sep 11, 2026
e4455a2
fix: handle plane in _setstate_()
DamienGilliard Sep 11, 2026
d5fb6a0
feat: add check that cloud is not none in colozizing
DamienGilliard Sep 11, 2026
abfca2a
feat: handle null point clouds in cloud2mesh comparison
DamienGilliard Sep 11, 2026
09e6e0b
feat: raise specific error if rh_cloud is none during conversion
DamienGilliard Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@
url = https://github.com/diffCheckOrg/submodule-cilantro.git
[submodule "deps/eigen"]
path = deps/eigen
url = https://gitlab.com/libeigen/eigen.git
url = https://github.com/diffCheckOrg/submodule-eigen.git
3 changes: 2 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ repos:
files: \.py$

- repo: https://github.com/pre-commit/mirrors-mypy
rev: 'v1.11.1'
rev: 'v1.19.1'
hooks:
- id: mypy
files: (src/gh|tests|invokes\.py)
Expand All @@ -34,6 +34,7 @@ repos:
types-requests==2.31.0,
numpy==2.0.1,
pytest==8.3.1,
websockets>=10.4,
types-setuptools>=71.1.0.20240818
]
args: [--config=pyproject.toml]
Expand Down
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ include(options)
# disabling warnings
if (MSVC)
add_compile_options(/wd4003)
# Disable _SECURE_SCL to avoid issues with stdext::checked_array_iterator
# in newer MSVC versions with Open3D's bundled fmt library
add_compile_definitions(_SECURE_SCL=0 _HAS_STDEXT_CHECKED_ARRAY_ITERATOR=0)
endif()

# check that the -DCMAKE_BUILD_TYPE is set
Expand Down
41 changes: 9 additions & 32 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@
</p>


![demo](https://github.com/user-attachments/assets/3c9f353d-7707-4630-aa6d-fe59cbdeae2f)
![demo](./assets/img/intro_illustration_with_final_distances_and_pose_estimation.png)

# DiffCheck: CAD-Scan comparison

With `diffCheck`, you can easily compare your scans and 3D models of timber structures or joinery to measure precision and see the differences at a glance, [here](https://diffcheckorg.github.io/diffCheck/quickstart.html)!

`diffCheck` can also function as a general purpose point cloud processing toolset and we hope that the digital community will use it, see the interest, and contribute to this open-source project we starting!

`diffCheck` is originally developed and now maintained by Andrea Settimi (PhD), Damien Gilliard (PhD) from the [Laboratory of Timber Construction (IBOIS, lab head: Prof. Yves Weinand)](https://www.epfl.ch/labs/ibois/), Eleni Skevaki (PhD) and Dr. Marirena Kladeftira (Post-Doc) from the [Laboratory for Creative Computation (CRCL, lab head: Prof. Stefana Parascho)](https://www.epfl.ch/labs/crcl/) here at [Ecole Polytechnique Fédérale de Lausanne (EPFL)](https://www.epfl.ch/en/).
`diffCheck` 1 was originally developed by Dr. Andrea Settimi, Damien Gilliard (PhD candidate) from the [Laboratory of Timber Construction (IBOIS, lab head: Prof. Yves Weinand)](https://www.epfl.ch/labs/ibois/), Eleni Skevaki (PhD candidate) and Dr. Marirena Kladeftira (Post-Doc) from the [Laboratory for Creative Computation (CRCL, lab head: Prof. Stefana Parascho)](https://www.epfl.ch/labs/crcl/) here at [Ecole Polytechnique Fédérale de Lausanne (EPFL)](https://www.epfl.ch/en/). Development for the version 2 was done by Damien Gilliard (still PhD candidate) from the [Laboratory of Timber Construction (IBOIS, lab head: Prof. Yves Weinand)](https://www.epfl.ch/labs/ibois/) and Eleni Skevaki (PhD candidate) from the [Laboratory for Creative Computation (CRCL, lab head: Prof. Stefana Parascho)](https://www.epfl.ch/labs/crcl/).

`diffCheck` is designed to be user-friendly and can be used either via a Grasshopper plug-in, we provide tutorials and online documentation for each component and its Python API.

Expand All @@ -38,50 +38,27 @@ Open your Grasshopper canvas and search for the `DF` components!

## Functionalities

`diffCheck` is a toolset that allows you to compare a 3D model of a structure to evaluate its assembly or joint's quality and accuracy.
`diffCheck` is a toolset that allows you to compare a 3D model of a structure to evaluate its assembly or joint's quality and accuracy. It can be used on finished assemblies to evaluate their quality, but also to detect poses during fabrication, to allow fabricator to react to pose discrepancies on-the-fly.

<div align="center">
<img src="./assets/img/placeholder_additive.png" width="600">
<p>Example of several structures assembled with different digital technologies.</p>
<p>Example of several finished structures assembled with different digital technologies.</p>
</div>
<div align="center">
<img src="./assets/img/placeholder_subtractive.png" width="600">
<p>Example of joinery evaluation.</p>
</div>

<div align="center">
<img src="./assets/img/pose_detection.png" width="400">
<p>Example of pose estimation.</p>
</div>

## Documentation

The full documentation, with tutorials, automatic documentation for GHComponents and PythonAPI is available [here](https://diffcheckorg.github.io/diffCheck/).



## Roadmap

```mermaid
gantt
dateFormat YYYY-MM-DD
title diffCheck - general overview
excludes weekends

section Publication
Abstract edition :active, absed, 2024-03-01, 2024-03-15
Submission abstract ICSA :milestone, icsaabs, 2024-03-15, 0d
Paper edition :paperd, 2024-10-01, 2024-10-30
Submission paper ICSA :milestone, icsapap, 2024-10-30, 0d

section Code development
Backend development :backenddev, after icsaabs, 6w
Rhino/Grasshopper integration :rhghinteg, after backenddev, 6w
Documentation & Interface :docuint, after fabar, 3w

section Prototype testing
Fabrication of AR Prototype :crit, fabar, 2024-07-01, 2024-08-30
Fabrication of CNC Prototype :crit, fabcnc, 2024-07-01, 2024-08-30
Fabrication of Robot Prototype :crit, fabrob, 2024-07-01, 2024-08-30
Data collection and evaluation :dataeval, after fabrob, 4w
```

## How to contribute

If you want to contribute to the project, please refer to the [contribution guidelines]([./CONTRIBUTING.md](https://diffcheckorg.github.io/diffCheck/contribute.html)).

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/img/pose_detection.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions cmake/copy_dlls_script.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# This script is executed at build time to copy DLLs
# It uses variables passed from the main CMake configuration

# Remove old DLLs from the destination directory
file(GLOB old_dlls "${DIR_TO_CLEAN}/*.dll")
if(old_dlls)
file(REMOVE ${old_dlls})
endif()

# Get all DLLs from the source directory (evaluated at build time)
file(GLOB dll_files "${SRC_DIR}/*.dll")

# Copy each DLL to the destination directory
foreach(dll_file ${dll_files})
get_filename_component(dll_name ${dll_file} NAME)
message(STATUS "Copying ${dll_name} to ${DST_DIR}")
file(COPY ${dll_file} DESTINATION ${DST_DIR})
endforeach()
30 changes: 15 additions & 15 deletions cmake/external_tools.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -232,19 +232,19 @@ endfunction()

# ------------------------------------------------------------------------------
function (copy_dlls directory_to_copy_dlls post_build_target)
message (STATUS "Erasing old DLLs and copy new ones to ${directory_to_copy_dlls}")
file(GLOB files ${directory_to_copy_dlls}/*.dll)
foreach(file ${files})
message(STATUS "Removing ${file}")
file(REMOVE ${file})
endforeach()
file(GLOB files ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}/*.dll)
foreach(file ${files})
message(STATUS "Copying ${file} to ${directory_to_copy_dlls}")
add_custom_command(TARGET ${post_build_target} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${file}
${directory_to_copy_dlls}
)
endforeach()
message (STATUS "Configuring DLL copy to ${directory_to_copy_dlls} at build time")

# Get the path to the script relative to the project source dir
set(COPY_DLLS_SCRIPT ${PROJECT_SOURCE_DIR}/cmake/copy_dlls_script.cmake)

# Add a post-build command that will copy DLLs at build time
# This ensures the file list is evaluated at build time, not configure time
add_custom_command(TARGET ${post_build_target} POST_BUILD
COMMAND ${CMAKE_COMMAND}
-DDIR_TO_CLEAN="${directory_to_copy_dlls}"
-DSRC_DIR="${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}"
-DDST_DIR="${directory_to_copy_dlls}"
-P "${COPY_DLLS_SCRIPT}"
COMMENT "Copying DLLs to ${directory_to_copy_dlls}"
)
endfunction()
2 changes: 1 addition & 1 deletion deps/eigen
Submodule eigen updated from 11fd34 to 2036a2
2 changes: 1 addition & 1 deletion deps/pybind11
Submodule pybind11 updated 159 files
Binary file modified environment.yml
Binary file not shown.
4 changes: 2 additions & 2 deletions manifest.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: diffCheck
version: 1.3.1
version: 2.0.0
authors:
- Andrea Settimi
- Damien Gilliard
Expand All @@ -13,6 +13,6 @@ keywords:
- Grasshopper
- PointCloudProcessing
- TimberConstruction
- Benchamark
- Benchmark
- Scanning
icon: logo.png
3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ module = [
"GH_IO.*",
"clr.*",
"diffcheck_bindings",
"diffCheck.diffcheck_bindings"
"diffCheck.diffcheck_bindings",
"ghpythonlib.*"
]
ignore_missing_imports = true

Expand Down
3 changes: 3 additions & 0 deletions src/diffCheck.hh
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
#include <loguru.hpp>

#include <cilantro/cilantro.hpp>
#include <cilantro/clustering/kmeans.hpp>

#include <Eigen/Dense>

// diffCheck includes
#include "diffCheck/log.hh"
Expand Down
7 changes: 7 additions & 0 deletions src/diffCheck/IOManager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,11 @@ namespace diffCheck::io
std::filesystem::path pathCloud = pathTestData / "test_pc_for_SOR_101pts_with_1_outlier.ply";
return pathCloud.string();
}

std::string GetTwoConnectedPlanesPlyPath()
{
std::filesystem::path pathTestData = GetTestDataDir();
std::filesystem::path pathCloud = pathTestData / "two_connected_planes_with_normals.ply";
return pathCloud.string();
}
} // namespace diffCheck::io
2 changes: 2 additions & 0 deletions src/diffCheck/IOManager.hh
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,6 @@ namespace diffCheck::io
std::string GetRoofQuarterPlyPath();
/// @brief Get the path to the plane point cloud with one outlier
std::string GetPlanePCWithOneOutliers();
/// @brief Get the path to the two connected planes ply test file
std::string GetTwoConnectedPlanesPlyPath();
} // namespace diffCheck::io
21 changes: 14 additions & 7 deletions src/diffCheck/geometry/DFMesh.cc
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,12 @@ namespace diffCheck::geometry
Eigen::Vector3d v1 = this->Vertices[triangle[1]];
Eigen::Vector3d v2 = this->Vertices[triangle[2]];
Eigen::Vector3d n = (v1 - v0).cross(v2 - v0);
n.normalize();
double n2 = n.squaredNorm();

// Project the point onto the plane of the triangle
Eigen::Vector3d projectedPoint = point - n * (n.dot(point - v0));
// Handle degenerate triangle
if (n2 < 1e-20){continue;}// skip this triangle

Eigen::Vector3d projectedPoint = point - n * (n.dot(point - v0) / n2);

// Compute vectors
Eigen::Vector3d v0v1 = v1 - v0;
Expand All @@ -130,16 +132,21 @@ namespace diffCheck::geometry
double dot12 = v0v1.dot(v0p);

// create u,v isoparametric mapping to the triangle where (u,v) = (1,0) if projectedPoint = v2, (u,v) = (0,1) if projectedPoint = v1 and (u,v) = (0,0) if projectedPoint = v0
double invDenom = 1.0 / (dot00 * dot11 - dot01 * dot01);
double denom = dot00 * dot11 - dot01 * dot01;
if (std::abs(denom) < 1e-20)
continue;

double invDenom = 1.0 / denom;
double u = (dot11 * dot02 - dot01 * dot12) * invDenom;
double v = (dot00 * dot12 - dot01 * dot02) * invDenom;

// Check if point is in triangle
if ((u >= -associationThreshold / 100) && (v >= -associationThreshold / 100) && (u + v <= 1 + associationThreshold / 100))
double epsilon = 1e-6;

if ((u >= -epsilon) && (v >= -epsilon) && (u + v <= 1 + epsilon))
{
// Check if the point is close enough to the face
double maxProjectionDistance = associationThreshold * std::min({(v1 - v0).norm(), (v2 - v1).norm(), (v0 - v2).norm()}) ;
if ((projectedPoint - point).norm() < maxProjectionDistance)
if ((projectedPoint - point).squaredNorm() < associationThreshold * associationThreshold)
Comment on lines +146 to +149
{
return true;
}
Expand Down
Loading
Loading