明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1752|回复: 9

[提问] 求助:关于另类的循环(标公差与标注的循环)

[复制链接]
发表于 2013-7-10 22:07:26 | 显示全部楼层 |阅读模式
这是我用的标注程序,我稍微改了一下标公差的程序,本想让标完公差后自动循标尺寸,结果不会搞了。望大师帮整合一下,可以实现以下功能:

1:第一类是标尺寸的程序,可能是标线性标注或对齐标注或其它lsp标注程序,是非固定的某一程序
2:第二类是标公差的程序,有不同参数,但有公用程序

问:能否在运行完公用程序后自动循环第一类的程序(标尺寸的程序)?

例1:现在是运行标尺寸A程序,之后,自动运行标公差,公差标完后,再自动运行标尺寸A程序...............

例2:现在是运行标尺寸B程序,之后,自动运行标公差,公差标完后,再自动运行标尺寸B程序...............

......................

不知道这样是否表达清楚了

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;标注类

(defun c:w1();线性
(defun bz()
(command"dimlinear"pause))
(bzz))

(defun c:w2();对齐
(defun bz()
(command"dimaligned"pause))
(bzz))

(defun c:w3();半径
(defun bz()
(command"dimradius"pause))
(bzz))

(defun c:w4();直径
(defun bz()
(command"dimdiameter"pause))
(bzz))

(defun c:w5();角度
(defun bz()
(command"dimangular"pause))
(bzz))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun bzz();标注
(setvar"autosnap"63)
(setvar"osmode"6079)
(setq la (getvar"clayer"))
(command "layer" "m" "7标注" "c" "3" "" "lw" "0.13" "" "l" "Continuous" "" "" "clayer" la)
(bz)
(while (> (getvar "CMDACTIVE") 0)(command pause))
(ssgc))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun ssgc()
(setq ss (ssadd))
(setq ss (ssadd (entlast) ss))
(command "Select" ss "")
(setq ss (ssget "p" '((8 . "7标注")(0 . "DIMENSION"))))
(sssetfirst nil ss))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;公差类

(defun +-()
(setvar "cmdecho" 0)
(if (= n nil) (setq n 0))
(if (= m nil) (setq m 0))
(setq k 0)
(while (<= k 5)
(setq a (fix (* (EXPT 10 (- 5 K)) n)))
(setq b (* 10 (fix (* (expt 10 (- 4 k)) n))))
(setq k1 (- 5 k))
(IF (= a b) (SETQ K (+ K 1)) (setq K 6)))
(setq k 0)
(while (<= k 5)
(setq a (fix (* (EXPT 10 (- 5 K)) M)))
(setq b (* 10 (fix (* (expt 10 (- 4 K )) M))))
(SETQ K2 (- 5 k))
(IF (= a b) (SETQ K (+ K 1)) (setq K 6)))
(setQ d2 (max K1 K2))
(if (= n m) (setq c 1) (setq c 0.6))
(if (and (= n 0)(= m 0)) (COMMAND "_DIMOVERRIDE" "dimtol" "off" "")
(COMMAND "_DIMOVERRIDE" "DIMTP" N "DIMTM" M "DIMTOL" "ON" "DIMTFAC" c "DIMTDEC" D2 ""))
(PRINC ))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:+-()
(prompt "\n+")(setq n (getreal""))
(prompt "\n-")(setq m (getreal""))
(+-))

(defun c:00()
(setq n 0)
(setq m 0)
(+-))

(defun c:+15()
(setq n 0.015)
(setq m 0)
(+-))
(defun c:-15()
(setq n 0)
(setq m 0.015)
(+-))

(defun c:+2()
(setq n 0.02)
(setq m 0)
(+-))
(defun c:-2()
(setq n 0)
(setq m 0.02)
(+-))

(defun c:+4()
(setq n 0.04)
(setq m 0)
(+-))
(defun c:-4()
(setq n 0)
(setq m 0.04)
(+-))

(defun c:+10()
(setq n 0.1)
(setq m 0)
(+-))
(defun c:-10()
(setq n 0)
(setq m 0.1)
(+-))
(defun c:++1()
(setq n 0.1)
(setq m 0.1)
(+-))

(defun c:+20()
(setq n 0.2)
(setq m 0)
(+-))
(defun c:-20()
(setq n 0)
(setq m 0.2)
(+-))
(defun c:++20()
(setq n 0.2)
(setq m 0.2)
(+-))

(defun c:+50()
(setq n 0.5)
(setq m 0)
(+-))
(defun c:-50()
(setq n 0)
(setq m 0.5)
(+-))
(defun c:++5()
(setq n 0.5)
(setq m 0.5)
(+-))

