找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1505|回复: 7

[每日一码] 图框排版源码 求优化

[复制链接]
发表于 2018-1-6 13:08:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 依然小小鸟 于 2018-1-8 12:55 编辑

封闭多段线横向排列
(defun c:ZKPB (/ os1 ss ss1 len1 len2 len3 eh-layer ename1 ename2 startpoint pbjj1 ename-list pt-list x-list y-list xminpt xmaxpt)
        (vl-load-com)
        (setvar "CMDECHO" 0)
        (command "UNDO" "be")
        (setq os1 (getvar "osmode"))
        (setvar "osmode" 0)
        ;;-------------------------------------------------------------------
        ;;获得外框图层
        (princ "\n选择一个对象以指定外框图层:")
        (setq ss1 (ssget '((0 . "LWPOLYLINE"))))
        (if (= ss1 nil)
                (progn
                        (alert "未指定外框图层!")
                        (quit)
                );progn
                (progn
                        (setq len3 (sslength ss1))
                        (setq ename1 (ssname ss1 (1- len3)));取得外框图元名,如果是多选则返回最后一个选择对象的图元名
                        (setq eh-layer (eh-getDXF ename1 8));取得图层名称
                        (princ "选定的外框图层为:")(princ eh-layer)(princ "\n")
                );progn        
        );if
        ;;-------------------------------------------------------------------
        ;;选取要排版的对象,实质是只选外框以进行分析
        (princ "\n选择要排版的所有对象:")
        (setq ss (ssget (list '(0 . "LWPOLYLINE") (cons 8 eh-layer))));根据指定外框的图层选择所有外框对象
        (if (= ss nil)
                (progn
                        (alert "未选择要排版的对象!")
                        (quit)
                );progn
        );progn
  ;---------------------------------------------------------------
        ;;指定排版间距
        (if (= pbjj0 nil);pbjj0=默认排版间距,设为全局变量
                (setq pbjj0 (float 100))                        
        );if
        (princ "\n请输入排版间距或直接量取<")(princ pbjj0)(princ ">:")        ;;显示当前默认排版间距
        ;(initget "64")
        (setq pbjj1 (getdist)) ;;获取排版间距
        (if (= pbjj1 nil)
                (setq pbjj1 pbjj0)
                (setq pbjj0 pbjj1)                                
        );if
        
        ;;-------------------------------------------------------------------
        ;;指定排版新起点
        (setq startpoint (GetPoint "\n指定一点做为排版的新起点位置:"))
        (if (= startpoint nil)
                (progn
                        (alert "未指定排版起点!")
                        (quit)
                );progn
                (progn (princ "\n新的起点坐标为:")(princ startpoint))
        );if
        ;;-------------------------------------------------------------------
        ;;外框按X方向排序,取顶点表,执行移动
        (if (= ss nil)
                (progn
                        (alert "因未选择对象--而强制退出此排版程序!")
                        (quit)
                );progn
                (progn   ;如果ss不为空,则执行下面的代码
                        (setq ename-list (eh-ss-sort ss));取得选择集的图元名并按X方向排序后重新排列图元名
                        (setq len1 (length ename-list));取得图元名列表的长度
                        (setq len2 0)
                        (while (< len2 len1)
                                (setq ename2 (nth len2 ename-list));按顺序取得外框的图元名
                                (setq pt-list (eh-getDXF ename2 10));取得多段线顶点列表                                                        
                                (setq x-list (mapcar 'car pt-list));取得所有点的X值               
                                (setq y-list (mapcar 'cadr pt-list));取得所有点的Y值
                                (setq x-list (vl-sort x-list '<));X从小到大排序
                                (setq y-list (vl-sort y-list '<));Y从小到大排序                                                        
                                (setq xminpt (list (car x-list) (car y-list)))
                                (princ "\新对象基点x:")
                                (setq xmaxpt (list (last x-list) (car y-list)))
                          (eh-move pt-list xminpt startpoint);将坐标点代入移动函数,参数为CP选择方式点表,移动基点,目标点
                                (setq startpoint (cons (+ (car startpoint) (distance xminpt xmaxpt) pbjj1) (cdr startpoint)))
                                (princ "\n\n新的目标点坐标为:")(princ startpoint)
                                
                                (setq len2 (1+ len2))
                        );while
                );progn         
        );if
        (command "UNDO" "e")
        (setvar "cmdecho" 1)
        (setvar "osmode" os1)
  (princ)
);test        

;;-----------------------------------------------------------------------------------------------------------
;;选择集图元名排序,按X方向升序排列,返回值为图元名升序列表
(defun eh-ss-sort (ss / len4 len5 ename ename1 ename-list ename-list1 x-minpt x-minpt-list pt-list x-list xx-list xx1 xx2 xx3)
        (setq len4 (sslength ss));取得选择集的长度
        (setq len5 0)
        (setq ename-list '());设图元名表单初始值为空表
        (setq x-minpt-list '())
        ;;;
        (while (< len5 len4)
                (setq ename (ssname ss len5));按顺序取得外框的图元名
                (setq ename-list (cons ename ename-list));将所有图元名组合成表单
               
    (setq pt-list (eh-getDXF ename 10));取得多段线顶点列表        
                ;(princ pt-list)(princ "\n")
                (setq x-list (mapcar 'car pt-list));取得所有点的X值        
                (setq x-list (vl-sort x-list '<));X从小到大排序
                (setq x-minpt (car x-list));取最小X点值
                (setq x-minpt-list (cons x-minpt x-minpt-list));将所有X点值组合成表单
                (setq len5 (1+ len5))
        )
        (setq ename-list (reverse ename-list));图元名列表的表内元素倒置
        (setq x-minpt-list (reverse x-minpt-list));X点表值的表内元素倒置
        (setq xx-list (vl-sort-i x-minpt-list '<));取得点排序的索引号
        
        ;(princ x-minpt-list)(princ "\n")
        ;(princ ename-list)(princ "\n")
        ;(princ xx-list)(princ "\n")
        ;;根据索引号对图元名列表重新排序
        (setq xx1 (length xx-list)
                xx2 0
                ename-list1 '()
        );setq
        (while (< xx2 xx1)
                (setq xx3 (nth xx2 xx-list))
                (setq ename1 (nth xx3 ename-list))
                (setq ename-list1 (cons ename1 ename-list1))
                (setq xx2 (1+ xx2))
        );while
        (setq ename-list1 (reverse ename-list1))
);defun

;;------------------------------------------------------------------------------------------------------------
;根据图元名取得指定的dxf组码值组成的表
;用法:(eh-getdxf 图元名 dxf组码/组码表)
;示例1:(eh-getdxf (ename) 8) 如果是单项返回字符串,多项返回表
;用例2: (eh-getdxf (ename) '(8 10 100)) 返回表
(defun eh-getDXF (ename codelst / entlst ehassoc)
        (setq entlst (entget ename));根据图元名取得对象的所有dxf组码的信息表。
  (setq ehassoc (function (lambda (lst key / l)
                                                                                                                (setq l (vl-remove-if-not '(lambda (x) (= (car x) key)) lst))
                                                                                                                (if (= (length l) 1)
                                                                                                                        (cdar l)
                                                                                                                        (mapcar 'cdr l)
                                                                                                                );if
                          );lambda
                );function
  );setq
  (if (listp codelst)
                (mapcar (function (lambda (x) (apply ehassoc (list entlst x)))) codelst)
                (apply ehassoc (list entlst codelst))
  );if
);defun eh-getDXF
;;------------------------------------------------------------------------------------------------------------        
;;以CP方式选择实体并移动
(defun eh-move (cp-ptlist pt1 pt2 / enameX);参数为CP选择方式点表,移动基点,目标点
        (setq enameX (ssget "_CP" cp-ptlist))
        (command "copy" enameX "" pt1 pt2)
        (princ "\n执行copy时的基点和目标点:")
        (princ pt1)(princ pt2)
        ;(vl-cmdf "move" enameX "" pt1 pt2)
        (princ)
)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
有四点需要求助  1. 如何只识别最外侧封闭多边形(图框有两个封闭多边形)  2.  怎么让图框Y方向上面也能排列 ,或者先X排列后Y排列  或者增加一个选项 3. 怎么让图框以下面对齐而不是上面 4 由于图框大小不一样 有A2的  有A3的,所以封闭多边形的大小也不一样  如何让图框排版 以封闭多边形右下角的点为基准 所有图框与图框之间的距离 都一样  这样我就可以批量插入图签和图号了 (通过贱人工具箱的递增复制和多重复制功能 )  因为 不管图框多大  图签距离封闭多边形右下角的点的距离是恒定的  所以以右下角的基准很重要文件                              已上传  
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:图框测试版.zip 
下载次数:55  文件大小:64.06 KB 
下载权限: 不限 以上  [免费赚D豆]




论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 97个

财富等级: 招财进宝

发表于 2018-1-7 22:21:26 | 显示全部楼层
谢谢,学习一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2018-1-8 00:01:25 | 显示全部楼层
支持一下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2020-7-29 20:37:48 | 显示全部楼层
谢谢版主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1227个

财富等级: 财源广进

发表于 2020-9-23 21:04:38 | 显示全部楼层
谢谢分享!!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 244个

财富等级: 日进斗金

发表于 2022-4-6 08:07:50 | 显示全部楼层
这个我也很需要
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2023-2-10 19:09:34 | 显示全部楼层

这个我也很需要
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2023-11-20 20:20:33 | 显示全部楼层
来个图看看效果啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-10-30 14:45 , Processed in 0.228047 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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