楼主画出图,稍加计算就知道了:
 - (defun c:test2()
- ;以下 baspt、rad、num 值须由使用者输入
- (setq baspt (getpoint "请求输入基准点:"))
- (setq rad (getdist baspt "\n请求输入小圆半径:"))
- (setq num (getint "\n请求输入欲相切的小圆数量:")) ;只要能求得 cenpt 点,再以 array 指令配合就万事OK了
- ;以下ang1、kk、cenpt值须由程序依据baspt、rad、num求出
- (setq ang1 (/ (* pi 2) (* num 2))) ;等分角度的一半(如:6等分,即360度/6=60度为等分角,再除以2)
- (setq kk (/ rad (sin ang1))) ;半径除以这个角度的正正弦就是到阵列中心的距离
- (setq ang2 (- (/ pi 2) ang1)) ;与x轴线的方向角度为90度减去等分角的一半
- (setq cenpt (polar baspt ang2 kk)) ;得到阵列中心
- ;以下依据 cenpt、num 配合环形array画出多圆相切
- (command "circle" baspt rad)
- ;;先画一个圆,才能array
- (command "array" (entlast) "" "p" cenpt num 360 "Y")
- (prin1)
- (prompt "\n << 5TEST2>>自动等圆相切绘制")
- (prin1)
- )
- ;;;以下部分为我稍加修改:
- (defun C:test1 (/ basPt cenpt rad num e o n a v i)
- (defun Make-Circle (cen rad) ;最好定义画圆的子函数,以方便以后的修改和重复利用
- (entmakeX
- (list '(0 . "CIRCLE") (cons 10 cen) (cons 40 rad))
- )
- )
- (initget 9) ;不空输入,可在图形外上的一点
- (setq baspt (getpoint "请求输入基准点:"))
- (initget 15) ;不空输入,为正数
- (setq rad (getdist baspt "\n请求输入小圆半径:"))
- (initget 7) ;不空输入,为正整数
- (setq num (getint "\n请求输入欲相切的小圆数量:"))
- (setq basPt (trans basPt 1 0)) ;要转化到世界坐标系
- (setq e (Make-Circle basPt rad)) ;先画一个圆
- (setq o (vlax-ename->vla-object e))
- (setq a (/ pi num)) ;角度为等分角度的一半(等分角度为360度/数量)
- (setq v (list Rad (* Rad (/ (cos a) (sin a))) 0)) ;位移为其右偏移半径再往上偏移半径的余切
- (setq cenpt (mapcar '+ baspt v)) ;加上原位置,就是阵列中心点
- (setq i 2)
- (repeat (1- num) ;重复等分数的减一
- (setq n (vla-copy o)) ;对每个物体拷贝一份
- (vla-rotate n (vlax-3d-point cenpt) (* a i)) ;再以阵列中心点为基点旋转等分角度
- (setq i (+ i 2))
- )
- (princ)
- )
|