Beispiel #1
0
        void OnFeedBackChanged(IFeedBack sender)
        {
            BoundingCube ext = BoundingCube.EmptyBoundingCube;

            for (int i = 0; i < repaintObjects.Count; i++)
            {
                ext.MinMax(repaintObjects[i].GetExtent());
            }
            for (int i = 0; i < paintAsSelected.Count; i++)
            {
                ext.MinMax(paintAsSelected[i].GetExtent(0.0));
            }
            for (int i = 0; i < paintAsTransparent.Count; i++)
            {
                ext.MinMax(paintAsTransparent[i].GetExtent(0.0));
            }
            if (frame != null)
            {
                foreach (IView vw in frame.AllViews)
                {
                    if (!ext.IsEmpty && vw is IActionInputView)
                    {
                        (vw as IActionInputView).SetAdditionalExtent(ext);
                        (vw as IActionInputView).MakeEverythingTranparent(makeTransparent);
                    }
                    vw.InvalidateAll();
                }
            }
        }
Beispiel #2
0
 private void facOnMouseClick(bool up, GeoPoint MousePosition, IView View)
 {
     if (!up) // also beim Drücken, nicht beim Loslassen
     {
         // statt des umgebenden Kubus der Objekte ist es nun der definierter Punkt p
         cube = BoundingCube.EmptyBoundingCube;
         cube.MinMax(base.BasePoint);  // der FixPunkt
         cube.MinMax(MousePosition);   // der Skalierungspunkt kommt dazu
         startPoint = MousePosition;   // den Runterdrückpunkt merken
         //                base.BasePoint = startPoint;
         startPointInput.Fixed = true; // und sagen dass er existiert
         if (dis)
         {
             fac1.Fixed = true;
             fac2.Fixed = true;
             fac3.Fixed = true;
         }
         else
         {
             fac.Fixed = true;
         }
         base.FeedBack.Add(feedBackLine);
         base.SetFocus(endPointInput, true); // Focus auf den Endpunkt setzen
     }
 }
Beispiel #3
0
 private void SetStartPoint(GeoPoint p)
 {
     // statt des umgebenden Rechtecks der Objekte ist es nun der definierter Punkt p
     startPoint = p;
     cube       = BoundingCube.EmptyBoundingCube;
     cube.MinMax(base.BasePoint); // der FixPunkt
     cube.MinMax(p);              // der Skalierungspunkt kommt hinzu
 }
Beispiel #4
0
        /// <summary>
        /// Overrides <see cref="CADability.GeoObject.IGeoObjectImpl.GetBoundingCube ()"/>
        /// </summary>
        /// <returns></returns>
        public override BoundingCube GetBoundingCube()
        {
            BoundingCube res = BoundingCube.EmptyBoundingCube;

            res.MinMax(startPoint);
            res.MinMax(endPoint);
            return(res);
        }
Beispiel #5
0
        /// <summary>
        /// Overrides <see cref="CADability.GeoObject.IGeoObjectImpl.GetBoundingCube ()"/>
        /// </summary>
        /// <returns></returns>
        public override BoundingCube GetBoundingCube()
        {
            BoundingCube res = BoundingCube.EmptyBoundingCube;

            res.MinMax(location);
            return(res);
        }
Beispiel #6
0
        BoundingCube IOctTreeInsertable.GetExtent(double precision)
        {
            BoundingCube bc = new BoundingCube(start);
            GeoPoint     p  = new GeoPoint();

            if (dir.x > 0)
            {
                p.x = double.MaxValue;
            }
            else
            {
                p.x = double.MinValue;
            }
            if (dir.y > 0)
            {
                p.y = double.MaxValue;
            }
            else
            {
                p.y = double.MinValue;
            }
            if (dir.z > 0)
            {
                p.z = double.MaxValue;
            }
            else
            {
                p.z = double.MinValue;
            }
            bc.MinMax(p);
            return(bc);
        }
Beispiel #7
0
        public BoundingCube GetExtent()
        {
            BoundingCube res = BoundingCube.EmptyBoundingCube;

            foreach (IGeoObject go in list)
            {
                res.MinMax(go.GetBoundingCube());
            }
            return(res);
        }
Beispiel #8
0
        /// <summary>
        /// Overrides <see cref="CADability.GeoObject.IGeoObjectImpl.GetBoundingCube ()"/>
        /// </summary>
        /// <returns></returns>
        public override BoundingCube GetBoundingCube()
        {
            BoundingCube res = BoundingCube.EmptyBoundingCube;

            // lock (this)
            {
                for (int i = 0; i < containedObjects.Count; ++i)
                {
                    res.MinMax(containedObjects[i].GetBoundingCube());
                }
            }
            return(res);
        }
