Baber62 发表于 2022-7-6 07:22:31

Offset命令

我想知道lisp中是否有一种方法可以将offset/erase命令转换为yes。这将删除其偏移的原始线。然后在退出lisp例程时,将“偏移/擦除”命令恢复为“否”。因此,下次使用“偏移”命令时,它不会删除原始行。
 
 
 
 
 
 

nod684 发表于 2022-7-6 07:31:15

 
试试这个:
 

(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))

Baber62 发表于 2022-7-6 07:35:04

嗨,点头,
 
请让我知道在lisp编码中,它返回offset命令以不删除行。我是lisp的新手,如果不太麻烦的话,我希望在编码中能有一些评论。
 
 

Tharwat 发表于 2022-7-6 07:39:08

@点头
 
您已经将osmode分配给了一个变量,并且没有将其重置为之前的状态,此外,您将其保持为全局状态,并将osmode设置为另一个值。
 
在函数getdist之前关闭osmode,这将阻止用户获取两个特定点之间的距离(如果用户需要)。
 
最后,如果用户在获得距离或结束例程之前按下esc按钮,会发生什么?
 
谢谢

Baber62 发表于 2022-7-6 07:44:27

@塔瓦特
 
我也是这么想的。。。NOD没有将设置的变量重置回旧的osm。
 
任何人对此有任何进一步的想法。
 

Tharwat 发表于 2022-7-6 07:51:48

这就是你想要的吗。。。。。。
 

(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)
)

nod684 发表于 2022-7-6 07:53:22

哎呀,对不起!因为我们的系统一直重置为osmode 0,这就是为什么我没有重置osmode。发布前忘记编辑。
 
谢谢tharwat!

Baber62 发表于 2022-7-6 08:02:04

塔尔瓦特,
 
我试过你的例行程序,它的功能不如诺德的。在例程中,系统会询问您是否删除要从中偏移的原始行。这一点很好。但是,当您退出例程并使用offset命令(而不是off.lsp例程)时,offset命令仍会删除其偏移的原始行。在Nods例程中,如果使用该例程,它将删除原始行,但是,当使用offset命令时,它不会删除其偏移的原始行。我正在寻找这个功能,但作为lisp的新手,我发现很难编写代码。因此,我在这个论坛上提出了这个问题。
 
 

nod684 发表于 2022-7-6 08:05:39

试试这个,我还采用了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))

Baber62 发表于 2022-7-6 08:10:09

做得好点。。。这正是我想要的。
 
 
页: [1] 2
查看完整版本: Offset命令