broncos15 发表于 2022-7-5 17:50:19

偏移到层反应器

我有一个问题,关于如何接近我计划处理的反应堆。这将是我的第一个反应堆,所以我一直在阅读vlr函数。我的reactor目标是让它确定是否调用了偏移,距离为0.5或2,并且对象位于以面或背面结束的层上,然后运行reactor并将新创建的对象放置在特定层上(例如,如果距离为0.5,并且层位于C-ROAD-CURB-FACE上,则将新创建的偏移对象放置在C-ROAD-CURB-BACK上)。我不知道如何让reactor确定这两个标准,因为我以前从未见过同时检查命令和objects属性的示例。有人对我应该如何解决这个问题有什么建议吗?提前感谢您的帮助!

Grrr 发表于 2022-7-5 17:55:20

你好
我知道你可以用普通的lisp,通过“重新定义offset命令”并给它添加一些条件来做到这一点。
我看到了一些来自BIGAL的示例反应堆,作为补偿:
例如,键入O2,其偏移量为2个单位距离,键入O0-5,其偏移量为0.5,依此类推。。
你可以看看,但我不知道这对你的反应堆有什么帮助。
 
我用反应堆做了一些尝试,但失败了。。正如李·麦克告诉我的那样,反应堆代码必须是防水的。
祝你好运!

broncos15 发表于 2022-7-5 17:57:16

谢谢Grrr。我没有想过重新定义offset,我想可以通过重新定义它来实现,这样如果offsetdist系统变量设置为0.5’或2’,那么就执行必要的代码,否则,只需执行正常的offset命令。我预见到的唯一问题是,我运行的偏移反应堆出现了问题,这与比加尔的非常相似。

Tharwat 发表于 2022-7-5 18:02:50

你好
 
每个图层(“C-ROAD-CURB-FACE”和“C-ROAD-CURB-BACK”)的颜色、线型和线宽的设置是什么?
我这样问是因为程序应该创建这些图层,如果它们在您的图形中不存在,以避免任何错误消息和失败。

Grrr 发表于 2022-7-5 18:05:12

