From fb3fa3a0fe1559ff5e0b8a8805985ad9f2ca3a62 Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Tue, 23 Dec 2025 17:03:27 +0100 Subject: [PATCH 01/12] Updated fender.jbeam so it is connected frame.jbeam --- examples/jbeam/fender.jbeam | 59 ++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/examples/jbeam/fender.jbeam b/examples/jbeam/fender.jbeam index b17795de..32a3e024 100644 --- a/examples/jbeam/fender.jbeam +++ b/examples/jbeam/fender.jbeam @@ -221,36 +221,53 @@ {"beamStrength":20000,"beamDeform":1000}, {"breakGroup":"fender_r"}, {"breakGroupType":1}, - ["bfr0","fr16"], - ["bfr0","fr7"], - ["bfr1","fr16"], - ["bfr1","fr7"], - ["bfr2","fr16"], - ["bfr2","fr7"], + ["bfl0","rl_f8"], + ["bfl0","rl_f6"], + ["bfl1","rl_f6"], + ["bfl2","rl_f6"], + ["bfr0","rl_f9"], + ["bfr0","rl_f7"], + ["bfr1","rl_f7"], + ["bfr2","rl_f7"], + //Middle {"beamDeform":18000}, {"beamStrength":4000}, {"breakGroupType":1}, - ["bfr3","fr16"], - ["bfr4","fr16"], - ["bfr4","fr7"], + ["bfl3","rl_f10"], + ["bfl3","rl_f11"], + ["bfl4","rl_f11"], + + ["bfr3","rl_f12"], + ["bfr3","rl_f13"], + ["bfr4","rl_f13"], + {"breakGroupType":0}, //Rear {"beamStrength":16000,"beamDeform":12000}, - ["bfr5","fr19"], - ["bfr5","fr32"], - ["bfr6","fr16"], - ["bfr6","fr20"], - ["bfr7","fr16"], - ["bfr7","fr34"], - ["bfr8","fr19"], - ["bfr8","fr32"], - ["bfr9","fr33"], - ["bfr9","fr20"], - ["bfr10","fr16"], - ["bfr10","fr34"], + ["bfl5","rl_f15"], + ["bfl5","rl_f16"], + ["bfl6","rl_f15"], + ["bfl6","rl_f16"], + ["bfl8","rl_f15"], + ["bfl8","rl_f16"], + ["bfl9","rl_f15"], + ["bfl9","rl_f16"], + ["bfl7","rl_f16"], + ["bfl10","rl_f16"], + + ["bfr5","rl_f17"], + ["bfr5","rl_f18"], + ["bfr6","rl_f17"], + ["bfr6","rl_f18"], + ["bfr8","rl_f17"], + ["bfr8","rl_f18"], + ["bfr9","rl_f17"], + ["bfr9","rl_f18"], + ["bfr7","rl_f18"], + ["bfr10","rl_f18"], {"beamStrength":16000,"beamDeform":"FLT_MAX"}, //Body From 439e6bcd30ecd24c7fe2a82ffe6cfa2a4d353e56 Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Tue, 23 Dec 2025 17:13:56 +0100 Subject: [PATCH 02/12] Updated example files --- examples/ast/jbeam/fender.hs | 120 +++++++++---- .../formatted_jbeam/fender-complex-jbfl.jbeam | 55 +++--- .../formatted_jbeam/fender-minimal-jbfl.jbeam | 55 +++--- .../fender-cfg-default.jbeam | 170 ++++++++++-------- .../fender-cfg-example.jbeam | 170 ++++++++++-------- .../data/fender-custom-minimal-jbfl.jbeam | 55 +++--- 6 files changed, 372 insertions(+), 253 deletions(-) diff --git a/examples/ast/jbeam/fender.hs b/examples/ast/jbeam/fender.hs index 47497cf5..701a875c 100644 --- a/examples/ast/jbeam/fender.hs +++ b/examples/ast/jbeam/fender.hs @@ -999,28 +999,36 @@ Object ) ] , Array - [ String "bfr0" - , String "fr16" + [ String "bfl0" + , String "rl_f8" ] , Array - [ String "bfr0" - , String "fr7" + [ String "bfl0" + , String "rl_f6" ] , Array - [ String "bfr1" - , String "fr16" + [ String "bfl1" + , String "rl_f6" ] , Array - [ String "bfr1" - , String "fr7" + [ String "bfl2" + , String "rl_f6" ] , Array - [ String "bfr2" - , String "fr16" + [ String "bfr0" + , String "rl_f9" + ] + , Array + [ String "bfr0" + , String "rl_f7" + ] + , Array + [ String "bfr1" + , String "rl_f7" ] , Array [ String "bfr2" - , String "fr7" + , String "rl_f7" ] , Comment ( InternalComment @@ -1047,17 +1055,29 @@ Object , Number 1.0 ) ] + , Array + [ String "bfl3" + , String "rl_f10" + ] + , Array + [ String "bfl3" + , String "rl_f11" + ] + , Array + [ String "bfl4" + , String "rl_f11" + ] , Array [ String "bfr3" - , String "fr16" + , String "rl_f12" ] , Array - [ String "bfr4" - , String "fr16" + [ String "bfr3" + , String "rl_f13" ] , Array [ String "bfr4" - , String "fr7" + , String "rl_f13" ] , Object [ ObjectKey @@ -1083,52 +1103,84 @@ Object ) ] , Array - [ String "bfr5" - , String "fr19" + [ String "bfl5" + , String "rl_f15" ] , Array - [ String "bfr5" - , String "fr32" + [ String "bfl5" + , String "rl_f16" ] , Array - [ String "bfr6" - , String "fr16" + [ String "bfl6" + , String "rl_f15" ] , Array - [ String "bfr6" - , String "fr20" + [ String "bfl6" + , String "rl_f16" ] , Array - [ String "bfr7" - , String "fr16" + [ String "bfl8" + , String "rl_f15" ] , Array - [ String "bfr7" - , String "fr34" + [ String "bfl8" + , String "rl_f16" + ] + , Array + [ String "bfl9" + , String "rl_f15" + ] + , Array + [ String "bfl9" + , String "rl_f16" + ] + , Array + [ String "bfl7" + , String "rl_f16" + ] + , Array + [ String "bfl10" + , String "rl_f16" + ] + , Array + [ String "bfr5" + , String "rl_f17" + ] + , Array + [ String "bfr5" + , String "rl_f18" + ] + , Array + [ String "bfr6" + , String "rl_f17" + ] + , Array + [ String "bfr6" + , String "rl_f18" ] , Array [ String "bfr8" - , String "fr19" + , String "rl_f17" ] , Array [ String "bfr8" - , String "fr32" + , String "rl_f18" ] , Array [ String "bfr9" - , String "fr33" + , String "rl_f17" ] , Array [ String "bfr9" - , String "fr20" + , String "rl_f18" ] , Array - [ String "bfr10" - , String "fr16" + [ String "bfr7" + , String "rl_f18" ] , Array [ String "bfr10" - , String "fr34" + , String "rl_f18" ] , Object [ ObjectKey diff --git a/examples/formatted_jbeam/fender-complex-jbfl.jbeam b/examples/formatted_jbeam/fender-complex-jbfl.jbeam index 9c75e410..4e386d46 100644 --- a/examples/formatted_jbeam/fender-complex-jbfl.jbeam +++ b/examples/formatted_jbeam/fender-complex-jbfl.jbeam @@ -209,36 +209,49 @@ {"beamStrength" : 20000, "beamDeform" : 1000}, {"breakGroup" : "fender_r"}, {"breakGroupType" : 1}, - ["bfr0", "fr16"], - ["bfr0", "fr7"], - ["bfr1", "fr16"], - ["bfr1", "fr7"], - ["bfr2", "fr16"], - ["bfr2", "fr7"], + ["bfl0", "rl_f8"], + ["bfl0", "rl_f6"], + ["bfl1", "rl_f6"], + ["bfl2", "rl_f6"], + ["bfr0", "rl_f9"], + ["bfr0", "rl_f7"], + ["bfr1", "rl_f7"], + ["bfr2", "rl_f7"], // Middle {"beamDeform" : 18000}, {"beamStrength" : 4000}, {"breakGroupType" : 1}, - ["bfr3", "fr16"], - ["bfr4", "fr16"], - ["bfr4", "fr7"], + ["bfl3", "rl_f10"], + ["bfl3", "rl_f11"], + ["bfl4", "rl_f11"], + ["bfr3", "rl_f12"], + ["bfr3", "rl_f13"], + ["bfr4", "rl_f13"], {"breakGroupType" : 0}, // Rear {"beamStrength" : 16000, "beamDeform" : 12000}, - ["bfr5", "fr19"], - ["bfr5", "fr32"], - ["bfr6", "fr16"], - ["bfr6", "fr20"], - ["bfr7", "fr16"], - ["bfr7", "fr34"], - ["bfr8", "fr19"], - ["bfr8", "fr32"], - ["bfr9", "fr33"], - ["bfr9", "fr20"], - ["bfr10", "fr16"], - ["bfr10", "fr34"], + ["bfl5", "rl_f15"], + ["bfl5", "rl_f16"], + ["bfl6", "rl_f15"], + ["bfl6", "rl_f16"], + ["bfl8", "rl_f15"], + ["bfl8", "rl_f16"], + ["bfl9", "rl_f15"], + ["bfl9", "rl_f16"], + ["bfl7", "rl_f16"], + ["bfl10", "rl_f16"], + ["bfr5", "rl_f17"], + ["bfr5", "rl_f18"], + ["bfr6", "rl_f17"], + ["bfr6", "rl_f18"], + ["bfr8", "rl_f17"], + ["bfr8", "rl_f18"], + ["bfr9", "rl_f17"], + ["bfr9", "rl_f18"], + ["bfr7", "rl_f18"], + ["bfr10", "rl_f18"], {"beamStrength" : 16000, "beamDeform" : "FLT_MAX"}, // Body diff --git a/examples/formatted_jbeam/fender-minimal-jbfl.jbeam b/examples/formatted_jbeam/fender-minimal-jbfl.jbeam index 6a0b7f80..091825fa 100644 --- a/examples/formatted_jbeam/fender-minimal-jbfl.jbeam +++ b/examples/formatted_jbeam/fender-minimal-jbfl.jbeam @@ -209,36 +209,49 @@ {"beamStrength" : 20000, "beamDeform" : 1000}, {"breakGroup" : "fender_r"}, {"breakGroupType" : 1}, - ["bfr0", "fr16"], - ["bfr0", "fr7"], - ["bfr1", "fr16"], - ["bfr1", "fr7"], - ["bfr2", "fr16"], - ["bfr2", "fr7"], + ["bfl0", "rl_f8"], + ["bfl0", "rl_f6"], + ["bfl1", "rl_f6"], + ["bfl2", "rl_f6"], + ["bfr0", "rl_f9"], + ["bfr0", "rl_f7"], + ["bfr1", "rl_f7"], + ["bfr2", "rl_f7"], // Middle {"beamDeform" : 18000}, {"beamStrength" : 4000}, {"breakGroupType" : 1}, - ["bfr3", "fr16"], - ["bfr4", "fr16"], - ["bfr4", "fr7"], + ["bfl3", "rl_f10"], + ["bfl3", "rl_f11"], + ["bfl4", "rl_f11"], + ["bfr3", "rl_f12"], + ["bfr3", "rl_f13"], + ["bfr4", "rl_f13"], {"breakGroupType" : 0}, // Rear {"beamStrength" : 16000, "beamDeform" : 12000}, - ["bfr5", "fr19"], - ["bfr5", "fr32"], - ["bfr6", "fr16"], - ["bfr6", "fr20"], - ["bfr7", "fr16"], - ["bfr7", "fr34"], - ["bfr8", "fr19"], - ["bfr8", "fr32"], - ["bfr9", "fr33"], - ["bfr9", "fr20"], - ["bfr10", "fr16"], - ["bfr10", "fr34"], + ["bfl5", "rl_f15"], + ["bfl5", "rl_f16"], + ["bfl6", "rl_f15"], + ["bfl6", "rl_f16"], + ["bfl8", "rl_f15"], + ["bfl8", "rl_f16"], + ["bfl9", "rl_f15"], + ["bfl9", "rl_f16"], + ["bfl7", "rl_f16"], + ["bfl10", "rl_f16"], + ["bfr5", "rl_f17"], + ["bfr5", "rl_f18"], + ["bfr6", "rl_f17"], + ["bfr6", "rl_f18"], + ["bfr8", "rl_f17"], + ["bfr8", "rl_f18"], + ["bfr9", "rl_f17"], + ["bfr9", "rl_f18"], + ["bfr7", "rl_f18"], + ["bfr10", "rl_f18"], {"beamStrength" : 16000, "beamDeform" : "FLT_MAX"}, // Body diff --git a/examples/transformed_jbeam/fender-cfg-default.jbeam b/examples/transformed_jbeam/fender-cfg-default.jbeam index 8be73970..d68f1403 100644 --- a/examples/transformed_jbeam/fender-cfg-default.jbeam +++ b/examples/transformed_jbeam/fender-cfg-default.jbeam @@ -24,13 +24,10 @@ ["bfl1", 0.959, -1.762, 0.576], ["bfl2", 0.855, -1.788, 0.707], ["bfl3", 0.948, -1.435, 0.730], - ["bfl4", 0.756, -1.413, 0.843], - ["bfl5", 0.963, -1.024, 0.112], - ["bfl6", 0.964, -1.072, 0.507], - ["bfl7", 0.778, -1.008, 0.873], - ["bfl8", 0.987, -0.743, 0.109], - ["bfl9", 0.987, -0.744, 0.494], - ["bfl10", 0.812, -0.759, 0.896], + ["bfl4", 0.963, -1.024, 0.112], + ["bfl5", 0.778, -1.008, 0.873], + ["bfl6", 0.987, -0.743, 0.109], + ["bfl7", 0.812, -0.759, 0.896], // Right side {"group" : "cot_fender_r"}, @@ -47,6 +44,10 @@ ["bfr10", -0.734, -0.746, 0.888], // Support nodes + {"group" : "cot_fender_l"}, + ["bflsl", 0.756, -1.413, 0.843], + ["bflsl1", 0.964, -1.072, 0.507], + ["bflsl2", 0.987, -0.744, 0.494], {"collision" : false}, {"group" : ""}, {"nodeWeight" : 1.2}, @@ -68,31 +69,31 @@ ["bfr0", "bfr4"], ["bfr0", "bfr2"], ["bfr2", "bfr4"], - ["bfl4", "bfl0"], + ["bflsl", "bfl0"], ["bfl0", "bfl2"], ["bfl1", "bfl2"], - ["bfl4", "bfl3"], + ["bflsl", "bfl3"], ["bfl1", "bfl3"], ["bfr2", "bfr1"], ["bfr4", "bfr3"], ["bfr1", "bfr3"], - ["bfl4", "bfl2"], + ["bflsl", "bfl2"], // Middle {"beamDeform" : 12000}, - ["bfl6", "bfl3"], + ["bflsl1", "bfl3"], ["bfr6", "bfr3"], - ["bfl4", "bfl7"], + ["bflsl", "bfl5"], ["bfr4", "bfr7"], // Rear - ["bfl7", "bfl10"], - ["bfl5", "bfl6"], - ["bfl7", "bfl6"], - ["bfl5", "bfl8"], - ["bfl6", "bfl9"], - ["bfl8", "bfl9"], - ["bfl10", "bfl9"], + ["bfl5", "bfl7"], + ["bfl4", "bflsl1"], + ["bfl5", "bflsl1"], + ["bfl4", "bfl6"], + ["bflsl1", "bflsl2"], + ["bfl6", "bflsl2"], + ["bfl7", "bflsl2"], ["bfr7", "bfr10"], ["bfr6", "bfr5"], ["bfr6", "bfr7"], @@ -105,9 +106,9 @@ {"deformLimitExpansion" : ""}, // Front - ["bfl1", "bfl4"], - ["bfl4", "bfl6"], - ["bfl7", "bfl3"], + ["bfl1", "bflsl"], + ["bflsl", "bflsl1"], + ["bfl5", "bfl3"], ["bfr4", "bfr6"], ["bfr7", "bfr3"], ["bfl2", "bfl3"], @@ -115,10 +116,10 @@ ["bfr4", "bfr1"], // Rear - ["bfl6", "bfl10"], - ["bfl7", "bfl9"], - ["bfl5", "bfl9"], - ["bfl6", "bfl8"], + ["bflsl1", "bfl7"], + ["bfl5", "bflsl2"], + ["bfl4", "bflsl2"], + ["bflsl1", "bfl6"], ["bfr6", "bfr10"], ["bfr7", "bfr9"], ["bfr5", "bfr9"], @@ -126,16 +127,16 @@ // Support beams ["bfl0", "bfsl"], - ["bfl6", "bfsl"], - ["bfl5", "bfsl"], + ["bflsl1", "bfsl"], + ["bfl4", "bfsl"], ["bfl3", "bfsl"], ["bfl1", "bfsl"], ["bfl2", "bfsl"], - ["bfl4", "bfsl"], + ["bflsl", "bfsl"], + ["bfl5", "bfsl"], + ["bfl6", "bfsl"], + ["bflsl2", "bfsl"], ["bfl7", "bfsl"], - ["bfl8", "bfsl"], - ["bfl9", "bfsl"], - ["bfl10", "bfsl"], ["bfr0", "bfsr"], ["bfr6", "bfsr"], ["bfr5", "bfsr"], @@ -153,8 +154,8 @@ {"beamDeform" : 900}, // Left side - ["bfl3", "bfl9"], - ["bfl4", "bfl10"], + ["bfl3", "bflsl2"], + ["bflsl", "bfl7"], // Right side ["bfr3", "bfr9"], @@ -184,24 +185,24 @@ {"beamStrength" : 4000}, {"breakGroupType" : 1}, ["bfl3", "fr17"], - ["bfl4", "fr17"], - ["bfl4", "fr9"], + ["bflsl", "fr17"], + ["bflsl", "fr9"], {"breakGroupType" : 0}, // Rear {"beamStrength" : 16000, "beamDeform" : 12000}, - ["bfl5", "fr18"], - ["bfl5", "fr27"], - ["bfl6", "fr17"], - ["bfl6", "fr21"], + ["bfl4", "fr18"], + ["bfl4", "fr27"], + ["bflsl1", "fr17"], + ["bflsl1", "fr21"], + ["bfl5", "fr17"], + ["bfl5", "fr29"], + ["bfl6", "fr18"], + ["bfl6", "fr27"], + ["bflsl2", "fr28"], + ["bflsl2", "fr21"], ["bfl7", "fr17"], ["bfl7", "fr29"], - ["bfl8", "fr18"], - ["bfl8", "fr27"], - ["bfl9", "fr28"], - ["bfl9", "fr21"], - ["bfl10", "fr17"], - ["bfl10", "fr29"], // Right side @@ -209,45 +210,58 @@ {"beamStrength" : 20000, "beamDeform" : 1000}, {"breakGroup" : "fender_r"}, {"breakGroupType" : 1}, - ["bfr1", "fr16"], - ["bfr1", "fr7"], - ["bfr2", "fr16"], - ["bfr2", "fr7"], - ["bfr0", "fr16"], - ["bfr0", "fr7"], + ["bfl1", "rl_f8"], + ["bfl1", "rl_f6"], + ["bfl2", "rl_f6"], + ["bfl0", "rl_f6"], + ["bfr1", "rl_f9"], + ["bfr1", "rl_f7"], + ["bfr2", "rl_f7"], + ["bfr0", "rl_f7"], // Middle {"beamDeform" : 18000}, {"beamStrength" : 4000}, {"breakGroupType" : 1}, - ["bfr3", "fr16"], - ["bfr4", "fr16"], - ["bfr4", "fr7"], + ["bfl3", "rl_f10"], + ["bfl3", "rl_f11"], + ["bflsl", "rl_f11"], + ["bfr3", "rl_f12"], + ["bfr3", "rl_f13"], + ["bfr4", "rl_f13"], {"breakGroupType" : 0}, // Rear {"beamStrength" : 16000, "beamDeform" : 12000}, - ["bfr5", "fr19"], - ["bfr5", "fr32"], - ["bfr6", "fr16"], - ["bfr6", "fr20"], - ["bfr7", "fr16"], - ["bfr7", "fr34"], - ["bfr8", "fr19"], - ["bfr8", "fr32"], - ["bfr9", "fr33"], - ["bfr9", "fr20"], - ["bfr10", "fr16"], - ["bfr10", "fr34"], + ["bfl4", "rl_f15"], + ["bfl4", "rl_f16"], + ["bflsl1", "rl_f15"], + ["bflsl1", "rl_f16"], + ["bfl6", "rl_f15"], + ["bfl6", "rl_f16"], + ["bflsl2", "rl_f15"], + ["bflsl2", "rl_f16"], + ["bfl5", "rl_f16"], + ["bfl7", "rl_f16"], + ["bfr5", "rl_f17"], + ["bfr5", "rl_f18"], + ["bfr6", "rl_f17"], + ["bfr6", "rl_f18"], + ["bfr8", "rl_f17"], + ["bfr8", "rl_f18"], + ["bfr9", "rl_f17"], + ["bfr9", "rl_f18"], + ["bfr7", "rl_f18"], + ["bfr10", "rl_f18"], {"beamStrength" : 16000, "beamDeform" : "FLT_MAX"}, // Body // Left side {"breakGroup" : "fender_l"}, - ["bfl8", "mbl0"], - ["bfl9", "mbl1"], - ["bfl10", "mbl2"], + ["bfl6", "mbl0"], + ["bflsl2", "mbl1"], + ["bfl7", "mbl2"], // Right side {"breakGroup" : "fender_r"}, @@ -258,15 +272,15 @@ ], "triangles" : [ ["id1:", "id2:", "id3:"], - ["bfl3", "bfl4", "bfl2"], + ["bfl3", "bflsl", "bfl2"], ["bfl1", "bfl3", "bfl2"], - ["bfl4", "bfl0", "bfl2"], - ["bfl4", "bfl3", "bfl7"], - ["bfl6", "bfl7", "bfl3"], - ["bfl10", "bfl7", "bfl6"], - ["bfl9", "bfl10", "bfl6"], - ["bfl5", "bfl8", "bfl6"], - ["bfl9", "bfl6", "bfl8"], + ["bflsl", "bfl0", "bfl2"], + ["bflsl", "bfl3", "bfl5"], + ["bflsl1", "bfl5", "bfl3"], + ["bfl7", "bfl5", "bflsl1"], + ["bflsl2", "bfl7", "bflsl1"], + ["bfl4", "bfl6", "bflsl1"], + ["bflsl2", "bflsl1", "bfl6"], ["bfr4", "bfr2", "bfr0"], ["bfr3", "bfr2", "bfr4"], ["bfr1", "bfr2", "bfr3"], diff --git a/examples/transformed_jbeam/fender-cfg-example.jbeam b/examples/transformed_jbeam/fender-cfg-example.jbeam index 8be73970..d68f1403 100644 --- a/examples/transformed_jbeam/fender-cfg-example.jbeam +++ b/examples/transformed_jbeam/fender-cfg-example.jbeam @@ -24,13 +24,10 @@ ["bfl1", 0.959, -1.762, 0.576], ["bfl2", 0.855, -1.788, 0.707], ["bfl3", 0.948, -1.435, 0.730], - ["bfl4", 0.756, -1.413, 0.843], - ["bfl5", 0.963, -1.024, 0.112], - ["bfl6", 0.964, -1.072, 0.507], - ["bfl7", 0.778, -1.008, 0.873], - ["bfl8", 0.987, -0.743, 0.109], - ["bfl9", 0.987, -0.744, 0.494], - ["bfl10", 0.812, -0.759, 0.896], + ["bfl4", 0.963, -1.024, 0.112], + ["bfl5", 0.778, -1.008, 0.873], + ["bfl6", 0.987, -0.743, 0.109], + ["bfl7", 0.812, -0.759, 0.896], // Right side {"group" : "cot_fender_r"}, @@ -47,6 +44,10 @@ ["bfr10", -0.734, -0.746, 0.888], // Support nodes + {"group" : "cot_fender_l"}, + ["bflsl", 0.756, -1.413, 0.843], + ["bflsl1", 0.964, -1.072, 0.507], + ["bflsl2", 0.987, -0.744, 0.494], {"collision" : false}, {"group" : ""}, {"nodeWeight" : 1.2}, @@ -68,31 +69,31 @@ ["bfr0", "bfr4"], ["bfr0", "bfr2"], ["bfr2", "bfr4"], - ["bfl4", "bfl0"], + ["bflsl", "bfl0"], ["bfl0", "bfl2"], ["bfl1", "bfl2"], - ["bfl4", "bfl3"], + ["bflsl", "bfl3"], ["bfl1", "bfl3"], ["bfr2", "bfr1"], ["bfr4", "bfr3"], ["bfr1", "bfr3"], - ["bfl4", "bfl2"], + ["bflsl", "bfl2"], // Middle {"beamDeform" : 12000}, - ["bfl6", "bfl3"], + ["bflsl1", "bfl3"], ["bfr6", "bfr3"], - ["bfl4", "bfl7"], + ["bflsl", "bfl5"], ["bfr4", "bfr7"], // Rear - ["bfl7", "bfl10"], - ["bfl5", "bfl6"], - ["bfl7", "bfl6"], - ["bfl5", "bfl8"], - ["bfl6", "bfl9"], - ["bfl8", "bfl9"], - ["bfl10", "bfl9"], + ["bfl5", "bfl7"], + ["bfl4", "bflsl1"], + ["bfl5", "bflsl1"], + ["bfl4", "bfl6"], + ["bflsl1", "bflsl2"], + ["bfl6", "bflsl2"], + ["bfl7", "bflsl2"], ["bfr7", "bfr10"], ["bfr6", "bfr5"], ["bfr6", "bfr7"], @@ -105,9 +106,9 @@ {"deformLimitExpansion" : ""}, // Front - ["bfl1", "bfl4"], - ["bfl4", "bfl6"], - ["bfl7", "bfl3"], + ["bfl1", "bflsl"], + ["bflsl", "bflsl1"], + ["bfl5", "bfl3"], ["bfr4", "bfr6"], ["bfr7", "bfr3"], ["bfl2", "bfl3"], @@ -115,10 +116,10 @@ ["bfr4", "bfr1"], // Rear - ["bfl6", "bfl10"], - ["bfl7", "bfl9"], - ["bfl5", "bfl9"], - ["bfl6", "bfl8"], + ["bflsl1", "bfl7"], + ["bfl5", "bflsl2"], + ["bfl4", "bflsl2"], + ["bflsl1", "bfl6"], ["bfr6", "bfr10"], ["bfr7", "bfr9"], ["bfr5", "bfr9"], @@ -126,16 +127,16 @@ // Support beams ["bfl0", "bfsl"], - ["bfl6", "bfsl"], - ["bfl5", "bfsl"], + ["bflsl1", "bfsl"], + ["bfl4", "bfsl"], ["bfl3", "bfsl"], ["bfl1", "bfsl"], ["bfl2", "bfsl"], - ["bfl4", "bfsl"], + ["bflsl", "bfsl"], + ["bfl5", "bfsl"], + ["bfl6", "bfsl"], + ["bflsl2", "bfsl"], ["bfl7", "bfsl"], - ["bfl8", "bfsl"], - ["bfl9", "bfsl"], - ["bfl10", "bfsl"], ["bfr0", "bfsr"], ["bfr6", "bfsr"], ["bfr5", "bfsr"], @@ -153,8 +154,8 @@ {"beamDeform" : 900}, // Left side - ["bfl3", "bfl9"], - ["bfl4", "bfl10"], + ["bfl3", "bflsl2"], + ["bflsl", "bfl7"], // Right side ["bfr3", "bfr9"], @@ -184,24 +185,24 @@ {"beamStrength" : 4000}, {"breakGroupType" : 1}, ["bfl3", "fr17"], - ["bfl4", "fr17"], - ["bfl4", "fr9"], + ["bflsl", "fr17"], + ["bflsl", "fr9"], {"breakGroupType" : 0}, // Rear {"beamStrength" : 16000, "beamDeform" : 12000}, - ["bfl5", "fr18"], - ["bfl5", "fr27"], - ["bfl6", "fr17"], - ["bfl6", "fr21"], + ["bfl4", "fr18"], + ["bfl4", "fr27"], + ["bflsl1", "fr17"], + ["bflsl1", "fr21"], + ["bfl5", "fr17"], + ["bfl5", "fr29"], + ["bfl6", "fr18"], + ["bfl6", "fr27"], + ["bflsl2", "fr28"], + ["bflsl2", "fr21"], ["bfl7", "fr17"], ["bfl7", "fr29"], - ["bfl8", "fr18"], - ["bfl8", "fr27"], - ["bfl9", "fr28"], - ["bfl9", "fr21"], - ["bfl10", "fr17"], - ["bfl10", "fr29"], // Right side @@ -209,45 +210,58 @@ {"beamStrength" : 20000, "beamDeform" : 1000}, {"breakGroup" : "fender_r"}, {"breakGroupType" : 1}, - ["bfr1", "fr16"], - ["bfr1", "fr7"], - ["bfr2", "fr16"], - ["bfr2", "fr7"], - ["bfr0", "fr16"], - ["bfr0", "fr7"], + ["bfl1", "rl_f8"], + ["bfl1", "rl_f6"], + ["bfl2", "rl_f6"], + ["bfl0", "rl_f6"], + ["bfr1", "rl_f9"], + ["bfr1", "rl_f7"], + ["bfr2", "rl_f7"], + ["bfr0", "rl_f7"], // Middle {"beamDeform" : 18000}, {"beamStrength" : 4000}, {"breakGroupType" : 1}, - ["bfr3", "fr16"], - ["bfr4", "fr16"], - ["bfr4", "fr7"], + ["bfl3", "rl_f10"], + ["bfl3", "rl_f11"], + ["bflsl", "rl_f11"], + ["bfr3", "rl_f12"], + ["bfr3", "rl_f13"], + ["bfr4", "rl_f13"], {"breakGroupType" : 0}, // Rear {"beamStrength" : 16000, "beamDeform" : 12000}, - ["bfr5", "fr19"], - ["bfr5", "fr32"], - ["bfr6", "fr16"], - ["bfr6", "fr20"], - ["bfr7", "fr16"], - ["bfr7", "fr34"], - ["bfr8", "fr19"], - ["bfr8", "fr32"], - ["bfr9", "fr33"], - ["bfr9", "fr20"], - ["bfr10", "fr16"], - ["bfr10", "fr34"], + ["bfl4", "rl_f15"], + ["bfl4", "rl_f16"], + ["bflsl1", "rl_f15"], + ["bflsl1", "rl_f16"], + ["bfl6", "rl_f15"], + ["bfl6", "rl_f16"], + ["bflsl2", "rl_f15"], + ["bflsl2", "rl_f16"], + ["bfl5", "rl_f16"], + ["bfl7", "rl_f16"], + ["bfr5", "rl_f17"], + ["bfr5", "rl_f18"], + ["bfr6", "rl_f17"], + ["bfr6", "rl_f18"], + ["bfr8", "rl_f17"], + ["bfr8", "rl_f18"], + ["bfr9", "rl_f17"], + ["bfr9", "rl_f18"], + ["bfr7", "rl_f18"], + ["bfr10", "rl_f18"], {"beamStrength" : 16000, "beamDeform" : "FLT_MAX"}, // Body // Left side {"breakGroup" : "fender_l"}, - ["bfl8", "mbl0"], - ["bfl9", "mbl1"], - ["bfl10", "mbl2"], + ["bfl6", "mbl0"], + ["bflsl2", "mbl1"], + ["bfl7", "mbl2"], // Right side {"breakGroup" : "fender_r"}, @@ -258,15 +272,15 @@ ], "triangles" : [ ["id1:", "id2:", "id3:"], - ["bfl3", "bfl4", "bfl2"], + ["bfl3", "bflsl", "bfl2"], ["bfl1", "bfl3", "bfl2"], - ["bfl4", "bfl0", "bfl2"], - ["bfl4", "bfl3", "bfl7"], - ["bfl6", "bfl7", "bfl3"], - ["bfl10", "bfl7", "bfl6"], - ["bfl9", "bfl10", "bfl6"], - ["bfl5", "bfl8", "bfl6"], - ["bfl9", "bfl6", "bfl8"], + ["bflsl", "bfl0", "bfl2"], + ["bflsl", "bfl3", "bfl5"], + ["bflsl1", "bfl5", "bfl3"], + ["bfl7", "bfl5", "bflsl1"], + ["bflsl2", "bfl7", "bflsl1"], + ["bfl4", "bfl6", "bflsl1"], + ["bflsl2", "bflsl1", "bfl6"], ["bfr4", "bfr2", "bfr0"], ["bfr3", "bfr2", "bfr4"], ["bfr1", "bfr2", "bfr3"], diff --git a/test-extra/language-server/data/fender-custom-minimal-jbfl.jbeam b/test-extra/language-server/data/fender-custom-minimal-jbfl.jbeam index caa760f8..ee4aab40 100644 --- a/test-extra/language-server/data/fender-custom-minimal-jbfl.jbeam +++ b/test-extra/language-server/data/fender-custom-minimal-jbfl.jbeam @@ -209,36 +209,49 @@ {"beamStrength" : 20000, "beamDeform" : 1000}, {"breakGroup" : "fender_r"}, {"breakGroupType" : 1}, - ["bfr0", "fr16"], - ["bfr0", "fr7"], - ["bfr1", "fr16"], - ["bfr1", "fr7"], - ["bfr2", "fr16"], - ["bfr2", "fr7"], + ["bfl0", "rl_f8"], + ["bfl0", "rl_f6"], + ["bfl1", "rl_f6"], + ["bfl2", "rl_f6"], + ["bfr0", "rl_f9"], + ["bfr0", "rl_f7"], + ["bfr1", "rl_f7"], + ["bfr2", "rl_f7"], // Middle {"beamDeform" : 18000}, {"beamStrength" : 4000}, {"breakGroupType" : 1}, - ["bfr3", "fr16"], - ["bfr4", "fr16"], - ["bfr4", "fr7"], + ["bfl3", "rl_f10"], + ["bfl3", "rl_f11"], + ["bfl4", "rl_f11"], + ["bfr3", "rl_f12"], + ["bfr3", "rl_f13"], + ["bfr4", "rl_f13"], {"breakGroupType" : 0}, // Rear {"beamStrength" : 16000, "beamDeform" : 12000}, - ["bfr5", "fr19"], - ["bfr5", "fr32"], - ["bfr6", "fr16"], - ["bfr6", "fr20"], - ["bfr7", "fr16"], - ["bfr7", "fr34"], - ["bfr8", "fr19"], - ["bfr8", "fr32"], - ["bfr9", "fr33"], - ["bfr9", "fr20"], - ["bfr10", "fr16"], - ["bfr10", "fr34"], + ["bfl5", "rl_f15"], + ["bfl5", "rl_f16"], + ["bfl6", "rl_f15"], + ["bfl6", "rl_f16"], + ["bfl8", "rl_f15"], + ["bfl8", "rl_f16"], + ["bfl9", "rl_f15"], + ["bfl9", "rl_f16"], + ["bfl7", "rl_f16"], + ["bfl10", "rl_f16"], + ["bfr5", "rl_f17"], + ["bfr5", "rl_f18"], + ["bfr6", "rl_f17"], + ["bfr6", "rl_f18"], + ["bfr8", "rl_f17"], + ["bfr8", "rl_f18"], + ["bfr9", "rl_f17"], + ["bfr9", "rl_f18"], + ["bfr7", "rl_f18"], + ["bfr10", "rl_f18"], {"beamStrength" : 16000, "beamDeform" : "FLT_MAX"}, // Body From 11ff4c9ad5a06c1be8c3b58744a8efc8dc5a311d Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Wed, 24 Dec 2025 01:29:05 +0100 Subject: [PATCH 03/12] Propagate JBeam node transformations to multiple files --- exe/jbeam-edit/Main.hs | 36 +++++++++++++++---- .../JbeamEdit/Transformation.hs | 6 ++-- tools/dump_ast/Main.hs | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/exe/jbeam-edit/Main.hs b/exe/jbeam-edit/Main.hs index d95c5e6c..4d431e2e 100644 --- a/exe/jbeam-edit/Main.hs +++ b/exe/jbeam-edit/Main.hs @@ -5,9 +5,11 @@ module Main ( import CommandLineOptions import Control.Monad (when) import Data.ByteString.Lazy qualified as LBS (fromStrict) +import Data.Map (Map) import Data.Text (Text) import Data.Text.Encoding (encodeUtf8) import JbeamEdit.Core.Node (Node) +import JbeamEdit.Core.NodeCursor import JbeamEdit.Formatting (RuleSet, formatNode) import JbeamEdit.Formatting.Config import JbeamEdit.IOUtils @@ -22,7 +24,8 @@ import Data.Text qualified as T #endif #ifdef ENABLE_TRANSFORMATION -import JbeamEdit.Transformation (transform) +import JbeamEdit.Transformation +import JbeamEdit.Transformation.Types import JbeamEdit.Transformation.Config #endif @@ -56,7 +59,7 @@ editFile opts = do processNodes :: Options -> OsPath -> Node -> RuleSet -> IO () processNodes opts outFile nodes formattingConfig = do - transformedNode <- applyTransform opts nodes + transformedNode <- applyTransform formattingConfig opts nodes case transformedNode of Right transformedNode' -> OS.writeFile outFile @@ -75,18 +78,37 @@ replaceNewlines :: Text -> Text replaceNewlines = id #endif -applyTransform :: Options -> Node -> IO (Either Text Node) +applyTransform :: RuleSet -> Options -> Node -> IO (Either Text Node) #ifdef ENABLE_TRANSFORMATION -applyTransform (Options {optTransformation = False}) topNode = pure (Right topNode) -applyTransform opts topNode = do +applyTransform rs opts@(Options {optTransformation = True, optInputFile = Just inputFile}) topNode = do cwd <- getCurrentDirectory tfConfig <- loadTransformationConfig $ cwd transformationConfigFile + let dir = takeDirectory inputFile + filename = takeFileName inputFile + jbeamFiles <- listDirectory dir case transform (optUpdateNames opts) tfConfig topNode of - Right (badVertexNodes, badBeamNodes, topNode') -> do + Right (badVertexNodes, badBeamNodes, updatedNames, topNode') -> do + print updatedNames + mapM_ (updateOtherFiles rs updatedNames) (map (dir ) . filter ((/=) filename) $ jbeamFiles) reportInvalidNodes "Invalid vertex nodes encountered:" badVertexNodes reportInvalidNodes "Invalid beam nodes encountered:" badBeamNodes pure (Right topNode') Left err -> pure (Left err) +applyTransform _ _ topNode = pure (Right topNode) + +updateOtherFiles :: RuleSet -> UpdateNamesMap -> OsPath -> IO () +updateOtherFiles formattingConfig updatedNames filepath = do + contents <- tryReadFile [] filepath + case contents >>= parseNodes of + Right transformedNode' -> + OS.writeFile filepath + . LBS.fromStrict + . encodeUtf8 + . replaceNewlines + . formatNode formattingConfig + . findAndUpdateTextInNode updatedNames newCursor + $ transformedNode' + Left err -> putErrorLine err #else -applyTransform _ = pure . Right +applyTransform _ _ = pure . Right #endif diff --git a/src-extra/transformation/JbeamEdit/Transformation.hs b/src-extra/transformation/JbeamEdit/Transformation.hs index c197b61f..8f4b75b1 100644 --- a/src-extra/transformation/JbeamEdit/Transformation.hs +++ b/src-extra/transformation/JbeamEdit/Transformation.hs @@ -1,4 +1,4 @@ -module JbeamEdit.Transformation (transform) where +module JbeamEdit.Transformation (findAndUpdateTextInNode, transform) where import Control.Monad (foldM) import Data.Bool (bool) @@ -448,7 +448,7 @@ transform :: UpdateNamesMap -> TransformationConfig -> Node - -> Either Text ([Node], [Node], Node) + -> Either Text ([Node], [Node], UpdateNamesMap, Node) transform newNames tfCfg topNode = getVertexForest (xGroupBreakpoints tfCfg) verticesQuery topNode >>= getNamesAndUpdateTree @@ -463,4 +463,4 @@ transform newNames tfCfg topNode = newTopNode = findAndUpdateTextInNode updateMap newCursor $ updateVerticesInNode verticesQuery updatedVertexForest globals topNode - in Right (badVertexNodes, badBeamNodes, newTopNode) + in Right (badVertexNodes, badBeamNodes, updateMap, newTopNode) diff --git a/tools/dump_ast/Main.hs b/tools/dump_ast/Main.hs index 153ec048..869eaaec 100644 --- a/tools/dump_ast/Main.hs +++ b/tools/dump_ast/Main.hs @@ -153,7 +153,7 @@ dumpTransformedJbeam cfName tfConfig rsDirPath jbeamInputAstDir outDir jbeamFile Left err -> do putStrLn $ "error occurred during transformation" ++ T.unpack err exitFailure - Right (_, _, jbeam') -> pure jbeam' + Right (_, _, _, jbeam') -> pure jbeam' dump outFilename (T.unpack $ formatNode rs transformedJbeam) where dump filename contents = From 755a0dcc331885a2f9c10c56c4dc7a33a4fd40c5 Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Wed, 24 Dec 2025 01:57:21 +0100 Subject: [PATCH 04/12] Consolidate formatting and writing it to file into Formatting module --- .hlint.yaml | 2 +- exe/jbeam-edit/Main.hs | 25 +++---------------------- src/JbeamEdit/Formatting.hs | 27 +++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index 2f5be028..5efb2734 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -1,7 +1,7 @@ - extensions: - default: true - {name: LambdaCase, within: []} - - {name: CPP, within: [JbeamEdit.Formatting.Config]} + - {name: CPP, within: [JbeamEdit.Formatting, JbeamEdit.Formatting.Config]} - modules: - {name: '**', qualifiedStyle: post} - warn: {lhs: nub (sort x), rhs: Data.List.Extra.nubSort x} diff --git a/exe/jbeam-edit/Main.hs b/exe/jbeam-edit/Main.hs index 4d431e2e..67b2c9e4 100644 --- a/exe/jbeam-edit/Main.hs +++ b/exe/jbeam-edit/Main.hs @@ -7,10 +7,9 @@ import Control.Monad (when) import Data.ByteString.Lazy qualified as LBS (fromStrict) import Data.Map (Map) import Data.Text (Text) -import Data.Text.Encoding (encodeUtf8) import JbeamEdit.Core.Node (Node) import JbeamEdit.Core.NodeCursor -import JbeamEdit.Formatting (RuleSet, formatNode) +import JbeamEdit.Formatting (RuleSet, formatNodeAndWrite) import JbeamEdit.Formatting.Config import JbeamEdit.IOUtils import JbeamEdit.Parsing.Jbeam (parseNodes) @@ -61,23 +60,9 @@ processNodes :: Options -> OsPath -> Node -> RuleSet -> IO () processNodes opts outFile nodes formattingConfig = do transformedNode <- applyTransform formattingConfig opts nodes case transformedNode of - Right transformedNode' -> - OS.writeFile outFile - . LBS.fromStrict - . encodeUtf8 - . replaceNewlines - . formatNode formattingConfig - $ transformedNode' + Right transformedNode' -> formatNodeAndWrite formattingConfig outFile transformedNode' Left err -> putErrorLine err -#ifdef ENABLE_WINDOWS_NEWLINES -replaceNewlines :: Text -> Text -replaceNewlines = T.replace "\n" "\r\n" -#else -replaceNewlines :: Text -> Text -replaceNewlines = id -#endif - applyTransform :: RuleSet -> Options -> Node -> IO (Either Text Node) #ifdef ENABLE_TRANSFORMATION applyTransform rs opts@(Options {optTransformation = True, optInputFile = Just inputFile}) topNode = do @@ -101,11 +86,7 @@ updateOtherFiles formattingConfig updatedNames filepath = do contents <- tryReadFile [] filepath case contents >>= parseNodes of Right transformedNode' -> - OS.writeFile filepath - . LBS.fromStrict - . encodeUtf8 - . replaceNewlines - . formatNode formattingConfig + formatNodeAndWrite formattingConfig filepath . findAndUpdateTextInNode updatedNames newCursor $ transformedNode' Left err -> putErrorLine err diff --git a/src/JbeamEdit/Formatting.hs b/src/JbeamEdit/Formatting.hs index 1f659397..860eed05 100644 --- a/src/JbeamEdit/Formatting.hs +++ b/src/JbeamEdit/Formatting.hs @@ -1,15 +1,20 @@ +{-# LANGUAGE CPP #-} + module JbeamEdit.Formatting ( formatNode, formatWithCursor, formatScalarNode, + formatNodeAndWrite, RuleSet (..), ) where import Data.Bool (bool) +import Data.ByteString.Lazy qualified as LBS (fromStrict) import Data.Char (isSpace) import Data.Scientific (FPFormat (Fixed), formatScientific) import Data.Text (Text) import Data.Text qualified as T +import Data.Text.Encoding (encodeUtf8) import Data.Vector (Vector) import Data.Vector qualified as V (null, toList) import JbeamEdit.Core.Node ( @@ -31,6 +36,8 @@ import JbeamEdit.Formatting.Rules ( lookupIndentProperty, noComplexNewLine, ) +import System.File.OsPath qualified as OS (writeFile) +import System.OsPath (OsPath) splitTrailing :: Bool -> Text -> (Text, Text) splitTrailing comma txt = @@ -139,3 +146,23 @@ formatWithCursor rs cursor n = formatNode :: RuleSet -> Node -> Text formatNode rs node = formatWithCursor rs newCursor node <> T.singleton '\n' + +#ifdef ENABLE_WINDOWS_NEWLINES +replaceNewlines :: Text -> Text +replaceNewlines = T.replace "\n" "\r\n" +#else +replaceNewlines :: Text -> Text +replaceNewlines = id +#endif + +formatNodeAndWrite + :: RuleSet + -> OsPath + -> Node + -> IO () +formatNodeAndWrite rs outFile = + OS.writeFile outFile + . LBS.fromStrict + . encodeUtf8 + . replaceNewlines + . formatNode rs From 5ebb6f202e2d2a610d935ce18109742ac0000421 Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Thu, 25 Dec 2025 08:46:25 +0100 Subject: [PATCH 05/12] Moved beam directory updating logic --- exe/jbeam-edit/Main.hs | 18 +------------- jbeam-edit.cabal | 2 +- package.yaml | 9 +++++-- .../JbeamEdit/Transformation.hs | 24 ++++++++++++++++++- src/JbeamEdit/IOUtils.hs | 17 ++++++++++++- 5 files changed, 48 insertions(+), 22 deletions(-) diff --git a/exe/jbeam-edit/Main.hs b/exe/jbeam-edit/Main.hs index 67b2c9e4..53b8726f 100644 --- a/exe/jbeam-edit/Main.hs +++ b/exe/jbeam-edit/Main.hs @@ -4,18 +4,14 @@ module Main ( import CommandLineOptions import Control.Monad (when) -import Data.ByteString.Lazy qualified as LBS (fromStrict) -import Data.Map (Map) import Data.Text (Text) import JbeamEdit.Core.Node (Node) -import JbeamEdit.Core.NodeCursor import JbeamEdit.Formatting (RuleSet, formatNodeAndWrite) import JbeamEdit.Formatting.Config import JbeamEdit.IOUtils import JbeamEdit.Parsing.Jbeam (parseNodes) import System.Directory.OsPath import System.Environment (getArgs) -import System.File.OsPath qualified as OS (writeFile) import System.OsPath #ifdef ENABLE_WINDOWS_NEWLINES @@ -24,7 +20,6 @@ import Data.Text qualified as T #ifdef ENABLE_TRANSFORMATION import JbeamEdit.Transformation -import JbeamEdit.Transformation.Types import JbeamEdit.Transformation.Config #endif @@ -73,23 +68,12 @@ applyTransform rs opts@(Options {optTransformation = True, optInputFile = Just i jbeamFiles <- listDirectory dir case transform (optUpdateNames opts) tfConfig topNode of Right (badVertexNodes, badBeamNodes, updatedNames, topNode') -> do - print updatedNames - mapM_ (updateOtherFiles rs updatedNames) (map (dir ) . filter ((/=) filename) $ jbeamFiles) + mapM_ (updateOtherFiles rs updatedNames) $ map (dir ) (filterJbeamFiles filename jbeamFiles) reportInvalidNodes "Invalid vertex nodes encountered:" badVertexNodes reportInvalidNodes "Invalid beam nodes encountered:" badBeamNodes pure (Right topNode') Left err -> pure (Left err) applyTransform _ _ topNode = pure (Right topNode) - -updateOtherFiles :: RuleSet -> UpdateNamesMap -> OsPath -> IO () -updateOtherFiles formattingConfig updatedNames filepath = do - contents <- tryReadFile [] filepath - case contents >>= parseNodes of - Right transformedNode' -> - formatNodeAndWrite formattingConfig filepath - . findAndUpdateTextInNode updatedNames newCursor - $ transformedNode' - Left err -> putErrorLine err #else applyTransform _ _ = pure . Right #endif diff --git a/jbeam-edit.cabal b/jbeam-edit.cabal index ec40ef0b..a7d7fe05 100644 --- a/jbeam-edit.cabal +++ b/jbeam-edit.cabal @@ -156,6 +156,7 @@ library jbeam-edit-transformation if flag(transformation) build-depends: extra, + file-io, ordered-containers, transformers, yaml @@ -229,7 +230,6 @@ executable jbeam-edit bytestring, containers, directory, - file-io, filepath >=1.5.1.0, jbeam-edit, mtl, diff --git a/package.yaml b/package.yaml index c4260d6f..b8f04a34 100644 --- a/package.yaml +++ b/package.yaml @@ -83,7 +83,12 @@ internal-libraries: when: condition: flag(transformation) then: - dependencies: [yaml, extra, transformers, ordered-containers] + dependencies: + - yaml + - file-io + - extra + - transformers + - ordered-containers else: buildable: false source-dirs: src-extra/transformation @@ -122,7 +127,7 @@ executables: <<: *jbeam-options source-dirs: exe/jbeam-edit default-extensions: [CPP] - dependencies: [jbeam-edit, file-io] + dependencies: [jbeam-edit] when: - condition: flag(transformation) dependencies: [jbeam-edit-transformation] diff --git a/src-extra/transformation/JbeamEdit/Transformation.hs b/src-extra/transformation/JbeamEdit/Transformation.hs index 8f4b75b1..b84dcd8c 100644 --- a/src-extra/transformation/JbeamEdit/Transformation.hs +++ b/src-extra/transformation/JbeamEdit/Transformation.hs @@ -1,4 +1,4 @@ -module JbeamEdit.Transformation (findAndUpdateTextInNode, transform) where +module JbeamEdit.Transformation (findAndUpdateTextInNode, transform, updateOtherFiles, filterJbeamFiles) where import Control.Monad (foldM) import Data.Bool (bool) @@ -24,12 +24,16 @@ import JbeamEdit.Core.Node import JbeamEdit.Core.NodeCursor (newCursor) import JbeamEdit.Core.NodeCursor qualified as NC import JbeamEdit.Core.NodePath qualified as NP +import JbeamEdit.Formatting +import JbeamEdit.IOUtils +import JbeamEdit.Parsing.Jbeam import JbeamEdit.Transformation.Config import JbeamEdit.Transformation.OMap1 (OMap1) import JbeamEdit.Transformation.OMap1 qualified as OMap1 import JbeamEdit.Transformation.SupportVertex import JbeamEdit.Transformation.Types import JbeamEdit.Transformation.VertexExtraction +import System.OsPath verticesQuery :: NP.NodePath verticesQuery = fromList [NP.ObjectIndex 0, NP.ObjectKey "nodes"] @@ -444,6 +448,24 @@ findAndUpdateTextInNode m cursor node = applyBreadcrumbAndUpdateText = NC.applyCrumb cursor (findAndUpdateTextInNode m) +filterJbeamFiles :: OsPath -> [OsPath] -> [OsPath] +filterJbeamFiles filename = filter go + where + go path = + isNotEmacsBackupFile path + && pathEndsWithExtension ".jbeam" path + && path /= filename + +updateOtherFiles :: RuleSet -> UpdateNamesMap -> OsPath -> IO () +updateOtherFiles formattingConfig updatedNames filepath = do + contents <- tryReadFile [] filepath + case contents >>= parseNodes of + Right transformedNode' -> + formatNodeAndWrite formattingConfig filepath + . findAndUpdateTextInNode updatedNames newCursor + $ transformedNode' + Left err -> putErrorLine err + transform :: UpdateNamesMap -> TransformationConfig diff --git a/src/JbeamEdit/IOUtils.hs b/src/JbeamEdit/IOUtils.hs index 4340588a..453a83f6 100644 --- a/src/JbeamEdit/IOUtils.hs +++ b/src/JbeamEdit/IOUtils.hs @@ -1,4 +1,11 @@ -module JbeamEdit.IOUtils (tryReadFile, putErrorLine, putErrorStringLn, reportInvalidNodes) where +module JbeamEdit.IOUtils ( + isNotEmacsBackupFile, + pathEndsWithExtension, + tryReadFile, + putErrorLine, + putErrorStringLn, + reportInvalidNodes, +) where import Control.Exception (IOException, try) import Control.Monad (unless) @@ -40,3 +47,11 @@ ioErrorMsg _ (Right valid) = Right valid tryReadFile :: [IOErrorType] -> OsPath -> IO (Either Text BL.ByteString) tryReadFile noerrs fp = ioErrorMsg noerrs <$> try (OS.readFile fp) + +isNotEmacsBackupFile :: OsPath -> Bool +isNotEmacsBackupFile = (/=) (unsafeEncodeUtf ".#") + +pathEndsWithExtension :: String -> OsPath -> Bool +pathEndsWithExtension expectedExt filepath = + let (_, ext) = splitExtensions filepath + in unsafeEncodeUtf expectedExt == ext From cc5c352a0c9d335e263b5243694b8aaefe6a0b5a Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Thu, 25 Dec 2025 09:29:54 +0100 Subject: [PATCH 06/12] Fixed transformation test --- test-extra/transformation/Spec.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-extra/transformation/Spec.hs b/test-extra/transformation/Spec.hs index 4a3b476c..fc721a67 100644 --- a/test-extra/transformation/Spec.hs +++ b/test-extra/transformation/Spec.hs @@ -34,7 +34,7 @@ topNodeSpec rs cfName tfConfig inFilename outFilename = do ++ outFilename transformAndFormat = do - (_, _, node) <- transform M.empty tfConfig (read input) + (_, _, _, node) <- transform M.empty tfConfig (read input) Right (formatNode rs node) describe desc . it "works" $ transformAndFormat `shouldBe` Right (T.pack output) From 8e52bd59b1ea3eb3ceb1854f43994e0eeb5f7406 Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Thu, 25 Dec 2025 12:01:52 +0100 Subject: [PATCH 07/12] Fixed isNotEmacsBackupFile --- src/JbeamEdit/IOUtils.hs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/JbeamEdit/IOUtils.hs b/src/JbeamEdit/IOUtils.hs index 453a83f6..ccf588cf 100644 --- a/src/JbeamEdit/IOUtils.hs +++ b/src/JbeamEdit/IOUtils.hs @@ -7,6 +7,7 @@ module JbeamEdit.IOUtils ( reportInvalidNodes, ) where +import Data.List (isPrefixOf) import Control.Exception (IOException, try) import Control.Monad (unless) import Data.ByteString.Lazy qualified as BL ( @@ -49,7 +50,9 @@ tryReadFile :: [IOErrorType] -> OsPath -> IO (Either Text BL.ByteString) tryReadFile noerrs fp = ioErrorMsg noerrs <$> try (OS.readFile fp) isNotEmacsBackupFile :: OsPath -> Bool -isNotEmacsBackupFile = (/=) (unsafeEncodeUtf ".#") +isNotEmacsBackupFile = not . all (isPrefixOf ".#") . decodeBaseFileName + where decodeBaseFileName :: OsPath -> Maybe FilePath + decodeBaseFileName = decodeUtf . takeFileName pathEndsWithExtension :: String -> OsPath -> Bool pathEndsWithExtension expectedExt filepath = From 244bc37901aad0fcc437e2fe8427209bd8fe2634 Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Thu, 25 Dec 2025 12:12:20 +0100 Subject: [PATCH 08/12] Fixed bench/Main.hs --- tools/bench/Main.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bench/Main.hs b/tools/bench/Main.hs index b19d7d4e..a7d0852e 100644 --- a/tools/bench/Main.hs +++ b/tools/bench/Main.hs @@ -53,7 +53,7 @@ main = do let (Right jAst) = parseNodes jText (Right rAst) = parseDSL rText case transform M.empty cfg jAst of - Right (_, _, outAst) -> pure $ formatNode rAst outAst + Right (_, _, _, outAst) -> pure $ formatNode rAst outAst Left err -> error (T.unpack err) ) From 05ecde2ea118f423354122c30159a1104a771b4b Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Thu, 25 Dec 2025 12:15:41 +0100 Subject: [PATCH 09/12] Ran formatter --- src/JbeamEdit/IOUtils.hs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/JbeamEdit/IOUtils.hs b/src/JbeamEdit/IOUtils.hs index ccf588cf..dc81c119 100644 --- a/src/JbeamEdit/IOUtils.hs +++ b/src/JbeamEdit/IOUtils.hs @@ -7,12 +7,12 @@ module JbeamEdit.IOUtils ( reportInvalidNodes, ) where -import Data.List (isPrefixOf) import Control.Exception (IOException, try) import Control.Monad (unless) import Data.ByteString.Lazy qualified as BL ( ByteString, ) +import Data.List (isPrefixOf) import Data.Text (Text) import Data.Text qualified as T (append, pack, unpack) import GHC.IO.Exception (IOErrorType, IOException (IOError)) @@ -51,8 +51,9 @@ tryReadFile noerrs fp = ioErrorMsg noerrs <$> try (OS.readFile fp) isNotEmacsBackupFile :: OsPath -> Bool isNotEmacsBackupFile = not . all (isPrefixOf ".#") . decodeBaseFileName - where decodeBaseFileName :: OsPath -> Maybe FilePath - decodeBaseFileName = decodeUtf . takeFileName + where + decodeBaseFileName :: OsPath -> Maybe FilePath + decodeBaseFileName = decodeUtf . takeFileName pathEndsWithExtension :: String -> OsPath -> Bool pathEndsWithExtension expectedExt filepath = From 4644b646f366c5c3e7a9000738a684bd0510be47 Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Thu, 25 Dec 2025 21:23:16 +0100 Subject: [PATCH 10/12] Newline replacement moved to library component --- jbeam-edit.cabal | 6 +++--- package.yaml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jbeam-edit.cabal b/jbeam-edit.cabal index a7d7fe05..369aa2f8 100644 --- a/jbeam-edit.cabal +++ b/jbeam-edit.cabal @@ -117,6 +117,9 @@ library if (os(windows) && flag(windows-example-paths)) cpp-options: -DWINDOWS_EXAMPLE_PATHS + if os(windows) + cpp-options: -DENABLE_WINDOWS_NEWLINES + library jbeam-edit-transformation exposed-modules: JbeamEdit.Transformation @@ -244,9 +247,6 @@ executable jbeam-edit cpp-options: -DENABLE_TRANSFORMATION build-depends: jbeam-edit-transformation - if os(windows) - cpp-options: -DENABLE_WINDOWS_NEWLINES - executable jbeam-edit-dump-ast main-is: Main.hs hs-source-dirs: tools/dump_ast diff --git a/package.yaml b/package.yaml index b8f04a34..312ded68 100644 --- a/package.yaml +++ b/package.yaml @@ -114,6 +114,8 @@ library: cpp-options: -DENABLE_TRANSFORMATION - condition: os(windows) && flag(windows-example-paths) cpp-options: -DWINDOWS_EXAMPLE_PATHS + - condition: os(windows) + cpp-options: -DENABLE_WINDOWS_NEWLINES _jbeam-lsp-common: &jbeam-lsp-common main: Main.hs @@ -132,8 +134,6 @@ executables: - condition: flag(transformation) dependencies: [jbeam-edit-transformation] cpp-options: -DENABLE_TRANSFORMATION - - condition: os(windows) - cpp-options: -DENABLE_WINDOWS_NEWLINES jbeam-lsp-server: source-dirs: exe/jbeam-lsp-server when: From 426f6a5d836f722ff8e0bf5042aca15893f6e36b Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Thu, 25 Dec 2025 22:38:50 +0100 Subject: [PATCH 11/12] Add automatic fender-after-frame generation in dump-ast tool --- .../fender-after-frame-cfg-default.jbeam | 301 ++++++++++++++++++ .../fender-after-frame-cfg-example.jbeam | 301 ++++++++++++++++++ tools/dump_ast/Main.hs | 36 ++- 3 files changed, 635 insertions(+), 3 deletions(-) create mode 100644 examples/transformed_jbeam/fender-after-frame-cfg-default.jbeam create mode 100644 examples/transformed_jbeam/fender-after-frame-cfg-example.jbeam diff --git a/examples/transformed_jbeam/fender-after-frame-cfg-default.jbeam b/examples/transformed_jbeam/fender-after-frame-cfg-default.jbeam new file mode 100644 index 00000000..942e60f0 --- /dev/null +++ b/examples/transformed_jbeam/fender-after-frame-cfg-default.jbeam @@ -0,0 +1,301 @@ +{ + "cot_fender" : { + "information" : {"authors" : "gittarrgy01", "name" : "Fenders"}, + "sounds" : { + "impactMetal" : "event:>Destruction>Props>fender_metal", + "impactGeneric" : "event:>Destruction>Props>fender_generic", + "breakGeneric" : "event:>Destruction>Props>fender_break", + "wind" : false, + "scrapeMetal" : false, + "scrapePlastic" : false + }, + "slotType" : "cot_fender", + "nodes" : [ + ["id", "posX", "posY", "posZ"], + {"nodeWeight" : 0.65}, + {"frictionCoef" : 0.7}, + {"nodeMaterial" : "|NM_METAL"}, + {"collision" : true}, + {"selfCollision" : true}, + + // Left side + {"group" : "cot_fender_l"}, + ["bfl0", 0.959, -1.762, 0.576], + ["bfl1", 0.855, -1.788, 0.707], + ["bfl2", 0.739, -1.845, 0.716], + ["bfl3", 0.948, -1.435, 0.730], + ["bfl4", 0.756, -1.413, 0.843], + ["bfl5", 0.963, -1.024, 0.112], + ["bfl6", 0.964, -1.072, 0.507], + ["bfl7", 0.778, -1.008, 0.873], + ["bfl8", 0.987, -0.743, 0.109], + ["bfl9", 0.987, -0.744, 0.494], + ["bfl10", 0.812, -0.759, 0.896], + + // Right side + {"group" : "cot_fender_r"}, + ["bfr0", -0.906, -1.737, 0.578], + ["bfr1", -0.807, -1.769, 0.707], + ["bfr2", -0.691, -1.829, 0.716], + ["bfr3", -0.890, -1.409, 0.729], + ["bfr4", -0.700, -1.397, 0.843], + ["bfr5", -0.899, -1.005, 0.112], + ["bfr6", -0.900, -1.053, 0.508], + ["bfr7", -0.715, -0.991, 0.873], + ["bfr8", -0.916, -0.742, 0.112], + ["bfr9", -0.917, -0.746, 0.494], + ["bfr10", -0.734, -0.746, 0.888], + + // Support nodes + {"collision" : false}, + {"selfCollision" : false}, + {"nodeWeight" : 1.2}, + {"group" : ""}, + ["bfsl", 0.684, -1.079, 0.507], + ["bfsr", -0.623, -1.064, 0.507] + ], + "beams" : [ + ["id1:", "id2:"], + + // Structural beams + {"beamType" : "|NORMAL"}, + {"beamSpring" : 451000, "beamDamp" : 50}, + {"beamStrength" : "FLT_MAX"}, + {"deformLimitExpansion" : 1.1}, + {"beamDeform" : 6000}, + + // Front + ["bfr2", "bfr4"], + ["bfr2", "bfr1"], + ["bfr1", "bfr4"], + ["bfl4", "bfl2"], + ["bfl2", "bfl1"], + ["bfl0", "bfl1"], + ["bfl4", "bfl3"], + ["bfl0", "bfl3"], + ["bfr1", "bfr0"], + ["bfr4", "bfr3"], + ["bfr0", "bfr3"], + ["bfl4", "bfl1"], + + // Middle + {"beamDeform" : 12000}, + ["bfl6", "bfl3"], + ["bfr6", "bfr3"], + ["bfl4", "bfl7"], + ["bfr4", "bfr7"], + + // Rear + ["bfl7", "bfl10"], + ["bfl5", "bfl6"], + ["bfl7", "bfl6"], + ["bfl5", "bfl8"], + ["bfl6", "bfl9"], + ["bfl8", "bfl9"], + ["bfl10", "bfl9"], + ["bfr7", "bfr10"], + ["bfr6", "bfr5"], + ["bfr6", "bfr7"], + ["bfr5", "bfr8"], + ["bfr6", "bfr9"], + ["bfr8", "bfr9"], + ["bfr10", "bfr9"], + + // Crossing beams + {"deformLimitExpansion" : ""}, + + // Front + ["bfl0", "bfl4"], + ["bfl4", "bfl6"], + ["bfl7", "bfl3"], + ["bfr4", "bfr6"], + ["bfr7", "bfr3"], + ["bfl1", "bfl3"], + ["bfr3", "bfr1"], + ["bfr4", "bfr0"], + + // Rear + ["bfl6", "bfl10"], + ["bfl7", "bfl9"], + ["bfl5", "bfl9"], + ["bfl6", "bfl8"], + ["bfr6", "bfr10"], + ["bfr7", "bfr9"], + ["bfr5", "bfr9"], + ["bfr6", "bfr8"], + + // Support beams + ["bfl2", "bfsl"], + ["bfl6", "bfsl"], + ["bfl5", "bfsl"], + ["bfl3", "bfsl"], + ["bfl0", "bfsl"], + ["bfl1", "bfsl"], + ["bfl4", "bfsl"], + ["bfl7", "bfsl"], + ["bfl8", "bfsl"], + ["bfl9", "bfsl"], + ["bfl10", "bfsl"], + ["bfr2", "bfsr"], + ["bfr6", "bfsr"], + ["bfr5", "bfsr"], + ["bfr3", "bfsr"], + ["bfr0", "bfsr"], + ["bfr1", "bfsr"], + ["bfr4", "bfsr"], + ["bfr7", "bfsr"], + ["bfr8", "bfsr"], + ["bfr9", "bfsr"], + ["bfr10", "bfsr"], + + // Front rigid + {"beamSpring" : 350000, "beamDamp" : 115}, + {"beamDeform" : 900}, + + // Left side + ["bfl3", "bfl9"], + ["bfl4", "bfl10"], + + // Right side + ["bfr3", "bfr9"], + ["bfr4", "bfr10"], + + // Attachment beams + {"beamType" : "|NORMAL"}, + {"beamSpring" : 501000, "beamDamp" : 75, "beamStrength" : 20000, "beamDeform" : 1000}, + {"deformLimitExpansion" : ""}, + + // Frame + + // Left side + + // Front + {"breakGroup" : "fender_l"}, + {"breakGroupType" : 1}, + ["bfl0", "fr17"], + ["bfl0", "fr9"], + ["bfl1", "fr17"], + ["bfl1", "fr9"], + ["bfl2", "fr17"], + ["bfl2", "fr9"], + + // Middle + {"beamDeform" : 18000}, + {"beamStrength" : 4000}, + {"breakGroupType" : 1}, + ["bfl3", "fr17"], + ["bfl4", "fr17"], + ["bfl4", "fr9"], + {"breakGroupType" : 0}, + + // Rear + {"beamStrength" : 16000, "beamDeform" : 12000}, + ["bfl5", "fr18"], + ["bfl5", "fr27"], + ["bfl6", "fr17"], + ["bfl6", "fr21"], + ["bfl7", "fr17"], + ["bfl7", "fr29"], + ["bfl8", "fr18"], + ["bfl8", "fr27"], + ["bfl9", "fr28"], + ["bfl9", "fr21"], + ["bfl10", "fr17"], + ["bfl10", "fr29"], + + // Right side + + // Front + {"beamStrength" : 20000, "beamDeform" : 1000}, + {"breakGroup" : "fender_r"}, + {"breakGroupType" : 1}, + ["bfl0", "rl_fl2"], + ["bfl0", "rl_fl3"], + ["bfl1", "rl_fl3"], + ["bfl2", "rl_fl3"], + ["bfr0", "rl_fr2"], + ["bfr0", "rl_fr3"], + ["bfr1", "rl_fr3"], + ["bfr2", "rl_fr3"], + + // Middle + {"beamDeform" : 18000}, + {"beamStrength" : 4000}, + {"breakGroupType" : 1}, + ["bfl3", "rl_fl4"], + ["bfl3", "rl_fl5"], + ["bfl4", "rl_fl5"], + ["bfr3", "rl_fr4"], + ["bfr3", "rl_fr5"], + ["bfr4", "rl_fr5"], + {"breakGroupType" : 0}, + + // Rear + {"beamStrength" : 16000, "beamDeform" : 12000}, + ["bfl5", "rl_f15"], + ["bfl5", "rl_f16"], + ["bfl6", "rl_f15"], + ["bfl6", "rl_f16"], + ["bfl8", "rl_f15"], + ["bfl8", "rl_f16"], + ["bfl9", "rl_f15"], + ["bfl9", "rl_f16"], + ["bfl7", "rl_f16"], + ["bfl10", "rl_f16"], + ["bfr5", "rl_f17"], + ["bfr5", "rl_f18"], + ["bfr6", "rl_f17"], + ["bfr6", "rl_f18"], + ["bfr8", "rl_f17"], + ["bfr8", "rl_f18"], + ["bfr9", "rl_f17"], + ["bfr9", "rl_f18"], + ["bfr7", "rl_f18"], + ["bfr10", "rl_f18"], + {"beamStrength" : 16000, "beamDeform" : "FLT_MAX"}, + + // Body + + // Left side + {"breakGroup" : "fender_l"}, + ["bfl8", "mbl0"], + ["bfl9", "mbl1"], + ["bfl10", "mbl2"], + + // Right side + {"breakGroup" : "fender_r"}, + ["bfr8", "mbr0"], + ["bfr9", "mbr1"], + ["bfr10", "mbr2"], + {"breakGroup" : "", "breakGroupType" : "", "beamType" : "|NORMAL"} + ], + "triangles" : [ + ["id1:", "id2:", "id3:"], + ["bfl3", "bfl4", "bfl1"], + ["bfl0", "bfl3", "bfl1"], + ["bfl4", "bfl2", "bfl1"], + ["bfl4", "bfl3", "bfl7"], + ["bfl6", "bfl7", "bfl3"], + ["bfl10", "bfl7", "bfl6"], + ["bfl9", "bfl10", "bfl6"], + ["bfl5", "bfl8", "bfl6"], + ["bfl9", "bfl6", "bfl8"], + ["bfr4", "bfr1", "bfr2"], + ["bfr3", "bfr1", "bfr4"], + ["bfr0", "bfr1", "bfr3"], + ["bfr6", "bfr3", "bfr7"], + ["bfr4", "bfr7", "bfr3"], + ["bfr10", "bfr6", "bfr7"], + ["bfr9", "bfr6", "bfr10"], + ["bfr9", "bfr8", "bfr6"], + ["bfr5", "bfr6", "bfr8"] + ], + "flexbodies" : [ + ["mesh", "[group]:", "nonFlexMaterials"], + ["impala_fender_l", ["cot_fender_l"]], + ["impala_fender_inter_l", ["cot_fender_l"]], + ["impala_fender_r", ["cot_fender_r"]], + ["impala_fender_inter_r", ["cot_fender_r"]] + ] + } +} diff --git a/examples/transformed_jbeam/fender-after-frame-cfg-example.jbeam b/examples/transformed_jbeam/fender-after-frame-cfg-example.jbeam new file mode 100644 index 00000000..942e60f0 --- /dev/null +++ b/examples/transformed_jbeam/fender-after-frame-cfg-example.jbeam @@ -0,0 +1,301 @@ +{ + "cot_fender" : { + "information" : {"authors" : "gittarrgy01", "name" : "Fenders"}, + "sounds" : { + "impactMetal" : "event:>Destruction>Props>fender_metal", + "impactGeneric" : "event:>Destruction>Props>fender_generic", + "breakGeneric" : "event:>Destruction>Props>fender_break", + "wind" : false, + "scrapeMetal" : false, + "scrapePlastic" : false + }, + "slotType" : "cot_fender", + "nodes" : [ + ["id", "posX", "posY", "posZ"], + {"nodeWeight" : 0.65}, + {"frictionCoef" : 0.7}, + {"nodeMaterial" : "|NM_METAL"}, + {"collision" : true}, + {"selfCollision" : true}, + + // Left side + {"group" : "cot_fender_l"}, + ["bfl0", 0.959, -1.762, 0.576], + ["bfl1", 0.855, -1.788, 0.707], + ["bfl2", 0.739, -1.845, 0.716], + ["bfl3", 0.948, -1.435, 0.730], + ["bfl4", 0.756, -1.413, 0.843], + ["bfl5", 0.963, -1.024, 0.112], + ["bfl6", 0.964, -1.072, 0.507], + ["bfl7", 0.778, -1.008, 0.873], + ["bfl8", 0.987, -0.743, 0.109], + ["bfl9", 0.987, -0.744, 0.494], + ["bfl10", 0.812, -0.759, 0.896], + + // Right side + {"group" : "cot_fender_r"}, + ["bfr0", -0.906, -1.737, 0.578], + ["bfr1", -0.807, -1.769, 0.707], + ["bfr2", -0.691, -1.829, 0.716], + ["bfr3", -0.890, -1.409, 0.729], + ["bfr4", -0.700, -1.397, 0.843], + ["bfr5", -0.899, -1.005, 0.112], + ["bfr6", -0.900, -1.053, 0.508], + ["bfr7", -0.715, -0.991, 0.873], + ["bfr8", -0.916, -0.742, 0.112], + ["bfr9", -0.917, -0.746, 0.494], + ["bfr10", -0.734, -0.746, 0.888], + + // Support nodes + {"collision" : false}, + {"selfCollision" : false}, + {"nodeWeight" : 1.2}, + {"group" : ""}, + ["bfsl", 0.684, -1.079, 0.507], + ["bfsr", -0.623, -1.064, 0.507] + ], + "beams" : [ + ["id1:", "id2:"], + + // Structural beams + {"beamType" : "|NORMAL"}, + {"beamSpring" : 451000, "beamDamp" : 50}, + {"beamStrength" : "FLT_MAX"}, + {"deformLimitExpansion" : 1.1}, + {"beamDeform" : 6000}, + + // Front + ["bfr2", "bfr4"], + ["bfr2", "bfr1"], + ["bfr1", "bfr4"], + ["bfl4", "bfl2"], + ["bfl2", "bfl1"], + ["bfl0", "bfl1"], + ["bfl4", "bfl3"], + ["bfl0", "bfl3"], + ["bfr1", "bfr0"], + ["bfr4", "bfr3"], + ["bfr0", "bfr3"], + ["bfl4", "bfl1"], + + // Middle + {"beamDeform" : 12000}, + ["bfl6", "bfl3"], + ["bfr6", "bfr3"], + ["bfl4", "bfl7"], + ["bfr4", "bfr7"], + + // Rear + ["bfl7", "bfl10"], + ["bfl5", "bfl6"], + ["bfl7", "bfl6"], + ["bfl5", "bfl8"], + ["bfl6", "bfl9"], + ["bfl8", "bfl9"], + ["bfl10", "bfl9"], + ["bfr7", "bfr10"], + ["bfr6", "bfr5"], + ["bfr6", "bfr7"], + ["bfr5", "bfr8"], + ["bfr6", "bfr9"], + ["bfr8", "bfr9"], + ["bfr10", "bfr9"], + + // Crossing beams + {"deformLimitExpansion" : ""}, + + // Front + ["bfl0", "bfl4"], + ["bfl4", "bfl6"], + ["bfl7", "bfl3"], + ["bfr4", "bfr6"], + ["bfr7", "bfr3"], + ["bfl1", "bfl3"], + ["bfr3", "bfr1"], + ["bfr4", "bfr0"], + + // Rear + ["bfl6", "bfl10"], + ["bfl7", "bfl9"], + ["bfl5", "bfl9"], + ["bfl6", "bfl8"], + ["bfr6", "bfr10"], + ["bfr7", "bfr9"], + ["bfr5", "bfr9"], + ["bfr6", "bfr8"], + + // Support beams + ["bfl2", "bfsl"], + ["bfl6", "bfsl"], + ["bfl5", "bfsl"], + ["bfl3", "bfsl"], + ["bfl0", "bfsl"], + ["bfl1", "bfsl"], + ["bfl4", "bfsl"], + ["bfl7", "bfsl"], + ["bfl8", "bfsl"], + ["bfl9", "bfsl"], + ["bfl10", "bfsl"], + ["bfr2", "bfsr"], + ["bfr6", "bfsr"], + ["bfr5", "bfsr"], + ["bfr3", "bfsr"], + ["bfr0", "bfsr"], + ["bfr1", "bfsr"], + ["bfr4", "bfsr"], + ["bfr7", "bfsr"], + ["bfr8", "bfsr"], + ["bfr9", "bfsr"], + ["bfr10", "bfsr"], + + // Front rigid + {"beamSpring" : 350000, "beamDamp" : 115}, + {"beamDeform" : 900}, + + // Left side + ["bfl3", "bfl9"], + ["bfl4", "bfl10"], + + // Right side + ["bfr3", "bfr9"], + ["bfr4", "bfr10"], + + // Attachment beams + {"beamType" : "|NORMAL"}, + {"beamSpring" : 501000, "beamDamp" : 75, "beamStrength" : 20000, "beamDeform" : 1000}, + {"deformLimitExpansion" : ""}, + + // Frame + + // Left side + + // Front + {"breakGroup" : "fender_l"}, + {"breakGroupType" : 1}, + ["bfl0", "fr17"], + ["bfl0", "fr9"], + ["bfl1", "fr17"], + ["bfl1", "fr9"], + ["bfl2", "fr17"], + ["bfl2", "fr9"], + + // Middle + {"beamDeform" : 18000}, + {"beamStrength" : 4000}, + {"breakGroupType" : 1}, + ["bfl3", "fr17"], + ["bfl4", "fr17"], + ["bfl4", "fr9"], + {"breakGroupType" : 0}, + + // Rear + {"beamStrength" : 16000, "beamDeform" : 12000}, + ["bfl5", "fr18"], + ["bfl5", "fr27"], + ["bfl6", "fr17"], + ["bfl6", "fr21"], + ["bfl7", "fr17"], + ["bfl7", "fr29"], + ["bfl8", "fr18"], + ["bfl8", "fr27"], + ["bfl9", "fr28"], + ["bfl9", "fr21"], + ["bfl10", "fr17"], + ["bfl10", "fr29"], + + // Right side + + // Front + {"beamStrength" : 20000, "beamDeform" : 1000}, + {"breakGroup" : "fender_r"}, + {"breakGroupType" : 1}, + ["bfl0", "rl_fl2"], + ["bfl0", "rl_fl3"], + ["bfl1", "rl_fl3"], + ["bfl2", "rl_fl3"], + ["bfr0", "rl_fr2"], + ["bfr0", "rl_fr3"], + ["bfr1", "rl_fr3"], + ["bfr2", "rl_fr3"], + + // Middle + {"beamDeform" : 18000}, + {"beamStrength" : 4000}, + {"breakGroupType" : 1}, + ["bfl3", "rl_fl4"], + ["bfl3", "rl_fl5"], + ["bfl4", "rl_fl5"], + ["bfr3", "rl_fr4"], + ["bfr3", "rl_fr5"], + ["bfr4", "rl_fr5"], + {"breakGroupType" : 0}, + + // Rear + {"beamStrength" : 16000, "beamDeform" : 12000}, + ["bfl5", "rl_f15"], + ["bfl5", "rl_f16"], + ["bfl6", "rl_f15"], + ["bfl6", "rl_f16"], + ["bfl8", "rl_f15"], + ["bfl8", "rl_f16"], + ["bfl9", "rl_f15"], + ["bfl9", "rl_f16"], + ["bfl7", "rl_f16"], + ["bfl10", "rl_f16"], + ["bfr5", "rl_f17"], + ["bfr5", "rl_f18"], + ["bfr6", "rl_f17"], + ["bfr6", "rl_f18"], + ["bfr8", "rl_f17"], + ["bfr8", "rl_f18"], + ["bfr9", "rl_f17"], + ["bfr9", "rl_f18"], + ["bfr7", "rl_f18"], + ["bfr10", "rl_f18"], + {"beamStrength" : 16000, "beamDeform" : "FLT_MAX"}, + + // Body + + // Left side + {"breakGroup" : "fender_l"}, + ["bfl8", "mbl0"], + ["bfl9", "mbl1"], + ["bfl10", "mbl2"], + + // Right side + {"breakGroup" : "fender_r"}, + ["bfr8", "mbr0"], + ["bfr9", "mbr1"], + ["bfr10", "mbr2"], + {"breakGroup" : "", "breakGroupType" : "", "beamType" : "|NORMAL"} + ], + "triangles" : [ + ["id1:", "id2:", "id3:"], + ["bfl3", "bfl4", "bfl1"], + ["bfl0", "bfl3", "bfl1"], + ["bfl4", "bfl2", "bfl1"], + ["bfl4", "bfl3", "bfl7"], + ["bfl6", "bfl7", "bfl3"], + ["bfl10", "bfl7", "bfl6"], + ["bfl9", "bfl10", "bfl6"], + ["bfl5", "bfl8", "bfl6"], + ["bfl9", "bfl6", "bfl8"], + ["bfr4", "bfr1", "bfr2"], + ["bfr3", "bfr1", "bfr4"], + ["bfr0", "bfr1", "bfr3"], + ["bfr6", "bfr3", "bfr7"], + ["bfr4", "bfr7", "bfr3"], + ["bfr10", "bfr6", "bfr7"], + ["bfr9", "bfr6", "bfr10"], + ["bfr9", "bfr8", "bfr6"], + ["bfr5", "bfr6", "bfr8"] + ], + "flexbodies" : [ + ["mesh", "[group]:", "nonFlexMaterials"], + ["impala_fender_l", ["cot_fender_l"]], + ["impala_fender_inter_l", ["cot_fender_l"]], + ["impala_fender_r", ["cot_fender_r"]], + ["impala_fender_inter_r", ["cot_fender_r"]] + ] + } +} diff --git a/tools/dump_ast/Main.hs b/tools/dump_ast/Main.hs index 869eaaec..16025217 100644 --- a/tools/dump_ast/Main.hs +++ b/tools/dump_ast/Main.hs @@ -12,7 +12,8 @@ import JbeamEdit.Parsing.DSL (parseDSL) import JbeamEdit.Parsing.Jbeam (parseNodes) import JbeamEdit.Transformation import JbeamEdit.Transformation.Config -import System.Directory (getDirectoryContents) +import JbeamEdit.Transformation.Types +import System.Directory (copyFile, getDirectoryContents) import System.Exit (exitFailure) import System.FilePath (dropExtension, takeBaseName, ()) import System.IO qualified as IO (readFile) @@ -59,6 +60,7 @@ main = do ( dumpTransformedJbeam "cfg-default" newTransformationConfig + jbeamInputDir jbflAstDir jbeamAstDir transformedDir @@ -68,6 +70,7 @@ main = do ( dumpTransformedJbeam "cfg-example" exampleCfg + jbeamInputDir jbflAstDir jbeamAstDir transformedDir @@ -135,6 +138,24 @@ dumpFormattedJbeam outDir (jbeamFile, ruleFile) = do let outFile = outDir filename in saveDump outFile contents +fenderAfterFrame + :: String + -> RuleSet + -> UpdateNamesMap + -> FilePath + -> FilePath + -> String + -> IO () +fenderAfterFrame "frame" rs updateNames input out cfName = do + let outFile = out "fender-after-frame-" ++ cfName ++ ".jbeam" + copyFile input outFile + putStrLn ("creating " ++ outFile) + updateOtherFiles + rs + updateNames + (OS.unsafeEncodeUtf outFile) +fenderAfterFrame _ _ _ _ _ _ = pure () + dumpTransformedJbeam :: String -> TransformationConfig @@ -142,8 +163,9 @@ dumpTransformedJbeam -> FilePath -> FilePath -> FilePath + -> FilePath -> IO () -dumpTransformedJbeam cfName tfConfig rsDirPath jbeamInputAstDir outDir jbeamFile = do +dumpTransformedJbeam cfName tfConfig jbeamDir rsDirPath jbeamInputAstDir outDir jbeamFile = do jbeam <- read <$> IO.readFile (jbeamInputAstDir (takeBaseName jbeamFile <> ".hs")) rs <- read <$> IO.readFile (rsDirPath "minimal.hs") @@ -153,7 +175,15 @@ dumpTransformedJbeam cfName tfConfig rsDirPath jbeamInputAstDir outDir jbeamFile Left err -> do putStrLn $ "error occurred during transformation" ++ T.unpack err exitFailure - Right (_, _, _, jbeam') -> pure jbeam' + Right (_, _, updatedNames, jbeam') -> + fenderAfterFrame + (takeBaseName jbeamFile) + rs + updatedNames + (jbeamDir "fender.jbeam") + outDir + cfName + >> pure jbeam' dump outFilename (T.unpack $ formatNode rs transformedJbeam) where dump filename contents = From f5a875603fefc55e1cbee6746e1ac690cd45de91 Mon Sep 17 00:00:00 2001 From: webdevred <148627186+webdevred@users.noreply.github.com> Date: Thu, 25 Dec 2025 23:16:25 +0100 Subject: [PATCH 12/12] Updated Ci executable testing script --- .github/scripts/prepare_installer.sh | 58 +++++++++++++++++++--------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/.github/scripts/prepare_installer.sh b/.github/scripts/prepare_installer.sh index 66e4e965..70bb040b 100644 --- a/.github/scripts/prepare_installer.sh +++ b/.github/scripts/prepare_installer.sh @@ -55,27 +55,49 @@ else echo "Copied exe to /$DEST_DIR_RELEASE/jbeam-lsp-server.exe" fi -TMP_DIR=$(mktemp -d) -git show HEAD:"./examples/jbeam/fender.jbeam" >"$TMP_DIR/fender.${LABEL}.jbeam" -git show HEAD:"./examples/jbeam/suspension.jbeam" >"$TMP_DIR/suspension.${LABEL}.jbeam" - -echo "fender.jbeam: $TMP_DIR/fender.${LABEL}.jbeam" -echo "suspension.jbeam: $TMP_DIR/suspension.${LABEL}.jbeam" - cp ./examples/jbeam-edit.yaml ./.jbeam-edit.yaml +JBEAM_DIR="./examples/jbeam" + custom_diff() { diff --color=always --suppress-common-lines "$1" "$2" } -if [[ -n $LABEL ]] && [[ "$LABEL" == "experimental" ]]; then - ./dist/release/jbeam-edit -i -t "$TMP_DIR/fender.${LABEL}.jbeam" - ./dist/release/jbeam-edit -i -t "$TMP_DIR/suspension.${LABEL}.jbeam" - custom_diff "$TMP_DIR/fender.experimental.jbeam" ./examples/transformed_jbeam/fender-cfg-example.jbeam - custom_diff "$TMP_DIR/suspension.experimental.jbeam" ./examples/transformed_jbeam/suspension-cfg-example.jbeam -else - ./dist/release/jbeam-edit -i "$TMP_DIR/fender.${LABEL}.jbeam" - ./dist/release/jbeam-edit -i "$TMP_DIR/suspension.${LABEL}.jbeam" - custom_diff "$TMP_DIR/fender.stable.jbeam" ./examples/formatted_jbeam/fender-minimal-jbfl.jbeam - custom_diff "$TMP_DIR/suspension.stable.jbeam" ./examples/formatted_jbeam/suspension-minimal-jbfl.jbeam -fi +mapfile -t JBEAM_FILES < <(find "$JBEAM_DIR" -maxdepth 1 -name "*.jbeam" -printf "%f\n") + +for f in "${JBEAM_FILES[@]}"; do + TMP_DIR=$(mktemp -d) + trap 'rm -rf "$TMP_DIR"' EXIT + + if [[ "${LABEL:-}" == "experimental" ]]; then + if [[ "$f" == "frame.jbeam" ]]; then + git show HEAD:"$JBEAM_DIR/frame.jbeam" >"$TMP_DIR/frame.jbeam" + git show HEAD:"$JBEAM_DIR/fender.jbeam" >"$TMP_DIR/fender.jbeam" + + ./dist/release/jbeam-edit -i -t "$TMP_DIR/frame.jbeam" + + expected_fender="./examples/transformed_jbeam/fender-after-frame-cfg-example.jbeam" + echo "Checking fender.jbeam after frame transformation" + custom_diff "$TMP_DIR/fender.jbeam" "$expected_fender" + else + git show HEAD:"$JBEAM_DIR/$f" >"$TMP_DIR/$f" + ./dist/release/jbeam-edit -i -t "$TMP_DIR/$f" + fi + + expected="./examples/transformed_jbeam/$(basename "$f" .jbeam)-cfg-example.jbeam" + echo "Checking $f against $expected" + custom_diff "$TMP_DIR/$f" "$expected" + + else + git show HEAD:"$JBEAM_DIR/$f" >"$TMP_DIR/$f" + ./dist/release/jbeam-edit -i "$TMP_DIR/$f" + + expected="./examples/formatted_jbeam/$(basename "$f" .jbeam)-minimal-jbfl.jbeam" + echo "Checking $f against $expected" + custom_diff "$TMP_DIR/$f" "$expected" + fi + + rm -rf "$TMP_DIR" +done + +echo "All jbeam files passed checks!"