明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2644|回复: 13

[求助]请看看这个程序什么问题

  [复制链接]
发表于 2004-2-7 16:59:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2004-2-7 17:35:13 编辑

按两点角度画长度不大于10的线,不知为何有时(特别是当d2距d1比较远的时候)竟会产生0长度的线(不是故意点d2与d1重合),刚刚开始学lisp,百思不得其解,恳请各位高手看看哪里有问题,谢谢!! (defun C:sss (/ d1 d2 x1 x2 y1 y2 ang cd dx dy n)
(setq d1 (getpoint "\n点取点:"))
(setq n 1)
(while n
(setq d2 (getpoint "\n点取下一点:"))
(setq x1 (car d1))
(setq x2 (car d2))
(setq y1 (cadr d1))
(setq y2 (cadr d2))
(setq dx (- x2 x1))
(setq dy (- y2 y1))
(setq cd (sqrt (+ (* dx dx) (* dy dy))))
(setq ang (angle d1 d2))

(if (> cd 10.0)
(progn
(setq d2 (polar d1 ang 10.0))
(setq x2 (car d2))
(setq y2 (cadr d2))
(setq dx (- x2 x1))
(setq dy (- y2 y1))
(setq cd (sqrt (+ (* dx dx) (* dy dy))))
)
)
(command "line" d1 d2 "")
(setq d1 d2)
)
)
发表于 2004-2-7 17:08:00 | 显示全部楼层
把点的捕捉关掉试试
 楼主| 发表于 2004-2-7 17:10:00 | 显示全部楼层
还是不行,好象不关捕捉的事
发表于 2004-2-7 17:52:00 | 显示全部楼层
把你的程序改了一下,你的程序本身没什么问题,估计还是捕捉点的问题,我改后的程序和你的是几乎完全一样的,就是if中计算cd值的步骤去掉了,因为它没有任何左右,因为它的值永远是10(你用polar函数得出p2,其距p1为10,p1、p2的距离肯定就是10了)
  1. (defun C:sss (/ d1 d2 ang cd n)
  2.    (setq d1 (getpoint "\n点取点:"))
  3.    (setq d2 (getpoint "\n点取下一点:"))
  4.    (while d2
  5.        (setq cd (distance d1 d2))
  6.        (setq ang (angle d1 d2))
  7.        (if (> cd 10.0)
  8.            (setq d2 (polar d1 ang 10.0))
  9.        )
  10.        (command "line" d1 d2 "")
  11.        (setq d1 d2)
  12.        (setq d2 (getpoint "\n点取下一点:"))
  13.      )
  14. )
 楼主| 发表于 2004-2-7 18:18:00 | 显示全部楼层
谢谢飞哥指正!还望各位别见笑(脸红)。


我试了一下,在关掉捕捉之后就不会产生0长度线了,但不关捕捉还是会出现0长度线。





可是我想沿着已有的一条长长的底线来画这些不大于10的线,这样不打开捕捉(最近点)就不好点取底线上的点了,还请各位高手再看看有无解决的方法。谢谢!
发表于 2004-2-7 18:52:00 | 显示全部楼层
使用系统变量osmode,设置为0则会关闭捕捉


或者使用entmake建立直线,而不用command命令
 楼主| 发表于 2004-2-8 12:12:00 | 显示全部楼层
entmake不会用,我改成下面的样子用不了,烦请再看看哪里不对(年后刚刚学,还很菜,请大家多多指教,万分感谢!) (defun C:sss (/ d1 d2 ang cd n)
(setq d1 (getpoint "\n点取点:"))
(setq d2 (getpoint "\n点取下一点:"))
(while d2
(setq cd (distance d1 d2))
(setq ang (angle d1 d2))
(if (> cd 10.0)
(setq d2 (entmake '((0."point")(0 (polar d1 ang 10.0)))))
)
(entmake '((0."line")(10 d1)(11 d2)))
(setq d1 d2)
(setq d2 (getpoint "\n点取下一点:"))
)
)
发表于 2004-2-8 12:27:00 | 显示全部楼层
这样
  1. (defun c:lin (/ ang pt)
  2.    (vl-cmdf ".line" (setq pt (getpoint "\n起点:")))
  3.    (while (setq ang (getangle pt "\n下一点:"))
  4.        (vl-cmdf (setq pt (osnap (polar pt ang 1000) "none")))
  5.    )(vl-cmdf)
  6. )
 楼主| 发表于 2004-2-8 13:04:00 | 显示全部楼层
to:无痕 你的程序好简洁!可惜我现在还看不太懂。 我把你程序中的1000改成10,用起来还有会产生0长度的直线,请再帮我看看,谢谢你!
发表于 2004-2-8 13:17:00 | 显示全部楼层
把对象捕捉关了试试!,我用了用没发现0的线啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 14:42 , Processed in 0.185817 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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