明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2072|回复: 20

[函数] (SortLineByXAndY)根据给定符号对图元表进行XY轴位置先后排序(如:先X轴升序,后Y...

  [复制链接]
发表于 2020-11-23 15:23 | 显示全部楼层 |阅读模式
本帖最后由 fangmin723 于 2022-11-12 10:00 编辑

好久没有发帖了,冒个泡!!!

  1. ;;说明:根据给定符号对图元表进行XY轴位置先后排序(如:先X轴升序,后Y轴降序)
  2. ;;适用于子表的第一个元素为点表的表集排序(((1 2 3) ...) ((4 5 6) ...) ((7 8 9) ...) ...)
  3. ;;参数:lst:图元表
  4. ;;参数:XSymbol:X轴升降序符号:<、>
  5. ;;参数:YSymbol:Y轴升降序符号:<、>
  6. ;;参数:isxfirst:是否先对X轴排序
  7. ;;返回:排序后的图元表!(setq hlst (SortFirstPtlSTByXAndY lshlst < > nil))(defun SortFirstPtlSTByXAndY(lst XSymbol YSymbol isxfirst / hvlst lslst rowcol symbol ud xory xy)
  8.     (if isxfirst
  9.       (setq
  10.         XOrY caar;;设置第一次依据排序坐标和第二次依据X轴位置比对
  11.         ud cadar;;设置第二次根据Y坐标进行排序
  12.         Symbol YSymbol;;设置第二次排序的升降序
  13.         lslst (vl-sort lst (function (lambda (x y) (XSymbol (XOrY x) (XOrY y)))));;先对表进行X轴排序
  14.       )
  15.       (setq
  16.         XOrY cadar;;设置第一次依据排序坐标和第二次依据Y轴位置比对
  17.         ud caar;;设置第二次根据X坐标进行排序
  18.         Symbol XSymbol;;设置第二次排序的升降序
  19.         lslst (vl-sort lst (function (lambda (x y) (YSymbol (XOrY x) (XOrY y)))))
  20.       )
  21.     )
  22.     (setq rowcol nil xy (XOrY (car lslst)) hvlst nil)
  23.     (foreach x lslst
  24.       (if (= xy (XOrY x))
  25.         (setq rowcol (cons x rowcol))
  26.         (setq
  27.           hvlst (append hvlst (vl-sort rowcol (function (lambda (x y) (Symbol (ud x) (ud y))))))
  28.           rowcol nil rowcol (cons x rowcol) xy (XOrY x)
  29.         )
  30.       )
  31.     )
  32.     (setq hvlst (append hvlst (vl-sort rowcol (function (lambda (x y) (Symbol (ud x) (ud y)))))))
  33.     hvlst
  34.   )



  1. ;;说明:根据给定符号对图元表进行XY轴位置先后排序(如:先X轴升序,后Y轴降序)
  2. ;;参数:lst:图元表
  3. ;;参数:XSymbol:X轴升降序符号:<、>
  4. ;;参数:YSymbol:Y轴升降序符号:<、>
  5. ;;参数:isxfirst:是否先对X轴排序
  6. ;;返回:排序后的图元表!(setq hlst (SortLineByXAndY lshlst < > nil))
  7. (defun SortLineByXAndY(lst XSymbol YSymbol isxfirst / hvlst lslst rowcol symbol ud xory xy)
  8.   (if isxfirst
  9.     (setq
  10.       XOrY cadr;;设置第一次依据排序坐标和第二次依据X轴位置比对
  11.       ud caddr;;设置第二次根据Y坐标进行排序
  12.       Symbol YSymbol;;设置第二次排序的升降序
  13.       lslst (vl-sort lst (function (lambda (x y) (XSymbol (XOrY (assoc 10 (entget x))) (XOrY (assoc 10 (entget y)))))));;先对表进行X轴排序
  14.     )
  15.     (setq
  16.       XOrY caddr;;设置第一次依据排序坐标和第二次依据Y轴位置比对
  17.       ud cadr;;设置第二次根据X坐标进行排序
  18.       Symbol XSymbol;;设置第二次排序的升降序
  19.       lslst (vl-sort lst (function (lambda (x y) (YSymbol (XOrY (assoc 10 (entget x))) (XOrY (assoc 10 (entget y)))))))
  20.     )
  21.   )
  22.   (setq rowcol nil xy (XOrY (assoc 10 (entget (nth 0 lslst)))) hvlst nil)
  23.   (foreach x lslst
  24.     (if (= xy (XOrY (assoc 10 (entget x))))
  25.       (setq rowcol (cons x rowcol))
  26.       (setq
  27.         hvlst (append hvlst (vl-sort rowcol (function (lambda (x y) (Symbol (ud (assoc 10 (entget x))) (ud (assoc 10 (entget y))))))))
  28.         rowcol nil rowcol (cons x rowcol) xy (XOrY (assoc 10 (entget x)))
  29.       )
  30.     )
  31.   )
  32.   (setq hvlst (append hvlst (vl-sort rowcol (function (lambda (x y) (Symbol (ud (assoc 10 (entget x))) (ud (assoc 10 (entget y)))))))))
  33.   hvlst
  34. )


本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
zixuan203344 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2022-12-9 07:24 | 显示全部楼层
本帖最后由 fangmin723 于 2022-12-9 07:32 编辑
AndyWang 发表于 2022-12-8 17:31
现在排序出来是这样的

修改部分内容就行了


  1. ;;说明:根据给定符号对图元表进行XY轴位置先后排序(如:先X轴升序,后Y轴降序)
  2. ;;参数:lst:图元表
  3. ;;参数:XSymbol:X轴升降序符号:<、>
  4. ;;参数:YSymbol:Y轴升降序符号:<、>
  5. ;;参数:isxfirst:是否先对X轴排序
  6. ;;返回:排序后的图元表!(setq hlst (SortLineByXAndY lshlst < > nil))
  7. (defun SortLineByXAndY(lst XSymbol YSymbol isxfirst / hvlst lslst rowcol symbol ud xory xy)
  8.   (if isxfirst
  9.     (setq
  10.       XOrY cadr;;设置第一次依据排序坐标和第二次依据X轴位置比对
  11.       ud caddr;;设置第二次根据Y坐标进行排序
  12.       Symbol YSymbol;;设置第二次排序的升降序
  13.       lslst (vl-sort lst (function (lambda (x y) (XSymbol (XOrY (assoc 10 (entget x))) (XOrY (assoc 10 (entget y)))))));;先对表进行X轴排序
  14.     )
  15.     (setq
  16.       XOrY caddr;;设置第一次依据排序坐标和第二次依据Y轴位置比对
  17.       ud cadr;;设置第二次根据X坐标进行排序
  18.       Symbol XSymbol;;设置第二次排序的升降序
  19.       lslst (vl-sort lst (function (lambda (x y) (YSymbol (XOrY (assoc 10 (entget x))) (XOrY (assoc 10 (entget y)))))))
  20.     )
  21.   )
  22.   (setq rowcol nil xy (XOrY (assoc 10 (entget (nth 0 lslst)))) hvlst nil)
  23.   (foreach x lslst
  24.     (if (= xy (XOrY (assoc 10 (entget x))))
  25.       (setq rowcol (cons x rowcol))
  26.       (setq
  27.         hvlst (cons (vl-sort rowcol (function (lambda (x y) (Symbol (ud (assoc 10 (entget x))) (ud (assoc 10 (entget y))))))) hvlst)
  28.         rowcol nil rowcol (cons x rowcol) xy (XOrY (assoc 10 (entget x)))
  29.       )
  30.     )
  31.   )
  32.   (setq hvlst (cons (vl-sort rowcol (function (lambda (x y) (Symbol (ud (assoc 10 (entget x))) (ud (assoc 10 (entget y))))))) hvlst))
  33.   (reverse hvlst)
  34. )


本帖子中包含更多资源

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

x
发表于 2022-12-8 17:31 | 显示全部楼层
fangmin723 发表于 2022-12-8 07:48
(SortLineByXAndY lst < < t)

现在排序出来是这样的




我想要的效果是如下

[0] (<图元名: 7ff48e117300> <图元名: 7ff48e117420> <图元名: 7ff48e117390>)
[1] (<图元名: 7ff48e125aa0> <图元名: 7ff48e125bc0>)
[2] (<图元名: 7ff48e125b30> <图元名: 7ff48e12d400>)
。。。


最终的list是个以图元为元素的表中表。

这个排序函数已经很强大了。要做我这个功能,可能得部分重编吧。

本帖子中包含更多资源

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

x
 楼主| 发表于 2022-12-6 07:43 | 显示全部楼层
本帖最后由 fangmin723 于 2022-12-6 07:47 编辑
AndyWang 发表于 2022-12-6 03:18
请问下,是不是不支持属性块的排序?我用的第二个函数,会提示错误: 参数类型错误: lentityp ( (8770.62 10 ...
只要是图元就支持啊,而且插入点的组码是10,就行。你这需要处理下,entget后面跟的是<图元名: 7ff4ecd3a6b0>,并不是你拾取到的(<图元名: 7ff4ecd3a6b0> (8770.62 10805.2 0.0)),你使用(car (entsel))后,在传入我的函数中
发表于 2020-11-24 11:52 | 显示全部楼层
路过,支持一下,
发表于 2020-11-24 12:32 | 显示全部楼层
支持一下  很不错
发表于 2020-11-25 03:09 | 显示全部楼层
最短的路径是确定起点后,离他最近的点,在找离他最近的点。。。。
发表于 2021-6-12 20:50 | 显示全部楼层
具体然后运用
发表于 2021-6-21 21:32 | 显示全部楼层

支持一下  很不错
发表于 2021-6-28 13:57 | 显示全部楼层
备用。不错的代码。
发表于 2022-12-6 03:18 | 显示全部楼层
请问下,是不是不支持属性块的排序?我用的第二个函数,会提示错误: 参数类型错误: lentityp (<图元名: 7ff4ecd3a6b0> (8770.62 10805.2 0.0))
在(YSymbol (XOrY (assoc 10 (entget x)))这里的entget x处出错的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 10:24 , Processed in 4.186844 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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