如何获得排序后圆的图元表?
本帖最后由 kanxiaokan 于 2019-7-24 15:27 编辑我需要得到如图所示的效果,如何修改下面的代码?
(defun c:tt ()
(princ "\n请选择要排序的实体...")
(if(setq ss (ssget))
(progn
;; 1、获取点位表
(setq lst '()
i 0
)
(repeat (sslength ss)
(setq en(ssname ss i)
ent (entget en)
pt(cdr (assoc 10 ent))
lst (cons pt lst)
i (1+ i)
)
)
;; 2、排序
(setq
lst (vl-sort lst '(lambda (e1 e2)
(if (equal (car e1) (car e2) 1e1)
(if (equal (cadr e1) (cadr e2) 1e1)
(< (car e1) (car e2))
(< (cadr e1) (cadr e2))
)
(< (car e1) (car e2))
)
)
)
)
;; 3、写序号文字
(setq i 1)
(foreach ptlst
(command "_.text" "j" "mc""non"pt (getvar "TEXTSIZE") 0 (itoa i))
(setq i (1+ i))
)
)
)
(princ)
)
本帖最后由 satan421 于 2019-7-25 08:56 编辑
;; test
;程序修改为如下:
(defun c:tt ()
(command "_.undo" "be")
(if (= (setq YxWc (getreal "\nX坐标容许差<10>=")) nil)
(setq YxWc 10.0)
)
(If (= (setq WzGd (getreal (strcat "\n编号文字高度<" (rtos (getvar "TEXTSIZE")) ">="))) nil)
(setq WzGd (getvar "TEXTSIZE"))
(setvar "TEXTSIZE" WzGd)
)
(princ "\n请选择要排序的实体...")
(if (setq ss (ssget '((0 . "circle"))))
(progn
;; 1、获取点位表
(setq lst '()
i 0
)
(repeat (sslength ss)
(setq ent (ssname ss i)
dxf (entget ent)
pt(cdr (assoc 10 dxf))
lst (cons pt lst)
i (1+ i)
)
)
;; 2、排序
(setq lst (vl-sort lst '(lambda (e1 e2)
(if (equal (car e1) (car e2) YxWc)
(< (cadr e1) (cadr e2))
(< (care1) (care2))
)
)
)
)
(setq pts nil)
(setq i 1)
(while lst
(setq pt (car lst))
(setq ptb (vl-remove-if '(lambda(ptt)(not (equal (car pt) (car ptt) YxWc))) lst))
(mapcar '(lambda(ptt)(setq lst (vl-remove ptt lst))) ptb)
(if (= i (* 2 (fix (* 0.5 i))))
(setq ptb (reverse ptb))
)
(setq pts (append (reverse ptb) pts))
(setq i (1+ i))
)
(setq pts (reverse pts))
;; 3、写序号文字
(setq i 1)
(foreach pt pts
(command "_.text" "j" "mc""non" pt WzGd 0 (itoa i))
(setq i (1+ i))
)
)
)
(command "_.undo" "e")
(princ)
)
本帖最后由 satan421 于 2019-7-24 13:46 编辑
1、实际存在像图中这样的线连接所有圆,还是此线只是配合箭头示意?
2、图元表是什么,圆的图元资料吗?
3、你是只要这一种排序的情况,还是可能有很多种情况?
satan421 发表于 2019-7-24 13:44
1、实际存在像图中这样的线连接所有圆,还是此线只是配合箭头示意?
2、图元表是什么,圆的图元资料吗?
...
粉色的线是配合箭头的示意图。
按示意图排列后获得的圆的图元表 论坛搜一下很多排序代码,你这种规律的就按照xy值排列应该好搞的 start4444 发表于 2019-7-24 14:34
论坛搜一下很多排序代码,你这种规律的就按照xy值排列应该好搞的
找到类似的,改了一下,还是达不到我想要的。我更新帖子了。大佬您帮看一下,如何改? 1、先根据X坐标分组,需要考虑容差(这个容差不好确定,需要考虑不止一种因素)
2、得到分组后,每组内再根据Y坐标的大小排序
3、组内排序完成后,再根据每组的第一个元素的X坐标排序
4、根据排序的结果,偶数序号的组元素顺序反转
5、按顺序将各组元素合并为一组 satan421 发表于 2019-7-25 08:50
;; test
大佬你这个,是类似7楼的方法吗?能否给代码研究一下。 是按我自己的思路写的。
再给你个子函数,你应该能写出来了。
;;点表根据X坐标值分组(考虑容差)
;;by satan421
(defun classify (lst fuzzy / alst tlst x)
(setq alst '())
(while lst
(setq x (caar lst) tlst '())
(mapcar (function(lambda (n) (if (equal (car n) x fuzzy) (setq tlst (cons n tlst))))) lst)
(setq alst (cons (reverse tlst) alst))
(mapcar (function(lambda(n)(if (member n lst) (setq lst (vl-remove n lst))))) tlst)
)
(reverse alst)
)
页:
[1]
2