Комментарии 11
Увы, ksGetTextLength даёт длину строки только с умолчательным шрифтом. Если шрифт/шрифты иной/иные, то работает некорректно.
Нужен минимальный тест, чтобы понять в чём проблема.
Какой тест? У этой функции только один параметр - это сам текст (ну ещё и стиль, но он здесь не при чём). Какой шрифт она при этом берёт? Естественно, умолчательный.
Тест - это ваша программа с этой функцией "ksGetTextLength", которая у вас не работает. Чтобы разработчики сразу могли проверить API на ваших данных. А то они скажут, что у них всё работает, а с тестом так просто отмазаться не получится))
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, ksTLB, LibTool, LIBdb, LDefin2D, LDefin3D, ksConstTLB,
Vcl.StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure PrepareKompas;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
var kompas:KompasObject;
Model: ksDocument3D;
Part: ksPart;
PlaneXY, Sketch: ksEntity;
SketchDefinition: ksSketchDefinition;
Document2D : ksDocument2D;
PlaneOffsetDefinition: ksPlaneOffsetDefinition;
procedure TForm2.PrepareKompas;
begin
Kompas:= KompasObject( CreateOleObject('Kompas.Application.5') );
Model:=ksDocument3D(kompas.Document3D());
Model.Create(FALSE,TRUE);
Part:=ksPart(Model.GetPart(pTop_Part));
end;
procedure TForm2.Button1Click(Sender: TObject);
var t1,t2:double;s:string;
begin
PrepareKompas;
PlaneXY:=ksEntity(Part.GetDefaultEntity(o3d_planeXOY));
Sketch:=ksEntity(Part.NewEntity(o3d_sketch));
SketchDefinition:=ksSketchDefinition(Sketch.GetDefinition());
SketchDefinition.SetPlane(PlaneXY);
Sketch.Create();
Document2D:=ksDocument2D(SketchDefinition.BeginEdit());
s:='^(Arial)A~';
t1:=Document2D.ksGetTextLength(s,1);
s:='^(Times New Roman)A~';
t2:=Document2D.ksGetTextLength(s,1);
Memo1.Lines.Add(FloatToStr(t1));
Memo1.Lines.Add(FloatToStr(t2));
SketchDefinition.EndEdit();
kompas.Visible:=True;
end;
end.

Пришлите ещё ссылку на архив с вашим проектом (можно в личку).
Ответили:
да, ksGetTextLength рассчитывает длину текста для умолчательных параметров.
Если нужно что-то другое, то нужно создавать полноценный текст и использовать ksGetTextLengthFromReference.
Если при этом в самом тексте есть переключение шрифта, оно игнорируется. При этом ksGetTextLengthFromReference нормально работает, но приходится потом удалять не нужные объекты.
Работа с API КОМПАС-3D → Урок 11 → Простые текстовые надписи