public void Analyse(PrintModel pm) {
     TopoModel m = new TopoModel();
     m.Merge(pm.Model, pm.trans);
     infoVolume.Text = (0.001*m.Volume()).ToString("0.0000") + " cm³";
     infoSurface.Text = (0.01 * m.Surface()).ToString("0.0000") + " cm²";
     infoShells.Text = pm.Model.shells.ToString();
     infoPoints.Text = pm.Model.vertices.Count.ToString();
     infoEdges.Text = pm.Model.edges.Count.ToString();
     infoFaces.Text = pm.Model.triangles.Count.ToString();
     infoMinX.Text = m.boundingBox.minPoint.x.ToString("0.00")+" mm";
     infoMaxX.Text = m.boundingBox.maxPoint.x.ToString("0.00") + " mm";
     infoSizeX.Text = m.boundingBox.Size.x.ToString("0.00") + " mm";
     infoMinY.Text = m.boundingBox.minPoint.y.ToString("0.00") + " mm";
     infoMaxY.Text = m.boundingBox.maxPoint.y.ToString("0.00") + " mm";
     infoSizeY.Text = m.boundingBox.Size.y.ToString("0.00") + " mm";
     infoMinZ.Text = m.boundingBox.minPoint.z.ToString("0.00") + " mm";
     infoMaxZ.Text = m.boundingBox.maxPoint.z.ToString("0.00") + " mm";
     infoSizeZ.Text = m.boundingBox.Size.z.ToString("0.00") + " mm";
     groupBox1.Text = pm.name;
 }
 private void saveComposition(string filename)
 {
     TopoModel model = new TopoModel();
     foreach (PrintModel stl in ListObjects(false))
     {
         stl.UpdateMatrix();
         model.Merge(stl.ActiveModel, stl.trans);
     }
     if (filename.EndsWith(".obj") || filename.EndsWith(".OBJ"))
         model.exportObj(filename,true);
     else
         model.exportSTL(filename, writeSTLBinary);
     Slicer.lastBox.Clear();
     Slicer.lastBox.Add(model.boundingBox);
 }