偏移到层反应器
我有一个问题,关于如何接近我计划处理的反应堆。这将是我的第一个反应堆,所以我一直在阅读vlr函数。我的reactor目标是让它确定是否调用了偏移,距离为0.5或2,并且对象位于以面或背面结束的层上,然后运行reactor并将新创建的对象放置在特定层上(例如,如果距离为0.5,并且层位于C-ROAD-CURB-FACE上,则将新创建的偏移对象放置在C-ROAD-CURB-BACK上)。我不知道如何让reactor确定这两个标准,因为我以前从未见过同时检查命令和objects属性的示例。有人对我应该如何解决这个问题有什么建议吗?提前感谢您的帮助! 你好我知道你可以用普通的lisp,通过“重新定义offset命令”并给它添加一些条件来做到这一点。
我看到了一些来自BIGAL的示例反应堆,作为补偿:
例如,键入O2,其偏移量为2个单位距离,键入O0-5,其偏移量为0.5,依此类推。。
你可以看看,但我不知道这对你的反应堆有什么帮助。
我用反应堆做了一些尝试,但失败了。。正如李·麦克告诉我的那样,反应堆代码必须是防水的。
祝你好运! 谢谢Grrr。我没有想过重新定义offset,我想可以通过重新定义它来实现,这样如果offsetdist系统变量设置为0.5’或2’,那么就执行必要的代码,否则,只需执行正常的offset命令。我预见到的唯一问题是,我运行的偏移反应堆出现了问题,这与比加尔的非常相似。 你好
每个图层(“C-ROAD-CURB-FACE”和“C-ROAD-CURB-BACK”)的颜色、线型和线宽的设置是什么?
我这样问是因为程序应该创建这些图层,如果它们在您的图形中不存在,以避免任何错误消息和失败。 这就是我想到的:
(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)
)
请注意,我不是程序员,所以可能会有错误。
是的,这不是一个反应堆。 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)
) Grr,非常感谢您的代码启动!对于我来说,这无疑是一个很好的开始,可以模拟offset命令。我仍然觉得很难完美地模拟它,我不认为我能将它与我的另一个偏移反应堆结合使用,所以我必须对它进行更多的研究。 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)
)
考虑一下。我只是想练习! 变量Offsetdist保存偏移量的当前值,因此我只需编写一个完整的lisp c:Omy,或者根据建议重新定义(大提示),很容易检查Offsetdist值和Entlast层。
它们可能是一种反应堆lastcommand的方式,因此如果它被抵消,则可以做一些事情。选中“Cmdnames”可能是一个起点。 你好
试试这个程序,让我知道你做得怎么样。
(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