Esempio n. 1
0
        /// <summary>
        /// Custom part constructor. Adds the part to the partList and also creates positionsDictionary.
        /// </summary>
        /// <param name="part">TeklaStructuresModel.Part object</param>
        public PartCustom(TSM.Part part)
        {
            string partMark = part.GetPartMark();
            string partPrefix = string.Empty;
            string assemblyPrefix = string.Empty;
            string actualPartNumber = string.Empty;
            string actualPartPrefix = string.Empty;
            int isMainPart = 0;

            part.GetReportProperty("PART_PREFIX", ref partPrefix);
            part.GetReportProperty("ASSEMBLY_PREFIX", ref assemblyPrefix);

            // next conditinals scoop out prefix and position numbers without hardcoding the 'part position separator' (it's an option in tekla)
            if (partMark.Contains(partPrefix))
            {
                actualPartNumber = Regex.Replace(partMark.Remove(0, partPrefix.Length), "[^0-9]", "");
                actualPartPrefix = partPrefix;
            }
            else if (partMark.Contains(assemblyPrefix))
            {
                actualPartNumber = Regex.Replace(partMark.Remove(0, assemblyPrefix.Length), "[^0-9]", "");
                actualPartPrefix = assemblyPrefix;
            }

            //MessageBox.Show(partPrefix + " + " + assemblyPrefix + " + " + partMark + "\n" + currentPartPrefix + " + " + currentPartNumber);

            this.identifier = part.Identifier;
            this.prefix = actualPartPrefix;
            this.number = int.Parse(actualPartNumber);
            this.needsToChange = false;
            part.GetReportProperty("MAIN_PART", ref isMainPart);
            this.isMainPart = Convert.ToBoolean(isMainPart);

            // gradually builds up positionsDictionary, which is a dictionary where keys are prefixes and values are lists of position numbers.
            if (positionsDictionary.ContainsKey(this.prefix))
            {
                if (!positionsDictionary[this.prefix].Contains(this.number))
                {
                    positionsDictionary[this.prefix].Add(this.number);
                }
            }
            else
            {
                List<int> list = new List<int>();
                list.Add(this.number);
                positionsDictionary.Add(this.prefix, list);
            }

            // add part to part list - list of all model parts
            partList.Add(this);
        }
