找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1165|回复: 9

[LISP函数]:返回块上距离指定点最近的点

[复制链接]
发表于 2004-2-17 08:36:00 | 显示全部楼层 |阅读模式

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

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

×
这是我根据别的函数改过来的,由于对Vlisp不熟悉,函数只能得到距Curve类子实体最近的点,哪位大虾能改成可支持其它如Hatch、Text、Attib等子实体呢?

  1.   [FONT=courier new]
  2. ;GetBlockNea   ---返回点距块内每个子实体最近的点
  3. ; 测试:(GetBlockNea (vlax-ename->vla-object (car (entsel))) (getpoint) acExtendNone)
  4. ;暂时仅支持Curve类子实体
  5. ; Arguments [Typ]:
  6. ;   Blk = Block object [VLA-OBJECT]
  7. ;   Pt1 = Point [LIST]
  8. ;   Mde = Intersection mode [INT]
  9. ;         Constants:
  10. ;         - acExtendNone           Does not extend either object.
  11. ;         - acExtendThisEntity     Extends the Fst object.
  12. ;         - acExtendOtherEntity    Extends the Nxt object.
  13. ;         - acExtendBoth           Extends both objects.
  14. ; Return [Typ]:
  15. ;   > list of points '((1.0 1.0 0.0)... [LIST]
  16. ;   > Nil if not found
  17. ; Notes:
  18. ;   None
  19. ;
  20. (defun GetBlockNea (Blk Pt1 Mde / ObjNme PntLst TmpVal Pt2 dst1 Pt3 )
  21. (foreach memb (vlax-invoke Blk "Explode")
  22.   (setq ObjNme (vla-get-ObjectName memb))
  23.   (cond
  24.    ((or
  25.      (and
  26.       (eq ObjNme "AcDbHatch")
  27.       (eq (strcase (vla-get-PatternName memb)) "SOLID")
  28.      )
  29.      (eq ObjNme "AcDb3dSolid")
  30.      (eq ObjNme "AcDbAttributeDefinition")
  31.     )
  32.    )
  33.    ((eq ObjNme "AcDbBlockReference")
  34.     (if (setq TmpVal (GetBlockNea memb Pt1 Mde))
  35.      (setq PntLst (append PntLst TmpVal))
  36.     )
  37.    )
  38.    ((wcmatch ObjNme "AcDbPolyline,AcDbEllipse,AcDbCircle,AcDbArc,AcDbLine,AcDbPolyline")
  39.    ;;(T     
  40.     (if (setq TmpVal (vlax-curve-getclosestpointto memb Pt1 Mde))
  41.      (setq PntLst (cons TmpVal PntLst))
  42.     )
  43.    )
  44.   )
  45.   (vla-Delete memb)
  46. )
  47.   (if PntLst
  48.      (progn
  49.        (setq Pt3 (car PntLst) dst1 (distance Pt1 pt3))
  50.        (foreach Pt2 PntLst
  51.              (if (< (distance Pt1 Pt2) dst1) (setq Pt3 Pt2 dst1 (distance Pt1 Pt2)))
  52.         )
  53.      )
  54.   )
  55. Pt3
  56. )  ;end of defun
  57.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-2-17 12:18:11 | 显示全部楼层
不用Explode,把点转换成相对块的OCS,然后遍历块内实体即可。

其他实体要订个规则才可以,比如Text,ATT用插入点还是BOX的最近点,Hatch是否用分解后实体等等。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-2-17 15:25:48 | 显示全部楼层
"把点转换成相对块的OCS,然后遍历块内实体即可"这个做法我不会,试了几次都没能把点的坐标变换搞对,遍历块内实体得到的子实体怎么获得与已知点最近的点也是个问题,似乎vlax-curve-getclosestpointto 函数也不好用,eachy兄能否提供一个例子呢?
Text等可以下一步再考虑,Hatch还是用分解后的实体比较好,但不知道为什么vlax-invoke Blk "Explode" 对Hatch无效
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-2-17 22:54:07 | 显示全部楼层
最初由 eachy 发布
[B]不用Explode,把点转换成相对块的OCS,然后遍历块内实体即可。

其他实体要订个规则才可以,比如Text,ATT用插入点还是BOX的最近点,Hatch是否用分解后实体等等。 [/B]


恐怕不行,比如:
arc在x y不同比例的情况下变成了椭圆,没办法求的.
(块内是arc,而explode后是椭圆)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-18 01:13:29 | 显示全部楼层
楼上言之有理。
另,对text求实体包围盒,对hatch求边界(不推荐炸开),对3dsolid还没想到好办法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-2-18 11:17:35 | 显示全部楼层
这个程序是我的一个程序的子函数,其实我并不需要对TEXT等子实体求最近点,但对Hatch,却是需要Explode后的才行,所以还是希望修改(vlax-invoke Blk "Explode"),让它支持对Hatch的打碎,只是我不会改,哪位能帮个忙呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-2-18 11:36:20 | 显示全部楼层
最初由 小菜 发布
[B]这个程序是我的一个程序的子函数,其实我并不需要对TEXT等子实体求最近点,但对Hatch,却是需要Explode后的才行,所以还是希望修改(vlax-invoke Blk "Explode"),让它支持对Hatch的打碎,只是我不会改,哪位能帮个忙... [/B]

Autodesk 没有提供Hatch 的Explode方法,只能用命令打碎块,最后Undo回去,这样作为子函数可能有问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2004-2-18 19:15:54 | 显示全部楼层
有没有办法加到上面的函数中呢?
后来想了一下,好象比较麻烦,可能要重写函数了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 14:25 , Processed in 0.473985 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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