Преглед на файлове

Added "Solids"; Fixed Inserts not building the dimension blocks

Kenric Nugteren преди 6 месеца
родител
ревизия
b11203fb8f
променени са 2 файла, в които са добавени 63 реда и са изтрити 15 реда
  1. 9 0
      inabox.dxf/DxfUtils.cs
  2. 54 15
      inabox.dxf/Objects.cs

+ 9 - 0
inabox.dxf/DxfUtils.cs

@@ -108,6 +108,14 @@ public static class DxfUtils
         {
             return new DxfDimension(dim);
         }
+        else if(el is Solid solid)
+        {
+            return new DxfSolid(solid);
+        }
+        else if (el is netDxf.Entities.Point point)
+        {
+            return null;
+        }
         else
         {
             return null;
@@ -145,6 +153,7 @@ public static class DxfUtils
         settings ??= new();
 
         var document = DxfDocument.Load(stream, settings.SupportFolders ?? Array.Empty<string>());
+        document.BuildDimensionBlocks = true;
         return new(document, settings);
     }
     public static DxfData LoadDxf(Stream stream, DxfImportSettings? settings = null)

+ 54 - 15
inabox.dxf/Objects.cs

@@ -41,17 +41,21 @@ internal class DxfInsert : IDxfObject
 
     public void Draw(DrawData data)
     {
-        if (!Insert.IsVisible) return;
+        if (!Insert.IsVisible || !data.Data.HasLayer(Insert.Layer)) return;
 
-        data.PushTransform();
-        data.Translate(new PointF((float)Insert.Position.X, (float)Insert.Position.Y));
-        data.Rotate((float)Insert.Rotation);
-        data.Scale((float)Insert.Scale.X, (float)Insert.Scale.Y);
-        foreach(var obj in Objects)
+        var transformation = Insert.GetTransformation();
+        var translation = Insert.Position - transformation * Insert.Block.Origin;
+
+        foreach(var entity in Insert.Block.Entities)
         {
-            obj.Draw(data);
+            entity.TransformBy(transformation, translation);
+            DxfUtils.ConvertEl(entity)?.Draw(data);
         }
-        data.PopTransform();
+
+        // foreach(var obj in Insert.Explode())
+        // {
+        //     DxfUtils.ConvertEl(obj)?.Draw(data);
+        // }
     }
 }
 
@@ -68,13 +72,41 @@ internal class DxfEllipse : IDxfObject
     {
         if (!Ellipse.IsVisible || !data.Data.HasLayer(Ellipse.Layer)) return;
 
-        var center = DrawData.ConvertPoint(Ellipse.Center);
-        var size = new SizeF((float)Ellipse.MajorAxis, (float)Ellipse.MinorAxis);
+        foreach(var obj in Ellipse.ToPolyline2D(100).Explode())
+        {
+            DxfUtils.ConvertEl(obj)?.Draw(data);
+        }
+        // var center = DrawData.ConvertPoint(Ellipse.Center);
+        // var size = new SizeF((float)Ellipse.MajorAxis, (float)Ellipse.MinorAxis);
 
-        var startAngle = (float)(Ellipse.StartAngle);
-        var endAngle = (float)(Ellipse.EndAngle);
+        // var startAngle = (float)(Ellipse.StartAngle);
+        // var endAngle = (float)(Ellipse.EndAngle);
 
-        data.Graphics.DrawArc(new Pen(Color.Black, data.ConvertThickness((float)Ellipse.Thickness)), center.X - size.Width / 2, center.Y - size.Height / 2, size.Width, size.Height, startAngle, Utils.Mod(endAngle - startAngle, 360));
+        // data.Graphics.DrawArc(new Pen(Color.Black, data.ConvertThickness((float)Ellipse.Thickness)), center.X - size.Width / 2, center.Y - size.Height / 2, size.Width, size.Height, startAngle, Utils.Mod(endAngle - startAngle, 360));
+    }
+}
+
+internal class DxfSolid : IDxfObject
+{
+    public Solid Solid { get; set; }
+
+    public DxfSolid(Solid solid)
+    {
+        Solid = solid;
+    }
+
+    public void Draw(DrawData data)
+    {
+        if (!Solid.IsVisible || !data.Data.HasLayer(Solid.Layer)) return;
+
+        var vertices = new Vector2[]
+        {
+            Solid.FirstVertex,
+            Solid.SecondVertex,
+            Solid.FourthVertex, // Apparently the third and fourth are the wrong way round, so I've mirrored that here.
+            Solid.ThirdVertex
+        };
+        data.Graphics.FillPolygon(new SolidBrush(Color.Black), vertices.ToArray(x => DrawData.ConvertPoint(x)));
     }
 }
 
@@ -149,12 +181,14 @@ internal class DxfMText : IDxfObject
             });
         }
 
+        var text = MText.PlainText().Replace("^M", "");
+
         data.PushTransform();
         data.Translate(new PointF((float)MText.Position.X, (float)MText.Position.Y));
         data.Rotate((float)MText.Rotation);
         data.Scale(1, -1);
 
-        var size = data.Graphics.MeasureString(MText.PlainText(), font, new PointF(), StringFormat.GenericTypographic);
+        var size = data.Graphics.MeasureString(text, font, new PointF(), StringFormat.GenericTypographic);
         switch (MText.AttachmentPoint)
         {
             case MTextAttachmentPoint.MiddleLeft:
@@ -194,7 +228,7 @@ internal class DxfMText : IDxfObject
                 break;
         }
 
-        data.Graphics.DrawString(MText.PlainText(), font, new SolidBrush(Color.Black), new PointF(0, 0), StringFormat.GenericTypographic);
+        data.Graphics.DrawString(text, font, new SolidBrush(Color.Black), new PointF(0, 0), StringFormat.GenericTypographic);
         data.PopTransform();
     }
 }
@@ -212,6 +246,11 @@ internal class DxfDimension : IDxfObject
     {
         if (!Dimension.IsVisible || !data.Data.HasLayer(Dimension.Layer)) return;
 
+        if(Dimension.Block is null)
+        {
+            return;
+        }
+
         var entities = Dimension.Block.Entities;
         foreach(var entity in entities)
         {