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

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

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

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

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

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

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

Как прочитать штамп основной надписи, Python

Автор Space, 09.12.15, 22:04:23

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

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

Space

Добрый день.

Вопрос на форуме поднимался не один раз, но найти решение мне не удалось.

Компас v12. Читаю колонки из файла чертежа следующим образом:


def get_kompas_api7():
    module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
    api = module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
    const = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
    return module, api, const

def get_stamp_drawing(doc_7):
    """ Читаем данные из основной надписи чертежа"""
    characteristic = {}
    stamp = doc_7.LayoutSheets.Item(0).Stamp

    characteristic["name_stamp"] = stamp.Text(1).Str.replace("\n", " ")
    characteristic["decimal_stamp"] = stamp.Text(2).Str
    characteristic["material_stamp"] = stamp.Text(3).Str.replace("\n", " ")
    characteristic["scale_stamp"] = stamp.Text(6).Str
    characteristic["applicable_stamp"] = stamp.Text(25).Str
    characteristic["develop_stamp"] = stamp.Text(110).Str
    characteristic["verify_stamp"] = stamp.Text(111).Str
    characteristic["validate_stamp"] = stamp.Text(115).Str

    return characteristic

def get_characteristic_kompas(filename):
    characteristic = {}
    module_7, api_7, const_7 = get_kompas_api7()
    app_7 = api_7.Application
    doc_7 = app_7.Documents.Open(filename, True, True)

    if doc_7.DocumentType == const_7.ksDocumentDrawing:
        characteristic.update(get_stamp_drawing(doc_7))


А вот со спецификацией не всё так просто. Через API7 к штампу не подобраться. Штрудировал пример step5 из SDK, пришёл к следующему:


def get_kompas_api5():
        module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
        api = module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(module.KompasObject.CLSID, pythoncom.IID_IDispatch))
        const = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0)
        return module, api, const.constants

def get_stamp_specification(filename):
    """ Читаем данные из основной надписи спецификации """
    characteristic = {}
if api_5.SpcDocument().ksOpenDocument(filename):
    spec_doc = api_5.SpcActiveDocument()
    stamp = spec_doc.GetStampEx(1)
    if stamp and stamp.ksOpenStamp():
        for i in range(999):
            stamp.ksColumnNumber(i)
            arr = stamp.ksGetStampColumnText(i)
            arrpLineText = api_5.GetDynamicArray(3) # TEXT_LINE_ARR = 3
            itemLineText = api_5.GetParamStruct(const_5.ko_TextLineParam)
            if itemLineText:
                itemLineText.Init
            else:
                print("Not itemLineText")
            count = arr.ksGetArrayCount()
            if count > 0:
                print(i, "=", count)
        stamp.ksCloseStamp()
    else:
        print("Not open stamp")
    spec_doc.ksCloseDocument()


Так вот в строке    count = arr.ksGetArrayCount() вылезает ошибка об отсутствии метода ksGetArrayCount.

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

Slaviation

Ошибка в строке arr = stamp.ksGetStampColumnText(i)
Python ругается на это: AttributeError: 'tuple' object has no attribute 'ksGetArrayCount'
Посмотри в справке SDK: LPDISPATCH ksGetStampColumnText (long* numb);
Метод возвращает указатель на интерфейс динамического массива, но и numb передается через указатель. Python в таких случаях возвращает tuple (проще список), в котором первый элемент - возвращаемое значение функции, а остальные элементы - значения, переданные в функцию по указателю.
Поэтому нужно так:
arr = stamp.ksGetStampColumnText(i)[0]
Т.е arr - это первый элемент списка, возвращаемого методом ksGetStampColumnText


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

Space

Спасибо, вот что у меня получилось:


def get_stamp_specification(filename):
    """ Читаем данные из основной надписи спецификации """
    characteristic = {}
    module_5, api_5, const_5 = get_kompas_api5()
    if api_5.SpcDocument().ksOpenDocument(filename, 3):
        spec_doc = api_5.SpcActiveDocument()
        stamp = spec_doc.GetStampEx(1)
        if stamp and stamp.ksOpenStamp():
            characteristic["name_stamp"] = get_stamp(1, api_5, stamp, const_5).replace("\n", " ")
            characteristic["decimal_stamp"] = get_stamp(2, api_5, stamp, const_5)
            characteristic["applicable_stamp"] = get_stamp(25, api_5, stamp, const_5)
            characteristic["develop_stamp"] = get_stamp(110, api_5, stamp, const_5)
            characteristic["verify_stamp"] = get_stamp(111, api_5, stamp, const_5)
            characteristic["validate_stamp"] = get_stamp(115, api_5, stamp, const_5)
            stamp.ksCloseStamp()
        else:
            print("Not open stamp")
    spec_doc.ksCloseDocument()
    return characteristic


def get_stamp(i, api_5, stamp, const_5):
    """ Получаем доступ к тексту основной надписи спецификации
        Пример взят из SDK Step5
    """
    result = ""
    stamp.ksColumnNumber(i)
    arr = stamp.ksGetStampColumnText(i)[0]
    arrpLineText = api_5.GetDynamicArray(3) # TEXT_LINE_ARR = 3
    itemLineText = api_5.GetParamStruct(const_5.ko_TextLineParam)
    if itemLineText:
        itemLineText.Init
    else:
        print("Not itemLineText")
    count = arr.ksGetArrayCount()
    if count > 0:
        for j in range(count):
            arr.ksGetArrayItem( j, itemLineText )
            arrpTextItem = itemLineText.GetTextItemArr()
            item = api_5.GetParamStruct(const_5.ko_TextItemParam)
            if not item or not arrpTextItem:
                break
            item.Init()
            count2 = arrpTextItem.ksGetArrayCount()
            for k in range(count2):
                arrpTextItem.ksGetArrayItem( k, item )
            result = item.s
            arrpTextItem.ksDeleteArray()
        arrpLineText.ksDeleteArray()
    arr.ksDeleteArray()
    return result
+ Благодарностей: 1

SAlex_S

Как то очень сложным путём идёте. Вот как читать основную надпись и чертежей и спецификаций.


from win32com.client import Dispatch

iApplication = Dispatch('KOMPAS.Application.7')
iDocument = iApplication.ActiveDocument
iLayoutSheets = iDocument.LayoutSheets
iLayoutSheet = iLayoutSheets.ItemByNumber (1)
iStamp = iLayoutSheet.Stamp
iText = iStamp.Text( 1 ) #номер ячейки для считывания данных наименования
Str1 = iText.Str
iText = iStamp.Text( 2 ) #номер ячейки для считывания данных обозначения
Str2 = iText.Str
Str1=Str1[0]

print (Str1)
print (Str2)


Пример для активного документа, думаю сможете сами прикрутить открывалку документов )

Space

Всё правильно, но стоит уточнить, что данный код будет работать в Компасе начиная с 14 версии (или в более поздней, сейчас не вспомню).