找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1473|回复: 6

[分享]:★★★★★沿某方向阵列复制功能,高手帮忙改善一下。

[复制链接]
发表于 2009-3-6 14:06:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
;★沿某方向阵列复制_[源自海龙工具箱 zhl-soft.ys168.com 20090218]
(defun c:zhl_cv ( / #copy a ang dbasepoint dist distp dtopoint eastp entcopy input item msg n northp operation orthm p0 p1 p2 sent snapa southp sslist westp)
(setvar "CMDECHO" 0)
(defun DynArray_go ( NP / entcopy )
(vl-cmdf "._copy" item "" Dbasepoint P0)
(setq entcopy (entlast))
(setq SSlist (append SSlist (list entcopy)))  
)
(defun DarrayOrthoMode0 ()
(setq input (grread t 4 4))
(setq DtoPoint (cadr input))
)
(defun DarrayOrthoMode1 (/ distP NorthP WestP EastP SouthP)
    (setq distP (distance Dbasepoint DtoPoint))
    (setq NorthP (polar Dbasepoint (+ snapA (dtr 90)) distP))
    (setq WestP  (polar Dbasepoint (+ snapA (dtr 180)) distP))
    (setq EastP  (polar Dbasepoint snapA distP))
    (setq SouthP (polar Dbasepoint (- snapA (dtr 90)) distP))
(if (and
      (< (distance DtoPoint NorthP) (distance DtoPoint WestP))
      (< (distance DtoPoint NorthP) (distance DtoPoint EastP))
      (< (distance DtoPoint NorthP) (distance DtoPoint SouthP))
    )
(setq DtoPoint NorthP)
)
(if (and
      (< (distance DtoPoint WestP) (distance DtoPoint NorthP))
      (< (distance DtoPoint WestP) (distance DtoPoint EastP))
      (< (distance DtoPoint WestP) (distance DtoPoint SouthP))
    )
(setq DtoPoint WestP)
)  
(if (and
      (< (distance DtoPoint EastP) (distance DtoPoint WestP))
      (< (distance DtoPoint EastP) (distance DtoPoint NorthP))
      (< (distance DtoPoint EastP) (distance DtoPoint SouthP))
    )
(setq DtoPoint EastP)
)
(if (and
      (< (distance DtoPoint SouthP) (distance DtoPoint WestP))
      (< (distance DtoPoint SouthP) (distance DtoPoint EastP))
      (< (distance DtoPoint SouthP) (distance DtoPoint NorthP))
    )
(setq DtoPoint SouthP)
)  
)
(defun dtr (a)
(* pi (/ a 180.0))
)
(defun rtd (a)
(/ (* a 180) pi)
)
  (defun *error* (msg)
    (if        SSlist
      (progn
        (foreach n SSlist
          (vl-cmdf "._explode" n)
        )
        (setq SSlist nil)
      )
    )
(if _{DarrayBlock}_
(progn
    (vl-cmdf "._explode" item)
    (vl-cmdf "._-purge" "_B" "_{DarrayBlock}_" "_N")
  )))
(if _{DarrayBlock}_
(vl-cmdf "._-purge" "_B" "_{DarrayBlock}_" "_N")
)
  (setq sent (ssget))
  (setq p1 (getpoint "\n复制的起点:"))
  (setq p2 (getpoint p1 "\n复制的终点(输入距离或点取):"))
  (setq Dbasepoint p1)
  (vla-StartUndoMark
    (vla-get-ActiveDocument (vlax-get-ACAD-Object))
  )
  (vl-cmdf "._-block" "_{DarrayBlock}_" Dbasepoint sent "")
  (vl-cmdf "._-insert" "_{DarrayBlock}_" Dbasepoint "" "" "")
  (setq item (entlast))
(setq snapA (getvar "snapang"))
(setq orthm (getvar "ORTHOMODE"))
  (while (or
           (and (setq input (grread t 4 4))(= (car input) 5))
           (and (= (car input) 2) (= (cadr input) 15))          ; F8 Orthomode                  
         )
(setq P0 p1)
(if (= (car input) 5) (setq DtoPoint (cadr input)))
(if (and (= (car input) 2)(= (cadr input) 15))
  (setq Operation "ORTHO")
)
(if (eq Operation "ORTHO")
  (progn
    (if (eq orthm 1)
      (progn (setvar "ORTHOMODE" 0) (setq orthm 0))
      (progn (setvar "ORTHOMODE" 1) (setq orthm 1))
         )
    (setq Operation nil)
  )
)
(if (eq orthM 1)
  (DarrayOrthoMode1)
)      
    (setq ang (angle p1 p2))
(setq #Copy ( + 1 (fix (/ (distance Dbasepoint DtoPoint) (distance p1 p2)))) )
    (setq dist (distance p1 p2))
    (if        SSlist
      (progn
        (foreach n SSlist
          (vl-cmdf "._erase" n "")
          (princ)
        )
        (setq SSlist nil)
      )
    )
    (repeat (1- #Copy)
      (setq P0 (polar P0 ang dist))
      (DynArray_go P0)
      (princ)
    )
  )
(redraw)
  (if SSlist
    (progn
      (foreach n SSlist
        (vl-cmdf "._explode" n)
      )
      (setq SSlist nil)
    )
  )
  (vl-cmdf "._explode" item)
  (vl-cmdf "._-purge" "_B" "_{DarrayBlock}_" "_N")
  (vla-EndUndoMark
    (vla-get-ActiveDocument (vlax-get-ACAD-Object))
  )
  (princ)
)
哪位高手帮忙改善一下:
如果执行此功能中途按ESC的话不会执行(vl-cmdf "._explode" item)
还有就是(redraw),如果物体较多的话会很慢,可不可以:点击左键才(redraw),点击右键才是确定呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2009-3-6 15:11:29 | 显示全部楼层
我也有个类似的。。。
方向递增。。。
要不要给你参考参考
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-6 16:50:58 | 显示全部楼层
太好了,可不可以发到我邮箱里?
user-zhl@163.com,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-3-6 18:19:01 | 显示全部楼层
不行。。。
你都出自己的工具箱了

楼主也算不错的啦。

看完动画应该就知道怎么写了。。。

呵呵

偶只是给你提供个思路。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-6 22:27:00 | 显示全部楼层

跟我以前的这样差不多吧

命令CV
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-3-8 17:32:47 | 显示全部楼层
我也有个
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-9 09:47:14 | 显示全部楼层
我的这个就是(redraw),很慢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 00:50 , Processed in 0.188126 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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