CadImportVCL coordinates

Обсуждение вопросов импорта поддерживаемых форматов
ivantambov
Posts: 15
Joined: 27 Aug 2012, 20:00

CadImportVCL coordinates

Post by ivantambov » 27 Aug 2012, 20:29

Здравствуйте!
Компонент CadImportVCL для Delphi7.
Вопрос:
1. Координаты файла dxf из Autocad 2004 открытые в SgImage совпадают?
2. Используя событие MouseMove (или кликнув в определённую точку) могу ли я получить координаты (допустим в Caption формы), и если да то как?
3. Как по введённым координатам (в edit) сдвинуть (переместить в SgImage) чертёж в необходимую точку с масштабированием?
4. Возможна ли отрисовка квадрата, круга.
Приведите пожалуйста примеры.
С Уважением Иван.

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

Re: CadImportVCL coordinates

Post by support » 28 Aug 2012, 13:02

Здравствуйте Иван.
Пожалуйста уточните какую версию библиотеки вы используете. Последняя релиз версия 8.1 не включает модуль sgImage. Вместо него рекомендуется использовать sgDrawingNavigator.
1. Импорт чертежа выполняется в мировой системе координат, заданной в файле.
2. Реализация получения координат чертежа из координат указателя мыши показана в демо проекте Viewer.
3. CAD Import VCL 8.1 позволяет выполнять отрисовку части чертежа с определённым масштабом используя функцию TsgDrawingNavigator.ShowPoint.
4. Возможно добавление примитивов (напр. круг, полилиния) на чертёж с последующей отрисовкой.

Code: Select all

  Img: TsgCADImage
  ...
  circle: TsgDXFCircle;
  ...
  circle := TsgDXFCircle.Create;
  circle.Radius := 30;
  circle.Point := MakeFPoint(110, 160, 0);
  circle.Color := clGreen;
  if Assigned(Img.Converter.OnCreate) then
    Img.Converter.OnCreate(circle);
  Img.Converter.Loads(circle);
  Img.CurrentLayout.AddEntity(circle);
Александр.
Technical Support E-mail: support@cadsofttools.com
Chat support on Skype: cadsofttools.support

ivantambov
Posts: 15
Joined: 27 Aug 2012, 20:00

Re: CadImportVCL coordinates

Post by ivantambov » 28 Aug 2012, 13:42

Спасибо за ответ.
Версия CAD Import VCL v5.25, код который я использовал для отрисовки:
procedure TForm1.Button3Click(Sender: TObject);
var
Result:TsgDXFPolyline;
X,Y,Z:Extended;
begin
X:=500;Y:=500;Z:=0;
Result:= TsgDXFCircle.Create;

TsgDXFCircle(Result).Radius := 100.0;

TsgDXFCircle(Result).Point := MakeFPoint(X,Y,Z);

{ TsgDXFCircle(Result).Point := MakeFPoint(ConvToFloatDef(St.Values['X'], // это из примера
0.0), ConvToFloatDef(St.Values['Y'], 0.0),
ConvToFloatDef(St.Values['Z'], 0.0));
}
Result.SetColor(clRed);
Result.SetLWeight(12);
end;
////////////
с координатами разобрался, объясните в примере Viewer'a в меню есть Show point (где необходимо ввести X,Y и масштаб), для чего она?
Также интересует штриховка.
Приведите пример circle, rectangle.
начиная с uses ))
С Уважением Иван.

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

Re: CadImportVCL coordinates

Post by support » 28 Aug 2012, 14:58

Опция меню Show point демонстрирует работу функции ShowPoint.
Версия CAD Import VCL 5.2.5 является устаревшей. Пожалуйста уточните есть ли у вас лицензия разработчика для работы с библиотекой. Если да, то сообщите нам номер вашего заказа или имя лица, являющегося владельцем лицензии.

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

ivantambov
Posts: 15
Joined: 27 Aug 2012, 20:00

