马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
 - ;点选面改面颜色
- (defun changfacecolor (e pnt colorN)
- (setq br (xdbr::constructor e))
- (setq tr (xdbr::constructor "brepfacetraverser" br))
- ;;FACE遍历
- (setq face-count 0
- ids nil
- distminlist nil
- )
- (xdrx_entity_delete co-ss)
- (xdrx_setmark)
- (while (not (xdbr::traverser:done tr)) ;回圈遍历
- (if (setq face (xdbr::getpropertyvalue tr "face"))
- ;;AcBrFace对象
- (progn (setq face-count (1+ face-count)
- gface (xdbr::getpropertyvalue face "surface")
- ;;得到AcGeSurface物件
- closest-pnt (xdge::getpropertyvalue
- gface
- "closestpointto"
- pnt
- )
- ;;最近点
- dist (distance pnt closest-pnt)
- SubEntPath (xdbr::getpropertyvalue face "subentpath")
- ;获得面的子实体路径
- SubEntId (xdrx_getpropertyvalue SubEntPath "subentid")
- ;;获得子实体ID
- ids (cons SubEntId ids) ;保存到全域表
- )
- (setq distminlist
- (cons (list (distance closest-pnt pnt) SubEntId)
- distminlist
- )
- )
- (xdrx_object_release gface face)
- ;;释放AcBrFace、AcGeSurface
- )
- )
- (setq co-ss (xdrx_getss))
- (xdbr::traverser:next tr)
- ) ;while
- (setq distminlist
- (vl-sort distminlist
- (function (lambda (x y) (< (car x) (car y))))
- )
- ) ;距离重排序
- (xdrx_setpropertyvalue
- e
- "subentcolor"
- (list (cdr (car distminlist)) colorN)
- )
- (xdrx_object_release tr br)
- ) ;end
- (defun c:cfc ()
- (if (setq
- e (car (xdrx_entsel "\n选取3DSOLID<退出>:" '((0 . "3DSOLID")))
- )
- )
- (progn (xdrx_begin) ;(xdrx_sysvar_push '("osmode" 512))
- ;(xdrx_setvar "pdmode" 35)
- (while (setq pt (getpoint "\n点取测试点<退出>:"))
- (changfacecolor e pt 1)
- )
- (xdrx_end)
- )
- )
- (princ)
- )
序其实是取一个点,计算这个点到3Dsolid的最近面,找到这个面。
有时会出计算出错,不知道为什么?
还有问题是有没有办法直接选面,这样计算点的距离总不是个好办法。
你们有好办法吗?
|