明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: vken7az2p

[求助]:[0304]關於"屬性標籤值"內容替換問題?

  [复制链接]
 楼主| 发表于 2006-6-7 17:35:00 | 显示全部楼层


请问版主,我已在程序中加上了误差判断
但在判断种类A~D上面为何有时会排序判断错误
而需要在判断一次才是正确的排列方法呢

列出A及B的排序方法
烦请版主看看该怎样处里呢
谢谢
(defun ar_sort_a ( / y_sort_list)
(setq y_sort_list (vl-sort lst '(lambda (1% 2%)
(if (not (equal (cadr (nth 0 1%)) (cadr (nth 0 2%)) 1e-5))
(> (cadr (nth 0 1%)) (cadr (nth 0 2%)) )
) ) ) )
(setq lst (vl-sort y_sort_list '(lambda (1% 2%)
(if (not (equal (car (nth 0 1%)) (car (nth 0 2%)) 1e-5))
(< (car (nth 0 1%)) (car (nth 0 2%)))
) ) ) )
) ;;_(A)左->右&上->下

;;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(defun ar_sort_b ( / y_sort_list)
(setq y_sort_list (vl-sort lst '(lambda (1% 2%)
(if (not (equal (cadr (nth 0 1%)) (cadr (nth 0 2%)) 1e-5))
(< (cadr (nth 0 1%)) (cadr (nth 0 2%)) )
) ) ) )
(setq lst (vl-sort y_sort_list '(lambda (1% 2%)
(if (not (equal (car (nth 0 1%)) (car (nth 0 2%)) 1e-5))
(< (car (nth 0 1%)) (car (nth 0 2%)))
) ) ) )
) ;;_(B)左->右&下->上

发表于 2006-6-8 07:55:00 | 显示全部楼层
  1. 注意:秋枫的比较函数是用cond写的
  2. (setq PLIST (vl-sort PLIST
  3.        '(lambda (P1 P2)
  4.    (cond ((< (car P1) (car P2)) t)
  5.          ((and (= (car P1) (car P2))
  6.         (< (cadr P1) (cadr P2))
  7.           )
  8.           t
  9.          )
  10.          ((and (= (car P1) (car P2))
  11.         (= (cadr P1) (cadr P2))
  12.         (< (caddr P1) (caddr P2))
  13.           )
  14.           t
  15.          )
  16.          (t NIL)
  17.    )
  18.         )
  19.      )
  20. )
 楼主| 发表于 2006-6-9 08:09:00 | 显示全部楼层


希望龙版大可以在指导一下
小弟理解了一下秋枫的程序
写出了这面这样的排序方式
不知道是不是就是这样呢?

(setq y_sort_list (vl-sort lst '(lambda (1% 2%)
(if (not (equal (cadr (nth 0 1%)) (cadr (nth 0 2%)) 1e-5))
(> (cadr (nth 0 1%)) (cadr (nth 0 2%)) )
) ) ) ) ;;完成Y方向排序

(setq x_sort_list (vl-sort y_sort_list '(lambda (1% 2%)
(if (not (equal (car (nth 0 1%)) (car (nth 0 2%)) 1e-5))
(< (car (nth 0 1%)) (car (nth 0 2%)) )
) ) ) ) ;;由Y方向排序为基础进行X方向排序

(setq lstnew (vl-sort x_sort_list '(lambda (1% 2%)
(if (equal (car (nth 0 1%)) (car (nth 0 2%)) 1e-5)
(> (cadr (nth 0 1%)) (cadr (nth 0 2%)) )
) ) ) ) ;;由X方向排序为基础进行X方向相等的座标进行Y排序

另外一问题就是为何我的程序再进行
"<Y方向>由左至右&由上往下(A)"
这样的排序型式时,有时会排序成
"<Y方向>由左至右&由下往上(B)"
该怎样处理才能像版主写的程序这样不会发生排序时的问题呢?

希望龙版大可以解答这两问题
谢谢~

发表于 2006-6-9 11:37:00 | 显示全部楼层

(setq b(vl-sort a '(lambda(1% 2%)
       (if (equal (car 1%)(car 2%) 1e-5)
         (progn
    (>= (cadr 1%)(cadr 2%))
         )
         (progn
    (< (car 1%)(car 2%))
         )
       )
       )))

那么复杂做什么?一个if搞定由左至右&由上往下~~~其他的也可以类推!

 楼主| 发表于 2006-6-9 21:46:00 | 显示全部楼层

谢谢解说

来去试看看

 楼主| 发表于 2006-6-11 21:54:00 | 显示全部楼层

似乎还是不行这样排列...

照龙版大的方法将秋枫的程序加上精度误差,做"由左至右&由上往下"排序方法
(setq lstnew (vl-sort lst '(lambda (1% 2%)
(cond ((< (car (nth 0 1%)) (car (nth 0 2%)) ) t)
((and (equal (car (nth 0 1%)) (car (nth 0 2%)) 0.)
      (> (cadr (nth 0 1%)) (cadr (nth 0 2%)) )
      ) t)
((and (equal (car (nth 0 1%)) (car (nth 0 2%)) 0.)
      (equal (cadr (nth 0 1%)) (cadr (nth 0 2%)) 0.)
      (< (caddr (nth 0 1%)) (caddr (nth 0 2%)))
      ) t)
(t NIL)
))))

