diff --git a/Moose Development/Moose/Core/Point.lua b/Moose Development/Moose/Core/Point.lua index 1f5b26f39..3206696d5 100644 --- a/Moose Development/Moose/Core/Point.lua +++ b/Moose Development/Moose/Core/Point.lua @@ -90,6 +90,18 @@ do -- COORDINATE -- * @{#COORDINATE.IlluminationBomb}(): To illuminate the point. -- -- + -- ## Markings + -- + -- Place markers (text boxes with clarifications for briefings, target locations or any other reference point) on the map for all players, coalitions or specific groups: + -- + -- * @{#COORDINATE.MarkToAll}(): Place a mark to all players. + -- * @{#COORDINATE.MarkToCoalition}(): Place a mark to a coalition. + -- * @{#COORDINATE.MarkToCoalitionRed}(): Place a mark to the red coalition. + -- * @{#COORDINATE.MarkToCoalitionBlue}(): Place a mark to the blue coalition. + -- * @{#COORDINATE.MarkToGroup}(): Place a mark to a group (needs to have a client in it or a CA group (CA group is bugged)). + -- * @{#COORDINATE.RemoveMark}(): Removes a mark from the map. + -- + -- -- ## 3D calculation methods -- -- Various calculation methods exist to use or manipulate 3D space. Find below a short description of each method: @@ -289,9 +301,55 @@ do -- COORDINATE end + --- Set the heading of the coordinate, if applicable. + -- @param #COORDINATE self function COORDINATE:SetHeading( Heading ) self.Heading = Heading end + + + --- Get the heading of the coordinate, if applicable. + -- @param #COORDINATE self + -- @return #number or nil + function COORDINATE:GetHeading() + return self.Heading + end + + + --- Set the velocity of the COORDINATE. + -- @param #COORDINATE self + -- @param #string Velocity Velocity in meters per second. + function COORDINATE:SetVelocity( Velocity ) + self.Velocity = Velocity + end + + + --- Return the velocity of the COORDINATE. + -- @param #COORDINATE self + -- @return #number Velocity in meters per second. + function COORDINATE:GetVelocity() + local Velocity = self.Velocity + return Velocity or 0 + end + + + --- Return velocity text of the COORDINATE. + -- @param #COORDINATE self + -- @return #string + function COORDINATE:GetMovingText( Settings ) + + local MovingText = "" + + local Velocity = self:GetVelocity() + + if Velocity == 0 then + MovingText = MovingText .. "stationary " + else + MovingText = MovingText .. "moving at " .. self:GetVelocityText( Settings ) .. " " .. self:GetHeadingText( Settings ) + end + + return MovingText + end --- Return a direction vector Vec3 from COORDINATE to the COORDINATE. @@ -347,6 +405,7 @@ do -- COORDINATE return ( ( TargetVec3.x - SourceVec3.x ) ^ 2 + ( TargetVec3.z - SourceVec3.z ) ^ 2 ) ^ 0.5 end + --- Return the 3D distance in meters between the target COORDINATE and the COORDINATE. -- @param #COORDINATE self -- @param #COORDINATE TargetCoordinate The target COORDINATE. @@ -413,6 +472,39 @@ do -- COORDINATE end + + --- Return the velocity text of the COORDINATE. + -- @param #COORDINATE self + -- @return #string Velocity text. + function COORDINATE:GetVelocityText( Settings ) + local Velocity = self:GetVelocity() + local Settings = Settings or _SETTINGS + if Velocity then + if Settings:IsMetric() then + return UTILS.MpsToKmph( Velocity ) .. " km/h" + else + return UTILS.MpsToKmph( Velocity ) / 1.852 .. " mph" + end + else + return "" + end + end + + + --- Return the heading text of the COORDINATE. + -- @param #COORDINATE self + -- @return #string Heading text. + function COORDINATE:GetHeadingText( Settings ) + local Heading = self.Heading + local Settings = Settings or _SETTINGS + if Heading then + return Heading .. "°" + else + return "" + end + end + + --- Provides a Bearing / Range string -- @param #COORDINATE self -- @param #number AngleRadians The angle in randians @@ -650,6 +742,88 @@ do -- COORDINATE self:F2( Azimuth ) self:Flare( FLARECOLOR.Red, Azimuth ) end + + do -- Markings + + --- Mark to All + -- @param #COORDINATE self + -- @param #string MarkText Free format text that shows the marking clarification. + -- @return #number The resulting Mark ID which is a number. + -- @usage + -- local TargetCoord = TargetGroup:GetCoordinate() + -- local MarkID = TargetCoord:MarkToAll( "This is a target for all players" ) + function COORDINATE:MarkToAll( MarkText ) + local MarkID = UTILS.GetMarkID() + trigger.action.markToAll( MarkID, MarkText, self:GetVec3() ) + return MarkID + end + + --- Mark to Coalition + -- @param #COORDINATE self + -- @param #string MarkText Free format text that shows the marking clarification. + -- @param Coalition + -- @return #number The resulting Mark ID which is a number. + -- @usage + -- local TargetCoord = TargetGroup:GetCoordinate() + -- local MarkID = TargetCoord:MarkToCoalition( "This is a target for the red coalition", coalition.side.RED ) + function COORDINATE:MarkToCoalition( MarkText, Coalition ) + local MarkID = UTILS.GetMarkID() + trigger.action.markToCoalition( MarkID, MarkText, self:GetVec3(), Coalition ) + return MarkID + end + + --- Mark to Red Coalition + -- @param #COORDINATE self + -- @param #string MarkText Free format text that shows the marking clarification. + -- @return #number The resulting Mark ID which is a number. + -- @usage + -- local TargetCoord = TargetGroup:GetCoordinate() + -- local MarkID = TargetCoord:MarkToCoalitionRed( "This is a target for the red coalition" ) + function COORDINATE:MarkToCoalitionRed( MarkText ) + return self:MarkToCoalition( MarkText, coalition.side.RED ) + end + + --- Mark to Blue Coalition + -- @param #COORDINATE self + -- @param #string MarkText Free format text that shows the marking clarification. + -- @return #number The resulting Mark ID which is a number. + -- @usage + -- local TargetCoord = TargetGroup:GetCoordinate() + -- local MarkID = TargetCoord:MarkToCoalitionBlue( "This is a target for the blue coalition" ) + function COORDINATE:MarkToCoalitionBlue( MarkText ) + return self:MarkToCoalition( MarkText, coalition.side.BLUE ) + end + + --- Mark to Group + -- @param #COORDINATE self + -- @param #string MarkText Free format text that shows the marking clarification. + -- @param Wrapper.Group#GROUP MarkGroup The @{Group} that receives the mark. + -- @return #number The resulting Mark ID which is a number. + -- @usage + -- local TargetCoord = TargetGroup:GetCoordinate() + -- local MarkGroup = GROUP:FindByName( "AttackGroup" ) + -- local MarkID = TargetCoord:MarkToGroup( "This is a target for the attack group", AttackGroup ) + function COORDINATE:MarkToGroup( MarkText, MarkGroup ) + local MarkID = UTILS.GetMarkID() + trigger.action.markToGroup( MarkID, MarkText, self:GetVec3(), MarkGroup:GetID() ) + return MarkID + end + + --- Remove a mark + -- @param #COORDINATE self + -- @param #number MarkID The ID of the mark to be removed. + -- @usage + -- local TargetCoord = TargetGroup:GetCoordinate() + -- local MarkGroup = GROUP:FindByName( "AttackGroup" ) + -- local MarkID = TargetCoord:MarkToGroup( "This is a target for the attack group", AttackGroup ) + -- <<< logic >>> + -- RemoveMark( MarkID ) -- The mark is now removed + function COORDINATE:RemoveMark( MarkID ) + trigger.action.removeMark( MarkID ) + end + + end -- Markings + --- Returns if a Coordinate has Line of Sight (LOS) with the ToCoordinate. -- @param #COORDINATE self diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index f89224259..8ccb7611f 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -1788,16 +1788,18 @@ end function SET_UNIT:CalculateThreatLevelA2G() local MaxThreatLevelA2G = 0 + local MaxThreatText = "" for UnitName, UnitData in pairs( self:GetSet() ) do local ThreatUnit = UnitData -- Wrapper.Unit#UNIT - local ThreatLevelA2G = ThreatUnit:GetThreatLevel() + local ThreatLevelA2G, ThreatText = ThreatUnit:GetThreatLevel() if ThreatLevelA2G > MaxThreatLevelA2G then MaxThreatLevelA2G = ThreatLevelA2G + MaxThreatText = ThreatText end end - self:T3( MaxThreatLevelA2G ) - return MaxThreatLevelA2G + self:F( { MaxThreatLevelA2G = MaxThreatLevelA2G, MaxThreatText = MaxThreatText } ) + return MaxThreatLevelA2G, MaxThreatText end diff --git a/Moose Development/Moose/Functional/Detection.lua b/Moose Development/Moose/Functional/Detection.lua index 916b10f85..729be5f40 100644 --- a/Moose Development/Moose/Functional/Detection.lua +++ b/Moose Development/Moose/Functional/Detection.lua @@ -1644,7 +1644,7 @@ do -- DETECTION_BASE DetectedItem.Coordinate = Coordinate DetectedItem.Coordinate:SetHeading( DetectedItemUnit:GetHeading() ) DetectedItem.Coordinate.y = DetectedItemUnit:GetAltitude() - DetectedItem.Coordinate.Speed = DetectedItemUnit:GetVelocityMPS() + DetectedItem.Coordinate:SetVelocity( DetectedItemUnit:GetVelocityMPS() ) end end end @@ -1675,7 +1675,7 @@ do -- DETECTION_BASE local DetectedSet = DetectedItem.Set if DetectedItem then - DetectedItem.ThreatLevel = DetectedSet:CalculateThreatLevelA2G() + DetectedItem.ThreatLevel, DetectedItem.ThreatText = DetectedSet:CalculateThreatLevelA2G() end end @@ -1691,10 +1691,10 @@ do -- DETECTION_BASE local DetectedItem = self:GetDetectedItem( Index ) if DetectedItem then - return DetectedItem.ThreatLevel or 0 + return DetectedItem.ThreatLevel or 0, DetectedItem.ThreatText or "" end - return nil + return nil, "" end @@ -2423,9 +2423,9 @@ do -- DETECTION_AREAS -- @param #DETECTION_BASE.DetectedItem DetectedItem function DETECTION_AREAS:CalculateIntercept( DetectedItem ) - local DetectedSpeed = DetectedItem.Coordinate.Speed - local DetectedHeading = DetectedItem.Coordinate.Heading local DetectedCoord = DetectedItem.Coordinate + local DetectedSpeed = DetectedCoord:GetVelocity() + local DetectedHeading = DetectedCoord:GetHeading() if self.Intercept then local DetectedSet = DetectedItem.Set diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 942a36065..7000f09ac 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -870,13 +870,11 @@ function TASK:MenuMarkToGroup( TaskGroup ) local Coordinate = self:GetInfo( "Coordinates" ) -- Core.Point#COORDINATE local Briefing = self:GetTaskBriefing() - local GroupID = TaskGroup:GetID() - local Vec3 = Coordinate:GetVec3() - self:F( { Coordinate = Vec3, Briefing = Briefing, GroupID = GroupID } ) + self:F( { Briefing = Briefing, Coordinate = Coordinate } ) - trigger.action.markToGroup( 1, Briefing, Vec3, GroupID ) - --trigger.action.markToAll( 1, Briefing, Vec3 ) + Coordinate:MarkToGroup( Briefing, TaskGroup ) + --Coordinate:MarkToAll( Briefing ) end --- Report the task status. diff --git a/Moose Development/Moose/Tasking/Task_A2G.lua b/Moose Development/Moose/Tasking/Task_A2G.lua index 9760326c4..84322d342 100644 --- a/Moose Development/Moose/Tasking/Task_A2G.lua +++ b/Moose Development/Moose/Tasking/Task_A2G.lua @@ -323,13 +323,18 @@ do -- TASK_A2G_SEAD Mission:AddTask( self ) - self:SetBriefing( - TaskBriefing or - "Execute a Suppression of Enemy Air Defenses.\n" - ) - self:UpdateTaskInfo() + local ThreatLevel, ThreatText = TargetSetUnit:CalculateThreatLevelA2G() + local TargetUnit = TargetSetUnit:GetFirst() + local TargetCoord = TargetUnit:GetCoordinate() -- Core.Point#COORDINATE + + self:SetBriefing( + TaskBriefing or + "Execute a Suppression of Enemy Air Defenses. " .. + ThreatText .. " targets to be expected. Target is " .. TargetCoord:GetMovingText() .. "." + ) + return self end @@ -466,12 +471,17 @@ do -- TASK_A2G_BAI Mission:AddTask( self ) + self:UpdateTaskInfo() + + local ThreatLevel, ThreatText = TargetSetUnit:CalculateThreatLevelA2G() + local TargetUnit = TargetSetUnit:GetFirst() + local TargetCoord = TargetUnit:GetCoordinate() -- Core.Point#COORDINATE + self:SetBriefing( TaskBriefing or - "Execute a Battlefield Air Interdiction of a group of enemy targets.\n" + "Execute a Battlefield Air Interdiction of a group of enemy targets. " .. + ThreatText .. " targets to be expected. Target is " .. TargetCoord:GetMovingText() .. "." ) - - self:UpdateTaskInfo() return self end @@ -610,13 +620,20 @@ do -- TASK_A2G_CAS Mission:AddTask( self ) + self:UpdateTaskInfo() + + local ThreatLevel, ThreatText = TargetSetUnit:CalculateThreatLevelA2G() + local TargetUnit = TargetSetUnit:GetFirst() + local TargetCoord = TargetUnit:GetCoordinate() -- Core.Point#COORDINATE + self:SetBriefing( TaskBriefing or - "Execute a Close Air Support for a group of enemy targets.\n" .. - "Beware of friendlies at the vicinity!\n" + "Execute a Close Air Support for a group of enemy targets. " .. + "Beware of friendlies at the vicinity! " .. + ThreatText .. " targets to be expected. Target is " .. TargetCoord:GetMovingText() .. "." + ) - self:UpdateTaskInfo() return self end @@ -626,7 +643,9 @@ do -- TASK_A2G_CAS local TargetCoordinate = self.Detection and self.Detection:GetDetectedItemCoordinate( self.DetectedItemIndex ) or self.TargetSetUnit:GetFirst():GetCoordinate() self:SetInfo( "Coordinates", TargetCoordinate, 0 ) - self:SetInfo( "Threat", "[" .. string.rep( "■", self.Detection and self.Detection:GetDetectedItemThreatLevel( self.DetectedItemIndex ) or self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 ) + local ThreatLevel = self.Detection and self.Detection:GetDetectedItemThreatLevel( self.DetectedItemIndex ) or self.TargetSetUnit:CalculateThreatLevelA2G() + + self:SetInfo( "Threat", "[" .. string.rep( "■", ThreatLevel ) .. "]", 11 ) if self.Detection then local DetectedItemsCount = self.TargetSetUnit:Count() diff --git a/Moose Development/Moose/Utilities/Utils.lua b/Moose Development/Moose/Utilities/Utils.lua index dc292d942..475d228ac 100644 --- a/Moose Development/Moose/Utilities/Utils.lua +++ b/Moose Development/Moose/Utilities/Utils.lua @@ -31,7 +31,9 @@ FLARECOLOR = trigger.flareColor -- #FLARECOLOR --- Utilities static class. -- @type UTILS -UTILS = {} +UTILS = { + _MarkID = 1 +} --- Function to infer instance of an object -- @@ -395,3 +397,11 @@ function UTILS.spairs( t, order ) end end end + +-- get a new mark ID for markings +function UTILS.GetMarkID() + + UTILS._MarkID = UTILS._MarkID + 1 + return UTILS._MarkID + +end diff --git a/Moose Development/Moose/Wrapper/Positionable.lua b/Moose Development/Moose/Wrapper/Positionable.lua index 1005dde1b..8c6816917 100644 --- a/Moose Development/Moose/Wrapper/Positionable.lua +++ b/Moose Development/Moose/Wrapper/Positionable.lua @@ -166,6 +166,7 @@ function POSITIONABLE:GetCoordinate() local PositionableCoordinate = COORDINATE:NewFromVec3( PositionableVec3 ) PositionableCoordinate:SetHeading( self:GetHeading() ) + PositionableCoordinate:SetVelocity( self:GetVelocityMPS() ) self:T2( PositionableCoordinate ) return PositionableCoordinate diff --git a/docs/Documentation/AI_A2A.html b/docs/Documentation/AI_A2A.html index f8b56c8f1..80b5691bd 100644 --- a/docs/Documentation/AI_A2A.html +++ b/docs/Documentation/AI_A2A.html @@ -662,6 +662,7 @@
+ #number AI_A2A.IdleCount diff --git a/docs/Documentation/Cargo.html b/docs/Documentation/Cargo.html index decbb908e..e1ae98516 100644 --- a/docs/Documentation/Cargo.html +++ b/docs/Documentation/Cargo.html @@ -3543,6 +3543,7 @@ The range till cargo will board.

+ #number CARGO_UNIT.RunCount diff --git a/docs/Documentation/Designate.html b/docs/Documentation/Designate.html index 8ecc57ea8..acd9d1911 100644 --- a/docs/Documentation/Designate.html +++ b/docs/Documentation/Designate.html @@ -1097,7 +1097,7 @@ function below will use the range 1-7 just in case

- #number + DESIGNATE.LaseDuration @@ -1151,7 +1151,10 @@ function below will use the range 1-7 just in case

+<<<<<<< HEAD +======= +>>>>>>> master DESIGNATE.LaserCodes diff --git a/docs/Documentation/Detection.html b/docs/Documentation/Detection.html index aeb5bd4fe..4c6dc041c 100644 --- a/docs/Documentation/Detection.html +++ b/docs/Documentation/Detection.html @@ -2466,6 +2466,7 @@ The index of the DetectedItem.

+ #number DETECTION_BASE.DetectedItemCount @@ -2479,6 +2480,7 @@ The index of the DetectedItem.

+ #number DETECTION_BASE.DetectedItemMax diff --git a/docs/Documentation/Point.html b/docs/Documentation/Point.html index 057eb3003..0126c087e 100644 --- a/docs/Documentation/Point.html +++ b/docs/Documentation/Point.html @@ -316,6 +316,30 @@ COORDINATE:IsLOS(ToCoordinate)

Returns if a Coordinate has Line of Sight (LOS) with the ToCoordinate.

+ + + + COORDINATE:MarkToAll(MarkText) + +

Mark to All

+ + + + COORDINATE:MarkToCoalition(MarkText, Coalition) + +

Mark to Coalition

+ + + + COORDINATE:MarkToCoalitionBlue(MarkText) + +

Mark to Blue Coalition

+ + + + COORDINATE:MarkToCoalitionRed(MarkText) + +

Mark to Red Coalition

@@ -334,6 +358,12 @@ COORDINATE:NewFromVec3(Vec3)

Create a new COORDINATE object from Vec3 coordinates.

+ + + + COORDINATE:RemoveMark(MarkID) + +

Remove a mark

@@ -863,6 +893,20 @@ +

Markings

+ +

Place markers (text boxes with clarifications for briefings, target locations or any other reference point) on the map for all players, coalitions or specific groups:

+ + + +

3D calculation methods

Various calculation methods exist to use or manipulate 3D space. Find below a short description of each method:

@@ -1701,6 +1745,135 @@ true If the ToCoordinate has LOS with the Coordinate, otherwise false.

+ +COORDINATE:MarkToAll(MarkText) + +
+
+ +

Mark to All

+ +

Parameter

+
    +
  • + +

    #string MarkText : +Free format text that shows the marking clarification.

    + +
  • +
+

Return value

+ +

#number: +The resulting Mark ID which is a number.

+ +

Usage:

+
  local TargetCoord = TargetGroup:GetCoordinate()
+  local MarkID = TargetCoord:MarkToAll( "This is a target for all players" )
+ +
+
+
+
+ + +COORDINATE:MarkToCoalition(MarkText, Coalition) + +
+
+ +

Mark to Coalition

+ +

Parameters

+
    +
  • + +

    #string MarkText : +Free format text that shows the marking clarification.

    + +
  • +
  • + +

    Coalition :

    + +
  • +
+

Return value

+ +

#number: +The resulting Mark ID which is a number.

+ +

Usage:

+
  local TargetCoord = TargetGroup:GetCoordinate()
+  local MarkID = TargetCoord:MarkToCoalition( "This is a target for the red coalition", coalition.side.RED )
+ +
+
+
+
+ + +COORDINATE:MarkToCoalitionBlue(MarkText) + +
+
+ +

Mark to Blue Coalition

+ +

Parameter

+
    +
  • + +

    #string MarkText : +Free format text that shows the marking clarification.

    + +
  • +
+

Return value

+ +

#number: +The resulting Mark ID which is a number.

+ +

Usage:

+
  local TargetCoord = TargetGroup:GetCoordinate()
+  local MarkID = TargetCoord:MarkToCoalitionBlue( "This is a target for the blue coalition" )
+ +
+
+
+
+ + +COORDINATE:MarkToCoalitionRed(MarkText) + +
+
+ +

Mark to Red Coalition

+ +

Parameter

+
    +
  • + +

    #string MarkText : +Free format text that shows the marking clarification.

    + +
  • +
+

Return value

+ +

#number: +The resulting Mark ID which is a number.

+ +

Usage:

+
  local TargetCoord = TargetGroup:GetCoordinate()
+  local MarkID = TargetCoord:MarkToCoalitionRed( "This is a target for the red coalition" )
+ +
+
+
+
+ COORDINATE:New(x, y, z) @@ -1795,6 +1968,35 @@ The Vec3 point.

#COORDINATE:

+ +
+
+
+ + +COORDINATE:RemoveMark(MarkID) + +
+
+ +

Remove a mark

+ +

Parameter

+
    +
  • + +

    #number MarkID : +The ID of the mark to be removed.

    + +
  • +
+

Usage:

+
  local TargetCoord = TargetGroup:GetCoordinate()
+  local MarkGroup = GROUP:FindByName( "AttackGroup" )
+  local MarkID = TargetCoord:MarkToGroup( "This is a target for the attack group", AttackGroup )
+  <<< logic >>>
+  RemoveMark( MarkID ) -- The mark is now removed
+
@@ -2937,7 +3139,6 @@ The y coordinate.

- POINT_VEC2.z diff --git a/docs/Documentation/Spawn.html b/docs/Documentation/Spawn.html index 845fa5248..7608c3d05 100644 --- a/docs/Documentation/Spawn.html +++ b/docs/Documentation/Spawn.html @@ -823,6 +823,12 @@ and any spaces before and after the resulting name are removed.

SPAWN:_TranslateRotate(SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle) + + + + SPAWN.uncontrolled + + @@ -2195,9 +2201,6 @@ The group that was spawned. You can use this group for further actions.

- -

Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning.

-
@@ -2736,6 +2739,9 @@ when nothing was spawned.

+ +

Overwrite unit names by default with group name.

+
@@ -3737,6 +3743,20 @@ True = Continue Scheduler

+ +
+
+
+ + + +SPAWN.uncontrolled + +
+
+ + +
diff --git a/docs/Documentation/SpawnStatic.html b/docs/Documentation/SpawnStatic.html index 487563b09..251693d35 100644 --- a/docs/Documentation/SpawnStatic.html +++ b/docs/Documentation/SpawnStatic.html @@ -437,6 +437,7 @@ ptional) The name of the new static.

+ #number SPAWNSTATIC.SpawnIndex diff --git a/docs/Documentation/Utils.html b/docs/Documentation/Utils.html index 802122f5e..c83693215 100644 --- a/docs/Documentation/Utils.html +++ b/docs/Documentation/Utils.html @@ -237,6 +237,12 @@ which are excellent tools to be reused in an OO environment!.

UTILS.FeetToMeters(feet) + + + + UTILS.GetMarkID() + + @@ -333,6 +339,12 @@ use negative idp for rounding ahead of decimal place, positive for rounding afte UTILS.ToRadian(angle) + + + + UTILS._MarkID + + @@ -638,6 +650,22 @@ use negative idp for rounding ahead of decimal place, positive for rounding afte
+ +UTILS.GetMarkID() + +
+
+ + + + +

get a new mark ID for markings

+ +
+
+
+
+ UTILS.IsInstanceOf(object, className) @@ -944,6 +972,20 @@ use negative idp for rounding ahead of decimal place, positive for rounding afte + +
+
+
+ + #number + +UTILS._MarkID + +
+
+ + +