Доброго времени суток.
Столкнулся с такой проблемой как получение строки текста из документа Компас.
Суть в следующем:
-имеется файл документа Компас (.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 получаю в одномслучае загогулину с вопросами а во втором иероглифы китайские :)
может ктонить сталкивался с подобной задачей то подскажите пожалуста куда копать ?
Вот пару скриншотов
Разобрался:
для функции ksGetArrayItem нужно передавать не GetParamStruct(ko_Char255)..а GetParamStruct(ko_TextLineParam)...снова вызывать ksGetArrayItem и для него GetParamStruct(ko_TextItemParam), и уже для последнего типа параметров вызывать свойство .S
ероглифы были сцылками на интерфесы...которые я сразу пихал в чар...:)
Привет 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), там в принципе написано много чего полезного :)
Аааа...забыл упомянуть...какого-то уя...непонятно почему....существует такая мелкая проблемка...
В общем, если в компасе в тексте есть символы ~ @ $ ^ & (это те что удалось мне найти) , то они при считывании в программе дублируются. То есть, если в компасе напечатан текст "Чук & Гек", то при считывании получим "Чук && Гек" Вот так вот :o:
Спасибо огромное, буду юзать!!!!