本帖最后由 zdqwy19 于 2015-11-28 20:01 编辑
一个复合图形中只希望选中一部分图形,除了利用nentsel点选外也可以使用ssget和ssnamex来实现:使用框(栏)选来同时确定希望选中的范围和所要分析的复合图形,然后利用ssnamex来分析出所要的部分图形。说得有点啰嗦,代码(框选)写的也啰嗦。- ;利用碰选二次筛选结果 zdqwy19 2015.11.28 摘自自用程序
- (defun C:ff(/ ss de lp lv lx ly lz xmax xmin xid xy xz ymax ymin yz)
- (setq ss(ssget))
- (setq de (ssnamex ss))
- ;(princ de)
- (setq xid (caar de))
- (if(= 3 xid);选择方式ID=3,碰选
- (progn
- (if(null (caddr(car(cdadr de))))
- (setq lv (list 0.0 0.0 1.0))
- (setq lv (caddr(car(cdadr de))))
- );选择方式点向量
- (setq xz (/ (car lv) (caddr lv))
- yz (/ (cadr lv) (caddr lv))
- )
- (setq listpoint (apply 'append (mapcar '(lambda(x)(list (cadr x))) (cdadr de))))
- (setq lx (apply 'append (mapcar '(lambda(x)(list (car x))) lp))
- ly (apply 'append (mapcar '(lambda(x)(list (cadr x))) lp))
- lz (apply 'append (mapcar '(lambda(x)(list (caddr x))) lp))
- )
- ;求出z=0时的选择范围
- (setq xmin (apply 'min (mapcar '(lambda(a b)(- a (* b xz))) lx lz)))
- (setq xmax (apply 'max (mapcar '(lambda(a b)(- a (* b xz))) lx lz)))
- (setq ymin (apply 'min (mapcar '(lambda(a b)(- a (* b yz))) ly lz)))
- (setq ymax (apply 'max (mapcar '(lambda(a b)(- a (* b yz))) ly lz)))
- (setq xy (list xmin xmax ymin ymax))
- )
- (setq xy (list 0.0 0.0 0.0 0.0))
- )
- (append (list xid) xy);将选择方式和选择范围一起输出
- ;获取的点设为pt(x y z)
- ;获取的坐标投到z=0时的xz0和yz0以方便比较是否在选择范围内
- ;;; (setq xz0 (- x (* z xz))
- ;;; yz0 (- y (* z yz))
- ;;; )
- ;;; (if(and(>= xz0 xmin)
- ;;; (<= xz0 xmax)
- ;;; (>= yz0 ymin)
- ;;; (<= yz0 ymax)
- ;;; )
- ;;; ;选中
- ;;; ;未选中
- ;;; )
- )
|