This code seems like works
My apologies, it's not very clean😀
So what it does - it gets angles, finds if they have any connected bolts from one or other side (by getting its Z vector), and sets UCS from the bolt side
I also tried to add possibility that bolt can be not perpendicular to the angle, so Z vector is not parallel to Y or Z vector of the angle
In the end I set CS to WCS
using Autodesk.AdvanceSteel.DocumentManagement;
using Autodesk.AdvanceSteel.Modelling;
using AAG = Autodesk.AutoCAD.Geometry;
using System.Collections.Generic;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AdvanceSteel.CADLink.Database;
using Autodesk.AdvanceSteel.CADAccess;
using AAA = Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AdvanceSteel.Runtime;
using Autodesk.AutoCAD.Internal;
namespace SomeNameSpace
{
public partial class SomeClass
{
[CommandMethodAttribute("TEST_GROUP", "SETUCS", "SETUCS", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw)]
public void SETUCS()
{
UCSSetter uCSSetter = new UCSSetter();
}
}
public class UCSSetter
{
ConterPointsAndVectorsInitializer pointsAndVectorsInitializer;
Editor ed;
ObjectsGetter anglesGetter;
public UCSSetter()
{
using (DocumentAccess da = new DocumentAccess(null, false))
{
anglesGetter = new ObjectsGetter();
ed = AAA.Application.DocumentManager.MdiActiveDocument.Editor;
SetMainView();
SetWCS(ed);
}
}
public void SetMainView()
{
foreach (Beam beam in anglesGetter.ObjectsTypeOfBeam)
{
SetWCS(ed);
pointsAndVectorsInitializer = new ConterPointsAndVectorsInitializer(beam);
AAG.Point3d angleCenterPoint = new AAG.Point3d(pointsAndVectorsInitializer.CenterPoint.x,
pointsAndVectorsInitializer.CenterPoint.y,
pointsAndVectorsInitializer.CenterPoint.z);
AAG.Vector3d vxx = new AAG.Vector3d(pointsAndVectorsInitializer.VectorXBuild.x,
pointsAndVectorsInitializer.VectorXBuild.y, pointsAndVectorsInitializer.VectorXBuild.z);
AAG.Vector3d vyy = new AAG.Vector3d(pointsAndVectorsInitializer.VectorYBuild.x,
pointsAndVectorsInitializer.VectorYBuild.y,
pointsAndVectorsInitializer.VectorYBuild.z);
AAG.CoordinateSystem3d angleCoordSystem = new AAG.CoordinateSystem3d(angleCenterPoint, vxx, vyy);
AAG.Matrix3d ecs = AAG.Matrix3d.AlignCoordinateSystem(AAG.Point3d.Origin, AAG.Vector3d.XAxis, AAG.Vector3d.YAxis, AAG.Vector3d.ZAxis,
angleCoordSystem.Origin, angleCoordSystem.Xaxis, angleCoordSystem.Yaxis, angleCoordSystem.Zaxis);
ed.CurrentUserCoordinateSystem = ecs;
SelectObjects(new List<ObjectId>() { beam.GetObjectId() });
ed.Command(new object[] { "_AstM14SetAssemblyDetCS" });
}
}
private static void SetWCS(Editor ed)
{
AAG.CoordinateSystem3d WCS = new AAG.CoordinateSystem3d(AAG.Point3d.Origin, AAG.Vector3d.XAxis, AAG.Vector3d.YAxis);
AAG.Matrix3d WCSMatr = AAG.Matrix3d.AlignCoordinateSystem (WCS.Origin, WCS.Xaxis, WCS.Yaxis, WCS.Zaxis,
AAG.Point3d.Origin, AAG.Vector3d.XAxis, AAG.Vector3d.YAxis, AAG.Vector3d.ZAxis);
ed.CurrentUserCoordinateSystem = WCSMatr;
}
void SelectObjects(List<ObjectId> objectsToSelect)
{
if (objectsToSelect.Count > 0)
{
List<Autodesk.AutoCAD.DatabaseServices.ObjectId> AutocadObjIDs = new List<Autodesk.AutoCAD.DatabaseServices.ObjectId>();
foreach (ObjectId item in objectsToSelect)
{
ObjectId itemObjectID = DatabaseManager.GetReprId(DatabaseManager.Open(item, FilerObject.eOpenMode.kNormal));
AutocadObjIDs.Add(new Autodesk.AutoCAD.DatabaseServices.ObjectId(itemObjectID.AsOldId()));
}
Utils.SelectObjects(AutocadObjIDs.ToArray());
}
}
}
}
public class ObjectsGetter
{
public List<ObjectId> selectedObjID { get; } = UserInteraction.SelectObjects();
public List<Beam> ObjectsTypeOfBeam { get; set; }
public List<PlateBase> Plates { get; private set; }
public ObjectsGetter()
{
ObjectsTypeOfBeam = new List<Beam>();
Plates = new List<PlateBase>();
GetObjectsFromSelection();
}
void GetObjectsFromSelection()
{
FilerObject selectedObject;
try
{
if (selectedObjID != null && selectedObjID.Count > 0)
{
for (int i = 0; i <= selectedObjID.Count - 1; i++)
{
try
{
i = GetNextNotNullIDobjectIndex(selectedObjID, i);
}
catch (IndexOutOfRangeException ex)
{
MessageBox.Show(ex.Message + " in object getter");
break;
}
selectedObject = DatabaseManager.Open(selectedObjID[i]);
if (selectedObject.IsKindOf(FilerObject.eObjectType.kBeam))
{
ObjectsTypeOfBeam.Add(selectedObject as Beam);
}
else if (selectedObject.IsKindOf(FilerObject.eObjectType.kPlateBase))
{
Plates.Add(selectedObject as PlateBase);
}
else if (selectedObject.IsKindOf(FilerObject.eObjectType.kBoltPattern))
{
BoltPattern bolt = selectedObject as BoltPattern;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public int GetNextNotNullIDobjectIndex(List<ObjectId> selectedObjID, int currentindex)
{
while ((DatabaseManager.Open(selectedObjID[currentindex]) == null) && (currentindex <= selectedObjID.Count - 1))
{
currentindex++;
if (currentindex > selectedObjID.Count - 1)
{
throw new IndexOutOfRangeException();
}
}
return currentindex;
}
}
public class ConterPointsAndVectorsInitializer
{
public Point3d CenterPoint { get; private set; }
private Beam angle;
private Vector3d vectorXBuild;
private Vector3d vectorYBuild;
private Vector3d vectorZBuild;
public Vector3d VectorXBuild
{
get
{
return vectorXBuild;
}
set
{
vectorXBuild = value;
}
}
public Vector3d VectorYBuild
{
get
{
return vectorYBuild;
}
private set
{
vectorZBuild = value;
}
}
public Vector3d VectorZBuild
{
get
{
return vectorZBuild;
}
set
{
vectorZBuild = value;
}
}
public ConterPointsAndVectorsInitializer(Beam angle)
{
using (DocumentAccess da = new DocumentAccess(null, false))
{
this.angle = angle;
if (angle != null)
{
CenterPoint = GetCenterPoint();
InitializeVectors();
}
}
}
private Point3d GetCenterPoint()
{
return angle.CenterPoint;
}
private void InitializeVectors()
{
angle.PhysCSStart.GetCoordSystem(out Point3d BeamStart, out Vector3d vectorX,
out Vector3d vectorY, out Vector3d vectorZ);
vectorXBuild = new Vector3d(vectorX);
vectorYBuild = new Vector3d(-vectorY);
vectorZBuild = new Vector3d(vectorZ);
Vector3d boltZVector = GetBoltZVector(GetBolt());
if (boltZVector != null)
{
double angleRad = boltZVector.GetAngleTo(vectorZBuild);
if (Math.Abs(angleRad) > Math.PI / 4 && Math.Abs(angleRad) < 3 * Math.PI / 4)
{
RotateBuildVectors(ref vectorXBuild, ref vectorYBuild, ref vectorZBuild, vectorX, vectorY, vectorZ);
}
}
}
private BoltPattern GetBolt()
{
int number = angle.NumberOfDrivenConObj;
for (int i = 0; i < number; i++)
{
PassiveConstructionObject bolts = angle.GetDrivenConObj(i);
ConnectionConstructionObject boltsconn = bolts as ConnectionConstructionObject;
Autodesk.AdvanceSteel.Connection.Connection con = boltsconn.GetConnection();
if (con.getMeans(0).IsKindOf(FilerObject.eObjectType.kBoltPattern))
{
BoltPattern bolt = con.getMeans(0) as BoltPattern;
return bolt;
}
}
return null;
}
private Vector3d GetBoltZVector(BoltPattern bolt)
{
if (bolt != null)
{
bolt.CS.GetCoordSystem(out Point3d BeamStart, out Vector3d vectorX, out Vector3d vectorY, out Vector3d vectorZ);
return vectorZ;
}
return null;
}
private void RotateBuildVectors(ref Vector3d vectorXBuild, ref Vector3d vectorYBuild, ref Vector3d vectorZBuild,
Vector3d vectorX, Vector3d vectorY, Vector3d vectorZ)
{
vectorXBuild = -vectorX;
vectorYBuild = -vectorZ;
vectorZBuild = vectorY;
}
}