明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3892|回复: 14

任意一段圆弧,怎么知道它经过哪几个象限点?请贴代码

  [复制链接]
发表于 2003-12-18 14:25:00 | 显示全部楼层 |阅读模式
发表于 2003-12-18 14:54:00 | 显示全部楼层
剛寫了一個,

(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)
)
发表于 2003-12-18 15:03:00 | 显示全部楼层
有個小問題問你. 一條圓弧能通過第幾個象限點肉眼也可以看出為什麼要用程序來做呢?  我寫的不好. 還要大家多多指教哦.
 楼主| 发表于 2003-12-18 16:18:00 | 显示全部楼层
这个是用在程序里边的,程序里边会涉及很多的图元,谢谢你的代码,帮了我的大忙。
你的程序很有创意
发表于 2003-12-18 16:37:00 | 显示全部楼层
樓上可不可以把你的程序給大家學習學習? 謝謝 ! !
 楼主| 发表于 2003-12-19 07:52:00 | 显示全部楼层
对了,你的代码在算四个象限点时,能用polar函数的话会更好,因为要考虑到UCS的变化。
当UCS与WCS不一致时,你的代码会出现找不到象限点的问题。
谢谢。
发表于 2003-12-19 08:36:00 | 显示全部楼层
to   congcong:
         可能你寫的程序是用在三維方面的了. 現在問題是polar涵數相對圓心點算計出象限點但我還不知道用什麼方式來判斷所算計出的象限點所在弧的位置呀. 功力有限請莫見怪才好. 另外你的見義很好, 具備著好好的寫程序的天份. 好好加油哦! ! !
发表于 2003-12-19 09:03:00 | 显示全部楼层
本帖最后由 作者 于 2003-12-19 9:50:30 编辑

我也写了一个,在轴上处理可能有些不对,参看一下。。。

  1. (defun c:Get( / ent ents start_ang end_ang s e n cr)
  2.   (setq ent (car (entsel)))
  3.   (setq ents (entget ent))
  4.   (setq start_ang (cdr (assoc 50 ents)))
  5.   (setq end_ang (cdr (assoc 51 ents)))
  6.   (setq s (/ (* start_ang 4) 2 pi))
  7.   (setq e (/ (* end_ang 4) 2 pi))
  8.   (setq s (+ 1 (fix s)))
  9.   (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)))))
  10.   (if (> s e) (setq n (+ (- 4 s) e 1)) (setq n (+ 1(- e s))))
  11.   (setq i 0 cr "圆弧通过")
  12.   (repeat n
  13.     (setq cr (strcat cr (itoa s) ","))
  14.     (if (= s 4) (setq s 1) (setq s (1+ s)))
  15.   )
  16.   (setq cr (strcat cr "象限"))  
  17.   (princ cr)
  18.   (princ)
  19. )
  20. )
 楼主| 发表于 2003-12-19 09:10:00 | 显示全部楼层
多谢谢版主夸奖,我一定多多加油,谢谢。
我将改过的程序贴在下面
(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" ""
发表于 2003-12-19 09:19:00 | 显示全部楼层
这个判断应该是错误的,如果圆弧的起点不在轴上,则此象限会被忽略。。。
看看我8楼的。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-2 06:34 , Processed in 0.188623 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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