Repository navigation
Releases
Releases · emirmrkaljevic/mesh2cad
v0.25.0
- Parametric CadQuery, OpenSCAD, and FreeCAD export of a filleted L-bracket now also write Z-axis through-holes in the foot and the upright as editable numbers:
base_hole_N_d,base_hole_N_x, andbase_hole_N_yin the foot, andleg_hole_N_d,leg_hole_N_x, andleg_hole_N_yin the upright. CadQuery fillets the L and then cuts the cylinder. OpenSCAD subtracts it after the offset profile. FreeCAD cutsPart.makeCylinderaftermakeFillet.mesh2cad edit,mesh2cad params, and the MCP toolslist_params/edit_paramslist and edit those numbers. A hole that leaves the foot or the upright, or that overlaps another, is refused and nothing is written. Holes along X or Y, blind holes, counterbores, and a hole that crosses from the exclusive foot into the exclusive upright are not supported. - On the synthetic bracket (outer 40×30 mm, legs 8 mm, height 12 mm, r=3 mm) with an Ø4 foot hole at (24, 4) and an Ø4 upright hole at (4, 19), CadQuery and OpenSCAD write the script on 3 of 3 seeds with no noise and on 2 of 3 at 0.05 mm. The gate is unchanged: max deviation at most max(4·tol, 0.1), volume error at most 1%.
- With no noise the limit is 0.100 mm.
fillet_ris 3.0 and both diameters are 4.0. CadQuery deviates by 0.0036 mm (volume error 0.001%) and OpenSCAD by 0.0032 mm (0.000%). - At 0.05 mm the limit is 0.200 mm. Seeds 1 and 2 are written, with
fillet_r3.0, both diameters 4.0, andbase_x39.9. The worst is seed 1: CadQuery 0.1817 mm (volume error 0.174%), OpenSCAD 0.1950 mm (0.174%). Seed 0 is refused before that gate, with "fillet is not the four vertical corners of a rectangular base". - The foot hole alone is written on 3 of 3 seeds with no noise. At 0.05 mm CadQuery writes 1 of 3 (seed 0, 0.1371 mm, volume error 0.040%) and OpenSCAD writes 2 of 3 (seed 0 at 0.1372 mm, seed 2 at 0.1877 mm, volume error 0.097%). CadQuery refuses seed 2 at 0.211 mm (volume error 0.10%), 0.011 mm over the limit. Both refuse seed 1 at 0.317 mm and 0.316 mm (volume error 0.32%). The upright hole alone is written on 3 of 3 with no noise and on 1 of 3 at 0.05 mm (seed 2: CadQuery 0.1446 mm, volume error 0.022%; OpenSCAD 0.1325 mm, 0.023%). Seed 0 is the same fillet refusal. Seed 1 is refused at 0.207 mm on CadQuery and 0.206 mm on OpenSCAD (volume error 0.04%).
- At 0.2 mm the limit is 0.800 mm and none of the three layouts is six vertical fillets plus those holes, so nothing is written. The foot-and-upright part is refused with "fillet is not the four vertical corners of a rectangular base" on seeds 0 and 1, and "a rounded edge is not part of an editable outline" on seed 2.
- FreeCAD writes the macro when the same CadQuery check passes.
freecadcmdwas not on PATH for this measurement, so the FreeCAD deviation is not reported; the macro text is checked on the fits that pass. Withoutfreecadcmd, CadQuery (or OpenSCAD, when CadQuery is not installed) runs that deviation and volume check. A fit those backends refuse is not written. The foot-only seed 2 at 0.05 mm is one of those, even though OpenSCAD would pass it. The command still says the FreeCAD solid itself was unverified, because FreeCAD did not measure it.
v0.24.0
- Parametric CadQuery, OpenSCAD, and FreeCAD export write an L-bracket extruded along Z when every vertical edge, including the inner corner, shares one radius. The parameters are
fillet_r, the outer sizesbase_x,base_y, andbase_t, and the leg thicknessesleg_xandleg_y. CadQuery extrudes the L and calls.edges("|Z").fillet(fillet_r). OpenSCAD rounds the same profile withoffset, outer corners and the inner corner. FreeCAD extrudes the polygon and callsmakeFilleton the edges parallel to Z.mesh2cad edit,mesh2cad params, and the MCP toolslist_params/edit_paramslist and edit those numbers. An edit that makes the vertical rounds meet, or a leg that is no longer thinner than the outer size, is refused and nothing is written. - On the synthetic bracket (outer 40×30 mm, legs 8 mm, height 12 mm, r=3 mm) CadQuery and OpenSCAD write the script on 3 of 3 seeds with no noise and on 2 of 3 at 0.05 mm. The gate is unchanged: max deviation at most max(4·tol, 0.1), volume error at most 1%.
- With no noise the limit is 0.100 mm.
fillet_ris 3.0,base_x40,base_y30,base_t12,leg_x8, andleg_y8. CadQuery deviates by 0.0036 mm (volume error 0.007%) and OpenSCAD by 0.0032 mm (0.005%). - At 0.05 mm the limit is 0.200 mm. Seeds 0 and 2 are written, with
fillet_r3.0. Seed 0 fitsbase_xas 39.9. The worst of those is seed 0: CadQuery 0.1788 mm (volume error 0.141%), OpenSCAD 0.1787 mm (0.143%). Seed 2 is CadQuery 0.1696 mm (0.013%) and OpenSCAD 0.1701 mm (0.015%). Seed 1 is refused at 0.209 mm on CadQuery and 0.213 mm on OpenSCAD (volume error 0.07% on both). - At 0.2 mm the limit is 0.800 mm and the fit is not six vertical fillets, so nothing is written. Seed 0 is refused with "curved surface whose axis is not aligned with X, Y or Z", seed 1 with "boss does not start on the top face", and seed 2 with "fillet is not the four vertical corners of a rectangular base".
- FreeCAD writes the macro when the same gate passes.
freecadcmdwas not on PATH for this measurement, so the FreeCAD deviation is not reported; the macro text is checked on the fits that pass. Withoutfreecadcmd, CadQuery (or OpenSCAD, when CadQuery is not installed) runs that deviation and volume check. A fit those backends refuse is not written. Seed 1 at 0.05 mm is one of those. The command still says the FreeCAD solid itself was unverified, because FreeCAD did not measure it. - A sharp L with no fillets stays an outline. A rectangular plate keeps
fillet_ron its four vertical corners, and a fully filleted box keepsedge_fillet_r. Prusa script deviations are unchanged. A free sphere is still refused.
v0.23.0
- A rectangular box with every edge filleted (
edge_fillet_r) can also carry a straight boss on its top face whose wall clears the rounds. The eight corner spheres stay part of that radius. CadQuery fillets the box and then fuses the cylinder. OpenSCAD adds the cylinder after the filleted-box union. FreeCAD callsmakeFilletand then fuses the cylinder. The boss isboss_1_d,boss_1_h,boss_1_x, andboss_1_y, andmesh2cad edit,mesh2cad params, and the MCP toolslist_params/edit_paramslist and edit them. An edit that collapses the box is refused and nothing is written. - On the synthetic 40×30×20 mm box with r=2.5 mm and a centered Ø10 boss 6 mm tall (refused in 0.22.0), CadQuery and OpenSCAD write the script on 3 of 3 seeds at 0, 0.05, and 0.2 mm noise. The gate is unchanged: max deviation at most max(4·tol, 0.1), volume error at most 1%.
- With no noise the limit is 0.100 mm.
edge_fillet_rfits as 2.52 andboss_1_das 9.98. CadQuery deviates by 0.0253 mm (volume error 0.016%) and OpenSCAD by 0.0243 mm (0.014%). - At 0.05 mm the limit is 0.200 mm, with
edge_fillet_r2.5 andboss_1_d10.0. The worst is seed 2: CadQuery 0.1704 mm (volume error 0.202%), OpenSCAD 0.1574 mm (0.204%). - At 0.2 mm the limit is 0.800 mm.
boss_1_dis 10.0 andboss_1_h6.0, but the fitted radius drifts to 2.57 to 2.65 mm, soedge_fillet_ris written as 2.6 or 2.7 instead of 2.5. The worst is seed 2: CadQuery 0.6589 mm (volume error 0.121%), OpenSCAD 0.6589 mm (0.123%). - FreeCAD writes the macro (fillet, then fuse).
freecadcmdwas not on PATH for this measurement, so the FreeCAD deviation is not reported; the macro text is checked. - A boss that does not clear the edge rounds is not written as this feature. A free sphere and the filleted L-bracket are still refused, and a torus fillet whose axis is not Z is still refused.
v0.22.0
- A rectangular box with every edge filleted (
edge_fillet_r) can also carry an axis-aligned through-hole whose wall clears the rounds. The eight corner spheres stay part of that radius. CadQuery fillets the box and then cuts the hole. OpenSCAD subtracts the cylinder from the filleted-box union. FreeCAD callsmakeFilletand then cuts the cylinder.mesh2cad edit,mesh2cad params, and the MCP toolslist_params/edit_paramsstill list and editedge_fillet_randhole_1_d. An edit that collapses the box, or a hole larger than the wall, is refused and nothing is written. - On the synthetic 40×30×20 mm box with r=3 mm and an Ø8 hole through the top, CadQuery and OpenSCAD write the script on 3 of 3 seeds at 0, 0.05, and 0.2 mm noise. The gate is unchanged: max deviation at most max(4·tol, 0.1), volume error at most 1%.
- With no noise the tolerance is 0.01 mm and the limit is 0.100 mm. CadQuery deviates by 0.0299 mm (volume error 0.023%) and OpenSCAD by 0.0293 mm (0.021%). The coarse tessellation fits
edge_fillet_ras 3.02 andhole_1_das 7.98. - At 0.05 mm the limit is 0.200 mm. All 3 seeds are written, with
edge_fillet_r3.0 andhole_1_d8.0. The worst is seed 1: CadQuery 0.1792 mm (volume error 0.193%), OpenSCAD 0.1798 mm (0.195%). - At 0.2 mm the limit is 0.800 mm. All 3 seeds are written, again with
edge_fillet_r3.0 andhole_1_d8.0. The worst is seed 2: CadQuery 0.6124 mm (volume error 0.005%), OpenSCAD 0.6135 mm (0.007%). - FreeCAD writes the macro (fillet, then cut).
freecadcmdwas not on PATH for this measurement, so the FreeCAD deviation is not reported; the macro text is checked. - A boss on the filleted box is still fitted as the plain rounded box and refused by the deviation gate (6.000 mm, limit 0.200, volume error 1.93%). A free sphere (the spherical dome) is still refused with "sphere faces are not supported yet". The filleted L-bracket stays on the STEP path.
v0.21.0
- Parametric CadQuery, OpenSCAD, and FreeCAD export write a rectangular box with every edge filleted at one radius as
edge_fillet_r, together withbase_x,base_y, andbase_t.fillet_ris still only the four vertical corners.mesh2cad edit part.py --set edge_fillet_r=4changes that number, and so domesh2cad paramsand the MCP toolslist_paramsandedit_params. CadQuery uses.edges().fillet(edge_fillet_r). FreeCAD usesmakeFilleton every edge of the box. OpenSCAD unions three boxes, twelve cylinders, and eight spheres. A hole or a boss on that box is not written. - On the synthetic 40×30×20 mm box with r=3 mm the script is written on 3 of 3 seeds at 0, 0.05, and 0.2 mm noise, on CadQuery, OpenSCAD, and FreeCAD. None were refused. The gate is unchanged: max deviation at most max(4·tol, 0.1), volume error at most 1%.
- With no noise
edge_fillet_ris 3.0. CadQuery deviates by 0.0088 mm (volume error 0.013%), OpenSCAD by 0.0087 mm (0.010%), FreeCAD by 0.0100 mm (0.016%). The limit is 0.100 mm. - At 0.05 mm the limit is 0.200 mm and
edge_fillet_ris 3.0 on every seed. The worst is CadQuery 0.163 mm (volume error 0.009%), OpenSCAD 0.163 mm (0.007%), FreeCAD 0.164 mm (0.012%). - At 0.2 mm the limit is 0.800 mm and
edge_fillet_ris 3.0 on every seed. The fitted radius is 3.09 to 3.11 mm and rounds to 3.0 within the tolerance, so the script is farther from the noisy mesh than the STEP solid (Hausdorff 0.116 mm). The worst is CadQuery 0.664 mm (volume error 0.025%), OpenSCAD 0.664 mm (0.028%), FreeCAD 0.664 mm (0.022%). - An Ø8 hole through the top of the filleted box is refused with "sphere faces are not supported yet". A boss on the top face is fitted as the plain rounded box and then refused by the same gate: deviation 6.000 mm (limit 0.200), volume error 1.93%. Nothing is written.
v0.20.0
- A rectangular box with every edge filleted at one radius is rebuilt as one exact solid: 6 planes, 12 partial cylinders and 8 sphere octants. Each cylinder is tangent to the two walls it joins, each sphere is tangent to the three faces at that corner, and the fillet axis passes through the two corner centres. On a 40×30×20 mm box with r=3 mm this is exact on 3 of 3 seeds at 0, 0.05 and 0.2 mm noise. With no noise the radius error is 0.006 mm, the Hausdorff distance is 0.023 mm, and the volume error is 0.01%. At 0.05 mm the worst radius error is 0.007 mm and the Hausdorff is 0.035 mm (volume error 0.07%). At 0.2 mm the worst radius error is 0.112 mm and the Hausdorff is 0.116 mm (volume error 0.18%). A fillet that meets a sphere in any other layout is unchanged and still falls back to a valid solid. There is no new script parameter.
fillet_ris still only the four vertical corners of a rectangular base.
v0.19.0
- Parametric CadQuery, OpenSCAD, and FreeCAD export write a quarter-torus fillet on the box vocabulary as a named parameter.
boss_N_filletis the round at the base of a straight vertical boss.hole_N_rim_randhole_N_bot_rim_rare the rounds on the top and bottom rims of a vertical hole.hole_N_floor_ris the fillet where a blind hole's floor meets the wall.mesh2cad edit script.py --set boss_1_fillet=3(orhole_1_rim_r, orhole_1_floor_r) rebuilds the solid. A fillet whose axis is not Z is refused.fillet_ris still the four vertical corners of a rectangular base. An L-bracket fillet and a spherical corner stay on the STEP path. - With no noise the usual gate holds (max deviation at most max(4·tol, 0.1) = 0.1 mm, volume error at most 1%). The Ø16 boss with a 2 mm base fillet recovers
boss_1_fillet = 2.0. CadQuery deviates by 0.0099 mm (volume error 0.020%), OpenSCAD by 0.0099 mm (0.015%), FreeCAD by 0.0099 mm (0.025%). The Ø12 hole with a 1.5 mm top round recovershole_1_rim_r = 1.43. CadQuery 0.0274 mm (0.045%), OpenSCAD 0.0274 mm (0.043%), FreeCAD 0.0274 mm (0.047%). Both rims at 1.2 mm recover 1.14. CadQuery 0.0224 mm (0.027%), OpenSCAD 0.0224 mm (0.025%), FreeCAD 0.0224 mm (0.029%). The Ø10 blind hole with a 1.5 mm floor fillet recovershole_1_floor_r = 1.46and depth 12.0. CadQuery 0.0143 mm (0.006%), OpenSCAD 0.0138 mm (0.007%), FreeCAD 0.0141 mm (0.005%). - At 0.05 mm (limit 0.200 mm) the boss fillet is found on 3 of 3 seeds and the script is written on seed 0 only (
boss_1_fillet = 1.7, CadQuery 0.178 mm, OpenSCAD 0.178 mm, FreeCAD 0.179 mm). Seeds 1 and 2 are refused at 0.226 mm and 0.238 mm. The single hole rim is written on 2 of 3 seeds (hole_1_rim_r = 1.3; seed 0 is 0.157 mm CadQuery, 0.158 mm OpenSCAD and FreeCAD; seed 1 is 0.144 mm). Seed 2 is refused at 0.241 mm and 1.35% volume. Both rims on seed 0 are refused at 0.201 mm on all three backends. The blind floor on seed 0 is not a torus and is refused with "sphere faces are not supported yet". - At 0.2 mm (limit 0.800 mm) the torus is not recovered, so the fillet parameter is absent. The boss is the sharp cylinder: CadQuery refuses seed 0 at 0.807 mm and writes seeds 1 and 2 at 0.758 mm and 0.719 mm. OpenSCAD seed 0 is refused at 0.867 mm. FreeCAD seed 0 is written at 0.745 mm. That sharp solid is 0.793 mm from the true boss. The Ø12 hole and the hole with both rims are written as sharp holes (CadQuery worst 0.625 mm and 0.705 mm). The blind hole is refused on seed 0 with "hole profile is not a plain or countersunk hole".
v0.18.0
- A fillet between a plane and a coaxial cylinder is rebuilt as one torus face in the STEP solid, tangent to both neighbours. A boss base and a rounded hole rim use the inner equator (major radius = cylinder radius + minor radius). The floor of a blind hole uses the outer equator (major radius = cylinder radius minus the minor radius). The fidelity report counts torus faces and lists each major and minor radius.
- On a plate with an Ø16 boss and a 2 mm base fillet this is exact on 3 of 3 seeds at 0 and at 0.05 mm noise. With no noise the minor radius error is 0.008 mm (major 10.012 mm, Hausdorff 0.026 mm). At 0.05 mm the worst minor error is 0.279 mm and the Hausdorff is 0.150 mm. An Ø12 hole with a 1.5 mm top round is exact with no noise (minor error 0.068 mm, major 7.451 mm, Hausdorff 0.026 mm) and on 2 of 3 seeds at 0.05 mm (worst minor error 0.247 mm). The third seed is a valid faceted solid, Hausdorff 0.633 mm. Both rims at 1.2 mm are exact with no noise (minor error 0.061 mm). An Ø10 blind hole with a 1.5 mm floor fillet is exact with no noise (minor 1.463 mm, major 3.529 mm, Hausdorff 0.021 mm).
- At 0.2 mm the boss fillet and the single hole rim are not recovered. The STEP is the sharp cylinder and its planes, Hausdorff 0.864 mm on the boss and 0.681 mm on the hole, and it is still one valid solid. At 0.05 mm the blind floor falls back (Hausdorff up to 0.992 mm) and a hole with both rims rounded falls back (Hausdorff up to 1.835 mm). A torus that does not sew does the same. CadQuery, OpenSCAD, and FreeCAD export still refuse a torus;
fillet_rremains the four vertical corners of a rectangular base.
v0.17.0
mesh2cad params script.pylists the named parameters of a CadQuery, OpenSCAD, or FreeCAD script mesh2cad generated: name, value, kind, and unit when one is known (base_x,hole_1_d,hole_1_depth,fillet_r,extrude_len,outline, and the rest).mesh2cad edit script.py --set hole_1_d=8 --set base_x=+2rewrites those numbers and leaves every other byte unchanged. A leading+or-is a delta. It re-renders with CadQuery in-process, or withopenscad/freecadcmdwhen that program is onPATH, and prints volume and bounding box before and after, and whether the solid is valid.--in-placeor--output-scriptwrites the script.-owrites STEP or STL. OpenSCAD writes STL. If the program is missing, the script can still be rewritten and the command says it did not render.-oin that case writes nothing.- An unknown parameter is refused and the message lists the valid names. An edit that is not one valid solid, or a hole larger than the wall it sits in, is refused and no file is written. Outline point lists are listed and are not edited as a single number.
- MCP tools
list_params(script_path)andedit_params(script_path, changes, output_path?).edit_paramsupdates the script in place and returns the old and new values, the rendered path, validity, the volume and bounding-box delta, and warnings.
0.16.0
- Parametric FreeCAD export:
mesh2cad convert in.stl --freecad out.FCMacrowrites a macro for the same parts as--cadqueryand--openscad. Parameter names match (base_t,hole_1_d,hole_1_cbore_d,fillet_r,extrude_len,outline,cut_1,clip_1_d, and the rest). The macro uses FreeCAD's Part API:makeBox,makeCylinder,makeCone, a polygon extruded along X, Y, or Z,fuse/cut/common, andmakeFilleton the four vertical corners of a rectangular base. freecadcmdruns the macro and the solid is compared with the mesh before the file is written. The gate is unchanged: max deviation at most max(4·tol, 0.1), volume error at most 1%. Iffreecadcmdis not onPATHthe file is still written and the command reports it unverified. FreeCAD is not a Python dependency. Parts outside the vocabulary exit with code 2 and a reason. STEP output is unchanged.- The macro is a Part script. Changing a dimension means editing the named number and running the macro again. It does not build a PartDesign body or a constrained sketch.
- MCP tool
to_freecad(input_path, output_path?, tol?). - All six Prusa parts export the macro. plug-aligner deviates by 0.0000 mm. endstop-block by 0.0421 mm (limit 0.1 mm). y-belt-idler by 0.1693 mm (limit 0.192 mm). y-belt-holder by 0.0896 mm (limit 0.154 mm). y-motor-holder by 0.1843 mm (limit 0.266 mm). y-rod-holder by 0.1300 mm (limit 0.138 mm). Volume error stays under 1% on each, which is the same gate as CadQuery and OpenSCAD. CadQuery and OpenSCAD deviations are unchanged. Exact STEP is unchanged on all six parts.