diff --git a/ExportDXF/ExportDXF.csproj b/ExportDXF/ExportDXF.csproj index 1ff6511..99f7964 100644 --- a/ExportDXF/ExportDXF.csproj +++ b/ExportDXF/ExportDXF.csproj @@ -22,7 +22,7 @@ false false true - 3 + 4 1.0.0.%2a false true diff --git a/ExportDXF/Forms/MainForm.cs b/ExportDXF/Forms/MainForm.cs index 7579d3e..6fde241 100644 --- a/ExportDXF/Forms/MainForm.cs +++ b/ExportDXF/Forms/MainForm.cs @@ -19,6 +19,7 @@ namespace ExportDXF.Forms private BackgroundWorker worker; private DrawingDoc templateDrawing; private DateTime timeStarted; + private IViewFlipDecider viewFlipDecider; public MainForm() { @@ -28,6 +29,8 @@ namespace ExportDXF.Forms worker.WorkerSupportsCancellation = true; worker.DoWork += Worker_DoWork; worker.RunWorkerCompleted += Worker_RunWorkerCompleted; + + viewFlipDecider = new ViewFlipDecider(); } protected override void OnLoad(EventArgs e) @@ -365,38 +368,7 @@ namespace ExportDXF.Forms private bool ShouldFlipView(SolidWorks.Interop.sldworks.View view) { - var notes = (view.GetNotes() as Array)?.Cast(); - - var upCount = 0; - var dnCount = 0; - - Note leftMost = null; - double leftMostValue = double.MaxValue; - - foreach (var note in notes) - { - var pt = (note.GetTextPoint() as double[]); - - if (pt[0] < leftMostValue) - { - leftMostValue = pt[0]; - leftMost = note; - } - - var txt = note.GetText(); - - if (txt.ToUpper().Contains("UP")) - upCount++; - else - dnCount++; - } - - Print(string.Format("Found {0} bends, {1} UP, {2} DOWN", notes.Count(), upCount, dnCount), Color.Blue); - - if (dnCount == upCount && leftMost != null) - return !leftMost.GetText().Contains("UP"); - - return dnCount > upCount; + return viewFlipDecider.ShouldFlip(view); } private DrawingDoc CreateDrawing() @@ -677,4 +649,172 @@ namespace ExportDXF.Forms public Component2 Component { get; set; } } + + public interface IViewFlipDecider + { + bool ShouldFlip(SolidWorks.Interop.sldworks.View view); + } + + public class ViewFlipDecider : IViewFlipDecider + { + public bool ShouldFlip(SolidWorks.Interop.sldworks.View view) + { + var orientation = GetOrientation(view); + + Note note; + + switch (orientation) + { + case BendOrientation.Horizontal: + note = GetBottomMostNote(view); + break; + + case BendOrientation.Vertical: + note = GetLeftMostNote(view); + break; + + default: + return false; + } + + var bendDir = GetBendDirection(note); + var shouldFlip = bendDir == BendDirection.Down; + + return shouldFlip; + } + + private static BendDirection GetBendDirection(Note note) + { + var txt = note.GetText(); + + return txt.ToUpper().Contains("UP") ? BendDirection.Up : BendDirection.Down; + } + + private static IEnumerable GetBendNotes(SolidWorks.Interop.sldworks.View view) + { + return (view.GetNotes() as Array)?.Cast(); + } + + private static Note GetLeftMostNote(SolidWorks.Interop.sldworks.View view) + { + var notes = GetBendNotes(view); + + Note leftMostNote = null; + var leftMostValue = double.MaxValue; + + foreach (var note in notes) + { + var pt = (note.GetTextPoint() as double[]); + var x = pt[0]; + + if (x < leftMostValue) + { + leftMostValue = x; + leftMostNote = note; + } + } + + return leftMostNote; + } + + private static Note GetBottomMostNote(SolidWorks.Interop.sldworks.View view) + { + var notes = GetBendNotes(view); + + Note btmMostNote = null; + var btmMostValue = double.MaxValue; + + foreach (var note in notes) + { + var pt = (note.GetTextPoint() as double[]); + var y = pt[1]; + + if (y < btmMostValue) + { + btmMostValue = y; + btmMostNote = note; + } + } + + return btmMostNote; + } + + private static IEnumerable GetBendAngles(SolidWorks.Interop.sldworks.View view) + { + var angles = new List(); + var notes = GetBendNotes(view); + + foreach (var note in notes) + { + var angle = RadiansToDegrees(note.Angle); + angles.Add(angle); + } + + return angles; + } + + private static BendOrientation GetOrientation(SolidWorks.Interop.sldworks.View view) + { + var angles = GetBendAngles(view); + + var vertical = 0; + var horizontal = 0; + + foreach (var angle in angles) + { + var o = GetAngleOrientation(angle); + + switch (o) + { + case BendOrientation.Horizontal: + horizontal++; + break; + + case BendOrientation.Vertical: + vertical++; + break; + } + } + + if (vertical == 0 && horizontal == 0) + return BendOrientation.Unknown; + + return vertical > horizontal ? BendOrientation.Vertical : BendOrientation.Horizontal; + } + + private static BendOrientation GetAngleOrientation(double angleInDegrees) + { + if (angleInDegrees < 10 || angleInDegrees > 350) + return BendOrientation.Horizontal; + + if (angleInDegrees > 170 && angleInDegrees < 190) + return BendOrientation.Horizontal; + + if (angleInDegrees > 80 && angleInDegrees < 100) + return BendOrientation.Vertical; + + if (angleInDegrees > 260 && angleInDegrees < 280) + return BendOrientation.Vertical; + + return BendOrientation.Unknown; + } + + private static double RadiansToDegrees(double angleInRadians) + { + return angleInRadians * 180.0 / Math.PI; + } + } + + enum BendDirection + { + Up, + Down + } + + enum BendOrientation + { + Vertical, + Horizontal, + Unknown + } }