Окончательная компоновка
Построение границы дорожки
|
| ||||
Окончательная компоновка |
| ||||
Теперь все готово для построения границы парковой дорожки.
Для обновления кода;;;--------------------------------------------------------------- ;;; Функция: gp:drawOutline ;;;--------------------------------------------------------------- ;;; Описание: С помощью этой функции можно создать границу парковой ;;; дорожки. ;;;--------------------------------------------------------------- ;;; Примечание: Проверка на наличие ошибок и коррекция не выполняются на ;;; BoundaryData parameter. The sequence of items within this ;;; parameter does not matter, but it is assumed that all sublists ;;; are present and contain valid data. ;;; -------------------------------------------------------------- (defun gp:drawOutline (BoundaryData / VLADataPts PathAngle Width HalfWidth StartPt PathLength angm90 angp90 p1 p2 p3 p4 polypoints pline ) ;; extract the values from the list BoundaryData (setq PathAngle (cdr (assoc 50 BoundaryData)) Width (cdr (assoc 40 BoundaryData)) HalfWidth (/ Width 2.00) StartPt (cdr (assoc 10 BoundaryData)) PathLength (cdr (assoc 41 BoundaryData)) angp90 (+ PathAngle (Degrees->Radians 90)) angm90 (- PathAngle (Degrees->Radians 90)) p1 (polar StartPt angm90 HalfWidth) p2 (polar p1 PathAngle PathLength) p3 (polar p2 angp90 Width) p4 (polar p3 (+ PathAngle (Degrees->Radians 180)) PathLength) polypoints (apply 'append (mapcar '3dPoint->2dPoint (list p1 p2 p3 p4)) ) ) ;; ***** data conversion ***** ;; Notice, polypoints is in AutoLISP format, consisting of a list ;; of the 4 corner points for the garden path. ;; The variable needs to be converted to a form of input parameter ;; acceptable to ActiveX calls. (setq VLADataPts (gp:list->variantArray polypoints)) ;; Add polyline to the model space using ActiveX automation. (setq pline (vla-addLightweightPolyline *ModelSpace* ; Global Definition for Model Space VLADataPts ) ;_ end of vla-addLightweightPolyline ) ;_ end of setq (vla-put-closed pline T) ;; Return the ActiveX object name for the outline polyline ;; The return value should look something like this: ;; #<VLA-OBJECT IAcadLWPolyline 02351a34> плиния (pline) ) ;_ end of defun Обратите внимание на то, что gp:drawOutline теперь возвращает переменную pline, а не символ с апострофом 'SomeEname, как было в фиктивной версии функции. ;;;-------------------------------------------------------------- ;;; Сначала необходимо загрузить функции ActiveX. If ActiveX support ;;; already exists in document (can occur when Bonus tools have been ;;; загружен в AutoCAD), ничего не произойдет. Otherwise, ActiveX ;;; support is loaded. ;;;--------------------------------------------------------------- (vl-load-com) ;;; In Lesson 4, the following comment and code is moved to utils.lsp ;;;--------------------------------------------------------------- ;;; For ActiveX functions, we need to define a global variable that ;;; "points" to the Model Space portion of the active drawing. This ;;; variable, named *ModelSpace* will be created at load time. ;;;--------------------------------------------------------------- (setq *ModelSpace* (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)) ) ;_ end of vla-get-ModelSpace ) ;_ end of setq Обратите внимание, что этот фрагмент кода должен находиться в тексте раньше, чем все функции, объявленные defun. Это обеспечивает автоматическое выполнение данного кода VLISP при загрузке файла. (setq PolylineName (gp:drawOutline)) Измените ее следующим образом: (setq PolylineName (gp:drawOutline gp_PathData)) Теперь функция gp: drawOutline ожидает передачи параметра списка, содержащего данные для построения полилинии. Выполненное изменение удовлетворяет этому требованию. Попробуйте загрузить и выполнить измененную программу. По окончании выполнения программы управление передается из AutoCAD в VLISP, поэтому для просмотра результатов необходимо снова переключиться в окно AutoCAD. Если программа работает правильно, она должна построить границы парковой дорожки. При возникновении ошибок следует отладить код и запустить программу заново. |