明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 123abc

如何将字符依据X坐标排序依次写入TXT文件?

  [复制链接]
 楼主| 发表于 2004-11-20 11:30:00 | 显示全部楼层
meflying老师好!非常谢谢! 如附图003.dwg所示,是用方框分开的,即是用对角两点(以知的)确定的方框,方框的四周可能是没有线条的,方框的排列是规则的、固定的。 请直接用附图的四个方框的坐标直接编程即可。
 楼主| 发表于 2004-11-20 11:32:00 | 显示全部楼层
附图


       

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2004-11-20 11:45:00 | 显示全部楼层
(defun c:test( / pt1 pt2)
(while (and (setq pt1 (getpoint "\n选择第一角点(回车退出):"))
(setq pt2 (getcorner pt1 "选择对角点(回车退出):")))
;这里是手动选择方框角点,如果角点已知,可直接使用已知点代替PT1,PT2
(out pt1 pt2)
)
(princ)
)
(defun out( pt1 pt2 / ss i ent_lst)
(setq ss (ssget "w" pt1 pt2 '((0 . "*TEXT"))))
(setq i 0)
(repeat (sslength ss)
(setq ent_lst (append ent_lst (list (ssname ss i)))
i (1+ i))
)
(setq ent_lst (vl-sort ent_lst '(lambda(e1 e2) (< (caddr (assoc 10 (entget e1)))
(caddr (assoc 10 (entget e2)))))));按Y坐标排序
(setq ent_lst (vl-sort ent_lst '(lambda(e1 e2) (< (cadr (assoc 10 (entget e1)))
(cadr (assoc 10 (entget e2)))))));按X坐标排序
(mapcar '(lambda(e) (princ "\n") (princ (cdr (assoc 10 (entget e))))) ent_lst);将坐标打印到命令行
)
发表于 2004-12-28 21:07:00 | 显示全部楼层
meflying,你好,我是一个lisp初学者,以前是主要学习vc系列的语言,请问,有关于lisp和vc的交流程序吗?? 如果有可以告诉我吗??我将感激不尽!!!
发表于 2004-12-29 08:32:00 | 显示全部楼层
ARX,可以去ARX版块讨论学习一下
发表于 2004-12-30 16:18:00 | 显示全部楼层
本帖最后由 作者 于 2004-12-30 17:06:32 编辑

在这里,我想问问飞哥,如果只对Y坐标排序的话,是不是X坐标就自动按大小排列了呢?


好象在排列了X后,Y坐标的的顺序又被打乱了!
发表于 2004-12-31 08:20:00 | 显示全部楼层
排一个的时候,另一个方向不会动。。。你的问题可能是X(或Y)坐标看似相同,其实有一个极微小的差距,由于CAD处理的精度很高,所以就认为它们不同,就会进行重新排序。。。你可以自己做一个比较函数来代替大于、等于和小于函数,允许一定的误差。。。
发表于 2004-12-31 10:48:00 | 显示全部楼层
我是说,如果按照你的排序程序运行的话……


假如有四个点的坐标(1,1)(1,2)(2,1)(2,2)


如果先按X坐标排列的话:(1,y)在前,(2,y)在后,但是Y坐标就不一定是按顺序来的!


同样,再按Y排列的话,(x ,2)在前 (x ,1)在后,但是X坐标又不能按刚才的排列顺序进行了!


而我们往往想让程序在有规律运行的时候像我们写字一样:先从最上一行的最左端写起,到了最右端就转到下一行的最左端!
发表于 2004-12-31 14:47:00 | 显示全部楼层
如上数据,如果先按X排,再按Y排,排完后的顺序肯定是:


(1 1) (2 1) (1 2) (2 2)


无论开始的顺序是怎样的。。。就是说再排Y坐标时,X坐标相同的项的顺序是不会改变的(当然,可能中间有别的值)。


如果你想要得到:(1 1) (1 2) (2 1) (2 2)的顺序结果,就先按Y坐标排序,再按X坐标排序。。。
发表于 2004-12-31 15:47:00 | 显示全部楼层
飞哥,我曾试了很多次,就是达不到我想要的效果! 我把程序和图纸发上来,程序最后是要得到按序号顺序排列的各个图框的左下点坐标!(我的最终目的是要写好一个比较智能的批量打印程序) (defun C:PRINT()
(defun GetBox(ent / pt1 pt2)
(vla-getboundingbox (vlax-ename->vla-object ent) 'pt1 'pt2)
(mapcar 'vlax-safearray->list (list pt1 pt2))
)
(setq name (getstring"\n请输入要打印图框的图块名:"))
(setq ss (ssget "x" (list '(0 . "INSERT") (cons 2 name))))
(setq i 0)
(if ss
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq pts (list (GetBox ent)))
(setq pt(car pts))
(setq point(car pt))
(setq zuob (append zuob (list point)))
(setq i (1+ i))
(princ "\n")
)
)
(setq zuob (vl-sort zuob '(lambda(e1 e2) (>(cadr e1) (cadr e2)))))
(setq zuob (vl-sort zuob '(lambda(e1 e2) (<(car e1) (car e2)) )))
(princ zuob) (setq zuob nil)
)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

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

GMT+8, 2025-6-19 13:05 , Processed in 0.189685 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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