First commit.
This commit is contained in:
32
.gitignore
vendored
Normal file
32
.gitignore
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
#Ignore thumbnails created by Windows
|
||||||
|
Thumbs.db
|
||||||
|
#Ignore files built by Visual Studio
|
||||||
|
*.obj
|
||||||
|
*.exe
|
||||||
|
*.pdb
|
||||||
|
*.user
|
||||||
|
*.aps
|
||||||
|
*.pch
|
||||||
|
*.vspscc
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*.ncb
|
||||||
|
*.suo
|
||||||
|
*.tlb
|
||||||
|
*.tlh
|
||||||
|
*.bak
|
||||||
|
*.cache
|
||||||
|
*.ilk
|
||||||
|
*.log
|
||||||
|
[Bb]in
|
||||||
|
[Dd]ebug*/
|
||||||
|
*.lib
|
||||||
|
*.sbr
|
||||||
|
obj/
|
||||||
|
[Rr]elease*/
|
||||||
|
_ReSharper*/
|
||||||
|
[Tt]est[Rr]esult*
|
||||||
|
.vs/
|
||||||
|
#Nuget packages folder
|
||||||
|
packages/
|
||||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "netDxf"]
|
||||||
|
path = netDxf
|
||||||
|
url = https://github.com/haplokuon/netDxf.git
|
||||||
31
EtchBendLines.sln
Normal file
31
EtchBendLines.sln
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 16
|
||||||
|
VisualStudioVersion = 16.0.29123.88
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EtchBendLines", "EtchBendLines\EtchBendLines.csproj", "{229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "netDxf", "netDxf\netDxf\netDxf.csproj", "{785380E0-CEB9-4C34-82E5-60D0E33E848E}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{785380E0-CEB9-4C34-82E5-60D0E33E848E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{785380E0-CEB9-4C34-82E5-60D0E33E848E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{785380E0-CEB9-4C34-82E5-60D0E33E848E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{785380E0-CEB9-4C34-82E5-60D0E33E848E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {4EF8ADDD-D992-4DED-BB58-F4DC0F53A4A3}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
6
EtchBendLines/App.config
Normal file
6
EtchBendLines/App.config
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<configuration>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
|
||||||
|
</startup>
|
||||||
|
</configuration>
|
||||||
150
EtchBendLines/Bend.cs
Normal file
150
EtchBendLines/Bend.cs
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
using netDxf;
|
||||||
|
using netDxf.Entities;
|
||||||
|
using netDxf.Tables;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace EtchBendLine
|
||||||
|
{
|
||||||
|
public class Bend
|
||||||
|
{
|
||||||
|
const double RadPerDeg = Math.PI / 180.0;
|
||||||
|
|
||||||
|
public Line Line { get; set; }
|
||||||
|
|
||||||
|
public double YIntercept
|
||||||
|
{
|
||||||
|
get { return Line.YIntercept(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public double Slope
|
||||||
|
{
|
||||||
|
get { return Line.Slope(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsVertical
|
||||||
|
{
|
||||||
|
get { return Line.IsVertical(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsHorizontal
|
||||||
|
{
|
||||||
|
get { return Line.IsHorizontal(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsCollinearTo(Bend bend)
|
||||||
|
{
|
||||||
|
if (bend.IsVertical || this.IsVertical)
|
||||||
|
return (bend.IsVertical && this.IsVertical && bend.YIntercept == this.YIntercept);
|
||||||
|
|
||||||
|
if (bend.YIntercept != this.YIntercept)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return bend.Slope == this.Slope;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Line> GetEtchLines(double etchLength)
|
||||||
|
{
|
||||||
|
var lines = new List<Line>();
|
||||||
|
|
||||||
|
var etchLayer = new Layer("ETCH")
|
||||||
|
{
|
||||||
|
Color = AciColor.Green,
|
||||||
|
};
|
||||||
|
|
||||||
|
var startPoint = new Vector2(Line.StartPoint.X, Line.StartPoint.Y);
|
||||||
|
var endPoint = new Vector2(Line.EndPoint.X, Line.EndPoint.Y);
|
||||||
|
var bendLength = startPoint.DistanceTo(endPoint);
|
||||||
|
|
||||||
|
if (bendLength < (etchLength * 3.0))
|
||||||
|
{
|
||||||
|
var fullLengthLine = new Line(Line.StartPoint, Line.EndPoint)
|
||||||
|
{
|
||||||
|
Layer = etchLayer
|
||||||
|
};
|
||||||
|
|
||||||
|
lines.Add(fullLengthLine);
|
||||||
|
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var angle = startPoint.AngleTo(endPoint);
|
||||||
|
|
||||||
|
if (Line.IsVertical())
|
||||||
|
{
|
||||||
|
var x = Line.StartPoint.X;
|
||||||
|
|
||||||
|
var bottomY1 = Line.StartPoint.Y < Line.EndPoint.Y ? Line.StartPoint.Y : Line.EndPoint.Y;
|
||||||
|
var bottomY2 = bottomY1 + etchLength;
|
||||||
|
|
||||||
|
var topY1 = Line.StartPoint.Y > Line.EndPoint.Y ? Line.StartPoint.Y : Line.EndPoint.Y;
|
||||||
|
var topY2 = topY1 - etchLength;
|
||||||
|
|
||||||
|
var p1 = new Vector2(x, bottomY1);
|
||||||
|
var p2 = new Vector2(x, bottomY2);
|
||||||
|
|
||||||
|
var p3 = new Vector2(x, topY1);
|
||||||
|
var p4 = new Vector2(x, topY2);
|
||||||
|
|
||||||
|
var bottomPoint = Line.StartPoint.Y < Line.EndPoint.Y ? Line.StartPoint : Line.EndPoint;
|
||||||
|
var bottomOffsetPoint = new Vector2(bottomPoint.X, bottomPoint.Y + etchLength);
|
||||||
|
|
||||||
|
var line1 = new Line(p1, p2)
|
||||||
|
{
|
||||||
|
Layer = etchLayer
|
||||||
|
};
|
||||||
|
|
||||||
|
var line2 = new Line(p3, p4)
|
||||||
|
{
|
||||||
|
Layer = etchLayer
|
||||||
|
};
|
||||||
|
|
||||||
|
lines.Add(line1);
|
||||||
|
lines.Add(line2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var start = Line.StartPoint.ToVector2();
|
||||||
|
var end = Line.EndPoint.ToVector2();
|
||||||
|
|
||||||
|
var x1 = Math.Cos(angle);
|
||||||
|
var y1 = Math.Sin(angle);
|
||||||
|
|
||||||
|
var p1 = new Vector2(start.X, start.Y);
|
||||||
|
var p2 = new Vector2(start.X + x1, start.Y + y1);
|
||||||
|
|
||||||
|
var p3 = new Vector2(end.X, end.Y);
|
||||||
|
var p4 = new Vector2(end.X - x1, end.Y - y1);
|
||||||
|
|
||||||
|
var line1 = new Line(p1, p2)
|
||||||
|
{
|
||||||
|
Layer = etchLayer
|
||||||
|
};
|
||||||
|
|
||||||
|
var line2 = new Line(p3, p4)
|
||||||
|
{
|
||||||
|
Layer = etchLayer
|
||||||
|
};
|
||||||
|
|
||||||
|
lines.Add(line1);
|
||||||
|
lines.Add(line2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BendDirection Direction { get; set; }
|
||||||
|
|
||||||
|
public double Length
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var x = Line.EndPoint.X - Line.StartPoint.X;
|
||||||
|
var y = Line.EndPoint.Y - Line.StartPoint.Y;
|
||||||
|
return Math.Sqrt(x * x + y * y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
EtchBendLines/BendDirection.cs
Normal file
9
EtchBendLines/BendDirection.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
namespace EtchBendLine
|
||||||
|
{
|
||||||
|
public enum BendDirection
|
||||||
|
{
|
||||||
|
Up,
|
||||||
|
Down,
|
||||||
|
Unknown
|
||||||
|
}
|
||||||
|
}
|
||||||
61
EtchBendLines/EtchBendLines.csproj
Normal file
61
EtchBendLines/EtchBendLines.csproj
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{229C2FB9-6AD6-4A5D-B83A-D1146573D6F9}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<RootNamespace>EtchBendLine</RootNamespace>
|
||||||
|
<AssemblyName>EtchBendLine</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Bend.cs" />
|
||||||
|
<Compile Include="BendDirection.cs" />
|
||||||
|
<Compile Include="Extensions.cs" />
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="App.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\netDxf\netDxf\netDxf.csproj">
|
||||||
|
<Project>{785380e0-ceb9-4c34-82e5-60d0e33e848e}</Project>
|
||||||
|
<Name>netDxf</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
||||||
102
EtchBendLines/Extensions.cs
Normal file
102
EtchBendLines/Extensions.cs
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
using netDxf;
|
||||||
|
using netDxf.Entities;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace EtchBendLine
|
||||||
|
{
|
||||||
|
public static class Extensions
|
||||||
|
{
|
||||||
|
const double TwoPI = Math.PI * 2.0;
|
||||||
|
|
||||||
|
public static Vector2 ToVector2(this Vector3 pt)
|
||||||
|
{
|
||||||
|
return new Vector2(pt.X, pt.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsVertical(this Line line)
|
||||||
|
{
|
||||||
|
return line.StartPoint.X == line.EndPoint.X;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsHorizontal(this Line line)
|
||||||
|
{
|
||||||
|
return line.StartPoint.Y == line.EndPoint.Y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double Slope(this Line line)
|
||||||
|
{
|
||||||
|
if (line.IsVertical())
|
||||||
|
return double.NaN;
|
||||||
|
|
||||||
|
var p1 = line.StartPoint;
|
||||||
|
var p2 = line.EndPoint;
|
||||||
|
|
||||||
|
return Math.Round((p2.Y - p1.Y) / (p2.X - p1.X), 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double YIntercept(this Line line)
|
||||||
|
{
|
||||||
|
var p1 = line.StartPoint;
|
||||||
|
var p2 = line.EndPoint;
|
||||||
|
var slope = line.Slope();
|
||||||
|
|
||||||
|
// y = mx + b
|
||||||
|
|
||||||
|
return Math.Round(p1.Y - slope * p1.X, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector2 PointPerpendicularTo(this Line line, Vector2 pt)
|
||||||
|
{
|
||||||
|
var startPoint = line.StartPoint.ToVector2();
|
||||||
|
var endPoint = line.EndPoint.ToVector2();
|
||||||
|
|
||||||
|
var d1 = pt - startPoint;
|
||||||
|
var d2 = endPoint - startPoint;
|
||||||
|
var dotProduct = d1.X * d2.X + d1.Y * d2.Y;
|
||||||
|
var lengthSquared = d2.X * d2.X + d2.Y * d2.Y;
|
||||||
|
var param = dotProduct / lengthSquared;
|
||||||
|
|
||||||
|
if (param < 0)
|
||||||
|
return startPoint;
|
||||||
|
else if (param > 1)
|
||||||
|
return endPoint;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return new Vector2(
|
||||||
|
startPoint.X + param * d2.X,
|
||||||
|
startPoint.Y + param * d2.Y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector2 MidPoint(this Line line)
|
||||||
|
{
|
||||||
|
var x = (line.StartPoint.X + line.EndPoint.X) * 0.5;
|
||||||
|
var y = (line.StartPoint.Y + line.EndPoint.Y) * 0.5;
|
||||||
|
|
||||||
|
return new Vector2(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double DistanceTo(this Vector2 startPoint, Vector2 endPoint)
|
||||||
|
{
|
||||||
|
var x = endPoint.X - startPoint.X;
|
||||||
|
var y = endPoint.Y - startPoint.Y;
|
||||||
|
|
||||||
|
return Math.Sqrt(x * x + y * y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double AngleTo(this Vector2 startPoint, Vector2 endPoint)
|
||||||
|
{
|
||||||
|
var x = endPoint.X - startPoint.X;
|
||||||
|
var y = endPoint.Y - startPoint.Y;
|
||||||
|
|
||||||
|
return NormalizeRad(Math.Atan2(y, x));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static double NormalizeRad(double angle)
|
||||||
|
{
|
||||||
|
double r = angle % TwoPI;
|
||||||
|
return r < 0 ? TwoPI + r : r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
266
EtchBendLines/Program.cs
Normal file
266
EtchBendLines/Program.cs
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
using netDxf;
|
||||||
|
using netDxf.Entities;
|
||||||
|
using netDxf.Tables;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace EtchBendLine
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
const double ETCH_LENGTH = 1.0;
|
||||||
|
|
||||||
|
static Layer BendLayer = new Layer("BEND")
|
||||||
|
{
|
||||||
|
Color = AciColor.Yellow
|
||||||
|
};
|
||||||
|
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var path = AppDomain.CurrentDomain.BaseDirectory;
|
||||||
|
var files = Directory.GetFiles(path, "*.dxf", SearchOption.AllDirectories);
|
||||||
|
|
||||||
|
if (files == null || files.Length == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"No DXF files founds. Place DXF files in \"{AppDomain.CurrentDomain.BaseDirectory}\" and run this program again.");
|
||||||
|
PressAnyKeyToExit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var file in files)
|
||||||
|
{
|
||||||
|
AddEtchLines(file);
|
||||||
|
Console.WriteLine("----------------------------------------------------------------");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PressAnyKeyToExit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PressAnyKeyToExit()
|
||||||
|
{
|
||||||
|
Console.WriteLine("Press any key to exit.");
|
||||||
|
Console.ReadKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void AddEtchLines(string filePath)
|
||||||
|
{
|
||||||
|
var name = Path.GetFileNameWithoutExtension(filePath);
|
||||||
|
Console.WriteLine($"Adding etch lines to file \"{name}\"");
|
||||||
|
|
||||||
|
var dxf = LoadDoc(filePath);
|
||||||
|
var bendLines = GetBendLines(dxf);
|
||||||
|
var bendNotes = GetBendNotes(dxf);
|
||||||
|
|
||||||
|
if (bendLines.Count == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("No bend lines found.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Found {bendLines.Count} bend lines.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bendNotes.Count == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("No bend notes found.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Found {bendNotes.Count} bend notes.");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var bendLine in bendLines)
|
||||||
|
{
|
||||||
|
bendLine.Line.Layer = BendLayer;
|
||||||
|
bendLine.Line.Color = AciColor.ByLayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var note in bendNotes)
|
||||||
|
{
|
||||||
|
note.Layer = BendLayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
AssignBendDirections(bendLines, bendNotes);
|
||||||
|
|
||||||
|
var upBends = bendLines.Where(b => b.Direction == BendDirection.Up);
|
||||||
|
|
||||||
|
Console.WriteLine($"{upBends.Count()} up bends, {bendLines.Count - upBends.Count()} down bends.");
|
||||||
|
|
||||||
|
foreach (var bendline in upBends)
|
||||||
|
{
|
||||||
|
var etchLines = bendline.GetEtchLines(ETCH_LENGTH);
|
||||||
|
dxf.AddEntity(etchLines);
|
||||||
|
}
|
||||||
|
|
||||||
|
dxf.Save(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void AssignBendDirections(IEnumerable<Bend> bendlines, IEnumerable<MText> bendNotes)
|
||||||
|
{
|
||||||
|
foreach (var bendline in bendlines)
|
||||||
|
{
|
||||||
|
var bendNote = FindBendNote(bendline.Line, bendNotes);
|
||||||
|
|
||||||
|
if (bendNote == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bendNote.Layer = BendLayer;
|
||||||
|
|
||||||
|
var note = bendNote.Value.ToUpper();
|
||||||
|
|
||||||
|
if (note.Contains("UP"))
|
||||||
|
bendline.Direction = BendDirection.Up;
|
||||||
|
|
||||||
|
else if (note.Contains("DOWN") || note.Contains("DN"))
|
||||||
|
bendline.Direction = BendDirection.Down;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//static MText FindBendNote(Line bendLine, IEnumerable<MText> bendNotes)
|
||||||
|
// {
|
||||||
|
// var startPoint = new Vector2(bendLine.StartPoint.X, bendLine.StartPoint.Y);
|
||||||
|
// var endPoint = new Vector2(bendLine.EndPoint.X, bendLine.EndPoint.Y);
|
||||||
|
// var angle = startPoint.AngleTo(endPoint);
|
||||||
|
|
||||||
|
// if (angle >= 180.0)
|
||||||
|
// angle -= 180.0;
|
||||||
|
|
||||||
|
// const double ANGLE_TOLERANCE = 0.001;
|
||||||
|
|
||||||
|
// var bendNotesWithSameAngle = bendNotes.Where(n => Math.Abs(n.Rotation - angle) < ANGLE_TOLERANCE).ToList();
|
||||||
|
|
||||||
|
// var midPoint = bendLine.MidPoint();
|
||||||
|
|
||||||
|
// MText closestNote = bendNotes.First();
|
||||||
|
// Vector2 closestPoint = closestNote.Position.ToVector2();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// foreach (var note in bendNotes)
|
||||||
|
// {
|
||||||
|
// var pt = note.Position.ToVector2();
|
||||||
|
// var dist = midPoint.DistanceTo(pt);
|
||||||
|
|
||||||
|
// if (dist < distance)
|
||||||
|
// {
|
||||||
|
// closestNote = note;
|
||||||
|
// distance = dist;
|
||||||
|
// closestPoint = pt;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// var distToBendNote = closestNote.Position.ToVector2().DistanceTo(midPoint);
|
||||||
|
|
||||||
|
// if (distToBendNote > 18)
|
||||||
|
// return null;
|
||||||
|
|
||||||
|
// return closestNote;
|
||||||
|
// }
|
||||||
|
|
||||||
|
static MText FindBendNote(Line bendLIne, IEnumerable<MText> bendNotes)
|
||||||
|
{
|
||||||
|
var list = bendNotes.ToList();
|
||||||
|
var shortestDist = double.MaxValue;
|
||||||
|
var shortestDistIndex = -1;
|
||||||
|
|
||||||
|
for (int i = 0; i < list.Count; i++)
|
||||||
|
{
|
||||||
|
var note = list[i];
|
||||||
|
var notePos = note.Position.ToVector2();
|
||||||
|
var perpendicularPoint = bendLIne.PointPerpendicularTo(notePos);
|
||||||
|
var dist = notePos.DistanceTo(perpendicularPoint);
|
||||||
|
|
||||||
|
if (dist < shortestDist)
|
||||||
|
{
|
||||||
|
shortestDistIndex = i;
|
||||||
|
shortestDist = dist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shortestDistIndex == -1)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var bendNote = list[shortestDistIndex];
|
||||||
|
var maxAcceptableDist = bendNote.Height * 2.0;
|
||||||
|
|
||||||
|
if (shortestDist > maxAcceptableDist)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return bendNote;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Vector2? FindClosestPoint(Vector2 originPoint, List<Vector2> pts)
|
||||||
|
{
|
||||||
|
if (pts == null || pts.Any() == false)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var closest = pts[0];
|
||||||
|
var distance = originPoint.DistanceTo(closest);
|
||||||
|
|
||||||
|
for (int i = 1; i < pts.Count; i++)
|
||||||
|
{
|
||||||
|
var pt = pts[i];
|
||||||
|
var dist = originPoint.DistanceTo(pt);
|
||||||
|
|
||||||
|
if (dist < distance)
|
||||||
|
{
|
||||||
|
distance = dist;
|
||||||
|
closest = pts[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return closest;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DxfDocument LoadDoc(string file)
|
||||||
|
{
|
||||||
|
return DxfDocument.Load(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<Bend> GetBendLines(DxfDocument dxf)
|
||||||
|
{
|
||||||
|
var bends = new List<Bend>();
|
||||||
|
|
||||||
|
foreach (var line in dxf.Lines)
|
||||||
|
{
|
||||||
|
if (line.Linetype.Name != "CENTERX2" && line.Layer.Name != "BEND")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var bend = new Bend
|
||||||
|
{
|
||||||
|
Line = line,
|
||||||
|
Direction = BendDirection.Unknown
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
bends.Add(bend);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bends;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<MText> GetBendNotes(DxfDocument dxf)
|
||||||
|
{
|
||||||
|
var bendNotes = new List<MText>();
|
||||||
|
|
||||||
|
foreach (var text in dxf.MTexts)
|
||||||
|
{
|
||||||
|
var textAsUpper = text.Value.ToUpper();
|
||||||
|
|
||||||
|
if (textAsUpper.Contains("UP") || textAsUpper.Contains("DOWN"))
|
||||||
|
{
|
||||||
|
bendNotes.Add(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bendNotes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
36
EtchBendLines/Properties/AssemblyInfo.cs
Normal file
36
EtchBendLines/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("EtchBendLine")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("EtchBendLine")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("229c2fb9-6ad6-4a5d-b83a-d1146573d6f9")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
1
netDxf
Submodule
1
netDxf
Submodule
Submodule netDxf added at 67789bfe70
Reference in New Issue
Block a user