Получаем из чертежа (.cdw) характеристику объектов спецификации

Автор shilov, 06.02.13, 12:54:30

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

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

shilov

Имеется чертеж сборочное единицы (файл .cdw). При этом файл спецификации .spw для этой сборочной единицы отсутствует. Необходимо выдернуть из чертежа характеристику объектов спецификации и записать их в таблицу значений в 1с!

Вот с чего всё начинается:

Функция ПолучитьСпец()

КомпасПриложение = Новый COMОбъект("KOMPAS.Application.5");
СборочныйЧертеж = ПолучитьСборочныйЧертеж(item);  / записываем в переменную путь к файлу с чертежом

Тспец=Новый ТаблицаЗначений;  //Создание таблицы значений
   Тспец.Колонки.Добавить("Раздел");
   Тспец.Колонки.Добавить("Формат");
   Тспец.Колонки.Добавить("Зона");
   Тспец.Колонки.Добавить("Позиция");
   Тспец.Колонки.Добавить("Обозначение");
   Тспец.Колонки.Добавить("Наименование");
   Тспец.Колонки.Добавить("Количество");
   Тспец.Колонки.Добавить("Примечание");

Если КомпасОбъект= Неопределено Тогда
   КомпасОбъект=КомпасПриложение.SpcDocument();
   КомпасОбъект.ksOpenDocument(СборочныйЧертеж,Ложь);
КонецЕсли;

//!!!из файлов спецификации мы бы выдёргивали следующим образом:

//начало
   Если КомпасОбъект= Неопределено Тогда
      КомпасОбъект=КомпасПриложение.SpcDocument();
      КомпасОбъект.ksOpenDocument(СборочныйЧертеж,Ложь);
   КонецЕсли;
    spc=КомпасОбъект.GetSpecification(); //Получаем объект спецификации.
   spcColPar = КомпасПриложение.GetParamStruct(81);//81 - ko_SpcColumnParam
   Итератор=КомпасПриложение.GetIterator(); //Инициализируем итератор
   Итератор.ksCreateSpcIterator("graphic.lyt", 1, 0); //Прикручиваем итератор к спецификации
   Строка=Итератор.ksMoveIterator( "F" ); //находим первый
   Пока Строка<>0 И Строка <> Неопределено Цикл
      //узнаем количество колонок у базового объекта спецификации
         Стр=Тспец.Добавить();
         Стр.Раздел=spc.ksGetSpcSectionName(Строка);
         Если Стр.Раздел="Документация" Тогда
            Стр.Раздел=Справочники.aps_ВидыЭлементов.Документ;               
         ИначеЕсли Стр.Раздел="Сборочные единицы" Тогда
            Стр.Раздел=Справочники.aps_ВидыЭлементов.СбЕдиница;               
         ИначеЕсли Стр.Раздел="Детали" Тогда
            Стр.Раздел=Справочники.aps_ВидыЭлементов.Деталь;               
         ИначеЕсли Стр.Раздел="Стандартные изделия" Тогда
            Стр.Раздел=Справочники.aps_ВидыЭлементов.СтИзд;               
         ИначеЕсли Стр.Раздел="Материалы" Тогда
            Стр.Раздел=Справочники.aps_ВидыЭлементов.Материал;               
         КонецЕсли;
         Стр.Формат=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,1,spcColPar);
         Стр.Зона=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,2,spcColPar);
         Стр.Позиция=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,3,spcColPar);
         Стр.Обозначение=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,4,spcColPar);
         Стр.Наименование=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,5,spcColPar);
         Стр.Количество=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,6,spcColPar);
         Стр.Примечание=ПолучитьЗначениеКолонкиСпецификации(spc,Строка,7,spcColPar);
      Строка = Итератор.ksMoveIterator( "N" );  //Находим следующий объект итерации
   Конеццикла;
   КомпасОбъект.ksCloseDocument();
Возврат ТСпец;
КонецФункции

Функция ПолучитьЗначениеКолонкиСпецификации(spc,Строка,Сч,spcColPar)
   Значение="";
   Если spc.ksGetSpcColumnType( Строка, //объект спецификации
                        Сч, // номер колонки, начиная с 1, нас интересует
                        spcColPar ) <>  0 Тогда
      //Получили параметры колонки, "расчленим" их на составляющие
      columnType = spcColPar.columnType;
      ispoln = spcColPar.ispoln;
      blok = spcColPar.block;
      //Получаем в буфер содержимое ячейки таблицы (при заданном объекте, в заданной колонке)
      Значение = spc.ksGetSpcObjectColumnText( Строка, columnType , ispoln, blok );
   КонецЕсли;
   Возврат Значение;
КонецФункции // ПолучитьЗначениеКолонкиСпецификации()

//конец

Как получить тоже самое из файла .cdw ?

shilov

Вообще мне достаточно только получить позицию объекта, его обозначение и наименование

ainis

Все точно так же, т. е. с использованием КомпасОбъект.GetSpecification(). Только в качестве КомпасОбъект "подсуньте" чертеж.

shilov

заменил   КомпасОбъект=КомпасПриложение.SpcDocument(); на КомпасОбъект=КомпасПриложение.Document2D(); 1 раз срабатывает, 2 раз глючит при попытке получить спецификацию; А третий раз не удаётся даже получить COMОбъект("KOMPAS.Application.5"); При открытии и закрытии любого чертежа картина повторяется. Не могу понять в чём дело.

shilov

КомпасПриложение.Quit() почему-то не срабатывает.

проблема решилась только таким образом


Попытка
КомпасПриложение = Новый COMОбъект("KOMPAS.Application.5");
Исключение
КомпасПриложение = ПолучитьCOMОбъект("KOMPAS.Application.5");
КонецПопытки;

shilov

Блин не работает когда среди объектов спецификации есть документы   :( Помогите. Итератор.ksMoveIterator( "F" ) в этих случаях возвращает сразу 0.

ainis

Если спецификация не секретная, сбросьте мне на почту (см. профиль), я посмотрю, как с ней работает моя программа.