qinleilei 发表于 2015-10-1 11:18:20

关于坐标标注组码70 的值变动问题

本帖最后由 qinleilei 于 2015-10-1 14:39 编辑

最近写了个代码,主要是方便自己标注坐标后用于坐标数值对其,使其美观,但是在使用中发现了问题。
先贴上代码,后面再上图讨论。本人搞模具的,出2D图纸标注占了一大半的工作量
(DEFUN C:cb()
(setvar "CMDECHO" 0)
(command "ucs" "w")
(princ "\n选择参考尺寸: ")
(setq ent(entget(car (entsel))))
(setq ge (cdr (assoc 70 ent)));根据组码70来判断横纵坐标类型
(princ "\n选择需要修改的尺寸: ")
(setq ss (ssget (list '(0 . "DIMENSION") (cons 70 ge))));按横纵坐标标注类型创建选择集
(COND
((= ge 102)(setq ref(caddr(assoc 14 ent))))
((= ge 38)(setq ref(cadr(assoc 14 ent))))
(progn
    (princ "\n选取的图元错误!!!")
   (quit)
    )
)
(setq n 0)
(repeat (sslength ss)
(setq en (entget (ssname ss n)))
(setq p1 (assoc 14 en))
(setq p2(cadr p1))
(COND
((= ge 102)(setq p2(caddr p1)))
((= ge 38)(setq p2(cadr p1)))
(progn
    (princ "\n选取的图元错误!!!")
   (quit)
    )
)
(setq p3(subst ref p2 p1))
(entmod(subst p3 p1 en))
(setq n(1+ n))
)
) (princ)



图一中是演示的效果,选取参考值,使同类型的标注文字对齐,看似没有问题。接着往下看图二 图三


大家仔细看会发现,拖动标注文字夹点后 组码70的值变了。


我是根据组码70的值 102和38 来判断横纵坐标的类型的,那么问题来了,如果我在标注过程中有拖动坐标,那么70的组码就会变动,接着图一的演示也就宣告失败了!

还望各位大师不吝赐教,公司用的是正版中望CAD,没有网络,好不容易国庆一天假 跑网吧来了,装个CAD来发这个求助帖
各位可不要让我白跑一趟呀

写代码纯属业余,上面代码中用组码70来判断横纵坐标标注类型,纯粹是自己根据坐标标注的群码对比找出来的不同处。不知道各位一般是根据什么来判断的,还有就是上面的代码应该还可以精简下,就是不知道怎么弄,谁要是有高招还望指点下
谢谢了!

ivde 发表于 2015-10-2 08:03:10

本帖最后由 ivde 于 2015-10-2 08:06 编辑

(= (logand 166 6) 6) -> T
(= (logand 230 6) 6) -> T

(ssget '((0 . "dimension")(-4 . "&=") (70 . 6)))

X 坐标 (logand dxf70 64) == 0
Y 坐标 (logand dxf70 64) == 64





qinleilei 发表于 2015-10-2 13:08:37

不是很明白,可以讲解下不?

qinleilei 发表于 2015-10-2 17:12:07

ivde 发表于 2015-10-2 08:03
(= (logand 166 6) 6) -> T
(= (logand 230 6) 6) -> T



可以大致讲解下不?有点看不懂

ZZXXQQ 发表于 2015-10-3 05:24:58

下面是帮助中的内容
组码70
标注类型:
值 0-6 是整数值,表示标注类型。值 32、64 和 128 是添加到整数值的位值(在 R13 及以后的版本中始终设置为 32)
0 = 旋转、水平或垂直;1 = 对齐
2 = 角度;3 = 直径;4 = 半径
5 = 三点角度;6 = 坐标
32 = 表示块参照(组码 2)仅由该标注参照。
64 = 坐标类型。这是一个位值(位 7),仅与整数值 6 一起使用。如果设置该值,则坐标为 X 类型;如果不设置,则坐标为 Y 类型。
128 = 这是一个添加到其他组 70 值的位值(位 8)(如果标注文字已放置到用户定义的位置,而不是放置到默认位置)
******
从上面内容可以看出,不管是什么标注类型,只要用户定义了位置70组码就会变化。
而ivde的回答就是去伪存真,用逻辑算法判断70组码的内容是否包含6。

ivde 发表于 2015-10-3 09:46:30

166 = 6 + 32+ 128
230 = 6 + 32 + 64 + 128

zhongys 发表于 2015-10-3 20:03:59

我以前也写了一个,用的是比较笨的方法,目前发现70组码的有如下几个,供你参考.
                        (setq ss (ssget
                                        '(
                                                (0 . "DIMENSION")
                                                (-4 . "<or")
                                                (70 . 6)
                                                (70 . 70)
                                                (70 . 38)
                                                (70 . 102)
                                                (70 . 134)
                                                (70 . 198)
                                                (70 . 166)
                                                (70 . 230)
                                                (-4 . "or>")
                        )));;end ss
页: [1]
查看完整版本: 关于坐标标注组码70 的值变动问题