Beispiel #9
0
        /// <summary>
        /// Overrides <see cref="CADability.GeoObject.IGeoObjectImpl.GetExtent (double)"/>
        /// </summary>
        /// <param name="precision"></param>
        /// <returns></returns>
        public override BoundingCube GetExtent(double precision)
        {
            BoundingCube res = BoundingCube.EmptyBoundingCube;

            if (compoundShape != null)
            {
                for (int i = 0; i < compoundShape.SimpleShapes.Length; ++i)
                {
                    SimpleShape ss  = compoundShape.SimpleShapes[i];
                    Border      bdr = ss.Outline;
                    res.MinMax(bdr.AsPath().MakeGeoObject(plane).GetExtent(precision));
                }
            }
            return(res);
        }
Beispiel #10
0
        BoundingCube IFeedBack.GetExtent()
        {
            GeoPoint[] pnts = new GeoPoint[4];
            pnts[0] = pln.ToGlobal(new GeoPoint2D(-width / 2, -height / 2));
            pnts[1] = pln.ToGlobal(new GeoPoint2D(width / 2, -height / 2));
            pnts[2] = pln.ToGlobal(new GeoPoint2D(width / 2, height / 2));
            pnts[3] = pln.ToGlobal(new GeoPoint2D(-width / 2, height / 2));
            BoundingCube res = BoundingCube.EmptyBoundingCube;

            for (int i = 0; i < 4; i++)
            {
                res.MinMax(pnts[i]);
            }
            return(res);
        }
Beispiel #11
0
 BoundingCube IOctTreeInsertable.GetExtent(double precision)
 {
     if (isOpen)
     {
         return(tangulation.octtree.Extend);        // nicht endlich, also alles
     }
     if (extend.IsEmpty)
     {
         for (int i = 0; i < polygon.Count; i++)
         {
             extend.MinMax(plane.ToGlobal(polygon[i]));
         }
     }
     return(extend);
 }
Beispiel #12
0
        public override void OnSetAction()
        {
            //			base.ActiveObject = block;
            base.TitleId = "MoveObjects";
            copyObject   = ConstrDefaults.DefaultCopyObjects;
            feedBackLine = Line.Construct();
            Color backColor = base.Frame.GetColorSetting("Colors.Feedback", Color.DarkGray);

            feedBackLine.ColorDef = new ColorDef("", backColor);
            base.SetCursor(SnapPointFinder.DidSnapModes.DidNotSnap, "Move");


            vec = new GeoVectorInput("MoveObjects.Vector");
            vec.SetGeoVectorEvent       += new CADability.Actions.ConstructAction.GeoVectorInput.SetGeoVectorDelegate(Vec_OnSetGeoVector);
            vec.MouseClickEvent         += new MouseClickDelegate(VecOnMouseClick);
            vec.CalculateGeoVectorEvent += new GeoVectorInput.CalculateGeoVectorDelegate(vecCalculateGeoVector);
            vec.GetGeoVectorEvent       += new GeoVectorInput.GetGeoVectorDelegate(vecGetGeoVector);

            startPointInput                   = new GeoPointInput("Objects.StartPoint");
            startPointInput.Optional          = true;
            startPointInput.SetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.SetGeoPointDelegate(SetStartPoint);
            startPointInput.GetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.GetGeoPointDelegate(GetStartPoint);

            endPointInput                   = new GeoPointInput("Objects.EndPoint");
            endPointInput.Optional          = true;
            endPointInput.SetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.SetGeoPointDelegate(SetEndPoint);
            endPointInput.GetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.GetGeoPointDelegate(GetEndPoint);

            BooleanInput copy = new BooleanInput("Modify.CopyObjects", "YesNo.Values");

            copy.DefaultBoolean   = ConstrDefaults.DefaultCopyObjects;
            copy.SetBooleanEvent += new CADability.Actions.ConstructAction.BooleanInput.SetBooleanDelegate(SetCopy);

            base.SetInput(vec, startPointInput, endPointInput, copy);

            BoundingCube result = BoundingCube.EmptyBoundingCube;

            foreach (IGeoObject go in originals)
            {
                result.MinMax(go.GetBoundingCube());
            }

            GeoPoint blockCenter = result.GetCenter();

            block.RefPoint = blockCenter;
            vec.SetVectorFromPoint(blockCenter);
            base.OnSetAction();
        }
