waityou5683 发表于 2015-7-10 15:51:48

提取点坐标

    请问我想提取图中的点坐标,但是一个个点这样用鼠标操作太麻烦了,是不是可以用图元来一次提取点啊。但是提取点必须是按照图中顺序一列一列这样从左至右从下向上提取,提取完一列提取下一列这样。或者有其他更好的方法啊

Block 发表于 2020-8-12 17:48:00

x_s_s_1 发表于 2015-7-10 20:42
只选择纵线

(defun deldup      (ptLst alw / pt1)
    (cond ((<= (length ptLst) 1) ptLst)
          (t
         (setq pt1 (car ptLst))
         (cons pt1
               (vl-remove-if
                   '(lambda (x) (equal pt1 x alw))
                   (deldup (cdr ptLst) alw)
               )
         )
          )
    )
)

上面deldup函数内部怎么调用自己?

satan421 发表于 2020-8-13 11:47:48

Block 发表于 2020-8-12 17:48
上面deldup函数内部怎么调用自己?

递归。计算阶乘的例子:
(defun fact (n / )
(if (= n 0)
    1
    (* n (fact (1- n)))
)
)

Block 发表于 2020-8-18 17:47:27

satan421 发表于 2020-8-13 11:47
递归。计算阶乘的例子:
(defun fact (n / )
(if (= n 0)


很神奇...也不会死循环啊

fan_zh 发表于 2015-7-10 16:32:08

上cad图,在cad中问题说明白些,这样有利别人帮你解决问题

x_s_s_1 发表于 2015-7-10 20:42:34

只选择纵线(vl-load-com)
(defun c:tt (/ ss lst lst1 m n x y f)
(defun x_ssn (ss / n lst)
    (repeat (setq N (sslength ss))
      (setq LST (cons (ssname SS (setq N (1- N))) LST))
    )
)
(defun deldup        (ptLst alw / pt1)
    (cond ((<= (length ptLst) 1) ptLst)
          (t
           (setq pt1 (car ptLst))
           (cons pt1
               (vl-remove-if
                   '(lambda (x) (equal pt1 x alw))
                   (deldup (cdr ptLst) alw)
               )
           )
          )
    )
)
(defun get_dxf (en num /) (cdr (assoc num (entget en))))
(setq f (open (getfiled "坐标输出为:" "d:/" "txt" 1) "w"))
(prompt "\n仅选择纵向线:")
(setq        ss(ssget)
        lst (x_ssn ss)
        lst (vl-sort
              lst
              '(lambda (x y) (< (car (get_dxf x 10)) (car (get_dxf y 10))))
          )
)
(foreach n lst
    (setq ss (ssget "f" (list (get_dxf n 10) (get_dxf n 11))))
    (setq lst1 (x_ssn ss))
    (setq lst1 (deldup (vl-remove nil
                                  (mapcar '(lambda (x)
                                             (vlax-invoke
                                             (vlax-ename->vla-object n)
                                             'IntersectWith
                                             (vlax-ename->vla-object x)
                                             acExtendNone
                                             )
                                           )
                                          lst1
                                  )
                     )
                     1e-6
             )
          lst1 (vl-sort lst1 '(lambda (x y) (< (cadr x) (cadr y))))
    )
    (foreach m lst1
      (write-line
        (strcat (rtos (car m) 2 3) "," (rtos (cadr m) 2 3))
        f
      )
    )
    (write-line "下一个" f)
)
(close f)
(princ)
)

waityou5683 发表于 2015-7-13 16:57:20

x_s_s_1 发表于 2015-7-10 20:42 static/image/common/back.gif
只选择纵线

是的,就是按竖向线方向提取所有的交点,比如第一列共计13个点提取完提取第二列一次类推这种,直到最后一列提取完毕。。因为不止这一个剖面,还有其他的剖面,所以坐标最好统一,比如像图中那样左下角为坐标原点。。这样每个剖面的基本坐标是一致的,最终提取结束就可以所有剖面的点进行连接了。。

waityou5683 发表于 2015-7-13 16:59:33

x_s_s_1 发表于 2015-7-10 20:42 static/image/common/back.gif
只选择纵线

原来是你啊,非常感谢!!你这个是世界坐标是吧

x_s_s_1 发表于 2015-7-13 21:20:02

waityou5683 发表于 2015-7-13 16:59 static/image/common/back.gif
原来是你啊,非常感谢!!你这个是世界坐标是吧

是世界坐标系

x_s_s_1 发表于 2015-7-13 21:21:59

你的问题就是这么提的,均以左下角?

暗夜贵族 发表于 2015-7-15 11:07:42

获得交点,按x轴排序吗?

xyccf 发表于 2015-8-12 00:08:06

x_s_s_1 发表于 2015-7-10 20:42 static/image/common/back.gif
只选择纵线

你好,请问源码中对选择集按照x坐标排列的部分在哪儿啊,我是小白,请多多指教

x_s_s_1 发表于 2015-8-13 07:49:44

vl-sort那里
页: [1] 2
查看完整版本: 提取点坐标