/// <summary> /// Starts a rigid registration. /// </summary> /// <param name="sender">The sender of an event.</param> /// <param name="e">Event arguments.</param> private void toolsRegistrationRigidMenuItem_Click(object sender, EventArgs e) { RigidSettingsForm rigidSettingsForm = new RigidSettingsForm(this.model3DBean.ModelListBean); rigidSettingsForm.ShowDialog(this); if (rigidSettingsForm.DialogResult == DialogResult.OK) { this.statusProgressBar.Visible = true; this.statusLabel.Text = "Registration task is in progress."; for (int i = 0; i < rigidSettingsForm.SourceModels.Count; i++) { for (int j = 0; j < rigidSettingsForm.TargetModels.Count; j++) { BackgroundWorker worker = new BackgroundWorker(); worker.RunWorkerCompleted += this.ReportTaskCompleted; worker.DoWork += (obj, args) => { RigidArgs rigidArgs = (RigidArgs)args.Argument; FileReader fileReader = new FileReader(); Model3DData sourceModel = fileReader.ReadModel(rigidArgs.SourceModel.EditPath); Model3DData targetModel = fileReader.ReadModel(rigidArgs.TargetModel.EditPath); List <Vector <float> > sourceVertexBuffer = sourceModel.GetVertices(); List <Vector <float> > targetVertexBuffer = targetModel.GetVertices(); RigidRegistration rigidRegistration = new RigidRegistration(rigidArgs.MappingAlgorithm, rigidArgs.NumberOfIterations); sourceVertexBuffer = rigidRegistration.ComputeRegistration(sourceVertexBuffer, targetVertexBuffer); sourceModel.SetVertices(sourceVertexBuffer); ObjFileWriter fileWriter = new ObjFileWriter(rigidArgs.SourceModel.EditPath); fileWriter.WriteModel(sourceModel.Model); fileWriter.Close(); rigidArgs.SourceModel.Changed = true; rigidArgs.SourceModel.Exported = false; }; worker.RunWorkerAsync(new RigidArgs(rigidSettingsForm.SourceModels[i], rigidSettingsForm.TargetModels[j], rigidSettingsForm.PointMappingAlgorithm, rigidSettingsForm.MaxIterations)); } } } }