Beispiel #13
0
        public override void OnSetAction()
        {
            base.ActiveObject = block;
            base.TitleId      = "ReflectObjects";
            copyObject        = ConstrDefaults.DefaultCopyObjects;

            GeoPointInput reflectPoint = new GeoPointInput("ReflectObjects.Point");

            //           reflectPoint.GetGeoPointEvent += new GeoPointInput.GetGeoPointDelegate(GetReflectPoint);
            reflectPoint.SetGeoPointEvent += new GeoPointInput.SetGeoPointDelegate(SetReflectPoint);
            reflectPoint.Optional          = true;

            reflectLine                             = new CurveInput("ReflectObjects.Line");
            reflectLine.Decomposed                  = true; // nur Einzelelemente, auch bei Polyline und Pfad
            reflectLine.MouseOverCurvesEvent       += new CurveInput.MouseOverCurvesDelegate(ReflectLine);
            reflectLine.CurveSelectionChangedEvent += new CurveInput.CurveSelectionChangedDelegate(ReflectLineChanged);

            PlaneInput reflectPlane = new PlaneInput("ReflectObjects.Plane");

            reflectPlane.SetPlaneEvent += new PlaneInput.SetPlaneDelegate(SetReflectPlane);
            //            reflectPlane.GetPlaneEvent += new PlaneInput.GetPlaneDelegate(GetReflectPlane);
            reflectPlane.Optional = true;

            BooleanInput copy = new BooleanInput("Modify.CopyObjects", "YesNo.Values");

            copy.DefaultBoolean   = ConstrDefaults.DefaultCopyObjects;
            copy.SetBooleanEvent += new CADability.Actions.ConstructAction.BooleanInput.SetBooleanDelegate(SetCopy);


            base.SetInput(reflectPoint, reflectLine, reflectPlane, copy);
            BoundingCube result = BoundingCube.EmptyBoundingCube;

            foreach (IGeoObject go in originals)
            {
                result.MinMax(go.GetBoundingCube());
            }
            GeoPoint blockCenter = result.GetCenter();

            block.RefPoint    = blockCenter;
            base.BasePoint    = blockCenter;
            reflectModOp      = ModOp.ReflectPlane(new Plane(base.BasePoint, base.ActiveDrawingPlane.Normal, base.ActiveDrawingPlane.DirectionY));
            reflectModOpStart = reflectModOp;
            block.Modify(reflectModOp);
            base.OnSetAction();
        }
