public override async Task Rebuild() { this.DebugDepth("Rebuild"); using (RebuildLock()) { var currentAssetPath = ImageObject == null?AggContext.StaticData.ToAssetPath(Path.Combine("Images", "mh-logo.png")) : ImageObject.AssetPath; this.Children.Modify((list) => { list.Clear(); }); var imageObject = new ImageObject3D() { AssetPath = currentAssetPath, }; await imageObject.Rebuild(); this.Children.Add(imageObject); IObject3D logoBase = new CylinderObject3D(outerDiameter, 3, 60); IObject3D logoRing = new AlignObject3D(new RingObject3D(outerDiameter, innerDiameter, 2, 60), FaceAlign.Bottom, logoBase, FaceAlign.Top); IObject3D coinBlank = logoBase.Plus(logoRing); if (CreateHook) { var cube = await CubeObject3D.Create(4, 2, 4); IObject3D connect = logoBase.Plus(new AlignObject3D(cube, FaceAlign.Front | FaceAlign.Bottom, logoBase, FaceAlign.Back | FaceAlign.Bottom, 0, -.5)); IObject3D hook = logoBase.Plus(new AlignObject3D(new RingObject3D(10, 7, 5, 30), FaceAlign.Front | FaceAlign.Bottom, connect, FaceAlign.Back | FaceAlign.Bottom, 0, -.5)); coinBlank = coinBlank.Plus(connect); coinBlank = coinBlank.Plus(hook); } var imageToPath = new ImageToPathObject3D(); imageToPath.Children.Add(imageObject); await imageToPath.Rebuild(); var inputShape = imageToPath.VertexSource; if (Inflate != 0) { var bounds = inputShape.GetBounds(); var scale = Math.Max(bounds.Width, bounds.Height) / (17 * 4); inputShape = inputShape.Offset(Inflate * scale); } if (AlternateCentering) { inputShape = new VertexSourceApplyTransform(inputShape, GetCenteringTransformVisualCenter(inputShape, innerDiameter / 2)); } else { inputShape = new VertexSourceApplyTransform(inputShape, GetCenteringTransformExpandedToRadius(inputShape, innerDiameter / 2)); } if (ScalePercent != 100 && ScalePercent != 0) { inputShape = new VertexSourceApplyTransform(inputShape, Affine.NewScaling(ScalePercent / 100.0)); } if (NegativeSpace) { var disk = new Ellipse(0, 0, innerDiameter / 2 + .2, innerDiameter / 2 + .2) { ResolutionScale = 1000 }; inputShape = disk.Minus(inputShape); } imageToPath.VertexSource = inputShape; var pathExtrusion = new LinearExtrudeObject3D(); pathExtrusion.Children.Add(imageToPath); await pathExtrusion.Rebuild(); IObject3D extrusionObject = imageObject; var loadingScale = 32 / extrusionObject.XSize(); extrusionObject = new ScaleObject3D(extrusionObject, loadingScale, loadingScale, 1 / extrusionObject.ZSize()); extrusionObject = PlaceOnBase(logoBase, extrusionObject); this.Children.Add(coinBlank); this.Children.Add(extrusionObject); } Invalidate(InvalidateType.Mesh); }
public override async Task Rebuild() { using (RebuildLock()) { using (new CenterAndHeightMantainer(this)) { this.Children.Modify(list => { list.Clear(); }); var brailleLetter = new BrailleObject3D() { TextToEncode = Letter.ToString(), BaseHeight = BaseHeight, }; await brailleLetter.Rebuild(); this.Children.Add(brailleLetter); var textObject = new TextObject3D() { PointSize = 46, Color = Color.LightBlue, NameToWrite = Letter.ToString(), Height = BaseHeight }; await textObject.Rebuild(); IObject3D letterObject = new RotateObject3D_2(textObject, Vector3.UnitX, -90); await letterObject.Rebuild(); var scaleRatio = Math.Max(letterObject.XSize() / 17, letterObject.ZSize() / 17); if (scaleRatio > 1) { letterObject = new ScaleObject3D(letterObject, 1.0 / scaleRatio, 1, 1.0 / scaleRatio); } letterObject = new AlignObject3D(letterObject, FaceAlign.Bottom | FaceAlign.Front, brailleLetter, FaceAlign.Top | FaceAlign.Front, 0, 0, 3.5); letterObject = new SetCenterObject3D(letterObject, brailleLetter.GetCenter(), true, false, false); this.Children.Add(letterObject); var basePath = new RoundedRect(0, 0, 22, 34, 3) { ResolutionScale = 10 }; IObject3D basePlate = new Object3D() { Mesh = VertexSourceToMesh.Extrude(basePath, BaseHeight), Matrix = Matrix4X4.CreateRotationX(MathHelper.Tau / 4) }; basePlate = new AlignObject3D(basePlate, FaceAlign.Bottom | FaceAlign.Back, brailleLetter, FaceAlign.Bottom | FaceAlign.Back); basePlate = new SetCenterObject3D(basePlate, brailleLetter.GetCenter(), true, false, false); this.Children.Add(basePlate); IObject3D underline = await CubeObject3D.Create(basePlate.XSize(), .2, 1); underline = new AlignObject3D(underline, FaceAlign.Bottom, brailleLetter, FaceAlign.Top); underline = new AlignObject3D(underline, FaceAlign.Back | FaceAlign.Left, basePlate, FaceAlign.Front | FaceAlign.Left, 0, .01); this.Children.Add(underline); } } Parent?.Invalidate(new InvalidateArgs(this, InvalidateType.Children)); }