te如何在xr中获取块信息
你好为了确定图形中块的信息,例如块的名称,我使用以下代码:
(cdr (assoc 2 (entget (car (entsel)))))
它很好地返回了块名。
当块位于外部参照中时,当我想要获取块名称时,这似乎不起作用。
可以做到吗?如果可以,如何做到? 我不知道为什么你会失败,应该行得通 然后选择整个外部参照的插入点。 从外部参照中的各个块中,我需要获得插入点和旋转角度。所以我可以计算出一个距离反方向15mm的点。
即,当选择旋转0处插入点为0,0的块(称为点pt1)时,我需要在(极性插入点块pi 15)处“设置q pt2”。
所以在相反的方向上偏移15mm。 插入点为DXF 10,旋转为DXF 50代码。
或者,可以通过Visual LISP方法获得这些值。 因此,为了理解你的观点~
希望这有帮助
李 嗨,李,
我最初有这个代码(在互联网上的某个地方找到):
(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)
)
提前通知。
点是使其成为实数而不是整数,因为整数有32767个极限。
这是因为代码使用“命令”插入块
SSGET将仅为提示显示“选择对象”,因此用户已打印另一个提示。
对的
对的
同上。
对的
在由索引表示的索引处收集选择集中对象的实体名称。这在“ssname”下的Visual LISP帮助中有详细说明。
Entget是上面检索到的实体名称。
从entget列表中获取插入点。
对的
对的
正确,如果索引仍然小于元素数,它将继续循环查看集合中的每个元素。 希望这能帮助你:
{未测试}
(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
李,
我仍然想知道,当可选择块位于外部参照中时,该例程是否可以工作。
你知道我的意思吗?
当块在实际图形中时,效果非常好,当它们在外部参照中时,使用外部参照的插入点。。。
我的lisp知识仍然很差。。。
非常感谢!
页:
[1]
2