明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2370|回复: 12

[求助]如何提取曲线中的断点的座标数据后再生成一个文本文件

  [复制链接]
发表于 2005-10-16 15:49 | 显示全部楼层 |阅读模式
各位大侠,小弟在三座标编程时经常遇到这样的问题:先在CAD2004中画出一条曲线(可能是spline,圆弧等),然后用DIVIDE命令将曲线等分成若干点,然后用LIST命令调出cad文本窗口,再将内容复制到windows的写字板中,将所有无关的内容删除后,只留下各点(包括两个端点)的x,y座标数值,x,y符号不要,只要x,y数值,x,y数值间用英文逗号隔开,一个点一行,如  25.301,34.532   提行    26.443,36.449      ,然后保存为一个txt文件供编程用。由于文本的编辑十分麻烦,浪费了大量时间,还易出错,请教高手能否编一个lisp程序解决此问题?多谢!附件为一条曲线的例子,图形也可能是一天封闭曲线,需要判断起始点和终点,以及沿顺时针还是逆时针列出点坐标。我的邮箱:gongxq2004@163.com
 楼主| 发表于 2005-10-16 15:52 | 显示全部楼层

本帖子中包含更多资源

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

x
发表于 2005-10-16 17:13 | 显示全部楼层
本帖最后由 作者 于 2005-10-16 21:05:00 编辑

来个简单功能的,我还没测试各种情况,有问题再改

(defun c:t1 (/ en num)
  (vl-load-com)
  (while (not (setq en (ssget ":s" '((0 . "circle,line,spline,lwpolyline,arc,ellipse"))))))
  (setq en (ssname en 0))
  (setq num (getint "\nNumbers<10>: "))
  (if (null num)
    (setq num 10)
  )
  (setq lst (GetPtLst en num)) ;Get Point Lst from entity
  (write en lst) ;write the point to the file which named by the entity handle
  (prin1)
)
(defun write (en lst / msg file fileID)
  (if (vlax-curve-isClosed (vlax-ename->vla-object en))
    (setq msg (strcat "/* " (tt lst) "; Curve is Closed"))
    (setq msg (strcat "/* " (tt lst) "; Curve is Opened"))
  )
  (setq file (strcat "C://" (cdr (assoc 5 (entget en))) ".txt"))
  (setq fileID (open file "w"))
  (princ msg fileID)
  (foreach pt lst
    (princ "\n" fileID)
    (princ (car pt) fileID)
    (write-char 44 fileID)
    (princ (cadr pt) fileID)
  )
  (close fileID)
)


(defun GetPtLst (en num / lst vn AddParam param)
  (setq lst '()
 vn  (vlax-ename->vla-object en)
  )
  (setq AddParam (/ (vlax-curve-GetEndParam vn) num)
 param  (- 0 AddParam)
  )
  (if (not (vlax-curve-isClosed vn))
    (setq num (1+ num))
  )
  (repeat num
    (setq lst (append lst (list (vlax-curve-GetPointAtParam vn (setq param (+ param AddParam))))))
  )
  lst
)
(defun tt (lst / i ctClock Clock p0 p1 p2 m)
  (setq lst (append lst (list (car lst)) (list (cadr lst))))
  (setq i 0
 ctClock 0
 Clock 0
  )
  (repeat (- (length lst) 2)
    (setq p0 (nth (+ i 0) lst)
   p1 (nth (+ i 1) lst)
   p2 (nth (+ i 2) lst)
   i  (1+ i)
    )
    (setq m (- (* (- (car p1) (car p0)) (- (cadr p2) (cadr p0)))
        (* (- (car p2) (car p0)) (- (cadr p1) (cadr p0)))
     )
    )
    (cond ((< m 0) (setq Clock (1+ Clock)))
   ((> m 0) (setq ctClock (1+ ctClock)))
    )
  )
  (if (> ctClock Clock)
    "Direction is Counter Clock"
    "Direction is Clock"
  )
)

 楼主| 发表于 2005-10-16 23:13 | 显示全部楼层

太感谢了!

 楼主| 发表于 2005-10-19 20:56 | 显示全部楼层
HuaiYu兄,不好意思还要麻烦您,上面的程序怎么调不通呢?加载后输入t1命令,然后就没有了反映。是有问题呢还是我不会用?烦请指教。
发表于 2005-10-19 23:22 | 显示全部楼层

看到这个没有?这里意思是说让你单选图元

(while (not (setq en (ssget ":s" '((0 . "circle,line,spline,lwpolyline,arc,ellipse"))))))

你选一个图元后然后就会在C:\的根目录下根据 图元的 handle 命名所生成的文件

发表于 2005-10-20 06:29 | 显示全部楼层

能不能更简单一点啊

 楼主| 发表于 2005-10-20 21:26 | 显示全部楼层
明白了,我再试试看。非常感谢。HuaiYu兄,您的水平确实太高了,小弟真是佩服啊!
 楼主| 发表于 2005-10-20 23:38 | 显示全部楼层

HuaiYu兄,我试了不行啊,我是菜鸟,能否将使用方法说得详细些啊。我是这样用的,将您编的程序复制下来,粘贴在写字板中,保存,将文件后缀名改为.lsp,在CAD中调入图形后加载该程序,输入t1命令,提示选择对象,选择单个图元如divide为若干等分后的圆弧,默认numbers为10(此处numbers的含义是什么?),提示下面的错误,不知为何?请赐教。

命令: t1
选择对象:
Numbers<10>: 10
; 错误: Automation 错误。 无数据库
命令:

 楼主| 发表于 2005-10-21 06:56 | 显示全部楼层
另外,如果要保留4位小数,在那里改?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-9 00:28 , Processed in 0.260109 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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