• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Как извлечь объекты их сборки?

Автор dosart, 10.02.15, 08:52:10

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

dosart


Sabahs, если делать так, то будут все компоненты. но, без иерархии.
public void AssemblyDecomposition()
       {
           if (doc != null)
           {
               //получить интерфейс на верхний компонент
               IPart7 TopComponent = doc.TopPart;
               if (TopComponent != null)
               {   
                   //получить интерфейс на коллекцию компонентов
                   IParts7 comCollection = TopComponent.Parts;
                   if (comCollection != null)
                   {

                       foreach (IPart7 element in comCollection)
                       {   
                           //если элемент деталь, то получаем имя детали
                           if (element.Detail)
                           {
                               string fileName = element.FileName;
                               Console.WriteLine(fileName);
                           }
                           //иначе если элемент сборка
                           else
                           {
                               //формируем коллекцию элементов сборки
                               IParts7 NewCollection = element.Parts;
                               foreach (IPart7 item in comCollection)
                               {
                                   string fileName = item.FileName;
                                   Console.WriteLine(fileName);
                               }


                           }
                           
                       }

                   }
               }
               
           }

Каким образом будут все компоненты, если их физически нет на компьютере?
Я так понял Вам нужны все компоненты кроме копий из операций копирования, то тогда так получите массив.
Array arr = (Array)TopComponent.PartsEx( ksPart7CollectionTypeEnum.ksUniqueParts);


dosart

Каким образом будут все компоненты, если их физически нет на компьютере?
Они могут лежать в БД удалённо. Но если нет соединения с сетью, то такие компоненты могут быть недоступны.Насколько я понимаю, то в роли такой БД выступает ЛОЦМАН. 

Я так понял Вам нужны все компоненты кроме копий из операций копирования
Нет, мне нужно получить файлы(путь к ним), в которых лежат компоненты сборки в иерархическом порядке.

Если есть сборка, в который отсутствует компоненты, то в дереве модели, такие компоненты помечаются красным кружочком. Но Компас откуда то пытается "подтянуть" эти файлы!  У него есть что-то вроде ссылок на эти файлы. Если файлы лежат на локальном компьютере, то условная ссылка - путь к файлу. Если файлы лежат удалённо, это что другое. 
Как получить эту условную ссылку?

Давайте в картинках, что имеем, что получаем.

dosart

ЦитироватьДавайте в картинках, что имеем, что получаем.
уже ненужно.
Как разобрать сборку, если в ней есть ещё "подсборки"? Я пытался это сделать используя обход в глубину, но таким способом получается разобрать только  саму "подсборку". Как быть, если в самой "подсборк"е может быть ещё n сборок?

+ Благодарностей: 1

dosart

ЦитироватьИспользовать рекурсию.
Это уже получилось.
Если использовать интерфейс  IFeature7 нельзя ли получить компоненты в иерархическом порядке?

s_sergey

Добрый день!
Имею в настоящий момент такую-же задачку: перебрать все элементы из сборки и ее подсборок. Писать пробую на c#.

                appl = (IApplication)kompas.ksGetApplication7();
                if (appl == null) return;
                doc1 = (IKompasDocument3D)appl.ActiveDocument;
                if (doc1 != null)
                {
                    IPart7 TopComponent = doc1.TopPart;
                    if (TopComponent != null)
                    {
                        listBox1.Items.Add(TopComponent.Name);  //------------здесь выдает в listbox имя сборки, все ок
                        IParts7 comCollection = TopComponent.Parts;                     
                        if (comCollection != null)
                        {
                            listBox1.Items.Add(comCollection.Count);  //  а здесь выдает 0, хотя в сборке есть куча объектов...
                            foreach (IPart7 element in comCollection)
                            {
                                if (element.Detail)
                                {
                                    string fileName = element.Name;
                                    listBox1.Items.Add(fileName);
                                }
                                else
                                {
                                    IParts7 NewCollection = element.Parts;
                                    foreach (IPart7 item in comCollection);         // до этой строки не доходит, т.к. не видит объекты...
                                    {
                                        string fileName = element.Name;
                                        listBox1.Items.Add(fileName);
                                    }
                                }
                            }
                        }
                    }
                }

что я делаю не так и как сделать, что бы получить хотя бы имена объектов внутри подсборки?
голову сломал, но в объектной модели не разобрался... Помогите люди добрые!   :`(


Kamerton

Цитата: s_sergey от 29.03.15, 11:23:08
как сделать, что бы получить хотя бы имена объектов внутри подсборки?
голову сломал, но в объектной модели не разобрался... Помогите люди добрые!   :`(

Если у вас в именах файлов Спецификаций содержатся номера документов, то я такую стратегию могу посоветовать :)

Сам делаю так, ибо иного пока не освоил в аду API7 и авгиевых конюшнях SDK... Да и не гонят никуда...

Парсю "нулевую" Спецификацию на номера документов, а потом рекурсивно их обхожу :)

