明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4535|回复: 10

[讨论] 【程序讨论】关于模仿天正自由复制的方法

[复制链接]
发表于 2013-6-20 13:43:58 | 显示全部楼层 |阅读模式
   多年来一直有个想法。想去模仿并扩展天正的“自由复制”命令。使其完全取代COPY命令。

但由于自身水平有限,且GRREAD函数不支持捕捉,而模拟捕捉点又会捕捉自身。所以久久未能成行。
今XD上有“裸奔的花猫”网友提出用GRVECS模仿实体来解决捕捉自身问题,看到些许希望,但仍不甚满意。

特来求助于大家,看是否还有其他办法实现。

我先发个不带捕捉的自由复制程序演示,让大家先了解下该程序的功能。
  1. (DEFUN C:T1 nil
  2.   (SETQ SS (SSGET ":L") PT (getpoint))
  3.   (setq size (* (getvar "viewsize") 2))
  4.   (command "_.copy" SS "" "0,0" "@")
  5.   (setq oldos (getvar "osmode"))
  6.   (setvar "osmode" 0)(setvar "cmdecho" 0)
  7.   (PRINC "\n 指定插入点或A旋转s上下镜像D左右镜像+放大一倍-缩小一倍T改基点")
  8.   (while PT
  9.     (setq BB (grread T 5 1))
  10.     (cond
  11.       ((= (car BB) 5) (SETQ PT1 (CADR BB))    (redRaw)
  12.          (GRVECS
  13.                (LIST -1 PT (mapcar '+ (LIST size 0 0) PT)
  14.                      -1 PT (mapcar '-  PT(LIST size 0 0))
  15.                      -1 PT (mapcar '-  PT(LIST  0 size 0))
  16.                      -1 PT (mapcar '+ (LIST  0 size 0) PT)
  17.                )
  18.           )
  19.          (COMMAND "MOVE" SS  "" PT PT1)(SETQ PT PT1)
  20.       )
  21.       ((= (car BB) 3) (SETQ PT NIL))
  22.       ((member BB '((2 97)(2 65)))
  23.        (COMMAND "ROTATE" SS "" PT1 90)
  24.       )
  25.       ((member BB '((2 115)(2 83)))
  26.        (COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(1 0)) "Y")
  27.       )
  28.       ((member BB '((2 100)(2 68)))
  29.        (COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(0 1)) "Y")
  30.       )
  31.       ((member BB '((2 43)(2 61)))
  32.        (COMMAND "scale" SS "" PT1 "2")
  33.       )
  34.       ((member BB '((2 116)(2 84)))
  35.        (setvar "osmode" oldos)(redRaw)
  36.        (setq pt (getpoint))
  37.        (setvar "osmode" 0)
  38.       )
  39.       ((equal BB '(2 45))
  40.        (COMMAND "scale" SS "" PT1 "0.5")
  41.       )
  42.     )
  43.   )
  44. (setvar "osmode" oldos)(redRaw)(princ)
  45. )

本帖子中包含更多资源

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

x

点评

"论坛不用功,老大徒伤悲!"  发表于 2013-6-20 14:08
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2013-6-20 13:44:30 | 显示全部楼层
本帖最后由 wowan1314 于 2013-6-20 13:46 编辑

再来发个带捕捉的“山寨自由复制”。 大家可看到模拟的捕捉会捕捉到自身而导致无法正确运行。
  1. (DEFUN C:T2 nil
  2.   (SETQ SS (SSGET ":L") PT (getpoint))
  3.   (setq size (* (getvar "viewsize") 2))
  4.   (command "_.copy" SS "" "0,0" "@")
  5.   (setq oldos (getvar "osmode"))
  6.   (setvar "osmode" 0)(setvar "cmdecho" 0)
  7.   (PRINC "\n 指定插入点或A旋转s上下镜像D左右镜像+放大一倍-缩小一倍T改基点")
  8.   (while PT
  9.     (setq BB (grread T 5 1))
  10.     (cond
  11.       ((= (car BB) 5) (SETQ PT1 (CADR BB))    (redRaw)
  12.      (if
  13.        (setq
  14.          nearpt (osnap PT1 "_END,_MID,INT")
  15.        )        ; 取得最近的捕捉点
  16.         (PROGN
  17.     (setq g2 nearpt)
  18.     (setq h    (/ (getvar "viewsize")
  19.            (cadr (getvar "screensize"))
  20.         )
  21.           d    (getvar "pickbox")
  22.           lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h))
  23.           ptx (car g2)
  24.           pty (cadr g2)
  25.     )
  26.     (foreach x lst
  27.       (setq  ptt1 (list (- ptx x) (- pty x))
  28.       ptt2 (list (+ ptx x) (- pty x))
  29.       ptt3 (list (+ ptx x) (+ pty x))
  30.       ptt4 (list (- ptx x) (+ pty x))
  31.       )
  32.       (grvecs (list 2 ptt1 ptt2 ptt2 ptt3 ptt3 ptt4 ptt4 ptt1))
  33.     )
  34.         )
  35.      )
  36.          (GRVECS
  37.                (LIST -1 PT (mapcar '+ (LIST size 0 0) PT)
  38.                      -1 PT (mapcar '-  PT(LIST size 0 0))
  39.                      -1 PT (mapcar '-  PT(LIST  0 size 0))
  40.                      -1 PT (mapcar '+ (LIST  0 size 0) PT)
  41.                )
  42.           )
  43.          (COMMAND "MOVE" SS  "" PT PT1)(SETQ PT PT1)
  44.       )
  45.       ((= (car BB) 3) (SETQ PT NIL))
  46.       ((member BB '((2 97)(2 65)))
  47.        (COMMAND "ROTATE" SS "" PT1 90)
  48.       )
  49.       ((member BB '((2 115)(2 83)))
  50.        (COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(1 0)) "Y")
  51.       )
  52.       ((member BB '((2 100)(2 68)))
  53.        (COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(0 1)) "Y")
  54.       )
  55.       ((member BB '((2 43)(2 61)))
  56.        (COMMAND "scale" SS "" PT1 "2")
  57.       )
  58.       ((member BB '((2 116)(2 84)))
  59.        (setvar "osmode" oldos)(redRaw)
  60.        (setq pt (getpoint))
  61.        (setvar "osmode" 0)
  62.       )
  63.       ((equal BB '(2 45))
  64.        (COMMAND "scale" SS "" PT1 "0.5")
  65.       )
  66.     )
  67.   )
  68. (setvar "osmode" oldos)(redRaw)(princ)
  69. )

本帖子中包含更多资源

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

x
 楼主| 发表于 2013-6-20 13:48:18 | 显示全部楼层
本帖最后由 wowan1314 于 2013-6-20 13:52 编辑

如何让模拟的捕捉,不去捕捉我要复制的实体呢?

我开始想到的是方案1、(模拟捕捉的时候同时选择实体,如果选择到的实体是要复制的实体中的一部分则不去模拟捕捉)
此方案估计不行,因为通过点获取实体,如果基点选到复制的实体上,那么估计就选不到其他实体了。也就无法捕捉了。

发表于 2013-6-20 14:02:26 | 显示全部楼层
wowan1314 发表于 2013-6-20 13:48
如何让模拟的捕捉,不去捕捉我要复制的实体呢?

我开始想到的是方案1、(模拟捕捉的时候同时选择实体,如 ...

【Gu_xl】【源码分享】自定义带捕捉的grread函数

评分

参与人数 1明经币 +1 收起 理由
wowan1314 + 1 很给力!

查看全部评分

 楼主| 发表于 2013-6-20 14:30:18 | 显示全部楼层
本帖最后由 wowan1314 于 2013-6-20 14:42 编辑
Gu_xl 发表于 2013-6-20 14:02
【Gu_xl】【源码分享】自定义带捕捉的grread函数

大意了! 一直没细看G版的这个帖子,想当然的以为就是模拟了捕捉而已。

原来也考虑了这方面的问题。。。。。

很好的方法! 直接利用函数太卡了。 我试着融入进我的代码中看看。
发表于 2013-7-5 17:10:27 | 显示全部楼层
想不捕捉到自己,只要将复制的选择集在计算捕捉的时候隐藏就行了,但是确实会很卡,可考虑用.net的jig。天正的自由复制是很好的,我编出来之后还是选择用回天正的了,只是天正这个对于物体对齐还不是很方便
发表于 2014-11-19 15:19:22 | 显示全部楼层
好东西 就是一直在闪 还不支持极轴
发表于 2018-9-21 23:27:27 | 显示全部楼层
这么多年了 希望大师能优化出来
发表于 2018-9-22 08:59:53 来自手机 | 显示全部楼层
高飞鸟的jig函数
发表于 2018-9-22 10:16:35 | 显示全部楼层

大神能整合一下吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 09:26 , Processed in 0.216859 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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