明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1087|回复: 6

[源码] 悬赏高手对这个lisp增加个功能

[复制链接]
发表于 2019-5-25 15:53:38 | 显示全部楼层 |阅读模式
2明经币
本帖最后由 玩泥巴 于 2019-5-27 10:18 编辑

看到个前辈帖子,功能很好。
但是这个顺号是严格按照图形形心的坐标从上到下,然后从左到右来排序的,怎么能让它在“从上到下”先容许一定的100mm(或用户定义)的误差呢,然后再从左到右顺号呢???期待大神帮忙,更新后功能类似于图片中示意。
感谢原帖的xiaodao520langjshao3ren ,附源代码如下:
;; 功能: 输出封闭多边形边长及面积 到 EXCEL 文件
(defun c:qq (/ d ent f i lst m2 obj pt ss txt x y)
(setq TextHeight (getdist "\n输入标注文字高度:")
Textbh (getstring "\n输入编号前缀:"))
   (defun maketext (txt pt)             ; 生成文字子函数
    (entmake (list '(0 . "TEXT") (cons 62 1) (cons 10 pt) (cons 40 TextHeight) (cons 1 txt) '(41 . 0.8)))
   )
   (setvar "cmdecho" 0)
   (vl-load-com)
   (setq ss (ssget) ent (entlast))
   (command ".region" ss "")
   (setq ss (ssadd)  lst nil)
   (while (setq ent (entnext ent))
     (if (= (cdr (assoc 0 (entget ent))) "REGION")
       (setq obj (vlax-ename->vla-object ent) pt (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj)))
             m2 (rtos (vla-get-area obj) 2 2) d (rtos (vla-get-perimeter obj) 2 2) lst (cons (list pt m2 d) lst)
       )
     )
   )
   (command ".undo" "")
   (setq lst (vl-sort lst (function (lambda (x y)(< (car (car x)) (car (car y)))))))
   (setq lst (vl-sort lst (function (lambda (x y)(> (cadr (car x)) (cadr (car y)))))))
   (setq f (getfiled "指定输出文件路径" "" "xls" 1) f (open f "w"))
   (write-line "编号\t周长(mm)\t面积(mm2)" f)
   (setq i 1)
   (foreach x lst
     (setq pt (car x) m2 (cadr x) d (caddr x))
     (maketext (strcat Textbh (itoa i)) (list (car pt) (+ (cadr pt) (* 1.2 TextHeight))))
     (maketext (strcat "L=" d "mm") pt)
     (maketext (strcat "S=" m2 "mm2") (list (car pt) (- (cadr pt) (* 1.2 TextHeight))))
     (write-line (strcat (strcat Textbh (itoa i)) "\t" d "\t" m2) f)
     (setq i (1+ i))
   )
   (close f)
   (princ)
)

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

最佳答案

查看完整内容

