| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Другие CAD системы > Tekla > Блокировка пользовательского атрибута для объекта

Блокировка пользовательского атрибута для объекта

Ответ
Поиск в этой теме
Непрочитано 30.07.2018, 12:49
Блокировка пользовательского атрибута для объекта
bartus
 
Регистрация: 06.03.2011
Сообщений: 233

Можно ли заблокировать атрибут REBAR_SEQ_NO (Порядковый номер арматуры) для определенных объектов модели? Для того, чтобы не менялись номера стержней тех объектов, чертежи на которые уже оформлены. Пока есть идея только одна - добавить этот атрибут в objects.inp в качестве атрибута, влияющего на нумерацию, тогда (по идее) при блокировке арматуры - атрибут нельзя будет перезаписать. Но этот метод не очень хочется использовать (неудобно).
Просмотров: 3614
 
Автор темы   Непрочитано 09.03.2019, 22:24
#21
bartus


 
Регистрация: 06.03.2011
Сообщений: 233


Konstruktiv54, спасибо за подсказку!

Вроде бы получилось. Но теперь для себя поставил задачу отсортировать список по убыванию диаметра, вот в таком виде код работает по возрастанию (возможно, в нем есть недочеты):
Код:
[Выделить все]
 using System;
using System.IO;
using System.Windows.Forms;
using TS = Tekla.Structures;
using TSM = Tekla.Structures.Model;
using System.Collections.Generic;

namespace Tekla.Technology.Akit.UserScript
{
    public class Script
    {
        public static void Run(Tekla.Technology.Akit.IScript akit)
        {
            akit.Callback("acmd_partnumbers_all", "", "main_frame");
            TSM.Model model = new TSM.Model();

            TSM.ModelObjectEnumerator moe = model.GetModelObjectSelector().GetAllObjects();

            List<Tuple<string, int, string, int>> rebarDataList = new List<Tuple<string, int, string, int>>();

            while (moe.MoveNext())
            {
                try
                {
                    TSM.Reinforcement rebar = moe.Current as TSM.Reinforcement;

                    if (rebar != null)
                    {
                        string diametr = "", rebarPos = "", castUnitPos = "";

                        rebar.GetReportProperty("SIZE", ref diametr);
                        rebar.GetReportProperty("REBAR_POS", ref rebarPos);
                        rebar.GetReportProperty("CAST_UNIT_POS", ref castUnitPos);


                        int diametrINT = Convert.ToInt32(diametr);

                        rebarDataList.Add(new Tuple<string, int, string, int>(castUnitPos, diametrINT, rebarPos, rebar.Identifier.ID));
                    }
                }
                catch
                {
                }
            }

            rebarDataList.Sort();

            WriteUDA(rebarDataList, model);
            
            
        }

        public static void WriteUDA(List<Tuple<string, int, string, int>> rebarDataList, TSM.Model model)
        {
            int rebarNo = 1;
            string actualRebarNo = "", actualCastUnit = "";
            int diametrINT = 1;

            for (int i = 0; i < rebarDataList.Count; i++)
            {
                
                if (rebarDataList[i].Item1 != actualCastUnit) //new cast unit
                {
                    actualCastUnit = rebarDataList[i].Item1;
                    diametrINT = rebarDataList[i].Item2;
                    actualRebarNo = rebarDataList[i].Item3;
                    rebarNo = 1;
                }
                
                else if (rebarDataList[i].Item2 > diametrINT)//another RebarDiameter
                {
                    rebarNo++;
                    diametrINT = rebarDataList[i].Item2;
                    actualRebarNo = rebarDataList[i].Item3;
                }
                else if (rebarDataList[i].Item3 != actualRebarNo)//another RebarNo
                {
                    rebarNo++;
                    diametrINT = rebarDataList[i].Item2;
                    actualRebarNo = rebarDataList[i].Item3;
                }
                TSM.ModelObject rebarObject = model.SelectModelObject(new TS.Identifier(rebarDataList[i].Item4));

                int locked = -1;
                rebarObject.GetUserProperty("OBJECT_LOCKED", ref locked);
                if (locked != 1)
                    rebarObject.SetUserProperty("REBAR_SEQ_NO", rebarNo);

                Tekla.Structures.Model.Operations.Operation.DisplayPrompt("Прогресс: " + i.ToString() + " из " + rebarDataList.Count);
            }
        }
    }
}
Понимаю, что вроде как нужно использовать вместо rebarDataList.Sort(); rebarDataList.Reverse();, но так просто ведь ничего не бывает, нужно допилить, но как?

Заодно спрошу: ту же историю хочу провернуть с атрибутом шаблона LENGTH, но он не подхватывается совсем никак, ни в типе string, ни в конвертированном в int, ощущение, что API не видит его. Те же UDA, к примеру comment, подхватываются и сортируются.
bartus вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Другие CAD системы > Tekla > Блокировка пользовательского атрибута для объекта

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консервация объектов незавершенного строительства msv_mnv Обследование зданий и сооружений 6 11.11.2017 23:07
СПДС 10. С чего начать при создании пользовательского объекта, к примеру "стропильная нога"? erikbond ПО от CSoft 63 19.05.2016 17:53
Применение в графике пользовательского объекта СПДС текста (проблемы при _mirror) AlexV ПО от CSoft 7 01.02.2016 12:47
Ввод в эксплуатацию салона красоты - нужно ли (и в какой форме) согласование с пожарниками ? drill_man Прочее. Архитектура и строительство 4 20.09.2013 12:03
Ищу 3д модель (приложение к паспорту антитеррористической защищенности объекта) Lirikk Поиск литературы, чертежей, моделей и прочих материалов 2 20.09.2012 21:53