Beispiel #14
0
        private List <MenuWithHandler> GetFacesSubmenus(Face face)
        {
            List <MenuWithHandler> res = new List <MenuWithHandler>();

            if (face.IsFillet())
            {
                HashSet <Face> connectedFillets = new HashSet <Face>();
                CollectConnectedFillets(face, connectedFillets);
                FeatureCommandHandler fch = new FeatureCommandHandler(connectedFillets.ToArray(), this, "MenuId.Fillet");
                MenuWithHandler       fr  = new MenuWithHandler("MenuId.Fillet.ChangeRadius");
                fr.OnCommand = (menuId) =>
                {
                    ParametricsRadius pr = new ParametricsRadius(connectedFillets.ToArray(), soa.Frame, true);
                    soa.Frame.SetAction(pr);
                    return(true);
                };
                fr.OnSelected = (mh, selected) =>
                {
                    currentMenuSelection.Clear();
                    currentMenuSelection.AddRange(connectedFillets.ToArray());
                    currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle);
                };
                MenuWithHandler fd = new MenuWithHandler("MenuId.Fillet.Remove");
                fd.OnCommand = (menuId) =>
                {
                    Face[] involvedFaces = connectedFillets.ToArray();
                    Shell  orgShell      = involvedFaces[0].Owner as Shell;
                    if (orgShell != null)
                    {
                        RemoveFillet rf = new RemoveFillet(involvedFaces[0].Owner as Shell, new HashSet <Face>(involvedFaces));
                        Shell        sh = rf.Result();
                        if (sh != null)
                        {
                            using (soa.Frame.Project.Undo.UndoFrame)
                            {
                                sh.CopyAttributes(orgShell);
                                IGeoObjectOwner owner = orgShell.Owner;
                                owner.Remove(orgShell);
                                owner.Add(sh);
                            }
                        }
                    }
                    soa.ResetMode();
                    return(true);
                };
                fd.OnSelected = (mh, selected) =>
                {
                    currentMenuSelection.Clear();
                    currentMenuSelection.AddRange(connectedFillets.ToArray());
                    currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle);
                };
                fch.SubMenus = new MenuWithHandler[] { fr, fd };
                res.Add(fch);
            }
            IEnumerable <Face> connected = face.GetSameSurfaceConnected();

            // if (connected.Any())
            {
                List <Face> lconnected = new List <Face>(connected);
                lconnected.Add(face);
                BoundingCube ext = BoundingCube.EmptyBoundingCube;
                foreach (Face fc in connected)
                {
                    ext.MinMax(fc.GetExtent(0.0));
                }
                // maybe a full sphere, cone, cylinder or torus:
                // except for the sphere: position axis
                // except for the cone: change radius or diameter
                // for the cone: smaller and larger diameter
                // for cone and cylinder: total length
                if (face.Surface is CylindricalSurface || face.Surface is CylindricalSurfaceNP || face.Surface is ToroidalSurface)
                {
                    MenuWithHandler mh = new MenuWithHandler("MenuId.FeatureDiameter");
                    mh.OnCommand = (menuId) =>
                    {
                        ParametricsRadius pr = new ParametricsRadius(lconnected.ToArray(), soa.Frame, false);
                        soa.Frame.SetAction(pr);
                        return(true);
                    };
                    mh.OnSelected = (menuId, selected) =>
                    {
                        currentMenuSelection.Clear();
                        currentMenuSelection.AddRange(lconnected.ToArray());
                        currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle);
                    };
                    res.Add(mh);
                }
                if (face.Surface is CylindricalSurface || face.Surface is CylindricalSurfaceNP || face.Surface is ConicalSurface)
                {
                    Line axis = null;

                    if (face.Surface is ICylinder cyl)
                    {
                        axis = cyl.Axis.Clip(ext);
                    }
                    if (face.Surface is ConicalSurface cone)
                    {
                        axis = cone.AxisLine(face.Domain.Bottom, face.Domain.Top);
                    }
                    MenuWithHandler mh = new MenuWithHandler("MenuId.AxisPosition");
                    mh.OnCommand = (menuId) =>
                    {
                        ParametricsDistanceActionOld pd = new ParametricsDistanceActionOld(lconnected, axis, soa.Frame);
                        soa.Frame.SetAction(pd);
                        return(true);
                    };
                    mh.OnSelected = (menuId, selected) =>
                    {
                        currentMenuSelection.Clear();
                        currentMenuSelection.AddRange(lconnected.ToArray());
                        currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle);
                    };
                    res.Add(mh);
                }
            }
            if (face.Surface is PlaneSurface pls)
            {
                // try to find parallel outline edges to modify the distance
                Edge[] outline = face.OutlineEdges;
                for (int j = 0; j < outline.Length - 1; j++)
                {
                    for (int k = j + 1; k < outline.Length; k++)
                    {
                        if (outline[j].Curve3D is Line l1 && outline[k].Curve3D is Line l2)
                        {
                            if (Precision.SameDirection(l1.StartDirection, l2.StartDirection, false))
                            {
                                // two parallel outline lines, we could parametrize the distance
                                Edge   o1   = outline[j];
                                Edge   o2   = outline[k]; // outline[i] is not captured correctly for the anonymous method. I don't know why. With local copies, it works.
                                double lmin = double.MaxValue;
                                double lmax = double.MinValue;
                                double p    = Geometry.LinePar(l1.StartPoint, l1.EndPoint, l2.StartPoint);
                                lmin = Math.Min(lmin, p);
                                lmax = Math.Max(lmax, p);
                                p    = Geometry.LinePar(l1.StartPoint, l1.EndPoint, l2.EndPoint);
                                lmin = Math.Max(Math.Min(lmin, p), 0);
                                lmax = Math.Min(Math.Max(lmax, p), 1);
                                GeoPoint p1 = Geometry.LinePos(l1.StartPoint, l1.EndPoint, (lmin + lmax) / 2.0);
                                GeoPoint p2 = Geometry.DropPL(p1, l2.StartPoint, l2.EndPoint);
                                if ((p1 | p2) > Precision.eps)
                                {
                                    MenuWithHandler mh            = new MenuWithHandler("MenuId.EdgeDistance");
                                    Line            feedback      = Line.TwoPoints(p1, p2);
                                    GeoObjectList   feedbackArrow = currentView.Projection.MakeArrow(p1, p2, pls.Plane, Projection.ArrowMode.circleArrow);
                                    mh.OnCommand = (menuId) =>
                                    {
                                        ParametricsDistanceActionOld pd = new ParametricsDistanceActionOld(o1, o2, feedback, pls.Plane, soa.Frame);
                                        soa.Frame.SetAction(pd);
                                        return(true);
                                    };
                                    mh.OnSelected = (m, selected) =>
                                    {
                                        currentMenuSelection.Clear();
                                        currentMenuSelection.AddRange(feedbackArrow);
                                        currentMenuSelection.Add(o1.OtherFace(face));
                                        currentMenuSelection.Add(o2.OtherFace(face));
                                        currentView.Invalidate(PaintBuffer.DrawingAspect.Select, currentView.DisplayRectangle);
                                    };
                                    res.Add(mh);
                                }
                            }
                        }
                    }
                }
            }
            if (res.Count > 6)
            {
                List <MenuWithHandler> lm = new List <MenuWithHandler>();
                for (int i = 4; i < res.Count; i++)
                {
                    lm.Add(res[i]);
                }
                res.RemoveRange(4, lm.Count);
                MenuWithHandler subMenu = new MenuWithHandler("MenuId.More");
                subMenu.SubMenus = lm.ToArray();
                res.Add(subMenu);
            }
            return(res);
        }
