任意一段圆弧,怎么知道它经过哪几个象限点?请贴代码
剛寫了一個,(defun c:test( / ss ename data cpt ar one tow thre four one-a tow-a three-a four-a)
(setq ss (ssget '((0 . "arc"))))
(setq ename (ssname ss 0))
(setq data(entget ename))
(setq cpt(cdr (assoc 10 data)))
(setq ar(cdr (assoc 40 data)))
(setq one (list (+ (car cpt) ar) (cadr cpt)))
(setq tow (list (car cpt) (+ (cadr cpt) ar)))
(setq three (list (- (car cpt) ar) (cadr cpt)))
(setq four (list (car cpt) (- (cadr cpt) ar)))
(setq one-a(osnap one "_qua" ))
(setq tow-a(osnap tow "_qua" ))
(setq three-a(osnap three "_qua" ))
(setq four-a(osnap four "_qua" ))
(princ "\n檢測報告:你所選的圓弧通過的象限點有")
(if(/= one-a nil) (princ "[第一個象限點];"))
(if(/= tow-a nil) (princ "[第二個象限點];"))
(if(/= three-a nil) (princ "[第三個象限點];"))
(if(/= four-a nil) (princ "[第四個象限點];"))
(princ)
) 有個小問題問你. 一條圓弧能通過第幾個象限點肉眼也可以看出為什麼要用程序來做呢?我寫的不好. 還要大家多多指教哦. 这个是用在程序里边的,程序里边会涉及很多的图元,谢谢你的代码,帮了我的大忙。
你的程序很有创意 樓上可不可以把你的程序給大家學習學習? 謝謝 ! ! 对了,你的代码在算四个象限点时,能用polar函数的话会更好,因为要考虑到UCS的变化。
当UCS与WCS不一致时,你的代码会出现找不到象限点的问题。
谢谢。 to congcong:
可能你寫的程序是用在三維方面的了. 現在問題是polar涵數相對圓心點算計出象限點但我還不知道用什麼方式來判斷所算計出的象限點所在弧的位置呀. 功力有限請莫見怪才好. 另外你的見義很好, 具備著好好的寫程序的天份. 好好加油哦! ! ! 本帖最后由 作者 于 2003-12-19 9:50:30 编辑
我也写了一个,在轴上处理可能有些不对,参看一下。。。
(defun c:Get( / ent ents start_ang end_ang s e n cr)
(setq ent (car (entsel)))
(setq ents (entget ent))
(setq start_ang (cdr (assoc 50 ents)))
(setq end_ang (cdr (assoc 51 ents)))
(setq s (/ (* start_ang 4) 2 pi))
(setq e (/ (* end_ang 4) 2 pi))
(setq s (+ 1 (fix s)))
(if (equal e 0 0.000000001) (setq e 4) (if (equal (fix e) e 0.00000001) (setq e (fix e)) (setq e (1+ (fix e)))))
(if (> s e) (setq n (+ (- 4 s) e 1)) (setq n (+ 1(- e s))))
(setq i 0 cr "圆弧通过")
(repeat n
(setq cr (strcat cr (itoa s) ","))
(if (= s 4) (setq s 1) (setq s (1+ s)))
)
(setq cr (strcat cr "象限"))
(princ cr)
(princ)
)
)
多谢谢版主夸奖,我一定多多加油,谢谢。
我将改过的程序贴在下面
(defun c:test( / ss ename data cpt ar one two thre four one-a two-a three-a four-a)
(vl-cmdf "select" "")
(setq ss (ssget '((0 . "arc"))))
(setq ename (ssname ss 0))
(setq data (entget ename))
(setq cpt (trans (cdr (assoc 10 data)) 0 1 ))
(setq ar (cdr (assoc 40 data)))
(setq one (polar cpt 0 ar))
(setq two (polar cpt (/ pi 2.0) ar))
(setq three (polar cpt pi ar))
(setq four (polar cpt (* pi 1.5) ar))
(setq one-a (osnap one "_qua" ))
(setq two-a (osnap two "_qua" ))
(setq three-a (osnap three "_qua" ))
(setq four-a(osnap four "_qua" ))
(princ "\n檢測報告:你所選的圓弧通過的象限點有")
(if(/= one-a nil) (princ "[第一個象限點];"))
(if(/= two-a nil) (princ "[第二個象限點];"))
(if(/= three-a nil) (princ "[第三個象限點];"))
(if(/= four-a nil)(princ "[第四個象限點];"))
(princ)
)
这段程序对任意平面UCS状态下的任意圆弧均有效。
由于原来的程序在运行后会多出一条空白的命令行,所在在前面在加上vl-cmdf "select" "" 这个判断应该是错误的,如果圆弧的起点不在轴上,则此象限会被忽略。。。
看看我8楼的。。。
页:
[1]
2