Текст считывается как иероглиф

Автор redram, 30.06.11, 16:06:22

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

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

redram

Доброго времени суток.
Столкнулся с такой проблемой как получение строки текста из документа Компас.
Суть в следующем:
-имеется файл документа Компас (.frw, .cdw)
-в нем несколько макроэлементов внутри которых имеется строка с текстом
-с помощью итераторов удается добраться до текста ( подсвечивает корректно с помощью функции ksLightObj)
-с помощью функции GetTextLineArr в интерфейсе GetParamStruct(ko_TextParam) получаю ksDynamicArray типа TEXT_LINE_ARR
для которого вызываю функцию ksGetArrayItem(i, char), где char есть интерфейс получаемый с помощью GetParamStruct(ko_Char255)
- далее вызывая элементарное console.writeline(char.str) для VS2008 или ksMessage(char.Str) для Компас 3ДВ10 получаю в одномслучае загогулину с вопросами а во втором иероглифы китайские :)

может ктонить сталкивался с подобной задачей то подскажите пожалуста куда копать ?

redram

Вот пару скриншотов

redram

Разобрался:
для функции ksGetArrayItem нужно передавать не GetParamStruct(ko_Char255)..а GetParamStruct(ko_TextLineParam)...снова вызывать ksGetArrayItem и для него GetParamStruct(ko_TextItemParam), и уже для последнего типа параметров вызывать свойство .S

ероглифы были сцылками на интерфесы...которые я сразу пихал в чар...:)

1s_BricK

Привет redram, у меня такая проблема- хотел бы записать в переменную содержимое текстового поля(текста). Возможно ли редактровать текстовое сообщения программно? Не мог бы подсказать как возможно это осуществить, у тебя вроде получилось, судя по твоему сообщению!!!

redram

Я использую Visual Studio Team System 2008. Пишу на Visual Basic .NET.
1.) Создаем новый проект
2.) Подклучаем в References библиотечку kAPI5.tlb что лежит в папке с Компасом C:\Program Files\ASCON\KOMPAS-3D V10\SDK\Lib  (у меня установлен Kоmpas 3D V10)

' Создаем объект Компас
        Dim Kompas As Kompas6API5.Application = CreateObject("KOMPAS.Application.5")
        ' Установка видимого режима
        Kompas.Visible = True
        Dim Document As Kompas6API5.Document2D = Kompas.Document2D
        Dim strFilePath As String = "c:\Фрагмент.frw"
        ' 0 - видимый режим открытия доки (1 - невидимый)
        Document.ksOpenDocument(strFilePath, 0)
        Dim iterator As Kompas6API5.Iterator = Kompas.GetIterator
        ' 4 - перемещаться по текстовым объектам;
        ' 0 - перемещатся по всему документу
        iterator.ksCreateIterator(4, 0)
        ' получаем ссылку на первый текстовый объект
        Dim TextObjRef As Long = iterator.ksMoveIterator("F")

        If TextObjRef = 0 Then
            MsgBox("Нету текстовых объектов")
        Else
            Do
                ' Подсветить объект если выполнение происходит в видимом режиме
                Document.ksLightObj(TextObjRef, 1)
                ' Определяем объект хранящий параметры текста
                Dim ksTextParam As Kompas6API5.ksTextParam = Kompas.GetParamStruct(28)
                ' Передаем ksTextParam для его заполнения
                Document.ksGetObjParam(TextObjRef, ksTextParam, -1)
                ' Получаем динамический массив строк текста типа TEXT_LINE_ARR
                Dim TEXT_LINE_ARR As Kompas6API5.ksDynamicArray = ksTextParam.GetTextLineArr()
                ' Перебор строк текстового объекта
                For i = 0 To TEXT_LINE_ARR.ksGetArrayCount - 1
                    ' Определяем объект хранящий параметры строки текста
                    Dim ksTextLineParam As Kompas6API5.ksTextLineParam = Kompas.GetParamStruct(29)
                    ' Заполняем параметры строки текста
                    TEXT_LINE_ARR.ksGetArrayItem(i, ksTextLineParam)
                    ' Получаем динамический массив КОМПОНЕНТ строк текста типа TEXT_ITEM_ARR
                    Dim TEXT_ITEM_ARR As Kompas6API5.ksDynamicArray = ksTextLineParam.GetTextItemArr()
                    ' Перебор компонент (По сути компонента и есть целая строка)
                    For j = 0 To TEXT_ITEM_ARR.ksGetArrayCount - 1
                        ' Определяем объект хранящий параметры компонента строки текста
                        Dim ksTextItemParam As Kompas6API5.ksTextItemParam = Kompas.GetParamStruct(31)
                        ' Заполняем параметры компонента строки текста
                        TEXT_ITEM_ARR.ksGetArrayItem(j, ksTextItemParam)

                        ' Значение строки текстового объекта 
                        ' лежит в ksTextItemParam.s.ToString
                        Console.WriteLine(ksTextItemParam.s.ToString)

                    Next
                Next
                ' Снять подсветку
                Document.ksLightObj(TextObjRef, 0)
                ' Следующий текстовый объект
                TextObjRef = iterator.ksMoveIterator("N")
            Loop Until TextObjRef = 0
        End If
        ' Незнаю почему, но компас не всегда успевает закрыться
        ' если просто вызвать метод Kompas.Quit,
        ' поэтому нашелся выход сделать это в отдельном потоке. :)
        Dim thr As New Threading.Thread(AddressOf Kompas.Quit)
        thr.Start()


PS: Редактировать текст можно однозначно. По сути можно делать все что делается в компасе.
PPS: Очень Понравилась справочка (C:\Program Files\ASCON\KOMPAS-3D V10\SDK\SDK.chm), там в принципе написано много чего полезного :)

redram

Аааа...забыл упомянуть...какого-то уя...непонятно почему....существует такая мелкая проблемка...
В общем, если в компасе в тексте есть символы ~ @ $ ^ & (это те что удалось мне найти)   , то они при считывании в программе дублируются. То есть, если в компасе напечатан текст "Чук & Гек", то при считывании получим "Чук && Гек" Вот так вот  :o:

1s_BricK

Спасибо огромное, буду юзать!!!!