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 @@ +