Beispiel #15
0
        public override void OnSetAction()
        {
            base.ActiveObject = block;
            base.TitleId      = "ScaleObjects";
            dis          = ConstrDefaults.DefaultScaleDistort;
            copyObject   = ConstrDefaults.DefaultCopyObjects;
            feedBackLine = Line.Construct();
            Color backColor = base.Frame.GetColorSetting("Colors.Feedback", Color.DarkGray);

            feedBackLine.ColorDef = new ColorDef("", backColor);
            base.SetCursor(SnapPointFinder.DidSnapModes.DidNotSnap, "Size");
            clickandPress = false;

            GeoPointInput fixPoint = new GeoPointInput("Objects.FixPoint", base.BasePoint);

            fixPoint.Optional          = true;
            fixPoint.DefinesHotSpot    = true;
            fixPoint.HotSpotSource     = "Hotspots.png:0";
            fixPoint.SetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.SetGeoPointDelegate(SetfixPoint);
            fixPoint.GetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.GetGeoPointDelegate(GetfixPoint);
            // dieser Punkt mit dem Fixpunkt dient zur Faktor-Bestimmung, "1" läßt ihn unverändert, "2" verdoppelt seine Entfernung vom Fixpunkt
            startPointInput                   = new GeoPointInput("Objects.StartPoint");
            startPointInput.Optional          = true;
            startPointInput.SetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.SetGeoPointDelegate(SetStartPoint);
            startPointInput.GetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.GetGeoPointDelegate(GetStartPoint);

            endPointInput                   = new GeoPointInput("Objects.EndPoint");
            endPointInput.Optional          = true;
            endPointInput.SetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.SetGeoPointDelegate(SetEndPoint);
            endPointInput.GetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.GetGeoPointDelegate(GetEndPoint);

            fac                       = new DoubleInput("ScaleObjects.Factor", faktor);
            fac.ReadOnly              = dis;
            fac.Optional              = dis;
            fac.SetDoubleEvent       += new CADability.Actions.ConstructAction.DoubleInput.SetDoubleDelegate(SetFactor);
            fac.GetDoubleEvent       += new CADability.Actions.ConstructAction.DoubleInput.GetDoubleDelegate(GetFactor);
            fac.CalculateDoubleEvent += new CADability.Actions.ConstructAction.DoubleInput.CalculateDoubleDelegate(CalculateFactor);
            fac.MouseClickEvent      += new MouseClickDelegate(facOnMouseClick);
            // Verzerrung
            BooleanInput distort = new BooleanInput("ScaleObjects.Distort", "ScaleObjects.Distort.Values");

            distort.DefaultBoolean   = ConstrDefaults.DefaultScaleDistort;
            distort.SetBooleanEvent += new CADability.Actions.ConstructAction.BooleanInput.SetBooleanDelegate(SetDistort);
            fac1                       = new DoubleInput("ScaleObjects.FactorX");
            fac1.ReadOnly              = !dis;
            fac1.Optional              = !dis;
            fac1.SetDoubleEvent       += new CADability.Actions.ConstructAction.DoubleInput.SetDoubleDelegate(SetFactor1);
            fac1.GetDoubleEvent       += new CADability.Actions.ConstructAction.DoubleInput.GetDoubleDelegate(GetFactor1);
            fac1.CalculateDoubleEvent += new CADability.Actions.ConstructAction.DoubleInput.CalculateDoubleDelegate(CalculateFactor);
            fac1.MouseClickEvent      += new MouseClickDelegate(facOnMouseClick);
            fac2                       = new DoubleInput("ScaleObjects.FactorY");
            fac2.ReadOnly              = !dis;
            fac2.Optional              = !dis;
            //			fac2.Optional = true;
            fac2.SetDoubleEvent       += new CADability.Actions.ConstructAction.DoubleInput.SetDoubleDelegate(SetFactor2);
            fac2.GetDoubleEvent       += new CADability.Actions.ConstructAction.DoubleInput.GetDoubleDelegate(GetFactor2);
            fac2.CalculateDoubleEvent += new CADability.Actions.ConstructAction.DoubleInput.CalculateDoubleDelegate(CalculateFactor2);

            fac3          = new DoubleInput("ScaleObjects.FactorZ");
            fac3.ReadOnly = !dis;
            fac3.Optional = !dis;
            //			fac2.Optional = true;
            fac3.SetDoubleEvent       += new CADability.Actions.ConstructAction.DoubleInput.SetDoubleDelegate(SetFactor3);
            fac3.GetDoubleEvent       += new CADability.Actions.ConstructAction.DoubleInput.GetDoubleDelegate(GetFactor3);
            fac3.CalculateDoubleEvent += new CADability.Actions.ConstructAction.DoubleInput.CalculateDoubleDelegate(CalculateFactor3);

            BooleanInput copy = new BooleanInput("Modify.CopyObjects", "YesNo.Values");

            copy.DefaultBoolean   = ConstrDefaults.DefaultCopyObjects;
            copy.SetBooleanEvent += new CADability.Actions.ConstructAction.BooleanInput.SetBooleanDelegate(SetCopy);

            // erstmal wird das umgebende Rechteck bestimmt
            cube = BoundingCube.EmptyBoundingCube;
            foreach (IGeoObject go in originals)
            {
                cube.MinMax(go.GetBoundingCube());
            }
            GeoPoint blockCenter = cube.GetCenter();

            block.RefPoint = blockCenter;
            // im Basepoint steht der Fixpunkt der Skalierung
            base.BasePoint = blockCenter;
            base.SetInput(fixPoint, fac, startPointInput, endPointInput, distort, fac1, fac2, fac3, copy);
            base.OnSetAction();
        }
