Удалить текст из фрагмента и получить его размеры после удаления текста

Автор Igrek, 26.05.14, 19:17:13

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

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

Igrek

Всем здравствуйте, на форуме я новичок, так что просьба не кидаться)

Пишу процедуру, которая считывает фрагмент в группу, затем из фрагмента удаляются объекты типа текст. После этого получаю габариты фрагмента и вставляю его в чертеж со смещением по габаритному размеру (фрагменты как бы прилипают друг к другу). Но при выполнении процедуры получается, что габаритные размеры фрагмента получены до удаления текста из него, за счет чего между фрагментами образуется промежуток (во вложении, последний фрагмент представлен в исходном виде, с текстом).

Сама процедура:
procedure InsertFragment(angle:integer); // angle - угол поворота фрагмента
var
    phan: ksPhantom;
    type1: ksType1;
    frag: ksFragment;
    x,x1, y,y1: double;
    Gabarit: ksRectParam;
    par: ksPlacementParam;
    PointV,PointV1:ksMathPointParam;
    iter:ksIterator;
    refObj: reference;
begin
  phan := ksPhantom(Kompas.GetParamStruct(ko_Phantom));
  frag := ksFragment(document2d.GetFragment);
  par := ksPlacementParam(Kompas.GetParamStruct(ko_PlacementParam));
  par.Init;
  par.angle:=angle;
  phan.phantom := 1;
  type1 := ksType1(phan.GetPhantomParam);
  type1.xBase := 0;
  type1.yBase := 0;
  type1.angle := 0;
  type1.scale_ := 0;
  type1.gr := frag.ksReadFragmentToGroupEx(strg, false, par, true);

  if type1.gr = 0 then exit;
  phan.phantom := 1;
  Gabarit:=ksRectParam(Kompas.GetParamStruct(ko_RectParam));
  if type1.gr <> 0 then
  begin
          iter := ksIterator(Kompas.GetIterator);
      if iter.ksCreateIterator(TEXT_OBJ, 0) = FALSE then Exit;

      refObj := iter.ksMoveIterator('F');
      while document2d.ksExistObj(refObj)<>0 do
      begin
        document2d.ksLightObj(refObj, 1 );
        document2d.ksDeleteObj(refObj);
        refObj := iter.ksMoveIterator('N');
      end;

      Document2d.ksGetObjGabaritRect(type1.gr,Gabarit);
      if Document2d.ksGetObjGabaritRect(type1.gr,Gabarit)=1 Then
    begin
     PointV:=ksMathPointParam(Gabarit.GetpBot);
     x:=PointV.x;
     y:=PointV.y;
     PointV1:=ksMathPointParam(Gabarit.GetpTop);
     x1:=PointV1.x;
     y1:= PointV1.y;
    end;
    Document2D.ksMoveObj(type1.gr,l,10000);
    Document2D.ksStoreTmpGroup(type1.gr);
    l:=l+Round(Abs(x1-x))*100;
    h:=Round(abs(y1-y))*100;
  end;
     //Form3.Edit1.Text:=Form3.Edit1.Text+inttostr(l)+'+';
end;


Как можно получить габаритные размеры фрагмента после удаления текстовых объектов?



Igrek

Цитата: Sabahs от 26.05.14, 20:37:19
Сделать итератор по группе и удалять текст из группы ksExcludeObjGroup.

А можно поподробнее? итератор по группе, насколько я понял это: ksMoveAttrIterator. Сделал через него и ksExcludeObjGroup - габаритные размеры фрагмента все равно вычисляются с учетом текста. Может я что-то не так сделал?
Вот измененный кусок кода:
  gr:=type1.gr;

  iter := ksIterator(Kompas.GetIterator);
      if iter.ksCreateIterator(TEXT_OBJ, 0) = FALSE then Exit;

      refObj := iter.ksMoveAttrIterator('F',gr);
      while document2d.ksExistGroupObj(refObj)<>0 do
      begin
        document2d.ksLightObj(refObj, 1 );
        document2d.ksExcludeObjGroup(gr,refObj);
        refObj := iter.ksMoveIterator('N');
      end;

Итератор по группе iter.ksCreateIterator(TEXT_OBJ, 0), где вместо нуля, указатель на группу.
+ Благодарностей: 1