明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1900|回复: 13

[提问] 【一个关于旋转的程序求小改】

[复制链接]
发表于 2015-8-20 23:35 | 显示全部楼层 |阅读模式
20明经币
有如下程序,功能是选择对象后,能通过键盘按钮在一定步长值下连续动态旋转,现在希望增加如下一个设置:
1.选择需要旋转的对象
2.选择弧线,以弧线的圆心为基点旋转刚选择的对象(第2步时,默认上一次选择的旋转基点,如果没有上一次,则提示选择弧线)
程序的提示顺序是这样的:选择要旋转的对象-----选择弧线获取圆心作为旋转基点(右键默认上一次基点)-----通过键盘按键旋转目标


下面已有的程序中,只需要将第2步加入即可,期待高手帮忙!
;;; -------------------------------------------------------------------------------------------------------------------

;;;      通过键盘旋转目标
;;;     By  weiqi ,孤帆修改  http://bbs.mjtd.com/forum.php?mo ... &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 '(32  49 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< a  1度>"))
    ((= n 65) (COMMAND "ROTATE" SSet "" p1 1)(PRINC "\r< A  1度>"))
    ((= 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)
)

最佳答案

查看完整内容

修改了一下Z版的程序,感觉舒服了。。。
发表于 2015-8-20 23:35 | 显示全部楼层
本帖最后由 vectra 于 2015-8-22 11:05 编辑
fire9527 发表于 2015-8-22 08:18
长老,程序还有点小问题哦,有时间还请再看一下

