diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index 8cfad8cd2..a95504bb1 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -456,7 +456,7 @@ do -- Zones and Pathlines -- Add zone. self:AddZone(ZoneName, Zone) - elseif objectData.lineMode and objectData.lineMode=="segments" and objectData.points and #objectData.points>=2 then + elseif objectData.lineMode and (objectData.lineMode=="segments" or objectData.lineMode=="segment" or objectData.lineMode=="free") and objectData.points and #objectData.points>=2 then -- Name of the zone. local Name=objectData.name or "Unknown Line Drawing" diff --git a/Moose Development/Moose/Core/Pathline.lua b/Moose Development/Moose/Core/Pathline.lua index 058933107..5364bc505 100644 --- a/Moose Development/Moose/Core/Pathline.lua +++ b/Moose Development/Moose/Core/Pathline.lua @@ -42,6 +42,15 @@ PATHLINE = { points = {}, } +--- Point of line. +-- @type PATHLINE.Point +-- @field DCS#Vec3 vec3 3D position. +-- @field DCS#Vec2 vec2 2D position. +-- @field #number surfaceType Surface type. +-- @field #number landHeight Land height in meters. +-- @field #number depth Water depth in meters. +-- @field #number markerID Marker ID. + --- PATHLINE class version. -- @field #string version @@ -118,43 +127,192 @@ function PATHLINE:FindByName(Name) return pathline end ---- Add a 2D point to the path. The third dimension is determined from the land height. + + +--- Add a point to the path from a given 2D position. The third dimension is determined from the land height. -- @param #PATHLINE self -- @param DCS#Vec2 Vec2 The 2D vector (x,y) to add. -- @return #PATHLINE self function PATHLINE:AddPointFromVec2(Vec2) if Vec2 then - - local Vec3={x=Vec2.x, y=land.getHeight(Vec2), z=Vec2.y} - self:AddPointFromVec3(Vec3) + local point=self:_CreatePoint(Vec2) + + table.insert(self.points, point) end return self end ---- Add a 3D point to the path. +--- Add a point to the path from a given 3D position. -- @param #PATHLINE self --- @param DCS#Vec3 Vec3 The §D vector (x,y) to add. +-- @param DCS#Vec3 Vec3 The 3D vector (x,y) to add. -- @return #PATHLINE self function PATHLINE:AddPointFromVec3(Vec3) if Vec3 then + + local point=self:_CreatePoint(Vec3) - table.insert(self.points, Vec3) + table.insert(self.points, point) end return self end +--- Get name of pathline. +-- @param #PATHLINE self +-- @return #string Name of the pathline. +function PATHLINE:GetName() + return self.name +end + +--- Get number of points. +-- @param #PATHLINE self +-- @return #number Number of points. +function PATHLINE:GetNumberOfPoints() + local N=#self.points + return N +end + +--- Get points of pathline. Not that points are tables, that contain more information as just the 2D or 3D position but also the surface type etc. +-- @param #PATHLINE self +-- @return <#PATHLINE.Point> List of points. +function PATHLINE:GetPoints() + return self.points +end + --- Get 3D points of pathline. -- @param #PATHLINE self -- @return List of DCS#Vec3 points. -function PATHLINE:GetPoints3D() - return self.points +function PATHLINE:GetPoints3D() + + local vecs={} + + for _,_point in pairs(self.points) do + local point=_point --#PATHLINE.Point + table.insert(vecs, point.vec3) + end + + return vecs +end + +--- Get 2D points of pathline. +-- @param #PATHLINE self +-- @return List of DCS#Vec2 points. +function PATHLINE:GetPoints2D() + + local vecs={} + + for _,_point in pairs(self.points) do + local point=_point --#PATHLINE.Point + table.insert(vecs, point.vec2) + end + + return vecs +end + +--- Get COORDINATES of pathline. Note that COORDINATE objects are created when calling this function. That does involve deep copy calls and can have an impact on performance if done too often. +-- @param #PATHLINE self +-- @return List of COORDINATES points. +function PATHLINE:GetCoordinats() + + local vecs={} + + for _,_point in pairs(self.points) do + local point=_point --#PATHLINE.Point + local coord=COORDINATE:NewFromVec3(point.vec3) + end + + return vecs +end + +--- Get the n-th point. +-- @param #PATHLINE self +-- @param #number n The n-th point. +-- @return #number Number of points. +function PATHLINE:GetPoint3D(n) + + local N=self:GetNumberOfPoints() + + local vec3=nil + if n and n>=1 and n<=N then + + vec3=self.point[n] + else + self:E(self.lid..string.format("ERROR: No point in pathline for N=%s", tostring(n))) + end + + return vec3 +end + + + + +--- Mark points on F10 map. +-- @param #PATHLINE self +-- @param #boolean Switch If `true` or nil, set marks. If `false`, remove marks. +-- @return List of DCS#Vec3 points. +function PATHLINE:MarkPoints(Switch) + for i,_point in pairs(self.points) do + local point=_point --#PATHLINE.Point + if Switch==false then + + if point.markerID then + UTILS.RemoveMark(point.markerID, Delay) + end + + else + + if point.markerID then + UTILS.RemoveMark(point.markerID) + end + + point.markerID=UTILS.GetMarkID() + + local text=string.format("Pathline %s: Point #%d\nSurface Type=%d\nHeight=%.1f m\nDepth=%.1f m", self.name, i, point.surfaceType, point.landHeight, point.depth) + + trigger.action.markToAll(point.markerID, text, point.vec3, "") + + end + end +end + + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- Private functions +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +--- Get 3D points of pathline. +-- @param #PATHLINE self +-- @param DCS#Vec3 Vec Position vector. Can also be a DCS#Vec2 in which case the altitude at landheight is taken. +-- @return #PATHLINE.Point +function PATHLINE:_CreatePoint(Vec) + + local point={} --#PATHLINE.Point + + if Vec.z then + -- Given vec is 3D + point.vec3=UTILS.DeepCopy(Vec) + point.vec2={x=Vec.x, y=Vec.z} + else + -- Given vec is 2D + point.vec2=UTILS.DeepCopy(Vec) + point.vec3={x=Vec.x, y=land.getHeight(Vec), z=Vec.y} + end + + -- Get surface type. + point.surfaceType=land.getSurfaceType(point.vec2) + + -- Get land height and depth. + point.landHeight, point.depth=land.getSurfaceHeightWithSeabed(point.vec2) + + point.markerID=nil + + return point end diff --git a/Moose Development/Moose/DCS.lua b/Moose Development/Moose/DCS.lua index 4db719cdb..602d9a608 100644 --- a/Moose Development/Moose/DCS.lua +++ b/Moose Development/Moose/DCS.lua @@ -193,21 +193,29 @@ do -- land --- [Type of surface enumerator](https://wiki.hoggitworld.com/view/DCS_singleton_land) -- @type land.SurfaceType - -- @field LAND - -- @field SHALLOW_WATER - -- @field WATER - -- @field ROAD - -- @field RUNWAY + -- @field LAND Land=1 + -- @field SHALLOW_WATER Shallow water=2 + -- @field WATER Water=3 + -- @field ROAD Road=4 + -- @field RUNWAY Runway=5 - --- Returns altitude MSL of the point. + --- Returns the distance from sea level (y-axis) of a given vec2 point. -- @function [parent=#land] getHeight - -- @param #Vec2 point point on the ground. - -- @return #Distance + -- @param #Vec2 point Point on the ground. + -- @return #number Height in meters. + + --- Returns the surface height and depth of a point. Useful for checking if the path is deep enough to support a given ship. + -- Both values are positive. When checked over water at sea level the first value is always zero. + -- When checked over water at altitude, for example the reservoir of the Inguri Dam, the first value is the corresponding altitude the water level is at. + -- @function [parent=#land] getSurfaceHeightWithSeabed + -- @param #Vec2 point Position where to check. + -- @return #number Height in meters. + -- @return #number Depth in meters. - --- returns surface type at the given point. + --- Returns surface type at the given point. -- @function [parent=#land] getSurfaceType -- @param #Vec2 point Point on the land. - -- @return #land.SurfaceType + -- @return #number Enumerator value from `land.SurfaceType` (LAND=1, SHALLOW_WATER=2, WATER=3, ROAD=4, RUNWAY=5) --- [DCS Singleton land](https://wiki.hoggitworld.com/view/DCS_singleton_land) land = {} --#land