Передать текст в документ

Автор lyret59, 11.02.22, 12:55:26

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

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

lyret59

Всем привет. Создаю текстовый документ через API5, но там не нашёл функции, которая пишет текст в документ. Видел статью по этому поводу, парень писал что через API5 никак не передать текст, но можно через API7. Подскажите, может кто-то делал уже такое.


Михаил88

#1
# -*- coding: utf-8 -*-
#|текст

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))

iDocument2D = kompas_object.ActiveDocument2D()

iParagraphParam = kompas6_api5_module.ksParagraphParam(kompas_object.GetParamStruct(kompas6_constants.ko_ParagraphParam))
iParagraphParam.Init()
iParagraphParam.x = 90.344821905642
iParagraphParam.y = 248.36158781765
iParagraphParam.ang = 0
iParagraphParam.height = 6.028531074524
iParagraphParam.width = 28.27833366394
iParagraphParam.hFormat = 0
iParagraphParam.vFormat = 0
iParagraphParam.style = 1
iDocument2D.ksParagraph(iParagraphParam)

iTextLineParam = kompas6_api5_module.ksTextLineParam(kompas_object.GetParamStruct(kompas6_constants.ko_TextLineParam))
iTextLineParam.Init()
iTextLineParam.style = 1
iTextItemArray = kompas_object.GetDynamicArray(LDefin2D.TEXT_ITEM_ARR)
iTextItemParam = kompas6_api5_module.ksTextItemParam(kompas_object.GetParamStruct(kompas6_constants.ko_TextItemParam))
iTextItemParam.Init()
iTextItemParam.iSNumb = 0
iTextItemParam.s = "оророророр"
iTextItemParam.type = 0
iTextItemFont = kompas6_api5_module.ksTextItemFont(iTextItemParam.GetItemFont())
iTextItemFont.Init()
iTextItemFont.bitVector = 4096
iTextItemFont.color = 0
iTextItemFont.fontName = "GOST type A"
iTextItemFont.height = 5
iTextItemFont.ksu = 1
iTextItemArray.ksAddArrayItem(-1, iTextItemParam)
iTextLineParam.SetTextItemArr(iTextItemArray)

iDocument2D.ksTextLine(iTextLineParam)
obj = iDocument2D.ksEndObj()


Вот сделал с помощью компас макро на python c использованием API5
+ Благодарностей: 1

lyret59

Цитата: Михаил88 от 11.02.22, 13:06:52# -*- coding: utf-8 -*-
#|текст

import pythoncom
from win32com.client import Dispatch, gencache

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))

iDocument2D = kompas_object.ActiveDocument2D()

iParagraphParam = kompas6_api5_module.ksParagraphParam(kompas_object.GetParamStruct(kompas6_constants.ko_ParagraphParam))
iParagraphParam.Init()
iParagraphParam.x = 90.344821905642
iParagraphParam.y = 248.36158781765
iParagraphParam.ang = 0
iParagraphParam.height = 6.028531074524
iParagraphParam.width = 28.27833366394
iParagraphParam.hFormat = 0
iParagraphParam.vFormat = 0
iParagraphParam.style = 1
iDocument2D.ksParagraph(iParagraphParam)

iTextLineParam = kompas6_api5_module.ksTextLineParam(kompas_object.GetParamStruct(kompas6_constants.ko_TextLineParam))
iTextLineParam.Init()
iTextLineParam.style = 1
iTextItemArray = kompas_object.GetDynamicArray(LDefin2D.TEXT_ITEM_ARR)
iTextItemParam = kompas6_api5_module.ksTextItemParam(kompas_object.GetParamStruct(kompas6_constants.ko_TextItemParam))
iTextItemParam.Init()
iTextItemParam.iSNumb = 0
iTextItemParam.s = "оророророр"
iTextItemParam.type = 0
iTextItemFont = kompas6_api5_module.ksTextItemFont(iTextItemParam.GetItemFont())
iTextItemFont.Init()
iTextItemFont.bitVector = 4096
iTextItemFont.color = 0
iTextItemFont.fontName = "GOST type A"
iTextItemFont.height = 5
iTextItemFont.ksu = 1
iTextItemArray.ksAddArrayItem(-1, iTextItemParam)
iTextLineParam.SetTextItemArr(iTextItemArray)

iDocument2D.ksTextLine(iTextLineParam)
obj = iDocument2D.ksEndObj()


Вот сделал с помощью компас макро на python


