diff --git a/Strategies/Standard/STR0003/STR0003.lua b/Strategies/Standard/STR0003/STR0003.lua index d259c09..c4e62be 100644 --- a/Strategies/Standard/STR0003/STR0003.lua +++ b/Strategies/Standard/STR0003/STR0003.lua @@ -250,6 +250,7 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) -- lama - calcolo lavorazioni local Cutting = {} + -- parametri comuni a tutte le lavorazioni cutting local OptionalParameters = { bForceLongcutBlade = Strategy.Parameters.bForceLongcutBlade, dExtendAfterTail = dExtendAfterTail, @@ -257,6 +258,8 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) bIsSplitFeature = bIsSplitFeature, dMinNzDownUp = 0 } + + -- primo lato del tunnel o lato di fondo if Proc.Topology.sFamily == 'Tunnel' then OptionalParameters.bOppositeToolDirection = true Cutting = FaceByBlade.Make( Proc, Part, LongFace, OppositeEdge1, OptionalParameters) @@ -264,14 +267,19 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Cutting = FaceByBlade.Make( Proc, Part, LongFace, BottomEdge, OptionalParameters) end Blade.AddResult( Cutting) + -- lato opposto del tunnel if Proc.Topology.sFamily == 'Tunnel' then OptionalParameters.bOppositeToolDirection = true + Cutting = FaceByBlade.Make( Proc, Part, LongFace, OppositeEdge2, OptionalParameters) Blade.AddResult( Cutting) + + -- per tutte le altre topologie lavorazione lati aggiuntivi else -- se la lama non è arrivata sul fondo e c'è almeno un lato aperto va lavorato if Blade.Result.Bottom[1].dResidualDepth > 10 * GEO.EPS_SMALL then + -- eventuale lavorazione di lama - lato della tasca da cui inizia la lavorazione if BottomEdge.bIsStartOpen then OptionalParameters.bOppositeToolDirection = true @@ -279,6 +287,7 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Cutting = FaceByBlade.Make( Proc, Part, LongFace, SideEdge1, OptionalParameters) Blade.AddResult( Cutting) end + -- eventuale lavorazione di lama - lato della tasca in cui finisce la lavorazione if BottomEdge.bIsEndOpen then OptionalParameters.bOppositeToolDirection = true @@ -286,32 +295,39 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Cutting = FaceByBlade.Make( Proc, Part, LongFace, SideEdge2, OptionalParameters) Blade.AddResult( Cutting) end + -- la lama è arrivata sul fondo e tasca passante, non servono ulteriori lavorazioni elseif #( Proc.MainFaces.SideFaces) == 0 then Strategy.Parameters.bFinishWithChainSaw = false Strategy.Parameters.bNotCompleteWithBladeRadius = false end end + -- lama - lavorazioni raggruppate in unica lista Blade.Result.Sorted = MergeResults( Blade.Result) + -- lama - aggiunta eventuali lavorazioni splittate if bIsSplitFeature then Blade.Result.Sorted = MachiningLib.GetSplitMachinings( Blade.Result.Sorted, FeatureSplittingPoints, Part) end + -- lama - nessuna lavorazione successiva - aggiunta lavorazioni e calcolo risultati -- TODO bisogna uscire se la lama non può fare alcuna lavorazione; non ha senso che STR0003 lama+catena sia scelta se la lama non può lavorare, in quel caso deve essere scelta la STR0004 solo catena if not Strategy.Parameters.bFinishWithChainSaw then + -- ordinamento if Strategy.Parameters.bSortBySegment then table.sort( Blade.Result.Sorted, SortMachiningsBySegment) else table.sort( Blade.Result.Sorted, SortMachiningsByTool) end + -- aggiunta lavorazioni local nIsApplicableCount = 0 local bAreAllMachiningsAdded = true local dFinalCompletionPercentage = 100 bAreAllMachiningsAdded, nIsApplicableCount = AddMachinings( Proc, Blade.Result.Sorted, bAddMachining) + if nIsApplicableCount > 0 then -- TODO sistemare il calcolo completamento - implementare calcolo area lavorata if not Strategy.Parameters.bNotCompleteWithBladeRadius and Cutting.dCompletionPercentage > 100 - 10 * GEO.EPS_SMALL then @@ -340,13 +356,15 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) -- sega a catena - calcolo lavorazioni local Mortising = {} - -- parametri comuni a tutte le lavorazioni + -- parametri comuni a tutte le lavorazioni mortising OptionalParameters = { dExtendAfterTail = dExtendAfterTail, dPocketHeight = dPocketHeight, bIsSplitFeature = bIsSplitFeature } + if Proc.Topology.sName == 'Groove-4-Blind' or Proc.Topology.sName == 'Pocket-5-Blind' then + -- si lavora solamente l'impronta lama sui lati chiusi if ( Blade.Result.Bottom[1].dResidualDepth < 10 * GEO.EPS_SMALL) and ( BottomEdge.dLength > 3 * Blade.Result.Bottom[1].dBladeMarkLength - 10 * GEO.EPS_SMALL) then @@ -358,6 +376,7 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, BottomEdge, OptionalParameters) Chainsaw.AddResult( Mortising) end + if not BottomEdge.bIsEndOpen then OptionalParameters.sSideToMachine = 'End' OptionalParameters.dLengthToMachine = Blade.Result.Bottom[1].dBladeMarkLength @@ -366,8 +385,10 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Chainsaw.AddResult( Mortising) end + -- reset parametri opzionali OptionalParameters.sSideToMachine = nil OptionalParameters.dLengthToMachine = nil + -- si lavora tutto il fondo else OptionalParameters.dMaxElev = Blade.Result.Bottom[1].dResidualDepth + BeamData.CUT_EXTRA @@ -377,36 +398,47 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) OptionalParameters.dMaxElev = nil end + -- ancora materiale residuo - se possibile si lavora dal lato - if Chainsaw.Result.Bottom[#Chainsaw.Result.Bottom].dResidualDepth > 10 * GEO.EPS_SMALL and #Proc.MainFaces.SideFaces == 1 then + if Chainsaw.Result.Bottom[#Chainsaw.Result.Bottom].dResidualDepth > 10 * GEO.EPS_SMALL + and #Proc.MainFaces.SideFaces == 1 then + -- si lavora solamente l'impronta lama sul fondo if ( #Blade.Result.Side > 0) and Blade.Result.Side[1].dResidualDepth < 10 * GEO.EPS_SMALL then + if ( BottomEdge.bIsStartOpen and SideEdge1.dLength > 3 * Blade.Result.Side[1].dBladeMarkLength - 10 * GEO.EPS_SMALL) then + OptionalParameters.sSideToMachine = 'End' OptionalParameters.dLengthToMachine = Blade.Result.Side[1].dBladeMarkLength OptionalParameters.bOppositeToolDirection = true Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge1, OptionalParameters) + elseif ( BottomEdge.bIsEndOpen and SideEdge2.dLength > 3 * Blade.Result.Side[1].dBladeMarkLength - 10 * GEO.EPS_SMALL) then + OptionalParameters.sSideToMachine = 'Start' OptionalParameters.dLengthToMachine = Blade.Result.Side[2].dBladeMarkLength OptionalParameters.bOppositeToolDirection = true Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge2, OptionalParameters) end + -- si lavora tutto il lato else local dBladeResidualDepth + if #Blade.Result.Side > 0 then dBladeResidualDepth = Blade.Result.Side[1].dResidualDepth else dBladeResidualDepth = Blade.Result.Bottom[1].dResidualDepth end + if BottomEdge.bIsStartOpen then OptionalParameters.dMaxElev = dBladeResidualDepth + BeamData.CUT_EXTRA OptionalParameters.bOppositeToolDirection = true Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge1, OptionalParameters) + elseif BottomEdge.bIsEndOpen then OptionalParameters.dMaxElev = dBladeResidualDepth + BeamData.CUT_EXTRA OptionalParameters.bOppositeToolDirection = true @@ -414,10 +446,14 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge2, OptionalParameters) end end + Chainsaw.AddResult( Mortising) end + elseif Proc.Topology.sName == 'Groove-3-Through' then + if Blade.Result.Bottom[1].dResidualDepth > 10 * GEO.EPS_SMALL then + -- si lavora tutto il fondo OptionalParameters.dMaxElev = Blade.Result.Bottom[1].dResidualDepth + BeamData.CUT_EXTRA @@ -425,21 +461,29 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Chainsaw.AddResult( Mortising) OptionalParameters.dMaxElev = nil + -- ancora materiale residuo - si lavorano i lati if Chainsaw.Result.Bottom[1].dResidualDepth > 10 * GEO.EPS_SMALL then + OptionalParameters.bExtendWithCornerRadius = true + -- si lavora solamente l'impronta lama sul fondo if ( Blade.Result.Side[1].dResidualDepth < 10 * GEO.EPS_SMALL and SideEdge1.dLength > 3 * Blade.Result.Side[1].dBladeMarkLength - 10 * GEO.EPS_SMALL) and ( Blade.Result.Side[2].dResidualDepth < 10 * GEO.EPS_SMALL and SideEdge2.dLength > 3 * Blade.Result.Side[2].dBladeMarkLength - 10 * GEO.EPS_SMALL) then + OptionalParameters.dDepthToMachine = SideEdge1.dElevation + BeamData.CUT_EXTRA OptionalParameters.sSideToMachine = 'End' OptionalParameters.dLengthToMachine = Blade.Result.Side[1].dBladeMarkLength OptionalParameters.bOppositeToolDirection = true Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge1, OptionalParameters) Chainsaw.AddResult( Mortising) + -- ancora materiale residuo - si lavora da entrambi i lati if Chainsaw.Result.Side[1].dResidualDepth > 10 * GEO.EPS_SMALL then + + Chainsaw.Result.Side[1].bIsApplicable = false + OptionalParameters.dDepthToMachine = SideEdge1.dElevation / 2 + BeamData.CUT_EXTRA_MIN OptionalParameters.sSideToMachine = 'End' OptionalParameters.dLengthToMachine = Blade.Result.Side[1].dBladeMarkLength @@ -453,20 +497,26 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge2, OptionalParameters) Chainsaw.AddResult( Mortising) + -- lavorando dai due lati non c'è materiale residuo - si può eliminare la lavorazione del fondo if Chainsaw.Result.Side[2].dResidualDepth < 10 * GEO.EPS_SMALL then Chainsaw.Result.Bottom[1].bIsApplicable = false end end + -- si lavora tutto il lato else + + OptionalParameters.dDepthToMachine = SideEdge1.dElevation + BeamData.CUT_EXTRA OptionalParameters.dMaxElev = Blade.Result.Side[1].dResidualDepth + BeamData.CUT_EXTRA OptionalParameters.bOppositeToolDirection = true Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge1, OptionalParameters) Chainsaw.AddResult( Mortising) + -- ancora materiale residuo - si lavora da entrambi i lati if Chainsaw.Result.Side[1].dResidualDepth > 10 * GEO.EPS_SMALL then + Chainsaw.Result.Side[1].bIsApplicable = false OptionalParameters.dDepthToMachine = SideEdge1.dElevation / 2 + BeamData.CUT_EXTRA_MIN @@ -480,6 +530,7 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge2, OptionalParameters) Chainsaw.AddResult( Mortising) + -- lavorando dai due lati non c'è materiale residuo - si può disabilitare la lavorazione del fondo if Chainsaw.Result.Side[2].dResidualDepth < 10 * GEO.EPS_SMALL then Chainsaw.Result.Bottom[1].bIsApplicable = false @@ -488,18 +539,22 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) end end end + elseif Proc.Topology.sName == 'Tunnel-4-Through' then + OptionalParameters.bOppositeToolDirection = true OptionalParameters.bExtendWithCornerRadius = true + -- si lavora solamente l'impronta lama sul lato opposto if ( Blade.Result.Opposite[1].dResidualDepth < 10 * GEO.EPS_SMALL and OppositeEdge1.dLength > 3 * Blade.Result.Opposite[1].dBladeMarkLength - 10 * GEO.EPS_SMALL) and ( Blade.Result.Opposite[2].dResidualDepth < 10 * GEO.EPS_SMALL and OppositeEdge2.dLength > 3 * Blade.Result.Opposite[2].dBladeMarkLength - 10 * GEO.EPS_SMALL) then - OptionalParameters.dLengthToMachine = max( - Blade.Result.Opposite[1].dBladeMarkLength, - Blade.Result.Opposite[2].dBladeMarkLength - ) - OptionalParameters.sSideToMachine = 'Start' + OptionalParameters.dLengthToMachine = max( + Blade.Result.Opposite[1].dBladeMarkLength, + Blade.Result.Opposite[2].dBladeMarkLength + ) + OptionalParameters.dDepthToMachine = OppositeEdge1.dElevation + BeamData.CUT_EXTRA + OptionalParameters.sSideToMachine = 'Start' Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, OppositeEdge1, OptionalParameters) Chainsaw.AddResult( Mortising) @@ -508,8 +563,11 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, OppositeEdge1, OptionalParameters) Chainsaw.AddResult( Mortising) + -- se lavorando solo da un lato rimane materiale residuo, si lavora da entrambi - if Chainsaw.Result.Opposite[1].dResidualDepth > 10 * GEO.EPS_SMALL or Chainsaw.Result.Opposite[2].dResidualDepth > 10 * GEO.EPS_SMALL then + if Chainsaw.Result.Opposite[1].dResidualDepth > 10 * GEO.EPS_SMALL + or Chainsaw.Result.Opposite[2].dResidualDepth > 10 * GEO.EPS_SMALL then + Chainsaw.Result.Opposite[1].bIsApplicable = false Chainsaw.Result.Opposite[2].bIsApplicable = false @@ -539,12 +597,17 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, OppositeEdge2, OptionalParameters) Chainsaw.AddResult( Mortising) end + + -- si lavora tutto il lato else + OptionalParameters.dDepthToMachine = OppositeEdge1.dElevation + BeamData.CUT_EXTRA OptionalParameters.dMaxElev = Blade.Result.Opposite[1].dResidualDepth + BeamData.CUT_EXTRA Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, OppositeEdge1, OptionalParameters) Chainsaw.AddResult( Mortising) + if Chainsaw.Result.Opposite[1].dResidualDepth > 10 * GEO.EPS_SMALL then + Chainsaw.Result.Opposite[1].bIsApplicable = false OptionalParameters.dDepthToMachine = OppositeEdge1.dElevation / 2 + BeamData.CUT_EXTRA_MIN @@ -561,8 +624,10 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) end end end + -- sega a catena - lavorazioni raggruppate in unica lista Chainsaw.Result.Sorted = MergeResults( Chainsaw.Result) + -- sega a catena - aggiunta eventuali lavorazioni splittate if bIsSplitFeature then Chainsaw.Result.Sorted = MachiningLib.GetSplitMachinings( Chainsaw.Result.Sorted, FeatureSplittingPoints, Part) @@ -576,17 +641,21 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) for i = 1, #Chainsaw.Result.Sorted do table.insert( Result, Chainsaw.Result.Sorted[i]) end + -- ordinamento if Strategy.Parameters.bSortBySegment then table.sort( Result, SortMachiningsBySegment) else table.sort( Result, SortMachiningsByTool) end + -- aggiunta lavorazioni per tutti gli utensili local nIsApplicableCount = 0 local bAreAllMachiningsAdded = true local dFinalCompletionPercentage = 100 bAreAllMachiningsAdded, nIsApplicableCount = AddMachinings( Proc, Result, bAddMachining) + + -- calcolo risultati if nIsApplicableCount > 0 then if Mortising.dCompletionPercentage > 100 - 10 * GEO.EPS_SMALL then Strategy.Result.sStatus = 'Completed' @@ -598,9 +667,7 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) else Strategy.Result.sStatus = 'Not-Applicable' end - -- calcolo risultati Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dFinalCompletionPercentage) - -- TODO è giusto così? bisogna tenere solo la qualità peggiore? Strategy.Result.nQuality = 0.5 * TOOLS[Cutting.nToolIndex].nQuality + 0.5 * TOOLS[Mortising.nToolIndex].nQuality local MRRParametersBlade = { dStep = TOOLS[Cutting.nToolIndex].dThickness, diff --git a/Strategies/Standard/STR0004/STR0004.lua b/Strategies/Standard/STR0004/STR0004.lua index 1990480..972f2b9 100644 --- a/Strategies/Standard/STR0004/STR0004.lua +++ b/Strategies/Standard/STR0004/STR0004.lua @@ -175,36 +175,50 @@ function STR0004.Make( bAddMachining, Proc, Part, CustomParameters) dPocketHeight = dPocketHeight, bIsSplitFeature = bIsSplitFeature } + if Proc.Topology.sName == 'Groove-4-Blind' or Proc.Topology.sName == 'Pocket-5-Blind' then + -- si lavora tutto il fondo Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, BottomEdge, OptionalParameters) Chainsaw.AddResult( Mortising) - -- materiale residuo - se possibile si lavora dal lato - if ( Chainsaw.Result.Bottom[#Chainsaw.Result.Bottom].dResidualDepth > 10 * GEO.EPS_SMALL or not Chainsaw.Result.Bottom[#Chainsaw.Result.Bottom].bIsApplicable) and #Proc.MainFaces.SideFaces == 1 then - if BottomEdge.bIsStartOpen then - OptionalParameters.bOppositeToolDirection = true + -- materiale residuo - se possibile si lavora dal lato + if ( Chainsaw.Result.Bottom[#Chainsaw.Result.Bottom].dResidualDepth > 10 * GEO.EPS_SMALL + or not Chainsaw.Result.Bottom[#Chainsaw.Result.Bottom].bIsApplicable) + and #Proc.MainFaces.SideFaces == 1 then + + OptionalParameters.bOppositeToolDirection = true + + if BottomEdge.bIsStartOpen then Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge1, OptionalParameters) elseif BottomEdge.bIsEndOpen then - OptionalParameters.bOppositeToolDirection = true - Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge2, OptionalParameters) end + Chainsaw.AddResult( Mortising) end + elseif Proc.Topology.sName == 'Groove-3-Through' then + -- si lavora tutto il fondo Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, BottomEdge, OptionalParameters) Chainsaw.AddResult( Mortising) + -- materiale residuo - si lavorano i lati - if ( Chainsaw.Result.Bottom[1].dResidualDepth > 10 * GEO.EPS_SMALL or not Chainsaw.Result.Bottom[#Chainsaw.Result.Bottom].bIsApplicable) then + if ( Chainsaw.Result.Bottom[1].dResidualDepth > 10 * GEO.EPS_SMALL or + not Chainsaw.Result.Bottom[#Chainsaw.Result.Bottom].bIsApplicable) then + + OptionalParameters.dDepthToMachine = SideEdge1.dElevation + BeamData.CUT_EXTRA OptionalParameters.bOppositeToolDirection = true Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge1, OptionalParameters) Chainsaw.AddResult( Mortising) + -- ancora materiale residuo - si lavora da entrambi i lati if Chainsaw.Result.Side[1].dResidualDepth > 10 * GEO.EPS_SMALL then + Chainsaw.Result.Side[1].bIsApplicable = false + OptionalParameters.bExtendWithCornerRadius = true OptionalParameters.dDepthToMachine = SideEdge1.dElevation / 2 + BeamData.CUT_EXTRA_MIN @@ -215,20 +229,27 @@ function STR0004.Make( bAddMachining, Proc, Part, CustomParameters) Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge2, OptionalParameters) Chainsaw.AddResult( Mortising) + -- lavorando dai due lati non c'è materiale residuo - si può disabilitare la lavorazione del fondo if Chainsaw.Result.Side[2].dResidualDepth < 10 * GEO.EPS_SMALL then Chainsaw.Result.Bottom[1].bIsApplicable = false end end end + elseif Proc.Topology.sName == 'Tunnel-4-Through' then + + OptionalParameters.dDepthToMachine = OppositeEdge1.dElevation + BeamData.CUT_EXTRA OptionalParameters.bOppositeToolDirection = true Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, OppositeEdge1, OptionalParameters) Chainsaw.AddResult( Mortising) + -- se lavorando solo da un lato rimane materiale residuo, si lavora da entrambi if Chainsaw.Result.Opposite[1].dResidualDepth > 10 * GEO.EPS_SMALL then + Chainsaw.Result.Opposite[1].bIsApplicable = false + OptionalParameters.bExtendWithCornerRadius = true OptionalParameters.dDepthToMachine = OppositeEdge1.dElevation / 2 + BeamData.CUT_EXTRA_MIN @@ -285,6 +306,8 @@ function STR0004.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Result.sInfo = Strategy.Result.sInfo .. '\n' .. Chainsaw.Result.Sorted[i].sMessage end end + + -- calcolo risultati if nIsApplicableCount > 0 then if Mortising.dCompletionPercentage > 100 - 10 * GEO.EPS_SMALL then Strategy.Result.sStatus = 'Completed' diff --git a/StrategyLibs/FACEBYCHAINSAW.lua b/StrategyLibs/FACEBYCHAINSAW.lua index 9de327d..714659b 100644 --- a/StrategyLibs/FACEBYCHAINSAW.lua +++ b/StrategyLibs/FACEBYCHAINSAW.lua @@ -66,7 +66,7 @@ function FACEBYCHAINSAW.Make( Proc, Part, FaceToMachine, EdgeToMachine, Optional local dLengthToMachine = OptionalParameters.dLengthToMachine or EdgeToMachine.dLength local dCustomMaxElev = OptionalParameters.dMaxElev or EdgeToMachine.dElevation local dDepthToMachine = OptionalParameters.dDepthToMachine or EdgeToMachine.dElevation - local bExtendWithCornerRadius = OptionalParameters.bExtendWithCornerRadius + local bExtendWithCornerRadius = OptionalParameters.bExtendWithCornerRadius or false local dExtendAfterTail = OptionalParameters.dExtendAfterTail or 10000 local dPocketHeight = OptionalParameters.dPocketHeight or 0 local bIsSplitFeature = OptionalParameters.bIsSplitFeature or false