Beispiel #1
0
        /// <summary>
        ///     TODO
        /// </summary>
        /// <param name="boxCenter"></param>
        /// <returns></returns>
        private bool FixMatrix(Point3d boxCenter)
        {
            var flag = false;

            if (AsymmetryVector.Z.IsLessThanTol() &&
                (AsymmetryVector.X + AsymmetryVector.Y > 0 ||
                 (AsymmetryVector.X + AsymmetryVector.Y).IsLessThanTol() &&
                 AsymmetryVector.X > 0))
            {
                var matrix3D = Matrix3d.Rotation(3.14159265358979, new Vector3d(0, 1, 0), boxCenter);
                LayMatrix       = matrix3D * LayMatrix;
                AsymmetryVector = AsymmetryVector.TransformBy(matrix3D);
                flag            = true;
            }

            if (AsymmetryVector.Y.IsLessThanTol())
            {
                if (!AsymmetryVector.X.IsLessThanTol() && AsymmetryVector.X > 0)
                {
                    var matrix3D1 = Matrix3d.Rotation(3.14159265358979, new Vector3d(0, 0, 1), boxCenter);
                    LayMatrix       = matrix3D1 * LayMatrix;
                    AsymmetryVector = AsymmetryVector.TransformBy(matrix3D1);
                    flag            = true;
                }
            }
            else if (AsymmetryVector.Y > 0)
            {
                var matrix3D2 = Matrix3d.Rotation(3.14159265358979, new Vector3d(0, 0, 1), boxCenter);
                LayMatrix       = matrix3D2 * LayMatrix;
                AsymmetryVector = AsymmetryVector.TransformBy(matrix3D2);
                flag            = true;
            }

            return(flag);
        }
Beispiel #2
0
 /// <summary>
 ///     TODO
 /// </summary>
 /// <param name="compEnt"></param>
 /// <returns></returns>
 public bool Equals(EntInfo compEnt)
 {
     if (!IsEqualSize(compEnt))
     {
         return(false);
     }
     if (Asymmetry != 0.0 || compEnt.Asymmetry != 0.0)
     {
         return(Asymmetry.IsEqualSize(compEnt.Asymmetry) &&
                AsymmetryVector.IsEqualTo(compEnt.AsymmetryVector, CalcTol.UnitVector) &&
                Math.Sign(AsymmetryVector.X) == Math.Sign(compEnt.AsymmetryVector.X) &&
                Math.Sign(AsymmetryVector.Y) == Math.Sign(compEnt.AsymmetryVector.Y) &&
                Math.Sign(AsymmetryVector.Z) == Math.Sign(compEnt.AsymmetryVector.Z));
     }
     return(true);
 }
Beispiel #3
0
        /// <summary>
        ///     TODO
        /// </summary>
        /// <param name="mirCheck"></param>
        /// <returns></returns>
        public bool IsMirrorOf(EntInfo y)
        {
            if (Asymmetry == 0 || y.Asymmetry == 0)
            {
                return(false);
            }

            if (AsymmetryVector.IsEqualTo(y.AsymmetryVector, CalcTol.UnitVector))
            {
                if (!AsymmetryVector.X.IsEqualTo(y.AsymmetryVector.X))
                {
                    return(true);
                }
                if (!AsymmetryVector.Y.IsEqualTo(y.AsymmetryVector.Y))
                {
                    return(true);
                }
                if (!AsymmetryVector.Z.IsEqualTo(y.AsymmetryVector.Z))
                {
                    return(true);
                }

                return(false);
            }

            if (!AsymmetryVector.X.IsEqualTo(y.AsymmetryVector.X))
            {
                return(true);
            }
            if (!AsymmetryVector.Y.IsEqualTo(y.AsymmetryVector.Y))
            {
                return(true);
            }
            if (!AsymmetryVector.Z.IsEqualTo(y.AsymmetryVector.Z))
            {
                return(true);
            }

            return(false);
        }
Beispiel #4
0
        /// <summary>
        ///     TODO
        /// </summary>
        /// <param name="acSol"></param>
        private void ReadEntity(Solid3d acSol, Database acCurDb, Transaction acTrans)
        {
            RcName       = acSol.GetPartName();
            ParentHandle = acSol.GetParent();
            ChildHandles = acSol.GetChildren();
            IsSweep      = acSol.GetIsSweep();
            IsMirror     = acSol.GetIsMirror();
            RcInfo       = acSol.GetPartInfo();
            RcQtyOf      = acSol.GetQtyOf();
            RcQtyTotal   = acSol.GetQtyTotal();
            TxDirection  = acSol.GetTextureDirection();

            GetRotationMatrices(acSol);
            GetLayMatrix(acSol);

            if (LayMatrix == new Matrix3d())
            {
                LayMatrix = GetAbstractMatrix(acSol);
            }

            using (var solCopy = acSol.Clone() as Solid3d)
            {
                if (solCopy != null)
                {
                    if (LayMatrix != Matrix3d.Identity)
                    {
                        solCopy.TransformBy(LayMatrix);
                    }

                    //Get Volume & Extents
                    Extents  = solCopy.GetBounds();
                    MinExt   = Extents.MinPoint;
                    MaxExt   = Extents.MaxPoint;
                    Centroid = solCopy.MassProperties.Centroid;
                    Box      = Extents.Volume();
                    Volume   = acSol.Volume();
                }
            }

            var identity = Matrix3d.Identity;

            if ((MaxExt.Z + MinExt.Z) / 2 < 0)
            {
                var vector3D = new Vector3d(0, 1, 0);
                identity   = Matrix3d.Rotation(3.14159265358979, vector3D, new Point3d());
                LayMatrix *= identity;
            }

            if (IsBox)
            {
                Asymmetry = 0;
            }
            else
            {
                var boxCen = GetBoxCenter(MinExt, MaxExt).RoundToTolerance();

                AsymmetryVector = boxCen.GetVectorTo(Centroid.RoundToTolerance());
                AsymmetryVector = AsymmetryVector.TransformBy(identity);
                Asymmetry       = AsymmetryVector.Length;

                if (!Asymmetry.IsLessThanTol())
                {
                    Asymmetry = Asymmetry.RoundToTolerance();
                }
                else
                {
                    Asymmetry = 0;
                }

                AsymmetryVector = AsymmetryVector.RoundToTolerance();

                if (Asymmetry > 0)
                {
                    FixMatrix(boxCen);
                }

                AsymString = AsymVStr(AsymmetryVector);
            }

            //Get length, width, thickness

            if (IsSweep)
            {
                //TODO
            }
            else
            {
                var measures = new List <double>(3)
                {
                    MaxExt.X - MinExt.X,
                    MaxExt.Y - MinExt.Y,
                    MaxExt.Z - MinExt.Z
                };

                measures.Sort();

                if (TxDirection == TextureDirection.Across)
                {
                    Width  = measures[2].RoundToTolerance();
                    Length = measures[1].RoundToTolerance();
                }
                else
                {
                    Length = measures[2].RoundToTolerance();
                    Width  = measures[1].RoundToTolerance();
                }

                Thickness = measures[0].RoundToTolerance();
            }

            //Add the XData
            acSol.AddXData(this, acCurDb, acTrans);
        }
Beispiel #5
0
 /// <summary>
 ///     TODO
 /// </summary>
 /// <returns></returns>
 public override int GetHashCode()
 {
     return(Length.GetHashCode() + Width.GetHashCode() + Thickness.GetHashCode() +
            Volume.GetHashCode() + Asymmetry.GetHashCode() +
            (Asymmetry == 0.0 ? 0 : AsymmetryVector.GetHashCode()));
 }