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
感谢版主回复,版主说得直接插块也是一种好方法,直接插块应该也要编辑坐标数据的。地盘测量出来的数据也 ...
可以,我上传一个坐标数据表

...好像无法上传
页: 1 [2] 3
查看完整版本: 求高手帮忙编一段提取属性块坐标数值然后把属性块移动到对应坐标的LSP