Lisp插入动态块
我想用lisp插入一个动态块,并在插入时利用块的对齐功能。这是我通常用来插入块的:(if (setq pt (setq INPT (getpoint "\nPick Insertion Point: ")))
(command "_.-insert" block INPT "1" "1" "0"))))
我想插入块,但不是在运行命令之前选择输入,我希望能够选择屏幕上的点,并使块旋转以匹配基于对齐特征的线。
我该怎么做? 你可以这样做。。。。
(defun c:test (/ name o e p1 p2 ins)
;; Tharwat 01. 07. 2011
(if (and (setq name (getstring T "\n Name of Block to insert :"))
(tblsearch "BLOCK" name)
(setq o (entsel "\n Select Line :"))
(eq (cdr (assoc 0 (setq e (entget (car o))))) "LINE")
)
(progn
(setq p1 (cdr (assoc 10 e))
p2 (cdr (assoc 11 e))
)
(command "_.-insert" name p1 1. 1. 0.)
(command "_.align"
(entlast)
""
(setq ins (cdr (assoc 10 (entget (entlast)))))
p1
(list (car ins) (+ (cadr ins) 0.5) 0.)
p2
""
""
)
(redraw)
)
(princ "\n Block not found or Selection is not a line !! ")
)
(princ)
)
塔瓦特 谢谢Tharwat,
我试着画一条线,然后插入块。我修改了你的代码给我这个,但它找不到块。有什么想法吗?
(defun c:Guy_Rope (/ name o e p1 p2 ins)
;; Tharwat 01. 07. 2011
(command "_.-layer" "_N" "CCC_SURVEY_Existing Stay or Guy Rope" "_M" "CCC_SURVEY_Existing Stay or Guy Rope" "_C" "1" "CCC_SURVEY_Existing Stay or Guy Rope" "" )
(command "._pline")
(if (and (setq name "Guy_Rope_Survey")
(tblsearch "BLOCK" name)
(setq o (entsel "\n Select Line :"))
(eq (cdr (assoc 0 (setq e (entget (car o))))) "LINE")
)
(progn
(setq p1 (cdr (assoc 10 e))
p2 (cdr (assoc 11 e))
)
(command "_.-insert" name p1 "1" "1" "0")
(command "_.align"
(entlast)
""
(setq ins (cdr (assoc 10 (entget (entlast)))))
p1
(list (car ins) (+ (cadr ins) 0.5) 0.)
p2
""
""
)
(redraw)
)
(princ "\n Block not found or Selection is not a line !! ")
)
(princ)
) 这行不通,因为折线和直线不同,为什么要改变第一条线的想法?
实体线只有起点和终点,但多段线与此完全不同 嗯,我不知道有这么大的区别。不管怎样,我运行了你的例行程序,它确实与普林的工作。但它没有做我想要的,所以我回去重新写了一遍。这就是我现在拥有的:
(defun c:guy_rope1 (/ pline SUCE SUSM SUCL SUCR rope_block)
(setq SUCE (getvar "cmdecho"))
(setq SUSM (getvar "osmode"))
(setq SUCL (getvar "clayer"))
(setq SUCR (getvar "cecolor"))
(setq vl1 (list
(cons 0 "LAYER") ;Name of entity
(cons 100 "AcDbSymbolTableRecord") ;Open Records
(cons 100 "AcDbLayerTableRecord") ;Locate Layer Table
(cons 2 "CCC_SURVEY_Existing Stay or Guy Rope") ;Name of Layer
(cons 62 1) ;colour = light grey
(cons 70 0) ;state
(cons 290 1) ;1=plot, 0=Don't plot
) ;End of entity list
)
(entmake vl1)
(setvar "clayer" "CCC_SURVEY_Existing Stay or Guy Rope")
(setvar "cecolor" "Bylayer")
(princ "\nDraw an stay or guy rope line: ")
(setvar "plinegen" 1)
(command "._pline")
(while (= 1 (logand 1 (getvar "cmdactive")))
(command pause))
(setq pline (entlast)
elist (entget pline)
)
(setq name "guy_rope_survey")
(command ".-Insert" name pause pause "" )
(setq rope_block (entlast)
elist (entget rope_block)
)
(command "explode" rope_block)
(setvar "cmdecho" SUCE)
(setvar "osmode" SUSM)
(setvar "clayer" SUCL)
(setvar "cecolor" SUCR)
(princ)
)
我有一些问题,也许有人可以帮我解决。这是例程的第一个aprt的命令转储:
命令:guy\u rope1
画一条拉线或拉线_普林线
指定起点:
当前线宽为0.0000
指定下一点或[弧/半宽/长度/撤消/宽度]:
指定下一点或[弧/闭合/半宽/长度/撤消/宽度]:
为什么会这样_普林出现了?
我的图层变量没有重置。我的图层没有恢复到原始值。
还有谁有更好的方法来运行insert,这样用户就可以使用动态块的对齐功能,而不必右键单击来完成命令?
谢谢 可能是因为您没有将cmdecho设置为0? 您是否考虑过改用vla insertBlock方法,然后简单地遍历动态块对象的属性(即可见性状态、属性等)?这真的很简单,而且更少(如果有的话?)系统变量需要存储/恢复。
(^^这是我为动态标题栏所做的^^) 不,我没有见过RenderMan。不过听起来很有趣。我该怎么做? 看看我的附加代码。特别是块:GetParameters、块:GetParam、块:GetParamValue和块:PutParamValue函数。
除此之外,您需要掌握vla模型/图纸空间对象才能使用其vla InsertBlock方法。查看ActiveX/COM下的开发人员帮助。
区块数据。LSP
Irneb花时间为您提供了一些帮助您的功能。
如果您无法理解这些函数和开发人员帮助之间需要什么,请发回您的问题,也许还有一份动态块的副本。
页:
[1]