Overhead Crane is the space markup element that graphically defines an overhead crane. You can use Material Handling Library block MoveByCrane to simulate how the overhead crane transports agents (material items) between two points of simulated environment.
To model complicated processes with additional operations between the seizing of the crane, its movement, and release, you can use the SeizeCrane block to seize the crane and ReleaseCrane block to release it.
The Overhead Crane element may include multiple simple markup elements Bridge. By specifying a Number of bridges in the properties of the overhead crane, you can create a multibridge crane. By default, the bridges move in automatic mode according to the specified priorities of the carried agents (material items) and conflict resolution rules. If necessary, you can switch to a manual mode and define the exact movement program for each bridge, using the corresponding API. This way you can exercise full control over the loading, transporting, and unloading of the agents (material items) while taking into account the specifics of the crane's working area.
Demo model: Crane System With Multiple Bridges Open the model page in AnyLogic Cloud. There you can run the model or download it (by clicking Model source files).Crane has three different modes of operation depending on how its components — bridge, trolley, and hook — move in relation to each other.
The maximum height an agent (material item) can reach when raised by overhead crane equals the height of the crane itself.
The rails of the overhead crane can serve as an obstacle on the way of pedestrians and transporters moving in free space navigation mode, but they can still move between the rails.
Overhead crane element provides users with a set of actions, which are used to define additional agent behavior.
To draw an overhead crane
- Drag the Overhead Crane element from the Material Handling section of the Space Markup palette into the graphical editor. You will see the shape of the crane’s guiding rails and the bridge between them.
- Overhead crane can pick up and drop off material items directly from or to a path, a conveyor, and a railway track. In this case you should connect the crane to the corresponding space markup element by placing it close enough so that the crane shape is highlighted in green (it means the connection has been established).
- After crane has been successfully connected, the crane shape will change color as displayed in the image below.
- You can adjust the width of the crane and the length of its runway, change the width of the bridge and the position of the bridge and the trolley.
- To customize the crane’s appearance, select the type of crane in Properties view: either Gantry crane or Bridge crane. You can change the Trolley Color and the Crane color in the Properties view for both types.
To draw a multibridge crane
- Draw an overhead crane.
- In the crane's properties specify the Number of bridges that you need.
- Drag the handle on the edge of the leftmost bridge to set the same width for all bridges at once.
- To access the settings of a particular bridge, select this bridge by clicking on it.
Automatic mode means that the bridge moves to the agent that has seized it in the SeizeCrane block or MoveByCrane block with enabled Seize option, then transports the agent in MoveByCrane block, and returns to the parking position. All these actions are executed according to the settings specified in the properties of the blocks, without using the moveTo() or moveByProgram() functions of the bridge.
The agent that seizes the bridge has a priority that is specified in the Agent selection pattern property of the SeizeCrane block or MoveByCrane block with enabled Seize option.
- If FIFO option is selected, then the priority depends on the agent's position in the crane's queue: the higher it is in the queue, the higher is its priority.
- If Custom option is selected, the priority depends on the value returned after calculating the expression specified in the Custom pattern property: the higher the value, the higher the priority.
- If the model has multiple SeizeCrane and MoveByCrane blocks that work with the same crane, then the agents that come from the FIFO queue has higher priority, because this priority is calculated internally by the library.
When the bridge begins moving to the agent that has seized it, it "inherits" the agent's priority and uses it to resolve possible collisions with other bridges that move to their own agents. The bridge that has already picked up the agent and is transporting it to the specified destination, retains the agent's priority and uses it to resolve collisions with other bridges that are transporting their own agents.
Collisions in automatic mode are resolved using the bridges' own priorities. A bridge with a higher priority can move another bridge with a lower priority beyond its destination point if that bridge has not yet finished movement. The bridge with a low priority cannot enter the area of possible collision with a bridge that has higher priority. Instead it waits until that bridge moves away from the area. This can happen when bridges move towards each other.
The movement of one bridge by another bridge to resolve a collision depends on a complex system of priorities. The lower the bridge's priority, the more possible it is that another bridge will force it to move in order to finish its own movement. The priorities are grouped based on the state of the bridge and inside each group you also need to take into account the priorities of the agents (material items) that seized the bridges.
Below you can find the groups organized in order from the highest priority to the lowest:
-
Bridges in automatic mode that stopped:
- at the destination point defined in the Destination is property of the SeizeCrane block, or MoveByCrane block, or at the agent if seizing of the bridge takes place in the MoveByCrane block with enabled Seize option. The trolley and the hook may be still moving.
- at the destination point defined in the Destination is property of the MoveByCrane block. Here the bridge waits for the agent that has seized it, while the agent is moving through other blocks that don't control the crane, e.g. the Process Modeling Library blocks.
- due to failure modeled by the call of fail() function.
-
Bridges in manual mode that move due to the call of moveTo() function or moveByProgram() function.
The user bears full responsibility for the crane's movement program, therefore any conflicts between bridges that move in manual mode will cause an error. -
Bridges in automatic mode that transfer the agents (material items). To resolve collisions between such bridges, AnyLogic uses the priorities of the agents that were used to seize the bridges. If the priorities weren't specified, the bridge that started its movement first has the highest priority.
-
Bridges in automatic mode that move to pick up the agents (material items). To resolve collisions between such bridges, AnyLogic uses the priorities of the agents that were used to seize the bridges. If the priorities weren't specified, the bridge that started its movement first has the highest priority.
-
Bridges in automatic mode that move to their parking positions. During the collision resolution the bridge that started its movement first has the highest priority.
-
Bridges in automatic mode without tasks:
- staying at their parking positions
- staying where they are after release in the ReleaseCrane block or the MoveByCrane block with enabled Release option.
- released by the agent due to the call of remove(agent), while the bridge was moving to the agent in the SeizeCrane block.
- due to the call of remove(agent) function while the agent is in the MoveByCrane block.
- General
-
Name — The name of the overhead crane. The name is used to identify and access the overhead crane from code and Material Handling Library blocks.
Ignore — If selected, the overhead crane is excluded from the model.
Visible on upper agent — If selected, the overhead crane is also visible on the upper agent where this agent lives.
Lock — If selected, the overhead crane’s shape is locked. Locked shapes do not react to mouse clicks - it is impossible to select them in the graphical editor until you unlock them. It is frequently needed when you want to prevent editing this shape while drawing other shapes over it.
Visible — Here you specify whether the shape is visible on animation at model runtime, or not. Using the control, choose yes or no.
Material item type — The type of the material item that is transported by this overhead crane.
Is obstacle — If selected, the rails of this overhead crane will be considered an obstacle for pedestrians and transporters moving in free space mode.
Components movement mode — Here you can choose how the crane’s jib, trolley, and hook should move in relation to each other. The options are:
- Step-by-step — the components will move one at a time. This mode satisfies the safety conditions of operating a crane.
- Concurrent — the movement of all components will be executed at the same time. This mode is considerably faster than Step-by-step mode, but not as safe.
- Independent hoist — the movement of the bridge and the trolley is executed at the same time, either before or after the movement of the hoist.
Bridge speed — Here you can specify the crane’s bridge speed. The property is dynamic, therefore you can set up the speed change on runtime depending on whether the crane is loaded or not. Using the local variable isLoaded of boolean type, you can, for example, set up the speed change with the conditional operator: isLoaded ? agent.mySpeed : 1. When the crane is unloaded, the agent variable is null. The default value: 0.5 meters per second.
Trolley speed — Here you can define the crane’s trolley speed. The property is dynamic, therefore you can set up the speed change on runtime depending on whether the crane is loaded or not. Using the local variable isLoaded of boolean type, you can, for example, set up the speed change with the conditional operator: isLoaded ? agent.mySpeed : 1. When the crane is unloaded, the agent variable is null. The default value: 0.3 meters per second.
Hoist speed — Here you can define the speed of the crane’s hoist (lifting / lowering speed). The property is dynamic, therefore you can set up the speed change on runtime depending on whether the crane is loaded or not. Using the local variable isLoaded of boolean type, you can, for example, set up the speed change with the conditional operator: isLoaded ? agent.mySpeed : 1. When the crane is unloaded, the agent variable is null. The default value: 0.1 meters per second.
Set acceleration/deceleration — If selected, this option allows you to specify the acceleration and deceleration for the overhead crane’s bridge and trolley.
Bridge acceleration — [Visible if Set acceleration/deceleration is selected] Here you can define the acceleration of the crane’s bridge. If you set this parameter to 0, the bridge will instantly accelerate to its speed. The property is dynamic, therefore you can set up the acceleration change on runtime depending on whether the crane is loaded or not. Using the local variable isLoaded of boolean type, you can, for example, set up the speed change with the conditional operator: isLoaded ? agent.myAcceleration : 1. When the crane is unloaded, the agent variable is null. The default value: 0.3 meters per second2.
Bridge deceleration — [Visible if Set acceleration/deceleration is selected] Here you can define the crane’s bridge deceleration. If you set this parameter to 0, the bridge will instantly slow down to complete halt. The property is dynamic, therefore you can set up the deceleration change on runtime depending on whether the crane is loaded or not. Using the local variable isLoaded of boolean type, you can, for example, set up the speed change with the conditional operator: isLoaded ? agent.myDeceleration : 1. When the crane is unloaded, the agent variable is null. The default value: 0.3 meters per second2.
Trolley acceleration — [Visible if Set acceleration/deceleration is selected] Here you can define the acceleration of the trolley. If you set this parameter to 0, the trolley will instantly accelerate to its speed. The property is dynamic, therefore you can set up the acceleration change on runtime depending on whether the crane is loaded or not. Using the local variable isLoaded of boolean type, you can, for example, set up the speed change with the conditional operator: isLoaded ? agent.myAcceleration : 1. When the crane is unloaded, the agent variable is null. The default value: 0.3 meters per second2.
Trolley deceleration — [Visible if Set acceleration/deceleration is selected] Here you can define the crane’s trolley deceleration. If you set this parameter to 0, the trolley will instantly slow down to complete halt. The property is dynamic, therefore you can set up the deceleration change on runtime depending on whether the crane is loaded or not. Using the local variable isLoaded of boolean type, you can, for example, set up the speed change with the conditional operator: isLoaded ? agent.myDeceleration : 1. When the crane is unloaded, the agent variable is null. The default value: 0.3 meters per second2.
- Actions
-
In all the actions, the current material item is accessible as the local variable agent.
On failed — Here you can type Java code that will be executed in case of overhead crane failure.
On repaired — Here you can type Java code that will be executed when the overhead crane is repaired.
On loading — Here you can type Java code that will be executed directly after the overhead crane takes hold of the material item.
On unloading — Here you can type Java code that will be executed directly after the overhead crane releases the material item.
On target reached - Here you can type Java code that will be executed when all components of the crane, including the hook, reach the target specified in the Destination is property of the SeizeCrane block or MoveByCrane block.
On bridge movement finished - Here you can type Java code that will be executed when the bridge finishes its movement having reached the target specified in the Destination is property of the SeizeCrane block or MoveByCrane block.
On bridge state changed - Here you can type Java code that will be executed when the bridge's state changes.
On seize - Here you can type Java code that will be executed directly after the agent (material item) seizes the crane or a bridge.
On release - Here you can type Java code that will be executed directly after the agent (material item) releases the crane or a bridge.
- Maintenance, failures, breaks
-
Downtime block(s) — Select any number of the Downtime blocks (that exist on the diagram) that will cause this markup element to enter the downtime state.
The behavior of the element when the Downtime block affects it is identical to the fail() function call for this element, meaning the element stops working and stops executing new tasks, unless a task has a sufficient priority to override the downtime tasks. Even if the element has acceleration or deceleration settings, it still stops immediately when it enters downtime.
During a transition to downtime, the element, which has multiple states, moves from the current state to one of the following states: MAINTENANCE, FAILED, CUSTOM_DOWNTIME depending on the type of downtime specified in the Type property of the Downtime block. If the moving resource is automatically moved to the service point after the trigger is activated, it is already in one of the three states.
The crane transporter tasks can have an individual priority, which affects the queuing of the downtime task:- If a material item transported by the crane has a higher priority than the downtime tasks, it will be transported before downtime starts. If there are multiple such items, the downtime won’t start until all of them are transported.
- If the downtime task has a higher priority but cannot preempt other tasks (the May preempt other tasks option of the Downtime block is not selected), the crane will first finish its current task and then proceed to the downtime according to its priority.
- Downtime tasks with a higher priority and the May preempt other tasks option checked in the Downtime block will interrupt the crane’s current transport task.
If the After release, hook returns to initial position if no other task option is used, a downtime task of any priority will interrupt the return to home position command.
A bridge of a multi-bridge crane that is in the downtime state also cannot be moved by other bridges or by the moveTo() command. If new agents, according to their priority policies, cannot seize a crane that is in the downtime state, they wait for it to come out of the downtime state in the logical queue. - Appearance
-
Type — Here you can choose the type of crane: either either Gantry crane or Bridge crane.
You only change the visual appearance of your crane: your choice doesn’t affect the logic of its operation.Girder type — The type of the bridge depending on the number of girders: either a Double or a Single.
Trolley color — The fill color of the overhead crane’s trolley. Choose No color, if you do not want the area to be filled.
Crane color — The color of the overhead crane’s shape. Choose No color, if you do not want the area to be filled.
- Position and size
-
Level — Level to which this element belongs.
X — X-coordinate of the point where the overhead crane is located.
Y — Y-coordinate of the point where the overhead crane is located.
Z — Z-coordinate of the point where the overhead crane is located.
Runway length — Here you can specify the crane’s runway length.
Crane width — Here you can specify the width of the overhead crane itself, i.e. the distance between the crane’s guiding rails.
Crane height — [Visible if Gantry crane option is selected in the Type parameter] Here you can specify the height of the crane’s legs. It is calculated from the crane’s Z.
Bridge width — Here you can specify the width of the overhead crane’s bridge.
Bridge safety gap - Here you can specify the distance that bridges must observe between each other.
- Advanced
-
Show in — Here you can choose whether you want the overhead crane to be shown both in 2D and 3D animation, or in 2D only, or in 3D only
Show name — If selected, the overhead crane’s name is displayed on the graphical diagram.
To adjust the width of the crane and the length of the crane’s runway
- Drag the corner of the crane’s shape to specify the width of the crane and the length of its runway.
To adjust the width of the bridge
- Drag the handle at the edge of the crane’s bridge to change the width of the bridge.
To adjust the position of the bridge and the trolley
- Drag the handle on the trolley shape to adjust the position of the bridge and the trolley.
- If you want to adjust only the position of the bridge and preserve the position of the trolley, hold the Shift key pressed while dragging the handle.
You can dynamically modify the overhead crane’s properties at model runtime using the following API.
- Working state
-
Function Description boolean isReady() Returns true if the overhead crane is ready to operate, otherwise returns false. boolean isFailed() Returns true if the overhead crane failed (broke down) and is not operating, otherwise returns false. boolean isLoaded() Returns true, if the overhead crane is currently loaded with a material item. Otherwise, this function returns false. void fail() If called for a single bridge crane, it initiates the crane's failure. The crane stops working. If called for multi-bridge crane, an error will occur, since this function should be called for a specific bridge. void repair() If called for a single bridge crane, repairs the crane. The crane becomes available again. If called for a multi-bridge crane, an error will occur, since this function should be called for a specific bridge. - Utilization statistics
-
Function Description double getUtilization() Returns the overhead crane utilization: the fraction of the time the crane was busy. The returned crane utilization value lies in the range [0..1]. void resetStats() Resets the overhead crane utilization statistics. int numberOfAgentsHandled() A total number of agents handled by all bridges of the crane. - Bridges
-
Function Description OverheadCraneBridge getBridge(int index) Returns the bridge with the specified index. The leftmost bridge on the animation has index 0.
index - the index of the bridgeList<OverheadCraneBridge> getBridges() Returns a list of all bridges of this crane. int getNumberOfBridges() Returns the total number of all bridges of this crane. - Agents
-
Function Description List<Agent> getAgents() Returns a list of all agents that have seized the crane or a bridge. They can either be waiting for a bridge to come to them or already be transported by a bridge. List<Agent> getAgentsInQueue() Returns a list of all agents that are currently waiting in the queue to this crane. - Level
-
Function Description Level getLevel() Returns the level where this overhead crane is located. - Obstacle
-
Function Description boolean isObstacle() Returns true if this overhead crane is considered an obstacle by pedestrians and transporters moving in free space mode. Otherwise, returns false. void setObstacle(boolean isObstacle) Sets this overhead crane as an obstacle for pedestrians and transporters moving in free space mode.
isObstacle — if true, the crane is set as an obstacle. Otherwise, not. - Movement
-
Function Description boolean isAccelerationEnabled() Returns true, if the option to set acceleration or deceleration for for this overhead crane’s components is enabled. Otherwise, returns false. void setAccelerationEnabled() Enables the option to set acceleration or deceleration for the components of this overhead crane.
value — if true, the option will be enabled. If false, the option will be disabled.OverheadCraneMovementMode getMovementMode() Returns the mode for the movement of the crane’s bridge, trolley, and hook in relation to each other.
Valid values:
OVERHEAD_CRANE_MOVEMENT_STEP_BY_STEP
OVERHEAD_CRANE_MOVEMENT_CONCURRENT
OVERHEAD_CRANE_MOVEMENT_INDEPENDENT_HOISTvoid setMovementMode(OverheadCraneMovementMode movementMode) Sets the mode for the movement of crane’s trolley, jib, and hook in relation to each other.
movementMode — components movement mode.
Valid values:
OVERHEAD_CRANE_MOVEMENT_STEP_BY_STEP
OVERHEAD_CRANE_MOVEMENT_CONCURRENT
OVERHEAD_CRANE_MOVEMENT_INDEPENDENT_HOISTdouble trolleySpeed(Agent agent, boolean isLoaded, SpeedUnits units) Returns the speed of the overhead crane’s trolley, as set in the crane’s properties, in the specified speed units. This value does not correspond to the actual trolley speed if the carried agent is currently in the MoveByCrane block which has the Use operation time option enabled.
agent — an agent that’s being transferred by the crane.
isLoaded — if true, the function returns the trolley speed for the loaded crane, otherwise - for the unloaded crane (if you have specified different values in the Trolley speed property).
units — a constant defining the speed units.double hoistSpeed(Agent agent, boolean isLoaded, SpeedUnits units) Returns the speed of the hoisting winch operation, as set in the crane’s properties, in the specified speed units. This value does not correspond to the actual hoist speed if the carried agent is currently in the MoveByCrane block which has the Use operation time option enabled.
agent — an agent that’s being transferred by the crane.
isLoaded — if true, the function returns the hoist speed for the loaded crane, otherwise - for the unloaded crane (if you have specified different values in the Hoist speed property).
units — a constant defining the speed units.double bridgeSpeed(Agent agent, boolean isLoaded, SpeedUnits units) Returns the speed of the overhead crane’s bridge, as set in the crane’s properties, in the specified speed units. This value does not correspond to the actual bridge speed if the carried agent is currently in the MoveByCrane block which has the Use operation time option enabled.
agent — an agent that’s being transferred by the crane.
isLoaded — if true, the function returns the bridge speed for the loaded crane, otherwise - for the unloaded crane (if you have specified different values in the Bridge speed property).
units — a constant defining the speed units.Point getCurrentHookPosition() Returns current hook position in the crane’s coordinate system (in pixels). Position getAbsoluteHookPosition() Returns the current hook position relative to the origin of coordinates of the agent, where the crane is located. The position is returned in pixels. double bridgeAcceleration(Agent agent, boolean isLoaded, AccelerationUnits units) Returns the acceleration value for the crane’s bridge, as set in the crane’s properties, in specified acceleration units.
agent — an agent that’s being transferred by the crane.
isLoaded — if true, the function returns the bridge acceleration for the loaded crane, otherwise - for the unloaded crane (if you have specified different values in the Bridge acceleration property).
units — a constant defining the acceleration units.double bridgeDeceleration(Agent agent, boolean isLoaded, AccelerationUnits units) Returns the deceleration value for the crane’s bridge, as set in the crane’s properties, in specified acceleration units.
agent — an agent that’s being transferred by the crane.
isLoaded — if true, the function returns the bridge deceleration for the loaded crane, otherwise - for the unloaded crane (if you have specified different values in the Bridge deceleration property).
units — a constant defining the acceleration units.double trolleyAcceleration(Agent agent, boolean isLoaded, AccelerationUnits units) Returns the acceleration value for the crane’s trolley, as set in the crane’s properties, in specified acceleration units.
agent — an agent that’s being transferred by the crane.
isLoaded — if true, the function returns the trolley acceleration for the loaded crane, otherwise - for the unloaded crane (if you have specified different values in the Trolley acceleration property).
units — a constant defining the acceleration units.double trolleyDeceleration(Agent agent, boolean isLoaded, AccelerationUnits units) Returns the deceleration value for the crane’s trolley, as set in the crane’s properties, in specified acceleration units.
agent — an agent that’s being transferred by the crane.
isLoaded — if true, the function returns the trolley deceleration for the loaded crane, otherwise - for the unloaded crane (if you have specified different values in the Trolley deceleration property).
units — a constant defining the acceleration units. - Dimensions and components
-
Function Description double getCraneHeight() Returns the overhead crane’s height in pixels. double getCraneHeight(LengthUnits units) Returns the height of the overhead crane legs (if gantry type is selected) in specified units.
units — a constant defining the length units.void setCraneHeight(double craneHeight, LengthUnits units) Sets the height of the overhead crane legs (if gantry type is selected) in specified units.
craneHeight — a new height value.
units — a constant defining the length units.double getCraneWidth() Returns the crane’s width in pixels. double getCraneWidth(LengthUnits units) Returns the crane’s width in specified units.
units — a constant defining the length units.void setCraneWidth(double craneWidth, LengthUnits units) Sets the crane’s width in specified units.
craneWidth — a new crane width value.
units — a constant defining the length units.double getBridgeWidth() Returns the width of the crane’s bridge in pixels. double getBridgeWidth(LengthUnits units) Returns the width of the crane’s bridge in specified units.
units — a constant defining the length units.void setBridgeWidth(double bridgeWidth, LengthUnits units) Sets the width of the crane’s bridge.
bridgeWidth — a new bridge width value.
units — a constant defining the length units.double getRunwayLength() Returns the length of the crane’s runway in pixels. double getRunwayLength(LengthUnits units) Returns the length of the crane’s runway in specified units.
units — a constant defining the length units.void setRunwayLength(double runwayLength, LengthUnits units) Sets the length of the crane’s runway in specified units.
runwayLength — a new value of the crane’s runway length.
units — a constant defining the length units.void setInitialBridgePosition(double bridgePosition, LengthUnits units) Sets the initial placement of the bridge in specified length units.
bridgePosition — distance from the starting point of the crane to the initial position of the bridge.
units — a constant defining the length units.void setInitialHookPosition(double hookHeight, LengthUnits units) Sets the initial height at which the hook is located in the specified length units.
hookHeight — the height at which the hook is located initially.
units — a constant defining the length units.void setInitialTrolleyPosition(double trolleyPosition, LengthUnits units) Sets the initial placement of the trolley in specified length units.
trolleyPosition — distance from the starting point of the crane to the initial position of the trolley.
units — a constant defining the length units. - Crane type
-
Function Description OverheadCraneType getType() Returns the type of the crane’s appearance.
Valid values:
OVERHEAD_CRANE_BRIDGE
OVERHEAD_CRANE_GANTRYvoid setType(OverheadCraneType type) Sets the type of the crane’s appearance.
type — new type of the crane’s appearance.
Valid values:
OVERHEAD_CRANE_BRIDGE
OVERHEAD_CRANE_GANTRYvoid setGirderType (OverheadCraneGirderDrawingType girderType) Sets the bridge type for this crane: either a single flat or a double tie.
girderType — a new bridge type.
Valid values:
OVERHEAD_CRANE_GIRDER_SINGLE
OVERHEAD_CRANE_GIRDER_DOUBLE - Color
-
Function Description Color getColor() Returns the color of the overhead crane, or null if the crane has no color. void setColor(Color color) Sets the color of the overhead crane.
color — the new color.Color getTrolleyColor() Returns the color of the crane’s trolley, or null if the crane’s trolley has no color. void setTrolleyColor(Color trolleyColor) Sets the color of the crane’s trolley.
trolleyColor — the new color. - Visibility
-
Function Description boolean isVisible() Returns true if the overhead crane is visible; returns false otherwise. void setVisible(boolean v) Sets the visibility of the overhead crane.
v — visibility. If v is true — the crane is set to be visible, if it is false — not visible. - Position
-
Function Description double getX() Returns the X coordinate of the center point of the crane. double getY() Returns the Y coordinate of the center point of the crane. double getZ() Returns the Z coordinate of the center point of the crane. Point getXYZ(Point out) Returns the (X, Y, Z) coordinates of the center point of the given crane.
out — the output Point object to write the result to. The object may be null. - Removal
-
Function Description void remove() Removes the overhead crane from the presentation. If the crane is not a part of presentation, the function does nothing. Removal from the presentation does not necessarily mean removing from the model logic, since logical networks and routes may have been created before the removal and survive it.
-
How can we improve this article?
-