Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Тема начата: koprus77 от 23.02.16, 19:41:45

Название: Работа с текстом
Отправлено: koprus77 от 23.02.16, 19:41:45
Я пытался изменить высоту у текстового объекта из нескольких строк. Я получаю IText для каждого его ITextLine, я меняю свойство Height  у каждого его ITextItem. Потом обновляю ITextItem. Но высота меняется только у первой строки, а у остальных сбрасывается высота до 5.
Есть какой-либо нормальный метод менять параметры текста?
Название: Re: Работа с текстом
Отправлено: Sabahs от 23.02.16, 20:00:22
Уважаемый, код, тут экстрасенсов нет.
Название: Re: Работа с текстом
Отправлено: koprus77 от 23.02.16, 20:11:52
https://bpaste.net/show/1f99da5d22c9
Название: Re: Работа с текстом
Отправлено: Sabahs от 23.02.16, 20:41:59
Думаю нужно смотреть устройство строк.
Название: Re: Работа с текстом
Отправлено: koprus77 от 23.02.16, 20:45:40
Что-то не понял, что это за перечисление и как оно поможет изменить, скажем, цвет всего текстового объекта...  :%:
Название: Re: Работа с текстом
Отправлено: Sabahs от 23.02.16, 20:51:29
ITextLine.TextItems - обратите внимание и тут, текст очень сложный объект.
Можете почитать тут http://forum.ascon.ru/index.php/topic,24881.msg180076.html#msg180076 , тоже разбор текста.
Название: Re: Работа с текстом
Отправлено: koprus77 от 23.02.16, 21:04:15
Хорошо, тогда так: получаю массив TextItem-ов, потом проверяю каждый, что это самый обычный текст и если оно так, то меняю цвет. Что-то похожее написано в моем коде (если предположить, что нет дробей и прочих радостей), но он работает очень странно: меняются не все строки (хотя пробегаюсь по всем), при изменении цвета сбрасывается высота, в чем ошибка? Не совсем понятно, когда и от каких объектов вызывать .Update();
Название: Re: Работа с текстом
Отправлено: Sabahs от 23.02.16, 21:12:22
Я, Вам мягко намекнул, что строка textObjItem := TextObjLine.TextItem[0]; может быть некорректна, нужно проверить на сложный текст TextObjLine.TextItems.
Название: Re: Работа с текстом
Отправлено: koprus77 от 23.02.16, 21:28:40
for j := 0 to (TextObjLine.Count - 1) do begin
textObjItem := TextObjLine.TextItem[j];
// проверка на обычный текст (код 0x0 в enum-е)
if textObjItem.ItemType <> 0 then continue; // не хотим иметь с такими дело
...

Наблюдаются адские артефакты - появляется курсив, цвет не всегда меняется, сбрасывается размеры и т.п.
Что делать?
Название: Re: Работа с текстом
Отправлено: Sabahs от 23.02.16, 21:43:05
Массив получите  ITextLine.TextItems, а затем разгребайте.
PS. А дело придётся иметь со всеми возможными вариантами.
Название: Re: Работа с текстом
Отправлено: koprus77 от 23.02.16, 22:08:43
Хорошо, как Вам такая проблема. Меняю у Item-а размер и сбрасывается цвет, меняю цвет - теряю размер. Почему такое происходит?
Название: Re: Работа с текстом
Отправлено: Sabahs от 23.02.16, 22:15:45
Я этого не вижу.
Выравнивание кода должно быть до четырёх байт.
PS. Экстрасенсов тут нет, а у Вас есть отладчик, в нём всё видно.
Название: Re: Работа с текстом
Отправлено: koprus77 от 23.02.16, 22:17:50
Не понял про выравнивание, можно подробнее?
Название: Re: Работа с текстом
Отправлено: Sabahs от 23.02.16, 22:24:35
{$ALIGN 4}

Забыл сказать, в ссылках есть, но нужно проверять и ITextLine.TextLineData - интерфейс дополнительных данных строки, он тоже на форматирование влияет.
Название: Re: Работа с текстом
Отправлено: koprus77 от 24.02.16, 00:01:05
В справке нет ничего про TextLineData. Где про это почитать?
UPD: извините, нашёл
Название: Re: Работа с текстом
Отправлено: Дмитрий22 от 06.10.17, 10:11:17
Добрый!
Возникла необходимость клонировать объект класса IText
Судя по справке имеется метод

HRESUL  Assign( IText * Other, BOOL * Result );
Входные параметры:
Other - копируемый текст - указатель на интерфейс IText
Возвращаемое значение:
TRUE - в случае удачного завершения
Пытаюсь скопировать
IText MyText = null;
bool iftrue = MyText .Assign((Text)ExistText);
Выдает false, кто-нибудь копировал текст IText методом Assign?

