QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑 . t. w! S& P% @6 y
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)' Q1 n' c$ P" a6 f9 ]) |0 U: S  O! R
  2.   (setvar "cmdecho" 0), E! W7 l% V# m# \4 F5 A
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    " g; Y+ J6 _% w  d4 l
  4.   (setq ent (entget (car e)))& T& f0 u( f) L5 A9 {
  5.   (setq newt (atoi (cdr (assoc 1 ent)))); L6 H) ]% D$ }' S; P- b) c) Y7 `
  6.   (if (/= 0 newt)                              ;过滤非数值文字% L, N/ Y$ Z# ?7 G) E
  7.   (progn
    + w; G5 }' z# ^8 g9 f5 f
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息5 ^' ]9 k" o' T
  9.        (command "._Clayer" tc)                 ;保持图层一致
    5 f6 o, w+ m# S$ S! t$ G
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用
    6 i4 A* _) _2 i8 ?* y
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度
    6 ?, c; l9 i. k7 u0 O; Y- m, @
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式
    , f" ?# y( R$ l  A
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标
    ! d. W) T' \( ^
  14.        (setq zbx (car zb))                     ;文字x坐标
    + T+ l. H3 u) B9 A1 l- l+ R
  15.        (setq zby (cadr zb))                    ;文字Y坐标
    , x/ Z1 ^4 z# P
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高& n$ e+ k* S/ i( ^9 B( |) r8 |
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点
    , c: e% ]- {  w/ X6 B1 z4 F7 o9 y
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))- H. S5 S- y$ T* L
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))6 Y/ |; w! S& }: a
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang)))); @' o  z( H/ T9 t5 |* F1 d
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点# b! j7 |7 s) D# H& e! E8 v
  22.        (setq zb2 (list zb2x zb2y))
    8 K* G3 `) m: k, X" G
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值/ H+ V" \* \8 Z
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))8 a7 d! Q$ t! ^
  25.        (entdel mc)                                                     ;删除原对象: V9 |& [! ?7 J" D
  26.    )5 H+ j1 e( V3 P) v$ G0 ~
  27.    (princ "\n所选对象不能处理")1 w( M2 N+ L' i0 b) n
  28.    )   
    2 F# C* L( m5 ?
  29.   (setvar "cmdecho" 1)9 ~, |" g& l# p& q
  30.   (princ)- m. k, l' L+ `
  31. )
复制代码

8 g4 \$ k2 E5 ]3 w
! _/ I) a3 Z5 E5 G第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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
    6 z9 ~1 I8 P5 |3 o2 Z+ S2 e- P
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb23 I$ p# |, Y6 s/ h( F& e& H
  3.               oldosmode6 ]. u/ m( Q  {# s8 y2 }
  4.              )
    # @% P; w0 C* e8 Z1 ]3 c* ^
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置
    7 R6 [4 A$ s3 @, u0 m. A
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉
    8 H% X: _' `# z) [$ f
  7.   (setvar "cmdecho" 0)
    ' Q) `! _/ t& p- T. [
  8.   (setq e (entsel "\n选择要对分的板筋: "))
    5 v/ R* k: l  N) s6 @
  9.   (setq ent (entget (car e)))
    ; A( m% y$ E) j. r: D
  10.   (setq newt (atoi (cdr (assoc 1 ent))))
    5 t6 O3 m$ G: D+ \1 C4 l
  11.   (if (/= 0 newt)                        ;过滤非数值文字
    : b0 z4 v- f' b- G8 ~; W6 a
  12.     (progn) L) e8 K' D' i8 ]
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息% b9 H  @; ^- q, i6 Z
  14.       (command "._Clayer" tc)                ;保持图层一致
    3 L1 P  B- J* `
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用& E& [0 e. e9 t
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度  y. c& G  J9 M- i( o; z1 X
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式
    8 E7 u* J, C, W
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标
    6 n: T* M, B( R
  19.       (setq zbx (car zb))                ;文字x坐标
    " s5 u' L+ O( \) i- ?- |
  20.       (setq zby (cadr zb))                ;文字Y坐标$ c8 P8 R/ C! s, r
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高. {2 }6 N# m8 [
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))
    6 Z9 |; H. _% z  ~  }
  23.                                         ;计算分开后两个数值的文字起点
    ) X* b( i* v8 {  E. y' Y3 p
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))5 G7 }* F0 ~5 e1 q- Z
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang)))), g" [1 J* Z. F
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))
    " e6 @) a  H& A# x$ A" @
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点) `* ]5 W3 I, }  S3 @- C3 ^
  28.       (setq zb2 (list zb2x zb2y))- B0 V; B  ]9 w; m8 x0 l9 Y8 Q5 b
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)# Y0 o7 i  T) m, F, V
  30.                                         ;查看该文字样式中文字高度是否为03 F2 r# b- N9 E7 K5 x" [
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度
    2 P3 ?) L9 G+ `" ?4 |2 x5 N% i
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))
    1 @- i4 d: b# ^; ~8 D- k3 h
  33.                                         ;输入两个对分的数值
    8 U& ?4 \! ]2 \4 F2 g$ c( `1 v7 o& R
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2)); N6 L( S& }3 d$ @0 d3 ]
  35.         )
    , Y6 v1 c7 c, c7 G; D
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度
    - q" Z: c% i+ a  X
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))0 w! D  i5 j. G6 n
  38.                                         ;输入两个对分的数值0 l' ~5 a: I7 V8 a/ _- K+ Z
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))
    5 d/ X* X0 X1 {+ I4 m9 @
  40.         )  C. y- e' X  E4 o) H# X
  41.       )
    3 t' z' R1 [$ D$ p/ q
  42.       (entdel mc)                        ;删除原对象; P& D5 O! n8 k  F% P5 D  \
  43.     )5 y' x! P$ y( D' k9 t
  44.     (princ "\n所选对象不能处理")
    ) \4 m/ J5 C2 \! M( s" I2 M+ w1 {" ]5 M
  45.   )( C, l  r5 Y3 X* P) z9 U
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置
    / q# e% I  g: U/ l3 z. N1 b& ~6 W0 z
  47.   (setvar "cmdecho" 1)+ Q: l* w$ t. p- S
  48.   (princ)4 B- Q( |' N' U8 l) Q
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:
& a  ?) o: |- _$ R(SetVar "OsMode" 0)   ; 加这列 关闭捕捉. l! j) p# [5 n# F- `% L2 ^5 U
" F5 P3 w/ B! x0 ]7 p& ?' t
Ans2:9 j) R- b% g  H2 v9 g9 V( K
(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 )

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