明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4281|回复: 11

[已解答] 图框中 零件号 从左往右 从上往下 自动编号

  [复制链接]
发表于 2016-2-23 15:13 | 显示全部楼层 |阅读模式
本帖最后由 慧不绘 于 2016-3-3 16:27 编辑

图框是块,块名为A4N,零件号是此块中的一个属性(块中不只一个属性),标记为 dr2,多个图框在模型中,从左往右,从上往下排着(图框有不同的比例,但是块名是一样的)。
能否实现这样的功能:选择需要编号的图框,输入初始的数字,图框中的零件号从左往右、从上往下以此递增,实现零件号的自动编号。(零件号的格式为001、002、003…………)。
在本论坛和百度上找了好久都没找到类似的,望各位提供思路或者类似的程序,最好是程序啦,因为我刚学编程,现在只能编写一些简单程序!先谢过啦
以下内容2016/3/2更新
根据这几天的学习,及对一些例子的参考,编写了如下的程序,能实现零件号的递增输入,只是需要点选图框。
同时程序存在问题:为使点选一个图框后,仍处于命令执行状态,在子程序中加入了子程序自身的循环,但是在程序最后完成会提示 ” 错误: 参数类型错误: lentityp nil“,虽然使用过程不影响,仍觉别扭,忘坛友修改指正。下面是程序
以下内容2016/3/3更新
首先感谢9楼的思路,经过几天的针对式学习,终于有了进展,看效果图吧
  1. (defun c:jh1(/ tsel ss nn na ss0 nna basx basy i ii minx maxx)   ;由慧不绘于2016/3/2编辑
  2. (setvar "cmdecho" 0)  
  3. (princ"***选择图框***")
  4. (setq tsel (ssget ":s" (list (cons 0 "INSERT")(cons 2 "A4N,A4N-1"))))
  5. (if (not tsel)(alert"未选中图框")) ;判断是否选中了图框
  6. (setq ss (sslength tsel))  ;选择集长度
  7. (if (not (setq nn (getint "\n请输入图框起始编号 <1>: ")))
  8. (setq nn 1)
  9. );end if
  10. (repeat ss   ;22222222222222222222222222222222222222222222
  11.   (setq i 0)
  12.   (repeat ss  ;此循环找出坐标值最小的那个11111111111111111111111
  13.     (setq ss0 (ssname tsel i)
  14.         nna (entget ss0)
  15.         bas (cdr (assoc 10 nna));获取图框基点坐标
  16.         basx (car bas) ;获取图框基点x坐标
  17.         basy (cadr bas) ;获取图框基点y坐标
  18.         i (1+ i)
  19.     );end setq
  20.     (if (= 1 i)(setq minx basx ii (1- i))  ;第一次循环,直接把值赋给minx
  21.       (progn
  22.          (setq maxx basx)    ;第二循环开始,把值赋给maxx后做比较
  23.          (if(< maxx minx)
  24.             (setq minx maxx ii (1- i)) ;如果maxx比minx小,就把maxx赋值给minx
  25.          );end if ;比较x坐标大小
  26.        );end progn
  27.     );end if
  28.   );end repeat ss  ;1111111111111111111111111111111111111111111111
  29. (setq na (ssname tsel ii)) ;根据基点x坐标值,提取坐标最小的图框
  30. (ssdel na tsel) ;删除选择集中的x坐标最小的对象
  31. (setq ss (sslength tsel)) ;删除对象后选择集长度
  32. (autobian)           ;;子程序,对坐标最小的那个赋值
  33. (setq nn (1+ nn))  ;此行返回的nn值比最大的ss大1,但程序在(autobian)之后,故无影响
  34. );end repeat ss  ;222222222222222222222222222222222222222222222
  35. (setvar "cmdecho" 1)               
  36. (PRINC)
  37. (prompt"******自动零件号编号完成******")
  38. (prin1)
  39. )
  40. (defun autobian(/ nk tb tl vb)  ;用于图框零件号的编号
  41. (cond((< nn 10)(setq nk (strcat "00" (itoa nn))))  ;编号小于10,为001-009
  42.      ((and (< nn 100)(> nn 9))(setq nk (strcat "0" (itoa nn)))) ;编号大于9,为010-099
  43.      ((> nn 99)(setq nk (itoa nn)))   ;编号大于99,为100-999
  44. );end cond
  45. (repeat 16
  46.   (setq
  47.         na (entnext na)  ;找寻图面中的下一个对象
  48.   tb (entget na)  ;将列表分解为单个部件
  49.   tl (cdr (assoc 2 tb))  ;获取的对应值对应的变量;获取第二元素,属性块标记
  50.   )
  51.   (if (= tl "DR2")   ;块中属性标记为dr2  ★★★★★★
  52.      (progn   
  53.          (setq vb nk)
  54.          (setq tb(subst (cons 1 vb) (assoc 1 tb) tb))  ;(subst 新序列 旧序列 对象) ;替换对象中的序列
  55.          (entmod tb)   ;更新序列内容
  56.          (entupd na)   ;更新主对象内容
  57.       ) ;end progn
  58.    )  ;end if
  59. )  ;end repeat
  60. )