получаю var rows = IKompasDocument.SpecificationRows[0]
foreach(SpecificationColumn cell in rows[n])
{
   if(cell.Type = ksRowNumber)
   var number = cell.Text.Str;
}

А дальше ищу в той же папке файлы с такими номерами и... собственно, рекурсивно их обхожу, получая всё что мне надо и формируя иерархию уже в своей программе. А дальше работаю со своим представлением.

Если нужны подробности - спрашивайте :)

dosart

22.04.15, 19:26:35 #30 Последнее редактирование: 22.04.15, 19:36:53 от dosart
Если всё ещё актуально...
Моя задача была чуть сложней. Необходимо было не просто пройтись по элементам сборки, но и вытащить их в иерархическом порядке.
Решение такое - создадим класс Assembly. Класс имеет три параметра - имя сборки, путь к файлу в которой лежит сборка, тип, позволяющий понять является ли элемент сборкой или нет, а  также список, в котором храним элементы сборки.

public class Assembly
    {
        public string Name { get; set; }
        public string File { get; set; }
        public int asmType { get; set; }
   
        public List<Assembly> Subassembly { get; set; }

        public Assembly ( )
        {List = new ObservableCollection<Assembly> ( ); }
    }

Сам алгоритм разбора тривиален -  обход графа в глубину.

        public void AssemblyDecomposition()
        {
            if (doc != null)
            {

                // берём верхний компонент
                IPart7 TopComponent = doc.TopPart;
                if (TopComponent != null)
                {
                        assembly.File    = TopComponent.FileName;
                        assembly.Name    = TopComponent.Name;
                        //признак, что компонент сборка
                        assembly.asmType = 1;

                     
                         //получаем массив компонентов сборки
                        arrComponent = (Array)TopComponent.PartsEx[ksPart7CollectionTypeEnum.ksUniqueParts];
                        foreach (var i in arrComponent)
                        {

                            Decomposition((IPart7)i, assembly);
                        }     
                 }
            }
        }

private void Decomposition(IPart7 component, Assembly assembly)
        {
            Assembly tmp = new Assembly();
            if (component.Detail)
            {
                tmp.Name = component.Name;
                tmp.File = component.FileName;
                //признак, что деталь
                tmp.asmType = 0;
               
                 //добавляем деталь в сборку
                assembly.Subassembly.Add(tmp);

            }
            else
            {   
                //иначе если подсборка, то разложить её на составные части
                Array arrSubComponent = (Array)component.PartsEx[ksPart7CollectionTypeEnum.ksUniqueParts];
                tmp.Name = component.Name;
                tmp.File = component.FileName;
                tmp.asmType = 1;
               
                //добвим её в "большую сборку"
                assembly.Subassembly.Add(tmp);

                foreach (IPart7 newComponent in arrSubComponent)
                {
                    //будем "собирать" компоненты "подсборки"
                    Decomposition(newComponent, tmp);
                }
            }
        }

Код не идеален - есть дублирование кода, да и вообще.. но работает.