Спецификация в чертеже. Получение.

Автор Kamerton, 27.04.15, 08:59:32

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

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

Kamerton

Доброго времени суток. Пытаюсь получить данные из специфкации, которая сохранена в формате чертежа.

Нашёл в API7 свойство DrawingObject.ChangeSpecificationDescriptions. Оно мне находит 4 страницы спецификации, но возвращает null вместо ISpecificationDescriptions для каждой страницы... Я в тупике...

Есть ли другие способы получить данные спецификации из чертежа?

Slaviation

Посмотрите тест во вложении.
На активном чертеже со спецификацией тест получает описания спецификации.
+ Благодарностей: 1

Kamerton

Цитата: Slaviation от 27.04.15, 10:23:49
Посмотрите тест во вложении.
На активном чертеже со спецификацией тест получает описания спецификации.

Потрясающе  :o

Прошу прощения за назойливость, с питоном не знаком, что за модуль вы получаете в module_7? апи, константы - понятно, а вот работу с некоторым модулем вижу впервые... Я на шарпе пишу (пожалуйста, не пугайтесь :) ), подобных функций не нахожу... Мне бы понять, куда копать :)

Slaviation

Через module_7 мы имеем доступ к интерфейсам, описанным в библиотеке типов, которая зарегистрирована в системе с указанным в вызове gencache.EnsureModule гуидом (kAPI7.tlb).

К примеру  в тесте:
api = module.IKompasAPIObject(тра ля ля)
или
doc = module_7.IKompasDocument(app.ActiveDocument)

Метод gencache.EnsureModule создает из kAPI7.tlb файл
<Буква диска>:\Python27\Lib\site-packages\win32com\gen_py\69AC2981-37C0-4379-84FD-5DD2F3C0A520x0x1x0.py
и возвращает его "модуль".

Описание сущности "модуль" в python лучше смотреть в его документации.
+ Благодарностей: 2

Kamerton

Всё оказалось проще...

Моя специфкация на чертеже не являлась по факту спецификацией, а была таблицей, нарисованной от руки. Потому-то я и не мог её получить через свойства

Спасибо за помощь :)

Kamerton

Всё оказалось сложнее... :) По крайней мере, для меня...

Моя спецификация на чертеже - офорление страницы из библотеки стилей.

При попытке получить данные из неё таким образом:

IDrawingDocument doc = kompasApp.Documents.Open("имя файла");
IView view = doc.ViewsAndLayersManager.Views[0];
ISymbols2DContainer sCont = view as ISymbols2DContainer;
IDrawingTables dTables = sCount.DrawingTables;

В dTables.Count() - выдаёт 0;
В SpecificationDescriptions тоже пусто;

Может есть какой-то менеджер стилей, который возвращает своё представление данных для оформления?

Slaviation

ЦитироватьМожет есть какой-то менеджер стилей, который возвращает своё представление данных для оформления?
Вроде как такого менеджера нет.
Коль спецификация выполнена как оформление страницы из библиотеки стилей, то по двойному щелчку мыши по ней она должна открываться на редактирование аналогично основной надписи, так?
Если так, то доступ к ее содержимому можно организовать через интерфейс IStamp или ksStamp.
Можно посмотрев оформление этой страницы определить карту ее номеров ячеек (см. рис).
+ Благодарностей: 1

Kamerton

Цитата: Slaviation от 14.05.15, 12:50:57
Если так, то доступ к ее содержимому можно организовать через интерфейс IStamp или ksStamp.

Благодарю!!!  :o:

Действительно, моя спецификация оказалась Штампом... А нужные данные идут (поячеечно) после 1000 элемента... Кто бы мог подумать...

Цитата: Slaviation от 14.05.15, 12:50:57
Можно посмотрев оформление этой страницы определить карту ее номеров ячеек (см. рис).

А с такой опцией не знаком :) У меня демоверсия, может поэтому информация по двойному клику в подложке не выводится...
Я взял циклом 10000 ячеек штампа и записал непустые значения (с индексами ячеек) в Dictionary<int,str> (C#). Начиная с 1025 пошли интересующие меня значения...

Slaviation

ЦитироватьНачиная с 1025 пошли интересующие меня значения...
О, тепленькая пошла ...  :)

Regest

Добрый день Kamerton
Можете выложить полные код, как вы получаете данные из спецификации.
За ранее спасибо.

Kamerton

#10
Цитата: Regest от 19.05.15, 09:16:17
Добрый день Kamerton
Можете выложить полные код, как вы получаете данные из спецификации.
За ранее спасибо.

Добрый

Эм... Дело в том, что, на данный момент, 'рабочего кода' у меня нету, есть куча 'не рабочего' из 'когда-то рабочего' + 'нового не преверенного'... Так что прямо ответить на вопрос будет проблематично...

Т.к. тема про получение Спецификаций с Чертежа, надеюсь, что получие Спецификаций из Спецификаций Вас не интересует :) Если интересует - спрашивайте подробнее.

В общих чертах, с Чертежей, в которых страницы Спецификации идут Оформлением, я получаю данные следующим образом:


SomeVal GetSpecificationFromDraftMethod(IStamp stamp)
{
    MyRow bufferRow;

    //получение строк спецификации
    for(int i = 1010; i < 1300; i+10)
    {
        bufferRow = new MyRow();

        //считывание поячеечно
        for(int k = 0; k < 10; k++)
        {
            bufferRow.Cells.Add(stamp.Text[i + k].Str));
        }
    }
}


Если убрать всякие try-catch'и, проверки и мои классы/методы :) Потом я собираю строки из штампа в List<MyRow>, объединяю полученные коллекции со Штампов Чертежа в одну и сохраняю её для моего представления файла, который читаю.

Также, из того, что я уяснил для себя по поводу Спецификации в Оформлении Чертежа:
1) Т.к. значения ячеек берутся из Штампа, приходится считывать Спецификацию постранично, а потом объединять полученные значения.
2) Т.к. значения ячеек берутся из Штампа, никаких примочек от SpecificationColumn & Object они не имеют. Отсюда, придётся разделы Спецификации парсить из значений ячеек (со всеми вытекающими).
3) В общем случае замечено (методом "тыка"), что одна строка соотвествует 10 ячейкам. Отсюда итерация по 10 даст строки со статичными индексами колонок.
4) Первое значение я получил начиная с индекса 102*. Учитывая, что первую строку Спецификации, в моём случае, оставляют пустой и длину строки (см. п.3), получил нижнюю границу цикла - 1010.
5) Т.к. значения ячеек берутся из Штампа и считываются постранично, то за один заход (страницу, с которой был взят Штамп) будет не больше 29 значимых строк (столько я насчитал на странице моей Спецификации). Отсюда получил верхнюю границу цикла: 1010 + (29 х 10) = 1300.
6) Т.к. Существуют различные варианты Оформлений, этот метод априори не является панацеей. В идеале, как мне представляется, нужно сверяться с бибилиотекой стилей и номером Оформления в ней, чтобы гарантировать структуру Штампа для текущей страницы Спецификации и запускать соотвествующий метод-обработчик структуры. Но я пока не стал так заморачиваться.