Тема: Как заморозить/разморозить слой из Delphi?

и как получить список всех слоев из чертежа.
СПАСИБО

Re: Как заморозить/разморозить слой из Delphi?

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, AutoCAD_TLB, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
var
  Acad : AcadApplication;
  Document : AcadDocument;
  ALayer : IAcadLayer;
procedure TForm1.Button1Click(Sender: TObject);
var k : integer;
begin
    Acad := CoAcadApplication.Create;
    Acad.Visible := true;
    Document := Acad.Get_ActiveDocument;
    Document.Activate;
    Document.Layers.Add('1 Первый');
    Document.Layers.Add('2 Второй');
    Document.Layers.Add('3 Третий');
    Memo1.Lines.Clear;
    for k := 0 to Document.Layers.Count-1 do
    begin
      ALayer := Document.Layers.Item(k);
      if ALayer.Name = '2 Второй' then
      ALayer.Freeze := true; // заморозить слой
      Memo1.Lines.Add(ALayer.Name ); //список имен слоев
    end;
    Acad.ZoomAll;
    Acad.WindowState := acMax;
    Acad.ActiveDocument.Activate;
end;

Re: Как заморозить/разморозить слой из Delphi?

Acad := CoAcadApplication.Create;

это создает новый экземпляр/чертеж.
а как присоединиться к существующему чертежу...?

Re: Как заморозить/разморозить слой из Delphi?

Докопался сам:

var
AcadDocument1 : AcadDocument;
ALayer : IAcadLayer;
k : integer;
v : OleVariant;
begin
v := GetActiveOleObject('AutoCAD.Application');
AcadDocument1.ConnectTo((IDispatch(v) as IAcadApplication).ActiveDocument);
Caption := AcadDocument1.FullName;
for k := 0 to AcadDocument1.Layers.Count - 1 do
  begin
  ListBox1.Items.Add(AcadDocument1.Layers.Item(k).Name);
  ALayer := AcadDocument1.Layers.Item(k);
  if Alayer.Name = 'Ceiling' then
    ALayer.Freeze := true;
  end;
end;

Re: Как заморозить/разморозить слой из Delphi?

А можно и для любого из последних AutoCADов используя позднее связывание применить ComObj вместо AutoCAD_TLB. Тогда это будет выглядеть так:

unit Unit1;
interface
uses
  Windows, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, ExtCtrls
  ComObj;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
var
  Acad,
  Document,
  ALayer : OLEVariant;
procedure TForm1.Button1Click(Sender: TObject);
var k : integer;
begin
//создаем документ
    Acad := CreateOleObject('Autocad.Application');
//или подключаемся к открытому
//  Acad := GetActiveOleObject('AutoCAD.Application');
    Acad.Visible := true;
    Document := Acad.ActiveDocument;
    Document.Activate;
    Document.Layers.Add('1 Первый');
    Document.Layers.Add('2 Второй');
    Document.Layers.Add('3 Третий');
    Memo1.Lines.Clear;
    for k := 0 to Document.Layers.Count-1 do
    begin
      ALayer := Document.Layers.Item(k);
      if ALayer.Name = '2 Второй' then ALayer.Freeze := true;
      Memo1.Lines.Add(ALayer.Name );
    end;
    Acad.ZoomAll;
    Acad.WindowState := 3;
    Acad.ActiveDocument.Activate;
end;
end.

Re: Как заморозить/разморозить слой из Delphi?

> Нежельский Виктор
огромное спасибо за помощь.

Re: Как заморозить/разморозить слой из Delphi?

Хочу заострить внимание на следующем моменте:
GetActiveOleObject - может возвратить не тот объект, что нужен. Например запущено 2 приложения AutoCAD, т.е. фактически 2 экземпляра ОЛЕ-объекта. К которому из них подключится программа? К тому который первым запущен.
А если возникла ситуация, что нужно к какому-то конкретному - как быть?

Re: Как заморозить/разморозить слой из Delphi?

На сколько я понимаю, надо получить ссылку на интерфейс IRunningObjectTable (метод GetRunningObjectTable()), перебрать объекты таблицы, сравнивая их с идентификатором AutoCad а дальше уже разбираться, какой из экземпляров вам нужен.