QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑 ' ?' X1 p" Q7 N  T  v
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)
    " P9 \; V5 Z6 L& v; R! m( R+ N  w( r& Z
  2.   (setvar "cmdecho" 0)
    1 r0 D. N; o5 E8 U. n  _
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    6 {0 a9 @* N- @6 [. c8 j
  4.   (setq ent (entget (car e)))
    * R9 ~) L1 K6 h9 l: ^. `
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    - m, R$ e$ I* ~& m9 Q  \5 [
  6.   (if (/= 0 newt)                              ;过滤非数值文字
    % l6 j' z- r% S2 [
  7.   (progn
    7 |1 d/ s0 n% j; z; Z+ ]1 O9 h  C
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息
      f% ]5 v: C* C% T4 ?$ K
  9.        (command "._Clayer" tc)                 ;保持图层一致
    4 |  s& c0 H( f$ b" Z1 o1 l- E( P
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用
    1 |( L% W$ Q4 @" e  q# V
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度
    ) s6 w4 q! s" c. }
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式
    6 e; l8 E2 l1 B! X
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标
    ! T9 A$ L0 K2 a! F) `; T5 W! t9 a
  14.        (setq zbx (car zb))                     ;文字x坐标
    4 B% w0 {, q7 {; w
  15.        (setq zby (cadr zb))                    ;文字Y坐标
    - h0 p+ z. q( u- `: V$ L% O, c  {
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高
    ! h/ {) d$ |. `) c) O
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点
    , l( O. k, |- H3 v, R5 ]
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    5 H7 I/ W- v/ O
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    " i- @* O- ~6 N8 V2 |8 @5 @
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang)))), @% T7 {- \3 M% g" h. l' P
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点
    $ _; Q( s) j$ r" h/ w/ r5 Q" M
  22.        (setq zb2 (list zb2x zb2y))
    4 F6 J, {$ v9 i: c: e
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值
    7 N( _! m  w0 [" L
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))" q" B+ R4 \2 y- Z! g, y
  25.        (entdel mc)                                                     ;删除原对象- I: t2 I: h" ?1 n( ?/ }
  26.    )
    0 u8 a1 k7 G. Y, B- T
  27.    (princ "\n所选对象不能处理")& V3 [7 |! b9 ^/ X( K
  28.    )   9 p" n  H) L. ?* a6 I
  29.   (setvar "cmdecho" 1)
    1 Y# ]" b' a2 h4 G5 X/ m9 ]
  30.   (princ)
    1 t$ N' o# s% m2 ?
  31. )
复制代码

* y2 q4 w& V" L. H2 c; P+ q- T, J7 H- _& R" {/ {3 t
第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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    zb0 Q' }* N' z) g  Z' w* v
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2
    - C& O: G2 \& X" F
  3.               oldosmode
    ; N0 ~+ \, R: `( m2 q4 n$ x( ~# V
  4.              )
    6 p( Y7 ^% a7 v( h
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置
    : M! q6 i1 r9 Q- V: o( Q
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉) W, q7 c6 L3 ^
  7.   (setvar "cmdecho" 0)
      `) \) H- s5 r4 S1 ]
  8.   (setq e (entsel "\n选择要对分的板筋: "))7 `% r& e. O5 y/ L/ t
  9.   (setq ent (entget (car e)))6 D0 n, @4 f/ J* r$ V! ~, b; o
  10.   (setq newt (atoi (cdr (assoc 1 ent))))5 f( C- o! }3 c  c0 t
  11.   (if (/= 0 newt)                        ;过滤非数值文字' ^3 P# R/ B! ]  A
  12.     (progn5 b1 q$ I  r, ~. C0 L: y) @' F+ B
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息5 U2 \5 P0 I( w! a- o
  14.       (command "._Clayer" tc)                ;保持图层一致
    ; ]2 a& U$ Q- Y9 o( O
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用
    % m0 T+ |' e! S7 v2 r! n
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度
    2 M' c% o$ s$ v" b) m
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式
      }" k) h' [4 c
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标% K) g" ~5 F( H2 [8 Y
  19.       (setq zbx (car zb))                ;文字x坐标" ?. y' Z0 Q+ G* _
  20.       (setq zby (cadr zb))                ;文字Y坐标
    & Z  i. r. i$ s' p# R
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高
    9 j" [3 U, _0 V6 [$ z, Z
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))
    : H1 n+ y0 k: |
  23.                                         ;计算分开后两个数值的文字起点
    5 q! T8 B8 t" B" c& W6 d$ j- p
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    ( h- s1 m: I  z5 V. ~" p5 C. C  y
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    $ N) a) J- v6 P$ ~
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))! u+ `4 c+ {4 q8 C- _
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点1 ], s" d- R! n6 k( c
  28.       (setq zb2 (list zb2x zb2y))
    0 w4 @% P3 p: o2 x) \# [6 \2 _8 C
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)7 o/ n8 O- Q; [+ ~( X9 S2 M
  30.                                         ;查看该文字样式中文字高度是否为0
    8 F/ c$ j& |. s  s* x- v) p
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度
    / h7 K" x1 h2 \+ b. B
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))
    4 y2 U8 k  h' ~5 r3 W  Q' D
  33.                                         ;输入两个对分的数值' F7 \5 b& f/ y4 f" g* _6 x9 \
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
      e7 _* n+ }. u6 H9 ]' Z- m) |6 X0 e
  35.         )
    % ~. @' N6 [8 i1 `" ~
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度" G) O. A9 N6 W7 z& F+ ?2 g# R
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))7 y' k; z; d* o' f
  38.                                         ;输入两个对分的数值
    8 w- }9 B7 ^9 G3 f: E; l" O
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))/ G! s7 F! A! W/ z
  40.         )2 o6 `; x. y3 B7 ~
  41.       )
    / |, P; @; a1 g  t* B
  42.       (entdel mc)                        ;删除原对象
    3 _' d  D" C( ~' j" H( M; e9 E
  43.     ), Q' r# r0 g% m# L6 e
  44.     (princ "\n所选对象不能处理")( g$ ~  ~  P% u* t
  45.   )+ Z. s" g" n; q9 f# B
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置
    & e# m- J/ |. f7 w5 G
  47.   (setvar "cmdecho" 1). W+ s- ]+ U1 J
  48.   (princ)
    $ X0 ^/ z( P! c, Z0 q
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:
  q$ v: i  @% D, Z$ L$ r(SetVar "OsMode" 0)   ; 加这列 关闭捕捉
$ t7 T3 y3 z" P& r2 s' S& u7 y$ A7 y2 F% c
Ans2:
# J0 ^, h4 b8 ]9 Q% L5 C(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 )

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