Название: Re: Работа с текстом
Отправлено: ТрындецЪ от 06.10.17, 10:20:13
Цитата: Дмитрий22 от 06.10.17, 10:11:17
...кто-нибудь копировал текст IText методом Assign?
А куда он должен скопироваться? В буфер обмена? И как его потом вставить в чертёж?
Название: Re: Работа с текстом
Отправлено: Sabahs от 06.10.17, 10:22:03
Скопируйте во временную группу.
Название: Re: Работа с текстом
Отправлено: Дмитрий22 от 06.10.17, 10:36:51
Цитата: ТрындецЪ от 06.10.17, 10:20:13
А куда он должен скопироваться? В буфер обмена? И как его потом вставить в чертёж?
В чертеж не нужно. Один itext копируется в другой.
Цитата: Sabahs от 06.10.17, 10:22:03
Скопируйте во временную группу.
А в спецификации временная группа будет работать?
Название: Re: Работа с текстом
Отправлено: Sabahs от 06.10.17, 10:57:41
Можно попробовать, через API экспортные функции, но нет 100% гарантии, что будет работать.

Сделал функцию для копирования текста, вертикальный текст не делал, там нужно сделать вызов function CloneText.
Помимо вертикального текста, можно доделать: вставку фрагмента, рисунка и таблицы.
Название: Re: Работа с текстом
Отправлено: Дмитрий22 от 06.10.17, 17:24:40
Не слабо. Я рассчитывал на что-то встроенное в Api Компаса. Но все равно спасибо.

Sabahs, я добил команду Assign.
Весь твой код можно заменить этой командой, но пришлось создать бутафорный объект спецификации, чтобы был инициализирован IText. Моя ошибка заключалась в том. что я пытался при IText MyText = null, выполнить команду Assign. MyText не должен быть null. Вот работающий код:

ISpecificationBaseObject NewBaseObject= pKompasDocument.SpecificationDescriptions.Active.BaseObjects.Add(20, 0);
NewBaseObject.Columns.get_Column(Kompas6Constants.ksSpecificationColumnTypeEnum.ksSColumnMark, 1, 0).Text.Assign((Text)ExistText);


Название: Re: Работа с текстом
Отправлено: Умка от 08.11.17, 12:01:22
Не знал в какую тему написать, как расположить через питон тех требования на расстоянии 10 мм над основной надписью и 5 мм от неё-же по горизонтали, может кто-то скрипт имеет? К V13, W XP, Питон 2.6.
Название: Re: Работа с текстом
Отправлено: Slaviation от 09.11.17, 09:40:08
import pythoncom
from win32com.client import Dispatch, gencache
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
drawing_document = kompas_api7_module.IDrawingDocument(kompas_document_2d)
technical_demand = drawing_document.TechnicalDemand
technical_demand.AutoPlacement = False
technical_demand.BlocksGabarits = (25.0, 75.0, 200.0, 263.0)
Название: Re: Работа с текстом
Отправлено: Умка от 09.11.17, 09:56:12
не запускается, добавил в начало

import pythoncom, re, sys, time, math, threading, win32gui, ctypes, win32con

и опять не запускается
Название: Re: Работа с текстом
Отправлено: Slaviation от 09.11.17, 10:05:30
Текст ошибки можно посмотреть?
Название: Re: Работа с текстом
Отправлено: ТрындецЪ от 09.11.17, 10:18:51
Цитата: Slaviation от 09.11.17, 10:05:30
Текст ошибки можно посмотреть?
Что-то у меня тоже не работает. Программа выполняется без ошибок, а результата нет.
Название: Re: Работа с текстом
Отправлено: Умка от 09.11.17, 10:22:35
аналогично ошибок нет
Название: Re: Работа с текстом
Отправлено: ТрындецЪ от 09.11.17, 11:00:26
Добавил в конец:
technical_demand.Update()
iDocumentFrames = kompas_document.DocumentFrames
iDocumentFrame = iDocumentFrames.Item (0)
iDocumentFrame.RefreshWindow()

Но как-то непонятно работает. Не устанавливаются заданные габариты.