Beispiel #16
0
        public override void OnSetAction()
        {
            //			base.ActiveObject = block;
            base.TitleId = "RotateObjects";
            copyObject   = ConstrDefaults.DefaultCopyObjects;
            axisVector   = base.ActiveDrawingPlane.Normal;

            feedBackEllipse = Ellipse.Construct();
            feedBackEllipse.SetEllipseCenterAxis(GeoPoint.Origin, GeoVector.XAxis, GeoVector.YAxis); // damit nicht alles 0
            Color backColor = base.Frame.GetColorSetting("Colors.Feedback", Color.DarkGray);

            feedBackEllipse.ColorDef = new ColorDef("", backColor);
            base.FeedBack.Add(feedBackEllipse);
            base.SetCursor(SnapPointFinder.DidSnapModes.DidNotSnap, "RotateSmall");

            //--> diese Inputs werden gebraucht
            GeoPointInput refPointInput = new GeoPointInput("Objects.RefPoint");

            refPointInput.Optional          = true;
            refPointInput.SetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.SetGeoPointDelegate(SetRefPoint);
            refPointInput.GetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.GetGeoPointDelegate(GetRefPoint);
            refPointInput.DefinesHotSpot    = true;
            refPointInput.HotSpotSource     = "Hotspots.png:0";

            rotAngleInput = new AngleInput("RotateObjects.Angle");
            rotAngleInput.SetAngleEvent       += new CADability.Actions.ConstructAction.AngleInput.SetAngleDelegate(OnSetRotationAngle);
            rotAngleInput.GetAngleEvent       += new CADability.Actions.ConstructAction.AngleInput.GetAngleDelegate(OnGetRotationAngle);
            rotAngleInput.CalculateAngleEvent += new CADability.Actions.ConstructAction.AngleInput.CalculateAngleDelegate(OnCalculateRotationAngle);
            rotAngleInput.MouseClickEvent     += new MouseClickDelegate(OnMouseClickRotationAngle);

            startPointInput                   = new GeoPointInput("Objects.StartPoint");
            startPointInput.Optional          = true;
            startPointInput.SetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.SetGeoPointDelegate(OnSetStartPoint);
            startPointInput.GetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.GetGeoPointDelegate(OnGetStartPoint);

            endPointInput                   = new GeoPointInput("Objects.EndPoint");
            endPointInput.Optional          = true;
            endPointInput.SetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.SetGeoPointDelegate(OnSetEndPoint);
            endPointInput.GetGeoPointEvent += new CADability.Actions.ConstructAction.GeoPointInput.GetGeoPointDelegate(OnGetEndPoint);

            rotateLineInput                             = new CurveInput("Constr.Rotate.AxisLine");
            rotateLineInput.Decomposed                  = true; // nur Einzelelemente, auch bei Polyline und Pfad
            rotateLineInput.MouseOverCurvesEvent       += new CurveInput.MouseOverCurvesDelegate(RotateLine);
            rotateLineInput.CurveSelectionChangedEvent += new CurveInput.CurveSelectionChangedDelegate(RotateLineChanged);
            rotateLineInput.Optional                    = true;

            srcPlane = new PlaneInput("Constr.Rotate.SourcePlane");
            srcPlane.SetPlaneEvent += SrcPlane_OnSetPlane;
            srcPlane.GetPlaneEvent += SrcPlane_OnGetPlane;
            srcPlane.Optional       = true;

            trgPlane = new PlaneInput("Constr.Rotate.TargetPlane");
            trgPlane.SetPlaneEvent += TrgPlane_OnSetPlane;
            trgPlane.GetPlaneEvent += TrgPlane_OnGetPlane;
            trgPlane.Optional       = true;

            offset                 = new MultipleChoiceInput("Constr.Rotate.Offset", "Constr.Rotate.Offset.Values");
            offset.Optional        = true;
            offsetVal              = 0;
            offset.GetChoiceEvent += OnGetOffset;
            offset.SetChoiceEvent += OnSetOffset;

            BooleanInput copy = new BooleanInput("Modify.CopyObjects", "YesNo.Values");

            copy.DefaultBoolean   = ConstrDefaults.DefaultCopyObjects;
            copy.SetBooleanEvent += new CADability.Actions.ConstructAction.BooleanInput.SetBooleanDelegate(SetCopy);

            base.SetInput(refPointInput, rotAngleInput, startPointInput, endPointInput, rotateLineInput, srcPlane, trgPlane, offset, copy);

            BoundingCube result = BoundingCube.EmptyBoundingCube;

            foreach (IGeoObject go in originals)
            {
                result.MinMax(go.GetBoundingCube());
            }
            GeoPoint blockCenter = result.GetCenter();

            block.RefPoint = blockCenter;
            refPoint       = blockCenter;
            base.BasePoint = blockCenter;                        // für die Winkelberechnung
            base.OnSetAction();
            rotateLineInput.SetContextMenu("MenuId.Axis", this); // kann man erst hier machen, zuvor gibts die Property noch nicht
        }
