Entmake 0。插入属性
大家好我正在尝试用autolisp编写一个块替换工具。(我用vba编写了这个工具,它很简单)遗憾的是,lisp没有vba那么简单。
到目前为止,脚本遵循以下过程
-选择所有特定类型的块“SSGET”
-为每个块创建一个列表
((输入)(属性详细信息)(附件…)
-创建新块
-添加额外属性
问题是我找不到一种插入新锁的实用方法。如果一个块有四个属性,那么(命令“insert”)需要9个参数(5个默认值),这不是很实用,因为需要为每个属性块重写重新插入函数。
有没有关于使用entmake插入块>
如果您对此有任何想法,我们将不胜感激
编辑:
即使有一种在不知道属性数量的情况下使用默认值的方法,问题也可以解决
编辑:
多亏了Buzzard
http://www.cadtutor.net/forum/showthread.php?t=36793
谢谢
奥利 是的,我认为有三种(可能更多的方法)可以做到这一点:
1) (setvar“ATTREQ”0);;不提示输入属性,然后(命令“-insert”。。。
2) Entmake the INSERT definition(假设表中存在块定义):
类似于:
(entmake (list (cons 0 "INSERT") (cons 2 bn) (cons 8 "0") (cons 10 pt)))
这是一个很好的例子:
(defun c:obj2blk1 (/ ss bn pt i ent elist)
; Get Entities
(while (not ss)
(princ "\nSelect Objects to Convert to Blocks:")
(setq ss (ssget '((-4 . "<NOT") (0 . "INSERT,POLYLINE,VIEWPORT") (-4 . "NOT>"))))
) ;_end while
; Get Block Name and Base Point
(while (or (not bn)
(not (snvalid bn))
) ;_end or
(setq bn (getstring "Specify Block Name: "))
) ;_end while
(initget 1)
(setq pt (getpoint "Specify Base Point for Block: "))
;;; Create BLOCK Header
(entmake (list (cons 0 "BLOCK") (cons 10 pt) (cons 2 bn) (cons 70 0)))
;;;STEP THRU THE SET
(setq i (sslength ss))
(while (>= i (setq i (1- i)) 0)
(setq ent (ssname ss i)
elist (entget ent)
) ;_end setq
(entmake elist)
) ;_end while
;;;FINISH THE BLOCK DEFINITION
(entmake (list (cons 0 "ENDBLK") (cons 8 "0")))
;;;Insert the Block & Delete Originals
(entmake (list (cons 0 "INSERT") (cons 2 bn) (cons 8 "0") (cons 10 pt)))
(command "_.ERASE" ss "")
(redraw)
(prin1)
) ;_end defun
以上是我与David Bethel合作的代码,它将自动从对象的选择集生成一个块。
3) 使用VL方法:
(vla-insertblock <space> <pt>... etc)
希望这有帮助
李 谢谢李
不幸的是,我仍然有问题,这是我到目前为止的功能
现在返回
命令:;错误:ActiveX服务器返回错误:未知名称:HasAttributes
有一次返回:对于hasattribtues,vla false
奥利 奥利,“attlist”参数的格式是什么?
这是列表格式
(
(63562.0 82951.4 0.0)
(Tag Textvalue height visibleLAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-false LAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-false LAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-true LAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-true LAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-true LAYERNAME "prompt")
)
可以尝试以下方法:
(defun InsertBlock(attlist bname / c ent tag)
(if (and (setq blk
(entmakex
(list
(cons 0 "INSERT")
(cons 2 bname)
(cons 66 1)
(cons 10 (car attlist)))))
(setq blk (vlax-ename->vla-object blk)))
(if (eq (vla-get-hasattributes blk) :vlax-true)
(progn
(foreach att(vlax-safearray->list
(vlax-variant-value
(vla-getattributes blk)))
(setq tag (vla-get-tagstring att))
(princ (strcat "\n" tag))
(foreach nattlist
(if (= (car n) tag)
(vla-put-textstring att (cadr n)))))))))
另一个,使用VL:
(defun InsertBlock(attlst bname / c ent tag)
(vl-load-com)
(if (vl-catch-all-error-p
(vl-catch-all-apply
(function
(lambda ( )
(setq blk
(vla-insertblock
(vla-get-ModelSpace
(vla-get-ActiveDocument
(vlax-get-acad-object)))
(vlax-3D-point (car attlst)) bName 1. 1. 1. 0.)))))) nil
(if (eq :vlax-true (vla-get-HasAttributes blk))
(foreach att (vlax-safearray->list
(vlax-variant-value
(vla-getAttributes blk)))
(princ (strcat "\n" (setq tag (vla-get-tagString att))))
(foreach x (cdr attlst)
(if (eq tag (car x))
(vla-put-TextString att (cadr x))))))))
奥利,
我在entmake上为块提供的线程我发现不是一个非常实用的方法。你将做两倍的工作,做一个漫长的过程只是为了使一个块。不是很理想。虽然这样创建一个积木很有意思,也有很好的学习体验,但我不赞成这种方法。我现在尝试学习一些VL方法作为替代方法。VL虽然看起来很复杂,但从长远来看,你很可能会避免头痛。
以下方法使用insert命令。这些不是VL程序。他们会告诉你我经历了什么。看看他们。在看过这些套路之后,你可能想学习VL。
祝你好运
秃鹰
SL.zip
IDS_V1.03。拉链 我认为奥利只想做插入定义,而不是块定义,所以我认为这对他来说不会太糟糕。
我不确定,没问题。他得到了很好的照顾。
页:
[1]
2