这个程序很受用 感谢分享。 我改了一下你试试效果。我现在的容差是10米 ;; 功能: 输出封闭多边形边长及面积 到 EXCEL 文件 (defun c:qq (/ d ent f i lst m2 obj pt ss txt x y) (setq TextHeight (getdist "\n输入标注文字高度:") Textbh (getstring "\n输入编号前缀:")) (defun maketext (txt pt) ; 生成文字子函数 (entmake (list '(0 . "TEXT") (cons 62 1) (cons 10 pt) (cons 40 TextHeight) ...
发表于 2019-5-25 15:53:39 | 显示全部楼层
这个程序很受用  感谢分享。 我改了一下你试试效果。我现在的容差是10米


;; 功能: 输出封闭多边形边长及面积 到 EXCEL 文件
(defun c:qq (/ d ent f i lst m2 obj pt ss txt x y)
(setq TextHeight (getdist "\n输入标注文字高度:")
Textbh (getstring "\n输入编号前缀:"))
   (defun maketext (txt pt)             ; 生成文字子函数
    (entmake (list '(0 . "TEXT") (cons 62 1) (cons 10 pt) (cons 40 TextHeight) (cons 1 txt) '(41 . 0.8)))
   )
   (setvar "cmdecho" 0)
   (vl-load-com)
   (setq ss (ssget) ent (entlast))
   (command ".region" ss "")
   (setq ss (ssadd)  lst nil)
   (while (setq ent (entnext ent))
     (if (= (cdr (assoc 0 (entget ent))) "REGION")
       (setq obj (vlax-ename->vla-object ent) pt (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj)))
             m2 (rtos (vla-get-area obj) 2 2) d (rtos (vla-get-perimeter obj) 2 2) lst (cons (list pt m2 d) lst)
       )
     )
   )
   (command ".undo" "")
;;;   (setq lst (vl-sort lst (function (lambda (x y)(< (car (car x)) (car (car y)))))))
;;;   (setq lst (vl-sort lst (function (lambda (x y)(> (cadr (car x)) (cadr (car y)))))))
  (setq lst (vl-sort lst '(lambda(a b)
                                         (if (equal (cadr (car a)) (cadr (car b)) 10)
                                           (< (car (car a)) (car (car b)))
                                             (> (cadr (car a)) (cadr (car b)))
                                             
                                         )
                                     )
                       )
            )
   (setq f (getfiled "指定输出文件路径" "" "xls" 1) f (open f "w"))
   (write-line "编号\t周长(mm)\t面积(mm2)" f)
   (setq i 1)
   (foreach x lst
     (setq pt (car x) m2 (cadr x) d (caddr x))
     (maketext (strcat Textbh (itoa i)) (list (car pt) (+ (cadr pt) (* 1.2 TextHeight))))
     (maketext (strcat "L=" d "mm") pt)
     (maketext (strcat "S=" m2 "mm2") (list (car pt) (- (cadr pt) (* 1.2 TextHeight))))
     (write-line (strcat (strcat Textbh (itoa i)) "\t" d "\t" m2) f)
     (setq i (1+ i))
   )
   (close f)
   (princ)
)
回复

使用道具 举报

发表于 2019-5-25 17:45:03 | 显示全部楼层
本帖最后由 1291500406 于 2019-5-25 17:53 编辑

(defun c:qq (/ d ent f i lst m2 obj pt ss txt x y)
(setq TextHeight (getdist "\n输入标注文字高度:")Textbh (getstring "\n输入编号前缀:"))
(defun maketext (txt pt)(entmake (list '(0 . "TEXT") (cons 62 1) (cons 10 pt) (cons 40 TextHeight)(cons 1 txt) '(41 . 0.8))))
(setvar "cmdecho" 0)(vl-load-com)(setq ss (ssget) ent (entlast))(command ".region" ss "")(setq ss (ssadd)  lst nil)
(while (setq ent (entnext ent))(if (= (cdr (assoc 0 (entget ent))) "REGION")
(setq obj (vlax-ename->vla-object ent) pt (vlax-safearray->list (vlax-variant-value (vla-get-centroid obj)))
m2 (rtos (vla-get-area obj) 2 2) d (rtos (vla-get-perimeter obj) 2 2) lst (cons (list pt m2 d) lst))))
(command ".undo" "")(setq lst (vl-sort lst (function (lambda (x y)(< (car (car x)) (car (car y)))))))
(setq f (getfiled "指定输出文件路径" "" "xls" 1) f (open f "w"))(write-line "编号\t周长(mm)\t面积(mm2)" f)(setq i 1)
(foreach x lst(setq pt (car x) m2 (cadr x) d (caddr x))(maketext (strcat Textbh (itoa i))
(list (car pt) (+ (cadr pt) (* 1.2 TextHeight))))(maketext (strcat "L=" d "mm") pt)
(maketext (strcat "S=" m2 "mm2") (list (car pt) (- (cadr pt) (* 1.2 TextHeight))))
(write-line (strcat (strcat Textbh (itoa i)) "\t" d "\t" m2) f)(setq i (1+ i)))(close f)(princ))
回复

使用道具 举报

发表于 2019-5-25 21:47:27 | 显示全部楼层
;将 :
  (setq lst (vl-sort lst (function (lambda (x y)(< (car (car x)) (car (car y)))))))
   (setq lst (vl-sort lst (function (lambda (x y)(> (cadr (car x)) (cadr (car y)))))))          
;改为如下:

            (setq lst (vl-sort lst '(lambda(a b)
                                         (if (equal (car a) (car b) 0.100)
                                             (> (cadr a) (cadr b))
                                             (< (car a) (car b))
                                         )
                                     )
                       )
            )
回复

使用道具 举报

 楼主| 发表于 2019-5-27 09:23:13 | 显示全部楼层
yshf 发表于 2019-5-25 21:47
;将 :
  (setq lst (vl-sort lst (function (lambda (x y)(< (car (car x)) (car (car y)))))))
   (set ...

错误: 用于比较的参数类型不正确: (1.38146e+006 -552555.0) (1.61655e+006 -563187.0)

回复

使用道具 举报

 楼主| 发表于 2019-5-27 09:35:19 | 显示全部楼层
1291500406 发表于 2019-5-25 17:45
(defun c:qq (/ d ent f i lst m2 obj pt ss txt x y)
(setq TextHeight (getdist "\n输入标注文字高度:") ...

这个仅考虑了从左到右排序,我还是要兼顾从上到下原则的。只是不需要严格按照从上到下,同一水平线的允许一定的误差。我那个更新图里没表达出下一排X7,X8,X9.........。
回复

使用道具 举报

发表于 2019-5-27 15:06:35 | 显示全部楼层
;没有注意到lst的子表元是(点 面积字符串 周长字符串)
;应改为如下:
            (setq lst (vl-sort lst '(lambda(a b)
                                         (if (equal (caar a) (caar b) 0.100)
                                             (> (cadar a) (cadar b))
                                             (< (caar a) (caar b))
                                         )
                                     )
                       )
            )
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 16:01 , Processed in 0.172642 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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