得到以下结果,
[0] ((211.819 194.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 133043f4>)
[1] ((215.569 274.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 13300bf4>)
[2] ((271.402 194.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 13304494>)
[3] ((271.819 274.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 13300c94>)
[4] ((331.819 274.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 13300d34>)
[5] ((332.236 194.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 13304534>)
[6] ((411.819 274.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 133018d4>)
[7] ((411.819 194.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 13304784>)
[8] ((465.152 194.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 13304934>)
[9] ((472.236 274.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 13301ba4>)
[10] ((525.152 194.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 133049b4>)
[11] ((528.902 274.83 0.0) #<VLA-OBJECT IAcadAttributeReference2 13303044>)

发现到第4.5.6.7笔资料的y排列相反了
不知道这样该怎样处理呢?

烦请各位高手可以再次解答一下

谢谢~

 

 

发表于 2006-6-11 22:27:00 | 显示全部楼层
本帖最后由 作者 于 2006-6-11 23:06:11 编辑

vken7az2p发表于2006-6-11 21:54:00 似乎还是不行这样排列... 照龙版大的方法将秋枫的程序加上精度误差,做\"由左至右&由上往下\"排序方法(setq lstnew (vl-sort lst '(lam...

不知道你的具体的问题,不过看数据就知道...你的精度设置的太小了,把精度设置为4.0就可以了.你的块怎么做的?属性的插入点竟然相差那么多?,,,,,,,
还有一个问题就是,,由左至右&由上往下,其实对于y坐标来说,是没有必要精度误差的,只要大一点点也应该是排前面,.何必加上误差?

(setq b(vl-sort a '(lambda(1% 2%)
       (if (equal (car 1%)(car 2%) 4.0)
         (progn
    (>= (cadr 1%)(cadr 2%))
         )
         (progn
    (< (car 1%)(car 2%))
         )
       )
       )))

 楼主| 发表于 2006-6-11 23:37:00 | 显示全部楼层
xxsheng发表于2006-6-11 22:27:00以下是引用vken7az2p在2006-6-11 21:54:24的发言:似乎还是不行这样排列...照龙版大的方法将...

再次谢谢您的解答
但您的程序在对於 17楼中的图形排序
先左在右由上而下的排列方式
并无法完成
如图:

烦请龙版大及各位高手可以在帮忙解答.
谢谢~
复制代码
发表于 2006-6-12 01:58:00 | 显示全部楼层

从头到尾看了一下,,,程序不是用来搬的,cond和if的区别在于分支多用cond比较直观而已.我自己的序号排序也是这么用的,一直没有错误.你说的不能实现,是不是一个语句也没有改动就用进去?你的cond语句本来就很奇怪了((and (equal (car (nth 0 1%)) (car (nth 0 2%)) 0.)
      (equal (cadr (nth 0 1%)) (cadr (nth 0 2%)) 0.)
      (< (caddr (nth 0 1%)) (caddr (nth 0 2%)))
      ) t)
请问 (caddr (nth 0 1%)) 是什么意思?每个人用的比较的表不一样,看别人的程序只是看一个结构,,,,,,,,,

其实你自己试验下就知道到底我的语句行不行了,a=((1 2 0)(0 3 0)(1.1 2.5 0)(4 1 0)(5 2 0)),把后面的容差改为0.0,你测试下,,,,

而且,,你的cond语句也有问题.先比较小于,再容差相等,注意,(1 2 0)和(1.1 3 0)和(1.2 4 0)这三个来排序,容差在.5的话,你看看用你的结果会是怎么样,再用秋枫的语句和我的语句测试下,,,你的和他们三个的原来的位置会有关系的.((1 2 0)(1.1 3 0)(1.2 4 0))和((1.1 3 0)(1 2 0)(1.2 4 0))和((1.2 4 0)(1.1 3 0)(1 2 0))三个表用你的排出来是三个不慕峁?,,,,,好象秋枫的程序也有你一样的问题,,,,而我的则永远只有一个结果,,,,你们的cond语句犯的错误应该先容差相等再小于.....好好分析一下你就知道问题所在了,,,不是我的程序if的问题.

 楼主| 发表于 2006-6-12 22:57:00 | 显示全部楼层
本帖最后由 作者 于 2006-6-13 21:45:43 编辑

xxsheng发表于2006-6-12 1:58:00 从头到尾看了一下,,,程序不是用来搬的,cond和if的区别在于分支多用cond比较直观而已.我自己的序号排序也是这么用的,一直没有错误.你说的不能实现,是不是一个语...

您的说法确实没有错
是我弄错了一些关键
图块也有误差
但是有个疑问

就是龙版大的程序
在我的图块中确实可以顺利排序完成
而我自己的排序方式
都会有所差异如同 46楼 所提

会有x1比x2大,但y1却比y2大,
而先将x排上去
我的问题就是这个排列的顺序忽然跳掉了~
不知道龙版大是用何种方式排序

烦请龙版大及各位高手可以在帮忙解答.
谢谢~

另外请问使用 car 跟 nth 来取值

情况会不同吗
 

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-9 06:45 , Processed in 0.175824 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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