public static void ConvertBrailleText() { Assert.IsTrue(BrailleGrade2.ConvertWord("taylor") == "taylor"); Assert.IsTrue(BrailleGrade2.ConvertWord("Taylor") == ",taylor"); Assert.IsTrue(BrailleGrade2.ConvertWord("TayLor") == ",tay,lor"); Assert.IsTrue(BrailleGrade2.ConvertWord("energy") == "5}gy"); Assert.IsTrue(BrailleGrade2.ConvertWord("men") == "m5"); Assert.IsTrue(BrailleGrade2.ConvertWord("runabout") == "runab"); Assert.IsTrue(BrailleGrade2.ConvertWord("afternoon") == "afn"); Assert.IsTrue(BrailleGrade2.ConvertWord("really") == "re,y"); Assert.IsTrue(BrailleGrade2.ConvertWord("glance") == "gl.e"); Assert.IsTrue(BrailleGrade2.ConvertWord("station") == "/,n"); Assert.IsTrue(BrailleGrade2.ConvertWord("as") == "z"); Assert.IsTrue(BrailleGrade2.ConvertWord("abby") == "a2y"); Assert.IsTrue(BrailleGrade2.ConvertWord("commitment") == "-mit;t"); Assert.IsTrue(BrailleGrade2.ConvertWord("mother") == "\"m"); Assert.IsTrue(BrailleGrade2.ConvertWord("myself") == "myf"); Assert.IsTrue(BrailleGrade2.ConvertWord("lochness") == "lo*;s"); Assert.IsTrue(BrailleGrade2.ConvertWord("Seven o'clock") == ",sev5 o'c"); Assert.IsTrue(BrailleGrade2.ConvertWord("test") == "te/"); Assert.IsTrue(BrailleGrade2.ConvertWord("that") == "t"); Assert.IsTrue(BrailleGrade2.ConvertWord("will") == "w"); Assert.IsTrue(BrailleGrade2.ConvertWord("show") == "%{"); Assert.IsTrue(BrailleGrade2.ConvertWord("our") == "|r"); Assert.IsTrue(BrailleGrade2.ConvertWord("with") == ")"); Assert.IsTrue(BrailleGrade2.ConvertWord("braille") == "brl"); Assert.IsTrue(BrailleGrade2.ConvertWord("conformance") == "3=m.e"); Assert.IsTrue(BrailleGrade2.ConvertString("go to sleep") == "g 6sleep"); Assert.IsTrue(BrailleGrade2.ConvertString("go to") == "g to"); Assert.IsTrue(BrailleGrade2.ConvertString("here it is") == "\"h x is"); Assert.IsTrue(BrailleGrade2.ConvertString("test that will show our conformance with braille") == "te/ t w %{ |r 3=m.e ) brl"); Assert.IsTrue(BrailleGrade2.ConvertString("so we can create some strings and then this gives us the output that is expected") == "s we c cr1te \"s /r+s & !n ? gives u ! |tput t is expect$"); Assert.IsTrue(BrailleGrade2.ConvertString("Waltz, bad nymph, for quick jigs vex.") == ",waltz1 bad nymph1 = qk jigs vex4"); Assert.IsTrue(BrailleGrade2.ConvertString("Quick zephyrs blow, vexing daft Jim.") == ",qk zephyrs bl{1 vex+ daft ,jim4"); Assert.IsTrue(BrailleGrade2.ConvertString("Sphinx of black quartz, judge my vow.") == ",sph9x ( black qu>tz1 judge my v{4"); Assert.IsTrue(BrailleGrade2.ConvertString("Two driven jocks help fax my big quiz.") == ",two driv5 jocks help fax my big quiz4"); // Assert.IsTrue(BrailleGrade2.ConvertString("Five quacking zephyrs jolt my wax bed.") == ",five quack+ zephyrs jolt my wax b$4"); Assert.IsTrue(BrailleGrade2.ConvertString("The five boxing wizards jump quickly.") == ",! five box+ wiz>ds jump qkly4"); Assert.IsTrue(BrailleGrade2.ConvertString("Pack my box with five dozen liquor jugs.") == ",pack my box ) five doz5 liquor jugs4"); Assert.IsTrue(BrailleGrade2.ConvertString("The quick brown fox jumps over the lazy dog.") == ",! qk br{n fox jumps ov} ! lazy dog4"); Assert.IsTrue(BrailleGrade2.ConvertString("Jinxed wizards pluck ivy from the big quilt.") == ",j9x$ wiz>ds pluck ivy f ! big quilt4"); Assert.IsTrue(BrailleGrade2.ConvertString("Crazy Fredrick bought many very exquisite opal jewels.") == ",crazy ,fr$rick b\"| _m v exquisite opal jewels4"); Assert.IsTrue(BrailleGrade2.ConvertString("We promptly judged antique ivory buckles for the next prize.") == ",we promptly judg$ antique ivory buckles =! next prize4"); Assert.IsTrue(BrailleGrade2.ConvertString("A mad boxer shot a quick, gloved jab to the jaw of his dizzy opponent.") == ",a mad box} %ot a qk1 glov$ jab 6! jaw ( 8 dizzy opp\"ont4"); Assert.IsTrue(BrailleGrade2.ConvertString("Jaded zombies acted quaintly but kept driving their oxen forward.") == ",jad$ zombies act$ qua9tly b kept driv+ _! ox5 =w>d4"); Assert.IsTrue(BrailleGrade2.ConvertString("14. The job requires extra pluck and zeal from every young wage earner.") == "#ad4 ,! job requires extra pluck & z1l f e \"y wage e>n}4"); Assert.IsTrue(BrailleGrade2.ConvertString("Just wanting to put together some more tests to show the effectiveness of our converter.") == ",j want+ 6put tgr \"s m te/s 6%{ ! e6ective;s ( |r 3v}t}4"); }
override public Task Rebuild() { using (RebuildLock()) { using (new CenterAndHeightMantainer(this)) { this.Children.Modify(list => { list.Clear(); }); var brailleText = TextToEncode; if (UseGrade2) { brailleText = BrailleGrade2.ConvertString(brailleText); } double pointSize = 18.5; double pointsToMm = 0.352778; IObject3D textObject = new Object3D(); var offest = 0.0; TypeFacePrinter textPrinter; if (RenderAsBraille) { textPrinter = new TypeFacePrinter(brailleText, new StyledTypeFace(typeFace, pointSize)); } else { textPrinter = new TypeFacePrinter(brailleText, new StyledTypeFace(ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono), pointSize)); } foreach (var letter in brailleText.ToCharArray()) { IObject3D letterObject; TypeFacePrinter letterPrinter; if (RenderAsBraille) { letterPrinter = new TypeFacePrinter(letter.ToString(), new StyledTypeFace(typeFace, pointSize)); var scalledLetterPrinter = new VertexSourceApplyTransform(letterPrinter, Affine.NewScaling(pointsToMm)); // add all the spheres to letterObject letterObject = new Object3D(); var vertexCount = 0; var positionSum = Vector2.Zero; var lastPosition = Vector2.Zero; // find each dot outline and get it's center and place a sphere there foreach (var vertex in scalledLetterPrinter.Vertices()) { switch (vertex.command) { case Agg.ShapePath.FlagsAndCommand.Stop: case Agg.ShapePath.FlagsAndCommand.EndPoly: case Agg.ShapePath.FlagsAndCommand.FlagClose: case Agg.ShapePath.FlagsAndCommand.MoveTo: if (vertexCount > 0) { var center = positionSum / vertexCount; double radius = 1.44 / 2; // (center - lastPosition).Length; var sphere = new HalfSphereObject3D(radius * 2, 15) { Color = Color.LightBlue }; sphere.Translate(center.X, center.Y); letterObject.Children.Add(sphere); } vertexCount = 0; positionSum = Vector2.Zero; break; case Agg.ShapePath.FlagsAndCommand.Curve3: case Agg.ShapePath.FlagsAndCommand.Curve4: case Agg.ShapePath.FlagsAndCommand.LineTo: vertexCount++; lastPosition = vertex.position; positionSum += lastPosition; break; } } } else { letterPrinter = new TypeFacePrinter(letter.ToString(), new StyledTypeFace(ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono), pointSize)); var scalledLetterPrinter = new VertexSourceApplyTransform(letterPrinter, Affine.NewScaling(pointsToMm)); letterObject = new Object3D() { Mesh = VertexSourceToMesh.Extrude(scalledLetterPrinter, 1), Color = Color.LightBlue }; } letterObject.Matrix = Matrix4X4.CreateTranslation(offest, 0, 0); textObject.Children.Add(letterObject); offest += letterPrinter.GetSize(letter.ToString()).X *pointsToMm; } // add a plate under the dots var padding = .9 * pointSize * pointsToMm / 2; var size = textPrinter.LocalBounds * pointsToMm; // make the base var basePath = new VertexStorage(); basePath.MoveTo(0, 0); basePath.LineTo(size.Width + padding, 0); basePath.LineTo(size.Width + padding, size.Height + padding); basePath.LineTo(padding, size.Height + padding); basePath.LineTo(0, size.Height); IObject3D basePlate = new Object3D() { Mesh = VertexSourceToMesh.Extrude(basePath, BaseHeight) }; basePlate = new AlignObject3D(basePlate, FaceAlign.Top, textObject, FaceAlign.Bottom, 0, 0, .01); basePlate = new AlignObject3D(basePlate, FaceAlign.Left | FaceAlign.Front, size.Left - padding / 2, size.Bottom - padding / 2); this.Children.Add(basePlate); basePlate.Matrix *= Matrix4X4.CreateRotationX(MathHelper.Tau / 4); // add an optional chain hook if (AddHook) { // x 10 to make it smoother double edgeWidth = 3; double height = basePlate.ZSize(); IVertexSource leftSideObject = new RoundedRect(0, 0, height / 2, height, 0) { ResolutionScale = 10 }; IVertexSource cicleObject = new Ellipse(0, 0, height / 2, height / 2) { ResolutionScale = 10 }; cicleObject = new Align2D(cicleObject, Side2D.Left | Side2D.Bottom, leftSideObject, Side2D.Left | Side2D.Bottom, -.01); IVertexSource holeObject = new Ellipse(0, 0, height / 2 - edgeWidth, height / 2 - edgeWidth) { ResolutionScale = 10 }; holeObject = new SetCenter2D(holeObject, cicleObject.GetBounds().Center); IVertexSource hookPath = leftSideObject.Plus(cicleObject); hookPath = hookPath.Minus(holeObject); IObject3D chainHook = new Object3D() { Mesh = VertexSourceToMesh.Extrude(hookPath, BaseHeight), Matrix = Matrix4X4.CreateRotationX(MathHelper.Tau / 4) }; chainHook = new AlignObject3D(chainHook, FaceAlign.Left | FaceAlign.Bottom | FaceAlign.Back, basePlate, FaceAlign.Right | FaceAlign.Bottom | FaceAlign.Back, -.01); this.Children.Add(chainHook); } // add the object that is the dots this.Children.Add(textObject); textObject.Matrix *= Matrix4X4.CreateRotationX(MathHelper.Tau / 4); } } Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children)); return(Task.CompletedTask); }