private bool TryFetchWay(TransportWayIdInterop wayIdInterop, out TransportWay way)
        {
            var wayInterop = new TransportWayInterop()
            {
                Id = wayIdInterop
            };


            bool success = NativeTransportApi_TryGetWayBufferSizes(NativePluginRunner.API, ref wayInterop);

            if (!success)
            {
                way = TransportWay.MakeEmpty();
                return(false);
            }

            var centerLinePointsBuffer         = new DoubleVector3[wayInterop.CenterLinePointsBufferSize];
            var centerLinePointsBufferGCHandle = GCHandle.Alloc(centerLinePointsBuffer, GCHandleType.Pinned);

            wayInterop.CenterLinePoints = centerLinePointsBufferGCHandle.AddrOfPinnedObject();

            var centerLineSplineParamsBuffer         = new double[wayInterop.CenterLineSplineParamsBufferSize];
            var centerLineSplineParamsBufferGCHandle = GCHandle.Alloc(centerLineSplineParamsBuffer, GCHandleType.Pinned);

            wayInterop.CenterLineSplineParams = centerLineSplineParamsBufferGCHandle.AddrOfPinnedObject();

            var classificationBuffer         = new byte[wayInterop.ClassificationBufferSize];
            var classificationBufferGCHandle = GCHandle.Alloc(classificationBuffer, GCHandleType.Pinned);

            wayInterop.Classification = classificationBufferGCHandle.AddrOfPinnedObject();

            success = NativeTransportApi_TryGetWay(NativePluginRunner.API, ref wayInterop);
            if (!success)
            {
                way = TransportWay.MakeEmpty();
                return(false);
            }

            var classification = Marshal.PtrToStringAnsi(wayInterop.Classification, wayInterop.ClassificationBufferSize - 1);

            way = new TransportWay(
                wayInterop.Id.FromInterop(),
                centerLinePointsBuffer,
                centerLineSplineParamsBuffer,
                wayInterop.LengthMeters,
                wayInterop.HalfWidthMeters,
                wayInterop.WayDirection,
                classification,
                wayInterop.AverageSpeedKph,
                wayInterop.ApproximateSpeedLimitKph
                );

            centerLinePointsBufferGCHandle.Free();
            centerLineSplineParamsBufferGCHandle.Free();
            classificationBufferGCHandle.Free();
            return(true);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// The TransportWay value associated with the given TransportWayId key.
 /// </summary>
 /// <param name="wayId">The id of the TransportWay to get.</param>
 /// <param name="way">On return, contains the value associated with transportWayId if found; else an empty
 /// value as returned by TransportWay.MakeEmpty().</param>
 /// <returns>True if a TransportWay object with Id equal to wayId was found, else false.</returns>
 public bool TryGetWay(TransportWayId wayId, out TransportWay way)
 {
     return(m_apiInternal.TryGetWay(wayId, out way));
 }
 public bool TryGetWay(TransportWayId wayId, out TransportWay way)
 {
     return(TryFetchWay(wayId.ToInterop(), out way));
 }