private void AddCharacterMeshes(string currentText, TypeFacePrinter printer) { int newIndex = asynchMeshGroups.Count; StyledTypeFace typeFace = printer.TypeFaceStyle; for (int i = 0; i < currentText.Length; i++) { string letter = currentText[i].ToString(); TypeFacePrinter letterPrinter = new TypeFacePrinter(letter, typeFace); if (CharacterHasMesh(letterPrinter, letter)) { Mesh textMesh = VertexSourceToMesh.Extrude(letterPrinter, unscaledLetterHeight / 2); asynchMeshGroups.Add(new MeshGroup(textMesh)); PlatingMeshGroupData newMeshInfo = new PlatingMeshGroupData(); newMeshInfo.spacing = printer.GetOffsetLeftOfCharacterIndex(i); asynchPlatingDatas.Add(newMeshInfo); asynchMeshGroupTransforms.Add(ScaleRotateTranslate.Identity()); PlatingHelper.CreateITraceableForMeshGroup(asynchPlatingDatas, asynchMeshGroups, newIndex, null); ScaleRotateTranslate moved = asynchMeshGroupTransforms[newIndex]; moved.translation *= Matrix4X4.CreateTranslation(new Vector3(0, 0, unscaledLetterHeight / 2)); asynchMeshGroupTransforms[newIndex] = moved; newIndex++; } processingProgressControl.PercentComplete = ((i + 1) * 95 / currentText.Length); } }
private void insertTextBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; BackgroundWorker backgroundWorker = (BackgroundWorker)sender; asynchMeshGroups.Clear(); asynchMeshGroupTransforms.Clear(); asynchPlatingDatas.Clear(); string currentText = (string)e.Argument; TypeFacePrinter printer = new TypeFacePrinter(currentText, new StyledTypeFace(boldTypeFace, 12)); Vector2 size = printer.GetSize(currentText); double centerOffset = -size.x / 2; double ratioPerMeshGroup = 1.0 / currentText.Length; double currentRatioDone = 0; for (int i = 0; i < currentText.Length; i++) { int newIndex = asynchMeshGroups.Count; TypeFacePrinter letterPrinter = new TypeFacePrinter(currentText[i].ToString(), new StyledTypeFace(boldTypeFace, 12)); Mesh textMesh = VertexSourceToMesh.Extrude(letterPrinter, 10 + (i % 2)); if (textMesh.Faces.Count > 0) { asynchMeshGroups.Add(new MeshGroup(textMesh)); PlatingMeshGroupData newMeshInfo = new PlatingMeshGroupData(); newMeshInfo.xSpacing = printer.GetOffsetLeftOfCharacterIndex(i).x + centerOffset; asynchPlatingDatas.Add(newMeshInfo); asynchMeshGroupTransforms.Add(ScaleRotateTranslate.Identity()); PlatingHelper.CreateITraceableForMeshGroup(asynchPlatingDatas, asynchMeshGroups, newIndex, (double progress0To1, string processingState, out bool continueProcessing) => { continueProcessing = true; int nextPercent = (int)((currentRatioDone + ratioPerMeshGroup * progress0To1) * 100); backgroundWorker.ReportProgress(nextPercent); }); currentRatioDone += ratioPerMeshGroup; PlatingHelper.PlaceMeshGroupOnBed(asynchMeshGroups, asynchMeshGroupTransforms, newIndex); } backgroundWorker.ReportProgress((i + 1) * 95 / currentText.Length); } SetWordSpacing(asynchMeshGroups, asynchMeshGroupTransforms, asynchPlatingDatas); SetWordSize(asynchMeshGroups, asynchMeshGroupTransforms); SetWordHeight(asynchMeshGroups, asynchMeshGroupTransforms); if (createUnderline.Checked) { CreateUnderline(asynchMeshGroups, asynchMeshGroupTransforms, asynchPlatingDatas); } backgroundWorker.ReportProgress(95); }
private void AddCharacterMeshes(string currentText, TypeFacePrinter printer) { int newIndex = asyncMeshGroups.Count; StyledTypeFace typeFace = printer.TypeFaceStyle; for (int i = 0; i < currentText.Length; i++) { string letter = currentText[i].ToString(); TypeFacePrinter letterPrinter = new TypeFacePrinter(letter, typeFace); if (CharacterHasMesh(letterPrinter, letter)) { #if true Mesh textMesh = VertexSourceToMesh.Extrude(letterPrinter, unscaledLetterHeight / 2); #else Mesh textMesh = VertexSourceToMesh.Extrude(letterPrinter, unscaledLetterHeight / 2); // this is the code to make rounded tops // convert the letterPrinter to clipper polygons List <List <IntPoint> > insetPoly = VertexSourceToPolygon.CreatePolygons(letterPrinter); // inset them ClipperOffset clipper = new ClipperOffset(); clipper.AddPaths(insetPoly, JoinType.jtMiter, EndType.etClosedPolygon); List <List <IntPoint> > solution = new List <List <IntPoint> >(); clipper.Execute(solution, 5.0); // convert them back into a vertex source // merge both the inset and original vertex sources together // convert the new vertex source into a mesh (trianglulate them) // offset the inner loop in z // create the polygons from the inner loop to a center point so that there is the rest of an approximation of the bubble // make the mesh for the bottom // add the top and bottom together // done #endif asyncMeshGroups.Add(new MeshGroup(textMesh)); PlatingMeshGroupData newMeshInfo = new PlatingMeshGroupData(); newMeshInfo.spacing = printer.GetOffsetLeftOfCharacterIndex(i); asyncPlatingDatas.Add(newMeshInfo); asyncMeshGroupTransforms.Add(ScaleRotateTranslate.Identity()); PlatingHelper.CreateITraceableForMeshGroup(asyncPlatingDatas, asyncMeshGroups, newIndex, null); ScaleRotateTranslate moved = asyncMeshGroupTransforms[newIndex]; moved.translation *= Matrix4X4.CreateTranslation(new Vector3(0, 0, unscaledLetterHeight / 2)); asyncMeshGroupTransforms[newIndex] = moved; newIndex++; } processingProgressControl.PercentComplete = ((i + 1) * 95 / currentText.Length); } }
private void DoGroup(BackgroundWorker backgroundWorker) { if (SelectedMeshGroupIndex == -1) { SelectedMeshGroupIndex = 0; } MeshGroup meshGroupWeAreKeeping = asynchMeshGroups[SelectedMeshGroupIndex]; for (int meshGroupToMoveIndex = asynchMeshGroups.Count - 1; meshGroupToMoveIndex >= 0; meshGroupToMoveIndex--) { MeshGroup meshGroupToMove = asynchMeshGroups[meshGroupToMoveIndex]; if (meshGroupToMove != meshGroupWeAreKeeping) { for (int moveIndex = 0; moveIndex < meshGroupToMove.Meshes.Count; moveIndex++) { Mesh mesh = meshGroupToMove.Meshes[moveIndex]; meshGroupWeAreKeeping.Meshes.Add(mesh); } asynchMeshGroups.RemoveAt(meshGroupToMoveIndex); asynchMeshGroupTransforms.RemoveAt(meshGroupToMoveIndex); } else { asynchMeshGroupTransforms[meshGroupToMoveIndex] = ScaleRotateTranslate.Identity(); } } asynchPlatingDatas.Clear(); double ratioPerMeshGroup = 1.0 / asynchMeshGroups.Count; double currentRatioDone = 0; for (int i = 0; i < asynchMeshGroups.Count; i++) { PlatingMeshGroupData newInfo = new PlatingMeshGroupData(); asynchPlatingDatas.Add(newInfo); MeshGroup meshGroup = asynchMeshGroups[i]; // create the selection info PlatingHelper.CreateITraceableForMeshGroup(asynchPlatingDatas, asynchMeshGroups, i, (double progress0To1, string processingState, out bool continueProcessing) => { ReportProgressChanged(progress0To1, processingState, out continueProcessing); }); currentRatioDone += ratioPerMeshGroup; } }
void ungroupSelectedBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { string makingCopyLabel = LocalizedString.Get("Ungrouping"); string makingCopyLabelFull = string.Format("{0}:", makingCopyLabel); processingProgressControl.ProcessType = makingCopyLabelFull; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; BackgroundWorker backgroundWorker = (BackgroundWorker)sender; PushMeshGroupDataToAsynchLists(TraceInfoOpperation.DO_COPY); int indexBeingReplaced = SelectedMeshGroupIndex; asynchMeshGroups[indexBeingReplaced].Transform(asynchMeshGroupTransforms[indexBeingReplaced].TotalTransform); List <Mesh> discreetMeshes = CreateDiscreteMeshes.SplitConnectedIntoMeshes(asynchMeshGroups[indexBeingReplaced], (double progress0To1, string processingState, out bool continueProcessing) => { BackgroundWorker_ProgressChanged(progress0To1 * .5, processingState, out continueProcessing); }); asynchMeshGroups.RemoveAt(indexBeingReplaced); asynchPlatingDatas.RemoveAt(indexBeingReplaced); asynchMeshGroupTransforms.RemoveAt(indexBeingReplaced); double ratioPerDiscreetMesh = 1.0 / discreetMeshes.Count; double currentRatioDone = 0; for (int discreetMeshIndex = 0; discreetMeshIndex < discreetMeshes.Count; discreetMeshIndex++) { PlatingMeshGroupData newInfo = new PlatingMeshGroupData(); asynchPlatingDatas.Add(newInfo); asynchMeshGroups.Add(new MeshGroup(discreetMeshes[discreetMeshIndex])); int addedMeshIndex = asynchMeshGroups.Count - 1; MeshGroup addedMeshGroup = asynchMeshGroups[addedMeshIndex]; ScaleRotateTranslate transform = ScaleRotateTranslate.Identity(); transform.SetCenteringForMeshGroup(addedMeshGroup); asynchMeshGroupTransforms.Add(transform); //PlatingHelper.PlaceMeshGroupOnBed(asynchMeshGroups, asynchMeshGroupTransforms, addedMeshIndex, false); // and create selection info PlatingHelper.CreateITraceableForMeshGroup(asynchPlatingDatas, asynchMeshGroups, addedMeshIndex, (double progress0To1, string processingState, out bool continueProcessing) => { BackgroundWorker_ProgressChanged(progress0To1 * .5 + .5, processingState, out continueProcessing); }); currentRatioDone += ratioPerDiscreetMesh; } }
private void GroupSelected() { string makingCopyLabel = LocalizedString.Get("Grouping"); string makingCopyLabelFull = string.Format("{0}:", makingCopyLabel); processingProgressControl.ProcessType = makingCopyLabelFull; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; PushMeshGroupDataToAsynchLists(TraceInfoOpperation.DO_COPY); for (int i = 0; i < asyncMeshGroups.Count; i++) { asyncMeshGroups[i].Transform(asyncMeshGroupTransforms[i].TotalTransform); bool continueProcessing; ReportProgressChanged((i + 1) * .4 / asyncMeshGroups.Count, "", out continueProcessing); } if (SelectedMeshGroupIndex == -1) { SelectedMeshGroupIndex = 0; } MeshGroup meshGroupWeAreKeeping = asyncMeshGroups[SelectedMeshGroupIndex]; for (int meshGroupToMoveIndex = asyncMeshGroups.Count - 1; meshGroupToMoveIndex >= 0; meshGroupToMoveIndex--) { MeshGroup meshGroupToMove = asyncMeshGroups[meshGroupToMoveIndex]; if (meshGroupToMove != meshGroupWeAreKeeping) { for (int moveIndex = 0; moveIndex < meshGroupToMove.Meshes.Count; moveIndex++) { Mesh mesh = meshGroupToMove.Meshes[moveIndex]; meshGroupWeAreKeeping.Meshes.Add(mesh); } asyncMeshGroups.RemoveAt(meshGroupToMoveIndex); asyncMeshGroupTransforms.RemoveAt(meshGroupToMoveIndex); } else { asyncMeshGroupTransforms[meshGroupToMoveIndex] = ScaleRotateTranslate.Identity(); } } asyncPlatingDatas.Clear(); double ratioPerMeshGroup = 1.0 / asyncMeshGroups.Count; double currentRatioDone = 0; for (int i = 0; i < asyncMeshGroups.Count; i++) { PlatingMeshGroupData newInfo = new PlatingMeshGroupData(); asyncPlatingDatas.Add(newInfo); MeshGroup meshGroup = asyncMeshGroups[i]; // create the selection info PlatingHelper.CreateITraceableForMeshGroup(asyncPlatingDatas, asyncMeshGroups, i, (double progress0To1, string processingState, out bool continueProcessing) => { ReportProgressChanged(progress0To1, processingState, out continueProcessing); }); currentRatioDone += ratioPerMeshGroup; } }
private void UngroupSelected() { if (SelectedMeshGroupIndex == -1) { SelectedMeshGroupIndex = 0; } string makingCopyLabel = LocalizedString.Get("Ungrouping"); string makingCopyLabelFull = string.Format("{0}:", makingCopyLabel); processingProgressControl.ProcessType = makingCopyLabelFull; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; PushMeshGroupDataToAsynchLists(TraceInfoOpperation.DO_COPY); int indexBeingReplaced = SelectedMeshGroupIndex; List <Mesh> discreetMeshes = new List <Mesh>(); asynchMeshGroups[indexBeingReplaced].Transform(asynchMeshGroupTransforms[indexBeingReplaced].TotalTransform); // if there are multiple meshes than just make them separate groups if (asynchMeshGroups[indexBeingReplaced].Meshes.Count > 1) { foreach (Mesh mesh in asynchMeshGroups[indexBeingReplaced].Meshes) { discreetMeshes.Add(mesh); } } else // actually try and cut up the mesh into separate parts { discreetMeshes = CreateDiscreteMeshes.SplitConnectedIntoMeshes(asynchMeshGroups[indexBeingReplaced], (double progress0To1, string processingState, out bool continueProcessing) => { ReportProgressChanged(progress0To1 * .5, processingState, out continueProcessing); }); } asynchMeshGroups.RemoveAt(indexBeingReplaced); asynchPlatingDatas.RemoveAt(indexBeingReplaced); asynchMeshGroupTransforms.RemoveAt(indexBeingReplaced); double ratioPerDiscreetMesh = 1.0 / discreetMeshes.Count; double currentRatioDone = 0; for (int discreetMeshIndex = 0; discreetMeshIndex < discreetMeshes.Count; discreetMeshIndex++) { PlatingMeshGroupData newInfo = new PlatingMeshGroupData(); asynchPlatingDatas.Add(newInfo); asynchMeshGroups.Add(new MeshGroup(discreetMeshes[discreetMeshIndex])); int addedMeshIndex = asynchMeshGroups.Count - 1; MeshGroup addedMeshGroup = asynchMeshGroups[addedMeshIndex]; ScaleRotateTranslate transform = ScaleRotateTranslate.Identity(); transform.SetCenteringForMeshGroup(addedMeshGroup); asynchMeshGroupTransforms.Add(transform); //PlatingHelper.PlaceMeshGroupOnBed(asynchMeshGroups, asynchMeshGroupTransforms, addedMeshIndex, false); // and create selection info PlatingHelper.CreateITraceableForMeshGroup(asynchPlatingDatas, asynchMeshGroups, addedMeshIndex, (double progress0To1, string processingState, out bool continueProcessing) => { ReportProgressChanged(.5 + progress0To1 * .5 * currentRatioDone, processingState, out continueProcessing); }); currentRatioDone += ratioPerDiscreetMesh; } }