Offset命令
我想知道lisp中是否有一种方法可以将offset/erase命令转换为yes。这将删除其偏移的原始线。然后在退出lisp例程时,将“偏移/擦除”命令恢复为“否”。因此,下次使用“偏移”命令时,它不会删除原始行。试试这个:
(defun c:OFF (/ offset_dist obj_2_offset offset_side)
(setq old_osm (getvar 'OSMODE))
(setvar 'osmode 0)
(setvar 'cmdecho 0)
(while (= offset_dist nil)
(setq offset_dist (getdist "\nOffset distance: "))
);while
(while (= obj_2_offset nil)
(setq obj_2_offset (entsel (strcat "\nPick object to offset <" (rtos offset_dist) ">: ")))
);while
(while (= offset_side nil)
(setq offset_side (getpoint "\nSide to offset on: "))
);while
(command "offset" offset_dist obj_2_offset offset_side "")
(command "erase" obj_2_offset "")
(setq obj_2_offset nil)
(setq offset_side nil)
(setvar "osmode" 14527)
(princ))
嗨,点头,
请让我知道在lisp编码中,它返回offset命令以不删除行。我是lisp的新手,如果不太麻烦的话,我希望在编码中能有一些评论。
@点头
您已经将osmode分配给了一个变量,并且没有将其重置为之前的状态,此外,您将其保持为全局状态,并将osmode设置为另一个值。
在函数getdist之前关闭osmode,这将阻止用户获取两个特定点之间的距离(如果用户需要)。
最后,如果用户在获得距离或结束例程之前按下esc按钮,会发生什么?
谢谢 @塔瓦特
我也是这么想的。。。NOD没有将设置的变量重置回旧的osm。
任何人对此有任何进一步的想法。
这就是你想要的吗。。。。。。
(defun c:Off (/ del p s)
;;; Tharwat 20. Oct. 2012 ;;;
(if (and (setq
*dis* (cond ((getdist (strcat "\n Specify Offset Distance <"
(if *dis*
(rtos *dis* 2 2)
(setq *dis* (rtos 1.0 2 2))
)
" > :"
)
)
)
(t *dis*)
)
)
(progn (initget "Yes No")
(setq del
(cond
((getkword "\n Delete original object <Yes> :")
)
("Yes")
)
)
)
)
(while
(and (setq s (ssget "_+.:S:L" '((0 . "*LINE,CIRCLE,ELLIPSE"))))
(setq p (getpoint "\n Specify point on side to offset :"))
)
(vl-cmdf "_.offset" "_E" del *dis* (ssname s 0) "_non" p "")
)
(princ)
)
(princ)
)
哎呀,对不起!因为我们的系统一直重置为osmode 0,这就是为什么我没有重置osmode。发布前忘记编辑。
谢谢tharwat! 塔尔瓦特,
我试过你的例行程序,它的功能不如诺德的。在例程中,系统会询问您是否删除要从中偏移的原始行。这一点很好。但是,当您退出例程并使用offset命令(而不是off.lsp例程)时,offset命令仍会删除其偏移的原始行。在Nods例程中,如果使用该例程,它将删除原始行,但是,当使用offset命令时,它不会删除其偏移的原始行。我正在寻找这个功能,但作为lisp的新手,我发现很难编写代码。因此,我在这个论坛上提出了这个问题。
试试这个,我还采用了tharwat的部分代码来检查层是否被锁定(谢谢tharwat!)
(defun c:off+ (/*error* ent dist kwrd offset_side )
;; 24 october 2012 nod684
(defun*error* (msg)
(command "._undo" "_end")
(setvar 'cmdecho cmd1)
)
(command "._undo" "_begin")
(setq cmd1 (getvar 'cmdecho))
(setvar 'cmdecho 0)
(prompt "\nSelect Objects to Offset: ")
(while (not ent)
(setq ent (ssget "_+.:S:L" '((0 . "*LINE,CIRCLE,ELLIPSE"))))
)
(initget (+ 1 2 4 64))
(setq dist (getdist "\nEnter offset distance:"))
(while (= offset_side nil)
(setq offset_side (getpoint "\nSide to offset on: "))
)
(initget (+ 2 4) "Yes No")
(setq kwrd (getkword "\nDelete source object <Yes>:"))
(if (/= kwrd "No")
(setq kwrd "Yes")
)
(command "offset" "erase" "no" dist ent offset_side "")
(if (eq kwrd "Yes")
(command "erase" ent "")
)
(*error* "")
(princ "\nDone!")
(princ))
做得好点。。。这正是我想要的。
页:
[1]
2