边界框问题
大家好,有没有其他人注意到vla getboundingbox的错误?
在lisp中,我试图建立2个点来进行窗口选择,
但是边界框并不包围对象。
有什么想法吗?
谢谢
屏幕截图:
测验图纸 确保在创建边界框之前关闭“osnaps”。将当前osnaps值存储到局部变量,将其设置为零,绘制边界框,然后将osnaps恢复到用户以前拥有的状态,这是一种很好的做法。论坛上有很多这样的例子。
使用Tapatalk从我的SM-G935V发送 果然,这就是问题所在。
太简单了,我听不懂。。。
谢谢Jeffery_B 不客气!当我开始使用边界框时,我也遇到了同样的问题。
使用Tapatalk从我的SM-G935V发送 我建议将边界框设置为entmake,而不是使用命令调用,这样对象捕捉就没有效果了。
下面是一个示例:边界框。 谢谢你,李,那肯定会使它更防弹。 既然你们帮了大忙。
我有一个(到目前为止),另一个问题与这个特定的例行程序。
此例程有时会将对象偏移到错误的一侧。
我认为:
(vla-offset obj -0.375)
是否会将对象偏移到“内部”?
第一篇文章中附着的dwg中的多段线对象出现错误。
草率且效率极低的代码:
;|
PLEX CIRCLE OFFSET
DRAWS CLEARANCE HOLES AND OFFSETS CIRCLES FOR COUNTERSINK
WRITTEN BY P.DuMONT 02/18/2016 |;
(defun c:PLO ( / cmde doc osn dia ent obj point1 point2 ln sset mx d0 pt di )
(defun *error* (msg)
(if (and msg
(not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
)
(princ (strcat "\nError: " msg))
)
(if cmde
(setvar 'cmdecho cmde)
)
(if doc
(vla-endundomark doc)
)
(if osn
(setvar 'osmode osn)
)
(princ)
) ;_ end of defun
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(setvar 'cmdecho 0)
(setq osn (getvar 'osmode))
(setvar 'osmode 0)
(setq ent (car (entsel "\nSelect plex profile: ")))
; (command "_.ZOOM" "object" ent "")
(setq dia 0.05)
(setq obj (vlax-ename->vla-object ent))
(vla-getboundingbox obj 'Point1 'Point2)
(setq point1 (vlax-safearray->list Point1))
(setq point2 (vlax-safearray->list Point2))
(vla-offset obj -0.375)
(command "_.explode" "l" "")
(foreach ln
(vl-remove-if
'listp
(mapcar 'cadr
(ssnamex (ssget "_W" point1 point2 '((0 . "LINE"))))
) ;_ end of mapcar
) ;_ end of vl-remove-if
(command
"_.circle"
(vlax-curve-getStartPoint ln)
dia
"_.circle"
(vlax-curve-getEndPoint ln)
dia
) ;_ end of command
) ;_ end of foreach
(command "-overkill" "w" point1 point2 "" "")
(setq di; HOLE SPACING
(foreach ln
(vl-remove-if
'listp
(mapcar 'cadr
(ssnamex (ssget "_W" point1 point2 '((0 . "LINE"))))
) ;_ end of mapcar
) ;_ end of vl-remove-if
(setq mx (vlax-curve-getdistatparam ln (vlax-curve-getendparam ln))
d0 (- (/ (- mx (* di (fix (/ mx di)))) 2.) di)
) ;_ end of setq
(while (and (<= (setq d0 (+ d0 di)) mx)
(setq pt (vlax-curve-getpointatdist ln d0))
) ;_ end of and
(entmakex (list (cons 0 "CIRCLE")
(cons 10 pt)
(cons 40 0.05)
(cons 8 "0")
) ;_ end of list
) ;_ end of entmakex
) ;_ end of while
) ;_ end of foreach
(setq sset (ssget "_W" point1 point2 '((0 . "LINE"))))
(command "_.erase" sset "")
(OffsetCircles)
(command "_.ZOOM" "p")
(setvar 'osmode osn)
(vla-endundomark doc)
) ;_ end of defun
(vl-load-com)
;| OFFSET CIRCLES|;
(defun OffsetCircles (/ clay sset ent obj)
(defun *error* (msg)
(if (and msg
(not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
)
(princ (strcat "\nError: " msg))
)
(if clay
(setvar 'clayer clay)
)
(princ)
) ;_ end of defun
(setq clay (getvar 'clayer))
(if (not (tblsearch "LAYER" "CNC_DRILL-0.10-PLEX"))
(command "-layer" "make" "CNC_DRILL-0.10-PLEX"
"color" "T" "255,127,0" "" "") ;_ end of command
) ;_ end of if
(if (not (tblsearch "LAYER" "CNC_DRILL-0.30-CNTRSINK"))
(command "-layer" "make" "CNC_DRILL-0.30-CNTRSINK"
"color" "T" "255,127,159" "" "") ;_ end of command
) ;_ end of if
(setvar 'clayer clay)
(if (setq sset (ssget "_W" point1 point2 '((0 . "CIRCLE") (40 . 0.05))))
(progn
(foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex sset)))
(vlax-put-property
(vlax-ename->vla-object ent)
'layer "CNC_DRILL-0.10-PLEX"
) ;_ end of vlax-put-property
(setq obj (vlax-ename->vla-object ent))
(vla-Offset obj 0.1)
(vlax-put-property
(vlax-ename->vla-object (entlast))
'layer "CNC_DRILL-0.30-CNTRSINK"
) ;_ end of vlax-put-property
) ;_ end of foreach
) ;_ end of progn
) ;_ end of if
(princ)
) ;_ end of defun
使用ActiveX偏移方法偏移到内部或外部的概念仅适用于具有确定“内部”的对象,如圆弧、圆和椭圆。当应用于多段线时,偏移方向取决于多段线的方向(即顺时针或逆时针)。
下面是一个示例,演示如何偏移到内部。 谢谢李。
虽然我在拼凑代码片段并使其工作方面还不错,但你的例子远高于我的工资等级。
我的选择集始终是单个实体,因此我将解析您的代码,看看是否可以将该过程应用到我的lisp。。。
...如果你不介意的话。
页:
[1]