修改了一下Z版的程序,感觉舒服了。。。

  1. (if (null *last-rotate-point*)
  2.   (setq *last-rotate-point* '(0 0 0))
  3. )

  4. (defun pick-rotate-point (/ p ent)
  5.   (initget "A")
  6.   (setq
  7.     p (getpoint
  8.         (strcat "\n指定旋转基点或 [选择弧心(A)] <" (vl-princ-to-string *last-rotate-point*) ">:")
  9.       )
  10.   )

  11.   (cond        ((= p "A")
  12.          (while        (not (listp p))
  13.            (if (and (setq ent (entsel "\n选择圆或圆弧:"))
  14.                     (setq ent (entget (car ent)))
  15.                     (wcmatch (cdr (assoc 0 ent)) "ARC,CIRCLE")
  16.                )
  17.              (setq p (cdr (assoc 10 ent)))
  18.            )
  19.          )
  20.         )
  21.         ((null p)
  22.          (setq p *last-rotate-point*)
  23.         )
  24.   )
  25.   (setq *last-rotate-point* p)
  26. )



  27. (defun c:kr (/ cmd gr n p1 sset)
  28.   (setq cmd (getvar "CMDECHO"))
  29.   (setvar "CMDECHO" 0)

  30.   (if (setq sset (ssget))
  31.     (progn
  32.       (setq p1 (pick-rotate-point))

  33.       (princ "\n按 Q/W +/-0.1度, A/S +/-1度, 空格回车或左\右键退出:")

  34.       (while (and (/= (car (setq gr (grread nil 15))) 3)
  35.                   (not (equal gr '(2 32)))
  36.                   (not (equal gr '(2 13)))
  37.                   (not (equal (car gr) 11))
  38.                   (not (equal (car gr) 25))
  39.              )
  40.         (setq n (cadr gr))
  41.         (cond
  42.           ((or (= n 81) (= n 113)) ;_ Qq
  43.            (command "ROTATE" sset "" p1 0.1)
  44.           )
  45.           ((or (= n 87) (= n 119)) ;_ Rr
  46.            (command "ROTATE" sset "" p1 -0.1)
  47.           )
  48.           ((or (= n 65) (= n 97)) ;_ Aa
  49.            (command "ROTATE" sset "" p1 1)
  50.           )
  51.           ((or (= n 83) (= n 115)) ;_Ss
  52.            (command "ROTATE" sset "" p1 -1)
  53.           )
  54.         )
  55.       )
  56.     )
  57.   )

  58.   (setvar "CMDECHO" cmd)
  59.   (princ)
  60. )

点评

指定旋转基点或 [选择弧心(A)] <(1.37976e+006 2.84816e+006 0.0)>: 正如我想要的,非常感谢Z版,感谢你!美中不足的是提示里后面那些数字可以不显示吗?  发表于 2015-8-22 11:47
感谢回复!  发表于 2015-8-22 11:39
回复

使用道具 举报

发表于 2015-8-21 08:53 | 显示全部楼层
(SETQ SSet (SSGET))
  ...
(setq p1 (getpoint "指定基点: "))


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

使用道具 举报

发表于 2015-8-21 09:18 | 显示全部楼层
本帖最后由 ZZXXQQ 于 2015-8-23 17:43 编辑
  1. ;;;通过键盘旋转目标
  2. ;;;By  weiqi,孤帆修改  <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
  3. ;弧心旋转 2015.8.22 ZZXXQQ 改
  4. (defun C:kr (/ cmd loop SSet KeyList n p1)
  5. (setq cmd (getvar "CMDECHO"))
  6. (setvar "CMDECHO" 0)
  7. (setq loop T)
  8. (while loop
  9.   (prompt "\n 选择对象 : ")
  10.   (if (setq SSet (ssget))
  11.    (setq loop nil)
  12.    (alert "没有选中对象!")
  13.   )
  14. )
  15. ;(setq p1 (getpoint "指定基点: "))
  16. (if (and (setq s1 (entsel "\n选择圆弧(中心为旋转基点): "))
  17.          (setq ent (entget(car s1)))
  18.          (wcmatch (cdr(assoc 0 ent)) "ARC,CIRCLE"))
  19. (setq p1 (cdr(assoc 10 ent)))
  20. (if (not(listp p1)) (setq p1 '(0 0)))
  21. )
  22. (princ "\n Press key:\n\t 《Q键 0.1度》《W键 -0.1度》\n\t 《A键 1度》《S键 -1度》")
  23. (terpri)
  24. ;(setq KeyList '(32  49 50 65 68 81 83 87 119 101 113 32 115 97 100))
  25. (setq KeyList '(32 65 81 83 87 97 113 115 119))
  26. (while (and(/= (setq n (cadr (grread))) 13)
  27.   (member n KeyList))
  28.    (cond
  29.     ((= n 113)(command "ROTATE" SSet "" p1 0.1)(princ "\r< q 0.1度 >"))
  30.     ((= n 81)(command "ROTATE" SSet "" p1 0.1)(princ "\r< Q 0.1度 >"))
  31.     ((= n 119)(command "ROTATE" SSet "" p1 -0.1)(princ "\r< w -0.1度 >"))
  32.     ((= n 87)(command "ROTATE" SSet "" p1 -0.1)(princ "\r< W -0.1度 >"))
  33.     ((= n 97) (command "ROTATE" SSet "" p1 1)(princ "\r< a  1度>"))
  34.     ((= n 65) (command "ROTATE" SSet "" p1 1)(princ "\r< A  1度>"))
  35.     ((= n 115)(command "ROTATE" SSet "" p1 -1)(princ "\r< s -1度>"))
  36.     ((= n 83)(command "ROTATE" SSet "" p1 -1)(princ "\r< S -1度>"))
  37.     ((= n 32))
  38.   )
  39. );while
  40. (setvar "CMDECHO" cmd)
  41. (princ)
  42. )

评分

参与人数 1明经币 +1 收起 理由
fire9527 + 1 感谢回复!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-8-21 14:03 | 显示全部楼层
Andyhon 发表于 2015-8-21 08:53
(SETQ SSet (SSGET))
  ...
(setq p1 (getpoint "指定基点: "))

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

点评

板凳已改。再试试。  发表于 2015-8-22 08:18
回复

使用道具 举报

 楼主| 发表于 2015-8-21 14:14 | 显示全部楼层
ZZXXQQ 发表于 2015-8-21 09:18

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

使用道具 举报

发表于 2015-8-21 18:24 | 显示全部楼层
既是 以弧线的圆心为基点旋转

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

回复

使用道具 举报

发表于 2015-8-21 19:28 | 显示全部楼层
不会做右键 [em0][em0][em0]
改了个不用左键,键盘操作的,不知道是不是楼主想要的
(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 '(32  49 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< a  1度>"))
    ((= n 65) (COMMAND "ROTATE" SSet "" p1 1)(PRINC "\r< A  1度>"))
    ((= 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)
)

评分

参与人数 1明经币 +1 收起 理由
fire9527 + 1 感谢回复!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-8-22 08:16 | 显示全部楼层
feng83 发表于 2015-8-21 19:28
不会做右键
改了个不用左键,键盘操作的,不知道是不是楼主想要的
(DEFUN C:kr (/ cmd l ...

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

使用道具 举报

 楼主| 发表于 2015-8-22 08:18 | 显示全部楼层
ZZXXQQ 发表于 2015-8-21 09:18

长老,程序还有点小问题哦,有时间还请再看一下

点评

板凳已改。再试试。  发表于 2015-8-22 08:21
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-18 15:27 , Processed in 0.270188 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表