本帖最后由 夏生生 于 2022-3-11 22:58 编辑
给您几个函数,拼凑一下
(setq *xty-o2e* vlax-ename->vla-object *xty-e2o* vlax-vla-object->ename)
- ;;; 通用函数 动态移动
- ;;;参数: ss---------选择集、图元名、或图元名表
- ;;; grmode-----grread参数
- ;;; from-------移动基点UCS
- ;;; vx----------是否平行向量,Vx平行该向量,nil任意
- ;;; vy----------是否垂直向量,1平行,2垂直,3垂直或平行
- ;;;返回值:ss
- (defun xty-gr-move (ss grmode from vx vy / enlst gr loop pt pts)
- (cond ((eq (type ss) 'PICKSET) (setq enlst (xty-tr-ss2lst ss t)))
- ((eq (type ss) 'ENAME) (setq enlst (list ss)))
- ((eq (type ss) 'LIST) (setq enlst ss))
- )
- (setq loop t
- pts from
- )
- (while loop
- (setq gr (apply 'grread grmode)
- pt (cadr gr)
- gr (car gr)
- )
- (cond ((= gr 5) ;_当鼠标移动
- (if vx
- (progn (setq pt (xty-G-Orthopttov from pt vx))
- (cond ((= 1 vy) (setq pt (cadr pt))) ;_平行(ucs)
- ((= 2 vy) (setq pt (caddr pt))) ;_垂直(ucs)
- ((= 3 vy) (setq pt (car pt))) ;_—垂直或平行wcs)
- )
- )
- )
- (foreach n enlst (xty-move n pts pt)) ;_移动一个向量
- (setq pts pt) ;_向量的相对移动
- )
- ((= gr 3) (setq loop nil)) ;_鼠标左键,结束移动
- (t (setq loop nil)) ;_键盘任意键键,结束移动
- )
- )
- ss
- )
- ;;;=============================================
- ;;; 通用函数 选择集转图元名或obj表
- ;;;参数: ss------选择集
- ;;; form----t返回图元名列表nil返回vba对象表
- ;;;返回值:图元名或obj表
- (defun xty-tr-ss2lst (ss form / n en lst)
- (repeat (setq n (sslength ss))
- (setq en (ssname ss (setq n (1- n))))
- (setq lst (cons en lst))
- )
- (setq lst(reverse lst))
- (if form lst (mapcar(function *xty-e2o*)lst))
- )
- ;;;=============================================
- ;;; 通用函数 移动图元
- ;;;参数: obj-------图元名、对象或选择集
- ;;; from------移动自ucs
- ;;; to--------移动至ucs
- ;;;返回值:obj
- (defun xty-move (obj from to / a lst)
- (if (= 'ENAME (type obj))
- (setq obj (*xty-e2o* obj)
- a t
- )
- )
- (cond ((= 'ENAME (type obj))
- (setq obj (*xty-e2o* obj)
- a t
- )
- )
- ((= 'PICKSET (type obj)) (setq lst (xty-tr-ss2lst obj nil)))
- )
- (if (= 2 (length from))
- (setq from (xty-G-addz from 0))
- )
- (if (= 2 (length to))
- (setq to (xty-G-addz to 0))
- )
- (setq from (vlax-3d-point (trans from 1 0))
- to (vlax-3d-point (trans to 1 0))
- )
- (if lst
- (foreach n lst (vlax-invoke-method n 'move from to))
- (vlax-invoke-method obj 'move from to)
- )
- (if a
- (*xty-o2e* obj)
- obj
- )
- )
- ;;;=============================================
- ;;; 通用函数 二维点变三维点
- ;;;参数: pt------二维点
- ;;;返回值:二维点
- (defun xty-G-addz (pt z)
- (list (car pt) (cadr pt) z)
- )
- ;;; 通用函数 求过基点平行或垂直向量点
- ;;;参数: base------基点wcs
- ;;; point-----方向点wcs
- ;;; vx---------方向单位向量wcs
- ;;;返回值:(过基点平行或垂直向量点 过基点平行向量点 过基点垂直向量点)
- (defun xty-G-Orthopttov (base pt vx / dx dy ptx pty vp vy)
- (setq vy (xty-vec-vxv '(0.0 0.0 1.0) vx) ;_目标向量逆时针旋转90度
- vp (xty-vec-v-v pt base)
- dx (xty-vec-Dot vx vp) ;_vp向在目标向量上的投影
- dy (xty-vec-Dot vy vp) ;_vp向在目标向量垂直向量上的投影
- ptx (xty-vec-v+v base (xty-vec-vxs vx dx))
- pty (xty-vec-v+v base (xty-vec-vxs vy dy))
- )
- (if (< (abs dx) (abs dy))
- (list pty ptx pty);_当x投影长度小于y投影长度
- (list ptx ptx pty);_当x投影长度大于等于y投影长度
- )
- )
- ;;;=============================================
- ;;; 通用函数 两向量相加
- ;;;参数: v1-------向量
- ;;; V2-------向量
- ;;;返回值:向量
- ;;;几何意义:三角形法则(唯一的合成);平行四边形法则(力的合成)
- (defun xty-vec-v+v (v1 v2)
- (mapcar (function +) v1 v2)
- )
- ;;;=============================================
- ;;; 通用函数 两向量相减
- ;;;参数: v1-------向量
- ;;; V2-------向量
- ;;;返回值:向量,方向->2终点指向->1终点
- (defun xty-vec-v-v (v1 v2)
- (mapcar (function -) v1 v2)
- )
- ;;;=============================================
- ;;; 通用函数 两表相乘
- ;;;参数: v1-------表
- ;;; V2-------表
- ;;;返回值:表内元素相乘的表
- (defun xty-vec-v*v (v1 v2)
- (mapcar (function *) v1 v2)
- )
- ;;;=============================================
- ;;; 通用函数 两向量的点积(内积)
- ;;;参数: v1-------向量
- ;;; v2-------向量
- ;;;返回值:标量
- ;;;几何意义:可以用来表征或计算两个向量之间的夹角
- ;;; 以及在->2在->1向量方向上的投影
- ;;;>0夹角0~90;=0垂直;<0夹角90~180
- (defun xty-vec-Dot (v1 v2)
- (apply (function +) (xty-vec-v*v v1 v2))
- )
- ;;;=============================================
- ;;; 通用函数 两向量的叉积(外积)
- ;;;参数: v1-------三维向量
- ;;; v2-------三维向量
- ;;;返回值:三维向量
- ;;;几何意义:v1和v2组成的面的法向量
- ;;; 二维时,平行四边形面积
- (defun xty-vec-vxv ( u v )
- (list
- (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
- (- (* (car v) (caddr u)) (* (car u) (caddr v)))
- (- (* (car u) (cadr v)) (* (car v) (cadr u)))
- )
- )
|