QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑
5 r( I* O; N( ^& O1 u
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)
    ( j' r$ [$ W( d! S5 q
  2.   (setvar "cmdecho" 0)
    * `$ m% [: B* ]/ b  R( T
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    4 [' D( G$ I9 X9 V, h8 D1 a8 V
  4.   (setq ent (entget (car e))); x3 l% J& P0 }# H
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    ( _  F9 W# \, B$ W: l+ U1 u1 C
  6.   (if (/= 0 newt)                              ;过滤非数值文字* e5 }3 p) x8 `* g' v7 e! p, Z
  7.   (progn4 W2 D; ?* N& T5 u
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息9 w5 A2 L3 y4 W+ \  x
  9.        (command "._Clayer" tc)                 ;保持图层一致
    / {/ t3 S7 z4 ^! {+ K# g
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用
    $ c9 f4 v) G! l0 e
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度& a/ v- b! t. ^# d6 N7 c, K' ]' p
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式# ?  m/ h% B- Y$ z/ `0 N8 g. G1 R; \
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标
    3 C* J4 K+ L. Z4 A" x. `0 Q, H0 ]
  14.        (setq zbx (car zb))                     ;文字x坐标- d5 |% L5 g0 d( c: D4 m$ w/ T0 s
  15.        (setq zby (cadr zb))                    ;文字Y坐标
    % H. X2 Z& F" N4 h# d- _
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高
    8 a* c6 Z% j* T# ?* f$ z
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点
    4 X& @4 |$ Y) w( u
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))) q) e- _. t1 K& p6 @
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    4 F5 z5 |+ O5 f- g. T
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))
      x8 ]2 O0 X4 E3 t3 Q; Y
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点
    0 g2 v3 S9 x, u- j! I3 Q% y
  22.        (setq zb2 (list zb2x zb2y))1 [, ~0 p7 ^. [
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值4 I$ l' B9 j; N4 n  r
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    3 c2 J$ {& r* w4 S4 y. D# s3 ~- i: J
  25.        (entdel mc)                                                     ;删除原对象
    ; L+ D# J' ^0 V# L
  26.    )
    3 e. w' s& q) I, {. p9 q
  27.    (princ "\n所选对象不能处理")$ q& f- D; }, i6 s
  28.    )   
    # C2 _2 k( O, K) o3 j( d
  29.   (setvar "cmdecho" 1)5 n4 ^. d# R) n9 q
  30.   (princ)
    ' A, o0 s% _/ q8 e
  31. )
复制代码

  C( F+ E& [  F* @5 t+ `4 K3 @# r  V
: L/ ~/ |9 L' A( Q8 I1 ?" j第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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  I, L8 R+ D% ^" R, V) O5 V; V8 V
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2
    # `7 Y; v- m+ t& D" g6 e4 R: S8 k
  3.               oldosmode
    ( r5 D- O$ \" g. E; n* o
  4.              )
    0 h" k7 Z1 R2 K( l- |( i/ @
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置
    7 Z* [4 ~2 u; c3 b6 h0 N  K
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉
    & e! V) P" _" G5 L$ N4 t& k, w* v
  7.   (setvar "cmdecho" 0)
    0 U! e3 w0 E% M  V, l
  8.   (setq e (entsel "\n选择要对分的板筋: "))
    ! J: s' V( T0 p# ?  c$ Q
  9.   (setq ent (entget (car e)))
    6 i5 ]. }" d3 r2 D/ Y4 |/ R9 c
  10.   (setq newt (atoi (cdr (assoc 1 ent))))
      [6 O$ j* p0 o2 ^
  11.   (if (/= 0 newt)                        ;过滤非数值文字
    2 h$ K1 C% Y! q, J9 Z( P
  12.     (progn
    ( v5 x5 b- e7 G6 w# ^
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息
    ) {% g  S, ^! _$ o6 k
  14.       (command "._Clayer" tc)                ;保持图层一致! F) D! U7 A! e1 q% B
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用
    ( P3 {1 x3 X8 [5 U
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度
    ' J  Y$ {- x) J+ T1 q3 ]& |
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式" R, n, g- Q4 f; ~7 R. Z
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标
    0 W- u5 F$ F% N- a0 |% u
  19.       (setq zbx (car zb))                ;文字x坐标' K7 e8 O* e0 y' G, U+ U6 @
  20.       (setq zby (cadr zb))                ;文字Y坐标
    # X. f$ t2 i; |
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高0 a+ H3 {5 q& O1 j/ K$ l& H
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))
    1 w8 o0 t. Y, ~+ p
  23.                                         ;计算分开后两个数值的文字起点
    7 V$ v  _4 L+ T4 C7 F5 j2 R& t2 X+ @
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    / ^9 _: Z3 T. T, M( }
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    / j5 X- ?& r% C, K/ o& `
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))
    2 W( J1 O* q  F5 J* S
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点6 }8 d( F3 |" `$ T* r9 k) H
  28.       (setq zb2 (list zb2x zb2y))
    8 B6 i( U& n7 W* E. m
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0): m( r* L3 g! L% W, q$ R
  30.                                         ;查看该文字样式中文字高度是否为03 O" _' x. ]5 _. D: B- q0 t4 ~
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度
    9 s) L) L# q$ v. W- H1 z, m9 I
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))
    / P1 _" w7 |2 v, o; e$ {5 j
  33.                                         ;输入两个对分的数值  y: n6 S$ T$ \" r) j9 b
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    % c+ D8 M$ ?3 r& }9 g- j+ n' |7 X
  35.         )
    ) o& m( C( n4 {$ [; ?/ p7 w& o
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度! l4 N8 m2 O6 E
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))$ f# k0 {7 ?  H6 l) N! w
  38.                                         ;输入两个对分的数值
    2 U6 h9 X2 q" y
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))* q* E+ E) A. p5 r/ k1 {
  40.         )
    " A3 B8 }( V/ S' X) C' |; P
  41.       )
    + L' @% @5 F' S( p
  42.       (entdel mc)                        ;删除原对象$ a: y1 ^% A* i! Z
  43.     )
    3 E. ?( d  t: G) |) }  L
  44.     (princ "\n所选对象不能处理")# y2 y/ A' {+ W4 J" l9 q, ^
  45.   )
    6 v9 l4 ^' z; C% b2 n- @1 b* }# O
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置7 C# X; Y; q( w; q3 o+ n: u
  47.   (setvar "cmdecho" 1)
    4 S2 y: l; g6 ?
  48.   (princ)% O6 |0 u; l' c; |6 N! K# S
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:( ^3 J! k. O5 w$ r: Z) x
(SetVar "OsMode" 0)   ; 加这列 关闭捕捉
  R; P( V5 k2 l$ \! z6 I8 x; s. K
Ans2:; W( |& i# p. L) b; r+ P6 b
(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 )

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