PDuMont 发表于 2022-7-5 17:39:41

边界框问题

大家好,
 
有没有其他人注意到vla getboundingbox的错误?
在lisp中,我试图建立2个点来进行窗口选择,
但是边界框并不包围对象。
 
有什么想法吗?
 
谢谢
 
屏幕截图:
 

测验图纸

Jeffrey_B 发表于 2022-7-5 17:53:51

确保在创建边界框之前关闭“osnaps”。将当前osnaps值存储到局部变量,将其设置为零,绘制边界框,然后将osnaps恢复到用户以前拥有的状态,这是一种很好的做法。论坛上有很多这样的例子。
 
使用Tapatalk从我的SM-G935V发送

PDuMont 发表于 2022-7-5 17:54:51

果然,这就是问题所在。
太简单了,我听不懂。。。
 
谢谢Jeffery_B

Jeffrey_B 发表于 2022-7-5 18:06:58

不客气!当我开始使用边界框时,我也遇到了同样的问题。
 
使用Tapatalk从我的SM-G935V发送

Lee Mac 发表于 2022-7-5 18:16:16

我建议将边界框设置为entmake,而不是使用命令调用,这样对象捕捉就没有效果了。
 
下面是一个示例:边界框。

PDuMont 发表于 2022-7-5 18:21:19

谢谢你,李,那肯定会使它更防弹。

PDuMont 发表于 2022-7-5 18:25:27

既然你们帮了大忙。
我有一个(到目前为止),另一个问题与这个特定的例行程序。
 
此例程有时会将对象偏移到错误的一侧。
我认为:
 
(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

Lee Mac 发表于 2022-7-5 18:35:54

 
使用ActiveX偏移方法偏移到内部或外部的概念仅适用于具有确定“内部”的对象,如圆弧、圆和椭圆。当应用于多段线时,偏移方向取决于多段线的方向(即顺时针或逆时针)。
 
下面是一个示例,演示如何偏移到内部。

PDuMont 发表于 2022-7-5 18:43:38

谢谢李。
 
虽然我在拼凑代码片段并使其工作方面还不错,但你的例子远高于我的工资等级。
 
我的选择集始终是单个实体,因此我将解析您的代码,看看是否可以将该过程应用到我的lisp。。。
 
 
...如果你不介意的话。
页: [1]
查看完整版本: 边界框问题