MarcoW 发表于 2022-7-6 14:22:49

te如何在xr中获取块信息

你好
 
为了确定图形中块的信息,例如块的名称,我使用以下代码:
 

(cdr (assoc 2 (entget (car (entsel)))))

 
它很好地返回了块名。
 
当块位于外部参照中时,当我想要获取块名称时,这似乎不起作用。
 
可以做到吗?如果可以,如何做到?

Lee Mac 发表于 2022-7-6 14:29:06

我不知道为什么你会失败,应该行得通

MarcoW 发表于 2022-7-6 14:36:32

然后选择整个外部参照的插入点。

MarcoW 发表于 2022-7-6 14:40:41

从外部参照中的各个块中,我需要获得插入点和旋转角度。所以我可以计算出一个距离反方向15mm的点。
 
即,当选择旋转0处插入点为0,0的块(称为点pt1)时,我需要在(极性插入点块pi 15)处“设置q pt2”。
所以在相反的方向上偏移15mm。

Lee Mac 发表于 2022-7-6 14:43:06

插入点为DXF 10,旋转为DXF 50代码。
 
或者,可以通过Visual LISP方法获得这些值。

Lee Mac 发表于 2022-7-6 14:46:22

因此,为了理解你的观点~
 
希望这有帮助
 

MarcoW 发表于 2022-7-6 14:53:11

嗨,李,
 
我最初有这个代码(在互联网上的某个地方找到):
 
(defun C:test ()
(setq TOTAL 0.)
(setvar "OSMODE" 0)
(print "Please Select blocks")
(setq SSPICK (ssget))
(setq SSAMT (sslength SSPICK))
(setq INDEX 0.)
;
(while (< INDEX SSAMT); Selection Set Loop
(setq ENT-NO (ssname SSPICK INDEX))
(setq DXF (entget ENT-NO))
(setq XYZ (cdr (assoc 10 DXF)))

(command "insert" "TESTBLOCK" XYZ 1 "" "") ; TESTBLOCK = Yes...

(princ)
(setq INDEX (+ INDEX 1.))
(princ INDEX) (print ENT-NO)
); end while
(princ)
)
 
首先,你可能想解释一些问题,因为我不知道代码是从哪里来的,所以我不能在那里问。
1.我看到:TOTAL=变量:在开始时设置为0。-->点(.)是什么在那里做什么?
2、Osmode关闭
3、提出行动,然后(setq SSPICK(ssget))。
4.SSPICK=SSPICK变量中放入选定的块/事物
5.(setq SSAMT(sslength SSPICK))=这是“计数”放置在SSPICK中的块/项目是否正确?
把一个变量设为零,再加一个点。。。为什么?
7.While function->只要索引小于ssamt,它就会在(While….和)之间循环;结束,对吗?
8、这三行是不可得的:
 
(setq ENT-NO (ssname SSPICK INDEX))
它将变量ENT-NO设置为(..?)
 
(setq DXF (entget ENT-NO))
它将Variable DXF设置为(entget ENT-NO)
 
(setq XYZ (cdr (assoc 10 DXF)))
XYZ是从(cdr(assoc 10 dxf))中获得的点,它是插入点。
 
9.(setq指数(+指数1))这里1被添加到索引。。。
10.然后索引和ENT-NO打印在命令行上
11.如果索引小于ssamt,则返回函数的else端。
 
 
我无法从头开始创建上述lisp,但我想学习阅读代码是学习过程的一部分。
 
上面的代码适用于我需要做的事情:将一个块放置在另一个块插入点上。
它不适用于我必须修改(尝试)的外部参照中的块。
 
您的代码可能有帮助:
 
(polar
(cdr (assoc 10 (entget <ename>))); Insertion Point

(+ pi
   (cdr (assoc 50 (entget <ename>))); Rotation
) ; End Addition
15

) ; end polar
 
但如何将两者结合起来呢?
你能帮我开始吗?
 
(defun C:test ()
(setvar "OSMODE" 0)
(setq TOTAL 0.)
(print "Please Select blocks")
(setq SSPICK (ssget))
        SSAMT (sslength SSPICK)
        INDEX 0.)
)

(while (< INDEX SSAMT); Selection Set Loop
(setq ENT-NO (ssname SSPICK INDEX)
        DXF (entget ENT-NO)
        XYZ (cdr (assoc 10 DXF))
)

(command "insert" "TESTBLOCK" XYZ 1 "" "") ; TESTBLOCK = Yes...

(princ)
(setq INDEX (+ INDEX 1.))
(princ INDEX) (print ENT-NO)
); end while
(princ)
)
 
提前通知。

Lee Mac 发表于 2022-7-6 14:57:22

 
点是使其成为实数而不是整数,因为整数有32767个极限。
 
 
 
这是因为代码使用“命令”插入块
 
 
SSGET将仅为提示显示“选择对象”,因此用户已打印另一个提示。
 
 
对的
 
 
对的
 
 
同上。
 
 
对的
 
 
在由索引表示的索引处收集选择集中对象的实体名称。这在“ssname”下的Visual LISP帮助中有详细说明。
 
 
Entget是上面检索到的实体名称。
 
 
从entget列表中获取插入点。
 
 
对的
 
 
对的
 
 
正确,如果索引仍然小于元素数,它将继续循环查看集合中的每个元素。

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

希望这能帮助你:
 
{未测试}
 

(defun c:test(/ *error* vl ov ss i bLst pt rot pt2);; Always Localise the Variables!

;; Error Handler in case the user hits Esc

(defun *error* (msg)
   
   (if ov (mapcar 'setvar vl ov)) ; reset Sys vars
   
   (princ (strcat "\n<< Error: " msg " >>")) ; Print Error Message
   
   (princ) ; Exit Cleanly

   ) ; End Error Handler

(setq vl '("CMDECHO" "OSMODE") ; Sys Var list
      
       ov (mapcar 'getvar vl)) ; Get Old values

(mapcar 'setvar vl '(0 0)) ; Turn off CMDECHO & OSMODE

(print "Please Select blocks...") ; Prompt

(if; If a SelectionSet is picked
   
   (setq ss (ssget '((0 . "INSERT")))) ;; Filter for Blocks

   (progn

   (setq i (sslength ss)); get number of items in SelectionSet

   (while (not (minusp (setq i (1- i)))) ; While i is not Negative

       (setq bLst (entget (ssname ss i))); get Block Entity

       (setq pt (cdr (assoc 10 bLst))   ; Insertion Point
            
             rot (cdr (assoc 50 bLst))) ; Rotation

       (setq pt2 (polar pt (+ rot pi) 15)) ; Define New point

       (command "-insert" "testblock" pt2 "1." "1." "0.") ; Insert Block at new point

       ) ; End While

   ) ; End Progn

   (princ "\n<!> No Blocks Selected <!>") ; Else no Blocks were Picked

   ) ; end If

(mapcar 'setvar vl ov) ; reset Sys Vars

(princ) ; Exit Cleanly

) ; end function

MarcoW 发表于 2022-7-6 15:06:22

李,
 
我仍然想知道,当可选择块位于外部参照中时,该例程是否可以工作。
 
你知道我的意思吗?
 
当块在实际图形中时,效果非常好,当它们在外部参照中时,使用外部参照的插入点。。。
 
我的lisp知识仍然很差。。。
非常感谢!
页: [1] 2
查看完整版本: te如何在xr中获取块信息