gp:calculate-Draw-TileRow 関数のコードを見てください。
(defun gp:calculate-Draw-TileRow (startPoint TileRadius TileSpace pathWidth pathAngle offsetFromCenter ObjectCreationStyle / HalfWidth TileDiameter ObjectCreationFunction angp90 angm90 firstCenterPt TileCenterPt TileList) (setq HalfWidth (- (/ pathWidth 2.00) TileRadius) Tilespacing (+ (* TileRadius 2.0) TileSpace) TileDiameter (* TileRadius 2.0) angp90 (+ PathAngle (Degrees->Radians 90)) angm90 (- PathAngle (Degrees->Radians 90)) firstCenterPt (polar startPoint angp90 offsetFromCenter) tileCenterPt firstCenterPt ObjectCreationStyle(strcase ObjectCreationStyle) ObjectCreationFunction (cond ((equal ObjectCreationStyle "ACTIVEX") gp:Create_activeX_Circle ) ((equal ObjectCreationStyle "ENTMAKE") gp:Create_entmake_Circle ) ((equal ObjectCreationStyle "COMMAND") gp:Create_command_Circle ) (T (alert (strcat "ObjectCreationStyle in function gp:calculate-Draw-TileRow" "\nis invalid. Contact developer for assistance." "\n ObjectCreationStyle set to ACTIVEX" ) ) setq ObjectCreationStyle "ACTIVEX") ) ) ) ;; Draw the circles to the left of the center. (while (< (distance startPoint tileCenterPt) HalfWidth) ;; Add each tile to the list to return. (setq tileList (cons (ObjectCreationFunction tileCenterPt TileRadius) tileList ) ) ;; Calculate the center point for the next tile. (setq tileCenterPt (polar tileCenterPt angp90 TileSpacing) ) );_ end of while ;; Draw the circles to the right of the center. (setq tileCenterPt (polar firstCenterPt angm90 TileSpacing)) (while (< (distance startPoint tileCenterPt) HalfWidth) ;; Add each tile to the list to return. (setq tileList (cons (ObjectCreationFunction tileCenterPt TileRadius) tileList ) ) ;; Calculate the center point for the next tile. (setq tileCenterPt (polar tileCenterPt angm90 TileSpacing)) );_ end of while ;; Return the list of tiles. tileList ) ;_ end of defun
前出の疑似コードに対応するコードの前に、次のような AutoLISP コードがあります。
(setq ObjectCreationFunction (cond ((equal ObjectCreationStyle "ACTIVEX") gp:Create_activeX_Circle ) ((equal ObjectCreationStyle "ENTMAKE") gp:Create_entmake_Circle ) ((equal ObjectCreationStyle "COMMAND") gp:Create_command_Circle ) (T (alert (strcat "ObjectCreationStyle in function gp:calculate-Draw-TileRow" "\nis invalid. Contact the developer for assistance." "\n ObjectCreationStyle set to ACTIVEX" ) ;_ end of strcat ) ;_ end of alert (setq ObjectCreationStyle "ACTIVEX") ) ) ;_ end of cond ) ;_ end of setq
タイルを描くのに、ActiveX 関数、entmake 関数、command 関数のいずれを使用するかを、ユーザが指定できるようにしたことを思い出してください。変数 ObjectCreationFunction には、引数 ObjectCreationStyle に応じて、3 つの関数の中の 1 つが割り当てられます( gp:Calculate-and-Draw-Tiles を介して C:GPath から渡されます)。次に、gpdraw.lsp に定義する 3 つの関数を示します。
(defun gp:Create_activeX_Circle (center radius) (vla-addCircle *ModelSpace* (vlax-3d-point center) ; convert to ActiveX-compatible 3D point radius ) ) ;_ end of defun (defun gp:Create_entmake_Circle (center radius) (entmake (list (cons 0 "CIRCLE") (cons 10 center) (cons 40 radius)) ) (vlax-ename->vla-object (entlast)) ) (defun gp:Create_command_Circle (center radius) (command "._circle" center radius) (vlax-ename->vla-object (entlast)) )
最初の関数は、ActiveX 関数を使用して円を描き、ActiveX オブジェクトを返します。
2 番目の関数は、entmake を使用して円を描きます。ActiveX オブジェクトに変換された図形名を返します。
3 番目の関数は、command を使用して円を描きます。これも、ActiveX オブジェクトに変換された図形名を返します。