Хранение информации с реакторами
Окончательная компоновка
|
| ||||
Хранение информации с реакторами |
| ||||
Важно продумать, какой тип информации следует подключить к объектным реакторам, создаваемым для каждой полилинии. На занятии 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). Однако посмотрим на значение, возвращаемое функцией. Пока возвращается только указатель на объект полилинии. Поэтому необходимо выполнить три дополнительных действия: Группировка списков точек периметра является простой задачей. Посмотрим на код функции 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) Для добавления в программу кода для сохранения точек периметра полилинии(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 (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 теперь содержит всю необходимую для функции реактора информацию. |