Esempio n. 1
0
 private IBody2 ConvertToTempIfNeeded(IBody2 body)
 {
     if (body.IsTemporaryBody())
     {
         return(body);
     }
     else
     {
         return(body.ICopy());
     }
 }
Esempio n. 2
0
        public CylinderParams GetBoundingCylinder(IBody2 body, double[] dir)
        {
            double[] xAxis = new double[] { 1, 0, 0 };
            double[] yAxis = new double[] { 0, 1, 0 };
            double[] zAxis = new double[] { 0, 0, 1 };

            bool           isAligned      = m_MathHelper.ArrayEqual(dir, yAxis);
            IMathTransform alignTransform = null;

            if (!isAligned)
            {
                alignTransform = m_MathHelper.GetTransformBetweenVectorsAroundPoint(
                    dir, yAxis, new double[] { 0, 0, 0 });

                IBody2 bodyCopy = body.ICopy();

                bodyCopy.ApplyTransform(alignTransform as MathTransform);

                body = bodyCopy;
            }

            double[] rootPt;
            double[] endPt;
            GetExtremePoints(body, yAxis, out rootPt, out endPt);

            double height = Math.Abs(endPt[1] - rootPt[1]);

            dir = new double[] { 0, endPt[1] - rootPt[1], 0 };

            List <double[]> perPoints = GetPerimeterPoints(body, xAxis, zAxis);
            List <Point>    points    = new List <Point>();

            foreach (double[] pt in perPoints)
            {
                points.Add(new Point(pt[0], pt[2]));
            }

            Circle cir = SmallestEnclosingCircle.MakeCircle(points);

            double[] circCenter = new double[] { cir.c.x, rootPt[1], cir.c.y };

            if (!isAligned)
            {
                circCenter = m_MathHelper.TransformPoint(circCenter, alignTransform.IInverse());
                dir        = m_MathHelper.TransformVector(dir, alignTransform.IInverse());
            }

            double radius = cir.r;

            return(new CylinderParams(height, circCenter, dir, radius));
        }
        private void CreateBodyForPreview(int trackCookie, ref List <IEdge> edges, ref IBody2 body)
        {
            var inputEdges = edges;

            try
            {
                for (int i = 0; i < inputEdges.Count; i++)
                {
                    var status = (swTrackingIDError_e)inputEdges[i].SetTrackingID(trackCookie, i);
                    if (status != swTrackingIDError_e.swTrackingIDError_NoError)
                    {
                        Logger.Log($"Failed to set tracking id: {status}");
                        throw new UserErrorException("Failed to track entity");
                    }
                }

                body = body.ICopy();

                var copiedEdges = body.GetEdges() as object[];

                if (copiedEdges != null)
                {
                    var trackedEdges = copiedEdges.Where(e =>
                    {
                        object trackIds;
                        if ((e as IEdge).GetTrackingIDs(trackCookie, out trackIds)
                            == (int)swTrackingIDError_e.swTrackingIDError_NoError)
                        {
                            if (trackIds != null && (trackIds as int[]).Length == 1)
                            {
                                if ((trackIds as int[]).First() < inputEdges.Count)
                                {
                                    return(true);
                                }
                            }

                            return(true);
                        }

                        return(false);
                    });

                    if (trackedEdges.Count() == inputEdges.Count)
                    {
                        edges = trackedEdges.Cast <IEdge>().ToList();
                    }
                    else
                    {
                        throw new UserErrorException("Failed to track entity");
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Log(ex);
                throw;
            }
            finally
            {
                inputEdges.ForEach(e =>
                {
                    var status = (swTrackingIDError_e)e.RemoveTrackingID(trackCookie);
                    if (status != swTrackingIDError_e.swTrackingIDError_NoError)
                    {
                        Logger.Log($"Failed to remove tracking id: {status}");
                        throw new UserErrorException("Failed to track entity");
                    }
                });
            }
        }