Esempio n. 1
0
        public override void MoveSelectedPointsFromStored(DrawContext dc, Vector3d delta)
        {
            CadVertex cp = StoreList[0];

            if (cp.Selected)
            {
                mPointList[0] = cp + delta;
                mPointList[1] = StoreList[1] + delta;
                mPointList[2] = StoreList[2] + delta;
                mPointList[3] = StoreList[3] + delta;
                mPointList[4] = StoreList[4] + delta;
                return;
            }

            StackArray <CadVertex> vt = default;

            vt[0]     = StoreList[1] - cp;
            vt[1]     = StoreList[2] - cp;
            vt[2]     = StoreList[3] - cp;
            vt[3]     = StoreList[4] - cp;
            vt.Length = 4;

            if (vt[0].Norm() < 0.01)
            {
                return;
            }

            int ai = -1;

            for (int i = 0; i < 4; i++)
            {
                if (StoreList[i + 1].Selected)
                {
                    ai = i;
                    break;
                }
            }

            if (ai < 0)
            {
                return;
            }

            int bi = (ai + 1) % 4;
            int ci = (ai + 2) % 4;
            int di = (ai + 3) % 4;

            Vector3d normal = CadMath.CrossProduct(vt[ai].vector, vt[bi].vector);

            normal = normal.UnitVector();

            vt[ai] += delta;

            CadVertex uva = vt[ai].UnitVector();
            CadVertex uvb = vt[bi].UnitVector();

            if (!uva.EqualsThreshold(uvb))
            {
                normal = CadMath.CrossProduct(vt[ai].vector, vt[bi].vector);

                if (normal.IsZero())
                {
                    return;
                }

                normal = normal.UnitVector();
            }

            CadQuaternion q = CadQuaternion.RotateQuaternion(normal, Math.PI / 2.0);
            CadQuaternion r = q.Conjugate();

            CadQuaternion qp = CadQuaternion.FromPoint(vt[ai].vector);

            qp = r * qp;
            qp = qp * q;

            vt[bi] = (CadVertex)qp.ToPoint();

            vt[ci] = -vt[ai];
            vt[di] = -vt[bi];

            CadVertex tmp;

            for (int i = 0; i < vt.Length; i++)
            {
                tmp          = vt[i];
                tmp.Selected = false;
                vt[i]        = tmp;
            }

            tmp          = vt[ai];
            tmp.Selected = true;
            vt[ai]       = tmp;

            mPointList[1] = vt[0] + cp;
            mPointList[2] = vt[1] + cp;
            mPointList[3] = vt[2] + cp;
            mPointList[4] = vt[3] + cp;
        }
Esempio n. 2
0
        public RulerInfo Capture(DrawContext dc, CadCursor cursor, double range)
        {
            RulerInfo ret = default(RulerInfo);

            Vector3d cwp = dc.DevPointToWorldPoint(cursor.Pos);

            Vector3d xfaceNormal = dc.DevVectorToWorldVector(cursor.DirX);
            Vector3d yfaceNormal = dc.DevVectorToWorldVector(cursor.DirY);

            Vector3d cx = CadMath.CrossPlane(P0, P1, cwp, xfaceNormal);
            Vector3d cy = CadMath.CrossPlane(P0, P1, cwp, yfaceNormal);

            if (!cx.IsValid() && !cy.IsValid())
            {
                return(ret);
            }

            Vector3d p    = VectorExt.InvalidVector3d;
            double   mind = Double.MaxValue;

            StackArray <Vector3d> vtbl = default;

            vtbl[0]     = cx;
            vtbl[1]     = cy;
            vtbl.Length = 2;

            for (int i = 0; i < vtbl.Length; i++)
            {
                Vector3d v = vtbl[i];

                if (!v.IsValid())
                {
                    continue;
                }

                Vector3d devv = dc.WorldPointToDevPoint(v);

                double td = (devv - cursor.Pos).Norm();

                if (td < mind)
                {
                    mind = td;
                    p    = v;
                }
            }

            if (!p.IsValid())
            {
                return(ret);
            }

            if (mind > range)
            {
                return(ret);
            }

            ret.IsValid    = true;
            ret.CrossPoint = p;
            ret.Distance   = mind;

            ret.Ruler = this;

            return(ret);
        }
Esempio n. 3
0
        private void CheckSeg(DrawContext dc, CadLayer layer, FigureSegment fseg)
        {
            CadFigure fig  = fseg.Figure;
            int       idxA = fseg.Index0;
            int       idxB = fseg.Index1;
            Vector3d  a    = fseg.Point0.vector;
            Vector3d  b    = fseg.Point1.vector;

            if (fig.StoreList != null && fig.StoreList.Count > 1)
            {
                if (!CheckStorePoint)
                {
                    return;
                }

                a = fseg.StoredPoint0.vector;
                b = fseg.StoredPoint1.vector;
            }

            Vector3d cwp = dc.DevPointToWorldPoint(Target.Pos);

            Vector3d xfaceNormal = dc.DevVectorToWorldVector(Target.DirX);
            Vector3d yfaceNormal = dc.DevVectorToWorldVector(Target.DirY);

            Vector3d cx = CadMath.CrossSegPlane(a, b, cwp, xfaceNormal);
            Vector3d cy = CadMath.CrossSegPlane(a, b, cwp, yfaceNormal);

            if (!cx.IsValid() && !cy.IsValid())
            {
                return;
            }

            Vector3d p    = VectorExt.InvalidVector3d;
            double   mind = double.MaxValue;

            Vector3d dcenter    = dc.WorldPointToDevPoint(CadMath.CenterPoint(a, b));
            double   centerDist = (dcenter - Target.Pos).Norm();

            if (CheckPriority == Priority.NONE || centerDist < Range)
            {
                StackArray <Vector3d> vtbl = default;

                vtbl[0]     = cx;
                vtbl[1]     = cy;
                vtbl.Length = 2;

                for (int i = 0; i < vtbl.Length; i++)
                {
                    Vector3d v = vtbl[i];

                    if (!v.IsValid())
                    {
                        continue;
                    }

                    Vector3d devv = dc.WorldPointToDevPoint(v);
                    double   td   = (devv - Target.Pos).Norm();

                    if (td < mind)
                    {
                        mind = td;
                        p    = v;
                    }
                }
            }
            else
            {
                if (CheckPriority == Priority.PRIORITY_X)
                {
                    p = cx;
                }
                else if (CheckPriority == Priority.PRIORITY_Y)
                {
                    p = cy;
                }

                if (p.IsInvalid())
                {
                    return;
                }

                Vector3d devv = dc.WorldPointToDevPoint(p);
                mind = (devv - Target.Pos).Norm();
            }

            if (!p.IsValid())
            {
                return;
            }

            if (mind > Range)
            {
                return;
            }

            if (mind < MinDist)
            {
                MarkSeg.Layer          = layer;
                MarkSeg.FigSeg         = fseg;
                MarkSeg.CrossPoint     = p;
                MarkSeg.CrossPointScrn = dc.WorldPointToDevPoint(p);
                MarkSeg.Distance       = mind;

                MinDist = mind;
            }
        }