找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5487|回复: 29

[日积月累]:修剪穿过 Circle 和 text 的线

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-5-26 11:49:57 | 显示全部楼层 |阅读模式

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

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

×

  1. (defun ybl-midp        (p1 p2)
  2.   (mapcar '(lambda (x) (/ x 2.)) (mapcar '+ p1 p2))
  3. )
  4. (defun c:tt (/ e ss i ssl ent midp op pam el BP        ELL ENT        L1 OP PAM SS1 UP
  5.              X)
  6.   (if (and (progn
  7.              (princ "\nSelect Line,Pline ....")
  8.              t
  9.            )
  10.            (setq ss1 (ssget '((0 . "line,lwpolyline,polyline"))))
  11.            (progn
  12.              (princ "\nSelect Circle text ....")
  13.              t
  14.            )
  15.            (setq ss (ssget '((0 . "circle,text"))))
  16.       )
  17.     (progn
  18.       (setq l1 (sslength ss)
  19.             i  -1
  20.       )
  21.       (repeat l1
  22.         (setq ent (ssname ss (setq i (1+ i))))
  23.         (vla-getboundingbox (vlax-ename->vla-object ent) 'bp 'up)
  24.         (setq midp (ybl-midp (safearray-value bp) (safearray-value up)))
  25.         (setq el (cons (list midp ent) el))
  26.       )
  27.       (setq ssl        (sslength ss1)
  28.             i        -1
  29.       )
  30.       (repeat ssl
  31.         (setq ent (ssname ss1 (setq i (1+ i))))
  32.         (setq ell (mapcar '(lambda (x / op pam)
  33.                              (setq
  34.                                op  (vlax-curve-getclosestpointto
  35.                                      ent
  36.                                      (car x)
  37.                                    )
  38.                                pam (vlax-curve-getparamatpoint
  39.                                      ent
  40.                                      op
  41.                                    )
  42.                              )
  43.                              (list pam (car x) (cadr x))
  44.                            )
  45.                           el
  46.                   )
  47.         )
  48.         (setq ell (vl-sort ell '(lambda (e1 e2) (> (car e1) (car e2)))))
  49.         (foreach x ell
  50.           (command ".trim" (last x) "" (list ent (cadr x)) "")
  51.         )
  52.       )
  53.     )
  54.   )
  55.   (princ)
  56. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-5-26 16:08:02 | 显示全部楼层
程序很好用,好好的学习了eachy版主的程序,学到了不少东西,包括文字原来现在可以trim了,现在真是落伍了,还有mapcar和lambda的用法。

报告一下bug,如下图所示,对于45度线(其实到89度都有可能)出现的情况:
部分比较靠近角部的直线,trim完之后有些问题,如红线所示

仔细学习了版主的程序,应该是以文字中心作为midp,找线上最近点op,
当在比较角部的地方,选中的最近点是在文字外部的,此时就会导致部分线是截取掉一半而非trim
这些线假如手工用trim且选取文字内部部分的时候是可以trim掉的

所以我觉得要是可以用文本box和实体两个交点中的中点来做op点会更安全一点,不过可能编程会比较麻烦。

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-5-26 20:57:44 | 显示全部楼层

  1. (defun c:tt (/ ss ssl i obj p1 p2 s1 sl m l ipts pts p)
  2.   (princ "\nselect circle text ....")
  3.   (if (setq ss (ssget '((0 . "circle,text"))))
  4.     (progn
  5.       (if (< (getvar "osmode") 13684)
  6.         (setvar "osmode" (+ (getvar "osmode") 13684))
  7.       )
  8.       (command ".undo" "be")
  9.       (setq ssl        (sslength ss)
  10.             i        -1
  11.       )
  12.       (repeat ssl
  13.         (setq e          (ssname ss (setq i (1+ i)))
  14.               obj (vlax-ename->vla-object e)
  15.         )
  16.         (vla-getboundingbox obj 'bp 'up)
  17.         (setq p1 (safearray-value bp)
  18.               p2 (safearray-value up)
  19.         )
  20.         (if (setq s1 (ssget "_c" p1 p2 '((0 . "line,lwpolyline"))))
  21.           (progn
  22.             (setq sl (sslength s1)
  23.                   m  -1
  24.             )
  25.             (repeat sl
  26.               (setq l         (ssname s1 (setq m (1+ m)))
  27.                     ipts (safearray-value
  28.                            (variant-value
  29.                              (vla-intersectwith
  30.                                obj
  31.                                (vlax-ename->vla-object l)
  32.                                0
  33.                              )
  34.                            )
  35.                          )
  36.               )
  37.               (while ipts
  38.                 (setq pts  (cons (list (car ipts) (cadr ipts) (caddr ipts))
  39.                                  pts
  40.                            )
  41.                       ipts (cdddr ipts)
  42.                 )
  43.               )
  44.               (setq p        (mapcar        '(lambda (x) (/ x (length pts)))
  45.                                 (apply 'mapcar (cons '+ pts))
  46.                         )
  47.                     pts        nil
  48.               )
  49.               (command ".trim"
  50.                        e
  51.                        ""
  52.                        (list l p)
  53.                        ""
  54.               )
  55.             )
  56.           )
  57.         )
  58.       )
  59.       (command ".undo" "end")
  60.     )
  61.   )
  62.   (princ)
  63. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-27 08:25:44 | 显示全部楼层
测试汇报:现在不会有45度的修剪问题。
不过好像不够原来的稳定
不知道用了ssget .c函数之后,是不是对图面有较高的要求呢,似乎有些图形zoom的大了或者小了
结果会不一样,有时候会出现参数太少的提示,不大弄的懂什么时候会出现
比如下面这个图的圆就经常出错,文字在不同zoom的情况下,有时候会出现中断,提示参数太少
CAD2004 osmode=0
不知道是不是我这个cad不大行的缘故

由于对区域修剪及打断很有兴趣,希望借此再请教两个问题
1)假如想通过一点选择物体,在lisp中是不是只能构建一个ssget c的小窗口,这种构建法在图面很密集的时候似乎会出现问题,有没有更好的方法,对vla-selectatpoint的应用总觉得很奇怪,每次选取的结果似乎都不一样,能否请告知是怎么用的
2)第二个,比如我现在圆里面有很多短线,没有和圆相交,想删除它们,不知道怎么构建圆选择区,是否一定得用多边形来逼近
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-5-27 09:01:47 | 显示全部楼层
这样改改再试

  1. (defun c:tt (/ ss ssl i obj p1 p2 s1 sl m l ipts pts p)
  2.   (princ "\nselect circle text ....")
  3.   (if (setq ss (ssget '((0 . "circle,text"))))
  4.     (progn
  5.       (if (< (getvar "osmode") 13684)
  6.         (setvar "osmode" (+ (getvar "osmode") 13684))
  7.       )
  8.       (command ".undo" "be")
  9.       (setq ssl        (sslength ss)
  10.             i        -1
  11.       )
  12.       (repeat ssl
  13.         (setq e          (ssname ss (setq i (1+ i)))
  14.               obj (vlax-ename->vla-object e)
  15.         )
  16.         (vla-getboundingbox obj 'bp 'up)
  17.         (setq p1 (safearray-value bp)
  18.               p2 (safearray-value up)
  19.         )
  20.         (if (setq s1 (ssget "_c" p1 p2 '((0 . "line,lwpolyline"))))
  21.           (progn
  22.             (setq sl (sslength s1)
  23.                   m  -1
  24.             )
  25.             (command ".trim" (list e p1) "")
  26.             (repeat sl
  27.               (setq l         (ssname s1 (setq m (1+ m)))
  28.                     ipts (safearray-value
  29.                            (variant-value
  30.                              (vla-intersectwith
  31.                                obj
  32.                                (vlax-ename->vla-object l)
  33.                                0
  34.                              )
  35.                            )
  36.                          )
  37.               )
  38.               (if ipts
  39.                 (progn (while ipts
  40.                          (setq pts  (cons
  41.                                       (list (car ipts) (cadr ipts) (caddr ipts))
  42.                                       pts
  43.                                     )
  44.                                ipts (cdddr ipts)
  45.                          )
  46.                        )
  47.                        (setq p         (mapcar '(lambda (x) (/ x (length pts)))
  48.                                          (apply 'mapcar (cons '+ pts))
  49.                                  )
  50.                              pts nil
  51.                        )
  52.                        (command (list l p))
  53.                 )
  54.               )
  55.             )
  56.             (command "")
  57.           )
  58.         )
  59.       )
  60.       (command ".undo" "end")
  61.     )
  62.   )
  63.   (princ)
  64. )


第二个问题可以用ET函数 ACET-GEOM-OBJECT-POINT-LIST  构造点然后用 wp 选择
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-27 10:06:25 | 显示全部楼层
这次可以了,效果很好,谢谢:)
让我再仔细读读函数,现在还有点没想通第一种方法和第二种方法的根本区别。
第二个函数和第三个函数的trim放置位置居然如此不同。
ACET-GEOM-OBJECT-POINT-LIST系列函数也要好好学学
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2006-5-27 16:47:33 | 显示全部楼层
如果研究trim是怎么写出来的,
对于curve应该是求交点,而不是curve的应该是求出它的外框交点(text要适当往外偏移)
然后就应该是交点打断了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 837个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-6-8 17:40:19 | 显示全部楼层
最初由 hao3ren 发布
[B]eachy 斑竹可不可以增加修剪穿过 尺寸标注文字的线 [/B]

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

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

使用道具 举报

发表于 2006-6-12 22:28:52 | 显示全部楼层
请教为何在vlisp函数集中没有诸如vla-intersectwith的函数,这些函数的用法在哪里可以查到,谢谢.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 21:48 , Processed in 0.215711 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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