Esempio n. 2
0
        /// <summary>
        /// adds datetime string to the old numberinghistory.txt file in order to speed up the overlapping correction
        /// </summary>
        internal static void RenameNumberingHistory(TSM.Model model)
        {
            string formatedDate = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss");

            string numHisOld = modelPath + "\\numberinghistory.txt";
            string numHisNew = modelPath + "\\numberinghistory until " + formatedDate + ".txt";

            try
            {
                if (File.Exists(numHisOld))
                {
                    File.Move(numHisOld, numHisNew);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// OBSOLETE - checks if assignment of the new part number succeeded
        /// </summary>
        /// <param name="model"></param>
        /// <returns>true if yes, false if no</returns>
        internal static bool AssignmentSuccesCheck(TSM.Model model)
        {
            string[] lines = File.ReadAllLines(modelPath + "\\numberinghistory.txt");

            if (lines[lines.Length - 2] == "")
            {
                return false;
            }

            return true;
        }
Esempio n. 4
0
        /// <summary>
        /// select all parts that need to be renumbered
        /// </summary>
        /// <param name="model"></param>
        /// <returns>quantity of selected parts</returns>
        public static int SelectPartsToBeRenumbered(TSM.Model model)
        {
            ArrayList partsToBeSelected = new ArrayList();

            foreach (PartCustom part in partList)
            {
                if (part.NeedsToChange)
                {
                    partsToBeSelected.Add(model.SelectModelObject(part.Identifier));
                }
            }
            TSM.UI.ModelObjectSelector mos = new TSM.UI.ModelObjectSelector();
            mos.Select(partsToBeSelected);
            return mos.GetSelectedObjects().GetSize();
        }
Esempio n. 5
0
        /// <summary>
        /// Selects every object in the model.
        /// </summary>
        /// <param name="model">Tekla structures model</param>
        public static void SelectAll(TSM.Model model)
        {
            modelPath = model.GetInfo().ModelPath;

            TSM.ModelObjectEnumerator selectedObjects = model.GetModelObjectSelector().GetAllObjectsWithType(TSM.ModelObject.ModelObjectEnum.UNKNOWN);
            System.Type[] objectTypes = new System.Type[1];
            objectTypes.SetValue(typeof(TSM.Part), 0);

            selectedObjects = model.GetModelObjectSelector().GetAllObjectsWithType(objectTypes);

            // clear lists - needed for subsequent numbering checks
            positionsDictionary.Clear();
            partList.Clear();
            prefixChanges.Clear();

            // creating instances of PartCustom class
            while (selectedObjects.MoveNext())
            {
                TSM.Part part = selectedObjects.Current as TSM.Part;
                PartCustom currentPart = new PartCustom(part);
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Renumbers part that need renumbering.
        /// </summary>
        /// <param name="model">Tekla.Structures.Model model</param>
        public static void RenumberParts(TSM.Model model)
        {
            // check if numberinghistory.txt exists and change its name
            RenameNumberingHistory(model);

            foreach (PartCustom part in partList)
            {
                if (part.NeedsToChange)
                {
                    string partCurrentPosition;
                    partCurrentPosition = part.prefix.ToString() + part.number.ToString();

                    int newNum;
                    string oppositePrefix = ChangeCapitalization(part.Prefix);

                    // checks if a part with same position has already been assigned a new number.
                    // If so, it skips it --> tekla applies the new number from the first part to all of the same parts
                    // all changes are collected in prefixChanges dictionary.
                    if (!prefixChanges.ContainsKey(partCurrentPosition))
                    {
                        bool firstGo = true;
                        string preNumber = string.Empty;
                        string postNumber = string.Empty;

                        do
                        {
                            int maxOppositeNumber = positionsDictionary[oppositePrefix].Max();
                            int maxNumber = positionsDictionary[part.Prefix].Max();

                            newNum = Math.Max(maxNumber, maxOppositeNumber) + 1;

                            // adds new number to prefixChanges dictionary
                            Tuple<string, int> tuple = new Tuple<string, int>(part.prefix, newNum);

                            if (firstGo)
                            {
                                prefixChanges.Add(partCurrentPosition, tuple);
                            }
                            else
                            {
                                prefixChanges.Remove(partCurrentPosition);
                                prefixChanges.Add(partCurrentPosition, tuple);
                            }

                            // select part - clumsy, could it be improved?
                            ArrayList aList = new ArrayList();
                            TSM.Object tPart = model.SelectModelObject(part.Identifier);
                            TSM.UI.ModelObjectSelector selector = new TSM.UI.ModelObjectSelector();
                            aList.Add(tPart);
                            selector.Select(aList);

                            TSM.Part myPart = tPart as TSM.Part;

                            // preNumber and postNumber strings are compared in the 'while' of the do-while loop, to determine if Macrobuilder
                            // macro was succesfully run.
                            // (sometimes Tekla doesn't want to apply certain numbers - e.g.: if they were in use in previous model stages, ... )
                            preNumber = myPart.GetPartMark();

                            // use Macrobuilder dll to change numbering
                            MacroBuilder macroBuilder = new MacroBuilder();
                            macroBuilder.Callback("acmdAssignPositionNumber", "part", "main_frame");
                            macroBuilder.ValueChange("assign_part_number", "Position", newNum.ToString());
                            macroBuilder.PushButton("AssignPB", "assign_part_number");
                            macroBuilder.PushButton("CancelPB", "assign_part_number");
                            macroBuilder.Run();

                            postNumber = myPart.GetPartMark();

                            bool ismacrounning = true;
                            while (ismacrounning)
                            {
                                ismacrounning = TSM.Operations.Operation.IsMacroRunning();
                            }

                            // add newly created part mark to positionsDict
                            positionsDictionary[part.Prefix].Add(newNum);

                            firstGo = false;

                        }
                        //while (!AssignmentSuccesCheck(model));
                        while (preNumber == postNumber);
                    }
                }
            }
        }