明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10126|回复: 44

[源码] 连续复制3.0(解决属性块问题)

    [复制链接]
发表于 2016-3-27 21:53 | 显示全部楼层 |阅读模式
本帖最后由 langjs 于 2022-6-9 21:35 编辑


;;; __________________________________________
;;; 连续复制3.0     langjs         2021.07.25
;;; 命令:fz      右键默认距离复制  esc键退出
;;; __________________________________________
(defun c:fz (/ #err4 $orr d en p0 p1 r snap ss)
  (defun ssnext (en / ss)
    (setq ss (ssadd))
    (while (setq en (entnext en))
      (if (not (member (cdr (assoc 0 (entget en))) (list "ATTRIB" "VERTEX" "SEQEND")))
        (setq ss (ssadd en ss)))) ss)
  (defun #err4 (s)
    (command ".UNDO" "E")
    (setvar "osmode" snap)
    (setq *error* $orr))
  (setq snap (getvar "osmode"))
  (setvar "cmdecho" 0)
  (setq $orr *error* *error* #err4 )
  (if (setq ss (ssget))
    (if (setq p0 (getpoint "\n指定基点:"))
      (progn
        (while t
          (command ".UNDO" "BE")
          (princ "\n指定下一点或距离:")
          (if d (progn (setvar "osmode" 0) (princ (strcat "<" (rtos d) ">:"))))
          (setq en (entlast))
          (command ".copy" ss "" p0 pause)
          (command ".erase" (ssnext en) "")
          (setq p1 (getvar "lastpoint"))
          (if (equal p0 p1 1e-8)
            (setq p1 (polar p0 r d))
            (setq d (distance p0 p1)  r (angle p0 p1)))
          (if (not (equal p0 p1 1e-8))
            (progn
              (setq en (entlast))
              (command ".copy" ss "" p0 p1)
              (setq ss (ssnext en)  p0 p1 ) ) )
          (command ".UNDO" "E")))))
  (setq *error* $orr)
  (princ)
)



评分

参与人数 6明经币 +6 金钱 +10 收起 理由
magicheno + 1 赞一个!
eii + 1 赞一个!
wayne_myles + 1 6666 高手永远领先一步
lucas_3333 + 1 + 10
USER2128 + 1 赞一个!
tryhi + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2019-1-24 20:31 | 显示全部楼层
tryhi 发表于 2016-3-27 23:31
写得不错,稍微修改了下后自用,主要改了两个地方,复制时保持原有的捕捉设置,不强制设置为0,还有就是复 ...

想改为:空格键按上次的距离和方向复制图元,右键退出不知道怎么改
回复 支持 0 反对 1

使用道具 举报

发表于 2016-3-27 23:31 | 显示全部楼层
本帖最后由 tryhi 于 2016-4-4 17:02 编辑
  1. ;;; __________________________________________
  2. ;;; 连续复制     改编自langjs         2016.03.27
  3. ;;; 命令:fz      右键默认距离复制  esc键退出
  4. ;;; __________________________________________
  5. (defun c:fz (/ *error* d en p0 p1 p2 r snap ss ssnext)
  6.   (defun ssnext (en / ss)
  7.     (setq ss (ssadd))
  8.     (while (setq en (entnext en))(ssadd en ss))
  9.         )
  10.   (defun *error* (s)(command ".UNDO" "E"))
  11.   (setq snap (getvar "osmode"))
  12.   (setvar "cmdecho" 0)
  13.   (if (setq ss (ssget))
  14.     (if (setq p0 (getpoint "\n指定基点:"))
  15.       (progn(command ".UNDO" "BE")
  16.         (while t (princ "\n指定下一点或距离:")
  17.           (if d (princ (strcat "<" (rtos d) ">:")))
  18.           (setq en (entlast))
  19.           (command ".copy" ss "" p0 pause)
  20.           (setq p1 (getvar "lastpoint")p2 (mapcar '+ p1 p1))
  21.           (if (equal p0 p1)
  22.                                                 (progn
  23.                                                         (setq p1 (polar p0 r d))
  24.                                                         (if (< snap 16384)(setvar "osmode" (+ snap 16384)))
  25.                                                         (command ".move" (ssnext en) "" p2 p1)
  26.                                                         (setvar "osmode" snap)
  27.                                                         (setq snap (getvar "osmode"))
  28.                                                 )
  29.                                                 (setq d (distance p0 p1) r (angle p0 p1)))
  30.           (setq ss (ssnext en) p0 p1 )
  31.                                 )
  32.                         )
  33.                 )
  34.         )
  35.   (princ)
  36. )
写得不错,稍微修改了下后自用,主要改了两个地方,复制时保持原有的捕捉设置,不强制设置为0,还有就是复制的时候不采取先复制后删除的方式,这样对于大量图形可以明显提高速度。还有就是退出函数你这样写有点多余,直接局部定义*error*即可

点评

在UCS环境下测试出错,将(equal p0 p1)改为(equal p0 p1 1e-8)后又正常了,不知道为什么。  发表于 2019-12-25 16:20

评分

参与人数 4明经币 +5 金钱 +15 收起 理由
langjs + 2 改的非常好,谢谢
土青蛙阿不 + 1 + 5 神马都是浮云
lucas_3333 + 1 + 10
USER2128 + 1 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2023-6-28 17:29 | 显示全部楼层
tryhi 发表于 2016-3-27 23:31
写得不错,稍微修改了下后自用,主要改了两个地方,复制时保持原有的捕捉设置,不强制设置为0,还有就是复 ...

指定下一点或距离:<647.3>:*取消*
原因:函数被取消 位置-> 行:19 列:12

CAD2007  出错 同时无法还原捕捉
发表于 2016-3-28 00:17 | 显示全部楼层
发表于 2016-3-28 08:46 | 显示全部楼层
感谢分享学习!!!!
发表于 2016-3-28 08:55 | 显示全部楼层
发表于 2016-3-28 11:01 | 显示全部楼层
mark 一下,以备不时之需
发表于 2016-3-30 11:47 | 显示全部楼层
好东西,谢谢分享
发表于 2016-3-31 09:36 | 显示全部楼层
怎么复制下来用不了
发表于 2016-3-31 10:08 | 显示全部楼层
使用的时候,命令栏有乱码,请问这个是什么原因?
发表于 2016-3-31 21:20 | 显示全部楼层
需要成品yige哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 11:41 , Processed in 1.121019 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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