自贡黄明儒 发表于 2024-6-27 07:00:46

2019下(APPLY 'bpoly (list p ss '(1 0)))出问题了

本帖最后由 自贡黄明儒 于 2024-6-28 07:19 编辑

2019下(APPLY 'bpoly (list p ss '(1 0)))出问题了,改为(vl-cmdf "-BOUNDARY" p "")就好了,而且在Bricscad表现也很好。看来bploy太不靠谱,只有在低版本上能实现。

尘缘一生 发表于 2024-6-27 08:54:31

本帖最后由 尘缘一生 于 2024-6-27 20:28 编辑

我使用怎么正相反呢?BOUNDARY如果中断出错,下面不能执行,BPOLY可以

目前,三领这么作的,这个问题也是永无解的。

[*];;从一个点求到某个方向最近线的距离---(一级)----
[*];;返回: 距离nil
[*](defun snearlin (pt ang / dis ss n lst p0 p1 obj nam0 pl)
[*](setq p0 (polar pt ang (getvar "VIEWSIZE")))
[*](if(setq ss (ssget "F" (list pt p0) '((0 . "LINE,LWPOLYLINE,POLYLINE"))))
[*]    (progn
[*]      (entmake (list '(0 . "LINE") (cons 10 pt) (cons 11 p0)))
[*]      (setq nam0 (entlast))
[*]      (repeat (setq n (sslength ss))
[*]      (setqobj (en2obj (ssname ss (setq n (1- n)))))
[*]      (if (setq pl (vl-catch-all-apply 'vlax-invoke (list (en2obj nam0) 'IntersectWith obj acExtendNone)))
[*]          (setq p1 (list (car pl) (cadr pl) (caddr pl)))
[*]          (setq p1 (trans (vl-catch-all-apply 'vlax-curve-getclosestpointto (list obj (trans pt 1 0) t)) 0 1))
[*]      )
[*]      (if (and p1 (> (setq dis (distance pt p1)) 0))
[*]          (setq lst (cons dis lst))
[*]      )
[*]      )
[*]      (entdel nam0)
[*]    )
[*])
[*](if lst (setq dis (apply 'min lst)) (setq dis nil))
[*]dis
[*])
[*];;enam、p0四周线框包容四角点、实体中点表----(一级)----
[*];;返回 (单元格左下 单元格右下 单元格右上 单元格左上实体中心或点))
[*](defun enear4p (obj / plis p0 pz py ps px p1 p2 p3 p4 d1 d2 d3 d4)
[*](cond
[*]    ((= (type obj) 'ENAME) (setq plis (ebox4 obj) p0 (sl:mid (car plis) (caddr plis)))) ;图元
[*]    ((= (type obj) 'LIST) (setq p0 obj))   ;点
[*])
[*](setq d1 (snearlin p0 pi) d2 (snearlin p0 0) d3 (snearlin p0 pi2) d4 (snearlin p0 3pi2))
[*](if (and d1 d2 d3 d4 (> d1 0) (> d2 0) (> d3 0) (> d4 0))
[*]    (setq
[*]      pz (polar p0 pi d1)
[*]      py (polar p0 0 d2)
[*]      ps (polar p0 pi2 d3)
[*]      px (polar p0 3pi2 d4)
[*]      p1 (list (car pz) (cadr px) 0)
[*]      p2 (list (car py) (cadr px) 0)
[*]      p3 (list (car py) (cadr ps) 0)
[*]      p4 (list (car pz) (cadr ps) 0)
[*]      plis (list p1 p2 p3 p4 p0)
[*]    )
[*]    (setq plis nil)
[*])
[*]plis
[*])
[*]
[*];;三领设计 V3.0 boundary----(一级)-----
[*];;modify 尘缘一生qq:15290049
[*](defun sl-bound (p0 / en lis)
[*](if (/= (vl-catch-all-apply '(lambda () (bpoly p0))) nil) ;若此处取不到边界
[*]    (setq en (entlast))
[*]    (if (setq lis (enear4p p0)) ;转为左右上下求最近线的点作
[*]      (progn
[*]      (makelwpolyline (list (car lis) (cadr lis) (caddr lis) (cadddr lis)) 0 t)
[*]      (setq en (entlast))
[*]      )
[*]    )
[*])
[*]en
[*])

技术工作室 发表于 2024-6-27 11:24:49

我的(vl-cmdf "-BOUNDARY" p "")2014版可以,2016版就不行,鼠标指定P点还正常,如果是计算的P点,范围太小,还需要REGEN(重生成)几次,否则(vl-cmdf "-BOUNDARY" p "")后要得到范围面积会出错,不知各位大佬有没有好代码和建议。

hubeiwdlue 发表于 2024-6-27 11:46:17

BOUNDARY命令有视口限制,bpoly没有,这也是它的一个优势。

你有种再说一遍 发表于 2024-6-27 16:23:21

那就自己做一个吧

LPACMQ 发表于 2024-6-27 21:24:46

ACAD2021测试没问题

hn10183051 发表于 2024-7-3 10:32:28

看上黄大师的内容输入EXCEL了
页: [1]
查看完整版本: 2019下(APPLY 'bpoly (list p ss '(1 0)))出问题了