public class SkinMeshBody extends SkinMeshBase implements CollidableBody, PointAttachable
SkinMeshBody manages this skinning by assigning a
 PointSkinAttachment to each vertex within the mesh, which stores the
 master components used to control the vertex position and computes that
 position using the
 computePosState() method.
 
 PointSkinAttachment is an instance of PointAttachment,
 and when used by SkinMeshBody to control vertex positions it does
 not connect to any Point component as a slave (i.e., getSlave() returns null.
 However, PointSkinAttachments can also
 be used to attach a point or a marker to the "skin" of a
 SkinMeshBody, and so allow velocities to propagate from the master
 components to the point, and forces to propagate from the point to the
 masters.
 
 Master components can currently include Frame, FemNode3d
 (within a specific FemModel3d), and individual Particle
 objects. The set of master components can vary from vertex to
 vertex. PointSkinAttachment maintains a set of
 connections to each master component, each with a specified
 weight, and computes the final vertex position as a weighted
 sum of the positions computed for each connection. In pseudocode,
 this can be expressed as:
 
    vertexPos = 0;
    for (each connection c) {
       vertexPos += c.weight * c.connectionPos();
    }
 
  Frames control vertex positions using various skinning
 techniques known in the literature. These include linear, linear dual
 quaternion, and iterative dual quaternion skinning. The technique used is
 controlled by the getFrameBlending() and setFrameBlending() methods. Implementing these
 techniques requires SkinMeshBody to maintain additional information
 for each Frame.  Therefore it is necessary for all Frames used in skinning to
 be registered with the SkinMeshBody using
 addFrame().
 
 FEM nodes can control vertex positions using linear combinations of
 either their current position values, or their current displacements from the
 rest position. It is also recommended that any FemModel used in skinning be
 registered with the SkinMeshBody using
 addFemModel(),
 although neither of the currently implemented FemNode control
 methods actually require this.
 
 Finally, it is also possible to use a vertex's initial base
 position to control a portion of its final position. Vertex base
 positions are also used for Frame-based skinning. Vertex base
 positions are set initially when a mesh is assigned to the skin.
 Base positions can be queried and set using
 getBasePosition() and
 setBasePosition(), and can be reset
 en mass using resetBasePositions().
 
 Setting up a SkinMeshBody involves three basic steps:
 
    skinMesh = new SkinMeshBody (polyMesh);
    skinMesh.addFrame (rigidBody1);
    skinMesh.addFrame (rigidBody2);
    skinMesh.addFemModel (femModel1);
    skinMesh.computeDisplacementAttachments();
 
 Here, computeDisplacementAttachments()
 automatically computes an attachment for each vertex involving
 all registered Frames and FemModels that contain a polygonal mesh.
 The weights connecting each vertex to these master components is based
 on their current distance to the vertex. Other functions for
 computing attachments, based on different schemes, may be added
 in the future.
 Alternatively, the application may compute attachments directly. A sketch of the required code might look like this:
    skinMesh.clearAttachments();
    for (int i=0; i < skinMesh.numVertices(); i++) {
       Vertex3d vtx = skinMesh.getVertex (i);
       ... use vertex position to compute weights w1, w2, w3, w4
           relating it to various master components ...
       PointSkinAttachment a = new PointSkinAttachment();
       // add new connections:
       a.addFrameConnection (body1Index, w1);
       a.addFrameConnection (body2Index, w2);
       a.addFemDisplacementConnection (femNode4, w3);
       a.addFemDisplacementConnection (femNode6, w4);
       a.finalizeConnections();
       skinMesh.addAttachment (a);
    }
 
 
 The initial call to clearAttachments() is necessary if the
 skinMesh already contains attachments. Then for each vertex, master
 components are determined, along with their associated weights, and an
 attachment is created with master connections added using various
 addXXXConnection() methods followed by a call to finalizeConnections(). The method
 addFrameConnection()
 specifies a Frame master, which controls the vertex position
 using the skinning technique returned by getFrameBlending().  The Frame itself is specified using its
 FrameInfo structure within SkinMeshBody, which
 can be obtained
 using getFrameInfo(). The method addFemDisplacementConnection() specifies a FemNode3d as a master,
 which controls the vertex position using its current displacement from its
 own rest position.  Other types of connections are possible; one should
 consult the source code or documentation for PointSkinAttachment.
  When calculating attachment weights, an application will likely to need
 access to the Frames and FemModels that are registered with the SkinMeshBody
 (for example, to make distance queries on their surface meshes).
 This can be done using methods such as numFrames(), getFrame(int), numFemModels(), and getFemModel().
| Modifier and Type | Class and Description | 
|---|---|
| class  | SkinMeshBody.BodyInfoBase class for information about bodies (e.g., Frames or
 FemNodels) used to control the skinning. | 
| class  | SkinMeshBody.FemModelInfoContains information for each FemModel controlling this SkinMeshBody. | 
| static class  | SkinMeshBody.FrameBlendingCharacterizes the blend mechanism used for the frame-based
 portion of the skinning. | 
| class  | SkinMeshBody.FrameInfoContains information for each frame controlling this SkinMeshBody. | 
Collidable.Collidability, Collidable.GroupModelComponent.NavpanelVisibilityCompositeComponent.NavpanelDisplay| Modifier and Type | Field and Description | 
|---|---|
| static SkinMeshBody.FrameBlending | DEFAULT_FRAME_BLENDING | 
| static double | DQ_BLEND_TOLERANCE | 
| static int | DQ_MAX_BLEND_STEPS | 
| static double | myDefaultSigma | 
| static PropertyList | myProps | 
DEFAULT_COLOR_INTERPOLATION, DEFAULT_VERTEX_COLOR_MIXINGenforceUniqueCompositeNames, enforceUniqueNames, myNumber, NULL_OBJ, useCompactPathNamesAll, AllBodies, Deformable, Rigid, SelfTG_ARTICULATED, TG_DRAGGER, TG_PRESERVE_ORIENTATION, TG_SIMULATINGTRANSPARENT, TWO_DIMENSIONAL| Constructor and Description | 
|---|
| SkinMeshBody()Creates an empty SkinMeshBody. | 
| SkinMeshBody(MeshBase mesh)Creates a SkinMeshBody with a specified mesh. | 
| Modifier and Type | Method and Description | 
|---|---|
| void | addAttachment(PointSkinAttachment a)Adds an attachment to this SkinMeshBody. | 
| void | addAttachment(PointSkinAttachment a,
             boolean initBase)Adds an attachment to this SkinMeshBody. | 
| void | addFemModel(FemModel3d fem)Registers a FemModel with this SkinMeshBody so that it can be used for skinning
 control. | 
| void | addFrame(Frame frame)Registers a Frame with this SkinMeshBody so that it can be used for skinning
 control. | 
| boolean | allowCollision(ContactPoint cpnt,
              Collidable other,
              java.util.Set<Vertex3d> attachedVertices)Returns  trueif a collision between this Collidable
 andothershould be allowed for the contact pointcpnt. | 
| void | clearAttachments()Clears all the attachments associated with this SkinMeshBody. | 
| void | computeDisplacementAttachments(double sigma)Computes displacement-based attachments for each vertex attachment in
 this skin mesh. | 
| void | computeWeights() | 
| void | connectToHierarchy()Called by the system after this component is added to the
 component hierarchy (i.e., when it is added as a child of another
 CompositeComponent). | 
| boolean | containsContactMaster(CollidableDynamicComponent comp)Returns true if this Collidable contains a specified contact master
 component. | 
| PointSkinAttachment | createPointAttachment(Point pnt)Returns a PointAttachment that attaches  pntto this component. | 
| void | disconnectFromHierarchy()Called by the system after this component is removed from the component
 hierarchy (i.e., when it is removed as a child of its parent). | 
| java.util.List<SkinMeshBody.FemModelInfo> | getAllFemModelInfo()Returns the information structures of all FemModels that are currently
 registered with this SkinMeshBody. | 
| java.util.List<SkinMeshBody.FrameInfo> | getAllFrameInfo()Returns the information structures of all Frames that are currently
 registered with this SkinMeshBody. | 
| PropertyList | getAllPropertyInfo()Returns a list giving static information about all properties exported by
 this object. | 
| PointSkinAttachment | getAttachment(int idx)Returns the attachment for the idx-th vertex of this SkinMeshBody. | 
| Point3d | getBasePosition(int idx)Returns the base position for a specified vertex attachment in this
 SkinMeshBody. | 
| Collidable.Collidability | getCollidable()Returns the  Collidable.Collidabilityof this Collidable. | 
| Collidable | getCollidableAncestor()Returns the most immediate Collidable ancestor of this Collidable,
 if any. | 
| int | getCollidableIndex() | 
| PolygonalMesh | getCollisionMesh()Returns the mesh that should be used for computing collisions, or
  nullif there is no such mesh. | 
| DistanceGrid | getDistanceGrid()Returns a signed distance grid that can be used with a 
 SignedDistanceCollider, or  nullif this Collidable
 does not support a signed distance grid (i.e., ifCollidableBody.hasDistanceGrid()returnsfalse). | 
| FemModel3d | getFemModel(int idx)Returns a FemModel that is currently registered with SkinMeshBody. | 
| int | getFemModelIndex(FemModel fem)Returns the index of a FemModelthat is currently registered with t
 this SkinMeshBody, or -1 if the FemModel is not registered. | 
| SkinMeshBody.FemModelInfo | getFemModelInfo(int idx)Returns an information structure for a FemModel that is currently registered
 with this SkinMeshBody. | 
| Frame | getFrame(int idx)Returns a Frame that is currently registered with SkinMeshBody. | 
| SkinMeshBody.FrameBlending | getFrameBlending()Returns the blend type for that part of the skinning that depends on
 frames. | 
| SkinMeshBody.FrameInfo | getFrameInfo(Frame frame)Returns the FrameInfo for a Frame that is currently registered with this
 SkinMeshBody, or null if the Frame is not registered. | 
| SkinMeshBody.FrameInfo | getFrameInfo(int idx)Returns an information structure for a Frame that is currently registered
 with this SkinMeshBody. | 
| double | getMass() | 
| void | getSoftReferences(java.util.List<ModelComponent> refs)Appends all soft references for this component to a list. | 
| void | getVertexMasters(java.util.List<ContactMaster> mlist,
                Vertex3d vtx)Returns all the contact master components associated with a particular
 mesh vertex. | 
| boolean | hasDistanceGrid()Returns  trueif this Collidable supports a signed
 distance grid that can be used with a SignedDistanceCollider. | 
| boolean | hasFemModel(FemModel3d fem)Returns true is a specified FemModel is currently registered with this
 SkinMeshBody. | 
| boolean | hasFrame(Frame frame)Returns true is a specified Frame is currently registered with this
 SkinMeshBody. | 
| boolean | isCompound()Queries whether or not this collidable has sub-collidables. | 
| boolean | isDeformable()Returns  trueif this collidable is deformable. | 
| int | numAttachments()Returns the number of attachments currently in this SkinMeshBody. | 
| int | numFemModels()Returns the number of FemModels currently registered with this SkinMeshBody. | 
| int | numFrames()Returns the number of Frames currently registered with this SkinMeshBody. | 
| boolean | removeFrame(Frame frame)Removes a Frame from this SkinMeshBody | 
| void | scan(ReaderTokenizer rtok,
    java.lang.Object ref)Scans this element from a ReaderTokenizer. | 
| void | setAttachment(int idx,
             PointSkinAttachment a) | 
| void | setAttachment(int idx,
             PointSkinAttachment a,
             boolean initBase) | 
| void | setBasePosition(int idx,
               Vector3d pos)Sets the base position for a specified vertex attachment in the
 SkinMeshBody. | 
| void | setCollidable(Collidable.Collidability c) | 
| void | setCollidableIndex(int idx) | 
| void | setFrameBlending(SkinMeshBody.FrameBlending type)Sets the blend type for that part of the skinning that depends on frames. | 
| void | setMesh(MeshBase mesh)Sets the mesh associated with the this SkinMeshBody. | 
| void | smoothWeights() | 
| void | smoothWeights(int networkDist) | 
| void | smoothWeights(SISOFunction weightFunction,
             int networkDist)Smooths weights according to a weighting function of distance. | 
| void | transformGeometry(GeometryTransformer gtr,
                 TransformGeometryContext context,
                 int flags)Transforms the geometry of this component, using the geometry transformer
  gtrto transform its individual attributes. | 
| void | updateReferences(boolean undo,
                java.util.Deque<java.lang.Object> undoInfo)May be called by the system if any of the soft references for
 this component are removed from the the component hierarchy. | 
| void | updateSlavePos()Updates the mesh vertices to reflect the current position of the
 attached Frames, FemModels, and points. | 
componentChanged, copy, findComponent, get, get, getByNumber, getNavpanelDisplay, getNavpanelVisibility, getNumberLimit, getSurfaceMesh, getSurfaceMeshes, hierarchyContainsReferences, indexOf, numComponents, numSurfaceMeshes, postscan, scaleDistance, setDisplayMode, setNavpanelDisplay, updateNameMap, updateSlaveVeladdTransformableDependencies, createRenderProps, createSurfaceMeshArray, getColorInterpolation, getFileTransform, getMesh, getMeshToWorld, getSurfaceMeshes, getVertex, getVertexColorMixing, isFileTransformRigid, isMeshModfied, numSurfaceMeshes, numVertices, prerender, render, render, scaleMass, setColorInterpolation, setDefaultValues, setMesh, setMesh, setMeshToWorld, setVertexColorMixing, transformGeometry, updateBounds, updatePositiongetRenderHints, getRenderProps, getSelection, isSelectable, numSelectionQueriesNeeded, setRenderProps, updateRenderPropscheckFlag, checkName, checkNameUniqueness, clearFlag, clone, createTempFlag, getChildren, getGrandParent, getHardReferences, getName, getNameRange, getNavpanelVisibility, getNumber, getParent, getProperty, hasChildren, hasState, isConnectedToHierarchy, isFixed, isMarked, isSelected, isWritable, makeValidName, makeValidName, notifyParentOfChange, printReferences, recursivelyContained, recursivelyContains, removeTempFlag, setFixed, setFlag, setMarked, setName, setNavpanelVisibility, setNavpanelVisibility, setNumber, setParent, setSelected, writeequals, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitgetHardReferences, getName, getNavpanelVisibility, getNumber, getParent, hasState, isFixed, isMarked, isSelected, notifyParentOfChange, postscan, setFixed, setMarked, setName, setNumber, setParent, setSelectedgetPropertygetChildren, hasChildrenisWritable, writepublic static SkinMeshBody.FrameBlending DEFAULT_FRAME_BLENDING
public static int DQ_MAX_BLEND_STEPS
public static double DQ_BLEND_TOLERANCE
public static double myDefaultSigma
public static PropertyList myProps
public SkinMeshBody()
public SkinMeshBody(MeshBase mesh)
public PropertyList getAllPropertyInfo()
HasPropertiesgetAllPropertyInfo in interface HasPropertiesgetAllPropertyInfo in class SkinMeshBasepublic void setFrameBlending(SkinMeshBody.FrameBlending type)
public SkinMeshBody.FrameBlending getFrameBlending()
public int numAttachments()
numAttachments in class SkinMeshBasepublic void addAttachment(PointSkinAttachment a)
public void addAttachment(PointSkinAttachment a, boolean initBase)
initBase is
 true, then the attachment's base position is set to the current vertex
 position. The number of attachments cannot exceed the current number of
 mesh vertices.public void setAttachment(int idx,
                          PointSkinAttachment a)
public void setAttachment(int idx,
                          PointSkinAttachment a,
                          boolean initBase)
public void clearAttachments()
public PointSkinAttachment getAttachment(int idx)
getAttachment in class SkinMeshBaseidx - index of the vertex for which the attachment is desired.
 Must be less that numAttachments().public void setMesh(MeshBase mesh)
setMesh in class MeshComponentpublic void addFrame(Frame frame)
frame - Frame to be registeredpublic boolean removeFrame(Frame frame)
frame - Frmae to be removedpublic boolean hasFrame(Frame frame)
frame - Frame to be queriedpublic int numFrames()
public SkinMeshBody.FrameInfo getFrameInfo(int idx)
idx - identities the Frame; must be between 0 and
 the number returned by numFrames().public java.util.List<SkinMeshBody.FrameInfo> getAllFrameInfo()
public Frame getFrame(int idx)
idx - identities the Frame; must be between 0 and
 the number returned by numFrames().public SkinMeshBody.FrameInfo getFrameInfo(Frame frame)
frame - Frame whose FrameInfo is desiredpublic void addFemModel(FemModel3d fem)
fem - FemModel to be registeredpublic boolean hasFemModel(FemModel3d fem)
fem - FemModel to be queriedpublic int numFemModels()
public SkinMeshBody.FemModelInfo getFemModelInfo(int idx)
idx - identities the FemModel; must be between 0 and
 the number returned by numFemModels().public java.util.List<SkinMeshBody.FemModelInfo> getAllFemModelInfo()
public FemModel3d getFemModel(int idx)
idx - identities the FemModel; must be between 0 and
 the number returned by numFemModels().public int getFemModelIndex(FemModel fem)
fem - FemModel whose index is desiredpublic Point3d getBasePosition(int idx)
idx - index of the attachment. Must be less than
 numAttachments().public void setBasePosition(int idx,
                            Vector3d pos)
idx - index of the attachment. Must be less than
 numAttachments().pos - new base positonpublic void smoothWeights(SISOFunction weightFunction, int networkDist)
weightFunction - single-input single-output function of distance
       to use as weightsnetworkDist - number of paths to traverse to collect verticespublic void smoothWeights(int networkDist)
public void smoothWeights()
public void computeWeights()
public void computeDisplacementAttachments(double sigma)
 Bodies further away have a lower weighting. If sigma
 is non-positive, the weighting is determined using an inverse-square
 attenuation. Otherwise, the weighting is determined using a
 Gaussian attention controlled by sigma.
sigma - if greater than 0, specifies a Gaussian weighting
 attenuation.public void updateSlavePos()
updateSlavePos in interface HasSlaveObjectsupdateSlavePos in class SkinMeshBasepublic void transformGeometry(GeometryTransformer gtr, TransformGeometryContext context, int flags)
TransformableGeometrygtr to transform its individual attributes. The
 context argument supplies information about what other
 components are currently being transformed, and also allows the
 requesting of update actions to be performed after all transform called
 have completed. The context is also the usual entity that calls
 this method, from within its TransformGeometryContext.apply(maspack.geometry.GeometryTransformer, int)
 method. The argument flags provides flags to specify
 various conditions associated with the the transformation. 
 At present, the available flags are TransformableGeometry.TG_SIMULATING and 
 TransformableGeometry.TG_ARTICULATED.
 This method is not usually called directly by applications. 
 Instead, it is typically called from within the 
 TransformGeometryContext.apply(maspack.geometry.GeometryTransformer, int) method of the context,
 which takes care of the various operations needed for a
 complete transform operation, including calling 
 TransformableGeometry.addTransformableDependencies(artisynth.core.modelbase.TransformGeometryContext, int) to collect other 
 components that should be transformed, calling 
 TransformableGeometry.transformGeometry(maspack.matrix.AffineTransform3dBase) for each component, notifying
 component parents that the geometry has changed, and calling
 any requested TransformGeometryActions. More details
 are given in the documentation for 
 TransformGeometryContext.apply(maspack.geometry.GeometryTransformer, int).
 
 
TransformGeometryContext provides a number of
 static convenience transform methods
 which take care of building the context and calling
 apply() for a specified set of components.
 
 
This method should not
 generally call transformGeometry() for its descendant
 components. Instead, descendants needing transformation should be
 specified by adding them to the context in the method TransformableGeometry.addTransformableDependencies(artisynth.core.modelbase.TransformGeometryContext, int).
transformGeometry in interface TransformableGeometrytransformGeometry in class SkinMeshBasegtr - transformer implementing the transformcontext - context information, including what other components
 are being transformedflags - specifies conditions associated with the transformationpublic void scan(ReaderTokenizer rtok, java.lang.Object ref) throws java.io.IOException
ModelComponentBasewrite.scan in interface ModelComponentscan in interface Scannablescan in class SkinMeshBasertok - Tokenizer from which to scan the elementref - optional reference object which can be used for resolving references to
 other objectsjava.io.IOException - if an I/O or formatting error occuredpublic void connectToHierarchy()
ModelComponentBase
 When this method is called, ModelComponent.getParent() will return
 the new parent component; the system will have set this beforehand.
connectToHierarchy in interface ModelComponentconnectToHierarchy in class ModelComponentBasepublic void disconnectFromHierarchy()
ModelComponentBase When this
 method is called, ModelComponent.getParent() will still return this original
 parent component; the system will set this to null after.
disconnectFromHierarchy in interface ModelComponentdisconnectFromHierarchy in class ModelComponentBasepublic void getSoftReferences(java.util.List<ModelComponent> refs)
updateReferences() method will
 be called to update its internal reference information.getSoftReferences in interface ModelComponentgetSoftReferences in class ModelComponentBaserefs - list to which soft references are appendedpublic void updateReferences(boolean undo,
                             java.util.Deque<java.lang.Object> undoInfo)
undo equal to false,
 this component should then examine its soft references and
 use ComponentUtils.isConnected()
 to determine which of them have been disconnected from the hierarchy.
 Disconnected references should be removed, and sufficient information
 should be appended to undoInfo to allow this update
 to be undone if this method is called later with undo 
 equal to true. When undoing an update, the undo
 information should be removed from the front of undoInfo.updateReferences in interface ModelComponentupdateReferences in class ModelComponentBaseundo - if true, indicates that the most
 recent reference update should be undone, using the supplied
 undo information.undoInfo - if undo is false, should be used
 to store information allowing the reference update to be undone.
 Otherwise, if undo is true, then this
 supplied information to undo the most recent update.public PolygonalMesh getCollisionMesh()
CollidableBodynull if there is no such mesh. If this method
 returns null, then no collisions will
 be performed for this collidable, regardless any default or explicit
 collision behaviors that have been arranged by the system.getCollisionMesh in interface CollidableBodypublic boolean hasDistanceGrid()
CollidableBodytrue if this Collidable supports a signed
 distance grid that can be used with a SignedDistanceCollider. At
 present, this will only be true for non-deformable bodies.hasDistanceGrid in interface CollidableBodytrue if this Collidable supports a signed
 distance gridpublic DistanceGrid getDistanceGrid()
CollidableBodynull if this Collidable
 does not support a signed distance grid (i.e., if 
 CollidableBody.hasDistanceGrid() returns false).getDistanceGrid in interface CollidableBodypublic Collidable.Collidability getCollidable()
CollidableCollidable.Collidability of this Collidable. This provides
 control over whether external and/or internal collisions are enabled for
 this Collidable. This setting takes precedence over default and
 explicitly requested collision behaviors.
 Note that for collisions to actually occur, they still need to be enabled through either a default or explicit collision behavior in the MechModel.
getCollidable in interface Collidablepublic void setCollidable(Collidable.Collidability c)
public Collidable getCollidableAncestor()
Collidablenull.getCollidableAncestor in interface Collidablenull.public boolean isCompound()
CollidableisCompound in interface Collidabletrue if this collidable has sub-collidablespublic boolean isDeformable()
Collidabletrue if this collidable is deformable. Whether or
 not a collidable is deformable determines how it responds to default
 collision behaviors involving deformable and rigid collidables. Also,
 self-collisions among sub-collidables of a collidable A are permitted
 only if A is deformable.isDeformable in interface Collidabletrue if this collidable is deformablepublic double getMass()
getMass in interface CollidableBodypublic void getVertexMasters(java.util.List<ContactMaster> mlist, Vertex3d vtx)
CollidableBodymlist. The list should not be cleared. The vertex
 should be a vertex of the mesh returned by CollidableBody.getCollisionMesh().getVertexMasters in interface CollidableBodymlist - collected master component informationvtx - vertex for which the master components are requestedpublic boolean containsContactMaster(CollidableDynamicComponent comp)
CollidableBodycontainsContactMaster in interface CollidableBodycomp - component to test fortrue if comp is contained in
 this Collidablepublic boolean allowCollision(ContactPoint cpnt, Collidable other, java.util.Set<Vertex3d> attachedVertices)
CollidableBodytrue if a collision between this Collidable
 and other should be allowed for the contact point
 cpnt. In making this decision, this method may
 refer to attachedVertices, which supplies a list
 of vertices on this Collidable which are attached in some way 
 to the other Collidable.allowCollision in interface CollidableBodycpnt - contact point being testedother - opposing collidableattachedVertices - list of vertices attached to other.true if the collision should be allowedpublic int getCollidableIndex()
getCollidableIndex in interface CollidableBodypublic void setCollidableIndex(int idx)
setCollidableIndex in interface CollidableBodypublic PointSkinAttachment createPointAttachment(Point pnt)
PointAttachablepnt
 to this component. It should not be assumed that pnt
 is currently connected to the component hierarchy, and no attempt
 should be made to connect the returned attachment to the hierarchy;
 the latter, if desired, is the responsibility of the caller.
 
 In some cases, it may not be possible to attach the point at its present location. In that case, the method will create an attachment to the nearest feasible location.
createPointAttachment in interface PointAttachablepnt - point for which an attachment should be createdpnt to this component