API к Оборудование: Металлоконструкции, Оборудование: Трубопроводы, AEC

Автор p3452, 04.03.19, 12:55:21

« предыдущая - следующая »

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

p3452

(Создал новую тему, чтобы заострить вопрос)

Подскажите новичку!
Есть ли доступ через API к Оборудование: Металлоконструкции, Оборудование: Трубопроводы, AEC?
Пересмотрел SDK и примеры - ничего не нашел.
Пробовал макросы записывать - пишутся только базовые операции и ничего не лишиться по Металлоконструкциям и Трубопроводам; по AEC пишутся только размеры.
Как достучаться к эти библиотекам и конфигурациям? Есть ли хоть какое-то API по ним?

kamos

обратитесь в SD, с примерным описанием задачи, на форуме людей, которые макросы под строительную конфигурацию пишут, мало

p3452

kamos, спасибо за ответ но:
1. Мне не нужны макросы написанные кем-то, да и сами макросы я использовал пытаясь увидеть то что не нашел в SDK и Примерах
(ветка форума по С#).
2. Хотелось бы определенности с наличием или отсутствием API под строительную конфигурацию (в SDK есть немного по размерам) и библиотеки Металлоконструкции и Оборудование.
3. Степень автоматизации процесса проектирования Строительный конфигурации неприемлемо низкая, но функционала "кнопочного" вполне достаточно и вопрос только в том, как автоматизировать нажатие этих кнопок.
В машиностроительной конфигурации можно построить любую деталь и получить с нее комплект чертежей не нажав ни одной кнопки на панели инструментов, параметров - в Строительной конфигурации можно так?
А в Металлоконструкциях - можно так?
А в оборудовании - можно так?
4. Что такое SD - "development service" ?

kamos

SD - ServiceDESK; служба поддержки пользователей, запросы поданные туда попадают к профильным специалистам,
направить  запрос можно здесь https://sd.ascon.ru/otrs/customer.pl
насколько мне известно Аскон всячески поощряет деятельность пользователей по написанию приложений и макросов для Компас, так что пишите помогут, (сам я от программирования далек поэтому подсказать ничего не могу)

chelkar

Цитата: p3452 от 04.03.19, 12:55:21
Подскажите новичку!
Есть ли доступ через API к Оборудование: Металлоконструкции, Оборудование: Трубопроводы?


Нет такого API.

PS. Всё-таки интересно, какую задачу хотелось бы порешать. Для чего нужно API на приложения?

p3452

Можно, как оказалось, получить доступ к командам всех библиотек:
// Компас должен быть запущен
...
private IApplication kompasApp; // KOMPAS.Application.7
...
string slib = string.Empty;
List<string> tree;
tree = new List<string>();
tree.Clear();

// Менеджер библиотек
libM = kompasApp.LibraryManager;
// Список зарегистрированных библиотек
ProceduresLibraries prLibs = libM.ProceduresLibraries;
// Список команд
Procedures prCs;

// Строим дерево
for (int i=0; i<prLibs.Count; i++)
{
slib = string.Empty;
slib = "i="+ i.ToString()+ "  UniqueId=["+ prLibs[i].UniqueId+ "]   LibraryName=["+
prLibs[i].LibraryName+ "]  Name=["+ prLibs[i].Name+ "]";
tree.Add(slib);

// Список команд i-й библиотеки
prCs = prLibs[i].Procedures;
for (int n=0; n<prCs.Count; n++)
{
slib = "    n="+ n.ToString()+ "  ID=["+ prCs[n].Id.ToString()+ "]  Type=["+
prCs[n].Type.ToString()+ "  Name=["+ prCs[n].Name+ "]"+
"  LibraryFolder=["+ prCs[n].LibraryFolder+ "]";
tree.Add(slib);
}
}

// переносим дерево в текстовый файл D:\TreeLibCom.txt
string sFile = @"D:\TreeLibCom.txt";
using (StreamWriter sw = new StreamWriter(sFile, false, System.Text.Encoding.Default))
{
foreach(string st in tree)
sw.WriteLine(st);
MessageBox.Show(this, "Файл записан...", "Сообщение");
}



И выполнить можно, через Execute().

Но, в плане автоматизации проектирования, это мало что дает - эмулирование нажатие кнопок и не более.
Буду дальше разбираться.

p3452

Коллеги, кто занимался экспортом спецификаций, подскажите!

Разбираюсь с SpecificationDescriptions и попутно решаю частную задачу - экспорт содержимого таблиц с листа в Excel.

Получается только с выбором группы ячеек вручную, а хотелось бы автоматом - кнопочку нажал и все упало в Excel.
Делаю так:
ISpecificationDescription->ISpecificationColumnStyle - получаем шапку спецификации,
ISpecificationDescription->ISpecificationSectionStyle - получаем разделы спецификации,
ISpecificationDescription->ISpecificationBaseObject-->ISpecificationColumn->ISpecificationColumnItem - получаем ячейки
tekDoci = kompasApp.ActiveDocument as KompasAPI7.IKompasDocument;

for (int i1=0; i1<tekDoci.SpecificationDescriptions.Count; i1++)
{
iSpDesc = tekDoci.SpecificationDescriptions[i1] as ISpecificationDescription;
for (int i2=0; i2<iSpDesc.SpecificationStyle.Columns.Count; i2++)
{
var iSpColSt = iSpDesc.SpecificationStyle.Columns[i2] as ISpecificationColumnStyle;
// Получаем "шапку" таблицы
}

for (int i2=0; i2<iSpDesc.SpecificationStyle.Sections.Count; i2++)
{
iSpSecSt = iSpDesc.SpecificationStyle.Sections[i2] as ISpecificationSectionStyle;
// Получаем "разделы" таблицы
}

for (int i2=0; i2<iSpDesc.BaseObjects.Count; i2++)
{
iSpBOvj = iSpDesc.BaseObjects[i2] as ISpecificationBaseObject;
for (int i3=0; i3<iSpBOvj.AdditionalColumns.Count; i3++)
{
iSpCol = iSpBOvj.AdditionalColumns[i3] as ISpecificationColumn;
for (int i4=0; i4<iSpCol.ColumnItems.Count; i4++)
{
iSpColIt = iSpCol.ColumnItems[i4] as ISpecificationColumnItem;
// Получаем содержимое всех ячеек колонок: Value=...
// при этом ColumnName="ID"
// ??? Ячейки не привязаны к Колонкам и Разделам
}
// Здесь: Text=...
}
}
}

При этом у всех Item-ов ColumnName="ID" - вопрос:
   где искать связь Ячеек с Колонками и Разделами?

DesignЯR

У меня в С# строка аналогичная вот этой строке
iSpDesc = tekDoci.SpecificationDescriptions[i1] as ISpecificationDescription;
выдает ошибку, то есть  ISpecificationDescription не получен.
То же самое и с  tekDoci.SpecificationDescriptions.Active.
Пишите в техподдержку - что там скажут, а пока смотрите Step10 - там рабочий вариант(API5).

p3452

Доброго времени суток!

Код верный, но упрощенный, на каждый объект проверки и прочее, конкретно на этом месте у меня так:if (tekDoci.SpecificationDescriptions == null || tekDoci.SpecificationDescriptions.Count<=0)
// бла-бла-бла или просто return;
else
{
// Вот отсюда приведенный код
}


А по колонкам что-нибудь можете сказать?

DesignЯR

Вот мой код, где я пытаюсь получить ISpecificationDescription
Kompas.Instance.Baloon("Чтение спецификации");

            IKompasDocument KompasDocument = Kompas.Instance.Application.ActiveDocument;
            if (KompasDocument == null) { Kompas.Instance.Baloon("Нет активного документа"); }
            Kompas.Instance.GetDocumentType(true);
            ISpecificationDescriptions SpecificationDescriptions = KompasDocument.SpecificationDescriptions;
            if (SpecificationDescriptions == null) Kompas.Instance.Baloon("SpecificationDescriptions == null");
            if (SpecificationDescriptions != null) Kompas.Instance.Baloon("SpecificationDescriptions.Count="+ SpecificationDescriptions.Count.ToString());
           
             int SpecDescrCount = SpecificationDescriptions.Count;
            Kompas.Instance.Baloon("Перебор по всем SpecificationDescriptions.Items" );

            ISpecificationDescription SpecificationDescription=null;
            for (int SD = 0; SD <=SpecDescrCount; SD++) {
                 Kompas.Instance.Baloon("Пробуем SpecificationDescription.( " + SD.ToString()+")");

                 try {
                      SpecificationDescription = SpecificationDescriptions[SD]; //ошибка - переходим в catch
                     if (SpecificationDescription == null) Kompas.Instance.Baloon("SpecificationDescription == null");
                     if (SpecificationDescription != null) Kompas.Instance.Baloon("SpecificationDescription.Objects.Count=" + SpecificationDescription.Objects.Count.ToString());
                 }
                 catch { Kompas.Instance.Baloon("SpecificationDescription не получен"); };
             }

            Kompas.Instance.Baloon("Пробуем SpecificationDescription=SpecificationDescriptions.Active");
            try
             {
                  SpecificationDescription = SpecificationDescriptions.Active;//ошибка - переходим в catch
                 if (SpecificationDescription == null) Kompas.Instance.Baloon("SpecificationDescription == null");
                 if (SpecificationDescription != null) Kompas.Instance.Baloon("SpecificationDescription.Objects.Count=" + SpecificationDescription.Objects.Count.ToString());
             }
             catch { Kompas.Instance.Baloon("SpecificationDescription не получен"); };

На картинке - лог в окне компаса. В документе 2 описания спецификации, активный - первый. При этом при попытке взять Item(0) и Item(1) от ISpecificationDescriptions возвращается catch   а в Вашем коде - return, а если брать за пределами Items, то выдает null

В любом случае не удается получить  ISpecificationDescription.
О каких колонках  можно говорить, если нет описания?
Когда я в панели свойств  создаю свой SpinEdit,  у него не отрисовываются стрелки - а вроде как должны бы.
Скорее  всего не успели дописать код в срок, а потом и вовсе забросили.

p3452

Попробуй заменить имя переменной SpecificationDescription на любое другое - это зарезервированное слово ;)

