QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 woaishuijia 于 2011-11-29 12:09 编辑
- z: k5 |' M+ x
  1. (defun c:bdf(/ e ent tc newt mc ang st zb zbx zby zg zb1x zb1y zb2x zb2y zb1 zb2)7 I3 I$ C% f, _& ]. l
  2.   (setvar "cmdecho" 0)
    ( t; Z! G7 M# I. E( n1 f; u
  3.   (setq e (entsel "\n选择要对分的板筋: "))2 n% D/ _+ k* i( P. g
  4.   (setq ent (entget (car e))). ]0 \, U1 [- h
  5.   (setq newt (atoi (cdr (assoc 1 ent))))
    / K! V& \3 i. X
  6.   (if (/= 0 newt)                              ;过滤非数值文字
    ' F& e2 f' W! ]) ]$ x" Y
  7.   (progn  |/ n5 B$ V7 G' l/ ]! F! Q
  8.        (setq tc (cdr (assoc 8 ent)))           ;提取图层信息3 T$ b! n. {% `
  9.        (command "._Clayer" tc)                 ;保持图层一致. _6 |" Y$ I7 S  ?; ?! p
  10.        (setq mc (cdr (assoc -1 ent)))          ;提取名称,删除原对象使用
    , |4 x- _; n; [# u4 n
  11.        (setq ang (cdr (assoc 50 ent)))         ;提取文字角度/ Y) X" D1 c2 ?( T7 N) `1 q: W
  12.        (setq st (cdr (assoc 7 ent)))           ;提取文字样式8 W4 U7 G# }- I
  13.        (setq zb (cdr (assoc 10 ent)))          ;提取文字起点坐标
    ! ~/ N, i& @2 a- L3 u, D
  14.        (setq zbx (car zb))                     ;文字x坐标, ~# J. r) q7 q; @' K7 b7 h
  15.        (setq zby (cadr zb))                    ;文字Y坐标0 k& ^# ^  \! @' F2 L  K
  16.        (setq zg (cdr (assoc 40 ent)))          ;提取字高
    ) i1 v, \  f( v. P( n. i3 y$ `
  17.        (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  ;计算分开后两个数值的文字起点
    ! d2 S" [, ^, v7 s3 ?
  18.        (setq zb1y (+ zby (* 0.25 newt (sin ang))))' t, r) W! @1 H* ?; u
  19.        (setq zb2x (- zbx (* 0.25 newt (cos ang))))
    # n. @+ ?. |8 x- H* E- {: Q
  20.        (setq zb2y (- zby (* 0.25 newt (sin ang))))- |* g7 e- v4 A
  21.        (setq zb1 (list zb1x zb1y))                      ;确定坐标点3 q1 p+ j. e* a6 g) ]" _+ m3 @( X) c
  22.        (setq zb2 (list zb2x zb2y))
    ! c: F; W7 F. q8 a7 q% m+ d  u+ m
  23.        (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))   ;输入两个对分的数值
    # Z& M0 J/ P# C/ n
  24.        (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))$ Z; `" W7 a8 L" r9 N; `
  25.        (entdel mc)                                                     ;删除原对象( D! A; i4 b+ j+ N
  26.    )4 ]! {' ^" d' j4 u: F0 ]8 G$ A
  27.    (princ "\n所选对象不能处理")
    : B1 y3 l; ?- N- s
  28.    )   8 P* y6 T$ c3 }! w( O2 }/ p
  29.   (setvar "cmdecho" 1)
    - [' v; D* X) N# H2 [* A
  30.   (princ)
    8 m. v7 i5 B! n2 I0 e
  31. )
复制代码

) B8 k6 P! A2 h, }; A( N. }: P  f8 p: h' ^% N
第一次照着书写的,程序大部分时间是正常的,但有时候会出现新对象的坐标点不正确,在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
    6 |! s; D  ~, c9 a' ^" \/ Q1 g/ A
  2.               zbx   zby          zg        zb1x  zb1y  zb2x  zb2y        zb1   zb2
    9 e$ G  R! f3 B  G0 u8 ~
  3.               oldosmode
    - A4 y' J3 r, {; ]+ t1 |/ F
  4.              )% ]0 E' |7 p+ c* |+ H1 t% C" `
  5.   (setq oldosmode (getvar "osmode"))        ;记录用户当前的对象捕捉设置
    & t( ?1 B& Z% D  i0 j+ q
  6.   (setvar "osmode" 0)                        ;关闭对象捕捉
    % z! C+ y! [7 G- l+ p6 d) K
  7.   (setvar "cmdecho" 0)8 E0 |5 h( S% P' @  S! Z4 T
  8.   (setq e (entsel "\n选择要对分的板筋: "))
    $ o" e& L. m. K
  9.   (setq ent (entget (car e)))! L5 y& X# F$ c( h1 I% R
  10.   (setq newt (atoi (cdr (assoc 1 ent))))
    2 Y7 Q9 k# L5 n
  11.   (if (/= 0 newt)                        ;过滤非数值文字9 i6 `4 r8 S4 i& w) O8 J0 K$ d
  12.     (progn3 [/ C# y9 c$ b! s- L
  13.       (setq tc (cdr (assoc 8 ent)))        ;提取图层信息
    - G* S* b8 o" n' k8 w
  14.       (command "._Clayer" tc)                ;保持图层一致
    , q: H9 b1 E+ M- C  n0 p, S8 u
  15.       (setq mc (cdr (assoc -1 ent)))        ;提取名称,删除原对象使用  q. p( M+ H9 C5 n: y
  16.       (setq ang (cdr (assoc 50 ent)))        ;提取文字角度9 {3 j4 Z; H; V% q- ?; v
  17.       (setq st (cdr (assoc 7 ent)))        ;提取文字样式3 s7 J- ~$ Z1 t  D
  18.       (setq zb (cdr (assoc 10 ent)))        ;提取文字起点坐标
    * g+ c2 R* N9 D7 U9 t. }
  19.       (setq zbx (car zb))                ;文字x坐标
    0 W9 n+ ~1 g  f1 O2 p
  20.       (setq zby (cadr zb))                ;文字Y坐标
    7 m4 M; }+ @+ q5 p! q7 t
  21.       (setq zg (cdr (assoc 40 ent)))        ;提取字高# G& @6 U% N) L$ f* i& X! d
  22.       (setq zb1x (+ zbx (* 0.25 newt (cos ang))))  f$ g. K3 `; d* c2 g$ \# F
  23.                                         ;计算分开后两个数值的文字起点& b" I0 |% e: u. N! j1 H7 k: K
  24.       (setq zb1y (+ zby (* 0.25 newt (sin ang))))
    3 B+ C8 l' R" ]0 C. O: `
  25.       (setq zb2x (- zbx (* 0.25 newt (cos ang))))' v- P7 h; H' R* ?5 g
  26.       (setq zb2y (- zby (* 0.25 newt (sin ang))))
    2 W7 u* U6 S' e( k3 t& g: F6 M" ~) v
  27.       (setq zb1 (list zb1x zb1y))        ;确定坐标点
    6 P/ {* h% t. t& s
  28.       (setq zb2 (list zb2x zb2y))5 |. G* \/ j2 w/ a8 z0 T$ @
  29.       (if (= (cdr (assoc 40 (entget (tblobjname "style" st)))) 0)
    $ G# @" [' t7 r) \2 I8 _
  30.                                         ;查看该文字样式中文字高度是否为06 I. N* i5 P- _/ Y
  31.         (progn                                ;文字样式中文字高度为0时使用原对象的文字高度
    ) z6 S+ X' T4 g! Y' C
  32.           (command "text" "s" st zb1 zg (* 180 (/ ang pi)) (/ newt 2))
    4 c" C1 y% M8 D
  33.                                         ;输入两个对分的数值5 F0 _/ X5 Z' A3 {# J
  34.           (command "text" "s" st zb2 zg (* 180 (/ ang pi)) (/ newt 2))
    3 A( N9 D, Z$ H' H
  35.         )
    2 f/ O2 @4 a; L& s! {3 s. T
  36.         (progn                                ;文字样式中文字高度不为0时不在命令行中指定文字高度  y5 [9 P0 Q& g+ ?" u
  37.           (command "text" "s" st zb1 (* 180 (/ ang pi)) (/ newt 2))
    " V! H) k' }: k9 H8 I% v
  38.                                         ;输入两个对分的数值/ H# L; p( F' D: ]7 L* _
  39.           (command "text" "s" st zb2 (* 180 (/ ang pi)) (/ newt 2))
      Q2 }9 P$ ]& W* q
  40.         )
    ' B5 T9 J+ b8 b. i# X( f
  41.       ); Q; h4 i" A7 o. U2 t9 c+ F
  42.       (entdel mc)                        ;删除原对象' W* u8 {1 Z: R  S" F
  43.     )
    % x" n/ k: `: Z
  44.     (princ "\n所选对象不能处理"), Z- s4 Y0 l9 G$ t- ?+ j6 H
  45.   )6 |4 `: V6 w9 M7 i
  46.   (setvar "osmode" oldosmode)                ;恢复用户对象捕捉设置8 d; e! l. d  M
  47.   (setvar "cmdecho" 1)
    , O, m+ C( |9 _% ]4 z5 t. E
  48.   (princ)
      Y" g/ |# p2 W- z/ P
  49. )
复制代码
发表于 2011-11-29 13:37:48 | 显示全部楼层 来自: 中国台湾
Ans1:
, \0 B/ Q: m( e. X" R6 B1 m; E$ v(SetVar "OsMode" 0)   ; 加这列 关闭捕捉2 ]2 ]: A" W% G6 z* x
$ I9 F8 Q9 E3 y
Ans2:
9 Z, [, D  ^/ B: Z(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 )

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