乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 98|回复: 19

[编程交流] 偏移到层反应器

[复制链接]

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

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

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

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

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 17:57:16 | 显示全部楼层
谢谢Grrr。我没有想过重新定义offset,我想可以通过重新定义它来实现,这样如果offsetdist系统变量设置为0.5’或2’,那么就执行必要的代码,否则,只需执行正常的offset命令。我预见到的唯一问题是,我运行的偏移反应堆出现了问题,这与比加尔的非常相似。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:02:50 | 显示全部楼层
你好
 
每个图层(“C-ROAD-CURB-FACE”和“C-ROAD-CURB-BACK”)的颜色、线型和线宽的设置是什么?
我这样问是因为程序应该创建这些图层,如果它们在您的图形中不存在,以避免任何错误消息和失败。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:05:12 | 显示全部楼层
这就是我想到的:
  1. (defun c:test ( / *error* cl cmech )
  2. (setq cl (getvar 'CLAYER))
  3. (setq cmech (getvar 'CMDECHO))
  4. (setvar 'CMDECHO 0)
  5. (command "_.offset" "L" "C" "" "E" )
  6. (defun *error* ( msg )
  7.         (if cl (setvar 'CLAYER cl))
  8.         (if cmech (setvar 'CMDECHO cmech))
  9.         (if (not (member msg '("Function cancelled" "quit / exit abort")))
  10.                 (princ (strcat "\nError: " msg))
  11.         )
  12.         (princ)
  13. )
  14. (if (not ans)
  15.         (progn
  16.                 (setq ans "Through")
  17.                 (setq ans-p ans)
  18.         )
  19. )       
  20. (initget "Through")
  21. (while   (setq ans (cond ( (getdist (strcat "\nEnter offset distance or [Through] <" ans-p ">: "))) ( ans )))
  22.        
  23.         (progn
  24.                 (cond
  25.                         ((numberp ans)
  26.                                 (setq ans-p (rtos ans))
  27.                         )
  28.                         (T
  29.                                 (setq ans-p ans)
  30.                         )
  31.                 );cond
  32.                
  33.                 (while (not (and (setq ent (car(entsel "\nSelect object to offset: ")))
  34.                         (setq layername (cdr (assoc 8 (entget ent))))
  35.                 )
  36.                 )
  37.                 (cond
  38.                         (   (= 52 (getvar 'errno))
  39.                                 (princ "\nYou must select an object.")
  40.                         )          
  41.                         (   (null ent)
  42.                                 (princ "\nYou missed, try again.")
  43.                         )
  44.                 )
  45.                 )
  46.                
  47.                 (cond
  48.                         ( (or (and (= ans 0.5)(wcmatch layername "*-FACE")) (and (= ans 2)(wcmatch layername "*-FACE")) )
  49.                                 (setvar 'clayer "C-ROAD-CURB-BACK")
  50.                                 (setq pt (getpoint "\nSpecify side to offset"))
  51.                                 (command "_.offset" (rtos ans 2 10) ent pt "E" )
  52.                                 (setvar 'clayer cl)
  53.                         )
  54.                         ( (or (and (= ans 0.5)(wcmatch layername "*-BACK")) (and (= ans 2)(wcmatch layername "*-BACK")))
  55.                                 (setvar 'clayer "C-ROAD-CURB-FACE")
  56.                                 (setq pt (getpoint "\nSpecify side to offset"))
  57.                                 (command "_.offset" (rtos ans 2 10) ent pt "E" )
  58.                                 (setvar 'clayer cl)
  59.                         )
  60.                         ( (numberp ans)
  61.                                 (setq pt (getpoint "\nSpecify side to offset"))
  62.                                 (command "_.offset" (rtos ans 2 10) ent pt "E" )
  63.                         )
  64.                         ( (or (= ans "Through")(= ans "T")(= ans "t"))
  65.                                 (setq pt (getpoint "\nSpecify side to offset"))
  66.                                 (command "_.offset" "Through" ent pt "E" )
  67.                         )
  68.                 );cond
  69.                
  70.         );progn
  71. )
  72. (setvar 'CMDECHO cmech)
  73. (princ)
  74. )               

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

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 18:08:01 | 显示全部楼层
Tharwat,谢谢你的提醒。层的设置为:
我已经开始研究反应堆,这只是我打开或关闭它的起点。
  1. ;;;This is the portion of the code that turns the reactor on or off, with the default being on
  2. (if (= nil (getenv "offsetlayerdirector"))
  3. (setenv "offsetlayerdirector" "1")
  4. )
  5. ;;;Turns on the offset layer director if it's been installed, but never run
  6. (defun c:OffsetLayerDirector (/ ans)
  7. (initget 1 "On oFf")
  8. (setq ans (getkword "Offset layer director [On/OFF]:"))
  9. (if (= ans "On")
  10.    (progn
  11.      (setenv "offsetlayerdirector" "1")
  12.      (princ "\nOffset layer director is turned on.")
  13.    )
  14.    (progn
  15.      (setenv "offsetlayerdirector" "0")
  16.      (princ "\nOffset layer director is turned off.")
  17.    )
  18. )
  19. (princ)
  20. )
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 18:12:20 | 显示全部楼层
Grr,非常感谢您的代码启动!对于我来说,这无疑是一个很好的开始,可以模拟offset命令。我仍然觉得很难完美地模拟它,我不认为我能将它与我的另一个偏移反应堆结合使用,所以我必须对它进行更多的研究。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:13:34 | 显示全部楼层
broncos15,
我修改了代码-此版本将询问您一次偏移距离,并将继续使用entsel和getpoint循环:
  1. (defun c:test ( / *error* cl cmech )
  2. (setq cl (getvar 'CLAYER))
  3. (setq cmech (getvar 'CMDECHO))
  4. (setvar 'CMDECHO 0)
  5. (command "_.offset" "L" "C" "" "E" )
  6. (defun *error* ( msg )
  7.         (if cl (setvar 'CLAYER cl))
  8.         (if cmech (setvar 'CMDECHO cmech))
  9.         (if (not (member msg '("Function cancelled" "quit / exit abort")))
  10.                 (princ (strcat "\nError: " msg))
  11.         )
  12.         (princ)
  13. )
  14. (if (not ans)
  15.         (progn
  16.                 (setq ans "Through")
  17.                 (setq ans-p ans)
  18.         )
  19. )       
  20. (initget "Through")
  21. (setq ans (cond ( (getdist (strcat "\nEnter offset distance or [Through] <" ans-p ">: "))) ( ans )))
  22. (while  (and (setq ent (car(entsel "\nSelect object to offset: ")))
  23.         (setq layername (cdr (assoc 8 (entget ent))))
  24. )
  25. (cond
  26.         (   (= 52 (getvar 'errno))
  27.                 (princ "\nYou must select an object.")
  28.         )          
  29.         (   (null ent)
  30.                 (princ "\nYou missed, try again.")
  31.         )
  32. )
  33. (progn
  34.         (cond
  35.                 ((numberp ans)
  36.                         (setq ans-p (rtos ans))
  37.                 )
  38.                 (T
  39.                         (setq ans-p ans)
  40.                 )
  41.         );cond
  42.        
  43.        
  44.         (cond
  45.                 ( (or (and ent (= ans 0.5)(wcmatch layername "*-FACE")) (and ent (= ans 2)(wcmatch layername "*-FACE")) )
  46.                         (setvar 'clayer "C-ROAD-CURB-BACK")
  47.                         (setq pt (getpoint "\nSpecify side to offset"))
  48.                         (command "_.offset" (rtos ans 2 10) ent pt "E" )
  49.                         (setvar 'clayer cl)
  50.                 )
  51.                 ( (or (and ent (= ans 0.5)(wcmatch layername "*-BACK")) (and ent (= ans 2)(wcmatch layername "*-BACK")))
  52.                         (setvar 'clayer "C-ROAD-CURB-FACE")
  53.                         (setq pt (getpoint "\nSpecify side to offset"))
  54.                         (command "_.offset" (rtos ans 2 10) ent pt "E" )
  55.                         (setvar 'clayer cl)
  56.                 )
  57.                 ( (numberp ans)
  58.                         (setq pt (getpoint "\nSpecify side to offset"))
  59.                         (command "_.offset" (rtos ans 2 10) ent pt "E" )
  60.                 )
  61.                 ( (or (= ans "Through")(= ans "T")(= ans "t"))
  62.                         (setq pt (getpoint "\nSpecify side to offset"))
  63.                         (command "_.offset" "Through" ent pt "E" )
  64.                 )
  65.         );cond
  66.        
  67.        
  68. );progn
  69. )
  70. (if cmech (setvar 'CMDECHO cmech))
  71. (princ)
  72. )               

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

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:21:27 | 显示全部楼层
你好
 
试试这个程序,让我知道你做得怎么样。
 
  1. (defun c:Offset2LayerOn  nil
  2. ;;--------------------------------------------;;
  3. ;; Author: Tharwat Al Shoufi - Date:06.Apr.16        ;;
  4. ;;============================================;;
  5. ;; Function reactor to change the layer name        ;;
  6. ;; of the newly created offset objects as per        ;;
  7. ;; Offset distance [0.5 or 2.0] and as in the ;;
  8. ;; following :                                ;;
  9. ;; 0.5 - move to Layer Name: C-ROAD-CURB-FACE        ;;
  10. ;; 2.0 - move to Layer Name: C-ROAD-CURB-BACK        ;;
  11. ;;____________________________________________;;
  12. (if (not *Offset2LayerReactor*)
  13.    (progn
  14.      (setq *Offset2LayerReactor* (vlr-command-reactor "offset:to:layer"
  15.                                    '((:vlr-commandWillStart . PaveTheGround)
  16.                                      (:vlr-commandended     . GetTheJobDone))))
  17.      (princ "\nReactor < Offset2Layer > Activated !")
  18.      )
  19.    (princ "\nReactor < Offset2Layer > is ALREADY Activated and running.")
  20.    )
  21. (princ)
  22. )
  23. ;;--------------------------------------------;;
  24. (defun c:Offset2LayerOff  nil
  25. (if *Offset2LayerReactor*
  26.    (progn
  27.      (vlr-remove *Offset2LayerReactor*)
  28.      (setq *Offset2LayerReactor* nil)
  29.      (princ "\nReactor < Offset2Layer > disabled !")
  30.      )
  31.    (princ "\nReactor < Offset2Layer > is not yet activated to disable !")
  32.    )
  33. (princ)
  34. )
  35. ;;--------------------------------------------;;
  36. (defun PaveTheGround  (rct arg)
  37. (if (wcmatch (strcase (car arg)) "*OFFSET*")
  38.    (setq *Reactor:last:entity* (entlast))
  39.    )
  40. (princ)
  41. )
  42. ;;--------------------------------------------;;
  43. (defun GetTheJobDone  (rct arg / offD lst l)
  44. (if (and *Reactor:last:entity*
  45.           (or (equal (setq offD (getvar 'OFFSETDIST)) 0.5)
  46.               (equal offD 2.0)
  47.               )
  48.           )
  49.    (while
  50.      (setq *Reactor:last:entity* (entnext *Reactor:last:entity*))
  51.       (setq lst (cons *Reactor:last:entity* lst))
  52.       )
  53.    )
  54. (setq *Reactor:last:entity* nil)
  55. (if
  56.    (and lst
  57.         (or (wcmatch (setq l (strcase (cdr (assoc 8 (entget (car lst)))))) "*-FACE")
  58.             (wcmatch l "*-BACK"))
  59.         (setq l (if (= offD 0.5)
  60.                   '((8 . "C-ROAD-CURB-FACE"))
  61.                   '((8 . "C-ROAD-CURB-BACK"))))
  62.         )
  63.     (progn
  64.       (mapcar '(lambda (x)
  65.                  (if (not (tblsearch "LAYER" (car x)))
  66.                    (progn
  67.                      (regapp "AcAecLayerStandard")
  68.                       (entmake
  69.                        (append (list '(0 . "LAYER")
  70.                              '(100 . "AcDbSymbolTableRecord")
  71.                              '(100 . "AcDbLayerTableRecord")
  72.                              (cons 2 (car x))
  73.                              (cons 62 (caddr x))
  74.                              '(6 . "Continuous")
  75.                              (cons 370 (last x))
  76.                              '(290 . 1)
  77.                              '(70 . 0)
  78.                              )
  79.                               (list (list -3
  80.                                    (list "AcAecLayerStandard"
  81.                                          (cons 1000 "")
  82.                                          (cons 1000 (cadr x))
  83.                                          )
  84.                                    )
  85.                              )
  86.                        )
  87.                      )
  88.                    )
  89.                  )
  90.                  )
  91.               (list '("C-ROAD-CURB-FACE" "Roadways:Curb Face" 2 20)
  92.                     '("C-ROAD-CURB-BACK" "Roadways:Curb Back" 4 30)
  93.                     )
  94.               )
  95.       (mapcar '(lambda (x) (entmod (append (entget x) l))) lst)
  96.       )
  97.     )
  98. (princ)
  99. )(vl-load-com)
  100. ;;--------------------------------------------;;
  101. (princ "\nType Offset2LayerOn to activate. And Offset2LayerOff to disable reactor.")
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 23:32 , Processed in 0.371616 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表