Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2011, 00:42   #1
who i
Пользователь
 
Регистрация: 24.01.2011
Сообщений: 18
По умолчанию Чертежи в делфи

Вообщем у меня задача написать программу отображающую этапы построения чертежей (то бишь что за чем), столкнулся с такими трудностями:

1:при отрисовке в канвасе imagе"а или формы есть проблемы с отрисовкой в плане при изменении размера формы рисунок не изменяется, при перекрытии и или свертывании часть рисунка пропадает (возможно для паинта формы и не проблема, то когда допустим закрывается инпутбокс то отрисовка опять некорректна). сейчас отрисовую просто на паинтбоксе таймером но при больших обьемах чертежей и при не большой скорости таймера видны мелькания что тоже не нормально

2: мне нужно "чертить" не только одну шестерню или допустим болт а предложить пользователю выбрать из набора как закинуть все параметры построения (даже не то что бы параметры а обьекты(линии, елипсы и т.д.)) в файл (библиотеку) реально ли такое? укажите хотя бы куда копать!
who i вне форума Ответить с цитированием
Старый 11.02.2011, 10:30   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
сейчас отрисовую просто на паинтбоксе таймером
Процедуру рисования нужно пихать не в таймер, а в обработчик OnPaint. Тогда при перерисовке не будет глюков.
Я обычно рисую на Image (но не в OnPaint, а в OnResize родительского компонента). Image хранит нарисованное и можно один раз отрисовать и не париться при перекрытии или свертывании.
Цитата:
видны мелькания
Цитата:
DoubleBuffered := True;
Цитата:
2: мне нужно "чертить" не только одну шестерню или допустим болт а предложить пользователю выбрать из набора как закинуть все параметры построения (даже не то что бы параметры а обьекты(линии, елипсы и т.д.)) в файл (библиотеку) реально ли такое? укажите хотя бы куда копать!
Вообще методика такая:
1. Объявляем что-то типа этого
Код:
  TMyKoord = record
    X, Y: Real;
  end;

  TRegion = array of TMyKoord;

  TParam = record
    Width: Real;
    Color: TColor;
    LineType: TPenStyle;
  end;

  TMyGrafikElement = class;

  TGrafikElementArr = array of TMyGrafikElement;

  TMyChertezh = class;
2. Создаем класс чертежа
Код:
  TMyChertezh = class // Чертеж
  private
    FElements: TGrafikElementArr; // Массив графических элементов
    FCanvas: TCanvas; // Канва для рисования
    FZeroPoint: TMyKoord; // Привязка нулевой точки (смещение нулевой координаты чертежа от нуля канды)
    FScale: Real; // Масштаб чартежа

    function GetElement (Index: Integer): TMyGrafikElement;
    function GetCount: Integer;
  protected
    procedure PLine (APoint1, APoint2: TMyKoord; AParam: TParam); // Рисует на текущей канве линию
    procedure PCircle (APoint: TMyKoord; ARadius: Real; AParam: TParam); // ... окружность
    procedure PArc (APoint: TMyKoord; ARadius: Real; ABeginAngle, AEndAngle: Real; AParam: TParam); // ... дугу
    procedure PHatch (ARegion: TRegion; AStyle: TBrushStyle; AParam: TParam); // ... регион заливки
    procedure PText (APoint: TMyKoord; AText: String; AFont: TFont; AFactor: Real; AParam: TParam); // ... текст

    function GetPaintRegion (APaintRect: TRect): TRegion; // Регион рисования (элементы за его пределами не видны на чертеже)
  public
    procedure SetCanvas (ACanvas: TCanvas; AZeroPoint: TPoint; AScale: Real); // Устанавливает текущую канву
    procedure Paint (ARect: TRect); // РИСУЕТ

    procedure Move (Index: Integer; AOffset: TMyKoord); // Можно сместить элемент
    procedure Copy (Index: Integer; AOffset: TMyKoord); // Можно скопировать элемент

    property Element [Index: Integer]: TMyGrafikElement read GetElement; default;
  published
    property ElementCount: Integer read GetCount;
  end;

...

