Группы пользователей Autodesk

         

Окончательная компоновка


Построение границы дорожки

 

Построение границы дорожки 
 

Окончательная компоновка



Теперь все готово для построения границы парковой дорожки.

Для обновления кода

  • Замените старый код функции gp:drawOutline следующим фрагментом:
  • ;;;---------------------------------------------------------------

    ;;; Функция: 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, как было в фиктивной версии функции.

  • Отформатируем введенный код. Для этого выделите его и нажмите кнопку «Форматирование выделенного фрагмента» на панели инструментов VLISP.


  • Добавим код для загрузки ActiveX и опишем глобальную переменную, хранящую указатель на пространство модели, как это было описано выше. Для этого установите курсор в верхней части окна текстового редактора и добавьте перед первым выражением defun следующий фрагмент:


  • ;;;--------------------------------------------------------------

    ;;; Сначала необходимо загрузить функции 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 при загрузке файла.



  • Найдите следующую строку в функции C:GPath:


  • (setq PolylineName (gp:drawOutline))

    Измените ее следующим образом:

    (setq PolylineName (gp:drawOutline gp_PathData))

    Теперь функция gp: drawOutline ожидает передачи параметра списка, содержащего данные для построения полилинии. Выполненное изменение удовлетворяет этому требованию.

  • Добавьте в конец файла gpmain.lsp функцию Преобразование списка точек в массив типа variantgp:list->variantArray, описанную в разделе .


  • Попробуйте загрузить и выполнить измененную программу. По окончании выполнения программы управление передается из AutoCAD в VLISP, поэтому для просмотра результатов необходимо снова переключиться в окно AutoCAD. Если программа работает правильно, она должна построить границы парковой дорожки. При возникновении ошибок следует отладить код и запустить программу заново.

     


    Содержание раздела