Тема: Как заморозить/разморозить слой из Delphi?
и как получить список всех слоев из чертежа.
СПАСИБО
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Delphi → Как заморозить/разморозить слой из Delphi?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
и как получить список всех слоев из чертежа.
СПАСИБО
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;
Acad := CoAcadApplication.Create;
это создает новый экземпляр/чертеж.
а как присоединиться к существующему чертежу...?
Докопался сам:
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;
А можно и для любого из последних 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.
> Нежельский Виктор
огромное спасибо за помощь.
Хочу заострить внимание на следующем моменте:
GetActiveOleObject - может возвратить не тот объект, что нужен. Например запущено 2 приложения AutoCAD, т.е. фактически 2 экземпляра ОЛЕ-объекта. К которому из них подключится программа? К тому который первым запущен.
А если возникла ситуация, что нужно к какому-то конкретному - как быть?
На сколько я понимаю, надо получить ссылку на интерфейс IRunningObjectTable (метод GetRunningObjectTable()), перебрать объекты таблицы, сравнивая их с идентификатором AutoCad а дальше уже разбираться, какой из экземпляров вам нужен.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → Delphi → Как заморозить/разморозить слой из Delphi?
Форум работает на PunBB, при поддержке Informer Technologies, Inc