diff --git a/DesignTools/Operations/Align.cs b/DesignTools/Operations/Align.cs
index cf5967aa3..3292dbc88 100644
--- a/DesignTools/Operations/Align.cs
+++ b/DesignTools/Operations/Align.cs
@@ -78,8 +78,8 @@ namespace MatterHackers.MatterControl.DesignTools.Operations
}
}
- public Align(IObject3D objectToAlign, Face boundingFacesToAlign, double offsetX = 0, double offsetY = 0, double offsetZ = 0, string name = "")
- : this(objectToAlign, boundingFacesToAlign, new Vector3(offsetX, offsetY, offsetZ), name)
+ public Align(IObject3D objectToAlign, Face boundingFacesToAlign, double positionToAlignToX = 0, double positionToAlignToY = 0, double positionToAlignToZ = 0, string name = "")
+ : this(objectToAlign, boundingFacesToAlign, new Vector3(positionToAlignToX, positionToAlignToY, positionToAlignToZ), name)
{
}
diff --git a/TextCreator/Braille/BrailleCardObject3D.cs b/TextCreator/Braille/BrailleCardObject3D.cs
new file mode 100644
index 000000000..1518af8d2
--- /dev/null
+++ b/TextCreator/Braille/BrailleCardObject3D.cs
@@ -0,0 +1,99 @@
+/*
+Copyright (c) 2018, Lars Brubaker, John Lewin
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation are those
+of the authors and should not be interpreted as representing official policies,
+either expressed or implied, of the FreeBSD Project.
+*/
+
+using System.ComponentModel;
+using System.IO;
+using MatterHackers.Agg;
+using MatterHackers.Agg.Font;
+using MatterHackers.Agg.Platform;
+using MatterHackers.Agg.Transform;
+using MatterHackers.Agg.UI;
+using MatterHackers.Agg.VertexSource;
+using MatterHackers.DataConverters3D;
+using MatterHackers.MatterControl.DesignTools.Operations;
+using MatterHackers.MatterControl.Plugins.BrailleBuilder;
+using MatterHackers.VectorMath;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
+
+namespace MatterHackers.MatterControl.DesignTools
+{
+ [WebPageLink("About Braille", "https://en.wikipedia.org/wiki/Braille")]
+ public class BrailleCardObject3D : Object3D, IRebuildable
+ {
+ public BrailleCardObject3D()
+ {
+ }
+
+ public static BrailleCardObject3D Create()
+ {
+ var item = new BrailleCardObject3D();
+
+ item.Rebuild(null);
+ return item;
+ }
+
+ public override string ActiveEditor => "PublicPropertyEditor";
+
+ public char Letter { get; set; } = 'a';
+
+ public double BaseHeight { get; set; } = 3;
+
+ public void Rebuild(UndoBuffer undoBuffer)
+ {
+ var aabb = this.GetAxisAlignedBoundingBox();
+
+ this.Children.Modify(list =>
+ {
+ list.Clear();
+ });
+
+ var brailleLetter = new BrailleObject3D()
+ {
+ TextToEncode = Letter.ToString(),
+ BaseHeight = BaseHeight,
+ };
+ brailleLetter.Rebuild(null);
+
+ var padding = 10;
+ IObject3D basePlate = new CubeObject3D(brailleLetter.XSize() + padding, BaseHeight, brailleLetter.ZSize() + padding);
+ basePlate = new SetCenter(basePlate, brailleLetter.GetCenter() - new Vector3(0, 0, brailleLetter.ZSize() / 2 + basePlate.ZSize() / 2 - .01));
+ this.Children.Add(basePlate);
+
+ // add the object that is the dots
+ this.Children.Add(brailleLetter);
+
+ if (aabb.ZSize > 0)
+ {
+ // If the part was already created and at a height, maintain the height.
+ PlatingHelper.PlaceMeshAtHeight(this, aabb.minXYZ.Z);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/TextCreator/Braille/BrailleObject3D.cs b/TextCreator/Braille/BrailleObject3D.cs
index d5b7068b6..94697d8e1 100644
--- a/TextCreator/Braille/BrailleObject3D.cs
+++ b/TextCreator/Braille/BrailleObject3D.cs
@@ -51,6 +51,12 @@ namespace MatterHackers.MatterControl.DesignTools
{
}
+ public BrailleObject3D(string textToEncode)
+ {
+ TextToEncode = textToEncode;
+ Rebuild(null);
+ }
+
public static BrailleObject3D Create()
{
var item = new BrailleObject3D();
@@ -93,6 +99,17 @@ namespace MatterHackers.MatterControl.DesignTools
double pointsToMm = 0.352778;
IObject3D textObject = new Object3D();
var offest = 0.0;
+
+ TypeFacePrinter textPrinter;
+ if (RenderAsBraille)
+ {
+ textPrinter = new TypeFacePrinter(TextToEncode, new StyledTypeFace(typeFace, pointSize));
+ }
+ else
+ {
+ textPrinter = new TypeFacePrinter(TextToEncode, new StyledTypeFace(ApplicationController.MonoSpacedTypeFace, pointSize));
+ }
+
foreach (var letter in brailleText.ToCharArray())
{
IObject3D letterObject;
@@ -159,8 +176,13 @@ namespace MatterHackers.MatterControl.DesignTools
}
// add a plate under the dots
- IObject3D basePlate = new CubeObject3D(textObject.XSize() + pointSize * pointsToMm / 2, textObject.YSize() + 1.7 * pointSize * pointsToMm / 2, BaseHeight);
- basePlate = new SetCenter(basePlate, textObject.GetCenter() - new Vector3(0, 0, textObject.ZSize() / 2 + basePlate.ZSize() / 2 - .01));
+ var padding = 1.7 * pointSize * pointsToMm / 2;
+ var size = textPrinter.LocalBounds * pointsToMm;
+ IObject3D basePlate = new CubeObject3D(size.Width + padding, size.Height + padding, BaseHeight);
+ basePlate = new Align(basePlate, Face.Top, textObject, Face.Bottom, 0, 0, -.01);
+ basePlate = new Align(basePlate, Face.Left | Face.Front,
+ size.Left - padding/2,
+ size.Bottom - padding/2);
this.Children.Add(basePlate);
basePlate.Matrix *= Matrix4X4.CreateRotationX(MathHelper.Tau / 4);
diff --git a/TextCreator/TextCreator.csproj b/TextCreator/TextCreator.csproj
index e274800ff..d96ddc983 100644
--- a/TextCreator/TextCreator.csproj
+++ b/TextCreator/TextCreator.csproj
@@ -57,6 +57,7 @@
+