这就是我想到的:
(defun c:test ( / *error* cl cmech )

(setq cl (getvar 'CLAYER))
(setq cmech (getvar 'CMDECHO))

(setvar 'CMDECHO 0)
(command "_.offset" "L" "C" "" "E" )
(defun *error* ( msg )
        (if cl (setvar 'CLAYER cl))
        (if cmech (setvar 'CMDECHO cmech))
        (if (not (member msg '("Function cancelled" "quit / exit abort")))
                (princ (strcat "\nError: " msg))
        )
        (princ)
)

(if (not ans)
        (progn
                (setq ans "Through")
                (setq ans-p ans)
        )
)       

(initget "Through")
(while   (setq ans (cond ( (getdist (strcat "\nEnter offset distance or <" ans-p ">: "))) ( ans )))
       
        (progn
                (cond
                        ((numberp ans)
                                (setq ans-p (rtos ans))
                        )
                        (T
                                (setq ans-p ans)
                        )
                );cond
               
                (while (not (and (setq ent (car(entsel "\nSelect object to offset: ")))
                        (setq layername (cdr (assoc 8 (entget ent))))
                )
                )
                (cond
                        (   (= 52 (getvar 'errno))
                                (princ "\nYou must select an object.")
                        )          
                        (   (null ent)
                                (princ "\nYou missed, try again.")
                        )
                )
                )
               
                (cond
                        ( (or (and (= ans 0.5)(wcmatch layername "*-FACE")) (and (= ans 2)(wcmatch layername "*-FACE")) )
                                (setvar 'clayer "C-ROAD-CURB-BACK")
                                (setq pt (getpoint "\nSpecify side to offset"))
                                (command "_.offset" (rtos ans 2 10) ent pt "E" )
                                (setvar 'clayer cl)
                        )
                        ( (or (and (= ans 0.5)(wcmatch layername "*-BACK")) (and (= ans 2)(wcmatch layername "*-BACK")))
                                (setvar 'clayer "C-ROAD-CURB-FACE")
                                (setq pt (getpoint "\nSpecify side to offset"))
                                (command "_.offset" (rtos ans 2 10) ent pt "E" )
                                (setvar 'clayer cl)
                        )
                        ( (numberp ans)
                                (setq pt (getpoint "\nSpecify side to offset"))
                                (command "_.offset" (rtos ans 2 10) ent pt "E" )
                        )
                        ( (or (= ans "Through")(= ans "T")(= ans "t"))
                                (setq pt (getpoint "\nSpecify side to offset"))
                                (command "_.offset" "Through" ent pt "E" )
                        )
                );cond
               
        );progn
)
(setvar 'CMDECHO cmech)
(princ)
)               

请注意,我不是程序员,所以可能会有错误。
是的,这不是一个反应堆。

broncos15 发表于 2022-7-5 18:08:01

Tharwat,谢谢你的提醒。层的设置为:
我已经开始研究反应堆,这只是我打开或关闭它的起点。
;;;This is the portion of the code that turns the reactor on or off, with the default being on
(if (= nil (getenv "offsetlayerdirector"))
(setenv "offsetlayerdirector" "1")
)
;;;Turns on the offset layer director if it's been installed, but never run
(defun c:OffsetLayerDirector (/ ans)
(initget 1 "On oFf")
(setq ans (getkword "Offset layer director :"))
(if (= ans "On")
   (progn
   (setenv "offsetlayerdirector" "1")
   (princ "\nOffset layer director is turned on.")
   )
   (progn
   (setenv "offsetlayerdirector" "0")
   (princ "\nOffset layer director is turned off.")
   )
)
(princ)
)

broncos15 发表于 2022-7-5 18:12:20

Grr,非常感谢您的代码启动!对于我来说,这无疑是一个很好的开始,可以模拟offset命令。我仍然觉得很难完美地模拟它,我不认为我能将它与我的另一个偏移反应堆结合使用,所以我必须对它进行更多的研究。

Grrr 发表于 2022-7-5 18:13:34

broncos15,
我修改了代码-此版本将询问您一次偏移距离,并将继续使用entsel和getpoint循环:
(defun c:test ( / *error* cl cmech )

(setq cl (getvar 'CLAYER))
(setq cmech (getvar 'CMDECHO))

(setvar 'CMDECHO 0)
(command "_.offset" "L" "C" "" "E" )
(defun *error* ( msg )
        (if cl (setvar 'CLAYER cl))
        (if cmech (setvar 'CMDECHO cmech))
        (if (not (member msg '("Function cancelled" "quit / exit abort")))
                (princ (strcat "\nError: " msg))
        )
        (princ)
)

(if (not ans)
        (progn
                (setq ans "Through")
                (setq ans-p ans)
        )
)       

(initget "Through")
(setq ans (cond ( (getdist (strcat "\nEnter offset distance or <" ans-p ">: "))) ( ans )))
(while(and (setq ent (car(entsel "\nSelect object to offset: ")))
        (setq layername (cdr (assoc 8 (entget ent))))
)

(cond
        (   (= 52 (getvar 'errno))
                (princ "\nYou must select an object.")
        )          
        (   (null ent)
                (princ "\nYou missed, try again.")
        )
)

(progn
        (cond
                ((numberp ans)
                        (setq ans-p (rtos ans))
                )
                (T
                        (setq ans-p ans)
                )
        );cond
       
       
        (cond
                ( (or (and ent (= ans 0.5)(wcmatch layername "*-FACE")) (and ent (= ans 2)(wcmatch layername "*-FACE")) )
                        (setvar 'clayer "C-ROAD-CURB-BACK")
                        (setq pt (getpoint "\nSpecify side to offset"))
                        (command "_.offset" (rtos ans 2 10) ent pt "E" )
                        (setvar 'clayer cl)
                )
                ( (or (and ent (= ans 0.5)(wcmatch layername "*-BACK")) (and ent (= ans 2)(wcmatch layername "*-BACK")))
                        (setvar 'clayer "C-ROAD-CURB-FACE")
                        (setq pt (getpoint "\nSpecify side to offset"))
                        (command "_.offset" (rtos ans 2 10) ent pt "E" )
                        (setvar 'clayer cl)
                )
                ( (numberp ans)
                        (setq pt (getpoint "\nSpecify side to offset"))
                        (command "_.offset" (rtos ans 2 10) ent pt "E" )
                )
                ( (or (= ans "Through")(= ans "T")(= ans "t"))
                        (setq pt (getpoint "\nSpecify side to offset"))
                        (command "_.offset" "Through" ent pt "E" )
                )
        );cond
       
       
);progn

)
(if cmech (setvar 'CMDECHO cmech))
(princ)
)               

考虑一下。我只是想练习!

BIGAL 发表于 2022-7-5 18:17:45

变量Offsetdist保存偏移量的当前值,因此我只需编写一个完整的lisp c:Omy,或者根据建议重新定义(大提示),很容易检查Offsetdist值和Entlast层。
 
它们可能是一种反应堆lastcommand的方式,因此如果它被抵消,则可以做一些事情。选中“Cmdnames”可能是一个起点。

Tharwat 发表于 2022-7-5 18:21:27

你好
 
试试这个程序,让我知道你做得怎么样。
 

(defun c:Offset2LayerOnnil
;;--------------------------------------------;;
;; Author: Tharwat Al Shoufi - Date:06.Apr.16        ;;
;;============================================;;
;; Function reactor to change the layer name        ;;
;; of the newly created offset objects as per        ;;
;; Offset distance and as in the ;;
;; following :                                ;;
;; 0.5 - move to Layer Name: C-ROAD-CURB-FACE        ;;
;; 2.0 - move to Layer Name: C-ROAD-CURB-BACK        ;;
;;____________________________________________;;
(if (not *Offset2LayerReactor*)
   (progn
   (setq *Offset2LayerReactor* (vlr-command-reactor "offset:to:layer"
                                 '((:vlr-commandWillStart . PaveTheGround)
                                     (:vlr-commandended   . GetTheJobDone))))
   (princ "\nReactor < Offset2Layer > Activated !")
   )
   (princ "\nReactor < Offset2Layer > is ALREADY Activated and running.")
   )
(princ)
)
;;--------------------------------------------;;
(defun c:Offset2LayerOffnil
(if *Offset2LayerReactor*
   (progn
   (vlr-remove *Offset2LayerReactor*)
   (setq *Offset2LayerReactor* nil)
   (princ "\nReactor < Offset2Layer > disabled !")
   )
   (princ "\nReactor < Offset2Layer > is not yet activated to disable !")
   )
(princ)
)
;;--------------------------------------------;;
(defun PaveTheGround(rct arg)
(if (wcmatch (strcase (car arg)) "*OFFSET*")
   (setq *Reactor:last:entity* (entlast))
   )
(princ)
)
;;--------------------------------------------;;
(defun GetTheJobDone(rct arg / offD lst l)
(if (and *Reactor:last:entity*
          (or (equal (setq offD (getvar 'OFFSETDIST)) 0.5)
            (equal offD 2.0)
            )
          )
   (while
   (setq *Reactor:last:entity* (entnext *Reactor:last:entity*))
      (setq lst (cons *Reactor:last:entity* lst))
      )
   )
(setq *Reactor:last:entity* nil)
(if
   (and lst
      (or (wcmatch (setq l (strcase (cdr (assoc 8 (entget (car lst)))))) "*-FACE")
            (wcmatch l "*-BACK"))
      (setq l (if (= offD 0.5)
                  '((8 . "C-ROAD-CURB-FACE"))
                  '((8 . "C-ROAD-CURB-BACK"))))
      )
    (progn
      (mapcar '(lambda (x)
               (if (not (tblsearch "LAYER" (car x)))
                   (progn
                     (regapp "AcAecLayerStandard")
                      (entmake
                     (append (list '(0 . "LAYER")
                           '(100 . "AcDbSymbolTableRecord")
                           '(100 . "AcDbLayerTableRecord")
                           (cons 2 (car x))
                           (cons 62 (caddr x))
                           '(6 . "Continuous")
                           (cons 370 (last x))
                           '(290 . 1)
                           '(70 . 0)
                           )
                              (list (list -3
                                 (list "AcAecLayerStandard"
                                       (cons 1000 "")
                                       (cons 1000 (cadr x))
                                       )
                                 )
                           )
                     )
                     )
                   )
               )
               )
            (list '("C-ROAD-CURB-FACE" "Roadways:Curb Face" 2 20)
                  '("C-ROAD-CURB-BACK" "Roadways:Curb Back" 4 30)
                  )
            )
      (mapcar '(lambda (x) (entmod (append (entget x) l))) lst)
      )
    )
(princ)
)(vl-load-com)
;;--------------------------------------------;;
(princ "\nType Offset2LayerOn to activate. And Offset2LayerOff to disable reactor.")
页: [1] 2
查看完整版本: 偏移到层反应器