明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 649|回复: 2

[提问] 大神帮我看下这个代码时好时坏

[复制链接]
发表于 2017-12-21 10:59:15 | 显示全部楼层 |阅读模式
本帖最后由 小男人漏水 于 2017-12-21 11:01 编辑
  1. (defun c:fff (/ ss i e cpt pts pt1)
  2. (while (and (setq s1 (entsel "\n选择3/4螺纹线孔 :"))
  3.              (setq ent (entget (car s1)))
  4.    (wcmatch (setq tn (cdr(assoc 0 ent))) "ARC,"))
  5.   (setq pt1 (cadr s1))
  6.   (setq r (cdr(assoc 40 ent)))
  7. ;判断是否有2细线层。没有新建细线层
  8. (if (=(tblobjname "LAYER" "2细线层") nil)
  9. (progn
  10. (entmake (list
  11. '(0 . "LAYER")
  12. '(100 . "AcDbSymbolTableRecord")
  13. '(100 . "AcDbLayerTableRecord")
  14. '(6 . "bylayer") ;线型
  15. '(62 . 4) ;颜色
  16. '(70 . 0) ;图层状态
  17. (cons 2 "2细线层") ;图层名
  18. )
  19. )
  20. )
  21. )
  22. ;所选线改变为2细线层
  23.   (setq *laysel* (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
  24.   ;(if (and (setq en (car (entsel "\n选择目标对象:")))
  25.    (if (and (setq en (car s1))
  26.    (setq obj (vlax-ename->vla-object en))
  27.    (setq cor (vla-get-color obj))
  28.   ;(setq pt (getpoint "\n基点:"))
  29.     )
  30.    (progn
  31.      ;; 分辨颜色
  32.    (cond ((= cor 256) ;_ 随层
  33.   (setq cor (vla-get-color (vla-item *laysel* (vla-get-layer obj))))
  34.    )
  35.    ((= cor 0) ;_ 随块
  36.     (setq cor 7)
  37.    )  )
  38.      ;; 筛选图层
  39.   (vlax-for lay *laysel*
  40. (if (= (vla-get-color lay) cor)
  41.   (setq lay-lst (cons (vla-get-name lay) lay-lst))
  42. ) )
  43. (if lay-lst
  44. (foreach lay lay-lst
  45. (if lay-str
  46.     (setq lay-str (strcat lay-str "," lay))
  47.    (setq lay-str lay)
  48. )
  49. )
  50.      )
  51.     ;; 形成选择集
  52.    (if lay-str

  53. (setq ss (ssget "x" (list '(-4 . "<OR") (cons 0 lay-str) (cons 62 cor) '(-4 . "OR>"))))
  54. (setq ss (ssget "x" (list (cons 62 cor))))
  55.    )
  56.    (vl-cmdf "change" ss "" "p" "la" "2细线层"  "lt" "bylayer" "c" "bylayer" "")
  57.     ;(vl-cmdf "move" ss "" pt)
  58.      ;(vl-cmdf pause)
  59.   )
  60. )  
  61. ;;判断筛选直径等于所选圆弧直径并且线处于2细线层
  62.   (setq ss (ssget (list '(0 . "arc")'(-4 . "=")(cons 40 r)'(8 . "2细线层"))) i -1)
  63.   (while (setq e (ssname ss (setq i (1+ i))))
  64.     (setq cpt(cdr(assoc 10 (entget e))))
  65.     (if(not(member cpt pts))
  66.       (setq pts(cons cpt pts))     )   )
  67.       (length pts)
  68. ;;判断筛选     
  69.   (setq qztxt (if (setq qz (length pts)) (strcat (itoa qz) "-") ""))
  70. (if (= 1 (length pts))
  71.      (setq qztxt ""))
  72. ;判断孔数量是否为1  
  73.   (if (= tn "ARC") (progn
  74.    (setq r (cdr(assoc 40 ent)))
  75.    (command ".LENGTHEN" (car s1) "")
  76.    (if (>= (getvar "PERIMETER") (* 1.5 pi)) (progn
  77.     (setq qztxt (strcat qztxt "M" (rtos (+ r r) 2) "压铆螺母" ))
  78.     (command "DIMDIAMETER" pt1 "T" qztxt PAUSE)   
  79.    )
  80.     ;(command "DIMRADIUS" pt1 "T" (strcat qztxt "<>") PAUSE)
  81.    )
  82.   )
  83.    ;(command "DIMDIAMETER" pt1 "T" (strcat qztxt "<>") PAUSE)
  84.   )
  85. )
  86. (princ)
  87. )



这个代码步骤是:1.选择4/3圆弧后,并加入2号层
2.筛选出重复圆弧后,统计不重复数量N
3.然后标注出N-M*压铆螺母
现在出现2个问题,
1.第一个是输入命令: fff
选择3/4螺纹线孔 :应用程序错误: 命令输入时发送的类型无效
但是不影响结果。
2.选择弧线以后框选范围出现无法标注:这个问题是间断性出现的。

选择3/4螺纹线孔 :应用程序错误: 命令输入时发送的类型无效

选择对象: 找到 1 个

选择对象: 指定对角点: 找到 0 个
选择对象: 指定对角点: 找到 3 个 (1 个重复),总计 3 个

选择对象:  .LENGTHEN
选择对象或 [增量(DE)/百分数(P)/全部(T)/动态(DY)]:

当前长度: 10.4720,包含角: 300
选择对象或 [增量(DE)/百分数(P)/全部(T)/动态(DY)]:
命令: DIMDIAMETER
选择圆弧或圆:
选择圆弧或圆: T

*无效选择*
需要单个对象。
; 错误: 函数被取消

》》》

劳烦各位大神给看看,上面的代码都是在咋们群里兄弟提供后我自己拼接了一下。





发表于 2017-12-21 14:54:39 | 显示全部楼层
  1. (defun c:tt ()
  2.   (while (and (setq s1 (entsel "\n选择3/4螺纹线孔: "))
  3.               (setq s2 (car s1))
  4.               (setq ent (entget s2))
  5.               (wcmatch (setq tn (cdr (assoc 0 ent))) "ARC")
  6.          )
  7.     (setq pt1 (cadr s1)
  8.           r   (cdr (assoc 40 ent))
  9.     )                                                  ;判断是否有2细线层。没有新建细线层
  10.     (if        (= (tblobjname "LAYER" "2细线层") nil)
  11.       (entmake (list
  12.                  '(0 . "LAYER")
  13.                  '(100 . "AcDbSymbolTableRecord")
  14.                  '(100 . "AcDbLayerTableRecord")
  15.                  '(6 . "bylayer")                  ;线型
  16.                  '(62 . 4)                          ;颜色
  17.                  '(70 . 0)                          ;图层状态
  18.                  (cons 2 "2细线层")                  ;图层名
  19.                )
  20.       )
  21.     )
  22.     (setq *laysel* (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
  23.     (if        (and (setq en (car s1))
  24.              (setq obj (vlax-ename->vla-object en))
  25.              (setq cor (vla-get-color obj))
  26.         )
  27.       (progn
  28.         (cond ((= cor 256)
  29.                (setq cor (vla-get-color (vla-item *laysel* (vla-get-layer obj))))
  30.               )
  31.               ((= cor 0) (setq cor 7))
  32.         )
  33.         (vlax-for lay *laysel*
  34.           (if (= (vla-get-color lay) cor)
  35.             (setq lay-lst (cons (vla-get-name lay) lay-lst))
  36.           )
  37.         )
  38.         (if lay-lst
  39.           (foreach lay lay-lst
  40.             (if        lay-str
  41.               (setq lay-str (strcat lay-str "," lay))
  42.               (setq lay-str lay)
  43.             )
  44.           )
  45.         )
  46.         (if lay-str
  47.           (setq        qf (list '(-4 . "<OR") (cons 8 lay-str) (cons 62 cor) '(-4 . "OR>"))
  48.                 ss (ssget "x" qf)
  49.           )
  50.           (setq ss (ssget "x" (list (cons 62 cor))))
  51.         )
  52.         (vl-cmdf "change" ss ""        "p" "la" "2细线层" "lt"        "bylayer" "c" "bylayer"        "")
  53.       )
  54.     )
  55.     (setq ss (ssget (list '(0 . "arc") '(-4 . "=") (cons 40 r) '(8 . "2细线层")))
  56.           i  -1
  57.     )
  58.     (if        ss
  59.       (progn
  60.         (while (setq e (ssname ss (setq i (1+ i))))
  61.           (setq cpt (cdr (assoc 10 (entget e))))
  62.           (if (not (member cpt pts))
  63.             (setq pts (cons cpt pts))
  64.           )
  65.         )
  66.         (setq qztxt (if        (setq qz (length pts))
  67.                       (strcat (itoa qz) "-")
  68.                       ""
  69.                     )
  70.         )
  71.         (if (= 1 (length pts))
  72.           (setq qztxt "")
  73.         )
  74.         (if (= tn "ARC")
  75.           (progn
  76.             (setq r (cdr (assoc 40 ent)))
  77.             (command ".LENGTHEN" (car s1) "")
  78.             (if        (>= (getvar "PERIMETER") (* 1.5 pi))
  79.               (progn
  80.                 (setq qztxt (strcat qztxt "M" (rtos (+ r r) 2) "压铆螺母"))
  81.                 (command "DIMDIAMETER" pt1 "T" qztxt PAUSE)
  82.               )
  83.             )
  84.           )
  85.         )
  86.       )
  87.     )
  88.   )
  89.   (princ)
  90. )
 楼主| 发表于 2017-12-26 16:41:52 | 显示全部楼层

谢谢版主支持。虽然有点点小小瑕疵。谢谢版主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 21:11 , Processed in 0.167600 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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