hoopert 发表于 2016-1-29 21:27:24

闭合二维多线段改起始坐标到Y最小点

本帖最后由 hoopert 于 2016-1-30 00:00 编辑

;;;在明经学了很多东西,也发一个练习之作,新手,请各大侠多多指教。

;;;图一为命令运行前多线段及其起始点位置(图中红色圆圈处)

      

;;第二个图为运行合令后多线段及其起始点位置(红色圆圈处)

      

;;;改变闭合二维多线段的始点坐标到Y坐标最小的点处
(defun C:LwpolylineChangeStartpoint ()
    (setq en (car (entsel "\n Select Lwpolyline:")))
    (setq ed (entget en))
    ;;导出坐标点列表
    (setq plst '())
    (mapcar '(lambda (X)
               (if (= 10 (car x))
                     (setq plst (cons (cdr x) plst))
                     ) ;_ end of if
               )
            ed
            )
    (setq plst (reverse plst))
    ;;坐标点按Y最小(Y相同时,X最小)排序
    (setq plst (vl-sort      plst
                        '(lambda (a b)
                           (if (= (cadr a) (cadr b))
                                 (< (car a) (car b))
                                 (< (cadr a) (cadr b))
                                 )
                           )
                        )
          )
    ;;确定Y最小值点坐标,它将成为多段线的始点
    (setq Startpt (car plst))


    ;;取出多线段实体数据的前半部分和后半部分
    (setq pLst ed)
    (setq Lst0 '())
    (while (/= (car (car pLst)) 10)
      (setq Lst0 (append Lst0 (list (car pLst))))
      (setq pLst (cdr pLst))
      )
    (setq Lst2 (list (car (reverse pLst))))
    (setq pLst (reverse (cdr (reverse pLst))))

    ;;各顶点循环,直到Y最小点为始点
    (setq pLst1 '())
    (while (/= startpt (cdr (car plst)))
      (setq plst (append (cdr plst) (list (car plst))))
      )
    (setq Lst1 plst)

    ;;组成新的实体数据
    (setq ed (append lst0 lst1 lst2))

    ;;更新实体
    (entmod ed)

    (princ)

    );_函数结束







llsheng_73 发表于 2016-1-30 02:20:13

命令通常要在命令行输入让CAD执行,所以名称不宜太长,如果输入半天不小心输错一两个字母,给你说是未知命令,不知道楼主是否会同样郁闷

hoopert 发表于 2016-1-30 10:10:37

llsheng_73 发表于 2016-1-30 02:20
命令通常要在命令行输入让CAD执行,所以名称不宜太长,如果输入半天不小心输错一两个字母,给你说是未知命令 ...

理解理解,本来是要做函数用的,要发上来,随手就处理了一下,没改。多谢指点

llsheng_73 发表于 2016-1-30 21:49:52

本帖最后由 llsheng_73 于 2016-1-31 02:23 编辑

hoopert 发表于 2016-1-30 10:10 http://bbs.mjtd.com/static/image/common/back.gif
理解理解,本来是要做函数用的,要发上来,随手就处理了一下,没改。多谢指点

(defun startMiny(e / pt a p);;调整多段线起点为最南端点(多段线可有有凸度,可以各子段宽度各异)
(setq e(entget e)a(member(assoc 10 e)e)e(reverse(member(nth(1-(vl-position(car a)e))e)(reverse e))))
(repeat(cdr(assoc 90 e))
    (setq p(list(car a))a(cdr a))
    (while(and(/=(caar a)10)a)
      (setq p(cons(car a)p)a(cdr a)))
    (setq pt(cons(reverse p)pt)))
(setq p(car(vl-sort pt'(lambda(a b)(<(caddar a)(caddar b))))));;最小Y值所在的点
(entmod(append e(apply'append(append(member p(reverse pt))(reverse(cdr(member p pt)))))))
(defun c:tt(/ e a b)
(if(setq e(car(entsel)))
    (progn(vla-GetBoundingBox(vlax-ename->vla-object e)'a'b)
      (setq a(cadr(vlax-safearray->list a));;多段线最小Y值
   a(cdar(vl-remove-if'(lambda(x)(or(/=(car x)10)(/=(caddr x)a)))(entget e))));;最小Y值所在的点(如果最南端有凸度极大可能没有对应点。。。,因此,找它的最南端点还是宜用上边函数里边的方法)
      (starton e a))))
(defun starton(e p / a l pt);;多段线起点调整至指定点
(setq e(entget e)a(member(assoc 10 e)e)e(reverse(member(nth(1-(vl-position(car a)e))e)(reverse e))))
(repeat(cdr(assoc 90 e))
    (setq l(list(car a))a(cdr a))
    (while(and(/=(caar a)10)a)
      (setq l(cons(car a)l)a(cdr a)))
    (setq pt(cons(reverse l)pt)))
(setq p(assoc(cons 10(mapcar'+'(0 0)p))pt))
(entmod(append e(apply'append(append(member p(reverse pt))(reverse(cdr(member p pt))))))))

试下这个,与你自己那个比较一下,主要看下有凸度的情况

lucas_3333 发表于 2016-1-30 23:44:01

llsheng_73 发表于 2016-1-30 21:49 static/image/common/back.gif
试下这个,与你自己那个比较一下,主要看下有凸度的情况

(start e a))))
(defun starton(e p / a l pt)

是不是笔误哟!

hoopert 发表于 2016-2-1 00:25:22

本帖最后由 hoopert 于 2016-2-1 00:30 编辑

llsheng_73 发表于 2016-1-30 21:49 static/image/common/back.gif
试下这个,与你自己那个比较一下,主要看下有凸度的情况
(defun c:tt(/ e a b c pl pt)
    (setq e (entget (car (entsel "Please Select LWpolyline:"))))
    (setq a (reverse (member (nth(1- (vl-position (assoc 10 e) e)) e) (reverse e))))
    (setq b (member (assoc 10 e) e))
    (setq b (reverse (member (nth (1- (vl-position (assoc 210 b) b)) b) (reverse b))))
    (setq c (member (assoc 210 e) e))
    (setq pl (vl-remove-if-not '(lambda(x) (= 10 (car x))) b))
    (setq pt (car (vl-sort pl
                           '(lambda (a b)
                              (if (= (caddr a) (caddr b))
                                    (< (cadr a) (cadr b))
                                    (< (caddr a) (caddr b)))))))
      (setq b (append (member pt b) (reverse (cdr (member pt (reverse b))))))
      (entmod (append a b c))
    (princ)
    )

原来的程序对凸度的情况也没有问题。学习消化了一下,我又重新整理一遍。
最主要的是您的程序中,将210组码(及如果附有扩展数据)的顺序打乱了,我不知道这个会对多线段本身会不会有影响。
页: [1]
查看完整版本: 闭合二维多线段改起始坐标到Y最小点