QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑
# d9 z9 ]4 B: o; v" Q
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)
    + s) g# f9 l9 z4 p; O
  2.   (setvar "cmdecho" 0)1 I* u: Z" n2 a
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    $ \$ k  F. h3 x2 L2 X; U
  4.   (setq ent (entget (car e)))
    ! v1 Y6 c1 j- u
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    / R- c+ y/ A' H! N- j# A8 E
  6.   (if (/= 0 newt)                              ;过滤非数值文字
    $ R/ w7 \* B( f9 G! g% C+ J
  7.   (progn
    ; J; [% C( C* ^7 `, {* X
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息5 g8 C7 F1 Q; G$ Q7 G! q
  9.        (command "._Clayer" tc)                 ;保持图层一致  P2 r, _* ~& J, T
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用. K1 L+ z  e$ t( f$ Y6 T2 X
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度) R. p. i" ]7 o( L
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式  y! F8 p( s5 e
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标1 Z( m9 u# w; T2 e
  14.        (setq zbx (car zb))                     ;文字x坐标
    . D! d0 ]9 Q& U2 }$ ?
  15.        (setq zby (cadr zb))                    ;文字Y坐标
    & q5 I/ ~  x1 a3 z% D+ Q
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高
    " i! C7 e  Y" Z+ @' C! f
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点, ^2 e/ T$ M- w
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    ! J6 L: p  [4 m- c8 X! s  C+ d) e
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    8 F; @! S7 B1 A7 c$ }
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))
    8 W2 M' j9 @) a1 w  I
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点' V6 k5 c1 Q9 x( l8 _7 j
  22.        (setq zb2 (list zb2x zb2y))
    % ^1 D4 o: B/ Z  [- ~0 |
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值
    5 z+ M% z& b- W: d
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    # H5 n" q" `* x$ f' }
  25.        (entdel mc)                                                     ;删除原对象4 B) Z0 c4 @5 R, t; n6 {4 D
  26.    )/ ^" w/ \+ J7 k/ k: ?
  27.    (princ "\n所选对象不能处理")# B1 q8 S3 G: B9 x0 k
  28.    )   
    * U. u0 ^8 F* u! d  O1 z
  29.   (setvar "cmdecho" 1)
    0 u/ R- t) [9 j) a
  30.   (princ), {6 k' ~/ o9 d( u4 v# G/ ?. R
  31. )
复制代码
- T! G# h6 ?, l; U- X
! r# |: x) A' g: l  U/ F
第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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* S! H3 |7 t# T" w
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2
    4 U: t; g; g1 o; ?- ]
  3.               oldosmode) W+ a( W2 l6 c
  4.              )7 i! n. O/ @( f& m- @6 K
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置
    ! T$ T" f2 G( Y: {  U& Y8 h. A
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉
    2 t. h; ?8 a) W
  7.   (setvar "cmdecho" 0)! O8 r+ v- B0 F* S9 ]: H
  8.   (setq e (entsel "\n选择要对分的板筋: "))" q0 `1 F2 r; B' {/ V
  9.   (setq ent (entget (car e)))
      z( ^) t* K9 L4 W
  10.   (setq newt (atoi (cdr (assoc 1 ent))))
    ( b5 W% x9 W% Q  E. A- b- J
  11.   (if (/= 0 newt)                        ;过滤非数值文字) M, e8 y  K! y8 M% N/ f  e; g
  12.     (progn6 p4 e) y; Z" {) `! S( n5 [9 g5 t. T
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息
    5 {" u. U! `4 b: H
  14.       (command "._Clayer" tc)                ;保持图层一致1 r7 Q% O0 e( ~
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用) S0 a" i0 @$ a; u3 {
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度
    ! y7 s1 Z( k" x! z
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式
    : Y, k5 d( r# |% Z% Q% v
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标
    * p' b- [, ?$ P$ p
  19.       (setq zbx (car zb))                ;文字x坐标
    ' l0 M" [, |5 K
  20.       (setq zby (cadr zb))                ;文字Y坐标4 {2 n" z8 B9 G: o3 V
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高
    6 Z- m% m6 j5 D
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))
    1 W# p0 @5 ~6 ?: m$ T6 n
  23.                                         ;计算分开后两个数值的文字起点
    7 x# {+ n( y: u; ^0 d
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang)))); J  }+ c* [& F$ H4 a
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))# u0 _2 s. k: _; T4 u" t
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))9 s8 J/ s9 c+ e; [
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点7 Z" q4 p) c8 c6 y$ u
  28.       (setq zb2 (list zb2x zb2y))
    8 {/ K' }% V: u4 }% Q
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)0 Y$ s( s, G8 y: A
  30.                                         ;查看该文字样式中文字高度是否为0
    + p' I6 R6 u5 j4 `
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度
    1 T7 c9 a5 ^: T1 c2 V
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))! y# O" u# w, n# \" z" t# a. a2 I8 Z
  33.                                         ;输入两个对分的数值3 r7 }" [0 L* o0 T3 F, a
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))/ Y2 |; l! V" l  u6 {0 T5 B' C5 s! I
  35.         )
    % j4 f7 x( Q- |) Z6 ^
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度9 }1 c, Y4 y. i  Q
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))+ B  [# z- C2 t. W) C$ j) a0 f
  38.                                         ;输入两个对分的数值' X: Y3 U6 i0 W7 U2 R$ ^
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))# s- q+ Z9 _0 _: {5 n) f9 C* Q1 V
  40.         )
    4 W6 ]) X/ J0 L3 \
  41.       )
    ) |$ [- V& O/ Z+ s
  42.       (entdel mc)                        ;删除原对象! c: @7 D. Q) T) h: Z+ q
  43.     )- o) ]7 j. ]6 ]
  44.     (princ "\n所选对象不能处理")+ }' m9 ]; y& ~8 g
  45.   )
    0 ~( y$ P. [* q5 W4 `8 G8 l* u) d/ `* m
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置
    & K* i! H$ @* z( J9 k" |
  47.   (setvar "cmdecho" 1)4 I' X* U. I# p3 G2 I' I
  48.   (princ)1 {1 n6 c. W1 w$ D4 W
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:) Z$ ^* J) s- k) S  I( G
(SetVar "OsMode" 0)   ; 加这列 关闭捕捉
/ l& w8 |! x, d) F; G8 D3 ]2 z, u+ E
+ |; q8 w  Y, @- \" L9 H: {Ans2:+ ?% B' @0 U5 K# Z' `
(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 )

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