QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑 : H1 ~3 j& Z% Q7 ^" Z
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)2 g* z1 G) l3 }9 `: x9 M8 z, p+ X
  2.   (setvar "cmdecho" 0)
      w4 e! O# d* Y
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    ! x- a  ]. N2 W$ W- p
  4.   (setq ent (entget (car e)))
    * I$ r/ s5 i" X) x: O1 A" a- @
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    , `: Y+ F7 u9 x. i
  6.   (if (/= 0 newt)                              ;过滤非数值文字
      A( }# N: h& y- C
  7.   (progn% h3 A8 G" y$ d  e% x) g
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息/ B% L$ X; _; E) ^
  9.        (command "._Clayer" tc)                 ;保持图层一致
    8 W1 }. e! L6 f- [& n) J
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用9 y, B: o2 c9 m1 j7 i1 ]! ^
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度( B. X) s2 F" T) V( D5 f6 g
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式) Y: O" [5 t% R( R
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标3 }. K2 S, F% I/ @% E( U$ O- ^" v
  14.        (setq zbx (car zb))                     ;文字x坐标
    3 g; M' r& K6 t2 |, h& [% a
  15.        (setq zby (cadr zb))                    ;文字Y坐标- m  h& _* i+ X- ]8 F
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高
    2 K6 E* }" v$ L# V! t
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点
    ( `/ B8 d: z5 z. O2 w( [* C
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    2 E, i  Q6 c2 z- ]# K% M
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    % r4 e6 Z* R: j, \3 p* N0 P8 H
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))
    + A1 y8 F! N; D( ]5 J# Y
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点
    $ R; c, I2 s7 K1 ~" R7 J5 y
  22.        (setq zb2 (list zb2x zb2y))
    1 q1 K2 m# `: C& Y
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值7 A( K' L6 T1 D; d. V7 `
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    % B4 [8 j% v+ z6 f! T# u9 {
  25.        (entdel mc)                                                     ;删除原对象* e. H, P. \- [( s; J6 z
  26.    )
    % }& w! a& [0 B) S+ a5 ]
  27.    (princ "\n所选对象不能处理")
    : \# J) h8 r8 U' T6 e5 O& f9 ~
  28.    )   ( [: J6 a6 {# U, T  R2 j8 |2 ]
  29.   (setvar "cmdecho" 1)6 |$ m! A3 j5 x% V. f
  30.   (princ): o$ y  w, Z0 b, K7 h
  31. )
复制代码

7 f7 X4 }: q5 z
  r9 {; M+ |6 x第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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
    ( _9 a8 H' b& y# ?( _  h# b$ X
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2! w# Y( S9 u# z' X8 {
  3.               oldosmode! ]2 ?: O' T/ h' r# a
  4.              )0 M+ n" ]2 C) ?  _# f1 w
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置  k6 m6 l$ |5 S! W
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉
    / t; k! G. ~3 ]5 Y7 L
  7.   (setvar "cmdecho" 0)
    + u8 O& |: Q8 e* q; |- l
  8.   (setq e (entsel "\n选择要对分的板筋: "))7 Q  B* Y# A/ s2 x- D4 t. e
  9.   (setq ent (entget (car e)))5 {7 Y0 k7 J0 T% [; j
  10.   (setq newt (atoi (cdr (assoc 1 ent))))& {( s# T5 k' i2 |' @  N
  11.   (if (/= 0 newt)                        ;过滤非数值文字* R0 s; I( j4 i9 \
  12.     (progn
    + S. `& N7 {/ a1 Y; E
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息
    - r1 j+ y" G" s9 g& A
  14.       (command "._Clayer" tc)                ;保持图层一致8 J* d# g. X4 T+ D, d8 u9 N
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用3 t/ J% P$ O1 t3 }# l6 W( F+ P
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度
    ) x% j) w$ r# _+ c* [0 N
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式( S" E( c/ i4 D, z1 [/ G1 S
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标/ G1 k4 K! H# T8 Q. R
  19.       (setq zbx (car zb))                ;文字x坐标
    ! @7 V, U% W9 k! t
  20.       (setq zby (cadr zb))                ;文字Y坐标
    / J& `# V  b/ b- o8 S
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高# F8 N5 ]( U5 s7 g
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))
    + W' D; b9 e5 T
  23.                                         ;计算分开后两个数值的文字起点2 f& [7 I. K- k) S/ Q
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))$ O: J) c- ?- I5 d! B
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    + ]+ b! U& g! ^" K4 b
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang)))): [$ f2 L0 W: w" `5 n+ j
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点# J1 o( {& P/ Y$ v3 l, ^# i0 C7 H- {$ l
  28.       (setq zb2 (list zb2x zb2y))
    1 V. r  h+ Y2 p8 l& q& ~: Z) s: T" ~
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)2 d9 s9 q' _; B9 |5 _
  30.                                         ;查看该文字样式中文字高度是否为0) W# W6 q7 ~3 y
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度, F9 y2 a/ c8 y+ L: P, Y! X! \
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))
    0 L9 K5 Y- S: B( M# W" C
  33.                                         ;输入两个对分的数值
    ! n' t* a, S2 l9 _& Y- q& V
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))* S* y% t" S+ h' j0 r
  35.         )' }; v8 D) o! U# F3 Q5 X# {
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度
    0 |) |+ V$ V( l
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))- K* O  u" e7 M
  38.                                         ;输入两个对分的数值& q/ B: f# V' H: v; F* c& T
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))
    6 ]; W# k7 d5 ~( V
  40.         )- w$ I4 }9 }3 M4 w
  41.       )& V2 \/ U% t/ \; I3 j- [
  42.       (entdel mc)                        ;删除原对象/ `) d$ _+ b) t1 E. R
  43.     )
    ' @6 k/ U+ y6 z+ U; Z$ p& D
  44.     (princ "\n所选对象不能处理")4 V! Z  y6 I$ x+ i' C1 [( A
  45.   ). j# R& @' m7 D  g% H5 j
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置
      I: U# k! J: f7 \
  47.   (setvar "cmdecho" 1)) d" N: \: b2 e& e( }
  48.   (princ)& s+ V9 E) m- O+ y" n! G
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:
& a' Z0 A4 K. F$ l7 b$ O6 N( V% q(SetVar "OsMode" 0)   ; 加这列 关闭捕捉
+ ?$ D9 s8 N; }3 `3 p$ s, x1 ^
! k$ u2 V1 ]; `  ]Ans2:9 d" M9 [8 H! ]* P- k* X: `: E
(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 )

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