Работа со слоями

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

Работа со слоями

Post by ivantambov » 26 Nov 2012, 22:16

Пытаюсь получить имена всех слоёв таким образом:
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)",
Как правильно получить доступ к слоям, перечислить их, и включить отключить нужный слой?
С Уважением Иван.

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

Re: Работа со слоями

Post by support » 27 Nov 2012, 13:36

Здравствуйте.
Вот несколько замечаний по вашему коду.

Code: Select all

Img := TsgDXFImage(DNavigator.Picture.Graphic);
DNavigator.Picture.Graphic := Img;
Вторая строка может являться источником ошибок. Кроме того она не несёт никакого смысла. Рекомендуем использовать Img как свойство (пример в демо проекте Viewer).

Code: Select all

Img.Converter.Params := @FCADParams;
Подобный код может применяться при использовании функции Iterate, которая у вас не задействована. Свойства конвертера заполняются при импорте изображения либо при инициализации созданного изображения.

Code: Select all

Img := TsgDXFImage(DNavigator.Picture.Graphic);
Пожалуйста используйте Img := TsgCADImage(DNavigator.Picture.Graphic);
но если вызвать процедуру ещё раз после отрисовки объекта, то покажет наличие одного слоя
Вероятно под отрисовкой объекта подразумевается создание и добавление примитива с последующей отрисовкой чертежа? В таком случае приведите используемый код.

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

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

Re: Работа со слоями

Post by ivantambov » 27 Nov 2012, 14:54

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;
//
После этих операций, у нас возникает проблема (описанная выше) получения количества слоёв, доступа к слоям и операций с ними.
Иван.

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

Re: Работа со слоями

Post by support » 27 Nov 2012, 15:19

Следующий код некорректен:

Code: Select all

Img:=TsgCADImage(DNavigator.Picture.Graphic);
Img.Create;
Вначале вы обращаетесь к существующему объекту TsgCADImage, затем создаёте новый. Соответственно на новый чертёж происходит добавление примитива и этот новый чертёж отрисовывается. В его составе есть только один слой.
CAD Import VCL не выполняет отрисовку отдельного примитива, а отрисовку всего листа чертежа.

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

Post Reply