p3452

Вот твой код, подправленный, рабочий! На выходе строка - просмотри ее через консоль или окно компаса или windows.forms
string test_new_ask()
{
string st = string.Empty;
//Kompas.Instance.Baloon("Чтение спецификации");
st = "Чтение спецификации\n";
    //IKompasDocument KompasDocument = Kompas.Instance.Application.ActiveDocument; // ОШИБКА!
    //+++  IApplication kompasApp;     
    var Kompas_Document = kompasApp.ActiveDocument as IKompasDocument;
   
    // if (KompasDocument == null)  // ОШИБКА!
    if (Kompas_Document == null)
{ //Kompas.Instance.Baloon("Нет активного документа");
    return "Нет активного документа";
    }
    //Kompas.Instance.GetDocumentType(true);
    //ISpecificationDescriptions SpecificationDescriptions = KompasDocument.SpecificationDescriptions;  // ОШИБКА!
    var Specification_Descriptions = Kompas_Document.SpecificationDescriptions as ISpecificationDescriptions;
    // if (SpecificationDescriptions == null)  // ОШИБКА!
    if (Specification_Descriptions == null)
//Kompas.Instance.Baloon("SpecificationDescriptions == null");
    return "SpecificationDescriptions == null";
    //  if (SpecificationDescriptions != null)  // ОШИБКА!
    if (Specification_Descriptions != null)
//Kompas.Instance.Baloon("SpecificationDescriptions.Count="+ SpecificationDescriptions.Count.ToString());
    st = st+ "SpecificationDescriptions.Count="+ Specification_Descriptions.Count.ToString()+ "\n";
    // int SpecDescrCount = SpecificationDescriptions.Count;  // ОШИБКА!
    int SpecDescrCount = Specification_Descriptions.Count;
   
    //Kompas.Instance.Baloon("Перебор по всем SpecificationDescriptions.Items" );
    st = st+ "Перебор по всем SpecificationDescriptions.Items";
   
    ISpecificationDescription Specification_Description=null;
    //for (int SD = 0; SD <=SpecDescrCount; SD++)  // ОШИБКА!
    for (int SD = 0; SD <SpecDescrCount; SD++)
{
        //Kompas.Instance.Baloon("Пробуем SpecificationDescription.( " + SD.ToString()+")");
        st = st+ "Пробуем SpecificationDescription.( " + SD.ToString()+")\n";
        try
{
             Specification_Description = Specification_Descriptions[SD]; //ошибка - переходим в catch
             // if (SpecificationDescription == null)  // ОШИБКА!
             if (Specification_Description == null)
//Kompas.Instance.Baloon("SpecificationDescription == null");
              st = st+ "SpecificationDescription == null\n";
             // if (SpecificationDescription == null)  // ОШИБКА!
             if (Specification_Description != null)
//Kompas.Instance.Baloon("SpecificationDescription.Objects.Count=" + SpecificationDescription.Objects.Count.ToString());  // ОШИБКА!
              st = st+ "SpecificationDescription.Objects.Count=" + Specification_Descriptions.Count.ToString();
        }
        catch
{ //Kompas.Instance.Baloon("SpecificationDescription не получен");
        st = st+ "SpecificationDescription не получен\n";
        }
    }

    //Kompas.Instance.Baloon("Пробуем SpecificationDescription=SpecificationDescriptions.Active");
    st = st+ "Пробуем SpecificationDescription=SpecificationDescriptions.Active\n";
    try
     {
         // SpecificationDescription = SpecificationDescriptions.Active; //ошибка - переходим в catch  // ОШИБКА!
    Specification_Description = Specification_Descriptions.Active;
         //if (SpecificationDescription == null)  // ОШИБКА!
         if (Specification_Description == null)
//Kompas.Instance.Baloon("SpecificationDescription == null");
          st = st+ "SpecificationDescription == null\n";
         //if (SpecificationDescription != null)  // ОШИБКА!
         if (Specification_Description != null)
//Kompas.Instance.Baloon("SpecificationDescription.Objects.Count=" + SpecificationDescription.Objects.Count.ToString()); // ОШИБКА!                 
          st = st+ "SpecificationDescription.Objects.Count=" + Specification_Descriptions.Count.ToString()+ "\n";
     }
     catch
     { //Kompas.Instance.Baloon("SpecificationDescription не получен");
      st = st+ "SpecificationDescription не получен\n";
     }
     return st;
}

