QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
5天前
查看: 2566|回复: 4
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑 0 f- Y! N( w. A* z, ^0 i" C" A3 e  X
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)
    / D( B2 T6 {' P) J: {" n
  2.   (setvar "cmdecho" 0)3 C6 ?$ O; P# f
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    7 T1 m6 L  K/ P1 A3 i: h+ N. a
  4.   (setq ent (entget (car e)))  F5 f) V: z3 c4 @$ {5 \% \1 q
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    1 N) b; [, H8 I9 n) K, c" Y
  6.   (if (/= 0 newt)                              ;过滤非数值文字
    & i9 K! h+ N! G2 C
  7.   (progn8 F& V  m! W5 z: A
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息2 x# k/ P0 |  K. |& k
  9.        (command "._Clayer" tc)                 ;保持图层一致- _# l) h6 |2 m
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用6 m; i  l  S- H. Y8 ?. E  j
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度: t$ u, L' e# V: U* ^
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式& t' O, h( L$ K: E8 H
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标2 k" l, Z5 L' r! k% Q$ t- H
  14.        (setq zbx (car zb))                     ;文字x坐标
    3 {8 ]+ Y/ G0 \- d5 K( c
  15.        (setq zby (cadr zb))                    ;文字Y坐标: C' \4 T6 K' D7 ^* I
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高$ ~& T) O8 u) R6 H/ o7 \
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点
    6 _6 ?; U+ M. Q) W
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    , h6 ~; w* |$ m+ E7 e
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    " U2 l8 s8 J; m) E4 X, l
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))* ]) F/ w* p! U+ w
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点! J+ j4 M. N* q9 L0 G; ~8 h9 Q
  22.        (setq zb2 (list zb2x zb2y))
    : i+ o) o, \! }
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值
    ; L- |: z  x  g& {
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))! E2 y. I& D5 L
  25.        (entdel mc)                                                     ;删除原对象9 R3 [7 D1 d4 T  [0 x6 l
  26.    )
    8 n& U! T8 o+ Q9 w3 t! }
  27.    (princ "\n所选对象不能处理")
    9 R! [; [4 m& M' q9 T/ E
  28.    )   
    ) W4 B! ?  z1 O/ }& ?1 y8 d2 U7 n
  29.   (setvar "cmdecho" 1): H1 P9 @0 ^# t, k% ^
  30.   (princ)( ^1 n1 u3 x, D8 f' g, K( O7 k! B
  31. )
复制代码
) ^3 X! _3 u: N! _2 c  R

9 k5 C2 `% l; s/ `第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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
    / O9 \! N6 F) U5 C4 o/ b% f
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2
    / D3 r5 Z( b3 y- b
  3.               oldosmode
    , V- z3 \3 E+ i: b; n" x6 j9 j
  4.              )1 x( w8 {, x# F
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置" I: ~$ d7 G/ d  X1 n
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉3 \4 u& a/ F, W
  7.   (setvar "cmdecho" 0)8 D9 w( K# T5 a! j0 I
  8.   (setq e (entsel "\n选择要对分的板筋: "))
    9 q8 X# ]3 {# c' \, J
  9.   (setq ent (entget (car e)))
    , C( S; |8 j% l9 Y2 {. U4 Y
  10.   (setq newt (atoi (cdr (assoc 1 ent))))  {9 ]9 Z! d6 O" R, a
  11.   (if (/= 0 newt)                        ;过滤非数值文字; L, [6 C' Y1 E% [& H) A. d
  12.     (progn+ ~& ]7 p6 ?0 W& P+ n
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息6 J% h) }6 f3 g! E/ y# `) d
  14.       (command "._Clayer" tc)                ;保持图层一致
    - @; J& y1 _0 P9 }& |0 J/ s
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用: i5 p: n0 F8 x- e2 ?
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度) |# U& b- T6 Y5 V+ G' V0 E
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式
    ! p  z: w' V0 z5 c# C  F2 ^
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标2 ]8 G0 J. D- n% T
  19.       (setq zbx (car zb))                ;文字x坐标
    / h7 z7 W: j1 q( _$ ]' |2 {
  20.       (setq zby (cadr zb))                ;文字Y坐标' J! r/ _1 i7 Z' m$ U( @
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高
    : C* S- z0 S, [# i
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))
    , `5 y" `& J% H  V  l+ q( T4 }
  23.                                         ;计算分开后两个数值的文字起点! j% t3 T3 _, E( t6 a
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))6 U5 {5 W1 q8 u* l! g& c. ?
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    % h8 |3 m, W: k9 y, ^
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))( N+ Y+ i7 h* \& E9 M! G
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点
    9 B4 o* J7 g/ ^
  28.       (setq zb2 (list zb2x zb2y))3 R4 b6 c& R9 W  W3 Y
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)
    . @" z2 s" `% J7 ]/ v
  30.                                         ;查看该文字样式中文字高度是否为09 O1 p4 y" g  N
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度/ S" L) ~2 E% u0 l
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))2 \: I4 s1 H7 }0 A# H$ I( _
  33.                                         ;输入两个对分的数值% d/ t6 M7 ~( x8 M0 p  ~! L* A
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    7 Q! y# T, ?6 ~0 D1 \
  35.         )
    9 j: @' @  \& ?$ Z0 z9 I
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度
    6 E9 S8 [+ D* s' B2 s: C
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))7 i0 C) r/ v6 g: x  f+ G4 g
  38.                                         ;输入两个对分的数值
    - s! P$ W% x" X$ W) O
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2)). \; F+ ^6 N" B, i9 B
  40.         )
    0 _7 w% U, c* v9 G  ~: \+ a8 c
  41.       ), S7 ^6 A. h3 K, [  h3 T
  42.       (entdel mc)                        ;删除原对象; w* [5 o1 o) u
  43.     )
    . p* q/ r( |* I1 ^7 c$ ^+ w
  44.     (princ "\n所选对象不能处理")- M; l: M6 M8 h" b4 q% a# i
  45.   )4 |0 _. b2 }* L# |  g
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置
    0 M. x/ Y4 u% N& `: e5 r6 G+ v
  47.   (setvar "cmdecho" 1)' _+ A4 p  }5 F& H, r7 D' {
  48.   (princ)
    5 o. ~; H' i( i" c' t
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:
  V) z( {. r# B3 w/ w(SetVar "OsMode" 0)   ; 加这列 关闭捕捉* m! X4 q6 `/ @6 U3 K- w
/ T; Q3 ]6 x( F6 P" C& |/ V
Ans2:
) @" I% q& w& B7 |. r3 Y(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 )

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