啵浪鼓 发表于 2011-7-31 19:54:50

回复 highflybir 的帖子

还是没法解决,飞版出高招呀

highflybird 发表于 2011-8-1 18:20:33

本帖最后由 highflybird 于 2011-8-1 18:24 编辑

啵浪鼓 发表于 2011-7-31 19:54 static/image/common/back.gif
回复 highflybir 的帖子

还是没法解决,飞版出高招呀
解决代码在此。



(vl-load-com)
(prompt "\n命令是:test")
;;;取得块的正常插入点,如果这个块中有圆,弧,或者椭圆,则取其中心为插入点;
;;;如果没有,则取这个块的包围盒为正常点,然后判断块的插入点。如果他们的位
;;;置重合,则什么都不做;如果不重合,则用点标记。                        
(defun c:test (/ i lst sel ent dxf Name Cen mat pnt obj ret ll ur)               
(setq i 0)
(setq lst nil)
(if (setq sel (ssget '((0 . "INSERT"))))                                ;选择块参照
    (repeat (sslength sel)
      (setq ent (ssname sel i))                                                ;块参照的图元名
      (setq dxf (entget ent))                                                ;块参照的实体数据
      (setq Name (cdr (assoc 2 dxf)))                                        ;块的名字
      (if (setq Cen (assoc Name lst))                                        ;是否求出中心点
        (setq Cen (cdr Cen))                                               
        (setq Cen (GetCorrectInsertion Name)                                ;求中心点
              lst (cons (cons Name Cen) lst)
        )
      )
      (if Cen
        (setq mat (RefGeom ent)                                                ;中心点存在的话,求变换矩阵
              pnt (mapcar '+ (mxv (car mat) Cen) (cadr mat))                ;并把这点变换到WCS
        )
        (setq obj (vlax-ename->vla-object ent)
              ret (vla-GetBoundingBox obj 'll 'ur)                        ;不存在则求包围盒
              ll(vlax-safearray->list ll)                                ;包围盒的左下点
              ur(vlax-safearray->list ur)                                ;包围盒的右上点
              pnt (mapcar '/ (mapcar '+ ll ur) '(2 2 2))                ;这两点的中点为中心点
        )
      )
      (if (not (equal pnt (cdr (assoc 10 dxf)) 1e-6))                         ;容差可自定义
        (MarkIt pnt)                                                        ;中心点跟插入点不符合,标记位置
      )
      (setq i (1+ i))
    )
)
(princ)
)


啵浪鼓 发表于 2011-8-3 18:29:47

回复 highflybird 的帖子

高飞版主的几何运算真利害,解决了我困扰已久的难题,膜拜!

非常感谢!

10410024 发表于 2011-10-26 16:00:56

w

yan19851204 发表于 2011-10-26 16:03:49

cash1331 发表于 2011-10-27 12:31:57

你们怎么这么复杂。。。我用一个命令就使插入点正确,是不是碰巧,,,,

(defun C:234 ()      
(prompt "\n 顶针过孔")   
   (command "ucs" "")    ;一定要设定UCS,要不然坐标跑了。。
    (setq pt (getpoint "请选择顶针位置:\n"))
下面是正常程序。。。。。。

cash1331 发表于 2011-10-27 12:46:32

不好意思,我可能是没理解意思。。
我的程序是任选点的时候,插入的块随点。。    没试过出WCS坐标点是否一致。。希望不要误导别人。。。

liu_kunlun 发表于 2011-10-28 17:00:08

本帖最后由 liu_kunlun 于 2011-10-28 17:03 编辑

是否是想知道插入块的真正世界坐标?如果是,可以这样解决:
1)从10组得到插入点的OCS坐标:(setq pt (cdr (assoc 10 (entget ent))))
2)将此坐标转换到WCS坐标:(trans pt ent 0)
ent:insert实体

第2)句如用(trans pt ent 1)可得到插入点的当前UCS坐标

highflybir 发表于 2011-10-28 18:11:12

楼上两位真的不要误导别人。
先搞清楚了楼主的意图和一些函数的用法。
注意一点: (trans pt ent 0) 的用法:如果ent 的法向矢量跟'(0 0 1)相等,这样相当不执行转化。

shalei021647 发表于 2011-11-13 11:22:52

唉,同遇到过这种问题
页: 1 [2] 3
查看完整版本: 关于块插入点在ucs=用户自定义和ucs=w时坐标点乱象问题