// obtain a list of positions of control points in an arbitrary way, first two positions are used for connector positions, the rest for cable's control points
List<TransformProperty<LengthProperty>> controlPointPositions = ...;
// Initialization of api and documents.
HpdApi api = HpdApi.GetInstance();
api.Init();
Project proj = api.OpenProject($"{pathToMyProject}");
Variant variant = proj.GetVariants().First();
Workspace workspace = variant.GetWorkspaces().First();
workspace.Open(false, false);
// Fetching library parts of connectors and ribbon cable
BaseLibCable ribbonCableLib = (BaseLibCable)proj.ActiveConnection.GetLibraryPartsByPartNumber($"{ribbonCableLibPartNumber}").FirstOrDefault();
BaseLibConnector ribbonConnector = (BaseLibConnector)proj.ActiveConnection.GetLibraryPartsByPartNumber($"{ribbonConnectorLibPartNumber}").FirstOrDefault();
var zeroRotation = new TransformProperty<AngleProperty>(new AngleProperty(0, Unit.Degree), new AngleProperty(0, Unit.Degree), new AngleProperty(0, Unit.Degree));
// Place connectors (assume they have a ribbon super pin)
IConnectableObjectBase conn1 = workspace.PlaceConnectableObject(ribbonConnector, controlPointPositions[0], zeroRotation);
IConnectableObjectBase conn2 = workspace.PlaceConnectableObject(ribbonConnector, controlPointPositions[1], zeroRotation);
// Get ribbon pins from connectors
IOccRibbonPin pin1 = conn1.Children.FirstOrDefault(ch => ch is IOccRibbonPin) as IOccRibbonPin;
IOccRibbonPin pin2 = conn2.Children.FirstOrDefault(ch => ch is IOccRibbonPin) as IOccRibbonPin;
// Place ribbon cable with mandatory accessories.
IOccRibbonCable cable = workspace.PlaceRibbonCable(ribbonCableLib as LibRibbonCable, pin1, pin2, controlPointPositions.Skip(2).ToList(), new List<Connection>(), ApiLinkType.Mandatory);
// Save documents
workspace.Save();
workspace.Close();
proj.Save();
proj.Close();
api.Close();