QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
10天前
查看: 2568|回复: 4
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑
* h# y. _. U3 t1 V0 k! O" v/ n
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2). m. D( F. y) ^0 V6 c* _; E
  2.   (setvar "cmdecho" 0)+ ^' `6 ^. d; T1 p' Z& x8 v
  3.   (setq e (entsel "\n选择要对分的板筋: "))9 R5 f1 h: `6 N! m9 Z9 Y3 S0 }
  4.   (setq ent (entget (car e)))! Q4 P9 i( r" [* g2 M
  5.   (setq newt (atoi (cdr (assoc 1 ent))))! B2 D- _3 n( H* K0 q/ J/ m
  6.   (if (/= 0 newt)                              ;过滤非数值文字, h. n3 h, n8 M' O
  7.   (progn
    - [5 |8 L  E7 ~& Y
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息/ p0 P. T( i1 r1 {5 r5 s
  9.        (command "._Clayer" tc)                 ;保持图层一致
    1 F0 m6 y7 X6 f
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用8 p- n  c/ \: W9 e; J
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度; u7 t* Q/ {$ e# x- G8 S5 ^
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式2 g3 Z" g( i# T. j" z( a5 r1 O, i
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标4 Y% ?- x- Z# S* O9 j
  14.        (setq zbx (car zb))                     ;文字x坐标
    , g( v4 Q& Z7 A& b9 _* }
  15.        (setq zby (cadr zb))                    ;文字Y坐标2 |, O4 x) g4 n! z
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高
    , J6 H$ P' y" e  e) C
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点
    6 s7 ?8 x( Z  E( S9 P$ {
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))& N# ~. y! X4 ]% B- H' g
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))# u4 p/ X$ c" V( k( L# Z% ?
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))
    7 K7 A! e8 \* l
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点
    ; O5 M1 }7 F$ z7 }- p. k6 z
  22.        (setq zb2 (list zb2x zb2y))# X' J' `  i# N% q$ j; o0 S
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值' j: {# M$ h! e% G
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    1 R; H' j3 C5 Y$ R
  25.        (entdel mc)                                                     ;删除原对象2 X& T# w. u6 f3 y. I# N
  26.    )
    & I- x" e/ F3 e$ Y8 r5 _
  27.    (princ "\n所选对象不能处理")+ u1 ~$ {2 h! \9 S" Y
  28.    )   
    ' t: H( E+ r$ x- G
  29.   (setvar "cmdecho" 1)# N4 \4 z0 Q4 V* X2 {
  30.   (princ)
    5 p& T4 ^, ?  I& U# M( L+ y# n
  31. )
复制代码

: n  Q$ I1 ~3 g4 h; B7 j, [! v/ c# W) _* j  V5 H. d) n
第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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
    % K1 O: t- x% P/ a" Y5 B
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2
    5 I4 Z2 U2 O' ]" g% w4 n' p) ~+ H4 N
  3.               oldosmode
    ; m. ?, O# s0 u* ^. |
  4.              )
    2 D) O: c9 s# S9 T
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置, p8 O  Q! @6 _- I
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉0 W- T+ p! V& G
  7.   (setvar "cmdecho" 0)- m' I3 a1 C3 Q
  8.   (setq e (entsel "\n选择要对分的板筋: "))
    5 h, a9 `1 `  L5 ^& d% {0 E0 l
  9.   (setq ent (entget (car e)))
      r9 _  f2 z1 N; R. Y& v5 ?
  10.   (setq newt (atoi (cdr (assoc 1 ent))))( n7 D+ U, O  H/ E# L+ B
  11.   (if (/= 0 newt)                        ;过滤非数值文字  P  T2 s- I9 {+ [
  12.     (progn# q4 N+ Z0 A0 x3 ?7 ^/ c2 U, r% f
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息* n0 W  u  O, T* j. @
  14.       (command "._Clayer" tc)                ;保持图层一致
    $ a" c  I$ l% x8 n% r
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用
    . S* t+ ^$ |7 o8 J+ X( M' R
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度/ [: Q  J' Y0 A5 E5 {/ o
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式, j( k$ X) A; k5 |
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标& d' q5 w4 n- h3 I/ J! I3 w% S
  19.       (setq zbx (car zb))                ;文字x坐标
    # j% h$ y/ N; @
  20.       (setq zby (cadr zb))                ;文字Y坐标% d+ a( I0 }) Q6 I! Y2 \
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高2 z5 D8 l: M2 o0 n* e
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))5 J9 B- {7 E% ~6 ^0 U2 F1 k/ v
  23.                                         ;计算分开后两个数值的文字起点( t8 [/ [9 I+ j) C: I4 ~0 G6 o
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))2 U, j! n, p8 W3 e" i6 m
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    & D' Y$ `8 G; I1 B- Q
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))+ O; S/ s- A$ G( W9 x- E! m: r0 |
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点( L# e" ]4 B7 n! X& J9 _
  28.       (setq zb2 (list zb2x zb2y))
    8 _% P! R; n, I; f' [+ o
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)
      _7 g/ e$ B8 E6 F+ B- N
  30.                                         ;查看该文字样式中文字高度是否为06 w! B$ R7 y; f% Z
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度
    6 s# x2 X6 E9 v
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))
    ! e+ j- H1 x: G% P' c# V
  33.                                         ;输入两个对分的数值+ w. C  j* E% w6 {, I
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))& U' S6 l- J* }; V3 M
  35.         )( ]6 y3 D4 z) ^
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度
    1 E& j2 i$ U4 B- E0 Z
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))
    / ?& R, J" y* A( K
  38.                                         ;输入两个对分的数值( }; T: E2 H  s" g1 o/ k  M
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))
    # c" W/ g1 Z+ O: I& T
  40.         )
    3 e8 b( C+ U  \0 S) b
  41.       )
    , x2 }1 @7 T7 k& ]
  42.       (entdel mc)                        ;删除原对象$ u# M+ j! K9 i! p2 h! ~; [
  43.     )
    ; S/ R- _9 H* C
  44.     (princ "\n所选对象不能处理")
    * c5 I' @1 M8 ^2 ^6 F9 T
  45.   )& Q. S7 B5 ]$ {3 q9 f
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置
    4 c2 }4 d- z, [2 v  u6 H
  47.   (setvar "cmdecho" 1)
    ( O6 T+ ]2 m. b% q1 W
  48.   (princ)' W2 ~( ~4 \% Z+ g" V
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:
  b7 B( w% p: N% j6 m& M! `(SetVar "OsMode" 0)   ; 加这列 关闭捕捉2 P6 a" S8 b6 C" e0 W0 n
: L; X: [* W- G* f! D& g% j! c% l, a) X  C
Ans2:
# `  n, w" ?. f! x- _0 _(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 )

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