Beispiel #17
0
        private double CalculateFactor(GeoPoint MousePosition)
        {
            if (!startPointInput.Fixed)
            {
                startPoint = MousePosition;
            }
            double       divRBx;            // Abstand rect-Rand zu Referenzpunt in x-Richtung
            double       divRBy;            // Abstand rect-Rand zu Referenzpunt in y-Richtung
            double       divRBz;            // Abstand rect-Rand zu Referenzpunt in z-Richtung
            double       divMBx;            // Abstand MousePosition zu Referenzpunt in x-Richtung
            double       divMBy;            // Abstand MousePosition zu Referenzpunt in y-Richtung
            double       divMBz;            // Abstand MousePosition zu Referenzpunt in z-Richtung
            BoundingCube cubeLoc = cube;    // der umgebende Kubus der Objekte

            cubeLoc.MinMax(base.BasePoint); // der Punkt kommt noch mit dazu, kann ja auch ausserhalb liegen
            // es wird ein Faktor gebildet aus: (Abstand rect-Rand und Referenzpunkt) und (Abstand MousePos. und Referenzpunkt),
            // getrennt für alle vier Quadranten
            if (MousePosition.x > base.BasePoint.x)
            {
                divRBx = cubeLoc.Xmax - base.BasePoint.x;
                divMBx = MousePosition.x - base.BasePoint.x;
            }
            else
            {
                divRBx = base.BasePoint.x - cubeLoc.Xmin;
                divMBx = base.BasePoint.x - MousePosition.x;
            }
            if (MousePosition.y > base.BasePoint.y)
            {
                divRBy = cubeLoc.Ymax - base.BasePoint.y;
                divMBy = MousePosition.y - base.BasePoint.y;
            }
            else
            {
                divRBy = base.BasePoint.y - cubeLoc.Ymin;
                divMBy = base.BasePoint.y - MousePosition.y;
            }
            if (MousePosition.z > base.BasePoint.z)
            {
                divRBz = cubeLoc.Zmax - base.BasePoint.z;
                divMBz = MousePosition.z - base.BasePoint.z;
            }
            else
            {
                divRBz = base.BasePoint.z - cubeLoc.Zmin;
                divMBz = base.BasePoint.z - MousePosition.z;
            }
            // jetzt werden die drei Faktoren bestimmt
            if (Math.Abs(divRBx) <= 1e-6)
            {
                faktorX = 0;
            }
            else
            {
                faktorX = divMBx / divRBx;
            }
            if (Math.Abs(divRBy) <= 1e-6)
            {
                faktorY = 0;
            }
            else
            {
                faktorY = divMBy / divRBy;
            }
            if (Math.Abs(divRBz) <= 1e-6)
            {
                faktorZ = 0;
            }
            else
            {
                faktorZ = divMBz / divRBz;
            }


            // falls einer ausfällt: den größten anderen nehmen, das erhöht den Benutzungskomfort
            if (faktorX == 0)
            {
                faktorX = Math.Max(faktorY, faktorZ);
            }
            if (faktorY == 0)
            {
                faktorY = Math.Max(faktorX, faktorZ);
            }
            if (faktorZ == 0)
            {
                faktorZ = Math.Max(faktorX, faktorY);
            }

            if (dis)
            {
                return(faktorX);     // falls Verzerrung: nur x-Wert, also: facWidth, facH ist global und wird in Setfaktor verwurstet
            }
            //			if (divMBx == 0) return Math.Max(faktorY,faktorZ);
            //			if (divRBx == 0) return ;
            // die Auswahl, welcher von beiden benutzt wird, Quadranten als Strahlen vom Referenzpunkt dirch die Ecken des umgebenden Rechtecks rectLoc
            if ((divMBy / divMBx) > (divRBy / divRBx))
            {
                if ((divMBy / divMBz) > (divRBy / divRBz))
                {
                    return(faktorZ);
                }
                else
                {
                    return(faktorY);
                }
            }
            else
            {
                if ((divMBx / divMBz) > (divRBx / divRBz))
                {
                    return(faktorZ);
                }
                else
                {
                    return(faktorX);
                }
            }

            //BoundingRect rectLoc = rect;
            //rectLoc.MinMax(base.ActiveDrawingPlane.Project(base.BasePoint)); // der Punkt kann ja auch ausserhalb liegen
            //// es wird ein Faktor gebildet aus: (Abstand rect-Rand und Referenzpunkt) und (Abstand MousePos. und Referenzpunkt),
            //// getrennt für alle vier Quadranten
            //if (MousePosition.x > base.BasePoint.x)
            //{
            //    divRBx = rectLoc.Right - base.BasePoint.x;
            //    divMBx = MousePosition.x - base.BasePoint.x;
            //}
            //else
            //{
            //    divRBx = base.BasePoint.x - rectLoc.Left;
            //    divMBx = base.BasePoint.x - MousePosition.x;
            //}
            //if (MousePosition.y > base.BasePoint.y)
            //{
            //    divRBy = rectLoc.Top - base.BasePoint.y;
            //    divMBy = MousePosition.y - base.BasePoint.y;
            //}
            //else
            //{
            //    divRBy = base.BasePoint.y - rectLoc.Bottom;
            //    divMBy = base.BasePoint.y - MousePosition.y;
            //}
            //// jetzt werden die beiden Faktoren bestimmt
            //if (divRBy == 0) facH = 0;
            //else facH = divMBy / divRBy;
            //if (divRBx == 0) facW = 0;
            //else facW = divMBx / divRBx;

            //if (dis) return facW; // falls Verzerrung: nur x-Wert, also: facWidth, facH ist global und wird in Setfaktor verwurstet

            //// falls einer ausfällt: den anderen nehmen, das erhöht den Benutzungskomfort
            //if (facH == 0) facH = facW;
            //if (facW == 0) facW = facH;

            //if (divMBx == 0) return facH;
            //if (divRBx == 0) return facW;
            //// die Auswahl, welcher von beiden benutzt wird, Quadranten als Strahlen vom Referenzpunkt dirch die Ecken des umgebenden Rechtecks rectLoc
            //if ((divMBy / divMBx) > (divRBy / divRBx))
            //    return facH;
            //else return facW;
        }