慧不绘 发表于 2016-2-23 15:13:18

图框中 零件号 从左往右 从上往下 自动编号

本帖最后由 慧不绘 于 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
)

bh89757 发表于 2019-8-27 09:32:23

不行啊 ,命令: JH1 ***选择图框***
选择对象: 指定对角点:
请输入图框起始编号 <1>:; 错误: 参数类型错误: lentityp nil

ivde 发表于 2016-2-23 15:57:03

这样的排序函数太多了!你得知道怎么构造一个关联表用来排序

慧不绘 发表于 2016-2-26 13:53:12

ivde 发表于 2016-2-23 15:57 static/image/common/back.gif
这样的排序函数太多了!你得知道怎么构造一个关联表用来排序

新手一枚,不知如何构造关联表,有没有相关的学习资料

LPACMQ 发表于 2016-2-26 16:02:37

富士康

慧不绘 发表于 2016-2-26 16:07:32

LPACMQ 发表于 2016-2-26 16:02 static/image/common/back.gif
富士康

什么意识

LPACMQ 发表于 2016-2-26 16:12:09

发帖悬赏马上有人站出来,要不然自己找找论坛类似的东西还是蛮多的,修修改改就能用了。

ll_j 发表于 2016-2-26 16:18:07

最好上传两个图,表明原来什么样,要求结果什么样,应该有人帮忙。
看你的描述,似懂非懂,我想很多人也都这样,也就无法下手了。

慧不绘 发表于 2016-2-26 16:38:03

ll_j 发表于 2016-2-26 16:18 static/image/common/back.gif
最好上传两个图,表明原来什么样,要求结果什么样,应该有人帮忙。
看你的描述,似懂非懂,我想很多人也都 ...

按你的说明,详细了一下,能提供点方法什么的吗

zhoufupeng 发表于 2016-2-26 23:40:25

拒供一个思路,首先获取所有块的插入上,然后将加入个列表,依据x,y的值排序

ivde 发表于 2016-2-27 00:03:01


(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
查看完整版本: 图框中 零件号 从左往右 从上往下 自动编号