airuyi
发表于 2016-9-29 14:09:26
本帖最后由 airuyi 于 2016-9-29 14:12 编辑
Sylvanas 发表于 2016-9-29 14:00
那你问版主吧
说实话他那段代码我有八成没看懂
(progn
29. (vla-put-InsertionPoint obj (vlax-3d-point FXYZ))
30. )
31. (progn
32. (vla-put-InsertionPoint
33. obj
34. (vlax-3d-point (list (atof FX) (atof FY) (atof FZ)))
版主的思路就是改变属性块的插入点为FXYZ或者提取的XYZ数值里面。版主的程序里面是提取了标记为FXYZ或者标记为XYZ的数值,不管属性块如何改变,提取的数值都不会出错。
你的思路是提取固定的属性块前面几个数值,如果属性块在定义的时候顺序改变了,就会提取不到。你的程序是提取数值之后把属性块移动到对应的地方。
其实两种思路都很好的。
因为我一张图纸里面有很多层的平面图,所以会经常改变对应的UCS原点位置。每张平面图都有一个原点,我希望当我改变了UCS的原点之后可以把每层平面要的属性块放在对应新坐标的点上面。要是把你的程序和版主的结合起来,这样就完美了。我可以看懂一点点程序,但是我不会写,唉。
Sylvanas
发表于 2016-9-29 14:24:59
airuyi 发表于 2016-9-29 14:09
(progn
那我整合一下看看,虽然看不懂,无视过程只取个返回值应该可以,做个尝试
airuyi
发表于 2016-9-29 14:29:45
Sylvanas 发表于 2016-9-29 14:24
那我整合一下看看,虽然看不懂,无视过程只取个返回值应该可以,做个尝试
也就是说如果使用版主提取到的数值,然后用你的方式把属性块通过移动命令移动到对应的数值坐标上,也是一种方法。谢谢帮忙
Sylvanas
发表于 2016-9-29 14:41:24
airuyi 发表于 2016-9-29 14:29
也就是说如果使用版主提取到的数值,然后用你的方式把属性块通过移动命令移动到对应的数值坐标上,也是一 ...
改了UCS涉及到坐标转换,没辙转换方程我看不懂
airuyi
发表于 2016-9-29 14:44:25
Sylvanas 发表于 2016-9-29 14:41
改了UCS涉及到坐标转换,没辙转换方程我看不懂
不用转换啊,比如原来的坐标点是(1,1,1),就是改了UCS,然后再运行一次程序,就可以把属性块移动到对应的坐标上新的(1,1,1)上面而已,也就是说重新移动一次。
Sylvanas
发表于 2016-9-29 14:58:53
airuyi 发表于 2016-9-29 14:44
不用转换啊,比如原来的坐标点是(1,1,1),就是改了UCS,然后再运行一次程序,就可以把属性块移动到对应 ...
要转的,不然仍旧是世界坐标系的坐标
不过好像有个函数直接转,我找找去
Sylvanas
发表于 2016-9-29 15:01:01
本帖最后由 Sylvanas 于 2016-9-29 15:02 编辑
airuyi 发表于 2016-9-29 14:44
不用转换啊,比如原来的坐标点是(1,1,1),就是改了UCS,然后再运行一次程序,就可以把属性块移动到对应 ...(defun c:tt ()
(setq cmdecho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq osmode (getvar "osmode"))
(setvar "osmode" 0)
(setq ss (ssget '((2 . "自动坐标"))))
(while (setq en (ssname ss 0))
(setq ss (ssdel en ss))
(setq ss1 (ssadd))
(setq ss1 (ssadd en ss1))
(setq dxf (entget en))
(setq en1(entnext en)
dxf1 (entget en1)
)
(setq FXYZ nil)
(setq obj (vlax-ename->vla-object en))
(foreach att (vlax-invoke obj 'GetAttributes)
(setq tag(strcase (vla-get-TagString att))
str(vla-get-TextString att)
)
(cond ((= "FXYZ" tag) (setq FXYZ str))
((= "FX" tag) (setq FX str))
((= "FY" tag) (setq FY str))
((= "FZ" tag) (setq FZ str))
)
)
(while (/= FXYZ (setq FXYZ (vl-string-subst " " "," FXYZ))))
;(setq FXYZ "1,2,3")
(setq FXYZ (read (strcat "(" FXYZ ")")))
(if(= 3 (length FXYZ))
(setq pt FXYZ)
(setq pt (list (atof FX) (atof FY) (atof FZ)))
)
(command "move" ss1 "" (cdr (assoc 10 dxf)) (trans pt 1 0))
)
(setvar "cmdecho" cmdecho)
(setvar "osmode" osmode)
(princ)
)
好像没问题,你试一下
airuyi
发表于 2016-9-29 15:23:36
Sylvanas 发表于 2016-9-29 15:01
好像没问题,你试一下
哇塞,成功了哦,哈哈,好厉害!太感谢了!!
airuyi
发表于 2016-9-29 16:24:13
本帖最后由 airuyi 于 2016-9-29 16:36 编辑
Sylvanas 发表于 2016-9-29 15:01
好像没问题,你试一下
突发奇想,能不能进行一个反向操作。就是说我把属性块放在某个位置,然后输入一个程序命令,程序可以自动把当前位置的XYZ值写入到属性块的FXYZ和FX,FY,FZ?这样的话如果我们要做图纸中测量很多点,那么只需要在各个点的位置放入这个属性块,然后使用程序命令赋值,然后再导出EXCEL就可以了。
当然,还是要得到相对坐标系的值,就是说把UCS放到其他位置的时候,属性块得到的数值是相对于新的坐标系的坐标值。
其实就是想办法把"ID"这个命令得到的坐标值写入属性块的FXYZ和FX,FY,FZ中。
airuyi
发表于 2016-9-29 16:49:36
本帖最后由 airuyi 于 2016-9-29 17:26 编辑
airuyi 发表于 2016-9-29 09:01
感谢版主回复,版主说得直接插块也是一种好方法,直接插块应该也要编辑坐标数据的。地盘测量出来的数据也 ...
可以,我上传一个坐标数据表
...好像无法上传