找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1655|回复: 6

[图块] 图框源码 求优化

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

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

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

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

封闭多段线横向排列
(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 
下载次数:26  文件大小:64.06 KB 
下载权限: 不限 以上  [免费赚D豆]



请点击此处下载

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

您的用户组是:游客

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




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

已领礼包: 381个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 812个

财富等级: 财运亨通

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

使用道具 举报

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

使用道具 举报

已领礼包: 6056个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 812个

财富等级: 财运亨通

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 21:45 , Processed in 0.399732 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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