需要帮助清理代码,或
我是从其他几个lisp例程中拼凑出来的,也是从我所知的很少的东西中拼凑出来的。当然可以做得更好。我没有错误捕获,我不知道更新的vlisp命令,等等。(DeFun C:OFFM ( / clayerENTITY) ; change OFFM to any name you like that doesn't already exist
(SetVar "CmdEcho" 0)
(INITGET "G g S s B b U u") ; add a unique letter for each material you add
(SETQ MatType (strcase (getkword "\nGypboardStudBrickstUcco..? ")))
(COND
((= MatType "B") ;set this letter to match one of the choices three lines above, B = brick
(SETQ layernam"BRICK") ;change BRICK to a layer name you would use, repeat for those below
(SETQ offsetdista "2.5");change to offset distance for brick, repeat for those below
(SETQ layercolor "1");set color to what you would want, repeat for those below
)
((= MatType "G")
(SETQ layernam"GYPSUM")
(SETQ offsetdista "5/8")
(SETQ layercolor "4")
)
((= MatType "S")
(SETQ layernam"STUD")
(SETQ offsetdista "3.5")
(SETQ layercolor "2")
)
((= MatType "U")
(SETQ layernam"STUCCO")
(SETQ offsetdista "1")
(SETQ layercolor "3")
)
);close cond
(COMMAND ".LAYER" "make" LAYERNAM "color" layercolor "" "")
(Command ".OFFSET" offsetdista pause pause "")
(SetQ ENTITY (EntLast)
ENTITY (EntGet ENTITY)
ENTITY (SubSt (Cons 8 layernam) (Assoc 8 ENTITY) ENTITY)
)
(EntMod ENTITY)
(SetVar "CmdEcho" ECHO)
(PrinC)
) 在等待妻子完成T台项目的时候,我决定玩一玩。我将材质提示嵌入到选择中(还提供了在任何时间点更改材质的选项)。
该功能应该非常接近地镜像Offset命令。
(defun c:OffM (/ *error* _layer _sel cmd ent pnt eLast entity)
;; Alan J. Thompson, 10.14.10
(defun *error* (msg)
(redraw)
(and cmd (setvar 'cmdecho cmd))
(if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
(princ (strcat "\nError: " msg))
)
)
(defun _layer (name color)
(or (tblsearch "LAYER" name)
(entmake (list '(0 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
(cons 2 name)
'(70 . 0)
(cons 62 color)
)
)
)
)
(defun _sel (/ e g)
(setvar 'errno 0)
(while (and (not g) (/= 52 (getvar 'errno)))
(initget 0 "Brick Gypsum Stud stUcco")
(setq e (entsel (strcat "\nSelect object to offset as material <"
(cond (*OffM:Mat*)
((setq *OffM:Mat* "Brick"))
)
">: "
)
)
)
(cond ((and (listp e) (eq (type (car e)) 'ENAME))
(setq g
(cond
((eq
4
(logand
4
(cdr (assoc 70 (entget (tblobjname "LAYER" (cdr (assoc 8 (entget (car e))))))))
)
)
(prompt "\nThe object is on a locked layer.")
)
((not (member (cdr (assoc 0 (entget (car e))))
'("ARC" "CIRCLE" "ELLIPSE" "LINE" "LWPOLYLINE" "SPLINE" "XLINE")
)
)
(prompt "\nCannot offset that object.")
)
((car e))
)
)
)
((eq (type e) 'STR) (setq *OffM:Mat* e))
((setq g (eq 52 (getvar 'errno))) nil)
((eq 7 (getvar 'errno)) (setq g (prompt "\nMissed, try again.")))
)
)
)
(setq cmd (getvar 'cmdecho))
(setvar 'cmdecho 0)
(while (and (setq ent (_sel))
(not (redraw ent 3))
(setq pnt (getpoint "\nSpecify point on side to offset: "))
)
(redraw)
(setq eLast (entlast))
(command "_.offset"
(cond ((eq *OffM:Mat* "Brick") (_layer (strcase *OffM:Mat*) 1) 2.5)
((eq *OffM:Mat* "Gypsum") (_layer (strcase *OffM:Mat*) 4) 0.625)
((eq *OffM:Mat* "Stud") (_layer (strcase *OffM:Mat*) 2) 3.5)
((eq *OffM:Mat* "stUcco") (_layer (strcase *OffM:Mat*) 3) 1.)
)
ent
"_non"
pnt
""
)
(or
(equal eLast (cdr (assoc -1 (setq entity (entget (entlast))))))
(entmod (subst (cons 8 *OffM:Mat*) (assoc 8 entity) entity))
)
)
(*error* nil)
(princ)
) 我想我会尝试这样的方式:
(defun c:offm-db (/ data MatType fe ed)
(setq data '(("Brick" 2.5 1)
("Stud" 3.5 2)
("Gypsum"0.6254)
("stUcco"1.0 3)))
(initget 1 "Gypsum Stud Brick stUcco")
(setq MatType (getkword "\nMaterial - Gypsum/Stud/Brick/stUcco: "))
(setvar "OFFSETDIST" (nth 1 (assoc MatType data)))
(setvar "CMDECHO" 1)
(setq fe (entlast))
(while (eq fe (entlast))
(command "_.OFFSET" "" pause pause ""))
(setvar "CMDECHO" 0)
(setq ed (entget (entlast)))
(entmod (subst (cons 8 MatType) (assoc 8 ed) ed))
(command "_.LAYER" "_C" (itoa (nth 2 (assoc MatType data))) MatType "")
(prin1))
数据列表中的字符串名称必须与材质和图层名称匹配。
数据列表原子将是层/材料偏移距离Color_编号
-大卫 这将使一切变得更有活力:
(defun c:offm-db (/ data istr MatType fe ed)
(setq data '(("Brick" 2.5 1)
("Stud" 3.5 2)
("Gypsum"0.6254)
("stUcco"1.0 3)))
(setq istr
(apply 'strcat
(mapcar '(lambda (s) (strcat s " "))
(mapcar 'car data))))
(initget 1 istr)
(setq MatType (getkword (strcat "\nMaterial - " istr ": ")))
(setvar "OFFSETDIST" (nth 1 (assoc MatType data)))
(setvar "CMDECHO" 1)
(setq fe (entlast))
(while (eq fe (entlast))
(command "_.OFFSET" "" pause pause ""))
(setvar "CMDECHO" 0)
(setq ed (entget (entlast)))
(entmod (subst (cons 8 MatType) (assoc 8 ed) ed))
(command "_.LAYER" "_C" (itoa (nth 2 (assoc MatType data))) MatType "")
(prin1))
-大卫 这两个都很好。你的例行公事怎么知道在材料中使用单个字母?
艾伦,我喜欢你的作品留在节目里,这样你就可以换其他材料了。
谢谢 你好,RKent,
为了回答您的问题,我建议您阅读initget函数的VLIDE帮助文档 不确定,但我认为您正在做的是定义墙设置。可以有一个主文件。包含所有图层设置和代码的txt文件,例如您正在绘制墙,自动更改为正确的图层。这样做是为了让客户端可以选择层名称,但代码始终有效。偏移是通过新的主拨号或拾取测量偏移的现有墙来完成的。此外,如果你运行了一个墙例程,并且没有设置,那么它也会询问你。这节省了硬编码,并且随着您添加更多的程序,它们会保持一致。
将progname更改为所需的txt文件
1234567890123456789012345678901234567890
Newname Progname Col线型
砖-1砖-1连续
天花板--2天花板--2 6连续
天花板--3天花板--3 6连续
墙--2墙--2 4中心
门--2门--2 3连续
门--3门--3 4连续
这是一个屋顶程序的lisp
(setq lay_搜索屋顶-2)
(setq lay_彩色屋顶——2col)
(setq l_型屋顶——2lin)
(lay_miss)
lay miss为75个程序设置所有参数。
也可以添加偏移量Brick 110 gap 50 Stud 90 是的,我想给这个选项,并完全删除材料选择选项作为一个额外的提示。
我想是的。在这种情况下,entsel必须遵循initget。 对的
页:
[1]