明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 863|回复: 8

[提问] 文字周围画椭圆的程序,多选时出错?不知怎么回事

[复制链接]
发表于 2015-9-3 19:26:58 | 显示全部楼层 |阅读模式
初学lisp 写了一个可以在文字周围画椭圆的程序,为什么多选时画出的椭圆有的和程序设置的不一样大,有时又不能正常画完?

(defun c:hk (/ ss en en_dt pt ang ptm pt_l pt_r hh ww ptx pty a b ptc)
  (setvar "cmdecho" 0)
  (setq fac (getreal "输入比率<1.15>"))
  (if (= fac nil)
    (setq fac 1.15)
  )
  ;;创建选择集ss

  (setq ss (ssget '((0 . "TEXT"))))
  ;;循环变量n初始化
  (setq n 0)
  (repeat (sslength ss)
    (setq en (ssname ss n))
    (setq en_dt (entget en))
    (setq pt (textbox en_dt))
    ;;ptm文字插入点坐标,pt_l、pt_r为文字外框距文字插入点相对坐标
    (setq ang (cdr (assoc 50 en_dt)))
    (setq ptm (assoc 10 en_dt))
    (setq ptm (cdr ptm))
    (setq pt_l (car pt))
    (setq pt_r (cadr pt))
    (setq hh (* (- (cadr pt_r) (cadr pt_l)) fac))
    (setq ww (+ (- (car pt_r) (car pt_l)) (* (- fac 1) hh)))

    (setq ptx (+ (car ptm) (/ (+ (car pt_l) (car pt_r)) 2)))
    (setq pty (+ (cadr ptm) (/ (+ (cadr pt_l) (cadr pt_r)) 2)))

    (setq a (* ww (sqrt 2) 0.5))
    (setq b (* hh (sqrt 2) 0.5))
    (setq ptc (list ptx pty))

    (command "ellipse"
             "c"
             ptc
             (polar ptc 0 a)
             (polar ptc (/ pi 2) b)
    )
    (command "rotate" (entlast) "" ptm (* ang (/ 180 pi)))
    (setq n (+ n 1))
  )

)



该贴已经同步到 angelnoeyeb的微博

点评

(setvar"osmode"0)  发表于 2015-9-4 15:15
发表于 2015-9-3 20:50:20 | 显示全部楼层
捕捉影响。。
关闭osmode或在command函数指定点的时候加入"non"参数
如(command "line" "non" p1 "non" p2 "")
关于osmode你可以在论坛搜索到相关应用。
普通方式是备份osmode后,设置变量(setvar "osmode" 0);不推荐
高级方式是加减16384来控制osmode开关模式
以下代码是切换捕捉开关,开的时候运行会关,关的时候运行会开。
  1. (if(= (logand 16384(getvar "osmode")) 16384)
  2.   (setvar "osmode"(-(getvar "osmode") 16384))
  3.   (setvar "osmode"(+(getvar "osmode") 16384))
  4.   )

下面这个是捕捉模式开、关
简单写的,没详细优化。
(sk_osmode t);开启捕捉
(sk_osmode nil);关闭捕捉
  1. ;;捕捉模式开关
  2. (defun sk_osmode(flag)
  3.   (if flag
  4.     (if(= (logand 16384(getvar "osmode")) 16384)
  5.       (setvar "osmode"(-(getvar "osmode") 16384))
  6.        )
  7.     (if(not (= (logand 16384(getvar "osmode")) 16384))
  8.       (setvar "osmode"(+(getvar "osmode") 16384))
  9.        )
  10.     )
  11.   )
发表于 2015-9-3 21:50:11 | 显示全部楼层
  1. (defun sk_osmode(flag)
  2.   (setvar "osmode"((if flag rem +)(rem(getvar "osmode")16384)16384))
  3.   )

把E大的改了下。。。

评分

参与人数 1明经币 +1 金钱 +50 收起 理由
edata + 1 + 50 很给力!

查看全部评分

发表于 2015-9-3 22:14:33 来自手机 | 显示全部楼层
llsheng_73 发表于 2015-9-3 21:50
把E大的改了下。。。

这样很简洁了,这个我不怎么用,我几乎都是"non"临时取消,记得有人以前写过,但是总记不清怎么写的了,就临时瞎编了一个。
发表于 2015-9-3 22:17:13 | 显示全部楼层
edata 发表于 2015-9-3 22:14
这样很简洁了,这个我不怎么用,我几乎都是"non"临时取消,记得有人以前写过,但是总记不清怎么写的了,就 ...

我基本没管过捕捉
 楼主| 发表于 2015-9-4 08:37:34 | 显示全部楼层
多谢老大们帮助,还想问一下 备份osmode后,设置变量(setvar "osmode" 0);最后再回复 有什么缺点呢?为啥不推荐?
 楼主| 发表于 2015-9-4 08:38:36 | 显示全部楼层
edata 发表于 2015-9-3 20:50
捕捉影响。。
关闭osmode或在command函数指定点的时候加入"non"参数
如(command "line" "non" p1 "non" p ...

多谢老大帮助,还想问一下 备份osmode后,设置变量(setvar "osmode" 0);最后再回复 有什么缺点呢?为啥不推荐?
发表于 2015-9-4 14:37:42 | 显示全部楼层
lisp可以说是一行一行运行的,一般程序开端设置备份,结束恢复备份,但是如果在程序终结出现错误,那么就有可能没到恢复的那一步,就结束了lisp运行,无法恢复变量,当然如果有自定义出错程序处理程序,也可以实现变量的恢复,前提是设置一个全局变量或词典,不冲突的变量来存储备份内容。否则也会失效,因此在使用了备份的方式,建议加上出错处理函数。
对于捕捉模式,如果设置0,那么出错后,不能恢复备份,可能就要去设置一次捕捉值,所以说是不推荐使用备份模式.
而+-16384则是直接控制捕捉开关,相当于按键F3,如果出错,那么只需要按键F3或鼠标点击对象捕捉,即可恢复捕捉,所以推荐这种模式。
当然程序中有的时候必须更改捕捉值,比如只要端点捕捉,那么就只能用备份模式,搭配出错处理。
程序中,就那么一句command那么也可以采用临时设置捕捉的方式,相当于你在绘图的时候,按Shift 加右键的界面,临时设置捕捉。
具体怎么使用还得根据实际情况和个人习惯做出最适合你自己的方式。
 楼主| 发表于 2015-9-4 16:18:01 | 显示全部楼层
edata 发表于 2015-9-4 14:37
lisp可以说是一行一行运行的,一般程序开端设置备份,结束恢复备份,但是如果在程序终结出现错误,那么就有 ...

明白了,多谢大大指导
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-21 16:08 , Processed in 0.173289 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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