QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 2630|回复: 4
收起左侧

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑
: e; z' A" [5 t/ }
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)
      ~' H! o$ F+ b- g7 _- _) p
  2.   (setvar "cmdecho" 0)/ G/ w; c8 r* Y* T4 B4 P7 j0 Y
  3.   (setq e (entsel "\n选择要对分的板筋: "))
    $ d. h# P& A) C
  4.   (setq ent (entget (car e)))* |2 C( T. @( h% t- Q, W# Y
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    6 l; a3 z2 T& k6 s
  6.   (if (/= 0 newt)                              ;过滤非数值文字
    % f+ K+ }1 D' L# U" c; u) s
  7.   (progn
    + K: u$ j& d  Z/ l
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息
    8 Q/ ?' a6 @! W" L& V5 i0 w9 q
  9.        (command "._Clayer" tc)                 ;保持图层一致7 e9 P& d/ A5 [8 s7 c
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用  b: q% T3 |" R4 G; O* |
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度
    ' m4 _6 V( a! ~
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式
    " h9 s8 H# S6 @: z3 f1 T( ~  P: s/ \
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标; n5 U% N3 G: J+ E6 q) Y- l
  14.        (setq zbx (car zb))                     ;文字x坐标# }0 B2 v" R8 Q
  15.        (setq zby (cadr zb))                    ;文字Y坐标
    + Z$ Z/ J% _4 t/ V  A* j
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高: N, _* D+ H7 f4 k$ w
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点  E* P: O; B1 }# Q- A
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))  f+ P( N) `  l: }
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    - r2 ~4 V( T5 |
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang)))), d# @% F& @1 h( \
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点! W0 Y+ w6 `, {- ^0 l# t3 p
  22.        (setq zb2 (list zb2x zb2y))
    ( B( x  X, o0 J6 g0 p8 g/ z
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值/ G) l- d$ a* M0 G! B
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))2 p7 G6 T5 v* s
  25.        (entdel mc)                                                     ;删除原对象8 ?0 l" [/ w) e
  26.    )
    0 X. [  i! A+ |# d
  27.    (princ "\n所选对象不能处理")6 s2 D1 s2 f9 I$ k1 @% L
  28.    )   ' W3 U' @! d7 W1 i. }: y
  29.   (setvar "cmdecho" 1)9 T1 N8 f4 Q+ q& q/ y% X
  30.   (princ)
    + b' r) y( Y0 w' `
  31. )
复制代码

6 y2 O6 A% e' q( c  z: v6 s* z$ n# {( H0 Q1 N2 {% q. M. y# n- 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    zb9 E; I9 Q" s# T
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2
    # S2 o2 t% p* N7 f- K
  3.               oldosmode
    / @! b, E9 ~8 ?$ b4 K$ L- ?
  4.              )5 _7 B2 u* W4 F8 g! K4 o) K- C
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置" B$ q% v$ g5 J
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉
    $ \! Q- H+ {% s( u
  7.   (setvar "cmdecho" 0), f% j8 {6 U! d0 q- L2 z& U
  8.   (setq e (entsel "\n选择要对分的板筋: "))
    7 A  J, `# S: ~! ?& L1 V
  9.   (setq ent (entget (car e))). ?2 M3 C! Q" C
  10.   (setq newt (atoi (cdr (assoc 1 ent))))
    5 d/ \; ]2 j. n& [' }+ w
  11.   (if (/= 0 newt)                        ;过滤非数值文字
    0 s2 z) b" \* C! o+ E
  12.     (progn
    8 w: r  J* U& `8 w2 D
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息) p8 E  R' g; ]% I8 k
  14.       (command "._Clayer" tc)                ;保持图层一致
    9 ?- ]; n; U0 R, E% l
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用
    $ [8 l& j- c* n1 ~  W5 e
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度
    # V9 n& [' V$ O
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式
    : _' L1 W% K5 [& }. \! L
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标2 |$ K- O! [7 g. M- b7 K* l- ]7 K
  19.       (setq zbx (car zb))                ;文字x坐标- d* X+ V# @% @& Z/ ?
  20.       (setq zby (cadr zb))                ;文字Y坐标8 C! h1 @, @$ i; z
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高
    6 A2 d4 z& q6 i9 Q9 }8 _3 M* I
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))
    - ~1 a( z$ s7 `* C
  23.                                         ;计算分开后两个数值的文字起点
    $ r/ J8 G/ q" g
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))8 ]9 C1 X/ B* [% _1 H# Y' m1 O
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    8 ~7 I6 e7 p' p' A5 f/ t2 _
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))7 f( M; c( a  s1 u
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点5 B6 l' K6 `" E* S( G! h, b# k; i# N
  28.       (setq zb2 (list zb2x zb2y))- ^: W& |# i5 @6 Y$ [& r4 Q
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)
    0 _0 k0 \- {+ u' m0 d- ^
  30.                                         ;查看该文字样式中文字高度是否为0
    / F0 Y: }1 H# D9 @
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度- ?  M9 ?3 _" ]* L8 m+ z- C: G
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))  |/ S7 s* k6 v
  33.                                         ;输入两个对分的数值
      E1 Z: P6 \0 A  ^/ ~4 [! Y
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    . d% A1 r8 r2 f  M6 j& _
  35.         )5 W$ y+ S& @2 h, N; c# w
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度
    ' G3 l. t  f. @" u$ Z5 v
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))2 T- `9 h2 ^0 @- |- _9 i; n; D
  38.                                         ;输入两个对分的数值  X4 B+ t, Q/ z1 b: |8 d
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))
    ' ?; l5 a, }& d8 j( K# T. B3 q
  40.         )
    / ^; B2 i) i1 H6 B  N+ {; t5 c; ^
  41.       )
    9 t$ i+ K: ~" _
  42.       (entdel mc)                        ;删除原对象
    7 t* ^4 e; H' D/ w
  43.     )0 ]0 c* Q$ y# M) S7 P
  44.     (princ "\n所选对象不能处理")
    " O1 y& }1 O# M) }! s* M" X! d% q
  45.   )
    + [# E! @  L0 y% D+ R  u. |6 a3 X# h
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置, u; |, Y! o1 b" Z
  47.   (setvar "cmdecho" 1)
    , L1 a' P. X" @+ o! o
  48.   (princ)1 u) n3 \2 v, ]" r6 j; ]: A/ X& h+ |
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:! ~4 v) o9 S7 A1 d4 Y
(SetVar "OsMode" 0)   ; 加这列 关闭捕捉; s0 S: R$ x( E: h6 U, ]

' v2 O5 |' s: FAns2:
( B8 ?, A/ ^4 A# B/ U(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 )

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