feat(marker): sideriver — mål hvor riven lægger skåret, forskyd læssevognen tilsvarende (v1.24.0.0)
Brugerkrav 25/9: alle river-typer skal virke. Nedlægningsområdet (runtime-felt eller riverens XML) måles i traktorens ramme mens riven arbejder; læssevognen på rivens kursus får CP-toolOffsetX = egen - skårets forskydning og får sin værdi tilbage når den slippes.
This commit is contained in:
@@ -74,6 +74,68 @@ function ADCpBridge.isWorking(vehicle)
|
||||
return vehicle.getIsAIActive ~= nil and vehicle:getIsAIActive() or false
|
||||
end
|
||||
|
||||
-- Courseplays værktøjsforskydning (venstre positiv) på køretøjet; den der flytter kursuslinjen.
|
||||
function ADCpBridge.getToolOffset(vehicle)
|
||||
if vehicle == nil or vehicle.getCpSettings == nil then return 0 end
|
||||
local ok, value = pcall(function() return vehicle:getCpSettings().toolOffsetX:getValue() end)
|
||||
return ok and type(value) == "number" and value or 0
|
||||
end
|
||||
|
||||
function ADCpBridge.setToolOffset(vehicle, value)
|
||||
if vehicle == nil or vehicle.getCpSettings == nil then return false end
|
||||
return (pcall(function() vehicle:getCpSettings().toolOffsetX:setFloatValue(value) end))
|
||||
end
|
||||
|
||||
-- Riverens XML: workArea-nr (1-baseret) -> dropWindrowWorkAreaIndex. Bruges når spillet ikke har feltet
|
||||
-- på workArea-tabellen. Cachet pr. fil.
|
||||
ADCpBridge.dropIndexCache = {}
|
||||
function ADCpBridge.readDropIndicesFromXml(fileName)
|
||||
if ADCpBridge.dropIndexCache[fileName] ~= nil then return ADCpBridge.dropIndexCache[fileName] end
|
||||
local indices = {}
|
||||
local ok = pcall(function()
|
||||
local xmlFile = XMLFile.load("adspuRake", fileName)
|
||||
if xmlFile == nil then return end
|
||||
local position = 0
|
||||
xmlFile:iterate("vehicle.workAreas.workArea", function(_, key)
|
||||
position = position + 1
|
||||
local dropIndex = xmlFile:getInt(key .. ".windrower#dropWindrowWorkAreaIndex")
|
||||
if dropIndex ~= nil then indices[position] = dropIndex end
|
||||
end)
|
||||
xmlFile:delete()
|
||||
end)
|
||||
if not ok then indices = {} end
|
||||
ADCpBridge.dropIndexCache[fileName] = indices
|
||||
return indices
|
||||
end
|
||||
|
||||
-- Hvor langt til venstre (positiv) for rivens kursuslinje skåret lægges: midten af nedlægningsområdet i
|
||||
-- traktorens ramme minus rivens egen CP-forskydning. Midterrive ≈ 0, siderive fx 3 m. nil = ingen river.
|
||||
function ADCpBridge.getWindrowOffset(vehicle)
|
||||
local root = vehicle.rootNode
|
||||
local sum, count = 0, 0
|
||||
for _, object in ipairs(collect(vehicle)) do
|
||||
local areas = object.spec_windrower ~= nil and object.spec_workArea ~= nil and object.spec_workArea.workAreas or nil
|
||||
if areas ~= nil then
|
||||
local fromXml = nil
|
||||
for position, workArea in ipairs(areas) do
|
||||
local dropIndex = workArea.dropWindrowWorkAreaIndex
|
||||
if dropIndex == nil and object.configFileName ~= nil then
|
||||
fromXml = fromXml or ADCpBridge.readDropIndicesFromXml(object.configFileName)
|
||||
dropIndex = fromXml[position]
|
||||
end
|
||||
local drop = dropIndex ~= nil and areas[dropIndex] or nil
|
||||
if drop ~= nil and drop.width ~= nil and drop.height ~= nil then
|
||||
local widthX = localToLocal(drop.width, root, 0, 0, 0)
|
||||
local heightX = localToLocal(drop.height, root, 0, 0, 0)
|
||||
sum, count = sum + (widthX + heightX) / 2, count + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if count == 0 then return nil end
|
||||
return sum / count - ADCpBridge.getToolOffset(vehicle)
|
||||
end
|
||||
|
||||
-- Køretøjets nuværende Courseplay-kursus (slåmaskinens kursus genbruges af de næste trin).
|
||||
function ADCpBridge.getCourse(vehicle)
|
||||
if vehicle == nil or vehicle.getFieldWorkCourse == nil then return nil end
|
||||
|
||||
Reference in New Issue
Block a user