750x
004789
23. Oktober 2020

Frage

Wie kann man mit Hilfe der COM-Schnittstelle ein benutzerdefiniertes Koordinatensystem anlegen und es dann einem Knotenlager zuweisen?


Antwort:

Bei der Programmierung mit der COM-Schnittstelle besitzt ein Knotenlager die Eigenschaft 'ReferenceSystem' und 'UserDefinedReferenceSystem'. Mit 'ReferenceSystem' kann die Art (z. B. "Gedreht" oder "Koordinatensystem") des benutzerdefinierten Koordinatensystems festgelegt werden und je nachdem, welche Art gewählt wurde, wird dann über 'UserDefinedReferenceSystem' diese Art definiert.

Im folgenden Beispiel wurde als Art "Koordinatensystem" eingestellt und außerdem dafür ein benutzerdefiniertes Koordinatensystem angelegt:

//  create user defined coordinate system
IGuideObjects iGuide = iModel.GetGuideObjects();

//  delete cosy No 2
UserCoordinateSystem[] csList = iGuide.GetCoordinateSystems();
if (csList.Length > 1)
{
    for (int i = 0; i < csList.Length; ++i)
    {
        if (csList[i].No == 2)
        {
            iGuide.PrepareModification();
            iGuide.DeleteObjects(GuideObjectType.CoordinateSystemObject, "2");
            iGuide.FinishModification();
        }
    }
}

//  define new cosy No 2
UserCoordinateSystem uCs = new UserCoordinateSystem();
uCs.Name = "test";
uCs.Comment = "test";
uCs.No = 2;
uCs.IsValid = true;

uCs.Origin.X = 1;
uCs.Origin.Y = 0;
uCs.Origin.Z = 1;

uCs.Point1.X = 2;
uCs.Point1.Y = 0;
uCs.Point1.Z = 1;

uCs.Point2.X = 1;
uCs.Point2.Y = 1;
uCs.Point2.Z = 2;

//  set cosy No 2
iGuide.PrepareModification();
iGuide.SetCoordinateSystem(uCs);
iGuide.FinishModification();

//  create nodal support with user defined cosy
NodalSupport ns = new NodalSupport();

ns.SupportConstantX = -1;
ns.SupportConstantY = -1;
ns.SupportConstantZ = -1;

ns.RestraintConstantX = -1;
ns.RestraintConstantY = 0;
ns.RestraintConstantZ = -1;

ns.Comment = "user defined cosy";
ns.NodeList = "1";
ns.ReferenceSystem = ReferenceSystemType.UserDefinedSystemType;

ns.UserDefinedReferenceSystem.ObjectNo = 2;
ns.UserDefinedReferenceSystem.Type = UserDefinedAxisSystemType.DefinedCoordinateSystemType;

iModData.PrepareModification();
iModData.SetNodalSupport(ns);
iModData.FinishModification();

Um das Koordinatensystem anlegen zu können, wird das Interface für die Hilfsobjekte benötigt: 'IGuideObjects'. Mit der Funktion 'DeleteObjects()' wird zunächst ein vorhandenes Koordinatensystem mit der Nummer 2 gelöscht und mit 'SetCoordinateSystem()' ein neues angelegt. Zu beachten ist wieder der 'Prepare/Finish-Modification'-Block, um das neue Element übergeben zu können.

Das Knotenlager wird über das Interface 'IModelData' übergeben. Auch hier ist ein 'Prepare/Finish-Modification'-Block nötig.