kwok 发表于 2013-2-7 19:15:26

想请指点一下,定了4个点,想它始终由p1点为起点顺时排序

我用框选定了p1和p3,然后设了p2和p4,想让它们从p1,p2,p3,p4排位序
不管框选改了p1的位置,都是顺时什排位.例如我框选时是从p2点开始,这里p2就变p1了后面也跟着变.
想达到效果是,p1和p2点不变,让p3和p4根据p1和p2来顺时或逆时排序.

下面是代码
(defun c:tt6();;;框选
(setq pt1 (getpoint "\n框选范围:")
      pt3 (getcorner pt1)
      pt2 (list (car pt1)(cadr pt3))
      pt4 (list (car pt3)(cadr pt1))
)
;;;;;;;;;;;下面是是搜坛里的排序,建了个空表,想让他们排序,不起作用;;请指正一下,谢谢.
(setq ptlist (ssadd));;建空表
(ssadd pt1 ptlist);将若干个元素增加到集
(ssadd pt3 ptlist)
(ssadd pt2 ptlist)
(ssadd pt4 ptlist)
;;;对顶点表排序
(setqptlist (vl-sort ptlist (function
                  (lambda (e1 e2)
                      (< (+ (car e1) (cadr e1)) (+ (car e2) (cadr e2))) ))))
)



还有想问一下entmake 可以定2点直接创建矩形吗?



Gu_xl 发表于 2013-2-7 19:48:25


(defun c:tt ()
(setq p1 (getpoint "\n第一点:"))
(setq p2 (getcorner p1 "\n对角点:"))
(setq ll (apply 'mapcar (list 'min p1 p2))
        ur (apply 'mapcar (list 'max p1 p2))
        )
(setq p1 (list (car ll) (cadr ur) (caddr ll))
        p2 ur
        p3 (list (car ur) (cadr ll) (caddr ll))
        p4 ll)
(list p1 p2 p3 p4)
)

kwok 发表于 2013-2-7 19:57:36

本帖最后由 kwok 于 2013-2-7 20:13 编辑

Gu_xl 发表于 2013-2-7 19:48 static/image/common/back.gif

谢谢,不过p1点始终于是在左上角,
可以让开始框选的第一点做为p1点吗,如你的代码的getpoint"第一点,不管从左上或是坐右下角开始,它都是作为做p1.
想达到效果是,p1和p2点不变,让p3和p4根据p1和p2来顺时或逆时排序.

Gu_xl 发表于 2013-2-7 20:15:39

kwok 发表于 2013-2-7 19:57 static/image/common/back.gif
谢谢,不过p1点始终于是在左上角,
可以让开始框选的第一点做为p1点吗,如你的代码的getpoint"第一点,不管从 ...


(defun c:tt (/ P1 A P2 LL UR P3 P4 PL)

(setq        p1 (getpoint "\n第一点:")
        ap1
)

(setq p2 (getcorner p1 "\n对角点:"))

(setq        ll (apply 'mapcar (list 'min p1 p2))

        ur (apply 'mapcar (list 'max p1 p2))

)

(setq        p1 (list (car ll) (cadr ur) (caddr ll))

        p2 ur

        p3 (list (car ur) (cadr ll) (caddr ll))

        p4 ll
)

(setq pl (list p1 p2 p3 p4))
(while (not (equal a (car pl) 1e-6))
    (setq pl (reverse (cons (car pl) (reverse (cdr pl)))))
)
)

weiqi 发表于 2013-2-7 20:20:38

围观之~支持G版~

xsso 发表于 2013-2-7 21:04:24

学习一下思路和技术

kwok 发表于 2013-2-7 22:08:49

谢谢G版的帮助,
不过效果还不是我想的,
我想达到的是不管框选的第一点从什么位置开始框选,它同时也是p1点,然后再根据p1排序其它点,你这个冒似把p1定在左上角.
这个p1点有可能是在左下角,也有可能在右下角或是右上角,它是跟框选第一点在一起的,例如有可能在框选是从右上角到左下角,那p1点就在右上角;,也有可能从右下角到左上角框选,那p1就在右下角.

xyp1964 发表于 2013-2-7 23:24:07



;; 自定义函数下载: http://bbs.mjtd.com/thread-95673-1-1.html
;; 伪源码需要e派工具箱(XCAD)的支持
(defun c:tt ()
(if (and (setq p1 (getpoint "\n基点<退出>: "))
         (setq p2 (getcorner p1 "\n对角点<退出>: "))
      )
    (progn
      (xyp-MkLaCo "TEST1" 1)
      (setq s1(xyp-rectang p1 p2)
            ptn(xyp-get-Vertexs s1 0)
            ptn1 (xyp-Ptn2CCW ptn)
            ptn(if (equal (car ptn) (car ptn1))
                   ptn
                   (reverse (cdr (reverse (cons (last ptn1) ptn1))))
               )
            i1
      )
      (xyp-MkLaCo "TEST2" 2)
      (foreach pt ptn
      (xyp-Text 5 pt (itoa i))
      (setq i (1+ i))
      )
    )
)
(princ)
)


kwok 发表于 2013-2-8 00:03:34

楼上效果是我所想,可惜是伪源码,没得学习.

yjr111 发表于 2013-2-8 01:23:28

(defun c:tt (/ plst)
(if (and (setq p1 (getpoint "\n基点<退出>: "))
         (setq p2 (getcorner p1 "\n对角点<退出>: "))
      )
    (progn
      (command "rectang" p1 p2 )
      (setq s(entget(entlast)))
      (setq zf (tt (entlast)))
      (foreach x s(if (=(car x)10)(setq plst(cons (cdr x)plst))))
      (setq plst(reverse plst))
      (if (not zf)(setq plst (cons (car plst)(reverse (cdr plst)))))
      (setq n 1)
      (mapcar '(lambda(x)(command "text" x "50" "" (itoa n))(setq n(1+ n)))plst)
      )
    )
(princ)
)
(defun tt(e / flag)
    (setq Obj (vlax-ename->vla-object e))
    (vla-offset (setq Obj(vlax-ename->vla-object (entlast))) 0.0001)
    (setq oobj (vlax-ename->vla-object (entlast)))
    (if (> (vla-get-length obj) (vla-get-length oobj)) (setq flag 1))
    (vla-delete OObj)
flag
)

页: [1] 2
查看完整版本: 想请指点一下,定了4个点,想它始终由p1点为起点顺时排序