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

Хранение информации с реакторами


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

 

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

Хранение информации с реакторами



Важно продумать, какой тип информации следует подключить к объектным реакторам, создаваемым для каждой полилинии. На занятии 6 реактору назначалось содержимое переменной gp_PathData (ассоциативный список). Кроме того, к ассоциативному списку функции gp_PathData был добавлен новый элемент с ключевым кодом 100. Это список указателей на все круги, расположенные внутри границы дорожки.

Так как необходимо выполнить пересчет полилинии, к переменной gp_pathData добавляются четыре дополнительных ключевых значения:

;;; StartingPoint ;

;;; (12 . BottomStartingPoint) 15------------------------14 ;

;;; (15 . TopStartingPoint) | | ;

;;; EndingPoint 10 ----pathAngle---> 11 ;

;;; (13 . BottomEndingPoint) | | ;

;;; (14 . TopEndingPoint) 12------------------------13 ;

;;; ;

Пронумерованные точки необходимы для пересчета границы дорожки, когда пользователь перетаскивает одну из угловых ручек в новое положение. Эта информация уже имеется в функции gp:drawOutline (файл gpdraw.lsp). Однако посмотрим на значение, возвращаемое функцией. Пока возвращается только указатель на объект полилинии. Поэтому необходимо выполнить три дополнительных действия:

  • Сгруппировать точки периметра в подходящем формате.
  • Изменить функцию так, чтобы она возвращала списки точек периметра и указатель на полилинию.
  • Изменить функцию C:GPath для обработки нового формата значений, возвращаемых функцией gp:drawOutline.
  • Группировка списков точек периметра является простой задачей. Посмотрим на код функции gp:drawOutline. Локальной переменной p1 соответствует код 12, p2 - 13, p3 - 14 и p4 - 15. Для того чтобы объединить эту информацию, используется следующий вызов функции:

    (setq polyPoints(list

    (cons 12 p1)

    (cons 13 p2)

    (cons 14 p3)

    (cons 15 p4)

    ))

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


    (list pline polyPoints)

    Для добавления в программу кода для сохранения точек периметра полилинии



  • Измените функцию gp:drawOutline. Изменения показаны полужирным шрифтом (не пропустите описание локальной переменной polyPoints в выражении defun):


  • (defun gp:drawOutline (BoundaryData / PathAngle

    Width HalfWidth StartPt PathLength

    angm90 angp90 p1 p2

    p3 p4 poly2Dpoints

    poly3Dpoints plineStyle pline

    polyPoints

    )

    ;; 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)

    poly2Dpoints (apply 'append

    (mapcar '3dPoint->2dPoint (list p1 p2 p3 p4))

    )

    poly3Dpoints (mapcar 'float (append p1 p2 p3 p4))

    ;; get the polyline style.

    plineStyle (strcase (cdr (assoc 4 BoundaryData)))

    ;; Add polyline to the model space using ActiveX automation.

    pline (if (= plineStyle "LIGHT")

    ;; create a lightweight polyline.

    (vla-addLightweightPolyline

    *ModelSpace* ; Global Definition for Model Space

    (gp:list->variantArray poly2Dpoints)

    ;data conversion

    ) ;_ end of vla-addLightweightPolyline

    ;; or create a regular polyline.

    (vla-addPolyline

    *ModelSpace*

    (gp:list->variantArray poly3Dpoints)

    ;data conversion

    ) ;_ end of vla-addPolyline

    ) ;_ end of if

    polyPoints (список

    (cons 12 p1)

    (cons 13 p2)

    (cons 14 p3)

    (cons 15 p4)

    )

    ) ;_ end of setq

    (vla-put-closed pline T)

    (list pline polyPoints)

    ) ;_ end of defun

  • Измените функцию C:GPath (файл gpmain.lsp). Найдите строку кода, которая сейчас выглядит так:


  • (setq PolylineName (gp:drawOutline gp_PathData))

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

    (setq PolylineList (gp:drawOutline gp_PathData)

    PolylineName (car PolylineList)

    gp_pathData (append gp_pathData (cadr PolylineList))

    ) ;_ end of setq

    Переменная gp_PathData теперь содержит всю необходимую для функции реактора информацию.

  • Добавьте PolylineList в раздел описаний локальных переменных функции C:GPath.


  •  


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