private static void changeCut(TSM.BooleanPart currentBoolean)
        {
            TSM.Part cutPart = currentBoolean.OperativePart as TSM.Part;
            double minCutZ = findMinimum(cutPart);

            TSM.Part realPart = currentBoolean.Father as TSM.Part;
            double minPartZ = findMinimum(realPart);

            double delta =  minPartZ - minCutZ;

            setCutPoints(cutPart, delta);
        }
        private static void changePartToSubAssembly(TSM.Assembly assembly, ArrayList wrongParts, Tekla.Technology.Akit.IScript akit)
        {
            TSM.UI.ModelObjectSelector selector = new TSM.UI.ModelObjectSelector();

            selector.Select(wrongParts);
            akit.Callback("acmdRemoveFromAssemblyActionCB", "", "View_01 window_1");

            //assembly.Modify();

            selector = new TSM.UI.ModelObjectSelector();
            TSM.ModelObjectEnumerator selectionEnum = selector.GetSelectedObjects();

            while (selectionEnum.MoveNext())
            {
                if (selectionEnum.Current is TSM.Part)
                {
                    TSM.Part newPart = selectionEnum.Current as TSM.Part;
                    TSM.Assembly partNewAssembly = newPart.GetAssembly() as TSM.Assembly;

                    ArrayList currentSelection = new ArrayList();
                    currentSelection.Add(assembly);
                    selector.Select(currentSelection);
                    TSM.ModelObjectEnumerator selectionEnum2 = selector.GetSelectedObjects();

                    while (selectionEnum2.MoveNext())
                    {
                        if (selectionEnum2.Current is TSM.Assembly)
                        {
                            TSM.Assembly newAssembly = selectionEnum2.Current as TSM.Assembly;
                            newAssembly.Add(partNewAssembly);
                            newAssembly.Modify();
                        }
                    }
                }
            }

            foreach (TSM.Part part in wrongParts)
            {
                TSM.Assembly newAssembly = part.GetAssembly() as TSM.Assembly;
                removeAssemblyPropertys(newAssembly, akit);
            }
        }
        private static double findMinimum(TSM.Part current)
        {
            double min = Double.MaxValue;

            if (current is TSM.ContourPlate)
            {
                TSM.ContourPlate currentCP = current as TSM.ContourPlate;

                foreach (Point cur in currentCP.Contour.ContourPoints)
                {
                    if (min > cur.Z)
                    {
                        min = cur.Z;
                    }
                }
            }
            else if (current is TSM.Beam)
            {
                TSM.Beam currentBeam = current as TSM.Beam;
                min = Math.Min(currentBeam.StartPoint.Z, currentBeam.EndPoint.Z);
            }

            return min;
        }
        private static ArrayList findWrongParts(List<string> ignoreClasses, TSM.Assembly assembly)
        {
            TSM.Part mainPart = assembly.GetMainPart() as TSM.Part;
            ArrayList secondaryParts = new ArrayList(assembly.GetSecondaries());
            ArrayList wrongParts = new ArrayList();

            ignoreClasses.Add(mainPart.Class);

            foreach (TSM.Part currentPart in secondaryParts)
            {
                if (ignoreClasses.Contains(currentPart.Class) == false)
                {
                    wrongParts.Add(currentPart);
                }
            }

            return wrongParts;
        }
        private static void removeAssemblyPropertys(TSM.Assembly currentAssembly, Tekla.Technology.Akit.IScript akit)
        {
            ArrayList currentSelection = new ArrayList();
            currentSelection.Add(currentAssembly);

            TSM.UI.ModelObjectSelector selector = new TSM.UI.ModelObjectSelector();
            selector.Select(currentSelection);

            akit.Callback("acmd_display_selected_object_dialog", "", "View_01 window_1");
            TSM.Part currentMainPart = currentAssembly.GetMainPart() as TSM.Part;

            if (!currentMainPart.Material.MaterialString.StartsWith("C"))
            {
                akit.ValueChange("steelassembly_1", "AssemblyPrefix", "");
                akit.ValueChange("steelassembly_1", "AssemblyStartNumber", "");
                akit.ValueChange("steelassembly_1", "AssemblyName", "");
                akit.PushButton("modify_button", "steelassembly_1");
                akit.PushButton("OK_button", "steelassembly_1");
            }
            else
            {
                if (currentMainPart.CastUnitType == 0)
                {
                    akit.ValueChange("precastassembly_1", "AssemblyPrefix", "");
                    akit.ValueChange("precastassembly_1", "AssemblyStartNumber", "");
                    akit.ValueChange("precastassembly_1", "AssemblyName", "");
                    akit.PushButton("modify_button", "precastassembly_1");
                    akit.PushButton("OK_button", "precastassembly_1");
                }
                else
                {
                    akit.ValueChange("insituassembly_1", "AssemblyPrefix", "");
                    akit.ValueChange("insituassembly_1", "AssemblyStartNumber", "");
                    akit.ValueChange("insituassembly_1", "AssemblyName", "");
                    akit.PushButton("modify_button", "insituassembly_1");
                    akit.PushButton("OK_button", "insituassembly_1");
                }
            }
        }
        private static List<TSM.Assembly> getSelectedAssemblys(TSM.ModelObjectEnumerator selectedObjects)
        {
            List<TSM.Assembly> selectedAssemblys = new List<TSM.Assembly>();

            while (selectedObjects.MoveNext())
            {
                if (selectedObjects.Current is TSM.Assembly)
                {
                    selectedAssemblys.Add(selectedObjects.Current as TSM.Assembly);
                }
            }

            return selectedAssemblys;
        }
        private static void setCutPoints(TSM.Part current, double delta)
        {
            if (current is TSM.ContourPlate)
            {
                TSM.ContourPlate currentCP = current as TSM.ContourPlate;

                foreach (Point cur in currentCP.Contour.ContourPoints)
                {
                    cur.Z += delta;
                }
                if (delta <= 0)
                {
                    if (currentCP.Position.DepthOffset >= 0)
                    {
                        currentCP.Position.Depth = Position.DepthEnum.FRONT;
                    }
                    else
                    {
                        currentCP.Position.Depth = Position.DepthEnum.BEHIND;
                    }
                }
                else
                {
                    if (currentCP.Position.DepthOffset >= 0)
                    {
                        currentCP.Position.Depth = Position.DepthEnum.BEHIND;
                    }
                    else
                    {
                        currentCP.Position.Depth = Position.DepthEnum.FRONT;
                    }
                }

                currentCP.Position.DepthOffset = -2.5;

            }

            current.Modify();
        }