QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑
, u  p5 r1 u5 h3 T! D) J+ h
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)
    / _; Y  ~7 B8 T' [3 M# y( f% ?
  2.   (setvar "cmdecho" 0)
    0 v" ]/ O* [+ p0 c
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    ' t! a9 t9 K* @5 ^
  4.   (setq ent (entget (car e)))# J# A) Y1 R+ v; M
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    6 \0 [! F9 i2 m' A
  6.   (if (/= 0 newt)                              ;过滤非数值文字
    % r) S2 y4 j' [. a0 X
  7.   (progn' w: p+ J4 g8 r6 ~( R8 R5 R
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息0 _8 g! o' w  N$ B, j
  9.        (command "._Clayer" tc)                 ;保持图层一致2 e* ~2 v# W& a$ l! e  G
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用2 Z2 P; x( g  ]
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度  g1 X+ M9 ~1 w
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式# G# m2 L4 v% z+ C
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标+ K/ L! q- d- D6 M& A& j2 ?
  14.        (setq zbx (car zb))                     ;文字x坐标
    / q& a" R! }. \. O; t5 J* b
  15.        (setq zby (cadr zb))                    ;文字Y坐标
    # n) U8 ]; }$ L% M/ x% `: o: ~
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高& g* A6 c0 V5 `: M/ h2 r
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点) K9 @9 `/ q1 O
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    5 N' A+ p5 H6 f) Q+ Z$ b
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))& X( Z1 l3 |  W6 x7 g+ l
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))  \5 C# z& C1 N4 y+ r" T
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点
    4 N0 I1 E4 ^3 d' f
  22.        (setq zb2 (list zb2x zb2y))3 m/ |9 ~4 _1 G: D' ]# j
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值
    & K9 s. Q% E1 F: r6 L' F
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    + K2 p5 B1 M" O, M0 @$ m; @$ `
  25.        (entdel mc)                                                     ;删除原对象6 n$ @' I3 l) m% Q0 b" C
  26.    )
    - y( Y% v3 n* L: N$ s5 [, J9 g- _) g+ _
  27.    (princ "\n所选对象不能处理")
    % e9 d/ g: D, U, \0 D, f8 d
  28.    )   
    % i9 f3 N! d5 j
  29.   (setvar "cmdecho" 1)
    3 G! W) e$ [+ h7 |
  30.   (princ)
    : t7 y0 h! g4 v1 T2 U
  31. )
复制代码
6 w) r, [# ~' ~. S5 o1 @, k: ^2 K
) G% J1 n$ ^/ z7 r: b3 p
第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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
    1 P. }, W; T& o$ u6 K" ]
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2
    : t+ S. F: \. E  F
  3.               oldosmode: M4 b& L+ [( B3 Z8 h
  4.              )5 Q7 V0 S, K1 @6 p$ n
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置, _( y( X( x9 A' O' _7 ]- ?# n$ ]
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉* d  l) b  L" |- k2 Z" C
  7.   (setvar "cmdecho" 0)
      M4 T2 `* \9 ~- v* j$ k, a
  8.   (setq e (entsel "\n选择要对分的板筋: ")): ~4 N7 {) Q2 B* z: l+ T; k) U
  9.   (setq ent (entget (car e)))
      y) ]( T6 ?+ U4 }$ A( T
  10.   (setq newt (atoi (cdr (assoc 1 ent))))
    $ m' z, `; e$ C1 m3 s" v3 F0 x; l4 T
  11.   (if (/= 0 newt)                        ;过滤非数值文字
    - Y4 z3 I9 V. n4 y# U" Y
  12.     (progn
    9 j/ k# H- I, u  \% T4 p) P
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息5 }. Y' \, O) b4 Q- T6 S1 m
  14.       (command "._Clayer" tc)                ;保持图层一致
    ! `4 c( _9 }0 O& ?% N
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用
    " h" P4 P7 |0 Q& }
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度; E9 a7 G$ _3 c
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式7 q, k# e' _: Z9 q  L1 w
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标- {' ]# s( I& P0 q/ Z4 E! A
  19.       (setq zbx (car zb))                ;文字x坐标. L# q, V0 y% e/ J+ g% z
  20.       (setq zby (cadr zb))                ;文字Y坐标
    5 @/ y- `9 A  W
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高: V) }8 d( }& q( u. B3 u
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))8 X4 e* a7 @: ~
  23.                                         ;计算分开后两个数值的文字起点
    % _# C+ w, D/ }0 B! g, i/ z6 Q& `
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang)))); k9 Z1 v* q/ p  Y, H
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang)))). X* T7 R0 d* T! p3 U( _. y
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))  w. h+ q5 M' t  H+ i
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点; _  |2 \1 z1 n! U, |' w, z8 J4 K
  28.       (setq zb2 (list zb2x zb2y))
    # a6 T( s. b) B1 r) x. F1 {
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)
    + l" H7 ?) S/ v# C. v' V
  30.                                         ;查看该文字样式中文字高度是否为0/ J3 X+ P6 x7 ^3 H" r
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度) h/ d" Y- p! ]: W  K9 B
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))
    ; z+ e) ?4 `$ w. W7 b! j0 v4 ]6 _
  33.                                         ;输入两个对分的数值
    ! U' n/ a$ f) Q7 i( S( R
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    7 P4 D- S' Z# q: @: B7 R& i
  35.         )
    * v+ D# C5 S# Y. s; Q6 g  s2 p
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度4 u9 i5 e& C' r+ b
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))0 ?& F1 C: s% M% V" h' H
  38.                                         ;输入两个对分的数值
    , l0 K* c' z) o$ s
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))3 q- T: v; y  D3 }+ V
  40.         )
    : n. V" l7 R; p, g/ H+ m5 V
  41.       )
    ) B% B1 c- p6 \
  42.       (entdel mc)                        ;删除原对象1 C7 W( F0 o$ M
  43.     )
    . y: l6 @' H4 K0 \, ?
  44.     (princ "\n所选对象不能处理")) [! N! Q" I) |4 L  \; p* Q/ R
  45.   )
    % w6 ?6 m9 f! ~/ ?
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置2 Q2 {( T! @/ Z5 [, k" C
  47.   (setvar "cmdecho" 1)
    ' \' {  V& i) @) ^9 m
  48.   (princ)
    9 M7 Z! |! w$ L% {6 v, A6 G
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:
  h2 p* {0 C! c(SetVar "OsMode" 0)   ; 加这列 关闭捕捉
% E+ y) n& l) ]+ l& r
3 r, P  A! x  U5 UAns2:
0 b* f; W; H- B(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 )

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