Click or drag to resize
GraphicComponentGetNormalToSurface Method

Note: This API is now obsolete.

Calculates the closest point and the corresponding normal.

Namespace:  ABB.Robotics.RobotStudio.Stations
Assembly:  ABB.Robotics.RobotStudio.Stations (in ABB.Robotics.RobotStudio.Stations.dll) Version: 7.0.8747.636
Syntax
C#
[ObsoleteAttribute("Use TryGetNormalToSurface instead.")]
public void GetNormalToSurface(
	Vector3 testPoint,
	out Vector3 hitPoint,
	out Vector3 hitPointNormal,
	out Face hitFace
)

Parameters

testPoint
Type: ABB.Robotics.MathVector3
The test point, in world coordinates.
hitPoint
Type: ABB.Robotics.MathVector3
The closest point, in world coordinates.
hitPointNormal
Type: ABB.Robotics.MathVector3
Normal to the closest point, in world coordinates. May contain NaN values on failure.
hitFace
Type: ABB.Robotics.RobotStudio.StationsFace
The face of the closest point. If the closest point is on an edge or vertex, hitFace will be null.
Remarks
If this GraphicComponent does not contain geometric information the result will be an approximation, and hitFace will be null.
Examples
GetNormalToSurface.
Part Properties Example
Project.UndoContext.BeginUndoStep("PartProperties");
try
{
    Station station = Station.ActiveStation;

    // Create a part.
    #region PartPropertiesStep1
    Part myPart1 = new Part();
    myPart1.Name = "MyPart_1";
    #endregion

    // Add the part to the graphics componenets collection of the station.
    #region PartPropertiesStep2
    station.GraphicComponents.Add(myPart1);
    #endregion

    // Create a box and add it to myPart.
    #region PartPropertiesStep3
    Matrix4 box_origin = new Matrix4(Vector3.XVector, 0.0);
    Vector3 box_size = new Vector3(0.1, 0.1, 0.1);
    Body box = Body.CreateSolidBox(box_origin, box_size);
    box.Name = "MyBox";
    myPart1.Bodies.Add(box);
    #endregion

    // Create a cylinder and add it to myPart.
    #region PartPropertiesStep4
    Matrix4 origin = new Matrix4(new Vector3(Axis.X), 0.0);
    double radius = 0.2;
    double height = 1.0;
    Body myCylinder = Body.CreateSolidCylinder(origin, radius, height);
    myCylinder.Name = "MyCylinder";
    myPart1.Bodies.Add(myCylinder);
    #endregion

    // Make all the geometries in myPart orange.
    // When using VSTA, change to these lines instead:
    // Byte R1 = 255; Byte G1 = 165; Byte B1 = 0;
    // VSTABridge.SetColor(myPart, R1, G1, B1);
    #region PartPropertiesStep5
    myPart1.Color = Color.Orange;
    #endregion

    #region PartPropertiesStep6
    myPart1.Visible = true;
    #endregion
    myPart1.PickingEnabled = true;

    // Move myPart and all the bodies in it 100 mm along the 
    //X-axis and 100 mm along the Y-axis.
    #region PartPropertiesStep7
    myPart1.Transform.X = myPart1.Transform.X + 0.1;
    myPart1.Transform.Y = myPart1.Transform.Y + 0.1;
    #endregion

    // Create a copy of myPart.
    #region PartPropertiesStep8
    Part myPart2 = (Part)myPart1.Copy();
    myPart2.Name = "MyPart_2";
    #endregion

    // Add myPart2 to the station.
    #region PartPropertiesStep9
    station.GraphicComponents.Add(myPart2);
    #endregion
    #region PartPropertiesStep10
    GraphicComponentLibrary myLib = myPart2.MoveDefinitionToLibrary();
    Logger.AddMessage(
      new LogMessage("The RootComponent of the Lib is: " + myLib.RootComponent.Name));

    // Save a copy of the lib.
    // Get the path to the UserProjectsFolder.
    string userProjPath =
        (string)Options.GetValue("RobotStudio", "Directories.UserProjects");
    if (userProjPath != null)
    {
        myLib.SaveAs(userProjPath + "\\Libraries\\myLib.rslib");
    }
    else
    {
        // If there is no UserprojPath, save it in user documents.
        myLib.SaveAs(Path.Combine
        (System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments), "myLib.rslib"));
    }
    #endregion

    // Create a new instance of myPart.
    #region PartPropertiesStep11
    Part myPart3 = (Part)myPart1.CopyInstance();
    #endregion

    // Add myPart3 to the station.
    station.GraphicComponents.Add(myPart3);

    // Delete the geometry of myPart3, this causes 
    // the geometry of myPart1 to be deleted to,
    // since they use the same definition.
    #region PartPropertiesStep12
    myPart3.DeleteGeometry();
    #endregion

    // Disconnect myPart2 from its library.
    #region PartPropertiesStep13
    myPart2.DisconnectFromLibrary();
    #endregion

    // Get the normal of myPart2
    #region PartPropertiesStep14
    BoundingBox bbox = myPart2.GetBoundingBox(true);
    Vector3 firstCorner = bbox.min;
    Vector3 secondCorner = bbox.max;
    Logger.AddMessage
        (new LogMessage("The first corner of the bounding box is ( "
        + firstCorner.x + "; " + firstCorner.y + "; " + firstCorner.z + ")"));
    Logger.AddMessage
        (new LogMessage("The second corner of the bounding box is ( "
        + secondCorner.x + "; " + secondCorner.y + "; " + secondCorner.z + ")"));
    Vector3 testPoint = new Vector3(0.0, 0.0, 0.0);
    Vector3 hitPoint;
    Vector3 hitPointNormal;
    Face hitFace;
    myPart2.GetNormalToSurface(testPoint, out hitPoint, out hitPointNormal, out hitFace);
    #endregion

    // Make the hitFace green.
    // When using VSTA, change to these lines instead:
    // Byte R = 0; Byte G = 255; Byte B = 0;
    // VSTABridge.SetColor(hitFace, R, G, B);
    hitFace.Color = Color.Green;

    Logger.AddMessage
     (new LogMessage("The hit point from GetNormalToSurface at test point (0,0,0) is: ( "
     + hitPoint.x + "; " + hitPoint.y + "; " + hitPoint.z + ")"));
    Logger.AddMessage
     (new LogMessage("The hit point normal from GetNormalToSurface at test point (0,0,0) is: ( "
     + hitPointNormal.x + "; " + hitPointNormal.y + "; " + hitPointNormal.z + ")"));
}
catch
{
    Project.UndoContext.CancelUndoStep(CancelUndoStepType.Rollback);
    throw;
}
finally
{
    Project.UndoContext.EndUndoStep();
}
Version Information

Obsolete (compiler warning) in 1.0.0.0
See Also