Спасибо за ответ! Можешь приложить файл макроса, пожалуйста?

Михаил88


Михаил88


lyret59

Спасибо за ответ! Но мне нужно создать не 2d документ, а именно текстовый.

Михаил88

извиняюсь не внимательно прочитал вопрос

Так - pDocument:=pDocuments.AddWithDefaultSettings(ksDocumentTextual,True);
или так - pDocument:=pDocuments.Add(ksDocumentTextual,True);

lyret59

Цитата: Sabahs от 11.02.22, 13:32:12Так - pDocument:=pDocuments.AddWithDefaultSettings(ksDocumentTextual,True);
или так - pDocument:=pDocuments.Add(ksDocumentTextual,True);

Да, документ я создал, а вот как в него текст передать, так и не смог найти.

Поиск по форуму, куча тем про текст.

lyret59

Цитата: Sabahs от 11.02.22, 13:35:40Поиск по форуму, куча тем про текст.

К сожалению, не могу найти ответа на данный вопрос в темах форума. Изначально поискал, но ничего не нашёл.


lyret59

Цитата: Sabahs от 11.02.22, 13:44:29IDrawingTexts.Add

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


Михаил88

Цитата: lyret59 от 11.02.22, 13:53:54Это интерфейс коллекции текстов на чертеже, вопрос заключается в том, чтобы передать текст в текстовый документ.

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache

#  Получи константы
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                             pythoncom.IID_IDispatch))

documents = application.Documents
kompas_document = documents.AddWithDefaultSettings(kompas6_constants.ksDocumentTextual, True)

iTextDocument = kompas_api7_module.ITextDocument(kompas_document)
print(iTextDocument)
text = iTextDocument.Text
text.Str = 'dasdsdsdsdsd'
+ Благодарностей: 1

lyret59

Цитата: Михаил88 от 11.02.22, 14:41:59# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache

#  Получи константы
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                             pythoncom.IID_IDispatch))

documents = application.Documents
kompas_document = documents.AddWithDefaultSettings(kompas6_constants.ksDocumentTextual, True)

iTextDocument = kompas_api7_module.ITextDocument(kompas_document)
print(iTextDocument)
text = iTextDocument.Text
text.Str = 'dasdsdsdsdsd'

Спасибо! Это то, что было нужно.
На C# это будет так:
Type t7 = Type.GetTypeFromProgID("KOMPAS.Application.7");
IApplication application = (IApplication)Activator.CreateInstance(t7);
application.Visible = true;
var textDocument = (ITextDocument)application.
                                  Documents.
                                  AddWithDefaultSettings(DocumentTypeEnum.ksDocumentTextual, true);                       
var text = textDocument.Text;
string s = "sss";
string str = $"{s}\n123";
text.Str = str;

Из того, что нашёл в SDK я понял, что можно передавать только одну строку. Но чтобы записать несколько строк в ней можно использовать "\n". Может есть менее костыльный метод, но я не смог найти.

Спасибо всем за помощь!

lyret59


p3452

Цитата: lyret59 от 12.02.22, 18:21:26Из того, что нашёл в SDK я понял, что можно передавать только одну строку.
Текстовый документ.png

lyret59


p3452

1. Код вам уже давали - дважды в развернутом виде и еще несколько раз отдельными фрагментами!
2. Скрин - ручной ввод (код можно получить через макрорекордер), всего лишь демонстрация вашего заблуждения:
Цитата: lyret59 от 12.02.22, 18:21:26Из того, что нашёл в SDK я понял, что можно передавать только одну строку.
3. "Текст" во всех документах Компас имеет одинаковый интерфейс, т.е. не важно где находится Текст - на чертеже, в спецификации, в таблице или в "текстовом документе".
4. "Текстовый документ" может включать ВСЕ, что есть в панели меню Компаса "Вставить".

 

Михаил88

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache

#  Получи константы
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                             pythoncom.IID_IDispatch))

documents = application.Documents
kompas_document = documents.AddWithDefaultSettings(kompas6_constants.ksDocumentTextual, True)

iTextDocument = kompas_api7_module.ITextDocument(kompas_document)
print(iTextDocument)
text = iTextDocument.Text
text.Str = 'Первая строка'
text_line = text.Add()
text_line.Str = 'Вторая строка'
text.AddTextLine(kompas6_constants.ksTLFragment, r"C:\Users\User\Desktop\Фрагмент.frw")

Вот еще пример