以最短的字符串降低块名重复的方法
经常会遇到不同图纸粘贴块参照的现象,如果两个图纸中相同块名其结构不同,粘贴会出问题,这里给出来一种方法,可以降低重复几率
(defun $make-block-name$ (/ $msec/52$ f m n r s str wm y zz)
;制作块名
(defun $msec/52$ (n zz / d ds loop n1 str)
;52进制转换为字母
(orn
(setq n (atoi (menucmd "M=$(edtime,$(getvar,date),MSEC)")))
)
(setq ds nil)
(setq loop T)
(while loop
(if (= (setq n1 (/ n 52)) 0)
(setq loop nil)
)
(setq d (rem n 52))
(setq ds (cons d ds))
(setq n n1)
)
(setq
str (apply 'strcat
(mapcar (function (lambda (a) (nth a zz))) ds)
)
)
str
)
(SETQZZ (list "A" "B" "C" "D" "E" "F" "G" "H" "I"
"J" "K" "L" "M" "N" "O" "P" "Q" "R"
"S" "T" "U" "V" "W" "X" "Y" "Z" "A"
"a" "b" "c" "d" "e" "f" "g" "h" "i"
"j" "k" "l" "m" "n" "o" "p" "q" "r"
"s" "t" "u" "v" "w" "x" "y" "z" "a"
)
)
(setq
n ($msec/52$
(atoi (menucmd "M=$(edtime,$(getvar,date),YYYY)"))
zz
)
) ;年
(setq y (nth (atoi (menucmd "M=$(edtime,$(getvar,date),M)")) zz))
;月
(setq R (nth (atoi (menucmd "M=$(edtime,$(getvar,date),D)")) zz))
;日
(setq s (nth (atoi (menucmd "M=$(edtime,$(getvar,date),HH)")) zz))
;时
(setqF ($msec/52$ (atoi (menucmd "M=$(edtime,$(getvar,date),MM)"))
zz
)
)
;分
(setqM ($msec/52$ (atoi (menucmd "M=$(edtime,$(getvar,date),SS)"))
zz
)
) ;秒
(SETQ WM ($msec/52$ NIL zz)) ;微妙
(setq str (strcat n y r S F M WM))
str
)
本帖最后由 你有种再说一遍 于 2024-4-19 19:32 编辑
似乎想做成原生挺难的.
块名相同,包围盒面积相同,
块内比较:图元数比较,句柄排序,包围盒碰撞检测,颜色碰撞,图层碰撞...
块内块还需要裁剪边界碰撞,此时需要序列化图元,
所以cad是通过序列化图元进行比较的.
块表记录内是堆表(是否存在排序),按照句柄序对照判断,
多出肯定是不同,
图元序列化数据不同时候肯定是不同,问题是句柄不同,图元序列化相同,此时是忽略的.
弹出缩略图窗口选择忽略/覆盖.
可以考虑最后图元的句柄,cad都不怕句柄重复,我们又担心什么呢? 若是考虑“最短”,应该是毫秒的时间戳(如1713491247123)的十进制形式转64进制为最短,若要继续缩短甚至可以去掉前三位及后1位 自贡黄明儒 发表于 2024-4-19 07:02
可以考虑最后图元的句柄,cad都不怕句柄重复,我们又担心什么呢?
一个圆,拉大半径,句柄也是一样呀...
不够保险 tryhi 发表于 2024-4-19 10:05
若是考虑“最短”,应该是毫秒的时间戳(如1713491247123)的十进制形式转64进制为最短,若要继续缩短甚至 ...
在群里好久没看到你冒泡了啊 要短,上汉字。 感谢杜总个的源码分享! 图块会忽略字母大小写
页:
[1]