Re: CadImportVCL coordinates

Post by ivantambov » 28 Aug 2012, 15:19

Лицензии нет, интересуют выше описанные функции, на .NET не пишем, использовать бесплатно не собираемся.
Функция show point не демонстрирует при внесении координат никаких действий.
Из множества компонентов в Интернете заинтересовал именно Ваш.
Продаёте ли Вы именно версию под Delphi 7 (VCL) и какова стоимость для юр. лица?
Имеется ли у Вас возможность тестирования демо компонента Cad import vcl (не exe) с ограничениями и если да, то вышлите на мой почтовый ящик.
Приведите всё же пример отрисовки circle.
С Уважением Иван.

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

Re: CadImportVCL coordinates

Post by support » 28 Aug 2012, 15:46

Как мы уже отмечали CAD Import VCL 5.2.5 является устаревшей. Высылаем на ваш почтовый ящик последнюю релиз версию для тестирования. Библиотека совместима с Delphi 7. Примеры создания примитивов аналогичны приведённому ранее коду, подробнее смотрите в демо проектах. Библиотека предусматривает полную перерисовку чертёжа, а не отдельных примитивов.

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

ivantambov
Posts: 15
Joined: 27 Aug 2012, 20:00

CadImportVCL coordinates

Post by ivantambov » 29 Aug 2012, 13:52

Здравствуйте, разобрались с загрузкой dxf, но при попытке перейти к точке пишет: 'This function don`t work for raster images'
вот код:
uses
Windows, Messages, SysUtils,ComObj,Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ExtDlgs, Math, XPMan, DBCtrls,
ComCtrls,sgConsts, sgFunction, sgDrawingNavigator,CADImage, DXFConv,
sgSelection,DXF;
..................
private

public

end;

var
Form1: TForm1;
sgPaintBox:TsgDrawingNavigator;
DNavigator:TsgDrawingNavigator;
Img: TsgCADImage;
implementation

{$R *.dfm}
procedure TForm1.FileOpen;
var
I: Integer;
begin
if not OpenDialog1.Execute then
Exit;
DNavigator.Picture.Graphic := nil;
DNavigator.BeginUpdate;
DNavigator.LoadFromFile(OpenDialog1.FileName);
DNavigator.Align := alClient;
DNavigator.FitToSize;
if DNavigator.Picture.Graphic is TsgCADImage then
begin
TsgCADImage(DNavigator.Picture.Graphic).SetMatrixMode(smEnabled);
if TsgCADImage(DNavigator.Picture.Graphic).SelectionMatrix = nil then
TsgCADImage(DNavigator.Picture.Graphic).SelectionMatrix := TsgSelectionMatrix.Create;
end;
try
finally
DNavigator.EndUpdate;
DNavigator.Update;
end;
// sbrMain.Panels[0].Text := OpenDialog.FileName;

end;


procedure TForm1.Button3Click(Sender: TObject);
begin
FileOpen;
end;

function TryConvert(AEdit: TEdit; var AValue: Double): Boolean;
var
vErr: Integer;
DS: Char;
begin
Result := True;
DS := SetDecimalSeparator('.');
try
Val(AEdit.Text, AValue, vErr);
finally
SetDecimalSeparator(DS);
end;
if vErr <> 0 then
begin
AEdit.SetFocus;
AEdit.SelectAll;
ShowMessage('Invalid floting point value.');
Result := False;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
SearchPoint: TFPoint;
vScale: Double;
vExt: TFRect;
begin
vScale:=50;
SearchPoint.X:=6157.9091;
SearchPoint.Y:=30409.9336;
SearchPoint.Z:=0;

