Page 1 of 1

Проблемы с ShowRect()

Posted: 28 Nov 2011, 14:21
by andrey-k
Добрый день.
Создаю новый объект TsgCADImage, добавляю несколько примитивов. Затем пытаюсь установить размеры области рисования методом PaintBox->ShowRect(). Для одних значений ShowRect() работает нормально, для других - нет. Заметил, что некорректности в работе появляются, если размеры области, передаваемой ShowRect() превышают размеры PaintBox по ширине или высоте. Это ошибка в функции, или я ее неправильно использую? Каким методом лучше всего сделать видимой нужную часть рисунка? ShowPoint() не совсем подходит, так как размер области указывается через высоту и ширину.

Code: Select all

TsgDrawingNavigator *PaintBox;
TsgCADImage *CADImage;

void __fastcall TMainForm::BarBtn_FixViewClick(TObject *Sender)
{
   TsgCADImage *newImage;

   PaintBox = new TsgDrawingNavigator(this);
   PaintBox->Parent = Panel1;
   PaintBox->Align = alClient;

   newImage = new TsgCADImage();
   newImage->Converter->InitializeSections();
   newImage->CurrentLayout = newImage->Layouts[0];

   PaintBox->BeginUpdate();
   PaintBox->Picture->Graphic = newImage;
   CADImage = (TsgCADImage *)(PaintBox->Picture->Graphic);
   CreateLine(MakeFPoint(0, 0, 0), MakeFPoint(50, 50, 0));
   PaintBox->EndUpdate();
   CADImage->GetExtents();
   PaintBox->ShowRect(MakeFRect(-10, 100, 0, 100, -10, 0)); //нормально
   PaintBox->ShowRect(MakeFRect(-10, 2000, 0, 2000, -10, 0)); //некорректно

   delete newImage;
}
//---------------------------------------------------------------------------

TsgDXFLine *TMainForm::CreateLine(TFPoint StartPoint, TFPoint EndPoint)
{
   TsgDXFLine *NewLine;

   NewLine = new TsgDXFLine();
   NewLine->Point = StartPoint;
   NewLine->Point1 = EndPoint;
   NewLine->Color = clBlack;
   NewLine->LineWeight = 0.1;

   AddEntity(CADImage->Converter, csEntities, NewLine);
   return NewLine;
}
//---------------------------------------------------------------------------

void TMainForm::AddEntity(TsgDXFConverter *AConverter, TConvSection sect, TsgDXFEntity *AEntity)
{
  AConverter->Sections[sect]->AddEntity(AEntity);
  if (AConverter->OnCreate)
    AConverter->OnCreate(AEntity);
  AConverter->Loads(AEntity);
}
//---------------------------------------------------------------------------

Re: Проблемы с ShowRect()

Posted: 30 Nov 2011, 19:41
by support
Здравствуйте.
Аргументом функции ShowRect является прямоугольная область чертежа, но не объекта TsgDrawingNavigator. Текущая реализация функции позволяет вызывать ShowRect для отрисовки областей чертежа не превосходящих его размеры. Постараемся добавить в функцию возможность корректного выполнения для отрисовки больших областей.

Александр.

Re: Проблемы с ShowRect()

Posted: 01 Dec 2011, 13:10
by support
Функция ShowPoint может быть также использована для отображения требуемой области чертежа. Для этого выполните отрисовку чертежа по размерам, после чего пересчитайте масштабный коэффициент для отрисовки требуемой ширины или высоты, например:

Code: Select all

  Img.IsWithoutBorder := true;
  sgPaintBox.FitToSize();
  point := MakeFPoint((Img.PureExtents.Right-Img.PureExtents.Left)/2 + Img.PureExtents.Left, (Img.PureExtents.Top - Img.PureExtents.Bottom)/2 + Img.PureExtents.Bottom, 0);
  sgPaintBox.ShowPoint(point, sgPaintBox.Scale*(Img.PureExtents.Right - Img.PureExtents.Left)/требуемая_ширина);
Такой метод имеет небольшую погрешность, которая будет заметна при значении требуемой ширины (высоты) многократно большем соответствующего размера чертежа.

Александр.