DesignЯR

Это зашквар. раньше не было ошибок с таким объявлением переменных убрал "I" и нормально все работало, ну да и ладно...учтем ...
В этом коде получены тексты основных колонок каждого объекта текущего описания спецификации.
Если нужно просматривать только отдельные колонки, то можно колонку получать через  Specification_Columns.Column ( type, ColumnNumber, BlockNumber ), но об этом в SDK

        string test_new_ask()
        {
            string st = string.Empty;
            st = "Чтение спецификации\n";
            var Kompas_Document = Kompas.Instance.Application.ActiveDocument as IKompasDocument;
            if (Kompas_Document == null){ return "Нет активного документа";  }
            var Specification_Descriptions = Kompas_Document.SpecificationDescriptions as ISpecificationDescriptions;
            if (Specification_Descriptions == null) return "SpecificationDescriptions == null";
            if (Specification_Descriptions != null)
                st = st + "SpecificationDescriptions.Count=" + Specification_Descriptions.Count.ToString() + "\n";
            int SpecDescrCount = Specification_Descriptions.Count;
            st = st + "Перебор по всем SpecificationDescriptions.Items";
           ISpecificationDescription Specification_Description = null;
           st = st + "Пробуем SpecificationDescription=SpecificationDescriptions.Active\n";
            try
            {               
                Specification_Description = Specification_Descriptions.Active;
                if (Specification_Description == null)st = st + "SpecificationDescription == null\n";
                if (Specification_Description != null)
                {
                    st = st + "SpecificationDescription.Objects.Count=" + Specification_Description.BaseObjects.Count.ToString() + "\n";
                    Specification_Description.ShowOnSheet = true;
                    Specification_Description.Update();
                    ISpecificationObject Specification_Object = null;
                    ISpecificationColumns Specification_Columns = null;
                    ISpecificationColumns Specification_Additional_Columns = null;
                    ISpecificationColumn Specification_Column = null;
                    for (int bObj=0;bObj< Specification_Description.BaseObjects.Count; bObj++)
                    {
                        Specification_Object = Specification_Description.BaseObjects[bObj];
                        Specification_Columns = Specification_Object.Columns;
                        Specification_Additional_Columns = Specification_Object.AdditionalColumns;
                        st = st + "У объекта  "+bObj.ToString()+ "  " + Specification_Columns.Count.ToString() + "колонок основных  и " + Specification_Additional_Columns.Count.ToString()+ "дополнительных \n";
                        //просмотр всех основных колонок объекта спецификации - у вспомогательных аналогично
                        for (int bCol=0;bCol < Specification_Columns.Count; bCol++)
                        {
                            Specification_Column = Specification_Columns[bCol];
                            st = st + "|" + Specification_Column.Text.Str;
                        }
                        st = st + "\n";
                    }
                 }
            }
            catch {  st = st + "SpecificationDescription не получен\n"; }
            return st;
        }

p3452

А слона то я и не приметил - пропустил обработку BaseObjects-->Сolumns :)))))
И лог вырос сразу в 6 раз - теперь все есть...