Как не затирать информацию

Автор Борис_С, 05.10.18, 11:51:13

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

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

Борис_С

Всем доброго дня!
Такой вопрос. Мне нужно напечатать текст в документе так, чтобы он не затирал все, что находится под ним.

ТрындецЪ

05.10.18, 11:52:53 #1 Последнее редактирование: 05.10.18, 12:04:06 от ТрындецЪ
Сервис/Параметры ...

Upd: Опять не заметил, что раздел "Программирование..."
ksOverlapObjectOptions и ksExecuteKompasCommand  35738

VIO

Вопрос не понятен,
Текст где в чертеже или в kdw.
Приложите фрагмент с которым можно работать и понять, то о чем Вы говорите.

Борис_С

Текст в чертеже.
Печатаю текст через процедуру:

var
    Doc: ksDocument2D;
    par: ksParagraphParam;
    itemParam: ksTextItemParam;
    itemFont: ksTextItemFont;

procedure TForm1.DrawText(Text: string; CurX, CurY, FontSize: Double; bBold: Boolean);
begin
  par.Init;
  with par do
  begin
    x := CurX; // левая верхняя точка
    y := CurY;
    height := FontSize; // высота
    width := 5; // ширина
  end;
  Doc.ksParagraph(par); // создаю абзац

  itemParam.Init;
  ItemParam.s := Text;

  itemFont.Init;
  with itemFont DO
  begin
    SetBitVectorValue(NEW_LINE, true);  // c новой строчки
    FontName:='Arial';  // наименование шрифта
    if bBold then
      SetBitVectorValue(BOLD_ON, true);
    SetBitVectorValue(ITALIC_OFF, true);
    Height := FontSize; // высота текста в мм
    ksu := 1;
  end;
  Doc.ksTextLine(itemParam); // выводим текст
  Doc.ksEndObj;
end;

KrissKross

Скорее всего имеется ввиду не у всех объектов чертежа
на что ответил ТрындецЪ
а для конкретного экземпляра, то надо:
1. Создать текст
2. Выделить его
3. Применить команду
из справки API
ЦитироватьКоманды селектирования объектов и работы с селектированными объектами
ksCMObjStreamline   35738 Очистить фон у объекта

Борис_С


ksSetDocOptions
OVERLAP_OBJECT_OPTIONS -  Настройки пе­рекрывающих­ся объектов.
+ Благодарностей: 1

Vitalij Lysanov


Если без  .Init;, будет продолжать существующий текст.

Это вроде как обнуление ячейки.

Борис_С

А как выполнить команду ksCMObjStreamline?

ksExecuteKompasCommand - Выполнить команду системы КОМПАС.

Борис_С

Вариант ksSetDocOptions сработал.
Вариант через выделение объекта пока нет.
Где я не прав?


kompas:=KompasObject(GetActiveOleObject('Kompas.Application.5'));
Kompas7:=Kompas.ksGetApplication7 as IApplication;
komDoc := Kompas7.ActiveDocument;
komDoc2D := IKompasDocument2D(komDoc);
komDoc2D1 := IKompasDocument2D1(komDoc2D);
komDoc2D1.SelectionManager.Select(TextRef);  // здесь программа вылетает
kompas.ksExecuteKompasCommand(ksCMObjStreamline, false);

Вы справку читали?
Правильно вылетает.

Борис_С

Вроде я все делаю по справке. Использую синтаксис Automation.
TextRef - ссылка на созданный текст.

Это я понял, тут нужно передавать интерфейс или вариантный массив интерфейсов IDispatch.

Борис_С

Совсем туплю. А как получить этот интерфейс?

pDrawingObject:=IUnknown(ksTransferReference(TextRef,ksGetCurrentDocument(0))) as IDrawingObject;

Борис_С

Не получается. Для компиляции этого оператора нужно добавить модуль LibTool. Он, в свою очередь, требует kAPI2D5.dll
При запуске приложения получаю сообщение "Запуск программы невозможен, т.к. на компьютере отсутствует kAPI2D5.dll."
После копирования этого файла в папку, где находится приложение, получаю сообщение "Ошибка при запуске приложения
(0xc000007b)."
Возможно это связано с тем, что приложение собрано на Delphi7, а Компас - 64 битный.

Это связано с тем, что в LibTool сидит API экспортных функций.
Все эти dll находятся в папке bin Компас-3D.
Разрядность тоже влияет, т.к. у Вас приложение 32-разрядное, а dll 64-разрядные.

Борис_С

Можно как-то обойти это, не меняя разрядность приложений?

Из приложения использовать данные функции не стоит.
Dll на Delphi7 для 64-разрядного Компаса не сделаете.
Я ушёл на Delphi 10.2, т.к. 32-разрядные приложения мне неинтересны.
+ Благодарностей: 1