Olhado_ 发表于 2022-7-6 15:08:48

检查块中的实体

我们有不同大小的边框,我附上一个作为样本。无论如何,我知道如何按名称查找边界块,然后定位原点。
然而,我也希望能够找到对角点,因此我可以在它周围创建一个窗口,并用该点做其他一些事情。
有什么办法可以做到吗?我想到的方法是在DefPoints层上使用深蓝色框;但我找不到块的那些子实体。
我不在乎我必须使用什么语言;但我更喜欢LISP而不是VBA。
再次感谢你的帮助。
示例_边框。图纸

Lee Mac 发表于 2022-7-6 15:13:46

您好,我很乐意为您提供帮助,但您可以上传2000格式的文件吗?
 
谢谢

Olhado_ 发表于 2022-7-6 15:17:03

谢谢
 
这是保存为2000格式的文件
Sample_Border_2000。图纸

Lee Mac 发表于 2022-7-6 15:21:02

如果图形中只有边框,这可能会有所帮助:
 

(defun c:dwgdim    (/ bt tp)
   (setq bt (getvar "extmin")
   tp (getvar "extmax")
   ) ;_end setq
   (alert (strcat "Drawing Dimensions are: \n"
          (rtos (- (car tp) (car bt)) 2 2)
          " x "
          (rtos (- (cadr tp) (cadr bt)) 2 2)
      ) ;_end strcat
   ) ;_end alert
   (princ)
) ;_end defun

,但这远不理想
 
 
编辑:
 
我不是指图画中“唯一”的东西,我是指图画中“最大”的东西。

Olhado_ 发表于 2022-7-6 15:23:50

感谢李的帮助,这是一个良好的开端;但我不能假设人们不会把任何东西放在边境之外。我自己也经常这样做。它确实使齿轮运转彻底。
 
我想我找到了一个方法;但是我不能让周长函数工作。有人看到我错过了什么吗?vla Get区域就像一个符咒,LISP确实将vla Get周长识别为一个函数(在编辑器中)
 

(vl-load-com)

(command ".-boundary" "A" "I" "N" "+X" "" ".1,.1" "") ; Create Boundary around BlueBox
(setq entBound (entlast)) ; Identify Boundary that was just created
(setq AreaBor (vla-get-Area (vlax-ename->vla-objectentBound))) ; Boundary Area
(setq ParaBor (vla-get-perimeter (vlax-ename->vla-object entBound))) ; Boundary Parameter

 
如果你相信的话,我最初能够通过这个测试代码获得参数;但现在即使这样也不想起作用。
 

(VLA-GET-PERIMETER (vlax-ename->vla-object (car (entsel))))

 
我发现这个错误:
 
 
再次感谢您的帮助。
-克里斯

Olhado_ 发表于 2022-7-6 15:29:02

值得一提的是,这里有另一个工作代码,无论外面是什么,它都会工作。
 
我不确定是否有其他人能从中得到任何帮助,彻底。
 
再次感谢您的帮助。我真的很感激,即使我最终没有使用精确的代码。
 

(command ".-boundary" "A" "I" "N" "+X" "" ".1,.1" "") ; Create Boundary around BlueBox
(setq entBound (entlast)) ; Identify Boundary that was just created
(setq diag (cdr (assoc 10 (entget entBound))))

Lee Mac 发表于 2022-7-6 15:33:31

谢谢Olhado,这是最后一篇慷慨的帖子。

Olhado_ 发表于 2022-7-6 15:35:38

我想我们(包括我自己)都认为这条线索已经结束了。
 
我可以接受上述情况;但我有一些新的信息,如果它显示出更多的希望,我很感兴趣。
 
下面的代码首先尝试查找附着的边界,然后尝试查找嵌套在当前位于“Defpoints”的块中的多段线
 
你认为有什么方法可以修改这个代码来选择深蓝色的盒子吗?我相信它必须在DWG文件中,如果它在那里,那么程序至少应该能够找到实体。
 


(defun C:BlueBox ()

;;; ==============================================================
;;;   Find an AutoCAD border                                       
;;; ==========================================================
(if (setq s (ssget "x" '((-4 . "<OR") (2 . "TITLEBLOCK") (-4 . "OR>"))))
   (progn
   (alert "I found the Border")
   )) ; end of if
;;; ==============================================================
;;;   Find the blue box in the Titleblock                        
;;; ==============================================================

(if (setq s (ssget "x" '((-4 . "<AND") (0 . "LWPOLYLINE") (8 . "DefPoints") (-4 . "AND>"))))
   (progn
      (Alert "I found the Blue Box")

   )) ; end of if

)


 
如果我能让它工作,那么我就不会使用“Defpoints”
示例_边框。拉链

CarlB 发表于 2022-7-6 15:39:35

要查找块的一部分(而不是属性),需要在“块”表中检查块定义。使用“entnext”逐步完成,在“defpoints”上找到一条多段线(希望只有一条),提取坐标,然后调整相对于块插入坐标和旋转的坐标。唷!
 
下面是在命令行上键入的一些代码,用于查找块定义,即第一个子图元:
 
命令:(setq e1(tblobjname“block”“titleblock”))
 
命令:(entget e1)
((-1 . ) (0.“块”)(330)
(5.“C1CF”)(100.“AcDbEntity”)(67.0)(8.“0”)(370.-3)(100。
“AcDbBlockBegin”)(70.2)(10 0.0 0.0(-2)(2 .
“标题栏”)(1。”“”(4。“这是一个示例块”))
 
命令:(entget(entnext e1))
((-1 . ) (0.“线”)(330)(5
. “C1D1”)(100。“AcDbEntity”)(67.0)(8。“BorderLine2”)(6。“Continuous”)
(100.“AcDbLine”)(10 39.875 3.5 0.0)(11 39.5 3.5 0.0)(210 0.0 0.0 1.0)

Lee Mac 发表于 2022-7-6 15:40:49

不错,卡尔,我没想到
页: [1] 2
查看完整版本: 检查块中的实体