本帖子中包含更多资源

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

x
发表于 2019-8-27 09:32 | 显示全部楼层
不行啊 ,命令: JH1 ***选择图框***
选择对象: 指定对角点:
请输入图框起始编号 <1>:  ; 错误: 参数类型错误: lentityp nil
发表于 2016-2-23 15:57 | 显示全部楼层
这样的排序函数太多了!你得知道怎么构造一个关联表用来排序
 楼主| 发表于 2016-2-26 13:53 | 显示全部楼层
ivde 发表于 2016-2-23 15:57
这样的排序函数太多了!你得知道怎么构造一个关联表用来排序

新手一枚,不知如何构造关联表,有没有相关的学习资料
发表于 2016-2-26 16:02 | 显示全部楼层
富士康
 楼主| 发表于 2016-2-26 16:07 | 显示全部楼层
LPACMQ 发表于 2016-2-26 16:02
富士康

什么意识
发表于 2016-2-26 16:12 | 显示全部楼层
发帖悬赏马上有人站出来,要不然自己找找论坛类似的东西还是蛮多的,修修改改就能用了。
发表于 2016-2-26 16:18 | 显示全部楼层
最好上传两个图,表明原来什么样,要求结果什么样,应该有人帮忙。
看你的描述,似懂非懂,我想很多人也都这样,也就无法下手了。
 楼主| 发表于 2016-2-26 16:38 | 显示全部楼层
ll_j 发表于 2016-2-26 16:18
最好上传两个图,表明原来什么样,要求结果什么样,应该有人帮忙。
看你的描述,似懂非懂,我想很多人也都 ...

按你的说明,详细了一下,能提供点方法什么的吗
发表于 2016-2-26 23:40 来自手机 | 显示全部楼层
拒供一个思路,首先获取所有块的插入上,然后将加入个列表,依据x,y的值排序
发表于 2016-2-27 00:03 | 显示全部楼层

  1. (defun c:tt (/ ss sl e el lst)
  2.   (if (setq ss (ssget '((0 . "insert")))) ;_过滤图框
  3.     (progn
  4.       (setq sl (sslength ss))
  5.       (while (setq e (ssname ss (setq sl (1- sl))))
  6.         (setq el (cons (vlax-ename->vla-object e) el))
  7.       )
  8.       (setq lst        (mapcar        '(lambda (x / al)
  9.                            (if (setq al        (car (vl-member-if
  10.                                                '(lambda (a) (= (vla-get-tagstring a) "BH"))
  11.                                                (vlax-invoke x 'GetAttributes)
  12.                                              )
  13.                                         )
  14.                                )
  15.                              (list (vla-get-textposition al) al);_构造属性插入点和实体的关联表
  16.                            )
  17.                          )
  18.                         el
  19.                 )
  20.       )
  21.       ;;排序
  22.       (setq lst (vl-sort lst '(lambda (x1 x2)  ...)))
  23.     )
  24.   )
  25.   (princ)
  26. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-8 09:26 , Processed in 0.967327 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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