Как вытащить все записи из штампа

Автор Борис_С, 23.05.19, 17:55:47

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

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

Борис_С

Я написал процедуру, которая вытаскивает все записи из штампа.
Вот ее код:
void CCheckRefDlg::GetTextStamp()
{
ksDocument2DPtr doc = kompas->ActiveDocument2D();
ksStampPtr stamp(doc->GetStamp());
if (stamp && stamp->ksOpenStamp())
{
long numb;
//в цикле будем брать все существующие графы
ksDynamicArrayPtr arr(stamp->ksGetStampColumnText(&numb));
while (numb && arr)
{
ksDynamicArrayPtr arrpLineText(kompas->GetDynamicArray(TEXT_LINE_ARR));
ksTextLineParamPtr itemLineText(kompas->GetParamStruct(ko_TextLineParam));
if (!itemLineText)
return;
itemLineText->Init();

for (int i = 0, count = arr->ksGetArrayCount(); i < count; i++) {
arr->ksGetArrayItem(i, itemLineText);
ksDynamicArrayPtr arrpTextItem(itemLineText->GetTextItemArr());
ksTextItemParamPtr item(kompas->GetParamStruct(ko_TextItemParam));

if (!item || !arrpTextItem)
return;
item->Init();

for (int j = 0, count2 = arrpTextItem->ksGetArrayCount(); j < count2; j++)
{
arrpTextItem->ksGetArrayItem(j, item);
CString Text = (LPCTSTR)item->s
}
arrpTextItem->ksDeleteArray();  //очистим массив компонент
}
//очистим массив текстовых строк
arrpLineText->ksDeleteArray();

arr->ksDeleteArray();
arr = stamp->ksGetStampColumnText(&numb);
}
stamp->ksCloseStamp();
}
}


Код считывает все записи из штампа, но при выходе из Компас появляется сообщение "Сохранить изменения?"
Уважаемые знатоки, подскажите, пожалуйста, где этот код меняет содержимое документа?
И еще один вопрос. Мне нужно выделить штамп (еще лучше, отдельные записи штампа). Как это сделать?
С помощью каких объектов?

Управление сообщениями IApplication.HideMessage - скрывать/показывать сообщения.
Любое изменение документа, автоматически покажет сообщение об изменении.

Борис_С


DesignЯR

Цитироватьно при выходе из Компас появляется сообщение "Сохранить изменения?"
Возможно открывался документ более ранней версии чем установленный Компас. Возможно Компас воспринимает вход в Штамп как уже изменение в документе - Штамп очень загадочная штука. Есть такое наблюдение касательно штампа: Если вносить данные в ячейку при помощи IText, то после добавления каждой строки ITextLine необходимо вызывать IStamp.Update(), а если обновление штампа вызвать только после добавления всех строк - то в ячейке отобразится только последняя.
ЦитироватьМне нужно выделить штамп (еще лучше, отдельные записи штампа)
Просто вопрос не совсем понятен. Что значит -"выделить штамп?"
Нельзя просто так взять и выделить штамп. Можно  только прочитать и перезаписать(или добавить) содержимое ячеек. Вы конечно можете создать свой собственный класс, где будет массив массивов массивов(Cell.TextLine.TextItem). И туда все копировать, или полностью его очищать - или Для чего вообще его выделять?

pr0100

Цитата: Борис_С от 23.05.19, 17:55:47

И еще один вопрос. Мне нужно выделить штамп (еще лучше, отдельные записи штампа). Как это сделать?


Код для выделения (получения) отдельных записей штампа на Python3
Для выделения конкретных данных нужно менять индексы в строке
текст=штамп.Text(1) # Ячейка №1 наименование


from win32com.client import Dispatch
АПИ7 = Dispatch('KOMPAS.Application.7')
Документ_2D = АПИ7.ActiveDocument
Все_листы = Документ_2D.LayoutSheets
первый_лист = Все_листы.Item(0) # Оформление первого листа
штамп = первый_лист.Stamp
текст=штамп.Text(1).Str # Ячейка №1 наименование
print(текст)

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

Борис_С

Я пообщался с разработчиками Компаса. Ошибка, о которой я написал, действительно имеет место быть. Она появилась в последней версии Компаса, причем она касается не только штампа, но и тех.требований. Надеюсь разработчики исправят ее в ближайшее время.
Что касается того, зачем мне выделять штамп, дело в том, что мне нужно выловить в текущем документе Компаса все текстовые записи, в которых есть ссылки на нормативные документы. Эти записи я помещаю в таблицу. При перемещении по записям таблицы было бы удобно
для пользователей, чтобы выбранная запись подсвечивалась в документе Компаса. А далее пользователь решает, заменить ли ссылку на
новый нормативный документ или оставить без изменений.