给个简单的例子.
 - (defun GetA3Blocks (/ ss i ent blk_info minpt maxpt scale bbox_list)
- ;;; 搜索图中所有名为"A3图框"的图块并返回包围盒信息
- (setq bbox_list '())
- (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "A3图框"))))
- (progn
- (setq i 0)
- (repeat (sslength ss)
- (setq ent (ssname ss i)
- blk_info (entget ent))
- (setq scale (cdr (assoc 41 blk_info))) ; 获取X方向比例因子
- (setq blk_obj (vlax-ename->vla-object ent))
- (vla-getboundingbox blk_obj 'minpt 'maxpt)
- (setq minpt (vlax-safearray->list minpt)
- maxpt (vlax-safearray->list maxpt))
- ; 添加到返回列表: (比例 ((左下点) (右上点)))
- (setq bbox_list (cons (list scale (list minpt maxpt)) bbox_list))
- (setq i (1+ i))
- )
- )
- )
- (reverse bbox_list) ; 返回结果列表
- )
-
- (defun PointInBoundingBox (pt minpt maxpt)
- ;;; 判断点是否在包围盒内
- (and
- (>= (car pt) (car minpt))
- (>= (cadr pt) (cadr minpt))
- (<= (car pt) (car maxpt))
- (<= (cadr pt) (cadr maxpt))
- )
- )
-
- (defun c:Dli ( / pt block_list found scale dimstyle oldDimStyle currDimStyle)
- ;;; 主命令函数
- (setq block_list (GetA3Blocks)) ; 获取所有A3图框信息
-
- (if (null block_list)
- (princ "\n未找到A3图框!")
- (progn
- (setq pt (getpoint "\n请拾取标注点: "))
- (if pt
- (progn
- ; 查找包含点的图框
- (setq found nil)
- (foreach block_info block_list
- (setq minpt (caadr block_info)
- maxpt (cadadr block_info))
- (if (PointInBoundingBox pt minpt maxpt)
- (setq found block_info)
- )
- )
-
- (if found
- (progn
- (setq scale (car found)
- dimstyle (strcat "dim-" (itoa (fix scale))))
-
- ; 检查标注样式是否存在
- (if (tblsearch "DIMSTYLE" dimstyle)
- (progn
- (setq doc(vla-get-activedocument (vlax-get-acad-object)))
- (setq oldDimStyle(vla-get-activeDimStyle doc))
- (setq currDimStyle(vla-item (vla-get-dimstyles doc) dimstyle))
-
- (vla-put-ActiveDimStyle doc currDimStyle)
- (princ (strcat "\n切换到标注样式: " dimstyle))
-
- ; 绘制标注
- (command "_.DIMLINEAR" pt pause pause)
- (vla-put-ActiveDimStyle doc oldDimStyle)
- )
- (princ (strcat "\n标注样式" dimstyle "不存在!"))
- )
- )
- (princ "\n拾取点不在任何A3图框范围内!")
- )
- )
- (princ "\n未拾取点!")
- )
- )
- )
- (princ)
- )
-
- (princ "\nDli命令已加载,输入Dli启动")
- (princ)
|