protected override bool OnMouseMove(ScreenPoint cursorPos, Line cursorRay, MouseButtons button)
        {
            if (button != MouseButtons.None)
            {
                return(false);
            }

            IDocObject preselection = InteractionContext.Preselection;
            DesignEdge designEdge   = preselection as DesignEdge;

            if (designEdge == null) // selection filtering is not applied if you (pre)select in the tree
            {
                return(false);
            }

            Circle edgeCircle = (Circle)designEdge.Shape.Geometry;

            CurveSegment innerCurve = CurveSegment.Create(Circle.Create(edgeCircle.Frame, apiGroove.InnerDiameter / 2));
            CurveSegment outerCurve = CurveSegment.Create(Circle.Create(edgeCircle.Frame, apiGroove.OuterDiameter / 2));

            var style = new GraphicStyle {
                LineColor = Color.DarkGray,
                LineWidth = 2
            };
            Graphic centerLine = Graphic.Create(style, new[] { CurvePrimitive.Create(innerCurve), CurvePrimitive.Create(outerCurve) });

            style = new GraphicStyle {
                LineColor = Color.White,
                LineWidth = 4
            };
            Graphic highlightLine = Graphic.Create(style, new[] { CurvePrimitive.Create(innerCurve), CurvePrimitive.Create(outerCurve) });

            Rendering = Graphic.Create(style, null, new[] { highlightLine, centerLine });
            return(false); // if we return true, the preselection won't update
        }
Пример #2
0
        protected override bool IsSmallEdge(DesignEdge desEdge)
        {
            var doc          = desEdge.Document;
            var lengthFactor = doc.Units.Length.ConversionFactor;

            return(desEdge.Shape.Length * lengthFactor < (double)AreaThreshold.Value);
        }
        // Traversal Helpers

        public static bool TryGetAdjacentDesignFace(DesignFace sourceFace, DesignEdge sourceEdge, out DesignFace otherFace)
        {
            Debug.Assert(sourceEdge.Faces.Count <= 2, "Yikes, non-manifold edge!");

            otherFace = null;
            foreach (DesignFace designFace in sourceEdge.Faces)
            {
                if (designFace != sourceFace)
                {
                    otherFace = designFace;
                    return(true);
                }
            }

            return(false);
        }
        protected override bool OnClickStart(ScreenPoint cursorPos, Line cursorRay)
        {
            DesignEdge designEdge = InteractionContext.Preselection as DesignEdge;

            if (designEdge == null)
            {
                return(false);
            }

            Circle edgeCircle = (Circle)designEdge.Shape.Geometry;
            Frame  frame      = edgeCircle.Frame;
            Face   face       = designEdge.Faces.Where(f => f.Shape.Geometry is Plane).First().Shape;
            Plane  plane      = (Plane)face.Geometry;

            if (frame.DirZ == plane.Frame.DirZ ^ !face.IsReversed)
            {
                frame = Frame.Create(frame.Origin, -frame.DirZ);
            }

            double angle  = apiGroove.Angle;
            double depth  = apiGroove.Depth;
            var    points = new[] {
                Point.Create(apiGroove.InnerDiameter / 2, 0, 0),
                Point.Create(apiGroove.InnerDiameter / 2 + Math.Sin(angle) * depth, 0, -Math.Cos(angle) * depth),
                Point.Create(apiGroove.OuterDiameter / 2 - Math.Sin(angle) * depth, 0, -Math.Cos(angle) * depth),
                Point.Create(apiGroove.OuterDiameter / 2, 0, 0)
            };

            var profile = points.AsPolygon();
            var path    = new[] { CurveSegment.Create(Circle.Create(Frame.World, 1)) };

            WriteBlock.ExecuteTask("Create Profile", () => {
                var body = Body.SweepProfile(Plane.PlaneZX, profile, path);
                body.Transform(Matrix.CreateMapping(frame));
                var cutter = DesignBody.Create(designEdge.Parent.Parent, "temp", body);
                designEdge.Parent.Shape.Subtract(new[] { cutter.Shape });
            });

            return(false);
        }
Пример #5
0
        protected override bool IsSmallEdge(DesignEdge desEdge)
        {
            var edgeLength = desEdge.Shape.Length;

            return(edgeLength < mLongestEdge * (double)AreaThreshold.Value / 100d);
        }
Пример #6
0
        static void Remove_Executing(object sender, EventArgs e)
        {
            Window activeWindow = Window.ActiveWindow;

            Group roundGroup = null;

            foreach (Group group in activeWindow.Groups)
            {
                if (group.Name == "Rounds")
                {
                    roundGroup = group;
                    break;
                }
            }

            List <DesignFace> roundFaces = new List <DesignFace>();

            foreach (IDocObject iDocObject in roundGroup.Members)
            {
                if (iDocObject is DesignFace)
                {
                    roundFaces.Add((DesignFace)iDocObject);
                }
            }

            List <DesignFace> originalRoundFaces = new List <DesignFace>(roundFaces);

            // 1. find contiguous groups
            // 2. try removing whole group
            // 3. Try finding connecting large rounds
            // 4. individual faces

            // Gather rounds into contiguous groups
            List <DesignFace>    remainingFaces = new List <DesignFace>(roundFaces);
            List <List <Round> > roundSets      = new List <List <Round> >();

            Round.Reset();

            while (remainingFaces.Count > 0)
            {
                List <Round>       roundSet     = new List <Round>();
                Queue <DesignEdge> edgesToVisit = new Queue <DesignEdge>();

                AddRound(remainingFaces[0], roundSet, remainingFaces, edgesToVisit);

                while (edgesToVisit.Count > 0)
                {
                    DesignEdge designEdge = edgesToVisit.Dequeue();
                    foreach (DesignFace testFace in designEdge.Faces)
                    {
                        if (remainingFaces.Contains(testFace))
                        {
                            AddRound(testFace, roundSet, remainingFaces, edgesToVisit);
                        }
                    }
                }

                foreach (Round round in roundSet)
                {
                    if (round.Valence == 1)
                    {
                        round.DesignFace.SetColor(null, Color.LavenderBlush);
                    }
                    else if (round.Valence == 2)
                    {
                        round.DesignFace.SetColor(null, Color.Lavender);
                    }
                    else
                    {
                        round.DesignFace.SetColor(null, Color.Khaki);
                    }
                }

                roundSets.Add(roundSet);
            }

            int faceCount = 0;

            while (faceCount != roundFaces.Count)
            {
                faceCount = roundFaces.Count;

                List <DesignFace> removeFaces = new List <DesignFace>();

                //removeFaces.AddRange(RemoveDesignFaces(roundFaces));

                //foreach (DesignFace designFace in roundFaces)
                //    removeFaces.AddRange(RemoveDesignFaces(new DesignFace[] { designFace }));

                foreach (DesignFace designFace in removeFaces)
                {
                    roundFaces.Remove(designFace);
                }

                removeFaces.Clear();

                //		break;
            }

            //foreach (DesignFace designFace in originalRoundFaces) {
            //    if (!designFace.IsDeleted)
            //        designFace.SetColor(null, Color.Red);
            //}
        }
Пример #7
0
 protected abstract bool IsSmallEdge(DesignEdge desEdge);