明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1715|回复: 9

求助大神帮忙修改成闭合多段线也能排版,(下面代码只能排矩形框)

[复制链接]
发表于 2019-12-9 17:56 | 显示全部楼层 |阅读模式
本帖最后由 296715530 于 2019-12-9 17:58 编辑

(defun c:pb (/ ent i j lst1 lst2 maxpoint minpoint name name1 name2 os1 panban1 pbjj1 pmax pmin pt1x pt1y

pt2x pt2y pt3x
               pt3y pt4x pt4y ptn ss )
  (defun juxingguolv (ss / ent i j lst1 lst2 maxpoint minpoint name name1 name2 pmax pmin pt1x pt1y pt2x

pt2y pt3x pt3y
                         pt4x pt4y )                       ; 过滤掉矩形选择集内的矩形子函数
    (setq lst1 '())
    (repeat (setq i (sslength ss))
      (setq name (ssname ss (setq i (1- i))))
      (vla-getboundingbox (vlax-ename->vla-object name) 'minpoint 'maxpoint)
      (setq pmax (vlax-safearray->list maxpoint)  pmin (vlax-safearray->list minpoint))
      (setq lst1 (cons (list pmin pmax name) lst1))
    )
    (setq lst2 lst1)
    (repeat (setq i (length lst1))
      (setq name (nth (setq i (1- i)) lst1))
      (setq pt1x (car (car name))  pt1y (cadr (car name))  pt2x (car (cadr name))
            pt2y (cadr (cadr name))  name1 (caddr name) )
      (repeat (setq j (length lst2))
        (setq ent (nth (setq j (1- j))  lst2 ))
        (setq pt3x (car (car ent))  pt3y (cadr (car ent)) pt4x (car (cadr ent))
              pt4y (cadr (cadr ent))   name2 (caddr ent))
        (if (and (> pt3x pt1x) (> pt3y pt1y)  (< pt4x pt2x) (< pt4y pt2y))
          (if (ssmemb name2 ss)  (setq ss (ssdel name2 ss))))
        (if (and (< pt3x pt1x) (< pt3y pt1y) (> pt4x pt2x)(> pt4y pt2y))
          (if (ssmemb name1 ss) (setq ss (ssdel name1 ss))))))
    ss
  )
  (vl-load-com)
  (command "UNDO" "be")
  (setq os1 (getvar "osmode"))
  (setvar "osmode" 0)
  (setvar "CMDECHO" 0)
  (setvar "nomutt" 1)
  (princ "\n选择一个外图框对象以指定外框图层:")
  (if (setq ss (ssget ":S" (list '(0 . "LWPOLYLINE") '(90 . 4))))
    (progn
      (setq ent (entget (ssname ss 0)))
      (princ (strcat "\n选定的外图框图层名是:" (cdr (assoc 8 ent))))
      (princ ",请选择要排版的所有(图框)对象:")
      (if (setq ss (ssget (list '(0 . "LWPOLYLINE") '(90 . 4) (assoc 8 ent))))
        (progn
          (setvar "nomutt" 0)
          (setq ss (juxingguolv ss))
          (or pbjj (setq pbjj 100.0))
          (or paiban (setq paiban "X") )
          (if (setq pbjj1 (getdist (strcat "\n请输入图纸排版间距或直接量取:<" (rtos pbjj 2 2) ">:")))
            (setq pbjj pbjj1))
          (if (member (setq panban1 (strcase (getstring (strcat "\n请选择排版方向[横向(X)/纵向(Y)]:<"

paiban ">")))) '("X" "Y"))
            (setq paiban panban1))
          (if (setq ptn (getpoint "\n指定一点做为排版的新起点位置(注意尽量远离选择的图形区域):"))
            (progn
              (repeat (setq i (sslength ss))
                (setq name (ssname ss (setq i (1- i))))
                (vla-getboundingbox (vlax-ename->vla-object name) 'minpoint 'maxpoint)
                (setq pmax (vlax-safearray->list maxpoint) pmin (vlax-safearray->list minpoint))
                (command "move" (ssget "_c" pmin pmax) "" pmin ptn)
                (cond
                  ((= paiban "X") (setq ptn (list (+ (car ptn) (- (car pmax) (car pmin)) pbjj) (cadr

ptn))))
                  ((= paiban "Y") (setq ptn (list (car ptn) (+ (cadr ptn) (- (cadr pmax) (cadr pmin))

pbjj)))))))))))
  )
  (setvar "nomutt" 0)
  (command "UNDO" "e")
  (setvar "cmdecho" 1)
  (setvar "osmode" os1)
  (princ)
)

发表于 2019-12-10 09:52 | 显示全部楼层
你这个排版要超出你的母版
 楼主| 发表于 2019-12-10 10:37 来自手机 | 显示全部楼层
矩形框可以排,非矩形框(多段线框)和框里面的图元会留在原地不动,
发表于 2019-12-10 11:56 | 显示全部楼层
不规则图形用CAD插件不是很好,其实有很多专业的排板套料软件可以选择啊
发表于 2019-12-11 08:27 | 显示全部楼层
自动排版  可没那么容易实现哟
 楼主| 发表于 2019-12-11 09:22 来自手机 | 显示全部楼层
love1030312 发表于 2019-12-11 08:27
自动排版  可没那么容易实现哟

我用ngc的工具箱,可以实现自动排窗线
 楼主| 发表于 2019-12-13 11:07 来自手机 | 显示全部楼层
此贴问题终结,感谢热心人
发表于 2020-8-6 01:25 | 显示全部楼层
支持支持&#128522;,,回去用用
发表于 2021-10-24 09:43 | 显示全部楼层
(defun c:bn (/ ent i j lst1 lst2 maxpoint minpoint namM namM1 namM2 os1 panban1 pbjj1 pmax pmin pt1x pt1y
pt2x pt2y pt3x pt3y pt4x pt4y ptn ss )

  (defun juxingguolv (ss / ent i j lst1 lst2 maxpoint minpoint nam name1 name2 pmax pmin pt1x pt1y pt2x
                                    pt2y pt3x pt3y pt4x pt4y )    ; 过滤掉矩形选择集内的矩形子函数 nam
    (setq lst1 '())
    (repeat (setq i (sslength ss))
      (setq nam (ssname ss (setq i (1- i))))
      (vla-getboundingbox (vlax-ename->vla-object nam) 'minpoint 'maxpoint)
      (setq pmax (vlax-safearray->list maxpoint)  pmin (vlax-safearray->list minpoint))
      (setq lst1 (cons (list pmin pmax nam) lst1))
    )
    (setq lst2 lst1)
    (repeat (setq i (length lst1))
      (setq nam (nth (setq i (1- i)) lst1))
      (setq pt1x (car (car nam))  pt1y (cadr (car nam))  pt2x (car (cadr nam))
            pt2y (cadr (cadr nam))  name1 (caddr nam) )
      (repeat (setq j (length lst2))
        (setq ent (nth (setq j (1- j))  lst2 ))
        (setq pt3x (car (car ent))  pt3y (cadr (car ent)) pt4x (car (cadr ent))
              pt4y (cadr (cadr ent))   name2 (caddr ent))
        (if (and (> pt3x pt1x) (> pt3y pt1y)  (< pt4x pt2x) (< pt4y pt2y))
          (if (ssmemb name2 ss)  (setq ss (ssdel name2 ss))))
        (if (and (< pt3x pt1x) (< pt3y pt1y) (> pt4x pt2x)(> pt4y pt2y))
          (if (ssmemb name1 ss) (setq ss (ssdel name1 ss))))))
    ss
  )
  (vl-load-com)
  (command "UNDO" "be")
  (setq os1 (getvar "osmode"))
  (setvar "osmode" 0)
  (setvar "CMDECHO" 0)
  (setvar "nomutt" 1)
  (princ "请选择要排版的所有(图框)对象:");取消了选外框
(setq ss (ssget (list '(0 . "LWPOLYLINE")  ))) ;'(90 . 4)(assoc 8 ent)
        (progn
          (setvar "nomutt" 0)
          (setq ss (juxingguolv ss))
          (or pbjj (setq pbjj 100.0))
          (or paiban (setq paiban "X") )
          (if (setq pbjj1 (getdist (strcat "\n请输入图纸排版间距或直接量取:<" (rtos pbjj 2 2) ">:")))
            (setq pbjj pbjj1))
       (if (member (setq panban1 (strcase (getstring (strcat "\n请选择排版方向[横向(X)/纵向(Y)]:<"paiban ">")))) '("X" "Y"))
            (setq paiban panban1))
          (if (setq ptn (getpoint "\n指定一点做为排版的新起点位置(注意尽量远离选择的图形区域):"))
            (progn
              (repeat (setq i (sslength ss))
                (setq namm (ssname ss (setq i (1- i))))
                (vla-getboundingbox (vlax-ename->vla-object namm) 'minpoint 'maxpoint)
                (setq pmax (vlax-safearray->list maxpoint) pmin (vlax-safearray->list minpoint))
                (command "move" (ssget "_c" pmin pmax) "" pmin ptn)
                (cond
                  ((= paiban "X") (setq ptn (list (+ (car ptn) (- (car pmax) (car pmin)) pbjj) (cadr

ptn))))
                  ((= paiban "Y") (setq ptn (list (car ptn) (+ (cadr ptn) (- (cadr pmax) (cadr pmin))

pbjj)))))))) ;)))
  )
  (setvar "nomutt" 0)
  (command "UNDO" "e")
  (setvar "cmdecho" 1)
  (setvar "osmode" os1)
  (princ)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 08:10 , Processed in 0.521300 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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