diff --git a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs
index a9dd0b8..0659bc7 100644
--- a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs
+++ b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs
@@ -58,14 +58,16 @@ namespace OSCADSharp.ConsoleTests
static void Main(string[] args)
{
var img = ImportedImage.FromFile("seahawks coaster.png").Scale(1, 1, Inches.Quarter + Inches.Eigth);
- var imgPos = img.Position();
- var _base = new Cylinder(img.Bounds().Width + Inches.Quarter, Inches.Quarter);
+ img.ToFile("testImg").Open();
- var rim = _base.Clone().Scale(1, 1, 1.25) - _base.Clone().Scale(.9, .9, 3.5).Translate(0, 0, -Inches.Eigth);
- var coaster = img + _base.Translate(imgPos.X, imgPos.Y, 0) + rim.Translate(imgPos.X, imgPos.Y, Inches.Quarter); ;
+ //var imgPos = img.Position();
+ //var _base = new Cylinder(img.Bounds().Width + Inches.Quarter, Inches.Quarter);
+
+ //var rim = _base.Clone().Scale(1, 1, 1.25) - _base.Clone().Scale(.9, .9, 3.5).Translate(0, 0, -Inches.Eigth);
+ //var coaster = img + _base.Translate(imgPos.X, imgPos.Y, 0) + rim.Translate(imgPos.X, imgPos.Y, Inches.Quarter); ;
- coaster.ToFile("seaImg").Open();
+ //coaster.ToFile("seaImg").Open();
//makePeg();
diff --git a/OSCADSharp/OSCADSharp/OSCADSharp.csproj b/OSCADSharp/OSCADSharp/OSCADSharp.csproj
index 8e45585..41a2b7c 100644
--- a/OSCADSharp/OSCADSharp/OSCADSharp.csproj
+++ b/OSCADSharp/OSCADSharp/OSCADSharp.csproj
@@ -49,8 +49,11 @@
+
+
+
diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/CubistImageProcessor.cs b/OSCADSharp/OSCADSharp/Solids/Imported/CubistImageProcessor.cs
index d772bf0..3285c21 100644
--- a/OSCADSharp/OSCADSharp/Solids/Imported/CubistImageProcessor.cs
+++ b/OSCADSharp/OSCADSharp/Solids/Imported/CubistImageProcessor.cs
@@ -11,7 +11,7 @@ namespace OSCADSharp.Solids.Imported
///
/// Processes a bitmap image by treating contiguous same-color regions as cubes
///
- internal class CubistImageProcessor
+ internal class CubistImageProcessor : IImageProcessor
{
#region Private Fields
private string imagePath;
@@ -19,15 +19,15 @@ namespace OSCADSharp.Solids.Imported
#endregion
#region Internal Fields
- internal Bounds ImageBounds { get; set; }
+ public Bounds ImageBounds { get; set; }
#endregion
- public CubistImageProcessor(string imagePath)
+ internal CubistImageProcessor(string imagePath)
{
this.imagePath = imagePath;
}
- internal OSCADObject ProcessImage()
+ public OSCADObject ProcessImage()
{
this.cubes = this.processImage();
OSCADObject obj = new OSCADObject.MultiStatementObject("union()", cubes);
@@ -36,8 +36,9 @@ namespace OSCADSharp.Solids.Imported
return obj;
}
-
+
+ #region Private Methods
private List processImage()
{
Bitmap img = new Bitmap(Image.FromFile(this.imagePath));
@@ -174,5 +175,8 @@ namespace OSCADSharp.Solids.Imported
return null;
}
+
+
+ #endregion
}
}
diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/IImageProcessor.cs b/OSCADSharp/OSCADSharp/Solids/Imported/IImageProcessor.cs
new file mode 100644
index 0000000..b725d6d
--- /dev/null
+++ b/OSCADSharp/OSCADSharp/Solids/Imported/IImageProcessor.cs
@@ -0,0 +1,15 @@
+using OSCADSharp.Spatial;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OSCADSharp.Solids.Imported
+{
+ internal interface IImageProcessor
+ {
+ OSCADObject ProcessImage();
+ Bounds ImageBounds { get; set; }
+ }
+}
diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/ImageImportMode.cs b/OSCADSharp/OSCADSharp/Solids/Imported/ImageImportMode.cs
new file mode 100644
index 0000000..ac332cd
--- /dev/null
+++ b/OSCADSharp/OSCADSharp/Solids/Imported/ImageImportMode.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OSCADSharp.Solids.Imported
+{
+ ///
+ /// Ways to process imported images into 3D models
+ ///
+ public enum ImageImportMode
+ {
+ ///
+ /// Cubist import mode subdivides the image into rectangular sections,
+ /// forming the bitmap from groupings of cubes representing its pixels
+ ///
+ Cubist,
+
+ ///
+ /// Polygonal import model scans the image for sections that can be represented
+ /// by whole polygons for each contiguous area
+ ///
+ Polygonal
+ }
+}
diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/ImportedImage.cs b/OSCADSharp/OSCADSharp/Solids/Imported/ImportedImage.cs
index 828411d..f1aab61 100644
--- a/OSCADSharp/OSCADSharp/Solids/Imported/ImportedImage.cs
+++ b/OSCADSharp/OSCADSharp/Solids/Imported/ImportedImage.cs
@@ -24,19 +24,30 @@ namespace OSCADSharp.Solids.Imported
/// Creates an imported image from the specified file
///
///
+ ///
///
- public static ImportedImage FromFile(string imagePath)
+ public static ImportedImage FromFile(string imagePath, ImageImportMode mode = ImageImportMode.Cubist)
{
+ IImageProcessor processor;
+ if(mode == ImageImportMode.Cubist)
+ {
+ processor = new CubistImageProcessor(imagePath);
+ }
+ else
+ {
+ processor = new PolygonalImageProcessor(imagePath);
+ }
- var processor = new CubistImageProcessor(imagePath);
var obj = processor.ProcessImage();
- var img = new ImportedImage() {
+ var img = new ImportedImage()
+ {
m_Object = obj,
m_Bounds = processor.ImageBounds
};
return img;
+
}
#endregion
diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs b/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs
new file mode 100644
index 0000000..c774178
--- /dev/null
+++ b/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs
@@ -0,0 +1,76 @@
+using OSCADSharp.Spatial;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OSCADSharp.Solids.Imported
+{
+ ///
+ /// Processes a bitmap image by treating contiguous same-color regions as cubes
+ ///
+ internal class PolygonalImageProcessor : IImageProcessor
+ {
+ #region Private Fields
+ private string imagePath;
+ #endregion
+
+ #region Public Fields
+ public Bounds ImageBounds { get; set; }
+ #endregion
+
+ #region Constructors
+ internal PolygonalImageProcessor(string imagePath)
+ {
+ this.imagePath = imagePath;
+ }
+ #endregion
+
+ public OSCADObject ProcessImage()
+ {
+ var polygons = this.processImage();
+ OSCADObject obj = new OSCADObject.MultiStatementObject("union()", polygons);
+ obj = obj.Rotate(0, 0, 180);
+ obj = obj.Translate(ImageBounds.Length, ImageBounds.Width, 0);
+
+ return obj;
+ }
+
+ private List processImage()
+ {
+ Bitmap img = new Bitmap(Image.FromFile(this.imagePath));
+
+ if (img.Width > 200 || img.Height > 200)
+ {
+ throw new InvalidOperationException("Cannot process images larger greater than 200x200 pixels");
+ }
+
+ this.ImageBounds = new Bounds(new Vector3(), new Vector3(img.Width, img.Height, 1));
+
+ var separatedColors = this.separateColors(img);
+ throw new NotImplementedException();
+ }
+
+ private Dictionary>> separateColors(Bitmap img)
+ {
+ var colorGroupings = new Dictionary>>();
+ for (int column = 0; column < img.Width; column++)
+ {
+ for (int row = 0; row < img.Height; row++)
+ {
+ var color = img.GetPixel(column, row);
+ if (!colorGroupings.ContainsKey(color.Name))
+ {
+ colorGroupings[color.Name] = new List>();
+ }
+
+ colorGroupings[color.Name].Add(new KeyValuePair(new Point(column, row), color));
+ }
+ }
+
+ return colorGroupings;
+ }
+ }
+}