Главная »Статьи »AutoCAD и Delphi » |
Корневой объект AutoCAD ActiveX Automation Object Model — объект Application. Все остальные объекты его наследники. На верхней ступени находятся объекты:
В объектной модели такие объекты как слой, текстовый или размерный стиль, документ и др. собраны в т.н. коллекции. Объекты Documents, MenuBar и MenuGroups также являются коллекциями. Все коллекции имеют следующие важнейшие свойства и методы:
Рассмотрим более подробно коллекции: |
||||||||||||
Открыть существующий документ: var Doc: OleVariant; begin Doc:= Acad.Documents.Open('clouds.dwg'); ShowMessage(Format('Открыт документ "%s"', [Doc.Name])); end; Создать новый документ: var Doc: OleVariant; begin Doc:= Acad.Documents.Add(''); ShowMessage(Format('Создан новый документ "%s"', [Doc.Name])); end; В качестве имени в метод Add можно указывать что угодно — AutoCAD создаст
новый документ с именем DrawingN.dwg, где N — порядковый номер в текущем
сеансе.
Получить список всех документов: procedure EnumAcadDocuments(Items: TStrings); var i, cnt: Integer; begin if not VarIsClear(Acad) then begin cnt:= Acad.Documents.Count; with Items do begin BeginUpdate; try Clear; for i:= 0 to cnt - 1 do Add(Acad.Documents.Item(i).Name); finally EndUpdate; end; end; end; end; Зачем нужна переменная cnt? Ведь можно было сделать и так: . . . for i:= 0 to Acad.Documents.Count - 1 do . . . Поскольку все операции с COM-объектами выполняются весьма неторопливо, такой подход привел бы к запросам количества документов в каждой итерации цикла. Поэтому введена дополнительная переменная cnt и количество документов в коллекции определяется за пределами цикла один раз. Получить текущий документ: var ActiveDoc: OleVariant; . . . ActiveDoc:= Acad.ActiveDocument; |
||||||||||||
Получить текущий слой активного документа: var ActiveLayer: OleVariant; . . . ActiveLayer:= Acad.ActiveDocument.ActiveLayer; Установить текущим указанный слой активного документа: procedure SetActiveLayer(AName: String); var AcadDocument, Layer: OleVariant; ActiveLayerName: String; i, LayersCount: Integer; begin if not VarIsClear(Acad) then begin AcadDocument:= Acad.ActiveDocument; ActiveLayerName:= AcadDocument.ActiveLayer.Name; if AnsiCompareText(AName, ActiveLayerName) = 0 then Exit; LayersCount:= AcadDocument.Layers.Count; for i:= 0 to LayersCount - 1 do begin Layer:= AcadDocument.Layers.Item(i); if AnsiCompareText(Layer.Name, AName) = 0 then Break; end; AcadDocument.ActiveLayer:= Layer; end; end; Получить список всех слоев активного документа: type TLayerState = (lsLayerOn, lsFreeze, lsLock, lsPlottable); TLayerStates = set of TLayerState; function EnumAutoCADLayers(Items: TStrings): Integer; var AcadDocument, Layer: OleVariant; ActiveLayerName, LayerName: String; i, LayersCount, Tmp: Integer; States: TLayerStates; begin Result:= -1; if not VarIsClear(Acad) then begin AcadDocument:= Acad.ActiveDocument; with Items do begin BeginUpdate; try Clear; ActiveLayerName:= AcadDocument.ActiveLayer.Name; LayersCount:= AcadDocument.Layers.Count; for i:= 0 to LayersCount - 1 do begin Layer:= AcadDocument.Layers.Item(i); States:= []; if Layer.LayerOn then States:= States + [lsLayerOn]; if Layer.Freeze then States:= States + [lsFreeze]; if Layer.Lock then States:= States + [lsLock]; if Layer.Plottable then States:= States + [lsPlottable]; LayerName:= Layer.Name; System.Move(States, Tmp, 1); AddObject(LayerName, TObject(Tmp)); if AnsiCompareText(LayerName, ActiveLayerName) = 0 then Result:= i; end; finally EndUpdate; end; end; end; end; Здесь введены новые типы для обозначения состояния слоя: включен/выключен
и т.д., которые удобно использовать при отображении слоя в выпадающем списке:
procedure TForm1.cbLayersDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var Tmp: Integer; States: TLayerStates; begin with Control as TComboBox do begin Tmp:= Integer(Items.Objects[Index]); Move(Tmp, States, 1); with cbLayers.Canvas do begin FillRect(Rect); if not (lsLayerOn in States) or (lsFreeze in States) or (lsLock in States) or not (lsPlottable in States) then Font.Color:= clGrayText; if Index >= 0 then TextOut(Rect.Left + 2, Rect.Top + 1, cbLayers.Items[Index]); end; end; end;Здесь выключенные, замороженные, заблокированные или непечатаемые слои отображаются серым шрифтом. Проверить существование слоя: function LayerExist(const ALayerName: String): Boolean; var AcadDocument: OleVariant; i, cnt: Integer; begin Result:= False; if not VarIsClear(Acad) then begin AcadDocument:= Acad.ActiveDocument; cnt:= AcadDocument.Layers.Count; for i:= 0 to cnt - 1 do begin if AcadDocument.Layers.Item(i).Name = ALayerName then begin Result:= True; Break; end; end; end; end; Создать новый слой: Acad.ActiveDocument.Layers.Add('NewLayer'); |
||||||||||||
Здесь все аналогично как для слоев, поэтому остановлюсь только на отличиях. Функция получения списка всех текстовых стилей активного документа: function EnumAutoCADTextStyles(Items: TStrings): Integer; var AcadDocument: OleVariant; ActiveStyleName, StyleName: String; i, StylesCount: Integer; begin Result:= -1; if not VarIsClear(Acad) then begin AcadDocument:= Acad.ActiveDocument; with Items do begin BeginUpdate; try Clear; ActiveStyleName:= AcadDocument.ActiveTextStyle.Name; StylesCount:= AcadDocument.TextStyles.Count; for i:= 0 to StylesCount - 1 do begin StyleName:= AcadDocument.TextStyles.Item(i).Name; Add(StyleName); if AnsiCompareText(StyleName, ActiveStyleName) = 0 then Result:= i; end; finally EndUpdate; end; end; end; end; Для добавления нового типа линии в документ не используется метод Add: Acad.ActiveDocument.Linetypes.Add('DASHED'); Такой код просто добавит новый тип линии с шаблоном Continuous. Чтобы действительно добавить штриховую линию необходимо использовать метод Load: procedure Load(const Name: WideString; const FileName: WideString); Параметры: Name — имя шаблона; FileName — имя файла шаблонов линий, из которого указанный шаблон должен быть загружен. Пример использования: Acad.ActiveDocument.Linetypes.Load('DASHED', 'acad.lin'); К статье прилагаются примеры на Delphi 7. Внимание! Запрещается воспроизведение
данной статьи или ее части без согласования с автором. Если вы желаете разместить
эту статью на своем сайте или издать в печатном виде, свяжитесь с автором. |