Логотип сайта поддержки пользователей САПРО сайте поддержки пользователей САПР Translate to:
Hosting Ukraine

OmniSource - избранные переводы рассылки по Visual Lisp

02/02/01 Как получить имя активного документа AutoCAD
02/06/01 Как создать новый уровень используя ActiveX automation.
02/26/01 Как конвертировать синтаксис VBA в синтаксис Visual LISP?
02/27/01 (vlax-dump-object)
03/12/01 Работа с Excel - Часть 1 - Создание связи с Excel 97/2000
03/27/01 Работа с Excel - Часть 2 - как обращаться к ячейкам


02/02/01

Как получить имя активного документа AutoCAD:

Откоройте редактор Visual LISP набрав "VLIDE" в командной строке.
В консоли Visual LISP [VLC] наберите

(vl-load-com)
Далее можно получить текущий объект приложения AutoCAD из ActiveX automation набрав следующее:
	(still in the VLC) (setq acadApp (vlax-get-acad-object))
Вы должны получить некоторое значение на подобие этого:
	#<VLA-OBJECT IAcadApplication 00ac8928>
Получим объект AcadDocument:
	(setq acadDoc (vla-get-activedocument acadapp))
И наконец получим имя активного документа используя следующую функцию:
	(princ (vlax-get-property acaddoc 'Name))

02/06/01

Как создать новый уровень используя ActiveX automation.

    (vl-load-com)
    (setq acadApp (vlax-get-acad-object))
    (setq acadDoc (vla-get-ActiveDocument acadApp))

VBA понимает эти объекты как коллекции. К примеру все уровни в чертеже представляют собой коллекцию уровней. Следовательно, VBA имеет коллекцию уровней. Перед тем, как мы сможем создать новый объект-уровень в Visual LISP мы должны получить ссылку на коллекцию уровней так же как мы получили ссылку в предыдущем случае ссылку на объект Document в AutoCAD.
Данный код позволяет получить эту ссылку:

    (setq objLayers (vla-get-Layers acadDoc))
После того, как мы получили ссылку на коллекцию уровней мы будем использовать метод Add для того, что бы создать новый объект layer в коллекции уровней:
    (setq objLayer (vlax-invoke-method objLayers 'Add "NewLayer"))

02/26/01

Как конвертировать синтаксис VBA в синтаксис Visual LISP?

Общий принцип следующий:

    синтаксис Visual Basic ->    ReturnValue = Object.Method(Parameters)
 
    синтаксис Visual LISP  ->    (setq ReturnValue (vla-Method Object Parameters))
"ReturnValue" в синтаксисе Visual Basic преобразуется в "ReturnValue" в синтаксисе Visual LISP и так же с Object, Method и Parameters.

Следующий пример показывает как использовать эту трансляцию на примере метода VBA AddCircle
 Visual Basic syntax -> Set AcadCircleObject = ThisDrawing.ModelSpace.AddCircle(CenterPoint, Radius)
 
 Visual LISP syntax  -> (setq AcadCircleObject (vla-AddCircle ModelSpace CenterPoint Radius))

02/27/01

(vlax-dump-object)

Напомним как следует начинать каждый проект Visual LISP. Эти четыре линии должны буть включены в каждый проект:

    (vl-load-com)                             ; Загружает расширение Visual LISP COM 
    (setq acadApp (vlax-get-acad-object))     ; Это создает указатель в AutoCAD
    (setq acadDoc (vla-get-activedocument))   ; Это создает указатель в документе AutoCAD
    (setq acadMS (vla-get-modelspace))        ; Об этой функции позднее
Вы можете включить эти функции в автозагрузочную подпрограмму.

Теперь мы посмотрим на простую функцию, которую можно использовать при возникновении вопроса, какие свойства и методы являются доступными со специфическим объектом при доступе через автоматизацию:
 
    (vlax-dump-object acadDoc)
Вы должны будете получить результат подобный следующему:
 
; IAcadDocument: An AutoCAD drawing
; Property values:
;   Active (RO) = -1
;   ActiveDimStyle = #<VLA-OBJECT IAcadDimStyle 01aa6b64>
;   ActiveLayer = #<VLA-OBJECT IAcadLayer 01aa6964>
;   ActiveLayout = #<VLA-OBJECT IAcadLayout 01aa66a4>
;   ActiveLinetype = #<VLA-OBJECT IAcadLineType 01aa6614>
;   ActivePViewport = AutoCAD: No active viewport in paperspace
;   ActiveSelectionSet (RO) = #<VLA-OBJECT IAcadSelectionSet 01aa63c4>
;   ActiveSpace = 1
;   ActiveTextStyle = #<VLA-OBJECT IAcadTextStyle 01aa61c4>
;   ActiveUCS = #<VLA-OBJECT IAcadUCS 01aa9e64>
;   ActiveViewport = #<VLA-OBJECT IAcadViewport 01aaa494>
;   Application (RO) = #<VLA-OBJECT IAcadApplication 00ac8928>
;   Blocks (RO) = #<VLA-OBJECT IAcadBlocks 01aa5114>
;   Database (RO) = #<VLA-OBJECT IAcadDatabase 01aa7f84>
;   Dictionaries (RO) = #<VLA-OBJECT IAcadDictionaries 01aabc74>
;   DimStyles (RO) = #<VLA-OBJECT IAcadDimStyles 01aaba14>
;   ElevationModelSpace = 0.0
;   ElevationPaperSpace = 0.0
;   FullName (RO) = ""
;   Groups (RO) = #<VLA-OBJECT IAcadGroups 01aab7b4>
;   Height = 551
;   HWND (RO) = 556
;   Layers (RO) = #<VLA-OBJECT IAcadLayers 01aa6df4>
;   Layouts (RO) = #<VLA-OBJECT IAcadLayouts 01aab5c4>
;   Limits = (0.0 0.0 12.0 9.0)
;   Linetypes (RO) = #<VLA-OBJECT IAcadLineTypes 01aab3d4>
;   ModelSpace (RO) = #<VLA-OBJECT IAcadModelSpace 01aa7e64>
;   MSpace = AutoCAD: Invalid mode
;   Name (RO) = "Drawing1.dwg"
;   ObjectSnapMode = 0
;   PaperSpace (RO) = #<VLA-OBJECT IAcadPaperSpace 01aab0e4>
;   Path (RO) = "C:\\Program Files\\ACAD2000"
;   PickfirstSelectionSet (RO) = #<VLA-OBJECT IAcadSelectionSet 01aab044>
;   Plot (RO) = #<VLA-OBJECT IAcadPlot 01aa9c4c>
;   PlotConfigurations (RO) = #<VLA-OBJECT IAcadPlotConfigurations 01aacae4>
;   Preferences (RO) = #<VLA-OBJECT IAcadDatabasePreferences 01aa7f54>
;   ReadOnly (RO) = 0
;   RegisteredApplications (RO) = #<VLA-OBJECT IAcadRegisteredApplications 01aac694>
;   Saved (RO) = 0
;   SelectionSets (RO) = #<VLA-OBJECT IAcadSelectionSets 01aa63f4>
;   TextStyles (RO) = #<VLA-OBJECT IAcadTextStyles 01aac434>
;   UserCoordinateSystems (RO) = #<VLA-OBJECT IAcadUCSs 01aac1d4>
;   Utility (RO) = #<VLA-OBJECT IAcadUtility 01aaafc4>
;   Viewports (RO) = #<VLA-OBJECT IAcadViewports 01aaaf34>
;   Views (RO) = #<VLA-OBJECT IAcadViews 01aaacd4>
;   Width = 950
;   WindowState = 1
;   WindowTitle (RO) = "Drawing1"
Обратите внимание на (RO) около некоторых из свойств. Это означает что это доступно только для чтения

Свойства, имена которых заканчиваются на "s", к примеру Views и Viewports -это коллекции объектов. В терминах AutoCAD все Layers или Blocks так же известны как коллекции.

Как же узнать, какие методы нам доступны? Это можно сделать, добавив T к концу выражения следующим образом
    (vlax-dump-object acadDoc T)
Тогда это было бы добавлено в конец к вышеупомянутому списку:
 
; Methods supported:
;   Activate ()
;   AuditInfo (1)
;   Close (2)
;   CopyObjects (3)
;   EndUndoMark ()
;   Export (3)
;   GetVariable (1)
;   HandleToObject (1)
;   Import (3)
;   LoadShapeFile (1)
;   New (1)
;   ObjectIdToObject (1)
;   Open (1)
;   PurgeAll ()
;   Regen (1)
;   Save ()
;   SaveAs (2)
;   SendCommand (1)
;   SetVariable (2)
;   StartUndoMark ()
;   Wblock (2)
Теперь, если вы знаете что либо о программировании в VBA вы сможете использовать эту информацию. Здесь все методы, которые поддерживает объект Document.

Числа в круглых скобках - число параметров, включенных в Метод. К сожалению, это не сообщает Вам, если таковые вообще имеются, существуют ли возвращаемые значения.


03/12/01

Работа с Excel - Часть 1 - Создание связи с Excel 97/2000

Итак, начнем серию материалов, посвященных доступу к Microsoft Excel 97 и 2000. Эта первая часть будет основой последующих материалов.Здесь будет расказано как создать связь с Excel 97 или 2000 (что вам понадобиться при прочтении последующих материалов по этой теме).

Загруска библиотеки типов Excel.
(vl-load-com)

(defun LoadXL2000 ()
  (progn
    (princ "\nInitializing Microsoft Excel 2000
...")
    (vlax-Import-Type-Library
      :tlb-filename   "C:\\Program Files\\Microsoft Office 2000\\Office\\excel9.olb"
      :methods-prefix   "xla-"
      :properties-prefix                 "xla-"
      :constants-prefix  "xla-"
    )
  )
  (princ)
  (princ "\nExcel Type Library loaded ...")(princ)
)

Очевидно, что вам необходимо изменить строку :tlb-filename что бы указать расположение файла excel9.olb в вашей системе. Так же, если вы используете Excel 97 имя библиотеки типов будет excel8.olb.

Создайте образца Excel

Теперь нам необходимо создать образец (загруженную копию) приложения.

(defun CreateXL ()
  (setq objExcel (vlax-Create-Object
"Excel.Application.9"))
  (princ "\nExcel 2000 is now loaded ...")(princ)
)

Это подобно тому, как мы получаем изменяемый указатель в AutoCAD (если вы помните это из предыдущих выпусков). objExcel теперь наш вход в Excel. Если вы используете Excel 97 измените "Excel.Application.9" в "Excel.Application.8"

Сделаем это видимым.

Вы конечно должны удостовериться что это работает. И должны сделать видимым для других программ.

(defun MakeXLVisible ()
  (vla-put-Visible objExcel 1)
)
Создание нового листа Excel
(defun CreateNewWorksheet ()
  (setq objWorksheet (vlax-invoke-Method
(vlax-get-Property objExcel 'WorkBooks) 'Add))
)

03/27/2001

Работа с Excel - Часть 2 - как обращаться к ячейкам>

В предыдущем уроке я показал как организовать связь с Excel. В этом занятии я покажу как открыть существующий лист Excel и прочитать значение из ячейки. Я взял на себя смелость предложить LISP-файл (test.lsp) который я использовал для того, что бы протестировать каждый шаг этой операции для того что бы вам было удобно это сделать. После того как вы загрузили test.lsp и создали тестовый лист Excel что бы использовать в этом примере наберите эту команду в командной строке:
(LoadXLTypeLib)
Это загрузит вашу библиотеку типов.
(CreateXL)
Это загрузит копию Excel.
(OpenExistingXL "C:\\Program Files\\Acad2000\\AutoCAD Sample.xls" "show")
Это открывает существующий лист Excel. Я заполнил значениями подобно тому как показано ниже:
	Line 1	Value 1
	Line 2	Value 2
	Line 3 	Value 3

(GetXLCellValue 1 1)	
Когда вы выполните эту команду программа возвратит значение:
	"Line 1"



Copyright © Сайт поддержки пользователей САПР by Victor Tkachenko