Another example. This allows you to select a closed polyline and hatch it by aligning itself to the side of the selection point.
(vl-load-com)
(defun c:hatch_align_vtx ( / AcDoc flag *error* f_pat ent Space pr-1 pr-1 alpha hatch)
(setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) flag T)
(vla-StartUndoMark AcDoc)
(defun *error* (msg)
(and
msg
(not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*BREAK*,*EXIT*"))
(princ (strcat "\nError: " msg))
)
(if
(= 8 (logand (getvar "UNDOCTL") 8))
(vla-endundomark AcDoc)
)
(princ)
)
(if (not (findfile "BAT_PUBL.pat"))
(progn
(setq f_pat (open (strcat (getvar "ROAMABLEROOTPREFIX") "support\\BAT_PUBL.pat") "w"))
(write-line "*BAT_PUBL" f_pat)
(write-line "45,0,0,0,.75" f_pat)
(write-line "315,0,0,0,.75" f_pat)
(close f_pat)
)
)
(while (setq ent (entsel "\nSelect the long side polyline to hatch it: "))
(setq obj_curv (vlax-ename->vla-object (car ent)))
(cond
((and
(eq (vlax-get-property obj_curv 'ObjectName) "AcDbPolyline")
(eq (vla-get-closed obj_curv) :vlax-true)
)
(setq
Space
(if (eq (getvar "CVPORT") 1)
(vla-get-PaperSpace AcDoc)
(vla-get-ModelSpace AcDoc)
)
pr-1 (fix (vlax-curve-getParamAtPoint obj_curv (vlax-curve-getClosestPointTo obj_curv (cadr ent) nil)))
pr+1 (if (>= (1+ pr-1) (fix (vlax-curve-getEndParam obj_curv))) 0 (1+ pr-1))
alpha (+ (angle (vlax-curve-getPointAtParam obj_curv pr-1) (vlax-curve-getPointAtParam obj_curv pr+1)) (* 0.25 pi))
)
(setq hatch (vla-AddHatch Space acHatchPatternTypeCustomDefined "BAT_PUBL" :vlax-True))
(vlax-invoke hatch 'AppendOuterLoop (list obj_curv))
(vla-put-patternscale hatch 1.0)
(vla-put-patternangle hatch alpha)
(vla-evaluate hatch)
)
)
)
(*error* nil)
(vla-EndUndoMark AcDoc)
(prin1)
)