(SortLineByXAndY)根据给定符号对图元表进行XY轴位置先后排序(如:先X轴升序,后Y...
本帖最后由 fangmin723 于 2022-11-12 10:00 编辑好久没有发帖了,冒个泡!!!
;;说明:根据给定符号对图元表进行XY轴位置先后排序(如:先X轴升序,后Y轴降序)
;;适用于子表的第一个元素为点表的表集排序(((1 2 3) ...) ((4 5 6) ...) ((7 8 9) ...) ...)
;;参数:lst:图元表
;;参数:XSymbol:X轴升降序符号:<、>
;;参数:YSymbol:Y轴升降序符号:<、>
;;参数:isxfirst:是否先对X轴排序
;;返回:排序后的图元表!(setq hlst (SortFirstPtlSTByXAndY lshlst < > nil))(defun SortFirstPtlSTByXAndY(lst XSymbol YSymbol isxfirst / hvlst lslst rowcol symbol ud xory xy)
(if isxfirst
(setq
XOrY caar;;设置第一次依据排序坐标和第二次依据X轴位置比对
ud cadar;;设置第二次根据Y坐标进行排序
Symbol YSymbol;;设置第二次排序的升降序
lslst (vl-sort lst (function (lambda (x y) (XSymbol (XOrY x) (XOrY y)))));;先对表进行X轴排序
)
(setq
XOrY cadar;;设置第一次依据排序坐标和第二次依据Y轴位置比对
ud caar;;设置第二次根据X坐标进行排序
Symbol XSymbol;;设置第二次排序的升降序
lslst (vl-sort lst (function (lambda (x y) (YSymbol (XOrY x) (XOrY y)))))
)
)
(setq rowcol nil xy (XOrY (car lslst)) hvlst nil)
(foreach x lslst
(if (= xy (XOrY x))
(setq rowcol (cons x rowcol))
(setq
hvlst (append hvlst (vl-sort rowcol (function (lambda (x y) (Symbol (ud x) (ud y))))))
rowcol nil rowcol (cons x rowcol) xy (XOrY x)
)
)
)
(setq hvlst (append hvlst (vl-sort rowcol (function (lambda (x y) (Symbol (ud x) (ud y)))))))
hvlst
)
;;说明:根据给定符号对图元表进行XY轴位置先后排序(如:先X轴升序,后Y轴降序)
;;参数:lst:图元表
;;参数:XSymbol:X轴升降序符号:<、>
;;参数:YSymbol:Y轴升降序符号:<、>
;;参数:isxfirst:是否先对X轴排序
;;返回:排序后的图元表!(setq hlst (SortLineByXAndY lshlst < > nil))
(defun SortLineByXAndY(lst XSymbol YSymbol isxfirst / hvlst lslst rowcol symbol ud xory xy)
(if isxfirst
(setq
XOrY cadr;;设置第一次依据排序坐标和第二次依据X轴位置比对
ud caddr;;设置第二次根据Y坐标进行排序
Symbol YSymbol;;设置第二次排序的升降序
lslst (vl-sort lst (function (lambda (x y) (XSymbol (XOrY (assoc 10 (entget x))) (XOrY (assoc 10 (entget y)))))));;先对表进行X轴排序
)
(setq
XOrY caddr;;设置第一次依据排序坐标和第二次依据Y轴位置比对
ud cadr;;设置第二次根据X坐标进行排序
Symbol XSymbol;;设置第二次排序的升降序
lslst (vl-sort lst (function (lambda (x y) (YSymbol (XOrY (assoc 10 (entget x))) (XOrY (assoc 10 (entget y)))))))
)
)
(setq rowcol nil xy (XOrY (assoc 10 (entget (nth 0 lslst)))) hvlst nil)
(foreach x lslst
(if (= xy (XOrY (assoc 10 (entget x))))
(setq rowcol (cons x rowcol))
(setq
hvlst (append hvlst (vl-sort rowcol (function (lambda (x y) (Symbol (ud (assoc 10 (entget x))) (ud (assoc 10 (entget y))))))))
rowcol nil rowcol (cons x rowcol) xy (XOrY (assoc 10 (entget x)))
)
)
)
(setq hvlst (append hvlst (vl-sort rowcol (function (lambda (x y) (Symbol (ud (assoc 10 (entget x))) (ud (assoc 10 (entget y)))))))))
hvlst
)
本帖最后由 fangmin723 于 2022-12-9 07:32 编辑
AndyWang 发表于 2022-12-8 17:31
现在排序出来是这样的
修改部分内容就行了
;;说明:根据给定符号对图元表进行XY轴位置先后排序(如:先X轴升序,后Y轴降序)
;;参数:lst:图元表
;;参数:XSymbol:X轴升降序符号:<、>
;;参数:YSymbol:Y轴升降序符号:<、>
;;参数:isxfirst:是否先对X轴排序
;;返回:排序后的图元表!(setq hlst (SortLineByXAndY lshlst < > nil))
(defun SortLineByXAndY(lst XSymbol YSymbol isxfirst / hvlst lslst rowcol symbol ud xory xy)
(if isxfirst
(setq
XOrY cadr;;设置第一次依据排序坐标和第二次依据X轴位置比对
ud caddr;;设置第二次根据Y坐标进行排序
Symbol YSymbol;;设置第二次排序的升降序
lslst (vl-sort lst (function (lambda (x y) (XSymbol (XOrY (assoc 10 (entget x))) (XOrY (assoc 10 (entget y)))))));;先对表进行X轴排序
)
(setq
XOrY caddr;;设置第一次依据排序坐标和第二次依据Y轴位置比对
ud cadr;;设置第二次根据X坐标进行排序
Symbol XSymbol;;设置第二次排序的升降序
lslst (vl-sort lst (function (lambda (x y) (YSymbol (XOrY (assoc 10 (entget x))) (XOrY (assoc 10 (entget y)))))))
)
)
(setq rowcol nil xy (XOrY (assoc 10 (entget (nth 0 lslst)))) hvlst nil)
(foreach x lslst
(if (= xy (XOrY (assoc 10 (entget x))))
(setq rowcol (cons x rowcol))
(setq
hvlst (cons (vl-sort rowcol (function (lambda (x y) (Symbol (ud (assoc 10 (entget x))) (ud (assoc 10 (entget y))))))) hvlst)
rowcol nil rowcol (cons x rowcol) xy (XOrY (assoc 10 (entget x)))
)
)
)
(setq hvlst (cons (vl-sort rowcol (function (lambda (x y) (Symbol (ud (assoc 10 (entget x))) (ud (assoc 10 (entget y))))))) hvlst))
(reverse hvlst)
)
fangmin723 发表于 2022-12-8 07:48
(SortLineByXAndY lst < < t)
现在排序出来是这样的
我想要的效果是如下
(<图元名: 7ff48e117300> <图元名: 7ff48e117420> <图元名: 7ff48e117390>)
(<图元名: 7ff48e125aa0> <图元名: 7ff48e125bc0>)
(<图元名: 7ff48e125b30> <图元名: 7ff48e12d400>)
。。。
最终的list是个以图元为元素的表中表。
这个排序函数已经很强大了。要做我这个功能,可能得部分重编吧。
本帖最后由 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))后,在传入我的函数中
路过,支持一下, 支持一下很不错 非常感谢,!!!!! 最短的路径是确定起点后,离他最近的点,在找离他最近的点。。。。 具体然后运用
支持一下很不错 支持源码,,, 备用。不错的代码。 请问下,是不是不支持属性块的排序?我用的第二个函数,会提示错误: 参数类型错误: lentityp (<图元名: 7ff4ecd3a6b0> (8770.62 10805.2 0.0))
在(YSymbol (XOrY (assoc 10 (entget x)))这里的entget x处出错的。