(defun c:+11()
(setq n 1)
(setq m 0)
(+-))
(defun c:-11()
(setq n 0)
(setq m 1)
(+-))
(defun c:++11()
(setq n 1)
(setq m 1)
(+-))
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 收集|主题: 58, 订阅: 4
 楼主| 发表于 2013-7-11 20:34:32 | 显示全部楼层
真可怜,连个回复都没有
发表于 2013-7-11 23:43:49 | 显示全部楼层
本帖最后由 ZZXXQQ 于 2013-7-13 12:50 编辑
  1. (defun c:tt ()
  2. (setq bz T bgc T)
  3. (while (or bz bgc)
  4. (while (progn (initget "w1 w2 w3 w4 w5 ")
  5.                (setq bz (getkword "\n输入标尺寸项: ")))
  6.   (eval (read (strcat "(c:" bz ")")))
  7. )
  8. (while (progn (initget "+- +15 00 -15 +2 -2 +4 -4 +10 -10 ++1 +20 -20 ++20 +50 -50 ++5 +11 -11 ++11 ")
  9.                (setq bgc (getkword "\n输入公差: ")))
  10.   (eval (read (strcat "(c:" bgc ")")))
  11. )
  12. )
  13. (princ)
  14. )
 楼主| 发表于 2013-7-12 09:15:41 | 显示全部楼层
ZZXXQQ 发表于 2013-7-11 23:43

首先非常感谢Z版的关注。就使用情况反馈以下:

如果加入您的程序后顺利的运行:

1:总程序开始,要先按 tt (只要没退出总程序,只按一次 tt),再按尺寸项,这可以算是一步,
     如果程序 完全退出,则要两步,

2:按公差项

3:按尺寸项

这 1、2、3 步必不可少(或加一步 tt)



未加如之前:

1:按尺寸项

2:按公差项

3:按尺寸项

也是 3 步,所以.......................


其次,我会在 cui 里设 shift+z,shift+x,shift+c,shift+r,shift+v  分别与 w1、w2、w3、w4、w5 对应,
省去按空格键,更快捷。

