QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑 6 ]) ~- X9 h4 r3 V/ T1 ~
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)
    ) A, v9 o1 T1 {$ L: P4 U  g% B  |
  2.   (setvar "cmdecho" 0)1 E' E/ E, o! Z5 {& P
  3.   (setq e (entsel "\n选择要对分的板筋: "))1 l: u0 l  [8 n1 m' n0 R; S5 y: j
  4.   (setq ent (entget (car e)))6 N1 w. w8 ]  `* k
  5.   (setq newt (atoi (cdr (assoc 1 ent)))): o9 Q& j  l5 m0 m
  6.   (if (/= 0 newt)                              ;过滤非数值文字
    + b0 m  J) V2 y, J3 u6 c& P
  7.   (progn
    ' R) s2 P) W7 q
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息
    # `( k2 N: J: \' M' F
  9.        (command "._Clayer" tc)                 ;保持图层一致! k) E/ R$ N( I/ h/ F
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用. [% c. d( U+ L+ K
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度4 T* O4 @3 `/ y2 k- u
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式
    . z) X6 @0 @) W0 h# Q
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标
    , k( }! u  ]8 K$ a' W
  14.        (setq zbx (car zb))                     ;文字x坐标5 U4 r; D; C+ J" X$ n! `6 H( [
  15.        (setq zby (cadr zb))                    ;文字Y坐标9 q% Y% O% v8 D: F0 A! {  f
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高% @1 V: D% F) y% p3 ^0 \
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点, j5 d( `9 `6 n" k7 i
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang)))). u5 U) p, u! e6 v2 i4 o
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    # ~$ I! B/ e' l( z1 c; H3 d# g
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))( j' A2 B7 N; d6 O
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点
    9 W, a6 f9 c! G0 A8 t
  22.        (setq zb2 (list zb2x zb2y)). U& y1 M# q( m2 m: l9 X, N
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值
    3 [% O& K* A; f
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    * p, S, ]: ~9 R$ Z& E; V% d! z
  25.        (entdel mc)                                                     ;删除原对象
    ( G+ `" y( A5 O
  26.    )3 x" k7 X' q% }# p( a' S, K) [
  27.    (princ "\n所选对象不能处理")
    ! u1 m# m, ~9 ]& h
  28.    )   
    " v9 \5 i2 x6 D* Z0 Y- o! j
  29.   (setvar "cmdecho" 1)1 N: T3 i# E5 j" X; j( R
  30.   (princ)( l- s+ P2 r7 m- p1 w
  31. )
复制代码
' Z' E, i+ ?) }

, Q. C5 [# ]4 }; s- ]1 k; K第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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    zb3 f8 [% y! `9 o8 ~8 X" U
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2
    " G2 o9 }& K4 H5 G& T3 \9 S
  3.               oldosmode0 Y) k+ ^0 L+ n( Z5 e2 o
  4.              )
    . @# V: [5 k8 t6 l
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置
    3 R2 c, R0 H; O9 C
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉
    : v  D3 |# d+ ^! b8 M  r
  7.   (setvar "cmdecho" 0)4 t8 b9 K5 b8 G2 e* F" ~% b/ b' L
  8.   (setq e (entsel "\n选择要对分的板筋: "))
    8 K! K* r$ ?$ i) H/ L( U
  9.   (setq ent (entget (car e)))" c( W  ~3 N( }& P/ T6 L6 O3 U& s
  10.   (setq newt (atoi (cdr (assoc 1 ent))))$ Q! t9 c  x" W; |
  11.   (if (/= 0 newt)                        ;过滤非数值文字
    4 @* r! B% Z' J- N
  12.     (progn
    - F- _3 ^2 q4 z, A4 A
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息  j( v) C* c' F2 c' y! b2 F
  14.       (command "._Clayer" tc)                ;保持图层一致( K$ G+ d2 x: m5 g- L6 @+ \1 L+ E
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用
    - [* i3 e+ l5 v6 x' n2 o" k' B
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度+ g  ^" U1 _2 H: K6 u  d
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式; @+ i$ ~* A& H: M4 G
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标8 A* _7 K2 M* i1 t
  19.       (setq zbx (car zb))                ;文字x坐标
    + ^& j8 t: e& L
  20.       (setq zby (cadr zb))                ;文字Y坐标
    , x. Z0 n4 M* W0 N) g
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高% Z* e% Y  I8 u6 I6 @# Q
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))
    # W: x' S& {, o# j& Z
  23.                                         ;计算分开后两个数值的文字起点
    : k5 T( i3 E8 k* U  P
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    ( p6 l% r' c& L
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    3 Y$ E  l! `1 `4 V
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))5 x5 T9 O, l' C* n3 ^7 h
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点
    6 ~6 z$ T, V& C! Y6 F4 a" i: L
  28.       (setq zb2 (list zb2x zb2y)). J0 Q4 X2 E' G) d! ]/ [
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)
    , P7 e: n9 C/ O
  30.                                         ;查看该文字样式中文字高度是否为0: M7 Y3 i! [7 j: s
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度
    ) l6 i2 f* S! U" o; M
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))9 }! k- r5 q* u( @% s
  33.                                         ;输入两个对分的数值
    - X/ V3 G5 n& d
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))3 Y! j# Q+ u  @, [$ j  {
  35.         )& I/ Q' e5 Y, P" a8 y
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度
    & g6 G( u+ A7 h, }: V, X! n
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))
    5 Q2 A2 p( N0 ~1 o( u
  38.                                         ;输入两个对分的数值
    " h3 F% {  g* V
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2)). T6 `1 J8 y8 F+ b+ o" ]9 l
  40.         )) ?5 \' H% M' p# |" ~9 m" l" ^3 w
  41.       )8 S! Y1 M. U/ ?, F4 I9 E, ^
  42.       (entdel mc)                        ;删除原对象/ Y- m1 c1 l- r/ g
  43.     )
    # I! u# }* Q; L6 }$ d; J
  44.     (princ "\n所选对象不能处理")
      B! y1 h' @+ ^1 z2 T0 g
  45.   )2 A! Q$ a; ~- d  J. y2 w
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置
    / T) E% h  C  {7 H" d
  47.   (setvar "cmdecho" 1)! W! g# C! W$ ]4 \4 |( `! N* Z
  48.   (princ)* c. ~+ W0 E; }4 l$ d
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:; L; P# C' G( ~8 Q
(SetVar "OsMode" 0)   ; 加这列 关闭捕捉
6 w/ H3 R+ m% s/ R% ]/ v  z% q: m& O, d
Ans2:
0 `" R& Z2 x$ {4 M1 V1 ^4 D3 @(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 )

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