Scarlet2001 发表于 2024-9-4 16:14:21

为什么两个线的共用端点提取出的DXF不相等呢?

本帖最后由 Scarlet2001 于 2024-9-4 16:26 编辑

如题,用这个代码来判断两条线是否有共用端点时不能成功,为什么DXF提取出的坐标值是一样的但是=判断中却是不等的呢?
(defun c:tt ( / ss a1 a2 p1 p2 p3 p4)
      (if (setq ss (ssget '((0 . "LINE"))));选择直线
                (if (= 2 (sslength ss));确认选中直线数量为2
                        (progn
                              (setq a1 (entget (ssname ss 0)));线1定义数据
                              (setq a2 (entget (ssname ss 1)));线2定义数据
                              (setq p1 (cdr (assoc 10 a1)));线1点1
                              (setq p2 (cdr (assoc 11 a1)));线1点2
                              (setq p3 (cdr (assoc 10 a2)));线2点3
                              (setq p4 (cdr (assoc 11 a2)));线2点4
                              (if (not (/= p1 p2 p3 p4));如果有两个点一样,理论上两线共用一个端点
                                        (princ "\n存在共用端点")
                                        (progn
                                                (foreach p (list p1 p2 p3 p4) (princ "\n") (princ p))
                                        )
                              )
                        )
                )
      )
      (princ)
)

xyp1964 发表于 2024-9-5 10:07:15

(defun c:tt ()
(if (and (setq ss (ssget '((0 . "LINE")))) (= (sslength ss) 2)) ;选择2根直线
    (progn
      (setq l1 (ssname ss 0)
            l2 (ssname ss 1)
            p1 (vlax-curve-getStartPoint l1)
            p2 (vlax-curve-getEndPoint l1)
            p3 (vlax-curve-getStartPoint l2)
            p4 (vlax-curve-getEndPoint l2)
      )
      (if (or (equal p1 p3) (equal p1 p4) (equal p2 p3) (equal p2 p4))
      (princ "\n存在共用端点")
      (mapcar 'prin1 (list p1 p2 p3 p4))
      )
    )
)
(princ)
)

Scarlet2001 发表于 2024-9-5 14:48:13

tryhi 发表于 2024-9-5 09:53
你不觉得你这句 (/= p1 p2 p3 p4)永远不可能成立吗?你是否对\=这个函数有误解?以你的理解来看,你觉得这 ...

懂了,我理解错了,以为是逐一比较
但是把(not (/= p1 p2 p3 p4))改成(or (= p1 p2) (= p1 p3) (= p1 p4) (= p2 p3) (= p2 p4) (= p3 p4))还是不行

tryhi 发表于 2024-9-5 15:19:23

Scarlet2001 发表于 2024-9-5 14:48
懂了,我理解错了,以为是逐一比较
但是把(not (/= p1 p2 p3 p4))改成(or (= p1 p2) (= p1 p3) (= p1 p4 ...

因为=不能比较“表”,或者准确来说,地址不同的表,用=对比则返回nil,你试试下面的代码

(setq
p1 '(1 2)
p2 '(1 2)
)
(= p1 p2) ;--> nil

Scarlet2001 发表于 2024-9-4 16:16:14

https://free2.yunpng.top/2024/09/04/66d817294f02e.png

d1742647821 发表于 2024-9-4 16:17:12

浮点数误差

Scarlet2001 发表于 2024-9-4 16:19:04

但是把坐标拆出来判断又是可以的,很奇怪
例:(and (= (car p1) (car p2)) (= (cadr p1) (cadr p2)))

Scarlet2001 发表于 2024-9-4 16:33:37

d1742647821 发表于 2024-9-4 16:17
浮点数误差

请问为啥用(and (= (car p1) (car p2)) (= (cadr p1) (cadr p2)))把坐标拆开来比较又可以了呢?

你有种再说一遍 发表于 2024-9-4 17:39:12

因为=号有容差呗

tryhi 发表于 2024-9-5 09:53:54

本帖最后由 tryhi 于 2024-9-5 09:57 编辑

你不觉得你这句 (/= p1 p2 p3 p4)永远不可能成立吗?你是否对\=这个函数有误解?以你的理解来看,你觉得这句返回什么(/= 1 2 1 2)

hubeiwdlue 发表于 2024-9-5 13:42:01

tryhi 发表于 2024-9-5 09:53
你不觉得你这句 (/= p1 p2 p3 p4)永远不可能成立吗?你是否对\=这个函数有误解?以你的理解来看,你觉得这 ...

是相邻两个数比较,12 23 34...,不是两两比较。对比较结果取and。
页: [1] 2
查看完整版本: 为什么两个线的共用端点提取出的DXF不相等呢?