明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2601|回复: 26

[源码] 块操作和相同刷的一些改进

[复制链接]
发表于 2019-9-27 17:28 | 显示全部楼层 |阅读模式
本帖最后由 CAD新军 于 2019-12-9 14:55 编辑

一般我用Lee Mac的CBPR/CBP命令改基点,那个会迭代进嵌套块移动嵌套在里面的块的位置保证屏幕位置不变。
在学习参照坐标点变换时顺便改进了一下两套工具,分别是ID @自贡黄明儒 的LISP操作快和langjs 的相同刷 刷块部分,用的是同几行代码


这是修改
  1. ;;[功能] 修改块插入基点
  2. (defun C:ReInsertP (/ E EN ENT N OBJ OLDNAME P PT  ent_vec ent_insertionPoint SS)
  3.   (cond
  4.     ((and (setq ss (ssget "_+.:E:S" '((0 . "INSERT"))))
  5.           ;;(setq NewName (rtos (* (getvar "CDATE") 1E8)))
  6.           (setq en (ssname ss 0))
  7.           (setq ent (entget en))
  8.           (setq obj (vlax-ename->vla-object en))
  9.           (setq oldName (vlax-get obj 'Name))
  10.           (setq p (vlax-get obj 'InsertionPoint))
  11.           (setq pt (getpoint p "\n块新基点"))
  12.      )
  13.      (setq pt (mapcar '- pt p))
  14.      (setq pt (MAT:Rot2D pt (- 0 (cdr (assoc 50 ent)))));
  15.      (setq pt (mapcar '(lambda( i j )(/ i j  )) pt (list (cdr (assoc 41 ent)) (cdr (assoc 42 ent)) )))
  16.      
  17.      (_BlockNewName oldName nil pt nil nil "")     
  18.      ;;使块原位不动
  19.     (setq ss (ssget "X" (list '(0 . "INSERT") (cons 2 oldName))))
  20.      (repeat (setq n (sslength ss))
  21.        (entupd (setq e (ssname ss (setq n (1- n)))))
  22.        (setq ent (entget e))
  23.     (setq ent_insertionPoint (cdr (assoc 10 ent)))
  24.     (setq ent_vec (mapcar '(lambda( i j )(* i j  )) pt (list (cdr (assoc 41 ent)) (cdr (assoc 42 ent)) ))) ;
  25.     (setq ent_vec (MAT:Rot2D ent_vec  (cdr (assoc 50 ent))))
  26.     (setq ent_insertionPoint (mapcar '+  ent_insertionPoint ent_vec))      
  27.        (entmod (subst (cons 10 ent_insertionPoint) (assoc 10 ent) ent))
  28.      )
  29.     )
  30.   )
  31.   (princ)
  32. )


这是相同刷 刷块的。我改成了用块刷另外一个块,而不是用一个块刷所有块。这就给了相对基点的空间。
  1. ((= ty "INSERT")                       ; 4、 如果源对象是块,则拷贝源块到目标块的位置,删除目标块
  2.     (setq replaceblkname (cdr (assoc 2 ent)))
  3.       (princ (strcat " \n选择一个目标块参照<刷成:" replaceblkname  ">"))
  4.       ; 修改为一次只能刷一种块,先点选,然后再框选。这样的好处是相对坐标可以处理了,实际使用应该比用一个块刷不同块更多
  5.       (setq uu (cdr (assoc 10 ent)))
  6.       (setq model_ent  (entget (ssname (ssget ":S" '((0 . "INSERT"))) 0 )) )
  7.       (setq model_name  (cdr(assoc 2 model_ent)))
  8.       (setq model_insertionpoint (cdr (assoc 10 model_ent)))
  9.       (setq model_basepoint  (getpoint model_insertionpoint "请选择相对新块插入基点(空值为旧块的基点)"))
  10.       (if (null model_basepoint)
  11.         (setq model_basepoint model_insertionpoint)
  12.       )
  13.       (setq vec (mapcar '- model_basepoint model_insertionpoint))
  14.       (setq vec (MAT:Rot2D vec (- 0 (cdr (assoc 50 model_ent)))));先转回和WCS正交 这个角度要顺时针
  15.       (setq std_vec (mapcar '(lambda( i j )(/ i j  )) vec (list (cdr (assoc 41 model_ent)) (cdr (assoc 41 model_ent)) ))) ;
  16.            
  17.       (while t
  18.         (princ " \n选择目标对象:<块相同>")
  19.         ;(if (setq ss (ssget ":S:L" (list '(0 . "INSERT") (cons 2 model_name))))
  20.         (if (setq ss (ssget  (list '(0 . "INSERT") (cons 2 model_name))))
  21.           (progn
  22.            ; (vl-cmdf "")
  23.             (repeat (setq i (sslength ss))
  24.               (setq en1 (ssname ss (setq i (1- i))))
  25.         (setq ent (entget en1))
  26.         (setq ent_insertionPoint (cdr (assoc 10 ent)))
  27.         (setq obj (vlax-ename->vla-object en1))
  28.         (vlax-put-property obj 'NAME replaceblkname)

  29.          (setq ent_vec (mapcar '(lambda( i j )(* i j  )) std_vec (list (cdr (assoc 41 ent)) (cdr (assoc 42 ent)) ))) ;
  30.          (setq ent_vec (MAT:Rot2D ent_vec  (cdr (assoc 50 ent))))
  31.          (setq ent_insertionPoint (mapcar '+  ent_insertionPoint ent_vec))
  32.            
  33.            (vlax-put-property obj "InsertionPoint" (vlax-3d-point ent_insertionPoint ));

  34.               
  35.             )
  36.           )
  37.         )
  38.         (52errno)
  39.       )
  40.     )

实际用途。。。比如建筑给你一堆图纸,它们作图比较随意,图框基点十万八千里,你要套图就要一个一个换图框,不同比例还要缩放一下,用这个设定好相对基点一刷就全套上了


代码都给了,会的自己复制,不会的下载,收点币维持买帖子学习的经费,收到10个币以后免费

*更新*根据承诺,收费够了,取消下载论坛币




本帖子中包含更多资源

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

x

评分

参与人数 3明经币 +2 金钱 +10 收起 理由
ywx2020 + 10 赞一个!
菜卷鱼 + 1 明经币用处其实不大
USER2128 + 1 赞一个!

查看全部评分

发表于 2019-10-1 16:47 | 显示全部楼层
CAD新军 发表于 2019-10-1 13:42
我看到你私信了,但是我权限不够不能回复私信。

这个刷块功能只要是工作日天天用的,没出现过问题,不 ...

C:/1.png我执行完命令以后点ESC就出现这个提示    再输入命令也是这个提示     直到出现CAD崩溃     电脑重启一次才没问题    再次使用又循环一下   最后还是要重启

本帖子中包含更多资源

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

x
发表于 2019-10-1 16:54 | 显示全部楼层
H-浩浩-H 发表于 2019-10-1 16:47
我执行完命令以后点ESC就出现这个提示    再输入命令也是这个提示     直到出现CAD崩溃     电脑重启一次 ...

估计是跟我的一些lisp有冲突    只加载你这个就没问题
 楼主| 发表于 2019-12-9 14:58 | 显示全部楼层
本帖最后由 CAD新军 于 2019-12-9 14:59 编辑

更新了一下
【修复】原来Y方向的比例也写错成X方向了,XY放大不一样时位置会错误。
【增加】刷块时,源块和目标块一样能选相对点了。简单理解就是源块和目标块选中的点会重合
 楼主| 发表于 2019-9-27 17:32 | 显示全部楼层
本帖最后由 CAD新军 于 2019-9-27 17:33 编辑

示例图立面 2和3方框都是一个块,块3框框和尾巴是多段线,演示位置变化和基点相对变化的
发表于 2019-9-27 21:46 | 显示全部楼层
真的非常牛
发表于 2019-9-29 08:08 | 显示全部楼层
真的很实用,我来为楼主鼓掌!!
发表于 2019-9-29 09:51 | 显示全部楼层
这个厉害,块保持原有位置大小

 楼主| 发表于 2019-9-29 10:17 来自手机 | 显示全部楼层
对于没用过相同刷的,注意选块不要点到块内的文字。点中文字是刷文字的,即使是块内文字
发表于 2019-9-29 13:46 | 显示全部楼层
谢谢 好东西
发表于 2019-9-29 17:01 | 显示全部楼层
这个6,感谢分享
发表于 2019-9-30 08:44 | 显示全部楼层
支持一下,感谢分享
发表于 2019-9-30 14:13 | 显示全部楼层
谢谢楼主分享好程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-7 09:36 , Processed in 0.323434 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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