Search Results for

    Show / Hide Table of Contents

    Modifying Local Origin

    This example provides information on modifying the local coordinate position and orientation of a Part.

    Before Local Origin Change

    Before Local Change

    After Local Origin Change

    After Local Change

    Solution

    1. Save the current GlobalMatrix of the Part.

      // Save the current global transformation matrix of the part 
      Matrix4 oldGlobalMatrix = part.Transform.GlobalMatrix;
      
    2. Get the reference Transform of the part's parent, if it exists. This step ensures that transformations are relative to the parent coordinate system.

      // Get the parent's global transformation, if it exists  
      Transform refTrf = (part.Parent as IHasTransform)?.Transform;
      
    3. Create a new identity matrix and apply the position and orientation arguments to it using Translation and EulerZYX. Then, update the part's global transformation matrix.

      // Create and set the new transformation matrix for the part
      Matrix4 mat = Matrix4.Identity;
      mat.Translation = position;
      mat.EulerZYX = orientation;
      part.Transform.GlobalMatrix = (refTrf == null) ? mat : (refTrf.GlobalMatrix * mat);
      
    4. Calculate the transformation difference by comparing the new global matrix to the old one.

      // Calculate the transformation difference  
      Matrix4 newGlobalMatrix = part.Transform.GlobalMatrix;
      newGlobalMatrix.InvertRigid();
      Matrix4 diffTrans = newGlobalMatrix * oldGlobalMatrix;
      
    5. Move all bodies back to their original positions using the transformation difference. If the part has geometry, apply the transformation to each body. Otherwise, apply it to the entire mesh.

      // Move all the bodies back to the original position
      if (part.HasGeometry)
      {
          foreach (Body bd in part.Bodies)
          {
              bd.Transform.Matrix = diffTrans * bd.Transform.Matrix;
          }
      }
      else
      {
          part.Mesh.Transform(diffTrans);
          part.Mesh.Rebuild();
      }
      

    Example

    This function returns typesafe collection of all the Part objects in station.

    private static List<Part> GetStationParts()
    {
        var parts = new List<Part>();
        foreach (var component in Station.ActiveStation.GraphicComponents)
        {
            if (component is Part part)
            {
                parts.Add(part);
            }
        }
        return parts;
    }
    

    This is an example of how the local origin can be modified.

    private static void ApplyLocalChange(Part part, Vector3 position, Vector3 orientation)
    {
        Project.UndoContext.BeginUndoStep();
        try
        {
            if (part != null)
            {
                // Save the current global transformation matrix of the part 
                Matrix4 oldGlobalMatrix = part.Transform.GlobalMatrix;
    
                // Get the parent's global transformation, if it exists  
                Transform refTrf = (part.Parent as IHasTransform)?.Transform;
    
                // Create and set the new transformation matrix for the part
                Matrix4 mat = Matrix4.Identity;
                mat.Translation = position;
                mat.EulerZYX = orientation;
                part.Transform.GlobalMatrix = (refTrf == null) ? mat : (refTrf.GlobalMatrix * mat);
    
                // Calculate the transformation difference  
                Matrix4 newGlobalMatrix = part.Transform.GlobalMatrix;
                newGlobalMatrix.InvertRigid();
                Matrix4 diffTrans = newGlobalMatrix * oldGlobalMatrix;
    
                // Move all the bodies back to the original position
                if (part.HasGeometry)
                {
                    foreach (Body bd in part.Bodies)
                    {
                        bd.Transform.Matrix = diffTrans * bd.Transform.Matrix;
                    }
                }
                else
                {
                    part.Mesh.Transform(diffTrans);
                    part.Mesh.Rebuild();
                }
            }
        }
        catch
        {
            Project.UndoContext.CancelUndoStep(CancelUndoStepType.Rollback);
            throw;
        }
        finally
        {
            Project.UndoContext.EndUndoStep();
        }
    }
    

    This is an example of how ApplyLocalChange can be used:

    // Get all CAD parts from station
    List<Part> partList = GetStationParts();
    
    // Set new position
    Vector3 position = new Vector3(2.0, 2.0, 2.0);
    
    // Set new orientation
    Vector3 orientation = new Vector3(Globals.DegToRad(90), Globals.DegToRad(30), Globals.DegToRad(30));
    
    // Adjust local origin
    foreach (Part part in partList)
    {
        ApplyLocalChange(part, position, orientation);
    }
    

    Required Namespaces

    ABB.Robotics.RobotStudio

    ABB.Robotics.RobotStudio.Stations

    ABB.Robotics.Math

    See Also

    • Modify Position
    In this article
    Back to top Copyright © 2026 ABB Robotics