QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑
" M) g/ G$ S- \2 A; G
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)
    4 C6 I5 L4 G0 [
  2.   (setvar "cmdecho" 0)
    2 Y$ n. _$ D- N8 g
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    ) b5 k9 _, b  F7 ?# q" y
  4.   (setq ent (entget (car e)))
    ' g9 E+ C2 b, Z  w& f% ^" y
  5.   (setq newt (atoi (cdr (assoc 1 ent)))), h) x5 E1 n- {* ]2 s
  6.   (if (/= 0 newt)                              ;过滤非数值文字
    , s) u" i) I( |% o2 C6 p
  7.   (progn
    / \5 X. F" ~5 p0 m
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息
    ) Y3 o" R7 r! Y# S- ^, c* C9 L
  9.        (command "._Clayer" tc)                 ;保持图层一致
    ( z; r+ K0 D. m2 H$ _
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用6 r1 N) k3 ~0 J# j: U
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度
    - ~; i6 d4 F- }* [, M7 D* @
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式, n3 [/ g. ]9 y; s- d
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标( P- A3 s, ?% e5 h
  14.        (setq zbx (car zb))                     ;文字x坐标4 X' f! y0 U2 F" u$ W& x2 _5 G
  15.        (setq zby (cadr zb))                    ;文字Y坐标
    * @6 N( g  W7 _6 r
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高0 j2 \' a5 s; J5 {- ~! M! `1 w
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点; Q$ d- |, f- c; |; d
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))3 G* m* b4 w5 v. x
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    # C6 F: G8 f$ ~3 m: o3 Z
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))
    & ]/ c/ ?" x) a9 d8 G
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点
    & X1 L& c- C4 F2 n. t7 t
  22.        (setq zb2 (list zb2x zb2y)): U( Y1 D2 u. n7 V1 `( C# Y9 w$ A$ B& o0 `
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值
    ' R* @5 t) O. c% J8 t/ p9 v
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    5 T& D, l1 S4 b1 I! L+ `
  25.        (entdel mc)                                                     ;删除原对象- A8 \# U, S3 \9 S
  26.    )/ F0 z& j' R+ p# h
  27.    (princ "\n所选对象不能处理")
    6 V* S4 w! J$ M& X- A
  28.    )   : C" `* a4 e, k: }6 j, t7 z
  29.   (setvar "cmdecho" 1)
    $ y) c5 }1 t) {, L
  30.   (princ); z0 A. u' |  h8 Y; X
  31. )
复制代码
% y6 [# ?- v/ f& H& e2 W3 g! B
- z  V  K# `" m+ ^
第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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
    0 E3 f& Z& l% W% ]& P
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb29 R/ f1 L: u: d! P
  3.               oldosmode$ I  ~3 ~) n; J: V/ L
  4.              )
    + {0 U+ {" s4 {/ ~/ D
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置
    6 j& J' ]; u4 g* j
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉
    4 `" l+ O( y' A2 A) v
  7.   (setvar "cmdecho" 0)
    # h; |+ d) l: d. T, s* H4 e
  8.   (setq e (entsel "\n选择要对分的板筋: "))' N' c7 ?! c4 t" H, e
  9.   (setq ent (entget (car e))). H* E/ ?. \1 j( H) N- R2 w
  10.   (setq newt (atoi (cdr (assoc 1 ent)))): e$ W+ s4 p% p* \: e2 b& y
  11.   (if (/= 0 newt)                        ;过滤非数值文字
    ( a0 E- o1 o+ p8 e0 j* J
  12.     (progn
    % J# X  n& q! U! }8 w8 t. `8 w) Q9 w8 h
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息# [+ m0 i, H' f( U8 t' I( O
  14.       (command "._Clayer" tc)                ;保持图层一致) y! S4 I& w5 ?; e
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用
    6 L! o4 }3 [1 A  ?
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度& _$ V4 r' X% |6 j3 X8 M
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式$ C$ b5 O6 K8 M0 o- n* h! w
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标
    5 u5 ]. N( z3 }3 k' R. v; a# s, _
  19.       (setq zbx (car zb))                ;文字x坐标
    * h7 z1 s9 B: z* T
  20.       (setq zby (cadr zb))                ;文字Y坐标, Z4 F0 G$ p1 y+ a' f
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高* O# U1 ~9 y# ?
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))7 R$ `9 C6 R6 t6 P/ Q. i
  23.                                         ;计算分开后两个数值的文字起点5 N% {  j0 M; r$ v. P
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    3 a8 G6 b3 d  q2 }! m# r& ]7 V2 e
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    ' D! T9 R: a' T' q4 U. {# `
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))
    7 |# [; P+ Y/ {
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点  G+ [6 j4 x" W0 a* I" G+ K
  28.       (setq zb2 (list zb2x zb2y))9 r. T: n) F5 P; Q2 j* A4 g
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)
    ; K, Q- c9 f2 S* l0 ~& t9 `; f0 i( I
  30.                                         ;查看该文字样式中文字高度是否为0
    * G7 G9 q4 f( @
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度. K* Z+ K& y  O$ H: i
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))/ P+ H$ b& ~5 B( f1 f! k
  33.                                         ;输入两个对分的数值! r( m* a0 n! Q
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))5 F. p$ B7 L( S7 F0 O
  35.         )% ^1 q; @/ Z% M, O3 j
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度
    % m4 f0 M' L1 l& j
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))0 v2 M: E% Y4 D
  38.                                         ;输入两个对分的数值$ \6 c1 j: d, H
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))) L' k8 l4 P. h2 z  f7 u, Z2 q
  40.         )4 _: B8 @& E7 E4 C' {+ U
  41.       )1 Y8 _1 s8 ]0 I# m. i) F( P% Q9 t% }. L
  42.       (entdel mc)                        ;删除原对象
    ) G- J# Y/ `3 u' p* [
  43.     )8 N" J6 W* z& ^5 }# {2 }8 i4 [
  44.     (princ "\n所选对象不能处理")4 ^1 V0 x4 i, R/ j) Y2 d& F: P
  45.   )3 s8 Y% m6 T7 G& y- X& F
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置
    0 k6 A0 S: c+ K9 w: p
  47.   (setvar "cmdecho" 1)
    9 A& z, r0 U( }; y. z
  48.   (princ)
    & p3 I& J& I! T( h$ L
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:
6 H5 s  \# x0 G4 y(SetVar "OsMode" 0)   ; 加这列 关闭捕捉3 j6 o! O* }0 n( D, S4 b5 Y
- x& X3 ~* P+ l, @
Ans2:
. K# }! t/ j: c6 ~(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 )

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