明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1646|回复: 2

[求助]为什么我的代码时灵时不灵啊

[复制链接]
发表于 2006-12-14 22:35:00 | 显示全部楼层 |阅读模式
lsp新手,对lsp很感兴趣,一个学习编写时常常会遇到问题,特此求教大家。
下面的代码是将直线改为圆弧。思路是取一直线两端点PT1,PT2,直线的旋转角;然后以PT1为端点,直线旋转角的顺时针22.5度为参考角度,以直线长度一半作为距离的定位点PO,最后圆弧以PT1,PO,PT2为点作出,并且删除原直线。
代码:

  
(defun c:qx (/ ss m k s1 edata etype pt1 px1 py1 pt2 px2 py2 D ang po)
   ;先计算直线旋转角度,再以直线一端点为基点,旋转角的-22.5度,1/2的直线长度为距离定位的点,作为圆弧的第二点.
  (prompt "\n请选择需变圆弧的直线:")
  (setq	ss (ssget)
	m  0
	k  0
  )
  (repeat (sslength ss)
    (setq s1 (ssname ss m))

    (setq edata	(entget s1)
	  etype	(cdr (assoc 0 edata))
    )
    (if	(= etype "LINE")
      (progn
	(setq pt1 (cdr (assoc 10 edata))
	      px1 (car pt1)
	      py1 (cadr pt1)
	      pt2 (cdr (assoc 11 edata))
	      px2 (car pt2)
	      py2 (cadr pt2)
	      D		  (/ (sqrt
		       (+ (* (- px1 px2) (- px1 px2)) (* (- py1 py2) (- py1 py2)))
		     )
		     2
		  )
	)
	(if (= px1 px2)
	  (progn (setq ang (- (/ pi 2) (/ pi 8)))
					;画直线时只能由左往右画
		 (setq po (polar pt1 ang D))

	  )
	  (progn
	    (if	(= py1 py2)
	      (progn (setq ang (- (* pi 2) (/ pi 8)))
					;画直线时只能由下往上画
		     (setq po (polar pt1 ang D))

	      )
	      (progn

		(setq ang
		       (- (atan (/ (- py1 py2) (- px1 px2))) (/ pi 8))
		)
		(if (< ang 0)
		  (setq ang (+ ang (* pi 2)))
		)
		(setq po (polar pt1 ang D))

	      )
	    )
	  )
	)
	(setq k
	       (1+ k)
	)
	(setq m
	       (1+ m)
	)

	(command "arc" pt1 po pt2)
	(command "erase" s1 "")
      )
    )
  )
  (princ (strcat "\n共有<" (itoa k) ">根直线变圆弧了"))
  (prin1)
)

  
(defun c:qx (/ ss m k s1 edata etype pt1 px1 py1 pt2 px2 py2 D ang po)
   ;先计算直线旋转角度,再以直线一端点为基点,旋转角的-22.5度,1/2的直线长度为距离定位的点,作为圆弧的第二点.
  (prompt "\n请选择需变圆弧的直线:")
  (setq	ss (ssget)
	m  0
	k  0
  )
  (repeat (sslength ss)
    (setq s1 (ssname ss m))

    (setq edata	(entget s1)
	  etype	(cdr (assoc 0 edata))
    )
    (if	(= etype "LINE")
      (progn
	(setq pt1 (cdr (assoc 10 edata))
	      px1 (car pt1)
	      py1 (cadr pt1)
	      pt2 (cdr (assoc 11 edata))
	      px2 (car pt2)
	      py2 (cadr pt2)
	      D		  (/ (sqrt
		       (+ (* (- px1 px2) (- px1 px2)) (* (- py1 py2) (- py1 py2)))
		     )
		     2
		  )
	)
	(if (= px1 px2)
	  (progn (setq ang (- (/ pi 2) (/ pi 8)))
					;画直线时只能由左往右画
		 (setq po (polar pt1 ang D))

	  )
	  (progn
	    (if	(= py1 py2)
	      (progn (setq ang (- (* pi 2) (/ pi 8)))
					;画直线时只能由下往上画
		     (setq po (polar pt1 ang D))

	      )
	      (progn

		(setq ang
		       (- (atan (/ (- py1 py2) (- px1 px2))) (/ pi 8))
		)
		(if (< ang 0)
		  (setq ang (+ ang (* pi 2)))
		)
		(setq po (polar pt1 ang D))

	      )
	    )
	  )
	)
	(setq k
	       (1+ k)
	)
	(setq m
	       (1+ m)
	)

	(command "arc" pt1 po pt2)
	(command "erase" s1 "")
      )
    )
  )
  (princ (strcat "\n共有<" (itoa k) ">根直线变圆弧了"))
  (prin1)
)


在运行时,代码时而好使,时而不灵,搞不清楚为什么。对于同一根直线,有时在试了四五次后才成功,搞不清楚到底是什么问题。(我在其它的代码里也遇到过类似的问题)。
在失败的几次了,提示“函数取消”,调试监视了各变量,没发现什么问题,直到“ (command "arc" pt1 po pt2) ”才跳出“函数取消
”,是什么原因导致函数取消?
由于这个在我工作中马上要用,所以编的比较粗,考虑的条件也不够全,只是想实用可以了。
发表于 2006-12-14 23:02:00 | 显示全部楼层

先考慮

(setq osm (getvar "osmode"))

(setvar "osmode" 0);取消鎖點

...

(setvar "osmode" osm)

 楼主| 发表于 2006-12-15 20:30:00 | 显示全部楼层
本帖最后由 作者 于 2006-12-15 20:46:52 编辑

谢谢LS.

不过还是没搞清楚锁点与圆弧被取消的联系。

自己画图时,任意三点都可以画出圆弧啊。

另外,还以其它的命令跟锁点有关联吗?

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

本版积分规则

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

GMT+8, 2025-9-19 03:54 , Processed in 0.293236 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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