Как отличить листовую деталь со сгибами от листовой детали без сгибов?

Автор ТрындецЪ, 30.03.18, 10:51:53

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

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

ТрындецЪ

Как программно отличить листовую деталь со сгибами от листовой детали без сгибов? (Пример на картинках)
Если не настроена развёртка и коллекция сгибов ISheetMetalBends пуста.

pas2h

Если правильно понял формулировку вопроса, то необходимо определить каким способом было построено листовое тело: по замкнутому контуру (рис.1) или наоборот (рис. 2). Самым логичным было бы следовать именно по этому пути: искать эскиз , от которого построено листовое тело и определять замкнут ли контур. Но есть и другой вариант (возможно не совсем верный, но вполне рабочий): искать в дереве построения компонент листового тела и определить сколько переменных, принадлежит этому компоненту. Для листового тела, построенного от замкнутого контура используются 4 переменные: исключить из расчета, толщина листового тела, радиус сгиба и способ определения длины развертки. Случай с таблицей сгибов не проверял, но думаю особо ничего не поменяется. Прикрепляю код на C#.

using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using Kompas6API5;
using Kompas6API7;
using Kompas6Constants;
using Kompas6Constants3D;


namespace SheetInfo
{
    class Program
    {
        static KompasObject kompas;     //Интерфейс приложения в API5
        static IApplication appl;       //Интерфейс приложения в API7
        static IKompasDocument3D doc3D; //Интерфейс документа 3D в API7

        static void Main(string[] args)
        {
            if (kompas == null)
            {
                Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
                kompas = (KompasObject)System.Runtime.InteropServices.Marshal.GetActiveObject("KOMPAS.Application.5");
            }

            if (kompas != null)
            {
                kompas.Visible = true;
                kompas.ActivateControllerAPI();
            }

            // Получаем интерфейс приложения в API7
            appl = (IApplication)kompas.ksGetApplication7();
            if (appl == null)
                return;

            //Выполнение основной части программы
            if (kompas != null)
            {             
                //получаем файл модели
                doc3D = (IKompasDocument3D)appl.ActiveDocument;
                //получаем верхний компонент
                IPart7 top3D = doc3D.TopPart;   
                //перестраиваем документ
                doc3D.RebuildDocument();
                //получаем интерфейс дерева построения
                IFeature7 pFeat = (IFeature7)top3D.Owner;
                //получаем массив элементов дерева построения
                Object[] featCol = pFeat.SubFeatures[0, false, false];
                //получаем и выводим кол-во элементов в дереве построения
                int featCount = featCol.Count();
                Console.WriteLine(@"Всего компонентов дерева построения: {0}", featCount.ToString());
                Console.WriteLine();
                //определяем переменные для работы с компонентами дерева
                IFeature7 curFeat = null;   //текущий элемент
                int lcf = 0;                //кол-во переменных в текущем элементе
                int i = 0;                  //счетчик компонентов дерева
                int j = 0;                  //счетчик переменных компонента
                string name_of_object = null;//имя компонента дерева
                bool is_sheet = false;      //проверка на "листовое тело"
                //перебираем компоненты дерева
                do
                {
                    //получаем текущий компонент
                    curFeat = (IFeature7)featCol[i];
                    //получаем кол-во переменных в компоненте
                    lcf = curFeat.VariablesCount[false,false];
                    //получаем и выводим имя компонента
                    name_of_object = curFeat.Name;
                    Console.WriteLine(@"{0} - {1} переменных", name_of_object, lcf.ToString());
                    Console.WriteLine();

                    is_sheet = false;
                    //перебираем переменные в текущем компоненте
                    j = 0;
                    do
                    {
                        Console.WriteLine(curFeat.Variable[false, false, j].Name + @" " +
                            + curFeat.Variable[false, false, j].Value + @" " + curFeat.Variable[false, false, j].ParameterNote);
                        if (curFeat.Variable[false, false, j].ParameterNote == @"Толщина листового тела") { is_sheet = true; }
                        //Console.WriteLine(@"Имя переменной: {0}", curFeat.Variable[false,false,j].Name);
                        //Console.WriteLine(@"Значение переменной: {0}", curFeat.Variable[false, false, j].Value);
                        //Console.WriteLine(@"Комментарий к переменной: {0}", curFeat.Variable[false, false, j].ParameterNote);
                        j++;
                    } while (j < lcf);
                    //проводим проверку на листовове тело
                    if (is_sheet)
                    {
                        if (lcf == 4)
                        {
                            Console.WriteLine(@"Листовое тело построено по замкнутому контуру");
                        }
                        else { Console.WriteLine(@"Листовое тело построено по незамкнутому контуру"); }
                        is_sheet = false;
                    }
                    else { Console.WriteLine(@"Элемент дерева не является листовым телом"); }
                    Console.WriteLine();
                    i++;
                } while (i < featCount);

                Console.ReadLine();               
            }
            else { appl.MessageBoxEx(@"Текущий документ не является моделью", @"Информация о документе", 0); }

        }
    }
}

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

AlinaM

Всем привет!
У меня похожий вопрос, не стала создавать новую тему
Скажите пожалуйста, можно ли получить программно информацию о количестве "сгибов" у листовой детали, которые делались через "Листовое тело"?
Например, Компас, в таком случае, подсказывает пользователю, о количестве сгибов в данной операции. Можно ли эту информацию получить программно?
пример 1.png


AlinaM

Цитата: Sabahs от 26.05.21, 14:05:05ISheetMetalBends.Count
Спасибо за оперативный ответ!
Для деталей, у которых отсутствует операция "Сгиб"(отдельная операция в дереве построения), метод ISheetMetalBends.Count возвращает 0
Поэтому и вопрос, можно ли получить коллекцию сгибов которые были получены напрямую, из операции "Листовое тело"

Смотрите все операции у контейнера ISheetMetalContainer.
Сгибы разные бывают, а принцип одинаковый.