ttmc 发表于 2006-11-10 09:07

[原创]圆内加五角星lsp代码,详细有注解

(defun c:5js(/ oce os angb angd en I en_data en_type cenpt rad o1 o2 o3 o4 o5 i1 i2 i3 i4 i5 rad1)
(setq oce (getvar "cmdecho"))      ;命令行回显状态
(setvar "cmdecho" 0)               ;命令行不回显
(setq os (getvar "osmode"))      ;捕捉方式
(setvar "osmode" 0)                ; 取消捕捉,如果不取消,图形会显示不正确
(setq angb (getvar"angbase" ))   ;取角度起始方向
(setq angd (getvar"angdir" ))    ;取角度旋转方向
(setvar "angbase" 0.0)             ;x轴(东)为0
(setvar "angdir" 0)                ;逆时针为正
(setq en (entsel "\n选取内部生成五角星的圆:"))
(setq I 0)                         ;记数器
(while en
    (setq en_data (entget (car en)))             ;选对象
    (setq en_type (cdr (assoc 0 en_data)))       ;群码0为参数类别
    (if (= en_type "CIRCLE")                     ;如为圆
      (progn
   (setq cenpt (cdr (assoc 10 en_data)))   ;取得中心点
   (setq rad (cdr (assoc 40 en_data)))   ;取得半径
          (setq o1 (polar cenpt (/ pi 2) rad))    ;外部五个点
   (setq o2 (polar cenpt (/ (* 18 pi) 180) rad))
   (setq o3 (polar cenpt (/ (* -54 pi) 180) rad))
   (setq o4 (polar cenpt (/ (* -126 pi) 180) rad))
   (setq o5 (polar cenpt (/ (* 162 pi) 180) rad))
   
   
   (setq rad1 (* rad (- (sin (/ (* 54 pi) 180))    ;内部五个点距离圆心距离为rad1
          (* (cos (/ (* 54 pi) 180))
      (/ (sin (/ (* 36 pi) 180))   ;这行及下行只是求36度正切值
         (cos (/ (* 36 pi) 180))
      )
    )
   
       )
      )
   )                                        ;rad赋值完毕
   (setq i1 (polar cenpt (/ (* 54 pi) 180) rad1))      ;内部五个点
   (setq i2 (polar cenpt (/ (* -18 pi) 180) rad1))
   (setq i3 (polar cenpt (/pi -2) rad1))
   (setq i4 (polar cenpt (/ (* -162 pi) 180) rad1))
   (setq i5 (polar cenpt (/ (* 126 pi) 180) rad1))
   ;五角形外形,用pline使之成为整体
   (command "pline" o1 "w" 0 0 i1 o2 i2 o3 i3 o4 i4 o5 i5"c")
   (command "line" o1 i3 "")             ;五角内部五条直线
   (command "line" o2 i4 "" )
   (command "line" o3 i5 "")
   (command "line" o4 i1 "")
   (command "line" o5 i2 "")
   (setq I (1+ I))                      ;每完成一个,记数器加1
         )
         (alert "该对象并不是圆,请重新选取圆");非圆时提醒
   )                              ;end if
   (setq en (entsel "\n 选取下一个内部生成五角星的圆:"));重新选取
            
      
   )
   (princ (strcat "\n共绘制了"(itoa i) "个圆内接五角星"))
(setvar "osmode" os)         ;回原捕捉模式
(setvar "cmdecho" oce)       ;回命令行回显示状态
(setvar "angbase" angb)   ;返回角度初始
(setvar "angdir" angd)      ;返回角度旋转方向
(princ)
)
(prompt "\n<<5js>>连续多个圆内接五角星,by孟宪林:[email protected]")
(prin1)

zhurui168 发表于 2006-11-10 09:16

不错,帮你顶下。

ttmc 发表于 2006-11-10 09:35

非常感谢版主,没想到会得到你的奖励和回复,而且很快.我学lisp时间不长,几个月吧.以前发表过一点小程序,但回复得人很少.这是我昨天一晚上的结果,我的这段代码之所以加了很详细的注释,是因为我以前看过的程序,注解很少,看起来很费力气.所以我选择了详细的注解,为了后来的兄弟看起来方便些.真希望新手高手都能关注我的代码,最好能提些意见,优化一下.这样既是对我的鼓励,又是帮助.
    昨天写这段代码(不敢叫做程序,还太简单)时,没有关闭捕捉,运行时一会儿正常,一会儿不正常.搞了很长时间,才知道是捕捉方式引起的,开始还以为我的autocad出错了呢(因为我用MDT调试时没有问题,嘿嘿,刚打开MDT当然还没有选捕捉),找到原因后我兴奋得睡不着觉,前些天没解决的也是这个问题.我想新手可能都会遇到这个问题.

[ 本帖最后由 ttmc 于 2006-11-10 09:42 编辑 ]

543210 发表于 2006-11-11 15:56

:L 面对这些字符,我有点头大,都是命令行里的吗?是步骤吧:o

zhurui168 发表于 2006-11-11 16:50

再帮你顶下,顺便把命令写上:5js

richardmiss 发表于 2006-11-17 09:22

从事cad工作几年了,从没想过要用lsp....记得收集里有句台词。。。。“还不是怕麻烦嘛!“

gqd_1025 发表于 2006-11-19 20:22

顶一下。
好样的

wzj 发表于 2006-11-22 11:28

:) 厉害
顶一下
在学校也学这个的,不过工作以后就不用啦
:L 太麻烦!

okeshark 发表于 2006-11-25 22:47

顶楼主,好样的

hellmen 发表于 2007-1-30 14:16

不错强人!!!:victory:

hurryboy 发表于 2007-8-16 11:17

兴趣?工作?很好,我只会画,嘿嘿。

zlp1015 发表于 2007-8-26 14:34

支持楼主发帖,我要学习

aaron85 发表于 2007-8-28 14:31

顶一下。
好样的

zlp1015 发表于 2007-9-1 15:56

我要学习:( :D :o ;P

ak2008 发表于 2008-2-26 09:37

谢谢分享,努力学习中:D
页: [1] 2
查看完整版本: [原创]圆内加五角星lsp代码,详细有注解