weiqi 发表于 2013-6-3 17:28:35

求复制的时候 动态旋转角度

求复制COPY的时候 动态旋转角度

如COPY 选好对象 基点后然后按键盘 空格时 对象 旋转了90度~

jicqj 发表于 2013-6-3 17:28:36

本帖最后由 jicqj 于 2013-6-5 21:24 编辑

这个能否满足你的要求

z394326635 发表于 2013-6-3 18:22:24

weiqi 发表于 2013-6-3 18:34:30

本帖最后由 weiqi 于 2013-6-3 18:59 编辑

就是把复制的功能 加上这个效果~~http://bbs.mjtd.com/thread-99379-1-1.html

wowan1314 发表于 2013-6-3 19:09:32

本帖最后由 wowan1314 于 2013-6-3 19:11 编辑

这个想法好! 天正软件中就有这样的程序! 叫“自由拷贝”,还有个命令叫“自由粘贴”的。

自由拷贝 倒是可以实现。 不过 自由粘贴估计是LISP实现不了

说下我对自由拷贝的思路:
1、选择物体,选择基点。然后原位将选择集复制一遍。
2、用GRREAD函数循环,当鼠标移动时就把复制出的选择集由基点MOVE到鼠标点位置。
3、如果是 按A就把复制出的选择集以鼠标点位置为基准点旋转90度,其他W,S.D一样的处理方式。
4、当左键点击时结束GRREAD循环.
5、如果点的是右键那么久删除复制出的选择集。

weiqi 发表于 2013-6-3 19:46:24

本帖最后由 weiqi 于 2013-6-3 20:12 编辑



(defun c:fz ()
(prompt "\n请选择复制旋转的对象:")
(if (and (setq ss (ssget))
    (setq pt (getpoint "\n选择基点:"))
      )
(c:qq)


)
)




(defun c:qq ()

   (setq la (entlast))
      (princ "\n请指点目标点:")
      (command "copy" ss "" pt pause)
      (setq newss (ssadd))
      (while (setq la (entnext la)) (ssadd la newss))
      (princ "\n指定旋转角度或 [参照(R)]:")
      ;;(command "rotate" newss "" "non" "@" pause)
    (SETQ SSet1 newss)
       (XZ)
)











;;; ----------------------------------------------------------------------------
;;; ----------------------= = = =主 函 数= = = =------------------------
;;; ----------------------------------------------------------------------------
;;;                            ( 通过键盘旋转目标 )                           
;;; ----------------------------------------------------------------------------
(DEFUN xz (/ 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 "l"))
(COND
   ((NULL SSet)(ALERT "没有选中对象!"))
   (T (SETQ loop nil))
)
)
(setq p1 (getpoint "指定基点: "))
(PRINC "\n Press key:")
(PRINC "\n\t 《1键- 1度》《2键-1度》《Q键 15度》《W键 -15度》《E键 45度》   ")
(PRINC "\n\t 《A键 90度》《E键 -90度》 《D键 180度》")
(TERPRI)
(SETQ KeyList '(3249 50 65 68 81 83 87 119 101 113 32 115 97 100))
(WHILE (/= (SETQ n (CADR (GRREAD))) 13)
(if (MEMBER n KeyList)
   (COND
((= n 49)(COMMAND "ROTATE" SSet "" p1 1)(PRINC "\r< +1度 >"))
((= n 50)(COMMAND "ROTATE" SSet "" p1 -1)(PRINC "\r< -1度 >"))

    ((= n 113)(COMMAND "ROTATE" SSet "" p1 15)(PRINC "\r< q 15度 >"))
    ((= n 81)(COMMAND "ROTATE" SSet "" p1 15)(PRINC "\r< Q 15度 >"))

    ((= n 119)(COMMAND "ROTATE" SSet "" p1 -15)(PRINC "\r< w -15度 >"))
    ((= n 87)(COMMAND "ROTATE" SSet "" p1 -15)(PRINC "\r< W -15度 >"))

    ((= n 101)(COMMAND "ROTATE" SSet "" p1 45)(PRINC "\r< e 45度 >"))
    ((= n 69)(COMMAND "ROTATE" SSet "" p1 45)(PRINC "\r< E45度 >"))

    ((= n 115)(COMMAND "ROTATE" SSet "" p1 -90)(PRINC "\r< s -90度 >"))
    ((= n 83)(COMMAND "ROTATE" SSet "" p1 -90)(PRINC "\r< S -90度 >"))

    ((= n 97) (COMMAND "ROTATE" SSet "" p1 90)(PRINC "\r< a90度>"))
    ((= n 65) (COMMAND "ROTATE" SSet "" p1 90)(PRINC "\r< A90度>"))

    ((= n 100)(COMMAND "ROTATE" SSet "" p1 180)(PRINC "\r< d 180度>"))
    ((= n 68)(COMMAND "ROTATE" SSet "" p1 180)(PRINC "\r< D 180度>"))

    ((= n 32)(COMMAND "ROTATE" SSet "" p1 -45)(PRINC "\r<空格-45度>"))

   )
)
);WHILE
(SETVAR "CMDECHO" cmd)
(PRINC)
)
(PRINC "按键旋转1 2 q w e a s d 命令XZ ")



有几个问题,(ssget "l") 怎么是多个对象

mccad 发表于 2013-6-3 22:10:35

这个太简单了,不需要复杂的程序:;;复制旋转对象
(defun c:cr ()
(setq ent (ssget))
(command "copy" ent "" pause "@" "rotate" "p" "" "@")
)

edsion24 发表于 2013-6-4 09:09:28

请问能不能加上根据旁边的线来改变块的角度的功能 谢谢 哈哈

cre8or 发表于 2013-6-4 17:57:20

不用天正的人表示 其实ctrl+v之后 输入r+角度就是旋转 s+数字就是缩放或者镜像 方便得很 干吗要用到天正那么不稳定的东西

669423907 发表于 2013-6-4 21:59:27

(defun c:Q1()
(setq ent (ssget))
(command "copy" ent "")
(while (= 1 (getvar "cmdactive")) (command pause))
(command pause "@" "rotate" (entlast) "" "@"))
页: [1] 2
查看完整版本: 求复制的时候 动态旋转角度