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

Обсуждение вопросов импорта поддерживаемых форматов
Post Reply
andrey-k
Posts: 8
Joined: 27 Sep 2011, 00:36

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

Post by andrey-k » 28 Nov 2011, 14:21

Добрый день.
Создаю новый объект 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);
}
//---------------------------------------------------------------------------

support
Posts: 3253
Joined: 30 Mar 2005, 11:36
Contact:

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

Post by support » 30 Nov 2011, 19:41

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

Александр.
Technical Support E-mail: support@cadsofttools.com
Chat support on Skype: cadsofttools.support

support
Posts: 3253
Joined: 30 Mar 2005, 11:36
Contact:

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

Post by support » 01 Dec 2011, 13:10

Функция 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)/требуемая_ширина);
Такой метод имеет небольшую погрешность, которая будет заметна при значении требуемой ширины (высоты) многократно большем соответствующего размера чертежа.

Александр.
Technical Support E-mail: support@cadsofttools.com
Chat support on Skype: cadsofttools.support

Post Reply