Create Polyline

Discuss and ask questions about CAD VCL (Delphi and C++ Builder).

Moderators: SDS, support, admin

Post Reply
Alexey
Posts: 1
Joined: 13 Aug 2006, 11:49
Location: Russia

Create Polyline

Post by Alexey » 13 Aug 2006, 11:59

Подскажите пожалуйста, каким образом можно построить полилинию по
координатам в SgImage, пожалуйста приведите пример.
С Уважением Алексей.

off

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

Post by support » 14 Aug 2006, 16:50

Здравствуйте, Алексей!

<b>Russian</b>:
<b>TsgImage</b> - является контейнером графических объектов, в частности объекта типа <b>TsgDXFImage</b>.
<b>TsgDXFImage</b> - класс, осуществляющий загрузку файлов типа <b>DXF</b>, хранение <b>DXF</b> примитивов (в частности <b>Polyline</b>), а также отрисовку примитивов.
Для того, чтобы нарисовать <b>polyline</b>, требуется добавить примитив <b>Polyline</b> в <b>TsgDXFImage</b>, причем координаты точек должны быть заданы в системе координат чертежа.
<b>TsgImage</b> знает о текущем размере графического объекта, поэтому может вычислить относительную позицию мыши на этом графическом объекте (процедура <b>GetPointToImageSizeRatio</b>). После этого <b>TsgDXFImage</b> может вычислить точки полилинии в системе координат чертежа (функция <b>GetCADCoords</b>). Далее создаем объект типа <b>TsgDXFPolyline</b>, точками у него являются объекты типа <b>TsgDXFVertex</b>. После добавления точек выбирается <b>Layer</b> для данного полилайна, и затем полилиния вставляется в <b>TsgDXFConverter</b>.
Код после английской версии ответа показывает как это можно сделать.

<b>English</b>:

<b>TsgImage</b> - is the container of graphic objects, such as <b>TsgDXFImage</b>.
<b>TsgDXFImage</b> - a class which is responsible for loading files of <b>DXF</b> type, storing <b>DXF</b> entities (such as <b>Polyline</b>), and also drawing the entities.
When you need to draw a polyline you have to add a <b>Polyline</b> entity into <b>TsgDXFImage</b>, and coordinates of points should be set in the coordinate system of the drawing.
<b>TsgImage</b> knows about the current size of graphic object, therefore it can calculate a relative position of the mouse on this graphic object (procedure <b>GetPointToImageSizeRatio</b>). After that <b>TsgDXFImage</b> can calculate points of a polyline in the drawing's coordinate system (function <b>GetCADCoords</b>). Further we create object such as <b>TsgDXFPolyline</b> whose points are <b>TsgDXFVertex</b> objects. After adding points a <b>Layer</b> has to be selected for the <b>Polyline</b>. Then a <b>Polyline</b> is inserted into <b>TsgDXFConverter</b>.

Use the following code:

Code: Select all

<b>procedure</b> TForm1.Forum306Click(Sender: TObject);
<b>var</b>
  Img: TsgDXFImage;
  Polyline: TsgDXFPolyline;

  <b>procedure</b> AddToPolyline(X, Y: Integer);
  <b>var</b>
    Pt: TFPoint;
    Vert: TsgDXFVertex;
    XScaled, YScaled: Extended;
  <b>begin</b>
    Pt := MakeFPoint(X, Y, 0);
    sgImage1.GetPointToImageSizeRatio(Pt, XScaled, YScaled);
    Vert := TsgDXFVertex.Create;
    Vert.Point := Img.GetCADCoords(XScaled, YScaled);
    Polyline.AddEntity(Vert);
  <b>end</b>;

<b>begin
  if not</b> OpenDialog1.Execute <b>then</b> Exit;

  sgImage1.LoadFromFile(OpenDialog1.FileName);
  <b>if not</b>(sgImage1.Picture.Graphic <b>is</b> TsgDXFImage) <b>then</b> Exit;
  Img := TsgDXFImage(sgImage1.Picture.Graphic);
  Polyline := TsgDXFPolyline.Create;
  AddToPolyline(10, 40);
  AddToPolyline(300, 150);
  AddToPolyline(220, 260);
  AddToPolyline(15, 300);
  AddToPolyline(100, 180);
  Polyline.Layer := Img.Converter.Layers[0];
  Img.Converter.OnCreate(Polyline);
  Img.Converter.Loads(Polyline);
  Img.Converter.Sections[csEntities].AddEntity(Polyline);
  sgImage1.Invalidate;
<b>end</b>;
Sergey.

please post questions to the forum or write to support@cadsofttools.com

Post Reply