Работа со слоями
-
- Posts: 15
- Joined: 27 Aug 2012, 20:00
Работа со слоями
Пытаюсь получить имена всех слоёв таким образом:
procedure TForm1.EnumLayersCheck;
var
I: Integer;
vLayer: TsgDXFLayer;
begin
Img := TsgDXFImage(DNavigator.Picture.Graphic);
DNavigator.Picture.Graphic := Img;
DNavigator.Align := alClient;
Img.Converter.Params := @FCADParams;
//кол-во слоёв
CountLayer:=Img.Converter.Sections[csLayers].Count;
ShowMessage(IntToStr(CountLayer));
//
begin
for I := 0 to Img.Converter.Sections[csLayers].Count - 1 do
begin
vLayer := TsgDXFLayer(Img.Converter.Sections[csLayers].Entities);
ShowMessage('Имя слоя- '+vLayer.EntName);
end;
end;
//
end;
//
Перечисляет их (слои) корректно (но если вызвать процедуру ещё раз после отрисовки объекта, то покажет наличие одного слоя) Далее например рисую объект Circle, затем хочу отключить слой:
procedure TForm1.Button1Click(Sender: TObject);
Var
I,NumLay:Integer;
vLayer: TsgDXFLayer;
begin
//
Img := TsgDXFImage(DNavigator.Picture.Graphic);
DNavigator.Picture.Graphic := Img;
DNavigator.Align := alClient;
Img.Converter.Params := @FCADParams;
//кол-во слоёв
I:=Img.Converter.Sections[csLayers].Count;
ShowMessage(IntToStr(I));//
//
for I := 0 to Img.Converter.Sections[csLayers].Count - 1 do
begin
vLayer := TsgDXFLayer(Img.Converter.Sections[csLayers].Entities);
end;
Img.Converter.Layers[2].Visible:=False;
end;
//
Количество слоёв показывает 1, хотя их больше и выдаёт ошибку:
"List index out of bounds (1)",
Как правильно получить доступ к слоям, перечислить их, и включить отключить нужный слой?
С Уважением Иван.
procedure TForm1.EnumLayersCheck;
var
I: Integer;
vLayer: TsgDXFLayer;
begin
Img := TsgDXFImage(DNavigator.Picture.Graphic);
DNavigator.Picture.Graphic := Img;
DNavigator.Align := alClient;
Img.Converter.Params := @FCADParams;
//кол-во слоёв
CountLayer:=Img.Converter.Sections[csLayers].Count;
ShowMessage(IntToStr(CountLayer));
//
begin
for I := 0 to Img.Converter.Sections[csLayers].Count - 1 do
begin
vLayer := TsgDXFLayer(Img.Converter.Sections[csLayers].Entities);
ShowMessage('Имя слоя- '+vLayer.EntName);
end;
end;
//
end;
//
Перечисляет их (слои) корректно (но если вызвать процедуру ещё раз после отрисовки объекта, то покажет наличие одного слоя) Далее например рисую объект Circle, затем хочу отключить слой:
procedure TForm1.Button1Click(Sender: TObject);
Var
I,NumLay:Integer;
vLayer: TsgDXFLayer;
begin
//
Img := TsgDXFImage(DNavigator.Picture.Graphic);
DNavigator.Picture.Graphic := Img;
DNavigator.Align := alClient;
Img.Converter.Params := @FCADParams;
//кол-во слоёв
I:=Img.Converter.Sections[csLayers].Count;
ShowMessage(IntToStr(I));//
//
for I := 0 to Img.Converter.Sections[csLayers].Count - 1 do
begin
vLayer := TsgDXFLayer(Img.Converter.Sections[csLayers].Entities);
end;
Img.Converter.Layers[2].Visible:=False;
end;
//
Количество слоёв показывает 1, хотя их больше и выдаёт ошибку:
"List index out of bounds (1)",
Как правильно получить доступ к слоям, перечислить их, и включить отключить нужный слой?
С Уважением Иван.
Re: Работа со слоями
Здравствуйте.
Вот несколько замечаний по вашему коду.Вторая строка может являться источником ошибок. Кроме того она не несёт никакого смысла. Рекомендуем использовать Img как свойство (пример в демо проекте Viewer).
Подобный код может применяться при использовании функции Iterate, которая у вас не задействована. Свойства конвертера заполняются при импорте изображения либо при инициализации созданного изображения.
Пожалуйста используйте Img := TsgCADImage(DNavigator.Picture.Graphic);
Александр.
Вот несколько замечаний по вашему коду.
Code: Select all
Img := TsgDXFImage(DNavigator.Picture.Graphic);
DNavigator.Picture.Graphic := Img;
Code: Select all
Img.Converter.Params := @FCADParams;
Code: Select all
Img := TsgDXFImage(DNavigator.Picture.Graphic);
Вероятно под отрисовкой объекта подразумевается создание и добавление примитива с последующей отрисовкой чертежа? В таком случае приведите используемый код.но если вызвать процедуру ещё раз после отрисовки объекта, то покажет наличие одного слоя
Александр.
Technical Support E-mail: support@cadsofttools.com
Chat support on Skype: cadsofttools.support
Chat support on Skype: cadsofttools.support
-
- Posts: 15
- Joined: 27 Aug 2012, 20:00
Re: Работа со слоями
procedure TForm1.Button2Click(Column: TColumn);
Var
X,Y,Scale:String;
//Переход к объекту
SearchPoint: TFPoint;
vScale: Double;
begin
//Переход к объекту
TryConvert(Edit1, SearchPoint.X);
TryConvert(Edit2, SearchPoint.Y);
TryConvert(Edit3, SearchPoint.Z);
TryConvert(Edit4, vScale);
DNavigator.ShowPoint(SearchPoint, vScale / 2000);
DrawCircle;// процедура создания и отрисовки Circle
end;
Сама процедура создания и отрисовки объекта Circle:
..
procedure TForm1.DrawCircle;
Var
circle: TsgDXFCircle;
Point:TFPoint;
begin
Point.X:=ConvToFloatDef(Edit1.Text,0.0);
Point.Y:=ConvToFloatDef(Edit2.Text,0.0);
Point.Z:=ConvToFloatDef(Edit3.Text,0.0);
Img:=TsgCADImage(DNavigator.Picture.Graphic);
Img.Create;
circle := TsgDXFCircle.Create;
circle.Radius := 2;
circle.Point := MakeFPoint(Point.X,Point.Y,Point.Z);
circle.Color := clRed;
circle.SetLWeight(700);
if Assigned(Img.Converter.OnCreate) then
Img.Converter.OnCreate(circle);
Img.Converter.Loads(circle);
Img.CurrentLayout.AddEntity(circle);
FLastAdded := circle;
Img.RefreshCurrentLayout;
Img.GetExtents;
end;
//
После этих операций, у нас возникает проблема (описанная выше) получения количества слоёв, доступа к слоям и операций с ними.
Иван.
Var
X,Y,Scale:String;
//Переход к объекту
SearchPoint: TFPoint;
vScale: Double;
begin
//Переход к объекту
TryConvert(Edit1, SearchPoint.X);
TryConvert(Edit2, SearchPoint.Y);
TryConvert(Edit3, SearchPoint.Z);
TryConvert(Edit4, vScale);
DNavigator.ShowPoint(SearchPoint, vScale / 2000);
DrawCircle;// процедура создания и отрисовки Circle
end;
Сама процедура создания и отрисовки объекта Circle:
..
procedure TForm1.DrawCircle;
Var
circle: TsgDXFCircle;
Point:TFPoint;
begin
Point.X:=ConvToFloatDef(Edit1.Text,0.0);
Point.Y:=ConvToFloatDef(Edit2.Text,0.0);
Point.Z:=ConvToFloatDef(Edit3.Text,0.0);
Img:=TsgCADImage(DNavigator.Picture.Graphic);
Img.Create;
circle := TsgDXFCircle.Create;
circle.Radius := 2;
circle.Point := MakeFPoint(Point.X,Point.Y,Point.Z);
circle.Color := clRed;
circle.SetLWeight(700);
if Assigned(Img.Converter.OnCreate) then
Img.Converter.OnCreate(circle);
Img.Converter.Loads(circle);
Img.CurrentLayout.AddEntity(circle);
FLastAdded := circle;
Img.RefreshCurrentLayout;
Img.GetExtents;
end;
//
После этих операций, у нас возникает проблема (описанная выше) получения количества слоёв, доступа к слоям и операций с ними.
Иван.
Re: Работа со слоями
Следующий код некорректен:
Вначале вы обращаетесь к существующему объекту TsgCADImage, затем создаёте новый. Соответственно на новый чертёж происходит добавление примитива и этот новый чертёж отрисовывается. В его составе есть только один слой.
CAD Import VCL не выполняет отрисовку отдельного примитива, а отрисовку всего листа чертежа.
Александр.
Code: Select all
Img:=TsgCADImage(DNavigator.Picture.Graphic);
Img.Create;
CAD Import VCL не выполняет отрисовку отдельного примитива, а отрисовку всего листа чертежа.
Александр.
Technical Support E-mail: support@cadsofttools.com
Chat support on Skype: cadsofttools.support
Chat support on Skype: cadsofttools.support