找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 890|回复: 5

[每日一码] 用entmakex实现对象拷贝

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-5-8 20:18:51 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 marting 于 2017-5-8 20:20 编辑

适合的对象有 点,曲线,(多行)文字,块

  1. (defun C:TT (/ e etyp bp dp vec)
  2.   (and
  3.     (progn
  4.       (setvar 'errno 0)
  5.       (while (/= 52 (getvar 'errno))
  6.         (setq e (car (entsel "\nSelect entity to be copied <exit>: ")))
  7.         (cond
  8.           ((= 7 (getvar 'errno))
  9.             (princ "\nMissed.")
  10.             (setvar 'errno 0)
  11.           )
  12.           ((eq 'ENAME (type e))
  13.             (setvar 'errno 52)
  14.           )
  15.         )                              
  16.       )                                       
  17.       e
  18.     )                                       
  19.     (setq etyp (cdr (assoc 0 (entget e))))
  20.     (setq bp (getpoint "\nBase point: "))
  21.     (setq dp (getpoint bp "\nDestination point: "))
  22.     (setq vec (trans (mapcar
  23.                        '-
  24.                        dp
  25.                        bp
  26.                      ) 1 (cond
  27.                            ((wcmatch etyp
  28.                                      "LWPOLYLINE,CIRCLE,ARC,TEXT,INSERT"
  29.                             )
  30.                              e
  31.                            )
  32.                            ((wcmatch etyp "LINE,ELLIPSE,MTEXT,POINT")
  33.                              0
  34.                            )
  35.                            (T
  36.                              0
  37.                            )               
  38.                          )               
  39.               )
  40.     )
  41.     (entmakex (mapcar
  42.                 '(lambda (x)
  43.                    (cond
  44.                      ((= (car x) 10)
  45.                        (cons 10 (mapcar
  46.                                   '+
  47.                                   (cdr x)
  48.                                   vec
  49.                                 )
  50.                        )
  51.                      )
  52.                      ((and
  53.                         (= (car x) 11)
  54.                         (not (wcmatch etyp "XLINE,ELLIPSE"))
  55.                       )
  56.                        (cons 11 (mapcar
  57.                                   '+
  58.                                   (cdr x)
  59.                                   vec
  60.                                 )
  61.                        )
  62.                      )
  63.                      (T
  64.                        x
  65.                      )
  66.                    )                       
  67.                  )                       
  68.                 (entget e)
  69.               )                              
  70.     )                                       
  71.   )                                       
  72. )



另一个

  1. ; Vanilla copy/move excercise:
  2. (defun C:test ( / e etyp bp dp vec vece vecw )
  3.   (and
  4.     (progn
  5.       (setvar 'errno 0)
  6.       (while (/= 52 (getvar 'errno))
  7.         (setq e (car (entsel "\nSelect entity to be copied <exit>: ")))
  8.         (cond
  9.           ( (= 7 (getvar 'errno)) (princ "\nMissed.") (setvar 'errno 0) )
  10.           ( (eq 'ENAME (type e)) (setvar 'errno 52) )
  11.         ); cond
  12.       ); while
  13.       e
  14.     ); progn
  15.     (setq etyp (cdr (assoc 0 (entget e))))
  16.     (setq bp (getpoint "\nBase point: "))
  17.     (setq dp (getpoint bp "\nDestination point: "))
  18.     (setq vec (mapcar '- dp bp)) ;;; vector in UCS
  19.     (setq vece (mapcar '- (trans dp 1 e) (trans bp 1 e))) ;;; vector in OCS ;;; vece /= (trans vec 1 e) ;;; (mapcar '- (trans dp 1 e) (trans bp 1 e)) = (mapcar '- (trans vec 1 e) (trans '(0.0 0.0 0.0) 1 e)) /= (trans vec 1 e)
  20.     (setq vecw (mapcar '- (trans dp 1 0) (trans bp 1 0))) ;;; vector in WCS ;;; vecw /= (trans vec 1 0) ;;; (mapcar '- (trans dp 1 0) (trans bp 1 0)) = (mapcar '- (trans vec 1 0) (trans '(0.0 0.0 0.0) 1 0)) /= (trans vec 1 0)
  21.     ;|
  22.     (setq vece (mapcar '- (trans vec 1 e) (trans '(0.0 0.0 0.0) 1 e)))
  23.     (setq vecw (mapcar '- (trans vec 1 0) (trans '(0.0 0.0 0.0) 1 0)))
  24.     |;
  25.     ;;; either versions of vece and vecw are correct
  26.     (entmakex
  27.       (mapcar
  28.         '(lambda (x)
  29.           (cond
  30.             ( (and (= (car x) 10) (wcmatch etyp "LWPOLYLINE,CIRCLE,ARC,TEXT,INSERT"))
  31.               (cons 10 (mapcar '+ (cdr x) vece))
  32.             )
  33.             ( (and (= (car x) 10) (wcmatch etyp "LINE,MTEXT,POINT"))
  34.               (cons 10 (mapcar '+ (cdr x) vecw))
  35.             )
  36.             ( (and (= (car x) 11) (wcmatch etyp "LINE"))
  37.               (cons 11 (mapcar '+ (cdr x) vecw))
  38.             )
  39.             (T x)
  40.           ); cond
  41.         ); lambda
  42.         (entget e)
  43.       ); mapcar
  44.     ); entmakex / entmod
  45.   ); and
  46. ); defun

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

已领礼包: 773个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 2211个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2017-6-22 16:32:29 | 显示全部楼层
中国人就应该写中文注释,搞得好像是国外哪个网站抄来似的。另外entmake不支持的对象太多,用来复制恐怕比不上command和vla-copy
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 104个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 6056个

财富等级: 富甲天下

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 02:27 , Processed in 0.502137 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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