明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5056|回复: 15

批量形心插块

[复制链接]
发表于 2014-9-1 15:52:46 | 显示全部楼层 |阅读模式
1明经币
本帖最后由 asd19400 于 2014-9-1 15:55 编辑

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

最佳答案

查看完整内容

(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 " ...
发表于 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)
)

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

使用道具 举报

发表于 2014-9-16 00:46:54 来自手机 | 显示全部楼层
自己拼着写来自: Android客户端
回复

使用道具 举报

发表于 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)
)
批量找形心的
回复

使用道具 举报

发表于 2014-9-25 00:24:23 | 显示全部楼层
            (entmake (list '(0 . "INSERT") (cons 2 "块名") (cons 10 pt)))
这句是插块的,替换掉画点的那行就可以了
回复

使用道具 举报

 楼主| 发表于 2014-9-27 16:05:21 | 显示全部楼层
lyqiezi 发表于 2014-9-25 00:24
(entmake (list '(0 . "INSERT") (cons 2 "块名") (cons 10 pt)))
这句是插块的,替换掉画点的 ...

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

使用道具 举报

 楼主| 发表于 2014-9-28 23:48:00 | 显示全部楼层
lyqiezi 发表于 2014-9-28 11:19
(defun c:xxck(/ en ent i obj pt ss s1 s2 s3)
  (vl-load-com)
  (setvar "cmdecho" 0)

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

使用道具 举报

发表于 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)
)
回复

使用道具 举报

发表于 2014-9-30 21:07:14 | 显示全部楼层
可能当时删掉的就是容错代码,现在去掉了一些不应该选的line,arc等,增加容错,如果region不成功的话,就略过
但是还有个问题,就是region命令的反映没有屏蔽掉
看看是否原先代码存在屏蔽region反映的功能
回复

使用道具 举报

发表于 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的系统参数,减少无谓的步骤

点评

前辈,非世界UCS下,插入点不对,请问您可以看看怎么解决吗?  发表于 2016-3-11 16:04
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-27 13:03 , Processed in 0.192007 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表