【一个关于旋转的程序求小改】
有如下程序,功能是选择对象后,能通过键盘按钮在一定步长值下连续动态旋转,现在希望增加如下一个设置:1.选择需要旋转的对象
2.选择弧线,以弧线的圆心为基点旋转刚选择的对象(第2步时,默认上一次选择的旋转基点,如果没有上一次,则提示选择弧线)
程序的提示顺序是这样的:选择要旋转的对象-----选择弧线获取圆心作为旋转基点(右键默认上一次基点)-----通过键盘按键旋转目标
下面已有的程序中,只需要将第2步加入即可,期待高手帮忙!
;;; -------------------------------------------------------------------------------------------------------------------
;;; 通过键盘旋转目标
;;; Byweiqi ,孤帆修改http://bbs.mjtd.com/forum.php?mod=viewthread&tid=99379&fromuid=423168
;;; -------------------------------------------------------------------------------------------------------------------
(DEFUN C:kr (/ cmd loop SSet KeyList n step BasePoint0 BasePoint1 BasePoint2)
(SETQ cmd (GETVAR "CMDECHO"))
(SETVAR "CMDECHO" 0)
(SETQ loop 1)
(WHILE loop
(PROMPT "\n 选择对象 : ")
(SETQ SSet (SSGET))
(COND
((NULL SSet)(ALERT "没有选中对象!"))
(T (SETQ loop nil))
)
)
(setq p1 (getpoint "指定基点: "))
(PRINC "\n Press key:")
(PRINC "\n\t 《Q键 0.1度》《W键 -0.1度》 ")
(PRINC "\n\t 《A键 1度》《S键 -1度》 ")
(TERPRI)
(SETQ KeyList '(3249 50 65 68 81 83 87 119 101 113 32 115 97 100))
(WHILE (and(/= (SETQ n (CADR (GRREAD))) 13)
(MEMBER n KeyList))
(COND
((= n 113)(COMMAND "ROTATE" SSet "" p1 0.1)(PRINC "\r< q 0.1度 >"))
((= n 81)(COMMAND "ROTATE" SSet "" p1 0.1)(PRINC "\r< Q 0.1度 >"))
((= n 119)(COMMAND "ROTATE" SSet "" p1 -0.1)(PRINC "\r< w -0.1度 >"))
((= n 87)(COMMAND "ROTATE" SSet "" p1 -0.1)(PRINC "\r< W -0.1度 >"))
((= n 97) (COMMAND "ROTATE" SSet "" p1 1)(PRINC "\r< a1度>"))
((= n 65) (COMMAND "ROTATE" SSet "" p1 1)(PRINC "\r< A1度>"))
((= n 115)(COMMAND "ROTATE" SSet "" p1 -1)(PRINC "\r< s -1度>"))
((= n 83)(COMMAND "ROTATE" SSet "" p1 -1)(PRINC "\r< S -1度>"))
((= n 32))
)
);WHILE
(SETVAR "CMDECHO" cmd)
(PRINC)
)
本帖最后由 vectra 于 2015-8-22 11:05 编辑
fire9527 发表于 2015-8-22 08:18 static/image/common/back.gif
长老,程序还有点小问题哦,有时间还请再看一下
修改了一下Z版的程序,感觉舒服了。。。
(if (null *last-rotate-point*)
(setq *last-rotate-point* '(0 0 0))
)
(defun pick-rotate-point (/ p ent)
(initget "A")
(setq
p (getpoint
(strcat "\n指定旋转基点或 [选择弧心(A)] <" (vl-princ-to-string *last-rotate-point*) ">:")
)
)
(cond ((= p "A")
(while (not (listp p))
(if (and (setq ent (entsel "\n选择圆或圆弧:"))
(setq ent (entget (car ent)))
(wcmatch (cdr (assoc 0 ent)) "ARC,CIRCLE")
)
(setq p (cdr (assoc 10 ent)))
)
)
)
((null p)
(setq p *last-rotate-point*)
)
)
(setq *last-rotate-point* p)
)
(defun c:kr (/ cmd gr n p1 sset)
(setq cmd (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(if (setq sset (ssget))
(progn
(setq p1 (pick-rotate-point))
(princ "\n按 Q/W +/-0.1度, A/S +/-1度, 空格回车或左\右键退出:")
(while (and (/= (car (setq gr (grread nil 15))) 3)
(not (equal gr '(2 32)))
(not (equal gr '(2 13)))
(not (equal (car gr) 11))
(not (equal (car gr) 25))
)
(setq n (cadr gr))
(cond
((or (= n 81) (= n 113)) ;_ Qq
(command "ROTATE" sset "" p1 0.1)
)
((or (= n 87) (= n 119)) ;_ Rr
(command "ROTATE" sset "" p1 -0.1)
)
((or (= n 65) (= n 97)) ;_ Aa
(command "ROTATE" sset "" p1 1)
)
((or (= n 83) (= n 115)) ;_Ss
(command "ROTATE" sset "" p1 -1)
)
)
)
)
)
(setvar "CMDECHO" cmd)
(princ)
)
(SETQ SSet (SSGET))
...
(setq p1 (getpoint "指定基点: "))
第二次选择与上一次选择的弧线不同但 旋转基点 为同一共点弧心之意嗎? 本帖最后由 ZZXXQQ 于 2015-8-23 17:43 编辑
;;;通过键盘旋转目标
;;;Byweiqi,孤帆修改<A href="<A href='http://bbs.mjtd.com/forum.php?mo">http://bbs.mjtd.com/forum.php?mo</A'>http://bbs.mjtd.com/forum.php?mo">http://bbs.mjtd.com/forum.php?mo</A</A>> ... &fromuid=423168
;弧心旋转 2015.8.22 ZZXXQQ 改
(defun C:kr (/ cmd loop SSet KeyList n p1)
(setq cmd (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq loop T)
(while loop
(prompt "\n 选择对象 : ")
(if (setq SSet (ssget))
(setq loop nil)
(alert "没有选中对象!")
)
)
;(setq p1 (getpoint "指定基点: "))
(if (and (setq s1 (entsel "\n选择圆弧(中心为旋转基点): "))
(setq ent (entget(car s1)))
(wcmatch (cdr(assoc 0 ent)) "ARC,CIRCLE"))
(setq p1 (cdr(assoc 10 ent)))
(if (not(listp p1)) (setq p1 '(0 0)))
)
(princ "\n Press key:\n\t 《Q键 0.1度》《W键 -0.1度》\n\t 《A键 1度》《S键 -1度》")
(terpri)
;(setq KeyList '(3249 50 65 68 81 83 87 119 101 113 32 115 97 100))
(setq KeyList '(32 65 81 83 87 97 113 115 119))
(while (and(/= (setq n (cadr (grread))) 13)
(member n KeyList))
(cond
((= n 113)(command "ROTATE" SSet "" p1 0.1)(princ "\r< q 0.1度 >"))
((= n 81)(command "ROTATE" SSet "" p1 0.1)(princ "\r< Q 0.1度 >"))
((= n 119)(command "ROTATE" SSet "" p1 -0.1)(princ "\r< w -0.1度 >"))
((= n 87)(command "ROTATE" SSet "" p1 -0.1)(princ "\r< W -0.1度 >"))
((= n 97) (command "ROTATE" SSet "" p1 1)(princ "\r< a1度>"))
((= n 65) (command "ROTATE" SSet "" p1 1)(princ "\r< A1度>"))
((= n 115)(command "ROTATE" SSet "" p1 -1)(princ "\r< s -1度>"))
((= n 83)(command "ROTATE" SSet "" p1 -1)(princ "\r< S -1度>"))
((= n 32))
)
);while
(setvar "CMDECHO" cmd)
(princ)
)
Andyhon 发表于 2015-8-21 08:53 static/image/common/back.gif
(SETQ SSet (SSGET))
...
(setq p1 (getpoint "指定基点: "))
对,弧线不同,但是弧心是同一点也是上一点 ZZXXQQ 发表于 2015-8-21 09:18 static/image/common/back.gif
Z版,程序运行到旋转那一步时,没什么反应呢,另外,貌似没有“右键默认上一次基点”的作用 既是 以弧线的圆心为基点旋转
那为何还要有 这句
(setq p1 (getpoint "指定基点: "))
不会做右键
改了个不用左键,键盘操作的,不知道是不是楼主想要的
(DEFUN C:kr (/ cmd loop SSet KeyList n step BasePoint0 BasePoint1 BasePoint2)
(SETQ cmd (GETVAR "CMDECHO"))
(SETVAR "CMDECHO" 0)
(SETQ loop 1)
(WHILE loop
(PROMPT "\n 选择对象 : ")
(SETQ SSet (SSGET))
(COND
((NULL SSet)(ALERT "没有选中对象!"))
(T (SETQ loop nil))
)
)
;(setq p1 (getpoint "指定基点: "))
(if p1
(progn
(setq w (getstring "\n是否以上次的旋转点为基点(确认请直接回车,重新选取点请按任意键) : "))
(if (= w "") (setq p1 p1)
(progn
(setq en (entsel "\n选择圆弧(中心为旋转基点): "))
(setq el (entget(car en)))
(setq en_typ (cdr (assoc 0 el)))
(if (or (= en_typ "ARC")(= en_typ "CIRCLE"))
(setq p1 (cdr (assoc 10 el)))
(progn
(setq loop t)
(while loop
(setq en (entsel "\n选择圆弧(中心为旋转基点): "))
(setq en_typ (cdr (assoc 0 (entget(car en)))))
(if (or (= en_typ "ARC")(= en_typ "CIRCLE"))
(setq loop nil)
(setq loop t))
)))))))
(PRINC "\n Press key:")
(PRINC "\n\t 《Q键 0.1度》《W键 -0.1度》 ")
(PRINC "\n\t 《A键 1度》《S键 -1度》 ")
(TERPRI)
(SETQ KeyList '(3249 50 65 68 81 83 87 119 101 113 32 115 97 100))
(WHILE (and(/= (SETQ n (CADR (GRREAD))) 13)
(MEMBER n KeyList))
(COND
((= n 113)(COMMAND "ROTATE" SSet "" p1 0.1)(PRINC "\r< q 0.1度 >"))
((= n 81)(COMMAND "ROTATE" SSet "" p1 0.1)(PRINC "\r< Q 0.1度 >"))
((= n 119)(COMMAND "ROTATE" SSet "" p1 -0.1)(PRINC "\r< w -0.1度 >"))
((= n 87)(COMMAND "ROTATE" SSet "" p1 -0.1)(PRINC "\r< W -0.1度 >"))
((= n 97) (COMMAND "ROTATE" SSet "" p1 1)(PRINC "\r< a1度>"))
((= n 65) (COMMAND "ROTATE" SSet "" p1 1)(PRINC "\r< A1度>"))
((= n 115)(COMMAND "ROTATE" SSet "" p1 -1)(PRINC "\r< s -1度>"))
((= n 83)(COMMAND "ROTATE" SSet "" p1 -1)(PRINC "\r< S -1度>"))
((= n 32))
)
);WHILE
(SETVAR "CMDECHO" cmd)
(PRINC)
) feng83 发表于 2015-8-21 19:28 static/image/common/back.gif
不会做右键
改了个不用左键,键盘操作的,不知道是不是楼主想要的
(DEFUN C:kr (/ cmd l ...
朋友,选择完需要旋转的图元之后怎么就没反映了? ZZXXQQ 发表于 2015-8-21 09:18 static/image/common/back.gif
长老,程序还有点小问题哦,有时间还请再看一下
页:
[1]
2