diff --git a/config/HelpMenu.xml b/config/HelpMenu.xml
index 226e29086..e8c1e9bac 100644
--- a/config/HelpMenu.xml
+++ b/config/HelpMenu.xml
@@ -191,11 +191,10 @@
-
-
+
diff --git a/config/MasterTranslations.xml b/config/MasterTranslations.xml
index 0e30805f2..aa0922ec8 100644
--- a/config/MasterTranslations.xml
+++ b/config/MasterTranslations.xml
@@ -1814,6 +1814,10 @@ The course is saved automatically on closing of the editor and overrides the sel
+
+
+
+
@@ -2462,19 +2466,24 @@ By clicking on the name you will get the option to either delete, rename or edit
diff --git a/config/gui/pages/CourseGeneratorFrame.xml b/config/gui/pages/CourseGeneratorFrame.xml
index da191c2f0..f1b1f7d0f 100644
--- a/config/gui/pages/CourseGeneratorFrame.xml
+++ b/config/gui/pages/CourseGeneratorFrame.xml
@@ -34,6 +34,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -159,6 +188,10 @@
-->
+
+
+
+
diff --git a/img/helpmenu/customfield.dds b/img/helpmenu/customfield.dds
new file mode 100644
index 000000000..51521ddc8
Binary files /dev/null and b/img/helpmenu/customfield.dds differ
diff --git a/scripts/field/CustomField.lua b/scripts/field/CustomField.lua
index 271d3dd1e..cbdb4d8f7 100644
--- a/scripts/field/CustomField.lua
+++ b/scripts/field/CustomField.lua
@@ -54,6 +54,11 @@ function CustomField:setVertices(vertices)
self.vertices = vertices
end
+---@return CustomFieldHotspot
+function CustomField:getHotspot()
+ return self.fieldHotspot
+end
+
function CustomField:delete()
if self.fieldHotspot then
g_currentMission:removeMapHotspot(self.fieldHotspot)
diff --git a/scripts/field/CustomFieldManager.lua b/scripts/field/CustomFieldManager.lua
index 051a8de5f..e7029835f 100644
--- a/scripts/field/CustomFieldManager.lua
+++ b/scripts/field/CustomFieldManager.lua
@@ -37,6 +37,17 @@ function CustomFieldManager:init(fileSystem)
self:load()
end
+---@return number
+function CustomFieldManager:getNumFields()
+ return #self.fields
+end
+
+---@param index number
+---@return CustomField|nil
+function CustomFieldManager:getFieldByIndex(index)
+ return self.fields[index]
+end
+
function CustomFieldManager:load()
self.fields = {}
self.fileSystem:refresh()
@@ -71,6 +82,17 @@ function CustomFieldManager:getNewFieldNumber()
return ix
end
+---@param polygon Polygon
+function CustomFieldManager:addFieldFromPolygon(polygon)
+ local waypoints = {}
+ polygon:calculateProperties()
+ polygon:splitEdges(5)
+ for _, v in polygon:vertices() do
+ table.insert(waypoints, Waypoint.initFromGeneratedWp(v))
+ end
+ self:addField(waypoints)
+end
+
--- Creates a new custom field from a given vertices table.
---@param waypoints table
function CustomFieldManager:addField(waypoints)
@@ -147,6 +169,7 @@ function CustomFieldManager:onClickSaveDialog(clickOk, field)
fieldValid = true
table.insert(self.fields, field)
self.fileSystem:refresh()
+ g_messageCenter:publish(MessageType.CP_CUSTOM_FIELD_CHANGED)
else
CpUtil.info("Failed to create custom Field: %s", field:getName())
end
@@ -255,5 +278,6 @@ end
-- for reload only:
if g_customFieldManager then
+ ---@type CustomFieldManager
g_customFieldManager = CustomFieldManager(FileSystem(g_Courseplay.customFieldDir, g_currentMission.missionInfo.mapId))
end
\ No newline at end of file
diff --git a/scripts/geometry/Polygon.lua b/scripts/geometry/Polygon.lua
index b943b33c1..21629a0cb 100644
--- a/scripts/geometry/Polygon.lua
+++ b/scripts/geometry/Polygon.lua
@@ -59,9 +59,9 @@ end
--- ( 3, nil) -> 3, 4, 5, 1, 2
--- ( 3, 1) -> 3, 4, 5, 1
--- ( 1, 3) -> 1, 2, 3
----@param from number index of first vertex
----@param to number index of last vertex
----@param step number step (1 or -1 only), direction of iteration
+---@param from number|nil index of first vertex
+---@param to number|nil index of last vertex
+---@param step number|nil step (1 or -1 only), direction of iteration
---@return number, Vertex, Vertex, Vertex the index, the vertex at index, the previous, and the next vertex.
--- previous and next may be nil
function Polygon:vertices(from, to, step)
diff --git a/scripts/geometry/Polyline.lua b/scripts/geometry/Polyline.lua
index 0292892d5..4b4e570b0 100644
--- a/scripts/geometry/Polyline.lua
+++ b/scripts/geometry/Polyline.lua
@@ -818,7 +818,7 @@ function Polyline:setAttribute(ix, setter, ...)
end
--- Remove all existing vertices
----@param ix number optional start index
+---@param ix number|nil optional start index
function Polyline:_reset(ix)
for i = ix or 1, #self do
self[i] = nil
diff --git a/scripts/gui/CustomFieldHotspot.lua b/scripts/gui/CustomFieldHotspot.lua
index 7aee8537b..efa8dccd3 100644
--- a/scripts/gui/CustomFieldHotspot.lua
+++ b/scripts/gui/CustomFieldHotspot.lua
@@ -1,4 +1,5 @@
--- Custom field hotspot that can be clicked for deleting of the field course.
+---@class CustomFieldHotspot
CustomFieldHotspot = {}
CustomFieldHotspot.CATEGORY = 200
CustomFieldHotspot.SLICE_ID = "gui.ingameMap_other"
diff --git a/scripts/gui/pages/CpCourseGeneratorFrame.lua b/scripts/gui/pages/CpCourseGeneratorFrame.lua
index c76814fad..44dde24d5 100644
--- a/scripts/gui/pages/CpCourseGeneratorFrame.lua
+++ b/scripts/gui/pages/CpCourseGeneratorFrame.lua
@@ -2,7 +2,8 @@
This frame is a page for all global settings in the in game menu.
All the layout, gui elements are cloned from the general settings page of the in game menu.
]]--
-
+---@class CpCourseGeneratorFrame
+---@field drawFieldBorderPolygon Polygon
CpCourseGeneratorFrame = {
CATEGRORIES = {
IN_GAME_MAP = 1,
@@ -39,17 +40,21 @@ CpCourseGeneratorFrame = {
GENERATE_COURSE = 5,
DELETE_CUSTOM_FIELD = 6,
RENAME_CUSTOM_FIELD = 7,
- EDIT_CUSTOM_FIELD = 8
+ EDIT_CUSTOM_FIELD = 8,
+ DRAW_CUSTOM_FIELD = 9,
+ HOTSPOT_SELECT_ALL = 10
},
AI_MODE_OVERVIEW = 1,
AI_MODE_CREATE = 2,
AI_MODE_WORKER_LIST = 3,
+ AI_MODE_DRAW_CUSTOM_FIELD = 4,
MAP_SELECTOR_HOTSPOT = 1,
MAP_SELECTOR_CREATE_JOB = 2,
MAP_SELECTOR_ACTIVE_JOBS = 3,
+ MAP_SELECTOR_CUSTOM_FIELDS = 4,
CP_MAP_HOTSPOT_OFFSET = 200,
- BASE_XML_KEY = "CourseGenerator"
-
+ BASE_XML_KEY = "CourseGenerator",
+ DRAW_DELAY = 1
-- POSITION_UVS = GuiUtils.getUVs({
-- 760,
-- 4,
@@ -110,10 +115,15 @@ function CpCourseGeneratorFrame.new(target, custom_mt)
self.mapSelectorTexts = {
g_i18n:getText("ui_mapOverviewHotspots"),
g_i18n:getText("button_createJob"),
- g_i18n:getText("ui_activeAIJobs")}
+ g_i18n:getText("ui_activeAIJobs"),
+ g_i18n:getText("CP_customFieldManager_fieldList")}
--- Bitmask for the visible cp hotspots.
self.cpHotspotSettingValue = 1
+ --- Draws the current progress, while creating a custom field.
+ self.customFieldPlot = FieldPlot(true)
+ self.drawFieldBorderPolygon = Polygon()
+ self.drawDelay = 0
return self
end
@@ -162,16 +172,6 @@ function CpCourseGeneratorFrame:initialize(menu)
self.onClickBackCallback = menu.clickBackCallback
self:initializeContextActions()
- self.generateCourseMenuButton = {
- ["inputAction"] = InputAction.MENU_EXTRA_1,
- ["text"] = g_i18n:getText("button_blocklist"),
- ["callback"] = function()
- -- upvalues: (copy) p_u_39
- p_u_39:onButtonUnBan()
- end
- }
-
-
self.booleanPrefab:unlinkElement()
FocusManager:removeElement(self.booleanPrefab)
self.multiTextPrefab:unlinkElement()
@@ -356,6 +356,7 @@ function CpCourseGeneratorFrame:onFrameOpen()
if self.currentHotspot and self.currentHotspot:isa(CustomFieldHotspot) then
self:setMapSelectionItem(self.currentHotspot)
end
+ self.customFieldList:reloadData()
self.infoTextList:reloadData()
end, self)
-- g_messageCenter:subscribe(MessageType.AI_TASK_SKIPPED, self.onAITaskSkipped, self)
@@ -400,6 +401,7 @@ function CpCourseGeneratorFrame:onFrameOpen()
end
self.activeWorkerList:reloadData()
self.filterList:reloadData()
+ self.customFieldList:reloadData()
if g_Courseplay.globalSettings.infoTextHudActive:getValue() > 0 then
self.infoTextList:reloadData()
self.infoTextHud:setVisible(true)
@@ -415,6 +417,8 @@ function CpCourseGeneratorFrame:onFrameOpen()
self:setJobMenuVisible(false)
self.startJobPending = false
self.ingameMap:onOpen()
+ self.customFieldStatusMessage:setVisible(false)
+ self.statusMessage:setVisible(true)
self:updateSubCategoryPages(self.CATEGRORIES.IN_GAME_MAP)
@@ -489,6 +493,11 @@ function CpCourseGeneratorFrame:onFrameClose()
end
function CpCourseGeneratorFrame:onClickBack(force)
+ if self.mode == self.AI_MODE_DRAW_CUSTOM_FIELD then
+ self.drawFieldBorderPolygon:_reset()
+ self:onClickDrawCustomField()
+ return false
+ end
if self.startJobPending and not force then
return false
end
@@ -663,35 +672,32 @@ function CpCourseGeneratorFrame:onDrawPostIngameMap(element, ingameMap)
self.currentJob:draw(ingameMap, self.mode == self.MODE_OVERVIEW)
end
- --- Draws the current progress, while creating a custom field.
- -- if pageAI.mode == CpInGameMenuAIFrameExtended.MODE_DRAW_FIELD_BORDER and next(CpInGameMenuAIFrameExtended.curDrawPositions) then
- -- local localX, localY = pageAI.ingameMap:getLocalPosition(g_inputBinding.mousePosXLast, g_inputBinding.mousePosYLast)
- -- local worldX, worldZ = pageAI.ingameMap:localToWorldPos(localX, localY)
-
- -- if #CpInGameMenuAIFrameExtended.curDrawPositions > 0 then
- -- local pos = CpInGameMenuAIFrameExtended.curDrawPositions[#CpInGameMenuAIFrameExtended.curDrawPositions]
- -- local dx, dz, length = CpMathUtil.getPointDirection( pos, {x = worldX, z = worldZ})
- -- if Input.isKeyPressed(Input.KEY_lshift) then
- -- if math.abs(dx) > math.abs(dz) then
- -- dz = 0
- -- dx = math.sign(dx)
- -- else
- -- dx = 0
- -- dz = math.sign(dz)
- -- end
- -- worldX = pos.x + dx * length
- -- worldZ = pos.z + dz * length
- -- end
- -- pageAI.customFieldPlot:setNextTargetPoint(worldX, worldZ)
- -- else
- -- pageAI.customFieldPlot:setNextTargetPoint()
- -- end
-
-
- -- pageAI.customFieldPlot:setWaypoints(CpInGameMenuAIFrameExtended.curDrawPositions)
- -- pageAI.customFieldPlot:draw(self,true)
- -- pageAI.customFieldPlot:setVisible(true)
- -- end
+ -- Draws the current progress, while creating a custom field.
+ if self.mode == self.AI_MODE_DRAW_CUSTOM_FIELD and #self.drawFieldBorderPolygon > 0 then
+ local localX, localY = self.ingameMap:getLocalPosition(g_inputBinding.mousePosXLast, g_inputBinding.mousePosYLast)
+ local worldX, worldZ = self.ingameMap:localToWorldPos(localX, localY)
+ if Input.isKeyPressed(Input.KEY_lshift) then
+ ---@type Vector
+ local curVector = Vector(worldX, -worldZ)
+ ---@type Vertex
+ local lastVertex = self.drawFieldBorderPolygon[#self.drawFieldBorderPolygon]
+ ---@type Vector
+ local dirVec = (curVector - lastVertex)
+ local length = dirVec:length()
+ dirVec = dirVec:norm()
+ if math.abs(dirVec.x) > math.abs(dirVec.y) then
+ dirVec:set(math.sign(dirVec.x), 0)
+ else
+ dirVec:set(0, math.sign(dirVec.y))
+ end
+ lastVertex = lastVertex + (dirVec * length)
+ worldX = lastVertex.x
+ worldZ = -lastVertex.y
+ end
+ self.customFieldPlot:setNextTargetPoint(worldX, worldZ)
+ self.customFieldPlot:draw(ingameMap, true)
+ self.customFieldPlot:setVisible(true)
+ end
end
@@ -705,6 +711,9 @@ function CpCourseGeneratorFrame:onClickMap(element ,worldX, worldZ)
self:executePickingCallback(true, angle)
return
end
+ if self.mode == self.AI_MODE_DRAW_CUSTOM_FIELD then
+ return
+ end
self:setMapSelectionItem(nil)
end
@@ -718,16 +727,20 @@ function CpCourseGeneratorFrame:onClickHotspot(element, hotspot)
self:executePickingCallback(true, math.atan2(hotspot.worldX - self.pickingRotationOrigin[0], hotspot.worldZ - self.pickingRotationOrigin[1]))
return
end
+ if self.mode == self.AI_MODE_DRAW_CUSTOM_FIELD then
+ return
+ end
self:setMapSelectionItem(hotspot)
end
-function CpCourseGeneratorFrame:showMapHotspot(self, hotspot)
+function CpCourseGeneratorFrame:showMapHotspot(hotspot)
self:onClickHotspot(nil, hotspot)
self.ingameMap:panToHotspot(hotspot)
end
function CpCourseGeneratorFrame:onClickMapOverviewSelector(state)
self.filterListContainer:setVisible(false)
+ self.customFieldListContainer:setVisible(false)
self.createJobContainer:setVisible(false)
self.workerListContainer:setVisible(false)
for i = 1, #self.mapSelectorTexts do
@@ -738,10 +751,12 @@ function CpCourseGeneratorFrame:onClickMapOverviewSelector(state)
self.filterListContainer:setVisible(true)
elseif state == self.MAP_SELECTOR_CREATE_JOB then
self.createJobContainer:setVisible(true)
- -- self.subCategoryDotBox:invalidateLayout()
elseif state == self.MAP_SELECTOR_ACTIVE_JOBS then
self.workerListContainer:setVisible(true)
+ elseif state == self.MAP_SELECTOR_CUSTOM_FIELDS then
+ self.customFieldListContainer:setVisible(true)
end
+ self:updateContextActions()
end
function CpCourseGeneratorFrame:onClickDeselectAll()
@@ -762,6 +777,22 @@ function CpCourseGeneratorFrame:onClickDeselectAll()
self.filterList:reloadData()
end
+function CpCourseGeneratorFrame:onClickDrawCustomField()
+ if self.mode == self.AI_MODE_DRAW_CUSTOM_FIELD then
+ g_customFieldManager:addFieldFromPolygon(self.drawFieldBorderPolygon)
+ self.mapOverviewSelector:setDisabled(false)
+ self.customFieldStatusMessage:setVisible(false)
+ self.statusMessage:setVisible(true)
+ self.mode = self.AI_MODE_OVERVIEW
+ return
+ end
+ self.drawFieldBorderPolygon:_reset()
+ self.mapOverviewSelector:setDisabled(true)
+ self.customFieldStatusMessage:setVisible(true)
+ self.statusMessage:setVisible(false)
+ self.mode = self.AI_MODE_DRAW_CUSTOM_FIELD
+end
+
function CpCourseGeneratorFrame:onJobTypeChanged(index)
local jobTypeIndex = self.currentJobTypes[index]
self:setActiveJobTypeSelection(jobTypeIndex)
@@ -1088,10 +1119,13 @@ function CpCourseGeneratorFrame:getNumberOfItemsInSection(list, section)
if list == self.filterList then
return #self.hotspotFilterCategories[section]
end
+ if list == self.customFieldList then
+ return g_customFieldManager:getNumFields()
+ end
if list == self.contextButtonList then
self.contextActionMapping = {}
for index, action in pairs(self.contextActions) do
- if action.isActive then
+ if action.isActive and not action.actionOnly then
table.insert(self.contextActionMapping, index)
end
end
@@ -1103,10 +1137,11 @@ function CpCourseGeneratorFrame:getNumberOfItemsInSection(list, section)
if list == self.contextButtonCustomFieldList then
self.contextActionMapping = {}
for index, action in pairs(self.contextActions) do
- if action.isActive then
+ if action.isActive and not action.actionOnly then
table.insert(self.contextActionMapping, index)
end
end
+
return #self.contextActionMapping
end
if list == self.activeWorkerList then
@@ -1154,6 +1189,12 @@ function CpCourseGeneratorFrame:populateCellForItemInSection(list, section, inde
g_inGameMenu.pageMapOverview.assignItemColors(self,
cell:getAttribute("iconBg"), status.color,
cell:getAttribute("colorTemplate"))
+ elseif list == self.customFieldList then
+ cell:getAttribute("icon"):setVisible(false)
+ local field = g_customFieldManager:getFieldByIndex(index)
+ if field then
+ cell:getAttribute("name"):setText(field:getName())
+ end
elseif list == self.contextButtonList then
local buttonInfo = self.contextActions[self.contextActionMapping[index]]
cell:getAttribute("text"):setText(buttonInfo.text)
@@ -1210,6 +1251,11 @@ function CpCourseGeneratorFrame:onClickList(list, section, index, listElement)
self.hotspotStateFilter[section][index] = not self.hotspotStateFilter[section][index]
self.ingameMapBase:restoreDefaultFilter()
self:saveHotspotFilter()
+ elseif list == self.customFieldList then
+ local field = g_customFieldManager:getFieldByIndex(index)
+ if field then
+ self:showMapHotspot(field:getHotspot())
+ end
elseif list == self.activeWorkerList then
local job = g_currentMission.aiSystem:getJobById(self.playerFarmActiveJobs[index])
if job ~= nil and not job.vehicleParameter then
@@ -1268,6 +1314,22 @@ function CpCourseGeneratorFrame:mouseEvent(posX, posY, isDown, isUp, button, eve
local worldX, worldZ = self.ingameMap:localToWorldPos(localX, localY)
self.aiTargetMapHotspot:setWorldPosition(worldX, worldZ)
end
+ if self.mode == self.AI_MODE_DRAW_CUSTOM_FIELD then
+ if button == Input.MOUSE_BUTTON_RIGHT then
+ if isUp and g_updateLoopIndex > self.drawDelay then
+ local localX, localY = self.ingameMap:getLocalPosition(posX, posY)
+ local worldX, worldZ = self.ingameMap:localToWorldPos(localX, localY)
+ if #self.drawFieldBorderPolygon > 0 then
+ local point = self.customFieldPlot:getNextTargetPoint()
+ self.drawFieldBorderPolygon:append(Vertex(point.x, -point.z))
+ else
+ self.drawFieldBorderPolygon:append(Vertex(worldX, -worldZ))
+ end
+ self.customFieldPlot:setWaypointsFromPolygon(self.drawFieldBorderPolygon)
+ self.drawDelay = g_updateLoopIndex + self.DRAW_DELAY
+ end
+ end
+ end
return CpCourseGeneratorFrame:superClass().mouseEvent(self, posX, posY, isDown, isUp, button, eventUsed)
end
@@ -1414,6 +1476,22 @@ function CpCourseGeneratorFrame:initializeContextActions()
end
end,
isActive = false
+ },
+ [self.CONTEXT_ACTIONS.DRAW_CUSTOM_FIELD] = {
+ callback = function()
+ self:onClickDrawCustomField()
+ end,
+ action = InputAction.MENU_MAP_ACTION_1,
+ isActive = false,
+ actionOnly = true
+ },
+ [self.CONTEXT_ACTIONS.HOTSPOT_SELECT_ALL] = {
+ callback = function()
+ self:onClickDeselectAll()
+ end,
+ action = InputAction.MENU_MAP_ACTION_1,
+ isActive = false,
+ actionOnly = true
}
}
end
@@ -1437,11 +1515,18 @@ function CpCourseGeneratorFrame:updateContextActions()
self.contextActions[self.CONTEXT_ACTIONS.DELETE_CUSTOM_FIELD].isActive = self.currentHotspot and self.currentHotspot:isa(CustomFieldHotspot)
self.contextActions[self.CONTEXT_ACTIONS.RENAME_CUSTOM_FIELD].isActive = self.currentHotspot and self.currentHotspot:isa(CustomFieldHotspot)
self.contextActions[self.CONTEXT_ACTIONS.EDIT_CUSTOM_FIELD].isActive = self.currentHotspot and self.currentHotspot:isa(CustomFieldHotspot)
+ self.contextActions[self.CONTEXT_ACTIONS.DRAW_CUSTOM_FIELD].isActive = self.mapOverviewSelector:getState() == self.MAP_SELECTOR_CUSTOM_FIELDS
+ self.contextActions[self.CONTEXT_ACTIONS.HOTSPOT_SELECT_ALL].isActive = self.mapOverviewSelector:getState() == self.MAP_SELECTOR_HOTSPOT
for _, action in ipairs(self.contextActions) do
if action.action then
g_inputBinding:removeActionEventsByActionName(action.action)
end
end
+ for _, action in ipairs(self.contextActions) do
+ if action.action and action.isActive and action.actionOnly then
+ g_inputBinding:registerActionEvent(action.action, self, action.callback, false, true, false, true)
+ end
+ end
self.contextButtonList:reloadData()
self.contextButtonCustomFieldList:reloadData()
self.createJobButtonList:reloadData()
diff --git a/scripts/gui/plots/CoursePlot.lua b/scripts/gui/plots/CoursePlot.lua
index e111fae50..4ffd56645 100644
--- a/scripts/gui/plots/CoursePlot.lua
+++ b/scripts/gui/plots/CoursePlot.lua
@@ -64,6 +64,14 @@ function CoursePlot:setDrawingArrows(draw)
self.drawArrows = draw
end
+---@param polygon Polygon
+function CoursePlot:setWaypointsFromPolygon(polygon)
+ self.waypoints = {}
+ for _, v in polygon:vertices() do
+ table.insert(self.waypoints, Waypoint.initFromGeneratedWp(v))
+ end
+end
+
function CoursePlot:setWaypoints( waypoints )
self.waypoints = {}
-- remove waypoints from long straight lines, the plot only needs start/end. Too many waypoints
diff --git a/scripts/gui/plots/FieldPlot.lua b/scripts/gui/plots/FieldPlot.lua
index 665d17df0..1e93a52a8 100644
--- a/scripts/gui/plots/FieldPlot.lua
+++ b/scripts/gui/plots/FieldPlot.lua
@@ -49,6 +49,10 @@ function FieldPlot:setNextTargetPoint(x, z)
self.nextTargetPoint = {x = x, z = z}
end
+function FieldPlot:getNextTargetPoint()
+ return self.nextTargetPoint
+end
+
--- Draws custom fields.
---@param map table
function FieldPlot:draw(map)
diff --git a/translations/translation_br.xml b/translations/translation_br.xml
index 5977b81d3..da6686686 100644
--- a/translations/translation_br.xml
+++ b/translations/translation_br.xml
@@ -513,6 +513,7 @@ A rota é salva automaticamente ao fechar o editor e substituir a rota seleciona
+
@@ -778,12 +779,14 @@ No Menu AI, você verá sua borda de campo gravada.
Ao clicar no nome, você terá a opção de excluí-lo ou renomeá-lo.
"/>
+
@@ -775,11 +776,14 @@ D: 此设置告诉当卸载机接近筒仓时,工人在筒仓或选定的停
-
+
@@ -767,11 +768,14 @@ D: This setting tells the worker to wait in the silo or at a selected parking po
-
+
@@ -768,11 +769,14 @@ Když se podíváte na nabídku AI, uvidíte hranici zaznamenaného pole.
Kliknutím na Název získáte možnost jej buď smazat, nebo přejmenovat.
"/>
+
@@ -770,11 +771,14 @@ Den optegnede mark i AI hjælper menu.
Hvis du klikker på navnet til marken, for du nu mulighed for at omdøbe den eller slette den.
"/>
+
@@ -772,11 +773,14 @@ Im Helfermenü kannst du deinen Randkurs mit Namen sehen.
Wenn du auf den Namen klickst, kannst du den Kurs löschen, umbenennen, oder mit dem Editor bearbeiten.
"/>
+
@@ -775,12 +776,14 @@ Los bordes de los campos personalizados se mostrarán en el menú de IA.
Al hacer clic en el nombre, tendrá la opción de eliminarlo, cambiarle el nombre o editarlo con el editor.
"/>
+
@@ -780,12 +781,14 @@ The custom field borders will be displayed in the AI menu.
By clicking on the name you will get the option to either delete, rename or edit it with the editor.
"/>
+
@@ -775,12 +776,14 @@ Los bordes de los campos personalizados se mostrarán en el menú de IA.
Al hacer clic en el nombre, tendrá la opción de eliminarlo, cambiarle el nombre o editarlo con el editor.
"/>
+
@@ -771,12 +772,14 @@ The custom field borders will be displayed in the AI menu.
By clicking on the name you will get the option to either delete or rename it.
"/>
+
@@ -771,12 +772,14 @@ The custom field borders will be displayed in the AI menu.
By clicking on the name you will get the option to either delete or rename it.
"/>
+
@@ -762,11 +763,14 @@ Les contours du champ personnalisé apparaissent dans l'onglet des ouvriers.
Cliquez sur son nom pour le supprimer ou le renommer.
"/>
+
@@ -771,11 +772,14 @@ Ha megnézed az AI menüt, látni fogod a rögzített mezőszegélyt.
A névre kattintva lehetősége van törölni vagy átnevezni.
"/>
+
@@ -780,12 +781,14 @@ The custom field borders will be displayed in the AI menu.
By clicking on the name you will get the option to either delete, rename or edit it with the editor.
"/>
+
@@ -780,12 +781,14 @@ Dando un'occhiata al menu IA, vedrai il bordo del tuo campo registrato.
Facendo clic sul Nome, avrai la possibilità di eliminarlo o rinominarlo.
"/>
+
@@ -771,11 +772,14 @@ AIメニューを見ると、レコードしたフィールドの境界線が表
名前をクリックすると、削除するか、名前を変更するかのオプションが表示されます。
"/>
+
@@ -812,13 +813,14 @@ D: 하역 차량이 사일로에 접근할 때, 작업자가 사일로 내부에
이름을 클릭하면 해당 필드를 삭제하거나 이름을 변경할 수 있는 옵션이 나타납니다.
"/>
+
@@ -771,11 +772,14 @@ Having a look on the AI Menu, you will see your recorded field border.
By clicking on the Name, you will get the option to either delete it or rename it.
"/>
+
@@ -771,12 +772,14 @@ The custom field borders will be displayed in the AI menu.
By clicking on the name you will get the option to either delete or rename it.
"/>
+
@@ -761,10 +762,14 @@ Gdy gotowe, wciśnij przycisk ponownie a zostaniesz zapytany czy zapisać to pol
Klikając na NAZWĘ, dostaniesz opcję usunięcia go lub zmiany nazwy.
"/>
+
@@ -766,11 +767,14 @@ Dando uma olhada no Menu AI, você verá sua borda de campo gravada.
Ao clicar no nome, você terá a opção de excluí-lo ou renomeá-lo.
"/>
+
@@ -771,12 +772,14 @@ The custom field borders will be displayed in the AI menu.
By clicking on the name you will get the option to either delete or rename it.
"/>
+
@@ -774,11 +775,14 @@ D: Эта настройка говорит работнику ждать в с
Нажав на имя, вы получите возможность либо удалить его или переименовать.
"/>
+
@@ -769,11 +770,14 @@ När du är klar trycker du på knappen igen och du kommer att bli ombedd om du
Med en titt på AI-menyn kommer du att se din inspelade fältgräns.
Genom att klicka på namnet får du möjlighet att antingen radera det eller byt namn på det."/>
+
@@ -780,12 +781,14 @@ Başlangıç ve bitiş noktalarının üst üste binmemesi gerektiğini unutmay
İsmine tıkladığınızda silme, yeniden adlandırma veya düzenleyici ile düzenleme seçenekleri çıkacaktır.
"/>
+
@@ -778,11 +779,14 @@ D: Цей параметр вказує працівнику де чекати
Натиснувши на ім’я, ви отримаєте можливість видалити його або перейменувати.
"/>
+
@@ -780,12 +781,14 @@ The custom field borders will be displayed in the AI menu.
By clicking on the name you will get the option to either delete, rename or edit it with the editor.
"/>