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