本帖最后由 lijiao 于 2021-10-15 10:28 编辑
今天说第二个函数:
函数名:ssdrag
调用格式:(ssdrag [mode] [ss] [pt] [ref] [msg])
功能:拖动选择集,可以带关键字,使用关键字之前不用初始化
参数说明:- mode为整数,取值为0时,表示移动方式
- 取值为1时,表示旋转方式
- 取值为2时,表示缩放方式
- 取值为3时,表示镜像方式
- 不提供时,默认为0
- ss为选择集,不提供时会提示选择实体
- pt为拖动基准点,不提供时会提示输入基准点
- ref为实数,mode为1时表示参考角度(弧度)
- mode为2时表示参考缩放值
- mode为1和3时会忽略该值
- msg为字符串,表示提示信息,如果需要带关键字,需要按下面的格式进行书写
- 示例:"目标点[开门(K)/关门(N)]<退出>"
复制代码- 返回值:成功,mode为0时返回点
- mode为1时返回角度(弧度)
- mode为2时返回缩放值(距离)
- mode为3时返回镜像线的角度(弧度)
- 选择关键字返回字符串
- 失败,返回nil
复制代码
使用举例:
![](source/plugin/imc_colorcode/images/loading.gif) - (defun c:mmove ( / BIAOJI ISCOPY JUZHEN MODE PT0 PT1 REA RES SS SSOBJ X)
- (if (and (setq ss (nsget)) (setq pt0 (getpoint "\r基点:")))
- (progn
- (setq ssobj (tovb ss) biaoji t iscopy nil mode 0 rea 0.0 res 1.0)
- (while biaoji
- (cond
- ((= mode 0)
- (if iscopy
- (setq pt1 (ssdrag 0 ss pt0 "【复制移动】 [复制(N)/基点(B)/旋转(RO)/缩放(S)/镜像(MI)/完成(O)]目标点<完成>"))
- (setq pt1 (ssdrag 0 ss pt0 "【移动】 [复制(Y)/基点(B)/旋转(RO)/缩放(S)/镜像(MI)/完成(O)]目标点<完成>"))
- )
- )
- ((= mode 1)
- (setq pt1 (ssdrag 1 ss pt0 rea "【旋转】 [基点(B)/参考(RE)/缩放(S)/镜像(MI)/完成(O)]旋转角度<完成>"))
- )
- ((= mode 2)
- (setq pt1 (ssdrag 2 ss pt0 res "【缩放】 [基点(B)/参考(RE)/旋转(RO)/镜像(MI)/完成(O)]缩放值<完成>"))
- )
- ((= mode 3)
- (setq pt1 (ssdrag 3 ss pt0 "【镜像】 [基点(B)/旋转(RO)/缩放(S)/完成(O)]镜像线<完成>"))
- )
- )
- (cond
- ((= pt1 "Y") (setq iscopy t))
- ((= pt1 "N") (setq iscopy nil))
- ((= pt1 "B") (if (setq pt1 (getpoint "\r基点:")) (setq pt0 pt1)))
- ((= pt1 "RE") (if (= mode 1)
- (if (setq pt1 (getangle pt0 (STRCAT "\r参考角度<" (rtos (rtod rea)) ">:"))) (setq rea pt1))
- (if (setq pt1 (getdist pt0 (STRCAT "\r参考缩放值<" (rtos res) ">:"))) (setq res pt1))
- )
- )
- ((= pt1 "MO") (setq mode 0))
- ((= pt1 "RO") (setq mode 1))
- ((= pt1 "S") (setq mode 2))
- ((= pt1 "MI") (setq mode 3))
- ((= pt1 "O")
- (if (= mode 0)
- (setq biaoji nil)
- (setq mode 0)
- )
- )
- ((member (type pt1) '(list real int))
- (cond
- ((= (type pt1) 'list) (setq juzhen (cs-juzhen (list 'mov pt0 pt1))))
- ((= mode 1) (setq juzhen (cs-juzhen (list 'rot pt0 (- pt1 rea)))))
- ((= mode 2) (setq juzhen (cs-juzhen (list 'sca pt0 (/ pt1 res)))))
- ((= mode 3) (setq juzhen (cs-juzhen (list 'mir pt0 (polar pt0 pt1 10)))))
- )
- (if (= mode 0)
- (if iscopy
- (mapcar '(lambda (x)
- (cs-juzhen (list 'yin (vla-copy x) juzhen))
- )
- ssobj
- )
- (progn
- (mapcar '(lambda (x)
- (cs-juzhen (list 'yin x juzhen))
- (vla-update x)
- )
- ssobj
- )
- (setq pt0 pt1)
- )
- )
- (progn
- (mapcar '(lambda(x)
- (cs-juzhen (list 'yin x juzhen))
- (vla-update x)
- )
- ssobj)
- (setq mode 0)
- )
- )
- )
- (t (if (= mode 0)
- (setq biaoji nil)
- (setq mode 0)
- )
- )
- )
- )
- )
- )
- (princ)
- )
其中有几个函数tovb,功能是把选择集中的每个图元转换成vla-object类型,并形成一个列表;rtod是将弧度转换为角度;Cs-juzhen可以参照论坛中关于矩阵的介绍编写
-----------------------------------------------------------------------------------------
其他函数过两天再说
|