您需要考虑的应用程序的另一个重要方面是将哪种信息附加到为每个折线实体创建的对象反应器。在第 6 课中,您添加了将 的内容(关联列表)附加到反应器的代码。您通过向关联列表添加新的键控字段 (100) 来扩展其中携带的数据。此新子列表是指向指定给折线边界的所有圆实体的指针列表。gp_PathDatagp_PathData
由于需要完成重新计算折线边界的工作,因此应将四个额外的键值添加到:gp_pathData
;;; StartingPoint ;
;;; (12 . BottomStartingPoint) 15------------------------14 ;
;;; (15 . TopStartingPoint) | | ;
;;; EndingPoint 10 ----pathAngle---> 11 ;
;;; (13 . BottomEndingPoint) | | ;
;;; (14 . TopEndingPoint) 12------------------------13 ;
;;; ;
每当用户将拐角夹点拖动到新位置时,这些有序点对于重新计算折线边界是必需的。此信息已存在于gpdraw.lsp 中的函数中。但是看看函数的返回值。目前,仅返回指向折线对象的指针。所以你需要做三件事:gp:drawOutline
- 以所需的格式组合周长点。
- 修改函数,使其返回周长点列表和指向折线的指针。
- 修改函数,使其正确处理返回值的新格式。C:GPathgp:drawOutline
组装周长点列表很简单。查看其中的代码。局部变量对应于键值 12、到 13、到 14 和 15。您可以添加以下函数调用来组合此信息:gp:drawOutlinep1p2p3p4
(setq polyPoints(list
(cons 12 p1)
(cons 13 p2)
(cons 14 p3)
(cons 15 p4)
))
修改函数以使其返回折线周长点和折线指针也很容易。作为其中的最后一个表达式,组合要返回的两个信息项的列表。gp:drawOutline
(list pline polyPoints)
添加程序逻辑以保存折线周长点
- 修改通过以下代码中以粗体显示的更改(不要忽略向语句中添加局部变量):gp:drawOutlinepolyPointsdefun
(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 (list
(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
- 修改函数(在gpmain.lsp中)。查找当前如下所示的代码行:C:GPath
(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
- 添加到函数定义的局部变量部分。PolylineListC:GPath
|