乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 18|回复: 18

[编程交流] 如何创建边界框

[复制链接]

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 20:05:56 | 显示全部楼层 |阅读模式
嗨,专家。
任何人都可以帮助我如何编写lisp,可以用样条线实体创建边界框吗大声笑:
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 20:10:14 | 显示全部楼层
不知道你所说的“边界盒”是什么意思-如果是关于“边界盒”,那么请检查这个例程写的李Mac。
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 20:14:51 | 显示全部楼层
是的,我的意思是像李·麦克写的套路。但此Lisp无法正确生成样条曲线的边界框。我需要非常接近样条==>“平均无间隙”。
 
提前谢谢。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:18:14 | 显示全部楼层
实际上,边界盒方法对于样条曲线是不准确的。
 
另一种方法可能是使用适当的点列表近似样条,然后计算此类点列表的边界;尽管如此,该算法无疑会比边界盒方法慢。
 
以下是演示此方法的示例(您需要下载我的实体到点列表函数):
 
  1. (defun BoundingBox ( ent / l )
  2.    (if (setq l (LM:Entity->PointList ent))
  3.        (mapcar '(lambda ( a ) (apply 'mapcar (cons a l))) '(min max))
  4.    )
  5. )
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 20:20:29 | 显示全部楼层
或者,可以创建一个副本来代替样条线,对其应用展平命令,并使用Lee的例程作为边界框;删除后面的辅助多段线。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:24:22 | 显示全部楼层
好主意Mircea!
 
下面是另一种方法(请原谅代码混乱):
 
测试功能:
  1. (defun c:test ( / bb en )
  2.    (princ "\nSelect a Spline: ")
  3.    (if (setq en (ssget "_+.:E:S:L" '((0 . "SPLINE"))))
  4.        (if (setq bb (SplineBoundingBox (ssname en 0)))
  5.            (entmakex
  6.                (list
  7.                    (cons 0 "LWPOLYLINE")
  8.                    (cons 100 "AcDbEntity")
  9.                    (cons 100 "AcDbPolyline")
  10.                    (cons 90 4)
  11.                    (cons 70 1)
  12.                    (list 10 (caar  bb) (cadar  bb))
  13.                    (list 10 (caadr bb) (cadar  bb))
  14.                    (list 10 (caadr bb) (cadadr bb))
  15.                    (list 10 (caar  bb) (cadadr bb))
  16.                )
  17.            )
  18.            (princ "\nUnable to retrieve Bounding Box.")
  19.        )
  20.    )
  21.    (princ)
  22. )
  23. (vl-load-com) (princ)
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 20:27:55 | 显示全部楼层
我认为李的代码对于ACAD的早期版本是不正确的。。。如果您不需要精确但近似的结果,请尝试此。。。
 
  1. (defun SplineBoundingBox ( ent / xmin xmax ymin ymax res cmde )
  2.    (setq cmde (getvar 'cmdecho))
  3.    (setvar 'cmdecho 0)
  4.    (vl-cmdf "_.ucs" "w")
  5.    (vl-cmdf "_.plan" "")
  6.    (vl-cmdf "_.zoom" "o" ent "")
  7.    (setq ymin (- (cadr (getvar 'viewctr)) (/ (getvar 'viewsize) 2.0)) ymax (+ (cadr (getvar 'viewctr)) (/ (getvar 'viewsize) 2.0)))
  8.    (vl-cmdf "_.ucs" "z" 90)
  9.    (vl-cmdf "_.plan" "")
  10.    (vl-cmdf "_.zoom" "o" ent "")
  11.    (setq xmax (- (car (trans (getvar 'viewctr) 1 0)) (/ (getvar 'viewsize) 2.0)) xmin (+ (car (trans (getvar 'viewctr) 1 0)) (/ (getvar 'viewsize) 2.0)))
  12.    (vl-cmdf "_.zoom" "p")
  13.    (vl-cmdf "_.zoom" "p")
  14.    (vl-cmdf "_.zoom" "p")
  15.    (vl-cmdf "_.zoom" "p")
  16.    (vl-cmdf "_.zoom" "p")
  17.    (vl-cmdf "_.ucs" "p")
  18.    (vl-cmdf "_.ucs" "p")
  19.    (setvar 'cmdecho cmde)
  20.    (setq res (list (list xmin ymin 0.0) (list xmax ymax 0.0)))
  21.    res
  22. )
  23. (defun c:test ( / bb en )
  24.    (princ "\nSelect a Spline: ")
  25.    (if (setq en (ssget "_+.:E:S:L" '((0 . "SPLINE"))))
  26.        (if (setq bb (SplineBoundingBox (ssname en 0)))
  27.            (entmakex
  28.                (list
  29.                    (cons 0 "LWPOLYLINE")
  30.                    (cons 100 "AcDbEntity")
  31.                    (cons 100 "AcDbPolyline")
  32.                    (cons 90 4)
  33.                    (cons 70 1)
  34.                    (list 10 (caar  bb) (cadar  bb))
  35.                    (list 10 (caadr bb) (cadar  bb))
  36.                    (list 10 (caadr bb) (cadadr bb))
  37.                    (list 10 (caar  bb) (cadadr bb))
  38.                )
  39.            )
  40.            (princ "\nUnable to retrieve Bounding Box.")
  41.        )
  42.    )
  43.    (princ)
  44. )

 
如果您想要精确的结果,请考虑像Mircea建议的那样将样条线转换为多段线,或者如果您有A2010或更高版本(不确定A2009)A2008不支持-尝试SPLINEDIT->转换为多段线并从pline获取边界框-删除虚拟pline后。。。如果你有一个2010年或以上,然后尝试也李的代码-刚刚检查了我的A2012和它的工作。。。
还可以从Swamp中检查此线程。。。
 
M、 R。
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 20:31:11 | 显示全部楼层
谢谢李和马尔科·里巴尔·里斯普。在我的AutoCAD 2007上试用后,仍然不能很好地工作。可能我的AutoCAD版本太旧了。您的两个代码都不支持。无论如何,谢谢你们。我仍然需要找出如何突破它。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 20:31:38 | 显示全部楼层
请检查此解决方案,以使用AutoCAD版本将所述样条线转换为多段线。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:36:15 | 显示全部楼层
 
kwwong6,
 
据我所知,我在回复#4中发布的解决方案应该可以在AutoCAD 2007中使用。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-11 09:08 , Processed in 0.590796 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表