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 }
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); }
protected override bool IsSmallEdge(DesignEdge desEdge) { var edgeLength = desEdge.Shape.Length; return(edgeLength < mLongestEdge * (double)AreaThreshold.Value / 100d); }
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); //} }
protected abstract bool IsSmallEdge(DesignEdge desEdge);