fire9527 发表于 2015-8-20 23:35:07

【一个关于旋转的程序求小改】

有如下程序,功能是选择对象后,能通过键盘按钮在一定步长值下连续动态旋转,现在希望增加如下一个设置:
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-20 23:35:08

本帖最后由 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)
)

Andyhon 发表于 2015-8-21 08:53:24

(SETQ SSet (SSGET))
...
(setq p1 (getpoint "指定基点: "))

第二次选择与上一次选择的弧线不同但 旋转基点 为同一共点弧心之意嗎?

ZZXXQQ 发表于 2015-8-21 09:18:49

本帖最后由 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)
)

fire9527 发表于 2015-8-21 14:03:28

Andyhon 发表于 2015-8-21 08:53 static/image/common/back.gif
(SETQ SSet (SSGET))
...
(setq p1 (getpoint "指定基点: "))


对,弧线不同,但是弧心是同一点也是上一点

fire9527 发表于 2015-8-21 14:14:03

ZZXXQQ 发表于 2015-8-21 09:18 static/image/common/back.gif


Z版,程序运行到旋转那一步时,没什么反应呢,另外,貌似没有“右键默认上一次基点”的作用

Andyhon 发表于 2015-8-21 18:24:03

既是 以弧线的圆心为基点旋转

那为何还要有 这句
(setq p1 (getpoint "指定基点: "))

feng83 发表于 2015-8-21 19:28:58

不会做右键
改了个不用左键,键盘操作的,不知道是不是楼主想要的
(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)
)

fire9527 发表于 2015-8-22 08:16:07

feng83 发表于 2015-8-21 19:28 static/image/common/back.gif
不会做右键
改了个不用左键,键盘操作的,不知道是不是楼主想要的
(DEFUN C:kr (/ cmd l ...

朋友,选择完需要旋转的图元之后怎么就没反映了?

fire9527 发表于 2015-8-22 08:18:14

ZZXXQQ 发表于 2015-8-21 09:18 static/image/common/back.gif


长老,程序还有点小问题哦,有时间还请再看一下
页: [1] 2
查看完整版本: 【一个关于旋转的程序求小改】