明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 547|回复: 15

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

[复制链接]
发表于 2024-9-4 16:14:21 | 显示全部楼层 |阅读模式
本帖最后由 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)
)
发表于 2024-9-5 10:07:15 | 显示全部楼层
  1. (defun c:tt ()
  2.   (if (and (setq ss (ssget '((0 . "LINE")))) (= (sslength ss) 2)) ;选择2根直线
  3.     (progn
  4.       (setq l1 (ssname ss 0)
  5.             l2 (ssname ss 1)
  6.             p1 (vlax-curve-getStartPoint l1)
  7.             p2 (vlax-curve-getEndPoint l1)
  8.             p3 (vlax-curve-getStartPoint l2)
  9.             p4 (vlax-curve-getEndPoint l2)
  10.       )
  11.       (if (or (equal p1 p3) (equal p1 p4) (equal p2 p3) (equal p2 p4))
  12.         (princ "\n存在共用端点")
  13.         (mapcar 'prin1 (list p1 p2 p3 p4))
  14.       )
  15.     )
  16.   )
  17.   (princ)
  18. )
 楼主| 发表于 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))还是不行
发表于 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
 楼主| 发表于 2024-9-4 16:16:14 | 显示全部楼层

发表于 2024-9-4 16:17:12 | 显示全部楼层
浮点数误差
 楼主| 发表于 2024-9-4 16:19:04 | 显示全部楼层
但是把坐标拆出来判断又是可以的,很奇怪
例:(and (= (car p1) (car p2)) (= (cadr p1) (cadr p2)))
 楼主| 发表于 2024-9-4 16:33:37 | 显示全部楼层

请问为啥用(and (= (car p1) (car p2)) (= (cadr p1) (cadr p2)))把坐标拆开来比较又可以了呢?
发表于 2024-9-4 17:39:12 | 显示全部楼层
因为=号有容差呗
发表于 2024-9-5 09:53:54 | 显示全部楼层
本帖最后由 tryhi 于 2024-9-5 09:57 编辑

你不觉得你这句 (/= p1 p2 p3 p4)永远不可能成立吗?你是否对\=这个函数有误解?以你的理解来看,你觉得这句返回什么(/= 1 2 1 2)
发表于 2024-9-5 13:42:01 | 显示全部楼层
tryhi 发表于 2024-9-5 09:53
你不觉得你这句 (/= p1 p2 p3 p4)永远不可能成立吗?你是否对\=这个函数有误解?以你的理解来看,你觉得这 ...

是相邻两个数比较,12 23 34...,不是两两比较。对比较结果取and。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-22 20:31 , Processed in 0.165677 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表