QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑
$ p+ _) s. {" W6 ^* p
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)5 r  ^. B& y- o* V
  2.   (setvar "cmdecho" 0)7 t4 T0 r8 L0 N9 a8 p  g, r
  3.   (setq e (entsel "\n选择要对分的板筋: ")): |" w1 k( Q" W3 U( O$ e
  4.   (setq ent (entget (car e)))- p9 m! W& ]4 j9 a  s" c
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    " O% n: A$ f- D* o* W9 O( N
  6.   (if (/= 0 newt)                              ;过滤非数值文字5 o* h/ f  Z: m9 M( y* d( Q) A
  7.   (progn, S7 W! ~3 H* S+ U% \& N
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息$ r; K! ^6 E2 A% B; p% l3 x
  9.        (command "._Clayer" tc)                 ;保持图层一致
    $ g3 }8 n3 o+ Z' M4 J
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用
    2 ~/ ^8 y# s5 m  R2 ~! ^
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度7 a# m1 ]  p4 Z, N/ |/ L. V
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式4 @0 [8 G1 Q. d
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标
    ; `; n+ v) ]$ v5 W
  14.        (setq zbx (car zb))                     ;文字x坐标
    2 j, w% k2 j2 c5 L  V+ F- M2 @7 ]
  15.        (setq zby (cadr zb))                    ;文字Y坐标% @% [0 `$ C" q
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高5 y9 Q& V0 ?6 R. p" O' W. A9 C3 J
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点) O4 M; w' f0 }. \8 I: Y1 n: T
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))& v7 W- s) {, z& ]: Z3 l
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    * B" J3 u& p& R1 ^5 Q: Z7 R" h' G6 B
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))
    8 e+ U) l, k$ w. y' r6 t3 F! `1 q
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点
    ! x3 L' `# U/ h9 a6 L/ L, z3 z
  22.        (setq zb2 (list zb2x zb2y))8 p0 ]% v9 p0 I# @8 c! [- M
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值! j  v# g1 a5 A
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    ( s, A/ M0 W+ v0 S6 z- ~
  25.        (entdel mc)                                                     ;删除原对象6 m. U8 E) y4 J" E
  26.    )
    - q+ n0 t! Q1 M; t; A5 K/ G
  27.    (princ "\n所选对象不能处理")' I* a" |2 ]' M5 j
  28.    )   9 L  M1 F4 I* ^2 d4 S! d
  29.   (setvar "cmdecho" 1)% t( O0 v. R* D( M: H
  30.   (princ)
    & Z- q! O- V- t" ]" ?
  31. )
复制代码

; \. U! A- S& j& m4 L% m, a* @& 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( |  _( d3 d- P+ Y* i+ w0 q$ A" i
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb25 G# Z0 q; n3 p0 k* U' n
  3.               oldosmode0 o) ?) q. n8 A6 G* t) x
  4.              )
    ; A; ~; w; j. `1 y1 ?) I. ]
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置6 P+ \1 K% z3 M$ H6 W; t
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉7 V0 ~" f  |. O! ^. ^2 M$ ~8 e
  7.   (setvar "cmdecho" 0)3 V3 j/ W5 L" ]. k/ S
  8.   (setq e (entsel "\n选择要对分的板筋: "))
    ( M3 u( d" _, O& o( q
  9.   (setq ent (entget (car e)))" t; G( ~+ I# [( l- g
  10.   (setq newt (atoi (cdr (assoc 1 ent)))); Q5 b* X  I; f
  11.   (if (/= 0 newt)                        ;过滤非数值文字7 \) B! R- Z& ]" K6 p
  12.     (progn( a( Q9 \, u( V% f, h
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息
    $ o: j8 \7 k3 |6 G
  14.       (command "._Clayer" tc)                ;保持图层一致! |+ y# o1 L# P2 d! l: ~: q8 M
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用2 M& t" `, j; @( F
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度
    " L2 \) n( f4 Z5 @- B& i
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式
    ' I$ V6 E- r( ~7 b! V9 Z9 {" |
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标* k% B# H: U( A1 G. c
  19.       (setq zbx (car zb))                ;文字x坐标
    - w2 k7 H2 C( s( T7 w
  20.       (setq zby (cadr zb))                ;文字Y坐标% F) v$ s# ~9 y9 }0 b
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高  k  c, l, x. ?" \
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))- N/ L! j, o- \4 ^% F
  23.                                         ;计算分开后两个数值的文字起点
    ' Z1 {" y" A! t2 `: V
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    9 F5 i) ]- B6 W
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    . C) P2 M5 a; k  N$ j; G  d7 @
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))
    5 Q! N4 c1 [6 f* w' U( Q. P; z
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点
    $ H6 D$ @) s3 j6 M+ N  X
  28.       (setq zb2 (list zb2x zb2y))
    $ G; w2 r9 `; |. C
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)5 C. z* u; e4 j; c) @" j' I
  30.                                         ;查看该文字样式中文字高度是否为0
    % Y/ t! h+ S, r& F0 q
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度
    ; N  K. Q. G) H8 F7 o! S3 q
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))
    & q! D* M+ K0 ^6 S! G2 P
  33.                                         ;输入两个对分的数值7 g2 I) \6 J: V! N; `) C# \) O
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))# d1 J) d( K4 E5 _  g  ?
  35.         )
    * D, M; K# ]: R# R8 P* Q+ c- P8 w3 b- y
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度
    # d1 Y( O6 f1 Y9 t+ E' T* @; Y+ Q$ v
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))
    : o6 S6 }# O3 D4 z
  38.                                         ;输入两个对分的数值7 Y- p! z; ?$ `% v( K
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))% c# r* e1 S) E  }5 t
  40.         )# z- r+ B- ^( j" {3 k1 h7 u
  41.       )
    8 k1 G- t. K' Y; q* ?0 ]9 D( k
  42.       (entdel mc)                        ;删除原对象2 N' w3 {( A: X& b4 j0 r/ p9 ^
  43.     )
    2 c! o- u! l# t2 y- ]
  44.     (princ "\n所选对象不能处理")7 C& g! K0 k5 R1 e& h+ ^
  45.   )
    9 ^# T: N& @  w  X) i- }
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置& ?3 y. e. |1 T, W% j6 w
  47.   (setvar "cmdecho" 1)
    3 m2 _& Y1 b5 i
  48.   (princ)
    " ]8 T+ q5 F$ E, x0 ]! v
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:
, ^& V6 v+ _  _6 X(SetVar "OsMode" 0)   ; 加这列 关闭捕捉* Z- G8 \+ \7 J  y6 D  q  T0 l# w

( m4 H- Y+ B3 H% P( b/ F9 g) \Ans2:0 a, P/ d9 O2 D5 t, ~& [; X
(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 )

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