想:(defun +-() 是最后运行的,是否能在这里想办法,让它自动识别或记住第 1 步里运行的命令(cad命令行里有记录,但有时会多一个“自动保存到 ......”)

不知是否异想天开...........


Z版,加您的程序后,会卡在标公差里:

命令: tt
输入标尺寸项: 1w
输入标尺寸项: +2
无效的选项关键字。
输入标尺寸项: +4
无效的选项关键字。
输入标尺寸项: *取消*
; 错误: 函数被取消
命令: *取消*

发表于 2013-7-12 19:58:20 | 显示全部楼层
程序改了,没死循环了。
 楼主| 发表于 2013-7-13 11:34:19 | 显示全部楼层
本帖最后由 669423907 于 2013-7-13 11:37 编辑
ZZXXQQ 发表于 2013-7-12 19:58
程序改了,没死循环了。

Z版,程序还是卡在那了。

我改了一下,可以自动循环任何标注命令了,但有了新的问题:

1:在 “(defun +-()
   (ssgc)
    ........   ”
    中,(ssgc) 无效了,必须重新选,且须右键确定

2:命令行一大堆未知命令提示(这个也无大碍)

不知 Z版是否方便帮解决一下第 1 项的问题呢?实在是太感谢您了!


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;标注类

;φ,M,R 智能标注(ZZXXQQ)2011.5.28
(defun c:cmr()
(setq la (getvar"clayer"))
(command "layer" "m" "7标注" "c" "3" "" "lw" "0.13" "" "l" "Continuous" "" "")
(while (and (setq s1 (entsel "\n选择圆或圆弧 :"))
(setq ent (entget (car s1)))
(wcmatch (setq tn (cdr(assoc 0 ent))) "ARC,CIRCLE"))
(setq pt1 (cadr s1))
(setq qztxt (if (setq qz (getint "\n个数 :")) (strcat (itoa qz) "-") ""))
(if (= tn "ARC") (progn
(setq r (cdr(assoc 40 ent)))
(command ".LENGTHEN" (car s1) "")
(if (>= (/ (getvar "PERIMETER") r) (* 1.49 pi)) (progn
(setq qztxt (strcat qztxt "M" (rtos (+ r r) 2)))
(command "DIMDIAMETER" pt1 "T" qztxt PAUSE))
(command "DIMRADIUS" pt1 "T" (strcat qztxt "<>") PAUSE)))
(command "DIMDIAMETER" pt1 "T" (strcat qztxt "<>") PAUSE)))
(setvar "clayer"la)
(defun bzzz()
(c:cmr)))


(defun c:bxx();线性
(defun bzzz()
(command"dimlinear")(bzz))
(defun bz()
(command"dimlinear"))
(bzz))


(defun c:bdq();对齐
(defun bzzz()
(command"dimaligned")(bzz))
(defun bz()
(command"dimaligned"))
(bzz))

(defun c:bbj();半径
(defun bzzz()
(command"dimradius")(bzz))
(defun bz()
(command"dimradius"))
(bzz))

(defun c:bzj();直径
(defun bzzz()
(command"dimdiameter")(bzz))
(defun bz()
(command"dimdiameter"))
(bzz))

(defun c:bjd();角度
(defun bzzz()
(command"dimangular")(bzz))
(defun bz()
(command"dimangular"))
(bzz))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun bzz();标注
(setvar"autosnap"63)
(setvar"osmode"6079)
(setq la (getvar"clayer"))
(command "layer" "m" "7标注" "c" "3" "" "lw" "0.13" "" "l" "Continuous" "" "" "clayer" la)
(bz)
(while (> (getvar "CMDACTIVE") 0)(command pause))
(command "change" (entlast) "" "P" "la" "7标注" ""))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun ssgc()
(setq ss (ssadd))
(setq ss (ssadd (entlast) ss))
(command "Select" ss "")
(setq ss (ssget "p" '((8 . "7标注")(0 . "DIMENSION"))))
(sssetfirst nil ss))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;公差类

(defun +-()
(ssgc)
(setvar "cmdecho" 0)
(if (= n nil) (setq n 0))
(if (= m nil) (setq m 0))
(setq k 0)
(while (<= k 5)
(setq a (fix (* (EXPT 10 (- 5 K)) n)))
(setq b (* 10 (fix (* (expt 10 (- 4 k)) n))))
(setq k1 (- 5 k))
(IF (= a b) (SETQ K (+ K 1)) (setq K 6)))
(setq k 0)
(while (<= k 5)
(setq a (fix (* (EXPT 10 (- 5 K)) M)))
(setq b (* 10 (fix (* (expt 10 (- 4 K )) M))))
(SETQ K2 (- 5 k))
(IF (= a b) (SETQ K (+ K 1)) (setq K 6)))
(setQ d2 (max K1 K2))
(if (= n m) (setq c 1) (setq c 0.6))
(if (and (= n 0)(= m 0)) (COMMAND "_DIMOVERRIDE" "dimtol" "off" "")
(COMMAND "_DIMOVERRIDE" "DIMTP" N "DIMTM" M "DIMTOL" "ON" "DIMTFAC" c "DIMTDEC" D2 ""))
(while (> (getvar "CMDACTIVE") 0)(command pause))
(bzzz)
(PRINC))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:+-()
(prompt "\n+")(setq n (getreal""))
(prompt "\n-")(setq m (getreal""))
(+-))

(defun c:00()
(setq n 0)
(setq m 0)
(+-))

(defun c:+15()
(setq n 0.015)
(setq m 0)
(+-))
(defun c:-15()
(setq n 0)
(setq m 0.015)
(+-))

(defun c:+2()
(setq n 0.02)
(setq m 0)
(+-))
(defun c:-2()
(setq n 0)
(setq m 0.02)
(+-))

(defun c:+4()
(setq n 0.04)
(setq m 0)
(+-))
(defun c:-4()
(setq n 0)
(setq m 0.04)
(+-))

(defun c:+10()
(setq n 0.1)
(setq m 0)
(+-))
(defun c:-10()
(setq n 0)
(setq m 0.1)
(+-))
(defun c:++1()
(setq n 0.1)
(setq m 0.1)
(+-))

(defun c:+20()
(setq n 0.2)
(setq m 0)
(+-))
(defun c:-20()
(setq n 0)
(setq m 0.2)
(+-))
(defun c:++20()
(setq n 0.2)
(setq m 0.2)
(+-))

(defun c:+50()
(setq n 0.5)
(setq m 0)
(+-))
(defun c:-50()
(setq n 0)
(setq m 0.5)
(+-))
(defun c:++5()
(setq n 0.5)
(setq m 0.5)
(+-))

(defun c:+11()
(setq n 1)
(setq m 0)
(+-))
(defun c:-11()
(setq n 0)
(setq m 1)
(+-))
(defun c:++11()
(setq n 1)
(setq m 1)
(+-))

本帖子中包含更多资源

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

x
发表于 2013-7-13 12:51:09 | 显示全部楼层
修正了一个错误。再试试
 楼主| 发表于 2013-7-13 14:04:11 | 显示全部楼层
ZZXXQQ 发表于 2013-7-13 12:51
修正了一个错误。再试试

Z版,还是老问题吖,也许智能从(defun +-()入手了
 楼主| 发表于 2013-7-13 18:12:51 | 显示全部楼层
我想是不是把标公差的程序改为自动选择最后生成的标注就有个可以了,但不懂怎么改
 楼主| 发表于 2013-7-15 19:29:41 | 显示全部楼层
唉,看来是没法子了...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 18:08 , Processed in 0.186926 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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