if Img = nil then
ShowMessage('This function don`t work for raster images')
else
begin
vExt := Img.Extents;
if TryConvert(Edit1, SearchPoint.X) then
if TryConvert(Edit2, SearchPoint.Y) then
if TryConvert(Edit3, SearchPoint.Z) then
if TryConvert(Edit4, vScale) then
if (vExt.Left > SearchPoint.X) or (vExt.Right < SearchPoint.X) or
(vExt.Top < SearchPoint.Y) or (vExt.Bottom > SearchPoint.Y) then
ShowMessage('This point not in drawing extents.')
else
DNavigator.ShowPoint(SearchPoint, vScale / 100);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DNavigator := TsgDrawingNavigator.Create(Self);
DNavigator.Parent := Self;
DNavigator.AutoFocus := True;
DNavigator.RectZooming := True;
DNavigator.OnMouseMove := DNavigatorMouseMove;
end;

procedure TForm1.DNavigatorMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
vPt: TFPoint;
vUnits: string;
begin
vPt := DNavigator.GetDrawingCoords(X, Y, vUnits);
StatusBar1.Panels.Items[1].Text:= Format('%.3f; %.3f; %.3f', [vPt.X, vPt.Y, vPt.Z]);
if vUnits <> '' then
StatusBar1.Panels.Items[1].Text:= StatusBar1.Panels.Items[1].Text + ' (' + vUnits + ')';
end;

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

Re: CadImportVCL coordinates

Post by support » 30 Aug 2012, 16:31

Здравствуйте.
Функция ShowPoint предназначена для работы с векторными, а не с растровыми изображениями.
if Img = nil then
ShowMessage('This function don`t work for raster images')
else
begin
Из вашего кода не видно используется ли Img. Для какого загруженного формата вы вызываете функцию ShowPoint?

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

ivantambov
Posts: 15
Joined: 27 Aug 2012, 20:00

CadImportVCL coordinates

Post by ivantambov » 30 Aug 2012, 20:00

для формата dxf autocad 2004, и в приведённом выше коде по добавлению примитива circle выдаёт исключение:
я делаю так:
procedure TForm1.Button4Click(Sender: TObject);
Var
Img: TsgCADImage;
circle: TsgDXFCircle;
begin
circle := TsgDXFCircle.Create;
circle.Radius := 30;
circle.Point := MakeFPoint(110, 160, 0);
circle.Color := clGreen;
if Assigned(Img.Converter.OnCreate) then// исключение здесь
Img.Converter.OnCreate(circle);
Img.Converter.Loads(circle);
Img.CurrentLayout.AddEntity(circle);
end;
загружен dxf файл

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

Re: CadImportVCL coordinates

Post by support » 31 Aug 2012, 11:12

Здравствуйте.
Наш демо проект Viewer содержит следующий код:

Code: Select all

 TForm1 = class(TForm)
private
  FsgPaintBox: TsgDrawingNavigator;
  ...
public
  property sgPaintBox: TsgDrawingNavigator read FsgPaintBox;
  property Img: TsgCADImage read GetCADImage;
  ...

function TForm1.GetCADImage: TsgCADImage;
begin
  Result := nil;
  if (FsgPaintBox <> nil) and (FsgPaintBox.Picture.Graphic is TsgCADImage) then
    Result := TsgCADImage(FsgPaintBox.Picture.Graphic);
end;
Здесь Img - обращение к свойству Picture.Graphic объекта класса TsgDrawingNavigator. Судя по вашей ошибке это обращение вы не используете. Соответственно доступ к свойствам нулевого неинициализированного объекта Img будет всегда приводить к исключению.

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

ivantambov
Posts: 15
Joined: 27 Aug 2012, 20:00

Re: CadImportVCL coordinates

Post by ivantambov » 02 Sep 2012, 13:34

при компиляции пишет:[Error] Unit1.pas(58): Field or method identifier expected, на строку:
property Img: TsgCADImage read GetCADImage;
вот код полностью:
unit Unit1;

interface

uses
Windows, Messages, SysUtils,ComObj,Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ExtDlgs, Math, XPMan, DBCtrls,
ComCtrls,sgConsts, sgFunction, sgDrawingNavigator,CADImage, DXFConv,
sgSelection,DXF;