Upd: свойство AutoPlacement не принимает False
Название: Re: Работа с текстом
Отправлено: Slaviation от 09.11.17, 12:14:49
ЦитироватьЧто-то у меня тоже не работает. Программа выполняется без ошибок, а результата нет.
Как оказалось, причиной является ошибка в КОМПАС-3D. Ждем исправления.
Название: Re: Работа с текстом
Отправлено: ТрындецЪ от 09.11.17, 12:17:57
Цитата: Slaviation от 09.11.17, 12:14:49
Ждем исправления.
А через API5 не добраться?
Вот тут (http://forum.ascon.ru/index.php/topic,24690.msg177949.html#msg177949) было что-то подобное.
Название: Re: Работа с текстом
Отправлено: Slaviation от 10.11.17, 08:48:20
ЦитироватьА через API5 не добраться?
Попробовал через API5, но тот же самый результат - безрезультатно :)
Похоже ошибка в КОМПАС-3D общая как для API5, так и для API7.

import pythoncom
from win32com.client import Dispatch, gencache
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
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))
technical_demand_param = kompas_object.GetParamStruct(kompas6_constants.ko_TechnicalDemandParam)
rect_param = kompas_object.GetParamStruct(kompas6_constants.ko_RectParam)
document_2d = kompas_object.ActiveDocument2D()
document_2d.ksOpenTechnicalDemand(None, 0)
technical_demand_reference = document_2d.ksCloseTechnicalDemand()
document_2d.ksGetObjParam(technical_demand_reference, technical_demand_param, -1)
p_gab = technical_demand_param.GetPGab()
p_gab.ksGetArrayItem(0, rect_param)
pBot = rect_param.GetpBot()
pBot.x = 25.0
pBot.y = 75.0
pTop = rect_param.GetpTop()
pTop.x = 200.0
pTop.y = 260.0
rect_param.SetpBot(pBot)
rect_param.SetpTop(pTop)
p_gab.ksSetArrayItem(0, rect_param)
technical_demand_param.SetPGab(p_gab)
document_2d.ksSetObjParam(technical_demand_reference, technical_demand_param, -1)
Название: Re: Работа с текстом
Отправлено: Умка от 10.11.17, 09:28:37
File "C:\Program Files\Python26\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 312, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Program Files\ASCON\тт.pyw", line 9, in <module>
    document_2d.ksOpenTechnicalDemand(None, 0)
AttributeError: 'NoneType' object has no attribute 'ksOpenTechnicalDemand'

Компас 13, W XP
Название: Re: Работа с текстом
Отправлено: Slaviation от 10.11.17, 10:16:05
ЦитироватьAttributeError: 'NoneType' object has no attribute 'ksOpenTechnicalDemand'
Запускать на активном чертеже
Название: Re: Работа с текстом
Отправлено: Умка от 10.11.17, 10:38:34
не запускается
Название: Re: Работа с текстом
Отправлено: ТрындецЪ от 10.11.17, 10:58:40
У меня без ошибок запускается, но ничего не делает, как и говорилось.
К-16.0,  Py-2.6
У Умки вообще проблемный КОМПАС по части макросов. То всплывающие сообщения не работают, теперь вот  интерфейс document_2d не получает...
Название: Re: Работа с текстом
Отправлено: Slaviation от 13.11.17, 10:51:56
ЦитироватьКак оказалось, причиной является ошибка в КОМПАС-3D. Ждем исправления.
API7 - Исправление войдет в V17.1.5.
В API5 не реализовано и не планируется.
Название: Re: Работа с текстом
Отправлено: Умка от 17.11.17, 09:50:26
kompas_api7_module присутствует в Компасе 13, ждём исправления.
Название: Re: Работа с текстом
Отправлено: Sabahs от 17.11.17, 09:51:54
Какой смысл ждать исправление?
Компас V13 исправлять уже не будут.
Название: Re: Работа с текстом
Отправлено: Умка от 17.11.17, 09:54:14
я ждал исправленный скрипт
Название: Re: Работа с текстом
Отправлено: Sabahs от 17.11.17, 09:56:26
Исправленный скрипт на Компас V13, работать не будет.
Название: Re: Работа с текстом
Отправлено: Умка от 17.11.17, 10:27:15
нада пробовать...
Название: Re: Работа с текстом
Отправлено: Sabahs от 17.11.17, 10:31:24
Что пробовать?
Скрипт в итоге, выполняет функции из dll находящихся в папке Bin Компаса, чтобы исправить dll, их нужно пере компилировать.
Название: Re: Работа с текстом
Отправлено: martyns881 от 15.10.21, 08:14:05
Добрый день! кто-то может подсказать, каким образом внедрить средствами C# имеющийся текст в технические требования документа IKompasDocument2D?
ITechnicalDemand работает только на чтение. А как пользоваться ksOpenTechnicalDemand на C# не разобрался. И как привести IKompasDocument2D к типу ksDocument2D тоже не понятно.
Название: Re: Работа с текстом
Отправлено: Михаил88 от 15.10.21, 09:17:17
https://forum.ascon.ru/index.php?topic=35887.0