明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2317|回复: 7

[源码] 【源码】【免币】快速选择与所选标注位置处在一条线上的所有标注

[复制链接]
发表于 2015-9-15 22:46:46 | 显示全部楼层 |阅读模式
本帖最后由 kele99kele 于 2015-9-15 23:30 编辑

做法有点土,但是实测5000个标注的图面选择速度不超过0.5s,欢迎拍砖
  1. ;|
  2. 函数名称:        N::IsInExLine
  3. 函数简介:        判断点是否在两点连线的延长线上
  4. 调用格式:        (N::IsInExLine pt1[PointList] pt2[PointList] pt3[PointList])
  5. 返回值:        T or Nil
  6. 例: (N::IsInExLine '(0 0 0) '(1 2 0) '(3 5 0))判断点'(3 5 0)是否处于'(0 0 0) '(1 2 0)连线的延长线上
  7. 函数来源: 原创
  8. 函数作者:        九群
  9. 适用版本:        不限
  10. 最后更新时间:        2015.9.15|;
  11. (defun N::IsOnExLine (p1 p2 px)
  12.         (< (abs (- (abs (- (distance px p1) (distance px p2))) (distance p1 p2))) 0.001)
  13. )
  14. ;|
  15. 函数名称:        N::IsOnLine
  16. 函数简介:        判断点是否在两点连线上
  17. 调用格式:        (N::IsOnLine pt1&#91;PointList&#93; pt2&#91;PointList&#93; pt3&#91;PointList&#93;)
  18. 返回值:        T or Nil
  19. 例: (N::IsOnLine '(0 0 0) '(1 2 0) '(3 5 0))判断点'(3 5 0)是否处于'(0 0 0) '(1 2 0)连线上
  20. 函数来源: 原创
  21. 函数作者:        九群
  22. 适用版本:        不限
  23. 最后更新时间:        2015.9.15|;
  24. (defun N::IsOnLine (p1 p2 px)
  25.         (< (abs (- (+ (distance p1 px) (distance p2 px)) (distance p1 p2))) 0.001)
  26. )

  27. ;|
  28. 函数名称:        N::IsInLine
  29. 函数简介:        判断点是否在两点连线上或连线的延长线上
  30. 调用格式:        (N::IsInLine pt1&#91;PointList&#93; pt2&#91;PointList&#93; pt3&#91;PointList&#93;)
  31. 返回值:        T or Nil
  32. 例: (N::IsInLine '(0 0 0) '(1 2 0) '(3 5 0))判断点'(3 5 0)是否处于'(0 0 0) '(1 2 0)连线上或连线的延长线上
  33. 函数来源: 原创
  34. 函数作者:        九群
  35. 适用版本:        不限
  36. 最后更新时间:        2015.9.15|;
  37. (defun N::IsInLine (p1 p2 px)
  38.         (or
  39.                 (N::IsOnLine p1 p2 px)
  40.                 (N::IsOnExLine p1 p2 px)
  41.         )
  42. )

  43. ;|
  44. 函数名称:        N::GetDimInLine
  45. 函数简介:        选择标注位置相同的标注(批量选择一排标注)
  46. 调用格式:        (N::GetDimInLine N_DimEntName&#91;EntName&#93;)
  47. 返回值:        与所给标注名称处于同一线上的所有标注的选择集
  48. 例: (N::GetDimInLine (car (entsel))选择一处标注,返回与该标注处于同一线上的所有标注的选择集
  49. 函数来源: 原创
  50. 函数作者:        九群
  51. 适用版本:        不限
  52. 最后更新时间:        2015.9.15|;
  53. (defun N::GetDimInLine (N_DimEntName / N_AllDim N_DimEntName N_DimStart N_DimStartPoint N_DimDistance N_DimEnd N_DimPick N_DimPickStart N_DimPickStartpoint N_DimPickDistance N_DimPickEnd N_DimMatch)
  54.         (setq
  55.                 N_AllDim (ssget "x" '((0 . "DIMENSION")));选择全图dim尺寸对象
  56.                 N_DimMatch (ssget "x" '((0 . "DIMENSION")));选择全图dim尺寸对象
  57.                 N_DimStart (cdr (assoc 10 (entget N_DimEntName)));取得dim尺寸的起点
  58.                 N_DimStartPoint (cdr (assoc 14 (entget N_DimEntName)));取得dim尺寸脚的起点
  59.                 N_DimDistance (cdr (assoc 42 (entget N_DimEntName)));取得dim尺寸的测量长度
  60.                 N_DimEnd (polar N_DimStart (+ (* 0.5 pi) (angle N_DimStart N_DimStartPoint)) N_DimDistance);取得dim尺寸的终点
  61.         )
  62.         ;(command "color" 1 "line" N_DimStart N_DimEnd "")
  63.         (repeat (setq i (sslength N_AllDim))
  64.                 (setq
  65.                         N_DimPick (ssname N_AllDim (1- i))
  66.                         N_DimPickStart (cdr (assoc 10 (entget (ssname N_AllDim (1- i)))))
  67.                         N_DimPickStartpoint (cdr (assoc 14 (entget (ssname N_AllDim (1- i)))))
  68.                         N_DimPickDistance (cdr (assoc 42 (entget (ssname N_AllDim (1- i)))))
  69.                         N_DimPickEnd (polar N_DimPickStart (+ (* 0.5 pi) (angle N_DimPickStart N_DimPickStartPoint)) N_DimPickDistance)
  70.                 )
  71.                 ;(command "color" 2 "line" N_DimPickStart N_DimPickEnd "")
  72.                 (if (null (and
  73.                                                                 (N::IsInLine N_DimStart N_DimEnd N_DimPickStart)
  74.                                                                 (N::IsInLine N_DimStart N_DimEnd N_DimPickEnd)
  75.                                                         ))
  76.                         (progn
  77.                                 (ssdel (ssname N_AllDim (1- i)) N_DimMatch)
  78.                                 (setq i (1- i))
  79.                         )
  80.                         (setq i (1- i))                       
  81.                 )
  82.         )
  83.         N_DimMatch
  84. )

点评

(defun N::IsInLine(p1 p2 px)(equal(car(trans(mapcar'- px p1)2(mapcar'- p2 p1)))0 1e-8));;px是否在p1 p2所在直线上  发表于 2015-9-15 23:42
 楼主| 发表于 2015-9-16 08:48:34 | 显示全部楼层
本帖最后由 kele99kele 于 2015-9-16 09:10 编辑
llsheng_73  (defun N::IsInLine(p1 p2 px)(equal(car(trans(mapcar'- px p1)2(mapcar'- p2 p1)))0 1e-8));;px是否在p1 p2所在直线上  发表于 昨天 23:42

感谢指点,思路明白了,trans命令有点绕不明白,例子太少所以不是很懂,llsheng_73有空的时候
能不能不帮忙翻译下?trans后面跟着的这3个参数是什么作用
纯粹自学lisp,没人带,本人也不是计算机专业,纯靠泡论坛翻资料汲取知识,望理解

没明白的地方一共两处(见笑了)
1:(trans xx 2 xxx)应该怎么解读呢
2:(mapcar'- px p1)、(mapcar'- p2 p1)这两个坐标xyz相减的意义是什么
不好意思,基础有点差,费心了

在群里问了,解答说是取向量进行比较。这个有点不理解,能不能直接将px的坐标转到p1p2为x轴
的坐标系下对比px坐标与p1,p2坐标的x值是否相等呢?
发表于 2020-12-7 15:08:17 | 显示全部楼层
大神这个一直没有更新么?感觉这个也是比较实用的功能
发表于 2021-1-21 13:00:40 | 显示全部楼层
好东西  顶起来,简直太香了
发表于 2021-1-21 13:01:35 | 显示全部楼层
本帖最后由 xj6019 于 2021-1-21 13:07 编辑

期待主人抽空更新一下吧,拜谢了
发表于 2021-1-21 14:06:23 | 显示全部楼层
使用中发现会误伤呀,比如只想处理几个相邻的尺寸,但是代码会处理所有在一条直线上的标注对象,知道是那个“X”决定的,没法,哪位大神可以优化一下,优化成只选择相邻的,不相邻的对象不选择呀,这样很容易错误的选择处理了远处虽然在一条直线上,但是并不想处理的标注
发表于 2021-6-2 00:41:28 | 显示全部楼层
期待主人抽空更新一下吧,拜谢了
发表于 2021-6-24 23:16:56 | 显示全部楼层
块更新,快更新,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 11:42 , Processed in 0.183721 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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