type
TForm1 = class(TForm)
XPManifest1: TXPManifest;
StatusBar1: TStatusBar;
GroupBox1: TGroupBox;
Splitter1: TSplitter;
Splitter2: TSplitter;
Splitter3: TSplitter;
Splitter4: TSplitter;
Splitter5: TSplitter;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button3: TButton;
Button4: TButton;
ScrollBox1: TScrollBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
procedure Button3Click(Sender: TObject);
procedure FileOpen;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FsgPaintBox: TsgDrawingNavigator;
public
property sgPaintBox: TsgDrawingNavigator read FsgPaintBox;
property Img: TsgCADImage read GetCADImage;//здесь выдаёт ошибку
end;

var
Form1: TForm1;
sgPaintBox:TsgDrawingNavigator;
DNavigator:TsgDrawingNavigator;
Img: TsgCADImage;
implementation

{$R *.dfm}
procedure TForm1.FileOpen;
var
I: Integer;
begin
if not OpenDialog1.Execute then
Exit;
DNavigator.Picture.Graphic := nil;
DNavigator.BeginUpdate;
DNavigator.LoadFromFile(OpenDialog1.FileName);
DNavigator.Align := alClient;
DNavigator.FitToSize;
if DNavigator.Picture.Graphic is TsgCADImage then
begin
TsgCADImage(DNavigator.Picture.Graphic).SetMatrixMode(smEnabled);
if TsgCADImage(DNavigator.Picture.Graphic).SelectionMatrix = nil then
TsgCADImage(DNavigator.Picture.Graphic).SelectionMatrix := TsgSelectionMatrix.Create;
end;
try
finally
DNavigator.EndUpdate;
DNavigator.Update;
end;

end;


procedure TForm1.Button3Click(Sender: TObject);
begin
FileOpen;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DNavigator := TsgDrawingNavigator.Create(Self);
DNavigator.Parent := ScrollBox1;
DNavigator.AutoFocus := True;
DNavigator.RectZooming := True;
DNavigator.Color:=clWhite;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
Img: TsgCADImage;
circle: TsgDXFCircle;
begin
circle := TsgDXFCircle.Create;
circle.Radius := 30;
circle.Point := MakeFPoint(110, 160, 0);
circle.Color := clGreen;
if Assigned(Img.Converter.OnCreate) then// исключение здесь
Img.Converter.OnCreate(circle);
Img.Converter.Loads(circle);
Img.CurrentLayout.AddEntity(circle);
end;

end.
поправьте пожалуйста в чём ошибка?

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

Re: CadImportVCL coordinates

Post by support » 03 Sep 2012, 10:36

Здравствуйте.
Добавьте объявление метода GetCADImage в классе TForm1 и определение метода. Пример в демо проекте Viewer.

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

ivantambov
Posts: 15
Joined: 27 Aug 2012, 20:00

Re: CadImportVCL coordinates

Post by ivantambov » 06 Sep 2012, 10:14

при компиляции ошибок нет, dxf 004 версии загружает при попытке отрисовки по-прежнему исключение:
unit Unit1;

interface

uses
Windows, Messages, SysUtils,ComObj,Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ExtDlgs, Math, XPMan, DBCtrls,
ComCtrls,sgConsts, sgFunction, sgDrawingNavigator,CADImage, DXFConv,
sgSelection,DXF;


