limj2007 发表于 2007-2-28 09:07:00

SOS:LISP程序请教(一次性获取两相交线节点坐标)

<p></p><p>各位大哥:</p><p>新年好!</p><p>图中红色为生成的线,黄色的为我画上去的线条,我想用LISP编一程序,可生成能"获取黄色线节点坐标"(纵横两线交点)程序,生成最好系TXT文本格式,有哪位兄弟能帮上这个忙吗?谢谢!</p><p>&nbsp;</p>

fools 发表于 2007-2-28 13:18:00

本帖最后由 作者 于 2007-3-1 17:51:32 编辑

我的理解是:你希望求出红线与所有白线的交点,生成黄线和坐标文本,
如果我的理解没有错,程序如下:

(DEFUN c:tmp (/ ENT1 ENT2 N PT PTS SSG FILE)
(vl-load-com)
(SETQ ent1 (VLAX-ENAME->VLA-OBJECT (CAR (ENTSEL "\n选取一根红线:"))))
(PRINC "\n选取一组竖向坐标线:")
(SETQ ssg (SSGET '((0 . "LINE"))))
;;获取交点集
(SETQ pts nil)
(REPEAT (SETQ n (SSLENGTH ssg))
    (SETQ ent2 (VLAX-ENAME->VLA-OBJECT (SSNAME ssg (SETQ n (1- n)))))
    (IF (SETQ pt (VLAX-INVOKE ent1 'IntersectWith ent2 ACEXTENDNONE))
      (SETQ pts (CONS pt pts))
    )
)
;;沿红线对点集排序
(SETQ pts (VL-SORT pts
       '(LAMBDA (p1 p2)
   (> (VLAX-CURVE-GETPARAMATPOINT ent1 p1)
      (VLAX-CURVE-GETPARAMATPOINT ent1 p2)
   )
      )
   )
)
;;画黄线并写入文件
(SETVAR "clayer" "图层1")
(COMMAND "_.PLINE")
(SETQ file (OPEN "c:/pts.txt" "w"))
(FOREACH item pts
    (COMMAND item)
    (WRITE-LINE (VL-PRINC-TO-STRING item) file)
)
(CLOSE file)
(COMMAND "")
(PRINC)
)

limj2007 发表于 2007-3-1 14:52:00

<p>大哥:</p><p>小弟在这里先谢谢你!</p><p>你的程序我调用过了,但加载tmp命令点选红线后,出现如下错误:</p><p>(选取一根红线:; 错误: no function definition: VLAX-ENAME-&gt;VLA-OBJECT)</p><p>我要的程序只是能提取"黄线"跟"纵向白色线"&lt;交点坐标&gt;就好了,最好生成的是TXT格式文本,我的图再上传一下,你下载后打开看看就明白我意思了,再一次谢谢你!</p>

fools 发表于 2007-3-1 15:57:00

对于出现错误:no function definition: VLAX-ENAME->VLA-OBJECT
如果你用的acad2000以后的版本,可在我的程序第一行前添加(vl-load-com),如果是r14就没有办法了
只选黄线,问题就简化为取黄线的节点坐标,不需要求交点,程序如下,可以运行在任何cad版本.

(DEFUN c:tmp (/ EL FILE PTS)
(SETQ EL (ENTGET (CAR (ENTSEL "\n选取一根黄线:"))))
(WHILE (AND EL (ASSOC 10 EL))
    (SETQ PTS (CONS (ASSOC 10 EL) PTS)
   EL(CDR (MEMBER (CAR PTS) EL))
    )
)
;;写入文件
(SETQ file (OPEN "c:/pts.txt" "w"))
(FOREACH item (MAPCAR 'CDR (REVERSE pts))
    ;;下一行的","可改为其他的分隔符,比如" " "\t"
    (WRITE-LINE
      (STRCAT (RTOS (CAR item) 2 3) "," (RTOS (CADR item) 2 3))
      file
    )
)
(CLOSE file)
(PRINC)
)

limj2007 发表于 2007-3-1 16:38:00

<p>兄弟:</p><p>感谢你为我编的这程序,真的谢谢!</p><p>但程序还是用不了,我加载程序后,用TMP命令,然后选取黄色线条,但就没有了下文了,是否程序出现错乱,麻烦你看看,谢谢!</p>

limj2007 发表于 2007-3-1 16:45:00

<p>在线等侯你回复,你QQ号系几多?我加你为好友.</p>

fools 发表于 2007-3-1 17:41:00

本帖最后由 作者 于 2007-3-1 17:50:19 编辑

忘记告诉你了,到硬盘的c驱下找pts.txt文件,里面就是所有的点
新程序增加了一句,会自动打开pts.txt,方便你操作.


(DEFUN c:tmp (/ EL FILE PTS)
   (SETQ EL (ENTGET (CAR (ENTSEL "\n选取一根黄线:"))))
   (WHILE (AND EL (ASSOC 10 EL))
   (SETQ PTS (CONS (ASSOC 10 EL) PTS)
    EL(CDR (MEMBER (CAR PTS) EL))
   )
   )
   ;;写入文件
   (SETQ file (OPEN "c:/pts.txt" "w"))
   (FOREACH item (MAPCAR 'CDR (REVERSE pts))
   ;;下一行的","可改为其他的分隔符,比如" " "\t"
   (WRITE-LINE
       (STRCAT (RTOS (CAR item) 2 3) "," (RTOS (CADR item) 2 3))
       file
   )
   )
   (CLOSE file)
   (startapp "notepad" "c:/pts.txt")
   (PRINC)
)
不好意思,很少聊天,以前的qq号被盗,就没有再申请了

limj2007 发表于 2007-3-2 09:06:00

<p>兄弟:</p><p>你好!</p><p>真谢谢你了,程序可用了,而且你改正后挺好用的,谢谢你!</p><p>以前我用LISP命令提取坐标,再经文本编辑小软件编著它,现在工作量快多了,真的谢谢你!</p><p>你的编程技术太高了,有什么事再请教你,还望留下你的大名.谢谢!</p>
页: [1]
查看完整版本: SOS:LISP程序请教(一次性获取两相交线节点坐标)