/// <summary>
        /// Examines mesh objects and logs a description of what it finds right or wrong.
        /// The various properties the function checks for are described in MeshCheckParameters.
        /// </summary>
        /// <param name="meshObjects">A collection of mesh objects.</param>
        /// <param name="textLog">The text log.</param>
        /// <param name="parameters">The mesh checking parameter and results.</param>
        /// <returns>true if successful, false otherwise.</returns>
        /// <since>7.0</since>
        public static bool CheckMeshes(IEnumerable <MeshObject> meshObjects, Pixel.Rhino.FileIO.TextLog textLog, ref MeshCheckParameters parameters)
        {
            if (null == textLog)
            {
                throw new ArgumentNullException(nameof(textLog));
            }
            var    rharray         = new Runtime.InternalRhinoObjectArray(meshObjects);
            IntPtr ptr_const_array = rharray.NonConstPointer();
            IntPtr ptr_textlog     = textLog.NonConstPointer();

            return(UnsafeNativeMethods.RHC_RhinoCheckMesh2(ptr_const_array, ptr_textlog, ref parameters));
        }
Exemple #2
0
        /// <summary>
        /// Compare intersection events.
        /// </summary>
        /// <param name="eventA">The first intersection event to compare.</param>
        /// <param name="eventB">The second intersection event to compare.</param>
        /// <param name="relativePointTolerance">The comparison tolerance. If RhinoMath.UnsetValue, then RhinoMath.SqrtEpsilon is used.</param>
        /// <param name="log">If not null and false is returned, then a description of the error is appended to log.</param>
        /// <returns></returns>
        /// <since>7.0</since>
        public static bool CompareEquivalent(IntersectionEvent eventA, IntersectionEvent eventB, double relativePointTolerance, Pixel.Rhino.FileIO.TextLog log)
        {
            // compare to match
            if (relativePointTolerance == RhinoMath.UnsetValue)
            {
                relativePointTolerance = RhinoMath.SqrtEpsilon;
            }

            bool rc = true;

            if (eventA.m_type != eventB.m_type)
            {
                if (log != null)
                {
                    log.Print("Event types mismatch.");
                }
                rc = false;
            }
            else
            {
                for (int ei = 0; ei < 2; ei++)
                {
                    if (ei == 1 && eventA.m_type != 4) // ON_X_EVENT::TYPE::csx_overlap
                    {
                        continue;
                    }

                    Point3d AActual = (ei == 0) ? eventA.m_A0 : eventA.m_A1;
                    Point3d BActual = (ei == 0) ? eventA.m_B0 : eventA.m_B1;
                    Point3d AExp    = (ei == 0) ? eventB.m_A0 : eventB.m_A1;
                    Point3d BExp    = (ei == 0) ? eventB.m_B0 : eventB.m_B1;

                    double sz   = AExp.MaximumCoordinate;
                    double dist = AActual.DistanceTo(AExp);
                    if (dist > relativePointTolerance * (1 + sz))
                    {
                        if (log != null)
                        {
                            log.Print("Event mismatch. Distance between expected and actual m_A{0} was {1}.\n", ei * 2, dist);
                        }
                        rc = false;
                    }

                    dist = BActual.DistanceTo(BExp);
                    if (dist > relativePointTolerance * (1 + sz))
                    {
                        if (log != null)
                        {
                            log.Print("Event mismatch. Distance between expected and actual m_B{0} was {1}.\n", ei * 2, dist);
                        }
                        rc = false;
                    }
                }
            }
            return(rc);
        }