明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3874|回复: 13

请教如何以图块最外层的边界修剪图块下面的直线?

  [复制链接]
发表于 2011-11-30 19:26 | 显示全部楼层 |阅读模式
本帖最后由 xyxy 于 2011-12-1 09:08 编辑

如题。
一条直线上有一个或多个图块,如何框选图块以图块的最外层边界线修剪此直线?
谢谢!

示意如下。


本帖子中包含更多资源

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

x
发表于 2023-6-28 18:32 | 显示全部楼层
3、4、11楼的程序内容都很实用,虽然有功能重叠,都能做为学习的依据,感谢分享。
 楼主| 发表于 2011-12-1 09:07 | 显示全部楼层
有没有哪位高手能帮解决一下?非常感谢!
发表于 2011-12-1 11:06 | 显示全部楼层
非自动
  1. (defun C:trimblk (/ pt1 pt2 el et)
  2.      (command "undo" "be")
  3.      (setq os (getvar "osmode"))
  4.      (setvar "osmode" 32)
  5.        (setq pt1 (getpoint "\n选择块与直线第一个交点: "))
  6.        (setq pt2 (getpoint pt1 "\n选择块与直线第二个交点 "))
  7.      (command "circle" "2p" pt1 pt2 )
  8.        (redraw (setq el (entlast)) 2)
  9.        (while (setq et (getpoint "\n选择被剪切的直线 (回车结束):"))
  10.           (command "trim" el "" et "" )
  11.       );while
  12.      (command "erase" el "" )
  13.      (setvar "osmode" os)
  14.      (command "redraw")
  15.          (command "undo" "e")
  16. )
发表于 2011-12-1 11:31 | 显示全部楼层
本帖最后由 xiaxiang 于 2011-12-1 11:31 编辑

