图框中 零件号 从左往右 从上往下 自动编号
本帖最后由 慧不绘 于 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
) 不行啊 ,命令: JH1 ***选择图框***
选择对象: 指定对角点:
请输入图框起始编号 <1>:; 错误: 参数类型错误: lentityp nil
这样的排序函数太多了!你得知道怎么构造一个关联表用来排序 ivde 发表于 2016-2-23 15:57 static/image/common/back.gif
这样的排序函数太多了!你得知道怎么构造一个关联表用来排序
新手一枚,不知如何构造关联表,有没有相关的学习资料 富士康 LPACMQ 发表于 2016-2-26 16:02 static/image/common/back.gif
富士康
什么意识 发帖悬赏马上有人站出来,要不然自己找找论坛类似的东西还是蛮多的,修修改改就能用了。 最好上传两个图,表明原来什么样,要求结果什么样,应该有人帮忙。
看你的描述,似懂非懂,我想很多人也都这样,也就无法下手了。 ll_j 发表于 2016-2-26 16:18 static/image/common/back.gif
最好上传两个图,表明原来什么样,要求结果什么样,应该有人帮忙。
看你的描述,似懂非懂,我想很多人也都 ...
按你的说明,详细了一下,能提供点方法什么的吗 拒供一个思路,首先获取所有块的插入上,然后将加入个列表,依据x,y的值排序
(defun c:tt (/ ss sl e el lst)
(if (setq ss (ssget '((0 . "insert")))) ;_过滤图框
(progn
(setq sl (sslength ss))
(while (setq e (ssname ss (setq sl (1- sl))))
(setq el (cons (vlax-ename->vla-object e) el))
)
(setq lst (mapcar '(lambda (x / al)
(if (setq al (car (vl-member-if
'(lambda (a) (= (vla-get-tagstring a) "BH"))
(vlax-invoke x 'GetAttributes)
)
)
)
(list (vla-get-textposition al) al);_构造属性插入点和实体的关联表
)
)
el
)
)
;;排序
(setq lst (vl-sort lst '(lambda (x1 x2)...)))
)
)
(princ)
)
页:
[1]
2