asd19400 发表于 2014-9-1 15:52:46

批量形心插块

本帖最后由 asd19400 于 2014-9-1 15:55 编辑

批量形心插块:所求形心的图形一般为矩形,圆或者闭合多段线,不闭合的线段不用管。首先选择插入的块,插入点为块的基点,插入块的位置为图形的形心,支持批量形心插块

lyqiezi 发表于 2014-9-1 15:52:47

(defun c:xxck(/ en ent i obj pt ss s1 s2 s3)
(vl-load-com)
(setvar "cmdecho" 0)
(setq blk1 (cdr (assoc 2 (entget (car (entsel "\n选择要插入的块"))))))
(if (setq ss (ssget '((0 . "PLINE,LWPOLYLINE,LINE,ARC,CIRCLE,SPLINE,ELLIPSE"))))
    (progn
      (setq i -1)
      (while (setq s1 (ssname ss (setq i (1+ i))))
        (entmakex (entget s1))
      (setq s2 (entlast))
      (command ".region" s2 "")
        (setq s3 (entlast))
      (setq obj (vlax-ename->vla-object s3))
      (setq pt (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj))))
      (entmake (list '(0 . "INSERT") (cons 2 blk1) (cons 10 pt)))
      (entdel s3)
      )

    )
    (princ "\n没有选择对象.")
)
(princ)
)

修改了一下,有些不懂原先的程序做什么事情用的,我就删掉了

1993063 发表于 2014-9-16 00:46:54

自己拼着写

lyqiezi 发表于 2014-9-25 00:07:28

;;; 框选多个闭合图形画质心点 by:langjs
;;; =================
(defun c:zx(/ en ent i obj pt ptls snap ss ss1)
(setvar "cmdecho" 0)
(if (setq ss (ssget '((0 . "PLINE,LWPOLYLINE,LINE,ARC,CIRCLE,SPLINE,ELLIPSE"))))
    (progn
      (setvar "osmode" 0)
      (setq en (entlast))
      (command ".region" ss "")
      (if en
      (progn
          (setq ss (ssadd))
          (while (setq en (entnext en))
            (ssadd en ss)
          )
          (if (zerop (sslength ss))
            (setq ss nil)
          )
      )
      (setq ss (ssget "_x"))
      )
      (setq ss1 (ssadd))
      (repeat (setq i (sslength ss))
      (setq ent (ssname ss (setq i (1- i))))
      (if (= (cdr (assoc 0 (entget ent))) "REGION")
          (progn
            (vl-load-com)
            (setq obj (vlax-ename->vla-object ent))
            (setq pt (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj))))
            (command ".point" pt)
            (setq ptls (entlast))
            (command ".explode" ent)
            (setq ss1 (ssadd ptls ss1))
          )
      )
      )
      (sssetfirst nil ss1)
    )
    (princ "\n没有选择对象.")
)
(princ)
)
批量找形心的

lyqiezi 发表于 2014-9-25 00:24:23

            (entmake (list '(0 . "INSERT") (cons 2 "块名") (cons 10 pt)))
这句是插块的,替换掉画点的那行就可以了

asd19400 发表于 2014-9-27 16:05:21

lyqiezi 发表于 2014-9-25 00:24 static/image/common/back.gif
(entmake (list '(0 . "INSERT") (cons 2 "块名") (cons 10 pt)))
这句是插块的,替换掉画点的 ...

上面的程序会把闭合多段线打断,而且块名固定了,我想要的是效果是首先选择块,再选择闭合的多段线形心为插入点,纯菜鸟 不懂lisp

asd19400 发表于 2014-9-28 23:48:00

lyqiezi 发表于 2014-9-28 11:19 static/image/common/back.gif
(defun c:xxck(/ en ent i obj pt ss s1 s2 s3)
(vl-load-com)
(setvar "cmdecho" 0)


测试了可以用,不过建议加一个出错的处理程序,排除不闭合的多段线,要不然程序会有错误信息,
; 错误: ActiveX 服务器返回错误: 未知名称: Centroid

lyqiezi 发表于 2014-9-30 21:04:08

(defun c:xxck(/ en ent i obj pt ss s1 s2 s3)
(vl-load-com)
(setvar "cmdecho" 0)
(setq blk1 (cdr (assoc 2 (entget (car (entsel "\n选择要插入的块"))))))
(if (setq ss (ssget '((0 . "PLINE,LWPOLYLINE,CIRCLE,SPLINE,ELLIPSE"))))
    (progn
      (setq i -1)
      (while (setq s1 (ssname ss (setq i (1+ i))))
      (entmakex (entget s1))
      (setq s2 (entlast))
      (command ".region" s2 "")
      (setq s3 (entlast))
      (if (= "REGION" (cdr (assoc 0 (entget s3))))
         (progn
             (setq obj (vlax-ename->vla-object s3))
             (setq pt (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj))))
             (entmake (list '(0 . "INSERT") (cons 2 blk1) (cons 10 pt)))
             (entdel s3)
         )
         (entdel s2)
      )
      )

    )
    (princ "\n没有选择对象.")
)
(princ)
)

lyqiezi 发表于 2014-9-30 21:07:14

可能当时删掉的就是容错代码,现在去掉了一些不应该选的line,arc等,增加容错,如果region不成功的话,就略过
但是还有个问题,就是region命令的反映没有屏蔽掉
看看是否原先代码存在屏蔽region反映的功能

lyqiezi 发表于 2014-9-30 21:40:53

(defun c:xxck(/ en ent i obj pt ss s1 s2)
(vl-load-com)
(setvar "cmdecho" 0)
(setvar "delobj" 0)
(setq blk1 (cdr (assoc 2 (entget (car (entsel "\n选择要插入的块"))))))
(if (setq ss (ssget '((0 . "PLINE,LWPOLYLINE,CIRCLE,SPLINE,ELLIPSE"))))
    (progn
      (setq i -1)
      (while (setq s1 (ssname ss (setq i (1+ i))))
      (command ".region" s1 "")
      (setq s2 (entlast))
      (if (= "REGION" (cdr (assoc 0 (entget s2))))
         (progn
             (setq obj (vlax-ename->vla-object s2))
             (setq pt (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj))))
             (entmake (list '(0 . "INSERT") (cons 2 blk1) (cons 10 pt)))
             (entdel s2)
         )
      )
      )
    )
    (princ "\n没有选择对象.")
)
(prin1)
)

还是不知道怎么解决region的提示

这次不再用entmakex复制,然后再删除的方法,而是使用delobj的系统参数,减少无谓的步骤
页: [1] 2
查看完整版本: 批量形心插块