这是一个打断的程序
  1. (defun c:BLKTRIM ( / *error* trim-blk rotate-bbox sv-cmd
  2.                                 sv-osm acad-doc ss cnt)
  3. (defun *error* (msg)
  4.   (vla-EndUndoMark acad-doc)
  5.   (setvar 'cmdecho sv-cmd)
  6.   (setvar 'osmode sv-osm)
  7. )

  8. (defun trim-blk (pts / ln-set ln-obj sp ep tmp int-lst ct)
  9.   (if(setq ln-set(ssget "cp" pts '((0 . "*LINE,ARC"))))
  10.    (progn
  11.     (setq pts(reverse(cons(car pts)(reverse pts))))
  12.     (repeat(setq ct(sslength ln-set))
  13.      (setq ln-obj  (vlax-ename->vla-object
  14.                     (ssname ln-set
  15.                       (setq ct(1- ct))
  16.                     )
  17.                    )
  18.            sp      (vlax-curve-getStartPoint ln-obj)
  19.            ep      (vlax-curve-getEndPoint ln-obj)
  20.            tmp      pts
  21.            int-lst '()
  22.      )
  23.      (while(>(length tmp)1)
  24.       (if(setq int(inters sp ep(car tmp)(cadr tmp)nil))
  25.        (if(inters sp int (car tmp)(cadr tmp))
  26.         (setq int-lst(cons int int-lst))
  27.        )
  28.       )
  29.       (setq tmp(cdr tmp))
  30.      )
  31.      (if(=(length int-lst)2)
  32.       (vl-cmdf "_.break"
  33.                (list
  34.                 (vlax-vla-object->ename ln-obj)
  35.                 (car int-lst)
  36.                )
  37.                (cadr int-lst)
  38.       )
  39.      )
  40.     )
  41.    )
  42.   )
  43. )

  44. (defun rotate-bbox (blk-obj / mspace blk-rot blk-pt blk-bbox
  45.                                             p1 p2 p3 p4 x tmp)

  46.   (setq mspace   (vla-get-modelspace acad-doc)
  47.         blk-rot  (vlax-get-property blk-obj 'Rotation)
  48.         blk-pt   (vlax-get-property blk-obj 'InsertionPoint)
  49.   )
  50.   (vlax-put-property blk-obj 'Rotation 0.0)
  51.   (setq blk-bbox (vla-getBoundingBox blk-obj 'p1 'p3)
  52.         p1       (vlax-safearray->list p1)
  53.         p3       (vlax-safearray->list p3)
  54.         p1       (list(car p1)(cadr p1))
  55.         p3       (list(car p3)(cadr p3))
  56.         p2       (list(car p1)(cadr p3))
  57.         p4       (list(car p3)(cadr p1))
  58.   )
  59.   (vlax-put-property blk-obj 'Rotation blk-rot)
  60.   (foreach x '(p1 p2 p3 p4)
  61.    (vla-rotate
  62.     (vla-addpoint mspace(vlax-3d-point(eval x)))
  63.      blk-pt
  64.      blk-rot
  65.    )
  66.    (set x(vlax-ename->vla-object(entlast)))
  67.   )
  68.   (foreach x '(p1 p2 p3 p4)
  69.    (setq tmp(eval x))
  70.    (set x
  71.     (vlax-safearray->list
  72.      (vlax-variant-value
  73.       (vlax-get-property(eval x)'Coordinates)
  74.      )
  75.     )
  76.    )
  77.    (vla-delete tmp)
  78.   )
  79.   (list p1 p2 p3 p4)
  80. )

  81. (setq sv-cmd   (getvar "cmdecho")
  82.        sv-osm   (getvar "osmode")
  83.        acad-doc (vla-get-activedocument
  84.                  (vlax-get-Acad-Object)
  85.                 )
  86. )
  87. (setvar 'cmdecho 0)
  88. (setvar 'osmode 0)
  89. (vla-StartUndoMark acad-doc)
  90. (if(setq ss(ssget '((0 . "INSERT"))))
  91.   (repeat(setq cnt(sslength ss))
  92.    (trim-blk
  93.     (rotate-bbox
  94.      (vlax-ename->vla-object
  95.       (ssname ss
  96.        (setq cnt(1- cnt))
  97.       )
  98.      )
  99.     )
  100.    )
  101.   )
  102. )
  103. (vla-EndUndoMark acad-doc)
  104. (setvar 'cmdecho sv-cmd)
  105. (setvar 'osmode sv-osm)
  106. (princ)
  107. )


评分

参与人数 1明经币 +1 收起 理由
xyxy + 1 热心人

查看全部评分

 楼主| 发表于 2011-12-1 11:33 | 显示全部楼层
本帖最后由 xyxy 于 2011-12-1 11:44 编辑

xiaxiang大侠提供的4#程序能满足我的要求,再次感谢热心的xiaxiang!

点评

很高兴程序有用,欢迎常来明经  发表于 2011-12-1 14:13
发表于 2012-5-22 18:00 | 显示全部楼层
xyxy 发表于 2011-12-1 11:33
xiaxiang大侠提供的4#程序能满足我的要求,再次感谢热心的xiaxiang!

老兄,这个问题解决了?
 楼主| 发表于 2012-5-22 19:48 | 显示全部楼层
longer1000 发表于 2012-5-22 18:00
老兄,这个问题解决了?

longer1000兄,xiaxiang大侠提供的程序已经能满足我所需的要求,谢谢关注!
发表于 2012-5-23 08:38 | 显示全部楼层
xyxy 发表于 2012-5-22 19:48
longer1000兄,xiaxiang大侠提供的程序已经能满足我所需的要求,谢谢关注!

能否分享下,或者发邮箱longer1000@sina.com,谢谢
 楼主| 发表于 2012-5-23 17:28 | 显示全部楼层
longer1000兄,xiaxiang大侠提供的程序就在3楼和4楼,复制即可使用。
发表于 2013-1-1 21:41 | 显示全部楼层
xiaxiang 发表于 2011-12-1 11:31
这是一个打断的程序

非常实用的程序!如果能把图示小bug完善一下就更好了!

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-4 03:16 , Processed in 0.496820 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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