type
TForm1 = class(TForm)
XPManifest1: TXPManifest;
StatusBar1: TStatusBar;
GroupBox1: TGroupBox;
Splitter1: TSplitter;
Splitter2: TSplitter;
Splitter3: TSplitter;
Splitter4: TSplitter;
Splitter5: TSplitter;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button3: TButton;
Button4: TButton;
ScrollBox1: TScrollBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
procedure Button3Click(Sender: TObject);
procedure FileOpen;
procedure FormCreate(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
FsgPaintBox:TsgDrawingNavigator;
protected
function GetCADImage: TsgCADImage;
public
property sgPaintBox: TsgDrawingNavigator read FsgPaintBox;
property Img: TsgCADImage read GetCADImage;
end;

var
Form1: TForm1;
sgPaintBox:TsgDrawingNavigator;
DNavigator:TsgDrawingNavigator;
Img: TsgCADImage;
implementation

{$R *.dfm}
type
TSGDrawingNavigatorAccess = class(TSGDrawingNavigator);

function TForm1.GetCADImage: TsgCADImage;
begin
Result := nil;
if (FsgPaintBox <> nil) and (FsgPaintBox.Picture.Graphic is TsgCADImage) then
Result := TsgCADImage(FsgPaintBox.Picture.Graphic);
end;

procedure TForm1.FileOpen;
var
I: Integer;
begin
if not OpenDialog1.Execute then
Exit;
DNavigator.Picture.Graphic := nil;
DNavigator.BeginUpdate;
DNavigator.LoadFromFile(OpenDialog1.FileName);
DNavigator.Align := alClient;
DNavigator.FitToSize;
if DNavigator.Picture.Graphic is TsgCADImage then
begin
TsgCADImage(DNavigator.Picture.Graphic).SetMatrixMode(smEnabled);
if TsgCADImage(DNavigator.Picture.Graphic).SelectionMatrix = nil then
TsgCADImage(DNavigator.Picture.Graphic).SelectionMatrix := TsgSelectionMatrix.Create;
end;
try
finally
DNavigator.EndUpdate;
DNavigator.Update;
end;

end;


procedure TForm1.Button3Click(Sender: TObject);
begin
FileOpen;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
DNavigator := TsgDrawingNavigator.Create(Self);
DNavigator.Parent := ScrollBox1;
DNavigator.AutoFocus := True;
DNavigator.RectZooming := True;
DNavigator.Color:=clWhite;
end;



procedure TForm1.Button4Click(Sender: TObject);
Var
Img: TsgCADImage;
circle: TsgDXFCircle;
begin
circle := TsgDXFCircle.Create;
circle.Radius := 30;
circle.Point := MakeFPoint(110, 160, 0);
circle.Color := clGreen;
if Assigned(Img.Converter.OnCreate) then// исключение здесь
Img.Converter.OnCreate(circle);
Img.Converter.Loads(circle);
Img.CurrentLayout.AddEntity(circle);
end;

end.
исправьте где неправильно.
И подскажите пожалуйста, как можно посмотреть всю русскую версию форума CadImportVCl, а не 7 имеющихся топиков.
С Уважением Иван.

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

Re: CadImportVCL coordinates

Post by support » 06 Sep 2012, 11:33

Здравствуйте.
В вашем примере используется 2 переменных типа TsgDrawingNavigator, плюс поле в классе TForm1. Для DNavigator выполняется инициализация и загрузка файла. Добавлять примитив вы пытаетесь на неинициализированный FsgPaintBox.Picture.Graphic, в результате исключение. Вообще использование переменных типа TsgDrawingNavigator не рекомендуем, также советуем избегать одинаковых имён чтобы не путаться. Если вам действительно необходимы 3 объекта TsgDrawingNavigator, постарайтесь использовать их корректно.
В настоящий момент 7 топиков это весь форум на русском. Большую часть вопросов мы получаем на английском форуме.

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

ivantambov
Posts: 15
Joined: 27 Aug 2012, 20:00

Re: CadImportVCL coordinates

Post by ivantambov » 06 Sep 2012, 13:29

Спасибо за ответ.
С созданием разобрались, но в примере addentities нет добавления прямоугольника, и возможно ли получение мировых координат чертежа по клику на TSGDrawingNavigator, как описать обработчик события?
Есть ли возможность определения попадания (по клику мыши) в определённую область чертежа (например внутрь прямоугольника или замкнутой полилинии, или circle) ?
С Уважением Иван.

Post Reply