AGX Dynamics 2.39.0.0
|
#include <Shovel.h>
Classes | |
class | ExcavationSettings |
Class containing the settings for the different ExcavationModes for a shovel. More... | |
struct | SoilPenetrationParameters |
Public Types | |
enum class | ExcavationMode : agx::UInt32 { PRIMARY = 0 , DEFORM_BACK = 1 , DEFORM_RIGHT = 2 , DEFORM_LEFT = 3 } |
Enum for describing the different excavation modes of a shovel: PRIMARY - The primary mode of excavation, where the shovel digs along the cutting direction in the terrain horizontal plane. More... | |
Public Member Functions | |
Shovel (agx::RigidBody *shovelBody, const agx::Line &topEdge, const agx::Line &cuttingEdge, const agx::Vec3 &cuttingDirection, Shovel *connectedShovel=nullptr) | |
Basic constructor. | |
agx::Real | computeCuttingEdgeLength () const |
bool | getAlwaysRemoveShovelContacts () const |
agx::Real | getContactRegionThreshold () const |
Get the starting distance threshold from the shovel planes where regular geometry contacts between the shovel underside and the terrain can be created. | |
agx::Real | getContactRegionVerticalLimit () const |
agx::Plane | getCurrentSeparationPlane (Terrain *terrain, ExcavationMode mode) const |
agx::Vec3 | getCuttingDirection () const |
agx::Vec3 | getCuttingDirectionWorld () const |
agx::Line | getCuttingEdge () const |
agx::Line | getCuttingEdgeWorld () const |
agx::Real | getDeadLoadFraction () const |
Get the last computed dead load fraction of the shovel, i.e how much of it's inner volume that is filled with dynamic soil. | |
bool | getEnable () const |
Access the state enable flag. | |
bool | getEnableInnerShapeCreateDynamicMass () const |
Get if inner shape alone should always create dynamic mass. | |
bool | getEnableParticleForceFeedback () |
bool | getEnableParticleFreeDeformers () const |
ExcavationSettings & | getExcavationSettings (ExcavationMode mode) |
agx::Real | getInnerContactArea () const |
Get the last computed inner contact area of the shovel, i.e the estimated cross-section area of the inner volume that is filled with dynamic soil. | |
agx::Real | getMaxPenetrationForce () const |
Set the maximum limit on penetration force (N) that the terrain will generate on this shovel. | |
agx::Real | getMinimumSubmergedContactLengthFraction () const |
Get the minimum submerged cutting edge length fraction (0-1) that generates submerged cutting. | |
agx::Real | getNoMergeExtensionDistance () const |
Get the margin outside the shovel bonding box where soil particle merging is forbidden. | |
agx::UInt | getNumberOfTeeth () const |
agx::Real | getParticleInclusionMultiplier () const |
agx::Real | getPenetrationDepthThreshold () const |
Get the vertical penetration depth threshold for when the shovel tooth for penetration resistance should reach full effectiveness. | |
agx::Real | getPenetrationForceScaling () const |
agx::RigidBody * | getRigidBody () const |
agx::Vec3 | getSecondaryCuttingDirection (Terrain *terrain) const |
agx::Real | getSecondarySeparationAngle (Terrain *terrain) const |
agx::Real | getSecondarySeparationDeadloadLimit () const |
bool | getSoilPenetrationModel (agxTerrain::Terrain *terrain, agxTerrain::SoilPenetrationResistance::PenetrationModel &model) const |
Get the soil penetration model used for the specified shovel in the given terrain. | |
agx::Real | getToothLength () const |
agx::Real | getToothMaximumRadius () const |
agx::Real | getToothMinimumRadius () const |
agx::Line | getTopEdge () const |
agx::Line | getTopEdgeWorld () const |
agx::Real | getVerticalBladeSoilMergeDistance () const |
Get the vertical distance under the blade cutting edge that the soil is allowed to instantly merge up to. | |
void | setAlwaysRemoveShovelContacts (bool enable) |
Set to true/false if shovel <-> terrain contacts should always be removed param enable - set to true/false if shovel <-> terrain contacts should always be removed. | |
void | setContactRegionThreshold (agx::Real contactRegionThreshold) |
Set the starting distance threshold from the shovel planes where regular geometry contacts between the shovel underside and the terrain can be created. | |
void | setContactRegionVerticalLimit (agx::Real verticalLimit) |
Set the maximum vertical distance from the shovel bottom plane where regular geometry contacts between the shovel and the terrain are allowed to be created. | |
void | setCuttingDirection (agx::Vec3 cuttingDirection) |
void | setCuttingEdge (agx::Line cuttingEdge) |
Set the cutting edge in local space. | |
void | setEnable (bool enable) |
Change state enable of this shovel Default: true. | |
void | setEnableInnerShapeCreateDynamicMass (bool enable) |
Set if inner shape alone should always create dynamic mass. | |
void | setEnableParticleForceFeedback (bool enable) |
Set whenever the excavation force feedback during PRIMARY excavation should be generated from particle contacts instead of aggregate contacts. | |
void | setEnableParticleFreeDeformers (bool enable) |
Set true/false if the shovel deformers should make particle free deformations. | |
void | setExcavationSettings (ExcavationMode mode, ExcavationSettings excavationSettings) |
Set a settings object for an ExcavationMode of the shovel. | |
void | setMaxPenetrationForce (agx::Real maxPenetrationForce) |
Set a maximum limit on penetration force (N) that the terrain will generate on this shovel. | |
void | setMinimumSubmergedContactLengthFraction (agx::Real minimumSubmergedContactLengthFraction) |
Set the minimum submerged cutting edge length fraction (0-1) that generates submerged cutting. | |
void | setNoMergeExtensionDistance (agx::Real extensionDistance) |
Set the extension outside the shovel bounding box where soil particle merging is forbidden. | |
void | setNumberOfTeeth (agx::UInt count) |
void | setParticleInclusionMultiplier (agx::Real radiusMultiplier) |
void | setPenetrationDepthThreshold (agx::Real depthThreshold) |
Set the vertical penetration depth threshold for when the shovel tooth for penetration resistance should reach full effectiveness. | |
void | setPenetrationForceScaling (agx::Real penetrationForceScaling) |
Set the linear scaling coefficient for the penetration force (Default: 1.0) | |
void | setSecondarySeparationDeadloadLimit (agx::Real secondarySeparationLimit) |
Sets the dead-load limit where secondary separation will start to activate where the forward direction starts to change according to the virtual separation plate created by the material inside the shovel. | |
bool | setSoilPenetrationModel (agxTerrain::SoilPenetrationResistance::PenetrationModel model, agxTerrain::Terrain *terrain) |
Set the soil penetration model used for the specified shovel in the given terrain. | |
void | setToothLength (agx::Real length) |
void | setToothMaximumRadius (agx::Real radius) |
void | setToothMinimumRadius (agx::Real radius) |
void | setTopEdge (agx::Line topEdge) |
Set the top edge in local space. | |
void | setVerticalBladeSoilMergeDistance (agx::Real verticalSoilBladeMergeDistance) |
Sets the vertical distance under the blade cutting edge that the soil is allowed to instantly merge up to. | |
Public Member Functions inherited from agx::Referenced | |
Referenced () | |
Default constructor. | |
Referenced (const Referenced &) | |
template<typename T > | |
T * | as () |
Subclass casting. | |
template<typename T > | |
const T * | as () const |
template<typename T > | |
T * | asSafe () |
Safe subclass casting, return nullptr if template type does not match. | |
template<typename T > | |
const T * | asSafe () const |
int | getReferenceCount () const |
template<typename T > | |
bool | is () const |
Subclass test. | |
Referenced & | operator= (const Referenced &) |
Assignment operator. Will increment the number of references to the referenced object. | |
void | reference (void *ptr=nullptr) const |
Explicitly increment the reference count by one, indicating that this object has another pointer which is referencing it. | |
void | unreference (void *ptr=nullptr) const |
Decrement the reference count by one, indicating that a pointer to this object is referencing it. | |
void | unreference_nodelete () const |
Decrement the reference count by one, indicating that a pointer to this object is referencing it. | |
Public Member Functions inherited from agxStream::Serializable | |
virtual | ~Serializable () |
Destructor for normal C++ use but hidden from SWIG bindings. | |
virtual const char * | getClassName () const |
bool | getEnableSerialization () const |
bool | getEnableUuidGeneration () |
agx::UInt32 | getIndex () const |
This index is given at creation of this object. | |
virtual StorageAgent * | getStorageAgent () const =0 |
agx::Uuid | getUuid () const |
bool | isFinished () const |
void | setEnableSerialization (bool flag) |
Set to false to disable serialization of this object. | |
void | setFinished () |
Tells this class that it is restored correctly and should not be deleted during destruction of an Archive. | |
void | setUuid (const agx::Uuid &uuid) |
Explicitly set a Uuid on a serializable object. | |
Protected Types | |
using | Flags = agx::BitState< StateFlags, agx::UInt32 > |
enum | StateFlags : agx::UInt32 { ENABLED = 1 << 0 , REMOVE_SHOVEL_CONTACTS = 1 << 1 , INNER_SHAPE_CREATE_DYNAMIC_MASS = 1 << 2 , ENABLE_PARTICLE_FREE_DEFORMATION = 1 << 3 , ENABLE_PARTICLE_FORCE_FEEDBACK = 1 << 4 } |
Protected Member Functions | |
Shovel () | |
Default constructor used in serialization. | |
virtual | ~Shovel () |
Reference counted object - protected destructor. | |
agxCollide::GeometryRefVector | createVoxelCollisionGeometries (agx::Real tessellationLevel) const |
Protected Member Functions inherited from agx::Referenced | |
virtual | ~Referenced () |
Destructor. | |
void | allocateObserverVector () const |
void | deleteUsingDeleteHandler () const |
Protected Member Functions inherited from agxStream::Serializable | |
Serializable () | |
Default constructor. | |
Serializable (const Serializable &other) | |
Copy constructor. | |
void | generateUuid () |
Additional Inherited Members | |
Static Public Member Functions inherited from agx::Referenced | |
template<typename T > | |
static bool | ValidateCast (const Referenced *object) |
Static Public Member Functions inherited from agxStream::Serializable | |
static void | setEnableUuidGeneration (bool flag) |
Specify if there should be UUID:s generated for each new Serializable object. By default it is enabled. | |
Static Protected Member Functions inherited from agx::Referenced | |
static DeleteHandler * | getDeleteHandler () |
static void | setDeleteHandler (DeleteHandler *handler) |
Internal: Set a DeleteHandler to which deletion of all referenced counted objects will be delegated to. | |
|
protected |
|
strong |
Enum for describing the different excavation modes of a shovel: PRIMARY - The primary mode of excavation, where the shovel digs along the cutting direction in the terrain horizontal plane.
DEFORM_BACK - The mode of excavation where the shovel is digging in the opposite direction of the cutting direction in the terrain horizontal plane. ( Example: Backside grading ) DEFORM_LEFT - The mode of excavation where the shovel is digging to the counter-clock wise (Left) direction orthogonal to the cutting direction in the terrain horizontal plane. ( Example: Side push/grading ) DEFORM_RIGHT - The mode of excavation where the shovel is digging to the clock wise (Right) direction orthogonal to the cutting direction in the terrain horizontal plane. ( Example: Side push/grading )
Enumerator | |
---|---|
PRIMARY | |
DEFORM_BACK | |
DEFORM_RIGHT | |
DEFORM_LEFT |
|
protected |
agxTerrain::Shovel::Shovel | ( | agx::RigidBody * | shovelBody, |
const agx::Line & | topEdge, | ||
const agx::Line & | cuttingEdge, | ||
const agx::Vec3 & | cuttingDirection, | ||
Shovel * | connectedShovel = nullptr |
||
) |
Basic constructor.
shovelBody | - The base body of the shovel. |
topEdge | - The top edge of the active zone, specified in the LOCAL shovelBody frame that will be created in front of the shovel. |
cuttingEdge | - The lowest edge on the shovel, specified in the LOCAL shovelBody frame that serves as the cutting edge of the active zone. |
cuttingDirection | - The cutting direction of the shovel where the penetration resistance will be active, which is usually parallel to the lowest shovel plate that is used to initially penetrate the soil. |
connectedShovel | - Set if the shovel should be connected to another shovels InnerBody for pruposes of simulating composite shovels with varying shovel vectors in along the shovel geometry. This means you can have multiple cutting edges with varying orientation per shovel where you have a central shovel with a single inner shape. (Default: nullptr) |
|
protected |
Default constructor used in serialization.
|
protectedvirtual |
Reference counted object - protected destructor.
agx::Real agxTerrain::Shovel::computeCuttingEdgeLength | ( | ) | const |
|
protected |
bool agxTerrain::Shovel::getAlwaysRemoveShovelContacts | ( | ) | const |
agx::Real agxTerrain::Shovel::getContactRegionThreshold | ( | ) | const |
Get the starting distance threshold from the shovel planes where regular geometry contacts between the shovel underside and the terrain can be created.
Contacts that do not reach the distance threshold will be filtered away.
agx::Real agxTerrain::Shovel::getContactRegionVerticalLimit | ( | ) | const |
agx::Plane agxTerrain::Shovel::getCurrentSeparationPlane | ( | Terrain * | terrain, |
ExcavationMode | mode | ||
) | const |
agx::Vec3 agxTerrain::Shovel::getCuttingDirection | ( | ) | const |
agx::Vec3 agxTerrain::Shovel::getCuttingDirectionWorld | ( | ) | const |
agx::Line agxTerrain::Shovel::getCuttingEdge | ( | ) | const |
agx::Line agxTerrain::Shovel::getCuttingEdgeWorld | ( | ) | const |
agx::Real agxTerrain::Shovel::getDeadLoadFraction | ( | ) | const |
Get the last computed dead load fraction of the shovel, i.e how much of it's inner volume that is filled with dynamic soil.
The dead load fraction ranges from 0.0 (empty), to 1.0 (full).
bool agxTerrain::Shovel::getEnable | ( | ) | const |
Access the state enable flag.
bool agxTerrain::Shovel::getEnableInnerShapeCreateDynamicMass | ( | ) | const |
Get if inner shape alone should always create dynamic mass.
The alternative is to only create dynamic mass in the inner shape when primary excavation soil wedges create mass.
bool agxTerrain::Shovel::getEnableParticleForceFeedback | ( | ) |
bool agxTerrain::Shovel::getEnableParticleFreeDeformers | ( | ) | const |
ExcavationSettings & agxTerrain::Shovel::getExcavationSettings | ( | ExcavationMode | mode | ) |
agx::Real agxTerrain::Shovel::getInnerContactArea | ( | ) | const |
Get the last computed inner contact area of the shovel, i.e the estimated cross-section area of the inner volume that is filled with dynamic soil.
agx::Real agxTerrain::Shovel::getMaxPenetrationForce | ( | ) | const |
Set the maximum limit on penetration force (N) that the terrain will generate on this shovel.
(Default: Infinity)
agx::Real agxTerrain::Shovel::getMinimumSubmergedContactLengthFraction | ( | ) | const |
Get the minimum submerged cutting edge length fraction (0-1) that generates submerged cutting.
Default: 0.5
agx::Real agxTerrain::Shovel::getNoMergeExtensionDistance | ( | ) | const |
Get the margin outside the shovel bonding box where soil particle merging is forbidden.
agx::UInt agxTerrain::Shovel::getNumberOfTeeth | ( | ) | const |
agx::Real agxTerrain::Shovel::getParticleInclusionMultiplier | ( | ) | const |
agx::Real agxTerrain::Shovel::getPenetrationDepthThreshold | ( | ) | const |
Get the vertical penetration depth threshold for when the shovel tooth for penetration resistance should reach full effectiveness.
The penetration depth is defined as the vertical distance between the tip of a shovel tooth and the surface position of the height field. The penetration resistance will increase from a baseline of 10% until maximum effectiveness is reached when the vertical penetration depth of the shovel reaches the specified value. (Default: 0.5 m)
agx::Real agxTerrain::Shovel::getPenetrationForceScaling | ( | ) | const |
agx::RigidBody * agxTerrain::Shovel::getRigidBody | ( | ) | const |
agx::Real agxTerrain::Shovel::getSecondarySeparationDeadloadLimit | ( | ) | const |
bool agxTerrain::Shovel::getSoilPenetrationModel | ( | agxTerrain::Terrain * | terrain, |
agxTerrain::SoilPenetrationResistance::PenetrationModel & | model | ||
) | const |
Get the soil penetration model used for the specified shovel in the given terrain.
Available models are:
NO_MODEL - Only use the soil pressure above the cutting edge to determine the penetration resistance. ELASTIC_PLASTIC_LIMIT - Calculate the expected penetration resistance based in the elastic plastic limit. (Default) PLASTIC - Calculate the expected penetration resistance based on plastic expansion due to tooth pressure.
model | - The output variable where the penetration model that is used will be put, if successful. |
terrain | - The specified terrain where this model applies. |
agx::Real agxTerrain::Shovel::getToothLength | ( | ) | const |
agx::Real agxTerrain::Shovel::getToothMaximumRadius | ( | ) | const |
agx::Real agxTerrain::Shovel::getToothMinimumRadius | ( | ) | const |
agx::Line agxTerrain::Shovel::getTopEdge | ( | ) | const |
agx::Line agxTerrain::Shovel::getTopEdgeWorld | ( | ) | const |
agx::Real agxTerrain::Shovel::getVerticalBladeSoilMergeDistance | ( | ) | const |
Get the vertical distance under the blade cutting edge that the soil is allowed to instantly merge up to.
void agxTerrain::Shovel::setAlwaysRemoveShovelContacts | ( | bool | enable | ) |
Set to true/false if shovel <-> terrain contacts should always be removed param enable - set to true/false if shovel <-> terrain contacts should always be removed.
void agxTerrain::Shovel::setContactRegionThreshold | ( | agx::Real | contactRegionThreshold | ) |
Set the starting distance threshold from the shovel planes where regular geometry contacts between the shovel underside and the terrain can be created.
Contacts that are not past the distance threshold will be filtered away.
contactRegionThreshold | - The contact distance threshold from the shovel planes where regular geometry contacts between the shovel underside and the terrain are allowed to be created. ( Default: cuttingEdgeLength / 10.0 ) |
void agxTerrain::Shovel::setContactRegionVerticalLimit | ( | agx::Real | verticalLimit | ) |
Set the maximum vertical distance from the shovel bottom plane where regular geometry contacts between the shovel and the terrain are allowed to be created.
Contacts past the distance will be filtered away.
verticalLimit | - The vertical contact distance threshold from the shovel planes where regular geometry contacts between the shovel underside and the terrain are allowed to be created. ( Default: cuttingEdgeLength / 10.0 ) |
void agxTerrain::Shovel::setCuttingDirection | ( | agx::Vec3 | cuttingDirection | ) |
cuttingDirection | - new cutting direction in local space. |
void agxTerrain::Shovel::setCuttingEdge | ( | agx::Line | cuttingEdge | ) |
Set the cutting edge in local space.
cuttingEdge | - new cutting edge in local space. |
void agxTerrain::Shovel::setEnable | ( | bool | enable | ) |
Change state enable of this shovel Default: true.
enable | - true to enable, false to disable |
void agxTerrain::Shovel::setEnableInnerShapeCreateDynamicMass | ( | bool | enable | ) |
Set if inner shape alone should always create dynamic mass.
The alternative is to only create dynamic mass in the inner shape when primary excavation soil wedges create mass. Default: true.
enable | - true if inner shape should always create dynamic mass (default), false otherwise. |
void agxTerrain::Shovel::setEnableParticleForceFeedback | ( | bool | enable | ) |
Set whenever the excavation force feedback during PRIMARY excavation should be generated from particle contacts instead of aggregate contacts.
enable | - true if particles should generate contact forces on the shovel, false otherwise. (Default: false) |
void agxTerrain::Shovel::setEnableParticleFreeDeformers | ( | bool | enable | ) |
Set true/false if the shovel deformers should make particle free deformations.
(Default: false) Note, if this is true all excavation modes will make particle free deformations. Even if enableCreateDynamicMass is set to false for one or more excavation modes.
enable | - true if the shovel deformers mode should make particle free deformations. |
void agxTerrain::Shovel::setExcavationSettings | ( | ExcavationMode | mode, |
ExcavationSettings | excavationSettings | ||
) |
Set a settings object for an ExcavationMode of the shovel.
Excavation modes are as follows: PRIMARY - The primary mode of excavation, where the shovel digs along the cutting direction in the terrain horizontal plane. DEFORM_BACK - The mode of excavation where the shovel is digging in the opposite direction of the cutting direction in the terrain horizontal plane. ( Example: Backside grading ) DEFORM_LEFT - The mode of excavation where the shovel is digging to the counter-clock wise (Left) direction orthogonal to the cutting direction in the terrain horizontal plane. ( Example: Side push/grading ) DEFORM_RIGHT - The mode of excavation where the shovel is digging to the clock wise (Right) direction orthogonal to the cutting direction in the terrain horizontal plane. ( Example: Side push/grading )
mode | - The specified excavation mode that the settings will apply to. |
excavationSettings | - The specified excavation settings that will apply to the excavation mode. |
void agxTerrain::Shovel::setMaxPenetrationForce | ( | agx::Real | maxPenetrationForce | ) |
Set a maximum limit on penetration force (N) that the terrain will generate on this shovel.
(Default: Infinity)
maxPenetrationForce | - The maximum penetration force that the terrain will act on this shovel |
void agxTerrain::Shovel::setMinimumSubmergedContactLengthFraction | ( | agx::Real | minimumSubmergedContactLengthFraction | ) |
Set the minimum submerged cutting edge length fraction (0-1) that generates submerged cutting.
Default: 0.5
void agxTerrain::Shovel::setNoMergeExtensionDistance | ( | agx::Real | extensionDistance | ) |
Set the extension outside the shovel bounding box where soil particle merging is forbidden.
void agxTerrain::Shovel::setNumberOfTeeth | ( | agx::UInt | count | ) |
count | - new teeth count of shovel. |
void agxTerrain::Shovel::setParticleInclusionMultiplier | ( | agx::Real | radiusMultiplier | ) |
void agxTerrain::Shovel::setPenetrationDepthThreshold | ( | agx::Real | depthThreshold | ) |
Set the vertical penetration depth threshold for when the shovel tooth for penetration resistance should reach full effectiveness.
The penetration depth is defined as the vertical distance between the tip of a shovel tooth and the surface position of the height field. The penetration resistance will increase from a baseline of 10% until maximum effectiveness is reached when the vertical penetration depth of the shovel reaches the specified value. (Default: 0.5 m)
depthThreshold | - the vertical pressure threshold that will cause penetration resistance to start. |
void agxTerrain::Shovel::setPenetrationForceScaling | ( | agx::Real | penetrationForceScaling | ) |
Set the linear scaling coefficient for the penetration force (Default: 1.0)
penetrationForceScaling | - The coefficient for scaling the penetration force that the terrain will give on this shovel |
void agxTerrain::Shovel::setSecondarySeparationDeadloadLimit | ( | agx::Real | secondarySeparationLimit | ) |
Sets the dead-load limit where secondary separation will start to activate where the forward direction starts to change according to the virtual separation plate created by the material inside the shovel.
secondarySeparationLimit | - The dead load limit where secondary separation will start to activate (Default: 0.8) |
bool agxTerrain::Shovel::setSoilPenetrationModel | ( | agxTerrain::SoilPenetrationResistance::PenetrationModel | model, |
agxTerrain::Terrain * | terrain | ||
) |
Set the soil penetration model used for the specified shovel in the given terrain.
Available models are:
NO_MODEL - Only use the soil pressure above the cutting edge to determine the penetration resistance. ELASTIC_PLASTIC_LIMIT - Calculate the expected penetration resistance based in the elastic plastic limit. (Default) PLASTIC - Calculate the expected penetration resistance based on plastic expansion due to tooth pressure.
model | - The specified penetration model to use in the shovel against the terrain. ( Default: ELASTIC_PLASTIC_LIMIT ) |
terrain | - The specified terrain where this model will apply. |
void agxTerrain::Shovel::setToothLength | ( | agx::Real | length | ) |
length | - new tooth length. |
void agxTerrain::Shovel::setToothMaximumRadius | ( | agx::Real | radius | ) |
radius | - new maximum radius of the shovel teeth. |
void agxTerrain::Shovel::setToothMinimumRadius | ( | agx::Real | radius | ) |
radius | - new minimum radius of the shovel teeth. |
void agxTerrain::Shovel::setTopEdge | ( | agx::Line | topEdge | ) |
Set the top edge in local space.
topEdge | - new top edge in local space. |
void agxTerrain::Shovel::setVerticalBladeSoilMergeDistance | ( | agx::Real | verticalSoilBladeMergeDistance | ) |
Sets the vertical distance under the blade cutting edge that the soil is allowed to instantly merge up to.
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |