QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 2648|回复: 4
收起左侧

[已答复] 把数字对分程序,坐标点经常错,帮忙看下

[复制链接]
发表于 2011-11-29 11:38:57 | 显示全部楼层 |阅读模式 来自: 中国广西南宁

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑 1 G( S0 ^& x5 m) p) J
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)
    5 Y  z0 c$ l- w3 W1 ]3 ?7 M
  2.   (setvar "cmdecho" 0)
    ( O& J- r- ~0 X9 k. l; H
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    8 y1 K% j/ a! L3 }2 d) m0 f
  4.   (setq ent (entget (car e)))
    ) Q( h% }9 z% i) G  @9 m, J- E
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    4 k2 Q: c3 D) ~4 ]  [* m
  6.   (if (/= 0 newt)                              ;过滤非数值文字) o+ f' |2 g3 _  d" S" Q; S2 p
  7.   (progn
    * {! K$ I6 O& ]2 N1 b
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息2 Q$ E4 c* o" a# ]9 }1 j' c
  9.        (command "._Clayer" tc)                 ;保持图层一致! B( Y( y, R  ^
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用
    7 E! b! T. b9 }
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度
    8 E, i7 C$ m; [# t0 a2 h
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式
    * {1 x% D/ a" o) a4 F, V
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标/ u3 A) @: a7 U. Z
  14.        (setq zbx (car zb))                     ;文字x坐标6 A  d- \5 j: G+ y
  15.        (setq zby (cadr zb))                    ;文字Y坐标$ q1 S! V' P; f' `! u; L; ~
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高4 J0 H9 p+ w" K. N2 S. `
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点
    9 T/ t2 ]% [3 \9 h7 \
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang)))); s6 t8 O$ V' I4 ~  ^" \
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    9 f2 T! Y; D5 _: x; R+ ~
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))5 N! ?% n2 w3 g) E; u& ^$ Q
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点) c7 j3 A8 n% P5 f3 M1 @2 `
  22.        (setq zb2 (list zb2x zb2y))3 X' y6 P' l- o! f" e
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值9 r' ~, C; n6 Q: B
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))9 M6 g8 ?7 u! @1 m6 E7 w
  25.        (entdel mc)                                                     ;删除原对象
    ) |  x* E) x- ?
  26.    )/ `1 x. l) h; r3 |- n4 t! y
  27.    (princ "\n所选对象不能处理")3 F7 I' S$ n4 o' Y* y  r
  28.    )   ; p9 T9 l. F4 u4 Y1 k' e9 ~
  29.   (setvar "cmdecho" 1)2 O$ f5 m, C9 c$ q
  30.   (princ)6 m% S' H& o7 r2 |* i+ m3 [
  31. )
复制代码
' T( ^& H4 V  {, }7 Q* T5 |
. A9 |3 H6 P4 q: C3 O% [
第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在CAD中进行undo操作发现,大部分的错都是坐标点zb1的问题,就是不知道哪里留下了漏洞
 楼主| 发表于 2011-11-29 11:41:49 | 显示全部楼层 来自: 中国广西南宁
另外,如果选择的数值字体样式内已经定义高度的时候,程序也会出错,因为这种字体标注时的参数会跳过字高,造成输入错误,这个该如何避开?
发表于 2011-11-29 13:36:09 | 显示全部楼层 来自: 中国辽宁
  1. (defun c:bdf (/            e          ent        tc    newt  mc          ang        st    zb
    : m# m; Y# W' m" m* D
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2" e. |" `- S& d4 l: v  x
  3.               oldosmode. g% N9 b, k0 J$ g7 ~
  4.              )" F) W, r4 u$ u1 T1 k
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置
    : ]% k3 X- ]: }6 F' V' Q
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉
    5 y2 O% G$ D- ?  G2 D" H/ [; J$ u
  7.   (setvar "cmdecho" 0)
    ) @2 x  a0 D2 ~9 [/ P" x* F) B
  8.   (setq e (entsel "\n选择要对分的板筋: "))
    " h* e0 P$ ~6 C+ x1 R
  9.   (setq ent (entget (car e)))/ A% D) C: i1 W* v0 {
  10.   (setq newt (atoi (cdr (assoc 1 ent))))( Q5 y) ^7 h' s8 N. M  K
  11.   (if (/= 0 newt)                        ;过滤非数值文字
    4 z8 ~+ [9 }. G
  12.     (progn7 x3 E) F( e; C& T& g
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息
      k. U1 |8 P! d+ i" ~
  14.       (command "._Clayer" tc)                ;保持图层一致
    ' s$ p$ Y& t0 R) V/ f& b
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用
    % q" A: Y* i9 {
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度; {0 H0 O! E& P
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式
    3 z& @* W2 o7 i
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标1 @4 y  R; Y+ M3 ^: u5 U4 B. W& o
  19.       (setq zbx (car zb))                ;文字x坐标  k- P: [, N# p$ w. R
  20.       (setq zby (cadr zb))                ;文字Y坐标" I/ |" q0 V7 i3 W) o* B
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高
    + A0 h& O$ z" ^2 [, z# `6 |0 |( Q
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))2 b2 @3 n8 o# t- k& Y* U
  23.                                         ;计算分开后两个数值的文字起点
    7 k  ~" C5 E% t1 e' e1 v. y
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))0 M. \5 z" ~1 n: d* |- K
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    * H$ i) t$ d1 v5 S" ]6 @# C4 O
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))8 V* f2 _; k  G! D7 M! e" Q- `
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点' M' W+ Y, l! B% W
  28.       (setq zb2 (list zb2x zb2y))0 V6 K+ x0 V; J6 e1 y8 Q- m  F: g0 L
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)
    / ?, J# A# a* I
  30.                                         ;查看该文字样式中文字高度是否为03 R% r: m* j% B" d
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度
    $ C- ^# `& t( s  Q" [
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))$ b" l' }9 Y  N* C* d( @1 ^
  33.                                         ;输入两个对分的数值
    & J/ y- H1 q3 j& T% p
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))7 X" F& q  M; z! x
  35.         )
    9 C9 q2 A" d7 R$ X. R  ~0 ~
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度
    ) V: k# C  z( A; Y$ g% G: x
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2)); W% b: R8 O: K+ L
  38.                                         ;输入两个对分的数值
    0 s+ g6 W1 w5 p, u/ M
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))0 O" g, O# j/ L% `/ p9 f" n6 a
  40.         )
    7 i" M# {" q0 `# R
  41.       )
    2 W$ C) W$ R3 }) M
  42.       (entdel mc)                        ;删除原对象
      D* `3 f$ I! c& B
  43.     )% k# ?8 b$ M- j8 }
  44.     (princ "\n所选对象不能处理")% n$ V8 I7 C' }' T% L+ l1 o
  45.   )
    " [5 a2 ]: ?. R, |) R" D  A7 L% T
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置
    # M& O" u: l. S+ g9 S' [9 D
  47.   (setvar "cmdecho" 1)8 ~' n! y' Y0 I: q
  48.   (princ)* r. L* J" H/ A* u% ^
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:  N# a5 ?" B* R. t
(SetVar "OsMode" 0)   ; 加这列 关闭捕捉2 B, Z! k- Z6 R7 E( C" {
* g7 z9 L8 d. T3 n
Ans2:
- ~: U% L# f/ @7 {, c) z6 n(if (zerop (cdr (assoc 40 (entget (TblobjName "Style" (getvar "TextStyle")))))) ...)

评分

参与人数 1三维币 +5 收起 理由
woaishuijia + 5 应助

查看全部评分

 楼主| 发表于 2011-11-30 08:29:53 | 显示全部楼层 来自: 中国广西南宁
谢谢上面两位的回答
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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