function TMyChertezh.GetPaintRegion (APaintRect: TRect): TRegion;
begin
  // НУ, КАК-ТО ТАК :)
  SetLength (Result, 4);
  Result [0].X := FZeroPoint.X - APaintRect.Left * FScale;
  Result [0].Y := FZeroPoint.Y - APaintRect.Top * FScale;
  Result [2].X := FZeroPoint.X - APaintRect.Right * FScale;
  Result [2].Y := FZeroPoint.Y - APaintRect.Bottom * FScale;
  Result [1].X := Result [2].X;
  Result [1].Y := Result [0].Y;
  Result [3].X := Result [0].X;
  Result [3].Y := Result [2].Y;
end;

procedure TMyChertezh.Paint (ARect: TRect);
var
  i: Integer;
  PaintRegion: TRegion;
begin
  PaintRegion := GetPaintRegion (ARect); // Устанавливаем область рисования

  with FCanvas do begin
    Brush.Color := clWhite;
    Brush.Style := bsSolid;
    FillRect (ARect); // Рисуем белое поле
    for i := 0 to ElementCount-1 do begin // Перибераем все элементы
      with FElements[i] do
        if RegionsAreIntersected (PaintRegion, OverallDimensions) then // Если элемент входит в область рисования
          FElements[i].Paint; // то рисуем элемент
    end;
  end;
end;

...
Sibedir вне форума Ответить с цитированием
Старый 11.02.2011, 10:31   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

3. Создаем абстрактный класс графического элемента
Код:
  TMyGrafikElement = class // Абстрактный графический элемент
  private
    FParam: TParam;
    FOwner: TMyChertezh;
    FPoints: array of TMyKoord; // Массив точек

    function GetOverallDimensions: TRegion; virtual; abstract;
  protected
    procedure Paint; virtual; abstract; // Рисует на родителе
    constructor Create (AOwner: TMyChertezh);

    property Owner: TMyChertezh read FOwner; // Чертеж-родитель
    property Param: TParam read FParam write FParam; // Разные параметры
    property OverallDimensions: TRegion read GetOverallDimensions; // Габариты
  public
  published
  end;
4. Создаем графические элементы (например прямоугольник)
Код:
  TMyRectangle = class (TMyGrafikElement) // Прямоугольник
  private
    function GetPoint1: TMyKoord;
    function GetPoint2: TMyKoord;

    procedure SetPoint1(const Value: TMyKoord);
    procedure SetPoint2(const Value: TMyKoord);

    function GetOverallDimensions: TRegion; override;
  protected
    procedure Paint; override;
  public
  published
    property Param;
    property Point1: TMyKoord read GetPoint1 write SetPoint1;
    property Point2: TMyKoord read GetPoint2 write SetPoint2;
  end;

...

function TMyRectangle.GetOverallDimensions: TRegion;
begin
  SetLength (Result, 4);
  Result [0].X := FPoints[0].X;
  Result [0].Y := FPoints[0].Y;

  Result [1].X := FPoints[1].X;
  Result [1].Y := FPoints[0].Y;

  Result [2].X := FPoints[1].X;
  Result [2].Y := FPoints[1].Y;

  Result [3].X := FPoints[0].X;
  Result [3].Y := FPoints[1].Y;
end;

procedure TMyRectangle.Paint;
var
  p: TMyKoord;
begin
  with FOwner do begin
    p.X := FPoints[1].X;
    p.Y := FPoints[0].Y;
    PLine (FPoints[0], p, FParam);
    PLine (p, FPoints[1], FParam);
    p.X := FPoints[0].X;
    p.Y := FPoints[1].Y;
    PLine (FPoints[1], p, FParam);
    PLine (p, FPoints[0], FParam);
  end;
end;

...
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как расположить таблицы и чертежи вертикально(формат книжный)? Kukus_Mukus Microsoft Office Word 1 14.10.2010 06:22
Чертежи в автокаде Lemo Фриланс 4 02.06.2010 06:37
принтер не печатает рамки и чертежи компаса lord1228 Microsoft Office Word 9 09.12.2009 18:38
Код игры на Паскале и на Делфи сильно отличается? Как переписать код с Паскаля в Делфи? Mclaren Помощь студентам 2 27.04.2009 22:37